From c411e4444df25279631f36fdae360017c1a96be4 Mon Sep 17 00:00:00 2001 From: TizenOpenSource Date: Tue, 21 Jan 2025 10:14:36 +0900 Subject: [PATCH] Imported Upstream version 3.13.1 --- .azure-pipelines/ci.yml | 4 +- .coveragerc | 24 + .devcontainer/Dockerfile | 8 +- .devcontainer/devcontainer.json | 17 +- .editorconfig | 7 +- .gitattributes | 17 +- .github/CODEOWNERS | 129 +- .github/ISSUE_TEMPLATE/bug.md | 32 - .github/ISSUE_TEMPLATE/bug.yml | 56 + .github/ISSUE_TEMPLATE/crash.md | 33 - .github/ISSUE_TEMPLATE/crash.yml | 54 + .github/ISSUE_TEMPLATE/feature.md | 28 - .github/ISSUE_TEMPLATE/feature.yml | 40 + .github/dependabot.yml | 2 +- .github/workflows/add-issue-header.yml | 53 + .github/workflows/build.yml | 566 +- .github/workflows/build_msi.yml | 38 - .github/workflows/jit.yml | 183 + .github/workflows/lint.yml | 6 +- .github/workflows/mypy.yml | 35 +- .../workflows/new-bugs-announce-notifier.yml | 11 +- .github/workflows/posix-deps-apt.sh | 1 + .github/workflows/project-updater.yml | 2 +- .github/workflows/require-pr-label.yml | 3 +- .../workflows/reusable-change-detection.yml | 156 + .github/workflows/reusable-docs.yml | 26 +- .github/workflows/reusable-macos.yml | 59 + .github/workflows/reusable-tsan.yml | 78 + .github/workflows/reusable-ubuntu.yml | 91 + .github/workflows/reusable-wasi.yml | 77 + .github/workflows/reusable-windows-msi.yml | 24 + .github/workflows/reusable-windows.yml | 49 + .github/workflows/stale.yml | 4 +- .github/workflows/verify-ensurepip-wheels.yml | 2 +- .gitignore | 17 +- .pre-commit-config.yaml | 42 +- .readthedocs.yml | 19 +- Android/README.md | 136 + Android/android-env.sh | 97 + Android/android.py | 650 + Android/testbed/.gitignore | 21 + Android/testbed/app/.gitignore | 1 + Android/testbed/app/build.gradle.kts | 190 + .../java/org/python/testbed/PythonSuite.kt | 35 + .../testbed/app/src/main/AndroidManifest.xml | 20 + Android/testbed/app/src/main/c/CMakeLists.txt | 9 + .../testbed/app/src/main/c/main_activity.c | 147 + .../java/org/python/testbed/MainActivity.kt | 79 + Android/testbed/app/src/main/python/main.py | 32 + .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 3110 bytes .../app/src/main/res/layout/activity_main.xml | 19 + .../app/src/main/res/values/strings.xml | 3 + Android/testbed/build.gradle.kts | 5 + Android/testbed/gradle.properties | 28 + .../gradle/wrapper/gradle-wrapper.properties | 6 + Android/testbed/settings.gradle.kts | 18 + Doc/.ruff.toml | 42 + Doc/Makefile | 136 +- Doc/README.rst | 25 +- Doc/bugs.rst | 6 +- Doc/c-api/abstract.rst | 1 - Doc/c-api/allocation.rst | 6 +- Doc/c-api/arg.rst | 85 +- Doc/c-api/bool.rst | 12 +- Doc/c-api/buffer.rst | 15 +- Doc/c-api/bytearray.rst | 9 +- Doc/c-api/bytes.rst | 9 +- Doc/c-api/call.rst | 15 +- Doc/c-api/cell.rst | 9 +- Doc/c-api/code.rst | 38 +- Doc/c-api/complex.rst | 43 +- Doc/c-api/contextvars.rst | 4 +- Doc/c-api/conversion.rst | 36 + Doc/c-api/datetime.rst | 4 +- Doc/c-api/dict.rst | 97 +- Doc/c-api/exceptions.rst | 209 +- Doc/c-api/file.rst | 12 +- Doc/c-api/float.rst | 10 +- Doc/c-api/frame.rst | 16 +- Doc/c-api/function.rst | 23 +- Doc/c-api/gcsupport.rst | 11 +- Doc/c-api/hash.rst | 101 + Doc/c-api/import.rst | 86 +- Doc/c-api/index.rst | 1 + Doc/c-api/init.rst | 641 +- Doc/c-api/init_config.rst | 126 +- Doc/c-api/intro.rst | 57 +- Doc/c-api/list.rst | 49 +- Doc/c-api/long.rst | 216 +- Doc/c-api/mapping.rst | 49 +- Doc/c-api/marshal.rst | 2 +- Doc/c-api/memory.rst | 83 +- Doc/c-api/memoryview.rst | 13 + Doc/c-api/module.rst | 171 +- Doc/c-api/monitoring.rst | 192 + Doc/c-api/none.rst | 6 +- Doc/c-api/number.rst | 8 +- Doc/c-api/objbuffer.rst | 55 - Doc/c-api/object.rst | 172 +- Doc/c-api/refcounting.rst | 25 +- Doc/c-api/reflection.rst | 62 +- Doc/c-api/set.rst | 6 +- Doc/c-api/slice.rst | 11 +- Doc/c-api/stable.rst | 16 +- Doc/c-api/structures.rst | 137 +- Doc/c-api/sys.rst | 117 +- Doc/c-api/time.rst | 114 + Doc/c-api/tuple.rst | 56 +- Doc/c-api/type.rst | 73 +- Doc/c-api/typeobj.rst | 125 +- Doc/c-api/unicode.rst | 303 +- Doc/c-api/utilities.rst | 2 + Doc/c-api/veryhigh.rst | 30 +- Doc/c-api/weakref.rst | 49 +- Doc/conf.py | 315 +- Doc/constraints.txt | 24 +- Doc/contents.rst | 1 + Doc/copyright.rst | 2 +- Doc/data/python3.12.abi | 26477 --------- Doc/data/python3.13.abi | 29418 ++++++++++ Doc/data/refcounts.dat | 189 +- Doc/data/stable_abi.dat | 1683 +- .../c-api-pending-removal-in-3.14.rst | 72 + .../c-api-pending-removal-in-3.15.rst | 27 + .../c-api-pending-removal-in-future.rst | 51 + Doc/deprecations/index.rst | 19 + Doc/deprecations/pending-removal-in-3.13.rst | 52 + Doc/deprecations/pending-removal-in-3.14.rst | 105 + Doc/deprecations/pending-removal-in-3.15.rst | 89 + Doc/deprecations/pending-removal-in-3.16.rst | 56 + .../pending-removal-in-future.rst | 155 + Doc/extending/embedding.rst | 37 +- Doc/extending/extending.rst | 56 +- Doc/extending/newtypes.rst | 8 +- Doc/extending/newtypes_tutorial.rst | 12 +- Doc/faq/design.rst | 21 +- Doc/faq/extending.rst | 9 +- Doc/faq/general.rst | 20 +- Doc/faq/gui.rst | 11 +- Doc/faq/library.rst | 96 +- Doc/faq/programming.rst | 51 +- Doc/glossary.rst | 264 +- Doc/howto/annotations.rst | 11 +- Doc/howto/argparse-optparse.rst | 55 + Doc/howto/argparse.rst | 49 +- Doc/howto/clinic.rst | 1896 +- Doc/howto/curses.rst | 8 +- Doc/howto/descriptor.rst | 258 +- Doc/howto/enum.rst | 234 +- Doc/howto/free-threading-extensions.rst | 280 + Doc/howto/free-threading-python.rst | 154 + Doc/howto/functional.rst | 2 + Doc/howto/gdb_helpers.rst | 449 + Doc/howto/index.rst | 46 +- Doc/howto/instrumentation.rst | 16 +- Doc/howto/isolating-extensions.rst | 107 +- Doc/howto/logging-cookbook.rst | 304 +- Doc/howto/logging.rst | 216 +- Doc/howto/logging_flow.png | Bin 21907 -> 39133 bytes Doc/howto/logging_flow.svg | 327 + Doc/howto/mro.rst | 671 + Doc/howto/perf_profiling.rst | 68 +- Doc/howto/pyporting.rst | 428 +- Doc/howto/regex.rst | 3 + Doc/howto/sorting.rst | 64 +- Doc/howto/timerfd.rst | 230 + Doc/howto/urllib2.rst | 20 +- Doc/includes/email-alternative.py | 10 +- Doc/includes/email-dir.py | 2 +- Doc/includes/newtypes/custom.c | 4 +- Doc/includes/newtypes/sublist.c | 4 +- Doc/includes/wasm-mobile-notavail.rst | 6 + Doc/includes/wasm-notavail.rst | 5 +- Doc/library/2to3.rst | 489 - Doc/library/__future__.rst | 104 +- Doc/library/__main__.rst | 58 +- Doc/library/_thread.rst | 34 +- Doc/library/abc.rst | 54 +- Doc/library/aifc.rst | 248 +- Doc/library/allos.rst | 1 - Doc/library/argparse.rst | 756 +- Doc/library/array.rst | 72 +- Doc/library/ast.rst | 459 +- Doc/library/asynchat.rst | 17 + Doc/library/asyncio-eventloop.rst | 130 +- Doc/library/asyncio-future.rst | 6 +- Doc/library/asyncio-llapi-index.rst | 14 +- Doc/library/asyncio-policy.rst | 8 +- Doc/library/asyncio-protocol.rst | 32 +- Doc/library/asyncio-queue.rst | 34 +- Doc/library/asyncio-runner.rst | 4 +- Doc/library/asyncio-stream.rst | 31 +- Doc/library/asyncio-subprocess.rst | 6 +- Doc/library/asyncio-sync.rst | 14 +- Doc/library/asyncio-task.rst | 189 +- Doc/library/asyncio.rst | 27 +- Doc/library/asyncore.rst | 17 + Doc/library/atexit.rst | 8 +- Doc/library/audioop.rst | 288 +- Doc/library/audit_events.rst | 2 +- Doc/library/base64.rst | 24 +- Doc/library/bdb.rst | 57 +- Doc/library/binascii.rst | 19 +- Doc/library/bisect.rst | 18 +- Doc/library/builtins.rst | 16 +- Doc/library/bz2.rst | 66 +- Doc/library/calendar.rst | 52 +- Doc/library/cgi.rst | 567 +- Doc/library/cgitb.rst | 92 +- Doc/library/chunk.rst | 143 +- Doc/library/cmath.rst | 29 +- Doc/library/cmd.rst | 53 +- Doc/library/cmdline.rst | 59 + Doc/library/code.rst | 25 +- Doc/library/codecs.rst | 84 +- Doc/library/codeop.rst | 4 +- Doc/library/collections.abc.rst | 112 +- Doc/library/collections.rst | 127 +- Doc/library/colorsys.rst | 6 +- Doc/library/compileall.rst | 48 +- Doc/library/concurrent.futures.rst | 332 +- Doc/library/configparser.rst | 188 +- Doc/library/constants.rst | 23 +- Doc/library/contextlib.rst | 62 +- Doc/library/contextvars.rst | 116 +- Doc/library/copy.rst | 60 +- Doc/library/copyreg.rst | 4 +- Doc/library/crypt.rst | 187 +- Doc/library/crypto.rst | 1 - Doc/library/csv.rst | 58 +- Doc/library/ctypes.rst | 262 +- Doc/library/curses.ascii.rst | 4 +- Doc/library/curses.panel.rst | 4 +- Doc/library/curses.rst | 14 +- Doc/library/dataclasses.rst | 363 +- Doc/library/datetime.rst | 580 +- Doc/library/dbm.rst | 434 +- Doc/library/decimal.rst | 78 +- Doc/library/development.rst | 4 +- Doc/library/dialog.rst | 12 +- Doc/library/difflib.rst | 22 +- Doc/library/dis.rst | 514 +- Doc/library/distutils.rst | 17 + Doc/library/doctest.rst | 157 +- Doc/library/email.charset.rst | 4 +- Doc/library/email.compat32-message.rst | 7 +- Doc/library/email.contentmanager.rst | 57 +- Doc/library/email.encoders.rst | 4 +- Doc/library/email.errors.rst | 20 +- Doc/library/email.examples.rst | 4 +- Doc/library/email.generator.rst | 8 +- Doc/library/email.header.rst | 6 +- Doc/library/email.headerregistry.rst | 6 +- Doc/library/email.iterators.rst | 4 +- Doc/library/email.message.rst | 14 +- Doc/library/email.mime.rst | 20 +- Doc/library/email.parser.rst | 4 +- Doc/library/email.policy.rst | 41 +- Doc/library/email.rst | 9 +- Doc/library/email.utils.rst | 25 +- Doc/library/ensurepip.rst | 6 +- Doc/library/enum.rst | 189 +- Doc/library/errno.rst | 4 +- Doc/library/exceptions.rst | 139 +- Doc/library/faulthandler.rst | 26 +- Doc/library/fcntl.rst | 88 +- Doc/library/filecmp.rst | 13 +- Doc/library/fileinput.rst | 6 +- Doc/library/fnmatch.rst | 30 +- Doc/library/fractions.rst | 45 +- Doc/library/ftplib.rst | 644 +- Doc/library/functions.rst | 602 +- Doc/library/functools.rst | 75 +- Doc/library/gc.rst | 12 +- Doc/library/getopt.rst | 37 +- Doc/library/getpass.rst | 15 +- Doc/library/gettext.rst | 20 +- Doc/library/glob.rst | 64 +- Doc/library/graphlib.rst | 20 +- Doc/library/grp.rst | 10 +- Doc/library/gzip.rst | 71 +- Doc/library/hashlib.rst | 22 +- Doc/library/heapq.rst | 11 +- Doc/library/hmac.rst | 21 +- Doc/library/html.entities.rst | 4 +- Doc/library/html.parser.rst | 4 +- Doc/library/html.rst | 4 +- Doc/library/http.client.rst | 21 +- Doc/library/http.cookiejar.rst | 15 +- Doc/library/http.cookies.rst | 46 +- Doc/library/http.rst | 128 +- Doc/library/http.server.rst | 57 +- Doc/library/idle.rst | 68 +- Doc/library/imaplib.rst | 14 +- Doc/library/imghdr.rst | 89 +- Doc/library/imp.rst | 18 + Doc/library/importlib.metadata.rst | 299 +- Doc/library/importlib.resources.abc.rst | 36 +- Doc/library/importlib.resources.rst | 220 +- Doc/library/importlib.rst | 240 +- Doc/library/index.rst | 2 + Doc/library/inspect.rst | 743 +- Doc/library/intro.rst | 57 +- Doc/library/io.rst | 48 +- Doc/library/ipaddress.rst | 76 +- Doc/library/itertools.rst | 1346 +- Doc/library/json.rst | 113 +- Doc/library/kde_example.png | Bin 332212 -> 315150 bytes Doc/library/keyword.rst | 4 +- Doc/library/linecache.rst | 4 +- Doc/library/locale.rst | 111 +- Doc/library/logging.config.rst | 49 +- Doc/library/logging.handlers.rst | 14 +- Doc/library/logging.rst | 266 +- Doc/library/lzma.rst | 71 +- Doc/library/mailbox.rst | 386 +- Doc/library/mailcap.rst | 95 +- Doc/library/marshal.rst | 53 +- Doc/library/math.rst | 568 +- Doc/library/mimetypes.rst | 45 +- Doc/library/mmap.rst | 72 +- Doc/library/modulefinder.rst | 4 +- Doc/library/msilib.rst | 566 +- Doc/library/msvcrt.rst | 143 +- Doc/library/multiprocessing.rst | 190 +- Doc/library/multiprocessing.shared_memory.rst | 185 +- Doc/library/netrc.rst | 5 +- Doc/library/nis.rst | 73 +- Doc/library/nntplib.rst | 589 +- Doc/library/numbers.rst | 51 +- Doc/library/operator.rst | 8 +- Doc/library/optparse.rst | 13 +- Doc/library/os.path.rst | 76 +- Doc/library/os.rst | 786 +- Doc/library/ossaudiodev.rst | 454 +- Doc/library/pathlib.rst | 1160 +- Doc/library/pdb.rst | 153 +- Doc/library/pickle.rst | 97 +- Doc/library/pickletools.rst | 20 +- Doc/library/pipes.rst | 104 +- Doc/library/pkgutil.rst | 13 +- Doc/library/platform.rst | 72 +- Doc/library/plistlib.rst | 34 +- Doc/library/poplib.rst | 4 +- Doc/library/posix.rst | 6 +- Doc/library/pprint.rst | 253 +- Doc/library/profile.rst | 27 +- Doc/library/pty.rst | 9 +- Doc/library/pwd.rst | 17 +- Doc/library/py_compile.rst | 13 +- Doc/library/pyclbr.rst | 107 +- Doc/library/pydoc.rst | 23 +- Doc/library/pyexpat.rst | 48 +- Doc/library/queue.rst | 43 +- Doc/library/quopri.rst | 4 +- Doc/library/random.rst | 172 +- Doc/library/re.rst | 329 +- Doc/library/readline.rst | 29 +- Doc/library/removed.rst | 39 + Doc/library/reprlib.rst | 56 +- Doc/library/resource.rst | 14 +- Doc/library/rlcompleter.rst | 44 +- Doc/library/runpy.rst | 44 +- Doc/library/sched.rst | 6 +- Doc/library/secrets.rst | 14 +- Doc/library/security_warnings.rst | 1 - Doc/library/select.rst | 14 +- Doc/library/selectors.rst | 6 +- Doc/library/shelve.rst | 24 +- Doc/library/shlex.rst | 34 +- Doc/library/shutil.rst | 83 +- Doc/library/signal.rst | 16 +- Doc/library/site.rst | 34 +- Doc/library/smtpd.rst | 18 + Doc/library/smtplib.rst | 27 +- Doc/library/sndhdr.rst | 107 +- Doc/library/socket.rst | 139 +- Doc/library/socketserver.rst | 88 +- Doc/library/spwd.rst | 84 +- Doc/library/sqlite3.rst | 303 +- Doc/library/ssl.rst | 261 +- Doc/library/stat.rst | 62 +- Doc/library/statistics.rst | 272 +- Doc/library/stdtypes.rst | 279 +- Doc/library/string.rst | 153 +- Doc/library/stringprep.rst | 4 +- Doc/library/struct.rst | 34 +- Doc/library/subprocess.rst | 121 +- Doc/library/sunau.rst | 275 +- Doc/library/superseded.rst | 22 +- Doc/library/symtable.rst | 127 +- Doc/library/sys.monitoring.rst | 298 +- Doc/library/sys.rst | 202 +- Doc/library/sys_path_init.rst | 3 +- Doc/library/sysconfig.rst | 11 +- Doc/library/syslog.rst | 82 +- Doc/library/tabnanny.rst | 4 +- Doc/library/tarfile.rst | 158 +- Doc/library/telnetlib.rst | 265 +- Doc/library/tempfile.rst | 86 +- Doc/library/termios.rst | 24 +- Doc/library/test.rst | 68 +- Doc/library/textwrap.rst | 8 +- Doc/library/threading.rst | 118 +- Doc/library/time.rst | 200 +- Doc/library/timeit.rst | 20 +- Doc/library/tk.rst | 4 +- Doc/library/tkinter.colorchooser.rst | 4 +- Doc/library/tkinter.dnd.rst | 8 +- Doc/library/tkinter.font.rst | 4 +- Doc/library/tkinter.messagebox.rst | 179 +- Doc/library/tkinter.rst | 54 +- Doc/library/tkinter.scrolledtext.rst | 4 +- Doc/library/tkinter.tix.rst | 583 - Doc/library/tkinter.ttk.rst | 843 +- Doc/library/token-list.inc | 4 - Doc/library/token.rst | 23 +- Doc/library/tokenize.rst | 8 +- Doc/library/tomllib.rst | 18 +- Doc/library/trace.rst | 44 +- Doc/library/traceback.rst | 341 +- Doc/library/tracemalloc.rst | 4 +- Doc/library/tty.rst | 27 +- Doc/library/turtle.rst | 39 +- Doc/library/types.rst | 127 +- Doc/library/typing.rst | 892 +- Doc/library/unicodedata.rst | 12 +- Doc/library/unittest.mock-examples.rst | 19 +- Doc/library/unittest.mock.rst | 363 +- Doc/library/unittest.rst | 83 +- Doc/library/urllib.error.rst | 8 +- Doc/library/urllib.parse.rst | 34 +- Doc/library/urllib.request.rst | 139 +- Doc/library/urllib.robotparser.rst | 6 +- Doc/library/urllib.rst | 4 +- Doc/library/uu.rst | 73 +- Doc/library/uuid.rst | 18 +- Doc/library/venv.rst | 239 +- Doc/library/warnings.rst | 72 +- Doc/library/wave.rst | 18 +- Doc/library/weakref.rst | 2 +- Doc/library/webbrowser.rst | 85 +- Doc/library/winreg.rst | 4 +- Doc/library/winsound.rst | 4 +- Doc/library/wsgiref.rst | 35 +- Doc/library/xdrlib.rst | 284 +- Doc/library/xml.dom.minidom.rst | 4 +- Doc/library/xml.dom.pulldom.rst | 6 +- Doc/library/xml.dom.rst | 6 +- Doc/library/xml.etree.elementtree.rst | 134 +- Doc/library/xml.rst | 19 +- Doc/library/xml.sax.handler.rst | 4 +- Doc/library/xml.sax.reader.rst | 4 +- Doc/library/xml.sax.rst | 4 +- Doc/library/xml.sax.utils.rst | 8 +- Doc/library/xmlrpc.client.rst | 15 +- Doc/library/xmlrpc.server.rst | 12 +- Doc/library/zipapp.rst | 22 +- Doc/library/zipfile.rst | 71 +- Doc/library/zipimport.rst | 9 +- Doc/library/zlib.rst | 4 +- Doc/library/zoneinfo.rst | 12 +- Doc/license.rst | 117 +- Doc/reference/compound_stmts.rst | 165 +- Doc/reference/datamodel.rst | 1219 +- Doc/reference/executionmodel.rst | 22 +- Doc/reference/expressions.rst | 246 +- Doc/reference/grammar.rst | 2 + Doc/reference/import.rst | 266 +- Doc/reference/introduction.rst | 5 +- Doc/reference/lexical_analysis.rst | 70 +- Doc/reference/simple_stmts.rst | 103 +- Doc/requirements-oldest-sphinx.txt | 41 +- Doc/requirements.txt | 5 +- Doc/tools/.nitignore | 98 - Doc/tools/check-warnings.py | 46 +- Doc/tools/extensions/audit_events.py | 264 + Doc/tools/extensions/availability.py | 125 + Doc/tools/extensions/c_annotations.py | 496 +- Doc/tools/extensions/escape4chm.py | 58 - Doc/tools/extensions/glossary_search.py | 78 +- Doc/tools/extensions/lexers/__init__.py | 15 + .../asdl_lexer.py} | 23 +- .../{peg_highlight.py => lexers/peg_lexer.py} | 9 +- Doc/tools/extensions/patchlevel.py | 113 +- Doc/tools/extensions/pyspecific.py | 438 +- Doc/tools/static/changelog_search.js | 102 +- Doc/tools/static/glossary_search.js | 47 + Doc/tools/static/rtd_switcher.js | 55 + Doc/tools/static/sidebar-wrap.css | 6 + Doc/tools/templates/download.html | 75 +- Doc/tools/templates/dummy.html | 10 + Doc/tools/templates/indexcontent.html | 70 +- Doc/tools/templates/layout.html | 8 + Doc/tools/templates/search.html | 69 +- Doc/tutorial/appendix.rst | 28 +- Doc/tutorial/classes.rst | 36 +- Doc/tutorial/controlflow.rst | 104 +- Doc/tutorial/datastructures.rst | 35 +- Doc/tutorial/errors.rst | 62 +- Doc/tutorial/floatingpoint.rst | 14 +- Doc/tutorial/inputoutput.rst | 39 +- Doc/tutorial/interactive.rst | 2 +- Doc/tutorial/interpreter.rst | 10 +- Doc/tutorial/introduction.rst | 63 +- Doc/tutorial/modules.rst | 8 +- Doc/tutorial/stdlib.rst | 6 +- Doc/tutorial/stdlib2.rst | 10 +- Doc/tutorial/venv.rst | 8 +- Doc/using/android.rst | 65 + Doc/using/cmdline.rst | 357 +- Doc/using/configure.rst | 653 +- Doc/using/index.rst | 3 + Doc/using/ios.rst | 343 + Doc/using/mac.rst | 516 +- Doc/using/mac_installer_01_introduction.png | Bin 0 -> 190852 bytes Doc/using/mac_installer_02_readme.png | Bin 0 -> 204902 bytes Doc/using/mac_installer_03_license.png | Bin 0 -> 120419 bytes .../mac_installer_04_installation_type.png | Bin 0 -> 125352 bytes Doc/using/mac_installer_05_custom_install.png | Bin 0 -> 169369 bytes Doc/using/mac_installer_06_summary.png | Bin 0 -> 157956 bytes Doc/using/mac_installer_07_applications.png | Bin 0 -> 148826 bytes .../mac_installer_08_install_certificates.png | Bin 0 -> 174152 bytes ...taller_09_custom_install_free_threaded.png | Bin 0 -> 192812 bytes Doc/using/unix.rst | 8 +- Doc/using/venv-create.inc | 110 - Doc/using/win_install_freethreaded.png | Bin 0 -> 236250 bytes Doc/using/windows.rst | 141 +- Doc/whatsnew/2.0.rst | 137 +- Doc/whatsnew/2.1.rst | 83 +- Doc/whatsnew/2.2.rst | 159 +- Doc/whatsnew/2.3.rst | 304 +- Doc/whatsnew/2.4.rst | 43 +- Doc/whatsnew/2.5.rst | 68 +- Doc/whatsnew/2.6.rst | 386 +- Doc/whatsnew/2.7.rst | 286 +- Doc/whatsnew/3.0.rst | 76 +- Doc/whatsnew/3.1.rst | 62 +- Doc/whatsnew/3.10.rst | 352 +- Doc/whatsnew/3.11.rst | 183 +- Doc/whatsnew/3.12.rst | 367 +- Doc/whatsnew/3.13.rst | 2721 + Doc/whatsnew/3.2.rst | 146 +- Doc/whatsnew/3.3.rst | 154 +- Doc/whatsnew/3.4.rst | 66 +- Doc/whatsnew/3.5.rst | 49 +- Doc/whatsnew/3.6.rst | 96 +- Doc/whatsnew/3.7.rst | 127 +- Doc/whatsnew/3.8.rst | 156 +- Doc/whatsnew/3.9.rst | 139 +- Doc/whatsnew/index.rst | 5 +- Grammar/Tokens | 2 - Grammar/python.gram | 113 +- Include/Python.h | 62 +- Include/abstract.h | 148 +- Include/boolobject.h | 11 +- Include/bytesobject.h | 5 +- Include/ceval.h | 33 +- Include/codecs.h | 120 +- Include/compile.h | 3 - Include/cpython/abstract.h | 141 +- Include/cpython/bytesobject.h | 94 +- Include/cpython/ceval.h | 10 - Include/cpython/code.h | 68 +- Include/cpython/compile.h | 23 +- Include/cpython/complexobject.h | 15 +- Include/cpython/context.h | 4 - Include/cpython/critical_section.h | 134 + Include/cpython/descrobject.h | 2 - Include/cpython/dictobject.h | 62 +- Include/cpython/fileobject.h | 3 - Include/cpython/frameobject.h | 6 + Include/cpython/funcobject.h | 14 +- Include/cpython/genobject.h | 6 - Include/cpython/import.h | 21 - Include/cpython/initconfig.h | 20 +- Include/cpython/interpreteridobject.h | 11 - Include/cpython/listobject.h | 12 +- Include/cpython/lock.h | 63 + Include/cpython/longintrepr.h | 46 +- Include/cpython/longobject.h | 96 +- Include/cpython/memoryobject.h | 2 - Include/cpython/modsupport.h | 105 +- Include/cpython/monitoring.h | 250 + Include/cpython/object.h | 152 +- Include/cpython/objimpl.h | 25 +- Include/cpython/pthread_stubs.h | 31 +- Include/cpython/pyatomic.h | 569 + Include/cpython/pyatomic_gcc.h | 551 + Include/cpython/pyatomic_msc.h | 1095 + Include/cpython/pyatomic_std.h | 976 + Include/cpython/pyerrors.h | 53 +- Include/cpython/pyframe.h | 10 + Include/cpython/pyhash.h | 47 + Include/cpython/pylifecycle.h | 45 +- Include/cpython/pymem.h | 22 +- Include/cpython/pystate.h | 309 +- Include/cpython/pystats.h | 169 + Include/cpython/pythonrun.h | 25 - Include/cpython/pythread.h | 15 +- Include/cpython/pytime.h | 326 +- Include/cpython/setobject.h | 9 +- Include/cpython/sysmodule.h | 24 +- Include/cpython/traceback.h | 3 - Include/cpython/tracemalloc.h | 26 + Include/cpython/tupleobject.h | 5 +- Include/cpython/unicodeobject.h | 296 +- Include/cpython/weakrefobject.h | 13 +- Include/critical_section.h | 16 + Include/dictobject.h | 11 + Include/errcode.h | 61 +- Include/exports.h | 72 + Include/fileobject.h | 8 - Include/fileutils.h | 36 + Include/floatobject.h | 2 +- Include/import.h | 7 +- Include/internal/mimalloc/mimalloc.h | 565 + Include/internal/mimalloc/mimalloc/atomic.h | 389 + Include/internal/mimalloc/mimalloc/internal.h | 969 + Include/internal/mimalloc/mimalloc/prim.h | 329 + Include/internal/mimalloc/mimalloc/track.h | 147 + Include/internal/mimalloc/mimalloc/types.h | 721 + Include/internal/pycore_abstract.h | 36 + Include/internal/pycore_ast.h | 22 +- Include/internal/pycore_ast_state.h | 9 +- Include/internal/pycore_atexit.h | 13 +- Include/internal/pycore_atomic.h | 557 - Include/internal/pycore_atomic_funcs.h | 94 - Include/internal/pycore_backoff.h | 145 + Include/internal/pycore_bitutils.h | 4 +- .../internal/pycore_blocks_output_buffer.h | 6 +- Include/internal/pycore_brc.h | 74 + Include/internal/pycore_bytes_methods.h | 23 +- Include/internal/pycore_bytesobject.h | 131 +- Include/internal/pycore_call.h | 102 +- Include/internal/pycore_capsule.h | 17 + Include/internal/pycore_cell.h | 48 + Include/internal/pycore_ceval.h | 174 +- Include/internal/pycore_ceval_state.h | 87 +- Include/internal/pycore_code.h | 254 +- Include/internal/pycore_codecs.h | 86 + Include/internal/pycore_compile.h | 66 +- Include/internal/pycore_complexobject.h | 25 + Include/internal/pycore_condvar.h | 24 +- Include/internal/pycore_context.h | 28 +- Include/internal/pycore_critical_section.h | 233 + Include/internal/pycore_crossinterp.h | 340 + Include/internal/pycore_descrobject.h | 2 + Include/internal/pycore_dict.h | 189 +- Include/internal/pycore_dict_state.h | 20 +- Include/internal/pycore_dtoa.h | 30 +- Include/internal/pycore_emscripten_signal.h | 5 + .../internal/pycore_emscripten_trampoline.h | 81 + Include/internal/pycore_faulthandler.h | 2 +- Include/internal/pycore_fileutils.h | 97 +- Include/internal/pycore_fileutils_windows.h | 2 +- Include/internal/pycore_floatobject.h | 33 +- Include/internal/pycore_flowgraph.h | 110 +- Include/internal/pycore_frame.h | 121 +- Include/internal/pycore_freelist.h | 153 + Include/internal/pycore_function.h | 29 + Include/internal/pycore_gc.h | 200 +- Include/internal/pycore_genobject.h | 41 +- Include/internal/pycore_gil.h | 24 +- Include/internal/pycore_global_objects.h | 12 +- .../pycore_global_objects_fini_generated.h | 67 +- Include/internal/pycore_global_strings.h | 71 +- Include/internal/pycore_hashtable.h | 10 +- Include/internal/pycore_identifier.h | 20 + Include/internal/pycore_import.h | 80 +- Include/internal/pycore_importdl.h | 139 + Include/internal/pycore_initconfig.h | 55 +- .../internal/pycore_instruction_sequence.h | 73 + Include/internal/pycore_instruments.h | 43 +- Include/internal/pycore_interp.h | 277 +- Include/internal/pycore_intrinsics.h | 31 +- Include/internal/pycore_jit.h | 25 + Include/internal/pycore_list.h | 39 +- Include/internal/pycore_llist.h | 106 + Include/internal/pycore_lock.h | 241 + Include/internal/pycore_long.h | 86 +- Include/internal/pycore_memoryobject.h | 2 + Include/internal/pycore_mimalloc.h | 69 + Include/internal/pycore_modsupport.h | 107 + Include/internal/pycore_moduleobject.h | 13 +- Include/internal/pycore_namespace.h | 5 +- Include/internal/pycore_object.h | 505 +- Include/internal/pycore_object_alloc.h | 71 + Include/internal/pycore_object_stack.h | 97 + Include/internal/pycore_object_state.h | 15 +- Include/internal/pycore_obmalloc.h | 6 +- Include/internal/pycore_obmalloc_init.h | 7 - Include/internal/pycore_opcode.h | 587 - Include/internal/pycore_opcode_metadata.h | 1922 + Include/internal/pycore_opcode_utils.h | 53 +- Include/internal/pycore_optimizer.h | 272 + Include/internal/pycore_parking_lot.h | 97 + Include/internal/pycore_parser.h | 31 +- Include/internal/pycore_pathconfig.h | 2 + Include/internal/pycore_pyarena.h | 84 +- .../internal/pycore_pyatomic_ft_wrappers.h | 94 + Include/internal/pycore_pybuffer.h | 21 + Include/internal/pycore_pyerrors.h | 101 +- Include/internal/pycore_pyhash.h | 77 +- Include/internal/pycore_pylifecycle.h | 71 +- Include/internal/pycore_pymem.h | 54 +- Include/internal/pycore_pymem_init.h | 26 +- Include/internal/pycore_pystate.h | 172 +- Include/internal/pycore_pystats.h | 21 + Include/internal/pycore_pythonrun.h | 39 + Include/internal/pycore_pythread.h | 128 +- Include/internal/pycore_qsbr.h | 154 + Include/internal/pycore_runtime.h | 245 +- Include/internal/pycore_runtime_init.h | 192 +- .../internal/pycore_runtime_init_generated.h | 70 +- Include/internal/pycore_semaphore.h | 65 + Include/internal/pycore_setobject.h | 39 + Include/internal/pycore_signal.h | 30 +- Include/internal/pycore_sliceobject.h | 4 +- Include/internal/pycore_stackref.h | 195 + Include/internal/pycore_strhex.h | 7 +- Include/internal/pycore_structseq.h | 3 +- Include/internal/pycore_symtable.h | 88 +- Include/internal/pycore_sysmodule.h | 14 +- Include/internal/pycore_time.h | 328 +- Include/internal/pycore_token.h | 26 +- Include/internal/pycore_traceback.h | 27 +- Include/internal/pycore_tracemalloc.h | 47 + Include/internal/pycore_tstate.h | 46 + Include/internal/pycore_tuple.h | 50 +- Include/internal/pycore_typeobject.h | 147 +- Include/internal/pycore_typevarobject.h | 3 + Include/internal/pycore_ucnhash.h | 2 + Include/internal/pycore_unicodeobject.h | 280 +- .../internal/pycore_unicodeobject_generated.h | 2331 +- Include/internal/pycore_unionobject.h | 6 +- Include/internal/pycore_uop_ids.h | 294 + Include/internal/pycore_uop_metadata.h | 1006 + Include/internal/pycore_warnings.h | 4 +- Include/internal/pycore_weakref.h | 119 + Include/interpreteridobject.h | 17 - Include/intrcheck.h | 11 +- Include/iterobject.h | 3 - Include/listobject.h | 3 + Include/lock.h | 16 + Include/longobject.h | 27 +- Include/methodobject.h | 17 +- Include/modsupport.h | 48 +- Include/moduleobject.h | 43 +- Include/monitoring.h | 18 + Include/object.h | 384 +- Include/objimpl.h | 31 +- Include/opcode.h | 233 +- Include/opcode_ids.h | 244 + Include/osdefs.h | 48 +- Include/patchlevel.h | 6 +- Include/py_curses.h | 37 +- Include/pyatomic.h | 16 + Include/pycapsule.h | 1 - Include/pyerrors.h | 6 +- Include/pyexpat.h | 4 +- Include/pyhash.h | 103 +- Include/pylifecycle.h | 18 +- Include/pymacconfig.h | 157 +- Include/pymacro.h | 70 +- Include/pymem.h | 22 +- Include/pyport.h | 245 +- Include/pystate.h | 2 +- Include/pystats.h | 110 +- Include/pystrtod.h | 9 - Include/pythread.h | 35 +- Include/sliceobject.h | 6 +- Include/structseq.h | 13 +- Include/sysmodule.h | 28 +- Include/tracemalloc.h | 72 - Include/unicodeobject.h | 17 +- Include/weakrefobject.h | 6 +- InternalDocs/string_interning.md | 118 + LICENSE | 6 +- Lib/_android_support.py | 181 + Lib/_collections_abc.py | 7 +- Lib/_colorize.py | 64 + Lib/_compat_pickle.py | 1 - Lib/_ios_support.py | 71 + Lib/_opcode_metadata.py | 343 + Lib/_osx_support.py | 5 + Lib/_pydatetime.py | 64 +- Lib/_pydecimal.py | 120 +- Lib/_pyio.py | 38 +- Lib/_pylong.py | 204 +- Lib/_pyrepl/__init__.py | 19 + Lib/_pyrepl/__main__.py | 6 + Lib/_pyrepl/_minimal_curses.py | 68 + Lib/_pyrepl/_threading_handler.py | 74 + Lib/_pyrepl/commands.py | 483 + Lib/_pyrepl/completing_reader.py | 290 + Lib/_pyrepl/console.py | 212 + Lib/_pyrepl/curses.py | 33 + Lib/_pyrepl/fancy_termios.py | 74 + Lib/_pyrepl/historical_reader.py | 415 + Lib/_pyrepl/input.py | 114 + Lib/_pyrepl/keymap.py | 213 + Lib/_pyrepl/main.py | 59 + Lib/_pyrepl/mypy.ini | 24 + Lib/_pyrepl/pager.py | 175 + Lib/_pyrepl/reader.py | 815 + Lib/_pyrepl/readline.py | 598 + Lib/_pyrepl/simple_interact.py | 175 + Lib/_pyrepl/trace.py | 21 + Lib/_pyrepl/types.py | 8 + Lib/_pyrepl/unix_console.py | 804 + Lib/_pyrepl/unix_eventqueue.py | 152 + Lib/_pyrepl/utils.py | 25 + Lib/_pyrepl/windows_console.py | 618 + Lib/_strptime.py | 231 +- Lib/aifc.py | 984 - Lib/argparse.py | 580 +- Lib/ast.py | 67 +- Lib/asyncio/__main__.py | 121 +- Lib/asyncio/base_events.py | 178 +- Lib/asyncio/base_subprocess.py | 38 +- Lib/asyncio/constants.py | 4 + Lib/asyncio/events.py | 22 +- Lib/asyncio/format_helpers.py | 22 +- Lib/asyncio/futures.py | 25 +- Lib/asyncio/locks.py | 151 +- Lib/asyncio/proactor_events.py | 11 +- Lib/asyncio/queues.py | 70 +- Lib/asyncio/selector_events.py | 92 +- Lib/asyncio/sslproto.py | 29 +- Lib/asyncio/staggered.py | 31 +- Lib/asyncio/streams.py | 109 +- Lib/asyncio/subprocess.py | 14 +- Lib/asyncio/taskgroups.py | 85 +- Lib/asyncio/tasks.py | 205 +- Lib/asyncio/timeouts.py | 32 +- Lib/asyncio/transports.py | 2 + Lib/asyncio/unix_events.py | 54 +- Lib/asyncio/windows_events.py | 69 +- Lib/base64.py | 33 +- Lib/bdb.py | 80 +- Lib/bz2.py | 18 +- Lib/cProfile.py | 4 +- Lib/calendar.py | 45 +- Lib/cgi.py | 1012 - Lib/cgitb.py | 332 - Lib/chunk.py | 173 - Lib/cmd.py | 18 +- Lib/code.py | 203 +- Lib/codecs.py | 15 + Lib/codeop.py | 36 +- Lib/collections/__init__.py | 17 +- Lib/collections/abc.py | 3 - Lib/colorsys.py | 2 +- Lib/compileall.py | 15 +- Lib/concurrent/futures/__init__.py | 1 + Lib/concurrent/futures/process.py | 138 +- Lib/concurrent/futures/thread.py | 5 +- Lib/configparser.py | 372 +- Lib/contextlib.py | 80 +- Lib/copy.py | 30 +- Lib/crypt.py | 124 - Lib/csv.py | 80 +- Lib/ctypes/__init__.py | 25 +- Lib/ctypes/_endian.py | 6 +- Lib/ctypes/util.py | 18 +- Lib/dataclasses.py | 515 +- Lib/dbm/__init__.py | 8 +- Lib/dbm/dumb.py | 4 +- Lib/dbm/sqlite3.py | 140 + Lib/decimal.py | 108 +- Lib/dis.py | 763 +- Lib/doctest.py | 267 +- Lib/email/_header_value_parser.py | 125 +- Lib/email/_parseaddr.py | 5 +- Lib/email/_policybase.py | 14 +- Lib/email/errors.py | 4 + Lib/email/feedparser.py | 15 +- Lib/email/generator.py | 15 +- Lib/email/message.py | 33 +- Lib/email/mime/audio.py | 11 +- Lib/email/policy.py | 18 +- Lib/email/utils.py | 169 +- Lib/encodings/aliases.py | 1 + Lib/encodings/idna.py | 166 +- Lib/encodings/punycode.py | 42 +- Lib/encodings/undefined.py | 2 +- Lib/encodings/utf_16.py | 4 +- Lib/encodings/utf_32.py | 6 +- Lib/ensurepip/__init__.py | 131 +- .../_bundled/pip-23.2.1-py3-none-any.whl | Bin 2086091 -> 0 bytes .../_bundled/pip-24.3.1-py3-none-any.whl | Bin 0 -> 1822182 bytes Lib/enum.py | 461 +- Lib/filecmp.py | 23 +- Lib/fileinput.py | 2 +- Lib/fnmatch.py | 11 +- Lib/fractions.py | 124 +- Lib/ftplib.py | 27 +- Lib/functools.py | 106 +- Lib/genericpath.py | 28 +- Lib/getpass.py | 15 +- Lib/gettext.py | 25 +- Lib/glob.py | 304 +- Lib/gzip.py | 50 +- Lib/hmac.py | 2 +- Lib/http/__init__.py | 20 +- Lib/http/client.py | 31 +- Lib/http/cookies.py | 36 +- Lib/http/server.py | 20 +- Lib/idlelib/HISTORY.txt | 2 +- Lib/idlelib/Icons/README.txt | 52 +- Lib/idlelib/{NEWS.txt => News3.txt} | 47 +- Lib/idlelib/TODO.txt | 2 +- Lib/idlelib/browser.py | 2 + Lib/idlelib/calltip_w.py | 1 + Lib/idlelib/config.py | 14 +- Lib/idlelib/config_key.py | 2 +- Lib/idlelib/configdialog.py | 64 +- Lib/idlelib/debugger.py | 209 +- Lib/idlelib/debugger_r.py | 27 +- Lib/idlelib/debugobj.py | 28 +- Lib/idlelib/delegator.py | 1 + Lib/idlelib/dynoption.py | 2 + Lib/idlelib/editor.py | 19 +- Lib/idlelib/extend.txt | 2 +- Lib/idlelib/filelist.py | 1 + Lib/idlelib/grep.py | 8 +- Lib/idlelib/help.html | 182 +- Lib/idlelib/help.py | 20 +- Lib/idlelib/help_about.py | 21 +- Lib/idlelib/idle_test/example_stub.pyi | 2 + Lib/idlelib/idle_test/htest.py | 239 +- Lib/idlelib/idle_test/test_calltip.py | 7 + Lib/idlelib/idle_test/test_config.py | 12 +- Lib/idlelib/idle_test/test_configdialog.py | 29 +- Lib/idlelib/idle_test/test_debugger.py | 280 +- Lib/idlelib/idle_test/test_debugobj.py | 4 +- Lib/idlelib/idle_test/test_editor.py | 2 +- Lib/idlelib/idle_test/test_help.py | 16 +- Lib/idlelib/idle_test/test_help_about.py | 2 +- Lib/idlelib/idle_test/test_outwin.py | 5 + Lib/idlelib/idle_test/test_run.py | 3 + Lib/idlelib/idle_test/test_sidebar.py | 22 +- Lib/idlelib/iomenu.py | 32 +- Lib/idlelib/macosx.py | 2 +- Lib/idlelib/multicall.py | 3 + Lib/idlelib/outwin.py | 3 +- Lib/idlelib/pathbrowser.py | 6 +- Lib/idlelib/percolator.py | 14 +- Lib/idlelib/pyshell.py | 36 +- Lib/idlelib/query.py | 2 +- Lib/idlelib/redirector.py | 2 + Lib/idlelib/replace.py | 26 +- Lib/idlelib/rpc.py | 4 +- Lib/idlelib/run.py | 34 +- Lib/idlelib/scrolledlist.py | 4 +- Lib/idlelib/search.py | 1 + Lib/idlelib/searchbase.py | 2 +- Lib/idlelib/searchengine.py | 2 +- Lib/idlelib/sidebar.py | 17 +- Lib/idlelib/stackviewer.py | 12 +- Lib/idlelib/statusbar.py | 2 + Lib/idlelib/tooltip.py | 8 +- Lib/idlelib/tree.py | 25 +- Lib/idlelib/undo.py | 15 +- Lib/idlelib/util.py | 20 +- Lib/imghdr.py | 180 - Lib/importlib/__init__.py | 4 +- Lib/importlib/_bootstrap.py | 14 +- Lib/importlib/_bootstrap_external.py | 98 +- Lib/importlib/abc.py | 6 +- Lib/importlib/machinery.py | 1 + Lib/importlib/metadata/__init__.py | 330 +- Lib/importlib/metadata/_adapters.py | 2 +- Lib/importlib/metadata/_meta.py | 52 +- Lib/importlib/metadata/diagnose.py | 21 + Lib/importlib/resources/__init__.py | 14 +- Lib/importlib/resources/_common.py | 7 +- Lib/importlib/resources/_functional.py | 81 + Lib/importlib/resources/_legacy.py | 120 - Lib/importlib/resources/readers.py | 60 +- Lib/importlib/resources/simple.py | 2 +- Lib/importlib/util.py | 90 +- Lib/inspect.py | 429 +- Lib/io.py | 3 +- Lib/ipaddress.py | 179 +- Lib/json/decoder.py | 16 +- Lib/json/encoder.py | 16 +- Lib/json/scanner.py | 2 +- Lib/json/tool.py | 34 +- Lib/lib2to3/Grammar.txt | 196 - Lib/lib2to3/PatternGrammar.txt | 28 - Lib/lib2to3/__init__.py | 8 - Lib/lib2to3/__main__.py | 4 - Lib/lib2to3/btm_matcher.py | 163 - Lib/lib2to3/btm_utils.py | 280 - Lib/lib2to3/fixer_base.py | 186 - Lib/lib2to3/fixer_util.py | 453 - Lib/lib2to3/fixes/__init__.py | 1 - Lib/lib2to3/fixes/fix_apply.py | 68 - Lib/lib2to3/fixes/fix_asserts.py | 34 - Lib/lib2to3/fixes/fix_basestring.py | 14 - Lib/lib2to3/fixes/fix_buffer.py | 22 - Lib/lib2to3/fixes/fix_dict.py | 106 - Lib/lib2to3/fixes/fix_except.py | 93 - Lib/lib2to3/fixes/fix_exec.py | 39 - Lib/lib2to3/fixes/fix_execfile.py | 53 - Lib/lib2to3/fixes/fix_exitfunc.py | 72 - Lib/lib2to3/fixes/fix_filter.py | 94 - Lib/lib2to3/fixes/fix_funcattrs.py | 21 - Lib/lib2to3/fixes/fix_future.py | 22 - Lib/lib2to3/fixes/fix_getcwdu.py | 19 - Lib/lib2to3/fixes/fix_has_key.py | 109 - Lib/lib2to3/fixes/fix_idioms.py | 152 - Lib/lib2to3/fixes/fix_import.py | 99 - Lib/lib2to3/fixes/fix_imports.py | 145 - Lib/lib2to3/fixes/fix_imports2.py | 16 - Lib/lib2to3/fixes/fix_input.py | 26 - Lib/lib2to3/fixes/fix_intern.py | 39 - Lib/lib2to3/fixes/fix_isinstance.py | 52 - Lib/lib2to3/fixes/fix_itertools.py | 43 - Lib/lib2to3/fixes/fix_itertools_imports.py | 57 - Lib/lib2to3/fixes/fix_long.py | 19 - Lib/lib2to3/fixes/fix_map.py | 110 - Lib/lib2to3/fixes/fix_metaclass.py | 228 - Lib/lib2to3/fixes/fix_methodattrs.py | 24 - Lib/lib2to3/fixes/fix_ne.py | 23 - Lib/lib2to3/fixes/fix_next.py | 103 - Lib/lib2to3/fixes/fix_nonzero.py | 21 - Lib/lib2to3/fixes/fix_numliterals.py | 28 - Lib/lib2to3/fixes/fix_operator.py | 97 - Lib/lib2to3/fixes/fix_paren.py | 44 - Lib/lib2to3/fixes/fix_print.py | 87 - Lib/lib2to3/fixes/fix_raise.py | 90 - Lib/lib2to3/fixes/fix_raw_input.py | 17 - Lib/lib2to3/fixes/fix_reduce.py | 35 - Lib/lib2to3/fixes/fix_reload.py | 36 - Lib/lib2to3/fixes/fix_renames.py | 70 - Lib/lib2to3/fixes/fix_repr.py | 23 - Lib/lib2to3/fixes/fix_set_literal.py | 53 - Lib/lib2to3/fixes/fix_standarderror.py | 18 - Lib/lib2to3/fixes/fix_sys_exc.py | 30 - Lib/lib2to3/fixes/fix_throw.py | 56 - Lib/lib2to3/fixes/fix_tuple_params.py | 175 - Lib/lib2to3/fixes/fix_types.py | 61 - Lib/lib2to3/fixes/fix_unicode.py | 42 - Lib/lib2to3/fixes/fix_urllib.py | 196 - Lib/lib2to3/fixes/fix_ws_comma.py | 39 - Lib/lib2to3/fixes/fix_xrange.py | 73 - Lib/lib2to3/fixes/fix_xreadlines.py | 25 - Lib/lib2to3/fixes/fix_zip.py | 46 - Lib/lib2to3/main.py | 273 - Lib/lib2to3/patcomp.py | 204 - Lib/lib2to3/pgen2/__init__.py | 4 - Lib/lib2to3/pgen2/conv.py | 257 - Lib/lib2to3/pgen2/driver.py | 177 - Lib/lib2to3/pgen2/grammar.py | 189 - Lib/lib2to3/pgen2/literals.py | 60 - Lib/lib2to3/pgen2/parse.py | 204 - Lib/lib2to3/pgen2/pgen.py | 386 - Lib/lib2to3/pgen2/token.py | 86 - Lib/lib2to3/pgen2/tokenize.py | 564 - Lib/lib2to3/pygram.py | 43 - Lib/lib2to3/pytree.py | 853 - Lib/lib2to3/refactor.py | 732 - Lib/linecache.py | 50 +- Lib/locale.py | 59 +- Lib/logging/__init__.py | 206 +- Lib/logging/config.py | 171 +- Lib/logging/handlers.py | 227 +- Lib/lzma.py | 18 +- Lib/mailbox.py | 91 +- Lib/mailcap.py | 302 - Lib/mimetypes.py | 44 +- Lib/modulefinder.py | 7 +- Lib/msilib/__init__.py | 484 - Lib/msilib/schema.py | 1007 - Lib/msilib/sequence.py | 126 - Lib/msilib/text.py | 129 - Lib/multiprocessing/connection.py | 38 +- Lib/multiprocessing/forkserver.py | 6 + Lib/multiprocessing/managers.py | 53 +- Lib/multiprocessing/pool.py | 2 +- Lib/multiprocessing/popen_fork.py | 4 + Lib/multiprocessing/popen_spawn_win32.py | 53 +- Lib/multiprocessing/process.py | 7 +- Lib/multiprocessing/queues.py | 32 +- Lib/multiprocessing/resource_sharer.py | 2 +- Lib/multiprocessing/resource_tracker.py | 71 +- Lib/multiprocessing/shared_memory.py | 24 +- Lib/multiprocessing/synchronize.py | 4 +- Lib/multiprocessing/util.py | 20 +- Lib/nntplib.py | 1093 - Lib/ntpath.py | 328 +- Lib/nturl2path.py | 54 +- Lib/opcode.py | 476 +- Lib/operator.py | 10 +- Lib/os.py | 127 +- Lib/pathlib.py | 1436 - Lib/pathlib/__init__.py | 12 + Lib/pathlib/_abc.py | 930 + Lib/pathlib/_local.py | 861 + Lib/pdb.py | 895 +- Lib/pickle.py | 172 +- Lib/pickletools.py | 44 +- Lib/pipes.py | 250 - Lib/platform.py | 174 +- Lib/plistlib.py | 68 +- Lib/poplib.py | 1 - Lib/posixpath.py | 266 +- Lib/pprint.py | 3 + Lib/profile.py | 5 +- Lib/pstats.py | 4 +- Lib/pydoc.py | 454 +- Lib/pydoc_data/topics.py | 3452 +- Lib/queue.py | 60 +- Lib/random.py | 141 +- Lib/re/__init__.py | 95 +- Lib/re/_casefix.py | 2 +- Lib/re/_compiler.py | 35 +- Lib/re/_constants.py | 8 +- Lib/re/_parser.py | 20 +- Lib/reprlib.py | 33 +- Lib/rlcompleter.py | 10 +- Lib/runpy.py | 15 +- Lib/sched.py | 2 +- Lib/selectors.py | 107 +- Lib/shelve.py | 7 + Lib/shutil.py | 268 +- Lib/signal.py | 6 +- Lib/site.py | 220 +- Lib/smtplib.py | 4 +- Lib/sndhdr.py | 271 - Lib/socket.py | 128 +- Lib/sqlite3/__main__.py | 4 + Lib/sqlite3/dump.py | 55 +- Lib/ssl.py | 185 +- Lib/stat.py | 22 +- Lib/statistics.py | 383 +- Lib/subprocess.py | 82 +- Lib/sunau.py | 533 - Lib/symtable.py | 123 +- Lib/{sysconfig.py => sysconfig/__init__.py} | 397 +- Lib/sysconfig/__main__.py | 248 + Lib/tabnanny.py | 8 +- Lib/tarfile.py | 185 +- Lib/telnetlib.py | 679 - Lib/tempfile.py | 49 +- Lib/test/.ruff.toml | 37 +- Lib/test/Sine-1000Hz-300ms.aif | Bin 61696 -> 0 bytes Lib/test/__main__.py | 4 +- Lib/test/_test_atexit.py | 8 +- Lib/test/_test_eintr.py | 60 +- Lib/test/_test_embed_set_config.py | 94 +- Lib/test/_test_monitoring_shutdown.py | 30 + Lib/test/_test_multiprocessing.py | 561 +- Lib/test/allsans.pem | 170 - Lib/test/archiver_tests.py | 177 + .../README.md | 19 +- .../exe_with_z64 | Bin .../exe_with_zip | Bin .../header.sh | 0 Lib/test/{ => archivetestdata}/recursion.tar | Bin .../testdata_module_inside_zip.py | 0 Lib/test/{ => archivetestdata}/testtar.tar | Bin Lib/test/{ => archivetestdata}/testtar.tar.xz | Bin .../zip_cp437_header.zip | Bin Lib/test/{ => archivetestdata}/zipdir.zip | Bin Lib/test/archivetestdata/zipdir_backslash.zip | Bin 0 -> 192 bytes Lib/test/audiodata/pluck-alaw.aifc | Bin 6910 -> 0 bytes Lib/test/audiodata/pluck-pcm16.aiff | Bin 13506 -> 0 bytes Lib/test/audiodata/pluck-pcm16.au | Bin 13252 -> 0 bytes Lib/test/audiodata/pluck-pcm24.aiff | Bin 20120 -> 0 bytes Lib/test/audiodata/pluck-pcm24.au | Bin 19866 -> 0 bytes Lib/test/audiodata/pluck-pcm32.aiff | Bin 26734 -> 0 bytes Lib/test/audiodata/pluck-pcm32.au | Bin 26480 -> 0 bytes Lib/test/audiodata/pluck-pcm8.aiff | Bin 6892 -> 0 bytes Lib/test/audiodata/pluck-pcm8.au | Bin 6638 -> 0 bytes Lib/test/audiodata/pluck-ulaw.aifc | Bin 6910 -> 0 bytes Lib/test/audiodata/pluck-ulaw.au | Bin 6638 -> 0 bytes Lib/test/audiotest.au | Bin 28144 -> 0 bytes Lib/test/audit-tests.py | 93 +- Lib/test/autotest.py | 2 +- Lib/test/badsyntax_future3.py | 10 - Lib/test/badsyntax_future4.py | 10 - Lib/test/badsyntax_future5.py | 12 - Lib/test/badsyntax_future6.py | 10 - Lib/test/badsyntax_future7.py | 11 - Lib/test/badsyntax_future8.py | 10 - Lib/test/badsyntax_future9.py | 10 - Lib/test/bisect_cmd.py | 13 +- Lib/test/capath/b1930218.0 | 26 - Lib/test/capath/ceff1710.0 | 26 - Lib/test/certdata/allsans.pem | 167 + Lib/test/{ => certdata}/badcert.pem | 0 Lib/test/{ => certdata}/badkey.pem | 0 Lib/test/{ => certdata}/capath/4e1295a3.0 | 0 Lib/test/{ => certdata}/capath/5ed36f99.0 | 0 Lib/test/{ => certdata}/capath/6e88d7b8.0 | 0 Lib/test/{ => certdata}/capath/99d0fa06.0 | 0 Lib/test/certdata/capath/b1930218.0 | 27 + Lib/test/certdata/capath/ceff1710.0 | 27 + Lib/test/certdata/cert3.pem | 34 + Lib/test/{ => certdata}/ffdh3072.pem | 0 Lib/test/certdata/idnsans.pem | 166 + Lib/test/certdata/keycert.passwd.pem | 69 + Lib/test/certdata/keycert.pem | 67 + Lib/test/certdata/keycert2.pem | 67 + Lib/test/certdata/keycert3.pem | 161 + Lib/test/certdata/keycert4.pem | 161 + Lib/test/certdata/keycertecc.pem | 103 + Lib/test/certdata/leaf-missing-aki.ca.pem | 13 + .../certdata/leaf-missing-aki.keycert.pem | 18 + Lib/test/{ => certdata}/make_ssl_certs.py | 5 +- Lib/test/{ => certdata}/nokia.pem | 0 Lib/test/certdata/nosan.pem | 131 + Lib/test/{ => certdata}/nullbytecert.pem | 0 Lib/test/{ => certdata}/nullcert.pem | 0 Lib/test/certdata/pycacert.pem | 102 + Lib/test/certdata/pycakey.pem | 40 + Lib/test/certdata/revocation.crl | 14 + Lib/test/{ => certdata}/secp384r1.pem | 0 .../selfsigned_pythontestdotnet.pem | 0 Lib/test/certdata/ssl_cert.pem | 27 + Lib/test/certdata/ssl_key.passwd.pem | 42 + Lib/test/certdata/ssl_key.pem | 40 + Lib/test/{ => certdata}/talos-2019-0758.pem | 0 Lib/test/clinic.test.c | 889 +- Lib/test/{ => configdata}/cfgparser.1 | 0 Lib/test/{ => configdata}/cfgparser.2 | 0 Lib/test/{ => configdata}/cfgparser.3 | 0 Lib/test/cov.py | 48 + Lib/test/crashers/README | 9 +- Lib/test/datetimetester.py | 472 +- Lib/test/decimaltestdata/ddFMA.decTest | 2 +- Lib/test/decimaltestdata/ddQuantize.decTest | 2 +- Lib/test/decimaltestdata/ddRemainder.decTest | 2 +- .../decimaltestdata/ddRemainderNear.decTest | 2 +- Lib/test/decimaltestdata/dqRemainder.decTest | 2 +- .../decimaltestdata/dqRemainderNear.decTest | 2 +- Lib/test/decimaltestdata/exp.decTest | 2 +- Lib/test/decimaltestdata/remainder.decTest | 2 +- .../decimaltestdata/remainderNear.decTest | 2 +- Lib/test/exception_hierarchy.txt | 1 + Lib/test/idnsans.pem | 169 - Lib/test/imghdrdata/python-raw.jpg | Bin 525 -> 0 bytes Lib/test/imghdrdata/python.bmp | Bin 1162 -> 0 bytes Lib/test/imghdrdata/python.exr | Bin 2635 -> 0 bytes Lib/test/imghdrdata/python.jpg | Bin 543 -> 0 bytes Lib/test/imghdrdata/python.pbm | 3 - Lib/test/imghdrdata/python.ras | Bin 1056 -> 0 bytes Lib/test/imghdrdata/python.sgi | Bin 1967 -> 0 bytes Lib/test/imghdrdata/python.tiff | Bin 1326 -> 0 bytes Lib/test/imghdrdata/python.webp | Bin 432 -> 0 bytes Lib/test/imp_dummy.py | 3 - Lib/test/keycert.passwd.pem | 69 - Lib/test/keycert.pem | 66 - Lib/test/keycert2.pem | 66 - Lib/test/keycert3.pem | 164 - Lib/test/keycert4.pem | 164 - Lib/test/keycertecc.pem | 106 - Lib/test/libregrtest/__init__.py | 2 - Lib/test/libregrtest/cmdline.py | 200 +- Lib/test/libregrtest/filter.py | 77 + Lib/test/libregrtest/findtests.py | 108 + Lib/test/libregrtest/logger.py | 89 + Lib/test/libregrtest/main.py | 1278 +- Lib/test/libregrtest/mypy.ini | 26 + Lib/test/libregrtest/pgo.py | 8 +- Lib/test/libregrtest/refleak.py | 140 +- Lib/test/libregrtest/result.py | 224 + Lib/test/libregrtest/results.py | 276 + Lib/test/libregrtest/run_workers.py | 621 + Lib/test/libregrtest/runtest.py | 575 - Lib/test/libregrtest/runtest_mp.py | 631 - Lib/test/libregrtest/runtests.py | 222 + Lib/test/libregrtest/save_env.py | 6 +- Lib/test/libregrtest/setup.py | 144 +- Lib/test/libregrtest/single.py | 322 + .../{support => libregrtest}/testresult.py | 12 +- Lib/test/libregrtest/tsan.py | 33 + Lib/test/libregrtest/utils.py | 528 +- Lib/test/libregrtest/win_utils.py | 4 + Lib/test/libregrtest/worker.py | 116 + Lib/test/list_tests.py | 17 +- Lib/test/lock_tests.py | 645 +- Lib/test/mailcap.txt | 39 - Lib/test/mapping_tests.py | 5 +- Lib/test/{ => mathdata}/cmath_testcases.txt | 0 Lib/test/{ => mathdata}/floating_points.txt | 0 .../{ => mathdata}/formatfloat_testcases.txt | 0 Lib/test/{ => mathdata}/ieee754.txt | 2 +- Lib/test/{ => mathdata}/math_testcases.txt | 0 Lib/test/nosan.pem | 130 - Lib/test/pickletester.py | 1030 +- Lib/test/pycacert.pem | 99 - Lib/test/pycakey.pem | 40 - Lib/test/pyclbr_input.py | 68 +- Lib/test/pythoninfo.py | 232 +- Lib/test/regrtest.py | 2 +- .../import_from_tests/test_regrtest_a.py | 11 + .../test_regrtest_b/__init__.py | 9 + .../test_regrtest_b/util.py} | 0 .../import_from_tests/test_regrtest_c.py | 11 + Lib/test/revocation.crl | 14 - Lib/test/seq_tests.py | 1 + Lib/test/sgml_input.html | 212 - Lib/test/shadowed_super.py | 7 - Lib/test/signalinterproctester.py | 8 + Lib/test/sndhdrdata/README | 5 - Lib/test/sndhdrdata/sndhdr.8svx | Bin 110 -> 0 bytes Lib/test/sndhdrdata/sndhdr.aifc | Bin 106 -> 0 bytes Lib/test/sndhdrdata/sndhdr.aiff | Bin 108 -> 0 bytes Lib/test/sndhdrdata/sndhdr.au | Bin 64 -> 0 bytes Lib/test/sndhdrdata/sndhdr.hcom | Bin 256 -> 0 bytes Lib/test/sndhdrdata/sndhdr.sndt | Bin 129 -> 0 bytes Lib/test/sndhdrdata/sndhdr.voc | Bin 63 -> 0 bytes Lib/test/sndhdrdata/sndhdr.wav | Bin 64 -> 0 bytes Lib/test/sortperf.py | 169 - Lib/test/ssl_cert.pem | 26 - Lib/test/ssl_key.passwd.pem | 42 - Lib/test/ssl_key.pem | 40 - Lib/test/ssl_servers.py | 2 +- Lib/test/ssltests.py | 2 +- Lib/test/string_tests.py | 60 +- Lib/test/support/__init__.py | 867 +- Lib/test/support/bytecode_helper.py | 109 +- Lib/test/support/i18n_helper.py | 63 + Lib/test/support/import_helper.py | 43 +- Lib/test/support/interpreters.py | 198 - Lib/test/support/interpreters/__init__.py | 258 + Lib/test/support/interpreters/_crossinterp.py | 102 + Lib/test/support/interpreters/channels.py | 257 + Lib/test/support/interpreters/queues.py | 313 + Lib/test/support/os_helper.py | 70 +- Lib/test/support/pty_helper.py | 80 + Lib/test/support/refleak_helper.py | 8 + Lib/test/support/script_helper.py | 32 +- Lib/test/{ => support}/smtpd.py | 0 Lib/test/support/socket_helper.py | 6 - Lib/test/support/testcase.py | 40 + Lib/test/support/threading_helper.py | 53 +- Lib/test/support/venv.py | 70 + Lib/test/test___all__.py | 52 +- Lib/test/test__colorize.py | 59 + ...erpchannels.py => test__interpchannels.py} | 1244 +- Lib/test/test__interpreters.py | 1169 + Lib/test/test__locale.py | 102 +- Lib/test/test__opcode.py | 61 +- Lib/test/test__xxsubinterpreters.py | 929 - Lib/test/test_abstract_numbers.py | 158 +- Lib/test/test_aifc.py | 439 - Lib/test/test_android.py | 448 + Lib/test/test_argparse.py | 1325 +- Lib/test/test_array.py | 102 +- Lib/test/test_ast.py | 3082 - Lib/test/test_ast/__init__.py | 7 + Lib/test/test_ast/snippets.py | 601 + Lib/test/test_ast/test_ast.py | 3493 ++ Lib/test/test_ast/utils.py | 15 + Lib/test/test_asyncgen.py | 367 +- Lib/test/test_asyncio/test_base_events.py | 67 +- .../test_asyncio/test_eager_task_factory.py | 67 +- Lib/test/test_asyncio/test_events.py | 140 +- Lib/test/test_asyncio/test_futures.py | 210 +- Lib/test/test_asyncio/test_locks.py | 205 + Lib/test/test_asyncio/test_proactor_events.py | 31 +- Lib/test/test_asyncio/test_queues.py | 199 + Lib/test/test_asyncio/test_runners.py | 31 + Lib/test/test_asyncio/test_selector_events.py | 55 +- Lib/test/test_asyncio/test_sendfile.py | 18 +- Lib/test/test_asyncio/test_server.py | 210 +- Lib/test/test_asyncio/test_sock_lowlevel.py | 81 + Lib/test/test_asyncio/test_ssl.py | 4 + Lib/test/test_asyncio/test_sslproto.py | 63 +- Lib/test/test_asyncio/test_staggered.py | 124 + Lib/test/test_asyncio/test_streams.py | 196 +- Lib/test/test_asyncio/test_subprocess.py | 141 +- Lib/test/test_asyncio/test_taskgroups.py | 218 +- Lib/test/test_asyncio/test_tasks.py | 343 +- Lib/test/test_asyncio/test_threads.py | 6 +- Lib/test/test_asyncio/test_timeouts.py | 189 +- Lib/test/test_asyncio/test_unix_events.py | 37 +- Lib/test/test_asyncio/test_waitfor.py | 22 +- Lib/test/test_asyncio/test_windows_events.py | 63 +- Lib/test/test_asyncio/utils.py | 62 +- Lib/test/test_audioop.py | 568 - Lib/test/test_audit.py | 84 +- Lib/test/test_base64.py | 90 +- Lib/test/test_baseexception.py | 5 +- Lib/test/test_bdb.py | 28 +- Lib/test/test_binascii.py | 73 +- Lib/test/test_buffer.py | 68 +- Lib/test/test_builtin.py | 243 +- Lib/test/test_bytes.py | 104 +- Lib/test/test_bz2.py | 203 +- Lib/test/test_c_locale_coercion.py | 75 +- Lib/test/test_calendar.py | 255 +- Lib/test/test_call.py | 256 +- Lib/test/test_capi/__init__.py | 7 + Lib/test/test_capi/test_abstract.py | 479 +- Lib/test/test_capi/test_bytearray.py | 164 + Lib/test/test_capi/test_bytes.py | 254 + Lib/test/test_capi/test_codecs.py | 46 +- Lib/test/test_capi/test_complex.py | 251 + Lib/test/test_capi/test_dict.py | 238 +- Lib/test/test_capi/test_eval_code_ex.py | 92 +- Lib/test/test_capi/test_exceptions.py | 146 +- Lib/test/test_capi/test_float.py | 183 + Lib/test/test_capi/test_getargs.py | 334 +- Lib/test/test_capi/test_hash.py | 83 + Lib/test/test_capi/test_list.py | 353 + Lib/test/test_capi/test_long.py | 583 +- Lib/test/test_capi/test_mem.py | 31 +- Lib/test/test_capi/test_misc.py | 1111 +- Lib/test/test_capi/test_number.py | 335 + Lib/test/test_capi/test_object.py | 135 + Lib/test/test_capi/test_opt.py | 1338 + Lib/test/test_capi/test_pyatomic.py | 15 + Lib/test/test_capi/test_run.py | 118 + Lib/test/test_capi/test_set.py | 271 + Lib/test/test_capi/test_structmembers.py | 178 +- Lib/test/test_capi/test_sys.py | 154 + Lib/test/test_capi/test_time.py | 78 + Lib/test/test_capi/test_tuple.py | 261 + Lib/test/test_capi/test_unicode.py | 422 +- Lib/test/test_capi/test_watchers.py | 57 +- Lib/test/test_cext/__init__.py | 109 + Lib/test/test_cext/extension.c | 83 + Lib/test/test_cext/setup.py | 100 + Lib/test/test_cgi.py | 641 - Lib/test/test_cgitb.py | 71 - Lib/test/test_class.py | 270 +- Lib/test/test_clinic.py | 2897 +- Lib/test/test_cmath.py | 42 +- Lib/test/test_cmd.py | 57 +- Lib/test/test_cmd_line.py | 132 +- Lib/test/test_cmd_line_script.py | 39 +- Lib/test/test_code.py | 75 +- Lib/test/test_code_module.py | 188 +- Lib/test/test_codecencodings_iso2022.py | 46 + Lib/test/test_codecs.py | 305 +- Lib/test/test_codeop.py | 17 + Lib/test/test_collections.py | 10 +- Lib/test/test_compile.py | 514 +- Lib/test/test_compileall.py | 75 +- Lib/test/test_compiler_assemble.py | 85 +- Lib/test/test_compiler_codegen.py | 113 +- Lib/test/test_complex.py | 434 +- Lib/test/test_concurrent_futures/__init__.py | 8 +- Lib/test/test_concurrent_futures/executor.py | 29 +- .../test_as_completed.py | 7 +- .../test_concurrent_futures/test_deadlock.py | 83 +- Lib/test/test_concurrent_futures/test_init.py | 35 + .../test_process_pool.py | 31 + .../test_concurrent_futures/test_shutdown.py | 4 +- .../test_thread_pool.py | 23 +- Lib/test/test_concurrent_futures/test_wait.py | 19 +- Lib/test/test_concurrent_futures/util.py | 12 +- Lib/test/test_configparser.py | 151 +- Lib/test/test_context.py | 4 +- Lib/test/test_contextlib.py | 101 +- Lib/test/test_contextlib_async.py | 88 +- Lib/test/test_copy.py | 80 +- Lib/test/test_coroutines.py | 24 +- Lib/test/test_cppext/__init__.py | 58 +- Lib/test/test_cppext/extension.cpp | 16 +- Lib/test/test_cppext/setup.py | 62 +- Lib/test/test_cprofile.py | 57 +- Lib/test/test_crashers.py | 37 - Lib/test/test_crypt.py | 112 - Lib/test/test_csv.py | 253 +- Lib/test/test_ctypes/__init__.py | 10 +- Lib/test/test_ctypes/_support.py | 24 + .../test_ctypes/test_aligned_structures.py | 286 + Lib/test/test_ctypes/test_anon.py | 4 +- Lib/test/test_ctypes/test_array_in_pointer.py | 12 +- Lib/test/test_ctypes/test_arrays.py | 64 +- Lib/test/test_ctypes/test_as_parameter.py | 42 +- Lib/test/test_ctypes/test_bitfields.py | 25 +- Lib/test/test_ctypes/test_buffers.py | 9 +- Lib/test/test_ctypes/test_bytes.py | 7 +- Lib/test/test_ctypes/test_byteswap.py | 38 +- .../test_ctypes/test_c_simple_type_meta.py | 152 + Lib/test/test_ctypes/test_callbacks.py | 76 +- Lib/test/test_ctypes/test_cast.py | 15 +- Lib/test/test_ctypes/test_cfuncs.py | 35 +- Lib/test/test_ctypes/test_checkretval.py | 19 +- Lib/test/test_ctypes/test_delattr.py | 19 +- Lib/test/test_ctypes/test_dlerror.py | 123 + Lib/test/test_ctypes/test_errno.py | 31 +- Lib/test/test_ctypes/test_find.py | 39 +- Lib/test/test_ctypes/test_frombuffer.py | 9 +- Lib/test/test_ctypes/test_funcptr.py | 64 +- Lib/test/test_ctypes/test_functions.py | 101 +- Lib/test/test_ctypes/test_incomplete.py | 30 +- Lib/test/test_ctypes/test_init.py | 5 +- Lib/test/test_ctypes/test_internals.py | 25 +- Lib/test/test_ctypes/test_keeprefs.py | 12 +- Lib/test/test_ctypes/test_libc.py | 11 +- Lib/test/test_ctypes/test_loading.py | 62 +- Lib/test/test_ctypes/test_macholib.py | 10 +- Lib/test/test_ctypes/test_memfunctions.py | 19 +- Lib/test/test_ctypes/test_numbers.py | 50 +- Lib/test/test_ctypes/test_objects.py | 17 +- Lib/test/test_ctypes/test_parameters.py | 70 +- Lib/test/test_ctypes/test_pep3118.py | 104 +- Lib/test/test_ctypes/test_pickling.py | 16 +- Lib/test/test_ctypes/test_pointers.py | 66 +- Lib/test/test_ctypes/test_prototypes.py | 30 +- Lib/test/test_ctypes/test_python_api.py | 41 +- Lib/test/test_ctypes/test_random_things.py | 32 +- Lib/test/test_ctypes/test_refcounts.py | 58 +- Lib/test/test_ctypes/test_repr.py | 9 +- Lib/test/test_ctypes/test_returnfuncptrs.py | 7 +- Lib/test/test_ctypes/test_simplesubclasses.py | 43 +- Lib/test/test_ctypes/test_sizes.py | 6 +- Lib/test/test_ctypes/test_slicing.py | 59 +- Lib/test/test_ctypes/test_stringptr.py | 34 +- Lib/test/test_ctypes/test_strings.py | 65 +- Lib/test/test_ctypes/test_struct_fields.py | 19 +- Lib/test/test_ctypes/test_structures.py | 233 +- .../test_ctypes/test_unaligned_structures.py | 8 +- Lib/test/test_ctypes/test_unicode.py | 7 +- Lib/test/test_ctypes/test_unions.py | 35 + Lib/test/test_ctypes/test_values.py | 20 +- Lib/test/test_ctypes/test_varsize_struct.py | 4 +- Lib/test/test_ctypes/test_win32.py | 40 +- .../test_win32_com_foreign_func.py | 286 + Lib/test/test_ctypes/test_wintypes.py | 7 +- Lib/test/test_curses.py | 20 +- .../__init__.py} | 389 +- .../dataclass_module_1.py | 0 .../dataclass_module_1_str.py | 0 .../dataclass_module_2.py | 0 .../dataclass_module_2_str.py | 0 .../dataclass_textanno.py | 0 Lib/test/test_datetime.py | 36 +- Lib/test/test_dbm.py | 43 + Lib/test/test_dbm_dumb.py | 72 + Lib/test/test_dbm_gnu.py | 14 + Lib/test/test_dbm_ndbm.py | 13 + Lib/test/test_dbm_sqlite3.py | 311 + Lib/test/test_decimal.py | 176 +- Lib/test/test_decorators.py | 123 - Lib/test/test_deque.py | 6 +- Lib/test/test_descr.py | 100 +- Lib/test/test_descrtut.py | 24 +- Lib/test/test_dict.py | 26 +- Lib/test/test_dictcomps.py | 38 + Lib/test/test_dictviews.py | 5 +- Lib/test/test_dis.py | 1762 +- Lib/test/test_doctest/__init__.py | 5 + Lib/test/test_doctest/decorator_mod.py | 10 + .../{ => test_doctest}/doctest_aliases.py | 0 Lib/test/{ => test_doctest}/doctest_lineno.py | 25 + Lib/test/{ => test_doctest}/sample_doctest.py | 4 +- .../sample_doctest_no_docstrings.py | 0 .../sample_doctest_no_doctests.py | 0 Lib/test/test_doctest/sample_doctest_skip.py | 49 + Lib/test/{ => test_doctest}/test_doctest.py | 631 +- Lib/test/{ => test_doctest}/test_doctest.txt | 0 Lib/test/{ => test_doctest}/test_doctest2.py | 0 Lib/test/{ => test_doctest}/test_doctest2.txt | 4 +- Lib/test/{ => test_doctest}/test_doctest3.txt | 0 Lib/test/{ => test_doctest}/test_doctest4.txt | 0 Lib/test/test_doctest/test_doctest_skip.txt | 4 + Lib/test/test_dynamic.py | 5 +- .../test_email/test__header_value_parser.py | 143 + Lib/test/test_email/test_email.py | 219 +- Lib/test/test_email/test_generator.py | 159 + Lib/test/test_email/test_headerregistry.py | 23 +- Lib/test/test_email/test_message.py | 79 +- Lib/test/test_email/test_policy.py | 43 + Lib/test/test_email/test_utils.py | 11 +- Lib/test/test_embed.py | 411 +- Lib/test/test_ensurepip.py | 46 +- Lib/test/test_enum.py | 527 +- Lib/test/test_eof.py | 166 +- Lib/test/test_exception_group.py | 69 +- Lib/test/test_exceptions.py | 367 +- Lib/test/test_external_inspection.py | 84 + Lib/test/test_faulthandler.py | 28 +- Lib/test/test_fcntl.py | 23 +- Lib/test/test_filecmp.py | 171 +- Lib/test/test_fileinput.py | 21 +- Lib/test/test_fileio.py | 25 +- Lib/test/test_finalization.py | 4 +- Lib/test/test_float.py | 101 +- Lib/test/test_format.py | 6 +- Lib/test/test_fractions.py | 423 +- Lib/test/test_frame.py | 492 +- Lib/test/test_free_threading/__init__.py | 11 + Lib/test/test_free_threading/test_code.py | 30 + Lib/test/test_free_threading/test_dict.py | 182 + Lib/test/test_free_threading/test_gc.py | 61 + Lib/test/test_free_threading/test_list.py | 76 + .../test_free_threading/test_monitoring.py | 248 + Lib/test/test_free_threading/test_slots.py | 43 + Lib/test/test_free_threading/test_str.py | 75 + Lib/test/test_free_threading/test_tokenize.py | 57 + Lib/test/test_free_threading/test_type.py | 157 + Lib/test/test_fstring.py | 75 +- Lib/test/test_ftplib.py | 49 +- Lib/test/test_funcattrs.py | 31 +- Lib/test/test_functools.py | 204 +- Lib/test/test_future_stmt/__init__.py | 6 + .../badsyntax_future.py} | 0 .../import_nested_scope_twice.py} | 0 .../nested_scope.py} | 0 .../{ => test_future_stmt}/test_future.py | 211 +- .../test_future_flags.py} | 0 .../test_future_multiple_features.py} | 0 .../test_future_multiple_imports.py} | 0 .../test_future_single_import.py} | 0 Lib/test/test_gc.py | 159 +- Lib/test/test_gdb.py | 1066 - Lib/test/test_gdb/__init__.py | 32 + Lib/test/{ => test_gdb}/gdb_sample.py | 2 +- Lib/test/test_gdb/test_backtrace.py | 135 + Lib/test/test_gdb/test_cfunction.py | 85 + Lib/test/test_gdb/test_cfunction_full.py | 36 + Lib/test/test_gdb/test_misc.py | 188 + Lib/test/test_gdb/test_pretty_print.py | 438 + Lib/test/test_gdb/util.py | 291 + Lib/test/test_generated_cases.py | 1019 + Lib/test/test_generators.py | 191 +- Lib/test/test_genericalias.py | 9 +- Lib/test/test_genericclass.py | 9 +- Lib/test/test_genericpath.py | 48 +- Lib/test/test_getopt.py | 19 +- Lib/test/test_getpass.py | 4 +- Lib/test/test_getpath.py | 19 +- Lib/test/test_gettext.py | 189 +- Lib/test/test_glob.py | 157 + Lib/test/test_grammar.py | 12 +- Lib/test/test_gzip.py | 197 +- Lib/test/test_hmac.py | 8 + Lib/test/test_http_cookiejar.py | 7 +- Lib/test/test_http_cookies.py | 38 + Lib/test/test_httplib.py | 77 +- Lib/test/test_httpservers.py | 40 +- Lib/test/test_idle.py | 1 + Lib/test/test_imaplib.py | 145 +- Lib/test/test_imghdr.py | 144 - Lib/test/test_import/__init__.py | 827 +- .../data/circular_imports/import_cycle.py | 3 + .../data/circular_imports/singlephase.py | 13 + .../{ => test_import/data}/double_const.py | 0 .../test_import/data/package3/__init__.py | 2 + .../test_import/data/package3/submodule.py | 7 + .../test_import/data/package4/__init__.py | 5 + .../test_import/data/package4/submodule.py | 3 + .../test_importlib/builtin/test_finder.py | 1 - .../extension/_test_nonmodule_cases.py | 44 + .../extension/test_case_sensitivity.py | 3 +- .../test_importlib/extension/test_finder.py | 27 +- .../test_importlib/extension/test_loader.py | 101 +- .../extension/test_path_hook.py | 2 + Lib/test/test_importlib/frozen/test_finder.py | 3 - Lib/test/test_importlib/frozen/test_loader.py | 2 - .../test_importlib/import_/test___loader__.py | 3 - .../test_importlib/import_/test_packages.py | 1 - .../data01 => metadata}/__init__.py | 0 .../test_importlib/{ => metadata}/_context.py | 0 .../test_importlib/{ => metadata}/_path.py | 44 +- .../data}/__init__.py | 0 .../data/example-21.12-py3-none-any.whl | Bin .../data/example-21.12-py3.6.egg | Bin .../data/example2-1.0.0-py3-none-any.whl | Bin .../data/sources/example/example/__init__.py | 2 + .../metadata/data/sources/example/setup.py | 11 + .../sources/example2/example2/__init__.py | 2 + .../data/sources/example2/pyproject.toml | 10 + .../test_importlib/{ => metadata}/fixtures.py | 124 +- .../test_importlib/{ => metadata}/stubs.py | 0 .../test_api.py} | 1 + .../{ => metadata}/test_main.py | 81 +- .../test_importlib/{ => metadata}/test_zip.py | 0 .../resources/data01/binary.file | Bin 4 -> 0 bytes .../resources/data01/subdirectory/binary.file | Bin 4 -> 0 bytes .../resources/data01/utf-16.file | Bin 44 -> 0 bytes .../resources/data01/utf-8.file | 1 - .../resources/data02/one/__init__.py | 0 .../resources/data02/one/resource1.txt | 1 - .../subdirectory/subsubdir/resource.txt | 1 - .../resources/data02/two/__init__.py | 0 .../resources/data02/two/resource2.txt | 1 - .../resources/data03/__init__.py | 0 .../data03/namespace/portion1/__init__.py | 0 .../data03/namespace/portion2/__init__.py | 0 .../resources/data03/namespace/resource1.txt | 0 .../resources/namespacedata01/binary.file | Bin 4 -> 0 bytes .../resources/namespacedata01/utf-16.file | Bin 44 -> 0 bytes .../resources/namespacedata01/utf-8.file | 1 - .../test_importlib/resources/test_contents.py | 17 +- .../test_importlib/resources/test_custom.py | 6 +- .../test_importlib/resources/test_files.py | 114 +- .../resources/test_functional.py | 255 + .../test_importlib/resources/test_open.py | 19 +- .../test_importlib/resources/test_path.py | 17 +- .../test_importlib/resources/test_read.py | 40 +- .../test_importlib/resources/test_reader.py | 63 +- .../test_importlib/resources/test_resource.py | 162 +- .../test_importlib/resources/update-zips.py | 53 - Lib/test/test_importlib/resources/util.py | 115 +- Lib/test/test_importlib/resources/zip.py | 24 + .../resources/zipdata01/__init__.py | 0 .../resources/zipdata01/ziptestdata.zip | Bin 876 -> 0 bytes .../resources/zipdata02/__init__.py | 0 .../resources/zipdata02/ziptestdata.zip | Bin 698 -> 0 bytes .../source/test_case_sensitivity.py | 1 - Lib/test/test_importlib/source/test_finder.py | 1 - Lib/test/test_importlib/test_abc.py | 25 + Lib/test/test_importlib/test_api.py | 17 +- Lib/test/test_importlib/test_lazy.py | 88 +- Lib/test/test_importlib/test_locks.py | 5 +- .../test_importlib/test_namespace_pkgs.py | 3 +- Lib/test/test_importlib/test_spec.py | 9 +- .../test_importlib/test_threaded_import.py | 4 +- Lib/test/test_importlib/test_util.py | 91 +- Lib/test/test_importlib/test_windows.py | 8 +- Lib/test/test_importlib/util.py | 56 +- Lib/test/test_inspect/__init__.py | 6 + Lib/test/{ => test_inspect}/inspect_fodder.py | 4 +- .../{ => test_inspect}/inspect_fodder2.py | 79 + .../inspect_stock_annotations.py | 0 .../inspect_stringized_annotations.py | 0 .../inspect_stringized_annotations_2.py | 0 .../inspect_stringized_annotations_pep695.py | 87 + Lib/test/{ => test_inspect}/test_inspect.py | 1671 +- Lib/test/test_int.py | 102 +- Lib/test/test_interpreters.py | 773 - Lib/test/test_interpreters/__init__.py | 9 + .../__main__.py | 0 Lib/test/test_interpreters/test_api.py | 1672 + Lib/test/test_interpreters/test_channels.py | 600 + Lib/test/test_interpreters/test_lifecycle.py | 190 + Lib/test/test_interpreters/test_queues.py | 661 + Lib/test/test_interpreters/test_stress.py | 68 + Lib/test/test_interpreters/utils.py | 689 + Lib/test/test_io.py | 319 +- Lib/test/test_ipaddress.py | 131 +- Lib/test/test_isinstance.py | 6 +- Lib/test/test_iter.py | 44 +- Lib/test/test_itertools.py | 327 +- Lib/test/test_json/test_decode.py | 33 +- .../test_json/test_encode_basestring_ascii.py | 3 +- Lib/test/test_json/test_fail.py | 10 +- Lib/test/test_json/test_recursion.py | 6 +- Lib/test/test_json/test_scanstring.py | 10 + Lib/test/test_json/test_unicode.py | 13 +- Lib/test/test_keywordonlyarg.py | 2 +- Lib/test/test_kqueue.py | 18 + Lib/test/test_largefile.py | 28 +- Lib/test/test_launcher.py | 109 +- Lib/test/test_lib2to3/__init__.py | 11 - Lib/test/test_lib2to3/data/README | 6 - Lib/test/test_lib2to3/data/bom.py | 2 - Lib/test/test_lib2to3/data/crlf.py | 3 - .../test_lib2to3/data/different_encoding.py | 6 - Lib/test/test_lib2to3/data/false_encoding.py | 2 - .../test_lib2to3/data/fixers/bad_order.py | 5 - .../data/fixers/myfixes/__init__.py | 0 .../data/fixers/myfixes/fix_explicit.py | 6 - .../data/fixers/myfixes/fix_first.py | 6 - .../data/fixers/myfixes/fix_last.py | 7 - .../data/fixers/myfixes/fix_parrot.py | 13 - .../data/fixers/myfixes/fix_preorder.py | 6 - .../test_lib2to3/data/fixers/no_fixer_cls.py | 1 - .../data/fixers/parrot_example.py | 2 - .../test_lib2to3/data/infinite_recursion.py | 2669 - .../test_lib2to3/data/py2_test_grammar.py | 971 - .../test_lib2to3/data/py3_test_grammar.py | 956 - Lib/test/test_lib2to3/pytree_idempotency.py | 94 - Lib/test/test_lib2to3/support.py | 69 - Lib/test/test_lib2to3/test_all_fixers.py | 41 - Lib/test/test_lib2to3/test_fixers.py | 4649 -- Lib/test/test_lib2to3/test_main.py | 139 - Lib/test/test_lib2to3/test_parser.py | 718 - Lib/test/test_lib2to3/test_pytree.py | 472 - Lib/test/test_lib2to3/test_refactor.py | 337 - Lib/test/test_lib2to3/test_util.py | 591 - Lib/test/test_linecache.py | 73 + Lib/test/test_list.py | 39 + Lib/test/test_listcomps.py | 142 +- Lib/test/test_locale.py | 15 + Lib/test/test_logging.py | 1274 +- Lib/test/test_long.py | 2 + Lib/test/test_lzma.py | 186 +- Lib/test/test_mailbox.py | 183 +- Lib/test/test_mailcap.py | 274 - Lib/test/test_marshal.py | 32 +- Lib/test/test_math.py | 367 +- Lib/test/test_memoryio.py | 37 +- Lib/test/test_memoryview.py | 27 +- Lib/test/test_metaclass.py | 10 +- Lib/test/test_mimetypes.py | 137 +- Lib/test/test_minidom.py | 40 + Lib/test/test_mmap.py | 157 +- Lib/test/test_module/__init__.py | 41 +- Lib/test/{ => test_module}/final_a.py | 4 +- Lib/test/{ => test_module}/final_b.py | 4 +- Lib/test/test_monitoring.py | 460 +- Lib/test/test_msilib.py | 166 - Lib/test/test_msvcrt.py | 120 + Lib/test/test_multibytecodec.py | 5 +- .../test_multiprocessing_fork/__init__.py | 3 + Lib/test/test_named_expressions.py | 92 +- Lib/test/test_nis.py | 43 - Lib/test/test_nntplib.py | 1646 - Lib/test/test_ntpath.py | 260 +- Lib/test/test_opcache.py | 678 +- Lib/test/test_opcodes.py | 3 +- Lib/test/test_operator.py | 70 + Lib/test/test_optimizer.py | 90 + Lib/test/test_optparse.py | 11 +- Lib/test/test_ordered_dict.py | 117 +- Lib/test/test_os.py | 867 +- Lib/test/test_ossaudiodev.py | 205 - Lib/test/test_pathlib.py | 3320 -- Lib/test/test_pathlib/__init__.py | 5 + Lib/test/test_pathlib/test_pathlib.py | 1658 + Lib/test/test_pathlib/test_pathlib_abc.py | 2497 + Lib/test/test_patma.py | 313 + Lib/test/test_pdb.py | 2180 +- Lib/test/test_peepholer.py | 169 +- Lib/test/test_peg_generator/__init__.py | 7 +- Lib/test/test_peg_generator/test_c_parser.py | 6 +- Lib/test/test_peg_generator/test_pegen.py | 14 +- Lib/test/test_perf_profiler.py | 226 +- Lib/test/test_perfmaps.py | 6 +- Lib/test/test_pickle.py | 135 +- Lib/test/test_pickletools.py | 392 + Lib/test/test_pipes.py | 210 - Lib/test/test_pkgutil.py | 90 +- Lib/test/test_platform.py | 162 +- Lib/test/test_plistlib.py | 90 +- Lib/test/test_poll.py | 5 +- Lib/test/test_poplib.py | 4 +- Lib/test/test_posix.py | 243 +- Lib/test/test_posixpath.py | 160 +- Lib/test/test_pprint.py | 298 +- Lib/test/test_profile.py | 7 +- Lib/test/test_property.py | 121 +- Lib/test/test_pstats.py | 29 + Lib/test/test_pty.py | 66 +- Lib/test/test_py_compile.py | 20 +- Lib/test/test_pyclbr.py | 29 +- Lib/test/test_pydoc/__init__.py | 6 + Lib/test/{ => test_pydoc}/pydoc_mod.py | 0 Lib/test/{ => test_pydoc}/pydocfodder.py | 68 +- Lib/test/{ => test_pydoc}/test_pydoc.py | 720 +- Lib/test/test_pyexpat.py | 67 +- Lib/test/test_pyrepl/__init__.py | 15 + Lib/test/test_pyrepl/__main__.py | 4 + Lib/test/test_pyrepl/support.py | 168 + Lib/test/test_pyrepl/test_input.py | 102 + Lib/test/test_pyrepl/test_interact.py | 262 + Lib/test/test_pyrepl/test_keymap.py | 120 + Lib/test/test_pyrepl/test_pyrepl.py | 1346 + Lib/test/test_pyrepl/test_reader.py | 315 + Lib/test/test_pyrepl/test_unix_console.py | 314 + Lib/test/test_pyrepl/test_unix_eventqueue.py | 117 + Lib/test/test_pyrepl/test_windows_console.py | 334 + Lib/test/test_queue.py | 413 + Lib/test/test_raise.py | 14 + Lib/test/test_random.py | 47 + Lib/test/test_re.py | 477 +- Lib/test/test_readline.py | 149 +- Lib/test/test_regrtest.py | 941 +- Lib/test/test_repl.py | 190 +- Lib/test/test_reprlib.py | 64 + Lib/test/test_resource.py | 2 +- Lib/test/test_richcmp.py | 1 + Lib/test/test_rlcompleter.py | 10 +- Lib/test/test_runpy.py | 19 +- Lib/test/test_sax.py | 51 + Lib/test/test_scope.py | 24 + Lib/test/test_selectors.py | 40 +- Lib/test/test_set.py | 4 - Lib/test/test_setcomps.py | 39 + Lib/test/test_shutil.py | 995 +- Lib/test/test_signal.py | 55 +- Lib/test/test_site.py | 139 +- Lib/test/test_smtplib.py | 17 +- Lib/test/test_smtpnet.py | 7 +- Lib/test/test_sndhdr.py | 40 - Lib/test/test_socket.py | 333 +- Lib/test/test_socketserver.py | 7 - Lib/test/test_sort.py | 21 + Lib/test/test_source_encoding.py | 7 +- Lib/test/test_spwd.py | 77 - Lib/test/test_sqlite3/test_backup.py | 56 +- Lib/test/test_sqlite3/test_dbapi.py | 392 +- Lib/test/test_sqlite3/test_dump.py | 111 +- Lib/test/test_sqlite3/test_factory.py | 68 +- Lib/test/test_sqlite3/test_hooks.py | 107 +- Lib/test/test_sqlite3/test_regression.py | 125 +- Lib/test/test_sqlite3/test_transactions.py | 33 +- Lib/test/test_sqlite3/test_types.py | 1 - Lib/test/test_sqlite3/test_userfunctions.py | 164 +- Lib/test/test_sqlite3/util.py | 77 + Lib/test/test_ssl.py | 460 +- Lib/test/test_stable_abi_ctypes.py | 76 +- Lib/test/test_stat.py | 94 +- Lib/test/test_statistics.py | 281 +- Lib/test/{test_unicode.py => test_str.py} | 202 +- Lib/test/test_string_literals.py | 12 + Lib/test/test_strptime.py | 328 +- Lib/test/test_struct.py | 42 +- Lib/test/test_structseq.py | 226 +- Lib/test/test_subclassinit.py | 10 +- Lib/test/test_subprocess.py | 296 +- Lib/test/test_sunau.py | 160 - Lib/test/test_super.py | 77 +- Lib/test/test_support.py | 198 +- Lib/test/test_symtable.py | 260 +- Lib/test/test_syntax.py | 357 +- Lib/test/test_sys.py | 346 +- Lib/test/test_sys_setprofile.py | 48 +- Lib/test/test_sys_settrace.py | 130 +- Lib/test/test_sysconfig.py | 219 +- Lib/test/test_tabnanny.py | 2 +- Lib/test/test_tarfile.py | 341 +- Lib/test/test_tcl.py | 121 +- Lib/test/test_telnetlib.py | 405 - Lib/test/test_tempfile.py | 177 +- Lib/test/test_termios.py | 220 + Lib/test/test_thread.py | 181 +- Lib/test/test_threading.py | 488 +- Lib/test/test_threading_local.py | 15 + Lib/test/test_threadsignals.py | 25 +- Lib/test/test_time.py | 165 +- Lib/test/test_tix.py | 40 - Lib/test/test_tkinter/__init__.py | 1 + Lib/test/test_tkinter/support.py | 3 +- .../test_tkinter/test_geometry_managers.py | 51 +- Lib/test/test_tkinter/test_images.py | 283 +- Lib/test/test_tkinter/test_misc.py | 872 +- Lib/test/test_tkinter/test_text.py | 74 +- Lib/test/test_tkinter/test_variables.py | 4 +- Lib/test/test_tkinter/test_widgets.py | 165 +- Lib/test/test_tkinter/widget_tests.py | 172 +- Lib/test/test_tokenize.py | 550 +- Lib/test/test_tools/__init__.py | 6 - Lib/test/test_tools/i18n_data/docstrings.pot | 40 + Lib/test/test_tools/i18n_data/docstrings.py | 41 + Lib/test/test_tools/i18n_data/fileloc.pot | 35 + Lib/test/test_tools/i18n_data/fileloc.py | 26 + Lib/test/test_tools/i18n_data/messages.pot | 67 + Lib/test/test_tools/i18n_data/messages.py | 64 + Lib/test/test_tools/test_freeze.py | 6 + Lib/test/test_tools/test_i18n.py | 141 +- Lib/test/test_tools/test_makefile.py | 81 + Lib/test/test_tools/test_makeunicodedata.py | 122 + Lib/test/test_tools/test_reindent.py | 2 +- Lib/test/test_tools/test_sundry.py | 24 +- Lib/test/test_trace.py | 29 +- Lib/test/test_traceback.py | 1279 +- Lib/test/test_tracemalloc.py | 26 +- Lib/test/test_ttk/test_style.py | 266 +- Lib/test/test_ttk/test_widgets.py | 229 +- Lib/test/test_ttk_textonly.py | 32 +- Lib/test/test_tty.py | 94 + Lib/test/test_type_aliases.py | 35 +- Lib/test/test_type_cache.py | 199 +- Lib/test/test_type_comments.py | 20 +- Lib/test/test_type_params.py | 353 +- Lib/test/test_types.py | 198 +- Lib/test/test_typing.py | 1569 +- Lib/test/test_unicode_file_functions.py | 14 +- Lib/test/test_unicode_identifiers.py | 2 +- Lib/test/test_unicodedata.py | 24 +- Lib/test/test_unittest/test_assertions.py | 10 + Lib/test/test_unittest/test_async_case.py | 14 + Lib/test/test_unittest/test_case.py | 10 + Lib/test/test_unittest/test_discovery.py | 26 +- Lib/test/test_unittest/test_loader.py | 62 +- Lib/test/test_unittest/test_program.py | 16 +- Lib/test/test_unittest/test_result.py | 1 - Lib/test/test_unittest/test_util.py | 33 + Lib/test/test_unittest/testmock/support.py | 11 + Lib/test/test_unittest/testmock/testasync.py | 23 + .../test_unittest/testmock/testhelpers.py | 8 + .../testmock/testmagicmethods.py | 39 + Lib/test/test_unittest/testmock/testmock.py | 172 +- Lib/test/test_unittest/testmock/testpatch.py | 128 +- .../testmock/testthreadingmock.py | 201 + Lib/test/test_unittest/testmock/testwith.py | 6 +- Lib/test/test_unpack.py | 2 +- Lib/test/test_unpack_ex.py | 6 + Lib/test/test_unparse.py | 75 +- Lib/test/test_urllib.py | 209 +- Lib/test/test_urllib2.py | 46 +- Lib/test/test_urllib2_localnet.py | 30 +- Lib/test/test_urlparse.py | 183 +- Lib/test/test_userdict.py | 7 +- Lib/test/test_userlist.py | 8 + Lib/test/test_userstring.py | 3 +- Lib/test/test_utf8_mode.py | 3 +- Lib/test/test_utf8source.py | 4 +- Lib/test/test_uu.py | 287 - Lib/test/test_uuid.py | 16 +- Lib/test/test_venv.py | 433 +- Lib/test/test_warnings/__init__.py | 466 +- Lib/test/test_wave.py | 26 + Lib/test/test_weakref.py | 117 +- Lib/test/test_weakset.py | 2 +- Lib/test/test_webbrowser.py | 192 +- Lib/test/test_winapi.py | 161 + Lib/test/test_winconsoleio.py | 44 +- Lib/test/test_winsound.py | 14 +- Lib/test/test_with.py | 50 +- Lib/test/test_wmi.py | 28 +- Lib/test/test_wsgiref.py | 2 +- Lib/test/test_xdrlib.py | 79 - Lib/test/test_xml_etree.py | 228 +- Lib/test/test_xmlrpc.py | 6 + Lib/test/test_xmlrpc_net.py | 31 - Lib/test/test_zipapp.py | 9 +- .../test_zipfile/_path/test_complexity.py | 10 +- Lib/test/test_zipfile/_path/test_path.py | 155 +- Lib/test/test_zipfile/test_core.py | 298 +- Lib/test/test_zipimport.py | 434 +- Lib/test/test_zipimport_support.py | 15 +- Lib/test/test_zlib.py | 82 +- Lib/test/test_zoneinfo/__init__.py | 7 +- Lib/test/test_zoneinfo/test_zoneinfo.py | 171 +- Lib/test/time_hashlib.py | 88 - .../{imghdrdata => tkinterdata}/python.gif | Bin .../{imghdrdata => tkinterdata}/python.pgm | Bin .../{imghdrdata => tkinterdata}/python.png | Bin .../{imghdrdata => tkinterdata}/python.ppm | Bin .../{imghdrdata => tkinterdata}/python.xbm | 0 .../data02 => tokenizedata}/__init__.py | 0 Lib/test/{ => tokenizedata}/bad_coding.py | 0 Lib/test/{ => tokenizedata}/bad_coding2.py | 0 Lib/test/{ => tokenizedata}/badsyntax_3131.py | 0 .../{ => tokenizedata}/badsyntax_pep3120.py | 0 Lib/test/{ => tokenizedata}/coding20731.py | 0 ...-latin1-coding-cookie-and-utf8-bom-sig.txt | 0 ...no-coding-cookie-and-utf8-bom-sig-only.txt | 0 ...utf8-coding-cookie-and-no-utf8-bom-sig.txt | 0 ...ts-utf8-coding-cookie-and-utf8-bom-sig.txt | 0 .../{ => tokenizedata}/tokenize_tests.txt | 0 Lib/test/translationdata/argparse/msgids.txt | 40 + Lib/test/translationdata/getopt/msgids.txt | 6 + Lib/test/translationdata/optparse/msgids.txt | 14 + .../{ => typinganndata}/_typed_dict_helper.py | 0 Lib/test/{ => typinganndata}/ann_module.py | 0 Lib/test/{ => typinganndata}/ann_module2.py | 0 Lib/test/{ => typinganndata}/ann_module3.py | 0 Lib/test/{ => typinganndata}/ann_module4.py | 0 Lib/test/{ => typinganndata}/ann_module5.py | 0 Lib/test/{ => typinganndata}/ann_module6.py | 0 Lib/test/typinganndata/ann_module695.py | 72 + Lib/test/{ => typinganndata}/ann_module7.py | 0 Lib/test/{ => typinganndata}/ann_module8.py | 0 .../{ => typinganndata}/mod_generics_cache.py | 0 Lib/test/wheel-0.40.0-py3-none-any.whl | Bin 64545 -> 0 bytes .../setuptools-67.6.1-py3-none-any.whl | Bin .../wheeldata/wheel-0.43.0-py3-none-any.whl | Bin 0 -> 65775 bytes .../sparse-zip64-c0-0x000000000.part | Bin 0 -> 4096 bytes .../sparse-zip64-c0-0x100000000.part | Bin 0 -> 4096 bytes .../sparse-zip64-c0-0x200000000.part | Bin 0 -> 546 bytes Lib/textwrap.py | 20 +- Lib/threading.py | 311 +- Lib/tkinter/__init__.py | 500 +- Lib/tkinter/simpledialog.py | 4 +- Lib/tkinter/tix.py | 1948 - Lib/tkinter/ttk.py | 64 +- Lib/token.py | 27 +- Lib/tokenize.py | 59 +- Lib/trace.py | 29 +- Lib/traceback.py | 741 +- Lib/tty.py | 5 +- Lib/turtle.py | 41 +- Lib/turtledemo/__main__.py | 16 +- Lib/turtledemo/clock.py | 33 +- Lib/turtledemo/sorting_animate.py | 2 +- Lib/types.py | 8 + Lib/typing.py | 944 +- Lib/unittest/__init__.py | 5 - Lib/unittest/async_case.py | 8 +- Lib/unittest/case.py | 22 + Lib/unittest/loader.py | 68 +- Lib/unittest/main.py | 13 +- Lib/unittest/mock.py | 238 +- Lib/unittest/runner.py | 2 +- Lib/urllib/parse.py | 62 +- Lib/urllib/request.py | 129 +- Lib/uu.py | 216 - Lib/uuid.py | 23 +- Lib/venv/__init__.py | 364 +- Lib/venv/__main__.py | 2 +- Lib/venv/scripts/common/Activate.ps1 | 3 +- Lib/venv/scripts/common/activate | 46 +- .../scripts/{posix => common}/activate.fish | 8 +- Lib/venv/scripts/nt/activate.bat | 10 +- Lib/venv/scripts/posix/activate.csh | 8 +- Lib/warnings.py | 178 +- Lib/wave.py | 14 +- Lib/webbrowser.py | 249 +- Lib/wsgiref/simple_server.py | 4 - Lib/wsgiref/util.py | 2 +- Lib/xdrlib.py | 242 - Lib/xml/dom/minidom.py | 30 +- Lib/xml/etree/ElementInclude.py | 13 +- Lib/xml/etree/ElementTree.py | 50 +- Lib/xml/sax/expatreader.py | 14 + Lib/xmlrpc/client.py | 38 +- Lib/zipapp.py | 2 +- Lib/zipfile/__init__.py | 230 +- Lib/zipfile/__main__.py | 75 +- Lib/zipfile/_path/__init__.py | 94 +- Lib/zipfile/_path/glob.py | 120 +- Lib/zipimport.py | 231 +- Lib/zoneinfo/_tzpath.py | 24 +- Lib/zoneinfo/_zoneinfo.py | 86 +- Mac/BuildScript/README.rst | 46 +- Mac/BuildScript/backport_gh110950_fix.patch | 25 + Mac/BuildScript/backport_gh71383_fix.patch | 89 + Mac/BuildScript/build-installer.py | 36 +- Mac/BuildScript/resources/ReadMe.rtf | 12 +- Mac/BuildScript/resources/Welcome.rtf | 6 +- Mac/BuildScript/scripts/postflight.framework | 4 +- .../scripts/postflight.patch-profile | 13 +- Mac/IDLE/IDLE.app/Contents/Info.plist | 4 +- Mac/Makefile.in | 4 +- Mac/PythonLauncher/Info.plist.in | 4 +- Mac/PythonLauncher/Makefile.in | 2 + Mac/Resources/app-store-compliance.patch | 29 + Mac/Resources/app/Info.plist.in | 8 +- Mac/Resources/framework/Info.plist.in | 6 +- Makefile.pre.in | 1195 +- Misc/ACKS | 35 + Misc/HISTORY | 78 +- Misc/NEWS.d/3.10.0a1.rst | 92 +- Misc/NEWS.d/3.10.0a2.rst | 24 +- Misc/NEWS.d/3.10.0a3.rst | 36 +- Misc/NEWS.d/3.10.0a4.rst | 14 +- Misc/NEWS.d/3.10.0a5.rst | 2 +- Misc/NEWS.d/3.10.0a6.rst | 4 +- Misc/NEWS.d/3.10.0a7.rst | 24 +- Misc/NEWS.d/3.10.0b1.rst | 24 +- Misc/NEWS.d/3.11.0a1.rst | 60 +- Misc/NEWS.d/3.11.0a2.rst | 18 +- Misc/NEWS.d/3.11.0a3.rst | 6 +- Misc/NEWS.d/3.11.0a4.rst | 12 +- Misc/NEWS.d/3.11.0a5.rst | 10 +- Misc/NEWS.d/3.11.0a6.rst | 18 +- Misc/NEWS.d/3.11.0a7.rst | 32 +- Misc/NEWS.d/3.11.0b1.rst | 39 +- Misc/NEWS.d/3.12.0.rst | 74 - Misc/NEWS.d/3.12.0a1.rst | 65 +- Misc/NEWS.d/3.12.0a2.rst | 20 +- Misc/NEWS.d/3.12.0a3.rst | 10 +- Misc/NEWS.d/3.12.0a4.rst | 20 +- Misc/NEWS.d/3.12.0a5.rst | 6 +- Misc/NEWS.d/3.12.0a6.rst | 8 +- Misc/NEWS.d/3.12.0a7.rst | 6 +- Misc/NEWS.d/3.12.0b1.rst | 20 +- Misc/NEWS.d/3.12.0b2.rst | 530 - Misc/NEWS.d/3.12.0b3.rst | 411 - Misc/NEWS.d/3.12.0b4.rst | 318 - Misc/NEWS.d/3.12.0rc1.rst | 495 - Misc/NEWS.d/3.12.0rc2.rst | 510 - Misc/NEWS.d/3.12.0rc3.rst | 319 - Misc/NEWS.d/3.13.0.rst | 18 + Misc/NEWS.d/3.13.0a1.rst | 6746 +++ Misc/NEWS.d/3.13.0a2.rst | 1622 + Misc/NEWS.d/3.13.0a3.rst | 2414 + Misc/NEWS.d/3.13.0a4.rst | 1433 + Misc/NEWS.d/3.13.0a5.rst | 1163 + Misc/NEWS.d/3.13.0a6.rst | 1270 + Misc/NEWS.d/3.13.0b1.rst | 1671 + Misc/NEWS.d/3.13.0b2.rst | 806 + Misc/NEWS.d/3.13.0b3.rst | 664 + Misc/NEWS.d/3.13.0b4.rst | 476 + Misc/NEWS.d/3.13.0rc1.rst | 273 + Misc/NEWS.d/3.13.0rc2.rst | 753 + Misc/NEWS.d/3.13.0rc3.rst | 397 + Misc/NEWS.d/3.13.1.rst | 1882 + Misc/NEWS.d/3.5.0a1.rst | 37 +- Misc/NEWS.d/3.5.0b4.rst | 2 +- Misc/NEWS.d/3.5.2rc1.rst | 10 +- Misc/NEWS.d/3.5.3.rst | 1 + Misc/NEWS.d/3.5.3rc1.rst | 4 +- Misc/NEWS.d/3.5.4rc1.rst | 12 +- Misc/NEWS.d/3.5.5rc1.rst | 2 +- Misc/NEWS.d/3.6.0.rst | 1 + Misc/NEWS.d/3.6.0a1.rst | 12 +- Misc/NEWS.d/3.6.0a2.rst | 6 +- Misc/NEWS.d/3.6.0a4.rst | 2 +- Misc/NEWS.d/3.6.0b1.rst | 4 +- Misc/NEWS.d/3.6.2.rst | 1 + Misc/NEWS.d/3.6.2rc1.rst | 4 +- Misc/NEWS.d/3.6.2rc2.rst | 8 +- Misc/NEWS.d/3.6.3.rst | 2 +- Misc/NEWS.d/3.6.3rc1.rst | 18 +- Misc/NEWS.d/3.6.4rc1.rst | 42 +- Misc/NEWS.d/3.6.5rc1.rst | 8 +- Misc/NEWS.d/3.6.6rc1.rst | 6 +- Misc/NEWS.d/3.7.0a1.rst | 56 +- Misc/NEWS.d/3.7.0a2.rst | 46 +- Misc/NEWS.d/3.7.0a3.rst | 20 +- Misc/NEWS.d/3.7.0a4.rst | 12 +- Misc/NEWS.d/3.7.0b1.rst | 2 +- Misc/NEWS.d/3.7.0b2.rst | 6 +- Misc/NEWS.d/3.7.0b3.rst | 8 +- Misc/NEWS.d/3.7.0b4.rst | 6 +- Misc/NEWS.d/3.7.0b5.rst | 16 +- Misc/NEWS.d/3.8.0a1.rst | 166 +- Misc/NEWS.d/3.8.0a2.rst | 4 +- Misc/NEWS.d/3.8.0a3.rst | 10 +- Misc/NEWS.d/3.8.0a4.rst | 34 +- Misc/NEWS.d/3.8.0b1.rst | 52 +- Misc/NEWS.d/3.9.0a1.rst | 116 +- Misc/NEWS.d/3.9.0a2.rst | 18 +- Misc/NEWS.d/3.9.0a3.rst | 30 +- Misc/NEWS.d/3.9.0a4.rst | 22 +- Misc/NEWS.d/3.9.0a5.rst | 8 +- Misc/NEWS.d/3.9.0a6.rst | 46 +- Misc/NEWS.d/3.9.0b1.rst | 12 +- Misc/SpecialBuilds.txt | 10 +- Misc/coverity_model.c | 2 +- Misc/externals.spdx.json | 196 + Misc/platform_triplet.c | 290 + Misc/python-config.in | 4 +- Misc/python-config.sh.in | 8 +- Misc/python.man | 11 + Misc/requirements-test.txt | 1 - Misc/sbom.spdx.json | 2229 + Misc/stable_abi.toml | 99 + Misc/valgrind-python.supp | 51 +- Modules/Setup | 17 +- Modules/Setup.bootstrap.in | 2 + Modules/Setup.stdlib.in | 26 +- Modules/_abc.c | 294 +- Modules/_asynciomodule.c | 530 +- Modules/_bisectmodule.c | 11 +- Modules/_blake2/blake2b_impl.c | 33 +- Modules/_blake2/blake2module.c | 26 +- Modules/_blake2/blake2s_impl.c | 33 +- Modules/_blake2/clinic/blake2b_impl.c.h | 31 +- Modules/_blake2/clinic/blake2s_impl.c.h | 31 +- Modules/_blake2/impl/blake2b.c | 2 +- Modules/_blake2/impl/blake2s.c | 2 +- Modules/_bz2module.c | 19 +- Modules/_codecsmodule.c | 3 +- Modules/_collectionsmodule.c | 641 +- Modules/_contextvarsmodule.c | 1 + Modules/_cryptmodule.c | 81 - Modules/_csv.c | 261 +- Modules/_ctypes/_ctypes.c | 3321 +- Modules/_ctypes/_ctypes_test.c | 161 +- Modules/_ctypes/callbacks.c | 132 +- Modules/_ctypes/callproc.c | 355 +- Modules/_ctypes/cfield.c | 74 +- Modules/_ctypes/clinic/_ctypes.c.h | 613 + Modules/_ctypes/clinic/callproc.c.h | 32 + Modules/_ctypes/ctypes.h | 320 +- Modules/_ctypes/malloc_closure.c | 13 +- Modules/_ctypes/stgdict.c | 531 +- Modules/_curses_panel.c | 14 +- Modules/_cursesmodule.c | 53 +- Modules/_datetimemodule.c | 1450 +- Modules/_dbmmodule.c | 45 +- Modules/_decimal/_decimal.c | 1640 +- Modules/_decimal/libmpdec/io.c | 1 + Modules/_decimal/tests/bench.py | 127 +- Modules/_decimal/tests/deccheck.py | 2 +- Modules/_decimal/windows/mpdecimal.h | 17 + Modules/_elementtree.c | 151 +- Modules/_functoolsmodule.c | 179 +- Modules/_gdbmmodule.c | 46 +- Modules/_hacl/Hacl_Hash_MD5.c | 688 +- Modules/_hacl/Hacl_Hash_MD5.h | 17 +- Modules/_hacl/Hacl_Hash_SHA1.c | 339 +- Modules/_hacl/Hacl_Hash_SHA1.h | 17 +- Modules/_hacl/Hacl_Hash_SHA2.c | 932 +- Modules/_hacl/Hacl_Hash_SHA2.h | 104 +- Modules/_hacl/Hacl_Hash_SHA3.c | 526 +- Modules/_hacl/Hacl_Hash_SHA3.h | 51 +- .../include/krml/FStar_UInt128_Verified.h | 18 +- .../include/krml/FStar_UInt_8_16_32_64.h | 84 +- Modules/_hacl/include/krml/internal/target.h | 185 +- Modules/_hacl/internal/Hacl_Hash_MD5.h | 17 +- Modules/_hacl/internal/Hacl_Hash_SHA1.h | 17 +- Modules/_hacl/internal/Hacl_Hash_SHA2.h | 138 +- Modules/_hacl/internal/Hacl_Hash_SHA3.h | 4 +- Modules/_hacl/python_hacl_namespaces.h | 119 +- Modules/_hacl/refresh.sh | 4 +- Modules/_hashopenssl.c | 144 +- Modules/_heapqmodule.c | 5 +- Modules/_interpchannelsmodule.c | 3600 ++ Modules/_interpqueuesmodule.c | 1978 + Modules/_interpreters_common.h | 66 + Modules/_interpretersmodule.c | 1577 + Modules/_io/_iomodule.c | 10 +- Modules/_io/bufferedio.c | 206 +- Modules/_io/bytesio.c | 30 +- Modules/_io/clinic/_iomodule.c.h | 15 +- Modules/_io/clinic/bufferedio.c.h | 227 +- Modules/_io/clinic/bytesio.c.h | 18 +- Modules/_io/clinic/fileio.c.h | 22 +- Modules/_io/clinic/iobase.c.h | 14 +- Modules/_io/clinic/stringio.c.h | 204 +- Modules/_io/clinic/textio.c.h | 332 +- Modules/_io/clinic/winconsoleio.c.h | 20 +- Modules/_io/fileio.c | 84 +- Modules/_io/iobase.c | 66 +- Modules/_io/stringio.c | 145 +- Modules/_io/textio.c | 394 +- Modules/_io/winconsoleio.c | 182 +- Modules/_json.c | 269 +- Modules/_localemodule.c | 98 +- Modules/_lsprof.c | 127 +- Modules/_lzmamodule.c | 51 +- .../clinic/multiprocessing.c.h | 14 +- .../_multiprocessing/clinic/posixshmem.c.h | 109 +- Modules/_multiprocessing/clinic/semaphore.c.h | 53 +- Modules/_multiprocessing/multiprocessing.c | 15 +- Modules/_multiprocessing/multiprocessing.h | 9 +- Modules/_multiprocessing/posixshmem.c | 27 +- Modules/_multiprocessing/semaphore.c | 33 +- Modules/_opcode.c | 346 +- Modules/_operator.c | 186 +- Modules/_pickle.c | 561 +- Modules/_posixsubprocess.c | 159 +- Modules/_queuemodule.c | 402 +- Modules/_randommodule.c | 52 +- Modules/_scproxy.c | 36 +- Modules/_sqlite/blob.c | 22 +- Modules/_sqlite/clinic/_sqlite3.connect.c.h | 31 + Modules/_sqlite/clinic/blob.c.h | 18 +- Modules/_sqlite/clinic/connection.c.h | 279 +- Modules/_sqlite/clinic/cursor.c.h | 16 +- Modules/_sqlite/clinic/module.c.h | 13 +- Modules/_sqlite/clinic/row.c.h | 8 +- Modules/_sqlite/connection.c | 229 +- Modules/_sqlite/connection.h | 1 - Modules/_sqlite/cursor.c | 36 +- Modules/_sqlite/cursor.h | 1 - Modules/_sqlite/microprotocols.c | 13 +- Modules/_sqlite/microprotocols.h | 1 - Modules/_sqlite/module.c | 89 +- Modules/_sqlite/module.h | 1 - Modules/_sqlite/row.c | 4 + Modules/_sqlite/row.h | 1 - Modules/_sqlite/statement.h | 1 - Modules/_sqlite/util.c | 7 +- Modules/_sqlite/util.h | 1 - Modules/_sre/clinic/sre.c.h | 65 +- Modules/_sre/sre.c | 268 +- Modules/_sre/sre.h | 19 +- Modules/_sre/sre_constants.h | 3 +- Modules/_sre/sre_lib.h | 110 +- Modules/_ssl.c | 1425 +- Modules/_ssl/clinic/cert.c.h | 10 +- Modules/_ssl/debughelpers.c | 10 +- Modules/_ssl_data.h | 6323 --- Modules/_stat.c | 93 +- Modules/_statisticsmodule.c | 7 + Modules/_struct.c | 167 +- Modules/_suggestions.c | 69 + Modules/_sysconfig.c | 99 + Modules/_testbuffer.c | 138 +- Modules/_testcapi/abstract.c | 508 +- Modules/_testcapi/buffer.c | 10 +- Modules/_testcapi/bytes.c | 53 + Modules/_testcapi/clinic/exceptions.c.h | 42 +- Modules/_testcapi/clinic/float.c.h | 12 +- Modules/_testcapi/clinic/long.c.h | 12 + Modules/_testcapi/clinic/vectorcall.c.h | 106 +- Modules/_testcapi/clinic/watchers.c.h | 16 +- Modules/_testcapi/code.c | 9 +- Modules/_testcapi/codec.c | 17 + Modules/_testcapi/complex.c | 106 + Modules/_testcapi/datetime.c | 94 +- Modules/_testcapi/dict.c | 339 +- Modules/_testcapi/docstring.c | 118 +- Modules/_testcapi/exceptions.c | 77 +- Modules/_testcapi/file.c | 17 + Modules/_testcapi/float.c | 4 +- Modules/_testcapi/gc.c | 7 +- Modules/_testcapi/getargs.c | 464 +- Modules/_testcapi/hash.c | 83 + Modules/_testcapi/heaptype.c | 123 +- Modules/_testcapi/list.c | 81 + Modules/_testcapi/long.c | 587 +- Modules/_testcapi/mem.c | 122 +- Modules/_testcapi/monitoring.c | 508 + Modules/_testcapi/numbers.c | 177 + Modules/_testcapi/object.c | 145 + Modules/_testcapi/parts.h | 60 +- Modules/_testcapi/pyatomic.c | 192 + Modules/_testcapi/run.c | 113 + Modules/_testcapi/set.c | 25 + Modules/_testcapi/structmember.c | 1 - Modules/_testcapi/time.c | 169 + Modules/_testcapi/tuple.c | 124 + Modules/_testcapi/unicode.c | 1887 +- Modules/_testcapi/util.h | 3 +- Modules/_testcapi/vectorcall.c | 94 +- Modules/_testcapi/watchers.c | 15 +- Modules/_testcapi_feature_macros.inc | 9 + Modules/_testcapimodule.c | 1168 +- Modules/_testclinic.c | 784 +- Modules/_testclinic_limited.c | 153 + Modules/_testexternalinspection.c | 642 + Modules/_testimportmultiple.c | 33 +- Modules/_testinternalcapi.c | 1252 +- Modules/_testinternalcapi/README.txt | 5 + .../_testinternalcapi/clinic/test_lock.c.h | 75 + Modules/_testinternalcapi/parts.h | 18 + .../{_testcapi => _testinternalcapi}/pytime.c | 99 +- Modules/_testinternalcapi/set.c | 63 + .../test_critical_sections.c | 302 + Modules/_testinternalcapi/test_lock.c | 523 + Modules/_testlimitedcapi.c | 81 + Modules/_testlimitedcapi/abstract.c | 582 + Modules/_testlimitedcapi/bytearray.c | 123 + Modules/_testlimitedcapi/bytes.c | 255 + Modules/_testlimitedcapi/clinic/long.c.h | 143 + .../clinic/vectorcall_limited.c.h | 20 + Modules/_testlimitedcapi/complex.c | 79 + Modules/_testlimitedcapi/dict.c | 291 + Modules/_testlimitedcapi/float.c | 91 + .../heaptype_relative.c | 14 +- Modules/_testlimitedcapi/list.c | 175 + Modules/_testlimitedcapi/long.c | 798 + Modules/_testlimitedcapi/object.c | 80 + Modules/_testlimitedcapi/parts.h | 42 + .../{_testcapi => _testlimitedcapi}/pyos.c | 2 +- Modules/_testlimitedcapi/set.c | 189 + Modules/_testlimitedcapi/sys.c | 56 + .../testcapi_long.h | 0 Modules/_testlimitedcapi/tuple.c | 136 + Modules/_testlimitedcapi/unicode.c | 1938 + Modules/_testlimitedcapi/util.h | 33 + .../vectorcall_limited.c | 52 +- Modules/_testmultiphase.c | 46 +- Modules/_testsinglephase.c | 350 +- Modules/_threadmodule.c | 1897 +- Modules/_tkinter.c | 465 +- Modules/_tracemalloc.c | 4 + Modules/_typingmodule.c | 13 +- Modules/_uuidmodule.c | 7 +- Modules/_weakref.c | 92 +- Modules/_winapi.c | 904 +- Modules/_xxinterpchannelsmodule.c | 2464 - Modules/_xxsubinterpretersmodule.c | 865 - Modules/_xxtestfuzz/README.rst | 11 +- Modules/_xxtestfuzz/_xxtestfuzz.c | 10 +- .../fuzz_elementtree_parsewhole.dict | 134 + .../dictionaries/fuzz_pycompile.dict | 165 + .../c14nComment.xml | 4 + .../c14nDefault.xml | 3 + .../c14nPrefix.xml | 4 + .../c14nPrefixQname.xml | 7 + .../c14nPrefixQnameXpathElem.xml | 8 + .../c14nQname.xml | 6 + .../c14nQnameElem.xml | 6 + .../c14nQnameXpathElem.xml | 7 + .../c14nTrim.xml | 4 + .../expat224_utf8_bug.xml | 2 + .../inC14N1.xml | 14 + .../inC14N2.xml | 11 + .../inC14N3.xml | 18 + .../inC14N4.xml | 13 + .../inC14N5.xml | 12 + .../inC14N6.xml | 2 + .../inNsContent.xml | 4 + .../inNsDefault.xml | 3 + .../inNsPushdown.xml | 6 + .../inNsRedecl.xml | 3 + .../inNsSort.xml | 4 + .../inNsSuperfluous.xml | 4 + .../inNsXml.xml | 3 + .../out_inC14N1_c14nComment.xml | 6 + .../out_inC14N1_c14nDefault.xml | 4 + .../out_inC14N2_c14nDefault.xml | 11 + .../out_inC14N2_c14nTrim.xml | 1 + .../out_inC14N3_c14nDefault.xml | 14 + .../out_inC14N3_c14nPrefix.xml | 14 + .../out_inC14N3_c14nTrim.xml | 1 + .../out_inC14N4_c14nDefault.xml | 10 + .../out_inC14N4_c14nTrim.xml | 2 + .../out_inC14N5_c14nDefault.xml | 3 + .../out_inC14N5_c14nTrim.xml | 1 + .../out_inC14N6_c14nDefault.xml | 1 + .../out_inNsContent_c14nDefault.xml | 4 + ...t_inNsContent_c14nPrefixQnameXpathElem.xml | 4 + .../out_inNsContent_c14nQnameElem.xml | 4 + .../out_inNsContent_c14nQnameXpathElem.xml | 4 + .../out_inNsDefault_c14nDefault.xml | 3 + .../out_inNsDefault_c14nPrefix.xml | 3 + .../out_inNsPushdown_c14nDefault.xml | 6 + .../out_inNsPushdown_c14nPrefix.xml | 6 + .../out_inNsRedecl_c14nDefault.xml | 3 + .../out_inNsRedecl_c14nPrefix.xml | 3 + .../out_inNsSort_c14nDefault.xml | 4 + .../out_inNsSort_c14nPrefix.xml | 4 + .../out_inNsSuperfluous_c14nDefault.xml | 4 + .../out_inNsSuperfluous_c14nPrefix.xml | 4 + .../out_inNsXml_c14nDefault.xml | 3 + .../out_inNsXml_c14nPrefix.xml | 3 + .../out_inNsXml_c14nPrefixQname.xml | 3 + .../out_inNsXml_c14nQname.xml | 3 + .../simple-ns.xml | 7 + .../simple.xml | 6 + .../test.xml | 115 + .../fuzz_pycompile_corpus/input1.py | 7 + .../fuzz_pycompile_corpus/input2.py | 5 + .../fuzz_pycompile_corpus/input3.py | 6 + .../fuzz_pycompile_corpus/input4.py | 3 + .../fuzz_pycompile_corpus/input5.py | 7 + .../fuzz_pycompile_corpus/input6.py | 8 + Modules/_xxtestfuzz/fuzz_tests.txt | 2 + Modules/_xxtestfuzz/fuzzer.c | 190 +- Modules/_zoneinfo.c | 464 +- Modules/arraymodule.c | 191 +- Modules/atexitmodule.c | 25 +- Modules/audioop.c | 2005 - Modules/binascii.c | 58 +- Modules/cjkcodecs/_codecs_iso2022.c | 9 +- Modules/cjkcodecs/cjkcodecs.h | 13 +- Modules/cjkcodecs/clinic/multibytecodec.c.h | 18 +- Modules/cjkcodecs/multibytecodec.c | 78 +- Modules/cjkcodecs/multibytecodec.h | 2 + Modules/clinic/_abc.c.h | 8 +- Modules/clinic/_asynciomodule.c.h | 12 +- Modules/clinic/_bisectmodule.c.h | 17 +- Modules/clinic/_bz2module.c.h | 19 +- Modules/clinic/_codecsmodule.c.h | 167 +- Modules/clinic/_collectionsmodule.c.h | 560 +- Modules/clinic/_contextvarsmodule.c.h | 8 +- Modules/clinic/_cryptmodule.c.h | 69 - Modules/clinic/_csv.c.h | 8 +- Modules/clinic/_curses_panel.c.h | 21 +- Modules/clinic/_cursesmodule.c.h | 169 +- Modules/clinic/_datetimemodule.c.h | 364 +- Modules/clinic/_dbmmodule.c.h | 33 +- Modules/clinic/_elementtree.c.h | 30 +- Modules/clinic/_functoolsmodule.c.h | 25 +- Modules/clinic/_gdbmmodule.c.h | 39 +- Modules/clinic/_hashopenssl.c.h | 39 +- Modules/clinic/_heapqmodule.c.h | 8 +- Modules/clinic/_localemodule.c.h | 23 +- Modules/clinic/_lsprof.c.h | 10 +- Modules/clinic/_lzmamodule.c.h | 25 +- Modules/clinic/_opcode.c.h | 635 +- Modules/clinic/_operator.c.h | 9 +- Modules/clinic/_pickle.c.h | 53 +- Modules/clinic/_posixsubprocess.c.h | 26 +- Modules/clinic/_queuemodule.c.h | 32 +- Modules/clinic/_randommodule.c.h | 46 +- Modules/clinic/_ssl.c.h | 1575 +- Modules/clinic/_statisticsmodule.c.h | 49 +- Modules/clinic/_struct.c.h | 39 +- Modules/clinic/_suggestions.c.h | 41 + Modules/clinic/_sysconfig.c.h | 22 + Modules/clinic/_testclinic.c.h | 390 +- Modules/clinic/_testclinic_depr.c.h | 2396 + Modules/clinic/_testclinic_limited.c.h | 209 + Modules/clinic/_testinternalcapi.c.h | 166 +- Modules/clinic/_testmultiphase.c.h | 18 +- Modules/clinic/_tkinter.c.h | 51 +- Modules/clinic/_tracemalloc.c.h | 10 +- Modules/clinic/_typingmodule.c.h | 8 +- Modules/clinic/_weakref.c.h | 8 +- Modules/clinic/_winapi.c.h | 693 +- Modules/clinic/_zoneinfo.c.h | 65 +- Modules/clinic/arraymodule.c.h | 38 +- Modules/clinic/audioop.c.h | 1318 - Modules/clinic/binascii.c.h | 40 +- Modules/clinic/cmathmodule.c.h | 10 +- Modules/clinic/fcntlmodule.c.h | 60 +- Modules/clinic/gcmodule.c.h | 173 +- Modules/clinic/grpmodule.c.h | 68 +- Modules/clinic/itertoolsmodule.c.h | 45 +- Modules/clinic/mathmodule.c.h | 77 +- Modules/clinic/md5module.c.h | 10 +- Modules/clinic/overlapped.c.h | 49 +- Modules/clinic/posixmodule.c.h | 1892 +- Modules/clinic/pwdmodule.c.h | 13 +- Modules/clinic/pyexpat.c.h | 55 +- Modules/clinic/readline.c.h | 21 +- Modules/clinic/resource.c.h | 30 +- Modules/clinic/selectmodule.c.h | 99 +- Modules/clinic/sha1module.c.h | 10 +- Modules/clinic/sha2module.c.h | 12 +- Modules/clinic/sha3module.c.h | 9 +- Modules/clinic/signalmodule.c.h | 115 +- Modules/clinic/socketmodule.c.h | 182 +- Modules/clinic/spwdmodule.c.h | 80 - Modules/clinic/symtablemodule.c.h | 8 +- Modules/clinic/syslogmodule.c.h | 24 +- Modules/clinic/termios.c.h | 65 +- Modules/clinic/timemodule.c.h | 74 + Modules/clinic/unicodedata.c.h | 50 +- Modules/clinic/zlibmodule.c.h | 69 +- Modules/cmathmodule.c | 16 +- Modules/config.c.in | 2 +- Modules/errnomodule.c | 72 +- Modules/expat/expat.h | 35 +- Modules/expat/expat_config.h | 1 + Modules/expat/expat_external.h | 9 +- Modules/expat/internal.h | 15 +- Modules/expat/pyexpatns.h | 1 + Modules/expat/refresh.sh | 57 + Modules/expat/siphash.h | 13 +- Modules/expat/winconfig.h | 7 +- Modules/expat/xmlparse.c | 637 +- Modules/expat/xmlrole.c | 6 +- Modules/expat/xmlrole.h | 6 +- Modules/expat/xmltok.c | 29 +- Modules/expat/xmltok.h | 8 +- Modules/expat/xmltok_impl.c | 2 +- Modules/faulthandler.c | 100 +- Modules/fcntlmodule.c | 79 +- Modules/gcmodule.c | 2156 +- Modules/getaddrinfo.c | 4 +- Modules/getbuildinfo.c | 5 + Modules/getpath.c | 111 +- Modules/getpath.py | 58 +- Modules/grpmodule.c | 68 +- Modules/hashlib.h | 28 +- Modules/itertoolsmodule.c | 187 +- Modules/main.c | 132 +- Modules/makesetup | 14 +- Modules/mathmodule.c | 146 +- Modules/md5module.c | 68 +- Modules/mmapmodule.c | 504 +- Modules/nismodule.c | 536 - Modules/ossaudiodev.c | 1399 - Modules/overlapped.c | 69 +- Modules/posixmodule.c | 2851 +- Modules/posixmodule.h | 26 +- Modules/pwdmodule.c | 72 +- Modules/pyexpat.c | 130 +- Modules/readline.c | 155 +- Modules/resource.c | 74 +- Modules/rotatingtree.c | 4 + Modules/selectmodule.c | 409 +- Modules/sha1module.c | 50 +- Modules/sha2module.c | 89 +- Modules/sha3module.c | 68 +- Modules/signalmodule.c | 140 +- Modules/socketmodule.c | 285 +- Modules/socketmodule.h | 4 +- Modules/spwdmodule.c | 268 - Modules/symtablemodule.c | 8 +- Modules/syslogmodule.c | 39 +- Modules/termios.c | 199 +- Modules/timemodule.c | 795 +- Modules/unicodedata.c | 416 +- Modules/unicodedata_db.h | 2632 +- Modules/unicodename_db.h | 47263 ++++++---------- Modules/xxlimited.c | 7 +- Modules/xxlimited_35.c | 11 +- Modules/xxmodule.c | 1 + Modules/xxsubtype.c | 8 +- Modules/zlibmodule.c | 79 +- Objects/abstract.c | 409 +- Objects/boolobject.c | 17 +- Objects/bytearrayobject.c | 180 +- Objects/bytes_methods.c | 154 +- Objects/bytesobject.c | 234 +- Objects/call.c | 121 +- Objects/capsule.c | 178 +- Objects/cellobject.c | 9 +- Objects/classobject.c | 47 +- Objects/clinic/bytearrayobject.c.h | 397 +- Objects/clinic/bytesobject.c.h | 403 +- Objects/clinic/classobject.c.h | 8 +- Objects/clinic/codeobject.c.h | 56 +- Objects/clinic/complexobject.c.h | 18 +- Objects/clinic/descrobject.c.h | 12 +- Objects/clinic/dictobject.c.h | 129 +- Objects/clinic/enumobject.c.h | 8 +- Objects/clinic/floatobject.c.h | 15 +- Objects/clinic/funcobject.c.h | 39 +- Objects/clinic/listobject.c.h | 80 +- Objects/clinic/longobject.c.h | 22 +- Objects/clinic/memoryobject.c.h | 15 +- Objects/clinic/moduleobject.c.h | 11 +- Objects/clinic/odictobject.c.h | 8 +- Objects/clinic/setobject.c.h | 571 + Objects/clinic/structseq.c.h | 8 +- Objects/clinic/tupleobject.c.h | 8 +- Objects/clinic/typeobject.c.h | 13 +- Objects/clinic/typevarobject.c.h | 370 +- Objects/clinic/unicodeobject.c.h | 461 +- Objects/codeobject.c | 705 +- Objects/complexobject.c | 51 +- Objects/descrobject.c | 428 +- Objects/dictobject.c | 4236 +- Objects/enumobject.c | 1 + Objects/exception_handling_notes.txt | 2 +- Objects/exceptions.c | 258 +- Objects/fileobject.c | 55 +- Objects/floatobject.c | 123 +- Objects/frame_layout.md | 25 + Objects/frameobject.c | 1237 +- Objects/funcobject.c | 283 +- Objects/genericaliasobject.c | 70 +- Objects/genobject.c | 373 +- Objects/interpreteridobject.c | 294 - Objects/iterobject.c | 2 + Objects/listobject.c | 1722 +- Objects/listsort.txt | 62 +- Objects/lnotab_notes.txt | 7 +- Objects/longobject.c | 457 +- Objects/memoryobject.c | 215 +- Objects/methodobject.c | 23 +- Objects/mimalloc/alloc-aligned.c | 298 + Objects/mimalloc/alloc-override.c | 297 + Objects/mimalloc/alloc-posix.c | 185 + Objects/mimalloc/alloc.c | 1074 + Objects/mimalloc/arena.c | 935 + Objects/mimalloc/bitmap.c | 432 + Objects/mimalloc/bitmap.h | 115 + Objects/mimalloc/heap.c | 693 + Objects/mimalloc/init.c | 687 + Objects/mimalloc/options.c | 571 + Objects/mimalloc/os.c | 698 + Objects/mimalloc/page-queue.c | 332 + Objects/mimalloc/page.c | 972 + .../mimalloc/prim/osx/alloc-override-zone.c | 458 + Objects/mimalloc/prim/osx/prim.c | 9 + Objects/mimalloc/prim/prim.c | 24 + Objects/mimalloc/prim/readme.md | 9 + Objects/mimalloc/prim/unix/prim.c | 860 + Objects/mimalloc/prim/wasi/prim.c | 276 + .../mimalloc/prim/windows/etw-mimalloc.wprp | 61 + Objects/mimalloc/prim/windows/etw.h | 905 + Objects/mimalloc/prim/windows/etw.man | Bin 0 -> 3926 bytes Objects/mimalloc/prim/windows/prim.c | 622 + Objects/mimalloc/prim/windows/readme.md | 17 + Objects/mimalloc/random.c | 254 + Objects/mimalloc/segment-map.c | 153 + Objects/mimalloc/segment.c | 1682 + Objects/mimalloc/static.c | 40 + Objects/mimalloc/stats.c | 467 + Objects/moduleobject.c | 442 +- Objects/namespaceobject.c | 64 +- Objects/object.c | 1167 +- Objects/object_layout.md | 93 +- Objects/object_layout_312.gv | 1 + Objects/object_layout_312.png | Bin 30688 -> 33040 bytes Objects/object_layout_313.gv | 45 + Objects/object_layout_313.png | Bin 0 -> 35055 bytes Objects/object_layout_full_313.gv | 25 + Objects/object_layout_full_313.png | Bin 0 -> 16983 bytes Objects/obmalloc.c | 915 +- Objects/odictobject.c | 65 +- Objects/picklebufobject.c | 1 - Objects/rangeobject.c | 18 +- Objects/setobject.c | 1114 +- Objects/sliceobject.c | 65 +- Objects/stringlib/README.txt | 2 +- Objects/stringlib/clinic/transmogrify.h.h | 11 +- Objects/stringlib/codecs.h | 3 - Objects/stringlib/find.h | 47 - Objects/stringlib/unicode_format.h | 15 +- Objects/structseq.c | 190 +- Objects/tupleobject.c | 72 +- Objects/typeobject.c | 2073 +- Objects/typevarobject.c | 438 +- Objects/unicodeobject.c | 1483 +- Objects/unicodetype_db.h | 1965 +- Objects/unionobject.c | 38 +- Objects/weakrefobject.c | 812 +- PC/_msi.c | 1312 - PC/_testconsole.c | 54 +- PC/_wmimodule.cpp | 125 +- PC/clinic/_msi.c.h | 698 - PC/clinic/_testconsole.c.h | 99 +- PC/clinic/_wmimodule.cpp.h | 11 +- PC/clinic/msvcrtmodule.c.h | 36 +- PC/clinic/winreg.c.h | 143 +- PC/clinic/winsound.c.h | 138 +- PC/config.c | 16 +- PC/errmap.h | 3 + PC/launcher.c | 1 + PC/launcher2.c | 143 +- PC/layout/main.py | 160 +- PC/layout/support/appxmanifest.py | 2 +- PC/layout/support/constants.py | 3 + PC/layout/support/nuspec.py | 9 +- PC/layout/support/options.py | 19 +- PC/layout/support/props.py | 2 - PC/layout/support/python.props | 2 - PC/msvcrtmodule.c | 35 +- PC/{pyconfig.h => pyconfig.h.in} | 37 +- PC/python3dll.c | 35 + PC/python_ver_rc.h | 2 +- PC/venvlauncher.c | 510 + PC/winreg.c | 117 +- PC/winsound.c | 17 +- PCbuild/_asyncio.vcxproj | 2 +- PCbuild/_bz2.vcxproj | 2 +- PCbuild/_ctypes.vcxproj | 2 +- PCbuild/_ctypes_test.vcxproj | 2 +- PCbuild/_decimal.vcxproj | 70 +- PCbuild/_decimal.vcxproj.filters | 68 +- PCbuild/_elementtree.vcxproj | 2 +- PCbuild/_freeze_module.vcxproj | 166 +- PCbuild/_freeze_module.vcxproj.filters | 71 +- PCbuild/_hashlib.vcxproj | 2 +- PCbuild/_lzma.vcxproj | 2 +- PCbuild/_multiprocessing.vcxproj | 2 +- PCbuild/_overlapped.vcxproj | 2 +- PCbuild/_queue.vcxproj | 2 +- PCbuild/_socket.vcxproj | 2 +- PCbuild/_sqlite3.vcxproj | 2 +- PCbuild/_ssl.vcxproj | 2 +- PCbuild/_testbuffer.vcxproj | 2 +- PCbuild/_testcapi.vcxproj | 20 +- PCbuild/_testcapi.vcxproj.filters | 40 +- PCbuild/_testclinic.vcxproj | 4 +- ...si.vcxproj => _testclinic_limited.vcxproj} | 16 +- ...rs => _testclinic_limited.vcxproj.filters} | 8 +- PCbuild/_testconsole.vcxproj | 2 +- PCbuild/_testimportmultiple.vcxproj | 2 +- PCbuild/_testinternalcapi.vcxproj | 12 +- PCbuild/_testinternalcapi.vcxproj.filters | 11 +- PCbuild/_testlimitedcapi.vcxproj | 130 + PCbuild/_testlimitedcapi.vcxproj.filters | 36 + PCbuild/_testmultiphase.vcxproj | 2 +- PCbuild/_testsinglephase.vcxproj | 2 +- PCbuild/_tkinter.vcxproj | 2 +- PCbuild/_uuid.vcxproj | 2 +- PCbuild/_wmi.vcxproj | 2 +- PCbuild/_zoneinfo.vcxproj | 2 +- PCbuild/build.bat | 13 + PCbuild/find_python.bat | 11 +- PCbuild/get_externals.bat | 16 +- PCbuild/pcbuild.proj | 4 +- PCbuild/pcbuild.sln | 164 +- PCbuild/prepare_tcltk.bat | 3 - PCbuild/pyexpat.vcxproj | 2 +- PCbuild/pyproject.props | 29 +- PCbuild/python.props | 79 +- PCbuild/python.vcxproj | 12 +- PCbuild/python3dll.vcxproj | 2 +- PCbuild/pythoncore.vcxproj | 135 +- PCbuild/pythoncore.vcxproj.filters | 268 +- PCbuild/pythonw.vcxproj | 8 +- PCbuild/readme.txt | 102 +- PCbuild/regen.targets | 83 +- PCbuild/rt.bat | 29 +- PCbuild/select.vcxproj | 2 +- PCbuild/sqlite3.vcxproj | 2 +- PCbuild/tcltk.props | 10 +- PCbuild/tix.vcxproj | 101 - PCbuild/unicodedata.vcxproj | 2 +- PCbuild/venvlauncher.vcxproj | 9 +- PCbuild/venvlauncher.vcxproj.filters | 2 +- PCbuild/venvwlauncher.vcxproj | 9 +- PCbuild/venvwlauncher.vcxproj.filters | 2 +- PCbuild/winsound.vcxproj | 2 +- PCbuild/xxlimited.vcxproj | 2 +- PCbuild/xxlimited_35.vcxproj | 2 +- Parser/Python.asdl | 6 +- Parser/action_helpers.c | 154 +- Parser/asdl_c.py | 438 +- Parser/lexer/buffer.c | 76 + Parser/lexer/buffer.h | 10 + Parser/lexer/lexer.c | 1501 + Parser/lexer/lexer.h | 10 + Parser/lexer/state.c | 151 + Parser/{tokenizer.h => lexer/state.h} | 44 +- Parser/myreadline.c | 46 +- Parser/parser.c | 8367 +-- Parser/peg_api.c | 16 +- Parser/pegen.c | 89 +- Parser/pegen.h | 7 +- Parser/pegen_errors.c | 69 +- Parser/string_parser.c | 35 +- Parser/token.c | 2 - Parser/tokenizer.c | 3017 - Parser/tokenizer/file_tokenizer.c | 470 + Parser/tokenizer/helpers.c | 552 + Parser/tokenizer/helpers.h | 37 + Parser/tokenizer/readline_tokenizer.c | 134 + Parser/tokenizer/string_tokenizer.c | 129 + Parser/tokenizer/tokenizer.h | 14 + Parser/tokenizer/utf8_tokenizer.c | 55 + Programs/_bootstrap_python.c | 13 - Programs/_freeze_module.c | 26 +- Programs/_testembed.c | 226 +- Programs/test_frozenmain.h | 67 +- Python/Python-ast.c | 7416 ++- Python/Python-tokenize.c | 108 +- Python/_warnings.c | 186 +- Python/asm_trampoline.S | 8 + Python/assemble.c | 218 +- Python/ast.c | 27 +- Python/ast_opt.c | 61 +- Python/ast_unparse.c | 39 +- Python/bltinmodule.c | 483 +- Python/bootstrap_hash.c | 14 +- Python/brc.c | 208 + Python/bytecodes.c | 3548 +- Python/ceval.c | 979 +- Python/ceval_gil.c | 1041 +- Python/ceval_macros.h | 226 +- Python/clinic/Python-tokenize.c.h | 8 +- Python/clinic/_warnings.c.h | 14 +- Python/clinic/bltinmodule.c.h | 319 +- Python/clinic/context.c.h | 8 +- Python/clinic/import.c.h | 37 +- Python/clinic/instruction_sequence.c.h | 304 + Python/clinic/instrumentation.c.h | 30 +- Python/clinic/marshal.c.h | 242 +- Python/clinic/sysmodule.c.h | 255 +- Python/clinic/traceback.c.h | 18 +- Python/codecs.c | 191 +- Python/compile.c | 1660 +- Python/condvar.h | 26 +- Python/config_common.h | 36 + Python/context.c | 89 +- Python/critical_section.c | 148 + Python/crossinterp.c | 1921 + Python/crossinterp_data_lookup.h | 594 + Python/crossinterp_exceptions.h | 95 + Python/deepfreeze/README.txt | 6 - Python/dtoa.c | 87 +- Python/dup2.c | 6 +- Python/dynload_hpux.c | 2 +- Python/dynload_shlib.c | 2 +- Python/dynload_stub.c | 2 +- Python/dynload_win.c | 23 +- Python/emscripten_signal.c | 14 +- Python/emscripten_trampoline.c | 92 + Python/errors.c | 206 +- Python/executor_cases.c.h | 4466 ++ Python/fileutils.c | 275 +- Python/flowgraph.c | 1491 +- Python/formatter_unicode.c | 2 +- Python/frame.c | 82 +- Python/frozen.c | 92 +- Python/frozenmain.c | 18 +- Python/future.c | 24 +- Python/gc.c | 1993 + Python/gc_free_threading.c | 1900 + Python/gc_gil.c | 17 + Python/generated_cases.c.h | 9582 ++-- Python/getargs.c | 412 +- Python/getcopyright.c | 2 +- Python/getopt.c | 9 - Python/getversion.c | 9 +- Python/hamt.c | 9 +- Python/hashtable.c | 11 +- Python/import.c | 1996 +- Python/importdl.c | 478 +- Python/importdl.h | 35 - Python/initconfig.c | 1173 +- Python/instruction_sequence.c | 453 + Python/instrumentation.c | 891 +- Python/interpconfig.c | 268 + Python/intrinsics.c | 106 +- Python/jit.c | 482 + Python/legacy_tracing.c | 227 +- Python/lock.c | 592 + Python/makeopcodetargets.py | 55 - Python/marshal.c | 163 +- Python/modsupport.c | 187 +- Python/mystrtoul.c | 14 +- Python/object_stack.c | 108 + Python/opcode_metadata.h | 1001 - Python/opcode_targets.h | 360 +- Python/optimizer.c | 1711 + Python/optimizer_analysis.c | 608 + Python/optimizer_bytecodes.c | 812 + Python/optimizer_cases.c.h | 2188 + Python/optimizer_symbols.c | 514 + Python/parking_lot.c | 401 + Python/pathconfig.c | 44 +- Python/perf_jit_trampoline.c | 616 + Python/perf_trampoline.c | 163 +- Python/preconfig.c | 1 + Python/pyhash.c | 37 +- Python/pylifecycle.c | 894 +- Python/pystate.c | 1966 +- Python/pystrcmp.c | 8 +- Python/pystrhex.c | 6 +- Python/pystrtod.c | 3 +- Python/pythonrun.c | 1061 +- Python/pytime.c | 705 +- Python/qsbr.c | 289 + Python/specialize.c | 874 +- Python/stdlib_module_names.h | 33 +- Python/structmember.c | 230 +- Python/suggestions.c | 234 +- Python/symtable.c | 476 +- Python/sysmodule.c | 592 +- Python/thread.c | 108 +- Python/thread_nt.h | 97 +- Python/thread_pthread.h | 112 +- Python/thread_pthread_stubs.h | 11 +- Python/tier2_engine.md | 150 + Python/traceback.c | 489 +- Python/tracemalloc.c | 24 +- Python/vm-state.md | 90 + README.rst | 36 +- Tools/README | 15 +- Tools/build/check_extension_modules.py | 11 +- Tools/build/deepfreeze.py | 72 +- Tools/build/freeze_modules.py | 104 +- Tools/build/generate_global_objects.py | 33 +- Tools/build/generate_opcode_h.py | 236 - Tools/build/generate_re_casefix.py | 4 +- Tools/build/generate_sbom.py | 395 + Tools/build/generate_stdlib_module_names.py | 26 +- Tools/build/generate_token.py | 7 +- Tools/build/mypy.ini | 13 + Tools/build/regen-configure.sh | 29 + Tools/build/smelly.py | 18 +- Tools/build/stable_abi.py | 62 +- Tools/build/umarshal.py | 2 +- Tools/build/verify_ensurepip_wheels.py | 6 +- Tools/buildbot/test.bat | 32 +- Tools/c-analyzer/README | 6 +- Tools/c-analyzer/TODO | 4 +- Tools/c-analyzer/c_analyzer/__init__.py | 2 +- Tools/c-analyzer/c_common/scriptutil.py | 1 - Tools/c-analyzer/c_parser/info.py | 2 +- Tools/c-analyzer/c_parser/parser/_info.py | 2 +- .../c_parser/preprocessor/__init__.py | 3 + .../c_parser/preprocessor/__main__.py | 1 - Tools/c-analyzer/c_parser/preprocessor/gcc.py | 28 +- Tools/c-analyzer/cpython/_analyzer.py | 1 - Tools/c-analyzer/cpython/_files.py | 1 + Tools/c-analyzer/cpython/_parser.py | 16 +- Tools/c-analyzer/cpython/globals-to-fix.tsv | 73 +- Tools/c-analyzer/cpython/ignored.tsv | 79 +- Tools/c-analyzer/distutils/cygwinccompiler.py | 1 - Tools/c-analyzer/distutils/unixccompiler.py | 2 +- Tools/cases_generator/README.md | 29 +- Tools/cases_generator/_typing_backports.py | 15 + Tools/cases_generator/analyzer.py | 890 + Tools/cases_generator/cwriter.py | 146 + Tools/cases_generator/generate_cases.py | 1259 - Tools/cases_generator/generators_common.py | 242 + .../cases_generator/interpreter_definition.md | 131 +- Tools/cases_generator/lexer.py | 359 +- Tools/cases_generator/mypy.ini | 15 + Tools/cases_generator/opcode_id_generator.py | 65 + .../opcode_metadata_generator.py | 391 + Tools/cases_generator/optimizer_generator.py | 236 + Tools/cases_generator/parser.py | 486 +- Tools/cases_generator/parsing.py | 480 + Tools/cases_generator/plexer.py | 13 +- .../cases_generator/py_metadata_generator.py | 97 + Tools/cases_generator/stack.py | 227 + Tools/cases_generator/target_generator.py | 54 + Tools/cases_generator/test_generator.py | 529 - Tools/cases_generator/tier1_generator.py | 205 + Tools/cases_generator/tier2_generator.py | 254 + Tools/cases_generator/uop_id_generator.py | 82 + .../cases_generator/uop_metadata_generator.py | 95 + Tools/ccbench/ccbench.py | 606 - Tools/clinic/.ruff.toml | 31 + Tools/clinic/clinic.py | 5555 +- Tools/clinic/libclinic/__init__.py | 92 + Tools/clinic/libclinic/app.py | 271 + Tools/clinic/libclinic/block_parser.py | 256 + Tools/clinic/libclinic/clanguage.py | 537 + Tools/clinic/libclinic/cli.py | 231 + Tools/clinic/libclinic/codegen.py | 302 + Tools/clinic/libclinic/converter.py | 552 + Tools/clinic/libclinic/converters.py | 1211 + Tools/clinic/{ => libclinic}/cpp.py | 71 +- Tools/clinic/libclinic/dsl_parser.py | 1601 + Tools/clinic/libclinic/errors.py | 72 + Tools/clinic/libclinic/formatting.py | 223 + Tools/clinic/libclinic/function.py | 310 + Tools/clinic/libclinic/identifiers.py | 31 + Tools/clinic/libclinic/language.py | 103 + Tools/clinic/libclinic/parse_args.py | 944 + Tools/clinic/libclinic/parser.py | 53 + Tools/clinic/libclinic/return_converters.py | 173 + Tools/clinic/libclinic/utils.py | 93 + Tools/clinic/mypy.ini | 14 +- Tools/clinic/requirements-dev.txt | 2 - Tools/freeze/README | 19 +- Tools/freeze/freeze.py | 5 + Tools/freeze/test/freeze.py | 96 +- Tools/gdb/libpython.py | 154 +- Tools/i18n/pygettext.py | 6 + Tools/importbench/importbench.py | 10 +- Tools/iobench/iobench.py | 568 - Tools/jit/README.md | 66 + Tools/jit/_llvm.py | 100 + Tools/jit/_schema.py | 120 + Tools/jit/_stencils.py | 384 + Tools/jit/_targets.py | 530 + Tools/jit/_writer.py | 65 + Tools/jit/build.py | 28 + Tools/jit/ignore-tests-emulated-linux.txt | 83 + Tools/jit/mypy.ini | 5 + Tools/jit/template.c | 135 + Tools/jit/trampoline.c | 25 + Tools/lockbench/lockbench.py | 53 + Tools/msi/README.txt | 7 + Tools/msi/build.bat | 17 + Tools/msi/buildrelease.bat | 2 +- Tools/msi/bundle/Default.thm | 1 + Tools/msi/bundle/Default.wxl | 2 + .../PythonBootstrapperApplication.cpp | 208 +- Tools/msi/bundle/bundle.targets | 1 + Tools/msi/bundle/bundle.wxs | 18 +- .../msi/bundle/packagegroups/freethreaded.wxs | 62 + Tools/msi/bundle/packagegroups/launcher.wxs | 4 +- .../msi/bundle/packagegroups/postinstall.wxs | 2 +- Tools/msi/dev/dev_files.wxs | 2 +- Tools/msi/freethreaded/freethreaded.wixproj | 20 + Tools/msi/freethreaded/freethreaded.wxs | 18 + Tools/msi/freethreaded/freethreaded_d.wixproj | 20 + Tools/msi/freethreaded/freethreaded_d.wxs | 16 + .../freethreaded_en-US.wxl_template | 8 + Tools/msi/freethreaded/freethreaded_files.wxs | 183 + .../msi/freethreaded/freethreaded_pdb.wixproj | 20 + Tools/msi/freethreaded/freethreaded_pdb.wxs | 15 + Tools/msi/lib/lib_files.wxs | 18 +- Tools/msi/msi.props | 38 +- Tools/msi/pip/pip.wxs | 4 +- Tools/msi/purge.py | 2 +- Tools/msi/test/test_files.wxs | 18 +- Tools/patchcheck/patchcheck.py | 53 +- Tools/patchcheck/untabify.py | 10 +- Tools/peg_generator/.gitignore | 2 - Tools/peg_generator/Makefile | 72 +- Tools/peg_generator/data/cprog.py | 11 - .../data/top-pypi-packages-365-days.json | 16011 ------ Tools/peg_generator/data/xxl.zip | Bin 18771 -> 0 bytes Tools/peg_generator/mypy.ini | 39 +- .../peg_extension/peg_extension.c | 8 +- Tools/peg_generator/pegen/__main__.py | 5 +- Tools/peg_generator/pegen/ast_dump.py | 2 - Tools/peg_generator/pegen/build.py | 120 +- Tools/peg_generator/pegen/c_generator.py | 8 +- Tools/peg_generator/pegen/grammar.py | 16 +- .../peg_generator/pegen/grammar_visualizer.py | 1 - Tools/peg_generator/pegen/keywordgen.py | 13 +- Tools/peg_generator/pegen/parser.py | 17 +- Tools/peg_generator/pegen/parser_generator.py | 1 - Tools/peg_generator/pegen/python_generator.py | 2 +- Tools/peg_generator/pegen/sccutils.py | 4 +- Tools/peg_generator/pegen/testutil.py | 12 +- Tools/peg_generator/pyproject.toml | 3 +- Tools/peg_generator/requirements.pip | 2 - Tools/peg_generator/scripts/__init__.py | 1 - Tools/peg_generator/scripts/ast_timings.py | 26 - Tools/peg_generator/scripts/benchmark.py | 105 - .../scripts/download_pypi_packages.py | 87 - .../peg_generator/scripts/find_max_nesting.py | 55 - .../peg_generator/scripts/grammar_grapher.py | 119 - Tools/peg_generator/scripts/joinstats.py | 66 - .../scripts/test_parse_directory.py | 148 - .../scripts/test_pypi_packages.py | 92 - Tools/requirements-dev.txt | 7 + Tools/requirements-hypothesis.txt | 2 +- Tools/scripts/2to3 | 5 - Tools/scripts/README | 1 - Tools/scripts/run_tests.py | 92 - Tools/scripts/sortperf.py | 197 + Tools/scripts/summarize_stats.py | 1902 +- Tools/ssl/make_ssl_data.py | 11 +- Tools/ssl/multissltests.py | 15 +- Tools/stringbench/README | 68 - Tools/stringbench/stringbench.py | 1482 - Tools/tsan/suppressions_free_threading.txt | 51 + Tools/tsan/supressions.txt | 7 + Tools/unicode/dawg.py | 533 + Tools/unicode/genmap_japanese.py | 2 +- Tools/unicode/genmap_korean.py | 2 +- Tools/unicode/genmap_schinese.py | 2 +- Tools/unicode/genmap_support.py | 2 +- Tools/unicode/makeunicodedata.py | 263 +- Tools/wasm/README.md | 264 +- Tools/wasm/Setup.local.example | 3 - Tools/wasm/build_wasi.sh | 44 + Tools/wasm/config.site-wasm32-wasi | 17 + Tools/wasm/mypy.ini | 11 + Tools/wasm/python.html | 67 +- Tools/wasm/python.worker.js | 10 +- Tools/wasm/wasi-env | 1 - Tools/wasm/wasi.py | 365 + Tools/wasm/wasm_assets.py | 23 +- Tools/wasm/wasm_build.py | 85 +- Tools/wasm/wasm_webserver.py | 8 +- aclocal.m4 | 217 +- config.sub | 254 +- configure | 4949 +- configure.ac | 2154 +- iOS/README.rst | 385 + iOS/Resources/Info.plist.in | 34 + iOS/Resources/bin/arm64-apple-ios-ar | 2 + iOS/Resources/bin/arm64-apple-ios-clang | 2 + iOS/Resources/bin/arm64-apple-ios-clang++ | 2 + iOS/Resources/bin/arm64-apple-ios-cpp | 2 + .../bin/arm64-apple-ios-simulator-ar | 2 + .../bin/arm64-apple-ios-simulator-clang | 2 + .../bin/arm64-apple-ios-simulator-clang++ | 2 + .../bin/arm64-apple-ios-simulator-cpp | 2 + .../bin/x86_64-apple-ios-simulator-ar | 2 + .../bin/x86_64-apple-ios-simulator-clang | 2 + .../bin/x86_64-apple-ios-simulator-clang++ | 2 + .../bin/x86_64-apple-ios-simulator-cpp | 2 + iOS/Resources/dylib-Info-template.plist | 26 + iOS/Resources/pyconfig.h | 7 + iOS/testbed/Python.xcframework/Info.plist | 44 + .../Python.xcframework/ios-arm64/README | 4 + .../ios-arm64_x86_64-simulator/README | 4 + .../iOSTestbed.xcodeproj/project.pbxproj | 578 + iOS/testbed/iOSTestbed/AppDelegate.h | 11 + iOS/testbed/iOSTestbed/AppDelegate.m | 19 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../iOSTestbed/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 9 + iOS/testbed/iOSTestbed/app/README | 7 + iOS/testbed/iOSTestbed/app_packages/README | 7 + .../iOSTestbed/dylib-Info-template.plist | 26 + iOS/testbed/iOSTestbed/iOSTestbed-Info.plist | 64 + iOS/testbed/iOSTestbed/main.m | 16 + iOS/testbed/iOSTestbedTests/iOSTestbedTests.m | 157 + pyconfig.h.in | 116 +- 3234 files changed, 416680 insertions(+), 270810 deletions(-) create mode 100644 .coveragerc delete mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/bug.yml delete mode 100644 .github/ISSUE_TEMPLATE/crash.md create mode 100644 .github/ISSUE_TEMPLATE/crash.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/ISSUE_TEMPLATE/feature.yml create mode 100644 .github/workflows/add-issue-header.yml delete mode 100644 .github/workflows/build_msi.yml create mode 100644 .github/workflows/jit.yml create mode 100644 .github/workflows/reusable-change-detection.yml create mode 100644 .github/workflows/reusable-macos.yml create mode 100644 .github/workflows/reusable-tsan.yml create mode 100644 .github/workflows/reusable-ubuntu.yml create mode 100644 .github/workflows/reusable-wasi.yml create mode 100644 .github/workflows/reusable-windows-msi.yml create mode 100644 .github/workflows/reusable-windows.yml create mode 100644 Android/README.md create mode 100644 Android/android-env.sh create mode 100755 Android/android.py create mode 100644 Android/testbed/.gitignore create mode 100644 Android/testbed/app/.gitignore create mode 100644 Android/testbed/app/build.gradle.kts create mode 100644 Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt create mode 100644 Android/testbed/app/src/main/AndroidManifest.xml create mode 100644 Android/testbed/app/src/main/c/CMakeLists.txt create mode 100644 Android/testbed/app/src/main/c/main_activity.c create mode 100644 Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt create mode 100644 Android/testbed/app/src/main/python/main.py create mode 100644 Android/testbed/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Android/testbed/app/src/main/res/layout/activity_main.xml create mode 100644 Android/testbed/app/src/main/res/values/strings.xml create mode 100644 Android/testbed/build.gradle.kts create mode 100644 Android/testbed/gradle.properties create mode 100644 Android/testbed/gradle/wrapper/gradle-wrapper.properties create mode 100644 Android/testbed/settings.gradle.kts create mode 100644 Doc/.ruff.toml create mode 100644 Doc/c-api/hash.rst create mode 100644 Doc/c-api/monitoring.rst delete mode 100644 Doc/c-api/objbuffer.rst create mode 100644 Doc/c-api/time.rst delete mode 100644 Doc/data/python3.12.abi create mode 100644 Doc/data/python3.13.abi create mode 100644 Doc/deprecations/c-api-pending-removal-in-3.14.rst create mode 100644 Doc/deprecations/c-api-pending-removal-in-3.15.rst create mode 100644 Doc/deprecations/c-api-pending-removal-in-future.rst create mode 100644 Doc/deprecations/index.rst create mode 100644 Doc/deprecations/pending-removal-in-3.13.rst create mode 100644 Doc/deprecations/pending-removal-in-3.14.rst create mode 100644 Doc/deprecations/pending-removal-in-3.15.rst create mode 100644 Doc/deprecations/pending-removal-in-3.16.rst create mode 100644 Doc/deprecations/pending-removal-in-future.rst create mode 100644 Doc/howto/argparse-optparse.rst create mode 100644 Doc/howto/free-threading-extensions.rst create mode 100644 Doc/howto/free-threading-python.rst create mode 100644 Doc/howto/gdb_helpers.rst create mode 100644 Doc/howto/logging_flow.svg create mode 100644 Doc/howto/mro.rst create mode 100644 Doc/howto/timerfd.rst create mode 100644 Doc/includes/wasm-mobile-notavail.rst delete mode 100644 Doc/library/2to3.rst create mode 100644 Doc/library/asynchat.rst create mode 100644 Doc/library/asyncore.rst create mode 100644 Doc/library/cmdline.rst create mode 100644 Doc/library/distutils.rst create mode 100644 Doc/library/imp.rst create mode 100644 Doc/library/removed.rst create mode 100644 Doc/library/smtpd.rst delete mode 100644 Doc/library/tkinter.tix.rst create mode 100644 Doc/tools/extensions/audit_events.py create mode 100644 Doc/tools/extensions/availability.py delete mode 100644 Doc/tools/extensions/escape4chm.py create mode 100644 Doc/tools/extensions/lexers/__init__.py rename Doc/tools/extensions/{asdl_highlight.py => lexers/asdl_lexer.py} (62%) rename Doc/tools/extensions/{peg_highlight.py => lexers/peg_lexer.py} (94%) create mode 100644 Doc/tools/static/glossary_search.js create mode 100644 Doc/tools/static/rtd_switcher.js create mode 100644 Doc/tools/static/sidebar-wrap.css create mode 100644 Doc/using/android.rst create mode 100644 Doc/using/ios.rst create mode 100644 Doc/using/mac_installer_01_introduction.png create mode 100644 Doc/using/mac_installer_02_readme.png create mode 100644 Doc/using/mac_installer_03_license.png create mode 100644 Doc/using/mac_installer_04_installation_type.png create mode 100644 Doc/using/mac_installer_05_custom_install.png create mode 100644 Doc/using/mac_installer_06_summary.png create mode 100644 Doc/using/mac_installer_07_applications.png create mode 100644 Doc/using/mac_installer_08_install_certificates.png create mode 100644 Doc/using/mac_installer_09_custom_install_free_threaded.png delete mode 100644 Doc/using/venv-create.inc create mode 100644 Doc/using/win_install_freethreaded.png create mode 100644 Doc/whatsnew/3.13.rst create mode 100644 Include/cpython/critical_section.h delete mode 100644 Include/cpython/interpreteridobject.h create mode 100644 Include/cpython/lock.h create mode 100644 Include/cpython/monitoring.h create mode 100644 Include/cpython/pyatomic.h create mode 100644 Include/cpython/pyatomic_gcc.h create mode 100644 Include/cpython/pyatomic_msc.h create mode 100644 Include/cpython/pyatomic_std.h create mode 100644 Include/cpython/pyhash.h create mode 100644 Include/cpython/pystats.h create mode 100644 Include/cpython/tracemalloc.h create mode 100644 Include/critical_section.h create mode 100644 Include/internal/mimalloc/mimalloc.h create mode 100644 Include/internal/mimalloc/mimalloc/atomic.h create mode 100644 Include/internal/mimalloc/mimalloc/internal.h create mode 100644 Include/internal/mimalloc/mimalloc/prim.h create mode 100644 Include/internal/mimalloc/mimalloc/track.h create mode 100644 Include/internal/mimalloc/mimalloc/types.h delete mode 100644 Include/internal/pycore_atomic.h delete mode 100644 Include/internal/pycore_atomic_funcs.h create mode 100644 Include/internal/pycore_backoff.h create mode 100644 Include/internal/pycore_brc.h create mode 100644 Include/internal/pycore_capsule.h create mode 100644 Include/internal/pycore_cell.h create mode 100644 Include/internal/pycore_codecs.h create mode 100644 Include/internal/pycore_complexobject.h create mode 100644 Include/internal/pycore_critical_section.h create mode 100644 Include/internal/pycore_crossinterp.h create mode 100644 Include/internal/pycore_emscripten_trampoline.h create mode 100644 Include/internal/pycore_freelist.h create mode 100644 Include/internal/pycore_identifier.h create mode 100644 Include/internal/pycore_importdl.h create mode 100644 Include/internal/pycore_instruction_sequence.h create mode 100644 Include/internal/pycore_jit.h create mode 100644 Include/internal/pycore_llist.h create mode 100644 Include/internal/pycore_lock.h create mode 100644 Include/internal/pycore_mimalloc.h create mode 100644 Include/internal/pycore_modsupport.h create mode 100644 Include/internal/pycore_object_alloc.h create mode 100644 Include/internal/pycore_object_stack.h delete mode 100644 Include/internal/pycore_opcode.h create mode 100644 Include/internal/pycore_opcode_metadata.h create mode 100644 Include/internal/pycore_optimizer.h create mode 100644 Include/internal/pycore_parking_lot.h create mode 100644 Include/internal/pycore_pyatomic_ft_wrappers.h create mode 100644 Include/internal/pycore_pybuffer.h create mode 100644 Include/internal/pycore_pystats.h create mode 100644 Include/internal/pycore_pythonrun.h create mode 100644 Include/internal/pycore_qsbr.h create mode 100644 Include/internal/pycore_semaphore.h create mode 100644 Include/internal/pycore_setobject.h create mode 100644 Include/internal/pycore_stackref.h create mode 100644 Include/internal/pycore_tstate.h create mode 100644 Include/internal/pycore_uop_ids.h create mode 100644 Include/internal/pycore_uop_metadata.h create mode 100644 Include/internal/pycore_weakref.h delete mode 100644 Include/interpreteridobject.h create mode 100644 Include/lock.h create mode 100644 Include/monitoring.h create mode 100644 Include/opcode_ids.h create mode 100644 Include/pyatomic.h delete mode 100644 Include/tracemalloc.h create mode 100644 InternalDocs/string_interning.md create mode 100644 Lib/_android_support.py create mode 100644 Lib/_colorize.py create mode 100644 Lib/_ios_support.py create mode 100644 Lib/_opcode_metadata.py create mode 100644 Lib/_pyrepl/__init__.py create mode 100644 Lib/_pyrepl/__main__.py create mode 100644 Lib/_pyrepl/_minimal_curses.py create mode 100644 Lib/_pyrepl/_threading_handler.py create mode 100644 Lib/_pyrepl/commands.py create mode 100644 Lib/_pyrepl/completing_reader.py create mode 100644 Lib/_pyrepl/console.py create mode 100644 Lib/_pyrepl/curses.py create mode 100644 Lib/_pyrepl/fancy_termios.py create mode 100644 Lib/_pyrepl/historical_reader.py create mode 100644 Lib/_pyrepl/input.py create mode 100644 Lib/_pyrepl/keymap.py create mode 100644 Lib/_pyrepl/main.py create mode 100644 Lib/_pyrepl/mypy.ini create mode 100644 Lib/_pyrepl/pager.py create mode 100644 Lib/_pyrepl/reader.py create mode 100644 Lib/_pyrepl/readline.py create mode 100644 Lib/_pyrepl/simple_interact.py create mode 100644 Lib/_pyrepl/trace.py create mode 100644 Lib/_pyrepl/types.py create mode 100644 Lib/_pyrepl/unix_console.py create mode 100644 Lib/_pyrepl/unix_eventqueue.py create mode 100644 Lib/_pyrepl/utils.py create mode 100644 Lib/_pyrepl/windows_console.py delete mode 100644 Lib/aifc.py delete mode 100755 Lib/cgi.py delete mode 100644 Lib/cgitb.py delete mode 100644 Lib/chunk.py delete mode 100644 Lib/collections/abc.py delete mode 100644 Lib/crypt.py create mode 100644 Lib/dbm/sqlite3.py delete mode 100644 Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl create mode 100644 Lib/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl rename Lib/idlelib/{NEWS.txt => News3.txt} (97%) delete mode 100644 Lib/imghdr.py create mode 100644 Lib/importlib/metadata/diagnose.py create mode 100644 Lib/importlib/resources/_functional.py delete mode 100644 Lib/importlib/resources/_legacy.py delete mode 100644 Lib/lib2to3/Grammar.txt delete mode 100644 Lib/lib2to3/PatternGrammar.txt delete mode 100644 Lib/lib2to3/__init__.py delete mode 100644 Lib/lib2to3/__main__.py delete mode 100644 Lib/lib2to3/btm_matcher.py delete mode 100644 Lib/lib2to3/btm_utils.py delete mode 100644 Lib/lib2to3/fixer_base.py delete mode 100644 Lib/lib2to3/fixer_util.py delete mode 100644 Lib/lib2to3/fixes/__init__.py delete mode 100644 Lib/lib2to3/fixes/fix_apply.py delete mode 100644 Lib/lib2to3/fixes/fix_asserts.py delete mode 100644 Lib/lib2to3/fixes/fix_basestring.py delete mode 100644 Lib/lib2to3/fixes/fix_buffer.py delete mode 100644 Lib/lib2to3/fixes/fix_dict.py delete mode 100644 Lib/lib2to3/fixes/fix_except.py delete mode 100644 Lib/lib2to3/fixes/fix_exec.py delete mode 100644 Lib/lib2to3/fixes/fix_execfile.py delete mode 100644 Lib/lib2to3/fixes/fix_exitfunc.py delete mode 100644 Lib/lib2to3/fixes/fix_filter.py delete mode 100644 Lib/lib2to3/fixes/fix_funcattrs.py delete mode 100644 Lib/lib2to3/fixes/fix_future.py delete mode 100644 Lib/lib2to3/fixes/fix_getcwdu.py delete mode 100644 Lib/lib2to3/fixes/fix_has_key.py delete mode 100644 Lib/lib2to3/fixes/fix_idioms.py delete mode 100644 Lib/lib2to3/fixes/fix_import.py delete mode 100644 Lib/lib2to3/fixes/fix_imports.py delete mode 100644 Lib/lib2to3/fixes/fix_imports2.py delete mode 100644 Lib/lib2to3/fixes/fix_input.py delete mode 100644 Lib/lib2to3/fixes/fix_intern.py delete mode 100644 Lib/lib2to3/fixes/fix_isinstance.py delete mode 100644 Lib/lib2to3/fixes/fix_itertools.py delete mode 100644 Lib/lib2to3/fixes/fix_itertools_imports.py delete mode 100644 Lib/lib2to3/fixes/fix_long.py delete mode 100644 Lib/lib2to3/fixes/fix_map.py delete mode 100644 Lib/lib2to3/fixes/fix_metaclass.py delete mode 100644 Lib/lib2to3/fixes/fix_methodattrs.py delete mode 100644 Lib/lib2to3/fixes/fix_ne.py delete mode 100644 Lib/lib2to3/fixes/fix_next.py delete mode 100644 Lib/lib2to3/fixes/fix_nonzero.py delete mode 100644 Lib/lib2to3/fixes/fix_numliterals.py delete mode 100644 Lib/lib2to3/fixes/fix_operator.py delete mode 100644 Lib/lib2to3/fixes/fix_paren.py delete mode 100644 Lib/lib2to3/fixes/fix_print.py delete mode 100644 Lib/lib2to3/fixes/fix_raise.py delete mode 100644 Lib/lib2to3/fixes/fix_raw_input.py delete mode 100644 Lib/lib2to3/fixes/fix_reduce.py delete mode 100644 Lib/lib2to3/fixes/fix_reload.py delete mode 100644 Lib/lib2to3/fixes/fix_renames.py delete mode 100644 Lib/lib2to3/fixes/fix_repr.py delete mode 100644 Lib/lib2to3/fixes/fix_set_literal.py delete mode 100644 Lib/lib2to3/fixes/fix_standarderror.py delete mode 100644 Lib/lib2to3/fixes/fix_sys_exc.py delete mode 100644 Lib/lib2to3/fixes/fix_throw.py delete mode 100644 Lib/lib2to3/fixes/fix_tuple_params.py delete mode 100644 Lib/lib2to3/fixes/fix_types.py delete mode 100644 Lib/lib2to3/fixes/fix_unicode.py delete mode 100644 Lib/lib2to3/fixes/fix_urllib.py delete mode 100644 Lib/lib2to3/fixes/fix_ws_comma.py delete mode 100644 Lib/lib2to3/fixes/fix_xrange.py delete mode 100644 Lib/lib2to3/fixes/fix_xreadlines.py delete mode 100644 Lib/lib2to3/fixes/fix_zip.py delete mode 100644 Lib/lib2to3/main.py delete mode 100644 Lib/lib2to3/patcomp.py delete mode 100644 Lib/lib2to3/pgen2/__init__.py delete mode 100644 Lib/lib2to3/pgen2/conv.py delete mode 100644 Lib/lib2to3/pgen2/driver.py delete mode 100644 Lib/lib2to3/pgen2/grammar.py delete mode 100644 Lib/lib2to3/pgen2/literals.py delete mode 100644 Lib/lib2to3/pgen2/parse.py delete mode 100644 Lib/lib2to3/pgen2/pgen.py delete mode 100755 Lib/lib2to3/pgen2/token.py delete mode 100644 Lib/lib2to3/pgen2/tokenize.py delete mode 100644 Lib/lib2to3/pygram.py delete mode 100644 Lib/lib2to3/pytree.py delete mode 100644 Lib/lib2to3/refactor.py delete mode 100644 Lib/mailcap.py delete mode 100644 Lib/msilib/__init__.py delete mode 100644 Lib/msilib/schema.py delete mode 100644 Lib/msilib/sequence.py delete mode 100644 Lib/msilib/text.py delete mode 100644 Lib/nntplib.py delete mode 100644 Lib/pathlib.py create mode 100644 Lib/pathlib/__init__.py create mode 100644 Lib/pathlib/_abc.py create mode 100644 Lib/pathlib/_local.py delete mode 100644 Lib/pipes.py delete mode 100644 Lib/sndhdr.py delete mode 100644 Lib/sunau.py rename Lib/{sysconfig.py => sysconfig/__init__.py} (63%) create mode 100644 Lib/sysconfig/__main__.py delete mode 100644 Lib/telnetlib.py delete mode 100644 Lib/test/Sine-1000Hz-300ms.aif create mode 100644 Lib/test/_test_monitoring_shutdown.py delete mode 100644 Lib/test/allsans.pem create mode 100644 Lib/test/archiver_tests.py rename Lib/test/{ziptestdata => archivetestdata}/README.md (62%) rename Lib/test/{ziptestdata => archivetestdata}/exe_with_z64 (100%) rename Lib/test/{ziptestdata => archivetestdata}/exe_with_zip (100%) rename Lib/test/{ziptestdata => archivetestdata}/header.sh (100%) rename Lib/test/{ => archivetestdata}/recursion.tar (100%) rename Lib/test/{ziptestdata => archivetestdata}/testdata_module_inside_zip.py (100%) rename Lib/test/{ => archivetestdata}/testtar.tar (100%) rename Lib/test/{ => archivetestdata}/testtar.tar.xz (100%) rename Lib/test/{ => archivetestdata}/zip_cp437_header.zip (100%) rename Lib/test/{ => archivetestdata}/zipdir.zip (100%) create mode 100644 Lib/test/archivetestdata/zipdir_backslash.zip delete mode 100644 Lib/test/audiodata/pluck-alaw.aifc delete mode 100644 Lib/test/audiodata/pluck-pcm16.aiff delete mode 100644 Lib/test/audiodata/pluck-pcm16.au delete mode 100644 Lib/test/audiodata/pluck-pcm24.aiff delete mode 100644 Lib/test/audiodata/pluck-pcm24.au delete mode 100644 Lib/test/audiodata/pluck-pcm32.aiff delete mode 100644 Lib/test/audiodata/pluck-pcm32.au delete mode 100644 Lib/test/audiodata/pluck-pcm8.aiff delete mode 100644 Lib/test/audiodata/pluck-pcm8.au delete mode 100644 Lib/test/audiodata/pluck-ulaw.aifc delete mode 100644 Lib/test/audiodata/pluck-ulaw.au delete mode 100644 Lib/test/audiotest.au delete mode 100644 Lib/test/badsyntax_future3.py delete mode 100644 Lib/test/badsyntax_future4.py delete mode 100644 Lib/test/badsyntax_future5.py delete mode 100644 Lib/test/badsyntax_future6.py delete mode 100644 Lib/test/badsyntax_future7.py delete mode 100644 Lib/test/badsyntax_future8.py delete mode 100644 Lib/test/badsyntax_future9.py delete mode 100644 Lib/test/capath/b1930218.0 delete mode 100644 Lib/test/capath/ceff1710.0 create mode 100644 Lib/test/certdata/allsans.pem rename Lib/test/{ => certdata}/badcert.pem (100%) rename Lib/test/{ => certdata}/badkey.pem (100%) rename Lib/test/{ => certdata}/capath/4e1295a3.0 (100%) rename Lib/test/{ => certdata}/capath/5ed36f99.0 (100%) rename Lib/test/{ => certdata}/capath/6e88d7b8.0 (100%) rename Lib/test/{ => certdata}/capath/99d0fa06.0 (100%) create mode 100644 Lib/test/certdata/capath/b1930218.0 create mode 100644 Lib/test/certdata/capath/ceff1710.0 create mode 100644 Lib/test/certdata/cert3.pem rename Lib/test/{ => certdata}/ffdh3072.pem (100%) create mode 100644 Lib/test/certdata/idnsans.pem create mode 100644 Lib/test/certdata/keycert.passwd.pem create mode 100644 Lib/test/certdata/keycert.pem create mode 100644 Lib/test/certdata/keycert2.pem create mode 100644 Lib/test/certdata/keycert3.pem create mode 100644 Lib/test/certdata/keycert4.pem create mode 100644 Lib/test/certdata/keycertecc.pem create mode 100644 Lib/test/certdata/leaf-missing-aki.ca.pem create mode 100644 Lib/test/certdata/leaf-missing-aki.keycert.pem rename Lib/test/{ => certdata}/make_ssl_certs.py (97%) rename Lib/test/{ => certdata}/nokia.pem (100%) create mode 100644 Lib/test/certdata/nosan.pem rename Lib/test/{ => certdata}/nullbytecert.pem (100%) rename Lib/test/{ => certdata}/nullcert.pem (100%) create mode 100644 Lib/test/certdata/pycacert.pem create mode 100644 Lib/test/certdata/pycakey.pem create mode 100644 Lib/test/certdata/revocation.crl rename Lib/test/{ => certdata}/secp384r1.pem (100%) rename Lib/test/{ => certdata}/selfsigned_pythontestdotnet.pem (100%) create mode 100644 Lib/test/certdata/ssl_cert.pem create mode 100644 Lib/test/certdata/ssl_key.passwd.pem create mode 100644 Lib/test/certdata/ssl_key.pem rename Lib/test/{ => certdata}/talos-2019-0758.pem (100%) rename Lib/test/{ => configdata}/cfgparser.1 (100%) rename Lib/test/{ => configdata}/cfgparser.2 (100%) rename Lib/test/{ => configdata}/cfgparser.3 (100%) create mode 100644 Lib/test/cov.py delete mode 100644 Lib/test/idnsans.pem delete mode 100644 Lib/test/imghdrdata/python-raw.jpg delete mode 100644 Lib/test/imghdrdata/python.bmp delete mode 100644 Lib/test/imghdrdata/python.exr delete mode 100644 Lib/test/imghdrdata/python.jpg delete mode 100644 Lib/test/imghdrdata/python.pbm delete mode 100644 Lib/test/imghdrdata/python.ras delete mode 100644 Lib/test/imghdrdata/python.sgi delete mode 100644 Lib/test/imghdrdata/python.tiff delete mode 100644 Lib/test/imghdrdata/python.webp delete mode 100644 Lib/test/imp_dummy.py delete mode 100644 Lib/test/keycert.passwd.pem delete mode 100644 Lib/test/keycert.pem delete mode 100644 Lib/test/keycert2.pem delete mode 100644 Lib/test/keycert3.pem delete mode 100644 Lib/test/keycert4.pem delete mode 100644 Lib/test/keycertecc.pem create mode 100644 Lib/test/libregrtest/filter.py create mode 100644 Lib/test/libregrtest/findtests.py create mode 100644 Lib/test/libregrtest/logger.py create mode 100644 Lib/test/libregrtest/mypy.ini create mode 100644 Lib/test/libregrtest/result.py create mode 100644 Lib/test/libregrtest/results.py create mode 100644 Lib/test/libregrtest/run_workers.py delete mode 100644 Lib/test/libregrtest/runtest.py delete mode 100644 Lib/test/libregrtest/runtest_mp.py create mode 100644 Lib/test/libregrtest/runtests.py create mode 100644 Lib/test/libregrtest/single.py rename Lib/test/{support => libregrtest}/testresult.py (94%) create mode 100644 Lib/test/libregrtest/tsan.py create mode 100644 Lib/test/libregrtest/worker.py delete mode 100644 Lib/test/mailcap.txt rename Lib/test/{ => mathdata}/cmath_testcases.txt (100%) rename Lib/test/{ => mathdata}/floating_points.txt (100%) rename Lib/test/{ => mathdata}/formatfloat_testcases.txt (100%) rename Lib/test/{ => mathdata}/ieee754.txt (98%) rename Lib/test/{ => mathdata}/math_testcases.txt (100%) delete mode 100644 Lib/test/nosan.pem delete mode 100644 Lib/test/pycacert.pem delete mode 100644 Lib/test/pycakey.pem create mode 100644 Lib/test/regrtestdata/import_from_tests/test_regrtest_a.py create mode 100644 Lib/test/regrtestdata/import_from_tests/test_regrtest_b/__init__.py rename Lib/test/{test_importlib/data/__init__.py => regrtestdata/import_from_tests/test_regrtest_b/util.py} (100%) create mode 100644 Lib/test/regrtestdata/import_from_tests/test_regrtest_c.py delete mode 100644 Lib/test/revocation.crl delete mode 100644 Lib/test/sgml_input.html delete mode 100644 Lib/test/shadowed_super.py delete mode 100644 Lib/test/sndhdrdata/README delete mode 100644 Lib/test/sndhdrdata/sndhdr.8svx delete mode 100644 Lib/test/sndhdrdata/sndhdr.aifc delete mode 100644 Lib/test/sndhdrdata/sndhdr.aiff delete mode 100644 Lib/test/sndhdrdata/sndhdr.au delete mode 100644 Lib/test/sndhdrdata/sndhdr.hcom delete mode 100644 Lib/test/sndhdrdata/sndhdr.sndt delete mode 100644 Lib/test/sndhdrdata/sndhdr.voc delete mode 100644 Lib/test/sndhdrdata/sndhdr.wav delete mode 100644 Lib/test/sortperf.py delete mode 100644 Lib/test/ssl_cert.pem delete mode 100644 Lib/test/ssl_key.passwd.pem delete mode 100644 Lib/test/ssl_key.pem create mode 100644 Lib/test/support/i18n_helper.py delete mode 100644 Lib/test/support/interpreters.py create mode 100644 Lib/test/support/interpreters/__init__.py create mode 100644 Lib/test/support/interpreters/_crossinterp.py create mode 100644 Lib/test/support/interpreters/channels.py create mode 100644 Lib/test/support/interpreters/queues.py create mode 100644 Lib/test/support/pty_helper.py create mode 100644 Lib/test/support/refleak_helper.py rename Lib/test/{ => support}/smtpd.py (100%) create mode 100644 Lib/test/support/venv.py create mode 100644 Lib/test/test__colorize.py rename Lib/test/{test__xxinterpchannels.py => test__interpchannels.py} (52%) create mode 100644 Lib/test/test__interpreters.py delete mode 100644 Lib/test/test__xxsubinterpreters.py delete mode 100644 Lib/test/test_aifc.py create mode 100644 Lib/test/test_android.py delete mode 100644 Lib/test/test_ast.py create mode 100644 Lib/test/test_ast/__init__.py create mode 100644 Lib/test/test_ast/snippets.py create mode 100644 Lib/test/test_ast/test_ast.py create mode 100644 Lib/test/test_ast/utils.py create mode 100644 Lib/test/test_asyncio/test_staggered.py delete mode 100644 Lib/test/test_audioop.py create mode 100644 Lib/test/test_capi/test_bytearray.py create mode 100644 Lib/test/test_capi/test_bytes.py create mode 100644 Lib/test/test_capi/test_complex.py create mode 100644 Lib/test/test_capi/test_float.py create mode 100644 Lib/test/test_capi/test_hash.py create mode 100644 Lib/test/test_capi/test_list.py create mode 100644 Lib/test/test_capi/test_number.py create mode 100644 Lib/test/test_capi/test_object.py create mode 100644 Lib/test/test_capi/test_opt.py create mode 100644 Lib/test/test_capi/test_pyatomic.py create mode 100644 Lib/test/test_capi/test_run.py create mode 100644 Lib/test/test_capi/test_set.py create mode 100644 Lib/test/test_capi/test_sys.py create mode 100644 Lib/test/test_capi/test_time.py create mode 100644 Lib/test/test_capi/test_tuple.py create mode 100644 Lib/test/test_cext/__init__.py create mode 100644 Lib/test/test_cext/extension.c create mode 100644 Lib/test/test_cext/setup.py delete mode 100644 Lib/test/test_cgi.py delete mode 100644 Lib/test/test_cgitb.py delete mode 100644 Lib/test/test_crashers.py delete mode 100644 Lib/test/test_crypt.py create mode 100644 Lib/test/test_ctypes/_support.py create mode 100644 Lib/test/test_ctypes/test_aligned_structures.py create mode 100644 Lib/test/test_ctypes/test_c_simple_type_meta.py create mode 100644 Lib/test/test_ctypes/test_dlerror.py create mode 100644 Lib/test/test_ctypes/test_unions.py create mode 100644 Lib/test/test_ctypes/test_win32_com_foreign_func.py rename Lib/test/{test_dataclasses.py => test_dataclasses/__init__.py} (92%) rename Lib/test/{ => test_dataclasses}/dataclass_module_1.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_1_str.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_2.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_module_2_str.py (100%) rename Lib/test/{ => test_dataclasses}/dataclass_textanno.py (100%) create mode 100644 Lib/test/test_dbm_sqlite3.py create mode 100644 Lib/test/test_doctest/__init__.py create mode 100644 Lib/test/test_doctest/decorator_mod.py rename Lib/test/{ => test_doctest}/doctest_aliases.py (100%) rename Lib/test/{ => test_doctest}/doctest_lineno.py (62%) rename Lib/test/{ => test_doctest}/sample_doctest.py (91%) rename Lib/test/{ => test_doctest}/sample_doctest_no_docstrings.py (100%) rename Lib/test/{ => test_doctest}/sample_doctest_no_doctests.py (100%) create mode 100644 Lib/test/test_doctest/sample_doctest_skip.py rename Lib/test/{ => test_doctest}/test_doctest.py (85%) rename Lib/test/{ => test_doctest}/test_doctest.txt (100%) rename Lib/test/{ => test_doctest}/test_doctest2.py (100%) rename Lib/test/{ => test_doctest}/test_doctest2.txt (77%) rename Lib/test/{ => test_doctest}/test_doctest3.txt (100%) rename Lib/test/{ => test_doctest}/test_doctest4.txt (100%) create mode 100644 Lib/test/test_doctest/test_doctest_skip.txt create mode 100644 Lib/test/test_external_inspection.py create mode 100644 Lib/test/test_free_threading/__init__.py create mode 100644 Lib/test/test_free_threading/test_code.py create mode 100644 Lib/test/test_free_threading/test_dict.py create mode 100644 Lib/test/test_free_threading/test_gc.py create mode 100644 Lib/test/test_free_threading/test_list.py create mode 100644 Lib/test/test_free_threading/test_monitoring.py create mode 100644 Lib/test/test_free_threading/test_slots.py create mode 100644 Lib/test/test_free_threading/test_str.py create mode 100644 Lib/test/test_free_threading/test_tokenize.py create mode 100644 Lib/test/test_free_threading/test_type.py create mode 100644 Lib/test/test_future_stmt/__init__.py rename Lib/test/{badsyntax_future10.py => test_future_stmt/badsyntax_future.py} (100%) rename Lib/test/{future_test1.py => test_future_stmt/import_nested_scope_twice.py} (100%) rename Lib/test/{future_test2.py => test_future_stmt/nested_scope.py} (100%) rename Lib/test/{ => test_future_stmt}/test_future.py (71%) rename Lib/test/{test___future__.py => test_future_stmt/test_future_flags.py} (100%) rename Lib/test/{test_future5.py => test_future_stmt/test_future_multiple_features.py} (100%) rename Lib/test/{test_future4.py => test_future_stmt/test_future_multiple_imports.py} (100%) rename Lib/test/{test_future3.py => test_future_stmt/test_future_single_import.py} (100%) delete mode 100644 Lib/test/test_gdb.py create mode 100644 Lib/test/test_gdb/__init__.py rename Lib/test/{ => test_gdb}/gdb_sample.py (75%) create mode 100644 Lib/test/test_gdb/test_backtrace.py create mode 100644 Lib/test/test_gdb/test_cfunction.py create mode 100644 Lib/test/test_gdb/test_cfunction_full.py create mode 100644 Lib/test/test_gdb/test_misc.py create mode 100644 Lib/test/test_gdb/test_pretty_print.py create mode 100644 Lib/test/test_gdb/util.py create mode 100644 Lib/test/test_generated_cases.py delete mode 100644 Lib/test/test_imghdr.py create mode 100644 Lib/test/test_import/data/circular_imports/import_cycle.py create mode 100644 Lib/test/test_import/data/circular_imports/singlephase.py rename Lib/test/{ => test_import/data}/double_const.py (100%) create mode 100644 Lib/test/test_import/data/package3/__init__.py create mode 100644 Lib/test/test_import/data/package3/submodule.py create mode 100644 Lib/test/test_import/data/package4/__init__.py create mode 100644 Lib/test/test_import/data/package4/submodule.py create mode 100644 Lib/test/test_importlib/extension/_test_nonmodule_cases.py rename Lib/test/test_importlib/{resources/data01 => metadata}/__init__.py (100%) rename Lib/test/test_importlib/{ => metadata}/_context.py (100%) rename Lib/test/test_importlib/{ => metadata}/_path.py (70%) rename Lib/test/test_importlib/{resources/data01/subdirectory => metadata/data}/__init__.py (100%) rename Lib/test/test_importlib/{ => metadata}/data/example-21.12-py3-none-any.whl (100%) rename Lib/test/test_importlib/{ => metadata}/data/example-21.12-py3.6.egg (100%) rename Lib/test/test_importlib/{ => metadata}/data/example2-1.0.0-py3-none-any.whl (100%) create mode 100644 Lib/test/test_importlib/metadata/data/sources/example/example/__init__.py create mode 100644 Lib/test/test_importlib/metadata/data/sources/example/setup.py create mode 100644 Lib/test/test_importlib/metadata/data/sources/example2/example2/__init__.py create mode 100644 Lib/test/test_importlib/metadata/data/sources/example2/pyproject.toml rename Lib/test/test_importlib/{ => metadata}/fixtures.py (75%) rename Lib/test/test_importlib/{ => metadata}/stubs.py (100%) rename Lib/test/test_importlib/{test_metadata_api.py => metadata/test_api.py} (99%) rename Lib/test/test_importlib/{ => metadata}/test_main.py (87%) rename Lib/test/test_importlib/{ => metadata}/test_zip.py (100%) delete mode 100644 Lib/test/test_importlib/resources/data01/binary.file delete mode 100644 Lib/test/test_importlib/resources/data01/subdirectory/binary.file delete mode 100644 Lib/test/test_importlib/resources/data01/utf-16.file delete mode 100644 Lib/test/test_importlib/resources/data01/utf-8.file delete mode 100644 Lib/test/test_importlib/resources/data02/one/__init__.py delete mode 100644 Lib/test/test_importlib/resources/data02/one/resource1.txt delete mode 100644 Lib/test/test_importlib/resources/data02/subdirectory/subsubdir/resource.txt delete mode 100644 Lib/test/test_importlib/resources/data02/two/__init__.py delete mode 100644 Lib/test/test_importlib/resources/data02/two/resource2.txt delete mode 100644 Lib/test/test_importlib/resources/data03/__init__.py delete mode 100644 Lib/test/test_importlib/resources/data03/namespace/portion1/__init__.py delete mode 100644 Lib/test/test_importlib/resources/data03/namespace/portion2/__init__.py delete mode 100644 Lib/test/test_importlib/resources/data03/namespace/resource1.txt delete mode 100644 Lib/test/test_importlib/resources/namespacedata01/binary.file delete mode 100644 Lib/test/test_importlib/resources/namespacedata01/utf-16.file delete mode 100644 Lib/test/test_importlib/resources/namespacedata01/utf-8.file create mode 100644 Lib/test/test_importlib/resources/test_functional.py delete mode 100755 Lib/test/test_importlib/resources/update-zips.py create mode 100755 Lib/test/test_importlib/resources/zip.py delete mode 100644 Lib/test/test_importlib/resources/zipdata01/__init__.py delete mode 100644 Lib/test/test_importlib/resources/zipdata01/ziptestdata.zip delete mode 100644 Lib/test/test_importlib/resources/zipdata02/__init__.py delete mode 100644 Lib/test/test_importlib/resources/zipdata02/ziptestdata.zip create mode 100644 Lib/test/test_inspect/__init__.py rename Lib/test/{ => test_inspect}/inspect_fodder.py (97%) rename Lib/test/{ => test_inspect}/inspect_fodder2.py (75%) rename Lib/test/{ => test_inspect}/inspect_stock_annotations.py (100%) rename Lib/test/{ => test_inspect}/inspect_stringized_annotations.py (100%) rename Lib/test/{ => test_inspect}/inspect_stringized_annotations_2.py (100%) create mode 100644 Lib/test/test_inspect/inspect_stringized_annotations_pep695.py rename Lib/test/{ => test_inspect}/test_inspect.py (74%) delete mode 100644 Lib/test/test_interpreters.py create mode 100644 Lib/test/test_interpreters/__init__.py rename Lib/test/{test_lib2to3 => test_interpreters}/__main__.py (100%) create mode 100644 Lib/test/test_interpreters/test_api.py create mode 100644 Lib/test/test_interpreters/test_channels.py create mode 100644 Lib/test/test_interpreters/test_lifecycle.py create mode 100644 Lib/test/test_interpreters/test_queues.py create mode 100644 Lib/test/test_interpreters/test_stress.py create mode 100644 Lib/test/test_interpreters/utils.py delete mode 100644 Lib/test/test_lib2to3/__init__.py delete mode 100644 Lib/test/test_lib2to3/data/README delete mode 100644 Lib/test/test_lib2to3/data/bom.py delete mode 100644 Lib/test/test_lib2to3/data/crlf.py delete mode 100755 Lib/test/test_lib2to3/data/different_encoding.py delete mode 100755 Lib/test/test_lib2to3/data/false_encoding.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/bad_order.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/__init__.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/fix_explicit.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/fix_first.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/fix_last.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/fix_parrot.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/myfixes/fix_preorder.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/no_fixer_cls.py delete mode 100644 Lib/test/test_lib2to3/data/fixers/parrot_example.py delete mode 100644 Lib/test/test_lib2to3/data/infinite_recursion.py delete mode 100644 Lib/test/test_lib2to3/data/py2_test_grammar.py delete mode 100644 Lib/test/test_lib2to3/data/py3_test_grammar.py delete mode 100755 Lib/test/test_lib2to3/pytree_idempotency.py delete mode 100644 Lib/test/test_lib2to3/support.py delete mode 100644 Lib/test/test_lib2to3/test_all_fixers.py delete mode 100644 Lib/test/test_lib2to3/test_fixers.py delete mode 100644 Lib/test/test_lib2to3/test_main.py delete mode 100644 Lib/test/test_lib2to3/test_parser.py delete mode 100644 Lib/test/test_lib2to3/test_pytree.py delete mode 100644 Lib/test/test_lib2to3/test_refactor.py delete mode 100644 Lib/test/test_lib2to3/test_util.py delete mode 100644 Lib/test/test_mailcap.py rename Lib/test/{ => test_module}/final_a.py (79%) rename Lib/test/{ => test_module}/final_b.py (79%) delete mode 100644 Lib/test/test_msilib.py create mode 100644 Lib/test/test_msvcrt.py delete mode 100644 Lib/test/test_nis.py delete mode 100644 Lib/test/test_nntplib.py create mode 100644 Lib/test/test_optimizer.py delete mode 100644 Lib/test/test_ossaudiodev.py delete mode 100644 Lib/test/test_pathlib.py create mode 100644 Lib/test/test_pathlib/__init__.py create mode 100644 Lib/test/test_pathlib/test_pathlib.py create mode 100644 Lib/test/test_pathlib/test_pathlib_abc.py delete mode 100644 Lib/test/test_pipes.py create mode 100644 Lib/test/test_pydoc/__init__.py rename Lib/test/{ => test_pydoc}/pydoc_mod.py (100%) rename Lib/test/{ => test_pydoc}/pydocfodder.py (69%) rename Lib/test/{ => test_pydoc}/test_pydoc.py (63%) create mode 100644 Lib/test/test_pyrepl/__init__.py create mode 100644 Lib/test/test_pyrepl/__main__.py create mode 100644 Lib/test/test_pyrepl/support.py create mode 100644 Lib/test/test_pyrepl/test_input.py create mode 100644 Lib/test/test_pyrepl/test_interact.py create mode 100644 Lib/test/test_pyrepl/test_keymap.py create mode 100644 Lib/test/test_pyrepl/test_pyrepl.py create mode 100644 Lib/test/test_pyrepl/test_reader.py create mode 100644 Lib/test/test_pyrepl/test_unix_console.py create mode 100644 Lib/test/test_pyrepl/test_unix_eventqueue.py create mode 100644 Lib/test/test_pyrepl/test_windows_console.py delete mode 100644 Lib/test/test_sndhdr.py delete mode 100644 Lib/test/test_spwd.py create mode 100644 Lib/test/test_sqlite3/util.py rename Lib/test/{test_unicode.py => test_str.py} (95%) delete mode 100644 Lib/test/test_sunau.py delete mode 100644 Lib/test/test_telnetlib.py create mode 100644 Lib/test/test_termios.py delete mode 100644 Lib/test/test_tix.py create mode 100644 Lib/test/test_tools/i18n_data/docstrings.pot create mode 100644 Lib/test/test_tools/i18n_data/docstrings.py create mode 100644 Lib/test/test_tools/i18n_data/fileloc.pot create mode 100644 Lib/test/test_tools/i18n_data/fileloc.py create mode 100644 Lib/test/test_tools/i18n_data/messages.pot create mode 100644 Lib/test/test_tools/i18n_data/messages.py create mode 100644 Lib/test/test_tools/test_makefile.py create mode 100644 Lib/test/test_tools/test_makeunicodedata.py create mode 100644 Lib/test/test_tty.py create mode 100644 Lib/test/test_unittest/test_util.py create mode 100644 Lib/test/test_unittest/testmock/testthreadingmock.py delete mode 100644 Lib/test/test_uu.py create mode 100644 Lib/test/test_winapi.py delete mode 100644 Lib/test/test_xdrlib.py delete mode 100644 Lib/test/test_xmlrpc_net.py delete mode 100644 Lib/test/time_hashlib.py rename Lib/test/{imghdrdata => tkinterdata}/python.gif (100%) rename Lib/test/{imghdrdata => tkinterdata}/python.pgm (100%) rename Lib/test/{imghdrdata => tkinterdata}/python.png (100%) rename Lib/test/{imghdrdata => tkinterdata}/python.ppm (100%) rename Lib/test/{imghdrdata => tkinterdata}/python.xbm (100%) rename Lib/test/{test_importlib/resources/data02 => tokenizedata}/__init__.py (100%) rename Lib/test/{ => tokenizedata}/bad_coding.py (100%) rename Lib/test/{ => tokenizedata}/bad_coding2.py (100%) rename Lib/test/{ => tokenizedata}/badsyntax_3131.py (100%) rename Lib/test/{ => tokenizedata}/badsyntax_pep3120.py (100%) rename Lib/test/{ => tokenizedata}/coding20731.py (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt (100%) rename Lib/test/{ => tokenizedata}/tokenize_tests.txt (100%) create mode 100644 Lib/test/translationdata/argparse/msgids.txt create mode 100644 Lib/test/translationdata/getopt/msgids.txt create mode 100644 Lib/test/translationdata/optparse/msgids.txt rename Lib/test/{ => typinganndata}/_typed_dict_helper.py (100%) rename Lib/test/{ => typinganndata}/ann_module.py (100%) rename Lib/test/{ => typinganndata}/ann_module2.py (100%) rename Lib/test/{ => typinganndata}/ann_module3.py (100%) rename Lib/test/{ => typinganndata}/ann_module4.py (100%) rename Lib/test/{ => typinganndata}/ann_module5.py (100%) rename Lib/test/{ => typinganndata}/ann_module6.py (100%) create mode 100644 Lib/test/typinganndata/ann_module695.py rename Lib/test/{ => typinganndata}/ann_module7.py (100%) rename Lib/test/{ => typinganndata}/ann_module8.py (100%) rename Lib/test/{ => typinganndata}/mod_generics_cache.py (100%) delete mode 100644 Lib/test/wheel-0.40.0-py3-none-any.whl rename Lib/test/{ => wheeldata}/setuptools-67.6.1-py3-none-any.whl (100%) create mode 100644 Lib/test/wheeldata/wheel-0.43.0-py3-none-any.whl create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x000000000.part create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x100000000.part create mode 100644 Lib/test/zipimport_data/sparse-zip64-c0-0x200000000.part delete mode 100644 Lib/tkinter/tix.py delete mode 100644 Lib/uu.py rename Lib/venv/scripts/{posix => common}/activate.fish (90%) delete mode 100644 Lib/xdrlib.py create mode 100644 Mac/BuildScript/backport_gh110950_fix.patch create mode 100644 Mac/BuildScript/backport_gh71383_fix.patch create mode 100644 Mac/Resources/app-store-compliance.patch delete mode 100644 Misc/NEWS.d/3.12.0.rst delete mode 100644 Misc/NEWS.d/3.12.0b2.rst delete mode 100644 Misc/NEWS.d/3.12.0b3.rst delete mode 100644 Misc/NEWS.d/3.12.0b4.rst delete mode 100644 Misc/NEWS.d/3.12.0rc1.rst delete mode 100644 Misc/NEWS.d/3.12.0rc2.rst delete mode 100644 Misc/NEWS.d/3.12.0rc3.rst create mode 100644 Misc/NEWS.d/3.13.0.rst create mode 100644 Misc/NEWS.d/3.13.0a1.rst create mode 100644 Misc/NEWS.d/3.13.0a2.rst create mode 100644 Misc/NEWS.d/3.13.0a3.rst create mode 100644 Misc/NEWS.d/3.13.0a4.rst create mode 100644 Misc/NEWS.d/3.13.0a5.rst create mode 100644 Misc/NEWS.d/3.13.0a6.rst create mode 100644 Misc/NEWS.d/3.13.0b1.rst create mode 100644 Misc/NEWS.d/3.13.0b2.rst create mode 100644 Misc/NEWS.d/3.13.0b3.rst create mode 100644 Misc/NEWS.d/3.13.0b4.rst create mode 100644 Misc/NEWS.d/3.13.0rc1.rst create mode 100644 Misc/NEWS.d/3.13.0rc2.rst create mode 100644 Misc/NEWS.d/3.13.0rc3.rst create mode 100644 Misc/NEWS.d/3.13.1.rst create mode 100644 Misc/externals.spdx.json create mode 100644 Misc/platform_triplet.c delete mode 100644 Misc/requirements-test.txt create mode 100644 Misc/sbom.spdx.json delete mode 100644 Modules/_cryptmodule.c create mode 100644 Modules/_ctypes/clinic/_ctypes.c.h create mode 100644 Modules/_ctypes/clinic/callproc.c.h create mode 100644 Modules/_decimal/windows/mpdecimal.h create mode 100644 Modules/_interpchannelsmodule.c create mode 100644 Modules/_interpqueuesmodule.c create mode 100644 Modules/_interpreters_common.h create mode 100644 Modules/_interpretersmodule.c create mode 100644 Modules/_sqlite/clinic/_sqlite3.connect.c.h delete mode 100644 Modules/_ssl_data.h create mode 100644 Modules/_suggestions.c create mode 100644 Modules/_sysconfig.c create mode 100644 Modules/_testcapi/bytes.c create mode 100644 Modules/_testcapi/clinic/long.c.h create mode 100644 Modules/_testcapi/codec.c create mode 100644 Modules/_testcapi/complex.c create mode 100644 Modules/_testcapi/file.c create mode 100644 Modules/_testcapi/hash.c create mode 100644 Modules/_testcapi/list.c create mode 100644 Modules/_testcapi/monitoring.c create mode 100644 Modules/_testcapi/numbers.c create mode 100644 Modules/_testcapi/object.c create mode 100644 Modules/_testcapi/pyatomic.c create mode 100644 Modules/_testcapi/run.c create mode 100644 Modules/_testcapi/set.c create mode 100644 Modules/_testcapi/time.c create mode 100644 Modules/_testcapi/tuple.c create mode 100644 Modules/_testclinic_limited.c create mode 100644 Modules/_testexternalinspection.c create mode 100644 Modules/_testinternalcapi/README.txt create mode 100644 Modules/_testinternalcapi/clinic/test_lock.c.h create mode 100644 Modules/_testinternalcapi/parts.h rename Modules/{_testcapi => _testinternalcapi}/pytime.c (63%) create mode 100644 Modules/_testinternalcapi/set.c create mode 100644 Modules/_testinternalcapi/test_critical_sections.c create mode 100644 Modules/_testinternalcapi/test_lock.c create mode 100644 Modules/_testlimitedcapi.c create mode 100644 Modules/_testlimitedcapi/abstract.c create mode 100644 Modules/_testlimitedcapi/bytearray.c create mode 100644 Modules/_testlimitedcapi/bytes.c create mode 100644 Modules/_testlimitedcapi/clinic/long.c.h create mode 100644 Modules/_testlimitedcapi/clinic/vectorcall_limited.c.h create mode 100644 Modules/_testlimitedcapi/complex.c create mode 100644 Modules/_testlimitedcapi/dict.c create mode 100644 Modules/_testlimitedcapi/float.c rename Modules/{_testcapi => _testlimitedcapi}/heaptype_relative.c (97%) create mode 100644 Modules/_testlimitedcapi/list.c create mode 100644 Modules/_testlimitedcapi/long.c create mode 100644 Modules/_testlimitedcapi/object.c create mode 100644 Modules/_testlimitedcapi/parts.h rename Modules/{_testcapi => _testlimitedcapi}/pyos.c (97%) create mode 100644 Modules/_testlimitedcapi/set.c create mode 100644 Modules/_testlimitedcapi/sys.c rename Modules/{_testcapi => _testlimitedcapi}/testcapi_long.h (100%) create mode 100644 Modules/_testlimitedcapi/tuple.c create mode 100644 Modules/_testlimitedcapi/unicode.c create mode 100644 Modules/_testlimitedcapi/util.h rename Modules/{_testcapi => _testlimitedcapi}/vectorcall_limited.c (73%) delete mode 100644 Modules/_xxinterpchannelsmodule.c delete mode 100644 Modules/_xxsubinterpretersmodule.c create mode 100644 Modules/_xxtestfuzz/dictionaries/fuzz_elementtree_parsewhole.dict create mode 100644 Modules/_xxtestfuzz/dictionaries/fuzz_pycompile.dict create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nComment.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nPrefixQname.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nPrefixQnameXpathElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nQname.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nQnameElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nQnameXpathElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/c14nTrim.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/expat224_utf8_bug.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N1.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N2.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N3.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N4.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N5.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inC14N6.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsContent.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsPushdown.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsRedecl.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsSort.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsSuperfluous.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/inNsXml.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N1_c14nComment.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N1_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N2_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N2_c14nTrim.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N3_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N3_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N3_c14nTrim.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N4_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N4_c14nTrim.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N5_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N5_c14nTrim.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inC14N6_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsContent_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsContent_c14nPrefixQnameXpathElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsContent_c14nQnameElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsContent_c14nQnameXpathElem.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsDefault_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsDefault_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsPushdown_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsPushdown_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsRedecl_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsRedecl_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsSort_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsSort_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsSuperfluous_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsSuperfluous_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsXml_c14nDefault.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsXml_c14nPrefix.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsXml_c14nPrefixQname.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/out_inNsXml_c14nQname.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/simple-ns.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/simple.xml create mode 100644 Modules/_xxtestfuzz/fuzz_elementtree_parsewhole_corpus/test.xml create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input1.py create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input2.py create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input3.py create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input4.py create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input5.py create mode 100644 Modules/_xxtestfuzz/fuzz_pycompile_corpus/input6.py delete mode 100644 Modules/audioop.c delete mode 100644 Modules/clinic/_cryptmodule.c.h create mode 100644 Modules/clinic/_suggestions.c.h create mode 100644 Modules/clinic/_sysconfig.c.h create mode 100644 Modules/clinic/_testclinic_depr.c.h create mode 100644 Modules/clinic/_testclinic_limited.c.h delete mode 100644 Modules/clinic/audioop.c.h delete mode 100644 Modules/clinic/spwdmodule.c.h create mode 100644 Modules/clinic/timemodule.c.h create mode 100755 Modules/expat/refresh.sh delete mode 100644 Modules/nismodule.c delete mode 100644 Modules/ossaudiodev.c delete mode 100644 Modules/spwdmodule.c create mode 100644 Objects/clinic/setobject.c.h delete mode 100644 Objects/interpreteridobject.c create mode 100644 Objects/mimalloc/alloc-aligned.c create mode 100644 Objects/mimalloc/alloc-override.c create mode 100644 Objects/mimalloc/alloc-posix.c create mode 100644 Objects/mimalloc/alloc.c create mode 100644 Objects/mimalloc/arena.c create mode 100644 Objects/mimalloc/bitmap.c create mode 100644 Objects/mimalloc/bitmap.h create mode 100644 Objects/mimalloc/heap.c create mode 100644 Objects/mimalloc/init.c create mode 100644 Objects/mimalloc/options.c create mode 100644 Objects/mimalloc/os.c create mode 100644 Objects/mimalloc/page-queue.c create mode 100644 Objects/mimalloc/page.c create mode 100644 Objects/mimalloc/prim/osx/alloc-override-zone.c create mode 100644 Objects/mimalloc/prim/osx/prim.c create mode 100644 Objects/mimalloc/prim/prim.c create mode 100644 Objects/mimalloc/prim/readme.md create mode 100644 Objects/mimalloc/prim/unix/prim.c create mode 100644 Objects/mimalloc/prim/wasi/prim.c create mode 100644 Objects/mimalloc/prim/windows/etw-mimalloc.wprp create mode 100644 Objects/mimalloc/prim/windows/etw.h create mode 100644 Objects/mimalloc/prim/windows/etw.man create mode 100644 Objects/mimalloc/prim/windows/prim.c create mode 100644 Objects/mimalloc/prim/windows/readme.md create mode 100644 Objects/mimalloc/random.c create mode 100644 Objects/mimalloc/segment-map.c create mode 100644 Objects/mimalloc/segment.c create mode 100644 Objects/mimalloc/static.c create mode 100644 Objects/mimalloc/stats.c create mode 100644 Objects/object_layout_313.gv create mode 100644 Objects/object_layout_313.png create mode 100644 Objects/object_layout_full_313.gv create mode 100644 Objects/object_layout_full_313.png delete mode 100644 PC/_msi.c delete mode 100644 PC/clinic/_msi.c.h rename PC/{pyconfig.h => pyconfig.h.in} (94%) create mode 100644 PC/venvlauncher.c rename PCbuild/{_msi.vcxproj => _testclinic_limited.vcxproj} (90%) rename PCbuild/{_msi.vcxproj.filters => _testclinic_limited.vcxproj.filters} (72%) create mode 100644 PCbuild/_testlimitedcapi.vcxproj create mode 100644 PCbuild/_testlimitedcapi.vcxproj.filters delete mode 100644 PCbuild/tix.vcxproj create mode 100644 Parser/lexer/buffer.c create mode 100644 Parser/lexer/buffer.h create mode 100644 Parser/lexer/lexer.c create mode 100644 Parser/lexer/lexer.h create mode 100644 Parser/lexer/state.c rename Parser/{tokenizer.h => lexer/state.h} (79%) delete mode 100644 Parser/tokenizer.c create mode 100644 Parser/tokenizer/file_tokenizer.c create mode 100644 Parser/tokenizer/helpers.c create mode 100644 Parser/tokenizer/helpers.h create mode 100644 Parser/tokenizer/readline_tokenizer.c create mode 100644 Parser/tokenizer/string_tokenizer.c create mode 100644 Parser/tokenizer/tokenizer.h create mode 100644 Parser/tokenizer/utf8_tokenizer.c create mode 100644 Python/brc.c create mode 100644 Python/clinic/instruction_sequence.c.h create mode 100644 Python/config_common.h create mode 100644 Python/critical_section.c create mode 100644 Python/crossinterp.c create mode 100644 Python/crossinterp_data_lookup.h create mode 100644 Python/crossinterp_exceptions.h delete mode 100644 Python/deepfreeze/README.txt create mode 100644 Python/emscripten_trampoline.c create mode 100644 Python/executor_cases.c.h create mode 100644 Python/gc.c create mode 100644 Python/gc_free_threading.c create mode 100644 Python/gc_gil.c delete mode 100644 Python/importdl.h create mode 100644 Python/instruction_sequence.c create mode 100644 Python/interpconfig.c create mode 100644 Python/jit.c create mode 100644 Python/lock.c delete mode 100755 Python/makeopcodetargets.py create mode 100644 Python/object_stack.c delete mode 100644 Python/opcode_metadata.h create mode 100644 Python/optimizer.c create mode 100644 Python/optimizer_analysis.c create mode 100644 Python/optimizer_bytecodes.c create mode 100644 Python/optimizer_cases.c.h create mode 100644 Python/optimizer_symbols.c create mode 100644 Python/parking_lot.c create mode 100644 Python/perf_jit_trampoline.c create mode 100644 Python/qsbr.c create mode 100644 Python/tier2_engine.md create mode 100644 Python/vm-state.md delete mode 100644 Tools/build/generate_opcode_h.py create mode 100644 Tools/build/generate_sbom.py create mode 100644 Tools/build/mypy.ini create mode 100755 Tools/build/regen-configure.sh create mode 100644 Tools/cases_generator/_typing_backports.py create mode 100644 Tools/cases_generator/analyzer.py create mode 100644 Tools/cases_generator/cwriter.py delete mode 100644 Tools/cases_generator/generate_cases.py create mode 100644 Tools/cases_generator/generators_common.py create mode 100644 Tools/cases_generator/mypy.ini create mode 100644 Tools/cases_generator/opcode_id_generator.py create mode 100644 Tools/cases_generator/opcode_metadata_generator.py create mode 100644 Tools/cases_generator/optimizer_generator.py create mode 100644 Tools/cases_generator/parsing.py create mode 100644 Tools/cases_generator/py_metadata_generator.py create mode 100644 Tools/cases_generator/stack.py create mode 100644 Tools/cases_generator/target_generator.py delete mode 100644 Tools/cases_generator/test_generator.py create mode 100644 Tools/cases_generator/tier1_generator.py create mode 100644 Tools/cases_generator/tier2_generator.py create mode 100644 Tools/cases_generator/uop_id_generator.py create mode 100644 Tools/cases_generator/uop_metadata_generator.py delete mode 100644 Tools/ccbench/ccbench.py create mode 100644 Tools/clinic/.ruff.toml create mode 100644 Tools/clinic/libclinic/__init__.py create mode 100644 Tools/clinic/libclinic/app.py create mode 100644 Tools/clinic/libclinic/block_parser.py create mode 100644 Tools/clinic/libclinic/clanguage.py create mode 100644 Tools/clinic/libclinic/cli.py create mode 100644 Tools/clinic/libclinic/codegen.py create mode 100644 Tools/clinic/libclinic/converter.py create mode 100644 Tools/clinic/libclinic/converters.py rename Tools/clinic/{ => libclinic}/cpp.py (76%) create mode 100644 Tools/clinic/libclinic/dsl_parser.py create mode 100644 Tools/clinic/libclinic/errors.py create mode 100644 Tools/clinic/libclinic/formatting.py create mode 100644 Tools/clinic/libclinic/function.py create mode 100644 Tools/clinic/libclinic/identifiers.py create mode 100644 Tools/clinic/libclinic/language.py create mode 100644 Tools/clinic/libclinic/parse_args.py create mode 100644 Tools/clinic/libclinic/parser.py create mode 100644 Tools/clinic/libclinic/return_converters.py create mode 100644 Tools/clinic/libclinic/utils.py delete mode 100644 Tools/clinic/requirements-dev.txt delete mode 100644 Tools/iobench/iobench.py create mode 100644 Tools/jit/README.md create mode 100644 Tools/jit/_llvm.py create mode 100644 Tools/jit/_schema.py create mode 100644 Tools/jit/_stencils.py create mode 100644 Tools/jit/_targets.py create mode 100644 Tools/jit/_writer.py create mode 100644 Tools/jit/build.py create mode 100644 Tools/jit/ignore-tests-emulated-linux.txt create mode 100644 Tools/jit/mypy.ini create mode 100644 Tools/jit/template.c create mode 100644 Tools/jit/trampoline.c create mode 100644 Tools/lockbench/lockbench.py create mode 100644 Tools/msi/bundle/packagegroups/freethreaded.wxs create mode 100644 Tools/msi/freethreaded/freethreaded.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_d.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded_d.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_en-US.wxl_template create mode 100644 Tools/msi/freethreaded/freethreaded_files.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_pdb.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded_pdb.wxs delete mode 100644 Tools/peg_generator/data/cprog.py delete mode 100644 Tools/peg_generator/data/top-pypi-packages-365-days.json delete mode 100644 Tools/peg_generator/data/xxl.zip delete mode 100644 Tools/peg_generator/requirements.pip delete mode 100644 Tools/peg_generator/scripts/__init__.py delete mode 100644 Tools/peg_generator/scripts/ast_timings.py delete mode 100644 Tools/peg_generator/scripts/benchmark.py delete mode 100755 Tools/peg_generator/scripts/download_pypi_packages.py delete mode 100755 Tools/peg_generator/scripts/find_max_nesting.py delete mode 100755 Tools/peg_generator/scripts/grammar_grapher.py delete mode 100644 Tools/peg_generator/scripts/joinstats.py delete mode 100755 Tools/peg_generator/scripts/test_parse_directory.py delete mode 100755 Tools/peg_generator/scripts/test_pypi_packages.py create mode 100644 Tools/requirements-dev.txt delete mode 100755 Tools/scripts/2to3 delete mode 100644 Tools/scripts/run_tests.py create mode 100644 Tools/scripts/sortperf.py delete mode 100644 Tools/stringbench/README delete mode 100644 Tools/stringbench/stringbench.py create mode 100644 Tools/tsan/suppressions_free_threading.txt create mode 100644 Tools/tsan/supressions.txt create mode 100644 Tools/unicode/dawg.py create mode 100755 Tools/wasm/build_wasi.sh create mode 100644 Tools/wasm/mypy.ini create mode 100644 Tools/wasm/wasi.py create mode 100644 iOS/README.rst create mode 100644 iOS/Resources/Info.plist.in create mode 100755 iOS/Resources/bin/arm64-apple-ios-ar create mode 100755 iOS/Resources/bin/arm64-apple-ios-clang create mode 100755 iOS/Resources/bin/arm64-apple-ios-clang++ create mode 100755 iOS/Resources/bin/arm64-apple-ios-cpp create mode 100755 iOS/Resources/bin/arm64-apple-ios-simulator-ar create mode 100755 iOS/Resources/bin/arm64-apple-ios-simulator-clang create mode 100755 iOS/Resources/bin/arm64-apple-ios-simulator-clang++ create mode 100755 iOS/Resources/bin/arm64-apple-ios-simulator-cpp create mode 100755 iOS/Resources/bin/x86_64-apple-ios-simulator-ar create mode 100755 iOS/Resources/bin/x86_64-apple-ios-simulator-clang create mode 100755 iOS/Resources/bin/x86_64-apple-ios-simulator-clang++ create mode 100755 iOS/Resources/bin/x86_64-apple-ios-simulator-cpp create mode 100644 iOS/Resources/dylib-Info-template.plist create mode 100644 iOS/Resources/pyconfig.h create mode 100644 iOS/testbed/Python.xcframework/Info.plist create mode 100644 iOS/testbed/Python.xcframework/ios-arm64/README create mode 100644 iOS/testbed/Python.xcframework/ios-arm64_x86_64-simulator/README create mode 100644 iOS/testbed/iOSTestbed.xcodeproj/project.pbxproj create mode 100644 iOS/testbed/iOSTestbed/AppDelegate.h create mode 100644 iOS/testbed/iOSTestbed/AppDelegate.m create mode 100644 iOS/testbed/iOSTestbed/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 iOS/testbed/iOSTestbed/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iOS/testbed/iOSTestbed/Assets.xcassets/Contents.json create mode 100644 iOS/testbed/iOSTestbed/Base.lproj/LaunchScreen.storyboard create mode 100644 iOS/testbed/iOSTestbed/app/README create mode 100644 iOS/testbed/iOSTestbed/app_packages/README create mode 100644 iOS/testbed/iOSTestbed/dylib-Info-template.plist create mode 100644 iOS/testbed/iOSTestbed/iOSTestbed-Info.plist create mode 100644 iOS/testbed/iOSTestbed/main.m create mode 100644 iOS/testbed/iOSTestbedTests/iOSTestbedTests.m diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index b5b2765e..7490dd94 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -1,11 +1,11 @@ -trigger: ['main', '3.12', '3.11', '3.10', '3.9', '3.8', '3.7'] +trigger: ['main', '3.13', '3.12', '3.11', '3.10', '3.9', '3.8'] jobs: - job: Prebuild displayName: Pre-build checks pool: - vmImage: ubuntu-22.04 + vmImage: ubuntu-24.04 steps: - template: ./prebuild-checks.yml diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..b5d94317 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,24 @@ +[run] +branch = True + +[report] +# Regexes for lines to exclude from consideration +exclude_lines = + # Don't complain if non-runnable code isn't run: + if 0: + if __name__ == .__main__.: + raise AssertionError\( + + # Empty bodies in protocols or abstract methods + ^\s*def [a-zA-Z0-9_]+\(.*\)(\s*->.*)?:\s*\.\.\.(\s*#.*)?$ + ^\s*\.\.\.(\s*#.*)?$ + + .*# pragma: no cover + .*# pragma: no branch + + # Additions for IDLE: + .*# htest # + if not (_htest or _utest): + if not .*_utest: + if .*_htest: + diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index efbdcd40..ada5fb0f 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,12 +1,12 @@ -FROM docker.io/library/fedora:37 +FROM docker.io/library/fedora:40 ENV CC=clang -ENV WASI_SDK_VERSION=19 +ENV WASI_SDK_VERSION=24 ENV WASI_SDK_PATH=/opt/wasi-sdk ENV WASMTIME_HOME=/opt/wasmtime -ENV WASMTIME_VERSION=7.0.0 +ENV WASMTIME_VERSION=22.0.0 ENV WASMTIME_CPU_ARCH=x86_64 RUN dnf -y --nodocs --setopt=install_weak_deps=False install /usr/bin/{blurb,clang,curl,git,ln,tar,xz} 'dnf-command(builddep)' && \ @@ -14,7 +14,7 @@ RUN dnf -y --nodocs --setopt=install_weak_deps=False install /usr/bin/{blurb,cla dnf -y clean all RUN mkdir ${WASI_SDK_PATH} && \ - curl --location https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION}/wasi-sdk-${WASI_SDK_VERSION}.0-linux.tar.gz | \ + curl --location https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VERSION}/wasi-sdk-${WASI_SDK_VERSION}.0-x86_64-linux.tar.gz | \ tar --strip-components 1 --directory ${WASI_SDK_PATH} --extract --gunzip RUN mkdir --parents ${WASMTIME_HOME} && \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9fbaf7fd..0dc30301 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -9,7 +9,9 @@ "-y", "which", "zsh", - "fish" + "fish", + // For umask fix below. + "/usr/bin/setfacl" ], "updateContentCommand": { // Using the shell for `nproc` usage. @@ -22,6 +24,11 @@ "html" ] }, + "postCreateCommand": { + // https://github.com/orgs/community/discussions/26026 + "umask fix: workspace": ["sudo", "setfacl", "-bnR", "."], + "umask fix: /tmp": ["sudo", "setfacl", "-bnR", "/tmp"] + }, "customizations": { "vscode": { "extensions": [ @@ -31,10 +38,10 @@ "maelvalais.autoconf", // C auto-complete. "ms-vscode.cpptools", - // To view built docs. - "ms-vscode.live-server" - // https://github.com/microsoft/vscode-python/issues/18073 - // "ms-python.python" + // To view HTML build of docs. + "ms-vscode.live-server", + // Python auto-complete. + "ms-python.python" ], "settings": { "C_Cpp.default.compilerPath": "/usr/bin/clang", diff --git a/.editorconfig b/.editorconfig index 81445d2d..a6187d64 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,6 @@ root = true -[*.{py,c,cpp,h,rst,md,yml}] +[*.{py,c,cpp,h,js,rst,md,yml}] trim_trailing_whitespace = true insert_final_newline = true indent_style = space @@ -8,5 +8,8 @@ indent_style = space [*.{py,c,cpp,h}] indent_size = 4 -[*.yml] +[*.rst] +indent_size = 3 + +[*.{js,yml}] indent_size = 2 diff --git a/.gitattributes b/.gitattributes index 4ed95069..2f5a0309 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,18 +18,15 @@ *.zip binary # Specific binary files -Lib/test/sndhdrdata/sndhdr.* binary PC/classicAppCompat.* binary # Text files that should not be subject to eol conversion [attr]noeol -text Lib/test/cjkencodings/* noeol -Lib/test/coding20731.py noeol +Lib/test/tokenizedata/coding20731.py noeol Lib/test/decimaltestdata/*.decTest noeol Lib/test/test_email/data/*.txt noeol -Lib/test/test_importlib/resources/data01/* noeol -Lib/test/test_importlib/resources/namespacedata01/* noeol Lib/test/xmltestdata/* noeol # Shell scripts should have LF even on Windows because of Cygwin @@ -67,26 +64,38 @@ PCbuild/readme.txt dos [attr]generated linguist-generated=true diff=generated **/clinic/*.c.h generated +**/clinic/*.cpp.h generated +**/clinic/*.h.h generated *_db.h generated Doc/data/stable_abi.dat generated Doc/library/token-list.inc generated Include/internal/pycore_ast.h generated Include/internal/pycore_ast_state.h generated Include/internal/pycore_opcode.h generated +Include/internal/pycore_opcode_metadata.h generated Include/internal/pycore_*_generated.h generated +Include/internal/pycore_uop_ids.h generated +Include/internal/pycore_uop_metadata.h generated Include/opcode.h generated +Include/opcode_ids.h generated Include/token.h generated +Lib/_opcode_metadata.py generated Lib/keyword.py generated +Lib/test/certdata/*.pem generated +Lib/test/certdata/*.0 generated Lib/test/levenshtein_examples.json generated Lib/test/test_stable_abi_ctypes.py generated Lib/token.py generated +Misc/sbom.spdx.json generated Objects/typeslots.inc generated PC/python3dll.c generated Parser/parser.c generated Parser/token.c generated Programs/test_frozenmain.h generated Python/Python-ast.c generated +Python/executor_cases.c.h generated Python/generated_cases.c.h generated +Python/optimizer_cases.c.h generated Python/opcode_targets.h generated Python/stdlib_module_names.h generated Tools/peg_generator/pegen/grammar_parser.py generated diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 913de4e2..f71214f1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -21,6 +21,7 @@ configure* @erlend-aasland @corona10 **/*context* @1st1 **/*genobject* @markshannon **/*hamt* @1st1 +**/*jit* @brandtbucher Objects/set* @rhettinger Objects/dict* @methane @markshannon Objects/typevarobject.c @JelleZijlstra @@ -28,14 +29,47 @@ Objects/type* @markshannon Objects/codeobject.c @markshannon Objects/frameobject.c @markshannon Objects/call.c @markshannon -Python/ceval.c @markshannon +Python/ceval*.c @markshannon +Python/ceval*.h @markshannon Python/compile.c @markshannon @iritkatriel Python/assemble.c @markshannon @iritkatriel Python/flowgraph.c @markshannon @iritkatriel Python/ast_opt.c @isidentical +Python/bytecodes.c @markshannon +Python/optimizer*.c @markshannon +Python/optimizer_analysis.c @Fidget-Spinner +Python/optimizer_bytecodes.c @Fidget-Spinner Lib/test/test_patma.py @brandtbucher -Lib/test/test_peepholer.py @brandtbucher Lib/test/test_type_*.py @JelleZijlstra +Lib/test/test_capi/test_misc.py @markshannon +Tools/c-analyzer/ @ericsnowcurrently + +# dbm +**/*dbm* @corona10 @erlend-aasland @serhiy-storchaka + +# runtime state/lifecycle +**/*pylifecycle* @ericsnowcurrently +**/*pystate* @ericsnowcurrently +**/*preconfig* @ericsnowcurrently +**/*initconfig* @ericsnowcurrently +**/*pathconfig* @ericsnowcurrently +**/*sysmodule* @ericsnowcurrently +**/*bltinmodule* @ericsnowcurrently +**/*gil* @ericsnowcurrently +Include/internal/pycore_runtime.h @ericsnowcurrently +Include/internal/pycore_interp.h @ericsnowcurrently +Include/internal/pycore_tstate.h @ericsnowcurrently +Include/internal/pycore_*_state.h @ericsnowcurrently +Include/internal/pycore_*_init.h @ericsnowcurrently +Include/internal/pycore_atexit.h @ericsnowcurrently +Include/internal/pycore_freelist.h @ericsnowcurrently +Include/internal/pycore_global_objects.h @ericsnowcurrently +Include/internal/pycore_obmalloc.h @ericsnowcurrently +Include/internal/pycore_pymem.h @ericsnowcurrently +Modules/main.c @ericsnowcurrently +Programs/_bootstrap_python.c @ericsnowcurrently +Programs/python.c @ericsnowcurrently +Tools/build/generate_global_objects.py @ericsnowcurrently # Exceptions Lib/traceback.py @iritkatriel @@ -45,13 +79,13 @@ Objects/exceptions.c @iritkatriel Python/traceback.c @iritkatriel # Hashing -**/*hashlib* @tiran -**/*pyhash* @tiran -**/*sha* @tiran -**/*md5* @tiran -**/*blake* @tiran -/Modules/_blake2/** @tiran -/Modules/_sha3/** @tiran +**/*hashlib* @gpshead @tiran +**/*pyhash* @gpshead @tiran +**/sha* @gpshead @tiran +Modules/md5* @gpshead @tiran +**/*blake* @gpshead @tiran +Modules/_blake2/** @gpshead @tiran +Modules/_hacl/** @gpshead # logging **/*logging* @vsajip @@ -69,9 +103,23 @@ Python/traceback.c @iritkatriel /Tools/build/parse_html5_entities.py @ezio-melotti # Import (including importlib). -**/*import* @brettcannon @encukou @ericsnowcurrently @ncoghlan @warsaw -**/*importlib/resources/* @jaraco @warsaw @FFY00 -**/importlib/metadata/* @jaraco @warsaw +**/*import* @brettcannon @ericsnowcurrently @ncoghlan @warsaw +/Python/import.c @kumaraditya303 +Python/dynload_*.c @ericsnowcurrently +**/*freeze* @ericsnowcurrently +**/*frozen* @ericsnowcurrently +**/*modsupport* @ericsnowcurrently +**/*modulefinder* @ericsnowcurrently +**/*moduleobject* @ericsnowcurrently +**/*multiphase* @ericsnowcurrently +**/*pkgutil* @ericsnowcurrently +**/*pythonrun* @ericsnowcurrently +**/*runpy* @ericsnowcurrently +**/*singlephase* @ericsnowcurrently +Lib/test/test_module/ @ericsnowcurrently +Doc/c-api/module.rst @ericsnowcurrently +**/*importlib/resources/* @jaraco @warsaw @FFY00 +**/*importlib/metadata/* @jaraco @warsaw # Dates and times **/*datetime* @pganssle @abalkin @@ -80,7 +128,7 @@ Doc/library/time.rst @pganssle @abalkin Lib/test/test_time.py @pganssle @abalkin Modules/timemodule.c @pganssle @abalkin Python/pytime.c @pganssle @abalkin -Include/pytime.h @pganssle @abalkin +Include/internal/pycore_time.h @pganssle @abalkin # Email and related **/*mail* @python/email-team @@ -98,6 +146,11 @@ Include/pytime.h @pganssle @abalkin /Tools/peg_generator/ @pablogsal @lysnikolaou /Lib/test/test_peg_generator/ @pablogsal @lysnikolaou /Grammar/python.gram @pablogsal @lysnikolaou +/Lib/tokenize.py @pablogsal @lysnikolaou +/Lib/test/test_tokenize.py @pablogsal @lysnikolaou + +# Code generator +/Tools/cases_generator/ @markshannon # AST Python/ast.c @isidentical @@ -109,6 +162,9 @@ Lib/ast.py @isidentical /Lib/unittest/mock.py @cjw296 /Lib/test/test_unittest/testmock/* @cjw296 +# multiprocessing +**/*multiprocessing* @gpshead + # SQLite 3 **/*sqlite* @berkerpeksag @erlend-aasland @@ -117,6 +173,12 @@ Lib/ast.py @isidentical /Lib/test/test_subprocess.py @gpshead /Modules/*subprocess* @gpshead +# Limited C API & stable ABI +Tools/build/stable_abi.py @encukou +Misc/stable_abi.toml @encukou +Doc/data/*.abi @encukou +Doc/c-api/stable.rst @encukou + # Windows /PC/ @python/windows-team /PCbuild/ @python/windows-team @@ -140,9 +202,12 @@ Lib/ast.py @isidentical **/*dataclasses* @ericvsmith +**/*ensurepip* @pfmoore @pradyunsg + **/*idlelib* @terryjreedy +/Doc/library/idle.rst @terryjreedy -**/*typing* @gvanrossum @Fidget-Spinner @JelleZijlstra @AlexWaygood +**/*typing* @JelleZijlstra @AlexWaygood **/*ftplib @giampaolo **/*shutil @giampaolo @@ -166,3 +231,39 @@ Lib/ast.py @isidentical # zipfile.Path **/*zipfile/_path/* @jaraco + +# Argument Clinic +/Tools/clinic/** @erlend-aasland +/Lib/test/test_clinic.py @erlend-aasland +Doc/howto/clinic.rst @erlend-aasland + +# Subinterpreters +**/*interpreteridobject.* @ericsnowcurrently +**/*crossinterp* @ericsnowcurrently +Lib/test/support/interpreters/ @ericsnowcurrently +Modules/_interp*module.c @ericsnowcurrently +Lib/test/test_interpreters/ @ericsnowcurrently + +# Android +**/*Android* @mhsmith +**/*android* @mhsmith + +# iOS (but not termios) +**/iOS* @freakboy3742 +**/ios* @freakboy3742 +**/*_iOS* @freakboy3742 +**/*_ios* @freakboy3742 +**/*-iOS* @freakboy3742 +**/*-ios* @freakboy3742 + +# WebAssembly +/Tools/wasm/ @brettcannon + +# SBOM +/Misc/externals.spdx.json @sethmlarson +/Misc/sbom.spdx.json @sethmlarson +/Tools/build/generate_sbom.py @sethmlarson + +# Config Parser +Lib/configparser.py @jaraco +Lib/test/test_configparser.py @jaraco diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index 1d93e073..00000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Bug report -about: Submit a bug report -labels: "type-bug" ---- - - - -# Bug report - -A clear and concise description of what the bug is. -Include a minimal, reproducible example (https://stackoverflow.com/help/minimal-reproducible-example), if possible. - -# Your environment - - - -- CPython versions tested on: -- Operating system and architecture: - - diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 00000000..395516f2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,56 @@ +name: Bug report +description: Submit a bug report +labels: ["type-bug"] +body: + - type: markdown + attributes: + value: | + **New to Python?** + + For help or advice on using Python, try one of the following options instead of opening a GitHub issue: + + - Asking on [Discourse](https://discuss.python.org/c/users/7) or [Stack Overflow](https://stackoverflow.com) + - Reading the [Python tutorial](https://docs.python.org/3/tutorial/) + - Emailing [python-list](https://mail.python.org/mailman/listinfo/python-list) + + Make sure to also search the [CPython issue tracker](https://github.com/python/cpython/issues?q=is%3Aissue+sort%3Acreated-desc) to check that the bug has not already been reported. + - type: textarea + attributes: + label: "Bug description:" + description: > + Give a clear and concise description of what happened. + Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. + [Copy and paste code where possible rather than using screenshots](https://meta.stackoverflow.com/a/285557/13990016), + and put any code blocks inside triple backticks. + + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true + - type: dropdown + attributes: + label: "CPython versions tested on:" + multiple: true + options: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "CPython main branch" + validations: + required: true + - type: dropdown + attributes: + label: "Operating systems tested on:" + multiple: true + options: + - Linux + - macOS + - Windows + - Other + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/crash.md b/.github/ISSUE_TEMPLATE/crash.md deleted file mode 100644 index dad3423d..00000000 --- a/.github/ISSUE_TEMPLATE/crash.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: Crash report -about: A hard crash of the interpreter, possibly with a core dump -labels: "type-crash" ---- - - - -# Crash report - -Tell us what happened, ideally including a minimal, reproducible example (https://stackoverflow.com/help/minimal-reproducible-example). - -# Error messages - -Enter any relevant error message caused by the crash, including a core dump if there is one. - -# Your environment - - - -- CPython versions tested on: -- Operating system and architecture: - - diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml new file mode 100644 index 00000000..c14d7cf2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -0,0 +1,54 @@ +name: Crash report +description: A hard crash of the interpreter, possibly with a core dump +labels: ["type-crash"] +body: + - type: markdown + attributes: + value: | + This form is for hard crashes of the Python interpreter, segmentation faults, failed C-level assertions, and similar. Unexpected exceptions raised from Python functions in the standard library count as bugs rather than crashes. + + The CPython interpreter is written in a different programming language, C. A "CPython crash" is when Python itself fails, leading to a traceback in the C stack. + - type: textarea + attributes: + label: What happened? + description: > + Include a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) if possible. + [Copy and paste code where possible rather than using screenshots](https://meta.stackoverflow.com/a/285557/13990016), + and put any code blocks inside triple backticks. + + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true + - type: dropdown + attributes: + label: "CPython versions tested on:" + multiple: true + options: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" + - "CPython main branch" + validations: + required: true + - type: dropdown + attributes: + label: "Operating systems tested on:" + multiple: true + options: + - Linux + - macOS + - Windows + - Other + validations: + required: false + - type: input + attributes: + label: "Output from running 'python -VV' on the command line:" + description: If you tested with multiple operating systems or architectures, feel free to provide details in the main bug description. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md deleted file mode 100644 index ed051e94..00000000 --- a/.github/ISSUE_TEMPLATE/feature.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Feature or enhancement -about: Submit a proposal for a new CPython feature or enhancement -labels: "type-feature" ---- - -# Feature or enhancement - -(A clear and concise description of your proposal.) - -# Pitch - -(Explain why this feature or enhancement should be implemented and how it would be used. - Add examples, if applicable.) - -# Previous discussion - - - - - diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 00000000..4361ab2b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,40 @@ +name: Feature or enhancement +description: Submit a proposal for a new CPython feature or enhancement +labels: ["type-feature"] +body: + - type: markdown + attributes: + value: | + # Proposing a feature to CPython? + + You'll need to demonstrate widespread support for your idea among the community. + + Major feature proposals should generally be discussed on [Discourse](https://discuss.python.org/c/ideas/6) before opening a GitHub issue. Wait until it's clear that most people support your idea before filling in this form. + - type: textarea + attributes: + label: "Proposal:" + description: > + Explain your proposal, why it should be implemented, and how it would be used. + Add examples, if applicable. + Put any code blocks inside triple backticks. + value: | + ```python + # Add a code block here, if required + ``` + validations: + required: true + - type: dropdown + attributes: + label: Has this already been discussed elsewhere? + options: + - No response given + - I have already discussed this feature proposal on Discourse + - This is a minor feature, which does not need previous discussion elsewhere + multiple: false + validations: + required: true + - type: textarea + attributes: + label: "Links to previous discussion of this feature:" + validations: + required: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f026b0f5..c8a3165d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,7 +13,7 @@ updates: - "version-update:semver-minor" - "version-update:semver-patch" - package-ecosystem: "pip" - directory: "/Tools/clinic/" + directory: "/Tools/" schedule: interval: "monthly" labels: diff --git a/.github/workflows/add-issue-header.yml b/.github/workflows/add-issue-header.yml new file mode 100644 index 00000000..570b8779 --- /dev/null +++ b/.github/workflows/add-issue-header.yml @@ -0,0 +1,53 @@ +name: Add issue header +# Automatically edits an issue's descriptions with a header, +# one of: +# +# - Bug report +# - Crash report +# - Feature or enhancement + +on: + issues: + types: + # Only ever run once + - opened + + +jobs: + add-header: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: actions/github-script@v7 + with: + # language=JavaScript + script: | + // https://devguide.python.org/triage/labels/#type-labels + const HEADERS = new Map([ + ['type-bug', 'Bug report'], + ['type-crash', 'Crash report'], + ['type-feature', 'Feature or enhancement'], + ]); + let issue_data = await github.rest.issues.get({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo + }).then(issue => issue.data); + let header = ''; + for (const label_data of issue_data.labels) { + const label_name = (typeof label_data === 'string') ? label_data : label_data.name; + if (HEADERS.has(label_name)) { + header = HEADERS.get(label_name); + break; + } + } + if (header !== '') { + console.log(`Setting new header: ${header}`); + await github.rest.issues.update({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `# ${header}\n\n${issue_data.body.replaceAll('\r', '')}` + }); + } diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index af674de2..3649ae6c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,28 +1,15 @@ name: Tests -# gh-84728: "paths-ignore" is not used to skip documentation-only PRs, because -# it prevents to mark a job as mandatory. A PR cannot be merged if a job is -# mandatory but not scheduled because of "paths-ignore". on: workflow_dispatch: push: branches: - 'main' - - '3.12' - - '3.11' - - '3.10' - - '3.9' - - '3.8' - - '3.7' + - '3.*' pull_request: branches: - 'main' - - '3.12' - - '3.11' - - '3.10' - - '3.9' - - '3.8' - - '3.7' + - '3.*' permissions: contents: read @@ -33,70 +20,19 @@ concurrency: jobs: check_source: - name: 'Check for source changes' - runs-on: ubuntu-latest - timeout-minutes: 10 - outputs: - run-docs: ${{ steps.docs-changes.outputs.run-docs || false }} - run_tests: ${{ steps.check.outputs.run_tests }} - run_hypothesis: ${{ steps.check.outputs.run_hypothesis }} - config_hash: ${{ steps.config_hash.outputs.hash }} - steps: - - uses: actions/checkout@v4 - - name: Check for source changes - id: check - run: | - if [ -z "$GITHUB_BASE_REF" ]; then - echo "run_tests=true" >> $GITHUB_OUTPUT - else - git fetch origin $GITHUB_BASE_REF --depth=1 - # git diff "origin/$GITHUB_BASE_REF..." (3 dots) may be more - # reliable than git diff "origin/$GITHUB_BASE_REF.." (2 dots), - # but it requires to download more commits (this job uses - # "git fetch --depth=1"). - # - # git diff "origin/$GITHUB_BASE_REF..." (3 dots) works with Git - # 2.26, but Git 2.28 is stricter and fails with "no merge base". - # - # git diff "origin/$GITHUB_BASE_REF.." (2 dots) should be enough on - # GitHub, since GitHub starts by merging origin/$GITHUB_BASE_REF - # into the PR branch anyway. - # - # https://github.com/python/core-workflow/issues/373 - git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc|^\.pre-commit-config\.yaml$|\.ruff\.toml$)' && echo "run_tests=true" >> $GITHUB_OUTPUT || true - fi - - # Check if we should run hypothesis tests - GIT_BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}} - echo $GIT_BRANCH - if $(echo "$GIT_BRANCH" | grep -q -w '3\.\(8\|9\|10\|11\)'); then - echo "Branch too old for hypothesis tests" - echo "run_hypothesis=false" >> $GITHUB_OUTPUT - else - echo "Run hypothesis tests" - echo "run_hypothesis=true" >> $GITHUB_OUTPUT - fi - - name: Compute hash for config cache key - id: config_hash - run: | - echo "hash=${{ hashFiles('configure', 'configure.ac', '.github/workflows/build.yml') }}" >> $GITHUB_OUTPUT - - name: Get a list of the changed documentation-related files - if: github.event_name == 'pull_request' - id: changed-docs-files - uses: Ana06/get-changed-files@v2.2.0 - with: - filter: | - Doc/** - Misc/** - .github/workflows/reusable-docs.yml - format: csv # works for paths with spaces - - name: Check for docs changes - if: >- - github.event_name == 'pull_request' - && steps.changed-docs-files.outputs.added_modified_renamed != '' - id: docs-changes - run: | - echo "run-docs=true" >> "${GITHUB_OUTPUT}" + name: Change detection + # To use boolean outputs from this job, parse them as JSON. + # Here's some examples: + # + # if: fromJSON(needs.check_source.outputs.run-docs) + # + # ${{ + # fromJSON(needs.check_source.outputs.run_tests) + # && 'truthy-branch' + # || 'falsy-branch' + # }} + # + uses: ./.github/workflows/reusable-change-detection.yml check-docs: name: Docs @@ -106,12 +42,12 @@ jobs: check_abi: name: 'Check if the ABI has changed' - runs-on: ubuntu-22.04 + runs-on: ubuntu-22.04 # 24.04 causes spurious errors needs: check_source if: needs.check_source.outputs.run_tests == 'true' steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 - name: Install dependencies run: | sudo ./.github/workflows/posix-deps-apt.sh @@ -132,7 +68,7 @@ jobs: echo "" echo "The up to date ABI file should be attached to this build as an artifact." echo "" - echo "To learn more about this check: https://devguide.python.org/setup/#regenerate-the-abi-dump" + echo "To learn more about this check: https://devguide.python.org/getting-started/setup-building/index.html#regenerate-the-abi-dump" echo "" exit 1 fi @@ -140,54 +76,94 @@ jobs: if: ${{ failure() && steps.check.conclusion == 'failure' }} run: | make regen-abidump - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 name: Publish updated ABI files if: ${{ failure() && steps.check.conclusion == 'failure' }} with: name: abi-data path: ./Doc/data/*.abi + check_autoconf_regen: + name: 'Check if Autoconf files are up to date' + # Don't use ubuntu-latest but a specific version to make the job + # reproducible: to get the same tools versions (autoconf, aclocal, ...) + runs-on: ubuntu-24.04 + container: + image: ghcr.io/python/autoconf:2024.10.16.11360930377 + timeout-minutes: 60 + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + steps: + - name: Install Git + run: | + apt update && apt install git -yq + git config --global --add safe.directory "$GITHUB_WORKSPACE" + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV + - name: Check Autoconf and aclocal versions + run: | + grep "Generated by GNU Autoconf 2.71" configure + grep "aclocal 1.16.5" aclocal.m4 + grep -q "runstatedir" configure + grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4 + - name: Regenerate autoconf files + # Same command used by Tools/build/regen-configure.sh ($AUTORECONF) + run: autoreconf -ivf -Werror + - name: Check for changes + run: | + git add -u + changes=$(git status --porcelain) + # Check for changes in regenerated files + if test -n "$changes"; then + echo "Generated files not up to date." + echo "Perhaps you forgot to run make regen-configure ;)" + echo "configure files must be regenerated with a specific version of autoconf." + echo "$changes" + echo "" + git diff --staged || true + exit 1 + fi + check_generated_files: name: 'Check if generated files are up to date' - runs-on: ubuntu-latest + # Don't use ubuntu-latest but a specific version to make the job + # reproducible: to get the same tools versions (autoconf, aclocal, ...) + runs-on: ubuntu-24.04 timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' steps: - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV - name: Restore config.cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} - - uses: actions/setup-python@v4 - with: - python-version: '3.x' + # Include env.pythonLocation in key to avoid changes in environment when setup-python updates Python + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }}-${{ env.pythonLocation }} - name: Install Dependencies run: sudo ./.github/workflows/posix-deps-apt.sh - name: Add ccache to PATH run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - name: Configure ccache action uses: hendrikmuhs/ccache-action@v1.2 - - name: Check Autoconf and aclocal versions - run: | - grep "Generated by GNU Autoconf 2.71" configure - grep "aclocal 1.16.4" aclocal.m4 - grep -q "runstatedir" configure - grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4 + with: + save: false - name: Configure CPython run: | # Build Python with the libpython dynamic library ./configure --config-cache --with-pydebug --enable-shared - - name: Regenerate autoconf files with container image - run: make regen-configure - name: Build CPython run: | - # Deepfreeze will usually cause global objects to be added or removed, - # so we run it before regen-global-objects gets rum (in regen-all). - make regen-deepfreeze make -j4 regen-all - make regen-stdlib-module-names + make regen-stdlib-module-names regen-sbom - name: Check for changes run: | git add -u @@ -210,170 +186,114 @@ jobs: if: github.event_name == 'pull_request' # $GITHUB_EVENT_NAME run: make check-c-globals - build_win32: - name: 'Windows (x86)' - runs-on: windows-latest - timeout-minutes: 60 - needs: check_source - if: needs.check_source.outputs.run_tests == 'true' - env: - IncludeUwp: 'true' - steps: - - uses: actions/checkout@v4 - - name: Build CPython - run: .\PCbuild\build.bat -e -d -p Win32 - - name: Display build info - run: .\python.bat -m test.pythoninfo - - name: Tests - run: .\PCbuild\rt.bat -p Win32 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 - - build_win_amd64: - name: 'Windows (x64)' - runs-on: windows-latest - timeout-minutes: 60 + build_windows: + name: >- + Windows + ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} needs: check_source - if: needs.check_source.outputs.run_tests == 'true' - env: - IncludeUwp: 'true' - steps: - - uses: actions/checkout@v4 - - name: Register MSVC problem matcher - run: echo "::add-matcher::.github/problem-matchers/msvc.json" - - name: Build CPython - run: .\PCbuild\build.bat -e -d -p x64 - - name: Display build info - run: .\python.bat -m test.pythoninfo - - name: Tests - run: .\PCbuild\rt.bat -p x64 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 + if: fromJSON(needs.check_source.outputs.run_tests) + strategy: + fail-fast: false + matrix: + os: + - windows-latest + arch: + - x64 + free-threading: + - false + - true + include: + - os: windows-latest # FIXME(diegorusso): change to os: windows-aarch64 + arch: arm64 + free-threading: false + - os: windows-latest # FIXME(diegorusso): change to os: windows-aarch64 + arch: arm64 + free-threading: true + - os: windows-latest + arch: Win32 + free-threading: false + uses: ./.github/workflows/reusable-windows.yml + with: + os: ${{ matrix.os }} + arch: ${{ matrix.arch }} + free-threading: ${{ matrix.free-threading }} - build_win_arm64: - name: 'Windows (arm64)' - runs-on: windows-latest - timeout-minutes: 60 + build_windows_msi: + name: >- # ${{ '' } is a hack to nest jobs under the same sidebar category + Windows MSI${{ '' }} needs: check_source - if: needs.check_source.outputs.run_tests == 'true' - env: - IncludeUwp: 'true' - steps: - - uses: actions/checkout@v4 - - name: Register MSVC problem matcher - run: echo "::add-matcher::.github/problem-matchers/msvc.json" - - name: Build CPython - run: .\PCbuild\build.bat -e -d -p arm64 + if: fromJSON(needs.check_source.outputs.run-win-msi) + strategy: + matrix: + arch: + - x86 + - x64 + - arm64 + uses: ./.github/workflows/reusable-windows-msi.yml + with: + arch: ${{ matrix.arch }} build_macos: - name: 'macOS' - runs-on: macos-latest - timeout-minutes: 60 + name: >- + macOS + ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} needs: check_source if: needs.check_source.outputs.run_tests == 'true' - env: - HOMEBREW_NO_ANALYTICS: 1 - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - PYTHONSTRICTEXTENSIONBUILD: 1 - steps: - - uses: actions/checkout@v4 - - name: Restore config.cache - uses: actions/cache@v3 - with: - path: config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} - - name: Install Homebrew dependencies - run: brew install pkg-config openssl@3.0 xz gdbm tcl-tk - - name: Configure CPython - run: | - GDBM_CFLAGS="-I$(brew --prefix gdbm)/include" \ - GDBM_LIBS="-L$(brew --prefix gdbm)/lib -lgdbm" \ - ./configure \ - --config-cache \ - --with-pydebug \ - --prefix=/opt/python-dev \ - --with-openssl="$(brew --prefix openssl@3.0)" - - name: Build CPython - run: make -j4 - - name: Display build info - run: make pythoninfo - - name: Tests - run: make buildbottest TESTOPTS="-j4 -uall,-cpu" + strategy: + fail-fast: false + matrix: + # Cirrus and macos-14 are M1, macos-13 is default GHA Intel. + # macOS 13 only runs tests against the GIL-enabled CPython. + # Cirrus used for upstream, macos-14 for forks. + os: + - ghcr.io/cirruslabs/macos-runner:sonoma + - macos-14 + - macos-13 + is-fork: # only used for the exclusion trick + - ${{ github.repository_owner != 'python' }} + free-threading: + - false + - true + exclude: + - os: ghcr.io/cirruslabs/macos-runner:sonoma + is-fork: true + - os: macos-14 + is-fork: false + - os: macos-13 + free-threading: true + uses: ./.github/workflows/reusable-macos.yml + with: + config_hash: ${{ needs.check_source.outputs.config_hash }} + free-threading: ${{ matrix.free-threading }} + os: ${{ matrix.os }} build_ubuntu: - name: 'Ubuntu' - runs-on: ubuntu-20.04 - timeout-minutes: 60 + name: >- + Ubuntu + ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} needs: check_source if: needs.check_source.outputs.run_tests == 'true' - env: - OPENSSL_VER: 3.0.11 - PYTHONSTRICTEXTENSIONBUILD: 1 - steps: - - uses: actions/checkout@v4 - - name: Register gcc problem matcher - run: echo "::add-matcher::.github/problem-matchers/gcc.json" - - name: Install Dependencies - run: sudo ./.github/workflows/posix-deps-apt.sh - - name: Configure OpenSSL env vars - run: | - echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV - echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV - echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - - name: 'Restore OpenSSL build' - id: cache-openssl - uses: actions/cache@v3 - with: - path: ./multissl/openssl/${{ env.OPENSSL_VER }} - key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} - - name: Install OpenSSL - if: steps.cache-openssl.outputs.cache-hit != 'true' - run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux - - name: Add ccache to PATH - run: | - echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - - name: Configure ccache action - uses: hendrikmuhs/ccache-action@v1.2 - - name: Setup directory envs for out-of-tree builds - run: | - echo "CPYTHON_RO_SRCDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-ro-srcdir)" >> $GITHUB_ENV - echo "CPYTHON_BUILDDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-builddir)" >> $GITHUB_ENV - - name: Create directories for read-only out-of-tree builds - run: mkdir -p $CPYTHON_RO_SRCDIR $CPYTHON_BUILDDIR - - name: Bind mount sources read-only - run: sudo mount --bind -o ro $GITHUB_WORKSPACE $CPYTHON_RO_SRCDIR - - name: Restore config.cache - uses: actions/cache@v3 - with: - path: ${{ env.CPYTHON_BUILDDIR }}/config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} - - name: Configure CPython out-of-tree - working-directory: ${{ env.CPYTHON_BUILDDIR }} - run: | - ../cpython-ro-srcdir/configure \ - --config-cache \ - --with-pydebug \ - --with-openssl=$OPENSSL_DIR - - name: Build CPython out-of-tree - working-directory: ${{ env.CPYTHON_BUILDDIR }} - run: make -j4 - - name: Display build info - working-directory: ${{ env.CPYTHON_BUILDDIR }} - run: make pythoninfo - - name: Remount sources writable for tests - # some tests write to srcdir, lack of pyc files slows down testing - run: sudo mount $CPYTHON_RO_SRCDIR -oremount,rw - - name: Tests - working-directory: ${{ env.CPYTHON_BUILDDIR }} - run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" + strategy: + matrix: + free-threading: + - false + - true + uses: ./.github/workflows/reusable-ubuntu.yml + with: + config_hash: ${{ needs.check_source.outputs.config_hash }} + free-threading: ${{ matrix.free-threading }} build_ubuntu_ssltests: name: 'Ubuntu SSL tests with OpenSSL' - runs-on: ubuntu-20.04 + runs-on: ${{ matrix.os }} timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' strategy: fail-fast: false matrix: - openssl_ver: [1.1.1w, 3.0.11, 3.1.3] + os: [ubuntu-24.04] + openssl_ver: [3.0.15, 3.1.7, 3.2.3, 3.3.2] env: OPENSSL_VER: ${{ matrix.openssl_ver }} MULTISSL_DIR: ${{ github.workspace }}/multissl @@ -381,11 +301,13 @@ jobs: LD_LIBRARY_PATH: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}/lib steps: - uses: actions/checkout@v4 + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV - name: Restore config.cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }} - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install Dependencies @@ -397,10 +319,10 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} - key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + key: ${{ matrix.os }}-multissl-openssl-${{ env.OPENSSL_VER }} - name: Install OpenSSL if: steps.cache-openssl.outputs.cache-hit != 'true' run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux @@ -409,6 +331,8 @@ jobs: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - name: Configure ccache action uses: hendrikmuhs/ccache-action@v1.2 + with: + save: false - name: Configure CPython run: ./configure --config-cache --with-pydebug --with-openssl=$OPENSSL_DIR - name: Build CPython @@ -418,14 +342,22 @@ jobs: - name: SSL tests run: ./python Lib/test/ssltests.py + build_wasi: + name: 'WASI' + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + uses: ./.github/workflows/reusable-wasi.yml + with: + config_hash: ${{ needs.check_source.outputs.config_hash }} + test_hypothesis: name: "Hypothesis tests on Ubuntu" - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' && needs.check_source.outputs.run_hypothesis == 'true' env: - OPENSSL_VER: 3.0.11 + OPENSSL_VER: 3.0.15 PYTHONSTRICTEXTENSIONBUILD: 1 steps: - uses: actions/checkout@v4 @@ -440,7 +372,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -452,6 +384,8 @@ jobs: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - name: Configure ccache action uses: hendrikmuhs/ccache-action@v1.2 + with: + save: false - name: Setup directory envs for out-of-tree builds run: | echo "CPYTHON_RO_SRCDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-ro-srcdir)" >> $GITHUB_ENV @@ -460,11 +394,13 @@ jobs: run: mkdir -p $CPYTHON_RO_SRCDIR $CPYTHON_BUILDDIR - name: Bind mount sources read-only run: sudo mount --bind -o ro $GITHUB_WORKSPACE $CPYTHON_RO_SRCDIR + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV - name: Restore config.cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ env.CPYTHON_BUILDDIR }}/config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }} - name: Configure CPython out-of-tree working-directory: ${{ env.CPYTHON_BUILDDIR }} run: | @@ -494,12 +430,12 @@ jobs: ./python -m venv $VENV_LOC && $VENV_PYTHON -m pip install -r ${GITHUB_WORKSPACE}/Tools/requirements-hypothesis.txt - name: 'Restore Hypothesis database' id: cache-hypothesis-database - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ./hypothesis key: hypothesis-database-${{ github.head_ref || github.run_id }} restore-keys: | - - hypothesis-database- + hypothesis-database- - name: "Run tests" working-directory: ${{ env.CPYTHON_BUILDDIR }} run: | @@ -520,7 +456,7 @@ jobs: -x test_subprocess \ -x test_signal \ -x test_sysconfig - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: always() with: name: hypothesis-example-db @@ -529,21 +465,26 @@ jobs: build_asan: name: 'Address sanitizer' - runs-on: ubuntu-20.04 + runs-on: ${{ matrix.os }} timeout-minutes: 60 needs: check_source if: needs.check_source.outputs.run_tests == 'true' + strategy: + matrix: + os: [ubuntu-24.04] env: - OPENSSL_VER: 3.0.11 + OPENSSL_VER: 3.0.15 PYTHONSTRICTEXTENSIONBUILD: 1 ASAN_OPTIONS: detect_leaks=0:allocator_may_return_null=1:handle_segv=0 steps: - uses: actions/checkout@v4 + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV - name: Restore config.cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: config.cache - key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }} + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }} - name: Register gcc problem matcher run: echo "::add-matcher::.github/problem-matchers/gcc.json" - name: Install Dependencies @@ -559,10 +500,10 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} - key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + key: ${{ matrix.os }}-multissl-openssl-${{ env.OPENSSL_VER }} - name: Install OpenSSL if: steps.cache-openssl.outputs.cache-hit != 'true' run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux @@ -571,6 +512,9 @@ jobs: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV - name: Configure ccache action uses: hendrikmuhs/ccache-action@v1.2 + with: + save: ${{ github.event_name == 'push' }} + max-size: "200M" - name: Configure CPython run: ./configure --config-cache --with-address-sanitizer --without-pymalloc - name: Build CPython @@ -578,7 +522,69 @@ jobs: - name: Display build info run: make pythoninfo - name: Tests - run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu" + run: xvfb-run make test + + build_tsan: + name: 'Thread sanitizer' + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + uses: ./.github/workflows/reusable-tsan.yml + with: + config_hash: ${{ needs.check_source.outputs.config_hash }} + options: ./configure --config-cache --with-thread-sanitizer --with-pydebug + suppressions_path: Tools/tsan/supressions.txt + tsan_logs_artifact_name: tsan-logs-default + + build_tsan_free_threading: + name: 'Thread sanitizer (free-threading)' + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + uses: ./.github/workflows/reusable-tsan.yml + with: + config_hash: ${{ needs.check_source.outputs.config_hash }} + options: ./configure --config-cache --disable-gil --with-thread-sanitizer --with-pydebug + suppressions_path: Tools/tsan/suppressions_free_threading.txt + tsan_logs_artifact_name: tsan-logs-free-threading + + # CIFuzz job based on https://google.github.io/oss-fuzz/getting-started/continuous-integration/ + cifuzz: + name: CIFuzz + runs-on: ubuntu-latest + timeout-minutes: 60 + needs: check_source + if: needs.check_source.outputs.run_cifuzz == 'true' + permissions: + security-events: write + strategy: + fail-fast: false + matrix: + sanitizer: [address, undefined, memory] + steps: + - name: Build fuzzers (${{ matrix.sanitizer }}) + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: cpython3 + sanitizer: ${{ matrix.sanitizer }} + - name: Run fuzzers (${{ matrix.sanitizer }}) + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + fuzz-seconds: 600 + oss-fuzz-project-name: cpython3 + output-sarif: true + sanitizer: ${{ matrix.sanitizer }} + - name: Upload crash + uses: actions/upload-artifact@v4 + if: failure() && steps.build.outcome == 'success' + with: + name: ${{ matrix.sanitizer }}-artifacts + path: ./out/artifacts + - name: Upload SARIF + if: always() && steps.build.outcome == 'success' + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: cifuzz-sarif/results.sarif + checkout_path: cifuzz-sarif all-required-green: # This job does nothing and is only used for the branch protection name: All required checks pass @@ -587,15 +593,19 @@ jobs: needs: - check_source # Transitive dependency, needed to access `run_tests` value - check-docs + - check_autoconf_regen - check_generated_files - - build_win32 - - build_win_amd64 - - build_win_arm64 - build_macos - build_ubuntu - build_ubuntu_ssltests + - build_wasi + - build_windows + - build_windows_msi - test_hypothesis - build_asan + - build_tsan + - build_tsan_free_threading + - cifuzz runs-on: ubuntu-latest @@ -604,10 +614,9 @@ jobs: uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe with: allowed-failures: >- - build_macos, build_ubuntu_ssltests, - build_win32, - build_win_arm64, + build_windows_msi, + cifuzz, test_hypothesis, allowed-skips: >- ${{ @@ -620,14 +629,23 @@ jobs: ${{ needs.check_source.outputs.run_tests != 'true' && ' + check_autoconf_regen, check_generated_files, - build_win32, - build_win_amd64, - build_win_arm64, build_macos, build_ubuntu, build_ubuntu_ssltests, + build_wasi, + build_windows, build_asan, + build_tsan, + build_tsan_free_threading, + ' + || '' + }} + ${{ + !fromJSON(needs.check_source.outputs.run_cifuzz) + && ' + cifuzz, ' || '' }} diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml deleted file mode 100644 index 29282dff..00000000 --- a/.github/workflows/build_msi.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: TestsMSI - -on: - workflow_dispatch: - push: - branches: - - 'main' - - '3.*' - paths: - - 'Tools/msi/**' - - '.github/workflows/build_msi.yml' - pull_request: - branches: - - 'main' - - '3.*' - paths: - - 'Tools/msi/**' - - '.github/workflows/build_msi.yml' - -permissions: - contents: read - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - build: - name: Windows Installer - runs-on: windows-latest - timeout-minutes: 60 - strategy: - matrix: - type: [x86, x64, arm64] - steps: - - uses: actions/checkout@v4 - - name: Build CPython installer - run: .\Tools\msi\build.bat --doc -${{ matrix.type }} diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml new file mode 100644 index 00000000..5e3ac9e9 --- /dev/null +++ b/.github/workflows/jit.yml @@ -0,0 +1,183 @@ +name: JIT +on: + pull_request: + paths: + - '**jit**' + - 'Python/bytecodes.c' + - 'Python/optimizer*.c' + - '!Python/perf_jit_trampoline.c' + - '!**/*.md' + - '!**/*.ini' + push: + paths: + - '**jit**' + - 'Python/bytecodes.c' + - 'Python/optimizer*.c' + - '!Python/perf_jit_trampoline.c' + - '!**/*.md' + - '!**/*.ini' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + interpreter: + name: Interpreter (Debug) + runs-on: ubuntu-latest + timeout-minutes: 90 + steps: + - uses: actions/checkout@v4 + - name: Build tier two interpreter + run: | + ./configure --enable-experimental-jit=interpreter --with-pydebug + make all --jobs 4 + - name: Test tier two interpreter + run: | + ./python -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + jit: + name: ${{ matrix.target }} (${{ matrix.debug && 'Debug' || 'Release' }}) + needs: interpreter + runs-on: ${{ matrix.runner }} + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + target: + - i686-pc-windows-msvc/msvc + - x86_64-pc-windows-msvc/msvc + - aarch64-pc-windows-msvc/msvc + - x86_64-apple-darwin/clang + - aarch64-apple-darwin/clang + - x86_64-unknown-linux-gnu/gcc + - x86_64-unknown-linux-gnu/clang + - aarch64-unknown-linux-gnu/gcc + - aarch64-unknown-linux-gnu/clang + debug: + - true + - false + llvm: + - 18 + include: + - target: i686-pc-windows-msvc/msvc + architecture: Win32 + runner: windows-latest + compiler: msvc + - target: x86_64-pc-windows-msvc/msvc + architecture: x64 + runner: windows-latest + compiler: msvc + - target: aarch64-pc-windows-msvc/msvc + architecture: ARM64 + runner: windows-latest + compiler: msvc + - target: x86_64-apple-darwin/clang + architecture: x86_64 + runner: macos-13 + compiler: clang + - target: aarch64-apple-darwin/clang + architecture: aarch64 + runner: macos-14 + compiler: clang + - target: x86_64-unknown-linux-gnu/gcc + architecture: x86_64 + runner: ubuntu-latest + compiler: gcc + - target: x86_64-unknown-linux-gnu/clang + architecture: x86_64 + runner: ubuntu-latest + compiler: clang + - target: aarch64-unknown-linux-gnu/gcc + architecture: aarch64 + runner: ubuntu-latest + compiler: gcc + - target: aarch64-unknown-linux-gnu/clang + architecture: aarch64 + runner: ubuntu-latest + compiler: clang + env: + CC: ${{ matrix.compiler }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Native Windows + if: runner.os == 'Windows' && matrix.architecture != 'ARM64' + run: | + choco upgrade llvm -y + choco install llvm --allow-downgrade --no-progress --version ${{ matrix.llvm }} + ./PCbuild/build.bat --experimental-jit ${{ matrix.debug && '-d' || '--pgo' }} -p ${{ matrix.architecture }} + ./PCbuild/rt.bat ${{ matrix.debug && '-d' || '' }} -p ${{ matrix.architecture }} -q --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + + # No PGO or tests (yet): + - name: Emulated Windows + if: runner.os == 'Windows' && matrix.architecture == 'ARM64' + run: | + choco upgrade llvm -y + choco install llvm --allow-downgrade --no-progress --version ${{ matrix.llvm }} + ./PCbuild/build.bat --experimental-jit ${{ matrix.debug && '-d' || '' }} -p ${{ matrix.architecture }} + + - name: Native macOS + if: runner.os == 'macOS' + run: | + brew update + brew install llvm@${{ matrix.llvm }} + SDKROOT="$(xcrun --show-sdk-path)" \ + ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} + make all --jobs 4 + ./python.exe -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + + - name: Native Linux + if: runner.os == 'Linux' && matrix.architecture == 'x86_64' + run: | + sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh ${{ matrix.llvm }} + export PATH="$(llvm-config-${{ matrix.llvm }} --bindir):$PATH" + ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} + make all --jobs 4 + ./python -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + + - name: Emulated Linux + if: runner.os == 'Linux' && matrix.architecture != 'x86_64' + # The --ignorefile on ./python -m test is used to exclude tests known to fail when running on an emulated Linux. + run: | + sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh ${{ matrix.llvm }} + export PATH="$(llvm-config-${{ matrix.llvm }} --bindir):$PATH" + ./configure --prefix="$(pwd)/../build" + make install --jobs 4 + make clean --jobs 4 + export HOST=${{ matrix.architecture }}-linux-gnu + sudo apt install --yes "gcc-$HOST" qemu-user + ${{ !matrix.debug && matrix.compiler == 'clang' && './configure --enable-optimizations' || '' }} + ${{ !matrix.debug && matrix.compiler == 'clang' && 'make profile-run-stamp --jobs 4' || '' }} + export QEMU_LD_PREFIX="/usr/$HOST" + CC="${{ matrix.compiler == 'clang' && 'clang --target=$HOST' || '$HOST-gcc' }}" \ + CPP="$CC --preprocess" \ + HOSTRUNNER=qemu-${{ matrix.architecture }} \ + ./configure --enable-experimental-jit ${{ matrix.debug && '--with-pydebug' || '--enable-optimizations --with-lto' }} --build=x86_64-linux-gnu --host="$HOST" --with-build-python=../build/bin/python3 --with-pkg-config=no ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptc=no ac_cv_file__dev_ptmx=yes + make all --jobs 4 + ./python -m test --ignorefile=Tools/jit/ignore-tests-emulated-linux.txt --multiprocess 0 --timeout 4500 --verbose2 --verbose3 + + jit-with-disabled-gil: + name: Free-Threaded (Debug) + needs: interpreter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Build with JIT enabled and GIL disabled + run: | + sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh 18 + export PATH="$(llvm-config-18 --bindir):$PATH" + ./configure --enable-experimental-jit --with-pydebug --disable-gil + make all --jobs 4 + - name: Run tests + run: | + ./python -m test --multiprocess 0 --timeout 4500 --verbose2 --verbose3 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 89f65816..ccde03f9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,7 +7,7 @@ permissions: env: FORCE_COLOR: 1 - RUFF_FORMAT: github + RUFF_OUTPUT_FORMAT: github concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.x" - - uses: pre-commit/action@v3.0.0 + - uses: pre-commit/action@v3.0.1 diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index f089a0b2..e5b05302 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -7,8 +7,16 @@ on: - main pull_request: paths: - - "Tools/clinic/**" - ".github/workflows/mypy.yml" + - "Lib/_pyrepl/**" + - "Lib/test/libregrtest/**" + - "Tools/build/generate_sbom.py" + - "Tools/cases_generator/**" + - "Tools/clinic/**" + - "Tools/jit/**" + - "Tools/peg_generator/**" + - "Tools/requirements-dev.txt" + - "Tools/wasm/**" workflow_dispatch: permissions: @@ -25,15 +33,28 @@ concurrency: jobs: mypy: - name: Run mypy on Tools/clinic/ + strategy: + fail-fast: false + matrix: + target: [ + "Lib/_pyrepl", + "Lib/test/libregrtest", + "Tools/build", + "Tools/cases_generator", + "Tools/clinic", + "Tools/jit", + "Tools/peg_generator", + "Tools/wasm", + ] + name: Run mypy on ${{ matrix.target }} runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: - python-version: "3.x" + python-version: "3.13" cache: pip - cache-dependency-path: Tools/clinic/requirements-dev.txt - - run: pip install -r Tools/clinic/requirements-dev.txt - - run: mypy --config-file Tools/clinic/mypy.ini + cache-dependency-path: Tools/requirements-dev.txt + - run: pip install -r Tools/requirements-dev.txt + - run: mypy --config-file ${{ matrix.target }}/mypy.ini diff --git a/.github/workflows/new-bugs-announce-notifier.yml b/.github/workflows/new-bugs-announce-notifier.yml index 73806c5d..9f1a8a82 100644 --- a/.github/workflows/new-bugs-announce-notifier.yml +++ b/.github/workflows/new-bugs-announce-notifier.yml @@ -13,12 +13,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 14 + node-version: 20 - run: npm install mailgun.js form-data - name: Send notification - uses: actions/github-script@v6 + uses: actions/github-script@v7 env: MAILGUN_API_KEY: ${{ secrets.MAILGUN_PYTHON_ORG_MAILGUN_KEY }} with: @@ -41,7 +41,10 @@ jobs: url : issue.data.html_url, labels : issue.data.labels.map(label => { return label.name }).join(", "), assignee : issue.data.assignees.map(assignee => { return assignee.login }), - body : issue.data.body + // We need to truncate the body size, because the max size for + // the whole payload is 16kb. We want to be safe and assume that + // body can take up to ~8kb of space. + body : issue.data.body.substring(0, 8000) }; const data = { diff --git a/.github/workflows/posix-deps-apt.sh b/.github/workflows/posix-deps-apt.sh index a220896f..d5538cd9 100755 --- a/.github/workflows/posix-deps-apt.sh +++ b/.github/workflows/posix-deps-apt.sh @@ -19,6 +19,7 @@ apt-get -yq install \ libssl-dev \ lzma \ lzma-dev \ + strace \ tk-dev \ uuid-dev \ xvfb \ diff --git a/.github/workflows/project-updater.yml b/.github/workflows/project-updater.yml index 7574bfc2..066d8593 100644 --- a/.github/workflows/project-updater.yml +++ b/.github/workflows/project-updater.yml @@ -23,7 +23,7 @@ jobs: - { project: 32, label: sprint } steps: - - uses: actions/add-to-project@v0.1.0 + - uses: actions/add-to-project@v1.0.0 with: project-url: https://github.com/orgs/python/projects/${{ matrix.project }} github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} diff --git a/.github/workflows/require-pr-label.yml b/.github/workflows/require-pr-label.yml index 6efd3116..ff5cbdf3 100644 --- a/.github/workflows/require-pr-label.yml +++ b/.github/workflows/require-pr-label.yml @@ -11,11 +11,12 @@ permissions: jobs: label: name: DO-NOT-MERGE / unresolved review + if: github.repository_owner == 'python' runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: mheap/github-action-required-labels@v4 + - uses: mheap/github-action-required-labels@v5 with: mode: exactly count: 0 diff --git a/.github/workflows/reusable-change-detection.yml b/.github/workflows/reusable-change-detection.yml new file mode 100644 index 00000000..5cd6fb39 --- /dev/null +++ b/.github/workflows/reusable-change-detection.yml @@ -0,0 +1,156 @@ +name: Reusable change detection + +on: # yamllint disable-line rule:truthy + workflow_call: + outputs: + # Some of the referenced steps set outputs conditionally and there may be + # cases when referencing them evaluates to empty strings. It is nice to + # work with proper booleans so they have to be evaluated through JSON + # conversion in the expressions. However, empty strings used like that + # may trigger all sorts of undefined and hard-to-debug behaviors in + # GitHub Actions CI/CD. To help with this, all of the outputs set here + # that are meant to be used as boolean flags (and not arbitrary strings), + # MUST have fallbacks with default values set. A common pattern would be + # to add ` || false` to all such expressions here, in the output + # definitions. They can then later be safely used through the following + # idiom in job conditionals and other expressions. Here's some examples: + # + # if: fromJSON(needs.change-detection.outputs.run-docs) + # + # ${{ + # fromJSON(needs.change-detection.outputs.run-tests) + # && 'truthy-branch' + # || 'falsy-branch' + # }} + # + config_hash: + description: Config hash value for use in cache keys + value: ${{ jobs.compute-changes.outputs.config-hash }} # str + run-docs: + description: Whether to build the docs + value: ${{ jobs.compute-changes.outputs.run-docs || false }} # bool + run_tests: + description: Whether to run the regular tests + value: ${{ jobs.compute-changes.outputs.run-tests || false }} # bool + run-win-msi: + description: Whether to run the MSI installer smoke tests + value: >- # bool + ${{ jobs.compute-changes.outputs.run-win-msi || false }} + run_hypothesis: + description: Whether to run the Hypothesis tests + value: >- # bool + ${{ jobs.compute-changes.outputs.run-hypothesis || false }} + run_cifuzz: + description: Whether to run the CIFuzz job + value: >- # bool + ${{ jobs.compute-changes.outputs.run-cifuzz || false }} + +jobs: + compute-changes: + name: Compute changed files + runs-on: ubuntu-latest + timeout-minutes: 10 + outputs: + config-hash: ${{ steps.config-hash.outputs.hash }} + run-cifuzz: ${{ steps.check.outputs.run-cifuzz }} + run-docs: ${{ steps.docs-changes.outputs.run-docs }} + run-hypothesis: ${{ steps.check.outputs.run-hypothesis }} + run-tests: ${{ steps.check.outputs.run-tests }} + run-win-msi: ${{ steps.win-msi-changes.outputs.run-win-msi }} + steps: + - run: >- + echo '${{ github.event_name }}' + - uses: actions/checkout@v4 + - name: Check for source changes + id: check + run: | + if [ -z "$GITHUB_BASE_REF" ]; then + echo "run-tests=true" >> $GITHUB_OUTPUT + else + git fetch origin $GITHUB_BASE_REF --depth=1 + # git diff "origin/$GITHUB_BASE_REF..." (3 dots) may be more + # reliable than git diff "origin/$GITHUB_BASE_REF.." (2 dots), + # but it requires to download more commits (this job uses + # "git fetch --depth=1"). + # + # git diff "origin/$GITHUB_BASE_REF..." (3 dots) works with Git + # 2.26, but Git 2.28 is stricter and fails with "no merge base". + # + # git diff "origin/$GITHUB_BASE_REF.." (2 dots) should be enough on + # GitHub, since GitHub starts by merging origin/$GITHUB_BASE_REF + # into the PR branch anyway. + # + # https://github.com/python/core-workflow/issues/373 + git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc|^\.pre-commit-config\.yaml$|\.ruff\.toml$|\.md$|mypy\.ini$)' && echo "run-tests=true" >> $GITHUB_OUTPUT || true + fi + + # Check if we should run hypothesis tests + GIT_BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}} + echo $GIT_BRANCH + if $(echo "$GIT_BRANCH" | grep -q -w '3\.\(8\|9\|10\|11\)'); then + echo "Branch too old for hypothesis tests" + echo "run-hypothesis=false" >> $GITHUB_OUTPUT + else + echo "Run hypothesis tests" + echo "run-hypothesis=true" >> $GITHUB_OUTPUT + fi + + # oss-fuzz maintains a configuration for fuzzing the main branch of + # CPython, so CIFuzz should be run only for code that is likely to be + # merged into the main branch; compatibility with older branches may + # be broken. + FUZZ_RELEVANT_FILES='(\.c$|\.h$|\.cpp$|^configure$|^\.github/workflows/build\.yml$|^Modules/_xxtestfuzz)' + if [ "$GITHUB_BASE_REF" = "main" ] && [ "$(git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qE $FUZZ_RELEVANT_FILES; echo $?)" -eq 0 ]; then + # The tests are pretty slow so they are executed only for PRs + # changing relevant files. + echo "Run CIFuzz tests" + echo "run-cifuzz=true" >> $GITHUB_OUTPUT + else + echo "Branch too old for CIFuzz tests; or no C files were changed" + echo "run-cifuzz=false" >> $GITHUB_OUTPUT + fi + - name: Compute hash for config cache key + id: config-hash + run: | + echo "hash=${{ hashFiles('configure', 'configure.ac', '.github/workflows/build.yml') }}" >> $GITHUB_OUTPUT + - name: Get a list of the changed documentation-related files + if: github.event_name == 'pull_request' + id: changed-docs-files + uses: Ana06/get-changed-files@v2.3.0 + with: + filter: | + Doc/** + Misc/** + .github/workflows/reusable-docs.yml + format: csv # works for paths with spaces + - name: Check for docs changes + # We only want to run this on PRs when related files are changed, + # or when user triggers manual workflow run. + if: >- + ( + github.event_name == 'pull_request' + && steps.changed-docs-files.outputs.added_modified_renamed != '' + ) || github.event_name == 'workflow_dispatch' + id: docs-changes + run: | + echo "run-docs=true" >> "${GITHUB_OUTPUT}" + - name: Get a list of the MSI installer-related files + if: github.event_name == 'pull_request' + id: changed-win-msi-files + uses: Ana06/get-changed-files@v2.3.0 + with: + filter: | + Tools/msi/** + .github/workflows/reusable-windows-msi.yml + format: csv # works for paths with spaces + - name: Check for changes in MSI installer-related files + # We only want to run this on PRs when related files are changed, + # or when user triggers manual workflow run. + if: >- + ( + github.event_name == 'pull_request' + && steps.changed-win-msi-files.outputs.added_modified_renamed != '' + ) || github.event_name == 'workflow_dispatch' + id: win-msi-changes + run: | + echo "run-win-msi=true" >> "${GITHUB_OUTPUT}" diff --git a/.github/workflows/reusable-docs.yml b/.github/workflows/reusable-docs.yml index 1c4fa423..39a97392 100644 --- a/.github/workflows/reusable-docs.yml +++ b/.github/workflows/reusable-docs.yml @@ -1,4 +1,4 @@ -name: Docs +name: Reusable Docs on: workflow_call: @@ -11,6 +11,9 @@ concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true +env: + FORCE_COLOR: 1 + jobs: build_doc: name: 'Docs' @@ -25,9 +28,15 @@ jobs: - name: 'Check out latest PR branch commit' uses: actions/checkout@v4 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: >- + ${{ + github.event_name == 'pull_request' + && github.event.pull_request.head.sha + || '' + }} # Adapted from https://github.com/actions/checkout/issues/520#issuecomment-1167205721 - name: 'Fetch commits to get branch diff' + if: github.event_name == 'pull_request' run: | # Fetch enough history to find a common ancestor commit (aka merge-base): git fetch origin ${{ env.refspec_pr }} --depth=$(( ${{ github.event.pull_request.commits }} + 1 )) \ @@ -41,7 +50,7 @@ jobs: git fetch origin ${{ env.refspec_base }} --shallow-since="${DATE}" \ --no-tags --prune --no-recurse-submodules - name: 'Set up Python' - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3' cache: 'pip' @@ -62,7 +71,8 @@ jobs: python Doc/tools/check-warnings.py \ --annotate-diff '${{ env.branch_base }}' '${{ env.branch_pr }}' \ --fail-if-regression \ - --fail-if-improved + --fail-if-improved \ + --fail-if-new-news-nit # This build doesn't use problem matchers or check annotations build_doc_oldest_supported_sphinx: @@ -72,9 +82,9 @@ jobs: steps: - uses: actions/checkout@v4 - name: 'Set up Python' - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: '3.11' # known to work with Sphinx 4.2 + python-version: '3.13' # known to work with Sphinx 7.2.6 cache: 'pip' cache-dependency-path: 'Doc/requirements-oldest-sphinx.txt' - name: 'Install build dependencies' @@ -85,11 +95,11 @@ jobs: # Run "doctest" on HEAD as new syntax doesn't exist in the latest stable release doctest: name: 'Doctest' - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - uses: actions/checkout@v4 - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ~/.cache/pip key: ubuntu-doc-${{ hashFiles('Doc/requirements.txt') }} diff --git a/.github/workflows/reusable-macos.yml b/.github/workflows/reusable-macos.yml new file mode 100644 index 00000000..b26aeea8 --- /dev/null +++ b/.github/workflows/reusable-macos.yml @@ -0,0 +1,59 @@ +name: Reusable macOS + +on: + workflow_call: + inputs: + config_hash: + required: true + type: string + free-threading: + required: false + type: boolean + default: false + os: + description: OS to run the job + required: true + type: string + +jobs: + build_macos: + name: build and test (${{ inputs.os }}) + timeout-minutes: 60 + env: + HOMEBREW_NO_ANALYTICS: 1 + HOMEBREW_NO_AUTO_UPDATE: 1 + HOMEBREW_NO_INSTALL_CLEANUP: 1 + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1 + PYTHONSTRICTEXTENSIONBUILD: 1 + TERM: linux + runs-on: ${{ inputs.os }} + steps: + - uses: actions/checkout@v4 + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV + - name: Restore config.cache + uses: actions/cache@v4 + with: + path: config.cache + key: ${{ github.job }}-${{ inputs.os }}-${{ env.IMAGE_VERSION }}-${{ inputs.config_hash }} + - name: Install Homebrew dependencies + run: | + brew install pkg-config openssl@3.0 xz gdbm tcl-tk@8 + # Because alternate versions are not symlinked into place by default: + brew link tcl-tk@8 + - name: Configure CPython + run: | + GDBM_CFLAGS="-I$(brew --prefix gdbm)/include" \ + GDBM_LIBS="-L$(brew --prefix gdbm)/lib -lgdbm" \ + ./configure \ + --config-cache \ + --with-pydebug \ + ${{ inputs.free-threading && '--disable-gil' || '' }} \ + --prefix=/opt/python-dev \ + --with-openssl="$(brew --prefix openssl@3.0)" + - name: Build CPython + run: make -j8 + - name: Display build info + run: make pythoninfo + - name: Tests + run: make test diff --git a/.github/workflows/reusable-tsan.yml b/.github/workflows/reusable-tsan.yml new file mode 100644 index 00000000..042ef664 --- /dev/null +++ b/.github/workflows/reusable-tsan.yml @@ -0,0 +1,78 @@ +name: Reusable Thread Sanitizer + +on: + workflow_call: + inputs: + config_hash: + required: true + type: string + options: + required: true + type: string + suppressions_path: + description: 'A repo relative path to the suppressions file' + required: true + type: string + tsan_logs_artifact_name: + description: 'Name of the TSAN logs artifact. Must be unique for each job.' + required: true + type: string + +jobs: + build_tsan_reusable: + name: 'Thread sanitizer' + runs-on: ubuntu-24.04 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV + - name: Restore config.cache + uses: actions/cache@v4 + with: + path: config.cache + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ inputs.config_hash }} + - name: Install Dependencies + run: | + sudo ./.github/workflows/posix-deps-apt.sh + # Install clang-18 + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + sudo ./llvm.sh 17 # gh-121946: llvm-18 package is temporarily broken + sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 100 + sudo update-alternatives --set clang /usr/bin/clang-17 + sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-17 100 + sudo update-alternatives --set clang++ /usr/bin/clang++-17 + # Reduce ASLR to avoid TSAN crashing + sudo sysctl -w vm.mmap_rnd_bits=28 + - name: TSAN Option Setup + run: | + echo "TSAN_OPTIONS=log_path=${GITHUB_WORKSPACE}/tsan_log suppressions=${GITHUB_WORKSPACE}/${{ inputs.suppressions_path }} handle_segv=0" >> $GITHUB_ENV + echo "CC=clang" >> $GITHUB_ENV + echo "CXX=clang++" >> $GITHUB_ENV + - name: Add ccache to PATH + run: | + echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV + - name: Configure ccache action + uses: hendrikmuhs/ccache-action@v1.2 + with: + save: ${{ github.event_name == 'push' }} + max-size: "200M" + - name: Configure CPython + run: ${{ inputs.options }} + - name: Build CPython + run: make -j4 + - name: Display build info + run: make pythoninfo + - name: Tests + run: ./python -m test --tsan -j4 + - name: Display TSAN logs + if: always() + run: find ${GITHUB_WORKSPACE} -name 'tsan_log.*' | xargs head -n 1000 + - name: Archive TSAN logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.tsan_logs_artifact_name }} + path: tsan_log.* + if-no-files-found: ignore diff --git a/.github/workflows/reusable-ubuntu.yml b/.github/workflows/reusable-ubuntu.yml new file mode 100644 index 00000000..c9c41560 --- /dev/null +++ b/.github/workflows/reusable-ubuntu.yml @@ -0,0 +1,91 @@ +name: Reusable Ubuntu + +on: + workflow_call: + inputs: + config_hash: + required: true + type: string + free-threading: + description: Whether to use free-threaded mode + required: false + type: boolean + default: false + +jobs: + build_ubuntu_reusable: + name: 'build and test' + timeout-minutes: 60 + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04, ubuntu-24.04-aarch64] + env: + FORCE_COLOR: 1 + OPENSSL_VER: 3.0.15 + PYTHONSTRICTEXTENSIONBUILD: 1 + TERM: linux + steps: + - uses: actions/checkout@v4 + - name: Register gcc problem matcher + run: echo "::add-matcher::.github/problem-matchers/gcc.json" + - name: Install dependencies + run: sudo ./.github/workflows/posix-deps-apt.sh + - name: Configure OpenSSL env vars + run: | + echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV + echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV + echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV + - name: 'Restore OpenSSL build' + id: cache-openssl + uses: actions/cache@v4 + with: + path: ./multissl/openssl/${{ env.OPENSSL_VER }} + key: ${{ matrix.os }}-multissl-openssl-${{ env.OPENSSL_VER }} + - name: Install OpenSSL + if: steps.cache-openssl.outputs.cache-hit != 'true' + run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux + - name: Add ccache to PATH + run: | + echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV + - name: Configure ccache action + uses: hendrikmuhs/ccache-action@v1.2 + with: + save: ${{ github.event_name == 'push' }} + max-size: "200M" + - name: Setup directory envs for out-of-tree builds + run: | + echo "CPYTHON_RO_SRCDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-ro-srcdir)" >> $GITHUB_ENV + echo "CPYTHON_BUILDDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-builddir)" >> $GITHUB_ENV + - name: Create directories for read-only out-of-tree builds + run: mkdir -p $CPYTHON_RO_SRCDIR $CPYTHON_BUILDDIR + - name: Bind mount sources read-only + run: sudo mount --bind -o ro $GITHUB_WORKSPACE $CPYTHON_RO_SRCDIR + - name: Runner image version + run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV + - name: Restore config.cache + uses: actions/cache@v4 + with: + path: ${{ env.CPYTHON_BUILDDIR }}/config.cache + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ inputs.config_hash }} + - name: Configure CPython out-of-tree + working-directory: ${{ env.CPYTHON_BUILDDIR }} + run: >- + ../cpython-ro-srcdir/configure + --config-cache + --with-pydebug + --with-openssl=$OPENSSL_DIR + ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }} + - name: Build CPython out-of-tree + working-directory: ${{ env.CPYTHON_BUILDDIR }} + run: make -j + - name: Display build info + working-directory: ${{ env.CPYTHON_BUILDDIR }} + run: make pythoninfo + - name: Remount sources writable for tests + # some tests write to srcdir, lack of pyc files slows down testing + run: sudo mount $CPYTHON_RO_SRCDIR -oremount,rw + - name: Tests + working-directory: ${{ env.CPYTHON_BUILDDIR }} + run: xvfb-run make test diff --git a/.github/workflows/reusable-wasi.yml b/.github/workflows/reusable-wasi.yml new file mode 100644 index 00000000..ca5fc16a --- /dev/null +++ b/.github/workflows/reusable-wasi.yml @@ -0,0 +1,77 @@ +name: Reusable WASI + +on: + workflow_call: + inputs: + config_hash: + required: true + type: string + +jobs: + build_wasi_reusable: + name: 'build and test' + timeout-minutes: 60 + runs-on: ubuntu-24.04 + env: + WASMTIME_VERSION: 22.0.0 + WASI_SDK_VERSION: 24 + WASI_SDK_PATH: /opt/wasi-sdk + CROSS_BUILD_PYTHON: cross-build/build + CROSS_BUILD_WASI: cross-build/wasm32-wasip1 + steps: + - uses: actions/checkout@v4 + # No problem resolver registered as one doesn't currently exist for Clang. + - name: "Install wasmtime" + uses: bytecodealliance/actions/wasmtime/setup@v1 + with: + version: ${{ env.WASMTIME_VERSION }} + - name: "Restore WASI SDK" + id: cache-wasi-sdk + uses: actions/cache@v4 + with: + path: ${{ env.WASI_SDK_PATH }} + key: ${{ runner.os }}-wasi-sdk-${{ env.WASI_SDK_VERSION }} + - name: "Install WASI SDK" # Hard-coded to x64. + if: steps.cache-wasi-sdk.outputs.cache-hit != 'true' + run: | + mkdir ${{ env.WASI_SDK_PATH }} && \ + curl -s -S --location https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{ env.WASI_SDK_VERSION }}/wasi-sdk-${{ env.WASI_SDK_VERSION }}.0-x86_64-linux.tar.gz | \ + tar --strip-components 1 --directory ${{ env.WASI_SDK_PATH }} --extract --gunzip + - name: "Configure ccache action" + uses: hendrikmuhs/ccache-action@v1.2 + with: + save: ${{ github.event_name == 'push' }} + max-size: "200M" + - name: "Add ccache to PATH" + run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV + - name: "Install Python" + uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: "Restore Python build config.cache" + uses: actions/cache@v4 + with: + path: ${{ env.CROSS_BUILD_PYTHON }}/config.cache + # Include env.pythonLocation in key to avoid changes in environment when setup-python updates Python. + # Include the hash of `Tools/wasm/wasi.py` as it may change the environment variables. + # (Make sure to keep the key in sync with the other config.cache step below.) + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi.py') }}-${{ env.pythonLocation }} + - name: "Configure build Python" + run: python3 Tools/wasm/wasi.py configure-build-python -- --config-cache --with-pydebug + - name: "Make build Python" + run: python3 Tools/wasm/wasi.py make-build-python + - name: "Restore host config.cache" + uses: actions/cache@v4 + with: + path: ${{ env.CROSS_BUILD_WASI }}/config.cache + # Should be kept in sync with the other config.cache step above. + key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ env.WASI_SDK_VERSION }}-${{ env.WASMTIME_VERSION }}-${{ inputs.config_hash }}-${{ hashFiles('Tools/wasm/wasi.py') }}-${{ env.pythonLocation }} + - name: "Configure host" + # `--with-pydebug` inferred from configure-build-python + run: python3 Tools/wasm/wasi.py configure-host -- --config-cache + - name: "Make host" + run: python3 Tools/wasm/wasi.py make-host + - name: "Display build info" + run: make --directory ${{ env.CROSS_BUILD_WASI }} pythoninfo + - name: "Test" + run: make --directory ${{ env.CROSS_BUILD_WASI }} test diff --git a/.github/workflows/reusable-windows-msi.yml b/.github/workflows/reusable-windows-msi.yml new file mode 100644 index 00000000..abdb1a19 --- /dev/null +++ b/.github/workflows/reusable-windows-msi.yml @@ -0,0 +1,24 @@ +name: Reusable Windows MSI + +on: + workflow_call: + inputs: + arch: + description: CPU architecture + required: true + type: string + +permissions: + contents: read + +jobs: + build: + name: installer for ${{ inputs.arch }} + runs-on: windows-latest + timeout-minutes: 60 + env: + IncludeFreethreaded: true + steps: + - uses: actions/checkout@v4 + - name: Build CPython installer + run: .\Tools\msi\build.bat --doc -${{ inputs.arch }} diff --git a/.github/workflows/reusable-windows.yml b/.github/workflows/reusable-windows.yml new file mode 100644 index 00000000..12b68d68 --- /dev/null +++ b/.github/workflows/reusable-windows.yml @@ -0,0 +1,49 @@ +name: Reusable Windows + +on: + workflow_call: + inputs: + os: + description: OS to run on + required: true + type: string + arch: + description: CPU architecture + required: true + type: string + free-threading: + description: Whether to compile CPython in free-threading mode + required: false + type: boolean + default: false + +env: + IncludeUwp: >- + true + +jobs: + build: + name: 'build and test (${{ inputs.arch }})' + runs-on: ${{ inputs.os }} + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + - name: Register MSVC problem matcher + if: inputs.arch != 'Win32' + run: echo "::add-matcher::.github/problem-matchers/msvc.json" + - name: Build CPython + run: >- + .\\PCbuild\\build.bat + -e -d -v + -p ${{ inputs.arch }} + ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }} + - name: Display build info # FIXME(diegorusso): remove the `if` + if: inputs.arch != 'arm64' + run: .\\python.bat -m test.pythoninfo + - name: Tests # FIXME(diegorusso): remove the `if` + if: inputs.arch != 'arm64' + run: >- + .\\PCbuild\\rt.bat + -p ${{ inputs.arch }} + -d -q --fast-ci + ${{ fromJSON(inputs.free-threading) && '--disable-gil' || '' }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 94676f5e..f97587e6 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -2,7 +2,7 @@ name: Mark stale pull requests on: schedule: - - cron: "0 0 * * *" + - cron: "0 */6 * * *" permissions: pull-requests: write @@ -16,7 +16,7 @@ jobs: steps: - name: "Check PRs" - uses: actions/stale@v8 + uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' diff --git a/.github/workflows/verify-ensurepip-wheels.yml b/.github/workflows/verify-ensurepip-wheels.yml index 4a545037..83b007f1 100644 --- a/.github/workflows/verify-ensurepip-wheels.yml +++ b/.github/workflows/verify-ensurepip-wheels.yml @@ -26,7 +26,7 @@ jobs: timeout-minutes: 10 steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: '3' - name: Compare checksum of bundled wheels to the ones published on PyPI diff --git a/.gitignore b/.gitignore index bde596a7..1248d6db 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ gmon.out .coverage .mypy_cache/ .pytest_cache/ +.ruff_cache/ .DS_Store *.exe @@ -61,7 +62,6 @@ Doc/.venv/ Doc/env/ Doc/.env/ Include/pydtrace_probes.h -Lib/lib2to3/*.pickle Lib/site-packages/* !Lib/site-packages/README.txt Lib/test/data/* @@ -69,6 +69,17 @@ Lib/test/data/* /_bootstrap_python /Makefile /Makefile.pre +/iOSTestbed.* +iOS/Frameworks/ +iOS/Resources/Info.plist +iOS/testbed/build +iOS/testbed/Python.xcframework/ios-*/bin +iOS/testbed/Python.xcframework/ios-*/include +iOS/testbed/Python.xcframework/ios-*/lib +iOS/testbed/Python.xcframework/ios-*/Python.framework +iOS/testbed/iOSTestbed.xcodeproj/project.xcworkspace +iOS/testbed/iOSTestbed.xcodeproj/xcuserdata +iOS/testbed/iOSTestbed.xcodeproj/xcshareddata Mac/Makefile Mac/PythonLauncher/Info.plist Mac/PythonLauncher/Makefile @@ -125,11 +136,12 @@ Tools/unicode/data/ /config.status.lineno # hendrikmuhs/ccache-action@v1 /.ccache +/cross-build/ +/jit_stencils.h /platform /profile-clean-stamp /profile-run-stamp /profile-bolt-stamp -/Python/deepfreeze/*.c /pybuilddir.txt /pyconfig.h /python-config @@ -156,3 +168,4 @@ Python/frozen_modules/MANIFEST # Ignore ./python binary on Unix but still look into ./Python/ directory. /python !/Python/ + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19f6a037..7e0bdd50 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,28 +1,54 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.288 + rev: v0.6.7 hooks: - id: ruff - name: Run Ruff on Lib/test/ + name: Run Ruff (lint) on Doc/ + args: [--exit-non-zero-on-fix] + files: ^Doc/ + - id: ruff + name: Run Ruff (lint) on Lib/test/ args: [--exit-non-zero-on-fix] files: ^Lib/test/ + - id: ruff + name: Run Ruff (lint) on Argument Clinic + args: [--exit-non-zero-on-fix, --config=Tools/clinic/.ruff.toml] + files: ^Tools/clinic/|Lib/test/test_clinic.py + - id: ruff-format + name: Run Ruff (format) on Doc/ + args: [--check] + files: ^Doc/ + + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 24.4.2 + hooks: + - id: black + name: Run Black on Tools/jit/ + files: ^Tools/jit/ + language_version: python3.12 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: + - id: check-case-conflict + - id: check-merge-conflict - id: check-toml exclude: ^Lib/test/test_tomllib/ - id: check-yaml - id: end-of-file-fixer types: [python] - exclude: Lib/test/coding20731.py + exclude: Lib/test/tokenizedata/coding20731.py - id: trailing-whitespace - types_or: [c, python, rst] + types_or: [c, inc, python, rst] - repo: https://github.com/sphinx-contrib/sphinx-lint - rev: v0.6.8 + rev: v0.9.1 hooks: - id: sphinx-lint args: [--enable=default-role] - files: ^Doc/|^Misc/NEWS.d/next/ - types: [rst] + files: ^Doc/|^Misc/NEWS.d/ + + - repo: meta + hooks: + - id: check-hooks-apply + - id: check-useless-excludes diff --git a/.readthedocs.yml b/.readthedocs.yml index 898a9ae8..a57de005 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,11 +8,28 @@ sphinx: configuration: Doc/conf.py build: - os: ubuntu-22.04 + os: ubuntu-24.04 tools: python: "3" commands: + # https://docs.readthedocs.io/en/stable/build-customization.html#cancel-build-based-on-a-condition + # + # Cancel building pull requests when there aren't changes in the Doc directory. + # + # If there are no changes (git diff exits with 0) we force the command to return with 183. + # This is a special exit code on Read the Docs that will cancel the build immediately. + - | + if [ "$READTHEDOCS_VERSION_TYPE" = "external" ] && [ "$(git diff --quiet origin/main -- Doc/ .readthedocs.yml; echo $?)" -eq 0 ]; + then + echo "No changes to Doc/ - exiting the build."; + exit 183; + fi + + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest - make -C Doc venv html - mkdir _readthedocs - mv Doc/build/html _readthedocs/html + diff --git a/Android/README.md b/Android/README.md new file mode 100644 index 00000000..3daa545c --- /dev/null +++ b/Android/README.md @@ -0,0 +1,136 @@ +# Python for Android + +These instructions are only needed if you're planning to compile Python for +Android yourself. Most users should *not* need to do this. Instead, use one of +the tools listed in `Doc/using/android.rst`, which will provide a much easier +experience. + + +## Prerequisites + +First, make sure you have all the usual tools and libraries needed to build +Python for your development machine. + +Second, you'll need an Android SDK. If you already have the SDK installed, +export the `ANDROID_HOME` environment variable to point at its location. +Otherwise, here's how to install it: + +* Download the "Command line tools" from . +* Create a directory `android-sdk/cmdline-tools`, and unzip the command line + tools package into it. +* Rename `android-sdk/cmdline-tools/cmdline-tools` to + `android-sdk/cmdline-tools/latest`. +* `export ANDROID_HOME=/path/to/android-sdk` + +The `android.py` script also requires the following commands to be on the `PATH`: + +* `curl` +* `java` (or set the `JAVA_HOME` environment variable) +* `tar` +* `unzip` + + +## Building + +Python can be built for Android on any POSIX platform supported by the Android +development tools, which currently means Linux or macOS. This involves doing a +cross-build where you use a "build" Python (for your development machine) to +help produce a "host" Python for Android. + +The easiest way to do a build is to use the `android.py` script. You can either +have it perform the entire build process from start to finish in one step, or +you can do it in discrete steps that mirror running `configure` and `make` for +each of the two builds of Python you end up producing. + +The discrete steps for building via `android.py` are: + +```sh +./android.py configure-build +./android.py make-build +./android.py configure-host HOST +./android.py make-host HOST +``` + +`HOST` identifies which architecture to build. To see the possible values, run +`./android.py configure-host --help`. + +To do all steps in a single command, run: + +```sh +./android.py build HOST +``` + +In the end you should have a build Python in `cross-build/build`, and an Android +build in `cross-build/HOST`. + +You can use `--` as a separator for any of the `configure`-related commands – +including `build` itself – to pass arguments to the underlying `configure` +call. For example, if you want a pydebug build that also caches the results from +`configure`, you can do: + +```sh +./android.py build HOST -- -C --with-pydebug +``` + + +## Testing + +The test suite can be run on Linux, macOS, or Windows: + +* On Linux, the emulator needs access to the KVM virtualization interface, and + a DISPLAY environment variable pointing at an X server. +* On Windows, you won't be able to do the build on the same machine, so you'll + have to copy the `cross-build/HOST` directory from somewhere else. + +The test suite can usually be run on a device with 2 GB of RAM, but this is +borderline, so you may need to increase it to 4 GB. As of Android +Studio Koala, 2 GB is the default for all emulators, although the user interface +may indicate otherwise. Locate the emulator's directory under `~/.android/avd`, +and find `hw.ramSize` in both config.ini and hardware-qemu.ini. Either set these +manually to the same value, or use the Android Studio Device Manager, which will +update both files. + +Before running the test suite, follow the instructions in the previous section +to build the architecture you want to test. Then run the test script in one of +the following modes: + +* In `--connected` mode, it runs on a device or emulator you have already + connected to the build machine. List the available devices with + `$ANDROID_HOME/platform-tools/adb devices -l`, then pass a device ID to the + script like this: + + ```sh + ./android.py test --connected emulator-5554 + ``` + +* In `--managed` mode, it uses a temporary headless emulator defined in the + `managedDevices` section of testbed/app/build.gradle.kts. This mode is slower, + but more reproducible. + + We currently define two devices: `minVersion` and `maxVersion`, corresponding + to our minimum and maximum supported Android versions. For example: + + ```sh + ./android.py test --managed maxVersion + ``` + +By default, the only messages the script will show are Python's own stdout and +stderr. Add the `-v` option to also show Gradle output, and non-Python logcat +messages. + +Any other arguments on the `android.py test` command line will be passed through +to `python -m test` – use `--` to separate them from android.py's own options. +See the [Python Developer's +Guide](https://devguide.python.org/testing/run-write-tests/) for common options +– most of them will work on Android, except for those that involve subprocesses, +such as `-j`. + +Every time you run `android.py test`, changes in pure-Python files in the +repository's `Lib` directory will be picked up immediately. Changes in C files, +and architecture-specific files such as sysconfigdata, will not take effect +until you re-run `android.py make-host` or `build`. + + +## Using in your own app + +See `Doc/using/android.rst`. diff --git a/Android/android-env.sh b/Android/android-env.sh new file mode 100644 index 00000000..b93e7f21 --- /dev/null +++ b/Android/android-env.sh @@ -0,0 +1,97 @@ +# This script must be sourced with the following variables already set: +: ${ANDROID_HOME:?} # Path to Android SDK +: ${HOST:?} # GNU target triplet + +# You may also override the following: +: ${api_level:=21} # Minimum Android API level the build will run on +: ${PREFIX:-} # Path in which to find required libraries + + +# Print all messages on stderr so they're visible when running within build-wheel. +log() { + echo "$1" >&2 +} + +fail() { + log "$1" + exit 1 +} + +# When moving to a new version of the NDK, carefully review the following: +# +# * https://developer.android.com/ndk/downloads/revision_history +# +# * https://android.googlesource.com/platform/ndk/+/ndk-rXX-release/docs/BuildSystemMaintainers.md +# where XX is the NDK version. Do a diff against the version you're upgrading from, e.g.: +# https://android.googlesource.com/platform/ndk/+/ndk-r25-release..ndk-r26-release/docs/BuildSystemMaintainers.md +ndk_version=27.1.12297006 + +ndk=$ANDROID_HOME/ndk/$ndk_version +if ! [ -e $ndk ]; then + log "Installing NDK - this may take several minutes" + yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "ndk;$ndk_version" +fi + +if [ $HOST = "arm-linux-androideabi" ]; then + clang_triplet=armv7a-linux-androideabi +else + clang_triplet=$HOST +fi + +# These variables are based on BuildSystemMaintainers.md above, and +# $ndk/build/cmake/android.toolchain.cmake. +toolchain=$(echo $ndk/toolchains/llvm/prebuilt/*) +export AR="$toolchain/bin/llvm-ar" +export AS="$toolchain/bin/llvm-as" +export CC="$toolchain/bin/${clang_triplet}${api_level}-clang" +export CXX="${CC}++" +export LD="$toolchain/bin/ld" +export NM="$toolchain/bin/llvm-nm" +export RANLIB="$toolchain/bin/llvm-ranlib" +export READELF="$toolchain/bin/llvm-readelf" +export STRIP="$toolchain/bin/llvm-strip" + +# The quotes make sure the wildcard in the `toolchain` assignment has been expanded. +for path in "$AR" "$AS" "$CC" "$CXX" "$LD" "$NM" "$RANLIB" "$READELF" "$STRIP"; do + if ! [ -e "$path" ]; then + fail "$path does not exist" + fi +done + +export CFLAGS="-D__BIONIC_NO_PAGE_SIZE_MACRO" +export LDFLAGS="-Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,-z,max-page-size=16384" + +# Unlike Linux, Android does not implicitly use a dlopened library to resolve +# relocations in subsequently-loaded libraries, even if RTLD_GLOBAL is used +# (https://github.com/android/ndk/issues/1244). So any library that fails to +# build with this flag, would also fail to load at runtime. +LDFLAGS="$LDFLAGS -Wl,--no-undefined" + +# Many packages get away with omitting -lm on Linux, but Android is stricter. +LDFLAGS="$LDFLAGS -lm" + +# -mstackrealign is included where necessary in the clang launcher scripts which are +# pointed to by $CC, so we don't need to include it here. +if [ $HOST = "arm-linux-androideabi" ]; then + CFLAGS="$CFLAGS -march=armv7-a -mthumb" +fi + +if [ -n "${PREFIX:-}" ]; then + abs_prefix=$(realpath $PREFIX) + CFLAGS="$CFLAGS -I$abs_prefix/include" + LDFLAGS="$LDFLAGS -L$abs_prefix/lib" + + export PKG_CONFIG="pkg-config --define-prefix" + export PKG_CONFIG_LIBDIR="$abs_prefix/lib/pkgconfig" +fi + +# When compiling C++, some build systems will combine CFLAGS and CXXFLAGS, and some will +# use CXXFLAGS alone. +export CXXFLAGS=$CFLAGS + +# Use the same variable name as conda-build +if [ $(uname) = "Darwin" ]; then + export CPU_COUNT=$(sysctl -n hw.ncpu) +else + export CPU_COUNT=$(nproc) +fi diff --git a/Android/android.py b/Android/android.py new file mode 100755 index 00000000..ae630aa8 --- /dev/null +++ b/Android/android.py @@ -0,0 +1,650 @@ +#!/usr/bin/env python3 + +import asyncio +import argparse +from glob import glob +import os +import re +import shlex +import shutil +import signal +import subprocess +import sys +import sysconfig +from asyncio import wait_for +from contextlib import asynccontextmanager +from os.path import basename, relpath +from pathlib import Path +from subprocess import CalledProcessError +from tempfile import TemporaryDirectory + + +SCRIPT_NAME = Path(__file__).name +CHECKOUT = Path(__file__).resolve().parent.parent +ANDROID_DIR = CHECKOUT / "Android" +TESTBED_DIR = ANDROID_DIR / "testbed" +CROSS_BUILD_DIR = CHECKOUT / "cross-build" + +APP_ID = "org.python.testbed" +DECODE_ARGS = ("UTF-8", "backslashreplace") + + +try: + android_home = Path(os.environ['ANDROID_HOME']) +except KeyError: + sys.exit("The ANDROID_HOME environment variable is required.") + +adb = Path( + f"{android_home}/platform-tools/adb" + + (".exe" if os.name == "nt" else "") +) + +gradlew = Path( + f"{TESTBED_DIR}/gradlew" + + (".bat" if os.name == "nt" else "") +) + +logcat_started = False + + +def delete_glob(pattern): + # Path.glob doesn't accept non-relative patterns. + for path in glob(str(pattern)): + path = Path(path) + print(f"Deleting {path} ...") + if path.is_dir() and not path.is_symlink(): + shutil.rmtree(path) + else: + path.unlink() + + +def subdir(name, *, clean=None): + path = CROSS_BUILD_DIR / name + if clean: + delete_glob(path) + if not path.exists(): + if clean is None: + sys.exit( + f"{path} does not exist. Create it by running the appropriate " + f"`configure` subcommand of {SCRIPT_NAME}.") + else: + path.mkdir(parents=True) + return path + + +def run(command, *, host=None, env=None, log=True, **kwargs): + kwargs.setdefault("check", True) + if env is None: + env = os.environ.copy() + original_env = env.copy() + + if host: + env_script = ANDROID_DIR / "android-env.sh" + env_output = subprocess.run( + f"set -eu; " + f"HOST={host}; " + f"PREFIX={subdir(host)}/prefix; " + f". {env_script}; " + f"export", + check=True, shell=True, text=True, stdout=subprocess.PIPE + ).stdout + + for line in env_output.splitlines(): + # We don't require every line to match, as there may be some other + # output from installing the NDK. + if match := re.search( + "^(declare -x |export )?(\\w+)=['\"]?(.*?)['\"]?$", line + ): + key, value = match[2], match[3] + if env.get(key) != value: + print(line) + env[key] = value + + if env == original_env: + raise ValueError(f"Found no variables in {env_script.name} output:\n" + + env_output) + + if log: + print(">", " ".join(map(str, command))) + return subprocess.run(command, env=env, **kwargs) + + +def build_python_path(): + """The path to the build Python binary.""" + build_dir = subdir("build") + binary = build_dir / "python" + if not binary.is_file(): + binary = binary.with_suffix(".exe") + if not binary.is_file(): + raise FileNotFoundError("Unable to find `python(.exe)` in " + f"{build_dir}") + + return binary + + +def configure_build_python(context): + os.chdir(subdir("build", clean=context.clean)) + + command = [relpath(CHECKOUT / "configure")] + if context.args: + command.extend(context.args) + run(command) + + +def make_build_python(context): + os.chdir(subdir("build")) + run(["make", "-j", str(os.cpu_count())]) + + +def unpack_deps(host): + deps_url = "https://github.com/beeware/cpython-android-source-deps/releases/download" + for name_ver in ["bzip2-1.0.8-2", "libffi-3.4.4-3", "openssl-3.0.15-4", + "sqlite-3.45.3-3", "xz-5.4.6-1"]: + filename = f"{name_ver}-{host}.tar.gz" + download(f"{deps_url}/{name_ver}/{filename}") + run(["tar", "-xf", filename]) + os.remove(filename) + + +def download(url, target_dir="."): + out_path = f"{target_dir}/{basename(url)}" + run(["curl", "-Lf", "-o", out_path, url]) + return out_path + + +def configure_host_python(context): + host_dir = subdir(context.host, clean=context.clean) + + prefix_dir = host_dir / "prefix" + if not prefix_dir.exists(): + prefix_dir.mkdir() + os.chdir(prefix_dir) + unpack_deps(context.host) + + build_dir = host_dir / "build" + build_dir.mkdir(exist_ok=True) + os.chdir(build_dir) + + command = [ + # Basic cross-compiling configuration + relpath(CHECKOUT / "configure"), + f"--host={context.host}", + f"--build={sysconfig.get_config_var('BUILD_GNU_TYPE')}", + f"--with-build-python={build_python_path()}", + "--without-ensurepip", + + # Android always uses a shared libpython. + "--enable-shared", + "--without-static-libpython", + + # Dependent libraries. The others are found using pkg-config: see + # android-env.sh. + f"--with-openssl={prefix_dir}", + ] + + if context.args: + command.extend(context.args) + run(command, host=context.host) + + +def make_host_python(context): + # The CFLAGS and LDFLAGS set in android-env include the prefix dir, so + # delete any previous Python installation to prevent it being used during + # the build. + host_dir = subdir(context.host) + prefix_dir = host_dir / "prefix" + delete_glob(f"{prefix_dir}/include/python*") + delete_glob(f"{prefix_dir}/lib/libpython*") + delete_glob(f"{prefix_dir}/lib/python*") + + os.chdir(host_dir / "build") + run(["make", "-j", str(os.cpu_count())], host=context.host) + run(["make", "install", f"prefix={prefix_dir}"], host=context.host) + + +def build_all(context): + steps = [configure_build_python, make_build_python, configure_host_python, + make_host_python] + for step in steps: + step(context) + + +def clean_all(context): + delete_glob(CROSS_BUILD_DIR) + + +def setup_sdk(): + sdkmanager = android_home / ( + "cmdline-tools/latest/bin/sdkmanager" + + (".bat" if os.name == "nt" else "") + ) + + # Gradle will fail if it needs to install an SDK package whose license + # hasn't been accepted, so pre-accept all licenses. + if not all((android_home / "licenses" / path).exists() for path in [ + "android-sdk-arm-dbt-license", "android-sdk-license" + ]): + run([sdkmanager, "--licenses"], text=True, input="y\n" * 100) + + # Gradle may install this automatically, but we can't rely on that because + # we need to run adb within the logcat task. + if not adb.exists(): + run([sdkmanager, "platform-tools"]) + + +# To avoid distributing compiled artifacts without corresponding source code, +# the Gradle wrapper is not included in the CPython repository. Instead, we +# extract it from the Gradle release. +def setup_testbed(): + if all((TESTBED_DIR / path).exists() for path in [ + "gradlew", "gradlew.bat", "gradle/wrapper/gradle-wrapper.jar", + ]): + return + + ver_long = "8.7.0" + ver_short = ver_long.removesuffix(".0") + + for filename in ["gradlew", "gradlew.bat"]: + out_path = download( + f"https://raw.githubusercontent.com/gradle/gradle/v{ver_long}/{filename}", + TESTBED_DIR) + os.chmod(out_path, 0o755) + + with TemporaryDirectory(prefix=SCRIPT_NAME) as temp_dir: + bin_zip = download( + f"https://services.gradle.org/distributions/gradle-{ver_short}-bin.zip", + temp_dir) + outer_jar = f"gradle-{ver_short}/lib/plugins/gradle-wrapper-{ver_short}.jar" + run(["unzip", "-d", temp_dir, bin_zip, outer_jar]) + run(["unzip", "-o", "-d", f"{TESTBED_DIR}/gradle/wrapper", + f"{temp_dir}/{outer_jar}", "gradle-wrapper.jar"]) + + +# run_testbed will build the app automatically, but it's useful to have this as +# a separate command to allow running the app outside of this script. +def build_testbed(context): + setup_sdk() + setup_testbed() + run( + [gradlew, "--console", "plain", "packageDebug", "packageDebugAndroidTest"], + cwd=TESTBED_DIR, + ) + + +# Work around a bug involving sys.exit and TaskGroups +# (https://github.com/python/cpython/issues/101515). +def exit(*args): + raise MySystemExit(*args) + + +class MySystemExit(Exception): + pass + + +# The `test` subcommand runs all subprocesses through this context manager so +# that no matter what happens, they can always be cancelled from another task, +# and they will always be cleaned up on exit. +@asynccontextmanager +async def async_process(*args, **kwargs): + process = await asyncio.create_subprocess_exec(*args, **kwargs) + try: + yield process + finally: + if process.returncode is None: + # Allow a reasonably long time for Gradle to clean itself up, + # because we don't want stale emulators left behind. + timeout = 10 + process.terminate() + try: + await wait_for(process.wait(), timeout) + except TimeoutError: + print( + f"Command {args} did not terminate after {timeout} seconds " + f" - sending SIGKILL" + ) + process.kill() + + # Even after killing the process we must still wait for it, + # otherwise we'll get the warning "Exception ignored in __del__". + await wait_for(process.wait(), timeout=1) + + +async def async_check_output(*args, **kwargs): + async with async_process( + *args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs + ) as process: + stdout, stderr = await process.communicate() + if process.returncode == 0: + return stdout.decode(*DECODE_ARGS) + else: + raise CalledProcessError( + process.returncode, args, + stdout.decode(*DECODE_ARGS), stderr.decode(*DECODE_ARGS) + ) + + +# Return a list of the serial numbers of connected devices. Emulators will have +# serials of the form "emulator-5678". +async def list_devices(): + serials = [] + header_found = False + + lines = (await async_check_output(adb, "devices")).splitlines() + for line in lines: + # Ignore blank lines, and all lines before the header. + line = line.strip() + if line == "List of devices attached": + header_found = True + elif header_found and line: + try: + serial, status = line.split() + except ValueError: + raise ValueError(f"failed to parse {line!r}") + if status == "device": + serials.append(serial) + + if not header_found: + raise ValueError(f"failed to parse {lines}") + return serials + + +async def find_device(context, initial_devices): + if context.managed: + print("Waiting for managed device - this may take several minutes") + while True: + new_devices = set(await list_devices()).difference(initial_devices) + if len(new_devices) == 0: + await asyncio.sleep(1) + elif len(new_devices) == 1: + serial = new_devices.pop() + print(f"Serial: {serial}") + return serial + else: + exit(f"Found more than one new device: {new_devices}") + else: + return context.connected + + +# An older version of this script in #121595 filtered the logs by UID instead. +# But logcat can't filter by UID until API level 31. If we ever switch back to +# filtering by UID, we'll also have to filter by time so we only show messages +# produced after the initial call to `stop_app`. +# +# We're more likely to miss the PID because it's shorter-lived, so there's a +# workaround in PythonSuite.kt to stop it being *too* short-lived. +async def find_pid(serial): + print("Waiting for app to start - this may take several minutes") + shown_error = False + while True: + try: + # `pidof` requires API level 24 or higher. The level 23 emulator + # includes it, but it doesn't work (it returns all processes). + pid = (await async_check_output( + adb, "-s", serial, "shell", "pidof", "-s", APP_ID + )).strip() + except CalledProcessError as e: + # If the app isn't running yet, pidof gives no output. So if there + # is output, there must have been some other error. However, this + # sometimes happens transiently, especially when running a managed + # emulator for the first time, so don't make it fatal. + if (e.stdout or e.stderr) and not shown_error: + print_called_process_error(e) + print("This may be transient, so continuing to wait") + shown_error = True + else: + # Some older devices (e.g. Nexus 4) return zero even when no process + # was found, so check whether we actually got any output. + if pid: + print(f"PID: {pid}") + return pid + + # Loop fairly rapidly to avoid missing a short-lived process. + await asyncio.sleep(0.2) + + +async def logcat_task(context, initial_devices): + # Gradle may need to do some large downloads of libraries and emulator + # images. This will happen during find_device in --managed mode, or find_pid + # in --connected mode. + startup_timeout = 600 + serial = await wait_for(find_device(context, initial_devices), startup_timeout) + pid = await wait_for(find_pid(serial), startup_timeout) + + # `--pid` requires API level 24 or higher. + args = [adb, "-s", serial, "logcat", "--pid", pid, "--format", "tag"] + hidden_output = [] + async with async_process( + *args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + ) as process: + while line := (await process.stdout.readline()).decode(*DECODE_ARGS): + if match := re.fullmatch(r"([A-Z])/(.*)", line, re.DOTALL): + level, message = match.groups() + else: + # If the regex doesn't match, this is probably the second or + # subsequent line of a multi-line message. Python won't produce + # such messages, but other components might. + level, message = None, line + + # Exclude high-volume messages which are rarely useful. + if context.verbose < 2 and "from python test_syslog" in message: + continue + + # Put high-level messages on stderr so they're highlighted in the + # buildbot logs. This will include Python's own stderr. + stream = ( + sys.stderr + if level in ["W", "E", "F"] # WARNING, ERROR, FATAL (aka ASSERT) + else sys.stdout + ) + + # To simplify automated processing of the output, e.g. a buildbot + # posting a failure notice on a GitHub PR, we strip the level and + # tag indicators from Python's stdout and stderr. + for prefix in ["python.stdout: ", "python.stderr: "]: + if message.startswith(prefix): + global logcat_started + logcat_started = True + stream.write(message.removeprefix(prefix)) + break + else: + if context.verbose: + # Non-Python messages add a lot of noise, but they may + # sometimes help explain a failure. + stream.write(line) + else: + hidden_output.append(line) + + # If the device disconnects while logcat is running, which always + # happens in --managed mode, some versions of adb return non-zero. + # Distinguish this from a logcat startup error by checking whether we've + # received a message from Python yet. + status = await wait_for(process.wait(), timeout=1) + if status != 0 and not logcat_started: + raise CalledProcessError(status, args, "".join(hidden_output)) + + +def stop_app(serial): + run([adb, "-s", serial, "shell", "am", "force-stop", APP_ID], log=False) + + +async def gradle_task(context): + env = os.environ.copy() + if context.managed: + task_prefix = context.managed + else: + task_prefix = "connected" + env["ANDROID_SERIAL"] = context.connected + + args = [ + gradlew, "--console", "plain", f"{task_prefix}DebugAndroidTest", + "-Pandroid.testInstrumentationRunnerArguments.pythonArgs=" + + shlex.join(context.args), + ] + hidden_output = [] + try: + async with async_process( + *args, cwd=TESTBED_DIR, env=env, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + ) as process: + while line := (await process.stdout.readline()).decode(*DECODE_ARGS): + # Gradle may take several minutes to install SDK packages, so + # it's worth showing those messages even in non-verbose mode. + if context.verbose or line.startswith('Preparing "Install'): + sys.stdout.write(line) + else: + hidden_output.append(line) + + status = await wait_for(process.wait(), timeout=1) + if status == 0: + exit(0) + else: + raise CalledProcessError(status, args) + finally: + # If logcat never started, then something has gone badly wrong, so the + # user probably wants to see the Gradle output even in non-verbose mode. + if hidden_output and not logcat_started: + sys.stdout.write("".join(hidden_output)) + + # Gradle does not stop the tests when interrupted. + if context.connected: + stop_app(context.connected) + + +async def run_testbed(context): + setup_sdk() + setup_testbed() + + if context.managed: + # In this mode, Gradle will create a device with an unpredictable name. + # So we save a list of the running devices before starting Gradle, and + # find_device then waits for a new device to appear. + initial_devices = await list_devices() + else: + # In case the previous shutdown was unclean, make sure the app isn't + # running, otherwise we might show logs from a previous run. This is + # unnecessary in --managed mode, because Gradle creates a new emulator + # every time. + stop_app(context.connected) + initial_devices = None + + try: + async with asyncio.TaskGroup() as tg: + tg.create_task(logcat_task(context, initial_devices)) + tg.create_task(gradle_task(context)) + except* MySystemExit as e: + raise SystemExit(*e.exceptions[0].args) from None + except* CalledProcessError as e: + # Extract it from the ExceptionGroup so it can be handled by `main`. + raise e.exceptions[0] + + +# Handle SIGTERM the same way as SIGINT. This ensures that if we're terminated +# by the buildbot worker, we'll make an attempt to clean up our subprocesses. +def install_signal_handler(): + def signal_handler(*args): + os.kill(os.getpid(), signal.SIGINT) + + signal.signal(signal.SIGTERM, signal_handler) + + +def parse_args(): + parser = argparse.ArgumentParser() + subcommands = parser.add_subparsers(dest="subcommand") + build = subcommands.add_parser("build", help="Build everything") + configure_build = subcommands.add_parser("configure-build", + help="Run `configure` for the " + "build Python") + make_build = subcommands.add_parser("make-build", + help="Run `make` for the build Python") + configure_host = subcommands.add_parser("configure-host", + help="Run `configure` for Android") + make_host = subcommands.add_parser("make-host", + help="Run `make` for Android") + subcommands.add_parser( + "clean", help="Delete the cross-build directory") + + for subcommand in build, configure_build, configure_host: + subcommand.add_argument( + "--clean", action="store_true", default=False, dest="clean", + help="Delete any relevant directories before building") + for subcommand in build, configure_host, make_host: + subcommand.add_argument( + "host", metavar="HOST", + choices=["aarch64-linux-android", "x86_64-linux-android"], + help="Host triplet: choices=[%(choices)s]") + for subcommand in build, configure_build, configure_host: + subcommand.add_argument("args", nargs="*", + help="Extra arguments to pass to `configure`") + + subcommands.add_parser( + "build-testbed", help="Build the testbed app") + test = subcommands.add_parser( + "test", help="Run the test suite") + test.add_argument( + "-v", "--verbose", action="count", default=0, + help="Show Gradle output, and non-Python logcat messages. " + "Use twice to include high-volume messages which are rarely useful.") + device_group = test.add_mutually_exclusive_group(required=True) + device_group.add_argument( + "--connected", metavar="SERIAL", help="Run on a connected device. " + "Connect it yourself, then get its serial from `adb devices`.") + device_group.add_argument( + "--managed", metavar="NAME", help="Run on a Gradle-managed device. " + "These are defined in `managedDevices` in testbed/app/build.gradle.kts.") + test.add_argument( + "args", nargs="*", help=f"Arguments for `python -m test`. " + f"Separate them from {SCRIPT_NAME}'s own arguments with `--`.") + + return parser.parse_args() + + +def main(): + install_signal_handler() + + # Under the buildbot, stdout is not a TTY, but we must still flush after + # every line to make sure our output appears in the correct order relative + # to the output of our subprocesses. + for stream in [sys.stdout, sys.stderr]: + stream.reconfigure(line_buffering=True) + + context = parse_args() + dispatch = {"configure-build": configure_build_python, + "make-build": make_build_python, + "configure-host": configure_host_python, + "make-host": make_host_python, + "build": build_all, + "clean": clean_all, + "build-testbed": build_testbed, + "test": run_testbed} + + try: + result = dispatch[context.subcommand](context) + if asyncio.iscoroutine(result): + asyncio.run(result) + except CalledProcessError as e: + print_called_process_error(e) + sys.exit(1) + + +def print_called_process_error(e): + for stream_name in ["stdout", "stderr"]: + content = getattr(e, stream_name) + stream = getattr(sys, stream_name) + if content: + stream.write(content) + if not content.endswith("\n"): + stream.write("\n") + + # Format the command so it can be copied into a shell. shlex uses single + # quotes, so we surround the whole command with double quotes. + args_joined = ( + e.cmd if isinstance(e.cmd, str) + else " ".join(shlex.quote(str(arg)) for arg in e.cmd) + ) + print( + f'Command "{args_joined}" returned exit status {e.returncode}' + ) + + +if __name__ == "__main__": + main() diff --git a/Android/testbed/.gitignore b/Android/testbed/.gitignore new file mode 100644 index 00000000..b9a7d611 --- /dev/null +++ b/Android/testbed/.gitignore @@ -0,0 +1,21 @@ +# The Gradle wrapper should be downloaded by running `../android.py setup-testbed`. +/gradlew +/gradlew.bat +/gradle/wrapper/gradle-wrapper.jar + +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/deploymentTargetDropdown.xml +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/Android/testbed/app/.gitignore b/Android/testbed/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/Android/testbed/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Android/testbed/app/build.gradle.kts b/Android/testbed/app/build.gradle.kts new file mode 100644 index 00000000..6c17406c --- /dev/null +++ b/Android/testbed/app/build.gradle.kts @@ -0,0 +1,190 @@ +import com.android.build.api.variant.* +import kotlin.math.max + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +val PYTHON_DIR = file("../../..").canonicalPath +val PYTHON_CROSS_DIR = "$PYTHON_DIR/cross-build" + +val ABIS = mapOf( + "arm64-v8a" to "aarch64-linux-android", + "x86_64" to "x86_64-linux-android", +).filter { file("$PYTHON_CROSS_DIR/${it.value}").exists() } +if (ABIS.isEmpty()) { + throw GradleException( + "No Android ABIs found in $PYTHON_CROSS_DIR: see Android/README.md " + + "for building instructions." + ) +} + +val PYTHON_VERSION = file("$PYTHON_DIR/Include/patchlevel.h").useLines { + for (line in it) { + val match = """#define PY_VERSION\s+"(\d+\.\d+)""".toRegex().find(line) + if (match != null) { + return@useLines match.groupValues[1] + } + } + throw GradleException("Failed to find Python version") +} + + +android { + namespace = "org.python.testbed" + compileSdk = 34 + + defaultConfig { + applicationId = "org.python.testbed" + minSdk = 21 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + ndk.abiFilters.addAll(ABIS.keys) + externalNativeBuild.cmake.arguments( + "-DPYTHON_CROSS_DIR=$PYTHON_CROSS_DIR", + "-DPYTHON_VERSION=$PYTHON_VERSION", + "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON", + ) + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + val androidEnvFile = file("../../android-env.sh").absoluteFile + ndkVersion = androidEnvFile.useLines { + for (line in it) { + """ndk_version=(\S+)""".toRegex().find(line)?.let { + return@useLines it.groupValues[1] + } + } + throw GradleException("Failed to find NDK version in $androidEnvFile") + } + externalNativeBuild.cmake { + path("src/main/c/CMakeLists.txt") + } + + // Set this property to something non-empty, otherwise it'll use the default + // list, which ignores asset directories beginning with an underscore. + aaptOptions.ignoreAssetsPattern = ".git" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + + testOptions { + managedDevices { + localDevices { + create("minVersion") { + device = "Small Phone" + + // Managed devices have a minimum API level of 27. + apiLevel = max(27, defaultConfig.minSdk!!) + + // ATD devices are smaller and faster, but have a minimum + // API level of 30. + systemImageSource = if (apiLevel >= 30) "aosp-atd" else "aosp" + } + + create("maxVersion") { + device = "Small Phone" + apiLevel = defaultConfig.targetSdk!! + systemImageSource = "aosp-atd" + } + } + + // If the previous test run succeeded and nothing has changed, + // Gradle thinks there's no need to run it again. Override that. + afterEvaluate { + (localDevices.names + listOf("connected")).forEach { + tasks.named("${it}DebugAndroidTest") { + outputs.upToDateWhen { false } + } + } + } + } + } +} + +dependencies { + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.11.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test:rules:1.5.0") +} + + +// Create some custom tasks to copy Python and its standard library from +// elsewhere in the repository. +androidComponents.onVariants { variant -> + val pyPlusVer = "python$PYTHON_VERSION" + generateTask(variant, variant.sources.assets!!) { + into("python") { + into("include/$pyPlusVer") { + for (triplet in ABIS.values) { + from("$PYTHON_CROSS_DIR/$triplet/prefix/include/$pyPlusVer") + } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } + + into("lib/$pyPlusVer") { + // To aid debugging, the source directory takes priority. + from("$PYTHON_DIR/Lib") + + // The cross-build directory provides ABI-specific files such as + // sysconfigdata. + for (triplet in ABIS.values) { + from("$PYTHON_CROSS_DIR/$triplet/prefix/lib/$pyPlusVer") + } + + into("site-packages") { + from("$projectDir/src/main/python") + } + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + exclude("**/__pycache__") + } + } + } + + generateTask(variant, variant.sources.jniLibs!!) { + for ((abi, triplet) in ABIS.entries) { + into(abi) { + from("$PYTHON_CROSS_DIR/$triplet/prefix/lib") + include("libpython*.*.so") + include("lib*_python.so") + } + } + } +} + + +fun generateTask( + variant: ApplicationVariant, directories: SourceDirectories, + configure: GenerateTask.() -> Unit +) { + val taskName = "generate" + + listOf(variant.name, "Python", directories.name) + .map { it.replaceFirstChar(Char::uppercase) } + .joinToString("") + + directories.addGeneratedSourceDirectory( + tasks.register(taskName) { + into(outputDir) + configure() + }, + GenerateTask::outputDir) +} + + +// addGeneratedSourceDirectory requires the task to have a DirectoryProperty. +abstract class GenerateTask: Sync() { + @get:OutputDirectory + abstract val outputDir: DirectoryProperty +} diff --git a/Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt b/Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt new file mode 100644 index 00000000..0e888ab7 --- /dev/null +++ b/Android/testbed/app/src/androidTest/java/org/python/testbed/PythonSuite.kt @@ -0,0 +1,35 @@ +package org.python.testbed + +import androidx.test.annotation.UiThreadTest +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + + +@RunWith(AndroidJUnit4::class) +class PythonSuite { + @Test + @UiThreadTest + fun testPython() { + val start = System.currentTimeMillis() + try { + val context = + InstrumentationRegistry.getInstrumentation().targetContext + val args = + InstrumentationRegistry.getArguments().getString("pythonArgs", "") + val status = PythonTestRunner(context).run(args) + assertEquals(0, status) + } finally { + // Make sure the process lives long enough for the test script to + // detect it (see `find_pid` in android.py). + val delay = 2000 - (System.currentTimeMillis() - start) + if (delay > 0) { + Thread.sleep(delay) + } + } + } +} diff --git a/Android/testbed/app/src/main/AndroidManifest.xml b/Android/testbed/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..2be8a82d --- /dev/null +++ b/Android/testbed/app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/testbed/app/src/main/c/CMakeLists.txt b/Android/testbed/app/src/main/c/CMakeLists.txt new file mode 100644 index 00000000..1d5df9a7 --- /dev/null +++ b/Android/testbed/app/src/main/c/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.4.1) +project(testbed) + +set(PREFIX_DIR ${PYTHON_CROSS_DIR}/${CMAKE_LIBRARY_ARCHITECTURE}/prefix) +include_directories(${PREFIX_DIR}/include/python${PYTHON_VERSION}) +link_directories(${PREFIX_DIR}/lib) +link_libraries(log python${PYTHON_VERSION}) + +add_library(main_activity SHARED main_activity.c) diff --git a/Android/testbed/app/src/main/c/main_activity.c b/Android/testbed/app/src/main/c/main_activity.c new file mode 100644 index 00000000..69251332 --- /dev/null +++ b/Android/testbed/app/src/main/c/main_activity.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +static void throw_runtime_exception(JNIEnv *env, const char *message) { + (*env)->ThrowNew( + env, + (*env)->FindClass(env, "java/lang/RuntimeException"), + message); +} + + +// --- Stdio redirection ------------------------------------------------------ + +// Most apps won't need this, because the Python-level sys.stdout and sys.stderr +// are redirected to the Android logcat by Python itself. However, in the +// testbed it's useful to redirect the native streams as well, to debug problems +// in the Python startup or redirection process. +// +// Based on +// https://github.com/beeware/briefcase-android-gradle-template/blob/v0.3.11/%7B%7B%20cookiecutter.safe_formal_name%20%7D%7D/app/src/main/cpp/native-lib.cpp + +typedef struct { + FILE *file; + int fd; + android_LogPriority priority; + char *tag; + int pipe[2]; +} StreamInfo; + +static StreamInfo STREAMS[] = { + {stdout, STDOUT_FILENO, ANDROID_LOG_INFO, "native.stdout", {-1, -1}}, + {stderr, STDERR_FILENO, ANDROID_LOG_WARN, "native.stderr", {-1, -1}}, + {NULL, -1, ANDROID_LOG_UNKNOWN, NULL, {-1, -1}}, +}; + +// The maximum length of a log message in bytes, including the level marker and +// tag, is defined as LOGGER_ENTRY_MAX_PAYLOAD in +// platform/system/logging/liblog/include/log/log.h. As of API level 30, messages +// longer than this will be be truncated by logcat. This limit has already been +// reduced at least once in the history of Android (from 4076 to 4068 between API +// level 23 and 26), so leave some headroom. +static const int MAX_BYTES_PER_WRITE = 4000; + +static void *redirection_thread(void *arg) { + StreamInfo *si = (StreamInfo*)arg; + ssize_t read_size; + char buf[MAX_BYTES_PER_WRITE]; + while ((read_size = read(si->pipe[0], buf, sizeof buf - 1)) > 0) { + buf[read_size] = '\0'; /* add null-terminator */ + __android_log_write(si->priority, si->tag, buf); + } + return 0; +} + +static char *redirect_stream(StreamInfo *si) { + /* make the FILE unbuffered, to ensure messages are never lost */ + if (setvbuf(si->file, 0, _IONBF, 0)) { + return "setvbuf"; + } + + /* create the pipe and redirect the file descriptor */ + if (pipe(si->pipe)) { + return "pipe"; + } + if (dup2(si->pipe[1], si->fd) == -1) { + return "dup2"; + } + + /* start the logging thread */ + pthread_t thr; + if ((errno = pthread_create(&thr, 0, redirection_thread, si))) { + return "pthread_create"; + } + if ((errno = pthread_detach(thr))) { + return "pthread_detach"; + } + return 0; +} + +JNIEXPORT void JNICALL Java_org_python_testbed_PythonTestRunner_redirectStdioToLogcat( + JNIEnv *env, jobject obj +) { + for (StreamInfo *si = STREAMS; si->file; si++) { + char *error_prefix; + if ((error_prefix = redirect_stream(si))) { + char error_message[1024]; + snprintf(error_message, sizeof(error_message), + "%s: %s", error_prefix, strerror(errno)); + throw_runtime_exception(env, error_message); + return; + } + } +} + + +// --- Python initialization --------------------------------------------------- + +static PyStatus set_config_string( + JNIEnv *env, PyConfig *config, wchar_t **config_str, jstring value +) { + const char *value_utf8 = (*env)->GetStringUTFChars(env, value, NULL); + PyStatus status = PyConfig_SetBytesString(config, config_str, value_utf8); + (*env)->ReleaseStringUTFChars(env, value, value_utf8); + return status; +} + +static void throw_status(JNIEnv *env, PyStatus status) { + throw_runtime_exception(env, status.err_msg ? status.err_msg : ""); +} + +JNIEXPORT int JNICALL Java_org_python_testbed_PythonTestRunner_runPython( + JNIEnv *env, jobject obj, jstring home, jstring runModule +) { + PyConfig config; + PyStatus status; + PyConfig_InitIsolatedConfig(&config); + + status = set_config_string(env, &config, &config.home, home); + if (PyStatus_Exception(status)) { + throw_status(env, status); + return 1; + } + + status = set_config_string(env, &config, &config.run_module, runModule); + if (PyStatus_Exception(status)) { + throw_status(env, status); + return 1; + } + + // Some tests generate SIGPIPE and SIGXFSZ, which should be ignored. + config.install_signal_handlers = 1; + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + throw_status(env, status); + return 1; + } + + return Py_RunMain(); +} diff --git a/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt b/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt new file mode 100644 index 00000000..c4bf6cbe --- /dev/null +++ b/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt @@ -0,0 +1,79 @@ +package org.python.testbed + +import android.content.Context +import android.os.* +import android.system.Os +import android.widget.TextView +import androidx.appcompat.app.* +import java.io.* + + +// Launching the tests from an activity is OK for a quick check, but for +// anything more complicated it'll be more convenient to use `android.py test` +// to launch the tests via PythonSuite. +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + val status = PythonTestRunner(this).run("-W -uall") + findViewById(R.id.tvHello).text = "Exit status $status" + } +} + + +class PythonTestRunner(val context: Context) { + /** @param args Extra arguments for `python -m test`. + * @return The Python exit status: zero if the tests passed, nonzero if + * they failed. */ + fun run(args: String = "") : Int { + Os.setenv("PYTHON_ARGS", args, true) + + // Python needs this variable to help it find the temporary directory, + // but Android only sets it on API level 33 and later. + Os.setenv("TMPDIR", context.cacheDir.toString(), false) + + val pythonHome = extractAssets() + System.loadLibrary("main_activity") + redirectStdioToLogcat() + + // The main module is in src/main/python/main.py. + return runPython(pythonHome.toString(), "main") + } + + private fun extractAssets() : File { + val pythonHome = File(context.filesDir, "python") + if (pythonHome.exists() && !pythonHome.deleteRecursively()) { + throw RuntimeException("Failed to delete $pythonHome") + } + extractAssetDir("python", context.filesDir) + return pythonHome + } + + private fun extractAssetDir(path: String, targetDir: File) { + val names = context.assets.list(path) + ?: throw RuntimeException("Failed to list $path") + val targetSubdir = File(targetDir, path) + if (!targetSubdir.mkdirs()) { + throw RuntimeException("Failed to create $targetSubdir") + } + + for (name in names) { + val subPath = "$path/$name" + val input: InputStream + try { + input = context.assets.open(subPath) + } catch (e: FileNotFoundException) { + extractAssetDir(subPath, targetDir) + continue + } + input.use { + File(targetSubdir, name).outputStream().use { output -> + input.copyTo(output) + } + } + } + } + + private external fun redirectStdioToLogcat() + private external fun runPython(home: String, runModule: String) : Int +} diff --git a/Android/testbed/app/src/main/python/main.py b/Android/testbed/app/src/main/python/main.py new file mode 100644 index 00000000..d6941b14 --- /dev/null +++ b/Android/testbed/app/src/main/python/main.py @@ -0,0 +1,32 @@ +import os +import runpy +import shlex +import signal +import sys + +# Some tests use SIGUSR1, but that's blocked by default in an Android app in +# order to make it available to `sigwait` in the Signal Catcher thread. +# (https://cs.android.com/android/platform/superproject/+/android14-qpr3-release:art/runtime/signal_catcher.cc). +# That thread's functionality is only useful for debugging the JVM, so disabling +# it should not weaken the tests. +# +# There's no safe way of stopping the thread completely (#123982), but simply +# unblocking SIGUSR1 is enough to fix most tests. +# +# However, in tests that generate multiple different signals in quick +# succession, it's possible for SIGUSR1 to arrive while the main thread is busy +# running the C-level handler for a different signal. In that case, the SIGUSR1 +# may be sent to the Signal Catcher thread instead, which will generate a log +# message containing the text "reacting to signal". +# +# Such tests may need to be changed in one of the following ways: +# * Use a signal other than SIGUSR1 (e.g. test_stress_delivery_simultaneous in +# test_signal.py). +# * Send the signal to a specific thread rather than the whole process (e.g. +# test_signals in test_threadsignals.py. +signal.pthread_sigmask(signal.SIG_UNBLOCK, [signal.SIGUSR1]) + +sys.argv[1:] = shlex.split(os.environ["PYTHON_ARGS"]) + +# The test module will call sys.exit to indicate whether the tests passed. +runpy.run_module("test") diff --git a/Android/testbed/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/Android/testbed/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..741d6580d60e05080e71e845240863f6b273333c GIT binary patch literal 3110 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 literal 0 HcmV?d00001 diff --git a/Android/testbed/app/src/main/res/layout/activity_main.xml b/Android/testbed/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..21398609 --- /dev/null +++ b/Android/testbed/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/Android/testbed/app/src/main/res/values/strings.xml b/Android/testbed/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..352d2f9e --- /dev/null +++ b/Android/testbed/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Python testbed + \ No newline at end of file diff --git a/Android/testbed/build.gradle.kts b/Android/testbed/build.gradle.kts new file mode 100644 index 00000000..4d1d6f87 --- /dev/null +++ b/Android/testbed/build.gradle.kts @@ -0,0 +1,5 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("com.android.application") version "8.6.1" apply false + id("org.jetbrains.kotlin.android") version "1.9.22" apply false +} diff --git a/Android/testbed/gradle.properties b/Android/testbed/gradle.properties new file mode 100644 index 00000000..e9f345c8 --- /dev/null +++ b/Android/testbed/gradle.properties @@ -0,0 +1,28 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true + +# By default, the app will be uninstalled after the tests finish (apparently +# after 10 seconds in case of an unclean shutdown). We disable this, because +# when using android.py it can conflict with the installation of the next run. +android.injected.androidTest.leaveApksInstalledAfterRun=true diff --git a/Android/testbed/gradle/wrapper/gradle-wrapper.properties b/Android/testbed/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..36529c89 --- /dev/null +++ b/Android/testbed/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Feb 19 20:29:06 GMT 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/Android/testbed/settings.gradle.kts b/Android/testbed/settings.gradle.kts new file mode 100644 index 00000000..5e08773e --- /dev/null +++ b/Android/testbed/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "Python testbed" +include(":app") + \ No newline at end of file diff --git a/Doc/.ruff.toml b/Doc/.ruff.toml new file mode 100644 index 00000000..111ce03b --- /dev/null +++ b/Doc/.ruff.toml @@ -0,0 +1,42 @@ +target-version = "py312" # Align with the version in oldest_supported_sphinx +fix = true +output-format = "full" +line-length = 79 +extend-exclude = [ + "includes/*", + # Temporary exclusions: + "tools/extensions/pyspecific.py", +] + +[lint] +preview = true +select = [ + "C4", # flake8-comprehensions + "B", # flake8-bugbear + "E", # pycodestyle + "F", # pyflakes + "FA", # flake8-future-annotations + "FLY", # flynt + "FURB", # refurb + "G", # flake8-logging-format + "I", # isort + "LOG", # flake8-logging + "N", # pep8-naming + "PERF", # perflint + "PGH", # pygrep-hooks + "PT", # flake8-pytest-style + "TCH", # flake8-type-checking + "UP", # pyupgrade + "W", # pycodestyle +] +ignore = [ + "E501", # Ignore line length errors (we use auto-formatting) +] + +[format] +preview = true +quote-style = "preserve" +docstring-code-format = true +exclude = [ + "tools/extensions/lexers/*", +] diff --git a/Doc/Makefile b/Doc/Makefile index 22691895..4a704ad5 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -6,8 +6,8 @@ # You can set these variables from the command line. PYTHON = python3 VENVDIR = ./venv +UV = uv SPHINXBUILD = PATH=$(VENVDIR)/bin:$$PATH sphinx-build -SPHINXLINT = PATH=$(VENVDIR)/bin:$$PATH sphinx-lint BLURB = PATH=$(VENVDIR)/bin:$$PATH blurb JOBS = auto PAPER = @@ -20,8 +20,12 @@ SPHINXERRORHANDLING = -W PAPEROPT_a4 = -D latex_elements.papersize=a4paper PAPEROPT_letter = -D latex_elements.papersize=letterpaper -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) -j $(JOBS) \ - $(SPHINXOPTS) $(SPHINXERRORHANDLING) . build/$(BUILDER) $(SOURCES) +ALLSPHINXOPTS = -b $(BUILDER) \ + -d build/doctrees \ + -j $(JOBS) \ + $(PAPEROPT_$(PAPER)) \ + $(SPHINXOPTS) $(SPHINXERRORHANDLING) \ + . build/$(BUILDER) $(SOURCES) .PHONY: help help: @@ -29,7 +33,9 @@ help: @echo " clean to remove build files" @echo " venv to create a venv with necessary tools" @echo " html to make standalone HTML files" + @echo " gettext to generate POT files" @echo " htmlview to open the index page built by the html target in your browser" + @echo " htmllive to rebuild and reload HTML files in your browser" @echo " htmlhelp to make HTML files and a HTML help project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " text to make plain text files" @@ -136,10 +142,20 @@ pydoc-topics: build @echo "Building finished; now run this:" \ "cp build/pydoc-topics/topics.py ../Lib/pydoc_data/topics.py" +.PHONY: gettext +gettext: BUILDER = gettext +gettext: override SPHINXOPTS := -d build/doctrees-gettext $(SPHINXOPTS) +gettext: build + .PHONY: htmlview htmlview: html $(PYTHON) -c "import os, webbrowser; webbrowser.open('file://' + os.path.realpath('build/html/index.html'))" +.PHONY: htmllive +htmllive: SPHINXBUILD = PATH=$(VENVDIR)/bin:$$PATH sphinx-autobuild +htmllive: SPHINXOPTS = --re-ignore="/venv/" --open-browser --delay 0 +htmllive: _ensure-sphinx-autobuild html + .PHONY: clean clean: clean-venv -rm -rf build/* @@ -154,75 +170,131 @@ venv: echo "venv already exists."; \ echo "To recreate it, remove it first with \`make clean-venv'."; \ else \ - $(PYTHON) -m venv $(VENVDIR); \ - $(VENVDIR)/bin/python3 -m pip install --upgrade pip; \ - $(VENVDIR)/bin/python3 -m pip install -r $(REQUIREMENTS); \ + echo "Creating venv in $(VENVDIR)"; \ + if $(UV) --version >/dev/null 2>&1; then \ + $(UV) venv $(VENVDIR); \ + VIRTUAL_ENV=$(VENVDIR) $(UV) pip install -r $(REQUIREMENTS); \ + else \ + $(PYTHON) -m venv $(VENVDIR); \ + $(VENVDIR)/bin/python3 -m pip install --upgrade pip; \ + $(VENVDIR)/bin/python3 -m pip install -r $(REQUIREMENTS); \ + fi; \ echo "The venv has been created in the $(VENVDIR) directory"; \ fi +.PHONY: dist-no-html +dist-no-html: dist-text dist-pdf dist-epub dist-texinfo + .PHONY: dist dist: rm -rf dist mkdir -p dist - + $(MAKE) dist-html + $(MAKE) dist-text + $(MAKE) dist-pdf + $(MAKE) dist-epub + $(MAKE) dist-texinfo + +.PHONY: dist-html +dist-html: # archive the HTML - make html + @echo "Building HTML..." + mkdir -p dist + rm -rf build/html + find dist -name 'python-$(DISTVERSION)-docs-html*' -exec rm -rf {} \; + $(MAKE) html cp -pPR build/html dist/python-$(DISTVERSION)-docs-html tar -C dist -cf dist/python-$(DISTVERSION)-docs-html.tar python-$(DISTVERSION)-docs-html bzip2 -9 -k dist/python-$(DISTVERSION)-docs-html.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-html.zip python-$(DISTVERSION)-docs-html) rm -r dist/python-$(DISTVERSION)-docs-html rm dist/python-$(DISTVERSION)-docs-html.tar + @echo "Build finished and archived!" +.PHONY: dist-text +dist-text: # archive the text build - make text + @echo "Building text..." + mkdir -p dist + rm -rf build/text + find dist -name 'python-$(DISTVERSION)-docs-text*' -exec rm -rf {} \; + $(MAKE) text cp -pPR build/text dist/python-$(DISTVERSION)-docs-text tar -C dist -cf dist/python-$(DISTVERSION)-docs-text.tar python-$(DISTVERSION)-docs-text bzip2 -9 -k dist/python-$(DISTVERSION)-docs-text.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-text.zip python-$(DISTVERSION)-docs-text) rm -r dist/python-$(DISTVERSION)-docs-text rm dist/python-$(DISTVERSION)-docs-text.tar + @echo "Build finished and archived!" +.PHONY: dist-pdf +dist-pdf: # archive the A4 latex + @echo "Building LaTeX (A4 paper)..." + mkdir -p dist rm -rf build/latex - make latex PAPER=a4 - -sed -i 's/makeindex/makeindex -q/' build/latex/Makefile - (cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2) + find dist -name 'python-$(DISTVERSION)-docs-pdf*' -exec rm -rf {} \; + $(MAKE) latex PAPER=a4 + # remove zip & bz2 dependency on all-pdf, + # as otherwise the full latexmk process is run twice. + # ($$ is needed to escape the $; https://www.gnu.org/software/make/manual/make.html#Basics-of-Variable-References) + -sed -i 's/: all-$$(FMT)/:/' build/latex/Makefile + (cd build/latex; $(MAKE) clean && $(MAKE) --jobs=$$((`nproc`+1)) --output-sync LATEXMKOPTS='-quiet' all-pdf && $(MAKE) FMT=pdf zip bz2) cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-a4.zip cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-a4.tar.bz2 + @echo "Build finished and archived!" - # archive the letter latex - rm -rf build/latex - make latex PAPER=letter - -sed -i 's/makeindex/makeindex -q/' build/latex/Makefile - (cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2) - cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-letter.zip - cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-letter.tar.bz2 - +.PHONY: dist-epub +dist-epub: # copy the epub build + @echo "Building EPUB..." + mkdir -p dist rm -rf build/epub - make epub + rm -f dist/python-$(DISTVERSION)-docs.epub + $(MAKE) epub cp -pPR build/epub/Python.epub dist/python-$(DISTVERSION)-docs.epub + @echo "Build finished and archived!" +.PHONY: dist-texinfo +dist-texinfo: # archive the texinfo build + @echo "Building Texinfo..." + mkdir -p dist rm -rf build/texinfo - make texinfo - make info --directory=build/texinfo + find dist -name 'python-$(DISTVERSION)-docs-texinfo*' -exec rm -rf {} \; + $(MAKE) texinfo + $(MAKE) info --directory=build/texinfo cp -pPR build/texinfo dist/python-$(DISTVERSION)-docs-texinfo tar -C dist -cf dist/python-$(DISTVERSION)-docs-texinfo.tar python-$(DISTVERSION)-docs-texinfo bzip2 -9 -k dist/python-$(DISTVERSION)-docs-texinfo.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-texinfo.zip python-$(DISTVERSION)-docs-texinfo) rm -r dist/python-$(DISTVERSION)-docs-texinfo rm dist/python-$(DISTVERSION)-docs-texinfo.tar + @echo "Build finished and archived!" + +.PHONY: _ensure-package +_ensure-package: venv + if $(UV) --version >/dev/null 2>&1; then \ + VIRTUAL_ENV=$(VENVDIR) $(UV) pip install $(PACKAGE); \ + else \ + $(VENVDIR)/bin/python3 -m pip install $(PACKAGE); \ + fi + +.PHONY: _ensure-pre-commit +_ensure-pre-commit: + $(MAKE) _ensure-package PACKAGE=pre-commit + +.PHONY: _ensure-sphinx-autobuild +_ensure-sphinx-autobuild: + $(MAKE) _ensure-package PACKAGE=sphinx-autobuild .PHONY: check -check: venv - $(VENVDIR)/bin/python3 -m pre_commit --version > /dev/null || $(VENVDIR)/bin/python3 -m pip install pre-commit +check: _ensure-pre-commit $(VENVDIR)/bin/python3 -m pre_commit run --all-files .PHONY: serve serve: - @echo "The serve target was removed, use htmlview instead (see bpo-36329)" + @echo "The serve target was removed, use htmllive instead (see gh-80510)" # Targets for daily automated doc build # By default, Sphinx only rebuilds pages where the page content has changed. @@ -233,13 +305,15 @@ serve: # for development releases: always build .PHONY: autobuild-dev +autobuild-dev: DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py --short) autobuild-dev: - make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' + $(MAKE) dist-no-html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' DISTVERSION=$(DISTVERSION) -# for quick rebuilds (HTML only) +# for HTML-only rebuilds .PHONY: autobuild-dev-html +autobuild-dev-html: DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py --short) autobuild-dev-html: - make html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' + $(MAKE) dist-html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' DISTVERSION=$(DISTVERSION) # for stable releases: only build if not in pre-release stage (alpha, beta) # release candidate downloads are okay, since the stable tree can be in that stage @@ -249,7 +323,7 @@ autobuild-stable: echo "Not building; $(DISTVERSION) is not a release version."; \ exit 1;; \ esac - @make autobuild-dev + @$(MAKE) autobuild-dev .PHONY: autobuild-stable-html autobuild-stable-html: @@ -257,4 +331,4 @@ autobuild-stable-html: echo "Not building; $(DISTVERSION) is not a release version."; \ exit 1;; \ esac - @make autobuild-dev-html + @$(MAKE) autobuild-dev-html diff --git a/Doc/README.rst b/Doc/README.rst index a3bb5fa5..2d114875 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -28,7 +28,7 @@ install the tools into there. Using make ---------- -To get started on UNIX, you can create a virtual environment and build +To get started on Unix, you can create a virtual environment and build documentation with the commands:: make venv @@ -40,13 +40,13 @@ If you'd like to create the virtual environment in a different location, you can specify it using the ``VENVDIR`` variable. You can also skip creating the virtual environment altogether, in which case -the Makefile will look for instances of ``sphinx-build`` and ``blurb`` +the ``Makefile`` will look for instances of ``sphinx-build`` and ``blurb`` installed on your process ``PATH`` (configurable with the ``SPHINXBUILD`` and ``BLURB`` variables). -On Windows, we try to emulate the Makefile as closely as possible with a +On Windows, we try to emulate the ``Makefile`` as closely as possible with a ``make.bat`` file. If you need to specify the Python interpreter to use, -set the PYTHON environment variable. +set the ``PYTHON`` environment variable. Available make targets are: @@ -62,15 +62,19 @@ Available make targets are: * "htmlview", which re-uses the "html" builder, but then opens the main page in your default web browser. +* "htmllive", which re-uses the "html" builder, rebuilds the docs, + starts a local server, and automatically reloads the page in your browser + when you make changes to reST files (Unix only). + * "htmlhelp", which builds HTML files and a HTML Help project file usable to convert them into a single Compiled HTML (.chm) file -- these are popular under Microsoft Windows, but very handy on every platform. To create the CHM file, you need to run the Microsoft HTML Help Workshop - over the generated project (.hhp) file. The make.bat script does this for + over the generated project (.hhp) file. The ``make.bat`` script does this for you on Windows. -* "latex", which builds LaTeX source files as input to "pdflatex" to produce +* "latex", which builds LaTeX source files as input to ``pdflatex`` to produce PDF documents. * "text", which builds a plain text file for each source file. @@ -95,8 +99,6 @@ Available make targets are: * "check", which checks for frequent markup errors. -* "serve", which serves the build/html directory on port 8000. - * "dist", (Unix only) which creates distributable archives of HTML, text, PDF, and EPUB builds. @@ -131,8 +133,5 @@ Bugs in the content should be reported to the Bugs in the toolset should be reported to the tools themselves. -You can also send a mail to the Python Documentation Team at docs@python.org, -and we will process your request as soon as possible. - -If you want to help the Documentation Team, you are always welcome. Just send -a mail to docs@python.org. +To help with the documentation, or report any problems, please leave a message +on `discuss.python.org `_. diff --git a/Doc/bugs.rst b/Doc/bugs.rst index d98192b3..9aff2f0f 100644 --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -22,6 +22,10 @@ have a suggestion on how to fix it, include that as well. You can also open a discussion item on our `Documentation Discourse forum `_. +If you find a bug in the theme (HTML / CSS / JavaScript) of the +documentation, please submit a bug report on the `python-doc-theme bug +tracker `_. + If you're short on time, you can also email documentation bug reports to docs@python.org (behavioral bugs can be sent to python-list@python.org). 'docs@' is a mailing list run by volunteers; your request will be noticed, @@ -38,7 +42,7 @@ though it may take a while to be processed. `Helping with Documentation `_ Comprehensive guide for individuals that are interested in contributing to Python documentation. - `Documentation Translations `_ + `Documentation Translations `_ A list of GitHub pages for documentation translation and their primary contacts. diff --git a/Doc/c-api/abstract.rst b/Doc/c-api/abstract.rst index 1823f9d7..f5df09fa 100644 --- a/Doc/c-api/abstract.rst +++ b/Doc/c-api/abstract.rst @@ -24,4 +24,3 @@ but whose items have not been set to some non-\ ``NULL`` value yet. mapping.rst iter.rst buffer.rst - objbuffer.rst diff --git a/Doc/c-api/allocation.rst b/Doc/c-api/allocation.rst index b3609c23..e6ff40ab 100644 --- a/Doc/c-api/allocation.rst +++ b/Doc/c-api/allocation.rst @@ -15,10 +15,8 @@ Allocating Objects on the Heap .. c:function:: PyObject* PyObject_Init(PyObject *op, PyTypeObject *type) Initialize a newly allocated object *op* with its type and initial - reference. Returns the initialized object. If *type* indicates that the - object participates in the cyclic garbage detector, it is added to the - detector's set of observed objects. Other fields of the object are not - affected. + reference. Returns the initialized object. Other fields of the object are + not affected. .. c:function:: PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size) diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 657b10d3..3201bdc8 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -27,9 +27,18 @@ unit; the entry in (round) parentheses is the Python object type that matches the format unit; and the entry in [square] brackets is the type of the C variable(s) whose address should be passed. +.. _arg-parsing-string-and-buffers: + Strings and buffers ------------------- +.. note:: + + On Python 3.12 and older, the macro :c:macro:`!PY_SSIZE_T_CLEAN` must be + defined before including :file:`Python.h` to use all ``#`` variants of + formats (``s#``, ``y#``, etc.) explained below. + This is not necessary on Python 3.13 and later. + These formats allow accessing an object as a contiguous chunk of memory. You don't have to provide raw storage for the returned unicode or bytes area. @@ -68,15 +77,6 @@ There are three ways strings and buffers can be converted to C: whether the input object is immutable (e.g. whether it would honor a request for a writable buffer, or whether another thread can mutate the data). -.. note:: - - For all ``#`` variants of formats (``s#``, ``y#``, etc.), the macro - :c:macro:`PY_SSIZE_T_CLEAN` must be defined before including - :file:`Python.h`. On Python 3.9 and older, the type of the length argument - is :c:type:`Py_ssize_t` if the :c:macro:`PY_SSIZE_T_CLEAN` macro is defined, - or int otherwise. - - ``s`` (:class:`str`) [const char \*] Convert a Unicode object to a C pointer to a character string. A pointer to an existing string is stored in the character pointer @@ -280,10 +280,10 @@ Numbers length 1, to a C :c:expr:`int`. ``f`` (:class:`float`) [float] - Convert a Python floating point number to a C :c:expr:`float`. + Convert a Python floating-point number to a C :c:expr:`float`. ``d`` (:class:`float`) [double] - Convert a Python floating point number to a C :c:expr:`double`. + Convert a Python floating-point number to a C :c:expr:`double`. ``D`` (:class:`complex`) [Py_complex] Convert a Python complex number to a C :c:type:`Py_complex` structure. @@ -413,21 +413,35 @@ API Functions than a variable number of arguments. -.. c:function:: int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], ...) +.. c:function:: int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char * const *keywords, ...) Parse the parameters of a function that takes both positional and keyword - parameters into local variables. The *keywords* argument is a - ``NULL``-terminated array of keyword parameter names. Empty names denote + parameters into local variables. + The *keywords* argument is a ``NULL``-terminated array of keyword parameter + names specified as null-terminated ASCII or UTF-8 encoded C strings. + Empty names denote :ref:`positional-only parameters `. Returns true on success; on failure, it returns false and raises the appropriate exception. + .. note:: + + The *keywords* parameter declaration is :c:expr:`char * const *` in C and + :c:expr:`const char * const *` in C++. + This can be overridden with the :c:macro:`PY_CXX_CONST` macro. + .. versionchanged:: 3.6 Added support for :ref:`positional-only parameters `. + .. versionchanged:: 3.13 + The *keywords* parameter has now type :c:expr:`char * const *` in C and + :c:expr:`const char * const *` in C++, instead of :c:expr:`char **`. + Added support for non-ASCII keyword parameter names. + -.. c:function:: int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], va_list vargs) + +.. c:function:: int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char * const *keywords, va_list vargs) Identical to :c:func:`PyArg_ParseTupleAndKeywords`, except that it accepts a va_list rather than a variable number of arguments. @@ -442,16 +456,24 @@ API Functions .. versionadded:: 3.2 -.. XXX deprecated, will be removed .. c:function:: int PyArg_Parse(PyObject *args, const char *format, ...) - Function used to deconstruct the argument lists of "old-style" functions --- - these are functions which use the :const:`METH_OLDARGS` parameter parsing - method, which has been removed in Python 3. This is not recommended for use - in parameter parsing in new code, and most code in the standard interpreter - has been modified to no longer use this for that purpose. It does remain a - convenient way to decompose other tuples, however, and may continue to be - used for that purpose. + Parse the parameter of a function that takes a single positional parameter + into a local variable. Returns true on success; on failure, it returns + false and raises the appropriate exception. + + Example:: + + // Function using METH_O calling convention + static PyObject* + my_function(PyObject *module, PyObject *arg) + { + int value; + if (!PyArg_Parse(arg, "i:my_function", &value)) { + return NULL; + } + // ... use value ... + } .. c:function:: int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) @@ -492,6 +514,19 @@ API Functions PyArg_ParseTuple(args, "O|O:ref", &object, &callback) +.. c:macro:: PY_CXX_CONST + + The value to be inserted, if any, before :c:expr:`char * const *` + in the *keywords* parameter declaration of + :c:func:`PyArg_ParseTupleAndKeywords` and + :c:func:`PyArg_VaParseTupleAndKeywords`. + Default empty for C and ``const`` for C++ + (:c:expr:`const char * const *`). + To override, define it to the desired value before including + :file:`Python.h`. + + .. versionadded:: 3.13 + --------------- Building values @@ -607,10 +642,10 @@ Building values object of length 1. ``d`` (:class:`float`) [double] - Convert a C :c:expr:`double` to a Python floating point number. + Convert a C :c:expr:`double` to a Python floating-point number. ``f`` (:class:`float`) [float] - Convert a C :c:expr:`float` to a Python floating point number. + Convert a C :c:expr:`float` to a Python floating-point number. ``D`` (:class:`complex`) [Py_complex \*] Convert a C :c:type:`Py_complex` structure to a Python complex number. diff --git a/Doc/c-api/bool.rst b/Doc/c-api/bool.rst index b14fa6a0..b4dc4849 100644 --- a/Doc/c-api/bool.rst +++ b/Doc/c-api/bool.rst @@ -26,19 +26,19 @@ are available, however. .. c:var:: PyObject* Py_False The Python ``False`` object. This object has no methods and is - `immortal `_. + :term:`immortal`. -.. versionchanged:: 3.12 - :c:data:`Py_False` is immortal. + .. versionchanged:: 3.12 + :c:data:`Py_False` is :term:`immortal`. .. c:var:: PyObject* Py_True The Python ``True`` object. This object has no methods and is - `immortal `_. + :term:`immortal`. -.. versionchanged:: 3.12 - :c:data:`Py_True` is immortal. + .. versionchanged:: 3.12 + :c:data:`Py_True` is :term:`immortal`. .. c:macro:: Py_RETURN_FALSE diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index e572815f..dc43a3d5 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -29,7 +29,7 @@ without intermediate copying. Python provides such a facility at the C level in the form of the :ref:`buffer protocol `. This protocol has two sides: -.. index:: single: PyBufferProcs +.. index:: single: PyBufferProcs (C type) - on the producer side, a type can export a "buffer interface" which allows objects of that type to expose information about their underlying buffer. @@ -147,9 +147,9 @@ a buffer, see :c:func:`PyObject_GetBuffer`. or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard :c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``. - .. c:member:: const char *format + .. c:member:: char *format - A *NUL* terminated string in :mod:`struct` module style syntax describing + A *NULL* terminated string in :mod:`struct` module style syntax describing the contents of a single item. If this is ``NULL``, ``"B"`` (unsigned bytes) is assumed. @@ -244,7 +244,6 @@ The following fields are not influenced by *flags* and must always be filled in with the correct values: :c:member:`~Py_buffer.obj`, :c:member:`~Py_buffer.buf`, :c:member:`~Py_buffer.len`, :c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`. - readonly, format ~~~~~~~~~~~~~~~~ @@ -253,7 +252,8 @@ readonly, format Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter MUST provide a writable buffer or else report failure. Otherwise, the exporter MAY provide either a read-only or writable buffer, but the choice - MUST be consistent for all consumers. + MUST be consistent for all consumers. For example, :c:expr:`PyBUF_SIMPLE | PyBUF_WRITABLE` + can be used to request a simple writable buffer. .. c:macro:: PyBUF_FORMAT @@ -265,8 +265,9 @@ readonly, format Since :c:macro:`PyBUF_SIMPLE` is defined as 0, :c:macro:`PyBUF_WRITABLE` can be used as a stand-alone flag to request a simple writable buffer. -:c:macro:`PyBUF_FORMAT` can be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`. -The latter already implies format ``B`` (unsigned bytes). +:c:macro:`PyBUF_FORMAT` must be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`, because +the latter already implies format ``B`` (unsigned bytes). :c:macro:`!PyBUF_FORMAT` cannot be +used on its own. shape, strides, suboffsets diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index 456f7d89..9045689a 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -42,17 +42,22 @@ Direct API functions Return a new bytearray object from any object, *o*, that implements the :ref:`buffer protocol `. + On failure, return ``NULL`` with an exception set. + .. c:function:: PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len) - Create a new bytearray object from *string* and its length, *len*. On - failure, ``NULL`` is returned. + Create a new bytearray object from *string* and its length, *len*. + + On failure, return ``NULL`` with an exception set. .. c:function:: PyObject* PyByteArray_Concat(PyObject *a, PyObject *b) Concat bytearrays *a* and *b* and return a new bytearray with the result. + On failure, return ``NULL`` with an exception set. + .. c:function:: Py_ssize_t PyByteArray_Size(PyObject *bytearray) diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 61a68f52..bca78a9c 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -155,6 +155,7 @@ called with a non-bytes parameter. Return the null-terminated contents of the object *obj* through the output variables *buffer* and *length*. + Returns ``0`` on success. If *length* is ``NULL``, the bytes object may not contain embedded null bytes; @@ -190,10 +191,10 @@ called with a non-bytes parameter. .. c:function:: int _PyBytes_Resize(PyObject **bytes, Py_ssize_t newsize) - A way to resize a bytes object even though it is "immutable". Only use this - to build up a brand new bytes object; don't use this if the bytes may already - be known in other parts of the code. It is an error to call this function if - the refcount on the input bytes object is not one. Pass the address of an + Resize a bytes object. *newsize* will be the new length of the bytes object. + You can think of it as creating a new bytes object and destroying the old + one, only more efficiently. + Pass the address of an existing bytes object as an lvalue (it may be written into), and the new size desired. On success, *\*bytes* holds the resized bytes object and ``0`` is returned; the address in *\*bytes* may differ from its input value. If the diff --git a/Doc/c-api/call.rst b/Doc/c-api/call.rst index f4e40144..7198d6bc 100644 --- a/Doc/c-api/call.rst +++ b/Doc/c-api/call.rst @@ -108,24 +108,13 @@ This is a pointer to a function with the following signature: Doing so will allow callables such as bound methods to make their onward calls (which include a prepended *self* argument) very efficiently. + .. versionadded:: 3.8 + To call an object that implements vectorcall, use a :ref:`call API ` function as with any other callable. :c:func:`PyObject_Vectorcall` will usually be most efficient. -.. note:: - - In CPython 3.8, the vectorcall API and related functions were available - provisionally under names with a leading underscore: - ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``, - ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``, - ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``, - ``_PyObject_CallMethodOneArg``. - Additionally, ``PyObject_VectorcallDict`` was available as - ``_PyObject_FastCallDict``. - The old names are still defined as aliases of the new, non-underscored names. - - Recursion Control ................. diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst index f8cd0344..61eb994c 100644 --- a/Doc/c-api/cell.rst +++ b/Doc/c-api/cell.rst @@ -39,7 +39,8 @@ Cell objects are not likely to be useful elsewhere. .. c:function:: PyObject* PyCell_Get(PyObject *cell) - Return the contents of the cell *cell*. + Return the contents of the cell *cell*, which can be ``NULL``. + If *cell* is not a cell object, returns ``NULL`` with an exception set. .. c:function:: PyObject* PyCell_GET(PyObject *cell) @@ -52,8 +53,10 @@ Cell objects are not likely to be useful elsewhere. Set the contents of the cell object *cell* to *value*. This releases the reference to any current content of the cell. *value* may be ``NULL``. *cell* - must be non-``NULL``; if it is not a cell object, ``-1`` will be returned. On - success, ``0`` will be returned. + must be non-``NULL``. + + On success, return ``0``. + If *cell* is not a cell object, set an exception and return ``-1``. .. c:function:: void PyCell_SET(PyObject *cell, PyObject *value) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 5082b0cb..6eae24b3 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -22,16 +22,29 @@ bound into a function. .. c:var:: PyTypeObject PyCode_Type This is an instance of :c:type:`PyTypeObject` representing the Python - :class:`code` type. + :ref:`code object `. .. c:function:: int PyCode_Check(PyObject *co) - Return true if *co* is a :class:`code` object. This function always succeeds. + Return true if *co* is a :ref:`code object `. + This function always succeeds. -.. c:function:: int PyCode_GetNumFree(PyCodeObject *co) +.. c:function:: Py_ssize_t PyCode_GetNumFree(PyCodeObject *co) - Return the number of free variables in *co*. + Return the number of :term:`free (closure) variables ` + in a code object. + +.. c:function:: int PyUnstable_Code_GetFirstFree(PyCodeObject *co) + + Return the position of the first :term:`free (closure) variable ` + in a code object. + + .. versionchanged:: 3.13 + + Renamed from ``PyCode_GetFirstFree`` as part of :ref:`unstable-c-api`. + The old name is deprecated, but will remain available until the + signature changes again. .. c:function:: PyCodeObject* PyUnstable_Code_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable) @@ -48,7 +61,7 @@ bound into a function. .. versionchanged:: 3.11 Added ``qualname`` and ``exceptiontable`` parameters. - .. index:: single: PyCode_New + .. index:: single: PyCode_New (C function) .. versionchanged:: 3.12 @@ -61,7 +74,7 @@ bound into a function. Similar to :c:func:`PyUnstable_Code_New`, but with an extra "posonlyargcount" for positional-only arguments. The same caveats that apply to ``PyUnstable_Code_New`` also apply to this function. - .. index:: single: PyCode_NewWithPosOnlyArgs + .. index:: single: PyCode_NewWithPosOnlyArgs (C function) .. versionadded:: 3.8 as ``PyCode_NewWithPosOnlyArgs`` @@ -85,8 +98,8 @@ bound into a function. Return the line number of the instruction that occurs on or before ``byte_offset`` and ends after it. If you just need the line number of a frame, use :c:func:`PyFrame_GetLineNumber` instead. - For efficiently iterating over the line numbers in a code object, use `the API described in PEP 626 - `_. + For efficiently iterating over the line numbers in a code object, use :pep:`the API described in PEP 626 + <0626#out-of-process-debuggers-and-profilers>`. .. c:function:: int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column) @@ -133,7 +146,8 @@ bound into a function. Equivalent to the Python code ``getattr(co, 'co_freevars')``. Returns a new reference to a :c:type:`PyTupleObject` containing the names of - the free variables. On error, ``NULL`` is returned and an exception is raised. + the :term:`free (closure) variables `. On error, ``NULL`` is returned + and an exception is raised. .. versionadded:: 3.11 @@ -220,7 +234,7 @@ may change without deprecation warnings. *free* will be called on non-``NULL`` data stored under the new index. Use :c:func:`Py_DecRef` when storing :c:type:`PyObject`. - .. index:: single: _PyEval_RequestCodeExtraIndex + .. index:: single: _PyEval_RequestCodeExtraIndex (C function) .. versionadded:: 3.6 as ``_PyEval_RequestCodeExtraIndex`` @@ -238,7 +252,7 @@ may change without deprecation warnings. If no data was set under the index, set *extra* to ``NULL`` and return 0 without setting an exception. - .. index:: single: _PyCode_GetExtra + .. index:: single: _PyCode_GetExtra (C function) .. versionadded:: 3.6 as ``_PyCode_GetExtra`` @@ -253,7 +267,7 @@ may change without deprecation warnings. Set the extra data stored under the given index to *extra*. Return 0 on success. Set an exception and return -1 on failure. - .. index:: single: _PyCode_SetExtra + .. index:: single: _PyCode_SetExtra (C function) .. versionadded:: 3.6 as ``_PyCode_SetExtra`` diff --git a/Doc/c-api/complex.rst b/Doc/c-api/complex.rst index e3fd001c..67d0c5f1 100644 --- a/Doc/c-api/complex.rst +++ b/Doc/c-api/complex.rst @@ -25,12 +25,16 @@ pointers. This is consistent throughout the API. The C structure which corresponds to the value portion of a Python complex number object. Most of the functions for dealing with complex number objects - use structures of this type as input or output values, as appropriate. It is - defined as:: + use structures of this type as input or output values, as appropriate. + + .. c:member:: double real + double imag + + The structure is defined as:: typedef struct { - double real; - double imag; + double real; + double imag; } Py_complex; @@ -106,22 +110,46 @@ Complex Numbers as Python Objects .. c:function:: PyObject* PyComplex_FromCComplex(Py_complex v) Create a new Python complex number object from a C :c:type:`Py_complex` value. + Return ``NULL`` with an exception set on error. .. c:function:: PyObject* PyComplex_FromDoubles(double real, double imag) Return a new :c:type:`PyComplexObject` object from *real* and *imag*. + Return ``NULL`` with an exception set on error. .. c:function:: double PyComplex_RealAsDouble(PyObject *op) Return the real part of *op* as a C :c:expr:`double`. + If *op* is not a Python complex number object but has a + :meth:`~object.__complex__` method, this method will first be called to + convert *op* to a Python complex number object. If :meth:`!__complex__` is + not defined then it falls back to call :c:func:`PyFloat_AsDouble` and + returns its result. + + Upon failure, this method returns ``-1.0`` with an exception set, so one + should call :c:func:`PyErr_Occurred` to check for errors. + + .. versionchanged:: 3.13 + Use :meth:`~object.__complex__` if available. .. c:function:: double PyComplex_ImagAsDouble(PyObject *op) Return the imaginary part of *op* as a C :c:expr:`double`. + If *op* is not a Python complex number object but has a + :meth:`~object.__complex__` method, this method will first be called to + convert *op* to a Python complex number object. If :meth:`!__complex__` is + not defined then it falls back to call :c:func:`PyFloat_AsDouble` and + returns ``0.0`` on success. + + Upon failure, this method returns ``-1.0`` with an exception set, so one + should call :c:func:`PyErr_Occurred` to check for errors. + + .. versionchanged:: 3.13 + Use :meth:`~object.__complex__` if available. .. c:function:: Py_complex PyComplex_AsCComplex(PyObject *op) @@ -131,8 +159,11 @@ Complex Numbers as Python Objects method, this method will first be called to convert *op* to a Python complex number object. If :meth:`!__complex__` is not defined then it falls back to :meth:`~object.__float__`. If :meth:`!__float__` is not defined then it falls back - to :meth:`~object.__index__`. Upon failure, this method returns ``-1.0`` as a real - value. + to :meth:`~object.__index__`. + + Upon failure, this method returns :c:type:`Py_complex` + with :c:member:`~Py_complex.real` set to ``-1.0`` and with an exception set, so one + should call :c:func:`PyErr_Occurred` to check for errors. .. versionchanged:: 3.8 Use :meth:`~object.__index__` if available. diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst index d970f544..fe7b8f93 100644 --- a/Doc/c-api/contextvars.rst +++ b/Doc/c-api/contextvars.rst @@ -6,6 +6,8 @@ Context Variables Objects ------------------------- .. _contextvarsobjects_pointertype_change: +.. versionadded:: 3.7 + .. versionchanged:: 3.7.1 .. note:: @@ -24,8 +26,6 @@ Context Variables Objects See :issue:`34762` for more details. -.. versionadded:: 3.7 - This section details the public C API for the :mod:`contextvars` module. .. c:type:: PyContext diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index c5350123..4aaf3905 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -48,6 +48,42 @@ The return value (*rv*) for these functions should be interpreted as follows: The following functions provide locale-independent string to number conversions. +.. c:function:: unsigned long PyOS_strtoul(const char *str, char **ptr, int base) + + Convert the initial part of the string in ``str`` to an :c:expr:`unsigned + long` value according to the given ``base``, which must be between ``2`` and + ``36`` inclusive, or be the special value ``0``. + + Leading white space and case of characters are ignored. If ``base`` is zero + it looks for a leading ``0b``, ``0o`` or ``0x`` to tell which base. If + these are absent it defaults to ``10``. Base must be 0 or between 2 and 36 + (inclusive). If ``ptr`` is non-``NULL`` it will contain a pointer to the + end of the scan. + + If the converted value falls out of range of corresponding return type, + range error occurs (:c:data:`errno` is set to :c:macro:`!ERANGE`) and + :c:macro:`!ULONG_MAX` is returned. If no conversion can be performed, ``0`` + is returned. + + See also the Unix man page :manpage:`strtoul(3)`. + + .. versionadded:: 3.2 + + +.. c:function:: long PyOS_strtol(const char *str, char **ptr, int base) + + Convert the initial part of the string in ``str`` to an :c:expr:`long` value + according to the given ``base``, which must be between ``2`` and ``36`` + inclusive, or be the special value ``0``. + + Same as :c:func:`PyOS_strtoul`, but return a :c:expr:`long` value instead + and :c:macro:`LONG_MAX` on overflows. + + See also the Unix man page :manpage:`strtol(3)`. + + .. versionadded:: 3.2 + + .. c:function:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) Convert a string ``s`` to a :c:expr:`double`, raising a Python diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index 97522da7..d2d4d530 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -318,10 +318,10 @@ Macros for the convenience of modules implementing the DB API: .. c:function:: PyObject* PyDateTime_FromTimestamp(PyObject *args) Create and return a new :class:`datetime.datetime` object given an argument - tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp()`. + tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp`. .. c:function:: PyObject* PyDate_FromTimestamp(PyObject *args) Create and return a new :class:`datetime.date` object given an argument - tuple suitable for passing to :meth:`datetime.date.fromtimestamp()`. + tuple suitable for passing to :meth:`datetime.date.fromtimestamp`. diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 5ccbfe64..b4fdf47b 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -55,6 +55,15 @@ Dictionary Objects This is equivalent to the Python expression ``key in p``. +.. c:function:: int PyDict_ContainsString(PyObject *p, const char *key) + + This is the same as :c:func:`PyDict_Contains`, but *key* is specified as a + :c:expr:`const char*` UTF-8 encoded bytes string, rather than a + :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: PyObject* PyDict_Copy(PyObject *p) Return a new dictionary that contains the same key-value pairs as *p*. @@ -90,10 +99,26 @@ Dictionary Objects rather than a :c:expr:`PyObject*`. +.. c:function:: int PyDict_GetItemRef(PyObject *p, PyObject *key, PyObject **result) + + Return a new :term:`strong reference` to the object from dictionary *p* + which has a key *key*: + + * If the key is present, set *\*result* to a new :term:`strong reference` + to the value and return ``1``. + * If the key is missing, set *\*result* to ``NULL`` and return ``0``. + * On error, raise an exception and return ``-1``. + + .. versionadded:: 3.13 + + See also the :c:func:`PyObject_GetItem` function. + + .. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key) - Return the object from dictionary *p* which has a key *key*. Return ``NULL`` - if the key *key* is not present, but *without* setting an exception. + Return a :term:`borrowed reference` to the object from dictionary *p* which + has a key *key*. Return ``NULL`` if the key *key* is missing *without* + setting an exception. .. note:: @@ -129,6 +154,15 @@ Dictionary Objects :c:func:`PyUnicode_FromString` *key* instead. +.. c:function:: int PyDict_GetItemStringRef(PyObject *p, const char *key, PyObject **result) + + Similar than :c:func:`PyDict_GetItemRef`, but *key* is specified as a + :c:expr:`const char*` UTF-8 encoded bytes string, rather than a + :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: PyObject* PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj) This is the same as the Python-level :meth:`dict.setdefault`. If present, it @@ -139,6 +173,54 @@ Dictionary Objects .. versionadded:: 3.4 + +.. c:function:: int PyDict_SetDefaultRef(PyObject *p, PyObject *key, PyObject *default_value, PyObject **result) + + Inserts *default_value* into the dictionary *p* with a key of *key* if the + key is not already present in the dictionary. If *result* is not ``NULL``, + then *\*result* is set to a :term:`strong reference` to either + *default_value*, if the key was not present, or the existing value, if *key* + was already present in the dictionary. + Returns ``1`` if the key was present and *default_value* was not inserted, + or ``0`` if the key was not present and *default_value* was inserted. + On failure, returns ``-1``, sets an exception, and sets ``*result`` + to ``NULL``. + + For clarity: if you have a strong reference to *default_value* before + calling this function, then after it returns, you hold a strong reference + to both *default_value* and *\*result* (if it's not ``NULL``). + These may refer to the same object: in that case you hold two separate + references to it. + + .. versionadded:: 3.13 + + +.. c:function:: int PyDict_Pop(PyObject *p, PyObject *key, PyObject **result) + + Remove *key* from dictionary *p* and optionally return the removed value. + Do not raise :exc:`KeyError` if the key missing. + + - If the key is present, set *\*result* to a new reference to the removed + value if *result* is not ``NULL``, and return ``1``. + - If the key is missing, set *\*result* to ``NULL`` if *result* is not + ``NULL``, and return ``0``. + - On error, raise an exception and return ``-1``. + + This is similar to :meth:`dict.pop`, but without the default value and + not raising :exc:`KeyError` if the key missing. + + .. versionadded:: 3.13 + + +.. c:function:: int PyDict_PopString(PyObject *p, const char *key, PyObject **result) + + Similar to :c:func:`PyDict_Pop`, but *key* is specified as a + :c:expr:`const char*` UTF-8 encoded bytes string, rather than a + :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: PyObject* PyDict_Items(PyObject *p) Return a :c:type:`PyListObject` containing all the items from the dictionary. @@ -208,6 +290,17 @@ Dictionary Objects Py_DECREF(o); } + The function is not thread-safe in the :term:`free-threaded ` + build without external synchronization. You can use + :c:macro:`Py_BEGIN_CRITICAL_SECTION` to lock the dictionary while iterating + over it:: + + Py_BEGIN_CRITICAL_SECTION(self->dict); + while (PyDict_Next(self->dict, &pos, &key, &value)) { + ... + } + Py_END_CRITICAL_SECTION(); + .. c:function:: int PyDict_Merge(PyObject *a, PyObject *b, int override) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 6e2ac0a4..fc2336d1 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -34,7 +34,7 @@ propagated, additional calls into the Python/C API may not behave as intended and may fail in mysterious ways. .. note:: - The error indicator is **not** the result of :func:`sys.exc_info()`. + The error indicator is **not** the result of :func:`sys.exc_info`. The former corresponds to an exception that is not yet caught (and is therefore still propagating), while the latter returns an exception after it is caught (and has therefore stopped propagating). @@ -88,9 +88,29 @@ Printing and clearing The function is called with a single argument *obj* that identifies the context in which the unraisable exception occurred. If possible, the repr of *obj* will be printed in the warning message. + If *obj* is ``NULL``, only the traceback is printed. An exception must be set when calling this function. + .. versionchanged:: 3.4 + Print a traceback. Print only traceback if *obj* is ``NULL``. + + .. versionchanged:: 3.8 + Use :func:`sys.unraisablehook`. + + +.. c:function:: void PyErr_FormatUnraisable(const char *format, ...) + + Similar to :c:func:`PyErr_WriteUnraisable`, but the *format* and subsequent + parameters help format the warning message; they have the same meaning and + values as in :c:func:`PyUnicode_FromFormat`. + ``PyErr_WriteUnraisable(obj)`` is roughly equivalent to + ``PyErr_FormatUnraisable("Exception ignored in: %R", obj)``. + If *format* is ``NULL``, only the traceback is printed. + + .. versionadded:: 3.13 + + .. c:function:: void PyErr_DisplayException(PyObject *exc) Print the standard traceback display of ``exc`` to ``sys.stderr``, including @@ -98,6 +118,7 @@ Printing and clearing .. versionadded:: 3.12 + Raising exceptions ================== @@ -159,7 +180,7 @@ For convenience, some of these functions will always return a .. c:function:: PyObject* PyErr_SetFromErrno(PyObject *type) - .. index:: single: strerror() + .. index:: single: strerror (C function) This is a convenience function to raise an exception when a C library function has returned an error and set the C variable :c:data:`errno`. It constructs a @@ -200,13 +221,14 @@ For convenience, some of these functions will always return a .. c:function:: PyObject* PyErr_SetFromWindowsErr(int ierr) - This is a convenience function to raise :exc:`WindowsError`. If called with + This is a convenience function to raise :exc:`OSError`. If called with *ierr* of ``0``, the error code returned by a call to :c:func:`!GetLastError` is used instead. It calls the Win32 function :c:func:`!FormatMessage` to retrieve the Windows description of error code given by *ierr* or :c:func:`!GetLastError`, - then it constructs a tuple object whose first item is the *ierr* value and whose - second item is the corresponding error message (gotten from - :c:func:`!FormatMessage`), and then calls ``PyErr_SetObject(PyExc_WindowsError, + then it constructs a :exc:`OSError` object with the :attr:`~OSError.winerror` + attribute set to the error code, the :attr:`~OSError.strerror` attribute + set to the corresponding error message (gotten from + :c:func:`!FormatMessage`), and then calls ``PyErr_SetObject(PyExc_OSError, object)``. This function always returns ``NULL``. .. availability:: Windows. @@ -375,7 +397,7 @@ an error value). .. c:function:: int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...) Function similar to :c:func:`PyErr_WarnFormat`, but *category* is - :exc:`ResourceWarning` and it passes *source* to :func:`warnings.WarningMessage`. + :exc:`ResourceWarning` and it passes *source* to :class:`!warnings.WarningMessage`. .. versionadded:: 3.6 @@ -419,7 +441,7 @@ Querying the error indicator .. c:function:: PyObject *PyErr_GetRaisedException(void) Return the exception currently being raised, clearing the error indicator at - the same time. + the same time. Return ``NULL`` if the error indicator is not set. This function is used by code that needs to catch exceptions, or code that needs to save and restore the error indicator temporarily. @@ -520,7 +542,8 @@ Querying the error indicator .. note:: - This function *does not* implicitly set the ``__traceback__`` + This function *does not* implicitly set the + :attr:`~BaseException.__traceback__` attribute on the exception value. If setting the traceback appropriately is desired, the following additional snippet is needed:: @@ -613,7 +636,7 @@ Signal Handling .. index:: pair: module; signal - single: SIGINT + single: SIGINT (C macro) single: KeyboardInterrupt (built-in exception) This function interacts with Python's signal handling. @@ -644,7 +667,7 @@ Signal Handling .. index:: pair: module; signal - single: SIGINT + single: SIGINT (C macro) single: KeyboardInterrupt (built-in exception) Simulate the effect of a :c:macro:`!SIGINT` signal arriving. @@ -710,7 +733,7 @@ Exception Classes This creates a class object derived from :exc:`Exception` (accessible in C as :c:data:`PyExc_Exception`). - The :attr:`__module__` attribute of the new class is set to the first part (up + The :attr:`~type.__module__` attribute of the new class is set to the first part (up to the last dot) of the *name* argument, and the class name is set to the last part (after the last dot). The *base* argument can be used to specify alternate base classes; it can either be only one class or a tuple of classes. The *dict* @@ -732,7 +755,8 @@ Exception Objects .. c:function:: PyObject* PyException_GetTraceback(PyObject *ex) Return the traceback associated with the exception as a new reference, as - accessible from Python through :attr:`__traceback__`. If there is no + accessible from Python through the :attr:`~BaseException.__traceback__` + attribute. If there is no traceback associated, this returns ``NULL``. @@ -746,8 +770,8 @@ Exception Objects Return the context (another exception instance during whose handling *ex* was raised) associated with the exception as a new reference, as accessible from - Python through :attr:`__context__`. If there is no context associated, this - returns ``NULL``. + Python through the :attr:`~BaseException.__context__` attribute. + If there is no context associated, this returns ``NULL``. .. c:function:: void PyException_SetContext(PyObject *ex, PyObject *ctx) @@ -761,7 +785,8 @@ Exception Objects Return the cause (either an exception instance, or ``None``, set by ``raise ... from ...``) associated with the exception as a new - reference, as accessible from Python through :attr:`__cause__`. + reference, as accessible from Python through the + :attr:`~BaseException.__cause__` attribute. .. c:function:: void PyException_SetCause(PyObject *ex, PyObject *cause) @@ -770,7 +795,8 @@ Exception Objects it. There is no type check to make sure that *cause* is either an exception instance or ``None``. This steals a reference to *cause*. - :attr:`__suppress_context__` is implicitly set to ``True`` by this function. + The :attr:`~BaseException.__suppress_context__` attribute is implicitly set + to ``True`` by this function. .. c:function:: PyObject* PyException_GetArgs(PyObject *ex) @@ -786,7 +812,7 @@ Exception Objects Implement part of the interpreter's implementation of :keyword:`!except*`. *orig* is the original exception that was caught, and *excs* is the list of - the exceptions that need to be raised. This list contains the the unhandled + the exceptions that need to be raised. This list contains the unhandled part of *orig*, if any, as well as the exceptions that were raised from the :keyword:`!except*` clauses (so they have a different traceback from *orig*) and those that were reraised (and have the same traceback as *orig*). @@ -879,8 +905,8 @@ because the :ref:`call protocol ` takes care of recursion handling. Marks a point where a recursive C-level call is about to be performed. - If :c:macro:`USE_STACKCHECK` is defined, this function checks if the OS - stack overflowed using :c:func:`PyOS_CheckStack`. In this is the case, it + If :c:macro:`!USE_STACKCHECK` is defined, this function checks if the OS + stack overflowed using :c:func:`PyOS_CheckStack`. If this is the case, it sets a :exc:`MemoryError` and returns a nonzero value. The function then checks if the recursion limit is reached. If this is the @@ -943,59 +969,60 @@ All standard Python exceptions are available as global variables whose names are the variables: .. index:: - single: PyExc_BaseException - single: PyExc_Exception - single: PyExc_ArithmeticError - single: PyExc_AssertionError - single: PyExc_AttributeError - single: PyExc_BlockingIOError - single: PyExc_BrokenPipeError - single: PyExc_BufferError - single: PyExc_ChildProcessError - single: PyExc_ConnectionAbortedError - single: PyExc_ConnectionError - single: PyExc_ConnectionRefusedError - single: PyExc_ConnectionResetError - single: PyExc_EOFError - single: PyExc_FileExistsError - single: PyExc_FileNotFoundError - single: PyExc_FloatingPointError - single: PyExc_GeneratorExit - single: PyExc_ImportError - single: PyExc_IndentationError - single: PyExc_IndexError - single: PyExc_InterruptedError - single: PyExc_IsADirectoryError - single: PyExc_KeyError - single: PyExc_KeyboardInterrupt - single: PyExc_LookupError - single: PyExc_MemoryError - single: PyExc_ModuleNotFoundError - single: PyExc_NameError - single: PyExc_NotADirectoryError - single: PyExc_NotImplementedError - single: PyExc_OSError - single: PyExc_OverflowError - single: PyExc_PermissionError - single: PyExc_ProcessLookupError - single: PyExc_RecursionError - single: PyExc_ReferenceError - single: PyExc_RuntimeError - single: PyExc_StopAsyncIteration - single: PyExc_StopIteration - single: PyExc_SyntaxError - single: PyExc_SystemError - single: PyExc_SystemExit - single: PyExc_TabError - single: PyExc_TimeoutError - single: PyExc_TypeError - single: PyExc_UnboundLocalError - single: PyExc_UnicodeDecodeError - single: PyExc_UnicodeEncodeError - single: PyExc_UnicodeError - single: PyExc_UnicodeTranslateError - single: PyExc_ValueError - single: PyExc_ZeroDivisionError + single: PyExc_BaseException (C var) + single: PyExc_Exception (C var) + single: PyExc_ArithmeticError (C var) + single: PyExc_AssertionError (C var) + single: PyExc_AttributeError (C var) + single: PyExc_BlockingIOError (C var) + single: PyExc_BrokenPipeError (C var) + single: PyExc_BufferError (C var) + single: PyExc_ChildProcessError (C var) + single: PyExc_ConnectionAbortedError (C var) + single: PyExc_ConnectionError (C var) + single: PyExc_ConnectionRefusedError (C var) + single: PyExc_ConnectionResetError (C var) + single: PyExc_EOFError (C var) + single: PyExc_FileExistsError (C var) + single: PyExc_FileNotFoundError (C var) + single: PyExc_FloatingPointError (C var) + single: PyExc_GeneratorExit (C var) + single: PyExc_ImportError (C var) + single: PyExc_IndentationError (C var) + single: PyExc_IndexError (C var) + single: PyExc_InterruptedError (C var) + single: PyExc_IsADirectoryError (C var) + single: PyExc_KeyError (C var) + single: PyExc_KeyboardInterrupt (C var) + single: PyExc_LookupError (C var) + single: PyExc_MemoryError (C var) + single: PyExc_ModuleNotFoundError (C var) + single: PyExc_NameError (C var) + single: PyExc_NotADirectoryError (C var) + single: PyExc_NotImplementedError (C var) + single: PyExc_OSError (C var) + single: PyExc_OverflowError (C var) + single: PyExc_PermissionError (C var) + single: PyExc_ProcessLookupError (C var) + single: PyExc_PythonFinalizationError (C var) + single: PyExc_RecursionError (C var) + single: PyExc_ReferenceError (C var) + single: PyExc_RuntimeError (C var) + single: PyExc_StopAsyncIteration (C var) + single: PyExc_StopIteration (C var) + single: PyExc_SyntaxError (C var) + single: PyExc_SystemError (C var) + single: PyExc_SystemExit (C var) + single: PyExc_TabError (C var) + single: PyExc_TimeoutError (C var) + single: PyExc_TypeError (C var) + single: PyExc_UnboundLocalError (C var) + single: PyExc_UnicodeDecodeError (C var) + single: PyExc_UnicodeEncodeError (C var) + single: PyExc_UnicodeError (C var) + single: PyExc_UnicodeTranslateError (C var) + single: PyExc_ValueError (C var) + single: PyExc_ZeroDivisionError (C var) +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | @@ -1070,6 +1097,8 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ProcessLookupError` | :exc:`ProcessLookupError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_PythonFinalizationError` | :exc:`PythonFinalizationError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | @@ -1126,18 +1155,18 @@ the variables: These are compatibility aliases to :c:data:`PyExc_OSError`: .. index:: - single: PyExc_EnvironmentError - single: PyExc_IOError - single: PyExc_WindowsError + single: PyExc_EnvironmentError (C var) + single: PyExc_IOError (C var) + single: PyExc_WindowsError (C var) +-------------------------------------+----------+ | C Name | Notes | +=====================================+==========+ -| :c:data:`PyExc_EnvironmentError` | | +| :c:data:`!PyExc_EnvironmentError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_IOError` | | +| :c:data:`!PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | [2]_ | +| :c:data:`!PyExc_WindowsError` | [2]_ | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -1163,17 +1192,17 @@ names are ``PyExc_`` followed by the Python exception name. These have the type the variables: .. index:: - single: PyExc_Warning - single: PyExc_BytesWarning - single: PyExc_DeprecationWarning - single: PyExc_FutureWarning - single: PyExc_ImportWarning - single: PyExc_PendingDeprecationWarning - single: PyExc_ResourceWarning - single: PyExc_RuntimeWarning - single: PyExc_SyntaxWarning - single: PyExc_UnicodeWarning - single: PyExc_UserWarning + single: PyExc_Warning (C var) + single: PyExc_BytesWarning (C var) + single: PyExc_DeprecationWarning (C var) + single: PyExc_FutureWarning (C var) + single: PyExc_ImportWarning (C var) + single: PyExc_PendingDeprecationWarning (C var) + single: PyExc_ResourceWarning (C var) + single: PyExc_RuntimeWarning (C var) + single: PyExc_SyntaxWarning (C var) + single: PyExc_UnicodeWarning (C var) + single: PyExc_UserWarning (C var) +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index b36c800e..e9019a0d 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -65,8 +65,14 @@ the :mod:`io` APIs instead. Overrides the normal behavior of :func:`io.open_code` to pass its parameter through the provided handler. - The handler is a function of type :c:expr:`PyObject *(\*)(PyObject *path, - void *userData)`, where *path* is guaranteed to be :c:type:`PyUnicodeObject`. + The *handler* is a function of type: + + .. c:namespace:: NULL + .. c:type:: PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *) + + Equivalent of :c:expr:`PyObject *(\*)(PyObject *path, + void *userData)`, where *path* is guaranteed to be + :c:type:`PyUnicodeObject`. The *userData* pointer is passed into the hook function. Since hook functions may be called from different runtimes, this pointer should not @@ -90,7 +96,7 @@ the :mod:`io` APIs instead. .. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags) - .. index:: single: Py_PRINT_RAW + .. index:: single: Py_PRINT_RAW (C macro) Write object *obj* to file object *p*. The only supported flag for *flags* is :c:macro:`Py_PRINT_RAW`; if given, the :func:`str` of the object is written diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 4f6ac0d8..1da37a5b 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -2,20 +2,20 @@ .. _floatobjects: -Floating Point Objects +Floating-Point Objects ====================== -.. index:: pair: object; floating point +.. index:: pair: object; floating-point .. c:type:: PyFloatObject - This subtype of :c:type:`PyObject` represents a Python floating point object. + This subtype of :c:type:`PyObject` represents a Python floating-point object. .. c:var:: PyTypeObject PyFloat_Type - This instance of :c:type:`PyTypeObject` represents the Python floating point + This instance of :c:type:`PyTypeObject` represents the Python floating-point type. This is the same object as :class:`float` in the Python layer. @@ -45,7 +45,7 @@ Floating Point Objects .. c:function:: double PyFloat_AsDouble(PyObject *pyfloat) Return a C :c:expr:`double` representation of the contents of *pyfloat*. If - *pyfloat* is not a Python floating point object but has a :meth:`~object.__float__` + *pyfloat* is not a Python floating-point object but has a :meth:`~object.__float__` method, this method will first be called to convert *pyfloat* into a float. If :meth:`!__float__` is not defined then it falls back to :meth:`~object.__index__`. This method returns ``-1.0`` upon failure, so one should call diff --git a/Doc/c-api/frame.rst b/Doc/c-api/frame.rst index 1accee27..638a740e 100644 --- a/Doc/c-api/frame.rst +++ b/Doc/c-api/frame.rst @@ -50,7 +50,7 @@ See also :ref:`Reflection `. .. c:function:: PyObject* PyFrame_GetBuiltins(PyFrameObject *frame) - Get the *frame*'s ``f_builtins`` attribute. + Get the *frame*'s :attr:`~frame.f_builtins` attribute. Return a :term:`strong reference`. The result cannot be ``NULL``. @@ -81,7 +81,7 @@ See also :ref:`Reflection `. .. c:function:: PyObject* PyFrame_GetGlobals(PyFrameObject *frame) - Get the *frame*'s ``f_globals`` attribute. + Get the *frame*'s :attr:`~frame.f_globals` attribute. Return a :term:`strong reference`. The result cannot be ``NULL``. @@ -90,7 +90,7 @@ See also :ref:`Reflection `. .. c:function:: int PyFrame_GetLasti(PyFrameObject *frame) - Get the *frame*'s ``f_lasti`` attribute. + Get the *frame*'s :attr:`~frame.f_lasti` attribute. Returns -1 if ``frame.f_lasti`` is ``None``. @@ -120,12 +120,20 @@ See also :ref:`Reflection `. .. c:function:: PyObject* PyFrame_GetLocals(PyFrameObject *frame) - Get the *frame*'s ``f_locals`` attribute (:class:`dict`). + Get the *frame*'s :attr:`~frame.f_locals` attribute. + If the frame refers to an :term:`optimized scope`, this returns a + write-through proxy object that allows modifying the locals. + In all other cases (classes, modules, :func:`exec`, :func:`eval`) it returns + the mapping representing the frame locals directly (as described for + :func:`locals`). Return a :term:`strong reference`. .. versionadded:: 3.11 + .. versionchanged:: 3.13 + As part of :pep:`667`, return a proxy object for optimized scopes. + .. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame) diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 5857dba8..e7fb5090 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -34,18 +34,20 @@ There are a few functions specific to Python functions. Return a new function object associated with the code object *code*. *globals* must be a dictionary with the global variables accessible to the function. - The function's docstring and name are retrieved from the code object. *__module__* + The function's docstring and name are retrieved from the code object. + :attr:`~function.__module__` is retrieved from *globals*. The argument defaults, annotations and closure are - set to ``NULL``. *__qualname__* is set to the same value as the code object's - ``co_qualname`` field. + set to ``NULL``. :attr:`~function.__qualname__` is set to the same value as + the code object's :attr:`~codeobject.co_qualname` field. .. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) As :c:func:`PyFunction_New`, but also allows setting the function object's - ``__qualname__`` attribute. *qualname* should be a unicode object or ``NULL``; - if ``NULL``, the ``__qualname__`` attribute is set to the same value as the - code object's ``co_qualname`` field. + :attr:`~function.__qualname__` attribute. + *qualname* should be a unicode object or ``NULL``; + if ``NULL``, the :attr:`!__qualname__` attribute is set to the same value as + the code object's :attr:`~codeobject.co_qualname` field. .. versionadded:: 3.3 @@ -62,11 +64,12 @@ There are a few functions specific to Python functions. .. c:function:: PyObject* PyFunction_GetModule(PyObject *op) - Return a :term:`borrowed reference` to the *__module__* attribute of the - function object *op*. It can be *NULL*. + Return a :term:`borrowed reference` to the :attr:`~function.__module__` + attribute of the :ref:`function object ` *op*. + It can be *NULL*. - This is normally a string containing the module name, but can be set to any - other object by Python code. + This is normally a :class:`string ` containing the module name, + but can be set to any other object by Python code. .. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index 6b2494ee..621da3eb 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -83,10 +83,15 @@ rules: .. versionadded:: 3.12 -.. c:function:: TYPE* PyObject_GC_Resize(TYPE, PyVarObject *op, Py_ssize_t newsize) +.. c:macro:: PyObject_GC_Resize(TYPE, op, newsize) - Resize an object allocated by :c:macro:`PyObject_NewVar`. Returns the - resized object or ``NULL`` on failure. *op* must not be tracked by the collector yet. + Resize an object allocated by :c:macro:`PyObject_NewVar`. + Returns the resized object of type ``TYPE*`` (refers to any C type) + or ``NULL`` on failure. + + *op* must be of type :c:expr:`PyVarObject *` + and must not be tracked by the collector yet. + *newsize* must be of type :c:type:`Py_ssize_t`. .. c:function:: void PyObject_GC_Track(PyObject *op) diff --git a/Doc/c-api/hash.rst b/Doc/c-api/hash.rst new file mode 100644 index 00000000..7345a048 --- /dev/null +++ b/Doc/c-api/hash.rst @@ -0,0 +1,101 @@ +.. highlight:: c + +PyHash API +---------- + +See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-hash`. + +.. c:type:: Py_hash_t + + Hash value type: signed integer. + + .. versionadded:: 3.2 + +.. c:type:: Py_uhash_t + + Hash value type: unsigned integer. + + .. versionadded:: 3.2 + +.. c:macro:: PyHASH_MODULUS + + The `Mersenne prime `_ ``P = 2**n -1``, used for numeric hash scheme. + + .. versionadded:: 3.13 + +.. c:macro:: PyHASH_BITS + + The exponent ``n`` of ``P`` in :c:macro:`PyHASH_MODULUS`. + + .. versionadded:: 3.13 + +.. c:macro:: PyHASH_MULTIPLIER + + Prime multiplier used in string and various other hashes. + + .. versionadded:: 3.13 + +.. c:macro:: PyHASH_INF + + The hash value returned for a positive infinity. + + .. versionadded:: 3.13 + +.. c:macro:: PyHASH_IMAG + + The multiplier used for the imaginary part of a complex number. + + .. versionadded:: 3.13 + +.. c:type:: PyHash_FuncDef + + Hash function definition used by :c:func:`PyHash_GetFuncDef`. + + .. c::member:: Py_hash_t (*const hash)(const void *, Py_ssize_t) + + Hash function. + + .. c:member:: const char *name + + Hash function name (UTF-8 encoded string). + + .. c:member:: const int hash_bits + + Internal size of the hash value in bits. + + .. c:member:: const int seed_bits + + Size of seed input in bits. + + .. versionadded:: 3.4 + + +.. c:function:: PyHash_FuncDef* PyHash_GetFuncDef(void) + + Get the hash function definition. + + .. seealso:: + :pep:`456` "Secure and interchangeable hash algorithm". + + .. versionadded:: 3.4 + + +.. c:function:: Py_hash_t Py_HashPointer(const void *ptr) + + Hash a pointer value: process the pointer value as an integer (cast it to + ``uintptr_t`` internally). The pointer is not dereferenced. + + The function cannot fail: it cannot return ``-1``. + + .. versionadded:: 3.13 + +.. c:function:: Py_hash_t PyObject_GenericHash(PyObject *obj) + + Generic hashing function that is meant to be put into a type + object's ``tp_hash`` slot. + Its result only depends on the object's identity. + + .. impl-detail:: + In CPython, it is equivalent to :c:func:`Py_HashPointer`. + + .. versionadded:: 3.13 diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 7bc93a81..6e48644c 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -13,20 +13,8 @@ Importing Modules single: __all__ (package variable) single: modules (in module sys) - This is a simplified interface to :c:func:`PyImport_ImportModuleEx` below, - leaving the *globals* and *locals* arguments set to ``NULL`` and *level* set - to 0. When the *name* - argument contains a dot (when it specifies a submodule of a package), the - *fromlist* argument is set to the list ``['*']`` so that the return value is the - named module rather than the top-level package containing it as would otherwise - be the case. (Unfortunately, this has an additional side effect when *name* in - fact specifies a subpackage instead of a submodule: the submodules specified in - the package's ``__all__`` variable are loaded.) Return a new reference to the - imported module, or ``NULL`` with an exception set on failure. A failing - import of a module doesn't leave the module in :data:`sys.modules`. - - This function always uses absolute imports. - + This is a wrapper around :c:func:`PyImport_Import()` which takes a + :c:expr:`const char *` as an argument instead of a :c:expr:`PyObject *`. .. c:function:: PyObject* PyImport_ImportModuleNoBlock(const char *name) @@ -38,6 +26,9 @@ Importing Modules to per-module locks for most purposes, so this function's special behaviour isn't needed anymore. + .. deprecated-removed:: 3.13 3.15 + Use :c:func:`PyImport_ImportModule` instead. + .. c:function:: PyObject* PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist) @@ -95,27 +86,40 @@ Importing Modules an exception set on failure (the module still exists in this case). -.. c:function:: PyObject* PyImport_AddModuleObject(PyObject *name) +.. c:function:: PyObject* PyImport_AddModuleRef(const char *name) + + Return the module object corresponding to a module name. - Return the module object corresponding to a module name. The *name* argument - may be of the form ``package.module``. First check the modules dictionary if - there's one there, and if not, create a new one and insert it in the modules - dictionary. Return ``NULL`` with an exception set on failure. + The *name* argument may be of the form ``package.module``. First check the + modules dictionary if there's one there, and if not, create a new one and + insert it in the modules dictionary. - .. note:: + Return a :term:`strong reference` to the module on success. Return ``NULL`` + with an exception set on failure. + + The module name *name* is decoded from UTF-8. + + This function does not load or import the module; if the module wasn't + already loaded, you will get an empty module object. Use + :c:func:`PyImport_ImportModule` or one of its variants to import a module. + Package structures implied by a dotted name for *name* are not created if + not already present. + + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyImport_AddModuleObject(PyObject *name) - This function does not load or import the module; if the module wasn't already - loaded, you will get an empty module object. Use :c:func:`PyImport_ImportModule` - or one of its variants to import a module. Package structures implied by a - dotted name for *name* are not created if not already present. + Similar to :c:func:`PyImport_AddModuleRef`, but return a :term:`borrowed + reference` and *name* is a Python :class:`str` object. .. versionadded:: 3.3 .. c:function:: PyObject* PyImport_AddModule(const char *name) - Similar to :c:func:`PyImport_AddModuleObject`, but the name is a UTF-8 - encoded string instead of a Unicode object. + Similar to :c:func:`PyImport_AddModuleRef`, but return a :term:`borrowed + reference`. .. c:function:: PyObject* PyImport_ExecCodeModule(const char *name, PyObject *co) @@ -132,14 +136,14 @@ Importing Modules such modules have no way to know that the module object is an unknown (and probably damaged with respect to the module author's intents) state. - The module's :attr:`__spec__` and :attr:`__loader__` will be set, if - not set already, with the appropriate values. The spec's loader will - be set to the module's ``__loader__`` (if set) and to an instance of - :class:`~importlib.machinery.SourceFileLoader` otherwise. + The module's :attr:`~module.__spec__` and :attr:`~module.__loader__` will be + set, if not set already, with the appropriate values. The spec's loader + will be set to the module's :attr:`!__loader__` (if set) and to an instance + of :class:`~importlib.machinery.SourceFileLoader` otherwise. - The module's :attr:`__file__` attribute will be set to the code object's - :attr:`!co_filename`. If applicable, :attr:`__cached__` will also - be set. + The module's :attr:`~module.__file__` attribute will be set to the code + object's :attr:`~codeobject.co_filename`. If applicable, + :attr:`~module.__cached__` will also be set. This function will reload the module if it was already imported. See :c:func:`PyImport_ReloadModule` for the intended way to reload a module. @@ -151,29 +155,29 @@ Importing Modules :c:func:`PyImport_ExecCodeModuleWithPathnames`. .. versionchanged:: 3.12 - The setting of :attr:`__cached__` and :attr:`__loader__` is - deprecated. See :class:`~importlib.machinery.ModuleSpec` for + The setting of :attr:`~module.__cached__` and :attr:`~module.__loader__` + is deprecated. See :class:`~importlib.machinery.ModuleSpec` for alternatives. .. c:function:: PyObject* PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname) - Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`__file__` attribute of - the module object is set to *pathname* if it is non-``NULL``. + Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`~module.__file__` + attribute of the module object is set to *pathname* if it is non-``NULL``. See also :c:func:`PyImport_ExecCodeModuleWithPathnames`. .. c:function:: PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname) - Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`__cached__` + Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`~module.__cached__` attribute of the module object is set to *cpathname* if it is non-``NULL``. Of the three functions, this is the preferred one to use. .. versionadded:: 3.3 .. versionchanged:: 3.12 - Setting :attr:`__cached__` is deprecated. See + Setting :attr:`~module.__cached__` is deprecated. See :class:`~importlib.machinery.ModuleSpec` for alternatives. @@ -186,7 +190,7 @@ Importing Modules .. versionadded:: 3.2 .. versionchanged:: 3.3 - Uses :func:`!imp.source_from_cache()` in calculating the source path if + Uses :func:`!imp.source_from_cache` in calculating the source path if only the bytecode path is provided. .. versionchanged:: 3.12 No longer uses the removed :mod:`!imp` module. @@ -304,7 +308,7 @@ Importing Modules The module name, as an ASCII encoded string. - .. c: member:: PyObject* (*initfunc)(void) + .. c:member:: PyObject* (*initfunc)(void) Initialization function for a module built into the interpreter. diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst index 9a8f1507..ba56b03c 100644 --- a/Doc/c-api/index.rst +++ b/Doc/c-api/index.rst @@ -25,3 +25,4 @@ document the API functions in detail. memory.rst objimpl.rst apiabiversion.rst + monitoring.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 8b960b06..385bed49 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -7,7 +7,8 @@ Initialization, Finalization, and Threads ***************************************** -See also :ref:`Python Initialization Configuration `. +See :ref:`Python Initialization Configuration ` for details +on how to configure the interpreter prior to initialization. .. _pre-init-safe: @@ -21,6 +22,15 @@ a few functions and the :ref:`global configuration variables The following functions can be safely called before Python is initialized: +* Functions that initialize the interpreter: + + * :c:func:`Py_Initialize` + * :c:func:`Py_InitializeEx` + * :c:func:`Py_InitializeFromConfig` + * :c:func:`Py_BytesMain` + * :c:func:`Py_Main` + * the runtime pre-initialization functions covered in :ref:`init-config` + * Configuration functions: * :c:func:`PyImport_AppendInittab` @@ -29,13 +39,10 @@ The following functions can be safely called before Python is initialized: * :c:func:`PyMem_SetAllocator` * :c:func:`PyMem_SetupDebugHooks` * :c:func:`PyObject_SetArenaAllocator` - * :c:func:`Py_SetPath` * :c:func:`Py_SetProgramName` * :c:func:`Py_SetPythonHome` - * :c:func:`Py_SetStandardStreamEncoding` - * :c:func:`PySys_AddWarnOption` - * :c:func:`PySys_AddXOption` * :c:func:`PySys_ResetWarnOptions` + * the configuration functions covered in :ref:`init-config` * Informative functions: @@ -47,10 +54,12 @@ The following functions can be safely called before Python is initialized: * :c:func:`Py_GetCopyright` * :c:func:`Py_GetPlatform` * :c:func:`Py_GetVersion` + * :c:func:`Py_IsInitialized` * Utilities: * :c:func:`Py_DecodeLocale` + * the status reporting and utility functions covered in :ref:`init-config` * Memory allocators: @@ -59,13 +68,20 @@ The following functions can be safely called before Python is initialized: * :c:func:`PyMem_RawCalloc` * :c:func:`PyMem_RawFree` +* Synchronization: + + * :c:func:`PyMutex_Lock` + * :c:func:`PyMutex_Unlock` + .. note:: - The following functions **should not be called** before - :c:func:`Py_Initialize`: :c:func:`Py_EncodeLocale`, :c:func:`Py_GetPath`, + Despite their apparent similarity to some of the functions listed above, + the following functions **should not be called** before the interpreter has + been initialized: :c:func:`Py_EncodeLocale`, :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, :c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome`, - :c:func:`Py_GetProgramName` and :c:func:`PyEval_InitThreads`. + :c:func:`Py_GetProgramName`, :c:func:`PyEval_InitThreads`, and + :c:func:`Py_RunMain`. .. _global-conf-vars: @@ -93,7 +109,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-b` option. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_DebugFlag @@ -107,7 +123,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_DontWriteBytecodeFlag @@ -121,7 +137,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_FrozenFlag @@ -134,7 +150,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Private flag used by ``_freeze_module`` and ``frozenmain`` programs. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_HashRandomizationFlag @@ -149,7 +165,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment variable to initialize the secret hash seed. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_IgnoreEnvironmentFlag @@ -162,7 +178,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-E` and :option:`-I` options. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_InspectFlag @@ -177,7 +193,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_InteractiveFlag @@ -202,7 +218,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. versionadded:: 3.4 - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_LegacyWindowsFSEncodingFlag @@ -221,7 +237,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_LegacyWindowsStdioFlag @@ -239,7 +255,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_NoSiteFlag @@ -254,7 +270,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-S` option. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_NoUserSiteDirectory @@ -268,7 +284,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-s` and :option:`-I` options, and the :envvar:`PYTHONNOUSERSITE` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_OptimizeFlag @@ -279,7 +295,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_QuietFlag @@ -293,7 +309,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. versionadded:: 3.2 - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_UnbufferedStdioFlag @@ -306,7 +322,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 .. c:var:: int Py_VerboseFlag @@ -322,7 +338,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-v` option and the :envvar:`PYTHONVERBOSE` environment variable. - .. deprecated:: 3.12 + .. deprecated-removed:: 3.12 3.14 Initializing and finalizing the interpreter @@ -332,7 +348,6 @@ Initializing and finalizing the interpreter .. c:function:: void Py_Initialize() .. index:: - single: Py_SetProgramName() single: PyEval_InitThreads() single: modules (in module sys) single: path (in module sys) @@ -340,40 +355,48 @@ Initializing and finalizing the interpreter pair: module; __main__ pair: module; sys triple: module; search; path - single: PySys_SetArgv() - single: PySys_SetArgvEx() - single: Py_FinalizeEx() + single: Py_FinalizeEx (C function) Initialize the Python interpreter. In an application embedding Python, this should be called before using any other Python/C API functions; see :ref:`Before Python Initialization ` for the few exceptions. - This initializes - the table of loaded modules (``sys.modules``), and creates the fundamental - modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. It also initializes - the module search path (``sys.path``). It does not set ``sys.argv``; use - :c:func:`PySys_SetArgvEx` for that. This is a no-op when called for a second time - (without calling :c:func:`Py_FinalizeEx` first). There is no return value; it is a - fatal error if the initialization fails. + This initializes the table of loaded modules (``sys.modules``), and creates + the fundamental modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. + It also initializes the module search path (``sys.path``). It does not set + ``sys.argv``; use the :ref:`Python Initialization Configuration ` + API for that. This is a no-op when called for a second time (without calling + :c:func:`Py_FinalizeEx` first). There is no return value; it is a fatal + error if the initialization fails. - Use the :c:func:`Py_InitializeFromConfig` function to customize the + Use :c:func:`Py_InitializeFromConfig` to customize the :ref:`Python Initialization Configuration `. .. note:: - On Windows, changes the console mode from ``O_TEXT`` to ``O_BINARY``, which will - also affect non-Python uses of the console using the C Runtime. + On Windows, changes the console mode from ``O_TEXT`` to ``O_BINARY``, + which will also affect non-Python uses of the console using the C Runtime. .. c:function:: void Py_InitializeEx(int initsigs) This function works like :c:func:`Py_Initialize` if *initsigs* is ``1``. If - *initsigs* is ``0``, it skips initialization registration of signal handlers, which - might be useful when Python is embedded. + *initsigs* is ``0``, it skips initialization registration of signal handlers, + which may be useful when CPython is embedded as part of a larger application. - Use the :c:func:`Py_InitializeFromConfig` function to customize the + Use :c:func:`Py_InitializeFromConfig` to customize the :ref:`Python Initialization Configuration `. +.. c:function:: PyStatus Py_InitializeFromConfig(const PyConfig *config) + + Initialize Python from *config* configuration, as described in + :ref:`init-from-config`. + + See the :ref:`init-config` section for details on pre-initializing the + interpreter, populating the runtime configuration structure, and querying + the returned status structure. + + .. c:function:: int Py_IsInitialized() Return true (nonzero) when the Python interpreter has been initialized, false @@ -381,6 +404,14 @@ Initializing and finalizing the interpreter :c:func:`Py_Initialize` is called again. +.. c:function:: int Py_IsFinalizing() + + Return true (non-zero) if the main Python interpreter is + :term:`shutting down `. Return false (zero) otherwise. + + .. versionadded:: 3.13 + + .. c:function:: int Py_FinalizeEx() Undo all initializations made by :c:func:`Py_Initialize` and subsequent use of @@ -388,9 +419,16 @@ Initializing and finalizing the interpreter :c:func:`Py_NewInterpreter` below) that were created and not yet destroyed since the last call to :c:func:`Py_Initialize`. Ideally, this frees all memory allocated by the Python interpreter. This is a no-op when called for a second - time (without calling :c:func:`Py_Initialize` again first). Normally the - return value is ``0``. If there were errors during finalization - (flushing buffered data), ``-1`` is returned. + time (without calling :c:func:`Py_Initialize` again first). + + Since this is the reverse of :c:func:`Py_Initialize`, it should be called + in the same thread with the same interpreter active. That means + the main thread and the main interpreter. + This should never be called while :c:func:`Py_RunMain` is running. + + Normally the return value is ``0``. + If there were errors during finalization (flushing buffered data), + ``-1`` is returned. This function is provided for a number of reasons. An embedding application might want to restart Python without having to restart the application itself. @@ -415,51 +453,113 @@ Initializing and finalizing the interpreter .. versionadded:: 3.6 + .. c:function:: void Py_Finalize() This is a backwards-compatible version of :c:func:`Py_FinalizeEx` that disregards the return value. -Process-wide parameters -======================= - +.. c:function:: int Py_BytesMain(int argc, char **argv) -.. c:function:: int Py_SetStandardStreamEncoding(const char *encoding, const char *errors) + Similar to :c:func:`Py_Main` but *argv* is an array of bytes strings, + allowing the calling application to delegate the text decoding step to + the CPython runtime. - .. index:: - single: Py_Initialize() - single: main() - triple: stdin; stdout; sdterr - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.stdio_encoding` and :c:member:`PyConfig.stdio_errors` - should be used instead, see :ref:`Python Initialization Configuration - `. - - This function should be called before :c:func:`Py_Initialize`, if it is - called at all. It specifies which encoding and error handling to use - with standard IO, with the same meanings as in :func:`str.encode`. - - It overrides :envvar:`PYTHONIOENCODING` values, and allows embedding code - to control IO encoding when the environment variable does not work. - - *encoding* and/or *errors* may be ``NULL`` to use - :envvar:`PYTHONIOENCODING` and/or default values (depending on other - settings). + .. versionadded:: 3.8 - Note that :data:`sys.stderr` always uses the "backslashreplace" error - handler, regardless of this (or any other) setting. - If :c:func:`Py_FinalizeEx` is called, this function will need to be called - again in order to affect subsequent calls to :c:func:`Py_Initialize`. +.. c:function:: int Py_Main(int argc, wchar_t **argv) + + The main program for the standard interpreter, encapsulating a full + initialization/finalization cycle, as well as additional + behaviour to implement reading configurations settings from the environment + and command line, and then executing ``__main__`` in accordance with + :ref:`using-on-cmdline`. + + This is made available for programs which wish to support the full CPython + command line interface, rather than just embedding a Python runtime in a + larger application. + + The *argc* and *argv* parameters are similar to those which are passed to a + C program's :c:func:`main` function, except that the *argv* entries are first + converted to ``wchar_t`` using :c:func:`Py_DecodeLocale`. It is also + important to note that the argument list entries may be modified to point to + strings other than those passed in (however, the contents of the strings + pointed to by the argument list are not modified). + + The return value will be ``0`` if the interpreter exits normally (i.e., + without an exception), ``1`` if the interpreter exits due to an exception, + or ``2`` if the argument list does not represent a valid Python command + line. + + Note that if an otherwise unhandled :exc:`SystemExit` is raised, this + function will not return ``1``, but exit the process, as long as + ``Py_InspectFlag`` is not set. If ``Py_InspectFlag`` is set, execution will + drop into the interactive Python prompt, at which point a second otherwise + unhandled :exc:`SystemExit` will still exit the process, while any other + means of exiting will set the return value as described above. + + In terms of the CPython runtime configuration APIs documented in the + :ref:`runtime configuration ` section (and without accounting + for error handling), ``Py_Main`` is approximately equivalent to:: + + PyConfig config; + PyConfig_InitPythonConfig(&config); + PyConfig_SetArgv(&config, argc, argv); + Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + + Py_RunMain(); + + In normal usage, an embedding application will call this function + *instead* of calling :c:func:`Py_Initialize`, :c:func:`Py_InitializeEx` or + :c:func:`Py_InitializeFromConfig` directly, and all settings will be applied + as described elsewhere in this documentation. If this function is instead + called *after* a preceding runtime initialization API call, then exactly + which environmental and command line configuration settings will be updated + is version dependent (as it depends on which settings correctly support + being modified after they have already been set once when the runtime was + first initialized). + + +.. c:function:: int Py_RunMain(void) + + Executes the main module in a fully configured CPython runtime. + + Executes the command (:c:member:`PyConfig.run_command`), the script + (:c:member:`PyConfig.run_filename`) or the module + (:c:member:`PyConfig.run_module`) specified on the command line or in the + configuration. If none of these values are set, runs the interactive Python + prompt (REPL) using the ``__main__`` module's global namespace. + + If :c:member:`PyConfig.inspect` is not set (the default), the return value + will be ``0`` if the interpreter exits normally (that is, without raising + an exception), or ``1`` if the interpreter exits due to an exception. If an + otherwise unhandled :exc:`SystemExit` is raised, the function will immediately + exit the process instead of returning ``1``. + + If :c:member:`PyConfig.inspect` is set (such as when the :option:`-i` option + is used), rather than returning when the interpreter exits, execution will + instead resume in an interactive Python prompt (REPL) using the ``__main__`` + module's global namespace. If the interpreter exited with an exception, it + is immediately raised in the REPL session. The function return value is + then determined by the way the *REPL session* terminates: returning ``0`` + if the session terminates without raising an unhandled exception, exiting + immediately for an unhandled :exc:`SystemExit`, and returning ``1`` for + any other unhandled exception. + + This function always finalizes the Python interpreter regardless of whether + it returns a value or immediately exits the process due to an unhandled + :exc:`SystemExit` exception. + + See :ref:`Python Configuration ` for an example of a + customized Python that always runs in isolated mode using + :c:func:`Py_RunMain`. - Returns ``0`` if successful, a nonzero value on error (e.g. calling after the - interpreter has already been initialized). - .. versionadded:: 3.4 - - .. deprecated:: 3.11 +Process-wide parameters +======================= .. c:function:: void Py_SetProgramName(const wchar_t *name) @@ -485,16 +585,14 @@ Process-wide parameters interpreter will change the contents of this storage. Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a - :c:expr:`wchar_t *` string. + :c:expr:`wchar_*` string. .. deprecated:: 3.11 .. c:function:: wchar_t* Py_GetProgramName() - .. index:: single: Py_SetProgramName() - - Return the program name set with :c:func:`Py_SetProgramName`, or the default. + Return the program name set with :c:member:`PyConfig.program_name`, or the default. The returned string points into static storage; the caller should not modify its value. @@ -504,17 +602,20 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :data:`sys.executable` instead. + .. c:function:: wchar_t* Py_GetPrefix() Return the *prefix* for installed platform-independent files. This is derived through a number of complicated rules from the program name set with - :c:func:`Py_SetProgramName` and some environment variables; for example, if the + :c:member:`PyConfig.program_name` and some environment variables; for example, if the program name is ``'/usr/local/bin/python'``, the prefix is ``'/usr/local'``. The returned string points into static storage; the caller should not modify its value. This corresponds to the :makevar:`prefix` variable in the top-level :file:`Makefile` and the :option:`--prefix` argument to the :program:`configure` - script at build time. The value is available to Python code as ``sys.prefix``. + script at build time. The value is available to Python code as ``sys.base_prefix``. It is only useful on Unix. See also the next function. This function should not be called before :c:func:`Py_Initialize`, otherwise @@ -523,18 +624,23 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :data:`sys.base_prefix` instead, or :data:`sys.prefix` if + :ref:`virtual environments ` need to be handled. + .. c:function:: wchar_t* Py_GetExecPrefix() Return the *exec-prefix* for installed platform-*dependent* files. This is derived through a number of complicated rules from the program name set with - :c:func:`Py_SetProgramName` and some environment variables; for example, if the + :c:member:`PyConfig.program_name` and some environment variables; for example, if the program name is ``'/usr/local/bin/python'``, the exec-prefix is ``'/usr/local'``. The returned string points into static storage; the caller should not modify its value. This corresponds to the :makevar:`exec_prefix` variable in the top-level :file:`Makefile` and the ``--exec-prefix`` argument to the :program:`configure` script at build time. The value is - available to Python code as ``sys.exec_prefix``. It is only useful on Unix. + available to Python code as ``sys.base_exec_prefix``. It is only useful on + Unix. Background: The exec-prefix differs from the prefix when platform dependent files (such as executables and shared libraries) are installed in a different @@ -564,16 +670,19 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :data:`sys.base_exec_prefix` instead, or :data:`sys.exec_prefix` if + :ref:`virtual environments ` need to be handled. + .. c:function:: wchar_t* Py_GetProgramFullPath() .. index:: - single: Py_SetProgramName() single: executable (in module sys) Return the full program name of the Python executable; this is computed as a side-effect of deriving the default module search path from the program name - (set by :c:func:`Py_SetProgramName` above). The returned string points into + (set by :c:member:`PyConfig.program_name`). The returned string points into static storage; the caller should not modify its value. The value is available to Python code as ``sys.executable``. @@ -583,16 +692,18 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :data:`sys.executable` instead. + .. c:function:: wchar_t* Py_GetPath() .. index:: triple: module; search; path single: path (in module sys) - single: Py_SetPath() Return the default module search path; this is computed from the program name - (set by :c:func:`Py_SetProgramName` above) and some environment variables. + (set by :c:member:`PyConfig.program_name`) and some environment variables. The returned string consists of a series of directory names separated by a platform dependent delimiter character. The delimiter character is ``':'`` on Unix and macOS, ``';'`` on Windows. The returned string points into @@ -609,43 +720,8 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. - -.. c:function:: void Py_SetPath(const wchar_t *) - - .. index:: - triple: module; search; path - single: path (in module sys) - single: Py_GetPath() - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.module_search_paths` and - :c:member:`PyConfig.module_search_paths_set` should be used instead, see - :ref:`Python Initialization Configuration `. - - Set the default module search path. If this function is called before - :c:func:`Py_Initialize`, then :c:func:`Py_GetPath` won't attempt to compute a - default search path but uses the one provided instead. This is useful if - Python is embedded by an application that has full knowledge of the location - of all modules. The path components should be separated by the platform - dependent delimiter character, which is ``':'`` on Unix and macOS, ``';'`` - on Windows. - - This also causes :data:`sys.executable` to be set to the program - full path (see :c:func:`Py_GetProgramFullPath`) and for :data:`sys.prefix` and - :data:`sys.exec_prefix` to be empty. It is up to the caller to modify these - if required after calling :c:func:`Py_Initialize`. - - Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a - :c:expr:`wchar_*` string. - - The path argument is copied internally, so the caller may free it after the - call completes. - - .. versionchanged:: 3.8 - The program full path is now used for :data:`sys.executable`, instead - of the program name. - - .. deprecated:: 3.11 + .. deprecated-removed:: 3.13 3.15 + Get :data:`sys.path` instead. .. c:function:: const char* Py_GetVersion() @@ -760,7 +836,7 @@ Process-wide parameters It is recommended that applications embedding the Python interpreter for purposes other than executing a single script pass ``0`` as *updatepath*, and update :data:`sys.path` themselves if desired. - See `CVE-2008-5983 `_. + See :cve:`2008-5983`. On versions before 3.1.3, you can achieve the same effect by manually popping the first :data:`sys.path` element after having called @@ -820,8 +896,8 @@ Process-wide parameters .. c:function:: wchar_t* Py_GetPythonHome() - Return the default "home", that is, the value set by a previous call to - :c:func:`Py_SetPythonHome`, or the value of the :envvar:`PYTHONHOME` + Return the default "home", that is, the value set by + :c:member:`PyConfig.home`, or the value of the :envvar:`PYTHONHOME` environment variable if it is set. This function should not be called before :c:func:`Py_Initialize`, otherwise @@ -830,6 +906,10 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.home` or :envvar:`PYTHONHOME` environment + variable instead. + .. _threads: @@ -849,7 +929,7 @@ operations could cause problems in a multi-threaded program: for example, when two threads simultaneously increment the reference count of the same object, the reference count could end up being incremented only once instead of twice. -.. index:: single: setswitchinterval() (in module sys) +.. index:: single: setswitchinterval (in module sys) Therefore, the rule exists that only the thread that has acquired the :term:`GIL` may operate on Python objects or call Python/C API functions. @@ -859,8 +939,7 @@ released around potentially blocking I/O operations like reading or writing a file, so that other Python threads can run in the meantime. .. index:: - single: PyThreadState - single: PyThreadState + single: PyThreadState (C type) The Python interpreter keeps some thread-specific bookkeeping information inside a data structure called :c:type:`PyThreadState`. There's also one @@ -886,8 +965,8 @@ This is so common that a pair of macros exists to simplify it:: Py_END_ALLOW_THREADS .. index:: - single: Py_BEGIN_ALLOW_THREADS - single: Py_END_ALLOW_THREADS + single: Py_BEGIN_ALLOW_THREADS (C macro) + single: Py_END_ALLOW_THREADS (C macro) The :c:macro:`Py_BEGIN_ALLOW_THREADS` macro opens a new block and declares a hidden local variable; the :c:macro:`Py_END_ALLOW_THREADS` macro closes the @@ -902,8 +981,8 @@ The block above expands to the following code:: PyEval_RestoreThread(_save); .. index:: - single: PyEval_RestoreThread() - single: PyEval_SaveThread() + single: PyEval_RestoreThread (C function) + single: PyEval_SaveThread (C function) Here is how these functions work: the global interpreter lock is used to protect the pointer to the current thread state. When releasing the lock and saving the thread state, @@ -1057,18 +1136,6 @@ code, or when embedding the Python interpreter: .. index:: pair: module; _thread -.. c:function:: int PyEval_ThreadsInitialized() - - Returns a non-zero value if :c:func:`PyEval_InitThreads` has been called. This - function can be called without holding the GIL, and therefore can be used to - avoid calls to the locking API when running single-threaded. - - .. versionchanged:: 3.7 - The :term:`GIL` is now initialized by :c:func:`Py_Initialize()`. - - .. deprecated:: 3.9 - - .. c:function:: PyThreadState* PyEval_SaveThread() Release the global interpreter lock (if it has been created) and reset the @@ -1087,7 +1154,7 @@ code, or when embedding the Python interpreter: .. note:: Calling this function from a thread when the runtime is finalizing will terminate the thread, even if the thread was not created by Python. - You can use :c:func:`!_Py_IsFinalizing` or :func:`sys.is_finalizing` to + You can use :c:func:`Py_IsFinalizing` or :func:`sys.is_finalizing` to check if the interpreter is in process of being finalized before calling this function to avoid unwanted termination. @@ -1097,6 +1164,19 @@ code, or when embedding the Python interpreter: When the current thread state is ``NULL``, this issues a fatal error (so that the caller needn't check for ``NULL``). + See also :c:func:`PyThreadState_GetUnchecked`. + + +.. c:function:: PyThreadState* PyThreadState_GetUnchecked() + + Similar to :c:func:`PyThreadState_Get`, but don't kill the process with a + fatal error if it is NULL. The caller is responsible to check if the result + is NULL. + + .. versionadded:: 3.13 + In Python 3.5 to 3.12, the function was private and known as + ``_PyThreadState_UncheckedGet()``. + .. c:function:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate) @@ -1133,7 +1213,7 @@ with sub-interpreters: .. note:: Calling this function from a thread when the runtime is finalizing will terminate the thread, even if the thread was not created by Python. - You can use :c:func:`!_Py_IsFinalizing` or :func:`sys.is_finalizing` to + You can use :c:func:`Py_IsFinalizing` or :func:`sys.is_finalizing` to check if the interpreter is in process of being finalized before calling this function to avoid unwanted termination. @@ -1252,6 +1332,9 @@ All of the following functions must be called after :c:func:`Py_Initialize`. This function now calls the :c:member:`PyThreadState.on_delete` callback. Previously, that happened in :c:func:`PyThreadState_Delete`. + .. versionchanged:: 3.13 + The :c:member:`PyThreadState.on_delete` callback was removed. + .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) @@ -1263,7 +1346,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyThreadState_DeleteCurrent(void) Destroy the current thread state and release the global interpreter lock. - Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not + Like :c:func:`PyThreadState_Delete`, the global interpreter lock must be held. The thread state must have been reset with a previous call to :c:func:`PyThreadState_Clear`. @@ -1415,7 +1498,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. note:: Calling this function from a thread when the runtime is finalizing will terminate the thread, even if the thread was not created by Python. - You can use :c:func:`!_Py_IsFinalizing` or :func:`sys.is_finalizing` to + You can use :c:func:`Py_IsFinalizing` or :func:`sys.is_finalizing` to check if the interpreter is in process of being finalized before calling this function to avoid unwanted termination. @@ -1440,39 +1523,6 @@ All of the following functions must be called after :c:func:`Py_Initialize`. available (even when threads have not been initialized). -.. c:function:: void PyEval_AcquireLock() - - Acquire the global interpreter lock. The lock must have been created earlier. - If this thread already has the lock, a deadlock ensues. - - .. deprecated:: 3.2 - This function does not update the current thread state. Please use - :c:func:`PyEval_RestoreThread` or :c:func:`PyEval_AcquireThread` - instead. - - .. note:: - Calling this function from a thread when the runtime is finalizing - will terminate the thread, even if the thread was not created by Python. - You can use :c:func:`_Py_IsFinalizing` or :func:`sys.is_finalizing` to - check if the interpreter is in process of being finalized before calling - this function to avoid unwanted termination. - - .. versionchanged:: 3.8 - Updated to be consistent with :c:func:`PyEval_RestoreThread`, - :c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`, - and terminate the current thread if called while the interpreter is finalizing. - - -.. c:function:: void PyEval_ReleaseLock() - - Release the global interpreter lock. The lock must have been created earlier. - - .. deprecated:: 3.2 - This function does not update the current thread state. Please use - :c:func:`PyEval_SaveThread` or :c:func:`PyEval_ReleaseThread` - instead. - - .. _sub-interpreter-support: Sub-interpreter support @@ -1638,7 +1688,11 @@ function. You can create and destroy them using the following functions: .check_multi_interp_extensions = 1, .gil = PyInterpreterConfig_OWN_GIL, }; - PyThreadState *tstate = Py_NewInterpreterFromConfig(&config); + PyThreadState *tstate = NULL; + PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } Note that the config is used only briefly and does not get modified. During initialization the config's values are converted into various @@ -1646,8 +1700,8 @@ function. You can create and destroy them using the following functions: may be stored internally on the :c:type:`PyInterpreterState`. .. index:: - single: Py_FinalizeEx() - single: Py_Initialize() + single: Py_FinalizeEx (C function) + single: Py_Initialize (C function) Extension modules are shared between (sub-)interpreters as follows: @@ -1675,7 +1729,7 @@ function. You can create and destroy them using the following functions: As with multi-phase initialization, this means that only C-level static and global variables are shared between these modules. - .. index:: single: close() (in module os) + .. index:: single: close (in module os) .. c:function:: PyThreadState* Py_NewInterpreter(void) @@ -1698,7 +1752,7 @@ function. You can create and destroy them using the following functions: .. c:function:: void Py_EndInterpreter(PyThreadState *tstate) - .. index:: single: Py_FinalizeEx() + .. index:: single: Py_FinalizeEx (C function) Destroy the (sub-)interpreter represented by the given thread state. The given thread state must be the current thread state. See the @@ -1732,7 +1786,7 @@ otherwise immutable (e.g. ``None``, ``(1, 5)``) can't normally be shared because of the refcount. One simple but less-efficient approach around this is to use a global lock around all use of some state (or object). Alternately, effectively immutable objects (like integers or strings) -can be made safe in spite of their refcounts by making them "immortal". +can be made safe in spite of their refcounts by making them :term:`immortal`. In fact, this has been done for the builtin singletons, small integers, and a number of other builtin objects. @@ -1790,8 +1844,6 @@ pointer and a void pointer argument. .. c:function:: int Py_AddPendingCall(int (*func)(void *), void *arg) - .. index:: single: Py_AddPendingCall() - Schedule a function to be called from the main interpreter thread. On success, ``0`` is returned and *func* is queued for being called in the main thread. On failure, ``-1`` is returned without setting any exception. @@ -1825,14 +1877,14 @@ pointer and a void pointer argument. function is generally **not** suitable for calling Python code from arbitrary C threads. Instead, use the :ref:`PyGILState API`. + .. versionadded:: 3.1 + .. versionchanged:: 3.9 If this function is called in a subinterpreter, the function *func* is now scheduled to be called from the subinterpreter, rather than being called from the main interpreter. Each subinterpreter now has its own list of scheduled calls. - .. versionadded:: 3.1 - .. _profiling: Profiling and Tracing @@ -1909,7 +1961,8 @@ Python-level trace functions in previous versions. The value passed as the *what* parameter to a :c:type:`Py_tracefunc` function (but not a profiling function) when a line-number event is being reported. - It may be disabled for a frame by setting :attr:`f_trace_lines` to *0* on that frame. + It may be disabled for a frame by setting :attr:`~frame.f_trace_lines` to + *0* on that frame. .. c:var:: int PyTrace_RETURN @@ -1941,7 +1994,7 @@ Python-level trace functions in previous versions. The value for the *what* parameter to :c:type:`Py_tracefunc` functions (but not profiling functions) when a new opcode is about to be executed. This event is not emitted by default: it must be explicitly requested by setting - :attr:`f_trace_opcodes` to *1* on the frame. + :attr:`~frame.f_trace_opcodes` to *1* on the frame. .. c:function:: void PyEval_SetProfile(Py_tracefunc func, PyObject *obj) @@ -1995,6 +2048,58 @@ Python-level trace functions in previous versions. .. versionadded:: 3.12 +Reference tracing +================= + +.. versionadded:: 3.13 + +.. c:type:: int (*PyRefTracer)(PyObject *, int event, void* data) + + The type of the trace function registered using :c:func:`PyRefTracer_SetTracer`. + The first parameter is a Python object that has been just created (when **event** + is set to :c:data:`PyRefTracer_CREATE`) or about to be destroyed (when **event** + is set to :c:data:`PyRefTracer_DESTROY`). The **data** argument is the opaque pointer + that was provided when :c:func:`PyRefTracer_SetTracer` was called. + +.. versionadded:: 3.13 + +.. c:var:: int PyRefTracer_CREATE + + The value for the *event* parameter to :c:type:`PyRefTracer` functions when a Python + object has been created. + +.. c:var:: int PyRefTracer_DESTROY + + The value for the *event* parameter to :c:type:`PyRefTracer` functions when a Python + object has been destroyed. + +.. c:function:: int PyRefTracer_SetTracer(PyRefTracer tracer, void *data) + + Register a reference tracer function. The function will be called when a new + Python has been created or when an object is going to be destroyed. If + **data** is provided it must be an opaque pointer that will be provided when + the tracer function is called. Return ``0`` on success. Set an exception and + return ``-1`` on error. + + Not that tracer functions **must not** create Python objects inside or + otherwise the call will be re-entrant. The tracer also **must not** clear + any existing exception or set an exception. The GIL will be held every time + the tracer function is called. + + The GIL must be held when calling this function. + +.. versionadded:: 3.13 + +.. c:function:: PyRefTracer PyRefTracer_GetTracer(void** data) + + Get the registered reference tracer function and the value of the opaque data + pointer that was registered when :c:func:`PyRefTracer_SetTracer` was called. + If no tracer was registered this function will return NULL and will set the + **data** pointer to NULL. + + The GIL must be held when calling this function. + +.. versionadded:: 3.13 .. _advanced-debugging: @@ -2191,3 +2296,145 @@ be used in new code. .. c:function:: void PyThread_delete_key_value(int key) .. c:function:: void PyThread_ReInitTLS() +Synchronization Primitives +========================== + +The C-API provides a basic mutual exclusion lock. + +.. c:type:: PyMutex + + A mutual exclusion lock. The :c:type:`!PyMutex` should be initialized to + zero to represent the unlocked state. For example:: + + PyMutex mutex = {0}; + + Instances of :c:type:`!PyMutex` should not be copied or moved. Both the + contents and address of a :c:type:`!PyMutex` are meaningful, and it must + remain at a fixed, writable location in memory. + + .. note:: + + A :c:type:`!PyMutex` currently occupies one byte, but the size should be + considered unstable. The size may change in future Python releases + without a deprecation period. + + .. versionadded:: 3.13 + +.. c:function:: void PyMutex_Lock(PyMutex *m) + + Lock mutex *m*. If another thread has already locked it, the calling + thread will block until the mutex is unlocked. While blocked, the thread + will temporarily release the :term:`GIL` if it is held. + + .. versionadded:: 3.13 + +.. c:function:: void PyMutex_Unlock(PyMutex *m) + + Unlock mutex *m*. The mutex must be locked --- otherwise, the function will + issue a fatal error. + + .. versionadded:: 3.13 + +.. _python-critical-section-api: + +Python Critical Section API +--------------------------- + +The critical section API provides a deadlock avoidance layer on top of +per-object locks for :term:`free-threaded ` CPython. They are +intended to replace reliance on the :term:`global interpreter lock`, and are +no-ops in versions of Python with the global interpreter lock. + +Critical sections avoid deadlocks by implicitly suspending active critical +sections and releasing the locks during calls to :c:func:`PyEval_SaveThread`. +When :c:func:`PyEval_RestoreThread` is called, the most recent critical section +is resumed, and its locks reacquired. This means the critical section API +provides weaker guarantees than traditional locks -- they are useful because +their behavior is similar to the :term:`GIL`. + +The functions and structs used by the macros are exposed for cases +where C macros are not available. They should only be used as in the +given macro expansions. Note that the sizes and contents of the structures may +change in future Python versions. + +.. note:: + + Operations that need to lock two objects at once must use + :c:macro:`Py_BEGIN_CRITICAL_SECTION2`. You *cannot* use nested critical + sections to lock more than one object at once, because the inner critical + section may suspend the outer critical sections. This API does not provide + a way to lock more than two objects at once. + +Example usage:: + + static PyObject * + set_field(MyObject *self, PyObject *value) + { + Py_BEGIN_CRITICAL_SECTION(self); + Py_SETREF(self->field, Py_XNewRef(value)); + Py_END_CRITICAL_SECTION(); + Py_RETURN_NONE; + } + +In the above example, :c:macro:`Py_SETREF` calls :c:macro:`Py_DECREF`, which +can call arbitrary code through an object's deallocation function. The critical +section API avoids potential deadlocks due to reentrancy and lock ordering +by allowing the runtime to temporarily suspend the critical section if the +code triggered by the finalizer blocks and calls :c:func:`PyEval_SaveThread`. + +.. c:macro:: Py_BEGIN_CRITICAL_SECTION(op) + + Acquires the per-object lock for the object *op* and begins a + critical section. + + In the free-threaded build, this macro expands to:: + + { + PyCriticalSection _py_cs; + PyCriticalSection_Begin(&_py_cs, (PyObject*)(op)) + + In the default build, this macro expands to ``{``. + + .. versionadded:: 3.13 + +.. c:macro:: Py_END_CRITICAL_SECTION() + + Ends the critical section and releases the per-object lock. + + In the free-threaded build, this macro expands to:: + + PyCriticalSection_End(&_py_cs); + } + + In the default build, this macro expands to ``}``. + + .. versionadded:: 3.13 + +.. c:macro:: Py_BEGIN_CRITICAL_SECTION2(a, b) + + Acquires the per-objects locks for the objects *a* and *b* and begins a + critical section. The locks are acquired in a consistent order (lowest + address first) to avoid lock ordering deadlocks. + + In the free-threaded build, this macro expands to:: + + { + PyCriticalSection2 _py_cs2; + PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b)) + + In the default build, this macro expands to ``{``. + + .. versionadded:: 3.13 + +.. c:macro:: Py_END_CRITICAL_SECTION2() + + Ends the critical section and releases the per-object locks. + + In the free-threaded build, this macro expands to:: + + PyCriticalSection2_End(&_py_cs2); + } + + In the default build, this macro expands to ``}``. + + .. versionadded:: 3.13 diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 7c5465b5..612aa2aa 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -253,11 +253,21 @@ PyPreConfig * ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc memory allocator ` with :ref:`debug hooks `. + * ``PYMEM_ALLOCATOR_MIMALLOC`` (``6``): use ``mimalloc``, a fast + malloc replacement. + * ``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` (``7``): use ``mimalloc``, a fast + malloc replacement with :ref:`debug hooks `. + ``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` are not supported if Python is :option:`configured using --without-pymalloc <--without-pymalloc>`. + ``PYMEM_ALLOCATOR_MIMALLOC`` and ``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` are + not supported if Python is :option:`configured using --without-mimalloc + <--without-mimalloc>` or if the underlying atomic support isn't + available. + See :ref:`Memory Management `. Default: ``PYMEM_ALLOCATOR_NOT_SET``. @@ -311,7 +321,7 @@ PyPreConfig * Set :c:member:`PyConfig.filesystem_encoding` to ``"mbcs"``, * Set :c:member:`PyConfig.filesystem_errors` to ``"replace"``. - Initialized the from :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment + Initialized from the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable value. Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for @@ -499,7 +509,7 @@ PyConfig The :c:func:`PyConfig_Read` function only parses :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are parsed. Since Python arguments are - strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + stripped from :c:member:`PyConfig.argv`, parsing arguments twice would parse the application options as Python options. :ref:`Preinitialize Python ` if needed. @@ -545,7 +555,17 @@ PyConfig .. c:member:: PyWideStringList argv - Command line arguments: :data:`sys.argv`. + .. index:: + single: main() + single: argv (in module sys) + + Set :data:`sys.argv` command line arguments based on + :c:member:`~PyConfig.argv`. These parameters are similar to those passed + to the program's :c:func:`main` function with the difference that the + first entry should refer to the script file to be executed rather than + the executable hosting the Python interpreter. If there isn't a script + that will be run, the first entry in :c:member:`~PyConfig.argv` can be an + empty string. Set :c:member:`~PyConfig.parse_argv` to ``1`` to parse :c:member:`~PyConfig.argv` the same way the regular Python parses Python @@ -586,6 +606,8 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.exec_prefix`. + .. c:member:: wchar_t* base_executable Python base executable: :data:`sys._base_executable`. @@ -598,6 +620,8 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.executable`. + .. c:member:: wchar_t* base_prefix :data:`sys.base_prefix`. @@ -606,6 +630,8 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.prefix`. + .. c:member:: int buffered_stdio If equals to ``0`` and :c:member:`~PyConfig.configure_c_stdio` is non-zero, @@ -700,7 +726,7 @@ PyConfig Set to ``1`` by the :envvar:`PYTHONDUMPREFS` environment variable. - Need a special build of Python with the ``Py_TRACE_REFS`` macro defined: + Needs a special build of Python with the ``Py_TRACE_REFS`` macro defined: see the :option:`configure --with-trace-refs option <--with-trace-refs>`. Default: ``0``. @@ -714,6 +740,8 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.base_exec_prefix`. + .. c:member:: wchar_t* executable The absolute path of the executable binary for the Python interpreter: @@ -723,6 +751,8 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.base_executable`. + .. c:member:: int faulthandler Enable faulthandler? @@ -794,10 +824,8 @@ PyConfig .. c:member:: wchar_t* home - Python home directory. - - If :c:func:`Py_SetPythonHome` has been called, use its argument if it is - not ``NULL``. + Set the default Python "home" directory, that is, the location of the + standard Python libraries (see :envvar:`PYTHONHOME`). Set by the :envvar:`PYTHONHOME` environment variable. @@ -860,6 +888,19 @@ PyConfig .. versionadded:: 3.12 + .. c:member:: int cpu_count + + If the value of :c:member:`~PyConfig.cpu_count` is not ``-1`` then it will + override the return values of :func:`os.cpu_count`, + :func:`os.process_cpu_count`, and :func:`multiprocessing.cpu_count`. + + Configured by the :samp:`-X cpu_count={n|default}` command line + flag or the :envvar:`PYTHON_CPU_COUNT` environment variable. + + Default: ``-1``. + + .. versionadded:: 3.13 + .. c:member:: int isolated If greater than ``0``, enable isolated mode: @@ -1000,7 +1041,7 @@ PyConfig The :c:func:`PyConfig_Read` function only parses :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are parsed. Since Python arguments are - strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + stripped from :c:member:`PyConfig.argv`, parsing arguments twice would parse the application options as Python options. Default: ``1`` in Python mode, ``0`` in isolated mode. @@ -1017,7 +1058,7 @@ PyConfig Incremented by the :option:`-d` command line option. Set to the :envvar:`PYTHONDEBUG` environment variable value. - Need a :ref:`debug build of Python ` (the ``Py_DEBUG`` macro + Needs a :ref:`debug build of Python ` (the ``Py_DEBUG`` macro must be defined). Default: ``0``. @@ -1043,12 +1084,13 @@ PyConfig Part of the :ref:`Python Path Configuration ` output. + See also :c:member:`PyConfig.base_prefix`. + .. c:member:: wchar_t* program_name Program name used to initialize :c:member:`~PyConfig.executable` and in early error messages during Python initialization. - * If :func:`Py_SetProgramName` has been called, use its argument. * On macOS, use :envvar:`PYTHONEXECUTABLE` environment variable if set. * If the ``WITH_NEXT_FRAMEWORK`` macro is defined, use :envvar:`__PYVENV_LAUNCHER__` environment variable if set. @@ -1068,6 +1110,7 @@ PyConfig Set by the :option:`-X pycache_prefix=PATH <-X>` command line option and the :envvar:`PYTHONPYCACHEPREFIX` environment variable. + The command-line option takes precedence. If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``. @@ -1111,13 +1154,27 @@ PyConfig Default: ``NULL``. + .. c:member:: wchar_t* run_presite + + ``package.module`` path to module that should be imported before + ``site.py`` is run. + + Set by the :option:`-X presite=package.module <-X>` command-line + option and the :envvar:`PYTHON_PRESITE` environment variable. + The command-line option takes precedence. + + Needs a :ref:`debug build of Python ` (the ``Py_DEBUG`` macro + must be defined). + + Default: ``NULL``. + .. c:member:: int show_ref_count - Show total reference count at exit (excluding immortal objects)? + Show total reference count at exit (excluding :term:`immortal` objects)? Set to ``1`` by :option:`-X showrefcount <-X>` command line option. - Need a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` + Needs a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` macro must be defined). Default: ``0``. @@ -1158,9 +1215,6 @@ PyConfig :data:`sys.stderr` (but :data:`sys.stderr` always uses ``"backslashreplace"`` error handler). - If :c:func:`Py_SetStandardStreamEncoding` has been called, use its - *error* and *errors* arguments if they are not ``NULL``. - Use the :envvar:`PYTHONIOENCODING` environment variable if it is non-empty. @@ -1176,6 +1230,8 @@ PyConfig or if the LC_CTYPE locale is "C" or "POSIX". * ``"strict"`` otherwise. + See also :c:member:`PyConfig.legacy_windows_stdio`. + .. c:member:: int tracemalloc Enable tracemalloc? @@ -1194,8 +1250,11 @@ PyConfig If non-zero, initialize the perf trampoline. See :ref:`perf_profiling` for more information. - Set by :option:`-X perf <-X>` command line option and by the - :envvar:`PYTHONPERFSUPPORT` environment variable. + Set by :option:`-X perf <-X>` command-line option and by the + :envvar:`PYTHON_PERF_JIT_SUPPORT` environment variable for perf support + with stack pointers and :option:`-X perf_jit <-X>` command-line option + and by the :envvar:`PYTHON_PERF_JIT_SUPPORT` environment variable for perf + support with DWARF JIT information. Default: ``-1``. @@ -1289,14 +1348,13 @@ the :option:`-X` command line option. The ``show_alloc_count`` field has been removed. +.. _init-from-config: + Initialization with PyConfig ============================ -Function to initialize Python: - -.. c:function:: PyStatus Py_InitializeFromConfig(const PyConfig *config) - - Initialize Python from *config* configuration. +Initializing the interpreter from a populated configuration struct is handled +by calling :c:func:`Py_InitializeFromConfig`. The caller is responsible to handle exceptions (error or exit) using :c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. @@ -1523,27 +1581,7 @@ If a ``._pth`` file is present: * Set :c:member:`~PyConfig.safe_path` to ``1``. The ``__PYVENV_LAUNCHER__`` environment variable is used to set -:c:member:`PyConfig.base_executable` - - -Py_RunMain() -============ - -.. c:function:: int Py_RunMain(void) - - Execute the command (:c:member:`PyConfig.run_command`), the script - (:c:member:`PyConfig.run_filename`) or the module - (:c:member:`PyConfig.run_module`) specified on the command line or in the - configuration. - - By default and when if :option:`-i` option is used, run the REPL. - - Finally, finalizes Python and returns an exit status that can be passed to - the ``exit()`` function. - -See :ref:`Python Configuration ` for an example of -customized Python always running in isolated mode using -:c:func:`Py_RunMain`. +:c:member:`PyConfig.base_executable`. Py_GetArgcArgv() diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 26c0168d..8ef463e3 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -148,7 +148,7 @@ complete listing. worse performances (due to increased code size for example). The compiler is usually smarter than the developer for the cost/benefit analysis. - If Python is :ref:`built in debug mode ` (if the ``Py_DEBUG`` + If Python is :ref:`built in debug mode ` (if the :c:macro:`Py_DEBUG` macro is defined), the :c:macro:`Py_ALWAYS_INLINE` macro does nothing. It must be specified before the function return type. Usage:: @@ -325,8 +325,8 @@ objects that reference each other here; for now, the solution is "don't do that.") .. index:: - single: Py_INCREF() - single: Py_DECREF() + single: Py_INCREF (C function) + single: Py_DECREF (C function) Reference counts are always manipulated explicitly. The normal way is to use the macro :c:func:`Py_INCREF` to take a new reference to an @@ -401,8 +401,8 @@ function, that function assumes that it now owns that reference, and you are not responsible for it any longer. .. index:: - single: PyList_SetItem() - single: PyTuple_SetItem() + single: PyList_SetItem (C function) + single: PyTuple_SetItem (C function) Few functions steal references; the two notable exceptions are :c:func:`PyList_SetItem` and :c:func:`PyTuple_SetItem`, which steal a reference @@ -491,8 +491,8 @@ using :c:func:`PySequence_GetItem` (which happens to take exactly the same arguments), you do own a reference to the returned object. .. index:: - single: PyList_GetItem() - single: PySequence_GetItem() + single: PyList_GetItem (C function) + single: PySequence_GetItem (C function) Here is an example of how you could write a function that computes the sum of the items in a list of integers; once using :c:func:`PyList_GetItem`, and once @@ -587,7 +587,7 @@ caller, then to the caller's caller, and so on, until they reach the top-level interpreter, where they are reported to the user accompanied by a stack traceback. -.. index:: single: PyErr_Occurred() +.. index:: single: PyErr_Occurred (C function) For C programmers, however, error checking always has to be explicit. All functions in the Python/C API can raise exceptions, unless an explicit claim is @@ -601,8 +601,8 @@ ambiguous return value, and require explicit testing for errors with :c:func:`PyErr_Occurred`. These exceptions are always explicitly documented. .. index:: - single: PyErr_SetString() - single: PyErr_Clear() + single: PyErr_SetString (C function) + single: PyErr_Clear (C function) Exception state is maintained in per-thread storage (this is equivalent to using global storage in an unthreaded application). A thread can be in one of @@ -624,7 +624,7 @@ an exception is being passed on between C functions until it reaches the Python bytecode interpreter's main loop, which takes care of transferring it to ``sys.exc_info()`` and friends. -.. index:: single: exc_info() (in module sys) +.. index:: single: exc_info (in module sys) Note that starting with Python 1.5, the preferred, thread-safe way to access the exception state from Python code is to call the function :func:`sys.exc_info`, @@ -709,9 +709,9 @@ Here is the corresponding C code, in all its glory:: .. index:: single: incr_item() .. index:: - single: PyErr_ExceptionMatches() - single: PyErr_Clear() - single: Py_XDECREF() + single: PyErr_ExceptionMatches (C function) + single: PyErr_Clear (C function) + single: Py_XDECREF (C function) This example represents an endorsed use of the ``goto`` statement in C! It illustrates the use of :c:func:`PyErr_ExceptionMatches` and @@ -735,7 +735,7 @@ the finalization, of the Python interpreter. Most functionality of the interpreter can only be used after the interpreter has been initialized. .. index:: - single: Py_Initialize() + single: Py_Initialize (C function) pair: module; builtins pair: module; __main__ pair: module; sys @@ -770,21 +770,21 @@ environment variable :envvar:`PYTHONHOME`, or insert additional directories in front of the standard path by setting :envvar:`PYTHONPATH`. .. index:: - single: Py_SetProgramName() - single: Py_GetPath() - single: Py_GetPrefix() - single: Py_GetExecPrefix() - single: Py_GetProgramFullPath() - -The embedding application can steer the search by calling -``Py_SetProgramName(file)`` *before* calling :c:func:`Py_Initialize`. Note that + single: Py_GetPath (C function) + single: Py_GetPrefix (C function) + single: Py_GetExecPrefix (C function) + single: Py_GetProgramFullPath (C function) + +The embedding application can steer the search by setting +:c:member:`PyConfig.program_name` *before* calling +:c:func:`Py_InitializeFromConfig`. Note that :envvar:`PYTHONHOME` still overrides this and :envvar:`PYTHONPATH` is still inserted in front of the standard path. An application that requires total control has to provide its own implementation of :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, and :c:func:`Py_GetProgramFullPath` (all defined in :file:`Modules/getpath.c`). -.. index:: single: Py_IsInitialized() +.. index:: single: Py_IsInitialized (C function) Sometimes, it is desirable to "uninitialize" Python. For instance, the application may want to start over (make another call to @@ -812,12 +812,14 @@ available that support tracing of reference counts, debugging the memory allocator, or low-level profiling of the main interpreter loop. Only the most frequently used builds will be described in the remainder of this section. -Compiling the interpreter with the :c:macro:`Py_DEBUG` macro defined produces +.. c:macro:: Py_DEBUG + +Compiling the interpreter with the :c:macro:`!Py_DEBUG` macro defined produces what is generally meant by :ref:`a debug build of Python `. -:c:macro:`Py_DEBUG` is enabled in the Unix build by adding +:c:macro:`!Py_DEBUG` is enabled in the Unix build by adding :option:`--with-pydebug` to the :file:`./configure` command. It is also implied by the presence of the -not-Python-specific :c:macro:`_DEBUG` macro. When :c:macro:`Py_DEBUG` is enabled +not-Python-specific :c:macro:`!_DEBUG` macro. When :c:macro:`!Py_DEBUG` is enabled in the Unix build, compiler optimization is disabled. In addition to the reference count debugging described below, extra checks are @@ -832,4 +834,3 @@ after every statement run by the interpreter.) Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution for more detailed information. - diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst index dbf35611..758415a7 100644 --- a/Doc/c-api/list.rst +++ b/Doc/c-api/list.rst @@ -38,9 +38,12 @@ List Objects .. note:: If *len* is greater than zero, the returned list object's items are - set to ``NULL``. Thus you cannot use abstract API functions such as - :c:func:`PySequence_SetItem` or expose the object to Python code before - setting all items to a real object with :c:func:`PyList_SetItem`. + set to ``NULL``. Thus you cannot use abstract API functions such as + :c:func:`PySequence_SetItem` or expose the object to Python code before + setting all items to a real object with :c:func:`PyList_SetItem` or + :c:func:`PyList_SET_ITEM()`. The following APIs are safe APIs before + the list is fully initialized: :c:func:`PyList_SetItem()` and :c:func:`PyList_SET_ITEM()`. + .. c:function:: Py_ssize_t PyList_Size(PyObject *list) @@ -56,13 +59,21 @@ List Objects Similar to :c:func:`PyList_Size`, but without error checking. -.. c:function:: PyObject* PyList_GetItem(PyObject *list, Py_ssize_t index) +.. c:function:: PyObject* PyList_GetItemRef(PyObject *list, Py_ssize_t index) Return the object at position *index* in the list pointed to by *list*. The position must be non-negative; indexing from the end of the list is not - supported. If *index* is out of bounds (<0 or >=len(list)), + supported. If *index* is out of bounds (:code:`<0 or >=len(list)`), return ``NULL`` and set an :exc:`IndexError` exception. + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyList_GetItem(PyObject *list, Py_ssize_t index) + + Like :c:func:`PyList_GetItemRef`, but returns a + :term:`borrowed reference` instead of a :term:`strong reference`. + .. c:function:: PyObject* PyList_GET_ITEM(PyObject *list, Py_ssize_t i) @@ -86,6 +97,10 @@ List Objects Macro form of :c:func:`PyList_SetItem` without error checking. This is normally only used to fill in new lists where there is no previous content. + Bounds checking is performed as an assertion if Python is built in + :ref:`debug mode ` or :option:`with assertions + <--with-assertions>`. + .. note:: This macro "steals" a reference to *item*, and, unlike @@ -124,6 +139,30 @@ List Objects list is not supported. +.. c:function:: int PyList_Extend(PyObject *list, PyObject *iterable) + + Extend *list* with the contents of *iterable*. This is the same as + ``PyList_SetSlice(list, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, iterable)`` + and analogous to ``list.extend(iterable)`` or ``list += iterable``. + + Raise an exception and return ``-1`` if *list* is not a :class:`list` + object. Return 0 on success. + + .. versionadded:: 3.13 + + +.. c:function:: int PyList_Clear(PyObject *list) + + Remove all items from *list*. This is the same as + ``PyList_SetSlice(list, 0, PY_SSIZE_T_MAX, NULL)`` and analogous to + ``list.clear()`` or ``del list[:]``. + + Raise an exception and return ``-1`` if *list* is not a :class:`list` + object. Return 0 on success. + + .. versionadded:: 3.13 + + .. c:function:: int PyList_Sort(PyObject *list) Sort the items of *list* in place. Return ``0`` on success, ``-1`` on diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index f1354a34..1f899b1d 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -113,11 +113,36 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. retrieved from the resulting value using :c:func:`PyLong_AsVoidPtr`. -.. XXX alias PyLong_AS_LONG (for now) +.. c:function:: PyObject* PyLong_FromNativeBytes(const void* buffer, size_t n_bytes, int flags) + + Create a Python integer from the value contained in the first *n_bytes* of + *buffer*, interpreted as a two's-complement signed number. + + *flags* are as for :c:func:`PyLong_AsNativeBytes`. Passing ``-1`` will select + the native endian that CPython was compiled with and assume that the + most-significant bit is a sign bit. Passing + ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` will produce the same result as calling + :c:func:`PyLong_FromUnsignedNativeBytes`. Other flags are ignored. + + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyLong_FromUnsignedNativeBytes(const void* buffer, size_t n_bytes, int flags) + + Create a Python integer from the value contained in the first *n_bytes* of + *buffer*, interpreted as an unsigned number. + + *flags* are as for :c:func:`PyLong_AsNativeBytes`. Passing ``-1`` will select + the native endian that CPython was compiled with and assume that the + most-significant bit is not a sign bit. Flags other than endian are ignored. + + .. versionadded:: 3.13 + + .. c:function:: long PyLong_AsLong(PyObject *obj) .. index:: - single: LONG_MAX + single: LONG_MAX (C macro) single: OverflowError (built-in exception) Return a C :c:expr:`long` representation of *obj*. If *obj* is not an @@ -135,6 +160,24 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.10 This function will no longer use :meth:`~object.__int__`. + .. c:namespace:: NULL + + .. c:function:: long PyLong_AS_LONG(PyObject *obj) + + A :term:`soft deprecated` alias. + Exactly equivalent to the preferred ``PyLong_AsLong``. In particular, + it can fail with :exc:`OverflowError` or another exception. + + .. deprecated:: 3.14 + The function is soft deprecated. + +.. c:function:: int PyLong_AsInt(PyObject *obj) + + Similar to :c:func:`PyLong_AsLong`, but store the result in a C + :c:expr:`int` instead of a C :c:expr:`long`. + + .. versionadded:: 3.13 + .. c:function:: long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow) @@ -202,7 +245,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. c:function:: Py_ssize_t PyLong_AsSsize_t(PyObject *pylong) .. index:: - single: PY_SSIZE_T_MAX + single: PY_SSIZE_T_MAX (C macro) single: OverflowError (built-in exception) Return a C :c:type:`Py_ssize_t` representation of *pylong*. *pylong* must @@ -217,7 +260,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. c:function:: unsigned long PyLong_AsUnsignedLong(PyObject *pylong) .. index:: - single: ULONG_MAX + single: ULONG_MAX (C macro) single: OverflowError (built-in exception) Return a C :c:expr:`unsigned long` representation of *pylong*. *pylong* @@ -233,7 +276,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. c:function:: size_t PyLong_AsSize_t(PyObject *pylong) .. index:: - single: SIZE_MAX + single: SIZE_MAX (C macro) single: OverflowError (built-in exception) Return a C :c:type:`size_t` representation of *pylong*. *pylong* must be @@ -324,6 +367,162 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Returns ``NULL`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. +.. c:function:: Py_ssize_t PyLong_AsNativeBytes(PyObject *pylong, void* buffer, Py_ssize_t n_bytes, int flags) + + Copy the Python integer value *pylong* to a native *buffer* of size + *n_bytes*. The *flags* can be set to ``-1`` to behave similarly to a C cast, + or to values documented below to control the behavior. + + Returns ``-1`` with an exception raised on error. This may happen if + *pylong* cannot be interpreted as an integer, or if *pylong* was negative + and the ``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` flag was set. + + Otherwise, returns the number of bytes required to store the value. + If this is equal to or less than *n_bytes*, the entire value was copied. + All *n_bytes* of the buffer are written: large buffers are padded with + zeroes. + + If the returned value is greater than than *n_bytes*, the value was + truncated: as many of the lowest bits of the value as could fit are written, + and the higher bits are ignored. This matches the typical behavior + of a C-style downcast. + + .. note:: + + Overflow is not considered an error. If the returned value + is larger than *n_bytes*, most significant bits were discarded. + + ``0`` will never be returned. + + Values are always copied as two's-complement. + + Usage example:: + + int32_t value; + Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1); + if (bytes < 0) { + // Failed. A Python exception was set with the reason. + return NULL; + } + else if (bytes <= (Py_ssize_t)sizeof(value)) { + // Success! + } + else { + // Overflow occurred, but 'value' contains the truncated + // lowest bits of pylong. + } + + Passing zero to *n_bytes* will return the size of a buffer that would + be large enough to hold the value. This may be larger than technically + necessary, but not unreasonably so. If *n_bytes=0*, *buffer* may be + ``NULL``. + + .. note:: + + Passing *n_bytes=0* to this function is not an accurate way to determine + the bit length of the value. + + To get at the entire Python value of an unknown size, the function can be + called twice: first to determine the buffer size, then to fill it:: + + // Ask how much space we need. + Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1); + if (expected < 0) { + // Failed. A Python exception was set with the reason. + return NULL; + } + assert(expected != 0); // Impossible per the API definition. + uint8_t *bignum = malloc(expected); + if (!bignum) { + PyErr_SetString(PyExc_MemoryError, "bignum malloc failed."); + return NULL; + } + // Safely get the entire value. + Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1); + if (bytes < 0) { // Exception has been set. + free(bignum); + return NULL; + } + else if (bytes > expected) { // This should not be possible. + PyErr_SetString(PyExc_RuntimeError, + "Unexpected bignum truncation after a size check."); + free(bignum); + return NULL; + } + // The expected success given the above pre-check. + // ... use bignum ... + free(bignum); + + *flags* is either ``-1`` (``Py_ASNATIVEBYTES_DEFAULTS``) to select defaults + that behave most like a C cast, or a combination of the other flags in + the table below. + Note that ``-1`` cannot be combined with other flags. + + Currently, ``-1`` corresponds to + ``Py_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER``. + + .. c:namespace:: NULL + + ============================================= ====== + Flag Value + ============================================= ====== + .. c:macro:: Py_ASNATIVEBYTES_DEFAULTS ``-1`` + .. c:macro:: Py_ASNATIVEBYTES_BIG_ENDIAN ``0`` + .. c:macro:: Py_ASNATIVEBYTES_LITTLE_ENDIAN ``1`` + .. c:macro:: Py_ASNATIVEBYTES_NATIVE_ENDIAN ``3`` + .. c:macro:: Py_ASNATIVEBYTES_UNSIGNED_BUFFER ``4`` + .. c:macro:: Py_ASNATIVEBYTES_REJECT_NEGATIVE ``8`` + .. c:macro:: Py_ASNATIVEBYTES_ALLOW_INDEX ``16`` + ============================================= ====== + + Specifying ``Py_ASNATIVEBYTES_NATIVE_ENDIAN`` will override any other endian + flags. Passing ``2`` is reserved. + + By default, sufficient buffer will be requested to include a sign bit. + For example, when converting 128 with *n_bytes=1*, the function will return + 2 (or more) in order to store a zero sign bit. + + If ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` is specified, a zero sign bit + will be omitted from size calculations. This allows, for example, 128 to fit + in a single-byte buffer. If the destination buffer is later treated as + signed, a positive input value may become negative. + Note that the flag does not affect handling of negative values: for those, + space for a sign bit is always requested. + + Specifying ``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` causes an exception to be set + if *pylong* is negative. Without this flag, negative values will be copied + provided there is enough space for at least one sign bit, regardless of + whether ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` was specified. + + If ``Py_ASNATIVEBYTES_ALLOW_INDEX`` is specified and a non-integer value is + passed, its :meth:`~object.__index__` method will be called first. This may + result in Python code executing and other threads being allowed to run, which + could cause changes to other objects or values in use. When *flags* is + ``-1``, this option is not set, and non-integer values will raise + :exc:`TypeError`. + + .. note:: + + With the default *flags* (``-1``, or *UNSIGNED_BUFFER* without + *REJECT_NEGATIVE*), multiple Python integers can map to a single value + without overflow. For example, both ``255`` and ``-1`` fit a single-byte + buffer and set all its bits. + This matches typical C cast behavior. + + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyLong_GetInfo(void) + + On success, return a read only :term:`named tuple`, that holds + information about Python's internal representation of integers. + See :data:`sys.int_info` for description of individual fields. + + On failure, return ``NULL`` with an exception set. + + .. versionadded:: 3.1 + + .. c:function:: int PyUnstable_Long_IsCompact(const PyLongObject* op) Return 1 if *op* is compact, 0 otherwise. @@ -332,13 +531,16 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. a “fast path” for small integers. For compact values use :c:func:`PyUnstable_Long_CompactValue`; for others fall back to a :c:func:`PyLong_As* ` function or - :c:func:`calling ` :meth:`int.to_bytes`. + :c:func:`PyLong_AsNativeBytes`. The speedup is expected to be negligible for most users. Exactly what values are considered compact is an implementation detail and is subject to change. + .. versionadded:: 3.12 + + .. c:function:: Py_ssize_t PyUnstable_Long_CompactValue(const PyLongObject* op) If *op* is compact, as determined by :c:func:`PyUnstable_Long_IsCompact`, @@ -346,3 +548,5 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Otherwise, the return value is undefined. + .. versionadded:: 3.12 + diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 0c42b917..1f55c0aa 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -33,6 +33,30 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and rather than a :c:expr:`PyObject*`. +.. c:function:: int PyMapping_GetOptionalItem(PyObject *obj, PyObject *key, PyObject **result) + + Variant of :c:func:`PyObject_GetItem` which doesn't raise + :exc:`KeyError` if the key is not found. + + If the key is found, return ``1`` and set *\*result* to a new + :term:`strong reference` to the corresponding value. + If the key is not found, return ``0`` and set *\*result* to ``NULL``; + the :exc:`KeyError` is silenced. + If an error other than :exc:`KeyError` is raised, return ``-1`` and + set *\*result* to ``NULL``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyMapping_GetOptionalItemString(PyObject *obj, const char *key, PyObject **result) + + This is the same as :c:func:`PyMapping_GetOptionalItem`, but *key* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: int PyMapping_SetItemString(PyObject *o, const char *key, PyObject *v) This is the same as :c:func:`PyObject_SetItem`, but *key* is @@ -52,6 +76,24 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and rather than a :c:expr:`PyObject*`. +.. c:function:: int PyMapping_HasKeyWithError(PyObject *o, PyObject *key) + + Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. + This is equivalent to the Python expression ``key in o``. + On failure, return ``-1``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyMapping_HasKeyStringWithError(PyObject *o, const char *key) + + This is the same as :c:func:`PyMapping_HasKeyWithError`, but *key* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: int PyMapping_HasKey(PyObject *o, PyObject *key) Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. @@ -62,7 +104,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Exceptions which occur when this calls :meth:`~object.__getitem__` method are silently ignored. - For proper error handling, use :c:func:`PyObject_GetItem()` instead. + For proper error handling, use :c:func:`PyMapping_HasKeyWithError`, + :c:func:`PyMapping_GetOptionalItem` or :c:func:`PyObject_GetItem()` instead. .. c:function:: int PyMapping_HasKeyString(PyObject *o, const char *key) @@ -76,7 +119,9 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Exceptions that occur when this calls :meth:`~object.__getitem__` method or while creating the temporary :class:`str` object are silently ignored. - For proper error handling, use :c:func:`PyMapping_GetItemString` instead. + For proper error handling, use :c:func:`PyMapping_HasKeyStringWithError`, + :c:func:`PyMapping_GetOptionalItemString` or + :c:func:`PyMapping_GetItemString` instead. .. c:function:: PyObject* PyMapping_Keys(PyObject *o) diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index 489f1580..b9085ad3 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -15,7 +15,7 @@ Numeric values are stored with the least significant byte first. The module supports two versions of the data format: version 0 is the historical version, version 1 shares interned strings in the file, and upon -unmarshalling. Version 2 uses a binary format for floating point numbers. +unmarshalling. Version 2 uses a binary format for floating-point numbers. ``Py_MARSHAL_VERSION`` indicates the current file format (currently 2). diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 1df8c2b9..f7618a02 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -41,10 +41,10 @@ buffers is performed on demand by the Python memory manager through the Python/C API functions listed in this document. .. index:: - single: malloc() - single: calloc() - single: realloc() - single: free() + single: malloc (C function) + single: calloc (C function) + single: realloc (C function) + single: free (C function) To avoid memory corruption, extension writers should never try to operate on Python objects with the functions exported by the C library: :c:func:`malloc`, @@ -102,30 +102,38 @@ All allocating functions belong to one of three different "domains" (see also strategies and are optimized for different purposes. The specific details on how every domain allocates memory or what internal functions each domain calls is considered an implementation detail, but for debugging purposes a simplified -table can be found at :ref:`here `. There is no hard -requirement to use the memory returned by the allocation functions belonging to -a given domain for only the purposes hinted by that domain (although this is the -recommended practice). For example, one could use the memory returned by -:c:func:`PyMem_RawMalloc` for allocating Python objects or the memory returned -by :c:func:`PyObject_Malloc` for allocating memory for buffers. +table can be found at :ref:`here `. +The APIs used to allocate and free a block of memory must be from the same domain. +For example, :c:func:`PyMem_Free` must be used to free memory allocated using :c:func:`PyMem_Malloc`. The three allocation domains are: * Raw domain: intended for allocating memory for general-purpose memory buffers where the allocation *must* go to the system allocator or where the allocator can operate without the :term:`GIL`. The memory is requested directly - to the system. + from the system. See :ref:`Raw Memory Interface `. * "Mem" domain: intended for allocating memory for Python buffers and general-purpose memory buffers where the allocation must be performed with the :term:`GIL` held. The memory is taken from the Python private heap. + See :ref:`Memory Interface `. -* Object domain: intended for allocating memory belonging to Python objects. The - memory is taken from the Python private heap. +* Object domain: intended for allocating memory for Python objects. The + memory is taken from the Python private heap. See :ref:`Object allocators `. -When freeing memory previously allocated by the allocating functions belonging to a -given domain,the matching specific deallocating functions must be used. For example, -:c:func:`PyMem_Free` must be used to free memory allocated using :c:func:`PyMem_Malloc`. +.. note:: + + The :term:`free-threaded ` build requires that only Python objects are allocated using the "object" domain + and that all Python objects are allocated using that domain. This differs from the prior Python versions, + where this was only a best practice and not a hard requirement. + + For example, buffers (non-Python objects) should be allocated using :c:func:`PyMem_Malloc`, + :c:func:`PyMem_RawMalloc`, or :c:func:`malloc`, but not :c:func:`PyObject_Malloc`. + + See :ref:`Memory Allocation APIs `. + + +.. _raw-memoryinterface: Raw Memory Interface ==================== @@ -267,14 +275,14 @@ The following type-oriented macros are provided for convenience. Note that .. c:macro:: PyMem_New(TYPE, n) Same as :c:func:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of - memory. Returns a pointer cast to :c:expr:`TYPE*`. The memory will not have + memory. Returns a pointer cast to ``TYPE*``. The memory will not have been initialized in any way. .. c:macro:: PyMem_Resize(p, TYPE, n) Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n * - sizeof(TYPE))`` bytes. Returns a pointer cast to :c:expr:`TYPE*`. On return, + sizeof(TYPE))`` bytes. Returns a pointer cast to ``TYPE*``. On return, *p* will be a pointer to the new memory area, or ``NULL`` in the event of failure. @@ -299,6 +307,8 @@ versions and is therefore deprecated in extension modules. * ``PyMem_DEL(ptr)`` +.. _objectinterface: + Object allocators ================= @@ -391,6 +401,8 @@ Legend: * ``malloc``: system allocators from the standard C library, C functions: :c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free`. * ``pymalloc``: :ref:`pymalloc memory allocator `. +* ``mimalloc``: :ref:`mimalloc memory allocator `. The pymalloc + allocator will be used if mimalloc support isn't available. * "+ debug": with :ref:`debug hooks on the Python memory allocators `. * "Debug build": :ref:`Python build in debug mode `. @@ -491,18 +503,18 @@ Customize Memory Allocators :c:func:`PyMem_SetAllocator` does have the following contract: - * It can be called after :c:func:`Py_PreInitialize` and before - :c:func:`Py_InitializeFromConfig` to install a custom memory - allocator. There are no restrictions over the installed allocator - other than the ones imposed by the domain (for instance, the Raw - Domain allows the allocator to be called without the GIL held). See - :ref:`the section on allocator domains ` for more - information. + * It can be called after :c:func:`Py_PreInitialize` and before + :c:func:`Py_InitializeFromConfig` to install a custom memory + allocator. There are no restrictions over the installed allocator + other than the ones imposed by the domain (for instance, the Raw + Domain allows the allocator to be called without the GIL held). See + :ref:`the section on allocator domains ` for more + information. - * If called after Python has finish initializing (after - :c:func:`Py_InitializeFromConfig` has been called) the allocator - **must** wrap the existing allocator. Substituting the current - allocator for some other arbitrary one is **not supported**. + * If called after Python has finish initializing (after + :c:func:`Py_InitializeFromConfig` has been called) the allocator + **must** wrap the existing allocator. Substituting the current + allocator for some other arbitrary one is **not supported**. .. versionchanged:: 3.12 All allocators must be thread-safe. @@ -626,7 +638,8 @@ The pymalloc allocator Python has a *pymalloc* allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime. It uses memory mappings called "arenas" -with a fixed size of 256 KiB. It falls back to :c:func:`PyMem_RawMalloc` and +with a fixed size of either 256 KiB on 32-bit platforms or 1 MiB on 64-bit +platforms. It falls back to :c:func:`PyMem_RawMalloc` and :c:func:`PyMem_RawRealloc` for allocations larger than 512 bytes. *pymalloc* is the :ref:`default allocator ` of the @@ -671,6 +684,16 @@ Customize pymalloc Arena Allocator Set the arena allocator. +.. _mimalloc: + +The mimalloc allocator +====================== + +.. versionadded:: 3.13 + +Python supports the mimalloc allocator when the underlying platform support is available. +mimalloc "is a general purpose allocator with excellent performance characteristics. +Initially developed by Daan Leijen for the runtime systems of the Koka and Lean languages." tracemalloc C API ================= diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst index 2aa43318..f6038032 100644 --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -20,6 +20,17 @@ any other object. read/write, otherwise it may be either read-only or read/write at the discretion of the exporter. + +.. c:macro:: PyBUF_READ + + Flag to request a readonly buffer. + + +.. c:macro:: PyBUF_WRITE + + Flag to request a writable buffer. + + .. c:function:: PyObject *PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags) Create a memoryview object using *mem* as the underlying buffer. @@ -41,6 +52,8 @@ any other object. original memory. Otherwise, a copy is made and the memoryview points to a new bytes object. + *buffertype* can be one of :c:macro:`PyBUF_READ` or :c:macro:`PyBUF_WRITE`. + .. c:function:: int PyMemoryView_Check(PyObject *obj) diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index f941f0c7..f82a050a 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -37,16 +37,19 @@ Module Objects single: __package__ (module attribute) single: __loader__ (module attribute) - Return a new module object with the :attr:`__name__` attribute set to *name*. - The module's :attr:`__name__`, :attr:`__doc__`, :attr:`__package__`, and - :attr:`__loader__` attributes are filled in (all but :attr:`__name__` are set - to ``None``); the caller is responsible for providing a :attr:`__file__` - attribute. + Return a new module object with :attr:`module.__name__` set to *name*. + The module's :attr:`!__name__`, :attr:`~module.__doc__`, + :attr:`~module.__package__` and :attr:`~module.__loader__` attributes are + filled in (all but :attr:`!__name__` are set to ``None``). The caller is + responsible for setting a :attr:`~module.__file__` attribute. + + Return ``NULL`` with an exception set on error. .. versionadded:: 3.3 .. versionchanged:: 3.4 - :attr:`__package__` and :attr:`__loader__` are set to ``None``. + :attr:`~module.__package__` and :attr:`~module.__loader__` are now set to + ``None``. .. c:function:: PyObject* PyModule_New(const char *name) @@ -75,8 +78,9 @@ Module Objects single: __name__ (module attribute) single: SystemError (built-in exception) - Return *module*'s :attr:`__name__` value. If the module does not provide one, - or if it is not a string, :exc:`SystemError` is raised and ``NULL`` is returned. + Return *module*'s :attr:`~module.__name__` value. If the module does not + provide one, or if it is not a string, :exc:`SystemError` is raised and + ``NULL`` is returned. .. versionadded:: 3.3 @@ -106,8 +110,8 @@ Module Objects single: SystemError (built-in exception) Return the name of the file from which *module* was loaded using *module*'s - :attr:`__file__` attribute. If this is not defined, or if it is not a - unicode string, raise :exc:`SystemError` and return ``NULL``; otherwise return + :attr:`~module.__file__` attribute. If this is not defined, or if it is not a + string, raise :exc:`SystemError` and return ``NULL``; otherwise return a reference to a Unicode object. .. versionadded:: 3.2 @@ -265,6 +269,8 @@ of the following two module creation functions: API version *module_api_version*. If that version does not match the version of the running interpreter, a :exc:`RuntimeWarning` is emitted. + Return ``NULL`` with an exception set on error. + .. note:: Most uses of this function should be using :c:func:`PyModule_Create` @@ -338,7 +344,8 @@ The available slot types are: The *value* pointer of this slot must point to a function of the signature: .. c:function:: PyObject* create_module(PyObject *spec, PyModuleDef *def) - :noindex: + :no-index-entry: + :no-contents-entry: The function receives a :py:class:`~importlib.machinery.ModuleSpec` instance, as defined in :PEP:`451`, and the module definition. @@ -373,7 +380,8 @@ The available slot types are: The signature of the function is: .. c:function:: int exec_module(PyObject* module) - :noindex: + :no-index-entry: + :no-contents-entry: If multiple ``Py_mod_exec`` slots are specified, they are processed in the order they appear in the *m_slots* array. @@ -411,6 +419,33 @@ The available slot types are: .. versionadded:: 3.12 +.. c:macro:: Py_mod_gil + + Specifies one of the following values: + + .. c:namespace:: NULL + + .. c:macro:: Py_MOD_GIL_USED + + The module depends on the presence of the global interpreter lock (GIL), + and may access global state without synchronization. + + .. c:macro:: Py_MOD_GIL_NOT_USED + + The module is safe to run without an active GIL. + + This slot is ignored by Python builds not configured with + :option:`--disable-gil`. Otherwise, it determines whether or not importing + this module will cause the GIL to be automatically enabled. See + :ref:`whatsnew313-free-threaded-cpython` for more detail. + + Multiple ``Py_mod_gil`` slots may not be specified in one module definition. + + If ``Py_mod_gil`` is not specified, the import machinery defaults to + ``Py_MOD_GIL_USED``. + + .. versionadded:: 3.13 + See :PEP:`489` for more details on multi-phase initialization. Low-level module creation functions @@ -436,6 +471,8 @@ objects dynamically. Note that both ``PyModule_FromDefAndSpec`` and If that version does not match the version of the running interpreter, a :exc:`RuntimeWarning` is emitted. + Return ``NULL`` with an exception set on error. + .. note:: Most uses of this function should be using :c:func:`PyModule_FromDefAndSpec` @@ -486,7 +523,7 @@ state: On success, return ``0``. On error, raise an exception and return ``-1``. - Return ``NULL`` if *value* is ``NULL``. It must be called with an exception + Return ``-1`` if *value* is ``NULL``. It must be called with an exception raised in this case. Example usage:: @@ -518,15 +555,40 @@ state: Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in this case, since *obj* can be ``NULL``. + The number of different *name* strings passed to this function + should be kept small, usually by only using statically allocated strings + as *name*. + For names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object. + .. versionadded:: 3.10 +.. c:function:: int PyModule_Add(PyObject *module, const char *name, PyObject *value) + + Similar to :c:func:`PyModule_AddObjectRef`, but "steals" a reference + to *value*. + It can be called with a result of function that returns a new reference + without bothering to check its result or even saving it to a variable. + + Example usage:: + + if (PyModule_Add(module, "spam", PyBytes_FromString(value)) < 0) { + goto error; + } + + .. versionadded:: 3.13 + + .. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) Similar to :c:func:`PyModule_AddObjectRef`, but steals a reference to *value* on success (if it returns ``0``). - The new :c:func:`PyModule_AddObjectRef` function is recommended, since it is + The new :c:func:`PyModule_Add` or :c:func:`PyModule_AddObjectRef` + functions are recommended, since it is easy to introduce reference leaks by misusing the :c:func:`PyModule_AddObject` function. @@ -536,58 +598,46 @@ state: only releases the reference to *value* **on success**. This means that its return value must be checked, and calling code must - :c:func:`Py_DECREF` *value* manually on error. + :c:func:`Py_XDECREF` *value* manually on error. Example usage:: - static int - add_spam(PyObject *module, int value) - { - PyObject *obj = PyLong_FromLong(value); - if (obj == NULL) { - return -1; - } - if (PyModule_AddObject(module, "spam", obj) < 0) { - Py_DECREF(obj); - return -1; - } - // PyModule_AddObject() stole a reference to obj: - // Py_DECREF(obj) is not needed here - return 0; - } - - The example can also be written without checking explicitly if *obj* is - ``NULL``:: + PyObject *obj = PyBytes_FromString(value); + if (PyModule_AddObject(module, "spam", obj) < 0) { + // If 'obj' is not NULL and PyModule_AddObject() failed, + // 'obj' strong reference must be deleted with Py_XDECREF(). + // If 'obj' is NULL, Py_XDECREF() does nothing. + Py_XDECREF(obj); + goto error; + } + // PyModule_AddObject() stole a reference to obj: + // Py_XDECREF(obj) is not needed here. - static int - add_spam(PyObject *module, int value) - { - PyObject *obj = PyLong_FromLong(value); - if (PyModule_AddObject(module, "spam", obj) < 0) { - Py_XDECREF(obj); - return -1; - } - // PyModule_AddObject() stole a reference to obj: - // Py_DECREF(obj) is not needed here - return 0; - } + .. deprecated:: 3.13 - Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in - this case, since *obj* can be ``NULL``. + :c:func:`PyModule_AddObject` is :term:`soft deprecated`. .. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value) Add an integer constant to *module* as *name*. This convenience function can be - used from the module's initialization function. Return ``-1`` on error, ``0`` on - success. + used from the module's initialization function. + Return ``-1`` with an exception set on error, ``0`` on success. + + This is a convenience function that calls :c:func:`PyLong_FromLong` and + :c:func:`PyModule_AddObjectRef`; see their documentation for details. .. c:function:: int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) Add a string constant to *module* as *name*. This convenience function can be used from the module's initialization function. The string *value* must be - ``NULL``-terminated. Return ``-1`` on error, ``0`` on success. + ``NULL``-terminated. + Return ``-1`` with an exception set on error, ``0`` on success. + + This is a convenience function that calls + :c:func:`PyUnicode_InternFromString` and :c:func:`PyModule_AddObjectRef`; + see their documentation for details. .. c:macro:: PyModule_AddIntMacro(module, macro) @@ -595,7 +645,7 @@ state: Add an int constant to *module*. The name and the value are taken from *macro*. For example ``PyModule_AddIntMacro(module, AF_INET)`` adds the int constant *AF_INET* with the value of *AF_INET* to *module*. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. c:macro:: PyModule_AddStringMacro(module, macro) @@ -608,10 +658,23 @@ state: The type object is finalized by calling internally :c:func:`PyType_Ready`. The name of the type object is taken from the last component of :c:member:`~PyTypeObject.tp_name` after dot. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.9 +.. c:function:: int PyUnstable_Module_SetGIL(PyObject *module, void *gil) + + Indicate that *module* does or does not support running without the global + interpreter lock (GIL), using one of the values from + :c:macro:`Py_mod_gil`. It must be called during *module*'s initialization + function. If this function is not called during module initialization, the + import machinery assumes the module does not support running without the + GIL. This function is only available in Python builds configured with + :option:`--disable-gil`. + Return ``-1`` with an exception set on error, ``0`` on success. + + .. versionadded:: 3.13 + Module lookup ^^^^^^^^^^^^^ @@ -647,14 +710,14 @@ since multiple such modules can be created from a single definition. The caller must hold the GIL. - Return 0 on success or -1 on failure. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.3 .. c:function:: int PyState_RemoveModule(PyModuleDef *def) Removes the module object created from *def* from the interpreter state. - Return 0 on success or -1 on failure. + Return ``-1`` with an exception set on error, ``0`` on success. The caller must hold the GIL. diff --git a/Doc/c-api/monitoring.rst b/Doc/c-api/monitoring.rst new file mode 100644 index 00000000..51d866cf --- /dev/null +++ b/Doc/c-api/monitoring.rst @@ -0,0 +1,192 @@ +.. highlight:: c + +.. _c-api-monitoring: + +Monitoring C API +================ + +Added in version 3.13. + +An extension may need to interact with the event monitoring system. Subscribing +to events and registering callbacks can be done via the Python API exposed in +:mod:`sys.monitoring`. + +Generating Execution Events +=========================== + +The functions below make it possible for an extension to fire monitoring +events as it emulates the execution of Python code. Each of these functions +accepts a ``PyMonitoringState`` struct which contains concise information +about the activation state of events, as well as the event arguments, which +include a ``PyObject*`` representing the code object, the instruction offset +and sometimes additional, event-specific arguments (see :mod:`sys.monitoring` +for details about the signatures of the different event callbacks). +The ``codelike`` argument should be an instance of :class:`types.CodeType` +or of a type that emulates it. + +The VM disables tracing when firing an event, so there is no need for user +code to do that. + +Monitoring functions should not be called with an exception set, +except those listed below as working with the current exception. + +.. c:type:: PyMonitoringState + + Representation of the state of an event type. It is allocated by the user + while its contents are maintained by the monitoring API functions described below. + + +All of the functions below return 0 on success and -1 (with an exception set) on error. + +See :mod:`sys.monitoring` for descriptions of the events. + +.. c:function:: int PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``PY_START`` event. + + +.. c:function:: int PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``PY_RESUME`` event. + + +.. c:function:: int PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject* retval) + + Fire a ``PY_RETURN`` event. + + +.. c:function:: int PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject* retval) + + Fire a ``PY_YIELD`` event. + + +.. c:function:: int PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject* callable, PyObject *arg0) + + Fire a ``CALL`` event. + + +.. c:function:: int PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, int lineno) + + Fire a ``LINE`` event. + + +.. c:function:: int PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset) + + Fire a ``JUMP`` event. + + +.. c:function:: int PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *target_offset) + + Fire a ``BRANCH`` event. + + +.. c:function:: int PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *retval) + + Fire a ``C_RETURN`` event. + + +.. c:function:: int PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``PY_THROW`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``RAISE`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``C_RAISE`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``RERAISE`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire an ``EXCEPTION_HANDLED`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) + + Fire a ``PY_UNWIND`` event with the current exception (as returned by + :c:func:`PyErr_GetRaisedException`). + + +.. c:function:: int PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value) + + Fire a ``STOP_ITERATION`` event. If ``value`` is an instance of :exc:`StopIteration`, it is used. Otherwise, + a new :exc:`StopIteration` instance is created with ``value`` as its argument. + + +Managing the Monitoring State +----------------------------- + +Monitoring states can be managed with the help of monitoring scopes. A scope +would typically correspond to a python function. + +.. c:function:: int PyMonitoring_EnterScope(PyMonitoringState *state_array, uint64_t *version, const uint8_t *event_types, Py_ssize_t length) + + Enter a monitored scope. ``event_types`` is an array of the event IDs for + events that may be fired from the scope. For example, the ID of a ``PY_START`` + event is the value ``PY_MONITORING_EVENT_PY_START``, which is numerically equal + to the base-2 logarithm of ``sys.monitoring.events.PY_START``. + ``state_array`` is an array with a monitoring state entry for each event in + ``event_types``, it is allocated by the user but populated by + :c:func:`!PyMonitoring_EnterScope` with information about the activation state of + the event. The size of ``event_types`` (and hence also of ``state_array``) + is given in ``length``. + + The ``version`` argument is a pointer to a value which should be allocated + by the user together with ``state_array`` and initialized to 0, + and then set only by :c:func:`!PyMonitoring_EnterScope` itself. It allows this + function to determine whether event states have changed since the previous call, + and to return quickly if they have not. + + The scopes referred to here are lexical scopes: a function, class or method. + :c:func:`!PyMonitoring_EnterScope` should be called whenever the lexical scope is + entered. Scopes can be reentered, reusing the same *state_array* and *version*, + in situations like when emulating a recursive Python function. When a code-like's + execution is paused, such as when emulating a generator, the scope needs to + be exited and re-entered. + + The macros for *event_types* are: + + .. c:namespace:: NULL + + .. The table is here to make the docs searchable, and to allow automatic + links to the identifiers. + + ================================================== ===================================== + Macro Event + ================================================== ===================================== + .. c:macro:: PY_MONITORING_EVENT_BRANCH :monitoring-event:`BRANCH` + .. c:macro:: PY_MONITORING_EVENT_CALL :monitoring-event:`CALL` + .. c:macro:: PY_MONITORING_EVENT_C_RAISE :monitoring-event:`C_RAISE` + .. c:macro:: PY_MONITORING_EVENT_C_RETURN :monitoring-event:`C_RETURN` + .. c:macro:: PY_MONITORING_EVENT_EXCEPTION_HANDLED :monitoring-event:`EXCEPTION_HANDLED` + .. c:macro:: PY_MONITORING_EVENT_INSTRUCTION :monitoring-event:`INSTRUCTION` + .. c:macro:: PY_MONITORING_EVENT_JUMP :monitoring-event:`JUMP` + .. c:macro:: PY_MONITORING_EVENT_LINE :monitoring-event:`LINE` + .. c:macro:: PY_MONITORING_EVENT_PY_RESUME :monitoring-event:`PY_RESUME` + .. c:macro:: PY_MONITORING_EVENT_PY_RETURN :monitoring-event:`PY_RETURN` + .. c:macro:: PY_MONITORING_EVENT_PY_START :monitoring-event:`PY_START` + .. c:macro:: PY_MONITORING_EVENT_PY_THROW :monitoring-event:`PY_THROW` + .. c:macro:: PY_MONITORING_EVENT_PY_UNWIND :monitoring-event:`PY_UNWIND` + .. c:macro:: PY_MONITORING_EVENT_PY_YIELD :monitoring-event:`PY_YIELD` + .. c:macro:: PY_MONITORING_EVENT_RAISE :monitoring-event:`RAISE` + .. c:macro:: PY_MONITORING_EVENT_RERAISE :monitoring-event:`RERAISE` + .. c:macro:: PY_MONITORING_EVENT_STOP_ITERATION :monitoring-event:`STOP_ITERATION` + ================================================== ===================================== + +.. c:function:: int PyMonitoring_ExitScope(void) + + Exit the last scope that was entered with :c:func:`!PyMonitoring_EnterScope`. diff --git a/Doc/c-api/none.rst b/Doc/c-api/none.rst index dd8bfb56..f1941fc4 100644 --- a/Doc/c-api/none.rst +++ b/Doc/c-api/none.rst @@ -16,10 +16,10 @@ same reason. .. c:var:: PyObject* Py_None The Python ``None`` object, denoting lack of value. This object has no methods - and is `immortal `_. + and is :term:`immortal`. -.. versionchanged:: 3.12 - :c:data:`Py_None` is immortal. + .. versionchanged:: 3.12 + :c:data:`Py_None` is :term:`immortal`. .. c:macro:: Py_RETURN_NONE diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 13d3c5af..ad8b5935 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -51,8 +51,8 @@ Number Protocol Return a reasonable approximation for the mathematical value of *o1* divided by *o2*, or ``NULL`` on failure. The return value is "approximate" because binary - floating point numbers are approximate; it is not possible to represent all real - numbers in base two. This function can return a floating point value when + floating-point numbers are approximate; it is not possible to represent all real + numbers in base two. This function can return a floating-point value when passed two integers. This is the equivalent of the Python expression ``o1 / o2``. @@ -177,8 +177,8 @@ Number Protocol Return a reasonable approximation for the mathematical value of *o1* divided by *o2*, or ``NULL`` on failure. The return value is "approximate" because binary - floating point numbers are approximate; it is not possible to represent all real - numbers in base two. This function can return a floating point value when + floating-point numbers are approximate; it is not possible to represent all real + numbers in base two. This function can return a floating-point value when passed two integers. The operation is done *in-place* when *o1* supports it. This is the equivalent of the Python statement ``o1 /= o2``. diff --git a/Doc/c-api/objbuffer.rst b/Doc/c-api/objbuffer.rst deleted file mode 100644 index 6b82a642..00000000 --- a/Doc/c-api/objbuffer.rst +++ /dev/null @@ -1,55 +0,0 @@ -.. highlight:: c - -Old Buffer Protocol -------------------- - -.. deprecated:: 3.0 - -These functions were part of the "old buffer protocol" API in Python 2. -In Python 3, this protocol doesn't exist anymore but the functions are still -exposed to ease porting 2.x code. They act as a compatibility wrapper -around the :ref:`new buffer protocol `, but they don't give -you control over the lifetime of the resources acquired when a buffer is -exported. - -Therefore, it is recommended that you call :c:func:`PyObject_GetBuffer` -(or the ``y*`` or ``w*`` :ref:`format codes ` with the -:c:func:`PyArg_ParseTuple` family of functions) to get a buffer view over -an object, and :c:func:`PyBuffer_Release` when the buffer view can be released. - - -.. c:function:: int PyObject_AsCharBuffer(PyObject *obj, const char **buffer, Py_ssize_t *buffer_len) - - Returns a pointer to a read-only memory location usable as character-based - input. The *obj* argument must support the single-segment character buffer - interface. On success, returns ``0``, sets *buffer* to the memory location - and *buffer_len* to the buffer length. Returns ``-1`` and sets a - :exc:`TypeError` on error. - - -.. c:function:: int PyObject_AsReadBuffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len) - - Returns a pointer to a read-only memory location containing arbitrary data. - The *obj* argument must support the single-segment readable buffer - interface. On success, returns ``0``, sets *buffer* to the memory location - and *buffer_len* to the buffer length. Returns ``-1`` and sets a - :exc:`TypeError` on error. - - -.. c:function:: int PyObject_CheckReadBuffer(PyObject *o) - - Returns ``1`` if *o* supports the single-segment readable buffer interface. - Otherwise returns ``0``. This function always succeeds. - - Note that this function tries to get and release a buffer, and exceptions - which occur while calling corresponding functions will get suppressed. - To get error reporting use :c:func:`PyObject_GetBuffer()` instead. - - -.. c:function:: int PyObject_AsWriteBuffer(PyObject *obj, void **buffer, Py_ssize_t *buffer_len) - - Returns a pointer to a writable memory location. The *obj* argument must - support the single-segment, character buffer interface. On success, - returns ``0``, sets *buffer* to the memory location and *buffer_len* to the - buffer length. Returns ``-1`` and sets a :exc:`TypeError` on error. - diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index d88de794..1e822fad 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -6,6 +6,56 @@ Object Protocol =============== +.. c:function:: PyObject* Py_GetConstant(unsigned int constant_id) + + Get a :term:`strong reference` to a constant. + + Set an exception and return ``NULL`` if *constant_id* is invalid. + + *constant_id* must be one of these constant identifiers: + + .. c:namespace:: NULL + + ======================================== ===== ========================= + Constant Identifier Value Returned object + ======================================== ===== ========================= + .. c:macro:: Py_CONSTANT_NONE ``0`` :py:data:`None` + .. c:macro:: Py_CONSTANT_FALSE ``1`` :py:data:`False` + .. c:macro:: Py_CONSTANT_TRUE ``2`` :py:data:`True` + .. c:macro:: Py_CONSTANT_ELLIPSIS ``3`` :py:data:`Ellipsis` + .. c:macro:: Py_CONSTANT_NOT_IMPLEMENTED ``4`` :py:data:`NotImplemented` + .. c:macro:: Py_CONSTANT_ZERO ``5`` ``0`` + .. c:macro:: Py_CONSTANT_ONE ``6`` ``1`` + .. c:macro:: Py_CONSTANT_EMPTY_STR ``7`` ``''`` + .. c:macro:: Py_CONSTANT_EMPTY_BYTES ``8`` ``b''`` + .. c:macro:: Py_CONSTANT_EMPTY_TUPLE ``9`` ``()`` + ======================================== ===== ========================= + + Numeric values are only given for projects which cannot use the constant + identifiers. + + + .. versionadded:: 3.13 + + .. impl-detail:: + + In CPython, all of these constants are :term:`immortal`. + + +.. c:function:: PyObject* Py_GetConstantBorrowed(unsigned int constant_id) + + Similar to :c:func:`Py_GetConstant`, but return a :term:`borrowed + reference`. + + This function is primarily intended for backwards compatibility: + using :c:func:`Py_GetConstant` is recommended for new code. + + The reference is borrowed from the interpreter, and is valid until the + interpreter finalization. + + .. versionadded:: 3.13 + + .. c:var:: PyObject* Py_NotImplemented The ``NotImplemented`` singleton, used to signal that an operation is @@ -16,7 +66,15 @@ Object Protocol Properly handle returning :c:data:`Py_NotImplemented` from within a C function (that is, create a new :term:`strong reference` - to NotImplemented and return it). + to :const:`NotImplemented` and return it). + + +.. c:macro:: Py_PRINT_RAW + + Flag to be used with multiple functions that print the object (like + :c:func:`PyObject_Print` and :c:func:`PyFile_WriteObject`). + If passed, these function would use the :func:`str` of the object + instead of the :func:`repr`. .. c:function:: int PyObject_Print(PyObject *o, FILE *fp, int flags) @@ -27,17 +85,35 @@ Object Protocol instead of the :func:`repr`. +.. c:function:: int PyObject_HasAttrWithError(PyObject *o, PyObject *attr_name) + + Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. + This is equivalent to the Python expression ``hasattr(o, attr_name)``. + On failure, return ``-1``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyObject_HasAttrStringWithError(PyObject *o, const char *attr_name) + + This is the same as :c:func:`PyObject_HasAttrWithError`, but *attr_name* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 + + .. c:function:: int PyObject_HasAttr(PyObject *o, PyObject *attr_name) - Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. This - is equivalent to the Python expression ``hasattr(o, attr_name)``. This function - always succeeds. + Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. + This function always succeeds. .. note:: Exceptions that occur when this calls :meth:`~object.__getattr__` and :meth:`~object.__getattribute__` methods are silently ignored. - For proper error handling, use :c:func:`PyObject_GetAttr` instead. + For proper error handling, use :c:func:`PyObject_HasAttrWithError`, + :c:func:`PyObject_GetOptionalAttr` or :c:func:`PyObject_GetAttr` instead. .. c:function:: int PyObject_HasAttrString(PyObject *o, const char *attr_name) @@ -51,7 +127,9 @@ Object Protocol Exceptions that occur when this calls :meth:`~object.__getattr__` and :meth:`~object.__getattribute__` methods or while creating the temporary :class:`str` object are silently ignored. - For proper error handling, use :c:func:`PyObject_GetAttrString` instead. + For proper error handling, use :c:func:`PyObject_HasAttrStringWithError`, + :c:func:`PyObject_GetOptionalAttrString` + or :c:func:`PyObject_GetAttrString` instead. .. c:function:: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name) @@ -60,6 +138,9 @@ Object Protocol value on success, or ``NULL`` on failure. This is the equivalent of the Python expression ``o.attr_name``. + If the missing attribute should not be treated as a failure, you can use + :c:func:`PyObject_GetOptionalAttr` instead. + .. c:function:: PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name) @@ -67,6 +148,32 @@ Object Protocol specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a :c:expr:`PyObject*`. + If the missing attribute should not be treated as a failure, you can use + :c:func:`PyObject_GetOptionalAttrString` instead. + + +.. c:function:: int PyObject_GetOptionalAttr(PyObject *obj, PyObject *attr_name, PyObject **result); + + Variant of :c:func:`PyObject_GetAttr` which doesn't raise + :exc:`AttributeError` if the attribute is not found. + + If the attribute is found, return ``1`` and set *\*result* to a new + :term:`strong reference` to the attribute. + If the attribute is not found, return ``0`` and set *\*result* to ``NULL``; + the :exc:`AttributeError` is silenced. + If an error other than :exc:`AttributeError` is raised, return ``-1`` and + set *\*result* to ``NULL``. + + .. versionadded:: 3.13 + + +.. c:function:: int PyObject_GetOptionalAttrString(PyObject *obj, const char *attr_name, PyObject **result); + + This is the same as :c:func:`PyObject_GetOptionalAttr`, but *attr_name* is + specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + + .. versionadded:: 3.13 .. c:function:: PyObject* PyObject_GenericGetAttr(PyObject *o, PyObject *name) @@ -99,6 +206,13 @@ Object Protocol If *v* is ``NULL``, the attribute is deleted, but this feature is deprecated in favour of using :c:func:`PyObject_DelAttrString`. + The number of different attribute names passed to this function + should be kept small, usually by using a statically allocated string + as *attr_name*. + For attribute names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object. .. c:function:: int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value) @@ -124,6 +238,14 @@ Object Protocol specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a :c:expr:`PyObject*`. + The number of different attribute names passed to this function + should be kept small, usually by using a statically allocated string + as *attr_name*. + For attribute names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_DelAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object for lookup. + .. c:function:: PyObject* PyObject_GenericGetDict(PyObject *o, void *context) @@ -172,12 +294,8 @@ Object Protocol .. c:function:: int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid) Compare the values of *o1* and *o2* using the operation specified by *opid*, - which must be one of :c:macro:`Py_LT`, :c:macro:`Py_LE`, :c:macro:`Py_EQ`, - :c:macro:`Py_NE`, :c:macro:`Py_GT`, or :c:macro:`Py_GE`, corresponding to ``<``, - ``<=``, ``==``, ``!=``, ``>``, or ``>=`` respectively. Returns ``-1`` on error, - ``0`` if the result is false, ``1`` otherwise. This is the equivalent of the - Python expression ``o1 op o2``, where ``op`` is the operator corresponding to - *opid*. + like :c:func:`PyObject_RichCompare`, but returns ``-1`` on error, ``0`` if + the result is false, ``1`` otherwise. .. note:: If *o1* and *o2* are the same object, :c:func:`PyObject_RichCompareBool` @@ -249,14 +367,14 @@ Object Protocol The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. - If *cls* has a :meth:`~class.__subclasscheck__` method, it will be called to + If *cls* has a :meth:`~type.__subclasscheck__` method, it will be called to determine the subclass status as described in :pep:`3119`. Otherwise, *derived* is a subclass of *cls* if it is a direct or indirect subclass, - i.e. contained in ``cls.__mro__``. + i.e. contained in :attr:`cls.__mro__ `. Normally only class objects, i.e. instances of :class:`type` or a derived class, are considered classes. However, objects can override this by having - a :attr:`~class.__bases__` attribute (which must be a tuple of base classes). + a :attr:`~type.__bases__` attribute (which must be a tuple of base classes). .. c:function:: int PyObject_IsInstance(PyObject *inst, PyObject *cls) @@ -268,15 +386,15 @@ Object Protocol The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. - If *cls* has a :meth:`~class.__instancecheck__` method, it will be called to + If *cls* has a :meth:`~type.__instancecheck__` method, it will be called to determine the subclass status as described in :pep:`3119`. Otherwise, *inst* is an instance of *cls* if its class is a subclass of *cls*. An instance *inst* can override what is considered its class by having a - :attr:`~instance.__class__` attribute. + :attr:`~object.__class__` attribute. An object *cls* can override if it is considered a class, and what its base - classes are, by having a :attr:`~class.__bases__` attribute (which must be a tuple + classes are, by having a :attr:`~type.__bases__` attribute (which must be a tuple of base classes). @@ -439,3 +557,21 @@ Object Protocol :c:macro:`Py_TPFLAGS_ITEMS_AT_END` set. .. versionadded:: 3.12 + +.. c:function:: int PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg) + + Visit the managed dictionary of *obj*. + + This function must only be called in a traverse function of the type which + has the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag set. + + .. versionadded:: 3.13 + +.. c:function:: void PyObject_ClearManagedDict(PyObject *obj) + + Clear the managed dictionary of *obj*. + + This function must only be called in a traverse function of the type which + has the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag set. + + .. versionadded:: 3.13 diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 4ea0378d..d75dad73 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -17,26 +17,27 @@ of Python objects. Note that the returned value may not actually reflect how many references to the object are actually held. For example, some - objects are "immortal" and have a very high refcount that does not + objects are :term:`immortal` and have a very high refcount that does not reflect the actual number of references. Consequently, do not rely on the returned value to be accurate, other than a value of 0 or 1. Use the :c:func:`Py_SET_REFCNT()` function to set an object reference count. - .. versionchanged:: 3.11 - The parameter type is no longer :c:expr:`const PyObject*`. - .. versionchanged:: 3.10 :c:func:`Py_REFCNT()` is changed to the inline static function. + .. versionchanged:: 3.11 + The parameter type is no longer :c:expr:`const PyObject*`. + .. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) Set the object *o* reference counter to *refcnt*. - Note that this function has no effect on - `immortal `_ - objects. + On :ref:`Python build with Free Threading `, if + *refcnt* is larger than ``UINT32_MAX``, the object is made :term:`immortal`. + + This function has no effect on :term:`immortal` objects. .. versionadded:: 3.9 @@ -49,17 +50,19 @@ of Python objects. Indicate taking a new :term:`strong reference` to object *o*, indicating it is in use and should not be destroyed. + This function has no effect on :term:`immortal` objects. + This function is usually used to convert a :term:`borrowed reference` to a :term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be used to create a new :term:`strong reference`. - When done using the object, release it by calling :c:func:`Py_DECREF`. + When done using the object, release is by calling :c:func:`Py_DECREF`. The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`. Do not expect this function to actually modify *o* in any way. - For at least `some objects `_, + For at least :pep:`some objects <0683>`, this function has no effect. .. versionchanged:: 3.12 @@ -113,6 +116,8 @@ of Python objects. Release a :term:`strong reference` to object *o*, indicating the reference is no longer used. + This function has no effect on :term:`immortal` objects. + Once the last :term:`strong reference` is released (i.e. the object's reference count reaches 0), the object's type's deallocation @@ -125,7 +130,7 @@ of Python objects. use :c:func:`Py_XDECREF`. Do not expect this function to actually modify *o* in any way. - For at least `some objects `_, + For at least :pep:`some objects <683>`, this function has no effect. .. warning:: diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 4b1c4770..038e6977 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -7,18 +7,48 @@ Reflection .. c:function:: PyObject* PyEval_GetBuiltins(void) + .. deprecated:: 3.13 + + Use :c:func:`PyEval_GetFrameBuiltins` instead. + Return a dictionary of the builtins in the current execution frame, or the interpreter of the thread state if no frame is currently executing. .. c:function:: PyObject* PyEval_GetLocals(void) - Return a dictionary of the local variables in the current execution frame, + .. deprecated:: 3.13 + + Use either :c:func:`PyEval_GetFrameLocals` to obtain the same behaviour as calling + :func:`locals` in Python code, or else call :c:func:`PyFrame_GetLocals` on the result + of :c:func:`PyEval_GetFrame` to access the :attr:`~frame.f_locals` attribute of the + currently executing frame. + + Return a mapping providing access to the local variables in the current execution frame, or ``NULL`` if no frame is currently executing. + Refer to :func:`locals` for details of the mapping returned at different scopes. + + As this function returns a :term:`borrowed reference`, the dictionary returned for + :term:`optimized scopes ` is cached on the frame object and will remain + alive as long as the frame object does. Unlike :c:func:`PyEval_GetFrameLocals` and + :func:`locals`, subsequent calls to this function in the same frame will update the + contents of the cached dictionary to reflect changes in the state of the local variables + rather than returning a new snapshot. + + .. versionchanged:: 3.13 + As part of :pep:`667`, :c:func:`PyFrame_GetLocals`, :func:`locals`, and + :attr:`FrameType.f_locals ` no longer make use of the shared cache + dictionary. Refer to the :ref:`What's New entry ` for + additional details. + .. c:function:: PyObject* PyEval_GetGlobals(void) + .. deprecated:: 3.13 + + Use :c:func:`PyEval_GetFrameGlobals` instead. + Return a dictionary of the global variables in the current execution frame, or ``NULL`` if no frame is currently executing. @@ -31,6 +61,36 @@ Reflection See also :c:func:`PyThreadState_GetFrame`. +.. c:function:: PyObject* PyEval_GetFrameBuiltins(void) + + Return a dictionary of the builtins in the current execution frame, + or the interpreter of the thread state if no frame is currently executing. + + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyEval_GetFrameLocals(void) + + Return a dictionary of the local variables in the current execution frame, + or ``NULL`` if no frame is currently executing. Equivalent to calling + :func:`locals` in Python code. + + To access :attr:`~frame.f_locals` on the current frame without making an independent + snapshot in :term:`optimized scopes `, call :c:func:`PyFrame_GetLocals` + on the result of :c:func:`PyEval_GetFrame`. + + .. versionadded:: 3.13 + + +.. c:function:: PyObject* PyEval_GetFrameGlobals(void) + + Return a dictionary of the global variables in the current execution frame, + or ``NULL`` if no frame is currently executing. Equivalent to calling + :func:`globals` in Python code. + + .. versionadded:: 3.13 + + .. c:function:: const char* PyEval_GetFuncName(PyObject *func) Return the name of *func* if it is a function, class or instance object, else the diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 1e8a0950..cba823aa 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -147,7 +147,7 @@ subtypes but not for instances of :class:`frozenset` or its subtypes. Return ``1`` if found and removed, ``0`` if not found (no action taken), and ``-1`` if an error is encountered. Does not raise :exc:`KeyError` for missing keys. Raise a - :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.discard` + :exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~frozenset.discard` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise :exc:`SystemError` if *set* is not an instance of :class:`set` or its subtype. @@ -163,4 +163,6 @@ subtypes but not for instances of :class:`frozenset` or its subtypes. .. c:function:: int PySet_Clear(PyObject *set) - Empty an existing set of all elements. + Empty an existing set of all elements. Return ``0`` on + success. Return ``-1`` and raise :exc:`SystemError` if *set* is not an instance of + :class:`set` or its subtype. diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index 9e880c6b..8adf6a96 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -23,7 +23,9 @@ Slice Objects Return a new slice object with the given values. The *start*, *stop*, and *step* parameters are used as the values of the slice object attributes of the same names. Any of the values may be ``NULL``, in which case the - ``None`` will be used for the corresponding attribute. Return ``NULL`` if + ``None`` will be used for the corresponding attribute. + + Return ``NULL`` with an exception set if the new object could not be allocated. @@ -52,7 +54,7 @@ Slice Objects of bounds indices are clipped in a manner consistent with the handling of normal slices. - Returns ``0`` on success and ``-1`` on error with exception set. + Return ``0`` on success and ``-1`` on error with an exception set. .. note:: This function is considered not safe for resizable sequences. @@ -95,7 +97,7 @@ Slice Objects ``PY_SSIZE_T_MIN`` to ``PY_SSIZE_T_MIN``, and silently boost the step values less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.6.1 @@ -119,8 +121,7 @@ Ellipsis Object .. c:var:: PyObject *Py_Ellipsis The Python ``Ellipsis`` object. This object has no methods. Like - :c:data:`Py_None`, it is an `immortal `_. - singleton object. + :c:data:`Py_None`, it is an :term:`immortal` singleton object. .. versionchanged:: 3.12 :c:data:`Py_Ellipsis` is immortal. diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst index 63a100a6..124e58cf 100644 --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -16,7 +16,7 @@ CPython's Application Binary Interface (ABI) is forward- and backwards-compatible across a minor release (if these are compiled the same way; see :ref:`stable-abi-platform` below). So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa, -but will need to be compiled separately for 3.9.x and 3.10.x. +but will need to be compiled separately for 3.9.x and 3.11.x. There are two tiers of C API with different stability expectations: @@ -66,7 +66,7 @@ Limited C API Python 3.2 introduced the *Limited API*, a subset of Python's C API. Extensions that only use the Limited API can be -compiled once and work with multiple versions of Python. +compiled once and be loaded on multiple versions of Python. Contents of the Limited API are :ref:`listed below `. .. c:macro:: Py_LIMITED_API @@ -76,7 +76,7 @@ Contents of the Limited API are :ref:`listed below `. Define ``Py_LIMITED_API`` to the value of :c:macro:`PY_VERSION_HEX` corresponding to the lowest Python version your extension supports. - The extension will work without recompilation with all Python 3 releases + The extension will be ABI-compatible with all Python 3 releases from the specified one onward, and can use Limited API introduced up to that version. @@ -94,7 +94,15 @@ Stable ABI ---------- To enable this, Python provides a *Stable ABI*: a set of symbols that will -remain compatible across Python 3.x versions. +remain ABI-compatible across Python 3.x versions. + +.. note:: + + The Stable ABI prevents ABI issues, like linker errors due to missing + symbols or data corruption due to changes in structure layouts or function + signatures. + However, other changes in Python can change the *behavior* of extensions. + See Python's Backwards Compatibility Policy (:pep:`387`) for details. The Stable ABI contains symbols exposed in the :ref:`Limited API `, but also other ones – for example, functions necessary to diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 747cfa62..f9461ab0 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -187,26 +187,26 @@ Implementing functions and methods PyObject *kwargs); -.. c:type:: _PyCFunctionFast +.. c:type:: PyCFunctionFast Type of the functions used to implement Python callables in C with signature :c:macro:`METH_FASTCALL`. The function signature is:: - PyObject *_PyCFunctionFast(PyObject *self, - PyObject *const *args, - Py_ssize_t nargs); + PyObject *PyCFunctionFast(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs); -.. c:type:: _PyCFunctionFastWithKeywords +.. c:type:: PyCFunctionFastWithKeywords Type of the functions used to implement Python callables in C with signature :ref:`METH_FASTCALL | METH_KEYWORDS `. The function signature is:: - PyObject *_PyCFunctionFastWithKeywords(PyObject *self, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwnames); + PyObject *PyCFunctionFastWithKeywords(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); .. c:type:: PyCMethod @@ -290,7 +290,7 @@ There are these calling conventions: .. c:macro:: METH_FASTCALL Fast calling convention supporting only positional arguments. - The methods have the type :c:type:`_PyCFunctionFast`. + The methods have the type :c:type:`PyCFunctionFast`. The first parameter is *self*, the second parameter is a C array of :c:expr:`PyObject*` values indicating the arguments and the third parameter is the number of arguments (the length of the array). @@ -306,7 +306,7 @@ There are these calling conventions: :c:expr:`METH_FASTCALL | METH_KEYWORDS` Extension of :c:macro:`METH_FASTCALL` supporting also keyword arguments, - with methods of type :c:type:`_PyCFunctionFastWithKeywords`. + with methods of type :c:type:`PyCFunctionFastWithKeywords`. Keyword arguments are passed the same way as in the :ref:`vectorcall protocol `: there is an additional fourth :c:expr:`PyObject*` parameter @@ -399,6 +399,40 @@ definition with the same method name. slot. This is helpful because calls to PyCFunctions are optimized more than wrapper object calls. +.. c:function:: PyObject * PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls) + + Turn *ml* into a Python :term:`callable` object. + The caller must ensure that *ml* outlives the :term:`callable`. + Typically, *ml* is defined as a static variable. + + The *self* parameter will be passed as the *self* argument + to the C function in ``ml->ml_meth`` when invoked. + *self* can be ``NULL``. + + The :term:`callable` object's ``__module__`` attribute + can be set from the given *module* argument. + *module* should be a Python string, + which will be used as name of the module the function is defined in. + If unavailable, it can be set to :const:`None` or ``NULL``. + + .. seealso:: :attr:`function.__module__` + + The *cls* parameter will be passed as the *defining_class* + argument to the C function. + Must be set if :c:macro:`METH_METHOD` is set on ``ml->ml_flags``. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) + + Equivalent to ``PyCMethod_New(ml, self, module, NULL)``. + + +.. c:function:: PyObject * PyCFunction_New(PyMethodDef *ml, PyObject *self) + + Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``. + Accessing attributes of extension types --------------------------------------- @@ -406,7 +440,11 @@ Accessing attributes of extension types .. c:type:: PyMemberDef Structure which describes an attribute of a type which corresponds to a C - struct member. Its fields are, in order: + struct member. + When defining a class, put a NULL-terminated array of these + structures in the :c:member:`~PyTypeObject.tp_members` slot. + + Its fields are, in order: .. c:member:: const char* name @@ -415,15 +453,15 @@ Accessing attributes of extension types The string should be static, no copy is made of it. - .. c:member:: Py_ssize_t offset - - The offset in bytes that the member is located on the type’s object struct. - .. c:member:: int type The type of the member in the C struct. See :ref:`PyMemberDef-types` for the possible values. + .. c:member:: Py_ssize_t offset + + The offset in bytes that the member is located on the type’s object struct. + .. c:member:: int flags Zero or more of the :ref:`PyMemberDef-flags`, combined using bitwise OR. @@ -513,19 +551,19 @@ The following flags can be used with :c:member:`PyMemberDef.flags`: from ``PyObject``. Can only be used as part of :c:member:`Py_tp_members ` - :c:type:`slot ` when creating a class using negative + :c:type:`slot ` when creating a class using negative :c:member:`~PyType_Spec.basicsize`. It is mandatory in that case. - This flag is only used in :c:type:`PyTypeSlot`. + This flag is only used in :c:type:`PyType_Slot`. When setting :c:member:`~PyTypeObject.tp_members` during class creation, Python clears it and sets :c:member:`PyMemberDef.offset` to the offset from the ``PyObject`` struct. .. index:: - single: READ_RESTRICTED - single: WRITE_RESTRICTED - single: RESTRICTED + single: READ_RESTRICTED (C macro) + single: WRITE_RESTRICTED (C macro) + single: RESTRICTED (C macro) .. versionchanged:: 3.10 @@ -536,7 +574,7 @@ The following flags can be used with :c:member:`PyMemberDef.flags`: :c:macro:`Py_AUDIT_READ`; :c:macro:`!WRITE_RESTRICTED` does nothing. .. index:: - single: READONLY + single: READONLY (C macro) .. versionchanged:: 3.12 @@ -588,7 +626,7 @@ Macro name C type Python type (*): Zero-terminated, UTF8-encoded C string. With :c:macro:`!Py_T_STRING` the C representation is a pointer; - with :c:macro:`!Py_T_STRING_INLINE` the string is stored directly + with :c:macro:`!Py_T_STRING_INPLACE` the string is stored directly in the structure. (**): String of length 1. Only ASCII is accepted. @@ -599,24 +637,24 @@ Macro name C type Python type Reading a ``NULL`` pointer raises :py:exc:`AttributeError`. .. index:: - single: T_BYTE - single: T_SHORT - single: T_INT - single: T_LONG - single: T_LONGLONG - single: T_UBYTE - single: T_USHORT - single: T_UINT - single: T_ULONG - single: T_ULONGULONG - single: T_PYSSIZET - single: T_FLOAT - single: T_DOUBLE - single: T_BOOL - single: T_CHAR - single: T_STRING - single: T_STRING_INPLACE - single: T_OBJECT_EX + single: T_BYTE (C macro) + single: T_SHORT (C macro) + single: T_INT (C macro) + single: T_LONG (C macro) + single: T_LONGLONG (C macro) + single: T_UBYTE (C macro) + single: T_USHORT (C macro) + single: T_UINT (C macro) + single: T_ULONG (C macro) + single: T_ULONGULONG (C macro) + single: T_PYSSIZET (C macro) + single: T_FLOAT (C macro) + single: T_DOUBLE (C macro) + single: T_BOOL (C macro) + single: T_CHAR (C macro) + single: T_STRING (C macro) + single: T_STRING_INPLACE (C macro) + single: T_OBJECT_EX (C macro) single: structmember.h .. versionadded:: 3.12 @@ -655,7 +693,8 @@ Defining Getters and Setters .. c:member:: setter set - Optional C function to set or delete the attribute, if omitted the attribute is readonly. + Optional C function to set or delete the attribute. + If ``NULL``, the attribute is read-only. .. c:member:: const char* doc @@ -663,20 +702,20 @@ Defining Getters and Setters .. c:member:: void* closure - Optional function pointer, providing additional data for getter and setter. + Optional user data pointer, providing additional data for getter and setter. - The ``get`` function takes one :c:expr:`PyObject*` parameter (the - instance) and a function pointer (the associated ``closure``):: +.. c:type:: PyObject *(*getter)(PyObject *, void *) - typedef PyObject *(*getter)(PyObject *, void *); + The ``get`` function takes one :c:expr:`PyObject*` parameter (the + instance) and a user data pointer (the associated ``closure``): It should return a new reference on success or ``NULL`` with a set exception on failure. - ``set`` functions take two :c:expr:`PyObject*` parameters (the instance and - the value to be set) and a function pointer (the associated ``closure``):: +.. c:type:: int (*setter)(PyObject *, PyObject *, void *) - typedef int (*setter)(PyObject *, PyObject *, void *); + ``set`` functions take two :c:expr:`PyObject*` parameters (the instance and + the value to be set) and a user data pointer (the associated ``closure``): In case the attribute should be deleted the second parameter is ``NULL``. Should return ``0`` on success or ``-1`` with a set exception on failure. diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index a8a284e6..d6fca1a0 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -5,6 +5,7 @@ Operating System Utilities ========================== + .. c:function:: PyObject* PyOS_FSPath(PyObject *path) Return the file system representation for *path*. If the object is a @@ -97,27 +98,30 @@ Operating System Utilities .. c:function:: int PyOS_CheckStack() + .. index:: single: USE_STACKCHECK (C macro) + Return true when the interpreter runs out of stack space. This is a reliable - check, but is only available when :c:macro:`USE_STACKCHECK` is defined (currently + check, but is only available when :c:macro:`!USE_STACKCHECK` is defined (currently on certain versions of Windows using the Microsoft Visual C++ compiler). - :c:macro:`USE_STACKCHECK` will be defined automatically; you should never + :c:macro:`!USE_STACKCHECK` will be defined automatically; you should never change the definition in your own code. +.. c:type:: void (*PyOS_sighandler_t)(int) + + .. c:function:: PyOS_sighandler_t PyOS_getsig(int i) Return the current signal handler for signal *i*. This is a thin wrapper around either :c:func:`!sigaction` or :c:func:`!signal`. Do not call those functions - directly! :c:type:`PyOS_sighandler_t` is a typedef alias for :c:expr:`void - (\*)(int)`. + directly! .. c:function:: PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h) Set the signal handler for signal *i* to be *h*; return the old signal handler. This is a thin wrapper around either :c:func:`!sigaction` or :c:func:`!signal`. Do - not call those functions directly! :c:type:`PyOS_sighandler_t` is a typedef - alias for :c:expr:`void (\*)(int)`. + not call those functions directly! .. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size) @@ -238,45 +242,8 @@ accessible to C code. They all work with the current interpreter thread's Reset :data:`sys.warnoptions` to an empty list. This function may be called prior to :c:func:`Py_Initialize`. -.. c:function:: void PySys_AddWarnOption(const wchar_t *s) - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.warnoptions` should be used instead, see :ref:`Python - Initialization Configuration `. - - Append *s* to :data:`sys.warnoptions`. This function must be called prior - to :c:func:`Py_Initialize` in order to affect the warnings filter list. - - .. deprecated:: 3.11 - -.. c:function:: void PySys_AddWarnOptionUnicode(PyObject *unicode) - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.warnoptions` should be used instead, see :ref:`Python - Initialization Configuration `. - - Append *unicode* to :data:`sys.warnoptions`. - - Note: this function is not currently usable from outside the CPython - implementation, as it must be called prior to the implicit import of - :mod:`warnings` in :c:func:`Py_Initialize` to be effective, but can't be - called until enough of the runtime has been initialized to permit the - creation of Unicode objects. - - .. deprecated:: 3.11 - -.. c:function:: void PySys_SetPath(const wchar_t *path) - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.module_search_paths` and - :c:member:`PyConfig.module_search_paths_set` should be used instead, see - :ref:`Python Initialization Configuration `. - - Set :data:`sys.path` to a list object of paths found in *path* which should - be a list of paths separated with the platform's search path delimiter - (``:`` on Unix, ``;`` on Windows). - - .. deprecated:: 3.11 + .. deprecated-removed:: 3.13 3.15 + Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead. .. c:function:: void PySys_WriteStdout(const char *format, ...) @@ -314,20 +281,6 @@ accessible to C code. They all work with the current interpreter thread's .. versionadded:: 3.2 -.. c:function:: void PySys_AddXOption(const wchar_t *s) - - This API is kept for backward compatibility: setting - :c:member:`PyConfig.xoptions` should be used instead, see :ref:`Python - Initialization Configuration `. - - Parse *s* as a set of :option:`-X` options and add them to the current - options mapping as returned by :c:func:`PySys_GetXOptions`. This function - may be called prior to :c:func:`Py_Initialize`. - - .. versionadded:: 3.2 - - .. deprecated:: 3.11 - .. c:function:: PyObject *PySys_GetXOptions() Return the current dictionary of :option:`-X` options, similarly to @@ -342,19 +295,24 @@ accessible to C code. They all work with the current interpreter thread's Raise an auditing event with any active hooks. Return zero for success and non-zero with an exception set on failure. + The *event* string argument must not be *NULL*. + If any hooks have been added, *format* and other arguments will be used to construct a tuple to pass. Apart from ``N``, the same format characters as used in :c:func:`Py_BuildValue` are available. If the built value is not - a tuple, it will be added into a single-element tuple. (The ``N`` format - option consumes a reference, but since there is no way to know whether - arguments to this function will be consumed, using it may cause reference - leaks.) + a tuple, it will be added into a single-element tuple. + + The ``N`` format option must not be used. It consumes a reference, but since + there is no way to know whether arguments to this function will be consumed, + using it may cause reference leaks. Note that ``#`` format characters should always be treated as :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. + See also :c:func:`PySys_AuditTuple`. + .. versionadded:: 3.8 .. versionchanged:: 3.8.2 @@ -363,6 +321,14 @@ accessible to C code. They all work with the current interpreter thread's unavoidable deprecation warning was raised. +.. c:function:: int PySys_AuditTuple(const char *event, PyObject *args) + + Similar to :c:func:`PySys_Audit`, but pass arguments as a Python object. + *args* must be a :class:`tuple`. To pass no arguments, *args* can be *NULL*. + + .. versionadded:: 3.13 + + .. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) Append the callable *hook* to the list of active auditing hooks. @@ -380,10 +346,8 @@ accessible to C code. They all work with the current interpreter thread's silently abort the operation by raising an error subclassed from :class:`Exception` (other errors will not be silenced). - The hook function is of type :c:expr:`int (*)(const char *event, PyObject - *args, void *userData)`, where *args* is guaranteed to be a - :c:type:`PyTupleObject`. The hook function is always called with the GIL - held by the Python interpreter that raised the event. + The hook function is always called with the GIL held by the Python + interpreter that raised the event. See :pep:`578` for a detailed description of auditing. Functions in the runtime and standard library that raise events are listed in the @@ -392,12 +356,21 @@ accessible to C code. They all work with the current interpreter thread's .. audit-event:: sys.addaudithook "" c.PySys_AddAuditHook - If the interpreter is initialized, this function raises a auditing event + If the interpreter is initialized, this function raises an auditing event ``sys.addaudithook`` with no arguments. If any existing hooks raise an exception derived from :class:`Exception`, the new hook will not be added and the exception is cleared. As a result, callers cannot assume that their hook has been added unless they control all existing hooks. + .. c:namespace:: NULL + .. c:type:: int (*Py_AuditHookFunction) (const char *event, PyObject *args, void *userData) + + The type of the hook function. + *event* is the C string event argument passed to :c:func:`PySys_Audit` or + :c:func:`PySys_AuditTuple`. + *args* is guaranteed to be a :c:type:`PyTupleObject`. + *userData* is the argument passed to PySys_AddAuditHook(). + .. versionadded:: 3.8 @@ -409,7 +382,7 @@ Process Control .. c:function:: void Py_FatalError(const char *message) - .. index:: single: abort() + .. index:: single: abort (C function) Print a fatal error message and kill the process. No cleanup is performed. This function should only be invoked when a condition is detected that would @@ -429,8 +402,8 @@ Process Control .. c:function:: void Py_Exit(int status) .. index:: - single: Py_FinalizeEx() - single: exit() + single: Py_FinalizeEx (C function) + single: exit (C function) Exit the current process. This calls :c:func:`Py_FinalizeEx` and then calls the standard C library function ``exit(status)``. If :c:func:`Py_FinalizeEx` @@ -443,7 +416,7 @@ Process Control .. c:function:: int Py_AtExit(void (*func) ()) .. index:: - single: Py_FinalizeEx() + single: Py_FinalizeEx (C function) single: cleanup functions Register a cleanup function to be called by :c:func:`Py_FinalizeEx`. The cleanup diff --git a/Doc/c-api/time.rst b/Doc/c-api/time.rst new file mode 100644 index 00000000..7032cc48 --- /dev/null +++ b/Doc/c-api/time.rst @@ -0,0 +1,114 @@ +.. highlight:: c + +.. _c-api-time: + +PyTime C API +============ + +.. versionadded:: 3.13 + +The clock C API provides access to system clocks. +It is similar to the Python :mod:`time` module. + +For C API related to the :mod:`datetime` module, see :ref:`datetimeobjects`. + + +Types +----- + +.. c:type:: PyTime_t + + A timestamp or duration in nanoseconds, represented as a signed 64-bit + integer. + + The reference point for timestamps depends on the clock used. For example, + :c:func:`PyTime_Time` returns timestamps relative to the UNIX epoch. + + The supported range is around [-292.3 years; +292.3 years]. + Using the Unix epoch (January 1st, 1970) as reference, the supported date + range is around [1677-09-21; 2262-04-11]. + The exact limits are exposed as constants: + +.. c:var:: PyTime_t PyTime_MIN + + Minimum value of :c:type:`PyTime_t`. + +.. c:var:: PyTime_t PyTime_MAX + + Maximum value of :c:type:`PyTime_t`. + + +Clock Functions +--------------- + +The following functions take a pointer to a :c:expr:`PyTime_t` that they +set to the value of a particular clock. +Details of each clock are given in the documentation of the corresponding +Python function. + +The functions return ``0`` on success, or ``-1`` (with an exception set) +on failure. + +On integer overflow, they set the :c:data:`PyExc_OverflowError` exception and +set ``*result`` to the value clamped to the ``[PyTime_MIN; PyTime_MAX]`` +range. +(On current systems, integer overflows are likely caused by misconfigured +system time.) + +As any other C API (unless otherwise specified), the functions must be called +with the :term:`GIL` held. + +.. c:function:: int PyTime_Monotonic(PyTime_t *result) + + Read the monotonic clock. + See :func:`time.monotonic` for important details on this clock. + +.. c:function:: int PyTime_PerfCounter(PyTime_t *result) + + Read the performance counter. + See :func:`time.perf_counter` for important details on this clock. + +.. c:function:: int PyTime_Time(PyTime_t *result) + + Read the “wall clock” time. + See :func:`time.time` for details important on this clock. + + +Raw Clock Functions +------------------- + +Similar to clock functions, but don't set an exception on error and don't +require the caller to hold the GIL. + +On success, the functions return ``0``. + +On failure, they set ``*result`` to ``0`` and return ``-1``, *without* setting +an exception. To get the cause of the error, acquire the GIL and call the +regular (non-``Raw``) function. Note that the regular function may succeed after +the ``Raw`` one failed. + +.. c:function:: int PyTime_MonotonicRaw(PyTime_t *result) + + Similar to :c:func:`PyTime_Monotonic`, + but don't set an exception on error and don't require holding the GIL. + +.. c:function:: int PyTime_PerfCounterRaw(PyTime_t *result) + + Similar to :c:func:`PyTime_PerfCounter`, + but don't set an exception on error and don't require holding the GIL. + +.. c:function:: int PyTime_TimeRaw(PyTime_t *result) + + Similar to :c:func:`PyTime_Time`, + but don't set an exception on error and don't require holding the GIL. + + +Conversion functions +-------------------- + +.. c:function:: double PyTime_AsSecondsDouble(PyTime_t t) + + Convert a timestamp to a number of seconds as a C :c:expr:`double`. + + The function cannot fail, but note that :c:expr:`double` has limited + accuracy for large values. diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 9bc3dab0..2944b8d3 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -33,12 +33,14 @@ Tuple Objects .. c:function:: PyObject* PyTuple_New(Py_ssize_t len) - Return a new tuple object of size *len*, or ``NULL`` on failure. + Return a new tuple object of size *len*, + or ``NULL`` with an exception set on failure. .. c:function:: PyObject* PyTuple_Pack(Py_ssize_t n, ...) - Return a new tuple object of size *n*, or ``NULL`` on failure. The tuple values + Return a new tuple object of size *n*, + or ``NULL`` with an exception set on failure. The tuple values are initialized to the subsequent *n* C arguments pointing to Python objects. ``PyTuple_Pack(2, a, b)`` is equivalent to ``Py_BuildValue("(OO)", a, b)``. @@ -46,12 +48,12 @@ Tuple Objects .. c:function:: Py_ssize_t PyTuple_Size(PyObject *p) Take a pointer to a tuple object, and return the size of that tuple. + On error, return ``-1`` and with an exception set. .. c:function:: Py_ssize_t PyTuple_GET_SIZE(PyObject *p) - Return the size of the tuple *p*, which must be non-``NULL`` and point to a tuple; - no error checking is performed. + Like :c:func:`PyTuple_Size`, but without error checking. .. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos) @@ -59,6 +61,12 @@ Tuple Objects Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is negative or out of bounds, return ``NULL`` and set an :exc:`IndexError` exception. + The returned reference is borrowed from the tuple *p* + (that is: it is only valid as long as you hold a reference to *p*). + To get a :term:`strong reference`, use + :c:func:`Py_NewRef(PyTuple_GetItem(...)) ` + or :c:func:`PySequence_GetItem`. + .. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos) @@ -68,8 +76,10 @@ Tuple Objects .. c:function:: PyObject* PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high) Return the slice of the tuple pointed to by *p* between *low* and *high*, - or ``NULL`` on failure. This is the equivalent of the Python expression - ``p[low:high]``. Indexing from the end of the tuple is not supported. + or ``NULL`` with an exception set on failure. + + This is the equivalent of the Python expression ``p[low:high]``. + Indexing from the end of the tuple is not supported. .. c:function:: int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o) @@ -89,6 +99,9 @@ Tuple Objects Like :c:func:`PyTuple_SetItem`, but does no error checking, and should *only* be used to fill in brand new tuples. + Bounds checking is performed as an assertion if Python is built in + :ref:`debug mode ` or :option:`with assertions <--with-assertions>`. + .. note:: This function "steals" a reference to *o*, and, unlike @@ -126,6 +139,8 @@ type. Create a new struct sequence type from the data in *desc*, described below. Instances of the resulting type can be created with :c:func:`PyStructSequence_New`. + Return ``NULL`` with an exception set on failure. + .. c:function:: void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) @@ -134,8 +149,8 @@ type. .. c:function:: int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc) - The same as ``PyStructSequence_InitType``, but returns ``0`` on success and ``-1`` on - failure. + Like :c:func:`PyStructSequence_InitType`, but returns ``0`` on success + and ``-1`` with an exception set on failure. .. versionadded:: 3.4 @@ -146,7 +161,8 @@ type. .. c:member:: const char *name - Name of the struct sequence type. + Fully qualified name of the type; null-terminated UTF-8 encoded. + The name must contain the module name. .. c:member:: const char *doc @@ -192,16 +208,23 @@ type. Creates an instance of *type*, which must have been created with :c:func:`PyStructSequence_NewType`. + Return ``NULL`` with an exception set on failure. + .. c:function:: PyObject* PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos) Return the object at position *pos* in the struct sequence pointed to by *p*. - No bounds checking is performed. + + Bounds checking is performed as an assertion if Python is built in + :ref:`debug mode ` or :option:`with assertions <--with-assertions>`. .. c:function:: PyObject* PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos) - Macro equivalent of :c:func:`PyStructSequence_GetItem`. + Alias to :c:func:`PyStructSequence_GetItem`. + + .. versionchanged:: 3.13 + Now implemented as an alias to :c:func:`PyStructSequence_GetItem`. .. c:function:: void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o) @@ -210,6 +233,9 @@ type. :c:func:`PyTuple_SET_ITEM`, this should only be used to fill in brand new instances. + Bounds checking is performed as an assertion if Python is built in + :ref:`debug mode ` or :option:`with assertions <--with-assertions>`. + .. note:: This function "steals" a reference to *o*. @@ -217,9 +243,7 @@ type. .. c:function:: void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o) - Similar to :c:func:`PyStructSequence_SetItem`, but implemented as a static - inlined function. + Alias to :c:func:`PyStructSequence_SetItem`. - .. note:: - - This function "steals" a reference to *o*. + .. versionchanged:: 3.13 + Now implemented as an alias to :c:func:`PyStructSequence_SetItem`. diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 0f58326f..730c89dc 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -53,7 +53,8 @@ Type Objects .. c:function:: PyObject* PyType_GetDict(PyTypeObject* type) Return the type object's internal namespace, which is otherwise only - exposed via a read-only proxy (``cls.__dict__``). This is a + exposed via a read-only proxy (:attr:`cls.__dict__ `). + This is a replacement for accessing :c:member:`~PyTypeObject.tp_dict` directly. The returned dictionary must be treated as read-only. @@ -140,7 +141,7 @@ Type Objects Return true if *a* is a subtype of *b*. This function only checks for actual subtypes, which means that - :meth:`~class.__subclasscheck__` is not called on *b*. Call + :meth:`~type.__subclasscheck__` is not called on *b*. Call :c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass` would do. @@ -174,17 +175,33 @@ Type Objects .. c:function:: PyObject* PyType_GetName(PyTypeObject *type) - Return the type's name. Equivalent to getting the type's ``__name__`` attribute. + Return the type's name. Equivalent to getting the type's + :attr:`~type.__name__` attribute. .. versionadded:: 3.11 .. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type) Return the type's qualified name. Equivalent to getting the - type's ``__qualname__`` attribute. + type's :attr:`~type.__qualname__` attribute. .. versionadded:: 3.11 +.. c:function:: PyObject* PyType_GetFullyQualifiedName(PyTypeObject *type) + + Return the type's fully qualified name. Equivalent to + ``f"{type.__module__}.{type.__qualname__}"``, or :attr:`type.__qualname__` + if :attr:`type.__module__` is not a string or is equal to ``"builtins"``. + + .. versionadded:: 3.13 + +.. c:function:: PyObject* PyType_GetModuleName(PyTypeObject *type) + + Return the type's module name. Equivalent to getting the + :attr:`type.__module__` attribute. + + .. versionadded:: 3.13 + .. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot) Return the function pointer stored in the given slot. If the @@ -461,35 +478,47 @@ The following functions and structs are used to create * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` - The following fields cannot be set at all using :c:type:`PyType_Spec` and - :c:type:`PyType_Slot`: + The following “offset” fields cannot be set using :c:type:`PyType_Slot`: - * :c:member:`~PyTypeObject.tp_dict` - * :c:member:`~PyTypeObject.tp_mro` - * :c:member:`~PyTypeObject.tp_cache` - * :c:member:`~PyTypeObject.tp_subclasses` - * :c:member:`~PyTypeObject.tp_weaklist` - * :c:member:`~PyTypeObject.tp_vectorcall` * :c:member:`~PyTypeObject.tp_weaklistoffset` - (use :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead) + (use :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead if possible) * :c:member:`~PyTypeObject.tp_dictoffset` - (use :c:macro:`Py_TPFLAGS_MANAGED_DICT` instead) + (use :c:macro:`Py_TPFLAGS_MANAGED_DICT` instead if possible) * :c:member:`~PyTypeObject.tp_vectorcall_offset` - (see :ref:`PyMemberDef `) + (use ``"__vectorcalloffset__"`` in + :ref:`PyMemberDef `) + + If it is not possible to switch to a ``MANAGED`` flag (for example, + for vectorcall or to support Python older than 3.12), specify the + offset in :c:member:`Py_tp_members `. + See :ref:`PyMemberDef documentation ` + for details. + + The following fields cannot be set at all when creating a heap type: + + * :c:member:`~PyTypeObject.tp_vectorcall` + (use :c:member:`~PyTypeObject.tp_new` and/or + :c:member:`~PyTypeObject.tp_init`) + + * Internal fields: + :c:member:`~PyTypeObject.tp_dict`, + :c:member:`~PyTypeObject.tp_mro`, + :c:member:`~PyTypeObject.tp_cache`, + :c:member:`~PyTypeObject.tp_subclasses`, and + :c:member:`~PyTypeObject.tp_weaklist`. Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be problematic on some platforms. To avoid issues, use the *bases* argument of :c:func:`PyType_FromSpecWithBases` instead. - .. versionchanged:: 3.9 - - Slots in :c:type:`PyBufferProcs` may be set in the unlimited API. + .. versionchanged:: 3.9 + Slots in :c:type:`PyBufferProcs` may be set in the unlimited API. - .. versionchanged:: 3.11 - :c:member:`~PyBufferProcs.bf_getbuffer` and - :c:member:`~PyBufferProcs.bf_releasebuffer` are now available - under the :ref:`limited API `. + .. versionchanged:: 3.11 + :c:member:`~PyBufferProcs.bf_getbuffer` and + :c:member:`~PyBufferProcs.bf_releasebuffer` are now available + under the :ref:`limited API `. .. c:member:: void *pfunc diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 09880901..e5a71891 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -343,13 +343,13 @@ slot typedefs | | :c:type:`PyTypeObject` * | | | | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`destructor` | void * | void | +| :c:type:`destructor` | :c:type:`PyObject` * | void | +-----------------------------+-----------------------------+----------------------+ | :c:type:`freefunc` | void * | void | +-----------------------------+-----------------------------+----------------------+ | :c:type:`traverseproc` | .. line-block:: | int | | | | | -| | void * | | +| | :c:type:`PyObject` * | | | | :c:type:`visitproc` | | | | void * | | +-----------------------------+-----------------------------+----------------------+ @@ -426,7 +426,7 @@ slot typedefs | | :c:type:`PyObject` * | | | | :c:type:`Py_buffer` * | | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`inquiry` | void * | int | +| :c:type:`inquiry` | :c:type:`PyObject` * | int | +-----------------------------+-----------------------------+----------------------+ | :c:type:`unaryfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | @@ -528,28 +528,6 @@ type objects) *must* have the :c:member:`~PyVarObject.ob_size` field. This field is inherited by subtypes. -.. c:member:: PyObject* PyObject._ob_next - PyObject* PyObject._ob_prev - - These fields are only present when the macro ``Py_TRACE_REFS`` is defined - (see the :option:`configure --with-trace-refs option <--with-trace-refs>`). - - Their initialization to ``NULL`` is taken care of by the - ``PyObject_HEAD_INIT`` macro. For :ref:`statically allocated objects - `, these fields always remain ``NULL``. For :ref:`dynamically - allocated objects `, these two fields are used to link the - object into a doubly linked list of *all* live objects on the heap. - - This could be used for various debugging purposes; currently the only uses - are the :func:`sys.getobjects` function and to print the objects that are - still alive at the end of a run when the environment variable - :envvar:`PYTHONDUMPREFS` is set. - - **Inheritance:** - - These fields are not inherited by subtypes. - - PyVarObject Slots ----------------- @@ -589,12 +567,12 @@ and :c:data:`PyType_Type` effectively act as defaults.) For :ref:`statically allocated type objects `, the *tp_name* field should contain a dot. - Everything before the last dot is made accessible as the :attr:`__module__` + Everything before the last dot is made accessible as the :attr:`~type.__module__` attribute, and everything after the last dot is made accessible as the - :attr:`~definition.__name__` attribute. + :attr:`~type.__name__` attribute. If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the - :attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined + :attr:`~type.__name__` attribute, and the :attr:`~type.__module__` attribute is undefined (unless explicitly set in the dictionary, as explained above). This means your type will be impossible to pickle. Additionally, it will not be listed in module documentations created with pydoc. @@ -704,6 +682,19 @@ and :c:data:`PyType_Type` effectively act as defaults.) Py_DECREF(tp); } + .. warning:: + + In a garbage collected Python, :c:member:`!tp_dealloc` may be called from + any Python thread, not just the thread which created the object (if the + object becomes part of a refcount cycle, that cycle might be collected by + a garbage collection on any thread). This is not a problem for Python + API calls, since the thread on which :c:member:`!tp_dealloc` is called + will own the Global Interpreter Lock (GIL). However, if the object being + destroyed in turn destroys objects from some other C or C++ library, care + should be taken to ensure that destroying those objects on the thread + which called :c:member:`!tp_dealloc` will not violate any assumptions of + the library. + **Inheritance:** @@ -905,6 +896,10 @@ and :c:data:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash`, when the subtype's :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both ``NULL``. + **Default:** + + :c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericHash`. + .. c:member:: ternaryfunc PyTypeObject.tp_call @@ -1052,7 +1047,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) the type, and the type object is INCREF'ed when a new instance is created, and DECREF'ed when an instance is destroyed (this does not apply to instances of subtypes; only the type referenced by the instance's ob_type gets INCREF'ed or - DECREF'ed). + DECREF'ed). Heap types should also :ref:`support garbage collection ` + as they can form a reference cycle with their own module object. **Inheritance:** @@ -1148,11 +1144,14 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:macro:: Py_TPFLAGS_MANAGED_DICT - This bit indicates that instances of the class have a ``__dict__`` + This bit indicates that instances of the class have a `~object.__dict__` attribute, and that the space for the dictionary is managed by the VM. If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set. + The type traverse function must call :c:func:`PyObject_VisitManagedDict` + and its clear function must call :c:func:`PyObject_ClearManagedDict`. + .. versionadded:: 3.12 **Inheritance:** @@ -1342,15 +1341,15 @@ and :c:data:`PyType_Type` effectively act as defaults.) To indicate that a class has changed call :c:func:`PyType_Modified` .. warning:: - This flag is present in header files, but is an internal feature and should - not be used. It will be removed in a future version of CPython + This flag is present in header files, but is not be used. + It will be removed in a future version of CPython .. c:member:: const char* PyTypeObject.tp_doc An optional pointer to a NUL-terminated C string giving the docstring for this - type object. This is exposed as the :attr:`__doc__` attribute on the type and - instances of the type. + type object. This is exposed as the :attr:`~type.__doc__` attribute on the + type and instances of the type. **Inheritance:** @@ -1390,6 +1389,23 @@ and :c:data:`PyType_Type` effectively act as defaults.) debugging aid you may want to visit it anyway just so the :mod:`gc` module's :func:`~gc.get_referents` function will include it. + Heap types (:c:macro:`Py_TPFLAGS_HEAPTYPE`) must visit their type with:: + + Py_VISIT(Py_TYPE(self)); + + It is only needed since Python 3.9. To support Python 3.8 and older, this + line must be conditional:: + + #if PY_VERSION_HEX >= 0x03090000 + Py_VISIT(Py_TYPE(self)); + #endif + + If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the + :c:member:`~PyTypeObject.tp_flags` field, the traverse function must call + :c:func:`PyObject_VisitManagedDict` like this:: + + PyObject_VisitManagedDict((PyObject*)self, visit, arg); + .. warning:: When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members that the instance *owns* (by having :term:`strong references @@ -1403,7 +1419,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) are allowed to be removed even if the instance is still alive). Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to - :c:func:`local_traverse` to have these specific names; don't name them just + :c:func:`!local_traverse` to have these specific names; don't name them just anything. Instances of :ref:`heap-allocated types ` hold a reference to @@ -1473,6 +1489,12 @@ and :c:data:`PyType_Type` effectively act as defaults.) so that *self* knows the contained object can no longer be used. The :c:func:`Py_CLEAR` macro performs the operations in a safe order. + If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the + :c:member:`~PyTypeObject.tp_flags` field, the traverse function must call + :c:func:`PyObject_ClearManagedDict` like this:: + + PyObject_ClearManagedDict((PyObject*)self); + Note that :c:member:`~PyTypeObject.tp_clear` is not *always* called before an instance is deallocated. For example, when reference counting is enough to determine that an object is no longer used, the cyclic garbage @@ -1583,7 +1605,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) weak references to the type object itself. It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit and - :c:member:`~PyTypeObject.tp_weaklist`. + :c:member:`~PyTypeObject.tp_weaklistoffset`. **Inheritance:** @@ -1595,7 +1617,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) **Default:** If the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit is set in the - :c:member:`~PyTypeObject.tp_dict` field, then + :c:member:`~PyTypeObject.tp_flags` field, then :c:member:`~PyTypeObject.tp_weaklistoffset` will be set to a negative value, to indicate that it is unsafe to use this field. @@ -1823,7 +1845,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) field is ``NULL`` then no :attr:`~object.__dict__` gets created for instances. If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the - :c:member:`~PyTypeObject.tp_dict` field, then + :c:member:`~PyTypeObject.tp_flags` field, then :c:member:`~PyTypeObject.tp_dictoffset` will be set to ``-1``, to indicate that it is unsafe to use this field. @@ -2027,7 +2049,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) A collection of subclasses. Internal use only. May be an invalid pointer. To get a list of subclasses, call the Python method - :py:meth:`~class.__subclasses__`. + :py:meth:`~type.__subclasses__`. .. versionchanged:: 3.12 @@ -2100,17 +2122,6 @@ and :c:data:`PyType_Type` effectively act as defaults.) PyErr_Restore(error_type, error_value, error_traceback); } - Also, note that, in a garbage collected Python, - :c:member:`~PyTypeObject.tp_dealloc` may be called from - any Python thread, not just the thread which created the object (if the object - becomes part of a refcount cycle, that cycle might be collected by a garbage - collection on any thread). This is not a problem for Python API calls, since - the thread on which tp_dealloc is called will own the Global Interpreter Lock - (GIL). However, if the object being destroyed in turn destroys objects from some - other C or C++ library, care should be taken to ensure that destroying those - objects on the thread which called tp_dealloc will not violate any assumptions - of the library. - **Inheritance:** This field is inherited by subtypes. @@ -2190,7 +2201,7 @@ This is done by filling a :c:type:`PyType_Spec` structure and calling .. _number-structs: Number Object Structures -======================== +------------------------ .. sectionauthor:: Amaury Forgeot d'Arc @@ -2304,7 +2315,7 @@ Number Object Structures .. _mapping-structs: Mapping Object Structures -========================= +------------------------- .. sectionauthor:: Amaury Forgeot d'Arc @@ -2341,7 +2352,7 @@ Mapping Object Structures .. _sequence-structs: Sequence Object Structures -========================== +-------------------------- .. sectionauthor:: Amaury Forgeot d'Arc @@ -2421,7 +2432,7 @@ Sequence Object Structures .. _buffer-structs: Buffer Object Structures -======================== +------------------------ .. sectionauthor:: Greg J. Stein .. sectionauthor:: Benjamin Peterson @@ -2516,7 +2527,7 @@ Buffer Object Structures Async Object Structures -======================= +----------------------- .. sectionauthor:: Yury Selivanov @@ -2584,7 +2595,7 @@ Async Object Structures .. _slot-typedefs: Slot Type typedefs -================== +------------------ .. c:type:: PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems) @@ -2693,7 +2704,7 @@ Slot Type typedefs .. _typedef-examples: Examples -======== +-------- The following are simple examples of Python type definitions. They include common usage you may encounter. Some demonstrate tricky corner diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index c10c1511..d0a1b9ca 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -52,6 +52,8 @@ Python: whether you selected a "narrow" or "wide" Unicode version of Python at build time. + .. deprecated-removed:: 3.13 3.15 + .. c:type:: PyASCIIObject PyCompactUnicodeObject @@ -73,19 +75,19 @@ Python: The following APIs are C macros and static inlined functions for fast checks and access to internal read-only data of Unicode objects: -.. c:function:: int PyUnicode_Check(PyObject *o) +.. c:function:: int PyUnicode_Check(PyObject *obj) - Return true if the object *o* is a Unicode object or an instance of a Unicode + Return true if the object *obj* is a Unicode object or an instance of a Unicode subtype. This function always succeeds. -.. c:function:: int PyUnicode_CheckExact(PyObject *o) +.. c:function:: int PyUnicode_CheckExact(PyObject *obj) - Return true if the object *o* is a Unicode object, but not an instance of a + Return true if the object *obj* is a Unicode object, but not an instance of a subtype. This function always succeeds. -.. c:function:: int PyUnicode_READY(PyObject *o) +.. c:function:: int PyUnicode_READY(PyObject *unicode) Returns ``0``. This API is kept only for backward compatibility. @@ -95,17 +97,17 @@ access to internal read-only data of Unicode objects: This API does nothing since Python 3.12. -.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) +.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *unicode) - Return the length of the Unicode string, in code points. *o* has to be a + Return the length of the Unicode string, in code points. *unicode* has to be a Unicode object in the "canonical" representation (not checked). .. versionadded:: 3.3 -.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o) - Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o) - Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o) +.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *unicode) + Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *unicode) + Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *unicode) Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the @@ -127,18 +129,18 @@ access to internal read-only data of Unicode objects: ``PyUnicode_WCHAR_KIND`` has been removed. -.. c:function:: int PyUnicode_KIND(PyObject *o) +.. c:function:: int PyUnicode_KIND(PyObject *unicode) Return one of the PyUnicode kind constants (see above) that indicate how many - bytes per character this Unicode object uses to store its data. *o* has to + bytes per character this Unicode object uses to store its data. *unicode* has to be a Unicode object in the "canonical" representation (not checked). .. versionadded:: 3.3 -.. c:function:: void* PyUnicode_DATA(PyObject *o) +.. c:function:: void* PyUnicode_DATA(PyObject *unicode) - Return a void pointer to the raw Unicode buffer. *o* has to be a Unicode + Return a void pointer to the raw Unicode buffer. *unicode* has to be a Unicode object in the "canonical" representation (not checked). .. versionadded:: 3.3 @@ -166,25 +168,25 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index) +.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) - Read a character from a Unicode object *o*, which must be in the "canonical" + Read a character from a Unicode object *unicode*, which must be in the "canonical" representation. This is less efficient than :c:func:`PyUnicode_READ` if you do multiple consecutive reads. .. versionadded:: 3.3 -.. c:function:: Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *o) +.. c:function:: Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *unicode) Return the maximum code point that is suitable for creating another string - based on *o*, which must be in the "canonical" representation. This is + based on *unicode*, which must be in the "canonical" representation. This is always an approximation but more efficient than iterating over the string. .. versionadded:: 3.3 -.. c:function:: int PyUnicode_IsIdentifier(PyObject *o) +.. c:function:: int PyUnicode_IsIdentifier(PyObject *unicode) Return ``1`` if the string is a valid identifier according to the language definition, section :ref:`identifiers`. Return ``0`` otherwise. @@ -270,25 +272,16 @@ These APIs can be used for fast direct character conversions: Return the character *ch* converted to lower case. - .. deprecated:: 3.3 - This function uses simple case mappings. - .. c:function:: Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch) Return the character *ch* converted to upper case. - .. deprecated:: 3.3 - This function uses simple case mappings. - .. c:function:: Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch) Return the character *ch* converted to title case. - .. deprecated:: 3.3 - This function uses simple case mappings. - .. c:function:: int Py_UNICODE_TODECIMAL(Py_UCS4 ch) @@ -324,7 +317,7 @@ These APIs can be used to work with surrogates: .. c:function:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) - Join two surrogate characters and return a single :c:type:`Py_UCS4` value. + Join two surrogate code points and return a single :c:type:`Py_UCS4` value. *high* and *low* are respectively the leading and trailing surrogates in a surrogate pair. *high* must be in the range [0xD800; 0xDBFF] and *low* must be in the range [0xDC00; 0xDFFF]. @@ -345,6 +338,8 @@ APIs: This is the recommended way to allocate a new Unicode object. Objects created using this function are not resizable. + On error, set an exception and return ``NULL``. + .. versionadded:: 3.3 @@ -365,9 +360,9 @@ APIs: .. versionadded:: 3.3 -.. c:function:: PyObject* PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) +.. c:function:: PyObject* PyUnicode_FromStringAndSize(const char *str, Py_ssize_t size) - Create a Unicode object from the char buffer *u*. The bytes will be + Create a Unicode object from the char buffer *str*. The bytes will be interpreted as being UTF-8 encoded. The buffer is copied into the new object. The return value might be a shared object, i.e. modification of the data is @@ -376,16 +371,16 @@ APIs: This function raises :exc:`SystemError` when: * *size* < 0, - * *u* is ``NULL`` and *size* > 0 + * *str* is ``NULL`` and *size* > 0 .. versionchanged:: 3.12 - *u* == ``NULL`` with *size* > 0 is not allowed anymore. + *str* == ``NULL`` with *size* > 0 is not allowed anymore. -.. c:function:: PyObject *PyUnicode_FromString(const char *u) +.. c:function:: PyObject *PyUnicode_FromString(const char *str) Create a Unicode object from a UTF-8 encoded null-terminated char buffer - *u*. + *str*. .. c:function:: PyObject* PyUnicode_FromFormat(const char *format, ...) @@ -525,6 +520,26 @@ APIs: - :c:expr:`PyObject*` - The result of calling :c:func:`PyObject_Repr`. + * - ``T`` + - :c:expr:`PyObject*` + - Get the fully qualified name of an object type; + call :c:func:`PyType_GetFullyQualifiedName`. + + * - ``#T`` + - :c:expr:`PyObject*` + - Similar to ``T`` format, but use a colon (``:``) as separator between + the module name and the qualified name. + + * - ``N`` + - :c:expr:`PyTypeObject*` + - Get the fully qualified name of a type; + call :c:func:`PyType_GetFullyQualifiedName`. + + * - ``#N`` + - :c:expr:`PyTypeObject*` + - Similar to ``N`` format, but use a colon (``:``) as separator between + the module name and the qualified name. + .. note:: The width formatter unit is number of characters rather than bytes. The precision formatter unit is number of bytes or :c:type:`wchar_t` @@ -560,6 +575,9 @@ APIs: In previous versions it caused all the rest of the format string to be copied as-is to the result string, and any extra arguments discarded. + .. versionchanged:: 3.13 + Support for ``%T``, ``%#T``, ``%N`` and ``%#N`` formats added. + .. c:function:: PyObject* PyUnicode_FromFormatV(const char *format, va_list vargs) @@ -598,6 +616,8 @@ APIs: Return the length of the Unicode object, in code points. + On error, set an exception and return ``-1``. + .. versionadded:: 3.3 @@ -641,6 +661,8 @@ APIs: not out of bounds, and that the object can be modified safely (i.e. that it its reference count is one). + Return ``0`` on success, ``-1`` on error with an exception set. + .. versionadded:: 3.3 @@ -650,32 +672,35 @@ APIs: Unicode object and the index is not out of bounds, in contrast to :c:func:`PyUnicode_READ_CHAR`, which performs no error checking. + Return character on success, ``-1`` on error with an exception set. + .. versionadded:: 3.3 -.. c:function:: PyObject* PyUnicode_Substring(PyObject *str, Py_ssize_t start, \ +.. c:function:: PyObject* PyUnicode_Substring(PyObject *unicode, Py_ssize_t start, \ Py_ssize_t end) - Return a substring of *str*, from character index *start* (included) to + Return a substring of *unicode*, from character index *start* (included) to character index *end* (excluded). Negative indices are not supported. + On error, set an exception and return ``NULL``. .. versionadded:: 3.3 -.. c:function:: Py_UCS4* PyUnicode_AsUCS4(PyObject *u, Py_UCS4 *buffer, \ +.. c:function:: Py_UCS4* PyUnicode_AsUCS4(PyObject *unicode, Py_UCS4 *buffer, \ Py_ssize_t buflen, int copy_null) - Copy the string *u* into a UCS4 buffer, including a null character, if + Copy the string *unicode* into a UCS4 buffer, including a null character, if *copy_null* is set. Returns ``NULL`` and sets an exception on error (in particular, a :exc:`SystemError` if *buflen* is smaller than the length of - *u*). *buffer* is returned on success. + *unicode*). *buffer* is returned on success. .. versionadded:: 3.3 -.. c:function:: Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *u) +.. c:function:: Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *unicode) - Copy the string *u* into a new UCS4 buffer that is allocated using + Copy the string *unicode* into a new UCS4 buffer that is allocated using :c:func:`PyMem_Malloc`. If this fails, ``NULL`` is returned with a :exc:`MemoryError` set. The returned buffer always has an extra null code point appended. @@ -690,7 +715,7 @@ The current locale encoding can be used to decode text from the operating system. .. c:function:: PyObject* PyUnicode_DecodeLocaleAndSize(const char *str, \ - Py_ssize_t len, \ + Py_ssize_t length, \ const char *errors) Decode a string from UTF-8 on Android and VxWorks, or from the current @@ -795,7 +820,7 @@ conversion function: Accepts a :term:`path-like object`. -.. c:function:: PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) +.. c:function:: PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *str, Py_ssize_t size) Decode a string from the :term:`filesystem encoding and error handler`. @@ -811,7 +836,7 @@ conversion function: handler>` is now used. -.. c:function:: PyObject* PyUnicode_DecodeFSDefault(const char *s) +.. c:function:: PyObject* PyUnicode_DecodeFSDefault(const char *str) Decode a null-terminated string from the :term:`filesystem encoding and error handler`. @@ -848,20 +873,25 @@ wchar_t Support :c:type:`wchar_t` support for platforms which support it: -.. c:function:: PyObject* PyUnicode_FromWideChar(const wchar_t *w, Py_ssize_t size) +.. c:function:: PyObject* PyUnicode_FromWideChar(const wchar_t *wstr, Py_ssize_t size) - Create a Unicode object from the :c:type:`wchar_t` buffer *w* of the given *size*. + Create a Unicode object from the :c:type:`wchar_t` buffer *wstr* of the given *size*. Passing ``-1`` as the *size* indicates that the function must itself compute the length, - using wcslen. + using :c:func:`!wcslen`. Return ``NULL`` on failure. -.. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size) +.. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *wstr, Py_ssize_t size) - Copy the Unicode object contents into the :c:type:`wchar_t` buffer *w*. At most + Copy the Unicode object contents into the :c:type:`wchar_t` buffer *wstr*. At most *size* :c:type:`wchar_t` characters are copied (excluding a possibly trailing null termination character). Return the number of :c:type:`wchar_t` characters - copied or ``-1`` in case of an error. Note that the resulting :c:expr:`wchar_t*` + copied or ``-1`` in case of an error. + + When *wstr* is ``NULL``, instead return the *size* that would be required + to store all of *unicode* including a terminating null. + + Note that the resulting :c:expr:`wchar_t*` string may or may not be null-terminated. It is the responsibility of the caller to make sure that the :c:expr:`wchar_t*` string is null-terminated in case this is required by the application. Also, note that the :c:expr:`wchar_t*` string @@ -922,10 +952,10 @@ Generic Codecs These are the generic codec APIs: -.. c:function:: PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_Decode(const char *str, Py_ssize_t size, \ const char *encoding, const char *errors) - Create a Unicode object by decoding *size* bytes of the encoded string *s*. + Create a Unicode object by decoding *size* bytes of the encoded string *str*. *encoding* and *errors* have the same meaning as the parameters of the same name in the :func:`str` built-in function. The codec to be used is looked up using the Python codec registry. Return ``NULL`` if an exception was raised by @@ -948,13 +978,13 @@ UTF-8 Codecs These are the UTF-8 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF8(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeUTF8(const char *str, Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the UTF-8 encoded string - *s*. Return ``NULL`` if an exception was raised by the codec. + *str*. Return ``NULL`` if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *str, Py_ssize_t size, \ const char *errors, Py_ssize_t *consumed) If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF8`. If @@ -969,6 +999,9 @@ These are the UTF-8 codec APIs: object. Error handling is "strict". Return ``NULL`` if an exception was raised by the codec. + The function fails if the string contains surrogate code points + (``U+D800`` - ``U+DFFF``). + .. c:function:: const char* PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size) @@ -978,8 +1011,11 @@ These are the UTF-8 codec APIs: returned buffer always has an extra null byte appended (not included in *size*), regardless of whether there are any other null code points. - In the case of an error, ``NULL`` is returned with an exception set and no - *size* is stored. + On error, set an exception, set *size* to ``-1`` (if it's not NULL) and + return ``NULL``. + + The function fails if the string contains surrogate code points + (``U+D800`` - ``U+DFFF``). This caches the UTF-8 representation of the string in the Unicode object, and subsequent calls will return a pointer to the same buffer. The caller is not @@ -1011,7 +1047,7 @@ UTF-32 Codecs These are the UTF-32 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *str, Py_ssize_t size, \ const char *errors, int *byteorder) Decode *size* bytes from a UTF-32 encoded buffer string and return the @@ -1038,7 +1074,7 @@ These are the UTF-32 codec APIs: Return ``NULL`` if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *str, Py_ssize_t size, \ const char *errors, int *byteorder, Py_ssize_t *consumed) If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF32`. If @@ -1061,7 +1097,7 @@ UTF-16 Codecs These are the UTF-16 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *str, Py_ssize_t size, \ const char *errors, int *byteorder) Decode *size* bytes from a UTF-16 encoded buffer string and return the @@ -1089,7 +1125,7 @@ These are the UTF-16 codec APIs: Return ``NULL`` if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *str, Py_ssize_t size, \ const char *errors, int *byteorder, Py_ssize_t *consumed) If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF16`. If @@ -1112,13 +1148,13 @@ UTF-7 Codecs These are the UTF-7 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF7(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeUTF7(const char *str, Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the UTF-7 encoded string - *s*. Return ``NULL`` if an exception was raised by the codec. + *str*. Return ``NULL`` if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *str, Py_ssize_t size, \ const char *errors, Py_ssize_t *consumed) If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF7`. If @@ -1133,11 +1169,11 @@ Unicode-Escape Codecs These are the "Unicode Escape" codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, \ +.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *str, \ Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the Unicode-Escape encoded - string *s*. Return ``NULL`` if an exception was raised by the codec. + string *str*. Return ``NULL`` if an exception was raised by the codec. .. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode) @@ -1153,11 +1189,11 @@ Raw-Unicode-Escape Codecs These are the "Raw Unicode Escape" codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, \ +.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *str, \ Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the Raw-Unicode-Escape - encoded string *s*. Return ``NULL`` if an exception was raised by the codec. + encoded string *str*. Return ``NULL`` if an exception was raised by the codec. .. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) @@ -1174,10 +1210,10 @@ These are the Latin-1 codec APIs: Latin-1 corresponds to the first 256 Unicode ordinals and only these are accepted by the codecs during encoding. -.. c:function:: PyObject* PyUnicode_DecodeLatin1(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeLatin1(const char *str, Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the Latin-1 encoded string - *s*. Return ``NULL`` if an exception was raised by the codec. + *str*. Return ``NULL`` if an exception was raised by the codec. .. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode) @@ -1194,10 +1230,10 @@ These are the ASCII codec APIs. Only 7-bit ASCII data is accepted. All other codes generate errors. -.. c:function:: PyObject* PyUnicode_DecodeASCII(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeASCII(const char *str, Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the ASCII encoded string - *s*. Return ``NULL`` if an exception was raised by the codec. + *str*. Return ``NULL`` if an exception was raised by the codec. .. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode) @@ -1218,10 +1254,10 @@ decode characters. The mapping objects provided must support the These are the mapping codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *data, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *str, Py_ssize_t length, \ PyObject *mapping, const char *errors) - Create a Unicode object by decoding *size* bytes of the encoded string *s* + Create a Unicode object by decoding *size* bytes of the encoded string *str* using the given *mapping* object. Return ``NULL`` if an exception was raised by the codec. @@ -1248,7 +1284,7 @@ These are the mapping codec APIs: The following codec API is special in that maps Unicode to Unicode. -.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors) +.. c:function:: PyObject* PyUnicode_Translate(PyObject *unicode, PyObject *table, const char *errors) Translate a string by applying a character mapping table to it and return the resulting Unicode object. Return ``NULL`` if an exception was raised by the @@ -1273,13 +1309,13 @@ use the Win32 MBCS converters to implement the conversions. Note that MBCS (or DBCS) is a class of encodings, not just one. The target encoding is defined by the user settings on the machine running the codec. -.. c:function:: PyObject* PyUnicode_DecodeMBCS(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeMBCS(const char *str, Py_ssize_t size, const char *errors) - Create a Unicode object by decoding *size* bytes of the MBCS encoded string *s*. + Create a Unicode object by decoding *size* bytes of the MBCS encoded string *str*. Return ``NULL`` if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *str, Py_ssize_t size, \ const char *errors, Py_ssize_t *consumed) If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeMBCS`. If @@ -1325,7 +1361,7 @@ They all return ``NULL`` or ``-1`` if an exception occurs. Concat two strings giving a new Unicode string. -.. c:function:: PyObject* PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit) +.. c:function:: PyObject* PyUnicode_Split(PyObject *unicode, PyObject *sep, Py_ssize_t maxsplit) Split a string giving a list of Unicode strings. If *sep* is ``NULL``, splitting will be done at all whitespace substrings. Otherwise, splits occur at the given @@ -1333,10 +1369,10 @@ They all return ``NULL`` or ``-1`` if an exception occurs. set. Separators are not included in the resulting list. -.. c:function:: PyObject* PyUnicode_Splitlines(PyObject *s, int keepend) +.. c:function:: PyObject* PyUnicode_Splitlines(PyObject *unicode, int keepends) Split a Unicode string at line breaks, returning a list of Unicode strings. - CRLF is considered to be one line break. If *keepend* is ``0``, the line break + CRLF is considered to be one line break. If *keepends* is ``0``, the Line break characters are not included in the resulting strings. @@ -1346,28 +1382,28 @@ They all return ``NULL`` or ``-1`` if an exception occurs. Unicode string. -.. c:function:: Py_ssize_t PyUnicode_Tailmatch(PyObject *str, PyObject *substr, \ +.. c:function:: Py_ssize_t PyUnicode_Tailmatch(PyObject *unicode, PyObject *substr, \ Py_ssize_t start, Py_ssize_t end, int direction) - Return ``1`` if *substr* matches ``str[start:end]`` at the given tail end + Return ``1`` if *substr* matches ``unicode[start:end]`` at the given tail end (*direction* == ``-1`` means to do a prefix match, *direction* == ``1`` a suffix match), ``0`` otherwise. Return ``-1`` if an error occurred. -.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, \ +.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *unicode, PyObject *substr, \ Py_ssize_t start, Py_ssize_t end, int direction) - Return the first position of *substr* in ``str[start:end]`` using the given + Return the first position of *substr* in ``unicode[start:end]`` using the given *direction* (*direction* == ``1`` means to do a forward search, *direction* == ``-1`` a backward search). The return value is the index of the first match; a value of ``-1`` indicates that no match was found, and ``-2`` indicates that an error occurred and an exception has been set. -.. c:function:: Py_ssize_t PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, \ +.. c:function:: Py_ssize_t PyUnicode_FindChar(PyObject *unicode, Py_UCS4 ch, \ Py_ssize_t start, Py_ssize_t end, int direction) - Return the first position of the character *ch* in ``str[start:end]`` using + Return the first position of the character *ch* in ``unicode[start:end]`` using the given *direction* (*direction* == ``1`` means to do a forward search, *direction* == ``-1`` a backward search). The return value is the index of the first match; a value of ``-1`` indicates that no match was found, and ``-2`` @@ -1376,20 +1412,20 @@ They all return ``NULL`` or ``-1`` if an exception occurs. .. versionadded:: 3.3 .. versionchanged:: 3.7 - *start* and *end* are now adjusted to behave like ``str[start:end]``. + *start* and *end* are now adjusted to behave like ``unicode[start:end]``. -.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, \ +.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *unicode, PyObject *substr, \ Py_ssize_t start, Py_ssize_t end) Return the number of non-overlapping occurrences of *substr* in - ``str[start:end]``. Return ``-1`` if an error occurred. + ``unicode[start:end]``. Return ``-1`` if an error occurred. -.. c:function:: PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, \ +.. c:function:: PyObject* PyUnicode_Replace(PyObject *unicode, PyObject *substr, \ PyObject *replstr, Py_ssize_t maxcount) - Replace at most *maxcount* occurrences of *substr* in *str* with *replstr* and + Replace at most *maxcount* occurrences of *substr* in *unicode* with *replstr* and return the resulting Unicode object. *maxcount* == ``-1`` means replace all occurrences. @@ -1403,9 +1439,32 @@ They all return ``NULL`` or ``-1`` if an exception occurs. :c:func:`PyErr_Occurred` to check for errors. -.. c:function:: int PyUnicode_CompareWithASCIIString(PyObject *uni, const char *string) +.. c:function:: int PyUnicode_EqualToUTF8AndSize(PyObject *unicode, const char *string, Py_ssize_t size) + + Compare a Unicode object with a char buffer which is interpreted as + being UTF-8 or ASCII encoded and return true (``1``) if they are equal, + or false (``0``) otherwise. + If the Unicode object contains surrogate code points + (``U+D800`` - ``U+DFFF``) or the C string is not valid UTF-8, + false (``0``) is returned. - Compare a Unicode object, *uni*, with *string* and return ``-1``, ``0``, ``1`` for less + This function does not raise exceptions. + + .. versionadded:: 3.13 + + +.. c:function:: int PyUnicode_EqualToUTF8(PyObject *unicode, const char *string) + + Similar to :c:func:`PyUnicode_EqualToUTF8AndSize`, but compute *string* + length using :c:func:`!strlen`. + If the Unicode object contains null characters, false (``0``) is returned. + + .. versionadded:: 3.13 + + +.. c:function:: int PyUnicode_CompareWithASCIIString(PyObject *unicode, const char *string) + + Compare a Unicode object, *unicode*, with *string* and return ``-1``, ``0``, ``1`` for less than, equal, and greater than, respectively. It is best to pass only ASCII-encoded strings, but the function interprets the input string as ISO-8859-1 if it contains non-ASCII characters. @@ -1413,7 +1472,7 @@ They all return ``NULL`` or ``-1`` if an exception occurs. This function does not raise exceptions. -.. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) +.. c:function:: PyObject* PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) Rich compare two Unicode strings and return one of the following: @@ -1431,31 +1490,57 @@ They all return ``NULL`` or ``-1`` if an exception occurs. ``format % args``. -.. c:function:: int PyUnicode_Contains(PyObject *container, PyObject *element) +.. c:function:: int PyUnicode_Contains(PyObject *unicode, PyObject *substr) - Check whether *element* is contained in *container* and return true or false + Check whether *substr* is contained in *unicode* and return true or false accordingly. - *element* has to coerce to a one element Unicode string. ``-1`` is returned + *substr* has to coerce to a one element Unicode string. ``-1`` is returned if there was an error. -.. c:function:: void PyUnicode_InternInPlace(PyObject **string) +.. c:function:: void PyUnicode_InternInPlace(PyObject **p_unicode) - Intern the argument *\*string* in place. The argument must be the address of a + Intern the argument :c:expr:`*p_unicode` in place. The argument must be the address of a pointer variable pointing to a Python Unicode string object. If there is an - existing interned string that is the same as *\*string*, it sets *\*string* to + existing interned string that is the same as :c:expr:`*p_unicode`, it sets :c:expr:`*p_unicode` to it (releasing the reference to the old string object and creating a new :term:`strong reference` to the interned string object), otherwise it leaves - *\*string* alone and interns it (creating a new :term:`strong reference`). + :c:expr:`*p_unicode` alone and interns it. + (Clarification: even though there is a lot of talk about references, think - of this function as reference-neutral; you own the object after the call - if and only if you owned it before the call.) + of this function as reference-neutral. You must own the object you pass in; + after the call you no longer own the passed-in reference, but you newly own + the result.) + + This function never raises an exception. + On error, it leaves its argument unchanged without interning it. + + Instances of subclasses of :py:class:`str` may not be interned, that is, + :c:expr:`PyUnicode_CheckExact(*p_unicode)` must be true. If it is not, + then -- as with any other error -- the argument is left unchanged. + Note that interned strings are not “immortal”. + You must keep a reference to the result to benefit from interning. -.. c:function:: PyObject* PyUnicode_InternFromString(const char *v) + +.. c:function:: PyObject* PyUnicode_InternFromString(const char *str) A combination of :c:func:`PyUnicode_FromString` and - :c:func:`PyUnicode_InternInPlace`, returning either a new Unicode string - object that has been interned, or a new ("owned") reference to an earlier - interned string object with the same value. + :c:func:`PyUnicode_InternInPlace`, meant for statically allocated strings. + + Return a new ("owned") reference to either a new Unicode string object + that has been interned, or an earlier interned string object with the + same value. + + Python may keep a reference to the result, or make it :term:`immortal`, + preventing it from being garbage-collected promptly. + For interning an unbounded number of different strings, such as ones coming + from user input, prefer calling :c:func:`PyUnicode_FromString` and + :c:func:`PyUnicode_InternInPlace` directly. + + .. impl-detail:: + + Strings interned this way are made :term:`immortal`. + + diff --git a/Doc/c-api/utilities.rst b/Doc/c-api/utilities.rst index ccbf14e1..9d0abf44 100644 --- a/Doc/c-api/utilities.rst +++ b/Doc/c-api/utilities.rst @@ -17,6 +17,8 @@ and parsing function arguments and constructing Python values from C values. marshal.rst arg.rst conversion.rst + hash.rst reflection.rst codec.rst + time.rst perfmaps.rst diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 324518c0..9f02bdb5 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -25,30 +25,6 @@ are only passed to these functions if it is certain that they were created by the same library that the Python runtime is using. -.. c:function:: int Py_Main(int argc, wchar_t **argv) - - The main program for the standard interpreter. This is made available for - programs which embed Python. The *argc* and *argv* parameters should be - prepared exactly as those which are passed to a C program's :c:func:`main` - function (converted to wchar_t according to the user's locale). It is - important to note that the argument list may be modified (but the contents of - the strings pointed to by the argument list are not). The return value will - be ``0`` if the interpreter exits normally (i.e., without an exception), - ``1`` if the interpreter exits due to an exception, or ``2`` if the parameter - list does not represent a valid Python command line. - - Note that if an otherwise unhandled :exc:`SystemExit` is raised, this - function will not return ``1``, but exit the process, as long as - :c:member:`PyConfig.inspect` is zero. - - -.. c:function:: int Py_BytesMain(int argc, char **argv) - - Similar to :c:func:`Py_Main` but *argv* is an array of bytes strings. - - .. versionadded:: 3.8 - - .. c:function:: int PyRun_AnyFile(FILE *fp, const char *filename) This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving @@ -322,7 +298,7 @@ the same library that the Python runtime is using. .. c:var:: int Py_eval_input - .. index:: single: Py_CompileString() + .. index:: single: Py_CompileString (C function) The start symbol from the Python grammar for isolated expressions; for use with :c:func:`Py_CompileString`. @@ -330,7 +306,7 @@ the same library that the Python runtime is using. .. c:var:: int Py_file_input - .. index:: single: Py_CompileString() + .. index:: single: Py_CompileString (C function) The start symbol from the Python grammar for sequences of statements as read from a file or other source; for use with :c:func:`Py_CompileString`. This is @@ -339,7 +315,7 @@ the same library that the Python runtime is using. .. c:var:: int Py_single_input - .. index:: single: Py_CompileString() + .. index:: single: Py_CompileString (C function) The start symbol from the Python grammar for a single statement; for use with :c:func:`Py_CompileString`. This is the symbol used for the interactive diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index f4650760..8f233e16 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -13,18 +13,18 @@ as much as it can. .. c:function:: int PyWeakref_Check(PyObject *ob) - Return true if *ob* is either a reference or proxy object. This function + Return non-zero if *ob* is either a reference or proxy object. This function always succeeds. .. c:function:: int PyWeakref_CheckRef(PyObject *ob) - Return true if *ob* is a reference object. This function always succeeds. + Return non-zero if *ob* is a reference object. This function always succeeds. .. c:function:: int PyWeakref_CheckProxy(PyObject *ob) - Return true if *ob* is a proxy object. This function always succeeds. + Return non-zero if *ob* is a proxy object. This function always succeeds. .. c:function:: PyObject* PyWeakref_NewRef(PyObject *ob, PyObject *callback) @@ -35,7 +35,7 @@ as much as it can. callable object that receives notification when *ob* is garbage collected; it should accept a single parameter, which will be the weak reference object itself. *callback* may also be ``None`` or ``NULL``. If *ob* is not a - weakly referencable object, or if *callback* is not callable, ``None``, or + weakly referenceable object, or if *callback* is not callable, ``None``, or ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`. @@ -47,14 +47,27 @@ as much as it can. be a callable object that receives notification when *ob* is garbage collected; it should accept a single parameter, which will be the weak reference object itself. *callback* may also be ``None`` or ``NULL``. If *ob* - is not a weakly referencable object, or if *callback* is not callable, + is not a weakly referenceable object, or if *callback* is not callable, ``None``, or ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`. +.. c:function:: int PyWeakref_GetRef(PyObject *ref, PyObject **pobj) + + Get a :term:`strong reference` to the referenced object from a weak + reference, *ref*, into *\*pobj*. + + * On success, set *\*pobj* to a new :term:`strong reference` to the + referenced object and return 1. + * If the reference is dead, set *\*pobj* to ``NULL`` and return 0. + * On error, raise an exception and return -1. + + .. versionadded:: 3.13 + + .. c:function:: PyObject* PyWeakref_GetObject(PyObject *ref) - Return the referenced object from a weak reference, *ref*. If the referent is - no longer live, returns ``Py_None``. + Return a :term:`borrowed reference` to the referenced object from a weak + reference, *ref*. If the referent is no longer live, returns ``Py_None``. .. note:: @@ -63,11 +76,17 @@ as much as it can. except when it cannot be destroyed before the last usage of the borrowed reference. + .. deprecated-removed:: 3.13 3.15 + Use :c:func:`PyWeakref_GetRef` instead. + .. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref) Similar to :c:func:`PyWeakref_GetObject`, but does no error checking. + .. deprecated-removed:: 3.13 3.15 + Use :c:func:`PyWeakref_GetRef` instead. + .. c:function:: void PyObject_ClearWeakRefs(PyObject *object) @@ -77,3 +96,19 @@ as much as it can. This iterates through the weak references for *object* and calls callbacks for those references which have one. It returns when all callbacks have been attempted. + + +.. c:function:: void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object) + + Clears the weakrefs for *object* without calling the callbacks. + + This function is called by the :c:member:`~PyTypeObject.tp_dealloc` handler + for types with finalizers (i.e., :meth:`~object.__del__`). The handler for + those objects first calls :c:func:`PyObject_ClearWeakRefs` to clear weakrefs + and call their callbacks, then the finalizer, and finally this function to + clear any weakrefs that may have been created by the finalizer. + + In most circumstances, it's more appropriate to use + :c:func:`PyObject_ClearWeakRefs` to clear weakrefs instead of this function. + + .. versionadded:: 3.13 diff --git a/Doc/conf.py b/Doc/conf.py index 9f01bd89..73d7d5db 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -6,27 +6,45 @@ # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). -import sys, os, time +import importlib +import os +import sys +import time + +import sphinx + +# Make our custom extensions available to Sphinx sys.path.append(os.path.abspath('tools/extensions')) sys.path.append(os.path.abspath('includes')) +# Python specific content from Doc/Tools/extensions/pyspecific.py +from pyspecific import SOURCE_URI + # General configuration # --------------------- +# Our custom Sphinx extensions are found in Doc/Tools/extensions/ extensions = [ - 'asdl_highlight', + 'audit_events', + 'availability', 'c_annotations', - 'escape4chm', 'glossary_search', - 'peg_highlight', + 'lexers', 'pyspecific', 'sphinx.ext.coverage', 'sphinx.ext.doctest', + 'sphinx.ext.extlinks', ] -# Skip if downstream redistributors haven't installed it +# Skip if downstream redistributors haven't installed them +try: + import notfound.extension # noqa: F401 +except ImportError: + pass +else: + extensions.append('notfound.extension') try: - import sphinxext.opengraph + import sphinxext.opengraph # noqa: F401 except ImportError: pass else: @@ -39,7 +57,7 @@ try: except ImportError: _tkinter = None # Treat warnings as errors, done here to prevent warnings in Sphinx code from -# causing spurious test failures. +# causing spurious CPython test failures. import warnings warnings.simplefilter('error') del warnings @@ -49,27 +67,42 @@ manpages_url = 'https://manpages.debian.org/{path}' # General substitutions. project = 'Python' -copyright = '2001-%s, Python Software Foundation' % time.strftime('%Y') +if sphinx.version_info[:2] >= (8, 1): + copyright = "2001-%Y, Python Software Foundation" +else: + copyright = f"2001-{time.strftime('%Y')}, Python Software Foundation" # We look for the Include/patchlevel.h file in the current Python source tree # and replace the values accordingly. -import patchlevel -version, release = patchlevel.get_version_info() +# See Doc/tools/extensions/patchlevel.py +version, release = importlib.import_module('patchlevel').get_version_info() + +rst_epilog = f""" +.. |python_version_literal| replace:: ``Python {version}`` +.. |python_x_dot_y_literal| replace:: ``python{version}`` +.. |usr_local_bin_python_x_dot_y_literal| replace:: ``/usr/local/bin/python{version}`` +""" -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: +# There are two options for replacing |today|. Either, you set today to some +# non-false value and use it. today = '' -# Else, today_fmt is used as the format for a strftime call. +# Or else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' # By default, highlight as Python 3. highlight_language = 'python3' # Minimum version of sphinx required -needs_sphinx = '4.2' +needs_sphinx = '7.2.6' + +# Create table of contents entries for domain objects (e.g. functions, classes, +# attributes, etc.). Default is True. +toc_object_entries = True +# Hide parents to tidy up long entries in sidebar +toc_object_entries_show_parents = 'hide' # Ignore any .rst files in the includes/ directory; -# they're embedded in pages but not rendered individually. +# they're embedded in pages but not rendered as individual pages. # Ignore any .rst files in the venv/ directory. exclude_patterns = ['includes/*.rst', 'venv/*', 'README.rst'] venvdir = os.getenv('VENVDIR') @@ -79,25 +112,40 @@ if venvdir is not None: nitpick_ignore = [ # Standard C functions ('c:func', 'calloc'), + ('c:func', 'ctime'), ('c:func', 'dlopen'), ('c:func', 'exec'), ('c:func', 'fcntl'), + ('c:func', 'flock'), ('c:func', 'fork'), ('c:func', 'free'), + ('c:func', 'gettimeofday'), ('c:func', 'gmtime'), + ('c:func', 'grantpt'), + ('c:func', 'ioctl'), + ('c:func', 'localeconv'), ('c:func', 'localtime'), ('c:func', 'main'), ('c:func', 'malloc'), + ('c:func', 'mktime'), + ('c:func', 'posix_openpt'), ('c:func', 'printf'), + ('c:func', 'ptsname'), + ('c:func', 'ptsname_r'), ('c:func', 'realloc'), ('c:func', 'snprintf'), ('c:func', 'sprintf'), ('c:func', 'stat'), + ('c:func', 'strftime'), ('c:func', 'system'), ('c:func', 'time'), + ('c:func', 'unlockpt'), ('c:func', 'vsnprintf'), # Standard C types ('c:type', 'FILE'), + ('c:type', 'int8_t'), + ('c:type', 'int16_t'), + ('c:type', 'int32_t'), ('c:type', 'int64_t'), ('c:type', 'intmax_t'), ('c:type', 'off_t'), @@ -106,6 +154,9 @@ nitpick_ignore = [ ('c:type', 'size_t'), ('c:type', 'ssize_t'), ('c:type', 'time_t'), + ('c:type', 'uint8_t'), + ('c:type', 'uint16_t'), + ('c:type', 'uint32_t'), ('c:type', 'uint64_t'), ('c:type', 'uintmax_t'), ('c:type', 'uintptr_t'), @@ -113,11 +164,14 @@ nitpick_ignore = [ ('c:type', 'wchar_t'), ('c:type', '__int64'), ('c:type', 'unsigned __int64'), + ('c:type', 'double'), # Standard C structures ('c:struct', 'in6_addr'), ('c:struct', 'in_addr'), ('c:struct', 'stat'), ('c:struct', 'statvfs'), + ('c:struct', 'timeval'), + ('c:struct', 'timespec'), # Standard C macros ('c:macro', 'LLONG_MAX'), ('c:macro', 'LLONG_MIN'), @@ -145,6 +199,7 @@ nitpick_ignore = [ ('envvar', 'LC_TIME'), ('envvar', 'LINES'), ('envvar', 'LOGNAME'), + ('envvar', 'MANPAGER'), ('envvar', 'PAGER'), ('envvar', 'PATH'), ('envvar', 'PATHEXT'), @@ -157,6 +212,13 @@ nitpick_ignore = [ ('envvar', 'USER'), ('envvar', 'USERNAME'), ('envvar', 'USERPROFILE'), + # Deprecated function that was never documented: + ('py:func', 'getargspec'), + ('py:func', 'inspect.getargspec'), + # Undocumented modules that users shouldn't have to worry about + # (implementation details of `os.path`): + ('py:mod', 'ntpath'), + ('py:mod', 'posixpath'), ] # Temporary undocumented names. @@ -198,6 +260,7 @@ nitpick_ignore += [ ('c:data', 'PyExc_OverflowError'), ('c:data', 'PyExc_PermissionError'), ('c:data', 'PyExc_ProcessLookupError'), + ('c:data', 'PyExc_PythonFinalizationError'), ('c:data', 'PyExc_RecursionError'), ('c:data', 'PyExc_ReferenceError'), ('c:data', 'PyExc_RuntimeError'), @@ -228,47 +291,65 @@ nitpick_ignore += [ ('c:data', 'PyExc_UnicodeWarning'), ('c:data', 'PyExc_UserWarning'), ('c:data', 'PyExc_Warning'), + # Undocumented public C macros + ('c:macro', 'Py_BUILD_ASSERT'), + ('c:macro', 'Py_BUILD_ASSERT_EXPR'), # Do not error nit-picky mode builds when _SubParsersAction.add_parser cannot # be resolved, as the method is currently undocumented. For context, see # https://github.com/python/cpython/pull/103289. ('py:meth', '_SubParsersAction.add_parser'), + # Attributes/methods/etc. that definitely should be documented better, + # but are deferred for now: + ('py:attr', '__annotations__'), + ('py:meth', '__missing__'), + ('py:attr', '__wrapped__'), + ('py:attr', 'decimal.Context.clamp'), + ('py:meth', 'index'), # list.index, tuple.index, etc. ] -# gh-106948: Copy standard C types declared in the "c:type" domain to the -# "c:identifier" domain, since "c:function" markup looks for types in the -# "c:identifier" domain. Use list() to not iterate on items which are being -# added +# gh-106948: Copy standard C types declared in the "c:type" domain and C +# structures declared in the "c:struct" domain to the "c:identifier" domain, +# since "c:function" markup looks for types in the "c:identifier" domain. Use +# list() to not iterate on items which are being added for role, name in list(nitpick_ignore): - if role == 'c:type': + if role in ('c:type', 'c:struct'): nitpick_ignore.append(('c:identifier', name)) del role, name # Disable Docutils smartquotes for several translations smartquotes_excludes = { - 'languages': ['ja', 'fr', 'zh_TW', 'zh_CN'], 'builders': ['man', 'text'], + 'languages': ['ja', 'fr', 'zh_TW', 'zh_CN'], + 'builders': ['man', 'text'], } -# Avoid a warning with Sphinx >= 2.0 -master_doc = 'contents' +# Avoid a warning with Sphinx >= 4.0 +root_doc = 'contents' # Allow translation of index directives gettext_additional_targets = [ 'index', + 'literal-block', ] # Options for HTML output # ----------------------- -# Use our custom theme. +# Use our custom theme: https://github.com/python/python-docs-theme html_theme = 'python_docs_theme' +# Location of overrides for theme templates and static files html_theme_path = ['tools'] html_theme_options = { 'collapsiblesidebar': True, 'issues_url': '/bugs.html', 'license_url': '/license.html', - 'root_include_title': False # We use the version switcher instead. + 'root_include_title': False, # We use the version switcher instead. } +if os.getenv("READTHEDOCS"): + html_theme_options["hosted_on"] = ( + 'Read the Docs' + ) + # Override stylesheet fingerprinting for Windows CHM htmlhelp to fix GH-91207 # https://github.com/python/cpython/issues/91207 if any('htmlhelp' in arg for arg in sys.argv): @@ -277,22 +358,31 @@ if any('htmlhelp' in arg for arg in sys.argv): print("It may be removed in the future\n") # Short title used e.g. for HTML tags. -html_short_title = '%s Documentation' % release +html_short_title = f'{release} Documentation' # Deployment preview information # (See .readthedocs.yml and https://docs.readthedocs.io/en/stable/reference/environment-variables.html) -repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL") +is_deployment_preview = os.getenv("READTHEDOCS_VERSION_TYPE") == "external" +repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL", "") +repository_url = repository_url.removesuffix(".git") html_context = { - "is_deployment_preview": os.getenv("READTHEDOCS_VERSION_TYPE") == "external", - "repository_url": repository_url.removesuffix(".git") if repository_url else None, - "pr_id": os.getenv("READTHEDOCS_VERSION") + "is_deployment_preview": is_deployment_preview, + "repository_url": repository_url or None, + "pr_id": os.getenv("READTHEDOCS_VERSION"), + "enable_analytics": os.getenv("PYTHON_DOCS_ENABLE_ANALYTICS"), } -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -html_last_updated_fmt = '%b %d, %Y' +# This 'Last updated on:' timestamp is inserted at the bottom of every page. +html_last_updated_fmt = '%b %d, %Y (%H:%M UTC)' +if sphinx.version_info[:2] >= (8, 1): + html_last_updated_use_utc = True +else: + html_time = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) + html_last_updated_fmt = time.strftime( + html_last_updated_fmt, time.gmtime(html_time) + ) -# Path to find HTML templates. +# Path to find HTML templates to override theme templates_path = ['tools/templates'] # Custom sidebar templates, filenames relative to this file. @@ -321,18 +411,17 @@ htmlhelp_basename = 'python' + release.replace('.', '') # Split the index html_split_index = True +# Split pot files one per reST file +gettext_compact = False # Options for LaTeX output # ------------------------ latex_engine = 'xelatex' -# Get LaTeX to handle Unicode correctly latex_elements = { -} - -# Additional stuff for the LaTeX preamble. -latex_elements['preamble'] = r''' + # For the LaTeX preamble. + 'preamble': r''' \authoraddress{ \sphinxstrong{Python Software Foundation}\\ Email: \sphinxemail{docs@python.org} @@ -340,42 +429,81 @@ latex_elements['preamble'] = r''' \let\Verbatim=\OriginalVerbatim \let\endVerbatim=\endOriginalVerbatim \setcounter{tocdepth}{2} -''' - -# The paper size ('letter' or 'a4'). -latex_elements['papersize'] = 'a4' - -# The font size ('10pt', '11pt' or '12pt'). -latex_elements['pointsize'] = '10pt' +''', + # The paper size ('letterpaper' or 'a4paper'). + 'papersize': 'a4paper', + # The font size ('10pt', '11pt' or '12pt'). + 'pointsize': '10pt', +} # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). _stdauthor = 'Guido van Rossum and the Python development team' latex_documents = [ - ('c-api/index', 'c-api.tex', - 'The Python/C API', _stdauthor, 'manual'), - ('extending/index', 'extending.tex', - 'Extending and Embedding Python', _stdauthor, 'manual'), - ('installing/index', 'installing.tex', - 'Installing Python Modules', _stdauthor, 'manual'), - ('library/index', 'library.tex', - 'The Python Library Reference', _stdauthor, 'manual'), - ('reference/index', 'reference.tex', - 'The Python Language Reference', _stdauthor, 'manual'), - ('tutorial/index', 'tutorial.tex', - 'Python Tutorial', _stdauthor, 'manual'), - ('using/index', 'using.tex', - 'Python Setup and Usage', _stdauthor, 'manual'), - ('faq/index', 'faq.tex', - 'Python Frequently Asked Questions', _stdauthor, 'manual'), - ('whatsnew/' + version, 'whatsnew.tex', - 'What\'s New in Python', 'A. M. Kuchling', 'howto'), + ('c-api/index', 'c-api.tex', 'The Python/C API', _stdauthor, 'manual'), + ( + 'extending/index', + 'extending.tex', + 'Extending and Embedding Python', + _stdauthor, + 'manual', + ), + ( + 'installing/index', + 'installing.tex', + 'Installing Python Modules', + _stdauthor, + 'manual', + ), + ( + 'library/index', + 'library.tex', + 'The Python Library Reference', + _stdauthor, + 'manual', + ), + ( + 'reference/index', + 'reference.tex', + 'The Python Language Reference', + _stdauthor, + 'manual', + ), + ( + 'tutorial/index', + 'tutorial.tex', + 'Python Tutorial', + _stdauthor, + 'manual', + ), + ( + 'using/index', + 'using.tex', + 'Python Setup and Usage', + _stdauthor, + 'manual', + ), + ( + 'faq/index', + 'faq.tex', + 'Python Frequently Asked Questions', + _stdauthor, + 'manual', + ), + ( + 'whatsnew/' + version, + 'whatsnew.tex', + 'What\'s New in Python', + 'A. M. Kuchling', + 'howto', + ), ] # Collect all HOWTOs individually -latex_documents.extend(('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex', - '', _stdauthor, 'howto') - for fn in os.listdir('howto') - if fn.endswith('.rst') and fn != 'index.rst') +latex_documents.extend( + ('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex', '', _stdauthor, 'howto') + for fn in os.listdir('howto') + if fn.endswith('.rst') and fn != 'index.rst' +) # Documents to append as an appendix to all manuals. latex_appendices = ['glossary', 'about', 'license', 'copyright'] @@ -386,6 +514,10 @@ latex_appendices = ['glossary', 'about', 'license', 'copyright'] epub_author = 'Python Documentation Authors' epub_publisher = 'Python Software Foundation' +# index pages are not valid xhtml +# https://github.com/sphinx-doc/sphinx/issues/12359 +epub_use_index = False + # Options for the coverage checker # -------------------------------- @@ -393,15 +525,13 @@ epub_publisher = 'Python Software Foundation' # match any of the following regexes (using re.match). coverage_ignore_modules = [ r'[T|t][k|K]', - r'Tix', ] coverage_ignore_functions = [ 'test($|_)', ] -coverage_ignore_classes = [ -] +coverage_ignore_classes = [] # Glob patterns for C source files for C API coverage, relative to this directory. coverage_c_path = [ @@ -410,15 +540,15 @@ coverage_c_path = [ # Regexes to find C items in the source files. coverage_c_regexes = { - 'cfunction': (r'^PyAPI_FUNC\(.*\)\s+([^_][\w_]+)'), - 'data': (r'^PyAPI_DATA\(.*\)\s+([^_][\w_]+)'), - 'macro': (r'^#define ([^_][\w_]+)\(.*\)[\s|\\]'), + 'cfunction': r'^PyAPI_FUNC\(.*\)\s+([^_][\w_]+)', + 'data': r'^PyAPI_DATA\(.*\)\s+([^_][\w_]+)', + 'macro': r'^#define ([^_][\w_]+)\(.*\)[\s|\\]', } # The coverage checker will ignore all C items whose names match these regexes # (using re.match) -- the keys must be the same as in coverage_c_regexes. coverage_ignore_c_items = { -# 'cfunction': [...] + # 'cfunction': [...] } @@ -440,9 +570,15 @@ linkcheck_allowed_redirects = { r'https://msdn.microsoft.com/.*': 'https://learn.microsoft.com/.*', r'https://docs.microsoft.com/.*': 'https://learn.microsoft.com/.*', r'https://go.microsoft.com/fwlink/\?LinkID=\d+': 'https://learn.microsoft.com/.*', + # Debian's man page redirects to its current stable version + r'https://manpages.debian.org/\w+\(\d(\w+)?\)': r'https://manpages.debian.org/\w+/[\w/\-\.]*\.\d(\w+)?\.en\.html', # Language redirects r'https://toml.io': 'https://toml.io/en/', r'https://www.redhat.com': 'https://www.redhat.com/en', + # pypi.org project name normalization (upper to lowercase, underscore to hyphen) + r'https://pypi.org/project/[A-Za-z\d_\-\.]+/': r'https://pypi.org/project/[a-z\d\-\.]+/', + # Discourse title name expansion (text changes when title is edited) + r'https://discuss\.python\.org/t/\d+': r'https://discuss\.python\.org/t/.*/\d+', # Other redirects r'https://www.boost.org/libs/.+': r'https://www.boost.org/doc/libs/\d_\d+_\d/.+', r'https://support.microsoft.com/en-us/help/\d+': 'https://support.microsoft.com/en-us/topic/.+', @@ -469,15 +605,38 @@ linkcheck_ignore = [ r'https://unix.org/version2/whatsnew/lp64_wp.html', ] +# Options for sphinx.ext.extlinks +# ------------------------------- + +# This config is a dictionary of external sites, +# mapping unique short aliases to a base URL and a prefix. +# https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html +extlinks = { + "pypi": ("https://pypi.org/project/%s/", "%s"), + "source": (SOURCE_URI, "%s"), +} +extlinks_detect_hardcoded_links = True + +if sphinx.version_info[:2] < (8, 1): + # Sphinx 8.1 has in-built CVE and CWE roles. + extlinks |= { + "cve": ( + "https://www.cve.org/CVERecord?id=CVE-%s", + "CVE-%s", + ), + "cwe": ("https://cwe.mitre.org/data/definitions/%s.html", "CWE-%s"), + } -# Options for extensions -# ---------------------- +# Options for c_annotations extension +# ----------------------------------- # Relative filename of the data files refcount_file = 'data/refcounts.dat' stable_abi_file = 'data/stable_abi.dat' -# sphinxext-opengraph config +# Options for sphinxext-opengraph +# ------------------------------- + ogp_site_url = 'https://docs.python.org/3/' ogp_site_name = 'Python documentation' ogp_image = '_static/og-image.png' diff --git a/Doc/constraints.txt b/Doc/constraints.txt index 147de127..26ac1862 100644 --- a/Doc/constraints.txt +++ b/Doc/constraints.txt @@ -7,18 +7,20 @@ # Direct dependencies of Sphinx babel<3 colorama<0.5 -imagesize<1.5 -Jinja2<3.2 -packaging<24 -Pygments>=2.16.1,<3 +imagesize<2 +Jinja2<4 +packaging<25 +Pygments<3 requests<3 snowballstemmer<3 -sphinxcontrib-applehelp<1.1 -sphinxcontrib-devhelp<1.1 -sphinxcontrib-htmlhelp<2.1 -sphinxcontrib-jsmath<1.1 -sphinxcontrib-qthelp<1.1 -sphinxcontrib-serializinghtml<1.2 +# keep lower-bounds until Sphinx 8.1 is released +# https://github.com/sphinx-doc/sphinx/pull/12756 +sphinxcontrib-applehelp>=1.0.7,<3 +sphinxcontrib-devhelp>=1.0.6,<3 +sphinxcontrib-htmlhelp>=2.0.6,<3 +sphinxcontrib-jsmath>=1.0.1,<2 +sphinxcontrib-qthelp>=1.0.6,<3 +sphinxcontrib-serializinghtml>=1.1.9,<3 # Direct dependencies of Jinja2 (Jinja is a dependency of Sphinx, see above) -MarkupSafe<2.2 +MarkupSafe<3 diff --git a/Doc/contents.rst b/Doc/contents.rst index 24ceacb0..b57f4b09 100644 --- a/Doc/contents.rst +++ b/Doc/contents.rst @@ -14,6 +14,7 @@ installing/index.rst howto/index.rst faq/index.rst + deprecations/index.rst glossary.rst about.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 9b716831..8629ed1f 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright © 2001-2023 Python Software Foundation. All rights reserved. +Copyright © 2001-2024 Python Software Foundation. All rights reserved. Copyright © 2000 BeOpen.com. All rights reserved. diff --git a/Doc/data/python3.12.abi b/Doc/data/python3.12.abi deleted file mode 100644 index f4138bee..00000000 --- a/Doc/data/python3.12.abi +++ /dev/null @@ -1,26477 +0,0 @@ -<abi-corpus version='2.0' path='libpython3.12.so' soname='libpython3.12.so.1.0'> - <elf-needed> - <dependency name='libm.so.6'/> - <dependency name='libc.so.6'/> - <dependency name='ld-linux-x86-64.so.2'/> - </elf-needed> - <elf-function-symbols> - <elf-symbol name='PyAIter_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_Parse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_ParseTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_ParseTupleAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_UnpackTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_VaParse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_VaParseTupleAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyArg_ValidateKeywordArguments' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyAsyncGen_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBool_FromLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_FillContiguousStrides' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_FillInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_FromContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_GetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_IsContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_SizeFromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBuffer_ToContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_AsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_AsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_AsStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_ConcatAndDel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_DecodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_FromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_FromFormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_Repr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_GetFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_GetFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_GetSelf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_NewEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCallIter_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCallable_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_GetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_GetDestructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_GetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_Import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_IsValid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_SetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_SetDestructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_SetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_SetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCell_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCell_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCell_Set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyClassMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_Addr2Line' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_Addr2Location' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_GetCellvars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_GetFreevars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_GetVarnames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_NewEmpty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_Optimize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_BackslashReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Decode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Decoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Encode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Encoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_IgnoreErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_IncrementalDecoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_IncrementalEncoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_KnownEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_LookupError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_NameReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_RegisterError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_ReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_StreamReader' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_StreamWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_StrictErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_Unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCodec_XMLCharRefReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCompile_OpcodeStackEffect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCompile_OpcodeStackEffectWithJump' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_AsCComplex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_FromCComplex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_FromDoubles' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_ImagAsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_RealAsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_InitIsolatedConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_InitPythonConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_Read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_SetArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_SetBytesArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_SetBytesString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyConfig_SetWideStringList' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextVar_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextVar_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextVar_Reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextVar_Set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_CopyCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_Enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCoro_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_IsData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_NewClassMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_NewGetSet' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_NewMember' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_NewMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDescr_NewWrapper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictProxy_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_DelItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_GetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_GetItemWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Items' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Keys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Merge' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_MergeFromSeq2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_SetDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_SetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Unwatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Update' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Watch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_BadArgument' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_BadInternalCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_CheckSignals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Display' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_DisplayException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_ExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Fetch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_FormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_GetExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_GetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_GetRaisedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_GivenExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_NewException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_NewExceptionWithDoc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_NoMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_NormalizeException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Occurred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_PrintEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_ProgramText' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_ProgramTextObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_RangedSyntaxLocationObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_ResourceWarning' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_Restore' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetFromErrno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetFromErrnoWithFilename' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetFromErrnoWithFilenameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetFromErrnoWithFilenameObjects' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetImportError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetImportErrorSubclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetInterrupt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetInterruptEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetRaisedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SyntaxLocation' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SyntaxLocationEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_SyntaxLocationObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WarnEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WarnExplicit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WarnExplicitFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WarnExplicitObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WarnFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyErr_WriteUnraisable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_AcquireLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_AcquireThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_CallFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_CallObjectWithKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_EvalCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_EvalCodeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_EvalFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_EvalFrameEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetBuiltins' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetFuncDesc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetFuncName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_GetLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_InitThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_MergeCompilerFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_ReleaseLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_ReleaseThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_RestoreThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_SaveThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_SetProfile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_SetProfileAllThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_SetTrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_SetTraceAllThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEval_ThreadsInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExceptionClass_Name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_GetArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_GetCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_GetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_GetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_SetArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_SetCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_SetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyException_SetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_FromFd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_GetLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_NewStdPrinter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_OpenCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_OpenCodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_SetOpenCodeHook' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_WriteObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFile_WriteString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_AsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_FromDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_GetMax' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_GetMin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Pack2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Pack4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Pack8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Unpack2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Unpack4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Unpack8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_FastToLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_FastToLocalsWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetBack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetBuiltins' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetGenerator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetLasti' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetLineNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_GetVarString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_LocalsToFast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrozenSet_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetAnnotations' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetClosure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetKwDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_NewWithQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_SetAnnotations' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_SetClosure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_SetDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_SetKwDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_SetVectorcall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGC_Collect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGC_Disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGC_Enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGC_IsEnabled' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGILState_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGILState_Ensure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGILState_GetThisThreadState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGILState_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGen_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGen_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGen_NewWithQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyHash_GetFuncDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_AddModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_AppendInittab' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ExecCodeModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ExecCodeModuleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ExecCodeModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ExecCodeModuleWithPathnames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ExtendInittab' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_GetImporter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_GetMagicNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_GetMagicTag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_GetModuleDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_Import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportFrozenModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportFrozenModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportModuleLevel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportModuleLevelObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ImportModuleNoBlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_ReloadModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyIndex_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__abc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__ast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__codecs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__collections' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__functools' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__imp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__io' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__locale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__operator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__sre' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__stat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__symtable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__tokenize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__tracemalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__typing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit__weakref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_atexit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_errno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_faulthandler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_gc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_itertools' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_posix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_pwd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInit_time' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInstanceMethod_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInstanceMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_GetID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInterpreterState_ThreadHead' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyIter_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyIter_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyIter_Send' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_AsTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Reverse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_SetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Sort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsLongAndOverflow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsLongLongAndOverflow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsSize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsUnsignedLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsUnsignedLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsUnsignedLongLongMask' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsUnsignedLongMask' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_AsVoidPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromSize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromUnicodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromUnsignedLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromUnsignedLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_FromVoidPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_GetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_HasKey' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_HasKeyString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Items' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Keys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_SetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMapping_Values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_ReadLastObjectFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_ReadLongFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_ReadObjectFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_ReadObjectFromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_ReadShortFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_WriteLongToFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_WriteObjectToFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMarshal_WriteObjectToString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_Calloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_GetAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_RawCalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_RawFree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_RawMalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_RawRealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_Realloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_SetAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMem_SetupDebugHooks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMember_GetOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMember_SetOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemoryView_FromBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemoryView_FromMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemoryView_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemoryView_GetContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMethod_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMethod_Self' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModuleDef_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddFunctions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddIntConstant' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddObjectRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddStringConstant' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_AddType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_Create2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_ExecDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_FromDefAndSpec2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetFilename' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetFilenameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetNameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_GetState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_NewObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_SetDocString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Absolute' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_And' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_AsSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Divmod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Float' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_FloorDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceAdd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceAnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceFloorDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceLshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceMatrixMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceOr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlacePower' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceRemainder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceRshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceSubtract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceTrueDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_InPlaceXor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Invert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Long' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Lshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_MatrixMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Multiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Negative' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Or' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Positive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Power' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Remainder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Rshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Subtract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_ToBase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_TrueDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyNumber_Xor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODict_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODict_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODict_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_AfterFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_AfterFork_Child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_AfterFork_Parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_BeforeFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_FSPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_InterruptOccurred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_Readline' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_double_to_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_getsig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_mystricmp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_mystrnicmp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_setsig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_snprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_string_to_double' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_strtol' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_strtoul' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_vsnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_ASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_AsCharBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_AsFileDescriptor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_AsReadBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_AsWriteBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallFinalizer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallFinalizerFromDealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallFunctionObjArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallMethodObjArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallNoArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CallOneArg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Calloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CheckBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CheckReadBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_ClearWeakRefs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_CopyData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_DelItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Dir' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GC_Del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GC_IsFinalized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GC_IsTracked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GC_Track' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GC_UnTrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GET_WEAKREFS_LISTPTR' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GenericGetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GenericGetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GenericSetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GenericSetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetAIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetArenaAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetItemData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_GetTypeData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_HasAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_HasAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Hash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_HashNotImplemented' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_IS_GC' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_InitVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_IsInstance' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_IsSubclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_IsTrue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_LengthHint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Not' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Realloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Repr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_RichCompare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_RichCompareBool' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_SelfIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_SetArenaAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_SetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_SetAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Str' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_Vectorcall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_VectorcallDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyObject_VectorcallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPickleBuffer_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPickleBuffer_GetBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPickleBuffer_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPreConfig_InitIsolatedConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPreConfig_InitPythonConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_AnyFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_AnyFileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_AnyFileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_AnyFileFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_File' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_FileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_FileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_FileFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_InteractiveLoop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_InteractiveLoopFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_InteractiveOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_InteractiveOneFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_InteractiveOneObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_SimpleFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_SimpleFileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_SimpleFileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_SimpleString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_SimpleStringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRun_StringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySeqIter_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Count' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_DelSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Fast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_In' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_InPlaceConcat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_InPlaceRepeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_List' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Repeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_SetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySequence_Tuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Discard' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_AdjustIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_GetIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_GetIndicesEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_Unpack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyState_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyState_FindModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyState_RemoveModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStaticMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_Error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_Exception' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_IsError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_IsExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_NoMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStatus_Ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_InitType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_InitType2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_NewType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySymtable_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_AddAuditHook' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_AddWarnOption' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_AddWarnOptionUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_AddXOption' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_Audit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_FormatStderr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_FormatStdout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_GetXOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_HasWarnOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_ResetWarnOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_SetArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_SetArgvEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_SetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_SetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_WriteStderr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySys_WriteStdout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_Delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_DeleteCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_EnterTracing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_GetFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_GetID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_GetInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_LeaveTracing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_SetAsyncExc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThreadState_Swap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_ReInitTLS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_acquire_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_acquire_lock_timed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_allocate_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_create_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_delete_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_delete_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_exit_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_free_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_get_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_get_stacksize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_get_thread_ident' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_get_thread_native_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_init_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_release_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_set_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_set_stacksize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_start_new_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_is_created' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyThread_tss_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTraceBack_Here' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTraceBack_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTraceMalloc_Track' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTraceMalloc_Untrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_Pack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_ClearCache' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_FromMetaclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_FromModuleAndSpec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_FromSpec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_FromSpecWithBases' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GenericAlloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GenericNew' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetModuleByDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetModuleState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetSlot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_GetTypeDataSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_IsSubtype' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_Modified' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_Ready' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_SUPPORTS_WEAKREFS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_Unwatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_Watch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_Create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_GetEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeDecodeError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_GetEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeEncodeError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeTranslateError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AppendAndDel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsCharmapString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsDecodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsDecodedUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsEncodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsEncodedString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsEncodedUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsLatin1String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsRawUnicodeEscapeString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUCS4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUCS4Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUTF16String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUTF32String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUTF8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUTF8AndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUTF8String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsUnicodeEscapeString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsWideChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_AsWideCharString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_BuildEncodingMap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Compare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_CompareWithASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_CopyCharacters' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Count' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Decode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeCharmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeFSDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeFSDefaultAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeLatin1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeLocaleAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeRawUnicodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF16Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF32Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF7' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF7Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUTF8Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_DecodeUnicodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_EncodeFSDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_EncodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FSConverter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FSDecoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Fill' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FindChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromEncodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromFormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromKindAndData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromOrdinal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_FromWideChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_GetDefaultEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_GetLength' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_GetSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_InternFromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_InternImmortal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_InternInPlace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_IsIdentifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Join' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Partition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_RPartition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_RSplit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_ReadChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_RichCompare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Split' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Splitlines' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Substring' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Tailmatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Translate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_WriteChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Code_GetExtra' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Code_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Code_NewWithPosOnlyArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Code_SetExtra' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Eval_RequestCodeExtraIndex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Exc_PrepReraiseStar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_GC_VisitObjects' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_InterpreterFrame_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_InterpreterFrame_GetLasti' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_InterpreterFrame_GetLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Long_CompactValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Long_IsCompact' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Object_GC_NewWithExtraData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_PerfMapState_Fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_PerfMapState_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_Type_AssignVersionTag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnstable_WritePerfMapEntry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyVectorcall_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyVectorcall_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyVectorcall_NARGS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWeakref_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWeakref_NewProxy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWeakref_NewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWideStringList_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWideStringList_Insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWrapper_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_AddPendingCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_AtExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_BuildValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_BytesMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_CompileString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_CompileStringExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_CompileStringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_CompileStringObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_DecRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_DecodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_EncodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_EndInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_EnterRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_ExitStatusException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FatalError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FdIsInteractive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Finalize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FinalizeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FrozenMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GETENV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GenericAlias' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetArgcArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetBuildInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetCompiler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetCopyright' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetExecPrefix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetPlatform' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetPrefix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetProgramFullPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetProgramName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetPythonHome' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetRecursionLimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GetVersion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IncRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_InitializeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_InitializeFromConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Is' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IsFalse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IsInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IsNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IsTrue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_LeaveRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_MakePendingCalls' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_NewInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_NewInterpreterFromConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_NewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_PreInitialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_PreInitializeFromArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_PreInitializeFromBytesArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_ReprEnter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_ReprLeave' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_RunMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_SetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_SetProgramName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_SetPythonHome' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_SetRecursionLimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_SetStandardStreamEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_UniversalNewlineFgets' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_VaBuildValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_XNewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyAST_Compile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArena_AddPyObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArena_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArena_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArena_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_BadArgument' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_CheckPositional' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_NoKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_NoKwnames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_NoPositional' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseStack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseStackAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseStackAndKeywords_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseStack_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseTupleAndKeywordsFast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseTupleAndKeywordsFast_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseTupleAndKeywords_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_ParseTuple_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_Parse_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_UnpackKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_UnpackKeywordsWithVararg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_UnpackStack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_VaParseTupleAndKeywordsFast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_VaParseTupleAndKeywordsFast_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_VaParseTupleAndKeywords_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArg_VaParse_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyArgv_AsWstrList' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Finish' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Prepare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytesWriter_WriteBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_DecodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_Find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_FormatEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_FromHex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_Join' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_Repeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBytes_ReverseFind' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCode_CheckLineNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCode_ConstantKey' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCode_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCode_Validate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodecInfo_GetIncrementalDecoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodecInfo_GetIncrementalEncoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodec_DecodeText' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodec_EncodeText' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodec_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCodec_LookupTextEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCompile_Assemble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCompile_CodeGen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCompile_OptimizeCfg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyConfig_AsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyConfig_FromDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyConfig_InitCompatConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyContext_NewHamtForTests' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_InitWithSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_NewObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_RegisterClass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCrossInterpreterData_UnregisterClass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDeadline_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDeadline_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDebugAllocatorStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDictView_Intersect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDictView_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_CheckConsistency' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_ContainsId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_Contains_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_DelItemId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_DelItemIf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_DelItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_GetItemIdWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_GetItemStringWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_GetItemWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_GetItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_HasOnlyStringKeys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_MaybeUntrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_MergeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_NewPresized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_Pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_SetItemId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_SetItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyDict_SizeOf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_BadInternalCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_ChainExceptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_ChainExceptions1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_ChainStackItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_CheckSignals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_CheckSignalsTstate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Display' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_DisplayException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_ExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Fetch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_FormatFromCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_FormatFromCauseTstate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_GetExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_GetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_GetTopmostException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_NoMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_NormalizeException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_ProgramDecodedTextObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_Restore' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetFromPyStatus' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetKeyError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_StackItemToExcInfoTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyErr_WriteUnraisableMsg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_AddPendingCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_EvalFrameDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_GetBuiltin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_GetBuiltinId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_GetSwitchInterval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_MakePendingCalls' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SetProfile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SetSwitchInterval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SetTrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SignalAsyncExc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SignalReceived' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SliceIndex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyEval_SliceIndexNotNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyExc_CreateExceptionGroup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyExc_PrepReraiseStar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyException_AddNote' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyFloat_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyFloat_FormatAdvancedWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyFrame_IsEntryFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyFunction_Vectorcall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyGILState_GetInterpreterStateUnsafe' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyGen_FetchStopIterationValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyGen_Finalize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyGen_SetStopIterationValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_AcquireLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_CheckSubinterpIncompatibleExtensionAllowed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_ClearExtension' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_FixupBuiltin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_FixupExtensionObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_GetModuleAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_GetModuleAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_GetModuleId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_IsInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_ReleaseLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_SetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_SetModuleString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterID_LookUp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterID_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_Enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_GetConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_GetConfigCopy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_GetEvalFrameFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_GetIDObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_GetMainModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_HasFeature' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_IDDecref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_IDIncref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_IDInitref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_LookUpID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_RequireIDRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_RequiresIDRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_SetConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterState_SetEvalFrameFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyList_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyList_Extend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_AsByteArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_AsInt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_AsTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_DivmodNear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FileDescriptor_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FormatAdvancedWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FormatBytesWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FormatWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Frexp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromByteArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromDigits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromGid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_FromUid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_GCD' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Lshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_NumBits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Rshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Sign' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_Size_t_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_UnsignedInt_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_UnsignedLongLong_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_UnsignedLong_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_UnsignedShort_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_GetAllocatorName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_GetCurrentAllocatorName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_RawStrdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_RawWcsdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_SetDefaultAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_SetupAllocators' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMem_Strdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyModuleSpec_IsInitializing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyModule_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyModule_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyModule_ClearDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyModule_CreateInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyNamespace_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyNumber_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyOS_InterruptOccurred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyOS_IsMainThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyOS_URandom' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyOS_URandomNonblock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_AssertFailed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallFunction_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallMethodId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallMethodIdObjArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallMethodId_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CallMethod_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_Call_Prepend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CheckConsistency' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_CheckCrossInterpreterData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_ClearManagedDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_DebugTypeStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_Dump' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_FastCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_FastCallDictTstate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_FunctionStr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GC_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GC_NewVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GC_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GenericGetAttrWithDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GenericSetAttrWithDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GetAttrId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GetCrossInterpreterData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GetDictPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GetMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_GetState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_HasLen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_IsAbstract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_IsFreed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_LookupAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_LookupAttrId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_LookupSpecial' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_LookupSpecialId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_MakeTpCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_NewVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_NextNotImplemented' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_RealIsInstance' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_RealIsSubclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_SetAttrId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyObject_VisitManagedDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyPathConfig_ClearGlobal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyPreConfig_InitCompatConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRun_AnyFileObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRun_InteractiveLoopObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRun_SimpleFileObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntimeState_Fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntimeState_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntime_Finalize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntime_Initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySequence_BytesToCharpArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySequence_IterSearch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySet_NextEntry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySet_Update' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySlice_FromIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySlice_GetLongIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyStack_AsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyState_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyStructSequence_NewType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySys_GetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySys_GetSizeOf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_Bind' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_DeleteCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_DeleteExcept' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_GetCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_Prealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_Swap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThreadState_UncheckedGet' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThread_CurrentExceptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThread_CurrentFrames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyThread_at_fork_reinit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsMicroseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsMilliseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsNanoseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsNanosecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsSecondsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsTimespec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsTimespec_clamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsTimeval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsTimevalTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_AsTimeval_clamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromMicrosecondsClamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromMillisecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromNanoseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromNanosecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromSeconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromSecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromTimespec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_FromTimeval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetMonotonicClock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetMonotonicClockWithInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetPerfCounter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetPerfCounterWithInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetSystemClock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_GetSystemClockWithInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_MulDiv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_ObjectToTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_ObjectToTimespec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_ObjectToTimeval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_gmtime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTime_localtime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyToken_OneChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyToken_ThreeChars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyToken_TwoChars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceBack_FromFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceBack_Print_Indented' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_ClearTraces' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetObjectTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetTracebackLimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetTracedMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_GetTraces' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_IsTracing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_ResetPeak' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_Start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceMalloc_Stop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTraceback_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTrash_begin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTrash_cond' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTrash_end' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTuple_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTuple_MaybeUntrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyTuple_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_CalculateMetaclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_CheckConsistency' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_GetDocFromInternalDoc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_GetTextSignatureFromInternalDoc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_LookupId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyType_Name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeTranslateError_Create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_Finish' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_PrepareInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_PrepareKindInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_WriteASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_WriteChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_WriteLatin1String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_WriteStr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicodeWriter_WriteSubstring' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_AsASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_AsLatin1String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_AsUTF8String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_CheckConsistency' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_DecodeRawUnicodeEscapeStateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_DecodeUnicodeEscapeInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_DecodeUnicodeEscapeStateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EQ' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EncodeCharmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EncodeUTF16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EncodeUTF32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EncodeUTF7' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_Equal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EqualToASCIIId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_EqualToASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FastCopyCharacters' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FastFill' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FindMaxChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FormatAdvancedWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FormatLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FromASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_FromId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_InsertThousandsGrouping' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsAlpha' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsCaseIgnorable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsCased' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsDecimalDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsLinebreak' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsLowercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsNumeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsPrintable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsTitlecase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsUppercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsWhitespace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsXidContinue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_IsXidStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_JoinArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ScanIdentifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToDecimalDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToFoldedFull' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToLowerFull' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToLowercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToNumeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToTitleFull' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToTitlecase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToUpperFull' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_ToUppercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_TransformDecimalAndSpaceToASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_WideCharString_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_WideCharString_Opt_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyUnicode_XStrip' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWarnings_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWeakref_ClearRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWeakref_GetWeakrefCount' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWideStringList_AsList' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWideStringList_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWideStringList_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWideStringList_Extend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_AtExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_BreakPoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_BuildValue_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_CheckFunctionResult' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_CheckRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ClearArgcArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ClearStandardStreamEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_CoerceLegacyLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DecRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DecodeLocaleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DecodeUTF8Ex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DecodeUTF8_surrogateescape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DisplaySourceLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpDecimal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpExtensionModules' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpHexadecimal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_DumpTracebackThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_EncodeLocaleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_EncodeLocaleRaw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_EncodeUTF8Ex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FatalErrorFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FatalErrorFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FatalRefcountErrorFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FdIsInteractive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FreeCharPArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetConfigsAsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetEnv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetErrorHandler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetForceASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetLocaleEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetLocaleEncodingObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_GetLocaleconvNumeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_Get_Getpath_CodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_Gid_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HandleSystemExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HashBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HashDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HashPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HashPointerRaw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_IncRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_InitializeMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_IsCoreInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_IsFinalizing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_IsInterpreterFinalizing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_IsLocaleCoercionTarget' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_LegacyLocaleDetected' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_NewReference' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_NewReferenceNoTotal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_PreInitializeFromConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_PreInitializeFromPyArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ResetForceASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_RestoreSignals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_SetLocaleFromEnv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_SetProgramFullPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_Sigset_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_SourceAsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_UTF8_Edit_Cost' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_Uid_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_UniversalNewlineFgetsWithSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_VaBuildStack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_VaBuildStack_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_VaBuildValue_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_WriteIndent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_WriteIndentedMargin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_add_one_to_index_C' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_add_one_to_index_F' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_abs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_diff' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_neg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_pow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_prod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_quot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_c_sum' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_closerange' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_convert_optional_to_ssize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_device_encoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_dg_dtoa' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_dg_freedtoa' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_dg_strtod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_dup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_fopen_obj' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_fstat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_fstat_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_get_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_get_env_flag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_get_inheritable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_get_xoption' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_gitidentifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_gitversion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_compare_direct' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_foreach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_hash_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_new_full' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_hashtable_steal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_normpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_open_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_parse_inf_or_nan' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_set_blocking' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_set_inheritable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_set_inheritable_async_safe' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_stat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_str_to_int' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_strhex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_strhex_bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_strhex_bytes_with_sep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_strhex_with_sep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_string_to_number_with_underscores' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_wfopen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_wgetcwd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_wreadlink' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_wrealpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_write' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_write_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - </elf-function-symbols> - <elf-variable-symbols> - <elf-symbol name='PyAsyncGen_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBaseObject_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBool_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArrayIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyByteArray_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytesIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyBytes_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCFunction_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCallIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCapsule_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCell_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyClassMethodDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyClassMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCode_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyComplex_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextToken_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContextVar_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyContext_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyCoro_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictItems_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictIterItem_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictIterKey_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictIterValue_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictKeys_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictProxy_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictRevIterItem_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictRevIterKey_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictRevIterValue_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDictValues_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyDict_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEllipsis_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyEnum_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ArithmeticError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_AssertionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_AttributeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BaseException' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BaseExceptionGroup' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BlockingIOError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BrokenPipeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BufferError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_BytesWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ChildProcessError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ConnectionAbortedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ConnectionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ConnectionRefusedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ConnectionResetError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_DeprecationWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_EOFError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_EncodingWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_EnvironmentError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_Exception' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_FileExistsError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_FileNotFoundError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_FloatingPointError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_FutureWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_GeneratorExit' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_IOError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ImportError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ImportWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_IndentationError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_IndexError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_InterruptedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_IsADirectoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_KeyError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_KeyboardInterrupt' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_LookupError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_MemoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ModuleNotFoundError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_NameError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_NotADirectoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_NotImplementedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_OSError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_OverflowError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_PendingDeprecationWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_PermissionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ProcessLookupError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_RecursionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ReferenceError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ResourceWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_RuntimeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_RuntimeWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_StopAsyncIteration' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_StopIteration' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_SyntaxError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_SyntaxWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_SystemError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_SystemExit' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_TabError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_TimeoutError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_TypeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnboundLocalError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnicodeDecodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnicodeEncodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnicodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnicodeTranslateError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UnicodeWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_UserWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ValueError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_Warning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyExc_ZeroDivisionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFilter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFloat_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrame_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFrozenSet_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyFunction_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGen_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyGetSetDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_FrozenModules' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyImport_Inittab' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyInstanceMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyListIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyListRevIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyList_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLongRangeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyLong_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMap_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemberDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMemoryView_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMethodDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModuleDef_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyModule_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODictItems_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODictIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODictKeys_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODictValues_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyODict_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_InputHook' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyOS_ReadlineFunctionPointer' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyPickleBuffer_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyProperty_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRangeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyRange_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyReversed_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySeqIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySetIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySet_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySlice_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStaticMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStdPrinter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyStructSequence_UnnamedField' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PySuper_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTraceBack_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTupleIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyTuple_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyType_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicodeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyUnicode_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyWrapperDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='PyZip_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_BytesWarningFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_DebugFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_DontWriteBytecodeFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FileSystemDefaultEncodeErrors' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FileSystemDefaultEncoding' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_FrozenFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_GenericAliasType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_HasFileSystemDefaultEncoding' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_HashRandomizationFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IgnoreEnvironmentFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_InspectFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_InteractiveFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_IsolatedFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_NoSiteFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_NoUserSiteDirectory' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_OptimizeFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_QuietFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_UTF8Mode' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_UnbufferedStdioFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_VerboseFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_Version' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='Py_hexdigits' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyAsyncGenASend_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyAsyncGenAThrow_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyAsyncGenWrappedValue_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyBufferWrapper_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyByteArray_empty_string' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyCoroWrapper_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_FrozenBootstrap' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_FrozenStdlib' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyImport_FrozenTest' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyInterpreterID_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyLong_DigitValue' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyManagedBuffer_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyMethodWrapper_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyNamespace_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyNone_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyNotImplemented_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyOS_ReadlineTState' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyParser_TokenNames' size='552' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyRuntime' size='459888' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PySet_Dummy' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWeakref_CallableProxyType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWeakref_ProxyType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_PyWeakref_RefType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_EllipsisObject' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_FalseStruct' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HasFileSystemDefaultEncodeErrors' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_HashSecret' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_NoneStruct' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_NotImplementedStruct' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_SwappedOp' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_TrueStruct' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ascii_whitespace' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ctype_table' size='1024' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ctype_tolower' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - <elf-symbol name='_Py_ctype_toupper' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> - </elf-variable-symbols> - <abi-instr address-size='64' path='./Modules/_abc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyType_GetMRO' filepath='./Include/internal/pycore_typeobject.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyType_GetSubclasses' filepath='./Include/internal/pycore_typeobject.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/_iomodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyIO_Module' type-id='type-id-3' visibility='default' filepath='./Modules/_io/_iomodule.h' line='143' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/bufferedio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='_PyIO_State' type-id='type-id-4' filepath='./Modules/_io/_iomodule.h' line='35' column='1' id='type-id-5'/> - <typedef-decl name='Py_off_t' type-id='type-id-6' filepath='./Modules/_io/_iomodule.h' line='109' column='1' id='type-id-7'/> - <class-decl name='_io_state' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Modules/_io/_iomodule.h' line='145' column='1' id='type-id-4'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-8' visibility='default' filepath='./Modules/_io/_iomodule.h' line='146' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='unsupported_operation' type-id='type-id-2' visibility='default' filepath='./Modules/_io/_iomodule.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='PyIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='PyIncrementalNewlineDecoder_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='PyRawIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='PyBufferedIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='PyBufferedRWPair_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='PyBufferedRandom_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='PyBufferedReader_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='PyBufferedWriter_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='PyBytesIOBuffer_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='PyBytesIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='PyFileIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='PyStringIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='PyTextIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='PyTextIOWrapper_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='163' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='off_t' type-id='type-id-9' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='87' column='1' id='type-id-6'/> - <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-10'/> - <var-decl name='bufferediobase_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='12' column='1'/> - <var-decl name='bufferedrandom_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='13' column='1'/> - <var-decl name='bufferedreader_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='14' column='1'/> - <var-decl name='bufferedrwpair_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='15' column='1'/> - <var-decl name='bufferedwriter_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='16' column='1'/> - <function-decl name='_PyIOBase_check_readable' filepath='./Modules/_io/_iomodule.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-10'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyIOBase_check_writable' filepath='./Modules/_io/_iomodule.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-10'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyIOBase_check_seekable' filepath='./Modules/_io/_iomodule.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-10'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyFileIO_closed' filepath='./Modules/_io/_iomodule.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyNumber_AsOff_t' filepath='./Modules/_io/_iomodule.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-7'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/bytesio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='bytesio_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='17' column='1'/> - <var-decl name='bytesiobuf_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='18' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/fileio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='fileio_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='19' column='1'/> - <function-decl name='_PyIOBase_finalize' filepath='./Modules/_io/_iomodule.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyIOBase_cannot_pickle' filepath='./Modules/_io/_iomodule.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/iobase.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='iobase_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='20' column='1'/> - <var-decl name='rawiobase_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='22' column='1'/> - <function-decl name='_PyIO_trap_eintr' filepath='./Modules/_io/_iomodule.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/stringio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='stringio_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='23' column='1'/> - <function-decl name='_PyIncrementalNewlineDecoder_decode' filepath='./Modules/_io/_iomodule.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyIO_find_line_ending' filepath='./Modules/_io/_iomodule.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-14'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_io/textio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='nldecoder_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='21' column='1'/> - <var-decl name='textiobase_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='24' column='1'/> - <var-decl name='textiowrapper_spec' type-id='type-id-11' visibility='default' filepath='./Modules/_io/_iomodule.h' line='25' column='1'/> - <function-decl name='_PyIOBase_check_closed' filepath='./Modules/_io/_iomodule.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_localemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='gettext' filepath='/usr/include/libintl.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='dgettext' filepath='/usr/include/libintl.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='dcgettext' filepath='/usr/include/libintl.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='textdomain' filepath='/usr/include/libintl.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='bindtextdomain' filepath='/usr/include/libintl.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='bind_textdomain_codeset' filepath='/usr/include/libintl.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-16'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-19'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/_sre/sre.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='toupper' filepath='/usr/include/ctype.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/atexitmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_AtExit' mangled-name='_Py_AtExit' filepath='./Modules/atexitmodule.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_AtExit'> - <parameter type-id='type-id-20' name='interp' filepath='./Modules/atexitmodule.c' line='27' column='1'/> - <parameter type-id='type-id-21' name='func' filepath='./Modules/atexitmodule.c' line='28' column='1'/> - <parameter type-id='type-id-22' name='data' filepath='./Modules/atexitmodule.c' line='28' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/faulthandler.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <enum-decl name='__rlimit_resource' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='31' column='1' id='type-id-23'> - <underlying-type type-id='type-id-24'/> - <enumerator name='RLIMIT_CPU' value='0'/> - <enumerator name='RLIMIT_FSIZE' value='1'/> - <enumerator name='RLIMIT_DATA' value='2'/> - <enumerator name='RLIMIT_STACK' value='3'/> - <enumerator name='RLIMIT_CORE' value='4'/> - <enumerator name='__RLIMIT_RSS' value='5'/> - <enumerator name='RLIMIT_NOFILE' value='7'/> - <enumerator name='__RLIMIT_OFILE' value='7'/> - <enumerator name='RLIMIT_AS' value='9'/> - <enumerator name='__RLIMIT_NPROC' value='6'/> - <enumerator name='__RLIMIT_MEMLOCK' value='8'/> - <enumerator name='__RLIMIT_LOCKS' value='10'/> - <enumerator name='__RLIMIT_SIGPENDING' value='11'/> - <enumerator name='__RLIMIT_MSGQUEUE' value='12'/> - <enumerator name='__RLIMIT_NICE' value='13'/> - <enumerator name='__RLIMIT_RTPRIO' value='14'/> - <enumerator name='__RLIMIT_RTTIME' value='15'/> - <enumerator name='__RLIMIT_NLIMITS' value='16'/> - <enumerator name='__RLIM_NLIMITS' value='16'/> - </enum-decl> - <typedef-decl name='rlim_t' type-id='type-id-25' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='133' column='1' id='type-id-26'/> - <class-decl name='rlimit' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='139' column='1' id='type-id-27'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='rlim_cur' type-id='type-id-26' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='rlim_max' type-id='type-id-26' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='144' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__rlim64_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='158' column='1' id='type-id-25'/> - <typedef-decl name='__rlimit_resource_t' type-id='type-id-23' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='38' column='1' id='type-id-29'/> - <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-31'/> - <qualified-type-def type-id='type-id-31' restrict='yes' id='type-id-32'/> - <qualified-type-def type-id='type-id-30' const='yes' id='type-id-33'/> - <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-34'/> - <qualified-type-def type-id='type-id-34' restrict='yes' id='type-id-35'/> - <qualified-type-def type-id='type-id-27' const='yes' id='type-id-36'/> - <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-37'/> - <qualified-type-def type-id='type-id-38' const='yes' id='type-id-39'/> - <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-40'/> - <qualified-type-def type-id='type-id-40' restrict='yes' id='type-id-41'/> - <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-42'/> - <pointer-type-def type-id='type-id-38' size-in-bits='64' id='type-id-43'/> - <qualified-type-def type-id='type-id-43' restrict='yes' id='type-id-44'/> - <function-decl name='raise' filepath='/usr/include/signal.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigfillset' filepath='/usr/include/signal.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-45'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigaltstack' filepath='/usr/include/signal.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-41'/> - <parameter type-id='type-id-44'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_exit' filepath='/usr/include/unistd.h' line='624' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='sysconf' filepath='/usr/include/unistd.h' line='640' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='pthread_sigmask' filepath='/usr/include/x86_64-linux-gnu/bits/sigthread.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-35'/> - <parameter type-id='type-id-32'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getauxval' filepath='/usr/include/x86_64-linux-gnu/sys/auxv.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-28'/> - <return type-id='type-id-28'/> - </function-decl> - <type-decl name='unsigned long int' size-in-bits='64' id='type-id-28'/> - </abi-instr> - <abi-instr address-size='64' path='./Modules/getbuildinfo.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <type-decl name='char' size-in-bits='8' id='type-id-48'/> - <type-decl name='int' size-in-bits='32' id='type-id-8'/> - <type-decl name='unsigned long int' size-in-bits='64' id='type-id-28'/> - <type-decl name='variadic parameter type' id='type-id-49'/> - <typedef-decl name='size_t' type-id='type-id-28' filepath='/usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h' line='209' column='1' id='type-id-19'/> - <pointer-type-def type-id='type-id-48' size-in-bits='64' id='type-id-15'/> - <qualified-type-def type-id='type-id-48' const='yes' id='type-id-50'/> - <pointer-type-def type-id='type-id-50' size-in-bits='64' id='type-id-12'/> - <function-decl name='PyOS_snprintf' mangled-name='PyOS_snprintf' filepath='./Include/pyerrors.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_snprintf'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_GetBuildInfo' mangled-name='Py_GetBuildInfo' filepath='./Modules/getbuildinfo.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetBuildInfo'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_Py_gitversion' mangled-name='_Py_gitversion' filepath='./Modules/getbuildinfo.c' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_gitversion'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_Py_gitidentifier' mangled-name='_Py_gitidentifier' filepath='./Modules/getbuildinfo.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_gitidentifier'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='strcmp' filepath='/usr/include/string.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/getpath.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_wstat' filepath='./Include/internal/pycore_fileutils.h' line='210' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-51'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_join_relfile' filepath='./Include/internal/pycore_fileutils.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-16'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_add_relfile' filepath='./Include/internal/pycore_fileutils.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-52'/> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPathConfig_ReadGlobal' filepath='./Include/internal/pycore_pathconfig.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPathConfig_GetGlobalModuleSearchPath' filepath='./Include/internal/pycore_pathconfig.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-16'/> - </function-decl> - <function-decl name='_Py_Get_Getpath_CodeObject' mangled-name='_Py_Get_Getpath_CodeObject' filepath='./Modules/getpath.c' line='791' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Get_Getpath_CodeObject'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/posixmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1024' id='type-id-56'> - <subrange length='16' type-id='type-id-28' id='type-id-57'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-58' size-in-bits='256' id='type-id-59'> - <subrange length='32' type-id='type-id-28' id='type-id-60'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='2048' id='type-id-61'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='520' id='type-id-63'> - <subrange length='65' type-id='type-id-28' id='type-id-64'/> - </array-type-def> - <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-65'/> - <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-66'/> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='512' id='type-id-67'> - <subrange length='16' type-id='type-id-28' id='type-id-57'/> - </array-type-def> - <typedef-decl name='DIR' type-id='type-id-65' filepath='/usr/include/dirent.h' line='127' column='1' id='type-id-68'/> - <class-decl name='posix_spawnattr_t' size-in-bits='2688' is-struct='yes' naming-typedef-id='type-id-69' visibility='default' filepath='/usr/include/spawn.h' line='29' column='1' id='type-id-70'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__flags' type-id='type-id-71' visibility='default' filepath='/usr/include/spawn.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__pgrp' type-id='type-id-72' visibility='default' filepath='/usr/include/spawn.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__sd' type-id='type-id-73' visibility='default' filepath='/usr/include/spawn.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='__ss' type-id='type-id-73' visibility='default' filepath='/usr/include/spawn.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='__sp' type-id='type-id-74' visibility='default' filepath='/usr/include/spawn.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2144'> - <var-decl name='__policy' type-id='type-id-8' visibility='default' filepath='/usr/include/spawn.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='__pad' type-id='type-id-67' visibility='default' filepath='/usr/include/spawn.h' line='37' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='posix_spawnattr_t' type-id='type-id-70' filepath='/usr/include/spawn.h' line='38' column='1' id='type-id-69'/> - <class-decl name='posix_spawn_file_actions_t' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-75' visibility='default' filepath='/usr/include/spawn.h' line='43' column='1' id='type-id-76'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__allocated' type-id='type-id-8' visibility='default' filepath='/usr/include/spawn.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__used' type-id='type-id-8' visibility='default' filepath='/usr/include/spawn.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__actions' type-id='type-id-77' visibility='default' filepath='/usr/include/spawn.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='__pad' type-id='type-id-67' visibility='default' filepath='/usr/include/spawn.h' line='48' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='posix_spawn_file_actions_t' type-id='type-id-76' filepath='/usr/include/spawn.h' line='49' column='1' id='type-id-75'/> - <typedef-decl name='__compar_fn_t' type-id='type-id-78' filepath='/usr/include/stdlib.h' line='816' column='1' id='type-id-79'/> - <typedef-decl name='__cpu_mask' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='32' column='1' id='type-id-55'/> - <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-80' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='39' column='1' id='type-id-81'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__bits' type-id='type-id-56' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='41' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='cpu_set_t' type-id='type-id-81' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='42' column='1' id='type-id-80'/> - <class-decl name='dirent' size-in-bits='2240' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='22' column='1' id='type-id-82'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='d_ino' type-id='type-id-83' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='d_off' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='d_reclen' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='144'> - <var-decl name='d_type' type-id='type-id-85' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='152'> - <var-decl name='d_name' type-id='type-id-61' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='33' column='1'/> - </data-member> - </class-decl> - <class-decl name='winsize' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='27' column='1' id='type-id-86'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ws_row' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='16'> - <var-decl name='ws_col' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ws_xpixel' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48'> - <var-decl name='ws_ypixel' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='32' column='1'/> - </data-member> - </class-decl> - <enum-decl name='__priority_which' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='187' column='1' id='type-id-87'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PRIO_PROCESS' value='0'/> - <enumerator name='PRIO_PGRP' value='1'/> - <enumerator name='PRIO_USER' value='2'/> - </enum-decl> - <class-decl name='statvfs' size-in-bits='896' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='29' column='1' id='type-id-88'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='f_bsize' type-id='type-id-28' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='f_frsize' type-id='type-id-28' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_blocks' type-id='type-id-89' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_bfree' type-id='type-id-89' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='f_bavail' type-id='type-id-89' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='f_files' type-id='type-id-90' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='f_ffree' type-id='type-id-90' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='f_favail' type-id='type-id-90' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='f_fsid' type-id='type-id-28' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='f_flag' type-id='type-id-28' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='f_namemax' type-id='type-id-28' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='__f_spare' type-id='type-id-91' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='54' column='1'/> - </data-member> - </class-decl> - <class-decl name='termios' size-in-bits='480' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='24' column='1' id='type-id-92'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='c_iflag' type-id='type-id-93' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='c_oflag' type-id='type-id-93' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='c_cflag' type-id='type-id-93' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='c_lflag' type-id='type-id-93' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='c_line' type-id='type-id-58' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='136'> - <var-decl name='c_cc' type-id='type-id-59' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='c_ispeed' type-id='type-id-94' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='c_ospeed' type-id='type-id-94' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='33' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='cc_t' type-id='type-id-85' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='23' column='1' id='type-id-58'/> - <typedef-decl name='speed_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='24' column='1' id='type-id-94'/> - <typedef-decl name='tcflag_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='25' column='1' id='type-id-93'/> - <typedef-decl name='__id_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='159' column='1' id='type-id-96'/> - <typedef-decl name='__fsblkcnt64_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='185' column='1' id='type-id-89'/> - <typedef-decl name='__fsfilcnt64_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='189' column='1' id='type-id-90'/> - <typedef-decl name='clock_t' type-id='type-id-97' filepath='/usr/include/x86_64-linux-gnu/bits/types/clock_t.h' line='7' column='1' id='type-id-98'/> - <class-decl name='iovec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='26' column='1' id='type-id-99'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='iov_base' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='iov_len' type-id='type-id-19' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='29' column='1'/> - </data-member> - </class-decl> - <class-decl name='rusage' size-in-bits='1152' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='33' column='1' id='type-id-100'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ru_utime' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ru_stime' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='' type-id='type-id-102' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='' type-id='type-id-103' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='' type-id='type-id-104' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='' type-id='type-id-105' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='' type-id='type-id-106' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='' type-id='type-id-107' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='' type-id='type-id-108' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='' type-id='type-id-109' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='' type-id='type-id-110' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='' type-id='type-id-111' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='' type-id='type-id-112' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='' type-id='type-id-113' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='' type-id='type-id-114' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='' type-id='type-id-115' visibility='default'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='40' column='1' id='type-id-102'> - <data-member access='public'> - <var-decl name='ru_maxrss' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='42' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_maxrss_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='43' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='47' column='1' id='type-id-103'> - <data-member access='public'> - <var-decl name='ru_ixrss' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='49' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_ixrss_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='50' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='53' column='1' id='type-id-104'> - <data-member access='public'> - <var-decl name='ru_idrss' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='55' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_idrss_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='56' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='59' column='1' id='type-id-105'> - <data-member access='public'> - <var-decl name='ru_isrss' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='61' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_isrss_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='62' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='66' column='1' id='type-id-106'> - <data-member access='public'> - <var-decl name='ru_minflt' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='68' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_minflt_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='69' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='72' column='1' id='type-id-107'> - <data-member access='public'> - <var-decl name='ru_majflt' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='74' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_majflt_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='75' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='78' column='1' id='type-id-108'> - <data-member access='public'> - <var-decl name='ru_nswap' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='80' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_nswap_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='81' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='85' column='1' id='type-id-109'> - <data-member access='public'> - <var-decl name='ru_inblock' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='87' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_inblock_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='88' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='91' column='1' id='type-id-110'> - <data-member access='public'> - <var-decl name='ru_oublock' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='93' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_oublock_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='94' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='97' column='1' id='type-id-111'> - <data-member access='public'> - <var-decl name='ru_msgsnd' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='99' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_msgsnd_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='100' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__10' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='103' column='1' id='type-id-112'> - <data-member access='public'> - <var-decl name='ru_msgrcv' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='105' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_msgrcv_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='106' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='109' column='1' id='type-id-113'> - <data-member access='public'> - <var-decl name='ru_nsignals' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='111' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_nsignals_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='112' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__12' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='117' column='1' id='type-id-114'> - <data-member access='public'> - <var-decl name='ru_nvcsw' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='119' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_nvcsw_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='120' column='1'/> - </data-member> - </union-decl> - <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='124' column='1' id='type-id-115'> - <data-member access='public'> - <var-decl name='ru_nivcsw' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='126' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__ru_nivcsw_word' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='127' column='1'/> - </data-member> - </union-decl> - <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h' line='23' column='1' id='type-id-74'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sched_priority' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h' line='25' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='eventfd_t' type-id='type-id-117' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='27' column='1' id='type-id-118'/> - <typedef-decl name='__priority_which_t' type-id='type-id-87' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='40' column='1' id='type-id-119'/> - <class-decl name='tms' size-in-bits='256' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='32' column='1' id='type-id-120'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tms_utime' type-id='type-id-98' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tms_stime' type-id='type-id-98' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tms_cutime' type-id='type-id-98' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tms_cstime' type-id='type-id-98' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='38' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='gid_t' type-id='type-id-121' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='64' column='1' id='type-id-122'/> - <typedef-decl name='mode_t' type-id='type-id-123' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='69' column='1' id='type-id-124'/> - <typedef-decl name='uid_t' type-id='type-id-125' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='79' column='1' id='type-id-126'/> - <typedef-decl name='pid_t' type-id='type-id-127' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='97' column='1' id='type-id-72'/> - <typedef-decl name='id_t' type-id='type-id-96' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='103' column='1' id='type-id-128'/> - <class-decl name='utsname' size-in-bits='3120' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='48' column='1' id='type-id-129'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sysname' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='520'> - <var-decl name='nodename' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='release' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1560'> - <var-decl name='version' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2080'> - <var-decl name='machine' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2600'> - <var-decl name='domainname' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='67' column='1'/> - </data-member> - </class-decl> - <enum-decl name='idtype_t' naming-typedef-id='type-id-130' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='75' column='1' id='type-id-131'> - <underlying-type type-id='type-id-24'/> - <enumerator name='P_ALL' value='0'/> - <enumerator name='P_PID' value='1'/> - <enumerator name='P_PGID' value='2'/> - </enum-decl> - <typedef-decl name='idtype_t' type-id='type-id-131' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='79' column='1' id='type-id-130'/> - <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-132'/> - <pointer-type-def type-id='type-id-121' size-in-bits='64' id='type-id-133'/> - <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-134'/> - <pointer-type-def type-id='type-id-66' size-in-bits='64' id='type-id-77'/> - <pointer-type-def type-id='type-id-125' size-in-bits='64' id='type-id-135'/> - <qualified-type-def type-id='type-id-136' restrict='yes' id='type-id-137'/> - <qualified-type-def type-id='type-id-121' const='yes' id='type-id-138'/> - <pointer-type-def type-id='type-id-138' size-in-bits='64' id='type-id-139'/> - <qualified-type-def type-id='type-id-80' const='yes' id='type-id-140'/> - <pointer-type-def type-id='type-id-140' size-in-bits='64' id='type-id-141'/> - <qualified-type-def type-id='type-id-99' const='yes' id='type-id-142'/> - <pointer-type-def type-id='type-id-142' size-in-bits='64' id='type-id-143'/> - <qualified-type-def type-id='type-id-75' const='yes' id='type-id-144'/> - <pointer-type-def type-id='type-id-144' size-in-bits='64' id='type-id-145'/> - <qualified-type-def type-id='type-id-145' restrict='yes' id='type-id-146'/> - <qualified-type-def type-id='type-id-69' const='yes' id='type-id-147'/> - <pointer-type-def type-id='type-id-147' size-in-bits='64' id='type-id-148'/> - <qualified-type-def type-id='type-id-148' restrict='yes' id='type-id-149'/> - <qualified-type-def type-id='type-id-74' const='yes' id='type-id-150'/> - <pointer-type-def type-id='type-id-150' size-in-bits='64' id='type-id-151'/> - <qualified-type-def type-id='type-id-151' restrict='yes' id='type-id-152'/> - <qualified-type-def type-id='type-id-73' const='yes' id='type-id-153'/> - <pointer-type-def type-id='type-id-153' size-in-bits='64' id='type-id-154'/> - <qualified-type-def type-id='type-id-154' restrict='yes' id='type-id-155'/> - <qualified-type-def type-id='type-id-92' const='yes' id='type-id-156'/> - <pointer-type-def type-id='type-id-156' size-in-bits='64' id='type-id-157'/> - <qualified-type-def type-id='type-id-86' const='yes' id='type-id-158'/> - <pointer-type-def type-id='type-id-158' size-in-bits='64' id='type-id-159'/> - <pointer-type-def type-id='type-id-80' size-in-bits='64' id='type-id-160'/> - <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-161'/> - <pointer-type-def type-id='type-id-118' size-in-bits='64' id='type-id-162'/> - <pointer-type-def type-id='type-id-122' size-in-bits='64' id='type-id-163'/> - <pointer-type-def type-id='type-id-72' size-in-bits='64' id='type-id-164'/> - <qualified-type-def type-id='type-id-164' restrict='yes' id='type-id-165'/> - <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-166'/> - <qualified-type-def type-id='type-id-166' restrict='yes' id='type-id-167'/> - <pointer-type-def type-id='type-id-69' size-in-bits='64' id='type-id-168'/> - <qualified-type-def type-id='type-id-168' restrict='yes' id='type-id-169'/> - <pointer-type-def type-id='type-id-100' size-in-bits='64' id='type-id-170'/> - <pointer-type-def type-id='type-id-74' size-in-bits='64' id='type-id-171'/> - <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-172'/> - <qualified-type-def type-id='type-id-172' restrict='yes' id='type-id-173'/> - <pointer-type-def type-id='type-id-120' size-in-bits='64' id='type-id-174'/> - <pointer-type-def type-id='type-id-126' size-in-bits='64' id='type-id-175'/> - <pointer-type-def type-id='type-id-129' size-in-bits='64' id='type-id-176'/> - <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-65'/> - <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-66'/> - <function-decl name='_PyEval_ReInitThreads' filepath='./Include/internal/pycore_ceval.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPerfTrampoline_AfterFork_Child' filepath='./Include/internal/pycore_ceval.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_normpath_and_size' filepath='./Include/internal/pycore_fileutils.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-52'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_PyImport_ReInitLock' filepath='./Include/internal/pycore_import.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyInterpreterState_DeleteExceptMain' filepath='./Include/internal/pycore_pystate.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PySignal_AfterFork' filepath='./Include/internal/pycore_pystate.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyRuntimeState_ReInitThreads' filepath='./Include/internal/pycore_runtime.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyOS_BeforeFork' mangled-name='PyOS_BeforeFork' filepath='./Modules/posixmodule.c' line='585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_BeforeFork'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyOS_AfterFork_Parent' mangled-name='PyOS_AfterFork_Parent' filepath='./Modules/posixmodule.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork_Parent'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyOS_AfterFork_Child' mangled-name='PyOS_AfterFork_Child' filepath='./Modules/posixmodule.c' line='605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork_Child'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyOS_AfterFork' mangled-name='PyOS_AfterFork' filepath='./Modules/posixmodule.c' line='669' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyLong_FromUid' mangled-name='_PyLong_FromUid' filepath='./Modules/posixmodule.c' line='690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromUid'> - <parameter type-id='type-id-126' name='uid' filepath='./Modules/posixmodule.c' line='690' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_FromGid' mangled-name='_PyLong_FromGid' filepath='./Modules/posixmodule.c' line='698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromGid'> - <parameter type-id='type-id-122' name='gid' filepath='./Modules/posixmodule.c' line='698' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_Uid_Converter' mangled-name='_Py_Uid_Converter' filepath='./Modules/posixmodule.c' line='706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Uid_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='./Modules/posixmodule.c' line='706' column='1'/> - <parameter type-id='type-id-175' name='p' filepath='./Modules/posixmodule.c' line='706' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_Gid_Converter' mangled-name='_Py_Gid_Converter' filepath='./Modules/posixmodule.c' line='812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Gid_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='./Modules/posixmodule.c' line='812' column='1'/> - <parameter type-id='type-id-163' name='p' filepath='./Modules/posixmodule.c' line='812' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_Sigset_Converter' mangled-name='_Py_Sigset_Converter' filepath='./Modules/posixmodule.c' line='1475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Sigset_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='./Modules/posixmodule.c' line='1475' column='1'/> - <parameter type-id='type-id-22' name='addr' filepath='./Modules/posixmodule.c' line='1475' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='opendir' filepath='/usr/include/dirent.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-132'/> - </function-decl> - <function-decl name='fdopendir' filepath='/usr/include/dirent.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-132'/> - </function-decl> - <function-decl name='closedir' filepath='/usr/include/dirent.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-132'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='rewinddir' filepath='/usr/include/dirent.h' line='209' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-132'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='setgroups' filepath='/usr/include/grp.h' line='176' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-139'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getgrouplist' filepath='/usr/include/grp.h' line='186' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-121'/> - <parameter type-id='type-id-133'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='initgroups' filepath='/usr/include/grp.h' line='197' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='openpty' filepath='/usr/include/pty.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-157'/> - <parameter type-id='type-id-159'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='forkpty' filepath='/usr/include/pty.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-157'/> - <parameter type-id='type-id-159'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_setparam' filepath='/usr/include/sched.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-151'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_getparam' filepath='/usr/include/sched.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-171'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_setscheduler' filepath='/usr/include/sched.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-151'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_getscheduler' filepath='/usr/include/sched.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_yield' filepath='/usr/include/sched.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_get_priority_max' filepath='/usr/include/sched.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_get_priority_min' filepath='/usr/include/sched.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_rr_get_interval' filepath='/usr/include/sched.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_setaffinity' filepath='/usr/include/sched.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-141'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sched_getaffinity' filepath='/usr/include/sched.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-160'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='killpg' filepath='/usr/include/signal.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigaddset' filepath='/usr/include/signal.h' line='205' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-45'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn' filepath='/usr/include/spawn.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-165'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-146'/> - <parameter type-id='type-id-149'/> - <parameter type-id='type-id-137'/> - <parameter type-id='type-id-137'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnp' filepath='/usr/include/spawn.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-164'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-145'/> - <parameter type-id='type-id-148'/> - <parameter type-id='type-id-136'/> - <parameter type-id='type-id-136'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_init' filepath='/usr/include/spawn.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-168'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_destroy' filepath='/usr/include/spawn.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-168'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setsigdefault' filepath='/usr/include/spawn.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-169'/> - <parameter type-id='type-id-155'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setsigmask' filepath='/usr/include/spawn.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-169'/> - <parameter type-id='type-id-155'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setflags' filepath='/usr/include/spawn.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-168'/> - <parameter type-id='type-id-71'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setpgroup' filepath='/usr/include/spawn.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-168'/> - <parameter type-id='type-id-72'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setschedpolicy' filepath='/usr/include/spawn.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-168'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawnattr_setschedparam' filepath='/usr/include/spawn.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-169'/> - <parameter type-id='type-id-152'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn_file_actions_init' filepath='/usr/include/spawn.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-166'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn_file_actions_destroy' filepath='/usr/include/spawn.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-166'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn_file_actions_addopen' filepath='/usr/include/spawn.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-167'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-124'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn_file_actions_addclose' filepath='/usr/include/spawn.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-166'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='posix_spawn_file_actions_adddup2' filepath='/usr/include/spawn.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-166'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='rename' filepath='/usr/include/stdio.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='renameat' filepath='/usr/include/stdio.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='ctermid' filepath='/usr/include/stdio.h' line='837' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='atoi' filepath='/usr/include/stdlib.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='unsetenv' filepath='/usr/include/stdlib.h' line='664' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='system' filepath='/usr/include/stdlib.h' line='791' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='qsort' filepath='/usr/include/stdlib.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-79'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='getloadavg' filepath='/usr/include/stdlib.h' line='1013' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-182'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='strtok_r' filepath='/usr/include/string.h' line='366' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-184'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='access' filepath='/usr/include/unistd.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='faccessat' filepath='/usr/include/unistd.h' line='309' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pipe' filepath='/usr/include/unistd.h' line='437' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pipe2' filepath='/usr/include/unistd.h' line='442' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='chown' filepath='/usr/include/unistd.h' line='493' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fchown' filepath='/usr/include/unistd.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='lchown' filepath='/usr/include/unistd.h' line='503' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fchownat' filepath='/usr/include/unistd.h' line='511' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-121'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='chdir' filepath='/usr/include/unistd.h' line='517' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fchdir' filepath='/usr/include/unistd.h' line='521' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='dup2' filepath='/usr/include/unistd.h' line='555' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='dup3' filepath='/usr/include/unistd.h' line='560' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='execve' filepath='/usr/include/unistd.h' line='572' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-136'/> - <parameter type-id='type-id-136'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fexecve' filepath='/usr/include/unistd.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-136'/> - <parameter type-id='type-id-136'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='execv' filepath='/usr/include/unistd.h' line='584' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-136'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='nice' filepath='/usr/include/unistd.h' line='619' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pathconf' filepath='/usr/include/unistd.h' line='633' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='fpathconf' filepath='/usr/include/unistd.h' line='637' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='getppid' filepath='/usr/include/unistd.h' line='653' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='getpgrp' filepath='/usr/include/unistd.h' line='656' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='getpgid' filepath='/usr/include/unistd.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='setpgid' filepath='/usr/include/unistd.h' line='668' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-127'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setpgrp' filepath='/usr/include/unistd.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setsid' filepath='/usr/include/unistd.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='getsid' filepath='/usr/include/unistd.h' line='693' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='getuid' filepath='/usr/include/unistd.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-125'/> - </function-decl> - <function-decl name='geteuid' filepath='/usr/include/unistd.h' line='700' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-125'/> - </function-decl> - <function-decl name='getgid' filepath='/usr/include/unistd.h' line='703' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-121'/> - </function-decl> - <function-decl name='getegid' filepath='/usr/include/unistd.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-121'/> - </function-decl> - <function-decl name='getgroups' filepath='/usr/include/unistd.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-133'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setuid' filepath='/usr/include/unistd.h' line='722' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-125'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setreuid' filepath='/usr/include/unistd.h' line='727' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-125'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='seteuid' filepath='/usr/include/unistd.h' line='732' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-125'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setgid' filepath='/usr/include/unistd.h' line='739' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setregid' filepath='/usr/include/unistd.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-121'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setegid' filepath='/usr/include/unistd.h' line='749' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getresuid' filepath='/usr/include/unistd.h' line='755' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-135'/> - <parameter type-id='type-id-135'/> - <parameter type-id='type-id-135'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getresgid' filepath='/usr/include/unistd.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-133'/> - <parameter type-id='type-id-133'/> - <parameter type-id='type-id-133'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setresuid' filepath='/usr/include/unistd.h' line='765' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-125'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setresgid' filepath='/usr/include/unistd.h' line='770' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-121'/> - <parameter type-id='type-id-121'/> - <parameter type-id='type-id-121'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fork' filepath='/usr/include/unistd.h' line='778' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='ttyname_r' filepath='/usr/include/unistd.h' line='803' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='link' filepath='/usr/include/unistd.h' line='819' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='linkat' filepath='/usr/include/unistd.h' line='825' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='symlink' filepath='/usr/include/unistd.h' line='832' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='symlinkat' filepath='/usr/include/unistd.h' line='847' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='readlinkat' filepath='/usr/include/unistd.h' line='851' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='unlink' filepath='/usr/include/unistd.h' line='858' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='unlinkat' filepath='/usr/include/unistd.h' line='862' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='rmdir' filepath='/usr/include/unistd.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='tcgetpgrp' filepath='/usr/include/unistd.h' line='871' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='tcsetpgrp' filepath='/usr/include/unistd.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-127'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getlogin' filepath='/usr/include/unistd.h' line='881' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='chroot' filepath='/usr/include/unistd.h' line='977' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fsync' filepath='/usr/include/unistd.h' line='989' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sync' filepath='/usr/include/unistd.h' line='1005' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='copy_file_range' filepath='/usr/include/unistd.h' line='1142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-134'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-134'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='fdatasync' filepath='/usr/include/unistd.h' line='1150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='login_tty' filepath='/usr/include/utmp.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='__sched_cpucount' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-141'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='__sched_cpualloc' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-160'/> - </function-decl> - <function-decl name='__sched_cpufree' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-160'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='splice' filepath='/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h' line='421' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-134'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-134'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-186'/> - </function-decl> - <function-decl name='memfd_create' filepath='/usr/include/x86_64-linux-gnu/bits/mman-shared.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='unshare' filepath='/usr/include/x86_64-linux-gnu/bits/sched.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setns' filepath='/usr/include/x86_64-linux-gnu/bits/sched.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='eventfd' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-95'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='eventfd_read' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-162'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='eventfd_write' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-118'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getpriority' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-128'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setpriority' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-119'/> - <parameter type-id='type-id-128'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='chmod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='352' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fchmod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fchmodat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='371' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='umask' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='380' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-123'/> - <return type-id='type-id-123'/> - </function-decl> - <function-decl name='mkdir' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='389' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mkdirat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mknod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='404' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <parameter type-id='type-id-187'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mknodat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='411' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <parameter type-id='type-id-187'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mkfifo' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='418' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mkfifoat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='425' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-123'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='utimensat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='433' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-188'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='futimens' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-188'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='gnu_dev_major' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-187'/> - <return type-id='type-id-95'/> - </function-decl> - <function-decl name='gnu_dev_minor' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-187'/> - <return type-id='type-id-95'/> - </function-decl> - <function-decl name='gnu_dev_makedev' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-95'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-187'/> - </function-decl> - <function-decl name='times' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-174'/> - <return type-id='type-id-98'/> - </function-decl> - <function-decl name='readv' filepath='/usr/include/x86_64-linux-gnu/sys/uio.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-143'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='writev' filepath='/usr/include/x86_64-linux-gnu/sys/uio.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-143'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='uname' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-176'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='wait' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='waitpid' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='waitid' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-130'/> - <parameter type-id='type-id-96'/> - <parameter type-id='type-id-189'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='wait3' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-170'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='wait4' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-170'/> - <return type-id='type-id-127'/> - </function-decl> - <function-decl name='setxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='lsetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fsetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='lgetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='fgetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='listxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='llistxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='flistxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='removexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='lremovexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fremovexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <type-decl name='unsigned short int' size-in-bits='16' id='type-id-84'/> - <function-type size-in-bits='64' id='type-id-190'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='./Modules/pwdmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='passwd' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/pwd.h' line='49' column='1' id='type-id-191'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pw_name' type-id='type-id-15' visibility='default' filepath='/usr/include/pwd.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pw_passwd' type-id='type-id-15' visibility='default' filepath='/usr/include/pwd.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='pw_uid' type-id='type-id-125' visibility='default' filepath='/usr/include/pwd.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='pw_gid' type-id='type-id-121' visibility='default' filepath='/usr/include/pwd.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='pw_gecos' type-id='type-id-15' visibility='default' filepath='/usr/include/pwd.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pw_dir' type-id='type-id-15' visibility='default' filepath='/usr/include/pwd.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='pw_shell' type-id='type-id-15' visibility='default' filepath='/usr/include/pwd.h' line='58' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-191' size-in-bits='64' id='type-id-192'/> - <qualified-type-def type-id='type-id-192' restrict='yes' id='type-id-193'/> - <pointer-type-def type-id='type-id-192' size-in-bits='64' id='type-id-194'/> - <qualified-type-def type-id='type-id-194' restrict='yes' id='type-id-195'/> - <function-decl name='setpwent' filepath='/usr/include/pwd.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='endpwent' filepath='/usr/include/pwd.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='getpwent' filepath='/usr/include/pwd.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-192'/> - </function-decl> - <function-decl name='getpwuid_r' filepath='/usr/include/pwd.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-125'/> - <parameter type-id='type-id-193'/> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-195'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getpwnam_r' filepath='/usr/include/pwd.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-193'/> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-195'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/signalmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <enum-decl name='__itimer_which' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='114' column='1' id='type-id-196'> - <underlying-type type-id='type-id-24'/> - <enumerator name='ITIMER_REAL' value='0'/> - <enumerator name='ITIMER_VIRTUAL' value='1'/> - <enumerator name='ITIMER_PROF' value='2'/> - </enum-decl> - <class-decl name='itimerval' size-in-bits='256' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='130' column='1' id='type-id-197'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='it_interval' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='133' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='it_value' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='135' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__itimer_which_t' type-id='type-id-196' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='141' column='1' id='type-id-198'/> - <qualified-type-def type-id='type-id-197' const='yes' id='type-id-199'/> - <pointer-type-def type-id='type-id-199' size-in-bits='64' id='type-id-200'/> - <qualified-type-def type-id='type-id-200' restrict='yes' id='type-id-201'/> - <qualified-type-def type-id='type-id-179' restrict='yes' id='type-id-202'/> - <pointer-type-def type-id='type-id-197' size-in-bits='64' id='type-id-203'/> - <qualified-type-def type-id='type-id-203' restrict='yes' id='type-id-204'/> - <qualified-type-def type-id='type-id-189' restrict='yes' id='type-id-205'/> - <function-decl name='_PyErr_CheckSignals' mangled-name='_PyErr_CheckSignals' filepath='./Modules/signalmodule.c' line='1874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_CheckSignals'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_SetInterruptEx' mangled-name='PyErr_SetInterruptEx' filepath='./Modules/signalmodule.c' line='1886' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetInterruptEx'> - <parameter type-id='type-id-8' name='signum' filepath='./Modules/signalmodule.c' line='1886' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_SetInterrupt' mangled-name='PyErr_SetInterrupt' filepath='./Modules/signalmodule.c' line='1902' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetInterrupt'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_RestoreSignals' mangled-name='_Py_RestoreSignals' filepath='./Modules/signalmodule.c' line='1940' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_RestoreSignals'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyOS_InterruptOccurred' mangled-name='PyOS_InterruptOccurred' filepath='./Modules/signalmodule.c' line='2012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_InterruptOccurred'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyOS_IsMainThread' mangled-name='_PyOS_IsMainThread' filepath='./Modules/signalmodule.c' line='2045' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_IsMainThread'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigismember' filepath='/usr/include/signal.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-154'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigpending' filepath='/usr/include/signal.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-45'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigwait' filepath='/usr/include/signal.h' line='255' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-155'/> - <parameter type-id='type-id-202'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigwaitinfo' filepath='/usr/include/signal.h' line='264' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-155'/> - <parameter type-id='type-id-205'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigtimedwait' filepath='/usr/include/signal.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-155'/> - <parameter type-id='type-id-205'/> - <parameter type-id='type-id-206'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='__libc_current_sigrtmin' filepath='/usr/include/signal.h' line='383' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='__libc_current_sigrtmax' filepath='/usr/include/signal.h' line='385' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='strstr' filepath='/usr/include/string.h' line='350' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='strsignal' filepath='/usr/include/string.h' line='478' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='alarm' filepath='/usr/include/unistd.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-95'/> - <return type-id='type-id-95'/> - </function-decl> - <function-decl name='pause' filepath='/usr/include/unistd.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_kill' filepath='/usr/include/x86_64-linux-gnu/bits/sigthread.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-207'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getitimer' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-198'/> - <parameter type-id='type-id-203'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='setitimer' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-198'/> - <parameter type-id='type-id-201'/> - <parameter type-id='type-id-204'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/symtablemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_SymtableStringObjectFlags' filepath='./Include/internal/pycore_symtable.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-208'/> - <return type-id='type-id-209'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Modules/timemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <enum-decl name='__rusage_who' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='158' column='1' id='type-id-210'> - <underlying-type type-id='type-id-24'/> - <enumerator name='RUSAGE_SELF' value='0'/> - <enumerator name='RUSAGE_CHILDREN' value='-1'/> - <enumerator name='RUSAGE_THREAD' value='1'/> - </enum-decl> - <typedef-decl name='__rusage_who_t' type-id='type-id-210' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='39' column='1' id='type-id-211'/> - <pointer-type-def type-id='type-id-212' size-in-bits='64' id='type-id-213'/> - <qualified-type-def type-id='type-id-214' const='yes' id='type-id-215'/> - <pointer-type-def type-id='type-id-215' size-in-bits='64' id='type-id-216'/> - <qualified-type-def type-id='type-id-216' restrict='yes' id='type-id-217'/> - <function-decl name='pthread_getcpuclockid' filepath='/usr/include/pthread.h' line='1315' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-207'/> - <parameter type-id='type-id-213'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='clock' filepath='/usr/include/time.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-98'/> - </function-decl> - <function-decl name='time' filepath='/usr/include/time.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-218'/> - <return type-id='type-id-219'/> - </function-decl> - <function-decl name='mktime' filepath='/usr/include/time.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-220'/> - <return type-id='type-id-219'/> - </function-decl> - <function-decl name='tzset' filepath='/usr/include/time.h' line='228' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='clock_settime' filepath='/usr/include/time.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-221'/> - <parameter type-id='type-id-188'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='clock_nanosleep' filepath='/usr/include/time.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-221'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-188'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='852' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-217'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='getrusage' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-211'/> - <parameter type-id='type-id-170'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Python/dynload_shlib.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-12' size-in-bits='256' id='type-id-222'> - <subrange length='4' type-id='type-id-28' id='type-id-223'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-12' size-in-bits='infinite' id='type-id-224'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <var-decl name='_PyImport_DynLoadFiletab' type-id='type-id-224' visibility='default' filepath='./Python/importdl.h' line='9' column='1'/> - <function-decl name='dlopen' filepath='/usr/include/dlfcn.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='dlsym' filepath='/usr/include/dlfcn.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-226'/> - <parameter type-id='type-id-181'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='dlerror' filepath='/usr/include/dlfcn.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-15'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Python/getplatform.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='Py_GetPlatform' mangled-name='Py_GetPlatform' filepath='./Python/getplatform.c' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPlatform'> - <return type-id='type-id-12'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='./Python/importdl.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='dl_funcptr' type-id='type-id-227' filepath='./Python/importdl.h' line='28' column='1' id='type-id-228'/> - <function-decl name='_PyImport_SwapPackageContext' filepath='./Include/internal/pycore_import.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_PyImport_FindSharedFuncptr' filepath='./Python/importdl.c' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-229'/> - <return type-id='type-id-228'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-230'> - <return type-id='type-id-46'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='./Python/sysmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyEval_CallTracing' filepath='./Include/internal/pycore_ceval.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyEval_GetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyEval_GetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyEval_SetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_SetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_GetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_SetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPerfTrampoline_GetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-231'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyIsPerfTrampolineActive' filepath='./Include/internal/pycore_ceval.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_GetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_SetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_InitModules' filepath='./Include/internal/pycore_import.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetBuiltinModuleNames' filepath='./Include/internal/pycore_import.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_GetGlobalAllocatedBlocks' filepath='./Include/internal/pycore_obmalloc.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyPathConfig_ComputeSysPath0' filepath='./Include/internal/pycore_pathconfig.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-232'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_GetStdlibDir' filepath='./Include/internal/pycore_pylifecycle.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_PyErr_WriteUnraisableDefaultHook' filepath='./Include/internal/pycore_pylifecycle.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_InternedSize' filepath='./Include/internal/pycore_unicodeobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyThread_GetInfo' mangled-name='PyThread_GetInfo' filepath='./Include/pythread.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_GetInfo'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySys_AddAuditHook' mangled-name='PySys_AddAuditHook' filepath='./Python/sysmodule.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddAuditHook'> - <parameter type-id='type-id-234' name='hook' filepath='./Python/sysmodule.c' line='389' column='1'/> - <parameter type-id='type-id-22' name='userData' filepath='./Python/sysmodule.c' line='389' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySys_GetSizeOf' mangled-name='_PySys_GetSizeOf' filepath='./Python/sysmodule.c' line='1776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetSizeOf'> - <parameter type-id='type-id-2' name='o' filepath='./Python/sysmodule.c' line='1776' column='1'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='PyUnstable_PerfMapState_Init' mangled-name='PyUnstable_PerfMapState_Init' filepath='./Python/sysmodule.c' line='2275' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Init'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_WritePerfMapEntry' mangled-name='PyUnstable_WritePerfMapEntry' filepath='./Python/sysmodule.c' line='2306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_WritePerfMapEntry'> - <parameter type-id='type-id-22' name='code_addr' filepath='./Python/sysmodule.c' line='2307' column='1'/> - <parameter type-id='type-id-95' name='code_size' filepath='./Python/sysmodule.c' line='2308' column='1'/> - <parameter type-id='type-id-12' name='entry_name' filepath='./Python/sysmodule.c' line='2309' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySys_ResetWarnOptions' mangled-name='PySys_ResetWarnOptions' filepath='./Python/sysmodule.c' line='2615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_ResetWarnOptions'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_AddWarnOptionUnicode' mangled-name='PySys_AddWarnOptionUnicode' filepath='./Python/sysmodule.c' line='2643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOptionUnicode'> - <parameter type-id='type-id-2' name='option' filepath='./Python/sysmodule.c' line='2643' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_AddWarnOption' mangled-name='PySys_AddWarnOption' filepath='./Python/sysmodule.c' line='2655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOption'> - <parameter type-id='type-id-16' name='s' filepath='./Python/sysmodule.c' line='2655' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_HasWarnOptions' mangled-name='PySys_HasWarnOptions' filepath='./Python/sysmodule.c' line='2674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_HasWarnOptions'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySys_AddXOption' mangled-name='PySys_AddXOption' filepath='./Python/sysmodule.c' line='2753' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddXOption'> - <parameter type-id='type-id-16' name='s' filepath='./Python/sysmodule.c' line='2753' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_GetXOptions' mangled-name='PySys_GetXOptions' filepath='./Python/sysmodule.c' line='2767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetXOptions'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_CreateMonitoringObject' filepath='./Python/sysmodule.c' line='3540' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySys_SetPath' mangled-name='PySys_SetPath' filepath='./Python/sysmodule.c' line='3662' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetPath'> - <parameter type-id='type-id-16' name='path' filepath='./Python/sysmodule.c' line='3662' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_SetArgvEx' mangled-name='PySys_SetArgvEx' filepath='./Python/sysmodule.c' line='3694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetArgvEx'> - <parameter type-id='type-id-8' name='argc' filepath='./Python/sysmodule.c' line='3694' column='1'/> - <parameter type-id='type-id-235' name='argv' filepath='./Python/sysmodule.c' line='3694' column='1'/> - <parameter type-id='type-id-8' name='updatepath' filepath='./Python/sysmodule.c' line='3694' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_SetArgv' mangled-name='PySys_SetArgv' filepath='./Python/sysmodule.c' line='3738' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetArgv'> - <parameter type-id='type-id-8' name='argc' filepath='./Python/sysmodule.c' line='3738' column='1'/> - <parameter type-id='type-id-235' name='argv' filepath='./Python/sysmodule.c' line='3738' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_WriteStdout' mangled-name='PySys_WriteStdout' filepath='./Python/sysmodule.c' line='3833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStdout'> - <parameter type-id='type-id-12' name='format' filepath='./Python/sysmodule.c' line='3833' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_FormatStdout' mangled-name='PySys_FormatStdout' filepath='./Python/sysmodule.c' line='3875' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStdout'> - <parameter type-id='type-id-12' name='format' filepath='./Python/sysmodule.c' line='3875' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='getpid' filepath='/usr/include/unistd.h' line='650' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-127'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Modules/config.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyInit_atexit' mangled-name='PyInit_atexit' filepath='Modules/config.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_atexit'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_faulthandler' mangled-name='PyInit_faulthandler' filepath='Modules/config.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_faulthandler'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_posix' mangled-name='PyInit_posix' filepath='Modules/config.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_posix'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__signal' mangled-name='PyInit__signal' filepath='Modules/config.c' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__signal'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__tracemalloc' mangled-name='PyInit__tracemalloc' filepath='Modules/config.c' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__tracemalloc'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__codecs' mangled-name='PyInit__codecs' filepath='Modules/config.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__codecs'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__collections' mangled-name='PyInit__collections' filepath='Modules/config.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__collections'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_errno' mangled-name='PyInit_errno' filepath='Modules/config.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_errno'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__io' mangled-name='PyInit__io' filepath='Modules/config.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__io'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_itertools' mangled-name='PyInit_itertools' filepath='Modules/config.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_itertools'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__sre' mangled-name='PyInit__sre' filepath='Modules/config.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sre'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__thread' mangled-name='PyInit__thread' filepath='Modules/config.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__thread'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_time' mangled-name='PyInit_time' filepath='Modules/config.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_time'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__typing' mangled-name='PyInit__typing' filepath='Modules/config.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__typing'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__weakref' mangled-name='PyInit__weakref' filepath='Modules/config.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__weakref'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__abc' mangled-name='PyInit__abc' filepath='Modules/config.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__abc'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__functools' mangled-name='PyInit__functools' filepath='Modules/config.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__functools'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__locale' mangled-name='PyInit__locale' filepath='Modules/config.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__locale'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__operator' mangled-name='PyInit__operator' filepath='Modules/config.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__operator'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__stat' mangled-name='PyInit__stat' filepath='Modules/config.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__stat'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__symtable' mangled-name='PyInit__symtable' filepath='Modules/config.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__symtable'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_pwd' mangled-name='PyInit_pwd' filepath='Modules/config.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_pwd'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit_gc' mangled-name='PyInit_gc' filepath='Modules/config.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_gc'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Modules/gcmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='gcvisitobjects_t' type-id='type-id-236' filepath='./Include/objimpl.h' line='175' column='1' id='type-id-237'/> - <function-decl name='_PyTuple_ClearFreeList' filepath='./Include/internal/pycore_gc.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFloat_ClearFreeList' filepath='./Include/internal/pycore_gc.h' line='200' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyList_ClearFreeList' filepath='./Include/internal/pycore_gc.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_ClearFreeList' filepath='./Include/internal/pycore_gc.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyAsyncGen_ClearFreeLists' filepath='./Include/internal/pycore_gc.h' line='203' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyContext_ClearFreeList' filepath='./Include/internal/pycore_gc.h' line='204' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyGC_Enable' mangled-name='PyGC_Enable' filepath='Modules/gcmodule.c' line='2068' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Enable'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyGC_Disable' mangled-name='PyGC_Disable' filepath='Modules/gcmodule.c' line='2077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Disable'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyGC_IsEnabled' mangled-name='PyGC_IsEnabled' filepath='Modules/gcmodule.c' line='2086' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_IsEnabled'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_Object_GC_NewWithExtraData' mangled-name='PyUnstable_Object_GC_NewWithExtraData' filepath='Modules/gcmodule.c' line='2347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Object_GC_NewWithExtraData'> - <parameter type-id='type-id-1' name='tp' filepath='Modules/gcmodule.c' line='2347' column='1'/> - <parameter type-id='type-id-19' name='extra_size' filepath='Modules/gcmodule.c' line='2347' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GC_IsTracked' mangled-name='PyObject_GC_IsTracked' filepath='Modules/gcmodule.c' line='2401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsTracked'> - <parameter type-id='type-id-2' name='obj' filepath='Modules/gcmodule.c' line='2401' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GC_IsFinalized' mangled-name='PyObject_GC_IsFinalized' filepath='Modules/gcmodule.c' line='2410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsFinalized'> - <parameter type-id='type-id-2' name='obj' filepath='Modules/gcmodule.c' line='2410' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_GC_VisitObjects' mangled-name='PyUnstable_GC_VisitObjects' filepath='Modules/gcmodule.c' line='2419' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_GC_VisitObjects'> - <parameter type-id='type-id-237' name='callback' filepath='Modules/gcmodule.c' line='2419' column='1'/> - <parameter type-id='type-id-22' name='arg' filepath='Modules/gcmodule.c' line='2419' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-238'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Modules/main.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyImport_Fini2' filepath='./Include/internal/pycore_import.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='kill' filepath='/usr/include/signal.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-127'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_RunMain' mangled-name='Py_RunMain' filepath='Modules/main.c' line='685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_RunMain'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_Main' mangled-name='Py_Main' filepath='Modules/main.c' line='724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Main'> - <parameter type-id='type-id-8' name='argc' filepath='Modules/main.c' line='724' column='1'/> - <parameter type-id='type-id-235' name='argv' filepath='Modules/main.c' line='724' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_BytesMain' mangled-name='Py_BytesMain' filepath='Modules/main.c' line='736' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_BytesMain'> - <parameter type-id='type-id-8' name='argc' filepath='Modules/main.c' line='736' column='1'/> - <parameter type-id='type-id-239' name='argv' filepath='Modules/main.c' line='736' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/abstract.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-240' size-in-bits='64' id='type-id-241'/> - <qualified-type-def type-id='type-id-15' const='yes' id='type-id-242'/> - <pointer-type-def type-id='type-id-242' size-in-bits='64' id='type-id-136'/> - <qualified-type-def type-id='type-id-243' const='yes' id='type-id-244'/> - <pointer-type-def type-id='type-id-244' size-in-bits='64' id='type-id-245'/> - <qualified-type-def type-id='type-id-14' const='yes' id='type-id-246'/> - <pointer-type-def type-id='type-id-246' size-in-bits='64' id='type-id-247'/> - <function-decl name='PyObject_CallFunctionObjArgs' mangled-name='PyObject_CallFunctionObjArgs' filepath='./Include/abstract.h' line='215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFunctionObjArgs'> - <parameter type-id='type-id-2'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_VectorcallMethod' mangled-name='PyObject_VectorcallMethod' filepath='./Include/abstract.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VectorcallMethod'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_CallOneArg' mangled-name='PyObject_CallOneArg' filepath='./Include/cpython/abstract.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallOneArg'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyGen_FetchStopIterationValue' mangled-name='_PyGen_FetchStopIterationValue' filepath='./Include/cpython/genobject.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_FetchStopIterationValue'> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyList_Extend' mangled-name='_PyList_Extend' filepath='./Include/cpython/listobject.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_Extend'> - <parameter type-id='type-id-249'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_Copy' mangled-name='_PyLong_Copy' filepath='./Include/cpython/longintrepr.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Copy'> - <parameter type-id='type-id-241'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_FromUnicodeObject' mangled-name='PyLong_FromUnicodeObject' filepath='./Include/cpython/longobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnicodeObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_FromBytes' mangled-name='_PyLong_FromBytes' filepath='./Include/cpython/longobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromBytes'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_Format' mangled-name='_PyLong_Format' filepath='./Include/cpython/longobject.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Format'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_LookupAttr' mangled-name='_PyObject_LookupAttr' filepath='./Include/cpython/object.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupAttr'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_NextNotImplemented' mangled-name='_PyObject_NextNotImplemented' filepath='./Include/cpython/object.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_NextNotImplemented'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTuple_Resize' mangled-name='_PyTuple_Resize' filepath='./Include/cpython/tupleobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_Resize'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_New' mangled-name='PyUnicode_New' filepath='./Include/cpython/unicodeobject.h' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_New'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-250'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_Keys' mangled-name='PyDict_Keys' filepath='./Include/dictobject.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Keys'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_Values' mangled-name='PyDict_Values' filepath='./Include/dictobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Values'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_Items' mangled-name='PyDict_Items' filepath='./Include/dictobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Items'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFloat_FromString' mangled-name='PyFloat_FromString' filepath='./Include/floatobject.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_FromString'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_GenericAlias' mangled-name='Py_GenericAlias' filepath='./Include/genericaliasobject.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GenericAlias'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_CheckRecursiveCall' mangled-name='_Py_CheckRecursiveCall' filepath='./Include/internal/pycore_ceval.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckRecursiveCall'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_LookupSpecial' mangled-name='_PyObject_LookupSpecial' filepath='./Include/internal/pycore_object.h' line='411' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupSpecial'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_ExceptionMatches' mangled-name='_PyErr_ExceptionMatches' filepath='./Include/internal/pycore_pyerrors.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ExceptionMatches'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_Clear' mangled-name='_PyErr_Clear' filepath='./Include/internal/pycore_pyerrors.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Clear'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_SetString' mangled-name='_PyErr_SetString' filepath='./Include/internal/pycore_pyerrors.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetString'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_Format' mangled-name='_PyErr_Format' filepath='./Include/internal/pycore_pyerrors.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Format'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_union_args' filepath='./Include/internal/pycore_unionobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySeqIter_New' mangled-name='PySeqIter_New' filepath='./Include/iterobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySeqIter_New'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyList_New' mangled-name='PyList_New' filepath='./Include/listobject.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_New'> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyList_AsTuple' mangled-name='PyList_AsTuple' filepath='./Include/listobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_AsTuple'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_FromSsize_t' mangled-name='PyLong_FromSsize_t' filepath='./Include/longobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromSsize_t'> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_AsSsize_t' mangled-name='PyLong_AsSsize_t' filepath='./Include/longobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsSsize_t'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyLong_AsDouble' mangled-name='PyLong_AsDouble' filepath='./Include/longobject.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsDouble'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyType_IsSubtype' mangled-name='PyType_IsSubtype' filepath='./Include/object.h' line='379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_IsSubtype'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_RichCompareBool' mangled-name='PyObject_RichCompareBool' filepath='./Include/object.h' line='407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_RichCompareBool'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_IsTrue' mangled-name='PyObject_IsTrue' filepath='./Include/object.h' line='422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsTrue'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_GivenExceptionMatches' mangled-name='PyErr_GivenExceptionMatches' filepath='./Include/pyerrors.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GivenExceptionMatches'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySlice_FromIndices' mangled-name='_PySlice_FromIndices' filepath='./Include/sliceobject.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySlice_FromIndices'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyTuple_New' mangled-name='PyTuple_New' filepath='./Include/tupleobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_New'> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_WarnEx' mangled-name='PyErr_WarnEx' filepath='./Include/warnings.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnEx'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_WarnFormat' mangled-name='PyErr_WarnFormat' filepath='./Include/warnings.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnFormat'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_Type' mangled-name='PyObject_Type' filepath='Objects/abstract.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Type'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='40' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Size' mangled-name='PyObject_Size' filepath='Objects/abstract.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Size'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='53' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyObject_Length' mangled-name='PyObject_Length' filepath='Objects/abstract.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Length'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='72' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyObject_HasLen' mangled-name='_PyObject_HasLen' filepath='Objects/abstract.c' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_HasLen'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='79' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_LengthHint' mangled-name='PyObject_LengthHint' filepath='Objects/abstract.c' line='91' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_LengthHint'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='91' column='1'/> - <parameter type-id='type-id-14' name='defaultvalue' filepath='Objects/abstract.c' line='91' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyObject_GetItem' mangled-name='PyObject_GetItem' filepath='Objects/abstract.c' line='149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItem'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='149' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/abstract.c' line='149' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_SetItem' mangled-name='PyObject_SetItem' filepath='Objects/abstract.c' line='203' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetItem'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='203' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/abstract.c' line='203' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/abstract.c' line='203' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_DelItem' mangled-name='PyObject_DelItem' filepath='Objects/abstract.c' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelItem'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='237' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/abstract.c' line='237' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_DelItemString' mangled-name='PyObject_DelItemString' filepath='Objects/abstract.c' line='271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelItemString'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='271' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/abstract.c' line='271' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_CheckBuffer' mangled-name='PyObject_CheckBuffer' filepath='Objects/abstract.c' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CheckBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='291' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_CheckReadBuffer' mangled-name='PyObject_CheckReadBuffer' filepath='Objects/abstract.c' line='302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CheckReadBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='302' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_AsCharBuffer' mangled-name='PyObject_AsCharBuffer' filepath='Objects/abstract.c' line='337' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsCharBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='337' column='1'/> - <parameter type-id='type-id-252' name='buffer' filepath='Objects/abstract.c' line='338' column='1'/> - <parameter type-id='type-id-13' name='buffer_len' filepath='Objects/abstract.c' line='339' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_AsReadBuffer' mangled-name='PyObject_AsReadBuffer' filepath='Objects/abstract.c' line='344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsReadBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='344' column='1'/> - <parameter type-id='type-id-253' name='buffer' filepath='Objects/abstract.c' line='345' column='1'/> - <parameter type-id='type-id-13' name='buffer_len' filepath='Objects/abstract.c' line='346' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_AsWriteBuffer' mangled-name='PyObject_AsWriteBuffer' filepath='Objects/abstract.c' line='351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsWriteBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='351' column='1'/> - <parameter type-id='type-id-253' name='buffer' filepath='Objects/abstract.c' line='352' column='1'/> - <parameter type-id='type-id-13' name='buffer_len' filepath='Objects/abstract.c' line='353' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GetBuffer' mangled-name='PyObject_GetBuffer' filepath='Objects/abstract.c' line='380' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='380' column='1'/> - <parameter type-id='type-id-254' name='view' filepath='Objects/abstract.c' line='380' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/abstract.c' line='380' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyBuffer_IsContiguous' mangled-name='PyBuffer_IsContiguous' filepath='Objects/abstract.c' line='463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_IsContiguous'> - <parameter type-id='type-id-245' name='view' filepath='Objects/abstract.c' line='463' column='1'/> - <parameter type-id='type-id-48' name='order' filepath='Objects/abstract.c' line='463' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyBuffer_GetPointer' mangled-name='PyBuffer_GetPointer' filepath='Objects/abstract.c' line='479' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_GetPointer'> - <parameter type-id='type-id-245' name='view' filepath='Objects/abstract.c' line='479' column='1'/> - <parameter type-id='type-id-247' name='indices' filepath='Objects/abstract.c' line='479' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_Py_add_one_to_index_F' mangled-name='_Py_add_one_to_index_F' filepath='Objects/abstract.c' line='495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_add_one_to_index_F'> - <parameter type-id='type-id-8' name='nd' filepath='Objects/abstract.c' line='495' column='1'/> - <parameter type-id='type-id-13' name='index' filepath='Objects/abstract.c' line='495' column='1'/> - <parameter type-id='type-id-247' name='shape' filepath='Objects/abstract.c' line='495' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_add_one_to_index_C' mangled-name='_Py_add_one_to_index_C' filepath='Objects/abstract.c' line='511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_add_one_to_index_C'> - <parameter type-id='type-id-8' name='nd' filepath='Objects/abstract.c' line='511' column='1'/> - <parameter type-id='type-id-13' name='index' filepath='Objects/abstract.c' line='511' column='1'/> - <parameter type-id='type-id-247' name='shape' filepath='Objects/abstract.c' line='511' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyBuffer_SizeFromFormat' mangled-name='PyBuffer_SizeFromFormat' filepath='Objects/abstract.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_SizeFromFormat'> - <parameter type-id='type-id-12' name='format' filepath='Objects/abstract.c' line='527' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyBuffer_FromContiguous' mangled-name='PyBuffer_FromContiguous' filepath='Objects/abstract.c' line='562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FromContiguous'> - <parameter type-id='type-id-245' name='view' filepath='Objects/abstract.c' line='562' column='1'/> - <parameter type-id='type-id-22' name='buf' filepath='Objects/abstract.c' line='562' column='1'/> - <parameter type-id='type-id-14' name='len' filepath='Objects/abstract.c' line='562' column='1'/> - <parameter type-id='type-id-48' name='fort' filepath='Objects/abstract.c' line='562' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_CopyData' mangled-name='PyObject_CopyData' filepath='Objects/abstract.c' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CopyData'> - <parameter type-id='type-id-2' name='dest' filepath='Objects/abstract.c' line='614' column='1'/> - <parameter type-id='type-id-2' name='src' filepath='Objects/abstract.c' line='614' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyBuffer_FillContiguousStrides' mangled-name='PyBuffer_FillContiguousStrides' filepath='Objects/abstract.c' line='685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FillContiguousStrides'> - <parameter type-id='type-id-8' name='nd' filepath='Objects/abstract.c' line='685' column='1'/> - <parameter type-id='type-id-13' name='shape' filepath='Objects/abstract.c' line='685' column='1'/> - <parameter type-id='type-id-13' name='strides' filepath='Objects/abstract.c' line='686' column='1'/> - <parameter type-id='type-id-8' name='itemsize' filepath='Objects/abstract.c' line='686' column='1'/> - <parameter type-id='type-id-48' name='fort' filepath='Objects/abstract.c' line='687' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyBuffer_FillInfo' mangled-name='PyBuffer_FillInfo' filepath='Objects/abstract.c' line='709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FillInfo'> - <parameter type-id='type-id-254' name='view' filepath='Objects/abstract.c' line='709' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='709' column='1'/> - <parameter type-id='type-id-22' name='buf' filepath='Objects/abstract.c' line='709' column='1'/> - <parameter type-id='type-id-14' name='len' filepath='Objects/abstract.c' line='709' column='1'/> - <parameter type-id='type-id-8' name='readonly' filepath='Objects/abstract.c' line='710' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/abstract.c' line='710' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyBuffer_Release' mangled-name='PyBuffer_Release' filepath='Objects/abstract.c' line='746' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_Release'> - <parameter type-id='type-id-254' name='view' filepath='Objects/abstract.c' line='746' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_Format' mangled-name='PyObject_Format' filepath='Objects/abstract.c' line='761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Format'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='761' column='1'/> - <parameter type-id='type-id-2' name='format_spec' filepath='Objects/abstract.c' line='761' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Check' mangled-name='PyNumber_Check' filepath='Objects/abstract.c' line='821' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Check'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='821' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyNumber_Or' mangled-name='PyNumber_Or' filepath='Objects/abstract.c' line='1051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Or'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1051' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1051' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Xor' mangled-name='PyNumber_Xor' filepath='Objects/abstract.c' line='1052' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Xor'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1052' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1052' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_And' mangled-name='PyNumber_And' filepath='Objects/abstract.c' line='1053' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_And'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1053' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1053' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Lshift' mangled-name='PyNumber_Lshift' filepath='Objects/abstract.c' line='1054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Lshift'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1054' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1054' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Rshift' mangled-name='PyNumber_Rshift' filepath='Objects/abstract.c' line='1055' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Rshift'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1055' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1055' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Subtract' mangled-name='PyNumber_Subtract' filepath='Objects/abstract.c' line='1056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Subtract'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1056' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1056' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Divmod' mangled-name='PyNumber_Divmod' filepath='Objects/abstract.c' line='1057' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Divmod'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1057' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1057' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Add' mangled-name='PyNumber_Add' filepath='Objects/abstract.c' line='1060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Add'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1060' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1060' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Multiply' mangled-name='PyNumber_Multiply' filepath='Objects/abstract.c' line='1098' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Multiply'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1098' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1098' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_MatrixMultiply' mangled-name='PyNumber_MatrixMultiply' filepath='Objects/abstract.c' line='1117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_MatrixMultiply'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1117' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1117' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_FloorDivide' mangled-name='PyNumber_FloorDivide' filepath='Objects/abstract.c' line='1123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_FloorDivide'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1123' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1123' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_TrueDivide' mangled-name='PyNumber_TrueDivide' filepath='Objects/abstract.c' line='1129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_TrueDivide'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1129' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1129' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Remainder' mangled-name='PyNumber_Remainder' filepath='Objects/abstract.c' line='1135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Remainder'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1135' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1135' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Power' mangled-name='PyNumber_Power' filepath='Objects/abstract.c' line='1141' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Power'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1141' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1141' column='1'/> - <parameter type-id='type-id-2' name='z' filepath='Objects/abstract.c' line='1141' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceOr' mangled-name='PyNumber_InPlaceOr' filepath='Objects/abstract.c' line='1236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceOr'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1236' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1236' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceXor' mangled-name='PyNumber_InPlaceXor' filepath='Objects/abstract.c' line='1237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceXor'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1237' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1237' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceAnd' mangled-name='PyNumber_InPlaceAnd' filepath='Objects/abstract.c' line='1238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceAnd'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1238' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1238' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceLshift' mangled-name='PyNumber_InPlaceLshift' filepath='Objects/abstract.c' line='1239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceLshift'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1239' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1239' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceRshift' mangled-name='PyNumber_InPlaceRshift' filepath='Objects/abstract.c' line='1240' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceRshift'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1240' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1240' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceSubtract' mangled-name='PyNumber_InPlaceSubtract' filepath='Objects/abstract.c' line='1241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceSubtract'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1241' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1241' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceMatrixMultiply' mangled-name='PyNumber_InPlaceMatrixMultiply' filepath='Objects/abstract.c' line='1242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceMatrixMultiply'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1242' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1242' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceFloorDivide' mangled-name='PyNumber_InPlaceFloorDivide' filepath='Objects/abstract.c' line='1243' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceFloorDivide'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1243' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1243' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceTrueDivide' mangled-name='PyNumber_InPlaceTrueDivide' filepath='Objects/abstract.c' line='1244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceTrueDivide'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1244' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1244' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceRemainder' mangled-name='PyNumber_InPlaceRemainder' filepath='Objects/abstract.c' line='1245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceRemainder'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1245' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1245' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceAdd' mangled-name='PyNumber_InPlaceAdd' filepath='Objects/abstract.c' line='1248' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceAdd'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1248' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1248' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlaceMultiply' mangled-name='PyNumber_InPlaceMultiply' filepath='Objects/abstract.c' line='1271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceMultiply'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1271' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1271' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_InPlacePower' mangled-name='PyNumber_InPlacePower' filepath='Objects/abstract.c' line='1300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlacePower'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='1300' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='1300' column='1'/> - <parameter type-id='type-id-2' name='z' filepath='Objects/abstract.c' line='1300' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Negative' mangled-name='PyNumber_Negative' filepath='Objects/abstract.c' line='1316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Negative'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1316' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Positive' mangled-name='PyNumber_Positive' filepath='Objects/abstract.c' line='1333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Positive'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1333' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Invert' mangled-name='PyNumber_Invert' filepath='Objects/abstract.c' line='1350' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Invert'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1350' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Absolute' mangled-name='PyNumber_Absolute' filepath='Objects/abstract.c' line='1367' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Absolute'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1367' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyIndex_Check' mangled-name='PyIndex_Check' filepath='Objects/abstract.c' line='1385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIndex_Check'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='1385' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyNumber_Index' mangled-name='_PyNumber_Index' filepath='Objects/abstract.c' line='1397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyNumber_Index'> - <parameter type-id='type-id-2' name='item' filepath='Objects/abstract.c' line='1397' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Index' mangled-name='PyNumber_Index' filepath='Objects/abstract.c' line='1443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Index'> - <parameter type-id='type-id-2' name='item' filepath='Objects/abstract.c' line='1443' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_AsSsize_t' mangled-name='PyNumber_AsSsize_t' filepath='Objects/abstract.c' line='1455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_AsSsize_t'> - <parameter type-id='type-id-2' name='item' filepath='Objects/abstract.c' line='1455' column='1'/> - <parameter type-id='type-id-2' name='err' filepath='Objects/abstract.c' line='1455' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyNumber_Long' mangled-name='PyNumber_Long' filepath='Objects/abstract.c' line='1506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Long'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1506' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_Float' mangled-name='PyNumber_Float' filepath='Objects/abstract.c' line='1621' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Float'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1621' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyNumber_ToBase' mangled-name='PyNumber_ToBase' filepath='Objects/abstract.c' line='1682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_ToBase'> - <parameter type-id='type-id-2' name='n' filepath='Objects/abstract.c' line='1682' column='1'/> - <parameter type-id='type-id-8' name='base' filepath='Objects/abstract.c' line='1682' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_Check' mangled-name='PySequence_Check' filepath='Objects/abstract.c' line='1701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Check'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1701' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_Size' mangled-name='PySequence_Size' filepath='Objects/abstract.c' line='1710' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Size'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1710' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PySequence_Length' mangled-name='PySequence_Length' filepath='Objects/abstract.c' line='1734' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Length'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1734' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PySequence_Concat' mangled-name='PySequence_Concat' filepath='Objects/abstract.c' line='1741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Concat'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1741' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1741' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_Repeat' mangled-name='PySequence_Repeat' filepath='Objects/abstract.c' line='1767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Repeat'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1767' column='1'/> - <parameter type-id='type-id-14' name='count' filepath='Objects/abstract.c' line='1767' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_InPlaceConcat' mangled-name='PySequence_InPlaceConcat' filepath='Objects/abstract.c' line='1798' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_InPlaceConcat'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1798' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1798' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_InPlaceRepeat' mangled-name='PySequence_InPlaceRepeat' filepath='Objects/abstract.c' line='1827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_InPlaceRepeat'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1827' column='1'/> - <parameter type-id='type-id-14' name='count' filepath='Objects/abstract.c' line='1827' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_GetItem' mangled-name='PySequence_GetItem' filepath='Objects/abstract.c' line='1861' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_GetItem'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1861' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/abstract.c' line='1861' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_GetSlice' mangled-name='PySequence_GetSlice' filepath='Objects/abstract.c' line='1891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_GetSlice'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1891' column='1'/> - <parameter type-id='type-id-14' name='i1' filepath='Objects/abstract.c' line='1891' column='1'/> - <parameter type-id='type-id-14' name='i2' filepath='Objects/abstract.c' line='1891' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_SetItem' mangled-name='PySequence_SetItem' filepath='Objects/abstract.c' line='1913' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_SetItem'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1913' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/abstract.c' line='1913' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1913' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_DelItem' mangled-name='PySequence_DelItem' filepath='Objects/abstract.c' line='1946' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_DelItem'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1946' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/abstract.c' line='1946' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_SetSlice' mangled-name='PySequence_SetSlice' filepath='Objects/abstract.c' line='1979' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_SetSlice'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='1979' column='1'/> - <parameter type-id='type-id-14' name='i1' filepath='Objects/abstract.c' line='1979' column='1'/> - <parameter type-id='type-id-14' name='i2' filepath='Objects/abstract.c' line='1979' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='1979' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_DelSlice' mangled-name='PySequence_DelSlice' filepath='Objects/abstract.c' line='2002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_DelSlice'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='2002' column='1'/> - <parameter type-id='type-id-14' name='i1' filepath='Objects/abstract.c' line='2002' column='1'/> - <parameter type-id='type-id-14' name='i2' filepath='Objects/abstract.c' line='2002' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_Tuple' mangled-name='PySequence_Tuple' filepath='Objects/abstract.c' line='2025' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Tuple'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='2025' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_List' mangled-name='PySequence_List' filepath='Objects/abstract.c' line='2108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_List'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='2108' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySequence_Fast' mangled-name='PySequence_Fast' filepath='Objects/abstract.c' line='2131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Fast'> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='2131' column='1'/> - <parameter type-id='type-id-12' name='m' filepath='Objects/abstract.c' line='2131' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PySequence_IterSearch' mangled-name='_PySequence_IterSearch' filepath='Objects/abstract.c' line='2165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySequence_IterSearch'> - <parameter type-id='type-id-2' name='seq' filepath='Objects/abstract.c' line='2165' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='2165' column='1'/> - <parameter type-id='type-id-8' name='operation' filepath='Objects/abstract.c' line='2165' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PySequence_Count' mangled-name='PySequence_Count' filepath='Objects/abstract.c' line='2250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Count'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='2250' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2250' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PySequence_Contains' mangled-name='PySequence_Contains' filepath='Objects/abstract.c' line='2259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Contains'> - <parameter type-id='type-id-2' name='seq' filepath='Objects/abstract.c' line='2259' column='1'/> - <parameter type-id='type-id-2' name='ob' filepath='Objects/abstract.c' line='2259' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_In' mangled-name='PySequence_In' filepath='Objects/abstract.c' line='2274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_In'> - <parameter type-id='type-id-2' name='w' filepath='Objects/abstract.c' line='2274' column='1'/> - <parameter type-id='type-id-2' name='v' filepath='Objects/abstract.c' line='2274' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySequence_Index' mangled-name='PySequence_Index' filepath='Objects/abstract.c' line='2280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Index'> - <parameter type-id='type-id-2' name='s' filepath='Objects/abstract.c' line='2280' column='1'/> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2280' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyMapping_Check' mangled-name='PyMapping_Check' filepath='Objects/abstract.c' line='2288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Check'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2288' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMapping_Size' mangled-name='PyMapping_Size' filepath='Objects/abstract.c' line='2295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Size'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2295' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyMapping_Length' mangled-name='PyMapping_Length' filepath='Objects/abstract.c' line='2320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Length'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2320' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyMapping_GetItemString' mangled-name='PyMapping_GetItemString' filepath='Objects/abstract.c' line='2327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_GetItemString'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2327' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/abstract.c' line='2327' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMapping_SetItemString' mangled-name='PyMapping_SetItemString' filepath='Objects/abstract.c' line='2344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_SetItemString'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2344' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/abstract.c' line='2344' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/abstract.c' line='2344' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMapping_HasKeyString' mangled-name='PyMapping_HasKeyString' filepath='Objects/abstract.c' line='2363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKeyString'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2363' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/abstract.c' line='2363' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMapping_HasKey' mangled-name='PyMapping_HasKey' filepath='Objects/abstract.c' line='2377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKey'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2377' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/abstract.c' line='2377' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMapping_Keys' mangled-name='PyMapping_Keys' filepath='Objects/abstract.c' line='2423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Keys'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2423' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMapping_Items' mangled-name='PyMapping_Items' filepath='Objects/abstract.c' line='2435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Items'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2435' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMapping_Values' mangled-name='PyMapping_Values' filepath='Objects/abstract.c' line='2447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Values'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2447' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_IsInstance' mangled-name='PyObject_IsInstance' filepath='Objects/abstract.c' line='2667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsInstance'> - <parameter type-id='type-id-2' name='inst' filepath='Objects/abstract.c' line='2667' column='1'/> - <parameter type-id='type-id-2' name='cls' filepath='Objects/abstract.c' line='2667' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_IsSubclass' mangled-name='PyObject_IsSubclass' filepath='Objects/abstract.c' line='2755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsSubclass'> - <parameter type-id='type-id-2' name='derived' filepath='Objects/abstract.c' line='2755' column='1'/> - <parameter type-id='type-id-2' name='cls' filepath='Objects/abstract.c' line='2755' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_RealIsInstance' mangled-name='_PyObject_RealIsInstance' filepath='Objects/abstract.c' line='2763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_RealIsInstance'> - <parameter type-id='type-id-2' name='inst' filepath='Objects/abstract.c' line='2763' column='1'/> - <parameter type-id='type-id-2' name='cls' filepath='Objects/abstract.c' line='2763' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_RealIsSubclass' mangled-name='_PyObject_RealIsSubclass' filepath='Objects/abstract.c' line='2769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_RealIsSubclass'> - <parameter type-id='type-id-2' name='derived' filepath='Objects/abstract.c' line='2769' column='1'/> - <parameter type-id='type-id-2' name='cls' filepath='Objects/abstract.c' line='2769' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GetIter' mangled-name='PyObject_GetIter' filepath='Objects/abstract.c' line='2776' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetIter'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2776' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GetAIter' mangled-name='PyObject_GetAIter' filepath='Objects/abstract.c' line='2801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAIter'> - <parameter type-id='type-id-2' name='o' filepath='Objects/abstract.c' line='2801' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyIter_Check' mangled-name='PyIter_Check' filepath='Objects/abstract.c' line='2820' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Check'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='2820' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyAIter_Check' mangled-name='PyAIter_Check' filepath='Objects/abstract.c' line='2828' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAIter_Check'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/abstract.c' line='2828' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyIter_Next' mangled-name='PyIter_Next' filepath='Objects/abstract.c' line='2844' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Next'> - <parameter type-id='type-id-2' name='iter' filepath='Objects/abstract.c' line='2844' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyIter_Send' mangled-name='PyIter_Send' filepath='Objects/abstract.c' line='2860' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Send'> - <parameter type-id='type-id-2' name='iter' filepath='Objects/abstract.c' line='2860' column='1'/> - <parameter type-id='type-id-2' name='arg' filepath='Objects/abstract.c' line='2860' column='1'/> - <parameter type-id='type-id-233' name='result' filepath='Objects/abstract.c' line='2860' column='1'/> - <return type-id='type-id-255'/> - </function-decl> - <function-decl name='_PySequence_BytesToCharpArray' mangled-name='_PySequence_BytesToCharpArray' filepath='Objects/abstract.c' line='2893' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySequence_BytesToCharpArray'> - <parameter type-id='type-id-2' name='self' filepath='Objects/abstract.c' line='2893' column='1'/> - <return type-id='type-id-136'/> - </function-decl> - <function-decl name='_Py_FreeCharPArray' mangled-name='_Py_FreeCharPArray' filepath='Objects/abstract.c' line='2952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FreeCharPArray'> - <parameter type-id='type-id-136' name='array' filepath='Objects/abstract.c' line='2952' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-253'/> - </abi-instr> - <abi-instr address-size='64' path='Objects/boolobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_Py_FalseStruct' type-id='type-id-240' mangled-name='_Py_FalseStruct' visibility='default' filepath='./Include/boolobject.h' line='17' column='1' elf-symbol-id='_Py_FalseStruct'/> - <var-decl name='_Py_TrueStruct' type-id='type-id-240' mangled-name='_Py_TrueStruct' visibility='default' filepath='./Include/boolobject.h' line='18' column='1' elf-symbol-id='_Py_TrueStruct'/> - <function-decl name='_PyArg_NoKeywords' mangled-name='_PyArg_NoKeywords' filepath='./Include/cpython/modsupport.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_NoKeywords'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_NoKwnames' mangled-name='_PyArg_NoKwnames' filepath='./Include/cpython/modsupport.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_NoKwnames'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_CheckPositional' mangled-name='_PyArg_CheckPositional' filepath='./Include/cpython/modsupport.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_CheckPositional'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyArg_UnpackTuple' mangled-name='PyArg_UnpackTuple' filepath='./Include/modsupport.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_UnpackTuple'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyBool_Type' type-id='type-id-256' mangled-name='PyBool_Type' visibility='default' filepath='./Include/object.h' line='227' column='1' elf-symbol-id='PyBool_Type'/> - <function-decl name='PyBool_FromLong' mangled-name='PyBool_FromLong' filepath='Objects/boolobject.c' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBool_FromLong'> - <parameter type-id='type-id-47' name='ok' filepath='Objects/boolobject.c' line='21' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/bytearrayobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='infinite' id='type-id-257'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <qualified-type-def type-id='type-id-258' const='yes' id='type-id-259'/> - <pointer-type-def type-id='type-id-259' size-in-bits='64' id='type-id-260'/> - <qualified-type-def type-id='type-id-8' const='yes' id='type-id-261'/> - <var-decl name='PyByteArray_Type' type-id='type-id-256' mangled-name='PyByteArray_Type' visibility='default' filepath='./Include/bytearrayobject.h' line='20' column='1' elf-symbol-id='PyByteArray_Type'/> - <var-decl name='PyByteArrayIter_Type' type-id='type-id-256' mangled-name='PyByteArrayIter_Type' visibility='default' filepath='./Include/bytearrayobject.h' line='21' column='1' elf-symbol-id='PyByteArrayIter_Type'/> - <var-decl name='_PyByteArray_empty_string' type-id='type-id-257' mangled-name='_PyByteArray_empty_string' visibility='default' filepath='./Include/cpython/bytearrayobject.h' line='14' column='1' elf-symbol-id='_PyByteArray_empty_string'/> - <function-decl name='_PyBytes_FormatEx' mangled-name='_PyBytes_FormatEx' filepath='./Include/cpython/bytesobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_FormatEx'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyBytes_FromHex' mangled-name='_PyBytes_FromHex' filepath='./Include/cpython/bytesobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_FromHex'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyEval_GetBuiltin' mangled-name='_PyEval_GetBuiltin' filepath='./Include/cpython/ceval.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetBuiltin'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_AsInt' mangled-name='_PyLong_AsInt' filepath='./Include/cpython/longobject.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsInt'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_BadArgument' mangled-name='_PyArg_BadArgument' filepath='./Include/cpython/modsupport.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_BadArgument'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyArg_UnpackKeywords' mangled-name='_PyArg_UnpackKeywords' filepath='./Include/cpython/modsupport.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_UnpackKeywords'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-262'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-248'/> - </function-decl> - <function-decl name='_Py_GetConfig' mangled-name='_Py_GetConfig' filepath='./Include/cpython/pystate.h' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfig'> - <return type-id='type-id-260'/> - </function-decl> - <function-decl name='_Py_bytes_isspace' filepath='./Include/internal/pycore_bytes_methods.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_isalpha' filepath='./Include/internal/pycore_bytes_methods.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_isalnum' filepath='./Include/internal/pycore_bytes_methods.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_isascii' filepath='./Include/internal/pycore_bytes_methods.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_isdigit' filepath='./Include/internal/pycore_bytes_methods.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_islower' filepath='./Include/internal/pycore_bytes_methods.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_isupper' filepath='./Include/internal/pycore_bytes_methods.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_istitle' filepath='./Include/internal/pycore_bytes_methods.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_lower' filepath='./Include/internal/pycore_bytes_methods.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_bytes_upper' filepath='./Include/internal/pycore_bytes_methods.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_bytes_title' filepath='./Include/internal/pycore_bytes_methods.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_bytes_capitalize' filepath='./Include/internal/pycore_bytes_methods.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_bytes_swapcase' filepath='./Include/internal/pycore_bytes_methods.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_bytes_find' filepath='./Include/internal/pycore_bytes_methods.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_index' filepath='./Include/internal/pycore_bytes_methods.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_rfind' filepath='./Include/internal/pycore_bytes_methods.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_rindex' filepath='./Include/internal/pycore_bytes_methods.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_count' filepath='./Include/internal/pycore_bytes_methods.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_contains' filepath='./Include/internal/pycore_bytes_methods.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_bytes_startswith' filepath='./Include/internal/pycore_bytes_methods.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_endswith' filepath='./Include/internal/pycore_bytes_methods.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_bytes_maketrans' filepath='./Include/internal/pycore_bytes_methods.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-254'/> - <parameter type-id='type-id-254'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyBytes_Repeat' mangled-name='_PyBytes_Repeat' filepath='./Include/internal/pycore_bytesobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Repeat'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_strhex_with_sep' mangled-name='_Py_strhex_with_sep' filepath='./Include/internal/pycore_strhex.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex_with_sep'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-246'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-261'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyList_Append' mangled-name='PyList_Append' filepath='./Include/listobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Append'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyList_Reverse' mangled-name='PyList_Reverse' filepath='./Include/listobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Reverse'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyLong_FromSize_t' mangled-name='PyLong_FromSize_t' filepath='./Include/longobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromSize_t'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_AsLongAndOverflow' mangled-name='PyLong_AsLongAndOverflow' filepath='./Include/longobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongAndOverflow'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyType_GenericAlloc' mangled-name='PyType_GenericAlloc' filepath='./Include/object.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GenericAlloc'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GenericNew' mangled-name='PyType_GenericNew' filepath='./Include/object.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GenericNew'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_SelfIter' mangled-name='PyObject_SelfIter' filepath='./Include/object.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SelfIter'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GenericGetAttr' mangled-name='PyObject_GenericGetAttr' filepath='./Include/object.h' line='415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericGetAttr'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_GetState' mangled-name='_PyObject_GetState' filepath='./Include/object.h' line='436' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetState'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Malloc' mangled-name='PyObject_Malloc' filepath='./Include/objimpl.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Malloc'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyObject_Realloc' mangled-name='PyObject_Realloc' filepath='./Include/objimpl.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Realloc'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyObject_Free' mangled-name='PyObject_Free' filepath='./Include/objimpl.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Free'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_New' mangled-name='_PyObject_New' filepath='./Include/objimpl.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_New'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_GC_New' mangled-name='_PyObject_GC_New' filepath='./Include/objimpl.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_New'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GC_Del' mangled-name='PyObject_GC_Del' filepath='./Include/objimpl.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_Del'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyBuffer_ToContiguous' mangled-name='PyBuffer_ToContiguous' filepath='./Include/pybuffer.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_ToContiguous'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-245'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-48'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_Print' mangled-name='PyErr_Print' filepath='./Include/pythonrun.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Print'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySlice_Unpack' mangled-name='PySlice_Unpack' filepath='./Include/sliceobject.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_Unpack'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySlice_AdjustIndices' mangled-name='PySlice_AdjustIndices' filepath='./Include/sliceobject.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_AdjustIndices'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_FromEncodedObject' mangled-name='PyUnicode_FromEncodedObject' filepath='./Include/unicodeobject.h' line='226' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromEncodedObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_GetDefaultEncoding' mangled-name='PyUnicode_GetDefaultEncoding' filepath='./Include/unicodeobject.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetDefaultEncoding'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyUnicode_AsEncodedString' mangled-name='PyUnicode_AsEncodedString' filepath='./Include/unicodeobject.h' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeLatin1' mangled-name='PyUnicode_DecodeLatin1' filepath='./Include/unicodeobject.h' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLatin1'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='memmove' filepath='/usr/include/string.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='memset' filepath='/usr/include/string.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyByteArray_FromObject' mangled-name='PyByteArray_FromObject' filepath='Objects/bytearrayobject.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_FromObject'> - <parameter type-id='type-id-2' name='input' filepath='Objects/bytearrayobject.c' line='83' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyByteArray_FromStringAndSize' mangled-name='PyByteArray_FromStringAndSize' filepath='Objects/bytearrayobject.c' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_FromStringAndSize'> - <parameter type-id='type-id-12' name='bytes' filepath='Objects/bytearrayobject.c' line='109' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/bytearrayobject.c' line='109' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyByteArray_Size' mangled-name='PyByteArray_Size' filepath='Objects/bytearrayobject.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Size'> - <parameter type-id='type-id-2' name='self' filepath='Objects/bytearrayobject.c' line='153' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyByteArray_AsString' mangled-name='PyByteArray_AsString' filepath='Objects/bytearrayobject.c' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_AsString'> - <parameter type-id='type-id-2' name='self' filepath='Objects/bytearrayobject.c' line='162' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyByteArray_Resize' mangled-name='PyByteArray_Resize' filepath='Objects/bytearrayobject.c' line='171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Resize'> - <parameter type-id='type-id-2' name='self' filepath='Objects/bytearrayobject.c' line='171' column='1'/> - <parameter type-id='type-id-14' name='requested_size' filepath='Objects/bytearrayobject.c' line='171' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyByteArray_Concat' mangled-name='PyByteArray_Concat' filepath='Objects/bytearrayobject.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Concat'> - <parameter type-id='type-id-2' name='a' filepath='Objects/bytearrayobject.c' line='250' column='1'/> - <parameter type-id='type-id-2' name='b' filepath='Objects/bytearrayobject.c' line='250' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/bytes_methods.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='984' id='type-id-263'> - <subrange length='123' type-id='type-id-28' id='type-id-264'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='992' id='type-id-265'> - <subrange length='124' type-id='type-id-28' id='type-id-266'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1008' id='type-id-267'> - <subrange length='126' type-id='type-id-28' id='type-id-268'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1040' id='type-id-269'> - <subrange length='130' type-id='type-id-28' id='type-id-270'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1056' id='type-id-271'> - <subrange length='132' type-id='type-id-28' id='type-id-272'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1128' id='type-id-273'> - <subrange length='141' type-id='type-id-28' id='type-id-274'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1240' id='type-id-275'> - <subrange length='155' type-id='type-id-28' id='type-id-276'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1592' id='type-id-277'> - <subrange length='199' type-id='type-id-28' id='type-id-278'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1840' id='type-id-279'> - <subrange length='230' type-id='type-id-28' id='type-id-280'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1912' id='type-id-281'> - <subrange length='239' type-id='type-id-28' id='type-id-282'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='1928' id='type-id-283'> - <subrange length='241' type-id='type-id-28' id='type-id-284'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='2112' id='type-id-285'> - <subrange length='264' type-id='type-id-28' id='type-id-286'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='2144' id='type-id-287'> - <subrange length='268' type-id='type-id-28' id='type-id-288'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='2160' id='type-id-289'> - <subrange length='270' type-id='type-id-28' id='type-id-290'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='2168' id='type-id-291'> - <subrange length='271' type-id='type-id-28' id='type-id-292'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='2328' id='type-id-293'> - <subrange length='291' type-id='type-id-28' id='type-id-294'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='744' id='type-id-295'> - <subrange length='93' type-id='type-id-28' id='type-id-296'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='784' id='type-id-297'> - <subrange length='98' type-id='type-id-28' id='type-id-298'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-50' size-in-bits='infinite' id='type-id-299'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <function-decl name='_PyEval_SliceIndex' mangled-name='_PyEval_SliceIndex' filepath='./Include/cpython/ceval.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SliceIndex'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_Py_isspace__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='42' column='1'/> - <var-decl name='_Py_isalpha__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='43' column='1'/> - <var-decl name='_Py_isalnum__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='44' column='1'/> - <var-decl name='_Py_isascii__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='45' column='1'/> - <var-decl name='_Py_isdigit__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='46' column='1'/> - <var-decl name='_Py_islower__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='47' column='1'/> - <var-decl name='_Py_isupper__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='48' column='1'/> - <var-decl name='_Py_istitle__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='49' column='1'/> - <var-decl name='_Py_lower__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='50' column='1'/> - <var-decl name='_Py_upper__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='51' column='1'/> - <var-decl name='_Py_title__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='52' column='1'/> - <var-decl name='_Py_capitalize__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='53' column='1'/> - <var-decl name='_Py_swapcase__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='54' column='1'/> - <var-decl name='_Py_count__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='55' column='1'/> - <var-decl name='_Py_find__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='56' column='1'/> - <var-decl name='_Py_index__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='57' column='1'/> - <var-decl name='_Py_rfind__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='58' column='1'/> - <var-decl name='_Py_rindex__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='59' column='1'/> - <var-decl name='_Py_startswith__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='60' column='1'/> - <var-decl name='_Py_endswith__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='61' column='1'/> - <var-decl name='_Py_maketrans__doc__' type-id='type-id-299' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='62' column='1'/> - <function-decl name='_PyArg_ParseTuple_SizeT' mangled-name='_PyArg_ParseTuple_SizeT' filepath='./Include/modsupport.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTuple_SizeT'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='memrchr' filepath='/usr/include/string.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/bytesobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='4096' id='type-id-300'> - <subrange length='512' type-id='type-id-28' id='type-id-301'/> - </array-type-def> - <class-decl name='_PyBytesWriter' size-in-bits='4416' is-struct='yes' naming-typedef-id='type-id-302' visibility='default' filepath='./Include/cpython/bytesobject.h' line='55' column='1' id='type-id-303'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buffer' type-id='type-id-2' visibility='default' filepath='./Include/cpython/bytesobject.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='allocated' type-id='type-id-14' visibility='default' filepath='./Include/cpython/bytesobject.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='min_size' type-id='type-id-14' visibility='default' filepath='./Include/cpython/bytesobject.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='use_bytearray' type-id='type-id-8' visibility='default' filepath='./Include/cpython/bytesobject.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='overallocate' type-id='type-id-8' visibility='default' filepath='./Include/cpython/bytesobject.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='use_small_buffer' type-id='type-id-8' visibility='default' filepath='./Include/cpython/bytesobject.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='small_buffer' type-id='type-id-300' visibility='default' filepath='./Include/cpython/bytesobject.h' line='75' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyBytesWriter' type-id='type-id-303' filepath='./Include/cpython/bytesobject.h' line='76' column='1' id='type-id-302'/> - <pointer-type-def type-id='type-id-302' size-in-bits='64' id='type-id-304'/> - <var-decl name='PyBytes_Type' type-id='type-id-256' mangled-name='PyBytes_Type' visibility='default' filepath='./Include/bytesobject.h' line='27' column='1' elf-symbol-id='PyBytes_Type'/> - <var-decl name='PyBytesIter_Type' type-id='type-id-256' mangled-name='PyBytesIter_Type' visibility='default' filepath='./Include/bytesobject.h' line='28' column='1' elf-symbol-id='PyBytesIter_Type'/> - <function-decl name='_Py_NewReference' mangled-name='_Py_NewReference' filepath='./Include/cpython/object.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_NewReference'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_NewReferenceNoTotal' mangled-name='_Py_NewReferenceNoTotal' filepath='./Include/cpython/object.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_NewReferenceNoTotal'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_FormatLong' mangled-name='_PyUnicode_FormatLong' filepath='./Include/cpython/unicodeobject.h' line='946' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FormatLong'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFloat_AsDouble' mangled-name='PyFloat_AsDouble' filepath='./Include/floatobject.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_AsDouble'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='_PyLong_FormatBytesWriter' mangled-name='_PyLong_FormatBytesWriter' filepath='./Include/internal/pycore_long.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FormatBytesWriter'> - <parameter type-id='type-id-304'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyObject_ASCII' mangled-name='PyObject_ASCII' filepath='./Include/object.h' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ASCII'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Calloc' mangled-name='PyObject_Calloc' filepath='./Include/objimpl.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Calloc'> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyErr_BadArgument' mangled-name='PyErr_BadArgument' filepath='./Include/pyerrors.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_BadArgument'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_HashBytes' mangled-name='_Py_HashBytes' filepath='./Include/pyhash.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashBytes'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='PyOS_double_to_string' mangled-name='PyOS_double_to_string' filepath='./Include/pystrtod.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_double_to_string'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-48'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyTuple_GetItem' mangled-name='PyTuple_GetItem' filepath='./Include/tupleobject.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_GetItem'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_FromFormatV' mangled-name='PyBytes_FromFormatV' filepath='Objects/bytesobject.c' line='181' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormatV'> - <parameter type-id='type-id-12' name='format' filepath='Objects/bytesobject.c' line='181' column='1'/> - <parameter type-id='type-id-306' name='vargs' filepath='Objects/bytesobject.c' line='181' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_FromFormat' mangled-name='PyBytes_FromFormat' filepath='Objects/bytesobject.c' line='372' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormat'> - <parameter type-id='type-id-12' name='format' filepath='Objects/bytesobject.c' line='372' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_DecodeEscape' mangled-name='PyBytes_DecodeEscape' filepath='Objects/bytesobject.c' line='1165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_DecodeEscape'> - <parameter type-id='type-id-12' name='s' filepath='Objects/bytesobject.c' line='1165' column='1'/> - <parameter type-id='type-id-14' name='len' filepath='Objects/bytesobject.c' line='1166' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/bytesobject.c' line='1167' column='1'/> - <parameter type-id='type-id-14' name='_unused_unicode' filepath='Objects/bytesobject.c' line='1168' column='1'/> - <parameter type-id='type-id-12' name='_unused_recode_encoding' filepath='Objects/bytesobject.c' line='1169' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_Size' mangled-name='PyBytes_Size' filepath='Objects/bytesobject.c' line='1204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Size'> - <parameter type-id='type-id-2' name='op' filepath='Objects/bytesobject.c' line='1204' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyBytes_Find' mangled-name='_PyBytes_Find' filepath='Objects/bytesobject.c' line='1273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Find'> - <parameter type-id='type-id-12' name='haystack' filepath='Objects/bytesobject.c' line='1273' column='1'/> - <parameter type-id='type-id-14' name='len_haystack' filepath='Objects/bytesobject.c' line='1273' column='1'/> - <parameter type-id='type-id-12' name='needle' filepath='Objects/bytesobject.c' line='1274' column='1'/> - <parameter type-id='type-id-14' name='len_needle' filepath='Objects/bytesobject.c' line='1274' column='1'/> - <parameter type-id='type-id-14' name='offset' filepath='Objects/bytesobject.c' line='1275' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyBytes_ReverseFind' mangled-name='_PyBytes_ReverseFind' filepath='Objects/bytesobject.c' line='1299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_ReverseFind'> - <parameter type-id='type-id-12' name='haystack' filepath='Objects/bytesobject.c' line='1299' column='1'/> - <parameter type-id='type-id-14' name='len_haystack' filepath='Objects/bytesobject.c' line='1299' column='1'/> - <parameter type-id='type-id-12' name='needle' filepath='Objects/bytesobject.c' line='1300' column='1'/> - <parameter type-id='type-id-14' name='len_needle' filepath='Objects/bytesobject.c' line='1300' column='1'/> - <parameter type-id='type-id-14' name='offset' filepath='Objects/bytesobject.c' line='1301' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyBytes_Repr' mangled-name='PyBytes_Repr' filepath='Objects/bytesobject.c' line='1308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Repr'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/bytesobject.c' line='1308' column='1'/> - <parameter type-id='type-id-8' name='smartquotes' filepath='Objects/bytesobject.c' line='1308' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyBytes_Join' mangled-name='_PyBytes_Join' filepath='Objects/bytesobject.c' line='1863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Join'> - <parameter type-id='type-id-2' name='sep' filepath='Objects/bytesobject.c' line='1863' column='1'/> - <parameter type-id='type-id-2' name='x' filepath='Objects/bytesobject.c' line='1863' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_FromObject' mangled-name='PyBytes_FromObject' filepath='Objects/bytesobject.c' line='2835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromObject'> - <parameter type-id='type-id-2' name='x' filepath='Objects/bytesobject.c' line='2835' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_ConcatAndDel' mangled-name='PyBytes_ConcatAndDel' filepath='Objects/bytesobject.c' line='3026' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_ConcatAndDel'> - <parameter type-id='type-id-233' name='pv' filepath='Objects/bytesobject.c' line='3026' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/bytesobject.c' line='3026' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyBytes_Resize' mangled-name='_PyBytes_Resize' filepath='Objects/bytesobject.c' line='3048' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Resize'> - <parameter type-id='type-id-233' name='pv' filepath='Objects/bytesobject.c' line='3048' column='1'/> - <parameter type-id='type-id-14' name='newsize' filepath='Objects/bytesobject.c' line='3048' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyBytesWriter_Init' mangled-name='_PyBytesWriter_Init' filepath='Objects/bytesobject.c' line='3271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Init'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3271' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyBytesWriter_Dealloc' mangled-name='_PyBytesWriter_Dealloc' filepath='Objects/bytesobject.c' line='3282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Dealloc'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3282' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyBytesWriter_Resize' mangled-name='_PyBytesWriter_Resize' filepath='Objects/bytesobject.c' line='3352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Resize'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3352' column='1'/> - <parameter type-id='type-id-22' name='str' filepath='Objects/bytesobject.c' line='3352' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/bytesobject.c' line='3352' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyBytesWriter_Prepare' mangled-name='_PyBytesWriter_Prepare' filepath='Objects/bytesobject.c' line='3422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Prepare'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3422' column='1'/> - <parameter type-id='type-id-22' name='str' filepath='Objects/bytesobject.c' line='3422' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/bytesobject.c' line='3422' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyBytesWriter_Alloc' mangled-name='_PyBytesWriter_Alloc' filepath='Objects/bytesobject.c' line='3452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Alloc'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3452' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/bytesobject.c' line='3452' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyBytesWriter_Finish' mangled-name='_PyBytesWriter_Finish' filepath='Objects/bytesobject.c' line='3482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Finish'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3482' column='1'/> - <parameter type-id='type-id-22' name='str' filepath='Objects/bytesobject.c' line='3482' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyBytesWriter_WriteBytes' mangled-name='_PyBytesWriter_WriteBytes' filepath='Objects/bytesobject.c' line='3526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_WriteBytes'> - <parameter type-id='type-id-304' name='writer' filepath='Objects/bytesobject.c' line='3526' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/bytesobject.c' line='3526' column='1'/> - <parameter type-id='type-id-22' name='bytes' filepath='Objects/bytesobject.c' line='3527' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/bytesobject.c' line='3527' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/call.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_Py_Identifier' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='42' column='1' id='type-id-307'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='string' type-id='type-id-12' visibility='default' filepath='./Include/cpython/object.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='index' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='46' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_Identifier' type-id='type-id-307' filepath='./Include/cpython/object.h' line='47' column='1' id='type-id-308'/> - <pointer-type-def type-id='type-id-308' size-in-bits='64' id='type-id-309'/> - <function-decl name='_Py_VaBuildStack_SizeT' mangled-name='_Py_VaBuildStack_SizeT' filepath='./Include/cpython/modsupport.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_VaBuildStack_SizeT'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-306'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-233'/> - </function-decl> - <function-decl name='_Py_VaBuildStack' mangled-name='_Py_VaBuildStack' filepath='./Include/cpython/modsupport.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_VaBuildStack'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-306'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-233'/> - </function-decl> - <function-decl name='_PyObject_GetAttrId' mangled-name='_PyObject_GetAttrId' filepath='./Include/cpython/object.h' line='294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetAttrId'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-309'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_GetMethod' mangled-name='_PyObject_GetMethod' filepath='./Include/cpython/object.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetMethod'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_FatalErrorFormat' mangled-name='_Py_FatalErrorFormat' filepath='./Include/cpython/pyerrors.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalErrorFormat'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_FromId' mangled-name='_PyUnicode_FromId' filepath='./Include/cpython/unicodeobject.h' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FromId'> - <parameter type-id='type-id-309'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_Next' mangled-name='PyDict_Next' filepath='./Include/dictobject.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Next'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_Vector' filepath='./Include/internal/pycore_ceval.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-310'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_FromItems' filepath='./Include/internal/pycore_dict.h' line='179' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_NoMemory' mangled-name='_PyErr_NoMemory' filepath='./Include/internal/pycore_pyerrors.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_NoMemory'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_FormatFromCauseTstate' mangled-name='_PyErr_FormatFromCauseTstate' filepath='./Include/internal/pycore_pyerrors.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_FormatFromCauseTstate'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTuple_FromArray' filepath='./Include/internal/pycore_tuple.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_GetNameObject' mangled-name='PyModule_GetNameObject' filepath='./Include/moduleobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetNameObject'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GetAttrString' mangled-name='PyObject_GetAttrString' filepath='./Include/object.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAttrString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCallable_Check' mangled-name='PyCallable_Check' filepath='./Include/object.h' line='424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCallable_Check'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_FastCallDictTstate' mangled-name='_PyObject_FastCallDictTstate' filepath='Objects/call.c' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_FastCallDictTstate'> - <parameter type-id='type-id-177' name='tstate' filepath='Objects/call.c' line='109' column='1'/> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='109' column='1'/> - <parameter type-id='type-id-248' name='args' filepath='Objects/call.c' line='110' column='1'/> - <parameter type-id='type-id-19' name='nargsf' filepath='Objects/call.c' line='110' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='111' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_VectorcallDict' mangled-name='PyObject_VectorcallDict' filepath='Objects/call.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VectorcallDict'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='153' column='1'/> - <parameter type-id='type-id-248' name='args' filepath='Objects/call.c' line='153' column='1'/> - <parameter type-id='type-id-19' name='nargsf' filepath='Objects/call.c' line='154' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='154' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyVectorcall_Function' mangled-name='PyVectorcall_Function' filepath='Objects/call.c' line='255' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_Function'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='255' column='1'/> - <return type-id='type-id-311'/> - </function-decl> - <function-decl name='PyVectorcall_Call' mangled-name='PyVectorcall_Call' filepath='Objects/call.c' line='292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_Call'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='292' column='1'/> - <parameter type-id='type-id-2' name='tuple' filepath='Objects/call.c' line='292' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='292' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Vectorcall' mangled-name='PyObject_Vectorcall' filepath='Objects/call.c' line='321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Vectorcall'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='321' column='1'/> - <parameter type-id='type-id-248' name='args' filepath='Objects/call.c' line='321' column='1'/> - <parameter type-id='type-id-19' name='nargsf' filepath='Objects/call.c' line='322' column='1'/> - <parameter type-id='type-id-2' name='kwnames' filepath='Objects/call.c' line='322' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_Call' mangled-name='_PyObject_Call' filepath='Objects/call.c' line='339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_Call'> - <parameter type-id='type-id-177' name='tstate' filepath='Objects/call.c' line='339' column='1'/> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='339' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='340' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='340' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Call' mangled-name='PyObject_Call' filepath='Objects/call.c' line='376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Call'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='376' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='376' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='376' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCFunction_Call' mangled-name='PyCFunction_Call' filepath='Objects/call.c' line='384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_Call'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='384' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='384' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='384' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyFunction_Vectorcall' mangled-name='_PyFunction_Vectorcall' filepath='Objects/call.c' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_Vectorcall'> - <parameter type-id='type-id-2' name='func' filepath='Objects/call.c' line='408' column='1'/> - <parameter type-id='type-id-248' name='stack' filepath='Objects/call.c' line='408' column='1'/> - <parameter type-id='type-id-19' name='nargsf' filepath='Objects/call.c' line='409' column='1'/> - <parameter type-id='type-id-2' name='kwnames' filepath='Objects/call.c' line='409' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_CallObjectWithKeywords' mangled-name='PyEval_CallObjectWithKeywords' filepath='Objects/call.c' line='431' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallObjectWithKeywords'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='431' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='432' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='432' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_CallObject' mangled-name='PyObject_CallObject' filepath='Objects/call.c' line='464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallObject'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='464' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='464' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_Call_Prepend' mangled-name='_PyObject_Call_Prepend' filepath='Objects/call.c' line='482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_Call_Prepend'> - <parameter type-id='type-id-177' name='tstate' filepath='Objects/call.c' line='482' column='1'/> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='482' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='483' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/call.c' line='483' column='1'/> - <parameter type-id='type-id-2' name='kwargs' filepath='Objects/call.c' line='483' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_CallFunction' mangled-name='PyObject_CallFunction' filepath='Objects/call.c' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFunction'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='577' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='577' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_CallFunction' mangled-name='PyEval_CallFunction' filepath='Objects/call.c' line='595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallFunction'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/call.c' line='595' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='595' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_CallMethod' mangled-name='PyObject_CallMethod' filepath='Objects/call.c' line='638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallMethod'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='638' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/call.c' line='638' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='638' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_CallMethod' mangled-name='PyEval_CallMethod' filepath='Objects/call.c' line='665' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallMethod'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='665' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/call.c' line='665' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='665' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallMethod' mangled-name='_PyObject_CallMethod' filepath='Objects/call.c' line='688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethod'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='688' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/call.c' line='688' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='689' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallMethodId' mangled-name='_PyObject_CallMethodId' filepath='Objects/call.c' line='712' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethodId'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='712' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/call.c' line='712' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='713' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallMethod_SizeT' mangled-name='_PyObject_CallMethod_SizeT' filepath='Objects/call.c' line='747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethod_SizeT'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='747' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/call.c' line='747' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='748' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallMethodId_SizeT' mangled-name='_PyObject_CallMethodId_SizeT' filepath='Objects/call.c' line='771' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethodId_SizeT'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='771' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/call.c' line='771' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Objects/call.c' line='772' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_CallMethodObjArgs' mangled-name='PyObject_CallMethodObjArgs' filepath='Objects/call.c' line='895' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallMethodObjArgs'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='895' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/call.c' line='895' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallMethodIdObjArgs' mangled-name='_PyObject_CallMethodIdObjArgs' filepath='Objects/call.c' line='920' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethodIdObjArgs'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/call.c' line='920' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/call.c' line='920' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyStack_AsDict' mangled-name='_PyStack_AsDict' filepath='Objects/call.c' line='967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStack_AsDict'> - <parameter type-id='type-id-248' name='values' filepath='Objects/call.c' line='967' column='1'/> - <parameter type-id='type-id-2' name='kwnames' filepath='Objects/call.c' line='967' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyVectorcall_NARGS' mangled-name='PyVectorcall_NARGS' filepath='Objects/call.c' line='1080' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_NARGS'> - <parameter type-id='type-id-19' name='n' filepath='Objects/call.c' line='1080' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/capsule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='PyCapsule_Destructor' type-id='type-id-312' filepath='./Include/pycapsule.h' line='23' column='1' id='type-id-313'/> - <function-decl name='PyImport_ImportModule' mangled-name='PyImport_ImportModule' filepath='./Include/import.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModule'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PyCapsule_Type' type-id='type-id-256' mangled-name='PyCapsule_Type' visibility='default' filepath='./Include/pycapsule.h' line='21' column='1' elf-symbol-id='PyCapsule_Type'/> - <function-decl name='PyCapsule_New' mangled-name='PyCapsule_New' filepath='Objects/capsule.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_New'> - <parameter type-id='type-id-22' name='pointer' filepath='Objects/capsule.c' line='44' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/capsule.c' line='44' column='1'/> - <parameter type-id='type-id-313' name='destructor' filepath='Objects/capsule.c' line='44' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCapsule_IsValid' mangled-name='PyCapsule_IsValid' filepath='Objects/capsule.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_IsValid'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='68' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/capsule.c' line='68' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCapsule_GetPointer' mangled-name='PyCapsule_GetPointer' filepath='Objects/capsule.c' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetPointer'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='80' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/capsule.c' line='80' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyCapsule_GetName' mangled-name='PyCapsule_GetName' filepath='Objects/capsule.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetName'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='98' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyCapsule_GetDestructor' mangled-name='PyCapsule_GetDestructor' filepath='Objects/capsule.c' line='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetDestructor'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='110' column='1'/> - <return type-id='type-id-313'/> - </function-decl> - <function-decl name='PyCapsule_GetContext' mangled-name='PyCapsule_GetContext' filepath='Objects/capsule.c' line='122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetContext'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='122' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyCapsule_SetPointer' mangled-name='PyCapsule_SetPointer' filepath='Objects/capsule.c' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetPointer'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='134' column='1'/> - <parameter type-id='type-id-22' name='pointer' filepath='Objects/capsule.c' line='134' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCapsule_SetName' mangled-name='PyCapsule_SetName' filepath='Objects/capsule.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetName'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='153' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/capsule.c' line='153' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCapsule_SetDestructor' mangled-name='PyCapsule_SetDestructor' filepath='Objects/capsule.c' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetDestructor'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='167' column='1'/> - <parameter type-id='type-id-313' name='destructor' filepath='Objects/capsule.c' line='167' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCapsule_SetContext' mangled-name='PyCapsule_SetContext' filepath='Objects/capsule.c' line='181' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetContext'> - <parameter type-id='type-id-2' name='o' filepath='Objects/capsule.c' line='181' column='1'/> - <parameter type-id='type-id-22' name='context' filepath='Objects/capsule.c' line='181' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCapsule_Import' mangled-name='PyCapsule_Import' filepath='Objects/capsule.c' line='195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_Import'> - <parameter type-id='type-id-12' name='name' filepath='Objects/capsule.c' line='195' column='1'/> - <parameter type-id='type-id-8' name='no_block' filepath='Objects/capsule.c' line='195' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-314'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Objects/cellobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyCell_Type' type-id='type-id-256' mangled-name='PyCell_Type' visibility='default' filepath='./Include/cpython/cellobject.h' line='16' column='1' elf-symbol-id='PyCell_Type'/> - <function-decl name='PyObject_RichCompare' mangled-name='PyObject_RichCompare' filepath='./Include/object.h' line='406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_RichCompare'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCell_New' mangled-name='PyCell_New' filepath='Objects/cellobject.c' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_New'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/cellobject.c' line='7' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCell_Get' mangled-name='PyCell_Get' filepath='Objects/cellobject.c' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_Get'> - <parameter type-id='type-id-2' name='op' filepath='Objects/cellobject.c' line='52' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCell_Set' mangled-name='PyCell_Set' filepath='Objects/cellobject.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_Set'> - <parameter type-id='type-id-2' name='op' filepath='Objects/cellobject.c' line='63' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/cellobject.c' line='63' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/classobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyMethod_Type' type-id='type-id-256' mangled-name='PyMethod_Type' visibility='default' filepath='./Include/cpython/classobject.h' line='20' column='1' elf-symbol-id='PyMethod_Type'/> - <var-decl name='PyInstanceMethod_Type' type-id='type-id-256' mangled-name='PyInstanceMethod_Type' visibility='default' filepath='./Include/cpython/classobject.h' line='49' column='1' elf-symbol-id='PyInstanceMethod_Type'/> - <function-decl name='_PyType_Lookup' mangled-name='_PyType_Lookup' filepath='./Include/cpython/object.h' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_Lookup'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyType_GetDict' mangled-name='_PyType_GetDict' filepath='./Include/internal/pycore_typeobject.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetDict'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_Ready' mangled-name='PyType_Ready' filepath='./Include/object.h' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Ready'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GenericSetAttr' mangled-name='PyObject_GenericSetAttr' filepath='./Include/object.h' line='416' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericSetAttr'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_Hash' mangled-name='PyObject_Hash' filepath='./Include/object.h' line='420' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Hash'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='PyObject_ClearWeakRefs' mangled-name='PyObject_ClearWeakRefs' filepath='./Include/object.h' line='425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearWeakRefs'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_HashPointer' mangled-name='_Py_HashPointer' filepath='./Include/pyhash.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashPointer'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='PyMethod_Function' mangled-name='PyMethod_Function' filepath='Objects/classobject.c' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_Function'> - <parameter type-id='type-id-2' name='im' filepath='Objects/classobject.c' line='21' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMethod_Self' mangled-name='PyMethod_Self' filepath='Objects/classobject.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_Self'> - <parameter type-id='type-id-2' name='im' filepath='Objects/classobject.c' line='31' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMethod_New' mangled-name='PyMethod_New' filepath='Objects/classobject.c' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_New'> - <parameter type-id='type-id-2' name='func' filepath='Objects/classobject.c' line='107' column='1'/> - <parameter type-id='type-id-2' name='self' filepath='Objects/classobject.c' line='107' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInstanceMethod_New' mangled-name='PyInstanceMethod_New' filepath='Objects/classobject.c' line='354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInstanceMethod_New'> - <parameter type-id='type-id-2' name='func' filepath='Objects/classobject.c' line='354' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInstanceMethod_Function' mangled-name='PyInstanceMethod_Function' filepath='Objects/classobject.c' line='365' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInstanceMethod_Function'> - <parameter type-id='type-id-2' name='im' filepath='Objects/classobject.c' line='365' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/codeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_opaque' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='316' column='1' id='type-id-315'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='computed_line' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='317' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lo_next' type-id='type-id-316' visibility='default' filepath='./Include/cpython/code.h' line='318' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='limit' type-id='type-id-316' visibility='default' filepath='./Include/cpython/code.h' line='319' column='1'/> - </data-member> - </class-decl> - <class-decl name='_line_offsets' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='322' column='1' id='type-id-317'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ar_start' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='323' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ar_end' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='324' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ar_line' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='325' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='opaque' type-id='type-id-315' visibility='default' filepath='./Include/cpython/code.h' line='326' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyCodeAddressRange' type-id='type-id-317' filepath='./Include/cpython/code.h' line='327' column='1' id='type-id-318'/> - <class-decl name='_PyCodeConstructor' size-in-bits='896' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='157' column='1' id='type-id-319'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='filename' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='qualname' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='flags' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='code' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='firstlineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='linetable' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='consts' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='170' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='names' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='localsplusnames' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='localspluskinds' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='argcount' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='posonlyargcount' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='179' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='kwonlyargcount' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='stacksize' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='184' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='exceptiontable' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='187' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-318' size-in-bits='64' id='type-id-320'/> - <pointer-type-def type-id='type-id-321' size-in-bits='64' id='type-id-322'/> - <pointer-type-def type-id='type-id-305' size-in-bits='64' id='type-id-323'/> - <pointer-type-def type-id='type-id-319' size-in-bits='64' id='type-id-324'/> - <qualified-type-def type-id='type-id-325' const='yes' id='type-id-326'/> - <pointer-type-def type-id='type-id-326' size-in-bits='64' id='type-id-316'/> - <var-decl name='PyCode_Type' type-id='type-id-256' mangled-name='PyCode_Type' visibility='default' filepath='./Include/cpython/code.h' line='212' column='1' elf-symbol-id='PyCode_Type'/> - <function-decl name='PyComplex_AsCComplex' mangled-name='PyComplex_AsCComplex' filepath='./Include/cpython/complexobject.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_AsCComplex'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_PySet_NextEntry' mangled-name='_PySet_NextEntry' filepath='./Include/cpython/setobject.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_NextEntry'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-323'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_Copy' mangled-name='_PyUnicode_Copy' filepath='./Include/cpython/unicodeobject.h' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_Copy'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_FromASCII' mangled-name='_PyUnicode_FromASCII' filepath='./Include/cpython/unicodeobject.h' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FromASCII'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_GetBaseOpcode' filepath='./Include/internal/pycore_code.h' line='488' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyLong_FromVoidPtr' mangled-name='PyLong_FromVoidPtr' filepath='./Include/longobject.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromVoidPtr'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_NewVar' mangled-name='_PyObject_NewVar' filepath='./Include/objimpl.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_NewVar'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-322'/> - </function-decl> - <function-decl name='PyErr_WriteUnraisable' mangled-name='PyErr_WriteUnraisable' filepath='./Include/pyerrors.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WriteUnraisable'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyFrozenSet_New' mangled-name='PyFrozenSet_New' filepath='./Include/setobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrozenSet_New'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeFSDefault' mangled-name='PyUnicode_DecodeFSDefault' filepath='./Include/unicodeobject.h' line='762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefault'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Compare' mangled-name='PyUnicode_Compare' filepath='./Include/unicodeobject.h' line='952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Compare'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='copysign' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='198' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyCode_AddWatcher' mangled-name='PyCode_AddWatcher' filepath='Objects/codeobject.c' line='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_AddWatcher'> - <parameter type-id='type-id-329' name='callback' filepath='Objects/codeobject.c' line='66' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCode_ClearWatcher' mangled-name='PyCode_ClearWatcher' filepath='Objects/codeobject.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_ClearWatcher'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/codeobject.c' line='98' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCode_Validate' mangled-name='_PyCode_Validate' filepath='Objects/codeobject.c' line='335' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_Validate'> - <parameter type-id='type-id-324' name='con' filepath='Objects/codeobject.c' line='335' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCode_Quicken' filepath='Objects/codeobject.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyCode_New' mangled-name='_PyCode_New' filepath='Objects/codeobject.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_New'> - <parameter type-id='type-id-324' name='con' filepath='Objects/codeobject.c' line='547' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyUnstable_Code_NewWithPosOnlyArgs' mangled-name='PyUnstable_Code_NewWithPosOnlyArgs' filepath='Objects/codeobject.c' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_NewWithPosOnlyArgs'> - <parameter type-id='type-id-8' name='argcount' filepath='Objects/codeobject.c' line='600' column='1'/> - <parameter type-id='type-id-8' name='posonlyargcount' filepath='Objects/codeobject.c' line='600' column='1'/> - <parameter type-id='type-id-8' name='kwonlyargcount' filepath='Objects/codeobject.c' line='600' column='1'/> - <parameter type-id='type-id-8' name='nlocals' filepath='Objects/codeobject.c' line='601' column='1'/> - <parameter type-id='type-id-8' name='stacksize' filepath='Objects/codeobject.c' line='601' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/codeobject.c' line='601' column='1'/> - <parameter type-id='type-id-2' name='code' filepath='Objects/codeobject.c' line='602' column='1'/> - <parameter type-id='type-id-2' name='consts' filepath='Objects/codeobject.c' line='602' column='1'/> - <parameter type-id='type-id-2' name='names' filepath='Objects/codeobject.c' line='602' column='1'/> - <parameter type-id='type-id-2' name='varnames' filepath='Objects/codeobject.c' line='603' column='1'/> - <parameter type-id='type-id-2' name='freevars' filepath='Objects/codeobject.c' line='603' column='1'/> - <parameter type-id='type-id-2' name='cellvars' filepath='Objects/codeobject.c' line='603' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Objects/codeobject.c' line='604' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/codeobject.c' line='604' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/codeobject.c' line='605' column='1'/> - <parameter type-id='type-id-8' name='firstlineno' filepath='Objects/codeobject.c' line='605' column='1'/> - <parameter type-id='type-id-2' name='linetable' filepath='Objects/codeobject.c' line='606' column='1'/> - <parameter type-id='type-id-2' name='exceptiontable' filepath='Objects/codeobject.c' line='607' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyUnstable_Code_New' mangled-name='PyUnstable_Code_New' filepath='Objects/codeobject.c' line='724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_New'> - <parameter type-id='type-id-8' name='argcount' filepath='Objects/codeobject.c' line='724' column='1'/> - <parameter type-id='type-id-8' name='kwonlyargcount' filepath='Objects/codeobject.c' line='724' column='1'/> - <parameter type-id='type-id-8' name='nlocals' filepath='Objects/codeobject.c' line='725' column='1'/> - <parameter type-id='type-id-8' name='stacksize' filepath='Objects/codeobject.c' line='725' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/codeobject.c' line='725' column='1'/> - <parameter type-id='type-id-2' name='code' filepath='Objects/codeobject.c' line='726' column='1'/> - <parameter type-id='type-id-2' name='consts' filepath='Objects/codeobject.c' line='726' column='1'/> - <parameter type-id='type-id-2' name='names' filepath='Objects/codeobject.c' line='726' column='1'/> - <parameter type-id='type-id-2' name='varnames' filepath='Objects/codeobject.c' line='727' column='1'/> - <parameter type-id='type-id-2' name='freevars' filepath='Objects/codeobject.c' line='727' column='1'/> - <parameter type-id='type-id-2' name='cellvars' filepath='Objects/codeobject.c' line='727' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Objects/codeobject.c' line='728' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/codeobject.c' line='728' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/codeobject.c' line='728' column='1'/> - <parameter type-id='type-id-8' name='firstlineno' filepath='Objects/codeobject.c' line='729' column='1'/> - <parameter type-id='type-id-2' name='linetable' filepath='Objects/codeobject.c' line='730' column='1'/> - <parameter type-id='type-id-2' name='exceptiontable' filepath='Objects/codeobject.c' line='731' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyCode_NewEmpty' mangled-name='PyCode_NewEmpty' filepath='Objects/codeobject.c' line='758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_NewEmpty'> - <parameter type-id='type-id-12' name='filename' filepath='Objects/codeobject.c' line='758' column='1'/> - <parameter type-id='type-id-12' name='funcname' filepath='Objects/codeobject.c' line='758' column='1'/> - <parameter type-id='type-id-8' name='firstlineno' filepath='Objects/codeobject.c' line='758' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyCode_Addr2Line' mangled-name='PyCode_Addr2Line' filepath='Objects/codeobject.c' line='820' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Line'> - <parameter type-id='type-id-328' name='co' filepath='Objects/codeobject.c' line='820' column='1'/> - <parameter type-id='type-id-8' name='addrq' filepath='Objects/codeobject.c' line='820' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCode_CheckLineNumber' mangled-name='_PyCode_CheckLineNumber' filepath='Objects/codeobject.c' line='855' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckLineNumber'> - <parameter type-id='type-id-8' name='lasti' filepath='Objects/codeobject.c' line='855' column='1'/> - <parameter type-id='type-id-320' name='bounds' filepath='Objects/codeobject.c' line='855' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCode_Addr2Location' mangled-name='PyCode_Addr2Location' filepath='Objects/codeobject.c' line='1032' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Location'> - <parameter type-id='type-id-328' name='co' filepath='Objects/codeobject.c' line='1032' column='1'/> - <parameter type-id='type-id-8' name='addrq' filepath='Objects/codeobject.c' line='1032' column='1'/> - <parameter type-id='type-id-179' name='start_line' filepath='Objects/codeobject.c' line='1033' column='1'/> - <parameter type-id='type-id-179' name='start_column' filepath='Objects/codeobject.c' line='1033' column='1'/> - <parameter type-id='type-id-179' name='end_line' filepath='Objects/codeobject.c' line='1034' column='1'/> - <parameter type-id='type-id-179' name='end_column' filepath='Objects/codeobject.c' line='1034' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_Code_GetExtra' mangled-name='PyUnstable_Code_GetExtra' filepath='Objects/codeobject.c' line='1353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_GetExtra'> - <parameter type-id='type-id-2' name='code' filepath='Objects/codeobject.c' line='1353' column='1'/> - <parameter type-id='type-id-14' name='index' filepath='Objects/codeobject.c' line='1353' column='1'/> - <parameter type-id='type-id-253' name='extra' filepath='Objects/codeobject.c' line='1353' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_Code_SetExtra' mangled-name='PyUnstable_Code_SetExtra' filepath='Objects/codeobject.c' line='1374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_SetExtra'> - <parameter type-id='type-id-2' name='code' filepath='Objects/codeobject.c' line='1374' column='1'/> - <parameter type-id='type-id-14' name='index' filepath='Objects/codeobject.c' line='1374' column='1'/> - <parameter type-id='type-id-22' name='extra' filepath='Objects/codeobject.c' line='1374' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCode_GetVarnames' mangled-name='PyCode_GetVarnames' filepath='Objects/codeobject.c' line='1447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetVarnames'> - <parameter type-id='type-id-328' name='code' filepath='Objects/codeobject.c' line='1447' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCode_GetCellvars' mangled-name='PyCode_GetCellvars' filepath='Objects/codeobject.c' line='1462' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCellvars'> - <parameter type-id='type-id-328' name='code' filepath='Objects/codeobject.c' line='1462' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCode_GetFreevars' mangled-name='PyCode_GetFreevars' filepath='Objects/codeobject.c' line='1477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetFreevars'> - <parameter type-id='type-id-328' name='code' filepath='Objects/codeobject.c' line='1477' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCode_GetCode' mangled-name='PyCode_GetCode' filepath='Objects/codeobject.c' line='1518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCode'> - <parameter type-id='type-id-328' name='co' filepath='Objects/codeobject.c' line='1518' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCode_ConstantKey' mangled-name='_PyCode_ConstantKey' filepath='Objects/codeobject.c' line='2158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ConstantKey'> - <parameter type-id='type-id-2' name='op' filepath='Objects/codeobject.c' line='2158' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/complexobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-330' size-in-bits='64' id='type-id-331'/> - <var-decl name='PyComplex_Type' type-id='type-id-256' mangled-name='PyComplex_Type' visibility='default' filepath='./Include/complexobject.h' line='11' column='1' elf-symbol-id='PyComplex_Type'/> - <function-decl name='_PyComplex_FormatAdvancedWriter' filepath='./Include/cpython/complexobject.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_TransformDecimalAndSpaceToASCII' mangled-name='_PyUnicode_TransformDecimalAndSpaceToASCII' filepath='./Include/cpython/unicodeobject.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_TransformDecimalAndSpaceToASCII'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_HashDouble' mangled-name='_Py_HashDouble' filepath='./Include/pyhash.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashDouble'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='_Py_string_to_number_with_underscores' mangled-name='_Py_string_to_number_with_underscores' filepath='./Include/pystrtod.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_string_to_number_with_underscores'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-331'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='atan2' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='cos' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='sin' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='exp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='log' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='pow' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='hypot' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='floor' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='_Py_c_sum' mangled-name='_Py_c_sum' filepath='Objects/complexobject.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_sum'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='28' column='1'/> - <parameter type-id='type-id-327' name='b' filepath='Objects/complexobject.c' line='28' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_diff' mangled-name='_Py_c_diff' filepath='Objects/complexobject.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_diff'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='37' column='1'/> - <parameter type-id='type-id-327' name='b' filepath='Objects/complexobject.c' line='37' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_neg' mangled-name='_Py_c_neg' filepath='Objects/complexobject.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_neg'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='46' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_prod' mangled-name='_Py_c_prod' filepath='Objects/complexobject.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_prod'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='55' column='1'/> - <parameter type-id='type-id-327' name='b' filepath='Objects/complexobject.c' line='55' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_quot' mangled-name='_Py_c_quot' filepath='Objects/complexobject.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_quot'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='68' column='1'/> - <parameter type-id='type-id-327' name='b' filepath='Objects/complexobject.c' line='68' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_pow' mangled-name='_Py_c_pow' filepath='Objects/complexobject.c' line='129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_pow'> - <parameter type-id='type-id-327' name='a' filepath='Objects/complexobject.c' line='129' column='1'/> - <parameter type-id='type-id-327' name='b' filepath='Objects/complexobject.c' line='129' column='1'/> - <return type-id='type-id-327'/> - </function-decl> - <function-decl name='_Py_c_abs' mangled-name='_Py_c_abs' filepath='Objects/complexobject.c' line='185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_abs'> - <parameter type-id='type-id-327' name='z' filepath='Objects/complexobject.c' line='185' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyComplex_FromDoubles' mangled-name='PyComplex_FromDoubles' filepath='Objects/complexobject.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_FromDoubles'> - <parameter type-id='type-id-251' name='real' filepath='Objects/complexobject.c' line='250' column='1'/> - <parameter type-id='type-id-251' name='imag' filepath='Objects/complexobject.c' line='250' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyComplex_RealAsDouble' mangled-name='PyComplex_RealAsDouble' filepath='Objects/complexobject.c' line='259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_RealAsDouble'> - <parameter type-id='type-id-2' name='op' filepath='Objects/complexobject.c' line='259' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyComplex_ImagAsDouble' mangled-name='PyComplex_ImagAsDouble' filepath='Objects/complexobject.c' line='270' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_ImagAsDouble'> - <parameter type-id='type-id-2' name='op' filepath='Objects/complexobject.c' line='270' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-330'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-2'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Objects/descrobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-333' size-in-bits='64' id='type-id-334'/> - <var-decl name='_PyMethodWrapper_Type' type-id='type-id-256' mangled-name='_PyMethodWrapper_Type' visibility='default' filepath='./Include/cpython/descrobject.h' line='60' column='1' elf-symbol-id='_PyMethodWrapper_Type'/> - <function-decl name='_PyArg_UnpackStack' mangled-name='_PyArg_UnpackStack' filepath='./Include/cpython/modsupport.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_UnpackStack'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyType_GetDocFromInternalDoc' mangled-name='_PyType_GetDocFromInternalDoc' filepath='./Include/cpython/object.h' line='283' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetDocFromInternalDoc'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyType_GetTextSignatureFromInternalDoc' mangled-name='_PyType_GetTextSignatureFromInternalDoc' filepath='./Include/cpython/object.h' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetTextSignatureFromInternalDoc'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_IsAbstract' mangled-name='_PyObject_IsAbstract' filepath='./Include/cpython/object.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_IsAbstract'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_FunctionStr' mangled-name='_PyObject_FunctionStr' filepath='./Include/cpython/object.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_FunctionStr'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTrash_begin' mangled-name='_PyTrash_begin' filepath='./Include/cpython/object.h' line='516' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_begin'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTrash_end' mangled-name='_PyTrash_end' filepath='./Include/cpython/object.h' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_end'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTrash_cond' mangled-name='_PyTrash_cond' filepath='./Include/cpython/object.h' line='519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_cond'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-335'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThreadState_UncheckedGet' mangled-name='_PyThreadState_UncheckedGet' filepath='./Include/cpython/pystate.h' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_UncheckedGet'> - <return type-id='type-id-177'/> - </function-decl> - <var-decl name='PyClassMethodDescr_Type' type-id='type-id-256' mangled-name='PyClassMethodDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='19' column='1' elf-symbol-id='PyClassMethodDescr_Type'/> - <var-decl name='PyGetSetDescr_Type' type-id='type-id-256' mangled-name='PyGetSetDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='20' column='1' elf-symbol-id='PyGetSetDescr_Type'/> - <var-decl name='PyMemberDescr_Type' type-id='type-id-256' mangled-name='PyMemberDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='21' column='1' elf-symbol-id='PyMemberDescr_Type'/> - <var-decl name='PyMethodDescr_Type' type-id='type-id-256' mangled-name='PyMethodDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='22' column='1' elf-symbol-id='PyMethodDescr_Type'/> - <var-decl name='PyWrapperDescr_Type' type-id='type-id-256' mangled-name='PyWrapperDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='23' column='1' elf-symbol-id='PyWrapperDescr_Type'/> - <var-decl name='PyDictProxy_Type' type-id='type-id-256' mangled-name='PyDictProxy_Type' visibility='default' filepath='./Include/descrobject.h' line='24' column='1' elf-symbol-id='PyDictProxy_Type'/> - <var-decl name='PyProperty_Type' type-id='type-id-256' mangled-name='PyProperty_Type' visibility='default' filepath='./Include/descrobject.h' line='25' column='1' elf-symbol-id='PyProperty_Type'/> - <function-decl name='PyMember_GetOne' mangled-name='PyMember_GetOne' filepath='./Include/descrobject.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMember_GetOne'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-336'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMember_SetOne' mangled-name='PyMember_SetOne' filepath='./Include/descrobject.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMember_SetOne'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-336'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Contains' mangled-name='PyDict_Contains' filepath='./Include/dictobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Contains'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCMethod_New' mangled-name='PyCMethod_New' filepath='./Include/methodobject.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCMethod_New'> - <parameter type-id='type-id-337'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GetQualName' mangled-name='PyType_GetQualName' filepath='./Include/object.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetQualName'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_SetAttr' mangled-name='PyObject_SetAttr' filepath='./Include/object.h' line='412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttr'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GC_UnTrack' mangled-name='PyObject_GC_UnTrack' filepath='./Include/objimpl.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_UnTrack'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyTuple_GetSlice' mangled-name='PyTuple_GetSlice' filepath='./Include/tupleobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_GetSlice'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_NewMethod' mangled-name='PyDescr_NewMethod' filepath='Objects/descrobject.c' line='919' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewMethod'> - <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='919' column='1'/> - <parameter type-id='type-id-337' name='method' filepath='Objects/descrobject.c' line='919' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_NewClassMethod' mangled-name='PyDescr_NewClassMethod' filepath='Objects/descrobject.c' line='965' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewClassMethod'> - <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='965' column='1'/> - <parameter type-id='type-id-337' name='method' filepath='Objects/descrobject.c' line='965' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_NewMember' mangled-name='PyDescr_NewMember' filepath='Objects/descrobject.c' line='977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewMember'> - <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='977' column='1'/> - <parameter type-id='type-id-336' name='member' filepath='Objects/descrobject.c' line='977' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_NewGetSet' mangled-name='PyDescr_NewGetSet' filepath='Objects/descrobject.c' line='995' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewGetSet'> - <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='995' column='1'/> - <parameter type-id='type-id-338' name='getset' filepath='Objects/descrobject.c' line='995' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_NewWrapper' mangled-name='PyDescr_NewWrapper' filepath='Objects/descrobject.c' line='1007' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewWrapper'> - <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='1007' column='1'/> - <parameter type-id='type-id-334' name='base' filepath='Objects/descrobject.c' line='1007' column='1'/> - <parameter type-id='type-id-22' name='wrapped' filepath='Objects/descrobject.c' line='1007' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDescr_IsData' mangled-name='PyDescr_IsData' filepath='Objects/descrobject.c' line='1021' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_IsData'> - <parameter type-id='type-id-2' name='ob' filepath='Objects/descrobject.c' line='1021' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDictProxy_New' mangled-name='PyDictProxy_New' filepath='Objects/descrobject.c' line='1256' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDictProxy_New'> - <parameter type-id='type-id-2' name='mapping' filepath='Objects/descrobject.c' line='1256' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyWrapper_New' mangled-name='PyWrapper_New' filepath='Objects/descrobject.c' line='1457' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWrapper_New'> - <parameter type-id='type-id-2' name='d' filepath='Objects/descrobject.c' line='1457' column='1'/> - <parameter type-id='type-id-2' name='self' filepath='Objects/descrobject.c' line='1457' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/dictobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyObject_AssertFailed' mangled-name='_PyObject_AssertFailed' filepath='./Include/cpython/object.h' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_AssertFailed'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_IS_GC' mangled-name='PyObject_IS_GC' filepath='./Include/cpython/objimpl.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IS_GC'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_SetKeyError' mangled-name='_PyErr_SetKeyError' filepath='./Include/cpython/pyerrors.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetKeyError'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PySet_Update' mangled-name='_PySet_Update' filepath='./Include/cpython/setobject.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_Update'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyDict_Type' type-id='type-id-256' mangled-name='PyDict_Type' visibility='default' filepath='./Include/dictobject.h' line='15' column='1' elf-symbol-id='PyDict_Type'/> - <var-decl name='PyDictKeys_Type' type-id='type-id-256' mangled-name='PyDictKeys_Type' visibility='default' filepath='./Include/dictobject.h' line='66' column='1' elf-symbol-id='PyDictKeys_Type'/> - <var-decl name='PyDictValues_Type' type-id='type-id-256' mangled-name='PyDictValues_Type' visibility='default' filepath='./Include/dictobject.h' line='67' column='1' elf-symbol-id='PyDictValues_Type'/> - <var-decl name='PyDictItems_Type' type-id='type-id-256' mangled-name='PyDictItems_Type' visibility='default' filepath='./Include/dictobject.h' line='68' column='1' elf-symbol-id='PyDictItems_Type'/> - <var-decl name='PyDictIterKey_Type' type-id='type-id-256' mangled-name='PyDictIterKey_Type' visibility='default' filepath='./Include/dictobject.h' line='79' column='1' elf-symbol-id='PyDictIterKey_Type'/> - <var-decl name='PyDictIterValue_Type' type-id='type-id-256' mangled-name='PyDictIterValue_Type' visibility='default' filepath='./Include/dictobject.h' line='80' column='1' elf-symbol-id='PyDictIterValue_Type'/> - <var-decl name='PyDictIterItem_Type' type-id='type-id-256' mangled-name='PyDictIterItem_Type' visibility='default' filepath='./Include/dictobject.h' line='81' column='1' elf-symbol-id='PyDictIterItem_Type'/> - <var-decl name='PyDictRevIterKey_Type' type-id='type-id-256' mangled-name='PyDictRevIterKey_Type' visibility='default' filepath='./Include/dictobject.h' line='83' column='1' elf-symbol-id='PyDictRevIterKey_Type'/> - <var-decl name='PyDictRevIterItem_Type' type-id='type-id-256' mangled-name='PyDictRevIterItem_Type' visibility='default' filepath='./Include/dictobject.h' line='84' column='1' elf-symbol-id='PyDictRevIterItem_Type'/> - <var-decl name='PyDictRevIterValue_Type' type-id='type-id-256' mangled-name='PyDictRevIterValue_Type' visibility='default' filepath='./Include/dictobject.h' line='85' column='1' elf-symbol-id='PyDictRevIterValue_Type'/> - <function-decl name='_PyType_AllocNoTrack' filepath='./Include/internal/pycore_object.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_ComputedDictPointer' filepath='./Include/internal/pycore_object.h' line='407' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-233'/> - </function-decl> - <function-decl name='_PyErr_GetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyArg_ValidateKeywordArguments' mangled-name='PyArg_ValidateKeywordArguments' filepath='./Include/modsupport.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ValidateKeywordArguments'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_DebugMallocStats' mangled-name='_PyDict_DebugMallocStats' filepath='Objects/dictobject.c' line='289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DebugMallocStats'> - <parameter type-id='type-id-229' name='out' filepath='Objects/dictobject.c' line='289' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_CheckConsistency' mangled-name='_PyDict_CheckConsistency' filepath='Objects/dictobject.c' line='511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_CheckConsistency'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='511' column='1'/> - <parameter type-id='type-id-8' name='check_content' filepath='Objects/dictobject.c' line='511' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_HasOnlyStringKeys' mangled-name='_PyDict_HasOnlyStringKeys' filepath='Objects/dictobject.c' line='1102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_HasOnlyStringKeys'> - <parameter type-id='type-id-2' name='dict' filepath='Objects/dictobject.c' line='1102' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_MaybeUntrack' mangled-name='_PyDict_MaybeUntrack' filepath='Objects/dictobject.c' line='1127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_MaybeUntrack'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1127' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_NewPresized' mangled-name='_PyDict_NewPresized' filepath='Objects/dictobject.c' line='1609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_NewPresized'> - <parameter type-id='type-id-14' name='minused' filepath='Objects/dictobject.c' line='1609' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_GetItem' mangled-name='PyDict_GetItem' filepath='Objects/dictobject.c' line='1665' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1665' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='1665' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_GetItem_KnownHash' mangled-name='_PyDict_GetItem_KnownHash' filepath='Objects/dictobject.c' line='1727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItem_KnownHash'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1727' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='1727' column='1'/> - <parameter type-id='type-id-305' name='hash' filepath='Objects/dictobject.c' line='1727' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_GetItemWithError' mangled-name='_PyDict_GetItemWithError' filepath='Objects/dictobject.c' line='1773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemWithError'> - <parameter type-id='type-id-2' name='dp' filepath='Objects/dictobject.c' line='1773' column='1'/> - <parameter type-id='type-id-2' name='kv' filepath='Objects/dictobject.c' line='1773' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_GetItemIdWithError' mangled-name='_PyDict_GetItemIdWithError' filepath='Objects/dictobject.c' line='1784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemIdWithError'> - <parameter type-id='type-id-2' name='dp' filepath='Objects/dictobject.c' line='1784' column='1'/> - <parameter type-id='type-id-309' name='key' filepath='Objects/dictobject.c' line='1784' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_GetItemStringWithError' mangled-name='_PyDict_GetItemStringWithError' filepath='Objects/dictobject.c' line='1796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemStringWithError'> - <parameter type-id='type-id-2' name='v' filepath='Objects/dictobject.c' line='1796' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/dictobject.c' line='1796' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_SetItem_KnownHash' mangled-name='_PyDict_SetItem_KnownHash' filepath='Objects/dictobject.c' line='1888' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1888' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='1888' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/dictobject.c' line='1888' column='1'/> - <parameter type-id='type-id-305' name='hash' filepath='Objects/dictobject.c' line='1889' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_DelItem' mangled-name='PyDict_DelItem' filepath='Objects/dictobject.c' line='1970' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1970' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='1970' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_DelItem_KnownHash' mangled-name='_PyDict_DelItem_KnownHash' filepath='Objects/dictobject.c' line='1984' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItem_KnownHash'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='1984' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='1984' column='1'/> - <parameter type-id='type-id-305' name='hash' filepath='Objects/dictobject.c' line='1984' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_DelItemIf' mangled-name='_PyDict_DelItemIf' filepath='Objects/dictobject.c' line='2016' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItemIf'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='2016' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='2016' column='1'/> - <parameter type-id='type-id-339' name='predicate' filepath='Objects/dictobject.c' line='2017' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Clear' mangled-name='PyDict_Clear' filepath='Objects/dictobject.c' line='2061' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Clear'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='2061' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_Next' mangled-name='_PyDict_Next' filepath='Objects/dictobject.c' line='2106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Next'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='2106' column='1'/> - <parameter type-id='type-id-13' name='ppos' filepath='Objects/dictobject.c' line='2106' column='1'/> - <parameter type-id='type-id-233' name='pkey' filepath='Objects/dictobject.c' line='2106' column='1'/> - <parameter type-id='type-id-233' name='pvalue' filepath='Objects/dictobject.c' line='2107' column='1'/> - <parameter type-id='type-id-323' name='phash' filepath='Objects/dictobject.c' line='2107' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_Pop' mangled-name='_PyDict_Pop' filepath='Objects/dictobject.c' line='2231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Pop'> - <parameter type-id='type-id-2' name='dict' filepath='Objects/dictobject.c' line='2231' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='2231' column='1'/> - <parameter type-id='type-id-2' name='deflt' filepath='Objects/dictobject.c' line='2231' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_MergeFromSeq2' mangled-name='PyDict_MergeFromSeq2' filepath='Objects/dictobject.c' line='2722' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_MergeFromSeq2'> - <parameter type-id='type-id-2' name='d' filepath='Objects/dictobject.c' line='2722' column='1'/> - <parameter type-id='type-id-2' name='seq2' filepath='Objects/dictobject.c' line='2722' column='1'/> - <parameter type-id='type-id-8' name='override' filepath='Objects/dictobject.c' line='2722' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Update' mangled-name='PyDict_Update' filepath='Objects/dictobject.c' line='2981' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Update'> - <parameter type-id='type-id-2' name='a' filepath='Objects/dictobject.c' line='2981' column='1'/> - <parameter type-id='type-id-2' name='b' filepath='Objects/dictobject.c' line='2981' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_MergeEx' mangled-name='_PyDict_MergeEx' filepath='Objects/dictobject.c' line='2996' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_MergeEx'> - <parameter type-id='type-id-2' name='a' filepath='Objects/dictobject.c' line='2996' column='1'/> - <parameter type-id='type-id-2' name='b' filepath='Objects/dictobject.c' line='2996' column='1'/> - <parameter type-id='type-id-8' name='override' filepath='Objects/dictobject.c' line='2996' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_SetDefault' mangled-name='PyDict_SetDefault' filepath='Objects/dictobject.c' line='3290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefault'> - <parameter type-id='type-id-2' name='d' filepath='Objects/dictobject.c' line='3290' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='3290' column='1'/> - <parameter type-id='type-id-2' name='defaultobj' filepath='Objects/dictobject.c' line='3290' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_SizeOf' mangled-name='_PyDict_SizeOf' filepath='Objects/dictobject.c' line='3571' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SizeOf'> - <parameter type-id='type-id-340' name='mp' filepath='Objects/dictobject.c' line='3571' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyDict_Contains_KnownHash' mangled-name='_PyDict_Contains_KnownHash' filepath='Objects/dictobject.c' line='3709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Contains_KnownHash'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='3709' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/dictobject.c' line='3709' column='1'/> - <parameter type-id='type-id-305' name='hash' filepath='Objects/dictobject.c' line='3709' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_ContainsId' mangled-name='_PyDict_ContainsId' filepath='Objects/dictobject.c' line='3722' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_ContainsId'> - <parameter type-id='type-id-2' name='op' filepath='Objects/dictobject.c' line='3722' column='1'/> - <parameter type-id='type-id-309' name='key' filepath='Objects/dictobject.c' line='3722' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_GetItemString' mangled-name='PyDict_GetItemString' filepath='Objects/dictobject.c' line='3887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemString'> - <parameter type-id='type-id-2' name='v' filepath='Objects/dictobject.c' line='3887' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/dictobject.c' line='3887' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_SetItemId' mangled-name='_PyDict_SetItemId' filepath='Objects/dictobject.c' line='3901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItemId'> - <parameter type-id='type-id-2' name='v' filepath='Objects/dictobject.c' line='3901' column='1'/> - <parameter type-id='type-id-309' name='key' filepath='Objects/dictobject.c' line='3901' column='1'/> - <parameter type-id='type-id-2' name='item' filepath='Objects/dictobject.c' line='3901' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_DelItemId' mangled-name='_PyDict_DelItemId' filepath='Objects/dictobject.c' line='3925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItemId'> - <parameter type-id='type-id-2' name='v' filepath='Objects/dictobject.c' line='3925' column='1'/> - <parameter type-id='type-id-309' name='key' filepath='Objects/dictobject.c' line='3925' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_DelItemString' mangled-name='PyDict_DelItemString' filepath='Objects/dictobject.c' line='3934' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItemString'> - <parameter type-id='type-id-2' name='v' filepath='Objects/dictobject.c' line='3934' column='1'/> - <parameter type-id='type-id-12' name='key' filepath='Objects/dictobject.c' line='3934' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDictView_New' mangled-name='_PyDictView_New' filepath='Objects/dictobject.c' line='4562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDictView_New'> - <parameter type-id='type-id-2' name='dict' filepath='Objects/dictobject.c' line='4562' column='1'/> - <parameter type-id='type-id-1' name='type' filepath='Objects/dictobject.c' line='4562' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDictView_Intersect' mangled-name='_PyDictView_Intersect' filepath='Objects/dictobject.c' line='4786' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDictView_Intersect'> - <parameter type-id='type-id-2' name='self' filepath='Objects/dictobject.c' line='4786' column='1'/> - <parameter type-id='type-id-2' name='other' filepath='Objects/dictobject.c' line='4786' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_VisitManagedDict' mangled-name='_PyObject_VisitManagedDict' filepath='Objects/dictobject.c' line='5577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_VisitManagedDict'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/dictobject.c' line='5577' column='1'/> - <parameter type-id='type-id-341' name='visit' filepath='Objects/dictobject.c' line='5577' column='1'/> - <parameter type-id='type-id-22' name='arg' filepath='Objects/dictobject.c' line='5577' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_ClearManagedDict' mangled-name='_PyObject_ClearManagedDict' filepath='Objects/dictobject.c' line='5600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_ClearManagedDict'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/dictobject.c' line='5600' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyDict_Watch' mangled-name='PyDict_Watch' filepath='Objects/dictobject.c' line='5754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Watch'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/dictobject.c' line='5754' column='1'/> - <parameter type-id='type-id-2' name='dict' filepath='Objects/dictobject.c' line='5754' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Unwatch' mangled-name='PyDict_Unwatch' filepath='Objects/dictobject.c' line='5769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Unwatch'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/dictobject.c' line='5769' column='1'/> - <parameter type-id='type-id-2' name='dict' filepath='Objects/dictobject.c' line='5769' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_AddWatcher' mangled-name='PyDict_AddWatcher' filepath='Objects/dictobject.c' line='5784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_AddWatcher'> - <parameter type-id='type-id-342' name='callback' filepath='Objects/dictobject.c' line='5784' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_ClearWatcher' mangled-name='PyDict_ClearWatcher' filepath='Objects/dictobject.c' line='5800' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_ClearWatcher'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/dictobject.c' line='5800' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <pointer-type-def type-id='type-id-343' size-in-bits='64' id='type-id-340'/> - <typedef-decl name='PyDictObject' type-id='type-id-344' filepath='./Include/cpython/dictobject.h' line='33' column='1' id='type-id-343'/> - <class-decl name='PyDictObject' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-343' visibility='default' filepath='./Include/cpython/dictobject.h' line='11' column='1' id='type-id-344'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/dictobject.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ma_used' type-id='type-id-14' visibility='default' filepath='./Include/cpython/dictobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ma_version_tag' type-id='type-id-117' visibility='default' filepath='./Include/cpython/dictobject.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ma_keys' type-id='type-id-346' visibility='default' filepath='./Include/cpython/dictobject.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ma_values' type-id='type-id-347' visibility='default' filepath='./Include/cpython/dictobject.h' line='32' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-348' size-in-bits='64' id='type-id-346'/> - <pointer-type-def type-id='type-id-349' size-in-bits='64' id='type-id-347'/> - <typedef-decl name='PyDictKeysObject' type-id='type-id-350' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-348'/> - <typedef-decl name='PyDictValues' type-id='type-id-351' filepath='./Include/cpython/dictobject.h' line='6' column='1' id='type-id-349'/> - <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='72' column='1' id='type-id-350'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='dk_refcnt' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dk_log2_size' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='72'> - <var-decl name='dk_log2_index_bytes' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='dk_kind' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='dk_version' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_dict.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='dk_usable' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='dk_nentries' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='dk_indices' type-id='type-id-257' visibility='default' filepath='./Include/internal/pycore_dict.h' line='106' column='1'/> - </data-member> - </class-decl> - <class-decl name='_dictvalues' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='122' column='1' id='type-id-351'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='values' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_dict.h' line='123' column='1'/> - </data-member> - </class-decl> - <function-type size-in-bits='64' id='type-id-354'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Objects/enumobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyUnicode_EqualToASCIIString' mangled-name='_PyUnicode_EqualToASCIIString' filepath='./Include/cpython/unicodeobject.h' line='767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EqualToASCIIString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyEnum_Type' type-id='type-id-256' mangled-name='PyEnum_Type' visibility='default' filepath='./Include/enumobject.h' line='10' column='1' elf-symbol-id='PyEnum_Type'/> - <var-decl name='PyReversed_Type' type-id='type-id-256' mangled-name='PyReversed_Type' visibility='default' filepath='./Include/enumobject.h' line='11' column='1' elf-symbol-id='PyReversed_Type'/> - </abi-instr> - <abi-instr address-size='64' path='Objects/exceptions.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyDict_New' mangled-name='PyDict_New' filepath='./Include/dictobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_New'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_GetItemWithError' mangled-name='PyDict_GetItemWithError' filepath='./Include/dictobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemWithError'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_SetItem' mangled-name='PyDict_SetItem' filepath='./Include/dictobject.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetItem'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Copy' mangled-name='PyDict_Copy' filepath='./Include/dictobject.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Copy'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyDict_SetItemString' mangled-name='PyDict_SetItemString' filepath='./Include/dictobject.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetItemString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_GenericGetDict' mangled-name='PyObject_GenericGetDict' filepath='./Include/dictobject.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericGetDict'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_SetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyStaticType_InitBuiltin' filepath='./Include/internal/pycore_typeobject.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyStaticType_Dealloc' filepath='./Include/internal/pycore_typeobject.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyList_GetItem' mangled-name='PyList_GetItem' filepath='./Include/listobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_GetItem'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyArg_ParseTupleAndKeywords_SizeT' mangled-name='_PyArg_ParseTupleAndKeywords_SizeT' filepath='./Include/modsupport.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywords_SizeT'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_GetDict' mangled-name='PyModule_GetDict' filepath='./Include/moduleobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetDict'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Repr' mangled-name='PyObject_Repr' filepath='./Include/object.h' line='402' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Repr'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GenericSetDict' mangled-name='PyObject_GenericSetDict' filepath='./Include/object.h' line='418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericSetDict'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyExc_BaseException' type-id='type-id-2' mangled-name='PyExc_BaseException' visibility='default' filepath='./Include/pyerrors.h' line='78' column='1' elf-symbol-id='PyExc_BaseException'/> - <var-decl name='PyExc_Exception' type-id='type-id-2' mangled-name='PyExc_Exception' visibility='default' filepath='./Include/pyerrors.h' line='79' column='1' elf-symbol-id='PyExc_Exception'/> - <var-decl name='PyExc_BaseExceptionGroup' type-id='type-id-2' mangled-name='PyExc_BaseExceptionGroup' visibility='default' filepath='./Include/pyerrors.h' line='80' column='1' elf-symbol-id='PyExc_BaseExceptionGroup'/> - <var-decl name='PyExc_StopAsyncIteration' type-id='type-id-2' mangled-name='PyExc_StopAsyncIteration' visibility='default' filepath='./Include/pyerrors.h' line='82' column='1' elf-symbol-id='PyExc_StopAsyncIteration'/> - <var-decl name='PyExc_StopIteration' type-id='type-id-2' mangled-name='PyExc_StopIteration' visibility='default' filepath='./Include/pyerrors.h' line='84' column='1' elf-symbol-id='PyExc_StopIteration'/> - <var-decl name='PyExc_GeneratorExit' type-id='type-id-2' mangled-name='PyExc_GeneratorExit' visibility='default' filepath='./Include/pyerrors.h' line='85' column='1' elf-symbol-id='PyExc_GeneratorExit'/> - <var-decl name='PyExc_ArithmeticError' type-id='type-id-2' mangled-name='PyExc_ArithmeticError' visibility='default' filepath='./Include/pyerrors.h' line='86' column='1' elf-symbol-id='PyExc_ArithmeticError'/> - <var-decl name='PyExc_LookupError' type-id='type-id-2' mangled-name='PyExc_LookupError' visibility='default' filepath='./Include/pyerrors.h' line='87' column='1' elf-symbol-id='PyExc_LookupError'/> - <var-decl name='PyExc_AssertionError' type-id='type-id-2' mangled-name='PyExc_AssertionError' visibility='default' filepath='./Include/pyerrors.h' line='89' column='1' elf-symbol-id='PyExc_AssertionError'/> - <var-decl name='PyExc_AttributeError' type-id='type-id-2' mangled-name='PyExc_AttributeError' visibility='default' filepath='./Include/pyerrors.h' line='90' column='1' elf-symbol-id='PyExc_AttributeError'/> - <var-decl name='PyExc_BufferError' type-id='type-id-2' mangled-name='PyExc_BufferError' visibility='default' filepath='./Include/pyerrors.h' line='91' column='1' elf-symbol-id='PyExc_BufferError'/> - <var-decl name='PyExc_EOFError' type-id='type-id-2' mangled-name='PyExc_EOFError' visibility='default' filepath='./Include/pyerrors.h' line='92' column='1' elf-symbol-id='PyExc_EOFError'/> - <var-decl name='PyExc_FloatingPointError' type-id='type-id-2' mangled-name='PyExc_FloatingPointError' visibility='default' filepath='./Include/pyerrors.h' line='93' column='1' elf-symbol-id='PyExc_FloatingPointError'/> - <var-decl name='PyExc_OSError' type-id='type-id-2' mangled-name='PyExc_OSError' visibility='default' filepath='./Include/pyerrors.h' line='94' column='1' elf-symbol-id='PyExc_OSError'/> - <var-decl name='PyExc_ImportError' type-id='type-id-2' mangled-name='PyExc_ImportError' visibility='default' filepath='./Include/pyerrors.h' line='95' column='1' elf-symbol-id='PyExc_ImportError'/> - <var-decl name='PyExc_ModuleNotFoundError' type-id='type-id-2' mangled-name='PyExc_ModuleNotFoundError' visibility='default' filepath='./Include/pyerrors.h' line='97' column='1' elf-symbol-id='PyExc_ModuleNotFoundError'/> - <var-decl name='PyExc_IndexError' type-id='type-id-2' mangled-name='PyExc_IndexError' visibility='default' filepath='./Include/pyerrors.h' line='99' column='1' elf-symbol-id='PyExc_IndexError'/> - <var-decl name='PyExc_KeyError' type-id='type-id-2' mangled-name='PyExc_KeyError' visibility='default' filepath='./Include/pyerrors.h' line='100' column='1' elf-symbol-id='PyExc_KeyError'/> - <var-decl name='PyExc_KeyboardInterrupt' type-id='type-id-2' mangled-name='PyExc_KeyboardInterrupt' visibility='default' filepath='./Include/pyerrors.h' line='101' column='1' elf-symbol-id='PyExc_KeyboardInterrupt'/> - <var-decl name='PyExc_MemoryError' type-id='type-id-2' mangled-name='PyExc_MemoryError' visibility='default' filepath='./Include/pyerrors.h' line='102' column='1' elf-symbol-id='PyExc_MemoryError'/> - <var-decl name='PyExc_NameError' type-id='type-id-2' mangled-name='PyExc_NameError' visibility='default' filepath='./Include/pyerrors.h' line='103' column='1' elf-symbol-id='PyExc_NameError'/> - <var-decl name='PyExc_OverflowError' type-id='type-id-2' mangled-name='PyExc_OverflowError' visibility='default' filepath='./Include/pyerrors.h' line='104' column='1' elf-symbol-id='PyExc_OverflowError'/> - <var-decl name='PyExc_RuntimeError' type-id='type-id-2' mangled-name='PyExc_RuntimeError' visibility='default' filepath='./Include/pyerrors.h' line='105' column='1' elf-symbol-id='PyExc_RuntimeError'/> - <var-decl name='PyExc_RecursionError' type-id='type-id-2' mangled-name='PyExc_RecursionError' visibility='default' filepath='./Include/pyerrors.h' line='107' column='1' elf-symbol-id='PyExc_RecursionError'/> - <var-decl name='PyExc_NotImplementedError' type-id='type-id-2' mangled-name='PyExc_NotImplementedError' visibility='default' filepath='./Include/pyerrors.h' line='109' column='1' elf-symbol-id='PyExc_NotImplementedError'/> - <var-decl name='PyExc_SyntaxError' type-id='type-id-2' mangled-name='PyExc_SyntaxError' visibility='default' filepath='./Include/pyerrors.h' line='110' column='1' elf-symbol-id='PyExc_SyntaxError'/> - <var-decl name='PyExc_IndentationError' type-id='type-id-2' mangled-name='PyExc_IndentationError' visibility='default' filepath='./Include/pyerrors.h' line='111' column='1' elf-symbol-id='PyExc_IndentationError'/> - <var-decl name='PyExc_TabError' type-id='type-id-2' mangled-name='PyExc_TabError' visibility='default' filepath='./Include/pyerrors.h' line='112' column='1' elf-symbol-id='PyExc_TabError'/> - <var-decl name='PyExc_ReferenceError' type-id='type-id-2' mangled-name='PyExc_ReferenceError' visibility='default' filepath='./Include/pyerrors.h' line='113' column='1' elf-symbol-id='PyExc_ReferenceError'/> - <var-decl name='PyExc_SystemError' type-id='type-id-2' mangled-name='PyExc_SystemError' visibility='default' filepath='./Include/pyerrors.h' line='114' column='1' elf-symbol-id='PyExc_SystemError'/> - <var-decl name='PyExc_SystemExit' type-id='type-id-2' mangled-name='PyExc_SystemExit' visibility='default' filepath='./Include/pyerrors.h' line='115' column='1' elf-symbol-id='PyExc_SystemExit'/> - <var-decl name='PyExc_TypeError' type-id='type-id-2' mangled-name='PyExc_TypeError' visibility='default' filepath='./Include/pyerrors.h' line='116' column='1' elf-symbol-id='PyExc_TypeError'/> - <var-decl name='PyExc_UnboundLocalError' type-id='type-id-2' mangled-name='PyExc_UnboundLocalError' visibility='default' filepath='./Include/pyerrors.h' line='117' column='1' elf-symbol-id='PyExc_UnboundLocalError'/> - <var-decl name='PyExc_UnicodeError' type-id='type-id-2' mangled-name='PyExc_UnicodeError' visibility='default' filepath='./Include/pyerrors.h' line='118' column='1' elf-symbol-id='PyExc_UnicodeError'/> - <var-decl name='PyExc_UnicodeEncodeError' type-id='type-id-2' mangled-name='PyExc_UnicodeEncodeError' visibility='default' filepath='./Include/pyerrors.h' line='119' column='1' elf-symbol-id='PyExc_UnicodeEncodeError'/> - <var-decl name='PyExc_UnicodeDecodeError' type-id='type-id-2' mangled-name='PyExc_UnicodeDecodeError' visibility='default' filepath='./Include/pyerrors.h' line='120' column='1' elf-symbol-id='PyExc_UnicodeDecodeError'/> - <var-decl name='PyExc_UnicodeTranslateError' type-id='type-id-2' mangled-name='PyExc_UnicodeTranslateError' visibility='default' filepath='./Include/pyerrors.h' line='121' column='1' elf-symbol-id='PyExc_UnicodeTranslateError'/> - <var-decl name='PyExc_ValueError' type-id='type-id-2' mangled-name='PyExc_ValueError' visibility='default' filepath='./Include/pyerrors.h' line='122' column='1' elf-symbol-id='PyExc_ValueError'/> - <var-decl name='PyExc_ZeroDivisionError' type-id='type-id-2' mangled-name='PyExc_ZeroDivisionError' visibility='default' filepath='./Include/pyerrors.h' line='123' column='1' elf-symbol-id='PyExc_ZeroDivisionError'/> - <var-decl name='PyExc_BlockingIOError' type-id='type-id-2' mangled-name='PyExc_BlockingIOError' visibility='default' filepath='./Include/pyerrors.h' line='126' column='1' elf-symbol-id='PyExc_BlockingIOError'/> - <var-decl name='PyExc_BrokenPipeError' type-id='type-id-2' mangled-name='PyExc_BrokenPipeError' visibility='default' filepath='./Include/pyerrors.h' line='127' column='1' elf-symbol-id='PyExc_BrokenPipeError'/> - <var-decl name='PyExc_ChildProcessError' type-id='type-id-2' mangled-name='PyExc_ChildProcessError' visibility='default' filepath='./Include/pyerrors.h' line='128' column='1' elf-symbol-id='PyExc_ChildProcessError'/> - <var-decl name='PyExc_ConnectionError' type-id='type-id-2' mangled-name='PyExc_ConnectionError' visibility='default' filepath='./Include/pyerrors.h' line='129' column='1' elf-symbol-id='PyExc_ConnectionError'/> - <var-decl name='PyExc_ConnectionAbortedError' type-id='type-id-2' mangled-name='PyExc_ConnectionAbortedError' visibility='default' filepath='./Include/pyerrors.h' line='130' column='1' elf-symbol-id='PyExc_ConnectionAbortedError'/> - <var-decl name='PyExc_ConnectionRefusedError' type-id='type-id-2' mangled-name='PyExc_ConnectionRefusedError' visibility='default' filepath='./Include/pyerrors.h' line='131' column='1' elf-symbol-id='PyExc_ConnectionRefusedError'/> - <var-decl name='PyExc_ConnectionResetError' type-id='type-id-2' mangled-name='PyExc_ConnectionResetError' visibility='default' filepath='./Include/pyerrors.h' line='132' column='1' elf-symbol-id='PyExc_ConnectionResetError'/> - <var-decl name='PyExc_FileExistsError' type-id='type-id-2' mangled-name='PyExc_FileExistsError' visibility='default' filepath='./Include/pyerrors.h' line='133' column='1' elf-symbol-id='PyExc_FileExistsError'/> - <var-decl name='PyExc_FileNotFoundError' type-id='type-id-2' mangled-name='PyExc_FileNotFoundError' visibility='default' filepath='./Include/pyerrors.h' line='134' column='1' elf-symbol-id='PyExc_FileNotFoundError'/> - <var-decl name='PyExc_InterruptedError' type-id='type-id-2' mangled-name='PyExc_InterruptedError' visibility='default' filepath='./Include/pyerrors.h' line='135' column='1' elf-symbol-id='PyExc_InterruptedError'/> - <var-decl name='PyExc_IsADirectoryError' type-id='type-id-2' mangled-name='PyExc_IsADirectoryError' visibility='default' filepath='./Include/pyerrors.h' line='136' column='1' elf-symbol-id='PyExc_IsADirectoryError'/> - <var-decl name='PyExc_NotADirectoryError' type-id='type-id-2' mangled-name='PyExc_NotADirectoryError' visibility='default' filepath='./Include/pyerrors.h' line='137' column='1' elf-symbol-id='PyExc_NotADirectoryError'/> - <var-decl name='PyExc_PermissionError' type-id='type-id-2' mangled-name='PyExc_PermissionError' visibility='default' filepath='./Include/pyerrors.h' line='138' column='1' elf-symbol-id='PyExc_PermissionError'/> - <var-decl name='PyExc_ProcessLookupError' type-id='type-id-2' mangled-name='PyExc_ProcessLookupError' visibility='default' filepath='./Include/pyerrors.h' line='139' column='1' elf-symbol-id='PyExc_ProcessLookupError'/> - <var-decl name='PyExc_TimeoutError' type-id='type-id-2' mangled-name='PyExc_TimeoutError' visibility='default' filepath='./Include/pyerrors.h' line='140' column='1' elf-symbol-id='PyExc_TimeoutError'/> - <var-decl name='PyExc_EnvironmentError' type-id='type-id-2' mangled-name='PyExc_EnvironmentError' visibility='default' filepath='./Include/pyerrors.h' line='145' column='1' elf-symbol-id='PyExc_EnvironmentError'/> - <var-decl name='PyExc_IOError' type-id='type-id-2' mangled-name='PyExc_IOError' visibility='default' filepath='./Include/pyerrors.h' line='146' column='1' elf-symbol-id='PyExc_IOError'/> - <var-decl name='PyExc_Warning' type-id='type-id-2' mangled-name='PyExc_Warning' visibility='default' filepath='./Include/pyerrors.h' line='152' column='1' elf-symbol-id='PyExc_Warning'/> - <var-decl name='PyExc_UserWarning' type-id='type-id-2' mangled-name='PyExc_UserWarning' visibility='default' filepath='./Include/pyerrors.h' line='153' column='1' elf-symbol-id='PyExc_UserWarning'/> - <var-decl name='PyExc_DeprecationWarning' type-id='type-id-2' mangled-name='PyExc_DeprecationWarning' visibility='default' filepath='./Include/pyerrors.h' line='154' column='1' elf-symbol-id='PyExc_DeprecationWarning'/> - <var-decl name='PyExc_PendingDeprecationWarning' type-id='type-id-2' mangled-name='PyExc_PendingDeprecationWarning' visibility='default' filepath='./Include/pyerrors.h' line='155' column='1' elf-symbol-id='PyExc_PendingDeprecationWarning'/> - <var-decl name='PyExc_SyntaxWarning' type-id='type-id-2' mangled-name='PyExc_SyntaxWarning' visibility='default' filepath='./Include/pyerrors.h' line='156' column='1' elf-symbol-id='PyExc_SyntaxWarning'/> - <var-decl name='PyExc_RuntimeWarning' type-id='type-id-2' mangled-name='PyExc_RuntimeWarning' visibility='default' filepath='./Include/pyerrors.h' line='157' column='1' elf-symbol-id='PyExc_RuntimeWarning'/> - <var-decl name='PyExc_FutureWarning' type-id='type-id-2' mangled-name='PyExc_FutureWarning' visibility='default' filepath='./Include/pyerrors.h' line='158' column='1' elf-symbol-id='PyExc_FutureWarning'/> - <var-decl name='PyExc_ImportWarning' type-id='type-id-2' mangled-name='PyExc_ImportWarning' visibility='default' filepath='./Include/pyerrors.h' line='159' column='1' elf-symbol-id='PyExc_ImportWarning'/> - <var-decl name='PyExc_UnicodeWarning' type-id='type-id-2' mangled-name='PyExc_UnicodeWarning' visibility='default' filepath='./Include/pyerrors.h' line='160' column='1' elf-symbol-id='PyExc_UnicodeWarning'/> - <var-decl name='PyExc_BytesWarning' type-id='type-id-2' mangled-name='PyExc_BytesWarning' visibility='default' filepath='./Include/pyerrors.h' line='161' column='1' elf-symbol-id='PyExc_BytesWarning'/> - <var-decl name='PyExc_EncodingWarning' type-id='type-id-2' mangled-name='PyExc_EncodingWarning' visibility='default' filepath='./Include/pyerrors.h' line='162' column='1' elf-symbol-id='PyExc_EncodingWarning'/> - <var-decl name='PyExc_ResourceWarning' type-id='type-id-2' mangled-name='PyExc_ResourceWarning' visibility='default' filepath='./Include/pyerrors.h' line='163' column='1' elf-symbol-id='PyExc_ResourceWarning'/> - <function-decl name='PyErr_NewException' mangled-name='PyErr_NewException' filepath='./Include/pyerrors.h' line='231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NewException'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySet_New' mangled-name='PySet_New' filepath='./Include/setobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_New'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySet_Add' mangled-name='PySet_Add' filepath='./Include/setobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Add'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySet_Contains' mangled-name='PySet_Contains' filepath='./Include/setobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Contains'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyTuple_Size' mangled-name='PyTuple_Size' filepath='./Include/tupleobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_Size'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_ReadChar' mangled-name='PyUnicode_ReadChar' filepath='./Include/unicodeobject.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_ReadChar'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-250'/> - </function-decl> - <function-decl name='PyException_GetTraceback' mangled-name='PyException_GetTraceback' filepath='Objects/exceptions.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetTraceback'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='377' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyException_SetTraceback' mangled-name='PyException_SetTraceback' filepath='Objects/exceptions.c' line='385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetTraceback'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='385' column='1'/> - <parameter type-id='type-id-2' name='tb' filepath='Objects/exceptions.c' line='385' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyException_GetCause' mangled-name='PyException_GetCause' filepath='Objects/exceptions.c' line='391' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetCause'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='391' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyException_SetCause' mangled-name='PyException_SetCause' filepath='Objects/exceptions.c' line='399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetCause'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='399' column='1'/> - <parameter type-id='type-id-2' name='cause' filepath='Objects/exceptions.c' line='399' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyException_GetContext' mangled-name='PyException_GetContext' filepath='Objects/exceptions.c' line='407' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetContext'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='407' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyException_SetContext' mangled-name='PyException_SetContext' filepath='Objects/exceptions.c' line='415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetContext'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='415' column='1'/> - <parameter type-id='type-id-2' name='context' filepath='Objects/exceptions.c' line='415' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyException_GetArgs' mangled-name='PyException_GetArgs' filepath='Objects/exceptions.c' line='421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetArgs'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='421' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyException_SetArgs' mangled-name='PyException_SetArgs' filepath='Objects/exceptions.c' line='428' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetArgs'> - <parameter type-id='type-id-2' name='self' filepath='Objects/exceptions.c' line='428' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/exceptions.c' line='428' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyExceptionClass_Name' mangled-name='PyExceptionClass_Name' filepath='Objects/exceptions.c' line='435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyExceptionClass_Name'> - <parameter type-id='type-id-2' name='ob' filepath='Objects/exceptions.c' line='435' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_PyExc_CreateExceptionGroup' mangled-name='_PyExc_CreateExceptionGroup' filepath='Objects/exceptions.c' line='810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyExc_CreateExceptionGroup'> - <parameter type-id='type-id-12' name='msg_str' filepath='Objects/exceptions.c' line='810' column='1'/> - <parameter type-id='type-id-2' name='excs' filepath='Objects/exceptions.c' line='810' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyExc_PrepReraiseStar' mangled-name='_PyExc_PrepReraiseStar' filepath='Objects/exceptions.c' line='1351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyExc_PrepReraiseStar'> - <parameter type-id='type-id-2' name='orig' filepath='Objects/exceptions.c' line='1351' column='1'/> - <parameter type-id='type-id-2' name='excs' filepath='Objects/exceptions.c' line='1351' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnstable_Exc_PrepReraiseStar' mangled-name='PyUnstable_Exc_PrepReraiseStar' filepath='Objects/exceptions.c' line='1444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Exc_PrepReraiseStar'> - <parameter type-id='type-id-2' name='orig' filepath='Objects/exceptions.c' line='1444' column='1'/> - <parameter type-id='type-id-2' name='excs' filepath='Objects/exceptions.c' line='1444' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_GetEncoding' mangled-name='PyUnicodeEncodeError_GetEncoding' filepath='Objects/exceptions.c' line='2679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetEncoding'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2679' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_GetEncoding' mangled-name='PyUnicodeDecodeError_GetEncoding' filepath='Objects/exceptions.c' line='2685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetEncoding'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2685' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_GetObject' mangled-name='PyUnicodeEncodeError_GetObject' filepath='Objects/exceptions.c' line='2691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetObject'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2691' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_GetObject' mangled-name='PyUnicodeDecodeError_GetObject' filepath='Objects/exceptions.c' line='2697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetObject'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2697' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_GetObject' mangled-name='PyUnicodeTranslateError_GetObject' filepath='Objects/exceptions.c' line='2703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetObject'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2703' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_GetStart' mangled-name='PyUnicodeEncodeError_GetStart' filepath='Objects/exceptions.c' line='2709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2709' column='1'/> - <parameter type-id='type-id-13' name='start' filepath='Objects/exceptions.c' line='2709' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_GetStart' mangled-name='PyUnicodeDecodeError_GetStart' filepath='Objects/exceptions.c' line='2728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2728' column='1'/> - <parameter type-id='type-id-13' name='start' filepath='Objects/exceptions.c' line='2728' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_GetStart' mangled-name='PyUnicodeTranslateError_GetStart' filepath='Objects/exceptions.c' line='2746' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2746' column='1'/> - <parameter type-id='type-id-13' name='start' filepath='Objects/exceptions.c' line='2746' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_SetStart' mangled-name='PyUnicodeEncodeError_SetStart' filepath='Objects/exceptions.c' line='2753' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2753' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/exceptions.c' line='2753' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_SetStart' mangled-name='PyUnicodeDecodeError_SetStart' filepath='Objects/exceptions.c' line='2761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2761' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/exceptions.c' line='2761' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_SetStart' mangled-name='PyUnicodeTranslateError_SetStart' filepath='Objects/exceptions.c' line='2769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetStart'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2769' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/exceptions.c' line='2769' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_GetEnd' mangled-name='PyUnicodeEncodeError_GetEnd' filepath='Objects/exceptions.c' line='2777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2777' column='1'/> - <parameter type-id='type-id-13' name='end' filepath='Objects/exceptions.c' line='2777' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_GetEnd' mangled-name='PyUnicodeDecodeError_GetEnd' filepath='Objects/exceptions.c' line='2796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2796' column='1'/> - <parameter type-id='type-id-13' name='end' filepath='Objects/exceptions.c' line='2796' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_GetEnd' mangled-name='PyUnicodeTranslateError_GetEnd' filepath='Objects/exceptions.c' line='2814' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2814' column='1'/> - <parameter type-id='type-id-13' name='end' filepath='Objects/exceptions.c' line='2814' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_SetEnd' mangled-name='PyUnicodeEncodeError_SetEnd' filepath='Objects/exceptions.c' line='2821' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2821' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/exceptions.c' line='2821' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_SetEnd' mangled-name='PyUnicodeDecodeError_SetEnd' filepath='Objects/exceptions.c' line='2829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2829' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/exceptions.c' line='2829' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_SetEnd' mangled-name='PyUnicodeTranslateError_SetEnd' filepath='Objects/exceptions.c' line='2837' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetEnd'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2837' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/exceptions.c' line='2837' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_GetReason' mangled-name='PyUnicodeEncodeError_GetReason' filepath='Objects/exceptions.c' line='2844' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2844' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_GetReason' mangled-name='PyUnicodeDecodeError_GetReason' filepath='Objects/exceptions.c' line='2851' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2851' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_GetReason' mangled-name='PyUnicodeTranslateError_GetReason' filepath='Objects/exceptions.c' line='2858' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2858' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicodeEncodeError_SetReason' mangled-name='PyUnicodeEncodeError_SetReason' filepath='Objects/exceptions.c' line='2865' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2865' column='1'/> - <parameter type-id='type-id-12' name='reason' filepath='Objects/exceptions.c' line='2865' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_SetReason' mangled-name='PyUnicodeDecodeError_SetReason' filepath='Objects/exceptions.c' line='2873' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2873' column='1'/> - <parameter type-id='type-id-12' name='reason' filepath='Objects/exceptions.c' line='2873' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeTranslateError_SetReason' mangled-name='PyUnicodeTranslateError_SetReason' filepath='Objects/exceptions.c' line='2881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetReason'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='2881' column='1'/> - <parameter type-id='type-id-12' name='reason' filepath='Objects/exceptions.c' line='2881' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicodeDecodeError_Create' mangled-name='PyUnicodeDecodeError_Create' filepath='Objects/exceptions.c' line='3134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_Create'> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/exceptions.c' line='3135' column='1'/> - <parameter type-id='type-id-12' name='object' filepath='Objects/exceptions.c' line='3135' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/exceptions.c' line='3135' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/exceptions.c' line='3136' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/exceptions.c' line='3136' column='1'/> - <parameter type-id='type-id-12' name='reason' filepath='Objects/exceptions.c' line='3136' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicodeTranslateError_Create' mangled-name='_PyUnicodeTranslateError_Create' filepath='Objects/exceptions.c' line='3231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeTranslateError_Create'> - <parameter type-id='type-id-2' name='object' filepath='Objects/exceptions.c' line='3232' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/exceptions.c' line='3233' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/exceptions.c' line='3233' column='1'/> - <parameter type-id='type-id-12' name='reason' filepath='Objects/exceptions.c' line='3233' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyException_AddNote' mangled-name='_PyException_AddNote' filepath='Objects/exceptions.c' line='3832' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyException_AddNote'> - <parameter type-id='type-id-2' name='exc' filepath='Objects/exceptions.c' line='3832' column='1'/> - <parameter type-id='type-id-2' name='note' filepath='Objects/exceptions.c' line='3832' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/fileobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyStdPrinter_Type' type-id='type-id-256' mangled-name='PyStdPrinter_Type' visibility='default' filepath='./Include/cpython/fileobject.h' line='11' column='1' elf-symbol-id='PyStdPrinter_Type'/> - <function-decl name='_PyUnicode_AsUTF8String' mangled-name='_PyUnicode_AsUTF8String' filepath='./Include/cpython/unicodeobject.h' line='640' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8String'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_write' mangled-name='_Py_write' filepath='./Include/internal/pycore_fileutils.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_write'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='Py_IsInitialized' mangled-name='Py_IsInitialized' filepath='./Include/pylifecycle.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsInitialized'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='getc_unlocked' filepath='/usr/include/stdio.h' line='527' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='flockfile' filepath='/usr/include/stdio.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='funlockfile' filepath='/usr/include/stdio.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyFile_FromFd' mangled-name='PyFile_FromFd' filepath='Objects/fileobject.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_FromFd'> - <parameter type-id='type-id-8' name='fd' filepath='Objects/fileobject.c' line='32' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/fileobject.c' line='32' column='1'/> - <parameter type-id='type-id-12' name='mode' filepath='Objects/fileobject.c' line='32' column='1'/> - <parameter type-id='type-id-8' name='buffering' filepath='Objects/fileobject.c' line='32' column='1'/> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/fileobject.c' line='32' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/fileobject.c' line='33' column='1'/> - <parameter type-id='type-id-12' name='newline' filepath='Objects/fileobject.c' line='33' column='1'/> - <parameter type-id='type-id-8' name='closefd' filepath='Objects/fileobject.c' line='33' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFile_GetLine' mangled-name='PyFile_GetLine' filepath='Objects/fileobject.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_GetLine'> - <parameter type-id='type-id-2' name='f' filepath='Objects/fileobject.c' line='53' column='1'/> - <parameter type-id='type-id-8' name='n' filepath='Objects/fileobject.c' line='53' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFile_WriteObject' mangled-name='PyFile_WriteObject' filepath='Objects/fileobject.c' line='112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_WriteObject'> - <parameter type-id='type-id-2' name='v' filepath='Objects/fileobject.c' line='112' column='1'/> - <parameter type-id='type-id-2' name='f' filepath='Objects/fileobject.c' line='112' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/fileobject.c' line='112' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFile_WriteString' mangled-name='PyFile_WriteString' filepath='Objects/fileobject.c' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_WriteString'> - <parameter type-id='type-id-12' name='s' filepath='Objects/fileobject.c' line='142' column='1'/> - <parameter type-id='type-id-2' name='f' filepath='Objects/fileobject.c' line='142' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_AsFileDescriptor' mangled-name='PyObject_AsFileDescriptor' filepath='Objects/fileobject.c' line='172' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsFileDescriptor'> - <parameter type-id='type-id-2' name='o' filepath='Objects/fileobject.c' line='172' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_FileDescriptor_Converter' mangled-name='_PyLong_FileDescriptor_Converter' filepath='Objects/fileobject.c' line='218' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FileDescriptor_Converter'> - <parameter type-id='type-id-2' name='o' filepath='Objects/fileobject.c' line='218' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/fileobject.c' line='218' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_UniversalNewlineFgets' mangled-name='Py_UniversalNewlineFgets' filepath='Objects/fileobject.c' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_UniversalNewlineFgets'> - <parameter type-id='type-id-15' name='buf' filepath='Objects/fileobject.c' line='272' column='1'/> - <parameter type-id='type-id-8' name='n' filepath='Objects/fileobject.c' line='272' column='1'/> - <parameter type-id='type-id-229' name='stream' filepath='Objects/fileobject.c' line='272' column='1'/> - <parameter type-id='type-id-2' name='fobj' filepath='Objects/fileobject.c' line='272' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyFile_NewStdPrinter' mangled-name='PyFile_NewStdPrinter' filepath='Objects/fileobject.c' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_NewStdPrinter'> - <parameter type-id='type-id-8' name='fd' filepath='Objects/fileobject.c' line='288' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFile_SetOpenCodeHook' mangled-name='PyFile_SetOpenCodeHook' filepath='Objects/fileobject.c' line='475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_SetOpenCodeHook'> - <parameter type-id='type-id-355' name='hook' filepath='Objects/fileobject.c' line='475' column='1'/> - <parameter type-id='type-id-22' name='userData' filepath='Objects/fileobject.c' line='475' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFile_OpenCodeObject' mangled-name='PyFile_OpenCodeObject' filepath='Objects/fileobject.c' line='495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_OpenCodeObject'> - <parameter type-id='type-id-2' name='path' filepath='Objects/fileobject.c' line='495' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFile_OpenCode' mangled-name='PyFile_OpenCode' filepath='Objects/fileobject.c' line='520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_OpenCode'> - <parameter type-id='type-id-12' name='utf8path' filepath='Objects/fileobject.c' line='520' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/floatobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyStructSequence_Field' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/structseq.h' line='10' column='1' id='type-id-356'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/structseq.h' line='11' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='doc' type-id='type-id-12' visibility='default' filepath='./Include/structseq.h' line='12' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyStructSequence_Field' type-id='type-id-356' filepath='./Include/structseq.h' line='13' column='1' id='type-id-357'/> - <class-decl name='PyStructSequence_Desc' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/structseq.h' line='15' column='1' id='type-id-358'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/structseq.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='doc' type-id='type-id-12' visibility='default' filepath='./Include/structseq.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fields' type-id='type-id-359' visibility='default' filepath='./Include/structseq.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='n_in_sequence' type-id='type-id-8' visibility='default' filepath='./Include/structseq.h' line='19' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyStructSequence_Desc' type-id='type-id-358' filepath='./Include/structseq.h' line='20' column='1' id='type-id-360'/> - <pointer-type-def type-id='type-id-360' size-in-bits='64' id='type-id-361'/> - <pointer-type-def type-id='type-id-357' size-in-bits='64' id='type-id-359'/> - <qualified-type-def type-id='type-id-239' restrict='yes' id='type-id-184'/> - <qualified-type-def type-id='type-id-12' restrict='yes' id='type-id-181'/> - <function-decl name='_PyLong_Sign' mangled-name='_PyLong_Sign' filepath='./Include/cpython/longobject.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Sign'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_NumBits' mangled-name='_PyLong_NumBits' filepath='./Include/cpython/longobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_NumBits'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='_PyLong_Lshift' mangled-name='_PyLong_Lshift' filepath='./Include/cpython/longobject.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Lshift'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDebugAllocatorStats' mangled-name='_PyDebugAllocatorStats' filepath='./Include/cpython/object.h' line='399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDebugAllocatorStats'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-46'/> - </function-decl> - <var-decl name='PyFloat_Type' type-id='type-id-256' mangled-name='PyFloat_Type' visibility='default' filepath='./Include/floatobject.h' line='14' column='1' elf-symbol-id='PyFloat_Type'/> - <function-decl name='_Py_dg_strtod' mangled-name='_Py_dg_strtod' filepath='./Include/internal/pycore_dtoa.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_dg_strtod'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='_Py_dg_dtoa' mangled-name='_Py_dg_dtoa' filepath='./Include/internal/pycore_dtoa.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_dg_dtoa'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-239'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_Py_dg_freedtoa' mangled-name='_Py_dg_freedtoa' filepath='./Include/internal/pycore_dtoa.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_dg_freedtoa'> - <parameter type-id='type-id-15'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFloat_FormatAdvancedWriter' mangled-name='_PyFloat_FormatAdvancedWriter' filepath='./Include/internal/pycore_floatobject.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFloat_FormatAdvancedWriter'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_get_387controlword' filepath='./Include/internal/pycore_pymath.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-84'/> - </function-decl> - <function-decl name='_Py_set_387controlword' filepath='./Include/internal/pycore_pymath.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-84'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyStructSequence_InitBuiltinWithFlags' filepath='./Include/internal/pycore_structseq.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-361'/> - <parameter type-id='type-id-28'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyStructSequence_FiniBuiltin' filepath='./Include/internal/pycore_structseq.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyLong_FromDouble' mangled-name='PyLong_FromDouble' filepath='./Include/longobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromDouble'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetFromErrno' mangled-name='PyErr_SetFromErrno' filepath='./Include/pyerrors.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrno'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_parse_inf_or_nan' mangled-name='_Py_parse_inf_or_nan' filepath='./Include/pystrtod.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_parse_inf_or_nan'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyStructSequence_New' mangled-name='PyStructSequence_New' filepath='./Include/structseq.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_New'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='strtol' filepath='/usr/include/stdlib.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-184'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='frexp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='ldexp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='modf' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-182'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='ceil' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='fmod' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='round' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='301' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyFloat_GetMax' mangled-name='PyFloat_GetMax' filepath='Objects/floatobject.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMax'> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyFloat_GetMin' mangled-name='PyFloat_GetMin' filepath='Objects/floatobject.c' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMin'> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyFloat_GetInfo' mangled-name='PyFloat_GetInfo' filepath='Objects/floatobject.c' line='94' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetInfo'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyFloat_DebugMallocStats' mangled-name='_PyFloat_DebugMallocStats' filepath='Objects/floatobject.c' line='2037' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFloat_DebugMallocStats'> - <parameter type-id='type-id-229' name='out' filepath='Objects/floatobject.c' line='2037' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyFloat_Pack2' mangled-name='PyFloat_Pack2' filepath='Objects/floatobject.c' line='2060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack2'> - <parameter type-id='type-id-251' name='x' filepath='Objects/floatobject.c' line='2060' column='1'/> - <parameter type-id='type-id-15' name='data' filepath='Objects/floatobject.c' line='2060' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2060' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFloat_Pack4' mangled-name='PyFloat_Pack4' filepath='Objects/floatobject.c' line='2165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack4'> - <parameter type-id='type-id-251' name='x' filepath='Objects/floatobject.c' line='2165' column='1'/> - <parameter type-id='type-id-15' name='data' filepath='Objects/floatobject.c' line='2165' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2165' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFloat_Pack8' mangled-name='PyFloat_Pack8' filepath='Objects/floatobject.c' line='2273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack8'> - <parameter type-id='type-id-251' name='x' filepath='Objects/floatobject.c' line='2273' column='1'/> - <parameter type-id='type-id-15' name='data' filepath='Objects/floatobject.c' line='2273' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2273' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFloat_Unpack2' mangled-name='PyFloat_Unpack2' filepath='Objects/floatobject.c' line='2403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack2'> - <parameter type-id='type-id-12' name='data' filepath='Objects/floatobject.c' line='2403' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2403' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyFloat_Unpack4' mangled-name='PyFloat_Unpack4' filepath='Objects/floatobject.c' line='2455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack4'> - <parameter type-id='type-id-12' name='data' filepath='Objects/floatobject.c' line='2455' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2455' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyFloat_Unpack8' mangled-name='PyFloat_Unpack8' filepath='Objects/floatobject.c' line='2534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack8'> - <parameter type-id='type-id-12' name='data' filepath='Objects/floatobject.c' line='2534' column='1'/> - <parameter type-id='type-id-8' name='le' filepath='Objects/floatobject.c' line='2534' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/frameobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyFrameConstructor' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-362' visibility='default' filepath='./Include/cpython/funcobject.h' line='21' column='1' id='type-id-363'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fc_globals' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fc_builtins' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fc_name' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fc_qualname' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='fc_code' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='fc_defaults' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='fc_kwdefaults' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='fc_closure' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyFrameConstructor' type-id='type-id-363' filepath='./Include/cpython/funcobject.h' line='23' column='1' id='type-id-362'/> - <pointer-type-def type-id='type-id-362' size-in-bits='64' id='type-id-364'/> - <function-decl name='PyCompile_OpcodeStackEffect' mangled-name='PyCompile_OpcodeStackEffect' filepath='./Include/cpython/compile.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCompile_OpcodeStackEffect'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyFrame_Type' type-id='type-id-256' mangled-name='PyFrame_Type' visibility='default' filepath='./Include/cpython/pyframe.h' line='5' column='1' elf-symbol-id='PyFrame_Type'/> - <function-decl name='_PyUnicode_Equal' mangled-name='_PyUnicode_Equal' filepath='./Include/cpython/unicodeobject.h' line='956' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_Equal'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyDict_Size' mangled-name='PyDict_Size' filepath='./Include/dictobject.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Size'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyDict_Merge' mangled-name='PyDict_Merge' filepath='./Include/dictobject.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Merge'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_GetBuiltins' filepath='./Include/internal/pycore_ceval.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCode_GetCode' filepath='./Include/internal/pycore_code.h' line='209' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCode_InitAddressRange' filepath='./Include/internal/pycore_code.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <parameter type-id='type-id-320'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLineTable_NextAddressRange' filepath='./Include/internal/pycore_code.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-320'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyFunction_FromConstructor' filepath='./Include/internal/pycore_function.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-364'/> - <return type-id='type-id-310'/> - </function-decl> - <function-decl name='PyThreadState_Get' mangled-name='PyThreadState_Get' filepath='./Include/pystate.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Get'> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyFrame_GetLineNumber' mangled-name='PyFrame_GetLineNumber' filepath='Objects/frameobject.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLineNumber'> - <parameter type-id='type-id-365' name='f' filepath='Objects/frameobject.c' line='34' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFrame_New' mangled-name='PyFrame_New' filepath='Objects/frameobject.c' line='1063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_New'> - <parameter type-id='type-id-177' name='tstate' filepath='Objects/frameobject.c' line='1063' column='1'/> - <parameter type-id='type-id-328' name='code' filepath='Objects/frameobject.c' line='1063' column='1'/> - <parameter type-id='type-id-2' name='globals' filepath='Objects/frameobject.c' line='1064' column='1'/> - <parameter type-id='type-id-2' name='locals' filepath='Objects/frameobject.c' line='1064' column='1'/> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='PyFrame_GetVar' mangled-name='PyFrame_GetVar' filepath='Objects/frameobject.c' line='1305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVar'> - <parameter type-id='type-id-365' name='frame_obj' filepath='Objects/frameobject.c' line='1305' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/frameobject.c' line='1305' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFrame_GetVarString' mangled-name='PyFrame_GetVarString' filepath='Objects/frameobject.c' line='1339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVarString'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1339' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/frameobject.c' line='1339' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFrame_FastToLocalsWithError' mangled-name='PyFrame_FastToLocalsWithError' filepath='Objects/frameobject.c' line='1352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocalsWithError'> - <parameter type-id='type-id-365' name='f' filepath='Objects/frameobject.c' line='1352' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFrame_FastToLocals' mangled-name='PyFrame_FastToLocals' filepath='Objects/frameobject.c' line='1367' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocals'> - <parameter type-id='type-id-365' name='f' filepath='Objects/frameobject.c' line='1367' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyFrame_LocalsToFast' mangled-name='PyFrame_LocalsToFast' filepath='Objects/frameobject.c' line='1453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_LocalsToFast'> - <parameter type-id='type-id-365' name='f' filepath='Objects/frameobject.c' line='1453' column='1'/> - <parameter type-id='type-id-8' name='clear' filepath='Objects/frameobject.c' line='1453' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFrame_IsEntryFrame' mangled-name='_PyFrame_IsEntryFrame' filepath='Objects/frameobject.c' line='1463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFrame_IsEntryFrame'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1463' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFrame_GetCode' mangled-name='PyFrame_GetCode' filepath='Objects/frameobject.c' line='1472' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetCode'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1472' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyFrame_GetBack' mangled-name='PyFrame_GetBack' filepath='Objects/frameobject.c' line='1483' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBack'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1483' column='1'/> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='PyFrame_GetLocals' mangled-name='PyFrame_GetLocals' filepath='Objects/frameobject.c' line='1499' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLocals'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1499' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFrame_GetGlobals' mangled-name='PyFrame_GetGlobals' filepath='Objects/frameobject.c' line='1506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGlobals'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1506' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFrame_GetBuiltins' mangled-name='PyFrame_GetBuiltins' filepath='Objects/frameobject.c' line='1513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBuiltins'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1513' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFrame_GetLasti' mangled-name='PyFrame_GetLasti' filepath='Objects/frameobject.c' line='1520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLasti'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1520' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFrame_GetGenerator' mangled-name='PyFrame_GetGenerator' filepath='Objects/frameobject.c' line='1531' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGenerator'> - <parameter type-id='type-id-365' name='frame' filepath='Objects/frameobject.c' line='1531' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/funcobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyFunction_Type' type-id='type-id-256' mangled-name='PyFunction_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='63' column='1' elf-symbol-id='PyFunction_Type'/> - <var-decl name='PyClassMethod_Type' type-id='type-id-256' mangled-name='PyClassMethod_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='129' column='1' elf-symbol-id='PyClassMethod_Type'/> - <var-decl name='PyStaticMethod_Type' type-id='type-id-256' mangled-name='PyStaticMethod_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='130' column='1' elf-symbol-id='PyStaticMethod_Type'/> - <function-decl name='_PyEval_BuiltinsFromGlobals' filepath='./Include/internal/pycore_ceval.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_AddWatcher' mangled-name='PyFunction_AddWatcher' filepath='Objects/funcobject.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_AddWatcher'> - <parameter type-id='type-id-366' name='callback' filepath='Objects/funcobject.c' line='73' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFunction_ClearWatcher' mangled-name='PyFunction_ClearWatcher' filepath='Objects/funcobject.c' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_ClearWatcher'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/funcobject.c' line='89' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFunction_NewWithQualName' mangled-name='PyFunction_NewWithQualName' filepath='Objects/funcobject.c' line='141' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_NewWithQualName'> - <parameter type-id='type-id-2' name='code' filepath='Objects/funcobject.c' line='141' column='1'/> - <parameter type-id='type-id-2' name='globals' filepath='Objects/funcobject.c' line='141' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/funcobject.c' line='141' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_New' mangled-name='PyFunction_New' filepath='Objects/funcobject.c' line='244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_New'> - <parameter type-id='type-id-2' name='code' filepath='Objects/funcobject.c' line='244' column='1'/> - <parameter type-id='type-id-2' name='globals' filepath='Objects/funcobject.c' line='244' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_GetCode' mangled-name='PyFunction_GetCode' filepath='Objects/funcobject.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetCode'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='250' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_GetGlobals' mangled-name='PyFunction_GetGlobals' filepath='Objects/funcobject.c' line='260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetGlobals'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='260' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_GetModule' mangled-name='PyFunction_GetModule' filepath='Objects/funcobject.c' line='270' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetModule'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='270' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_GetDefaults' mangled-name='PyFunction_GetDefaults' filepath='Objects/funcobject.c' line='280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetDefaults'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='280' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_SetDefaults' mangled-name='PyFunction_SetDefaults' filepath='Objects/funcobject.c' line='290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetDefaults'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='290' column='1'/> - <parameter type-id='type-id-2' name='defaults' filepath='Objects/funcobject.c' line='290' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFunction_SetVectorcall' mangled-name='PyFunction_SetVectorcall' filepath='Objects/funcobject.c' line='313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetVectorcall'> - <parameter type-id='type-id-310' name='func' filepath='Objects/funcobject.c' line='313' column='1'/> - <parameter type-id='type-id-311' name='vectorcall' filepath='Objects/funcobject.c' line='313' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyFunction_GetKwDefaults' mangled-name='PyFunction_GetKwDefaults' filepath='Objects/funcobject.c' line='321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetKwDefaults'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='321' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_SetKwDefaults' mangled-name='PyFunction_SetKwDefaults' filepath='Objects/funcobject.c' line='331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetKwDefaults'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='331' column='1'/> - <parameter type-id='type-id-2' name='defaults' filepath='Objects/funcobject.c' line='331' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFunction_GetClosure' mangled-name='PyFunction_GetClosure' filepath='Objects/funcobject.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetClosure'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='355' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_SetClosure' mangled-name='PyFunction_SetClosure' filepath='Objects/funcobject.c' line='365' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetClosure'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='365' column='1'/> - <parameter type-id='type-id-2' name='closure' filepath='Objects/funcobject.c' line='365' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyFunction_GetAnnotations' mangled-name='PyFunction_GetAnnotations' filepath='Objects/funcobject.c' line='418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetAnnotations'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='418' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyFunction_SetAnnotations' mangled-name='PyFunction_SetAnnotations' filepath='Objects/funcobject.c' line='428' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetAnnotations'> - <parameter type-id='type-id-2' name='op' filepath='Objects/funcobject.c' line='428' column='1'/> - <parameter type-id='type-id-2' name='annotations' filepath='Objects/funcobject.c' line='428' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyClassMethod_New' mangled-name='PyClassMethod_New' filepath='Objects/funcobject.c' line='1167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyClassMethod_New'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/funcobject.c' line='1167' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyStaticMethod_New' mangled-name='PyStaticMethod_New' filepath='Objects/funcobject.c' line='1360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStaticMethod_New'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/funcobject.c' line='1360' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/genericaliasobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyUnicodeWriter_WriteASCIIString' mangled-name='_PyUnicodeWriter_WriteASCIIString' filepath='./Include/cpython/unicodeobject.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteASCIIString'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='Py_GenericAliasType' type-id='type-id-256' mangled-name='Py_GenericAliasType' visibility='default' filepath='./Include/genericaliasobject.h' line='9' column='1' elf-symbol-id='Py_GenericAliasType'/> - <function-decl name='_Py_union_type_or' filepath='./Include/internal/pycore_unionobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyList_SetSlice' mangled-name='PyList_SetSlice' filepath='./Include/listobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_SetSlice'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_Dir' mangled-name='PyObject_Dir' filepath='./Include/object.h' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Dir'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GC_Track' mangled-name='PyObject_GC_Track' filepath='./Include/objimpl.h' line='194' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_Track'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/genobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyGenObject' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-367' visibility='default' filepath='./Include/cpython/genobject.h' line='31' column='1' id='type-id-368'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='gi_weakreflist' type-id='type-id-2' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='gi_name' type-id='type-id-2' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='gi_qualname' type-id='type-id-2' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='gi_exc_state' type-id='type-id-369' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='gi_origin_or_finalizer' type-id='type-id-2' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='gi_hooks_inited' type-id='type-id-48' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='520'> - <var-decl name='gi_closed' type-id='type-id-48' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='528'> - <var-decl name='gi_running_async' type-id='type-id-48' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='536'> - <var-decl name='gi_frame_state' type-id='type-id-370' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='gi_iframe' type-id='type-id-353' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyGenObject' type-id='type-id-368' filepath='./Include/cpython/genobject.h' line='34' column='1' id='type-id-367'/> - <typedef-decl name='_PyInterpreterFrame' type-id='type-id-371' filepath='./Include/internal/pycore_frame.h' line='73' column='1' id='type-id-372'/> - <pointer-type-def type-id='type-id-367' size-in-bits='64' id='type-id-373'/> - <pointer-type-def type-id='type-id-372' size-in-bits='64' id='type-id-374'/> - <function-decl name='_PyEval_EvalFrameDefault' mangled-name='_PyEval_EvalFrameDefault' filepath='./Include/cpython/ceval.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_EvalFrameDefault'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-375'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PyGen_Type' type-id='type-id-256' mangled-name='PyGen_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='36' column='1' elf-symbol-id='PyGen_Type'/> - <var-decl name='PyCoro_Type' type-id='type-id-256' mangled-name='PyCoro_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='56' column='1' elf-symbol-id='PyCoro_Type'/> - <var-decl name='_PyCoroWrapper_Type' type-id='type-id-256' mangled-name='_PyCoroWrapper_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='57' column='1' elf-symbol-id='_PyCoroWrapper_Type'/> - <var-decl name='PyAsyncGen_Type' type-id='type-id-256' mangled-name='PyAsyncGen_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='70' column='1' elf-symbol-id='PyAsyncGen_Type'/> - <var-decl name='_PyAsyncGenASend_Type' type-id='type-id-256' mangled-name='_PyAsyncGenASend_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='71' column='1' elf-symbol-id='_PyAsyncGenASend_Type'/> - <var-decl name='_PyAsyncGenWrappedValue_Type' type-id='type-id-256' mangled-name='_PyAsyncGenWrappedValue_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='72' column='1' elf-symbol-id='_PyAsyncGenWrappedValue_Type'/> - <var-decl name='_PyAsyncGenAThrow_Type' type-id='type-id-256' mangled-name='_PyAsyncGenAThrow_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='73' column='1' elf-symbol-id='_PyAsyncGenAThrow_Type'/> - <function-decl name='PyObject_CallFinalizerFromDealloc' mangled-name='PyObject_CallFinalizerFromDealloc' filepath='./Include/cpython/object.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFinalizerFromDealloc'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_InterpreterFrame_GetLine' mangled-name='PyUnstable_InterpreterFrame_GetLine' filepath='./Include/cpython/pyframe.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetLine'> - <parameter type-id='type-id-375'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_GetFrame' filepath='./Include/internal/pycore_ceval.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-375'/> - </function-decl> - <function-decl name='_PyFrame_Copy' filepath='./Include/internal/pycore_frame.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-374'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFrame_MakeAndSetFrameObject' filepath='./Include/internal/pycore_frame.h' line='197' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='_PyFrame_ClearExceptCode' filepath='./Include/internal/pycore_frame.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFrame_Traverse' filepath='./Include/internal/pycore_frame.h' line='227' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-341'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_ChainStackItem' mangled-name='_PyErr_ChainStackItem' filepath='./Include/internal/pycore_pyerrors.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ChainStackItem'> - <parameter type-id='type-id-376'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_WarnUnawaitedCoroutine' filepath='./Include/internal/pycore_warnings.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_GC_NewVar' mangled-name='_PyObject_GC_NewVar' filepath='./Include/objimpl.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_NewVar'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-322'/> - </function-decl> - <function-decl name='PyErr_SetRaisedException' mangled-name='PyErr_SetRaisedException' filepath='./Include/pyerrors.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetRaisedException'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_NormalizeException' mangled-name='PyErr_NormalizeException' filepath='./Include/pyerrors.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NormalizeException'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyGen_GetCode' mangled-name='PyGen_GetCode' filepath='Objects/genobject.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_GetCode'> - <parameter type-id='type-id-373' name='gen' filepath='Objects/genobject.c' line='36' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='_PyGen_Finalize' mangled-name='_PyGen_Finalize' filepath='Objects/genobject.c' line='70' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_Finalize'> - <parameter type-id='type-id-2' name='self' filepath='Objects/genobject.c' line='70' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGen_SetStopIterationValue' mangled-name='_PyGen_SetStopIterationValue' filepath='Objects/genobject.c' line='619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_SetStopIterationValue'> - <parameter type-id='type-id-2' name='value' filepath='Objects/genobject.c' line='619' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyGen_NewWithQualName' mangled-name='PyGen_NewWithQualName' filepath='Objects/genobject.c' line='989' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_NewWithQualName'> - <parameter type-id='type-id-365' name='f' filepath='Objects/genobject.c' line='989' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/genobject.c' line='989' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/genobject.c' line='989' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyGen_New' mangled-name='PyGen_New' filepath='Objects/genobject.c' line='995' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_New'> - <parameter type-id='type-id-365' name='f' filepath='Objects/genobject.c' line='995' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCoro_New' mangled-name='PyCoro_New' filepath='Objects/genobject.c' line='1353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCoro_New'> - <parameter type-id='type-id-365' name='f' filepath='Objects/genobject.c' line='1353' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/genobject.c' line='1353' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/genobject.c' line='1353' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyAsyncGen_New' mangled-name='PyAsyncGen_New' filepath='Objects/genobject.c' line='1659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAsyncGen_New'> - <parameter type-id='type-id-365' name='f' filepath='Objects/genobject.c' line='1659' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/genobject.c' line='1659' column='1'/> - <parameter type-id='type-id-2' name='qualname' filepath='Objects/genobject.c' line='1659' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/interpreteridobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyInterpreterID_Type' type-id='type-id-256' mangled-name='_PyInterpreterID_Type' visibility='default' filepath='./Include/cpython/interpreteridobject.h' line='7' column='1' elf-symbol-id='_PyInterpreterID_Type'/> - <function-decl name='_PyInterpreterState_LookUpID' mangled-name='_PyInterpreterState_LookUpID' filepath='./Include/internal/pycore_interp.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpID'> - <parameter type-id='type-id-377'/> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='_PyInterpreterState_IDInitref' mangled-name='_PyInterpreterState_IDInitref' filepath='./Include/internal/pycore_interp.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDInitref'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyInterpreterState_IDIncref' mangled-name='_PyInterpreterState_IDIncref' filepath='./Include/internal/pycore_interp.h' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDIncref'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyInterpreterState_IDDecref' mangled-name='_PyInterpreterState_IDDecref' filepath='./Include/internal/pycore_interp.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDDecref'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyLong_FromLongLong' mangled-name='PyLong_FromLongLong' filepath='./Include/longobject.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLongLong'> - <parameter type-id='type-id-378'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_AsLongLong' mangled-name='PyLong_AsLongLong' filepath='./Include/longobject.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLong'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-378'/> - </function-decl> - <function-decl name='PyLong_AsLongLongAndOverflow' mangled-name='PyLong_AsLongLongAndOverflow' filepath='./Include/longobject.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLongAndOverflow'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-378'/> - </function-decl> - <function-decl name='PyArg_ParseTupleAndKeywords' mangled-name='PyArg_ParseTupleAndKeywords' filepath='./Include/modsupport.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ParseTupleAndKeywords'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyInterpreterState_GetID' mangled-name='PyInterpreterState_GetID' filepath='./Include/pystate.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_GetID'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-377'/> - </function-decl> - <function-decl name='_PyInterpreterID_New' mangled-name='_PyInterpreterID_New' filepath='Objects/interpreteridobject.c' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterID_New'> - <parameter type-id='type-id-377' name='id' filepath='Objects/interpreteridobject.c' line='268' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyInterpreterState_GetIDObject' mangled-name='_PyInterpreterState_GetIDObject' filepath='Objects/interpreteridobject.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetIDObject'> - <parameter type-id='type-id-20' name='interp' filepath='Objects/interpreteridobject.c' line='274' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyInterpreterID_LookUp' mangled-name='_PyInterpreterID_LookUp' filepath='Objects/interpreteridobject.c' line='287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterID_LookUp'> - <parameter type-id='type-id-2' name='requested_id' filepath='Objects/interpreteridobject.c' line='287' column='1'/> - <return type-id='type-id-20'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/iterobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyCoro_GetAwaitableIter' filepath='./Include/internal/pycore_genobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PySeqIter_Type' type-id='type-id-256' mangled-name='PySeqIter_Type' visibility='default' filepath='./Include/iterobject.h' line='8' column='1' elf-symbol-id='PySeqIter_Type'/> - <var-decl name='PyCallIter_Type' type-id='type-id-256' mangled-name='PyCallIter_Type' visibility='default' filepath='./Include/iterobject.h' line='9' column='1' elf-symbol-id='PyCallIter_Type'/> - <var-decl name='_PyAnextAwaitable_Type' type-id='type-id-256' visibility='default' filepath='./Include/iterobject.h' line='11' column='1'/> - <function-decl name='PyCallIter_New' mangled-name='PyCallIter_New' filepath='Objects/iterobject.c' line='184' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCallIter_New'> - <parameter type-id='type-id-2' name='callable' filepath='Objects/iterobject.c' line='184' column='1'/> - <parameter type-id='type-id-2' name='sentinel' filepath='Objects/iterobject.c' line='184' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/listobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyEval_SliceIndexNotNone' mangled-name='_PyEval_SliceIndexNotNone' filepath='./Include/cpython/ceval.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SliceIndexNotNone'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_WriteChar' mangled-name='_PyUnicodeWriter_WriteChar' filepath='./Include/cpython/unicodeobject.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteChar'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyList_Type' type-id='type-id-256' mangled-name='PyList_Type' visibility='default' filepath='./Include/listobject.h' line='20' column='1' elf-symbol-id='PyList_Type'/> - <var-decl name='PyListIter_Type' type-id='type-id-256' mangled-name='PyListIter_Type' visibility='default' filepath='./Include/listobject.h' line='21' column='1' elf-symbol-id='PyListIter_Type'/> - <var-decl name='PyListRevIter_Type' type-id='type-id-256' mangled-name='PyListRevIter_Type' visibility='default' filepath='./Include/listobject.h' line='22' column='1' elf-symbol-id='PyListRevIter_Type'/> - <function-decl name='PyObject_HashNotImplemented' mangled-name='PyObject_HashNotImplemented' filepath='./Include/object.h' line='421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HashNotImplemented'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='Py_ReprEnter' mangled-name='Py_ReprEnter' filepath='./Include/object.h' line='441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ReprEnter'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_ReprLeave' mangled-name='Py_ReprLeave' filepath='./Include/object.h' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ReprLeave'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyList_DebugMallocStats' mangled-name='_PyList_DebugMallocStats' filepath='Objects/listobject.c' line='145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_DebugMallocStats'> - <parameter type-id='type-id-229' name='out' filepath='Objects/listobject.c' line='145' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyList_Size' mangled-name='PyList_Size' filepath='Objects/listobject.c' line='220' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Size'> - <parameter type-id='type-id-2' name='op' filepath='Objects/listobject.c' line='220' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyList_SetItem' mangled-name='PyList_SetItem' filepath='Objects/listobject.c' line='259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_SetItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/listobject.c' line='259' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/listobject.c' line='259' column='1'/> - <parameter type-id='type-id-2' name='newitem' filepath='Objects/listobject.c' line='260' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyList_Insert' mangled-name='PyList_Insert' filepath='Objects/listobject.c' line='308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Insert'> - <parameter type-id='type-id-2' name='op' filepath='Objects/listobject.c' line='308' column='1'/> - <parameter type-id='type-id-14' name='where' filepath='Objects/listobject.c' line='308' column='1'/> - <parameter type-id='type-id-2' name='newitem' filepath='Objects/listobject.c' line='308' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyList_GetSlice' mangled-name='PyList_GetSlice' filepath='Objects/listobject.c' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_GetSlice'> - <parameter type-id='type-id-2' name='a' filepath='Objects/listobject.c' line='491' column='1'/> - <parameter type-id='type-id-14' name='ilow' filepath='Objects/listobject.c' line='491' column='1'/> - <parameter type-id='type-id-14' name='ihigh' filepath='Objects/listobject.c' line='491' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyList_Sort' mangled-name='PyList_Sort' filepath='Objects/listobject.c' line='2514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Sort'> - <parameter type-id='type-id-2' name='v' filepath='Objects/listobject.c' line='2514' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/longobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-85' size-in-bits='2048' id='type-id-379'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <qualified-type-def type-id='type-id-240' const='yes' id='type-id-380'/> - <pointer-type-def type-id='type-id-380' size-in-bits='64' id='type-id-381'/> - <qualified-type-def type-id='type-id-85' const='yes' id='type-id-382'/> - <pointer-type-def type-id='type-id-382' size-in-bits='64' id='type-id-383'/> - <pointer-type-def type-id='type-id-384' size-in-bits='64' id='type-id-385'/> - <pointer-type-def type-id='type-id-85' size-in-bits='64' id='type-id-386'/> - <function-decl name='_PyUnicodeWriter_PrepareInternal' mangled-name='_PyUnicodeWriter_PrepareInternal' filepath='./Include/cpython/unicodeobject.h' line='532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareInternal'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_PyLong_DigitValue' type-id='type-id-379' mangled-name='_PyLong_DigitValue' visibility='default' filepath='./Include/internal/pycore_long.h' line='87' column='1' elf-symbol-id='_PyLong_DigitValue'/> - <function-decl name='_PyLong_FormatAdvancedWriter' mangled-name='_PyLong_FormatAdvancedWriter' filepath='./Include/internal/pycore_long.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FormatAdvancedWriter'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyLong_Type' type-id='type-id-256' mangled-name='PyLong_Type' visibility='default' filepath='./Include/object.h' line='226' column='1' elf-symbol-id='PyLong_Type'/> - <function-decl name='PyObject_Bytes' mangled-name='PyObject_Bytes' filepath='./Include/object.h' line='405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Bytes'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_New' mangled-name='_PyLong_New' filepath='Objects/longobject.c' line='141' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_New'> - <parameter type-id='type-id-14' name='size' filepath='Objects/longobject.c' line='141' column='1'/> - <return type-id='type-id-241'/> - </function-decl> - <function-decl name='_PyLong_FromDigits' mangled-name='_PyLong_FromDigits' filepath='Objects/longobject.c' line='173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromDigits'> - <parameter type-id='type-id-8' name='negative' filepath='Objects/longobject.c' line='173' column='1'/> - <parameter type-id='type-id-14' name='digit_count' filepath='Objects/longobject.c' line='173' column='1'/> - <parameter type-id='type-id-385' name='digits' filepath='Objects/longobject.c' line='173' column='1'/> - <return type-id='type-id-241'/> - </function-decl> - <function-decl name='PyLong_FromUnsignedLong' mangled-name='PyLong_FromUnsignedLong' filepath='Objects/longobject.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLong'> - <parameter type-id='type-id-28' name='ival' filepath='Objects/longobject.c' line='360' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_FromUnsignedLongLong' mangled-name='PyLong_FromUnsignedLongLong' filepath='Objects/longobject.c' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLongLong'> - <parameter type-id='type-id-387' name='ival' filepath='Objects/longobject.c' line='368' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_AsLong' mangled-name='PyLong_AsLong' filepath='Objects/longobject.c' line='535' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLong'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='535' column='1'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyLong_AsUnsignedLong' mangled-name='PyLong_AsUnsignedLong' filepath='Objects/longobject.c' line='619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLong'> - <parameter type-id='type-id-2' name='vv' filepath='Objects/longobject.c' line='619' column='1'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyLong_AsSize_t' mangled-name='PyLong_AsSize_t' filepath='Objects/longobject.c' line='672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsSize_t'> - <parameter type-id='type-id-2' name='vv' filepath='Objects/longobject.c' line='672' column='1'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='PyLong_AsUnsignedLongMask' mangled-name='PyLong_AsUnsignedLongMask' filepath='Objects/longobject.c' line='738' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongMask'> - <parameter type-id='type-id-2' name='op' filepath='Objects/longobject.c' line='738' column='1'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='_PyLong_FromByteArray' mangled-name='_PyLong_FromByteArray' filepath='Objects/longobject.c' line='815' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromByteArray'> - <parameter type-id='type-id-383' name='bytes' filepath='Objects/longobject.c' line='815' column='1'/> - <parameter type-id='type-id-19' name='n' filepath='Objects/longobject.c' line='815' column='1'/> - <parameter type-id='type-id-8' name='little_endian' filepath='Objects/longobject.c' line='816' column='1'/> - <parameter type-id='type-id-8' name='is_signed' filepath='Objects/longobject.c' line='816' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_AsByteArray' mangled-name='_PyLong_AsByteArray' filepath='Objects/longobject.c' line='930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsByteArray'> - <parameter type-id='type-id-241' name='v' filepath='Objects/longobject.c' line='930' column='1'/> - <parameter type-id='type-id-386' name='bytes' filepath='Objects/longobject.c' line='931' column='1'/> - <parameter type-id='type-id-19' name='n' filepath='Objects/longobject.c' line='931' column='1'/> - <parameter type-id='type-id-8' name='little_endian' filepath='Objects/longobject.c' line='932' column='1'/> - <parameter type-id='type-id-8' name='is_signed' filepath='Objects/longobject.c' line='932' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyLong_AsVoidPtr' mangled-name='PyLong_AsVoidPtr' filepath='Objects/longobject.c' line='1081' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsVoidPtr'> - <parameter type-id='type-id-2' name='vv' filepath='Objects/longobject.c' line='1081' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyLong_AsUnsignedLongLong' mangled-name='PyLong_AsUnsignedLongLong' filepath='Objects/longobject.c' line='1252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLong'> - <parameter type-id='type-id-2' name='vv' filepath='Objects/longobject.c' line='1252' column='1'/> - <return type-id='type-id-387'/> - </function-decl> - <function-decl name='PyLong_AsUnsignedLongLongMask' mangled-name='PyLong_AsUnsignedLongLongMask' filepath='Objects/longobject.c' line='1313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLongMask'> - <parameter type-id='type-id-2' name='op' filepath='Objects/longobject.c' line='1313' column='1'/> - <return type-id='type-id-387'/> - </function-decl> - <function-decl name='_PyLong_UnsignedShort_Converter' mangled-name='_PyLong_UnsignedShort_Converter' filepath='Objects/longobject.c' line='1410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedShort_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='1410' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/longobject.c' line='1410' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_UnsignedInt_Converter' mangled-name='_PyLong_UnsignedInt_Converter' filepath='Objects/longobject.c' line='1432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedInt_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='1432' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/longobject.c' line='1432' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_UnsignedLong_Converter' mangled-name='_PyLong_UnsignedLong_Converter' filepath='Objects/longobject.c' line='1454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLong_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='1454' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/longobject.c' line='1454' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_UnsignedLongLong_Converter' mangled-name='_PyLong_UnsignedLongLong_Converter' filepath='Objects/longobject.c' line='1471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLongLong_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='1471' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/longobject.c' line='1471' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_Size_t_Converter' mangled-name='_PyLong_Size_t_Converter' filepath='Objects/longobject.c' line='1488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Size_t_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='1488' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/longobject.c' line='1488' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_FormatWriter' mangled-name='_PyLong_FormatWriter' filepath='Objects/longobject.c' line='2166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FormatWriter'> - <parameter type-id='type-id-332' name='writer' filepath='Objects/longobject.c' line='2166' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/longobject.c' line='2167' column='1'/> - <parameter type-id='type-id-8' name='base' filepath='Objects/longobject.c' line='2168' column='1'/> - <parameter type-id='type-id-8' name='alternate' filepath='Objects/longobject.c' line='2168' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyLong_Frexp' mangled-name='_PyLong_Frexp' filepath='Objects/longobject.c' line='3095' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Frexp'> - <parameter type-id='type-id-241' name='a' filepath='Objects/longobject.c' line='3095' column='1'/> - <parameter type-id='type-id-13' name='e' filepath='Objects/longobject.c' line='3095' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='_PyLong_Rshift' mangled-name='_PyLong_Rshift' filepath='Objects/longobject.c' line='5042' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Rshift'> - <parameter type-id='type-id-2' name='a' filepath='Objects/longobject.c' line='5042' column='1'/> - <parameter type-id='type-id-19' name='shiftby' filepath='Objects/longobject.c' line='5042' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_GCD' mangled-name='_PyLong_GCD' filepath='Objects/longobject.c' line='5321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_GCD'> - <parameter type-id='type-id-2' name='aarg' filepath='Objects/longobject.c' line='5321' column='1'/> - <parameter type-id='type-id-2' name='barg' filepath='Objects/longobject.c' line='5321' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_DivmodNear' mangled-name='_PyLong_DivmodNear' filepath='Objects/longobject.c' line='5687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_DivmodNear'> - <parameter type-id='type-id-2' name='a' filepath='Objects/longobject.c' line='5687' column='1'/> - <parameter type-id='type-id-2' name='b' filepath='Objects/longobject.c' line='5687' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_GetInfo' mangled-name='PyLong_GetInfo' filepath='Objects/longobject.c' line='6321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetInfo'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnstable_Long_IsCompact' mangled-name='PyUnstable_Long_IsCompact' filepath='Objects/longobject.c' line='6376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_IsCompact'> - <parameter type-id='type-id-381' name='op' filepath='Objects/longobject.c' line='6376' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_Long_CompactValue' mangled-name='PyUnstable_Long_CompactValue' filepath='Objects/longobject.c' line='6383' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_CompactValue'> - <parameter type-id='type-id-381' name='op' filepath='Objects/longobject.c' line='6383' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/memoryobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyManagedBuffer_Type' type-id='type-id-256' mangled-name='_PyManagedBuffer_Type' visibility='default' filepath='./Include/cpython/memoryobject.h' line='5' column='1' elf-symbol-id='_PyManagedBuffer_Type'/> - <var-decl name='PyMemoryView_Type' type-id='type-id-256' mangled-name='PyMemoryView_Type' visibility='default' filepath='./Include/memoryobject.h' line='9' column='1' elf-symbol-id='PyMemoryView_Type'/> - <function-decl name='PyUnicode_AsASCIIString' mangled-name='PyUnicode_AsASCIIString' filepath='./Include/unicodeobject.h' line='639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsASCIIString'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMemoryView_FromMemory' mangled-name='PyMemoryView_FromMemory' filepath='Objects/memoryobject.c' line='739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromMemory'> - <parameter type-id='type-id-15' name='mem' filepath='Objects/memoryobject.c' line='739' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/memoryobject.c' line='739' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/memoryobject.c' line='739' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMemoryView_FromBuffer' mangled-name='PyMemoryView_FromBuffer' filepath='Objects/memoryobject.c' line='768' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromBuffer'> - <parameter type-id='type-id-245' name='info' filepath='Objects/memoryobject.c' line='768' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMemoryView_FromObject' mangled-name='PyMemoryView_FromObject' filepath='Objects/memoryobject.c' line='852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromObject'> - <parameter type-id='type-id-2' name='v' filepath='Objects/memoryobject.c' line='852' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMemoryView_GetContiguous' mangled-name='PyMemoryView_GetContiguous' filepath='Objects/memoryobject.c' line='964' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_GetContiguous'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/memoryobject.c' line='964' column='1'/> - <parameter type-id='type-id-8' name='buffertype' filepath='Objects/memoryobject.c' line='964' column='1'/> - <parameter type-id='type-id-48' name='order' filepath='Objects/memoryobject.c' line='964' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/methodobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyCMethod_Type' type-id='type-id-256' mangled-name='PyCMethod_Type' visibility='default' filepath='./Include/cpython/methodobject.h' line='32' column='1' elf-symbol-id='PyCMethod_Type'/> - <var-decl name='PyCFunction_Type' type-id='type-id-256' mangled-name='PyCFunction_Type' visibility='default' filepath='./Include/methodobject.h' line='14' column='1' elf-symbol-id='PyCFunction_Type'/> - <function-decl name='PyCFunction_New' mangled-name='PyCFunction_New' filepath='Objects/methodobject.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_New'> - <parameter type-id='type-id-337' name='ml' filepath='Objects/methodobject.c' line='32' column='1'/> - <parameter type-id='type-id-2' name='self' filepath='Objects/methodobject.c' line='32' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCFunction_NewEx' mangled-name='PyCFunction_NewEx' filepath='Objects/methodobject.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_NewEx'> - <parameter type-id='type-id-337' name='ml' filepath='Objects/methodobject.c' line='38' column='1'/> - <parameter type-id='type-id-2' name='self' filepath='Objects/methodobject.c' line='38' column='1'/> - <parameter type-id='type-id-2' name='module' filepath='Objects/methodobject.c' line='38' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCFunction_GetFunction' mangled-name='PyCFunction_GetFunction' filepath='Objects/methodobject.c' line='116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetFunction'> - <parameter type-id='type-id-2' name='op' filepath='Objects/methodobject.c' line='116' column='1'/> - <return type-id='type-id-388'/> - </function-decl> - <function-decl name='PyCFunction_GetSelf' mangled-name='PyCFunction_GetSelf' filepath='Objects/methodobject.c' line='126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetSelf'> - <parameter type-id='type-id-2' name='op' filepath='Objects/methodobject.c' line='126' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCFunction_GetFlags' mangled-name='PyCFunction_GetFlags' filepath='Objects/methodobject.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetFlags'> - <parameter type-id='type-id-2' name='op' filepath='Objects/methodobject.c' line='136' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/moduleobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyModuleDef_Base' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='44' column='1' id='type-id-389'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/moduleobject.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='m_init' type-id='type-id-390' visibility='default' filepath='./Include/moduleobject.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='m_index' type-id='type-id-14' visibility='default' filepath='./Include/moduleobject.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='m_copy' type-id='type-id-2' visibility='default' filepath='./Include/moduleobject.h' line='62' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyModuleDef_Base' type-id='type-id-389' filepath='./Include/moduleobject.h' line='63' column='1' id='type-id-391'/> - <class-decl name='PyModuleDef_Slot' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='74' column='1' id='type-id-392'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='slot' type-id='type-id-8' visibility='default' filepath='./Include/moduleobject.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-22' visibility='default' filepath='./Include/moduleobject.h' line='76' column='1'/> - </data-member> - </class-decl> - <class-decl name='PyModuleDef' size-in-bits='832' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='94' column='1' id='type-id-393'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='m_base' type-id='type-id-391' visibility='default' filepath='./Include/moduleobject.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='m_name' type-id='type-id-12' visibility='default' filepath='./Include/moduleobject.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='m_doc' type-id='type-id-12' visibility='default' filepath='./Include/moduleobject.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='m_size' type-id='type-id-14' visibility='default' filepath='./Include/moduleobject.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='m_methods' type-id='type-id-337' visibility='default' filepath='./Include/moduleobject.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='m_slots' type-id='type-id-394' visibility='default' filepath='./Include/moduleobject.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='m_traverse' type-id='type-id-395' visibility='default' filepath='./Include/moduleobject.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='m_clear' type-id='type-id-396' visibility='default' filepath='./Include/moduleobject.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='m_free' type-id='type-id-397' visibility='default' filepath='./Include/moduleobject.h' line='103' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyModuleDef' type-id='type-id-393' filepath='./Include/pytypedefs.h' line='12' column='1' id='type-id-3'/> - <typedef-decl name='PyModuleDef_Slot' type-id='type-id-392' filepath='./Include/pytypedefs.h' line='13' column='1' id='type-id-398'/> - <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-399'/> - <pointer-type-def type-id='type-id-398' size-in-bits='64' id='type-id-394'/> - <function-decl name='_PyImport_IsInitialized' mangled-name='_PyImport_IsInitialized' filepath='./Include/cpython/import.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_IsInitialized'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_GenericGetAttrWithDict' mangled-name='_PyObject_GenericGetAttrWithDict' filepath='./Include/cpython/object.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GenericGetAttrWithDict'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_FormatFromCause' mangled-name='_PyErr_FormatFromCause' filepath='./Include/cpython/pyerrors.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_FormatFromCause'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetNextModuleIndex' filepath='./Include/internal/pycore_import.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyImport_ResolveNameWithPackageContext' filepath='./Include/internal/pycore_import.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_PyImport_ImportlibModuleRepr' filepath='./Include/internal/pycore_import.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_CheckSubinterpIncompatibleExtensionAllowed' mangled-name='_PyImport_CheckSubinterpIncompatibleExtensionAllowed' filepath='./Include/internal/pycore_import.h' line='172' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_CheckSubinterpIncompatibleExtensionAllowed'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyModule_Type' type-id='type-id-256' mangled-name='PyModule_Type' visibility='default' filepath='./Include/moduleobject.h' line='10' column='1' elf-symbol-id='PyModule_Type'/> - <var-decl name='PyModuleDef_Type' type-id='type-id-256' mangled-name='PyModuleDef_Type' visibility='default' filepath='./Include/moduleobject.h' line='41' column='1' elf-symbol-id='PyModuleDef_Type'/> - <function-decl name='PyObject_SetAttrString' mangled-name='PyObject_SetAttrString' filepath='./Include/object.h' line='409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttrString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySys_FormatStderr' mangled-name='PySys_FormatStderr' filepath='./Include/sysmodule.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStderr'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyModuleDef_Init' mangled-name='PyModuleDef_Init' filepath='Objects/moduleobject.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModuleDef_Init'> - <parameter type-id='type-id-399' name='def' filepath='Objects/moduleobject.c' line='41' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_NewObject' mangled-name='PyModule_NewObject' filepath='Objects/moduleobject.c' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_NewObject'> - <parameter type-id='type-id-2' name='name' filepath='Objects/moduleobject.c' line='107' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_New' mangled-name='PyModule_New' filepath='Objects/moduleobject.c' line='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_New'> - <parameter type-id='type-id-12' name='name' filepath='Objects/moduleobject.c' line='123' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_Create2' mangled-name='PyModule_Create2' filepath='Objects/moduleobject.c' line='183' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_Create2'> - <parameter type-id='type-id-399' name='module' filepath='Objects/moduleobject.c' line='183' column='1'/> - <parameter type-id='type-id-8' name='module_api_version' filepath='Objects/moduleobject.c' line='183' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyModule_CreateInitialized' mangled-name='_PyModule_CreateInitialized' filepath='Objects/moduleobject.c' line='194' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyModule_CreateInitialized'> - <parameter type-id='type-id-399' name='module' filepath='Objects/moduleobject.c' line='194' column='1'/> - <parameter type-id='type-id-8' name='module_api_version' filepath='Objects/moduleobject.c' line='194' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_FromDefAndSpec2' mangled-name='PyModule_FromDefAndSpec2' filepath='Objects/moduleobject.c' line='242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_FromDefAndSpec2'> - <parameter type-id='type-id-399' name='def' filepath='Objects/moduleobject.c' line='242' column='1'/> - <parameter type-id='type-id-2' name='spec' filepath='Objects/moduleobject.c' line='242' column='1'/> - <parameter type-id='type-id-8' name='module_api_version' filepath='Objects/moduleobject.c' line='242' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_ExecDef' mangled-name='PyModule_ExecDef' filepath='Objects/moduleobject.c' line='405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_ExecDef'> - <parameter type-id='type-id-2' name='module' filepath='Objects/moduleobject.c' line='405' column='1'/> - <parameter type-id='type-id-399' name='def' filepath='Objects/moduleobject.c' line='405' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_AddFunctions' mangled-name='PyModule_AddFunctions' filepath='Objects/moduleobject.c' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddFunctions'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='473' column='1'/> - <parameter type-id='type-id-337' name='functions' filepath='Objects/moduleobject.c' line='473' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_SetDocString' mangled-name='PyModule_SetDocString' filepath='Objects/moduleobject.c' line='487' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_SetDocString'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='487' column='1'/> - <parameter type-id='type-id-12' name='doc' filepath='Objects/moduleobject.c' line='487' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_GetName' mangled-name='PyModule_GetName' filepath='Objects/moduleobject.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetName'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='533' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyModule_GetFilenameObject' mangled-name='PyModule_GetFilenameObject' filepath='Objects/moduleobject.c' line='545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetFilenameObject'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='545' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_GetFilename' mangled-name='PyModule_GetFilename' filepath='Objects/moduleobject.c' line='567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetFilename'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='567' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyModule_GetDef' mangled-name='PyModule_GetDef' filepath='Objects/moduleobject.c' line='580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetDef'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='580' column='1'/> - <return type-id='type-id-399'/> - </function-decl> - <function-decl name='PyModule_GetState' mangled-name='PyModule_GetState' filepath='Objects/moduleobject.c' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetState'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='590' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyModule_Clear' mangled-name='_PyModule_Clear' filepath='Objects/moduleobject.c' line='600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyModule_Clear'> - <parameter type-id='type-id-2' name='m' filepath='Objects/moduleobject.c' line='600' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyModule_ClearDict' mangled-name='_PyModule_ClearDict' filepath='Objects/moduleobject.c' line='608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyModule_ClearDict'> - <parameter type-id='type-id-2' name='d' filepath='Objects/moduleobject.c' line='608' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyModuleSpec_IsInitializing' mangled-name='_PyModuleSpec_IsInitializing' filepath='Objects/moduleobject.c' line='739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyModuleSpec_IsInitializing'> - <parameter type-id='type-id-2' name='spec' filepath='Objects/moduleobject.c' line='739' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-400'> - <return type-id='type-id-2'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Objects/namespaceobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyNamespace_Type' type-id='type-id-256' mangled-name='_PyNamespace_Type' visibility='default' filepath='./Include/internal/pycore_namespace.h' line='13' column='1' elf-symbol-id='_PyNamespace_Type'/> - <function-decl name='PyUnicode_Join' mangled-name='PyUnicode_Join' filepath='./Include/unicodeobject.h' line='889' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Join'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyNamespace_New' mangled-name='_PyNamespace_New' filepath='Objects/namespaceobject.c' line='247' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyNamespace_New'> - <parameter type-id='type-id-2' name='kwds' filepath='Objects/namespaceobject.c' line='247' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/object.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='192' id='type-id-91'> - <subrange length='6' type-id='type-id-28' id='type-id-401'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='infinite' id='type-id-402'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <class-decl name='PyModuleObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-403' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='11' column='1' id='type-id-404'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='md_dict' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='13' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='md_def' type-id='type-id-399' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='md_state' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='md_weaklist' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='md_name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='18' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyModuleObject' type-id='type-id-404' filepath='./Include/internal/pycore_moduleobject.h' line='19' column='1' id='type-id-403'/> - <enum-decl name='PyGILState_STATE' naming-typedef-id='type-id-405' filepath='./Include/pystate.h' line='77' column='1' id='type-id-406'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PyGILState_LOCKED' value='0'/> - <enumerator name='PyGILState_UNLOCKED' value='1'/> - </enum-decl> - <typedef-decl name='PyGILState_STATE' type-id='type-id-406' filepath='./Include/pystate.h' line='78' column='1' id='type-id-405'/> - <pointer-type-def type-id='type-id-403' size-in-bits='64' id='type-id-407'/> - <pointer-type-def type-id='type-id-408' size-in-bits='64' id='type-id-409'/> - <pointer-type-def type-id='type-id-410' size-in-bits='64' id='type-id-411'/> - <qualified-type-def type-id='type-id-22' restrict='yes' id='type-id-226'/> - <var-decl name='_PyNone_Type' type-id='type-id-256' mangled-name='_PyNone_Type' visibility='default' filepath='./Include/cpython/object.h' line='390' column='1' elf-symbol-id='_PyNone_Type'/> - <var-decl name='_PyNotImplemented_Type' type-id='type-id-256' mangled-name='_PyNotImplemented_Type' visibility='default' filepath='./Include/cpython/object.h' line='391' column='1' elf-symbol-id='_PyNotImplemented_Type'/> - <var-decl name='_Py_SwappedOp' type-id='type-id-402' mangled-name='_Py_SwappedOp' visibility='default' filepath='./Include/cpython/object.h' line='396' column='1' elf-symbol-id='_Py_SwappedOp'/> - <function-decl name='PyMem_RawMalloc' mangled-name='PyMem_RawMalloc' filepath='./Include/cpython/pymem.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawMalloc'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyTuple_DebugMallocStats' mangled-name='_PyTuple_DebugMallocStats' filepath='./Include/cpython/tupleobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_DebugMallocStats'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_CheckConsistency' mangled-name='_PyUnicode_CheckConsistency' filepath='./Include/cpython/unicodeobject.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_CheckConsistency'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_AsASCIIString' mangled-name='_PyUnicode_AsASCIIString' filepath='./Include/cpython/unicodeobject.h' line='713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsASCIIString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyEval_GetFrameLocals' filepath='./Include/internal/pycore_ceval.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObjectDict_SetItem' filepath='./Include/internal/pycore_dict.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_MakeDictFromInstanceAttributes' filepath='./Include/internal/pycore_dict.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-347'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_module_getattro_impl' filepath='./Include/internal/pycore_moduleobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-407'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_module_getattro' filepath='./Include/internal/pycore_moduleobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-407'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyType_CheckConsistency' mangled-name='_PyType_CheckConsistency' filepath='./Include/internal/pycore_object.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_CheckConsistency'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTraceMalloc_NewReference' filepath='./Include/internal/pycore_object.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_StoreInstanceAttribute' filepath='./Include/internal/pycore_object.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-347'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_GetInstanceAttribute' filepath='./Include/internal/pycore_object.h' line='363' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-347'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyStaticType_GetState' filepath='./Include/internal/pycore_typeobject.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-411'/> - </function-decl> - <function-decl name='_Py_type_getattro_impl' filepath='./Include/internal/pycore_typeobject.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_type_getattro' filepath='./Include/internal/pycore_typeobject.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_initialize_generic' filepath='./Include/internal/pycore_typevarobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_Py_NoneStruct' type-id='type-id-345' mangled-name='_Py_NoneStruct' visibility='default' filepath='./Include/object.h' line='845' column='1' elf-symbol-id='_Py_NoneStruct'/> - <var-decl name='_Py_NotImplementedStruct' type-id='type-id-345' mangled-name='_Py_NotImplementedStruct' visibility='default' filepath='./Include/object.h' line='859' column='1' elf-symbol-id='_Py_NotImplementedStruct'/> - <function-decl name='PyThreadState_GetDict' mangled-name='PyThreadState_GetDict' filepath='./Include/pystate.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetDict'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyGILState_Ensure' mangled-name='PyGILState_Ensure' filepath='./Include/pystate.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Ensure'> - <return type-id='type-id-405'/> - </function-decl> - <function-decl name='PyGILState_Release' mangled-name='PyGILState_Release' filepath='./Include/pystate.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Release'> - <parameter type-id='type-id-405'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_tss_is_created' mangled-name='PyThread_tss_is_created' filepath='./Include/pythread.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_is_created'> - <parameter type-id='type-id-409'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_tss_set' mangled-name='PyThread_tss_set' filepath='./Include/pythread.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_set'> - <parameter type-id='type-id-409'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_tss_get' mangled-name='PyThread_tss_get' filepath='./Include/pythread.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_get'> - <parameter type-id='type-id-409'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyUnicode_DecodeASCII' mangled-name='PyUnicode_DecodeASCII' filepath='./Include/unicodeobject.h' line='633' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeASCII'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='fprintf' filepath='/usr/include/stdio.h' line='350' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-412'/> - <parameter type-id='type-id-181'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fwrite' filepath='/usr/include/stdio.h' line='681' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-226'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-412'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='ferror' filepath='/usr/include/stdio.h' line='790' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyMem_DumpTraceback' filepath='Objects/object.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_CheckConsistency' mangled-name='_PyObject_CheckConsistency' filepath='Objects/object.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CheckConsistency'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='36' column='1'/> - <parameter type-id='type-id-8' name='check_content' filepath='Objects/object.c' line='36' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_IncRef' mangled-name='Py_IncRef' filepath='Objects/object.c' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IncRef'> - <parameter type-id='type-id-2' name='o' filepath='Objects/object.c' line='268' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_DecRef' mangled-name='Py_DecRef' filepath='Objects/object.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_DecRef'> - <parameter type-id='type-id-2' name='o' filepath='Objects/object.c' line='274' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_IncRef' mangled-name='_Py_IncRef' filepath='Objects/object.c' line='280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IncRef'> - <parameter type-id='type-id-2' name='o' filepath='Objects/object.c' line='280' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_DecRef' mangled-name='_Py_DecRef' filepath='Objects/object.c' line='286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecRef'> - <parameter type-id='type-id-2' name='o' filepath='Objects/object.c' line='286' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_Init' mangled-name='PyObject_Init' filepath='Objects/object.c' line='295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Init'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='295' column='1'/> - <parameter type-id='type-id-1' name='tp' filepath='Objects/object.c' line='295' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_InitVar' mangled-name='PyObject_InitVar' filepath='Objects/object.c' line='306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_InitVar'> - <parameter type-id='type-id-322' name='op' filepath='Objects/object.c' line='306' column='1'/> - <parameter type-id='type-id-1' name='tp' filepath='Objects/object.c' line='306' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/object.c' line='306' column='1'/> - <return type-id='type-id-322'/> - </function-decl> - <function-decl name='PyObject_CallFinalizer' mangled-name='PyObject_CallFinalizer' filepath='Objects/object.c' line='341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFinalizer'> - <parameter type-id='type-id-2' name='self' filepath='Objects/object.c' line='341' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_Print' mangled-name='PyObject_Print' filepath='Objects/object.c' line='395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Print'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='395' column='1'/> - <parameter type-id='type-id-229' name='fp' filepath='Objects/object.c' line='395' column='1'/> - <parameter type-id='type-id-8' name='flags' filepath='Objects/object.c' line='395' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_BreakPoint' mangled-name='_Py_BreakPoint' filepath='Objects/object.c' line='454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_BreakPoint'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_IsFreed' mangled-name='_PyObject_IsFreed' filepath='Objects/object.c' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_IsFreed'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='466' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_Dump' mangled-name='_PyObject_Dump' filepath='Objects/object.c' line='487' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_Dump'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='487' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_HasAttrString' mangled-name='PyObject_HasAttrString' filepath='Objects/object.c' line='927' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttrString'> - <parameter type-id='type-id-2' name='v' filepath='Objects/object.c' line='927' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Objects/object.c' line='927' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_SetAttrId' mangled-name='_PyObject_SetAttrId' filepath='Objects/object.c' line='994' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_SetAttrId'> - <parameter type-id='type-id-2' name='v' filepath='Objects/object.c' line='994' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/object.c' line='994' column='1'/> - <parameter type-id='type-id-2' name='w' filepath='Objects/object.c' line='994' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_LookupAttrId' mangled-name='_PyObject_LookupAttrId' filepath='Objects/object.c' line='1134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupAttrId'> - <parameter type-id='type-id-2' name='v' filepath='Objects/object.c' line='1134' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/object.c' line='1134' column='1'/> - <parameter type-id='type-id-233' name='result' filepath='Objects/object.c' line='1134' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_HasAttr' mangled-name='PyObject_HasAttr' filepath='Objects/object.c' line='1145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttr'> - <parameter type-id='type-id-2' name='v' filepath='Objects/object.c' line='1145' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/object.c' line='1145' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_GetDictPtr' mangled-name='_PyObject_GetDictPtr' filepath='Objects/object.c' line='1244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetDictPtr'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/object.c' line='1244' column='1'/> - <return type-id='type-id-233'/> - </function-decl> - <function-decl name='_PyObject_GenericSetAttrWithDict' mangled-name='_PyObject_GenericSetAttrWithDict' filepath='Objects/object.c' line='1525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GenericSetAttrWithDict'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/object.c' line='1525' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Objects/object.c' line='1525' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/object.c' line='1526' column='1'/> - <parameter type-id='type-id-2' name='dict' filepath='Objects/object.c' line='1526' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyObject_Not' mangled-name='PyObject_Not' filepath='Objects/object.c' line='1686' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Not'> - <parameter type-id='type-id-2' name='v' filepath='Objects/object.c' line='1686' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_DebugTypeStats' mangled-name='_PyObject_DebugTypeStats' filepath='Objects/object.c' line='2334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_DebugTypeStats'> - <parameter type-id='type-id-229' name='out' filepath='Objects/object.c' line='2334' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_GET_WEAKREFS_LISTPTR' mangled-name='PyObject_GET_WEAKREFS_LISTPTR' filepath='Objects/object.c' line='2653' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GET_WEAKREFS_LISTPTR'> - <parameter type-id='type-id-2' name='op' filepath='Objects/object.c' line='2653' column='1'/> - <return type-id='type-id-233'/> - </function-decl> - <function-decl name='Py_NewRef' mangled-name='Py_NewRef' filepath='Objects/object.c' line='2664' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewRef'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/object.c' line='2664' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_XNewRef' mangled-name='Py_XNewRef' filepath='Objects/object.c' line='2670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_XNewRef'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/object.c' line='2670' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_Is' mangled-name='Py_Is' filepath='Objects/object.c' line='2682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Is'> - <parameter type-id='type-id-2' name='x' filepath='Objects/object.c' line='2682' column='1'/> - <parameter type-id='type-id-2' name='y' filepath='Objects/object.c' line='2682' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_IsNone' mangled-name='Py_IsNone' filepath='Objects/object.c' line='2687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsNone'> - <parameter type-id='type-id-2' name='x' filepath='Objects/object.c' line='2687' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_IsTrue' mangled-name='Py_IsTrue' filepath='Objects/object.c' line='2692' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsTrue'> - <parameter type-id='type-id-2' name='x' filepath='Objects/object.c' line='2692' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_IsFalse' mangled-name='Py_IsFalse' filepath='Objects/object.c' line='2697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsFalse'> - <parameter type-id='type-id-2' name='x' filepath='Objects/object.c' line='2697' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/obmalloc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <enum-decl name='PyMemAllocatorDomain' naming-typedef-id='type-id-413' filepath='./Include/cpython/pymem.h' line='23' column='1' id='type-id-414'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PYMEM_DOMAIN_RAW' value='0'/> - <enumerator name='PYMEM_DOMAIN_MEM' value='1'/> - <enumerator name='PYMEM_DOMAIN_OBJ' value='2'/> - </enum-decl> - <typedef-decl name='PyMemAllocatorDomain' type-id='type-id-414' filepath='./Include/cpython/pymem.h' line='32' column='1' id='type-id-413'/> - <enum-decl name='PyMemAllocatorName' naming-typedef-id='type-id-415' filepath='./Include/cpython/pymem.h' line='34' column='1' id='type-id-416'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PYMEM_ALLOCATOR_NOT_SET' value='0'/> - <enumerator name='PYMEM_ALLOCATOR_DEFAULT' value='1'/> - <enumerator name='PYMEM_ALLOCATOR_DEBUG' value='2'/> - <enumerator name='PYMEM_ALLOCATOR_MALLOC' value='3'/> - <enumerator name='PYMEM_ALLOCATOR_MALLOC_DEBUG' value='4'/> - <enumerator name='PYMEM_ALLOCATOR_PYMALLOC' value='5'/> - <enumerator name='PYMEM_ALLOCATOR_PYMALLOC_DEBUG' value='6'/> - </enum-decl> - <typedef-decl name='PyMemAllocatorName' type-id='type-id-416' filepath='./Include/cpython/pymem.h' line='44' column='1' id='type-id-415'/> - <pointer-type-def type-id='type-id-417' size-in-bits='64' id='type-id-418'/> - <pointer-type-def type-id='type-id-415' size-in-bits='64' id='type-id-419'/> - <pointer-type-def type-id='type-id-420' size-in-bits='64' id='type-id-421'/> - <qualified-type-def type-id='type-id-422' const='yes' id='type-id-423'/> - <pointer-type-def type-id='type-id-423' size-in-bits='64' id='type-id-16'/> - <function-decl name='Py_GETENV' mangled-name='Py_GETENV' filepath='./Include/cpython/pydebug.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GETENV'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyGILState_Check' mangled-name='PyGILState_Check' filepath='./Include/cpython/pystate.h' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Check'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyInterpreterState_Head' mangled-name='PyInterpreterState_Head' filepath='./Include/cpython/pystate.h' line='315' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Head'> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='PyInterpreterState_Next' mangled-name='PyInterpreterState_Next' filepath='./Include/cpython/pystate.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Next'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='fputc' filepath='/usr/include/stdio.h' line='549' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fputs' filepath='/usr/include/stdio.h' line='655' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-412'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='malloc' filepath='/usr/include/stdlib.h' line='540' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='calloc' filepath='/usr/include/stdlib.h' line='543' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='realloc' filepath='/usr/include/stdlib.h' line='551' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='free' filepath='/usr/include/stdlib.h' line='555' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='munmap' filepath='/usr/include/x86_64-linux-gnu/sys/mman.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyMem_SetDefaultAllocator' mangled-name='_PyMem_SetDefaultAllocator' filepath='Objects/obmalloc.c' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_SetDefaultAllocator'> - <parameter type-id='type-id-413' name='domain' filepath='Objects/obmalloc.c' line='258' column='1'/> - <parameter type-id='type-id-418' name='old_alloc' filepath='Objects/obmalloc.c' line='259' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyMem_GetAllocatorName' mangled-name='_PyMem_GetAllocatorName' filepath='Objects/obmalloc.c' line='273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_GetAllocatorName'> - <parameter type-id='type-id-12' name='name' filepath='Objects/obmalloc.c' line='273' column='1'/> - <parameter type-id='type-id-419' name='allocator' filepath='Objects/obmalloc.c' line='273' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyMem_SetupAllocators' mangled-name='_PyMem_SetupAllocators' filepath='Objects/obmalloc.c' line='369' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_SetupAllocators'> - <parameter type-id='type-id-415' name='allocator' filepath='Objects/obmalloc.c' line='369' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyMem_GetCurrentAllocatorName' mangled-name='_PyMem_GetCurrentAllocatorName' filepath='Objects/obmalloc.c' line='436' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_GetCurrentAllocatorName'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyMem_SetupDebugHooks' mangled-name='PyMem_SetupDebugHooks' filepath='Objects/obmalloc.c' line='521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_SetupDebugHooks'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMem_GetAllocator' mangled-name='PyMem_GetAllocator' filepath='Objects/obmalloc.c' line='564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_GetAllocator'> - <parameter type-id='type-id-413' name='domain' filepath='Objects/obmalloc.c' line='564' column='1'/> - <parameter type-id='type-id-418' name='allocator' filepath='Objects/obmalloc.c' line='564' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMem_SetAllocator' mangled-name='PyMem_SetAllocator' filepath='Objects/obmalloc.c' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_SetAllocator'> - <parameter type-id='type-id-413' name='domain' filepath='Objects/obmalloc.c' line='577' column='1'/> - <parameter type-id='type-id-418' name='allocator' filepath='Objects/obmalloc.c' line='577' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_GetArenaAllocator' mangled-name='PyObject_GetArenaAllocator' filepath='Objects/obmalloc.c' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetArenaAllocator'> - <parameter type-id='type-id-421' name='allocator' filepath='Objects/obmalloc.c' line='590' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyObject_SetArenaAllocator' mangled-name='PyObject_SetArenaAllocator' filepath='Objects/obmalloc.c' line='603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetArenaAllocator'> - <parameter type-id='type-id-421' name='allocator' filepath='Objects/obmalloc.c' line='603' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMem_RawCalloc' mangled-name='PyMem_RawCalloc' filepath='Objects/obmalloc.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawCalloc'> - <parameter type-id='type-id-19' name='nelem' filepath='Objects/obmalloc.c' line='666' column='1'/> - <parameter type-id='type-id-19' name='elsize' filepath='Objects/obmalloc.c' line='666' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_RawWcsdup' mangled-name='_PyMem_RawWcsdup' filepath='Objects/obmalloc.c' line='741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_RawWcsdup'> - <parameter type-id='type-id-16' name='str' filepath='Objects/obmalloc.c' line='741' column='1'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_PyMem_RawStrdup' mangled-name='_PyMem_RawStrdup' filepath='Objects/obmalloc.c' line='761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_RawStrdup'> - <parameter type-id='type-id-12' name='str' filepath='Objects/obmalloc.c' line='761' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_PyMem_Strdup' mangled-name='_PyMem_Strdup' filepath='Objects/obmalloc.c' line='774' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_Strdup'> - <parameter type-id='type-id-12' name='str' filepath='Objects/obmalloc.c' line='774' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_PyObject_DebugMallocStats' mangled-name='_PyObject_DebugMallocStats' filepath='Objects/obmalloc.c' line='2546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_DebugMallocStats'> - <parameter type-id='type-id-229' name='out' filepath='Objects/obmalloc.c' line='2546' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/odictobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyODict_Type' type-id='type-id-256' mangled-name='PyODict_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='15' column='1' elf-symbol-id='PyODict_Type'/> - <var-decl name='PyODictIter_Type' type-id='type-id-256' mangled-name='PyODictIter_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='16' column='1' elf-symbol-id='PyODictIter_Type'/> - <var-decl name='PyODictKeys_Type' type-id='type-id-256' mangled-name='PyODictKeys_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='17' column='1' elf-symbol-id='PyODictKeys_Type'/> - <var-decl name='PyODictItems_Type' type-id='type-id-256' mangled-name='PyODictItems_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='18' column='1' elf-symbol-id='PyODictItems_Type'/> - <var-decl name='PyODictValues_Type' type-id='type-id-256' mangled-name='PyODictValues_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='19' column='1' elf-symbol-id='PyODictValues_Type'/> - <function-decl name='_PyErr_ChainExceptions1' mangled-name='_PyErr_ChainExceptions1' filepath='./Include/cpython/pyerrors.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ChainExceptions1'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_FromKeys' filepath='./Include/internal/pycore_dict.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_dict_lookup' filepath='./Include/internal/pycore_dict.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyDict_Pop_KnownHash' filepath='./Include/internal/pycore_dict.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-305'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyODict_New' mangled-name='PyODict_New' filepath='Objects/odictobject.c' line='1545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_New'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyODict_SetItem' mangled-name='PyODict_SetItem' filepath='Objects/odictobject.c' line='1568' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_SetItem'> - <parameter type-id='type-id-2' name='od' filepath='Objects/odictobject.c' line='1568' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/odictobject.c' line='1568' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Objects/odictobject.c' line='1568' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyODict_DelItem' mangled-name='PyODict_DelItem' filepath='Objects/odictobject.c' line='1577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_DelItem'> - <parameter type-id='type-id-2' name='od' filepath='Objects/odictobject.c' line='1577' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/odictobject.c' line='1577' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/picklebufobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyPickleBuffer_Type' type-id='type-id-256' mangled-name='PyPickleBuffer_Type' visibility='default' filepath='./Include/cpython/picklebufobject.h' line='13' column='1' elf-symbol-id='PyPickleBuffer_Type'/> - <function-decl name='PyPickleBuffer_FromObject' mangled-name='PyPickleBuffer_FromObject' filepath='Objects/picklebufobject.c' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_FromObject'> - <parameter type-id='type-id-2' name='base' filepath='Objects/picklebufobject.c' line='17' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyPickleBuffer_GetBuffer' mangled-name='PyPickleBuffer_GetBuffer' filepath='Objects/picklebufobject.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_GetBuffer'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/picklebufobject.c' line='36' column='1'/> - <return type-id='type-id-245'/> - </function-decl> - <function-decl name='PyPickleBuffer_Release' mangled-name='PyPickleBuffer_Release' filepath='Objects/picklebufobject.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_Release'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/picklebufobject.c' line='55' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/rangeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyRange_Type' type-id='type-id-256' mangled-name='PyRange_Type' visibility='default' filepath='./Include/rangeobject.h' line='18' column='1' elf-symbol-id='PyRange_Type'/> - <var-decl name='PyRangeIter_Type' type-id='type-id-256' mangled-name='PyRangeIter_Type' visibility='default' filepath='./Include/rangeobject.h' line='19' column='1' elf-symbol-id='PyRangeIter_Type'/> - <var-decl name='PyLongRangeIter_Type' type-id='type-id-256' mangled-name='PyLongRangeIter_Type' visibility='default' filepath='./Include/rangeobject.h' line='20' column='1' elf-symbol-id='PyLongRangeIter_Type'/> - <function-decl name='_PySlice_GetLongIndices' mangled-name='_PySlice_GetLongIndices' filepath='./Include/sliceobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySlice_GetLongIndices'> - <parameter type-id='type-id-424'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/setobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PySet_Dummy' type-id='type-id-2' mangled-name='_PySet_Dummy' visibility='default' filepath='./Include/cpython/setobject.h' line='69' column='1' elf-symbol-id='_PySet_Dummy'/> - <function-decl name='_PyUnicode_EQ' mangled-name='_PyUnicode_EQ' filepath='./Include/cpython/unicodeobject.h' line='953' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EQ'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PySet_Type' type-id='type-id-256' mangled-name='PySet_Type' visibility='default' filepath='./Include/setobject.h' line='9' column='1' elf-symbol-id='PySet_Type'/> - <var-decl name='PyFrozenSet_Type' type-id='type-id-256' mangled-name='PyFrozenSet_Type' visibility='default' filepath='./Include/setobject.h' line='10' column='1' elf-symbol-id='PyFrozenSet_Type'/> - <var-decl name='PySetIter_Type' type-id='type-id-256' mangled-name='PySetIter_Type' visibility='default' filepath='./Include/setobject.h' line='11' column='1' elf-symbol-id='PySetIter_Type'/> - <function-decl name='PySet_Size' mangled-name='PySet_Size' filepath='Objects/setobject.c' line='2277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Size'> - <parameter type-id='type-id-2' name='anyset' filepath='Objects/setobject.c' line='2277' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PySet_Clear' mangled-name='PySet_Clear' filepath='Objects/setobject.c' line='2287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Clear'> - <parameter type-id='type-id-2' name='set' filepath='Objects/setobject.c' line='2287' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySet_Discard' mangled-name='PySet_Discard' filepath='Objects/setobject.c' line='2307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Discard'> - <parameter type-id='type-id-2' name='set' filepath='Objects/setobject.c' line='2307' column='1'/> - <parameter type-id='type-id-2' name='key' filepath='Objects/setobject.c' line='2307' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySet_Pop' mangled-name='PySet_Pop' filepath='Objects/setobject.c' line='2344' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Pop'> - <parameter type-id='type-id-2' name='set' filepath='Objects/setobject.c' line='2344' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/sliceobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_Py_EllipsisObject' type-id='type-id-345' mangled-name='_Py_EllipsisObject' visibility='default' filepath='./Include/sliceobject.h' line='9' column='1' elf-symbol-id='_Py_EllipsisObject'/> - <var-decl name='PySlice_Type' type-id='type-id-256' mangled-name='PySlice_Type' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1' elf-symbol-id='PySlice_Type'/> - <var-decl name='PyEllipsis_Type' type-id='type-id-256' mangled-name='PyEllipsis_Type' visibility='default' filepath='./Include/sliceobject.h' line='29' column='1' elf-symbol-id='PyEllipsis_Type'/> - <function-decl name='PySlice_New' mangled-name='PySlice_New' filepath='Objects/sliceobject.c' line='155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_New'> - <parameter type-id='type-id-2' name='start' filepath='Objects/sliceobject.c' line='155' column='1'/> - <parameter type-id='type-id-2' name='stop' filepath='Objects/sliceobject.c' line='155' column='1'/> - <parameter type-id='type-id-2' name='step' filepath='Objects/sliceobject.c' line='155' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySlice_GetIndices' mangled-name='PySlice_GetIndices' filepath='Objects/sliceobject.c' line='197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_GetIndices'> - <parameter type-id='type-id-2' name='_r' filepath='Objects/sliceobject.c' line='197' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/sliceobject.c' line='197' column='1'/> - <parameter type-id='type-id-13' name='start' filepath='Objects/sliceobject.c' line='198' column='1'/> - <parameter type-id='type-id-13' name='stop' filepath='Objects/sliceobject.c' line='198' column='1'/> - <parameter type-id='type-id-13' name='step' filepath='Objects/sliceobject.c' line='198' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PySlice_GetIndicesEx' mangled-name='PySlice_GetIndicesEx' filepath='Objects/sliceobject.c' line='319' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_GetIndicesEx'> - <parameter type-id='type-id-2' name='_r' filepath='Objects/sliceobject.c' line='319' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/sliceobject.c' line='319' column='1'/> - <parameter type-id='type-id-13' name='start' filepath='Objects/sliceobject.c' line='320' column='1'/> - <parameter type-id='type-id-13' name='stop' filepath='Objects/sliceobject.c' line='320' column='1'/> - <parameter type-id='type-id-13' name='step' filepath='Objects/sliceobject.c' line='320' column='1'/> - <parameter type-id='type-id-13' name='slicelength' filepath='Objects/sliceobject.c' line='321' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/structseq.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyType_Slot' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-425' visibility='default' filepath='./Include/object.h' line='343' column='1' id='type-id-426'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='slot' type-id='type-id-8' visibility='default' filepath='./Include/object.h' line='344' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pfunc' type-id='type-id-22' visibility='default' filepath='./Include/object.h' line='345' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyType_Slot' type-id='type-id-426' filepath='./Include/object.h' line='346' column='1' id='type-id-425'/> - <class-decl name='PyType_Spec' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-11' visibility='default' filepath='./Include/object.h' line='348' column='1' id='type-id-427'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/object.h' line='349' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='basicsize' type-id='type-id-8' visibility='default' filepath='./Include/object.h' line='350' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='itemsize' type-id='type-id-8' visibility='default' filepath='./Include/object.h' line='351' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='flags' type-id='type-id-95' visibility='default' filepath='./Include/object.h' line='352' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='slots' type-id='type-id-428' visibility='default' filepath='./Include/object.h' line='353' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyType_Spec' type-id='type-id-427' filepath='./Include/object.h' line='354' column='1' id='type-id-11'/> - <pointer-type-def type-id='type-id-425' size-in-bits='64' id='type-id-428'/> - <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-429'/> - <function-decl name='_PyType_HasSubclasses' filepath='./Include/internal/pycore_typeobject.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyType_FromSpecWithBases' mangled-name='PyType_FromSpecWithBases' filepath='./Include/object.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpecWithBases'> - <parameter type-id='type-id-429'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PyStructSequence_UnnamedField' type-id='type-id-430' mangled-name='PyStructSequence_UnnamedField' visibility='default' filepath='./Include/structseq.h' line='22' column='1' elf-symbol-id='PyStructSequence_UnnamedField'/> - <function-decl name='PyStructSequence_SetItem' mangled-name='PyStructSequence_SetItem' filepath='Objects/structseq.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_SetItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/structseq.c' line='77' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/structseq.c' line='77' column='1'/> - <parameter type-id='type-id-2' name='v' filepath='Objects/structseq.c' line='77' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyStructSequence_GetItem' mangled-name='PyStructSequence_GetItem' filepath='Objects/structseq.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_GetItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/structseq.c' line='83' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/structseq.c' line='83' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyStructSequence_InitType2' mangled-name='PyStructSequence_InitType2' filepath='Objects/structseq.c' line='561' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_InitType2'> - <parameter type-id='type-id-1' name='type' filepath='Objects/structseq.c' line='561' column='1'/> - <parameter type-id='type-id-361' name='desc' filepath='Objects/structseq.c' line='561' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyStructSequence_InitType' mangled-name='PyStructSequence_InitType' filepath='Objects/structseq.c' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_InitType'> - <parameter type-id='type-id-1' name='type' filepath='Objects/structseq.c' line='594' column='1'/> - <parameter type-id='type-id-361' name='desc' filepath='Objects/structseq.c' line='594' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyStructSequence_NewType' mangled-name='_PyStructSequence_NewType' filepath='Objects/structseq.c' line='632' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStructSequence_NewType'> - <parameter type-id='type-id-361' name='desc' filepath='Objects/structseq.c' line='632' column='1'/> - <parameter type-id='type-id-28' name='tp_flags' filepath='Objects/structseq.c' line='632' column='1'/> - <return type-id='type-id-1'/> - </function-decl> - <function-decl name='PyStructSequence_NewType' mangled-name='PyStructSequence_NewType' filepath='Objects/structseq.c' line='683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_NewType'> - <parameter type-id='type-id-361' name='desc' filepath='Objects/structseq.c' line='683' column='1'/> - <return type-id='type-id-1'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/tupleobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyObject_GC_Resize' mangled-name='_PyObject_GC_Resize' filepath='./Include/objimpl.h' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_Resize'> - <parameter type-id='type-id-322'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-322'/> - </function-decl> - <var-decl name='PyTuple_Type' type-id='type-id-256' mangled-name='PyTuple_Type' visibility='default' filepath='./Include/tupleobject.h' line='23' column='1' elf-symbol-id='PyTuple_Type'/> - <var-decl name='PyTupleIter_Type' type-id='type-id-256' mangled-name='PyTupleIter_Type' visibility='default' filepath='./Include/tupleobject.h' line='24' column='1' elf-symbol-id='PyTupleIter_Type'/> - <function-decl name='PyTuple_SetItem' mangled-name='PyTuple_SetItem' filepath='Objects/tupleobject.c' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_SetItem'> - <parameter type-id='type-id-2' name='op' filepath='Objects/tupleobject.c' line='111' column='1'/> - <parameter type-id='type-id-14' name='i' filepath='Objects/tupleobject.c' line='111' column='1'/> - <parameter type-id='type-id-2' name='newitem' filepath='Objects/tupleobject.c' line='111' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTuple_MaybeUntrack' mangled-name='_PyTuple_MaybeUntrack' filepath='Objects/tupleobject.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_MaybeUntrack'> - <parameter type-id='type-id-2' name='op' filepath='Objects/tupleobject.c' line='131' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/typeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_PyWeakReference' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='8' column='1' id='type-id-431'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='9' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='wr_object' type-id='type-id-2' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='wr_callback' type-id='type-id-2' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='hash' type-id='type-id-305' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='wr_prev' type-id='type-id-432' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='wr_next' type-id='type-id-432' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='vectorcall' type-id='type-id-311' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='32' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyWeakReference' type-id='type-id-431' filepath='./Include/weakrefobject.h' line='9' column='1' id='type-id-433'/> - <pointer-type-def type-id='type-id-433' size-in-bits='64' id='type-id-432'/> - <function-decl name='PyEval_GetGlobals' mangled-name='PyEval_GetGlobals' filepath='./Include/ceval.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetGlobals'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyWeakref_ClearRef' mangled-name='_PyWeakref_ClearRef' filepath='./Include/cpython/weakrefobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWeakref_ClearRef'> - <parameter type-id='type-id-432'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyImport_GetModule' mangled-name='PyImport_GetModule' filepath='./Include/import.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetModule'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_Import' mangled-name='PyImport_Import' filepath='./Include/import.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_Import'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_NewKeysForClass' filepath='./Include/internal/pycore_dict.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-346'/> - </function-decl> - <function-decl name='_PyDict_KeysSize' filepath='./Include/internal/pycore_dict.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-346'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='_PyMemoryView_FromBufferProc' filepath='./Include/internal/pycore_memoryobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-434'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_GC_Link' filepath='./Include/internal/pycore_object.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_InitializeDict' filepath='./Include/internal/pycore_object.h' line='360' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_FreeInstanceAttributes' filepath='./Include/internal/pycore_object.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_IsInstanceDictEmpty' filepath='./Include/internal/pycore_object.h' line='409' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_FormatNote' filepath='./Include/internal/pycore_pyerrors.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Mangle' filepath='./Include/internal/pycore_symtable.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyStaticType_ClearWeakRefs' filepath='./Include/internal/pycore_typeobject.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-46'/> - </function-decl> - <var-decl name='_PyBufferWrapper_Type' type-id='type-id-256' mangled-name='_PyBufferWrapper_Type' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='139' column='1' elf-symbol-id='_PyBufferWrapper_Type'/> - <function-decl name='PyArg_ParseTuple' mangled-name='PyArg_ParseTuple' filepath='./Include/modsupport.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ParseTuple'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyType_Type' type-id='type-id-256' mangled-name='PyType_Type' visibility='default' filepath='./Include/object.h' line='388' column='1' elf-symbol-id='PyType_Type'/> - <var-decl name='PyBaseObject_Type' type-id='type-id-256' mangled-name='PyBaseObject_Type' visibility='default' filepath='./Include/object.h' line='389' column='1' elf-symbol-id='PyBaseObject_Type'/> - <var-decl name='PySuper_Type' type-id='type-id-256' mangled-name='PySuper_Type' visibility='default' filepath='./Include/object.h' line='390' column='1' elf-symbol-id='PySuper_Type'/> - <function-decl name='PyInterpreterState_Get' mangled-name='PyInterpreterState_Get' filepath='./Include/pystate.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Get'> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='PyUnicode_IsIdentifier' mangled-name='PyUnicode_IsIdentifier' filepath='./Include/unicodeobject.h' line='1007' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_IsIdentifier'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyWeakref_NewRef' mangled-name='PyWeakref_NewRef' filepath='./Include/weakrefobject.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_NewRef'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='strrchr' filepath='/usr/include/string.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyType_GetDict' mangled-name='PyType_GetDict' filepath='Objects/typeobject.c' line='242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetDict'> - <parameter type-id='type-id-1' name='self' filepath='Objects/typeobject.c' line='242' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_ClearCache' mangled-name='PyType_ClearCache' filepath='Objects/typeobject.c' line='661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearCache'> - <return type-id='type-id-95'/> - </function-decl> - <function-decl name='PyType_AddWatcher' mangled-name='PyType_AddWatcher' filepath='Objects/typeobject.c' line='683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_AddWatcher'> - <parameter type-id='type-id-435' name='callback' filepath='Objects/typeobject.c' line='683' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyType_ClearWatcher' mangled-name='PyType_ClearWatcher' filepath='Objects/typeobject.c' line='713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearWatcher'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/typeobject.c' line='713' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyType_Watch' mangled-name='PyType_Watch' filepath='Objects/typeobject.c' line='726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Watch'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/typeobject.c' line='726' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/typeobject.c' line='726' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyType_Unwatch' mangled-name='PyType_Unwatch' filepath='Objects/typeobject.c' line='744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Unwatch'> - <parameter type-id='type-id-8' name='watcher_id' filepath='Objects/typeobject.c' line='744' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Objects/typeobject.c' line='744' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyType_Modified' mangled-name='PyType_Modified' filepath='Objects/typeobject.c' line='760' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Modified'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='760' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnstable_Type_AssignVersionTag' mangled-name='PyUnstable_Type_AssignVersionTag' filepath='Objects/typeobject.c' line='928' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Type_AssignVersionTag'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='928' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_LookupSpecialId' mangled-name='_PyObject_LookupSpecialId' filepath='Objects/typeobject.c' line='2173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupSpecialId'> - <parameter type-id='type-id-2' name='self' filepath='Objects/typeobject.c' line='2173' column='1'/> - <parameter type-id='type-id-309' name='attrid' filepath='Objects/typeobject.c' line='2173' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GetFlags' mangled-name='PyType_GetFlags' filepath='Objects/typeobject.c' line='3036' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetFlags'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='3036' column='1'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyType_SUPPORTS_WEAKREFS' mangled-name='PyType_SUPPORTS_WEAKREFS' filepath='Objects/typeobject.c' line='3043' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_SUPPORTS_WEAKREFS'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='3043' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyType_CalculateMetaclass' mangled-name='_PyType_CalculateMetaclass' filepath='Objects/typeobject.c' line='3051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_CalculateMetaclass'> - <parameter type-id='type-id-1' name='metatype' filepath='Objects/typeobject.c' line='3051' column='1'/> - <parameter type-id='type-id-2' name='bases' filepath='Objects/typeobject.c' line='3051' column='1'/> - <return type-id='type-id-1'/> - </function-decl> - <function-decl name='PyType_FromMetaclass' mangled-name='PyType_FromMetaclass' filepath='Objects/typeobject.c' line='4481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromMetaclass'> - <parameter type-id='type-id-1' name='metaclass' filepath='Objects/typeobject.c' line='4481' column='1'/> - <parameter type-id='type-id-2' name='module' filepath='Objects/typeobject.c' line='4481' column='1'/> - <parameter type-id='type-id-429' name='spec' filepath='Objects/typeobject.c' line='4482' column='1'/> - <parameter type-id='type-id-2' name='bases_in' filepath='Objects/typeobject.c' line='4482' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_FromModuleAndSpec' mangled-name='PyType_FromModuleAndSpec' filepath='Objects/typeobject.c' line='4488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromModuleAndSpec'> - <parameter type-id='type-id-2' name='module' filepath='Objects/typeobject.c' line='4488' column='1'/> - <parameter type-id='type-id-429' name='spec' filepath='Objects/typeobject.c' line='4488' column='1'/> - <parameter type-id='type-id-2' name='bases' filepath='Objects/typeobject.c' line='4488' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_FromSpec' mangled-name='PyType_FromSpec' filepath='Objects/typeobject.c' line='4500' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpec'> - <parameter type-id='type-id-429' name='spec' filepath='Objects/typeobject.c' line='4500' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GetName' mangled-name='PyType_GetName' filepath='Objects/typeobject.c' line='4506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetName'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4506' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GetSlot' mangled-name='PyType_GetSlot' filepath='Objects/typeobject.c' line='4518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetSlot'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4518' column='1'/> - <parameter type-id='type-id-8' name='slot' filepath='Objects/typeobject.c' line='4518' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyType_GetModule' mangled-name='PyType_GetModule' filepath='Objects/typeobject.c' line='4540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModule'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4540' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyType_GetModuleState' mangled-name='PyType_GetModuleState' filepath='Objects/typeobject.c' line='4564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModuleState'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4564' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyType_GetModuleByDef' mangled-name='PyType_GetModuleByDef' filepath='Objects/typeobject.c' line='4578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModuleByDef'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4578' column='1'/> - <parameter type-id='type-id-399' name='def' filepath='Objects/typeobject.c' line='4578' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GetTypeData' mangled-name='PyObject_GetTypeData' filepath='Objects/typeobject.c' line='4613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetTypeData'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/typeobject.c' line='4613' column='1'/> - <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='4613' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyType_GetTypeDataSize' mangled-name='PyType_GetTypeDataSize' filepath='Objects/typeobject.c' line='4620' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetTypeDataSize'> - <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='4620' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyObject_GetItemData' mangled-name='PyObject_GetItemData' filepath='Objects/typeobject.c' line='4630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItemData'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/typeobject.c' line='4630' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyType_LookupId' mangled-name='_PyType_LookupId' filepath='Objects/typeobject.c' line='4772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_LookupId'> - <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4772' column='1'/> - <parameter type-id='type-id-309' name='name' filepath='Objects/typeobject.c' line='4772' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDictKeys_DecRef' filepath='Objects/typeobject.c' line='4949' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-346'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/typevarobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyArg_UnpackKeywordsWithVararg' mangled-name='_PyArg_UnpackKeywordsWithVararg' filepath='./Include/cpython/modsupport.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_UnpackKeywordsWithVararg'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-262'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-248'/> - </function-decl> - <var-decl name='_PyTypeAlias_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='19' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Objects/unicodectype.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyUnicode_ToTitlecase' mangled-name='_PyUnicode_ToTitlecase' filepath='Objects/unicodectype.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToTitlecase'> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodectype.c' line='62' column='1'/> - <return type-id='type-id-250'/> - </function-decl> - <function-decl name='_PyUnicode_ToDigit' mangled-name='_PyUnicode_ToDigit' filepath='Objects/unicodectype.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToDigit'> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodectype.c' line='121' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToUppercase' mangled-name='_PyUnicode_ToUppercase' filepath='Objects/unicodectype.c' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToUppercase'> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodectype.c' line='188' column='1'/> - <return type-id='type-id-250'/> - </function-decl> - <function-decl name='_PyUnicode_ToLowercase' mangled-name='_PyUnicode_ToLowercase' filepath='Objects/unicodectype.c' line='200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToLowercase'> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodectype.c' line='200' column='1'/> - <return type-id='type-id-250'/> - </function-decl> - <function-decl name='_PyUnicode_ToNumeric' mangled-name='_PyUnicode_ToNumeric' filepath='Objects/unicodetype_db.h' line='4243' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToNumeric'> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodetype_db.h' line='4243' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/unicodeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-382' size-in-bits='1024' id='type-id-436'> - <subrange length='128' type-id='type-id-28' id='type-id-437'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-382' size-in-bits='infinite' id='type-id-438'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <qualified-type-def type-id='type-id-250' const='yes' id='type-id-439'/> - <function-decl name='_PyCodec_Lookup' mangled-name='_PyCodec_Lookup' filepath='./Include/codecs.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodec_Lookup'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_Encode' mangled-name='PyCodec_Encode' filepath='./Include/codecs.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Encode'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_Decode' mangled-name='PyCodec_Decode' filepath='./Include/codecs.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Decode'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCodec_EncodeText' mangled-name='_PyCodec_EncodeText' filepath='./Include/codecs.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodec_EncodeText'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCodec_DecodeText' mangled-name='_PyCodec_DecodeText' filepath='./Include/codecs.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodec_DecodeText'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_LookupError' mangled-name='PyCodec_LookupError' filepath='./Include/codecs.h' line='219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_LookupError'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_StrictErrors' mangled-name='PyCodec_StrictErrors' filepath='./Include/codecs.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StrictErrors'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyInterpreterState_GetConfig' mangled-name='_PyInterpreterState_GetConfig' filepath='./Include/cpython/pystate.h' line='331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetConfig'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-260'/> - </function-decl> - <function-decl name='_PyUnicode_FormatAdvancedWriter' mangled-name='_PyUnicode_FormatAdvancedWriter' filepath='./Include/cpython/unicodeobject.h' line='603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FormatAdvancedWriter'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsLowercase' mangled-name='_PyUnicode_IsLowercase' filepath='./Include/cpython/unicodeobject.h' line='802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLowercase'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsUppercase' mangled-name='_PyUnicode_IsUppercase' filepath='./Include/cpython/unicodeobject.h' line='806' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsUppercase'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsTitlecase' mangled-name='_PyUnicode_IsTitlecase' filepath='./Include/cpython/unicodeobject.h' line='810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsTitlecase'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsXidStart' mangled-name='_PyUnicode_IsXidStart' filepath='./Include/cpython/unicodeobject.h' line='814' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsXidStart'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsXidContinue' mangled-name='_PyUnicode_IsXidContinue' filepath='./Include/cpython/unicodeobject.h' line='818' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsXidContinue'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsWhitespace' mangled-name='_PyUnicode_IsWhitespace' filepath='./Include/cpython/unicodeobject.h' line='822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsWhitespace'> - <parameter type-id='type-id-439'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsLinebreak' mangled-name='_PyUnicode_IsLinebreak' filepath='./Include/cpython/unicodeobject.h' line='826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLinebreak'> - <parameter type-id='type-id-439'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToLowerFull' mangled-name='_PyUnicode_ToLowerFull' filepath='./Include/cpython/unicodeobject.h' line='842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToLowerFull'> - <parameter type-id='type-id-250'/> - <parameter type-id='type-id-440'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToTitleFull' mangled-name='_PyUnicode_ToTitleFull' filepath='./Include/cpython/unicodeobject.h' line='847' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToTitleFull'> - <parameter type-id='type-id-250'/> - <parameter type-id='type-id-440'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToUpperFull' mangled-name='_PyUnicode_ToUpperFull' filepath='./Include/cpython/unicodeobject.h' line='852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToUpperFull'> - <parameter type-id='type-id-250'/> - <parameter type-id='type-id-440'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToFoldedFull' mangled-name='_PyUnicode_ToFoldedFull' filepath='./Include/cpython/unicodeobject.h' line='857' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToFoldedFull'> - <parameter type-id='type-id-250'/> - <parameter type-id='type-id-440'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsCaseIgnorable' mangled-name='_PyUnicode_IsCaseIgnorable' filepath='./Include/cpython/unicodeobject.h' line='862' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsCaseIgnorable'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsCased' mangled-name='_PyUnicode_IsCased' filepath='./Include/cpython/unicodeobject.h' line='866' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsCased'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ToDecimalDigit' mangled-name='_PyUnicode_ToDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='870' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToDecimalDigit'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsDecimalDigit' mangled-name='_PyUnicode_IsDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='882' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDecimalDigit'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsDigit' mangled-name='_PyUnicode_IsDigit' filepath='./Include/cpython/unicodeobject.h' line='886' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDigit'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsNumeric' mangled-name='_PyUnicode_IsNumeric' filepath='./Include/cpython/unicodeobject.h' line='890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsNumeric'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_IsAlpha' mangled-name='_PyUnicode_IsAlpha' filepath='./Include/cpython/unicodeobject.h' line='898' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsAlpha'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_Py_ascii_whitespace' type-id='type-id-438' mangled-name='_Py_ascii_whitespace' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='903' column='1' elf-symbol-id='_Py_ascii_whitespace'/> - <function-decl name='_Py_DecodeLocaleEx' mangled-name='_Py_DecodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecodeLocaleEx'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-235'/> - <parameter type-id='type-id-441'/> - <parameter type-id='type-id-252'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-442'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_EncodeLocaleEx' mangled-name='_Py_EncodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_EncodeLocaleEx'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-441'/> - <parameter type-id='type-id-252'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-442'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_DumpPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_SetFileSystemEncoding' filepath='./Include/internal/pycore_pylifecycle.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_PyUnicodeASCIIIter_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='25' column='1'/> - <function-decl name='PyOS_FSPath' mangled-name='PyOS_FSPath' filepath='./Include/osmodule.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_FSPath'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PyUnicode_Type' type-id='type-id-256' mangled-name='PyUnicode_Type' visibility='default' filepath='./Include/unicodeobject.h' line='111' column='1' elf-symbol-id='PyUnicode_Type'/> - <var-decl name='PyUnicodeIter_Type' type-id='type-id-256' mangled-name='PyUnicodeIter_Type' visibility='default' filepath='./Include/unicodeobject.h' line='112' column='1' elf-symbol-id='PyUnicodeIter_Type'/> - <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-16'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='wmemchr' filepath='/usr/include/wchar.h' line='254' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-422'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='259' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_GetErrorHandler' mangled-name='_Py_GetErrorHandler' filepath='Objects/unicodeobject.c' line='396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetErrorHandler'> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='396' column='1'/> - <return type-id='type-id-442'/> - </function-decl> - <function-decl name='_PyUnicode_FastCopyCharacters' mangled-name='_PyUnicode_FastCopyCharacters' filepath='Objects/unicodeobject.c' line='1440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FastCopyCharacters'> - <parameter type-id='type-id-2' name='to' filepath='Objects/unicodeobject.c' line='1441' column='1'/> - <parameter type-id='type-id-14' name='to_start' filepath='Objects/unicodeobject.c' line='1441' column='1'/> - <parameter type-id='type-id-2' name='from' filepath='Objects/unicodeobject.c' line='1442' column='1'/> - <parameter type-id='type-id-14' name='from_start' filepath='Objects/unicodeobject.c' line='1442' column='1'/> - <parameter type-id='type-id-14' name='how_many' filepath='Objects/unicodeobject.c' line='1442' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_CopyCharacters' mangled-name='PyUnicode_CopyCharacters' filepath='Objects/unicodeobject.c' line='1448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CopyCharacters'> - <parameter type-id='type-id-2' name='to' filepath='Objects/unicodeobject.c' line='1448' column='1'/> - <parameter type-id='type-id-14' name='to_start' filepath='Objects/unicodeobject.c' line='1448' column='1'/> - <parameter type-id='type-id-2' name='from' filepath='Objects/unicodeobject.c' line='1449' column='1'/> - <parameter type-id='type-id-14' name='from_start' filepath='Objects/unicodeobject.c' line='1449' column='1'/> - <parameter type-id='type-id-14' name='how_many' filepath='Objects/unicodeobject.c' line='1450' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_Resize' mangled-name='PyUnicode_Resize' filepath='Objects/unicodeobject.c' line='1649' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Resize'> - <parameter type-id='type-id-233' name='p_unicode' filepath='Objects/unicodeobject.c' line='1649' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/unicodeobject.c' line='1649' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_FromWideChar' mangled-name='PyUnicode_FromWideChar' filepath='Objects/unicodeobject.c' line='1750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromWideChar'> - <parameter type-id='type-id-16' name='u' filepath='Objects/unicodeobject.c' line='1750' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='1750' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_FromKindAndData' mangled-name='PyUnicode_FromKindAndData' filepath='Objects/unicodeobject.c' line='2053' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromKindAndData'> - <parameter type-id='type-id-8' name='kind' filepath='Objects/unicodeobject.c' line='2053' column='1'/> - <parameter type-id='type-id-22' name='buffer' filepath='Objects/unicodeobject.c' line='2053' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='2053' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_FindMaxChar' mangled-name='_PyUnicode_FindMaxChar' filepath='Objects/unicodeobject.c' line='2073' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FindMaxChar'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='2073' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='2073' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='2073' column='1'/> - <return type-id='type-id-250'/> - </function-decl> - <function-decl name='PyUnicode_AsUCS4' mangled-name='PyUnicode_AsUCS4' filepath='Objects/unicodeobject.c' line='2273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4'> - <parameter type-id='type-id-2' name='string' filepath='Objects/unicodeobject.c' line='2273' column='1'/> - <parameter type-id='type-id-440' name='target' filepath='Objects/unicodeobject.c' line='2273' column='1'/> - <parameter type-id='type-id-14' name='targetsize' filepath='Objects/unicodeobject.c' line='2273' column='1'/> - <parameter type-id='type-id-8' name='copy_null' filepath='Objects/unicodeobject.c' line='2274' column='1'/> - <return type-id='type-id-440'/> - </function-decl> - <function-decl name='PyUnicode_AsUCS4Copy' mangled-name='PyUnicode_AsUCS4Copy' filepath='Objects/unicodeobject.c' line='2284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4Copy'> - <parameter type-id='type-id-2' name='string' filepath='Objects/unicodeobject.c' line='2284' column='1'/> - <return type-id='type-id-440'/> - </function-decl> - <function-decl name='PyUnicode_AsWideChar' mangled-name='PyUnicode_AsWideChar' filepath='Objects/unicodeobject.c' line='2913' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideChar'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='2913' column='1'/> - <parameter type-id='type-id-52' name='w' filepath='Objects/unicodeobject.c' line='2914' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='2915' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_AsWideCharString' mangled-name='PyUnicode_AsWideCharString' filepath='Objects/unicodeobject.c' line='2955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideCharString'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='2955' column='1'/> - <parameter type-id='type-id-13' name='size' filepath='Objects/unicodeobject.c' line='2956' column='1'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_PyUnicode_WideCharString_Converter' mangled-name='_PyUnicode_WideCharString_Converter' filepath='Objects/unicodeobject.c' line='3003' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_WideCharString_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/unicodeobject.c' line='3003' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/unicodeobject.c' line='3003' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_WideCharString_Opt_Converter' mangled-name='_PyUnicode_WideCharString_Opt_Converter' filepath='Objects/unicodeobject.c' line='3025' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_WideCharString_Opt_Converter'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/unicodeobject.c' line='3025' column='1'/> - <parameter type-id='type-id-22' name='ptr' filepath='Objects/unicodeobject.c' line='3025' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_FromOrdinal' mangled-name='PyUnicode_FromOrdinal' filepath='Objects/unicodeobject.c' line='3051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromOrdinal'> - <parameter type-id='type-id-8' name='ordinal' filepath='Objects/unicodeobject.c' line='3051' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_FromObject' mangled-name='PyUnicode_FromObject' filepath='Objects/unicodeobject.c' line='3063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromObject'> - <parameter type-id='type-id-2' name='obj' filepath='Objects/unicodeobject.c' line='3063' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsDecodedObject' mangled-name='PyUnicode_AsDecodedObject' filepath='Objects/unicodeobject.c' line='3274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedObject'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3274' column='1'/> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/unicodeobject.c' line='3275' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3276' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsDecodedUnicode' mangled-name='PyUnicode_AsDecodedUnicode' filepath='Objects/unicodeobject.c' line='3296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedUnicode'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3296' column='1'/> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/unicodeobject.c' line='3297' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3298' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsEncodedObject' mangled-name='PyUnicode_AsEncodedObject' filepath='Objects/unicodeobject.c' line='3335' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedObject'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3335' column='1'/> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/unicodeobject.c' line='3336' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3337' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_EncodeLocale' mangled-name='PyUnicode_EncodeLocale' filepath='Objects/unicodeobject.c' line='3417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeLocale'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3417' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3417' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_EncodeFSDefault' mangled-name='PyUnicode_EncodeFSDefault' filepath='Objects/unicodeobject.c' line='3424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeFSDefault'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3424' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsEncodedUnicode' mangled-name='PyUnicode_AsEncodedUnicode' filepath='Objects/unicodeobject.c' line='3558' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedUnicode'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3558' column='1'/> - <parameter type-id='type-id-12' name='encoding' filepath='Objects/unicodeobject.c' line='3559' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3560' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeLocaleAndSize' mangled-name='PyUnicode_DecodeLocaleAndSize' filepath='Objects/unicodeobject.c' line='3638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocaleAndSize'> - <parameter type-id='type-id-12' name='str' filepath='Objects/unicodeobject.c' line='3638' column='1'/> - <parameter type-id='type-id-14' name='len' filepath='Objects/unicodeobject.c' line='3638' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3639' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeLocale' mangled-name='PyUnicode_DecodeLocale' filepath='Objects/unicodeobject.c' line='3646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocale'> - <parameter type-id='type-id-12' name='str' filepath='Objects/unicodeobject.c' line='3646' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='3646' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeFSDefaultAndSize' mangled-name='PyUnicode_DecodeFSDefaultAndSize' filepath='Objects/unicodeobject.c' line='3661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefaultAndSize'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='3661' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='3661' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_FSConverter' mangled-name='PyUnicode_FSConverter' filepath='Objects/unicodeobject.c' line='3697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSConverter'> - <parameter type-id='type-id-2' name='arg' filepath='Objects/unicodeobject.c' line='3697' column='1'/> - <parameter type-id='type-id-22' name='addr' filepath='Objects/unicodeobject.c' line='3697' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_FSDecoder' mangled-name='PyUnicode_FSDecoder' filepath='Objects/unicodeobject.c' line='3737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSDecoder'> - <parameter type-id='type-id-2' name='arg' filepath='Objects/unicodeobject.c' line='3737' column='1'/> - <parameter type-id='type-id-22' name='addr' filepath='Objects/unicodeobject.c' line='3737' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_GetSize' mangled-name='PyUnicode_GetSize' filepath='Objects/unicodeobject.c' line='3817' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetSize'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3817' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_WriteChar' mangled-name='PyUnicode_WriteChar' filepath='Objects/unicodeobject.c' line='3854' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_WriteChar'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='3854' column='1'/> - <parameter type-id='type-id-14' name='index' filepath='Objects/unicodeobject.c' line='3854' column='1'/> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodeobject.c' line='3854' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF7' mangled-name='PyUnicode_DecodeUTF7' filepath='Objects/unicodeobject.c' line='4216' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='4216' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='4217' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='4218' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF7Stateful' mangled-name='PyUnicode_DecodeUTF7Stateful' filepath='Objects/unicodeobject.c' line='4231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7Stateful'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='4231' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='4232' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='4233' column='1'/> - <parameter type-id='type-id-13' name='consumed' filepath='Objects/unicodeobject.c' line='4234' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_EncodeUTF7' mangled-name='_PyUnicode_EncodeUTF7' filepath='Objects/unicodeobject.c' line='4429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF7'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='4429' column='1'/> - <parameter type-id='type-id-8' name='base64SetO' filepath='Objects/unicodeobject.c' line='4430' column='1'/> - <parameter type-id='type-id-8' name='base64WhiteSpace' filepath='Objects/unicodeobject.c' line='4431' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='4432' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_DecodeUTF8Ex' mangled-name='_Py_DecodeUTF8Ex' filepath='Objects/unicodeobject.c' line='4797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecodeUTF8Ex'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='4797' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='4797' column='1'/> - <parameter type-id='type-id-235' name='wstr' filepath='Objects/unicodeobject.c' line='4797' column='1'/> - <parameter type-id='type-id-441' name='wlen' filepath='Objects/unicodeobject.c' line='4797' column='1'/> - <parameter type-id='type-id-252' name='reason' filepath='Objects/unicodeobject.c' line='4798' column='1'/> - <parameter type-id='type-id-442' name='errors' filepath='Objects/unicodeobject.c' line='4798' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_DecodeUTF8_surrogateescape' mangled-name='_Py_DecodeUTF8_surrogateescape' filepath='Objects/unicodeobject.c' line='4906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecodeUTF8_surrogateescape'> - <parameter type-id='type-id-12' name='arg' filepath='Objects/unicodeobject.c' line='4906' column='1'/> - <parameter type-id='type-id-14' name='arglen' filepath='Objects/unicodeobject.c' line='4906' column='1'/> - <parameter type-id='type-id-441' name='wlen' filepath='Objects/unicodeobject.c' line='4907' column='1'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_EncodeUTF8Ex' mangled-name='_Py_EncodeUTF8Ex' filepath='Objects/unicodeobject.c' line='4936' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_EncodeUTF8Ex'> - <parameter type-id='type-id-16' name='text' filepath='Objects/unicodeobject.c' line='4936' column='1'/> - <parameter type-id='type-id-239' name='str' filepath='Objects/unicodeobject.c' line='4936' column='1'/> - <parameter type-id='type-id-441' name='error_pos' filepath='Objects/unicodeobject.c' line='4936' column='1'/> - <parameter type-id='type-id-252' name='reason' filepath='Objects/unicodeobject.c' line='4937' column='1'/> - <parameter type-id='type-id-8' name='raw_malloc' filepath='Objects/unicodeobject.c' line='4937' column='1'/> - <parameter type-id='type-id-442' name='errors' filepath='Objects/unicodeobject.c' line='4937' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF32' mangled-name='PyUnicode_DecodeUTF32' filepath='Objects/unicodeobject.c' line='5178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='5178' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='5179' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5180' column='1'/> - <parameter type-id='type-id-179' name='byteorder' filepath='Objects/unicodeobject.c' line='5181' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF32Stateful' mangled-name='PyUnicode_DecodeUTF32Stateful' filepath='Objects/unicodeobject.c' line='5187' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32Stateful'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='5187' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='5188' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5189' column='1'/> - <parameter type-id='type-id-179' name='byteorder' filepath='Objects/unicodeobject.c' line='5190' column='1'/> - <parameter type-id='type-id-13' name='consumed' filepath='Objects/unicodeobject.c' line='5191' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_EncodeUTF32' mangled-name='_PyUnicode_EncodeUTF32' filepath='Objects/unicodeobject.c' line='5332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF32'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='5332' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5333' column='1'/> - <parameter type-id='type-id-8' name='byteorder' filepath='Objects/unicodeobject.c' line='5334' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsUTF32String' mangled-name='PyUnicode_AsUTF32String' filepath='Objects/unicodeobject.c' line='5477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF32String'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='5477' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF16' mangled-name='PyUnicode_DecodeUTF16' filepath='Objects/unicodeobject.c' line='5485' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='5485' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='5486' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5487' column='1'/> - <parameter type-id='type-id-179' name='byteorder' filepath='Objects/unicodeobject.c' line='5488' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF16Stateful' mangled-name='PyUnicode_DecodeUTF16Stateful' filepath='Objects/unicodeobject.c' line='5494' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16Stateful'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='5494' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='5495' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5496' column='1'/> - <parameter type-id='type-id-179' name='byteorder' filepath='Objects/unicodeobject.c' line='5497' column='1'/> - <parameter type-id='type-id-13' name='consumed' filepath='Objects/unicodeobject.c' line='5498' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_EncodeUTF16' mangled-name='_PyUnicode_EncodeUTF16' filepath='Objects/unicodeobject.c' line='5649' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF16'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='5649' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='5650' column='1'/> - <parameter type-id='type-id-8' name='byteorder' filepath='Objects/unicodeobject.c' line='5651' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsUTF16String' mangled-name='PyUnicode_AsUTF16String' filepath='Objects/unicodeobject.c' line='5813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF16String'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='5813' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_DecodeUnicodeEscapeStateful' mangled-name='_PyUnicode_DecodeUnicodeEscapeStateful' filepath='Objects/unicodeobject.c' line='6069' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_DecodeUnicodeEscapeStateful'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='6069' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='6070' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='6071' column='1'/> - <parameter type-id='type-id-13' name='consumed' filepath='Objects/unicodeobject.c' line='6072' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUnicodeEscape' mangled-name='PyUnicode_DecodeUnicodeEscape' filepath='Objects/unicodeobject.c' line='6105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUnicodeEscape'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='6105' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='6106' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='6107' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsUnicodeEscapeString' mangled-name='PyUnicode_AsUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUnicodeEscapeString'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='6115' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_DecodeRawUnicodeEscapeStateful' mangled-name='_PyUnicode_DecodeRawUnicodeEscapeStateful' filepath='Objects/unicodeobject.c' line='6232' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_DecodeRawUnicodeEscapeStateful'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='6232' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='6233' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='6234' column='1'/> - <parameter type-id='type-id-13' name='consumed' filepath='Objects/unicodeobject.c' line='6235' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeRawUnicodeEscape' mangled-name='PyUnicode_DecodeRawUnicodeEscape' filepath='Objects/unicodeobject.c' line='6368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeRawUnicodeEscape'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='6368' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='6369' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='6370' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsRawUnicodeEscapeString' mangled-name='PyUnicode_AsRawUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsRawUnicodeEscapeString'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='6377' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_AsLatin1String' mangled-name='_PyUnicode_AsLatin1String' filepath='Objects/unicodeobject.c' line='6741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsLatin1String'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='6741' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='6741' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsLatin1String' mangled-name='PyUnicode_AsLatin1String' filepath='Objects/unicodeobject.c' line='6758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsLatin1String'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='6758' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeCharmap' mangled-name='PyUnicode_DecodeCharmap' filepath='Objects/unicodeobject.c' line='7807' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeCharmap'> - <parameter type-id='type-id-12' name='s' filepath='Objects/unicodeobject.c' line='7807' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Objects/unicodeobject.c' line='7808' column='1'/> - <parameter type-id='type-id-2' name='mapping' filepath='Objects/unicodeobject.c' line='7809' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='7810' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_BuildEncodingMap' mangled-name='PyUnicode_BuildEncodingMap' filepath='Objects/unicodeobject.c' line='7883' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_BuildEncodingMap'> - <parameter type-id='type-id-2' name='string' filepath='Objects/unicodeobject.c' line='7883' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_EncodeCharmap' mangled-name='_PyUnicode_EncodeCharmap' filepath='Objects/unicodeobject.c' line='8295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeCharmap'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='8295' column='1'/> - <parameter type-id='type-id-2' name='mapping' filepath='Objects/unicodeobject.c' line='8296' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='8297' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsCharmapString' mangled-name='PyUnicode_AsCharmapString' filepath='Objects/unicodeobject.c' line='8364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsCharmapString'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='8364' column='1'/> - <parameter type-id='type-id-2' name='mapping' filepath='Objects/unicodeobject.c' line='8365' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Translate' mangled-name='PyUnicode_Translate' filepath='Objects/unicodeobject.c' line='8780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Translate'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='8780' column='1'/> - <parameter type-id='type-id-2' name='mapping' filepath='Objects/unicodeobject.c' line='8781' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Objects/unicodeobject.c' line='8782' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_InsertThousandsGrouping' mangled-name='_PyUnicode_InsertThousandsGrouping' filepath='Objects/unicodeobject.c' line='8962' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InsertThousandsGrouping'> - <parameter type-id='type-id-332' name='writer' filepath='Objects/unicodeobject.c' line='8963' column='1'/> - <parameter type-id='type-id-14' name='n_buffer' filepath='Objects/unicodeobject.c' line='8964' column='1'/> - <parameter type-id='type-id-2' name='digits' filepath='Objects/unicodeobject.c' line='8965' column='1'/> - <parameter type-id='type-id-14' name='d_pos' filepath='Objects/unicodeobject.c' line='8966' column='1'/> - <parameter type-id='type-id-14' name='n_digits' filepath='Objects/unicodeobject.c' line='8967' column='1'/> - <parameter type-id='type-id-14' name='min_width' filepath='Objects/unicodeobject.c' line='8968' column='1'/> - <parameter type-id='type-id-12' name='grouping' filepath='Objects/unicodeobject.c' line='8969' column='1'/> - <parameter type-id='type-id-2' name='thousands_sep' filepath='Objects/unicodeobject.c' line='8970' column='1'/> - <parameter type-id='type-id-440' name='maxchar' filepath='Objects/unicodeobject.c' line='8971' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_Count' mangled-name='PyUnicode_Count' filepath='Objects/unicodeobject.c' line='9141' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Count'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='9141' column='1'/> - <parameter type-id='type-id-2' name='substr' filepath='Objects/unicodeobject.c' line='9142' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9143' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='9144' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_Find' mangled-name='PyUnicode_Find' filepath='Objects/unicodeobject.c' line='9153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Find'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='9153' column='1'/> - <parameter type-id='type-id-2' name='substr' filepath='Objects/unicodeobject.c' line='9154' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9155' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='9156' column='1'/> - <parameter type-id='type-id-8' name='direction' filepath='Objects/unicodeobject.c' line='9157' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_FindChar' mangled-name='PyUnicode_FindChar' filepath='Objects/unicodeobject.c' line='9166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FindChar'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='9166' column='1'/> - <parameter type-id='type-id-250' name='ch' filepath='Objects/unicodeobject.c' line='9166' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9167' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='9167' column='1'/> - <parameter type-id='type-id-8' name='direction' filepath='Objects/unicodeobject.c' line='9168' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_Tailmatch' mangled-name='PyUnicode_Tailmatch' filepath='Objects/unicodeobject.c' line='9249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Tailmatch'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='9249' column='1'/> - <parameter type-id='type-id-2' name='substr' filepath='Objects/unicodeobject.c' line='9250' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9251' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='9252' column='1'/> - <parameter type-id='type-id-8' name='direction' filepath='Objects/unicodeobject.c' line='9253' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyUnicode_JoinArray' mangled-name='_PyUnicode_JoinArray' filepath='Objects/unicodeobject.c' line='9518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_JoinArray'> - <parameter type-id='type-id-2' name='separator' filepath='Objects/unicodeobject.c' line='9518' column='1'/> - <parameter type-id='type-id-248' name='items' filepath='Objects/unicodeobject.c' line='9518' column='1'/> - <parameter type-id='type-id-14' name='seqlen' filepath='Objects/unicodeobject.c' line='9518' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_FastFill' mangled-name='_PyUnicode_FastFill' filepath='Objects/unicodeobject.c' line='9685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FastFill'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='9685' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9685' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/unicodeobject.c' line='9685' column='1'/> - <parameter type-id='type-id-250' name='fill_char' filepath='Objects/unicodeobject.c' line='9686' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_Fill' mangled-name='PyUnicode_Fill' filepath='Objects/unicodeobject.c' line='9698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Fill'> - <parameter type-id='type-id-2' name='unicode' filepath='Objects/unicodeobject.c' line='9698' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='9698' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Objects/unicodeobject.c' line='9698' column='1'/> - <parameter type-id='type-id-250' name='fill_char' filepath='Objects/unicodeobject.c' line='9699' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyUnicode_Splitlines' mangled-name='PyUnicode_Splitlines' filepath='Objects/unicodeobject.c' line='9772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Splitlines'> - <parameter type-id='type-id-2' name='string' filepath='Objects/unicodeobject.c' line='9772' column='1'/> - <parameter type-id='type-id-8' name='keepends' filepath='Objects/unicodeobject.c' line='9772' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_EqualToASCIIId' mangled-name='_PyUnicode_EqualToASCIIId' filepath='Objects/unicodeobject.c' line='10660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EqualToASCIIId'> - <parameter type-id='type-id-2' name='left' filepath='Objects/unicodeobject.c' line='10660' column='1'/> - <parameter type-id='type-id-309' name='right' filepath='Objects/unicodeobject.c' line='10660' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_RichCompare' mangled-name='PyUnicode_RichCompare' filepath='Objects/unicodeobject.c' line='10698' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RichCompare'> - <parameter type-id='type-id-2' name='left' filepath='Objects/unicodeobject.c' line='10698' column='1'/> - <parameter type-id='type-id-2' name='right' filepath='Objects/unicodeobject.c' line='10698' column='1'/> - <parameter type-id='type-id-8' name='op' filepath='Objects/unicodeobject.c' line='10698' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Contains' mangled-name='PyUnicode_Contains' filepath='Objects/unicodeobject.c' line='10739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Contains'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='10739' column='1'/> - <parameter type-id='type-id-2' name='substr' filepath='Objects/unicodeobject.c' line='10739' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_Concat' mangled-name='PyUnicode_Concat' filepath='Objects/unicodeobject.c' line='10800' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Concat'> - <parameter type-id='type-id-2' name='left' filepath='Objects/unicodeobject.c' line='10800' column='1'/> - <parameter type-id='type-id-2' name='right' filepath='Objects/unicodeobject.c' line='10800' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Append' mangled-name='PyUnicode_Append' filepath='Objects/unicodeobject.c' line='10849' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Append'> - <parameter type-id='type-id-233' name='p_left' filepath='Objects/unicodeobject.c' line='10849' column='1'/> - <parameter type-id='type-id-2' name='right' filepath='Objects/unicodeobject.c' line='10849' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_AppendAndDel' mangled-name='PyUnicode_AppendAndDel' filepath='Objects/unicodeobject.c' line='10926' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AppendAndDel'> - <parameter type-id='type-id-233' name='pleft' filepath='Objects/unicodeobject.c' line='10926' column='1'/> - <parameter type-id='type-id-2' name='right' filepath='Objects/unicodeobject.c' line='10926' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_XStrip' mangled-name='_PyUnicode_XStrip' filepath='Objects/unicodeobject.c' line='11738' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_XStrip'> - <parameter type-id='type-id-2' name='self' filepath='Objects/unicodeobject.c' line='11738' column='1'/> - <parameter type-id='type-id-8' name='striptype' filepath='Objects/unicodeobject.c' line='11738' column='1'/> - <parameter type-id='type-id-2' name='sepobj' filepath='Objects/unicodeobject.c' line='11738' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Replace' mangled-name='PyUnicode_Replace' filepath='Objects/unicodeobject.c' line='12011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Replace'> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='12011' column='1'/> - <parameter type-id='type-id-2' name='substr' filepath='Objects/unicodeobject.c' line='12012' column='1'/> - <parameter type-id='type-id-2' name='replstr' filepath='Objects/unicodeobject.c' line='12013' column='1'/> - <parameter type-id='type-id-14' name='maxcount' filepath='Objects/unicodeobject.c' line='12014' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Split' mangled-name='PyUnicode_Split' filepath='Objects/unicodeobject.c' line='12349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Split'> - <parameter type-id='type-id-2' name='s' filepath='Objects/unicodeobject.c' line='12349' column='1'/> - <parameter type-id='type-id-2' name='sep' filepath='Objects/unicodeobject.c' line='12349' column='1'/> - <parameter type-id='type-id-14' name='maxsplit' filepath='Objects/unicodeobject.c' line='12349' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Partition' mangled-name='PyUnicode_Partition' filepath='Objects/unicodeobject.c' line='12394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Partition'> - <parameter type-id='type-id-2' name='str_obj' filepath='Objects/unicodeobject.c' line='12394' column='1'/> - <parameter type-id='type-id-2' name='sep_obj' filepath='Objects/unicodeobject.c' line='12394' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_RPartition' mangled-name='PyUnicode_RPartition' filepath='Objects/unicodeobject.c' line='12446' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RPartition'> - <parameter type-id='type-id-2' name='str_obj' filepath='Objects/unicodeobject.c' line='12446' column='1'/> - <parameter type-id='type-id-2' name='sep_obj' filepath='Objects/unicodeobject.c' line='12446' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_RSplit' mangled-name='PyUnicode_RSplit' filepath='Objects/unicodeobject.c' line='12540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RSplit'> - <parameter type-id='type-id-2' name='s' filepath='Objects/unicodeobject.c' line='12540' column='1'/> - <parameter type-id='type-id-2' name='sep' filepath='Objects/unicodeobject.c' line='12540' column='1'/> - <parameter type-id='type-id-14' name='maxsplit' filepath='Objects/unicodeobject.c' line='12540' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_PrepareKindInternal' mangled-name='_PyUnicodeWriter_PrepareKindInternal' filepath='Objects/unicodeobject.c' line='13051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareKindInternal'> - <parameter type-id='type-id-332' name='writer' filepath='Objects/unicodeobject.c' line='13051' column='1'/> - <parameter type-id='type-id-8' name='kind' filepath='Objects/unicodeobject.c' line='13052' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_WriteSubstring' mangled-name='_PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='13117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteSubstring'> - <parameter type-id='type-id-332' name='writer' filepath='Objects/unicodeobject.c' line='13117' column='1'/> - <parameter type-id='type-id-2' name='str' filepath='Objects/unicodeobject.c' line='13117' column='1'/> - <parameter type-id='type-id-14' name='start' filepath='Objects/unicodeobject.c' line='13118' column='1'/> - <parameter type-id='type-id-14' name='end' filepath='Objects/unicodeobject.c' line='13118' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_WriteLatin1String' mangled-name='_PyUnicodeWriter_WriteLatin1String' filepath='Objects/unicodeobject.c' line='13209' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteLatin1String'> - <parameter type-id='type-id-332' name='writer' filepath='Objects/unicodeobject.c' line='13209' column='1'/> - <parameter type-id='type-id-12' name='str' filepath='Objects/unicodeobject.c' line='13210' column='1'/> - <parameter type-id='type-id-14' name='len' filepath='Objects/unicodeobject.c' line='13210' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnicode_Format' mangled-name='PyUnicode_Format' filepath='Objects/unicodeobject.c' line='14359' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Format'> - <parameter type-id='type-id-2' name='format' filepath='Objects/unicodeobject.c' line='14359' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Objects/unicodeobject.c' line='14359' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_InternImmortal' mangled-name='PyUnicode_InternImmortal' filepath='Objects/unicodeobject.c' line='14769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternImmortal'> - <parameter type-id='type-id-233' name='p' filepath='Objects/unicodeobject.c' line='14769' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyInit__string' mangled-name='PyInit__string' filepath='Objects/unicodeobject.c' line='15337' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__string'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/unionobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyUnion_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_unionobject.h' line='11' column='1'/> - <function-decl name='_Py_subs_parameters' filepath='./Include/internal/pycore_unionobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_make_parameters' filepath='./Include/internal/pycore_unionobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Objects/weakrefobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyWeakref_RefType' type-id='type-id-256' mangled-name='_PyWeakref_RefType' visibility='default' filepath='./Include/weakrefobject.h' line='11' column='1' elf-symbol-id='_PyWeakref_RefType'/> - <var-decl name='_PyWeakref_ProxyType' type-id='type-id-256' mangled-name='_PyWeakref_ProxyType' visibility='default' filepath='./Include/weakrefobject.h' line='12' column='1' elf-symbol-id='_PyWeakref_ProxyType'/> - <var-decl name='_PyWeakref_CallableProxyType' type-id='type-id-256' mangled-name='_PyWeakref_CallableProxyType' visibility='default' filepath='./Include/weakrefobject.h' line='13' column='1' elf-symbol-id='_PyWeakref_CallableProxyType'/> - <function-decl name='_PyWeakref_GetWeakrefCount' mangled-name='_PyWeakref_GetWeakrefCount' filepath='Objects/weakrefobject.c' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWeakref_GetWeakrefCount'> - <parameter type-id='type-id-432' name='head' filepath='Objects/weakrefobject.c' line='11' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyWeakref_NewProxy' mangled-name='PyWeakref_NewProxy' filepath='Objects/weakrefobject.c' line='843' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_NewProxy'> - <parameter type-id='type-id-2' name='ob' filepath='Objects/weakrefobject.c' line='843' column='1'/> - <parameter type-id='type-id-2' name='callback' filepath='Objects/weakrefobject.c' line='843' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyWeakref_GetObject' mangled-name='PyWeakref_GetObject' filepath='Objects/weakrefobject.c' line='908' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_GetObject'> - <parameter type-id='type-id-2' name='ref' filepath='Objects/weakrefobject.c' line='908' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/action_helpers.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='64' id='type-id-353'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-444' size-in-bits='64' id='type-id-445'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-446' size-in-bits='64' id='type-id-447'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-448' size-in-bits='64' id='type-id-449'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-450' size-in-bits='64' id='type-id-451'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-452' size-in-bits='64' id='type-id-453'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-454' size-in-bits='64' id='type-id-455'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-456' size-in-bits='64' id='type-id-457'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-22' size-in-bits='64' id='type-id-458'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-459' size-in-bits='64' id='type-id-460'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <class-decl name='_PyUnicodeWriter' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-461' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='487' column='1' id='type-id-462'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buffer' type-id='type-id-2' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='488' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='data' type-id='type-id-22' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='489' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kind' type-id='type-id-8' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='490' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='maxchar' type-id='type-id-250' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='491' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='492' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pos' type-id='type-id-14' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='493' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='min_length' type-id='type-id-14' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='496' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='min_char' type-id='type-id-250' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='499' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='overallocate' type-id='type-id-85' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='502' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='424'> - <var-decl name='readonly' type-id='type-id-85' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='506' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyUnicodeWriter' type-id='type-id-462' filepath='./Include/cpython/unicodeobject.h' line='507' column='1' id='type-id-461'/> - <class-decl name='asdl_generic_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-463' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='32' column='1' id='type-id-464'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-458' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='34' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_generic_seq' type-id='type-id-464' filepath='./Include/internal/pycore_asdl.h' line='35' column='1' id='type-id-463'/> - <class-decl name='asdl_identifier_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-465' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='37' column='1' id='type-id-466'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='39' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_identifier_seq' type-id='type-id-466' filepath='./Include/internal/pycore_asdl.h' line='40' column='1' id='type-id-465'/> - <typedef-decl name='mod_ty' type-id='type-id-467' filepath='./Include/internal/pycore_ast.h' line='15' column='1' id='type-id-468'/> - <typedef-decl name='stmt_ty' type-id='type-id-469' filepath='./Include/internal/pycore_ast.h' line='17' column='1' id='type-id-452'/> - <typedef-decl name='excepthandler_ty' type-id='type-id-470' filepath='./Include/internal/pycore_ast.h' line='36' column='1' id='type-id-446'/> - <typedef-decl name='alias_ty' type-id='type-id-471' filepath='./Include/internal/pycore_ast.h' line='44' column='1' id='type-id-444'/> - <typedef-decl name='withitem_ty' type-id='type-id-472' filepath='./Include/internal/pycore_ast.h' line='46' column='1' id='type-id-459'/> - <typedef-decl name='match_case_ty' type-id='type-id-473' filepath='./Include/internal/pycore_ast.h' line='48' column='1' id='type-id-448'/> - <typedef-decl name='pattern_ty' type-id='type-id-474' filepath='./Include/internal/pycore_ast.h' line='50' column='1' id='type-id-450'/> - <typedef-decl name='type_ignore_ty' type-id='type-id-475' filepath='./Include/internal/pycore_ast.h' line='52' column='1' id='type-id-454'/> - <typedef-decl name='type_param_ty' type-id='type-id-476' filepath='./Include/internal/pycore_ast.h' line='54' column='1' id='type-id-456'/> - <class-decl name='asdl_stmt_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-477' visibility='default' filepath='./Include/internal/pycore_ast.h' line='64' column='1' id='type-id-478'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-453' visibility='default' filepath='./Include/internal/pycore_ast.h' line='66' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_stmt_seq' type-id='type-id-478' filepath='./Include/internal/pycore_ast.h' line='67' column='1' id='type-id-477'/> - <class-decl name='asdl_excepthandler_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-479' visibility='default' filepath='./Include/internal/pycore_ast.h' line='86' column='1' id='type-id-480'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-447' visibility='default' filepath='./Include/internal/pycore_ast.h' line='88' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_excepthandler_seq' type-id='type-id-480' filepath='./Include/internal/pycore_ast.h' line='89' column='1' id='type-id-479'/> - <class-decl name='asdl_alias_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-481' visibility='default' filepath='./Include/internal/pycore_ast.h' line='115' column='1' id='type-id-482'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='116' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='116' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_ast.h' line='117' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_alias_seq' type-id='type-id-482' filepath='./Include/internal/pycore_ast.h' line='118' column='1' id='type-id-481'/> - <class-decl name='asdl_withitem_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-483' visibility='default' filepath='./Include/internal/pycore_ast.h' line='122' column='1' id='type-id-484'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_ast.h' line='124' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_withitem_seq' type-id='type-id-484' filepath='./Include/internal/pycore_ast.h' line='125' column='1' id='type-id-483'/> - <class-decl name='asdl_match_case_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-485' visibility='default' filepath='./Include/internal/pycore_ast.h' line='129' column='1' id='type-id-486'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-449' visibility='default' filepath='./Include/internal/pycore_ast.h' line='131' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_match_case_seq' type-id='type-id-486' filepath='./Include/internal/pycore_ast.h' line='132' column='1' id='type-id-485'/> - <class-decl name='asdl_pattern_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-487' visibility='default' filepath='./Include/internal/pycore_ast.h' line='137' column='1' id='type-id-488'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-451' visibility='default' filepath='./Include/internal/pycore_ast.h' line='139' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_pattern_seq' type-id='type-id-488' filepath='./Include/internal/pycore_ast.h' line='140' column='1' id='type-id-487'/> - <class-decl name='asdl_type_ignore_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-489' visibility='default' filepath='./Include/internal/pycore_ast.h' line='144' column='1' id='type-id-490'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-455' visibility='default' filepath='./Include/internal/pycore_ast.h' line='146' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_type_ignore_seq' type-id='type-id-490' filepath='./Include/internal/pycore_ast.h' line='147' column='1' id='type-id-489'/> - <class-decl name='asdl_type_param_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-491' visibility='default' filepath='./Include/internal/pycore_ast.h' line='152' column='1' id='type-id-492'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-457' visibility='default' filepath='./Include/internal/pycore_ast.h' line='154' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_type_param_seq' type-id='type-id-492' filepath='./Include/internal/pycore_ast.h' line='155' column='1' id='type-id-491'/> - <enum-decl name='_mod_kind' filepath='./Include/internal/pycore_ast.h' line='161' column='1' id='type-id-493'> - <underlying-type type-id='type-id-24'/> - <enumerator name='Module_kind' value='1'/> - <enumerator name='Interactive_kind' value='2'/> - <enumerator name='Expression_kind' value='3'/> - <enumerator name='FunctionType_kind' value='4'/> - </enum-decl> - <class-decl name='_mod' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='163' column='1' id='type-id-494'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-493' visibility='default' filepath='./Include/internal/pycore_ast.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-495' visibility='default' filepath='./Include/internal/pycore_ast.h' line='184' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='165' column='1' id='type-id-495'> - <data-member access='public'> - <var-decl name='Module' type-id='type-id-496' visibility='default' filepath='./Include/internal/pycore_ast.h' line='169' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Interactive' type-id='type-id-497' visibility='default' filepath='./Include/internal/pycore_ast.h' line='173' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Expression' type-id='type-id-498' visibility='default' filepath='./Include/internal/pycore_ast.h' line='177' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='FunctionType' type-id='type-id-499' visibility='default' filepath='./Include/internal/pycore_ast.h' line='182' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='166' column='1' id='type-id-496'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type_ignores' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_ast.h' line='168' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__39' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='171' column='1' id='type-id-497'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='172' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__40' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='175' column='1' id='type-id-498'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='176' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__41' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='179' column='1' id='type-id-499'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='argtypes' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='returns' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='181' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_stmt_kind' filepath='./Include/internal/pycore_ast.h' line='187' column='1' id='type-id-504'> - <underlying-type type-id='type-id-24'/> - <enumerator name='FunctionDef_kind' value='1'/> - <enumerator name='AsyncFunctionDef_kind' value='2'/> - <enumerator name='ClassDef_kind' value='3'/> - <enumerator name='Return_kind' value='4'/> - <enumerator name='Delete_kind' value='5'/> - <enumerator name='Assign_kind' value='6'/> - <enumerator name='TypeAlias_kind' value='7'/> - <enumerator name='AugAssign_kind' value='8'/> - <enumerator name='AnnAssign_kind' value='9'/> - <enumerator name='For_kind' value='10'/> - <enumerator name='AsyncFor_kind' value='11'/> - <enumerator name='While_kind' value='12'/> - <enumerator name='If_kind' value='13'/> - <enumerator name='With_kind' value='14'/> - <enumerator name='AsyncWith_kind' value='15'/> - <enumerator name='Match_kind' value='16'/> - <enumerator name='Raise_kind' value='17'/> - <enumerator name='Try_kind' value='18'/> - <enumerator name='TryStar_kind' value='19'/> - <enumerator name='Assert_kind' value='20'/> - <enumerator name='Import_kind' value='21'/> - <enumerator name='ImportFrom_kind' value='22'/> - <enumerator name='Global_kind' value='23'/> - <enumerator name='Nonlocal_kind' value='24'/> - <enumerator name='Expr_kind' value='25'/> - <enumerator name='Pass_kind' value='26'/> - <enumerator name='Break_kind' value='27'/> - <enumerator name='Continue_kind' value='28'/> - </enum-decl> - <class-decl name='_stmt' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='196' column='1' id='type-id-505'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-504' visibility='default' filepath='./Include/internal/pycore_ast.h' line='197' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-506' visibility='default' filepath='./Include/internal/pycore_ast.h' line='352' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='353' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='544'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='354' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='355' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='608'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='356' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__1' size-in-bits='448' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='198' column='1' id='type-id-506'> - <data-member access='public'> - <var-decl name='FunctionDef' type-id='type-id-507' visibility='default' filepath='./Include/internal/pycore_ast.h' line='207' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='AsyncFunctionDef' type-id='type-id-507' visibility='default' filepath='./Include/internal/pycore_ast.h' line='217' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='ClassDef' type-id='type-id-508' visibility='default' filepath='./Include/internal/pycore_ast.h' line='226' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Return' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='230' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Delete' type-id='type-id-510' visibility='default' filepath='./Include/internal/pycore_ast.h' line='234' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Assign' type-id='type-id-511' visibility='default' filepath='./Include/internal/pycore_ast.h' line='240' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='TypeAlias' type-id='type-id-512' visibility='default' filepath='./Include/internal/pycore_ast.h' line='246' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='AugAssign' type-id='type-id-513' visibility='default' filepath='./Include/internal/pycore_ast.h' line='252' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='AnnAssign' type-id='type-id-514' visibility='default' filepath='./Include/internal/pycore_ast.h' line='259' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='For' type-id='type-id-515' visibility='default' filepath='./Include/internal/pycore_ast.h' line='267' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='AsyncFor' type-id='type-id-515' visibility='default' filepath='./Include/internal/pycore_ast.h' line='275' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='While' type-id='type-id-516' visibility='default' filepath='./Include/internal/pycore_ast.h' line='281' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='If' type-id='type-id-516' visibility='default' filepath='./Include/internal/pycore_ast.h' line='287' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='With' type-id='type-id-517' visibility='default' filepath='./Include/internal/pycore_ast.h' line='293' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='AsyncWith' type-id='type-id-517' visibility='default' filepath='./Include/internal/pycore_ast.h' line='299' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Match' type-id='type-id-518' visibility='default' filepath='./Include/internal/pycore_ast.h' line='304' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Raise' type-id='type-id-519' visibility='default' filepath='./Include/internal/pycore_ast.h' line='309' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Try' type-id='type-id-520' visibility='default' filepath='./Include/internal/pycore_ast.h' line='316' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='TryStar' type-id='type-id-520' visibility='default' filepath='./Include/internal/pycore_ast.h' line='323' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Assert' type-id='type-id-521' visibility='default' filepath='./Include/internal/pycore_ast.h' line='328' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Import' type-id='type-id-522' visibility='default' filepath='./Include/internal/pycore_ast.h' line='332' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='ImportFrom' type-id='type-id-523' visibility='default' filepath='./Include/internal/pycore_ast.h' line='338' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Global' type-id='type-id-524' visibility='default' filepath='./Include/internal/pycore_ast.h' line='342' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Nonlocal' type-id='type-id-524' visibility='default' filepath='./Include/internal/pycore_ast.h' line='346' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Expr' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='350' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='199' column='1' id='type-id-507'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='200' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-526' visibility='default' filepath='./Include/internal/pycore_ast.h' line='201' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='202' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='decorator_list' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='203' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='returns' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='204' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='type_comment' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='205' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='type_params' type-id='type-id-528' visibility='default' filepath='./Include/internal/pycore_ast.h' line='206' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__6' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='219' column='1' id='type-id-508'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='220' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bases' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='221' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='keywords' type-id='type-id-529' visibility='default' filepath='./Include/internal/pycore_ast.h' line='222' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='223' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='decorator_list' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='224' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='type_params' type-id='type-id-528' visibility='default' filepath='./Include/internal/pycore_ast.h' line='225' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__8' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='232' column='1' id='type-id-510'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='targets' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='233' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__9' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='236' column='1' id='type-id-511'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='targets' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='237' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='238' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='type_comment' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='239' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__10' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='242' column='1' id='type-id-512'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='243' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type_params' type-id='type-id-528' visibility='default' filepath='./Include/internal/pycore_ast.h' line='244' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='245' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__11' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='248' column='1' id='type-id-513'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='249' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='op' type-id='type-id-530' visibility='default' filepath='./Include/internal/pycore_ast.h' line='250' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='251' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__12' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='254' column='1' id='type-id-514'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='255' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='annotation' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='256' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='257' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='simple' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='258' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__13' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='261' column='1' id='type-id-515'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='262' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='iter' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='263' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='264' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='orelse' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='265' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='type_comment' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='266' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__15' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='277' column='1' id='type-id-516'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='278' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='279' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='orelse' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='280' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__17' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='289' column='1' id='type-id-517'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='items' type-id='type-id-531' visibility='default' filepath='./Include/internal/pycore_ast.h' line='290' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='291' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='type_comment' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='292' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__19' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='301' column='1' id='type-id-518'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='subject' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='302' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='cases' type-id='type-id-532' visibility='default' filepath='./Include/internal/pycore_ast.h' line='303' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__28' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='306' column='1' id='type-id-519'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='exc' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='307' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='cause' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='308' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__29' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='311' column='1' id='type-id-520'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='312' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='handlers' type-id='type-id-533' visibility='default' filepath='./Include/internal/pycore_ast.h' line='313' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='orelse' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='314' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='finalbody' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='315' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__32' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='325' column='1' id='type-id-521'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='326' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='msg' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='327' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__33' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='330' column='1' id='type-id-522'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='names' type-id='type-id-534' visibility='default' filepath='./Include/internal/pycore_ast.h' line='331' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__34' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='334' column='1' id='type-id-523'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='module' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='335' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='names' type-id='type-id-534' visibility='default' filepath='./Include/internal/pycore_ast.h' line='336' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='337' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__35' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='340' column='1' id='type-id-524'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='names' type-id='type-id-535' visibility='default' filepath='./Include/internal/pycore_ast.h' line='341' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_excepthandler_kind' filepath='./Include/internal/pycore_ast.h' line='523' column='1' id='type-id-536'> - <underlying-type type-id='type-id-24'/> - <enumerator name='ExceptHandler_kind' value='1'/> - </enum-decl> - <class-decl name='_excepthandler' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='524' column='1' id='type-id-537'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-536' visibility='default' filepath='./Include/internal/pycore_ast.h' line='525' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-538' visibility='default' filepath='./Include/internal/pycore_ast.h' line='533' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='534' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='535' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='536' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='537' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='526' column='1' id='type-id-538'> - <data-member access='public'> - <var-decl name='ExceptHandler' type-id='type-id-539' visibility='default' filepath='./Include/internal/pycore_ast.h' line='531' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__31' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='527' column='1' id='type-id-539'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='528' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='529' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='530' column='1'/> - </data-member> - </class-decl> - <class-decl name='_alias' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='569' column='1' id='type-id-540'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='570' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='asname' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='571' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='572' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='573' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='574' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='575' column='1'/> - </data-member> - </class-decl> - <class-decl name='_withitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='578' column='1' id='type-id-541'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='context_expr' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='579' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='optional_vars' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='580' column='1'/> - </data-member> - </class-decl> - <class-decl name='_match_case' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='583' column='1' id='type-id-542'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pattern' type-id='type-id-450' visibility='default' filepath='./Include/internal/pycore_ast.h' line='584' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='guard' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='585' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='body' type-id='type-id-500' visibility='default' filepath='./Include/internal/pycore_ast.h' line='586' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_pattern_kind' filepath='./Include/internal/pycore_ast.h' line='589' column='1' id='type-id-543'> - <underlying-type type-id='type-id-24'/> - <enumerator name='MatchValue_kind' value='1'/> - <enumerator name='MatchSingleton_kind' value='2'/> - <enumerator name='MatchSequence_kind' value='3'/> - <enumerator name='MatchMapping_kind' value='4'/> - <enumerator name='MatchClass_kind' value='5'/> - <enumerator name='MatchStar_kind' value='6'/> - <enumerator name='MatchAs_kind' value='7'/> - <enumerator name='MatchOr_kind' value='8'/> - </enum-decl> - <class-decl name='_pattern' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='593' column='1' id='type-id-544'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-543' visibility='default' filepath='./Include/internal/pycore_ast.h' line='594' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-545' visibility='default' filepath='./Include/internal/pycore_ast.h' line='634' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='635' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='636' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='637' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='638' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__3' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='595' column='1' id='type-id-545'> - <data-member access='public'> - <var-decl name='MatchValue' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='598' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchSingleton' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_ast.h' line='602' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchSequence' type-id='type-id-547' visibility='default' filepath='./Include/internal/pycore_ast.h' line='606' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchMapping' type-id='type-id-548' visibility='default' filepath='./Include/internal/pycore_ast.h' line='612' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchClass' type-id='type-id-549' visibility='default' filepath='./Include/internal/pycore_ast.h' line='619' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchStar' type-id='type-id-550' visibility='default' filepath='./Include/internal/pycore_ast.h' line='623' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchAs' type-id='type-id-551' visibility='default' filepath='./Include/internal/pycore_ast.h' line='628' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='MatchOr' type-id='type-id-547' visibility='default' filepath='./Include/internal/pycore_ast.h' line='632' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__22' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='600' column='1' id='type-id-546'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-552' visibility='default' filepath='./Include/internal/pycore_ast.h' line='601' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__23' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='604' column='1' id='type-id-547'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='patterns' type-id='type-id-553' visibility='default' filepath='./Include/internal/pycore_ast.h' line='605' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__24' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='608' column='1' id='type-id-548'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='keys' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='609' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='patterns' type-id='type-id-553' visibility='default' filepath='./Include/internal/pycore_ast.h' line='610' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='rest' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='611' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='614' column='1' id='type-id-549'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cls' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='615' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='patterns' type-id='type-id-553' visibility='default' filepath='./Include/internal/pycore_ast.h' line='616' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kwd_attrs' type-id='type-id-535' visibility='default' filepath='./Include/internal/pycore_ast.h' line='617' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='kwd_patterns' type-id='type-id-553' visibility='default' filepath='./Include/internal/pycore_ast.h' line='618' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__27' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='625' column='1' id='type-id-551'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pattern' type-id='type-id-450' visibility='default' filepath='./Include/internal/pycore_ast.h' line='626' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='627' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_type_ignore_kind' filepath='./Include/internal/pycore_ast.h' line='641' column='1' id='type-id-554'> - <underlying-type type-id='type-id-24'/> - <enumerator name='TypeIgnore_kind' value='1'/> - </enum-decl> - <class-decl name='_type_ignore' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='642' column='1' id='type-id-555'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-554' visibility='default' filepath='./Include/internal/pycore_ast.h' line='643' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-556' visibility='default' filepath='./Include/internal/pycore_ast.h' line='650' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='644' column='1' id='type-id-556'> - <data-member access='public'> - <var-decl name='TypeIgnore' type-id='type-id-557' visibility='default' filepath='./Include/internal/pycore_ast.h' line='648' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__39' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='645' column='1' id='type-id-557'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='646' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tag' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='647' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_type_param_kind' filepath='./Include/internal/pycore_ast.h' line='653' column='1' id='type-id-558'> - <underlying-type type-id='type-id-24'/> - <enumerator name='TypeVar_kind' value='1'/> - <enumerator name='ParamSpec_kind' value='2'/> - <enumerator name='TypeVarTuple_kind' value='3'/> - </enum-decl> - <class-decl name='_type_param' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='654' column='1' id='type-id-559'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-558' visibility='default' filepath='./Include/internal/pycore_ast.h' line='655' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-560' visibility='default' filepath='./Include/internal/pycore_ast.h' line='670' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='671' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='672' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='673' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='674' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='656' column='1' id='type-id-560'> - <data-member access='public'> - <var-decl name='TypeVar' type-id='type-id-561' visibility='default' filepath='./Include/internal/pycore_ast.h' line='660' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='ParamSpec' type-id='type-id-550' visibility='default' filepath='./Include/internal/pycore_ast.h' line='664' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='TypeVarTuple' type-id='type-id-550' visibility='default' filepath='./Include/internal/pycore_ast.h' line='668' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='657' column='1' id='type-id-561'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='658' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bound' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='659' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='662' column='1' id='type-id-550'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='663' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Py_UCS4' type-id='type-id-352' filepath='./Include/unicodeobject.h' line='102' column='1' id='type-id-250'/> - <pointer-type-def type-id='type-id-461' size-in-bits='64' id='type-id-332'/> - <pointer-type-def type-id='type-id-540' size-in-bits='64' id='type-id-471'/> - <pointer-type-def type-id='type-id-537' size-in-bits='64' id='type-id-470'/> - <pointer-type-def type-id='type-id-542' size-in-bits='64' id='type-id-473'/> - <pointer-type-def type-id='type-id-494' size-in-bits='64' id='type-id-467'/> - <pointer-type-def type-id='type-id-544' size-in-bits='64' id='type-id-474'/> - <pointer-type-def type-id='type-id-505' size-in-bits='64' id='type-id-469'/> - <pointer-type-def type-id='type-id-555' size-in-bits='64' id='type-id-475'/> - <pointer-type-def type-id='type-id-559' size-in-bits='64' id='type-id-476'/> - <pointer-type-def type-id='type-id-541' size-in-bits='64' id='type-id-472'/> - <pointer-type-def type-id='type-id-481' size-in-bits='64' id='type-id-534'/> - <pointer-type-def type-id='type-id-479' size-in-bits='64' id='type-id-533'/> - <pointer-type-def type-id='type-id-463' size-in-bits='64' id='type-id-562'/> - <pointer-type-def type-id='type-id-465' size-in-bits='64' id='type-id-535'/> - <pointer-type-def type-id='type-id-485' size-in-bits='64' id='type-id-532'/> - <pointer-type-def type-id='type-id-487' size-in-bits='64' id='type-id-553'/> - <pointer-type-def type-id='type-id-477' size-in-bits='64' id='type-id-500'/> - <pointer-type-def type-id='type-id-489' size-in-bits='64' id='type-id-501'/> - <pointer-type-def type-id='type-id-491' size-in-bits='64' id='type-id-528'/> - <pointer-type-def type-id='type-id-483' size-in-bits='64' id='type-id-531'/> - <function-decl name='PyBytes_FromString' mangled-name='PyBytes_FromString' filepath='./Include/bytesobject.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromString'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_Concat' mangled-name='PyBytes_Concat' filepath='./Include/bytesobject.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Concat'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_Init' mangled-name='_PyUnicodeWriter_Init' filepath='./Include/cpython/unicodeobject.h' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Init'> - <parameter type-id='type-id-332'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_WriteStr' mangled-name='_PyUnicodeWriter_WriteStr' filepath='./Include/cpython/unicodeobject.h' line='561' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteStr'> - <parameter type-id='type-id-332'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_Finish' mangled-name='_PyUnicodeWriter_Finish' filepath='./Include/cpython/unicodeobject.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Finish'> - <parameter type-id='type-id-332'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicodeWriter_Dealloc' mangled-name='_PyUnicodeWriter_Dealloc' filepath='./Include/cpython/unicodeobject.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Dealloc'> - <parameter type-id='type-id-332'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_asdl_generic_seq_new' filepath='./Include/internal/pycore_asdl.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-562'/> - </function-decl> - <function-decl name='_Py_asdl_identifier_seq_new' filepath='./Include/internal/pycore_asdl.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-535'/> - </function-decl> - <function-decl name='_Py_asdl_int_seq_new' filepath='./Include/internal/pycore_asdl.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-564'/> - </function-decl> - <function-decl name='_Py_asdl_expr_seq_new' filepath='./Include/internal/pycore_ast.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_Py_asdl_arg_seq_new' filepath='./Include/internal/pycore_ast.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-565'/> - </function-decl> - <function-decl name='_Py_asdl_keyword_seq_new' filepath='./Include/internal/pycore_ast.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-529'/> - </function-decl> - <function-decl name='_Py_asdl_pattern_seq_new' filepath='./Include/internal/pycore_ast.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-553'/> - </function-decl> - <function-decl name='_Py_asdl_type_ignore_seq_new' filepath='./Include/internal/pycore_ast.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-501'/> - </function-decl> - <function-decl name='_PyAST_Module' filepath='./Include/internal/pycore_ast.h' line='679' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-501'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyAST_FunctionDef' filepath='./Include/internal/pycore_ast.h' line='685' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-526'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-528'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_AsyncFunctionDef' filepath='./Include/internal/pycore_ast.h' line='690' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-526'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-528'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_ClassDef' filepath='./Include/internal/pycore_ast.h' line='696' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-529'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-528'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Call' filepath='./Include/internal/pycore_ast.h' line='814' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-529'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_FormattedValue' filepath='./Include/internal/pycore_ast.h' line='817' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_JoinedStr' filepath='./Include/internal/pycore_ast.h' line='820' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Attribute' filepath='./Include/internal/pycore_ast.h' line='825' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Subscript' filepath='./Include/internal/pycore_ast.h' line='828' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Starred' filepath='./Include/internal/pycore_ast.h' line='831' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_List' filepath='./Include/internal/pycore_ast.h' line='837' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Tuple' filepath='./Include/internal/pycore_ast.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_arguments' filepath='./Include/internal/pycore_ast.h' line='853' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-567'/> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-567'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-526'/> - </function-decl> - <function-decl name='_PyAST_arg' filepath='./Include/internal/pycore_ast.h' line='857' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-567'/> - </function-decl> - <function-decl name='_PyAST_alias' filepath='./Include/internal/pycore_ast.h' line='863' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-444'/> - </function-decl> - <function-decl name='_PyAST_TypeIgnore' filepath='./Include/internal/pycore_ast.h' line='894' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-454'/> - </function-decl> - <function-decl name='PyUnicode_FromString' mangled-name='PyUnicode_FromString' filepath='./Include/unicodeobject.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromString'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_GetLength' mangled-name='PyUnicode_GetLength' filepath='./Include/unicodeobject.h' line='169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetLength'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='strcpy' filepath='/usr/include/string.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='strpbrk' filepath='/usr/include/string.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_PyPegen_new_identifier' filepath='Parser/pegen.h' line='296' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyPegen_parse_string' filepath='Parser/string_parser.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyPegen_decode_string' filepath='Parser/string_parser.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-2'/> - </function-decl> - <class-decl name='__anonymous_struct__7' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='228' column='1' id='type-id-509'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='229' column='1'/> - </data-member> - </class-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/myreadline.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-570' size-in-bits='512' id='type-id-571'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-573' size-in-bits='5120' id='type-id-574'> - <subrange length='80' type-id='type-id-28' id='type-id-575'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-329' size-in-bits='512' id='type-id-576'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-346' size-in-bits='5120' id='type-id-577'> - <subrange length='80' type-id='type-id-28' id='type-id-575'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-340' size-in-bits='5120' id='type-id-578'> - <subrange length='80' type-id='type-id-28' id='type-id-575'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-342' size-in-bits='512' id='type-id-579'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-366' size-in-bits='512' id='type-id-580'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-249' size-in-bits='5120' id='type-id-581'> - <subrange length='80' type-id='type-id-28' id='type-id-575'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-240' size-in-bits='67072' id='type-id-582'> - <subrange length='262' type-id='type-id-28' id='type-id-583'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='512' id='type-id-584'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='2' type-id='type-id-2' size-in-bits='8704' id='type-id-585'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - <subrange length='17' type-id='type-id-28' id='type-id-586'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-587' size-in-bits='1280' id='type-id-588'> - <subrange length='20' type-id='type-id-28' id='type-id-589'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-435' size-in-bits='512' id='type-id-590'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-591' size-in-bits='32' id='type-id-592'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-593' size-in-bits='5120' id='type-id-594'> - <subrange length='80' type-id='type-id-28' id='type-id-575'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-595' size-in-bits='49152' id='type-id-596'> - <subrange length='128' type-id='type-id-28' id='type-id-437'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-597' size-in-bits='65536' id='type-id-598'> - <subrange length='128' type-id='type-id-28' id='type-id-437'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-599' size-in-bits='98304' id='type-id-600'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-601' size-in-bits='4096' id='type-id-602'> - <subrange length='32' type-id='type-id-28' id='type-id-60'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-603' size-in-bits='1048576' id='type-id-604'> - <subrange length='16384' type-id='type-id-28' id='type-id-605'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-606' size-in-bits='2097152' id='type-id-607'> - <subrange length='32768' type-id='type-id-28' id='type-id-608'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-609' size-in-bits='2097152' id='type-id-610'> - <subrange length='32768' type-id='type-id-28' id='type-id-608'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-611' size-in-bits='4160' id='type-id-612'> - <subrange length='65' type-id='type-id-28' id='type-id-64'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-613' size-in-bits='2048' id='type-id-614'> - <subrange length='32' type-id='type-id-28' id='type-id-60'/> - </array-type-def> - <type-decl name='bool' size-in-bits='8' id='type-id-615'/> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='320' id='type-id-616'> - <subrange length='40' type-id='type-id-28' id='type-id-617'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='384' id='type-id-618'> - <subrange length='48' type-id='type-id-28' id='type-id-619'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='32' id='type-id-620'> - <subrange length='4' type-id='type-id-28' id='type-id-223'/> - </array-type-def> - <class-decl name='PyAsyncGenASend' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-621'/> - <class-decl name='_PyAsyncGenWrappedValue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-622'/> - <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='72' column='1' id='type-id-350'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='dk_refcnt' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dk_log2_size' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='72'> - <var-decl name='dk_log2_index_bytes' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='dk_kind' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_dict.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='dk_version' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_dict.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='dk_usable' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='dk_nentries' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_dict.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='dk_indices' type-id='type-id-257' visibility='default' filepath='./Include/internal/pycore_dict.h' line='106' column='1'/> - </data-member> - </class-decl> - <class-decl name='_dictvalues' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='122' column='1' id='type-id-351'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='values' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_dict.h' line='123' column='1'/> - </data-member> - </class-decl> - <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-623'/> - <array-type-def dimensions='1' type-id='type-id-384' size-in-bits='32' id='type-id-624'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-251' size-in-bits='18432' id='type-id-625'> - <subrange length='288' type-id='type-id-28' id='type-id-626'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-397' size-in-bits='16320' id='type-id-627'> - <subrange length='255' type-id='type-id-28' id='type-id-628'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-629' size-in-bits='576' id='type-id-630'> - <subrange length='3' type-id='type-id-28' id='type-id-631'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-632' size-in-bits='576' id='type-id-633'> - <subrange length='3' type-id='type-id-28' id='type-id-631'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='640' id='type-id-634'> - <subrange length='20' type-id='type-id-28' id='type-id-589'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='896' id='type-id-635'> - <subrange length='28' type-id='type-id-28' id='type-id-636'/> - </array-type-def> - <type-decl name='long long int' size-in-bits='64' id='type-id-378'/> - <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-387'/> - <array-type-def dimensions='1' type-id='type-id-637' size-in-bits='4096' id='type-id-638'> - <subrange length='64' type-id='type-id-28' id='type-id-639'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-640' size-in-bits='640' id='type-id-641'> - <subrange length='10' type-id='type-id-28' id='type-id-642'/> - </array-type-def> - <type-decl name='short int' size-in-bits='16' id='type-id-71'/> - <array-type-def dimensions='1' type-id='type-id-410' size-in-bits='64000' id='type-id-643'> - <subrange length='200' type-id='type-id-28' id='type-id-644'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-645' size-in-bits='96' id='type-id-646'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-647' size-in-bits='786432' id='type-id-648'> - <subrange length='4096' type-id='type-id-28' id='type-id-649'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='80' id='type-id-650'> - <subrange length='10' type-id='type-id-28' id='type-id-642'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='88' id='type-id-651'> - <subrange length='11' type-id='type-id-28' id='type-id-652'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='96' id='type-id-653'> - <subrange length='12' type-id='type-id-28' id='type-id-654'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='104' id='type-id-655'> - <subrange length='13' type-id='type-id-28' id='type-id-656'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='112' id='type-id-657'> - <subrange length='14' type-id='type-id-28' id='type-id-658'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='120' id='type-id-659'> - <subrange length='15' type-id='type-id-28' id='type-id-660'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='128' id='type-id-661'> - <subrange length='16' type-id='type-id-28' id='type-id-57'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='136' id='type-id-662'> - <subrange length='17' type-id='type-id-28' id='type-id-586'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='144' id='type-id-663'> - <subrange length='18' type-id='type-id-28' id='type-id-664'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='152' id='type-id-665'> - <subrange length='19' type-id='type-id-28' id='type-id-666'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='8' id='type-id-667'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='160' id='type-id-668'> - <subrange length='20' type-id='type-id-28' id='type-id-589'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='168' id='type-id-669'> - <subrange length='21' type-id='type-id-28' id='type-id-670'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='184' id='type-id-671'> - <subrange length='23' type-id='type-id-28' id='type-id-672'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='192' id='type-id-673'> - <subrange length='24' type-id='type-id-28' id='type-id-674'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='200' id='type-id-675'> - <subrange length='25' type-id='type-id-28' id='type-id-676'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='208' id='type-id-677'> - <subrange length='26' type-id='type-id-28' id='type-id-678'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='224' id='type-id-679'> - <subrange length='28' type-id='type-id-28' id='type-id-636'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='16' id='type-id-680'> - <subrange length='2' type-id='type-id-28' id='type-id-681'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='248' id='type-id-682'> - <subrange length='31' type-id='type-id-28' id='type-id-683'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='288' id='type-id-684'> - <subrange length='36' type-id='type-id-28' id='type-id-685'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='24' id='type-id-686'> - <subrange length='3' type-id='type-id-28' id='type-id-631'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='32' id='type-id-687'> - <subrange length='4' type-id='type-id-28' id='type-id-223'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='40' id='type-id-688'> - <subrange length='5' type-id='type-id-28' id='type-id-689'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='48' id='type-id-690'> - <subrange length='6' type-id='type-id-28' id='type-id-401'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='56' id='type-id-691'> - <subrange length='7' type-id='type-id-28' id='type-id-692'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='64' id='type-id-693'> - <subrange length='8' type-id='type-id-28' id='type-id-572'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-325' size-in-bits='72' id='type-id-694'> - <subrange length='9' type-id='type-id-28' id='type-id-695'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-95' size-in-bits='64' id='type-id-696'> - <subrange length='2' type-id='type-id-28' id='type-id-681'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-28' size-in-bits='1024' id='type-id-697'> - <subrange length='16' type-id='type-id-28' id='type-id-57'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-698' size-in-bits='8320' id='type-id-699'> - <subrange length='65' type-id='type-id-28' id='type-id-64'/> - </array-type-def> - <class-decl name='PyBytesObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-700' visibility='default' filepath='./Include/cpython/bytesobject.h' line='5' column='1' id='type-id-701'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/cpython/bytesobject.h' line='6' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ob_shash' type-id='type-id-305' visibility='default' filepath='./Include/cpython/bytesobject.h' line='7' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ob_sval' type-id='type-id-702' visibility='default' filepath='./Include/cpython/bytesobject.h' line='8' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyBytesObject' type-id='type-id-701' filepath='./Include/cpython/bytesobject.h' line='15' column='1' id='type-id-700'/> - <class-decl name='_Py_LocalMonitors' size-in-bits='120' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='20' column='1' id='type-id-703'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tools' type-id='type-id-659' visibility='default' filepath='./Include/cpython/code.h' line='22' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_LocalMonitors' type-id='type-id-703' filepath='./Include/cpython/code.h' line='23' column='1' id='type-id-704'/> - <class-decl name='_Py_GlobalMonitors' size-in-bits='120' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='25' column='1' id='type-id-705'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tools' type-id='type-id-659' visibility='default' filepath='./Include/cpython/code.h' line='26' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_GlobalMonitors' type-id='type-id-705' filepath='./Include/cpython/code.h' line='27' column='1' id='type-id-706'/> - <union-decl name='_Py_CODEUNIT' size-in-bits='16' naming-typedef-id='type-id-707' visibility='default' filepath='./Include/cpython/code.h' line='38' column='1' id='type-id-708'> - <data-member access='public'> - <var-decl name='cache' type-id='type-id-709' visibility='default' filepath='./Include/cpython/code.h' line='39' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='op' type-id='type-id-710' visibility='default' filepath='./Include/cpython/code.h' line='43' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__747' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/code.h' line='40' column='1' id='type-id-710'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='code' type-id='type-id-325' visibility='default' filepath='./Include/cpython/code.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='arg' type-id='type-id-325' visibility='default' filepath='./Include/cpython/code.h' line='42' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_CODEUNIT' type-id='type-id-708' filepath='./Include/cpython/code.h' line='44' column='1' id='type-id-707'/> - <class-decl name='_PyCoCached' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-711' visibility='default' filepath='./Include/cpython/code.h' line='71' column='1' id='type-id-712'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_co_code' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_co_varnames' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_co_cellvars' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_co_freevars' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='75' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCoCached' type-id='type-id-712' filepath='./Include/cpython/code.h' line='76' column='1' id='type-id-711'/> - <class-decl name='_PyCoLineInstrumentationData' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-713' visibility='default' filepath='./Include/cpython/code.h' line='81' column='1' id='type-id-714'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='original_opcode' type-id='type-id-325' visibility='default' filepath='./Include/cpython/code.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8'> - <var-decl name='line_delta' type-id='type-id-370' visibility='default' filepath='./Include/cpython/code.h' line='83' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCoLineInstrumentationData' type-id='type-id-714' filepath='./Include/cpython/code.h' line='84' column='1' id='type-id-713'/> - <class-decl name='_PyCoMonitoringData' size-in-bits='576' is-struct='yes' naming-typedef-id='type-id-715' visibility='default' filepath='./Include/cpython/code.h' line='89' column='1' id='type-id-716'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='local_monitors' type-id='type-id-704' visibility='default' filepath='./Include/cpython/code.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='120'> - <var-decl name='active_monitors' type-id='type-id-704' visibility='default' filepath='./Include/cpython/code.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tools' type-id='type-id-717' visibility='default' filepath='./Include/cpython/code.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='lines' type-id='type-id-718' visibility='default' filepath='./Include/cpython/code.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='line_tools' type-id='type-id-717' visibility='default' filepath='./Include/cpython/code.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='per_instruction_opcodes' type-id='type-id-717' visibility='default' filepath='./Include/cpython/code.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='per_instruction_tools' type-id='type-id-717' visibility='default' filepath='./Include/cpython/code.h' line='104' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCoMonitoringData' type-id='type-id-716' filepath='./Include/cpython/code.h' line='105' column='1' id='type-id-715'/> - <class-decl name='PyCodeObject' size-in-bits='1600' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1' id='type-id-719'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='co_consts' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='co_names' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='co_exceptiontable' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='co_flags' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='co_argcount' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='co_posonlyargcount' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='co_kwonlyargcount' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='co_stacksize' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='544'> - <var-decl name='co_firstlineno' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='co_nlocalsplus' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='608'> - <var-decl name='co_framesize' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='co_nlocals' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='672'> - <var-decl name='co_ncellvars' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='co_nfreevars' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='co_version' type-id='type-id-352' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='co_localsplusnames' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='co_localspluskinds' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='co_filename' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='co_name' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='co_qualname' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='co_linetable' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='co_weakreflist' type-id='type-id-2' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_co_cached' type-id='type-id-720' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_co_instrumentation_version' type-id='type-id-117' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_co_monitoring' type-id='type-id-721' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_co_firsttraceable' type-id='type-id-8' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='co_extra' type-id='type-id-22' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='co_code_adaptive' type-id='type-id-702' visibility='default' filepath='./Include/cpython/code.h' line='175' column='1'/> - </data-member> - </class-decl> - <enum-decl name='PyCodeEvent' naming-typedef-id='type-id-722' filepath='./Include/cpython/code.h' line='279' column='1' id='type-id-723'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PY_CODE_EVENT_CREATE' value='0'/> - <enumerator name='PY_CODE_EVENT_DESTROY' value='1'/> - </enum-decl> - <typedef-decl name='PyCodeEvent' type-id='type-id-723' filepath='./Include/cpython/code.h' line='283' column='1' id='type-id-722'/> - <typedef-decl name='PyCode_WatchCallback' type-id='type-id-724' filepath='./Include/cpython/code.h' line='295' column='1' id='type-id-329'/> - <typedef-decl name='PyContext' type-id='type-id-725' filepath='./Include/cpython/context.h' line='9' column='1' id='type-id-726'/> - <typedef-decl name='wrapperfunc' type-id='type-id-727' filepath='./Include/cpython/descrobject.h' line='5' column='1' id='type-id-728'/> - <class-decl name='wrapperbase' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/cpython/descrobject.h' line='11' column='1' id='type-id-333'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/cpython/descrobject.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='offset' type-id='type-id-8' visibility='default' filepath='./Include/cpython/descrobject.h' line='13' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='function' type-id='type-id-22' visibility='default' filepath='./Include/cpython/descrobject.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='wrapper' type-id='type-id-728' visibility='default' filepath='./Include/cpython/descrobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='doc' type-id='type-id-12' visibility='default' filepath='./Include/cpython/descrobject.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='flags' type-id='type-id-8' visibility='default' filepath='./Include/cpython/descrobject.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='name_strobj' type-id='type-id-2' visibility='default' filepath='./Include/cpython/descrobject.h' line='18' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyDictKeysObject' type-id='type-id-350' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-348'/> - <typedef-decl name='PyDictValues' type-id='type-id-351' filepath='./Include/cpython/dictobject.h' line='6' column='1' id='type-id-349'/> - <class-decl name='PyDictObject' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-343' visibility='default' filepath='./Include/cpython/dictobject.h' line='11' column='1' id='type-id-344'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/dictobject.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ma_used' type-id='type-id-14' visibility='default' filepath='./Include/cpython/dictobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ma_version_tag' type-id='type-id-117' visibility='default' filepath='./Include/cpython/dictobject.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ma_keys' type-id='type-id-346' visibility='default' filepath='./Include/cpython/dictobject.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ma_values' type-id='type-id-347' visibility='default' filepath='./Include/cpython/dictobject.h' line='32' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyDictObject' type-id='type-id-344' filepath='./Include/cpython/dictobject.h' line='33' column='1' id='type-id-343'/> - <enum-decl name='PyDict_WatchEvent' naming-typedef-id='type-id-729' filepath='./Include/cpython/dictobject.h' line='101' column='1' id='type-id-730'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PyDict_EVENT_ADDED' value='0'/> - <enumerator name='PyDict_EVENT_MODIFIED' value='1'/> - <enumerator name='PyDict_EVENT_DELETED' value='2'/> - <enumerator name='PyDict_EVENT_CLONED' value='3'/> - <enumerator name='PyDict_EVENT_CLEARED' value='4'/> - <enumerator name='PyDict_EVENT_DEALLOCATED' value='5'/> - </enum-decl> - <typedef-decl name='PyDict_WatchEvent' type-id='type-id-730' filepath='./Include/cpython/dictobject.h' line='105' column='1' id='type-id-729'/> - <typedef-decl name='PyDict_WatchCallback' type-id='type-id-731' filepath='./Include/cpython/dictobject.h' line='110' column='1' id='type-id-342'/> - <typedef-decl name='Py_OpenCodeHookFunction' type-id='type-id-732' filepath='./Include/cpython/fileobject.h' line='13' column='1' id='type-id-355'/> - <class-decl name='PyFloatObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-733' visibility='default' filepath='./Include/cpython/floatobject.h' line='5' column='1' id='type-id-734'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/floatobject.h' line='6' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_fval' type-id='type-id-251' visibility='default' filepath='./Include/cpython/floatobject.h' line='7' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyFloatObject' type-id='type-id-734' filepath='./Include/cpython/floatobject.h' line='8' column='1' id='type-id-733'/> - <class-decl name='PyFunctionObject' size-in-bits='1152' is-struct='yes' naming-typedef-id='type-id-735' visibility='default' filepath='./Include/cpython/funcobject.h' line='36' column='1' id='type-id-736'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/funcobject.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='func_globals' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='func_builtins' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='func_name' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='func_qualname' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='func_code' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='func_defaults' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='func_kwdefaults' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='func_closure' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='func_doc' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='func_dict' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='func_weakreflist' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='func_module' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='func_annotations' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='func_typeparams' type-id='type-id-2' visibility='default' filepath='./Include/cpython/funcobject.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='vectorcall' type-id='type-id-311' visibility='default' filepath='./Include/cpython/funcobject.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='func_version' type-id='type-id-352' visibility='default' filepath='./Include/cpython/funcobject.h' line='54' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyFunctionObject' type-id='type-id-736' filepath='./Include/cpython/funcobject.h' line='61' column='1' id='type-id-735'/> - <enum-decl name='PyFunction_WatchEvent' naming-typedef-id='type-id-737' filepath='./Include/cpython/funcobject.h' line='142' column='1' id='type-id-738'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PyFunction_EVENT_CREATE' value='0'/> - <enumerator name='PyFunction_EVENT_DESTROY' value='1'/> - <enumerator name='PyFunction_EVENT_MODIFY_CODE' value='2'/> - <enumerator name='PyFunction_EVENT_MODIFY_DEFAULTS' value='3'/> - <enumerator name='PyFunction_EVENT_MODIFY_KWDEFAULTS' value='4'/> - </enum-decl> - <typedef-decl name='PyFunction_WatchEvent' type-id='type-id-738' filepath='./Include/cpython/funcobject.h' line='146' column='1' id='type-id-737'/> - <typedef-decl name='PyFunction_WatchCallback' type-id='type-id-739' filepath='./Include/cpython/funcobject.h' line='163' column='1' id='type-id-366'/> - <class-decl name='_inittab' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='24' column='1' id='type-id-740'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/cpython/import.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='initfunc' type-id='type-id-390' visibility='default' filepath='./Include/cpython/import.h' line='26' column='1'/> - </data-member> - </class-decl> - <class-decl name='PyWideStringList' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='32' column='1' id='type-id-742'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='length' type-id='type-id-14' visibility='default' filepath='./Include/cpython/initconfig.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='items' type-id='type-id-235' visibility='default' filepath='./Include/cpython/initconfig.h' line='36' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyWideStringList' type-id='type-id-742' filepath='./Include/cpython/initconfig.h' line='37' column='1' id='type-id-741'/> - <class-decl name='PyPreConfig' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='48' column='1' id='type-id-743'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_config_init' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='parse_argv' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='isolated' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='use_environment' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='configure_locale' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='coerce_c_locale' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='coerce_c_locale_warn' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='utf8_mode' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='dev_mode' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='allocator' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='125' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyPreConfig' type-id='type-id-743' filepath='./Include/cpython/initconfig.h' line='126' column='1' id='type-id-744'/> - <class-decl name='PyConfig' size-in-bits='3456' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='135' column='1' id='type-id-745'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_config_init' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='isolated' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='use_environment' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='dev_mode' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='140' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='install_signal_handlers' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='use_hash_seed' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='hash_seed' type-id='type-id-28' visibility='default' filepath='./Include/cpython/initconfig.h' line='143' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='faulthandler' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='144' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='tracemalloc' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='perf_profiling' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='146' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='import_time' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='code_debug_ranges' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='416'> - <var-decl name='show_ref_count' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='dump_refs' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='dump_refs_file' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='malloc_stats' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='filesystem_encoding' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='filesystem_errors' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='pycache_prefix' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='parse_argv' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='orig_argv' type-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='argv' type-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='xoptions' type-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='warnoptions' type-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='site_import' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1440'> - <var-decl name='bytes_warning' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='warn_default_encoding' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1504'> - <var-decl name='inspect' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='interactive' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='optimization_level' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='parser_debug' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1632'> - <var-decl name='write_bytecode' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='168' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='verbose' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1696'> - <var-decl name='quiet' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='170' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='user_site_directory' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1760'> - <var-decl name='configure_c_stdio' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='172' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='buffered_stdio' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='173' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='stdio_encoding' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='stdio_errors' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='check_hash_pycs_mode' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='179' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='use_frozen_modules' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2080'> - <var-decl name='safe_path' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='int_max_str_digits' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='182' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2144'> - <var-decl name='pathconfig_warnings' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='program_name' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='186' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='pythonpath_env' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='187' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2304'> - <var-decl name='home' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='188' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='platlibdir' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='189' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='module_search_paths_set' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='192' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='module_search_paths' type-id='type-id-741' visibility='default' filepath='./Include/cpython/initconfig.h' line='193' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='stdlib_dir' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='194' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='executable' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='195' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='base_executable' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='196' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='prefix' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='197' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='base_prefix' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='198' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='exec_prefix' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='199' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3008'> - <var-decl name='base_exec_prefix' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='200' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='skip_source_first_line' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='203' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='run_command' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='204' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='run_module' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='205' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3264'> - <var-decl name='run_filename' type-id='type-id-52' visibility='default' filepath='./Include/cpython/initconfig.h' line='206' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='_install_importlib' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='212' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3360'> - <var-decl name='_init_main' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='215' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3392'> - <var-decl name='_is_python_build' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='218' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyConfig' type-id='type-id-745' filepath='./Include/cpython/initconfig.h' line='219' column='1' id='type-id-258'/> - <class-decl name='PyListObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-746' visibility='default' filepath='./Include/cpython/listobject.h' line='5' column='1' id='type-id-747'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/cpython/listobject.h' line='6' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ob_item' type-id='type-id-233' visibility='default' filepath='./Include/cpython/listobject.h' line='8' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='allocated' type-id='type-id-14' visibility='default' filepath='./Include/cpython/listobject.h' line='21' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyListObject' type-id='type-id-747' filepath='./Include/cpython/listobject.h' line='22' column='1' id='type-id-746'/> - <typedef-decl name='digit' type-id='type-id-352' filepath='./Include/cpython/longintrepr.h' line='43' column='1' id='type-id-384'/> - <class-decl name='_PyLongValue' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='82' column='1' id='type-id-748'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lv_tag' type-id='type-id-749' visibility='default' filepath='./Include/cpython/longintrepr.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_digit' type-id='type-id-624' visibility='default' filepath='./Include/cpython/longintrepr.h' line='84' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyLongValue' type-id='type-id-748' filepath='./Include/cpython/longintrepr.h' line='85' column='1' id='type-id-750'/> - <class-decl name='_longobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='87' column='1' id='type-id-751'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/longintrepr.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='long_value' type-id='type-id-750' visibility='default' filepath='./Include/cpython/longintrepr.h' line='89' column='1'/> - </data-member> - </class-decl> - <class-decl name='_PyArg_Parser' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/cpython/modsupport.h' line='53' column='1' id='type-id-752'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-8' visibility='default' filepath='./Include/cpython/modsupport.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='format' type-id='type-id-12' visibility='default' filepath='./Include/cpython/modsupport.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='keywords' type-id='type-id-753' visibility='default' filepath='./Include/cpython/modsupport.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fname' type-id='type-id-12' visibility='default' filepath='./Include/cpython/modsupport.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='custom_msg' type-id='type-id-12' visibility='default' filepath='./Include/cpython/modsupport.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='pos' type-id='type-id-8' visibility='default' filepath='./Include/cpython/modsupport.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='min' type-id='type-id-8' visibility='default' filepath='./Include/cpython/modsupport.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='max' type-id='type-id-8' visibility='default' filepath='./Include/cpython/modsupport.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='kwtuple' type-id='type-id-2' visibility='default' filepath='./Include/cpython/modsupport.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='next' type-id='type-id-262' visibility='default' filepath='./Include/cpython/modsupport.h' line='63' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyType_WatchCallback' type-id='type-id-754' filepath='./Include/cpython/object.h' line='564' column='1' id='type-id-435'/> - <class-decl name='PyObjectArenaAllocator' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-420' visibility='default' filepath='./Include/cpython/objimpl.h' line='59' column='1' id='type-id-755'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ctx' type-id='type-id-22' visibility='default' filepath='./Include/cpython/objimpl.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='alloc' type-id='type-id-756' visibility='default' filepath='./Include/cpython/objimpl.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free' type-id='type-id-757' visibility='default' filepath='./Include/cpython/objimpl.h' line='67' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyObjectArenaAllocator' type-id='type-id-755' filepath='./Include/cpython/objimpl.h' line='68' column='1' id='type-id-420'/> - <class-decl name='PyBaseExceptionObject' size-in-bits='576' is-struct='yes' naming-typedef-id='type-id-758' visibility='default' filepath='./Include/cpython/pyerrors.h' line='13' column='1' id='type-id-759'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='dict' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='args' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='notes' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='traceback' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='context' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='cause' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='suppress_context' type-id='type-id-48' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyBaseExceptionObject' type-id='type-id-759' filepath='./Include/cpython/pyerrors.h' line='15' column='1' id='type-id-758'/> - <typedef-decl name='atexit_datacallbackfunc' type-id='type-id-760' filepath='./Include/cpython/pylifecycle.h' line='109' column='1' id='type-id-21'/> - <class-decl name='PyMemAllocatorEx' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-417' visibility='default' filepath='./Include/cpython/pymem.h' line='47' column='1' id='type-id-761'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ctx' type-id='type-id-22' visibility='default' filepath='./Include/cpython/pymem.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='malloc' type-id='type-id-756' visibility='default' filepath='./Include/cpython/pymem.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='calloc' type-id='type-id-762' visibility='default' filepath='./Include/cpython/pymem.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='realloc' type-id='type-id-763' visibility='default' filepath='./Include/cpython/pymem.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='free' type-id='type-id-764' visibility='default' filepath='./Include/cpython/pymem.h' line='61' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyMemAllocatorEx' type-id='type-id-761' filepath='./Include/cpython/pymem.h' line='62' column='1' id='type-id-417'/> - <typedef-decl name='Py_tracefunc' type-id='type-id-765' filepath='./Include/cpython/pystate.h' line='49' column='1' id='type-id-766'/> - <class-decl name='_PyCFrame' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='67' column='1' id='type-id-767'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='current_frame' type-id='type-id-375' visibility='default' filepath='./Include/cpython/pystate.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-768' visibility='default' filepath='./Include/cpython/pystate.h' line='80' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCFrame' type-id='type-id-767' filepath='./Include/cpython/pystate.h' line='81' column='1' id='type-id-769'/> - <class-decl name='_err_stackitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='83' column='1' id='type-id-770'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='exc_value' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous_item' type-id='type-id-771' visibility='default' filepath='./Include/cpython/pystate.h' line='99' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyErr_StackItem' type-id='type-id-770' filepath='./Include/cpython/pystate.h' line='101' column='1' id='type-id-369'/> - <class-decl name='_stack_chunk' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='103' column='1' id='type-id-772'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='previous' type-id='type-id-773' visibility='default' filepath='./Include/cpython/pystate.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='size' type-id='type-id-19' visibility='default' filepath='./Include/cpython/pystate.h' line='105' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='top' type-id='type-id-19' visibility='default' filepath='./Include/cpython/pystate.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='data' type-id='type-id-353' visibility='default' filepath='./Include/cpython/pystate.h' line='107' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyStackChunk' type-id='type-id-772' filepath='./Include/cpython/pystate.h' line='108' column='1' id='type-id-774'/> - <class-decl name='_py_trashcan' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='110' column='1' id='type-id-775'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='delete_nesting' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='delete_later' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='112' column='1'/> - </data-member> - </class-decl> - <class-decl name='_ts' size-in-bits='2304' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='115' column='1' id='type-id-776'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='prev' type-id='type-id-177' visibility='default' filepath='./Include/cpython/pystate.h' line='118' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='next' type-id='type-id-177' visibility='default' filepath='./Include/cpython/pystate.h' line='119' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='interp' type-id='type-id-20' visibility='default' filepath='./Include/cpython/pystate.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_status' type-id='type-id-777' visibility='default' filepath='./Include/cpython/pystate.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='py_recursion_remaining' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='py_recursion_limit' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='c_recursion_remaining' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='recursion_headroom' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='tracing' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='what_event' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='cframe' type-id='type-id-768' visibility='default' filepath='./Include/cpython/pystate.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='c_profilefunc' type-id='type-id-766' visibility='default' filepath='./Include/cpython/pystate.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='c_tracefunc' type-id='type-id-766' visibility='default' filepath='./Include/cpython/pystate.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='c_profileobj' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='c_traceobj' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='current_exception' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='exc_info' type-id='type-id-376' visibility='default' filepath='./Include/cpython/pystate.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='dict' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='gilstate_counter' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='async_exc' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='thread_id' type-id='type-id-28' visibility='default' filepath='./Include/cpython/pystate.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='native_thread_id' type-id='type-id-28' visibility='default' filepath='./Include/cpython/pystate.h' line='187' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='trash' type-id='type-id-775' visibility='default' filepath='./Include/cpython/pystate.h' line='189' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='on_delete' type-id='type-id-760' visibility='default' filepath='./Include/cpython/pystate.h' line='214' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='on_delete_data' type-id='type-id-22' visibility='default' filepath='./Include/cpython/pystate.h' line='215' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='coroutine_origin_tracking_depth' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pystate.h' line='217' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='async_gen_firstiter' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='219' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='async_gen_finalizer' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='220' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='context' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='222' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='context_ver' type-id='type-id-117' visibility='default' filepath='./Include/cpython/pystate.h' line='223' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='id' type-id='type-id-117' visibility='default' filepath='./Include/cpython/pystate.h' line='226' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='datastack_chunk' type-id='type-id-778' visibility='default' filepath='./Include/cpython/pystate.h' line='228' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='datastack_top' type-id='type-id-233' visibility='default' filepath='./Include/cpython/pystate.h' line='229' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='datastack_limit' type-id='type-id-233' visibility='default' filepath='./Include/cpython/pystate.h' line='230' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='exc_state' type-id='type-id-369' visibility='default' filepath='./Include/cpython/pystate.h' line='245' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='root_cframe' type-id='type-id-769' visibility='default' filepath='./Include/cpython/pystate.h' line='248' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__749' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='122' column='1' id='type-id-777'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1'> - <var-decl name='bound' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2'> - <var-decl name='unbound' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3'> - <var-decl name='bound_gilstate' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='134' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4'> - <var-decl name='active' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5'> - <var-decl name='finalizing' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6'> - <var-decl name='cleared' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='140' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7'> - <var-decl name='finalized' type-id='type-id-95' visibility='default' filepath='./Include/cpython/pystate.h' line='141' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyFrameEvalFunction' type-id='type-id-779' filepath='./Include/cpython/pystate.h' line='323' column='1' id='type-id-780'/> - <typedef-decl name='_PyCrossInterpreterData' type-id='type-id-781' filepath='./Include/cpython/pystate.h' line='376' column='1' id='type-id-782'/> - <typedef-decl name='xid_newobjectfunc' type-id='type-id-783' filepath='./Include/cpython/pystate.h' line='378' column='1' id='type-id-784'/> - <typedef-decl name='xid_freefunc' type-id='type-id-760' filepath='./Include/cpython/pystate.h' line='379' column='1' id='type-id-785'/> - <class-decl name='_xid' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='381' column='1' id='type-id-781'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='data' type-id='type-id-22' visibility='default' filepath='./Include/cpython/pystate.h' line='385' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='obj' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='392' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='interp' type-id='type-id-377' visibility='default' filepath='./Include/cpython/pystate.h' line='402' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='new_object' type-id='type-id-784' visibility='default' filepath='./Include/cpython/pystate.h' line='407' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='free' type-id='type-id-785' visibility='default' filepath='./Include/cpython/pystate.h' line='417' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='crossinterpdatafunc' type-id='type-id-786' filepath='./Include/cpython/pystate.h' line='439' column='1' id='type-id-787'/> - <class-decl name='_Py_tss_t' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/cpython/pythread.h' line='34' column='1' id='type-id-788'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_is_initialized' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pythread.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='_key' type-id='type-id-789' visibility='default' filepath='./Include/cpython/pythread.h' line='36' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyTime_t' type-id='type-id-377' filepath='./Include/cpython/pytime.h' line='63' column='1' id='type-id-790'/> - <typedef-decl name='Py_AuditHookFunction' type-id='type-id-791' filepath='./Include/cpython/sysmodule.h' line='10' column='1' id='type-id-234'/> - <class-decl name='PyTupleObject' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-792' visibility='default' filepath='./Include/cpython/tupleobject.h' line='5' column='1' id='type-id-793'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/cpython/tupleobject.h' line='6' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ob_item' type-id='type-id-353' visibility='default' filepath='./Include/cpython/tupleobject.h' line='10' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyTupleObject' type-id='type-id-793' filepath='./Include/cpython/tupleobject.h' line='11' column='1' id='type-id-792'/> - <class-decl name='PyASCIIObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-794' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='52' column='1' id='type-id-795'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='length' type-id='type-id-14' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='hash' type-id='type-id-305' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='state' type-id='type-id-796' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='146' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='100' column='1' id='type-id-796'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='interned' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2'> - <var-decl name='kind' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='133' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5'> - <var-decl name='compact' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6'> - <var-decl name='ascii' type-id='type-id-95' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='142' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyASCIIObject' type-id='type-id-795' filepath='./Include/cpython/unicodeobject.h' line='147' column='1' id='type-id-794'/> - <class-decl name='PyCompactUnicodeObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-797' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='152' column='1' id='type-id-798'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_base' type-id='type-id-794' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='utf8_length' type-id='type-id-14' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='utf8' type-id='type-id-15' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='156' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyCompactUnicodeObject' type-id='type-id-798' filepath='./Include/cpython/unicodeobject.h' line='157' column='1' id='type-id-797'/> - <class-decl name='ast_state' size-in-bits='15616' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='13' column='1' id='type-id-799'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='recursion_depth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='recursion_limit' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='AST_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='Add_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='Add_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='19' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='And_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='And_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='AnnAssign_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='Assert_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='Assign_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='AsyncFor_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='AsyncFunctionDef_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='AsyncWith_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='Attribute_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='AugAssign_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='Await_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='BinOp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='BitAnd_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='BitAnd_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='BitOr_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='BitOr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='BitXor_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='BitXor_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='BoolOp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='Break_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='Call_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='ClassDef_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='Compare_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='Constant_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='Continue_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='Del_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='Del_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='Delete_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='DictComp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='Dict_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='Div_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2304'> - <var-decl name='Div_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='Eq_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='Eq_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='ExceptHandler_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2560'> - <var-decl name='Expr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='Expression_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='FloorDiv_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='FloorDiv_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='For_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='FormattedValue_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='FunctionDef_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3008'> - <var-decl name='FunctionType_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='GeneratorExp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='Global_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='GtE_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3264'> - <var-decl name='GtE_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='Gt_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3392'> - <var-decl name='Gt_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3456'> - <var-decl name='IfExp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3520'> - <var-decl name='If_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3584'> - <var-decl name='ImportFrom_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3648'> - <var-decl name='Import_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3712'> - <var-decl name='In_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3776'> - <var-decl name='In_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3840'> - <var-decl name='Interactive_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3904'> - <var-decl name='Invert_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='Invert_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4032'> - <var-decl name='IsNot_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='IsNot_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4160'> - <var-decl name='Is_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4224'> - <var-decl name='Is_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4288'> - <var-decl name='JoinedStr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4352'> - <var-decl name='LShift_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4416'> - <var-decl name='LShift_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4480'> - <var-decl name='Lambda_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4544'> - <var-decl name='ListComp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4608'> - <var-decl name='List_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4672'> - <var-decl name='Load_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4736'> - <var-decl name='Load_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4800'> - <var-decl name='LtE_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4864'> - <var-decl name='LtE_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4928'> - <var-decl name='Lt_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4992'> - <var-decl name='Lt_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5056'> - <var-decl name='MatMult_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='94' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='MatMult_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5184'> - <var-decl name='MatchAs_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5248'> - <var-decl name='MatchClass_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5312'> - <var-decl name='MatchMapping_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5376'> - <var-decl name='MatchOr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5440'> - <var-decl name='MatchSequence_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5504'> - <var-decl name='MatchSingleton_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='MatchStar_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5632'> - <var-decl name='MatchValue_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='103' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5696'> - <var-decl name='Match_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5760'> - <var-decl name='Mod_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='105' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5824'> - <var-decl name='Mod_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5888'> - <var-decl name='Module_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5952'> - <var-decl name='Mult_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='108' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6016'> - <var-decl name='Mult_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='109' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6080'> - <var-decl name='Name_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6144'> - <var-decl name='NamedExpr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6208'> - <var-decl name='Nonlocal_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6272'> - <var-decl name='NotEq_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='113' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6336'> - <var-decl name='NotEq_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6400'> - <var-decl name='NotIn_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6464'> - <var-decl name='NotIn_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='116' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6528'> - <var-decl name='Not_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6592'> - <var-decl name='Not_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='118' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6656'> - <var-decl name='Or_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='119' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6720'> - <var-decl name='Or_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6784'> - <var-decl name='ParamSpec_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6848'> - <var-decl name='Pass_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6912'> - <var-decl name='Pow_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6976'> - <var-decl name='Pow_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='124' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7040'> - <var-decl name='RShift_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='125' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7104'> - <var-decl name='RShift_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='126' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7168'> - <var-decl name='Raise_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7232'> - <var-decl name='Return_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='128' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7296'> - <var-decl name='SetComp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7360'> - <var-decl name='Set_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7424'> - <var-decl name='Slice_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='131' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7488'> - <var-decl name='Starred_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7552'> - <var-decl name='Store_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='133' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7616'> - <var-decl name='Store_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='134' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7680'> - <var-decl name='Sub_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='135' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7744'> - <var-decl name='Sub_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7808'> - <var-decl name='Subscript_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='137' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7872'> - <var-decl name='TryStar_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7936'> - <var-decl name='Try_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8000'> - <var-decl name='Tuple_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='140' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8064'> - <var-decl name='TypeAlias_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8128'> - <var-decl name='TypeIgnore_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8192'> - <var-decl name='TypeVarTuple_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='143' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8256'> - <var-decl name='TypeVar_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='144' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8320'> - <var-decl name='UAdd_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8384'> - <var-decl name='UAdd_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='146' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8448'> - <var-decl name='USub_singleton' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8512'> - <var-decl name='USub_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8576'> - <var-decl name='UnaryOp_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8640'> - <var-decl name='While_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8704'> - <var-decl name='With_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8768'> - <var-decl name='YieldFrom_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8832'> - <var-decl name='Yield_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8896'> - <var-decl name='__dict__' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8960'> - <var-decl name='__doc__' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9024'> - <var-decl name='__match_args__' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9088'> - <var-decl name='__module__' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9152'> - <var-decl name='_attributes' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9216'> - <var-decl name='_fields' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9280'> - <var-decl name='alias_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9344'> - <var-decl name='annotation' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9408'> - <var-decl name='arg' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9472'> - <var-decl name='arg_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9536'> - <var-decl name='args' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9600'> - <var-decl name='argtypes' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9664'> - <var-decl name='arguments_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9728'> - <var-decl name='asname' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9792'> - <var-decl name='ast' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='168' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9856'> - <var-decl name='attr' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9920'> - <var-decl name='bases' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='170' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9984'> - <var-decl name='body' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10048'> - <var-decl name='boolop_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='172' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10112'> - <var-decl name='bound' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='173' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10176'> - <var-decl name='cases' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10240'> - <var-decl name='cause' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10304'> - <var-decl name='cls' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10368'> - <var-decl name='cmpop_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='177' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10432'> - <var-decl name='col_offset' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10496'> - <var-decl name='comparators' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='179' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10560'> - <var-decl name='comprehension_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10624'> - <var-decl name='context_expr' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10688'> - <var-decl name='conversion' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='182' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10752'> - <var-decl name='ctx' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='183' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10816'> - <var-decl name='decorator_list' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='184' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10880'> - <var-decl name='defaults' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10944'> - <var-decl name='elt' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='186' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11008'> - <var-decl name='elts' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='187' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11072'> - <var-decl name='end_col_offset' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='188' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11136'> - <var-decl name='end_lineno' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='189' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11200'> - <var-decl name='exc' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='190' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11264'> - <var-decl name='excepthandler_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='191' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11328'> - <var-decl name='expr_context_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='192' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11392'> - <var-decl name='expr_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='193' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11456'> - <var-decl name='finalbody' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='194' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11520'> - <var-decl name='format_spec' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='195' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11584'> - <var-decl name='func' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='196' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11648'> - <var-decl name='generators' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='197' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11712'> - <var-decl name='guard' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='198' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11776'> - <var-decl name='handlers' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='199' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11840'> - <var-decl name='id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='200' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11904'> - <var-decl name='ifs' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='201' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11968'> - <var-decl name='is_async' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='202' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12032'> - <var-decl name='items' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='203' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12096'> - <var-decl name='iter' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='204' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12160'> - <var-decl name='key' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='205' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12224'> - <var-decl name='keys' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='206' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12288'> - <var-decl name='keyword_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='207' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12352'> - <var-decl name='keywords' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='208' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12416'> - <var-decl name='kind' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='209' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12480'> - <var-decl name='kw_defaults' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='210' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12544'> - <var-decl name='kwarg' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='211' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12608'> - <var-decl name='kwd_attrs' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='212' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12672'> - <var-decl name='kwd_patterns' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='213' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12736'> - <var-decl name='kwonlyargs' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='214' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12800'> - <var-decl name='left' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='215' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12864'> - <var-decl name='level' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='216' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12928'> - <var-decl name='lineno' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='217' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12992'> - <var-decl name='lower' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='218' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13056'> - <var-decl name='match_case_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='219' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13120'> - <var-decl name='mod_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='220' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13184'> - <var-decl name='module' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='221' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13248'> - <var-decl name='msg' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='222' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13312'> - <var-decl name='name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='223' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13376'> - <var-decl name='names' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='224' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13440'> - <var-decl name='op' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='225' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13504'> - <var-decl name='operand' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='226' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13568'> - <var-decl name='operator_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='227' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13632'> - <var-decl name='ops' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='228' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13696'> - <var-decl name='optional_vars' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='229' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13760'> - <var-decl name='orelse' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='230' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13824'> - <var-decl name='pattern' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='231' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13888'> - <var-decl name='pattern_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='232' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13952'> - <var-decl name='patterns' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='233' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14016'> - <var-decl name='posonlyargs' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='234' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14080'> - <var-decl name='rest' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='235' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14144'> - <var-decl name='returns' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='236' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14208'> - <var-decl name='right' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='237' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14272'> - <var-decl name='simple' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='238' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14336'> - <var-decl name='slice' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='239' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14400'> - <var-decl name='step' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='240' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14464'> - <var-decl name='stmt_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='241' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14528'> - <var-decl name='subject' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='242' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14592'> - <var-decl name='tag' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='243' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14656'> - <var-decl name='target' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='244' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14720'> - <var-decl name='targets' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='245' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14784'> - <var-decl name='test' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='246' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14848'> - <var-decl name='type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='247' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14912'> - <var-decl name='type_comment' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='248' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14976'> - <var-decl name='type_ignore_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='249' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15040'> - <var-decl name='type_ignores' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='250' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15104'> - <var-decl name='type_param_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='251' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15168'> - <var-decl name='type_params' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='252' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15232'> - <var-decl name='unaryop_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='253' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15296'> - <var-decl name='upper' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='254' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15360'> - <var-decl name='value' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='255' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15424'> - <var-decl name='values' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='256' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15488'> - <var-decl name='vararg' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='257' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15552'> - <var-decl name='withitem_type' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='258' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='atexit_callbackfunc' type-id='type-id-227' filepath='./Include/internal/pycore_atexit.h' line='15' column='1' id='type-id-613'/> - <class-decl name='_atexit_runtime_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='17' column='1' id='type-id-800'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='callbacks' type-id='type-id-614' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='ncallbacks' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='21' column='1'/> - </data-member> - </class-decl> - <class-decl name='atexit_callback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='29' column='1' id='type-id-802'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='data' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='next' type-id='type-id-803' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='32' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='atexit_callback' type-id='type-id-802' filepath='./Include/internal/pycore_atexit.h' line='33' column='1' id='type-id-804'/> - <class-decl name='atexit_py_callback' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-805' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='35' column='1' id='type-id-806'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kwargs' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='38' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='atexit_py_callback' type-id='type-id-806' filepath='./Include/internal/pycore_atexit.h' line='39' column='1' id='type-id-805'/> - <class-decl name='atexit_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='41' column='1' id='type-id-807'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ll_callbacks' type-id='type-id-803' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='last_ll_callback' type-id='type-id-803' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='callbacks' type-id='type-id-808' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ncallbacks' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='callback_len' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='50' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_atomic_address' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atomic.h' line='45' column='1' id='type-id-809'/> - <typedef-decl name='_Py_atomic_address' type-id='type-id-809' filepath='./Include/internal/pycore_atomic.h' line='47' column='1' id='type-id-810'/> - <class-decl name='_Py_atomic_int' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atomic.h' line='49' column='1' id='type-id-811'/> - <typedef-decl name='_Py_atomic_int' type-id='type-id-811' filepath='./Include/internal/pycore_atomic.h' line='51' column='1' id='type-id-812'/> - <class-decl name='_pending_calls' size-in-bits='4352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='16' column='1' id='type-id-813'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='busy' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lock' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='calls_to_do' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='async_exc' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='calls' type-id='type-id-602' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4288'> - <var-decl name='first' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4320'> - <var-decl name='last' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='31' column='1'/> - </data-member> - </class-decl> - <class-decl name='_pending_call' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='26' column='1' id='type-id-601'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-814' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='arg' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='28' column='1'/> - </data-member> - </class-decl> - <enum-decl name='perf_status_t' naming-typedef-id='type-id-815' filepath='./Include/internal/pycore_ceval_state.h' line='34' column='1' id='type-id-816'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PERF_STATUS_FAILED' value='-1'/> - <enumerator name='PERF_STATUS_NO_INIT' value='0'/> - <enumerator name='PERF_STATUS_OK' value='1'/> - </enum-decl> - <typedef-decl name='perf_status_t' type-id='type-id-816' filepath='./Include/internal/pycore_ceval_state.h' line='38' column='1' id='type-id-815'/> - <class-decl name='trampoline_api_st' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='44' column='1' id='type-id-817'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='init_state' type-id='type-id-818' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='write_state' type-id='type-id-819' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free_state' type-id='type-id-814' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='state' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='49' column='1'/> - </data-member> - </class-decl> - <class-decl name='_ceval_runtime_state' size-in-bits='4928' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='53' column='1' id='type-id-820'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='perf' type-id='type-id-821' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='signals_pending' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='pending_mainthread' type-id='type-id-813' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='71' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__7' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='54' column='1' id='type-id-821'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='status' type-id='type-id-815' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='extra_code_index' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='code_arena' type-id='type-id-822' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='trampoline_api' type-id='type-id-817' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='map_file' type-id='type-id-229' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='60' column='1'/> - </data-member> - </class-decl> - <class-decl name='_ceval_state' size-in-bits='4608' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='85' column='1' id='type-id-823'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='eval_breaker' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='gil_drop_request' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='recursion_limit' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='gil' type-id='type-id-824' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='own_gil' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='gc_scheduled' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pending' type-id='type-id-813' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='96' column='1'/> - </data-member> - </class-decl> - <class-decl name='callable_cache' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='105' column='1' id='type-id-825'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='isinstance' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='len' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='list_append' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='108' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='object__getattribute__' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_code.h' line='109' column='1'/> - </data-member> - </class-decl> - <class-decl name='_PyContextTokenMissing' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-826' visibility='default' filepath='./Include/internal/pycore_context.h' line='21' column='1' id='type-id-827'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_context.h' line='22' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyContextTokenMissing' type-id='type-id-827' filepath='./Include/internal/pycore_context.h' line='23' column='1' id='type-id-826'/> - <class-decl name='_Py_context_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_context.h' line='34' column='1' id='type-id-828'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='freelist' type-id='type-id-829' visibility='default' filepath='./Include/internal/pycore_context.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_context.h' line='38' column='1'/> - </data-member> - </class-decl> - <class-decl name='_pycontextobject' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_context.h' line='42' column='1' id='type-id-725'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_context.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ctx_prev' type-id='type-id-829' visibility='default' filepath='./Include/internal/pycore_context.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ctx_vars' type-id='type-id-830' visibility='default' filepath='./Include/internal/pycore_context.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ctx_weakreflist' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_context.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ctx_entered' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_context.h' line='47' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_dict_state' size-in-bits='10944' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='23' column='1' id='type-id-831'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='global_version' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='next_keys_version' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free_list' type-id='type-id-578' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5248'> - <var-decl name='keys_free_list' type-id='type-id-577' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10368'> - <var-decl name='numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10400'> - <var-decl name='keys_numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10432'> - <var-decl name='watchers' type-id='type-id-579' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='38' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='ULong' type-id='type-id-352' filepath='./Include/internal/pycore_dtoa.h' line='16' column='1' id='type-id-591'/> - <class-decl name='Bigint' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='19' column='1' id='type-id-832'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-570' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='k' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='maxwds' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='sign' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='wds' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='x' type-id='type-id-592' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='22' column='1'/> - </data-member> - </class-decl> - <class-decl name='_dtoa_state' size-in-bits='19072' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='44' column='1' id='type-id-833'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='p5s' type-id='type-id-570' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='freelist' type-id='type-id-571' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='preallocated' type-id='type-id-625' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='19008'> - <var-decl name='preallocated_next' type-id='type-id-182' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='50' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_exc_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='22' column='1' id='type-id-834'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='errnomap' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='memerrors_freelist' type-id='type-id-835' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='memerrors_numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='PyExc_ExceptionGroup' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='28' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_sighandler_t' type-id='type-id-836' filepath='./Include/internal/pycore_faulthandler.h' line='30' column='1' id='type-id-837'/> - <class-decl name='faulthandler_user_signal' size-in-bits='1536' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='37' column='1' id='type-id-838'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='enabled' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='file' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fd' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='all_threads' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='chain' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='previous' type-id='type-id-837' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='interp' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='44' column='1'/> - </data-member> - </class-decl> - <class-decl name='_faulthandler_runtime_state' size-in-bits='1344' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='49' column='1' id='type-id-839'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fatal_error' type-id='type-id-840' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='thread' type-id='type-id-841' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='user_signals' type-id='type-id-842' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='stack' type-id='type-id-38' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='old_stack' type-id='type-id-38' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='84' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__8' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='50' column='1' id='type-id-840'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='enabled' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='file' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='fd' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='all_threads' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='interp' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='55' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__9' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='61' column='1' id='type-id-841'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='file' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='fd' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='timeout_us' type-id='type-id-378' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='repeat' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='interp' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='exit' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='header' type-id='type-id-15' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='header_len' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='cancel_event' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='running' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='75' column='1'/> - </data-member> - </class-decl> - <class-decl name='_fileutils_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='14' column='1' id='type-id-843'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='force_ascii' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='15' column='1'/> - </data-member> - </class-decl> - <enum-decl name='_Py_error_handler' naming-typedef-id='type-id-442' filepath='./Include/internal/pycore_fileutils.h' line='18' column='1' id='type-id-844'> - <underlying-type type-id='type-id-24'/> - <enumerator name='_Py_ERROR_UNKNOWN' value='0'/> - <enumerator name='_Py_ERROR_STRICT' value='1'/> - <enumerator name='_Py_ERROR_SURROGATEESCAPE' value='2'/> - <enumerator name='_Py_ERROR_REPLACE' value='3'/> - <enumerator name='_Py_ERROR_IGNORE' value='4'/> - <enumerator name='_Py_ERROR_BACKSLASHREPLACE' value='5'/> - <enumerator name='_Py_ERROR_SURROGATEPASS' value='6'/> - <enumerator name='_Py_ERROR_XMLCHARREFREPLACE' value='7'/> - <enumerator name='_Py_ERROR_OTHER' value='8'/> - </enum-decl> - <typedef-decl name='_Py_error_handler' type-id='type-id-844' filepath='./Include/internal/pycore_fileutils.h' line='28' column='1' id='type-id-442'/> - <enum-decl name='_py_float_format_type' filepath='./Include/internal/pycore_floatobject.h' line='22' column='1' id='type-id-845'> - <underlying-type type-id='type-id-24'/> - <enumerator name='_py_float_format_unknown' value='0'/> - <enumerator name='_py_float_format_ieee_big_endian' value='1'/> - <enumerator name='_py_float_format_ieee_little_endian' value='2'/> - </enum-decl> - <class-decl name='_Py_float_runtime_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='28' column='1' id='type-id-846'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='float_format' type-id='type-id-845' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='double_format' type-id='type-id-845' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='30' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_float_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='43' column='1' id='type-id-847'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='free_list' type-id='type-id-848' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='49' column='1'/> - </data-member> - </class-decl> - <class-decl name='_frame' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='16' column='1' id='type-id-849'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_frame.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_back' type-id='type-id-365' visibility='default' filepath='./Include/internal/pycore_frame.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_frame' type-id='type-id-375' visibility='default' filepath='./Include/internal/pycore_frame.h' line='19' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='f_trace' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='f_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='f_trace_lines' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_frame.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='360'> - <var-decl name='f_trace_opcodes' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_frame.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='368'> - <var-decl name='f_fast_as_locals' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_f_frame_data' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_frame.h' line='26' column='1'/> - </data-member> - </class-decl> - <class-decl name='_PyInterpreterFrame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='49' column='1' id='type-id-371'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='f_code' type-id='type-id-328' visibility='default' filepath='./Include/internal/pycore_frame.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='previous' type-id='type-id-375' visibility='default' filepath='./Include/internal/pycore_frame.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_funcobj' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_frame.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_globals' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_frame.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='f_builtins' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_frame.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='f_locals' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_frame.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='frame_obj' type-id='type-id-365' visibility='default' filepath='./Include/internal/pycore_frame.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='prev_instr' type-id='type-id-850' visibility='default' filepath='./Include/internal/pycore_frame.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='stacktop' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_frame.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='544'> - <var-decl name='return_offset' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_frame.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='560'> - <var-decl name='owner' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_frame.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='localsplus' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_frame.h' line='72' column='1'/> - </data-member> - </class-decl> - <class-decl name='_py_func_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_function.h' line='13' column='1' id='type-id-851'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_function.h' line='14' column='1'/> - </data-member> - </class-decl> - <class-decl name='PyGC_Head' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-852' visibility='default' filepath='./Include/internal/pycore_gc.h' line='12' column='1' id='type-id-853'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_gc_next' type-id='type-id-749' visibility='default' filepath='./Include/internal/pycore_gc.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_gc_prev' type-id='type-id-749' visibility='default' filepath='./Include/internal/pycore_gc.h' line='19' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyGC_Head' type-id='type-id-853' filepath='./Include/internal/pycore_gc.h' line='20' column='1' id='type-id-852'/> - <class-decl name='gc_generation' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='140' column='1' id='type-id-629'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='head' type-id='type-id-852' visibility='default' filepath='./Include/internal/pycore_gc.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='threshold' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='count' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='143' column='1'/> - </data-member> - </class-decl> - <class-decl name='gc_generation_stats' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='148' column='1' id='type-id-632'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='collections' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_gc.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='collected' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_gc.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='uncollectable' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_gc.h' line='154' column='1'/> - </data-member> - </class-decl> - <class-decl name='_gc_runtime_state' size-in-bits='1920' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='157' column='1' id='type-id-854'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='trash_delete_later' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_gc.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='trash_delete_nesting' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='enabled' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='debug' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='generations' type-id='type-id-630' visibility='default' filepath='./Include/internal/pycore_gc.h' line='168' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='generation0' type-id='type-id-855' visibility='default' filepath='./Include/internal/pycore_gc.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='permanent_generation' type-id='type-id-629' visibility='default' filepath='./Include/internal/pycore_gc.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='generation_stats' type-id='type-id-633' visibility='default' filepath='./Include/internal/pycore_gc.h' line='172' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='collecting' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_gc.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='garbage' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_gc.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='callbacks' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_gc.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='long_lived_total' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_gc.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='long_lived_pending' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_gc.h' line='189' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_async_gen_state' size-in-bits='10368' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='31' column='1' id='type-id-856'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value_freelist' type-id='type-id-594' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='value_numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5184'> - <var-decl name='asend_freelist' type-id='type-id-574' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10304'> - <var-decl name='asend_numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='41' column='1'/> - </data-member> - </class-decl> - <class-decl name='_gil_runtime_state' size-in-bits='1664' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gil.h' line='23' column='1' id='type-id-857'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='interval' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_gil.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='last_holder' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_gil.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='locked' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_gil.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='switch_number' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_gil.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='cond' type-id='type-id-858' visibility='default' filepath='./Include/internal/pycore_gil.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='mutex' type-id='type-id-859' visibility='default' filepath='./Include/internal/pycore_gil.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='switch_cond' type-id='type-id-858' visibility='default' filepath='./Include/internal/pycore_gil.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='switch_mutex' type-id='type-id-859' visibility='default' filepath='./Include/internal/pycore_gil.h' line='43' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_static_objects' size-in-bits='586048' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='31' column='1' id='type-id-860'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='singletons' type-id='type-id-861' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='54' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__20' size-in-bits='586048' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='32' column='1' id='type-id-861'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='small_ints' type-id='type-id-582' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='67072'> - <var-decl name='bytes_empty' type-id='type-id-700' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='67392'> - <var-decl name='bytes_characters' type-id='type-id-600' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='165696'> - <var-decl name='strings' type-id='type-id-862' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='585088'> - <var-decl name='_tuple_empty_gc_not_used' type-id='type-id-852' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='585216'> - <var-decl name='tuple_empty' type-id='type-id-792' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='585472'> - <var-decl name='_hamt_bitmap_node_empty_gc_not_used' type-id='type-id-852' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='585600'> - <var-decl name='hamt_bitmap_node_empty' type-id='type-id-863' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='585920'> - <var-decl name='context_token_missing' type-id='type-id-826' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='53' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__21' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='41' column='1' id='type-id-599'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob' type-id='type-id-700' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='eos' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='43' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_interp_cached_objects' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='60' column='1' id='type-id-864'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='interned_strings' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='str_replace_inf' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='objreduce' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='type_slots_pname' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='type_slots_ptrs' type-id='type-id-641' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='generic_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='typevar_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='typevartuple_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='paramspec_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='paramspecargs_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='paramspeckwargs_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='77' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_interp_static_objects' size-in-bits='1088' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='85' column='1' id='type-id-865'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='singletons' type-id='type-id-866' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='92' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__748' size-in-bits='1088' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='86' column='1' id='type-id-866'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_not_used' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_hamt_empty_gc_not_used' type-id='type-id-852' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='hamt_empty' type-id='type-id-867' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='last_resort_memory_error' type-id='type-id-758' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='91' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_global_strings' size-in-bits='419392' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='29' column='1' id='type-id-862'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='literals' type-id='type-id-868' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11008'> - <var-decl name='identifiers' type-id='type-id-869' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='751' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='304704'> - <var-decl name='ascii' type-id='type-id-596' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='755' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='353856'> - <var-decl name='latin1' type-id='type-id-598' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='759' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__22' size-in-bits='11008' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='30' column='1' id='type-id-868'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_py_anon_dictcomp' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_py_anon_genexpr' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_py_anon_lambda' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_py_anon_listcomp' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='_py_anon_module' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='_py_anon_setcomp' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='_py_anon_string' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='_py_anon_unknown' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3584'> - <var-decl name='_py_close_br' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='_py_dbl_close_br' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4352'> - <var-decl name='_py_dbl_open_br' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4736'> - <var-decl name='_py_dbl_percent' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='_py_defaults' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='_py_dot' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5952'> - <var-decl name='_py_dot_locals' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6400'> - <var-decl name='_py_empty' type-id='type-id-874' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6784'> - <var-decl name='_py_generic_base' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7232'> - <var-decl name='_py_json_decoder' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7680'> - <var-decl name='_py_kwdefaults' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8128'> - <var-decl name='_py_list_err' type-id='type-id-878' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8640'> - <var-decl name='_py_newline' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9024'> - <var-decl name='_py_open_br' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9408'> - <var-decl name='_py_percent' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9792'> - <var-decl name='_py_shim_name' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10176'> - <var-decl name='_py_type_params' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10624'> - <var-decl name='_py_utf_8' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__23' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1' id='type-id-870'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-651' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1' id='type-id-871'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-650' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__26' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1' id='type-id-872'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-694' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__32' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1' id='type-id-595'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-680' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__33' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1' id='type-id-873'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-686' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__39' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1' id='type-id-874'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-667' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__40' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1' id='type-id-875'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-657' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__41' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1' id='type-id-876'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-655' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__42' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1' id='type-id-877'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-653' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__43' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1' id='type-id-878'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-673' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__47' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1' id='type-id-879'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-691' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='54' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__49' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1' id='type-id-880'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-690' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__50' size-in-bits='293696' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1' id='type-id-869'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_py_CANCELLED' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_py_FINISHED' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_py_False' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_py_JSONDecodeError' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='_py_PENDING' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='_py_Py_Repr' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='_py_TextIOWrapper' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='_py_True' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3328'> - <var-decl name='_py_WarningMessage' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3776'> - <var-decl name='_py__' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4160'> - <var-decl name='_py__WindowsConsoleIO' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4672'> - <var-decl name='_py___IOBase_closed' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='_py___abc_tpflags__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5568'> - <var-decl name='_py___abs__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5952'> - <var-decl name='_py___abstractmethods__' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6464'> - <var-decl name='_py___add__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='6848'> - <var-decl name='_py___aenter__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7296'> - <var-decl name='_py___aexit__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7744'> - <var-decl name='_py___aiter__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8192'> - <var-decl name='_py___all__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8576'> - <var-decl name='_py___and__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8960'> - <var-decl name='_py___anext__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9408'> - <var-decl name='_py___annotations__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9856'> - <var-decl name='_py___args__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10304'> - <var-decl name='_py___asyncio_running_event_loop__' type-id='type-id-887' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10880'> - <var-decl name='_py___await__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11328'> - <var-decl name='_py___bases__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='11776'> - <var-decl name='_py___bool__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12224'> - <var-decl name='_py___buffer__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12672'> - <var-decl name='_py___build_class__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13120'> - <var-decl name='_py___builtins__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13568'> - <var-decl name='_py___bytes__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14016'> - <var-decl name='_py___call__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14464'> - <var-decl name='_py___cantrace__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14912'> - <var-decl name='_py___class__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='94' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15360'> - <var-decl name='_py___class_getitem__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15872'> - <var-decl name='_py___classcell__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='16320'> - <var-decl name='_py___classdict__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='16768'> - <var-decl name='_py___classdictcell__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='17280'> - <var-decl name='_py___complex__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='17728'> - <var-decl name='_py___contains__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18176'> - <var-decl name='_py___copy__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18624'> - <var-decl name='_py___ctypes_from_outparam__' type-id='type-id-888' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='19200'> - <var-decl name='_py___del__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='19584'> - <var-decl name='_py___delattr__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20032'> - <var-decl name='_py___delete__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='105' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20480'> - <var-decl name='_py___delitem__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20928'> - <var-decl name='_py___dict__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21376'> - <var-decl name='_py___dictoffset__' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='108' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21824'> - <var-decl name='_py___dir__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='109' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22208'> - <var-decl name='_py___divmod__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22656'> - <var-decl name='_py___doc__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='23040'> - <var-decl name='_py___enter__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='23488'> - <var-decl name='_py___eq__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='113' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='23872'> - <var-decl name='_py___exit__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24320'> - <var-decl name='_py___file__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24768'> - <var-decl name='_py___float__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='116' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='25216'> - <var-decl name='_py___floordiv__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='25664'> - <var-decl name='_py___format__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='26112'> - <var-decl name='_py___fspath__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='119' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='26560'> - <var-decl name='_py___ge__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='26944'> - <var-decl name='_py___get__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='27328'> - <var-decl name='_py___getattr__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='27776'> - <var-decl name='_py___getattribute__' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='28288'> - <var-decl name='_py___getinitargs__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='124' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='28736'> - <var-decl name='_py___getitem__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='125' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='29184'> - <var-decl name='_py___getnewargs__' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='29632'> - <var-decl name='_py___getnewargs_ex__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='30144'> - <var-decl name='_py___getstate__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='128' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='30592'> - <var-decl name='_py___gt__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='30976'> - <var-decl name='_py___hash__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31424'> - <var-decl name='_py___iadd__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='131' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31872'> - <var-decl name='_py___iand__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32320'> - <var-decl name='_py___ifloordiv__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='133' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32768'> - <var-decl name='_py___ilshift__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='134' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33216'> - <var-decl name='_py___imatmul__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='135' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='33664'> - <var-decl name='_py___imod__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='34112'> - <var-decl name='_py___import__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='137' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='34560'> - <var-decl name='_py___imul__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='35008'> - <var-decl name='_py___index__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='35456'> - <var-decl name='_py___init__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='140' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='35904'> - <var-decl name='_py___init_subclass__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='36416'> - <var-decl name='_py___instancecheck__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='36928'> - <var-decl name='_py___int__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='37312'> - <var-decl name='_py___invert__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='144' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='37760'> - <var-decl name='_py___ior__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='145' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='38144'> - <var-decl name='_py___ipow__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='146' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='38592'> - <var-decl name='_py___irshift__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='39040'> - <var-decl name='_py___isabstractmethod__' type-id='type-id-890' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='39552'> - <var-decl name='_py___isub__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='40000'> - <var-decl name='_py___iter__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='40448'> - <var-decl name='_py___itruediv__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='40896'> - <var-decl name='_py___ixor__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='41344'> - <var-decl name='_py___le__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='41728'> - <var-decl name='_py___len__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='42112'> - <var-decl name='_py___length_hint__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='42560'> - <var-decl name='_py___lltrace__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='43008'> - <var-decl name='_py___loader__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='43456'> - <var-decl name='_py___lshift__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='43904'> - <var-decl name='_py___lt__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='44288'> - <var-decl name='_py___main__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='44736'> - <var-decl name='_py___matmul__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='45184'> - <var-decl name='_py___missing__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='162' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='45632'> - <var-decl name='_py___mod__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='46016'> - <var-decl name='_py___module__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='46464'> - <var-decl name='_py___mro_entries__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='46912'> - <var-decl name='_py___mul__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='47296'> - <var-decl name='_py___name__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='47744'> - <var-decl name='_py___ne__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='168' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48128'> - <var-decl name='_py___neg__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48512'> - <var-decl name='_py___new__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='170' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='48896'> - <var-decl name='_py___newobj__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='49344'> - <var-decl name='_py___newobj_ex__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='172' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='49792'> - <var-decl name='_py___next__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='173' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='50240'> - <var-decl name='_py___notes__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='50688'> - <var-decl name='_py___or__' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='51072'> - <var-decl name='_py___orig_class__' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='51520'> - <var-decl name='_py___origin__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='177' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='51968'> - <var-decl name='_py___package__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='52416'> - <var-decl name='_py___parameters__' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='179' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='52864'> - <var-decl name='_py___path__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='53312'> - <var-decl name='_py___pos__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='53696'> - <var-decl name='_py___pow__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='182' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='54080'> - <var-decl name='_py___prepare__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='183' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='54528'> - <var-decl name='_py___qualname__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='184' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='54976'> - <var-decl name='_py___radd__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='55424'> - <var-decl name='_py___rand__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='55872'> - <var-decl name='_py___rdivmod__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='187' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='56320'> - <var-decl name='_py___reduce__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='188' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='56768'> - <var-decl name='_py___reduce_ex__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='189' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='57216'> - <var-decl name='_py___release_buffer__' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='57728'> - <var-decl name='_py___repr__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='191' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='58176'> - <var-decl name='_py___reversed__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='192' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='58624'> - <var-decl name='_py___rfloordiv__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='193' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='59072'> - <var-decl name='_py___rlshift__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='59520'> - <var-decl name='_py___rmatmul__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='195' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='59968'> - <var-decl name='_py___rmod__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='196' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='60416'> - <var-decl name='_py___rmul__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='197' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='60864'> - <var-decl name='_py___ror__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='198' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='61248'> - <var-decl name='_py___round__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='199' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='61696'> - <var-decl name='_py___rpow__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='200' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='62144'> - <var-decl name='_py___rrshift__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='201' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='62592'> - <var-decl name='_py___rshift__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='202' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='63040'> - <var-decl name='_py___rsub__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='203' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='63488'> - <var-decl name='_py___rtruediv__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='204' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='63936'> - <var-decl name='_py___rxor__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='205' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64384'> - <var-decl name='_py___set__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='206' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64768'> - <var-decl name='_py___set_name__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='207' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='65216'> - <var-decl name='_py___setattr__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='208' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='65664'> - <var-decl name='_py___setitem__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='209' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='66112'> - <var-decl name='_py___setstate__' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='210' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='66560'> - <var-decl name='_py___sizeof__' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='67008'> - <var-decl name='_py___slotnames__' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='212' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='67456'> - <var-decl name='_py___slots__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='213' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='67904'> - <var-decl name='_py___spec__' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='214' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='68352'> - <var-decl name='_py___str__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='215' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='68736'> - <var-decl name='_py___sub__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='216' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='69120'> - <var-decl name='_py___subclasscheck__' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='217' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='69632'> - <var-decl name='_py___subclasshook__' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='218' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='70144'> - <var-decl name='_py___truediv__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='70592'> - <var-decl name='_py___trunc__' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='220' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='71040'> - <var-decl name='_py___type_params__' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='221' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='71488'> - <var-decl name='_py___typing_is_unpacked_typevartuple__' type-id='type-id-892' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='72128'> - <var-decl name='_py___typing_prepare_subst__' type-id='type-id-888' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='223' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='72704'> - <var-decl name='_py___typing_subst__' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='224' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='73216'> - <var-decl name='_py___typing_unpacked_tuple_args__' type-id='type-id-887' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='225' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='73792'> - <var-decl name='_py___warningregistry__' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='226' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='74304'> - <var-decl name='_py___weaklistoffset__' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='74816'> - <var-decl name='_py___weakref__' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='228' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='75264'> - <var-decl name='_py___xor__' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='229' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='75648'> - <var-decl name='_py__abc_impl' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='76096'> - <var-decl name='_py__abstract_' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='231' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='76544'> - <var-decl name='_py__active' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='232' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='76928'> - <var-decl name='_py__annotation' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='233' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='77376'> - <var-decl name='_py__anonymous_' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='234' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='77824'> - <var-decl name='_py__argtypes_' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='235' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='78272'> - <var-decl name='_py__as_parameter_' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='236' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='78720'> - <var-decl name='_py__asyncio_future_blocking' type-id='type-id-888' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='237' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='79296'> - <var-decl name='_py__blksize' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='238' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='79744'> - <var-decl name='_py__bootstrap' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='239' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80192'> - <var-decl name='_py__check_retval_' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='240' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80640'> - <var-decl name='_py__dealloc_warn' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='241' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='81088'> - <var-decl name='_py__feature_version' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='242' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='81600'> - <var-decl name='_py__fields_' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='243' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='82048'> - <var-decl name='_py__finalizing' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='244' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='82496'> - <var-decl name='_py__find_and_load' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='245' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='82944'> - <var-decl name='_py__fix_up_module' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='246' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='83392'> - <var-decl name='_py__flags_' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='247' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='83776'> - <var-decl name='_py__get_sourcefile' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='248' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='84224'> - <var-decl name='_py__handle_fromlist' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='249' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='84736'> - <var-decl name='_py__initializing' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='85184'> - <var-decl name='_py__io' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='85568'> - <var-decl name='_py__is_text_encoding' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='252' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='86080'> - <var-decl name='_py__length_' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='253' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='86528'> - <var-decl name='_py__limbo' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='254' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='86912'> - <var-decl name='_py__lock_unlock_module' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='255' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='87424'> - <var-decl name='_py__loop' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='256' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='87808'> - <var-decl name='_py__needs_com_addref_' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='257' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='88320'> - <var-decl name='_py__pack_' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='88704'> - <var-decl name='_py__restype_' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='259' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='89152'> - <var-decl name='_py__showwarnmsg' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='260' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='89600'> - <var-decl name='_py__shutdown' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='261' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='90048'> - <var-decl name='_py__slotnames' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='262' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='90496'> - <var-decl name='_py__strptime_datetime' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='263' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='91008'> - <var-decl name='_py__swappedbytes_' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='264' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='91456'> - <var-decl name='_py__type_' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='265' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='91840'> - <var-decl name='_py__uninitialized_submodules' type-id='type-id-894' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='92416'> - <var-decl name='_py__warn_unawaited_coroutine' type-id='type-id-894' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='92992'> - <var-decl name='_py__xoptions' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='268' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='93440'> - <var-decl name='_py_a' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='269' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='93824'> - <var-decl name='_py_abs_tol' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='270' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='94208'> - <var-decl name='_py_access' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='271' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='94592'> - <var-decl name='_py_add' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='272' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='94976'> - <var-decl name='_py_add_done_callback' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='273' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='95488'> - <var-decl name='_py_after_in_child' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='274' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='95936'> - <var-decl name='_py_after_in_parent' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='275' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96384'> - <var-decl name='_py_aggregate_class' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96832'> - <var-decl name='_py_alias' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='277' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='97216'> - <var-decl name='_py_append' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='278' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='97600'> - <var-decl name='_py_arg' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='279' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='97984'> - <var-decl name='_py_argdefs' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='280' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='98368'> - <var-decl name='_py_args' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='281' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='98752'> - <var-decl name='_py_arguments' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='282' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='99200'> - <var-decl name='_py_argv' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='283' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='99584'> - <var-decl name='_py_as_integer_ratio' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='284' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100096'> - <var-decl name='_py_ast' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='285' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100480'> - <var-decl name='_py_attribute' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='286' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='100928'> - <var-decl name='_py_authorizer_callback' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='287' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101440'> - <var-decl name='_py_autocommit' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='288' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='101888'> - <var-decl name='_py_b' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='289' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='102272'> - <var-decl name='_py_backtick' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='290' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='102720'> - <var-decl name='_py_base' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='291' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='103104'> - <var-decl name='_py_before' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='292' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='103488'> - <var-decl name='_py_big' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='293' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='103872'> - <var-decl name='_py_binary_form' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='294' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='104320'> - <var-decl name='_py_block' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='295' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='104704'> - <var-decl name='_py_bound' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='296' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='105088'> - <var-decl name='_py_buffer' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='297' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='105472'> - <var-decl name='_py_buffer_callback' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='298' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='105920'> - <var-decl name='_py_buffer_size' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='299' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='106368'> - <var-decl name='_py_buffering' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='300' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='106816'> - <var-decl name='_py_buffers' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='301' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='107200'> - <var-decl name='_py_bufsize' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='302' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='107584'> - <var-decl name='_py_builtins' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='303' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='108032'> - <var-decl name='_py_byteorder' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='304' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='108480'> - <var-decl name='_py_bytes' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='305' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='108864'> - <var-decl name='_py_bytes_per_sep' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='306' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109312'> - <var-decl name='_py_c' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='307' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='109696'> - <var-decl name='_py_c_call' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='308' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='110080'> - <var-decl name='_py_c_exception' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='309' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='110528'> - <var-decl name='_py_c_return' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='310' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='110976'> - <var-decl name='_py_cached_statements' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='311' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='111488'> - <var-decl name='_py_cadata' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='312' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='111872'> - <var-decl name='_py_cafile' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='112256'> - <var-decl name='_py_call' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='314' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='112640'> - <var-decl name='_py_call_exception_handler' type-id='type-id-895' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='113152'> - <var-decl name='_py_call_soon' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='316' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='113600'> - <var-decl name='_py_cancel' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='317' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='113984'> - <var-decl name='_py_capath' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='318' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='114368'> - <var-decl name='_py_category' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='319' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='114816'> - <var-decl name='_py_cb_type' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='320' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='115200'> - <var-decl name='_py_certfile' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='321' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='115648'> - <var-decl name='_py_check_same_thread' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='322' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='116160'> - <var-decl name='_py_clear' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='323' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='116544'> - <var-decl name='_py_close' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='324' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='116928'> - <var-decl name='_py_closed' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='325' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='117312'> - <var-decl name='_py_closefd' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='326' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='117696'> - <var-decl name='_py_closure' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='327' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='118080'> - <var-decl name='_py_co_argcount' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='328' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='118528'> - <var-decl name='_py_co_cellvars' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='329' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='118976'> - <var-decl name='_py_co_code' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='330' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='119360'> - <var-decl name='_py_co_consts' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='119808'> - <var-decl name='_py_co_exceptiontable' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='332' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='120320'> - <var-decl name='_py_co_filename' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='333' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='120768'> - <var-decl name='_py_co_firstlineno' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='334' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='121216'> - <var-decl name='_py_co_flags' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='335' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='121664'> - <var-decl name='_py_co_freevars' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='336' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='122112'> - <var-decl name='_py_co_kwonlyargcount' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='337' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='122624'> - <var-decl name='_py_co_linetable' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='338' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='123072'> - <var-decl name='_py_co_name' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='339' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='123456'> - <var-decl name='_py_co_names' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='340' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='123904'> - <var-decl name='_py_co_nlocals' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='341' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='124352'> - <var-decl name='_py_co_posonlyargcount' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='342' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='124864'> - <var-decl name='_py_co_qualname' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='343' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='125312'> - <var-decl name='_py_co_stacksize' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='344' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='125760'> - <var-decl name='_py_co_varnames' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='345' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='126208'> - <var-decl name='_py_code' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='346' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='126592'> - <var-decl name='_py_command' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='347' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='126976'> - <var-decl name='_py_comment_factory' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='348' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='127424'> - <var-decl name='_py_compile_mode' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='349' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='127872'> - <var-decl name='_py_consts' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='350' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128256'> - <var-decl name='_py_context' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='351' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128640'> - <var-decl name='_py_contravariant' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='352' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='129088'> - <var-decl name='_py_cookie' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='353' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='129472'> - <var-decl name='_py_copy' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='354' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='129856'> - <var-decl name='_py_copyreg' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='355' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='130240'> - <var-decl name='_py_coro' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='356' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='130624'> - <var-decl name='_py_count' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='357' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='131008'> - <var-decl name='_py_covariant' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='358' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='131456'> - <var-decl name='_py_cwd' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='359' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='131840'> - <var-decl name='_py_d' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='360' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='132224'> - <var-decl name='_py_data' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='361' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='132608'> - <var-decl name='_py_database' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='362' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='133056'> - <var-decl name='_py_decode' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='363' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='133440'> - <var-decl name='_py_decoder' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='364' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='133824'> - <var-decl name='_py_default' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='365' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='134208'> - <var-decl name='_py_defaultaction' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='366' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='134656'> - <var-decl name='_py_delete' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='367' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='135040'> - <var-decl name='_py_depth' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='368' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='135424'> - <var-decl name='_py_detect_types' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='369' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='135872'> - <var-decl name='_py_deterministic' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='370' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='136320'> - <var-decl name='_py_device' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='371' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='136704'> - <var-decl name='_py_dict' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='372' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='137088'> - <var-decl name='_py_dictcomp' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='373' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='137536'> - <var-decl name='_py_difference_update' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='374' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138048'> - <var-decl name='_py_digest' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='375' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138432'> - <var-decl name='_py_digest_size' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='376' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138880'> - <var-decl name='_py_digestmod' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='377' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='139328'> - <var-decl name='_py_dir_fd' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='378' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='139712'> - <var-decl name='_py_discard' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='379' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='140096'> - <var-decl name='_py_dispatch_table' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='380' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='140544'> - <var-decl name='_py_displayhook' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='381' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='140992'> - <var-decl name='_py_dklen' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='382' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='141376'> - <var-decl name='_py_doc' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='383' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='141760'> - <var-decl name='_py_dont_inherit' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='384' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='142208'> - <var-decl name='_py_dst' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='385' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='142592'> - <var-decl name='_py_dst_dir_fd' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='386' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='143040'> - <var-decl name='_py_duration' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='387' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='143488'> - <var-decl name='_py_e' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='388' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='143872'> - <var-decl name='_py_eager_start' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='389' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='144320'> - <var-decl name='_py_effective_ids' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='390' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='144768'> - <var-decl name='_py_element_factory' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='391' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='145216'> - <var-decl name='_py_encode' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='392' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='145600'> - <var-decl name='_py_encoding' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='393' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='146048'> - <var-decl name='_py_end' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='394' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='146432'> - <var-decl name='_py_end_lineno' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='395' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='146880'> - <var-decl name='_py_end_offset' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='396' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='147328'> - <var-decl name='_py_endpos' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='397' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='147712'> - <var-decl name='_py_entrypoint' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='398' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='148160'> - <var-decl name='_py_env' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='399' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='148544'> - <var-decl name='_py_errors' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='400' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='148928'> - <var-decl name='_py_event' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='401' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='149312'> - <var-decl name='_py_eventmask' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='402' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='149760'> - <var-decl name='_py_exc_type' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='403' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='150208'> - <var-decl name='_py_exc_value' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='404' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='150656'> - <var-decl name='_py_excepthook' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='405' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='151104'> - <var-decl name='_py_exception' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='406' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='151552'> - <var-decl name='_py_existing_file_name' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='407' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='152064'> - <var-decl name='_py_exp' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='408' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='152448'> - <var-decl name='_py_extend' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='409' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='152832'> - <var-decl name='_py_extra_tokens' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='410' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='153280'> - <var-decl name='_py_facility' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='411' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='153728'> - <var-decl name='_py_factory' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='412' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='154112'> - <var-decl name='_py_false' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='413' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='154496'> - <var-decl name='_py_family' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='414' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='154880'> - <var-decl name='_py_fanout' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='415' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='155264'> - <var-decl name='_py_fd' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='416' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='155648'> - <var-decl name='_py_fd2' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='417' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='156032'> - <var-decl name='_py_fdel' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='418' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='156416'> - <var-decl name='_py_fget' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='419' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='156800'> - <var-decl name='_py_file' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='420' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='157184'> - <var-decl name='_py_file_actions' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='421' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='157632'> - <var-decl name='_py_filename' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='422' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='158080'> - <var-decl name='_py_fileno' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='423' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='158464'> - <var-decl name='_py_filepath' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='424' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='158912'> - <var-decl name='_py_fillvalue' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='425' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='159360'> - <var-decl name='_py_filters' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='426' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='159744'> - <var-decl name='_py_final' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='427' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160128'> - <var-decl name='_py_find_class' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='428' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160576'> - <var-decl name='_py_fix_imports' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='429' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='161024'> - <var-decl name='_py_flags' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='430' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='161408'> - <var-decl name='_py_flush' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='431' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='161792'> - <var-decl name='_py_follow_symlinks' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='432' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='162240'> - <var-decl name='_py_format' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='433' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='162624'> - <var-decl name='_py_frequency' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='434' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='163072'> - <var-decl name='_py_from_param' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='435' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='163520'> - <var-decl name='_py_fromlist' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='436' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='163968'> - <var-decl name='_py_fromtimestamp' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='437' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='164416'> - <var-decl name='_py_fromutc' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='438' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='164800'> - <var-decl name='_py_fset' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='439' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='165184'> - <var-decl name='_py_func' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='440' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='165568'> - <var-decl name='_py_future' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='441' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='165952'> - <var-decl name='_py_generation' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='442' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='166400'> - <var-decl name='_py_genexpr' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='443' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='166784'> - <var-decl name='_py_get' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='444' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='167168'> - <var-decl name='_py_get_debug' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='445' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='167616'> - <var-decl name='_py_get_event_loop' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='446' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='168064'> - <var-decl name='_py_get_loop' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='447' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='168512'> - <var-decl name='_py_get_source' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='448' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='168960'> - <var-decl name='_py_getattr' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='449' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='169344'> - <var-decl name='_py_getstate' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='450' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='169792'> - <var-decl name='_py_gid' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='451' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='170176'> - <var-decl name='_py_globals' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='452' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='170560'> - <var-decl name='_py_groupindex' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='453' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='171008'> - <var-decl name='_py_groups' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='454' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='171392'> - <var-decl name='_py_handle' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='455' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='171776'> - <var-decl name='_py_hash_name' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='456' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='172224'> - <var-decl name='_py_header' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='457' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='172608'> - <var-decl name='_py_headers' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='458' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='172992'> - <var-decl name='_py_hi' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='459' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='173376'> - <var-decl name='_py_hook' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='460' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='173760'> - <var-decl name='_py_id' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='461' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='174144'> - <var-decl name='_py_ident' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='462' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='174528'> - <var-decl name='_py_ignore' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='463' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='174912'> - <var-decl name='_py_imag' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='464' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='175296'> - <var-decl name='_py_importlib' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='465' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='175744'> - <var-decl name='_py_in_fd' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='466' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='176128'> - <var-decl name='_py_incoming' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='467' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='176576'> - <var-decl name='_py_indexgroup' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='468' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='177024'> - <var-decl name='_py_inf' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='469' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='177408'> - <var-decl name='_py_infer_variance' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='470' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='177856'> - <var-decl name='_py_inheritable' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='471' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='178304'> - <var-decl name='_py_initial' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='472' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='178688'> - <var-decl name='_py_initial_bytes' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='473' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='179136'> - <var-decl name='_py_initial_value' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='474' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='179584'> - <var-decl name='_py_initval' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='475' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='179968'> - <var-decl name='_py_inner_size' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='476' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='180416'> - <var-decl name='_py_input' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='477' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='180800'> - <var-decl name='_py_insert_comments' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='478' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='181248'> - <var-decl name='_py_insert_pis' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='479' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='181696'> - <var-decl name='_py_instructions' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='480' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='182144'> - <var-decl name='_py_intern' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='481' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='182528'> - <var-decl name='_py_intersection' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='482' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='182976'> - <var-decl name='_py_is_running' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='483' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='183424'> - <var-decl name='_py_isatty' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='484' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='183808'> - <var-decl name='_py_isinstance' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='485' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='184256'> - <var-decl name='_py_isoformat' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='486' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='184704'> - <var-decl name='_py_isolation_level' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='487' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='185152'> - <var-decl name='_py_istext' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='488' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='185536'> - <var-decl name='_py_item' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='489' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='185920'> - <var-decl name='_py_items' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='490' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='186304'> - <var-decl name='_py_iter' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='491' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='186688'> - <var-decl name='_py_iterable' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='492' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='187136'> - <var-decl name='_py_iterations' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='493' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='187584'> - <var-decl name='_py_join' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='494' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='187968'> - <var-decl name='_py_jump' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='495' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='188352'> - <var-decl name='_py_keepends' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='496' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='188800'> - <var-decl name='_py_key' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='497' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='189184'> - <var-decl name='_py_keyfile' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='498' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='189568'> - <var-decl name='_py_keys' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='499' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='189952'> - <var-decl name='_py_kind' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='500' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='190336'> - <var-decl name='_py_kw' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='501' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='190720'> - <var-decl name='_py_kw1' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='502' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='191104'> - <var-decl name='_py_kw2' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='503' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='191488'> - <var-decl name='_py_lambda' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='504' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='191872'> - <var-decl name='_py_last' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='505' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192256'> - <var-decl name='_py_last_exc' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='506' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192704'> - <var-decl name='_py_last_node' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='507' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='193152'> - <var-decl name='_py_last_traceback' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='508' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='193600'> - <var-decl name='_py_last_type' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='509' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='194048'> - <var-decl name='_py_last_value' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='510' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='194496'> - <var-decl name='_py_latin1' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='511' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='194880'> - <var-decl name='_py_leaf_size' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='512' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='195328'> - <var-decl name='_py_len' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='513' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='195712'> - <var-decl name='_py_length' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='514' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='196096'> - <var-decl name='_py_level' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='515' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='196480'> - <var-decl name='_py_limit' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='516' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='196864'> - <var-decl name='_py_line' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='517' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='197248'> - <var-decl name='_py_line_buffering' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='518' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='197696'> - <var-decl name='_py_lineno' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='519' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='198080'> - <var-decl name='_py_listcomp' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='520' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='198528'> - <var-decl name='_py_little' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='521' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='198912'> - <var-decl name='_py_lo' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='522' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='199296'> - <var-decl name='_py_locale' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='523' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='199680'> - <var-decl name='_py_locals' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='524' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='200064'> - <var-decl name='_py_logoption' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='525' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='200512'> - <var-decl name='_py_loop' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='526' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='200896'> - <var-decl name='_py_mapping' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='527' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='201280'> - <var-decl name='_py_match' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='528' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='201664'> - <var-decl name='_py_max_length' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='529' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='202112'> - <var-decl name='_py_maxdigits' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='530' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='202560'> - <var-decl name='_py_maxevents' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='531' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='203008'> - <var-decl name='_py_maxmem' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='532' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='203392'> - <var-decl name='_py_maxsplit' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='533' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='203840'> - <var-decl name='_py_maxvalue' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='534' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='204288'> - <var-decl name='_py_memLevel' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='535' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='204736'> - <var-decl name='_py_memlimit' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='536' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='205184'> - <var-decl name='_py_message' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='537' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='205568'> - <var-decl name='_py_metaclass' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='538' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='206016'> - <var-decl name='_py_metadata' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='539' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='206464'> - <var-decl name='_py_method' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='540' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='206848'> - <var-decl name='_py_mod' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='541' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='207232'> - <var-decl name='_py_mode' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='542' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='207616'> - <var-decl name='_py_module' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='543' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='208000'> - <var-decl name='_py_module_globals' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='544' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='208448'> - <var-decl name='_py_modules' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='545' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='208832'> - <var-decl name='_py_mro' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='546' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='209216'> - <var-decl name='_py_msg' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='547' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='209600'> - <var-decl name='_py_mycmp' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='548' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='209984'> - <var-decl name='_py_n' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='549' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='210368'> - <var-decl name='_py_n_arg' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='550' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='210752'> - <var-decl name='_py_n_fields' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='551' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='211200'> - <var-decl name='_py_n_sequence_fields' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='552' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='211712'> - <var-decl name='_py_n_unnamed_fields' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='553' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='212224'> - <var-decl name='_py_name' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='554' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='212608'> - <var-decl name='_py_name_from' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='555' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='213056'> - <var-decl name='_py_namespace_separator' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='556' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='213568'> - <var-decl name='_py_namespaces' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='557' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='214016'> - <var-decl name='_py_narg' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='558' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='214400'> - <var-decl name='_py_ndigits' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='559' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='214784'> - <var-decl name='_py_new_file_name' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='560' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='215232'> - <var-decl name='_py_new_limit' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='561' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='215680'> - <var-decl name='_py_newline' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='562' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='216064'> - <var-decl name='_py_newlines' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='563' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='216512'> - <var-decl name='_py_next' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='564' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='216896'> - <var-decl name='_py_nlocals' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='565' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='217280'> - <var-decl name='_py_node_depth' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='566' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='217728'> - <var-decl name='_py_node_offset' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='567' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='218176'> - <var-decl name='_py_ns' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='568' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='218560'> - <var-decl name='_py_nstype' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='569' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='218944'> - <var-decl name='_py_nt' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='570' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='219328'> - <var-decl name='_py_null' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='571' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='219712'> - <var-decl name='_py_number' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='572' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='220096'> - <var-decl name='_py_obj' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='573' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='220480'> - <var-decl name='_py_object' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='574' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='220864'> - <var-decl name='_py_offset' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='575' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='221248'> - <var-decl name='_py_offset_dst' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='576' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='221696'> - <var-decl name='_py_offset_src' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='577' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='222144'> - <var-decl name='_py_on_type_read' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='578' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='222592'> - <var-decl name='_py_onceregistry' type-id='type-id-876' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='579' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='223040'> - <var-decl name='_py_only_keys' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='580' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='223488'> - <var-decl name='_py_oparg' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='581' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='223872'> - <var-decl name='_py_opcode' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='582' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224256'> - <var-decl name='_py_open' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='583' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224640'> - <var-decl name='_py_opener' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='584' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='225024'> - <var-decl name='_py_operation' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='585' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='225472'> - <var-decl name='_py_optimize' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='586' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='225920'> - <var-decl name='_py_options' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='587' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='226304'> - <var-decl name='_py_order' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='588' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='226688'> - <var-decl name='_py_origin' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='589' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='227072'> - <var-decl name='_py_out_fd' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='590' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='227456'> - <var-decl name='_py_outgoing' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='591' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='227904'> - <var-decl name='_py_overlapped' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='592' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='228352'> - <var-decl name='_py_owner' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='593' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='228736'> - <var-decl name='_py_p' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='594' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='229120'> - <var-decl name='_py_pages' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='595' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='229504'> - <var-decl name='_py_parent' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='596' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='229888'> - <var-decl name='_py_password' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='597' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='230336'> - <var-decl name='_py_path' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='598' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='230720'> - <var-decl name='_py_pattern' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='599' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='231104'> - <var-decl name='_py_peek' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='600' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='231488'> - <var-decl name='_py_persistent_id' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='601' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='231936'> - <var-decl name='_py_persistent_load' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='602' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='232384'> - <var-decl name='_py_person' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='603' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='232768'> - <var-decl name='_py_pi_factory' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='604' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='233216'> - <var-decl name='_py_pid' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='605' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='233600'> - <var-decl name='_py_policy' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='606' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='233984'> - <var-decl name='_py_pos' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='607' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='234368'> - <var-decl name='_py_pos1' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='608' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='234752'> - <var-decl name='_py_pos2' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='609' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='235136'> - <var-decl name='_py_posix' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='610' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='235520'> - <var-decl name='_py_print_file_and_line' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='611' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='236032'> - <var-decl name='_py_priority' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='612' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='236480'> - <var-decl name='_py_progress' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='613' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='236928'> - <var-decl name='_py_progress_handler' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='614' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='237440'> - <var-decl name='_py_progress_routine' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='615' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='237952'> - <var-decl name='_py_proto' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='616' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='238336'> - <var-decl name='_py_protocol' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='617' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='238784'> - <var-decl name='_py_ps1' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='618' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='239168'> - <var-decl name='_py_ps2' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='619' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='239552'> - <var-decl name='_py_query' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='620' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='239936'> - <var-decl name='_py_quotetabs' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='621' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='240384'> - <var-decl name='_py_r' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='622' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='240768'> - <var-decl name='_py_raw' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='623' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='241152'> - <var-decl name='_py_read' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='624' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='241536'> - <var-decl name='_py_read1' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='625' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='241920'> - <var-decl name='_py_readable' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='626' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='242368'> - <var-decl name='_py_readall' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='627' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='242752'> - <var-decl name='_py_readinto' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='628' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='243200'> - <var-decl name='_py_readinto1' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='629' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='243648'> - <var-decl name='_py_readline' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='630' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='244096'> - <var-decl name='_py_readonly' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='631' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='244544'> - <var-decl name='_py_real' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='632' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='244928'> - <var-decl name='_py_reducer_override' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='633' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='245440'> - <var-decl name='_py_registry' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='634' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='245888'> - <var-decl name='_py_rel_tol' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='635' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='246272'> - <var-decl name='_py_release' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='636' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='246656'> - <var-decl name='_py_reload' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='637' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='247040'> - <var-decl name='_py_repl' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='638' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='247424'> - <var-decl name='_py_replace' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='639' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='247808'> - <var-decl name='_py_reserved' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='640' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='248256'> - <var-decl name='_py_reset' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='641' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='248640'> - <var-decl name='_py_resetids' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='642' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='249088'> - <var-decl name='_py_return' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='643' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='249472'> - <var-decl name='_py_reverse' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='644' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='249856'> - <var-decl name='_py_reversed' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='645' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='250304'> - <var-decl name='_py_s' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='646' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='250688'> - <var-decl name='_py_salt' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='647' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='251072'> - <var-decl name='_py_sched_priority' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='648' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='251520'> - <var-decl name='_py_scheduler' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='649' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='251968'> - <var-decl name='_py_seek' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='650' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='252352'> - <var-decl name='_py_seekable' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='651' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='252800'> - <var-decl name='_py_selectors' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='652' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='253248'> - <var-decl name='_py_self' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='653' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='253632'> - <var-decl name='_py_send' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='654' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='254016'> - <var-decl name='_py_sep' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='655' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='254400'> - <var-decl name='_py_sequence' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='656' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='254848'> - <var-decl name='_py_server_hostname' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='657' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='255296'> - <var-decl name='_py_server_side' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='658' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='255744'> - <var-decl name='_py_session' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='659' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256128'> - <var-decl name='_py_setcomp' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='660' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256512'> - <var-decl name='_py_setpgroup' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='661' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256960'> - <var-decl name='_py_setsid' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='662' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='257344'> - <var-decl name='_py_setsigdef' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='663' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='257792'> - <var-decl name='_py_setsigmask' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='664' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='258240'> - <var-decl name='_py_setstate' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='665' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='258688'> - <var-decl name='_py_shape' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='666' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='259072'> - <var-decl name='_py_show_cmd' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='667' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='259520'> - <var-decl name='_py_signed' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='668' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='259904'> - <var-decl name='_py_size' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='669' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='260288'> - <var-decl name='_py_sizehint' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='670' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='260736'> - <var-decl name='_py_skip_file_prefixes' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='671' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='261248'> - <var-decl name='_py_sleep' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='672' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='261632'> - <var-decl name='_py_sock' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='673' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='262016'> - <var-decl name='_py_sort' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='674' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='262400'> - <var-decl name='_py_sound' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='675' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='262784'> - <var-decl name='_py_source' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='676' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='263168'> - <var-decl name='_py_source_traceback' type-id='type-id-889' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='677' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='263680'> - <var-decl name='_py_src' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='678' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='264064'> - <var-decl name='_py_src_dir_fd' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='679' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='264512'> - <var-decl name='_py_stacklevel' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='680' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='264960'> - <var-decl name='_py_start' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='681' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='265344'> - <var-decl name='_py_statement' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='682' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='265792'> - <var-decl name='_py_status' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='683' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='266176'> - <var-decl name='_py_stderr' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='684' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='266560'> - <var-decl name='_py_stdin' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='685' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='266944'> - <var-decl name='_py_stdout' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='686' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='267328'> - <var-decl name='_py_step' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='687' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='267712'> - <var-decl name='_py_steps' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='688' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='268096'> - <var-decl name='_py_store_name' type-id='type-id-870' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='689' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='268544'> - <var-decl name='_py_strategy' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='690' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='268992'> - <var-decl name='_py_strftime' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='691' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='269440'> - <var-decl name='_py_strict' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='692' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='269824'> - <var-decl name='_py_strict_mode' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='693' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='270272'> - <var-decl name='_py_string' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='694' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='270656'> - <var-decl name='_py_sub_key' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='695' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='271040'> - <var-decl name='_py_symmetric_difference_update' type-id='type-id-896' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='271616'> - <var-decl name='_py_tabsize' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='697' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='272000'> - <var-decl name='_py_tag' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='698' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='272384'> - <var-decl name='_py_target' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='699' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='272768'> - <var-decl name='_py_target_is_directory' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='700' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='273280'> - <var-decl name='_py_task' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='701' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='273664'> - <var-decl name='_py_tb_frame' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='702' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='274112'> - <var-decl name='_py_tb_lasti' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='703' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='274560'> - <var-decl name='_py_tb_lineno' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='704' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='275008'> - <var-decl name='_py_tb_next' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='705' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='275392'> - <var-decl name='_py_tell' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='706' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='275776'> - <var-decl name='_py_template' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='707' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='276224'> - <var-decl name='_py_term' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='708' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='276608'> - <var-decl name='_py_text' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='709' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='276992'> - <var-decl name='_py_threading' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='710' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='277440'> - <var-decl name='_py_throw' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='711' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='277824'> - <var-decl name='_py_timeout' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='712' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='278208'> - <var-decl name='_py_times' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='713' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='278592'> - <var-decl name='_py_timetuple' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='714' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='279040'> - <var-decl name='_py_top' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='715' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='279424'> - <var-decl name='_py_trace_callback' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='716' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='279872'> - <var-decl name='_py_traceback' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='280320'> - <var-decl name='_py_trailers' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='718' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='280768'> - <var-decl name='_py_translate' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='719' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='281216'> - <var-decl name='_py_true' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='720' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='281600'> - <var-decl name='_py_truncate' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='721' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='282048'> - <var-decl name='_py_twice' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='722' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='282432'> - <var-decl name='_py_txt' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='723' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='282816'> - <var-decl name='_py_type' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='724' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='283200'> - <var-decl name='_py_type_params' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='725' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='283648'> - <var-decl name='_py_tz' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='726' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='284032'> - <var-decl name='_py_tzname' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='727' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='284416'> - <var-decl name='_py_uid' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='728' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='284800'> - <var-decl name='_py_unlink' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='729' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='285184'> - <var-decl name='_py_unraisablehook' type-id='type-id-884' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='730' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='285632'> - <var-decl name='_py_uri' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='731' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='286016'> - <var-decl name='_py_usedforsecurity' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='732' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='286464'> - <var-decl name='_py_value' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='733' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='286848'> - <var-decl name='_py_values' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='734' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='287232'> - <var-decl name='_py_version' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='735' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='287616'> - <var-decl name='_py_volume' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='736' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288000'> - <var-decl name='_py_warnings' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='737' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288448'> - <var-decl name='_py_warnoptions' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='738' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288896'> - <var-decl name='_py_wbits' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='739' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='289280'> - <var-decl name='_py_week' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='740' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='289664'> - <var-decl name='_py_weekday' type-id='type-id-882' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='741' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='290048'> - <var-decl name='_py_which' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='742' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='290432'> - <var-decl name='_py_who' type-id='type-id-893' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='743' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='290816'> - <var-decl name='_py_withdata' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='744' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='291264'> - <var-decl name='_py_writable' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='745' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='291712'> - <var-decl name='_py_write' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='746' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='292096'> - <var-decl name='_py_write_through' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='747' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='292544'> - <var-decl name='_py_x' type-id='type-id-595' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='748' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='292928'> - <var-decl name='_py_year' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='749' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='293312'> - <var-decl name='_py_zdict' type-id='type-id-880' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='750' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__54' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1' id='type-id-881'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-661' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__55' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1' id='type-id-882'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__58' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1' id='type-id-883'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-688' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__59' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1' id='type-id-884'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-659' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__61' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1' id='type-id-885'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-663' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__65' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1' id='type-id-886'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-668' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__75' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1' id='type-id-887'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__93' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1' id='type-id-888'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-675' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__114' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1' id='type-id-889'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-662' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__139' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1' id='type-id-890'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-669' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__181' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1' id='type-id-891'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-665' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__213' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1' id='type-id-892'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-684' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__242' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1' id='type-id-893'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-687' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__257' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1' id='type-id-894'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-677' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__306' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1' id='type-id-895'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-671' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__687' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1' id='type-id-896'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_ascii' type-id='type-id-794' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_data' type-id='type-id-679' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__743' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='756' column='1' id='type-id-597'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_latin1' type-id='type-id-797' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='757' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_data' type-id='type-id-680' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='758' column='1'/> - </data-member> - </class-decl> - <class-decl name='PyHamtNode' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-897' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='38' column='1' id='type-id-898'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='39' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyHamtNode' type-id='type-id-898' filepath='./Include/internal/pycore_hamt.h' line='40' column='1' id='type-id-897'/> - <class-decl name='PyHamtObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-867' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='44' column='1' id='type-id-899'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='h_root' type-id='type-id-900' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='h_weakreflist' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='h_count' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='48' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyHamtObject' type-id='type-id-899' filepath='./Include/internal/pycore_hamt.h' line='49' column='1' id='type-id-867'/> - <class-decl name='PyHamtNode_Bitmap' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-863' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='52' column='1' id='type-id-901'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='b_bitmap' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='b_array' type-id='type-id-353' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='55' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyHamtNode_Bitmap' type-id='type-id-901' filepath='./Include/internal/pycore_hamt.h' line='56' column='1' id='type-id-863'/> - <class-decl name='_Py_slist_item_s' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='13' column='1' id='type-id-902'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-903' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='14' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_slist_item_t' type-id='type-id-902' filepath='./Include/internal/pycore_hashtable.h' line='15' column='1' id='type-id-904'/> - <class-decl name='_Py_slist_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-905' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='17' column='1' id='type-id-906'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='head' type-id='type-id-907' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='18' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_slist_t' type-id='type-id-906' filepath='./Include/internal/pycore_hashtable.h' line='19' column='1' id='type-id-905'/> - <class-decl name='_Py_hashtable_entry_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-908' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='28' column='1' id='type-id-909'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_Py_slist_item' type-id='type-id-904' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='key_hash' type-id='type-id-910' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='key' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='value' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='34' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_hashtable_entry_t' type-id='type-id-909' filepath='./Include/internal/pycore_hashtable.h' line='35' column='1' id='type-id-908'/> - <typedef-decl name='_Py_hashtable_t' type-id='type-id-911' filepath='./Include/internal/pycore_hashtable.h' line='42' column='1' id='type-id-912'/> - <typedef-decl name='_Py_hashtable_hash_func' type-id='type-id-913' filepath='./Include/internal/pycore_hashtable.h' line='44' column='1' id='type-id-914'/> - <typedef-decl name='_Py_hashtable_compare_func' type-id='type-id-78' filepath='./Include/internal/pycore_hashtable.h' line='45' column='1' id='type-id-915'/> - <typedef-decl name='_Py_hashtable_destroy_func' type-id='type-id-760' filepath='./Include/internal/pycore_hashtable.h' line='46' column='1' id='type-id-916'/> - <typedef-decl name='_Py_hashtable_get_entry_func' type-id='type-id-917' filepath='./Include/internal/pycore_hashtable.h' line='47' column='1' id='type-id-918'/> - <class-decl name='_Py_hashtable_allocator_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-919' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='50' column='1' id='type-id-920'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='malloc' type-id='type-id-921' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='free' type-id='type-id-760' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='55' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_hashtable_allocator_t' type-id='type-id-920' filepath='./Include/internal/pycore_hashtable.h' line='56' column='1' id='type-id-919'/> - <class-decl name='_Py_hashtable_t' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='60' column='1' id='type-id-911'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='nentries' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='nbuckets' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='buckets' type-id='type-id-922' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='get_entry_func' type-id='type-id-918' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='hash_func' type-id='type-id-914' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='compare_func' type-id='type-id-915' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='key_destroy_func' type-id='type-id-916' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='value_destroy_func' type-id='type-id-916' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='alloc' type-id='type-id-919' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='70' column='1'/> - </data-member> - </class-decl> - <class-decl name='_import_runtime_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='12' column='1' id='type-id-923'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='inittab' type-id='type-id-924' visibility='default' filepath='./Include/internal/pycore_import.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='last_module_index' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_import.h' line='19' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='extensions' type-id='type-id-925' visibility='default' filepath='./Include/internal/pycore_import.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='pkgcontext' type-id='type-id-12' visibility='default' filepath='./Include/internal/pycore_import.h' line='32' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__6' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='20' column='1' id='type-id-925'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_import.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='hashtable' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_import.h' line='29' column='1'/> - </data-member> - </class-decl> - <class-decl name='_import_state' size-in-bits='768' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='35' column='1' id='type-id-927'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='modules' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_import.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='modules_by_index' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_import.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='importlib' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_import.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='override_frozen_modules' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='override_multi_interp_extensions_check' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='dlopenflags' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='import_func' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_import.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='lock' type-id='type-id-928' visibility='default' filepath='./Include/internal/pycore_import.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='find_and_load' type-id='type-id-929' visibility='default' filepath='./Include/internal/pycore_import.h' line='79' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__745' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='69' column='1' id='type-id-928'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_import.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='thread' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_import.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='72' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__746' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='75' column='1' id='type-id-929'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='import_level' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='accumulated' type-id='type-id-790' visibility='default' filepath='./Include/internal/pycore_import.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='header' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_import.h' line='78' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_long_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='38' column='1' id='type-id-930'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='max_str_digits' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_interp.h' line='39' column='1'/> - </data-member> - </class-decl> - <class-decl name='_is' size-in-bits='3068160' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='49' column='1' id='type-id-931'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_interp.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='id' type-id='type-id-377' visibility='default' filepath='./Include/internal/pycore_interp.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='id_refcount' type-id='type-id-377' visibility='default' filepath='./Include/internal/pycore_interp.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='requires_idref' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_interp.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='id_mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_interp.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_interp.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='finalizing' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_interp.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='monitoring_version' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_interp.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='last_restart_version' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_interp.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='threads' type-id='type-id-932' visibility='default' filepath='./Include/internal/pycore_interp.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='runtime' type-id='type-id-933' visibility='default' filepath='./Include/internal/pycore_interp.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_finalizing' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_interp.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='gc' type-id='type-id-854' visibility='default' filepath='./Include/internal/pycore_interp.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='sysdict' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='builtins' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='ceval' type-id='type-id-823' visibility='default' filepath='./Include/internal/pycore_interp.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='7552'> - <var-decl name='imports' type-id='type-id-927' visibility='default' filepath='./Include/internal/pycore_interp.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8320'> - <var-decl name='_gil' type-id='type-id-857' visibility='default' filepath='./Include/internal/pycore_interp.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='9984'> - <var-decl name='codec_search_path' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='124' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10048'> - <var-decl name='codec_search_cache' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='125' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10112'> - <var-decl name='codec_error_registry' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='126' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10176'> - <var-decl name='codecs_initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_interp.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='10240'> - <var-decl name='config' type-id='type-id-258' visibility='default' filepath='./Include/internal/pycore_interp.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13696'> - <var-decl name='feature_flags' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_interp.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13760'> - <var-decl name='dict' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13824'> - <var-decl name='sysdict_copy' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='134' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13888'> - <var-decl name='builtins_copy' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='135' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13952'> - <var-decl name='eval_frame' type-id='type-id-780' visibility='default' filepath='./Include/internal/pycore_interp.h' line='137' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14016'> - <var-decl name='func_watchers' type-id='type-id-580' visibility='default' filepath='./Include/internal/pycore_interp.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14528'> - <var-decl name='active_func_watchers' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_interp.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14592'> - <var-decl name='co_extra_user_count' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp.h' line='143' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='14656'> - <var-decl name='co_extra_freefuncs' type-id='type-id-627' visibility='default' filepath='./Include/internal/pycore_interp.h' line='144' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='30976'> - <var-decl name='before_forkers' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31040'> - <var-decl name='after_forkers_parent' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31104'> - <var-decl name='after_forkers_child' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31168'> - <var-decl name='warnings' type-id='type-id-934' visibility='default' filepath='./Include/internal/pycore_interp.h' line='152' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31424'> - <var-decl name='atexit' type-id='type-id-807' visibility='default' filepath='./Include/internal/pycore_interp.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='31680'> - <var-decl name='obmalloc' type-id='type-id-935' visibility='default' filepath='./Include/internal/pycore_interp.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2137664'> - <var-decl name='audit_hooks' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2137728'> - <var-decl name='type_watchers' type-id='type-id-590' visibility='default' filepath='./Include/internal/pycore_interp.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2138240'> - <var-decl name='code_watchers' type-id='type-id-576' visibility='default' filepath='./Include/internal/pycore_interp.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2138752'> - <var-decl name='active_code_watchers' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_interp.h' line='161' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2138784'> - <var-decl name='object_state' type-id='type-id-936' visibility='default' filepath='./Include/internal/pycore_interp.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2138816'> - <var-decl name='unicode' type-id='type-id-937' visibility='default' filepath='./Include/internal/pycore_interp.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2139264'> - <var-decl name='float_state' type-id='type-id-847' visibility='default' filepath='./Include/internal/pycore_interp.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2139392'> - <var-decl name='long_state' type-id='type-id-930' visibility='default' filepath='./Include/internal/pycore_interp.h' line='166' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2139456'> - <var-decl name='dtoa' type-id='type-id-833' visibility='default' filepath='./Include/internal/pycore_interp.h' line='167' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2158528'> - <var-decl name='func_state' type-id='type-id-851' visibility='default' filepath='./Include/internal/pycore_interp.h' line='168' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2158592'> - <var-decl name='slice_cache' type-id='type-id-424' visibility='default' filepath='./Include/internal/pycore_interp.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2158656'> - <var-decl name='tuple' type-id='type-id-938' visibility='default' filepath='./Include/internal/pycore_interp.h' line='173' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2160576'> - <var-decl name='list' type-id='type-id-939' visibility='default' filepath='./Include/internal/pycore_interp.h' line='174' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2165760'> - <var-decl name='dict_state' type-id='type-id-831' visibility='default' filepath='./Include/internal/pycore_interp.h' line='175' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176704'> - <var-decl name='async_gen' type-id='type-id-856' visibility='default' filepath='./Include/internal/pycore_interp.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2187072'> - <var-decl name='context' type-id='type-id-828' visibility='default' filepath='./Include/internal/pycore_interp.h' line='177' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2187200'> - <var-decl name='exc_state' type-id='type-id-834' visibility='default' filepath='./Include/internal/pycore_interp.h' line='178' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2187456'> - <var-decl name='ast' type-id='type-id-799' visibility='default' filepath='./Include/internal/pycore_interp.h' line='180' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2203072'> - <var-decl name='types' type-id='type-id-940' visibility='default' filepath='./Include/internal/pycore_interp.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3053632'> - <var-decl name='callable_cache' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_interp.h' line='182' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3053888'> - <var-decl name='interpreter_trampoline' type-id='type-id-328' visibility='default' filepath='./Include/internal/pycore_interp.h' line='183' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3053952'> - <var-decl name='monitors' type-id='type-id-706' visibility='default' filepath='./Include/internal/pycore_interp.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054072'> - <var-decl name='f_opcode_trace_set' type-id='type-id-615' visibility='default' filepath='./Include/internal/pycore_interp.h' line='186' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054080'> - <var-decl name='sys_profile_initialized' type-id='type-id-615' visibility='default' filepath='./Include/internal/pycore_interp.h' line='187' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054088'> - <var-decl name='sys_trace_initialized' type-id='type-id-615' visibility='default' filepath='./Include/internal/pycore_interp.h' line='188' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054144'> - <var-decl name='sys_profiling_threads' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp.h' line='189' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054208'> - <var-decl name='sys_tracing_threads' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_interp.h' line='190' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3054272'> - <var-decl name='monitoring_callables' type-id='type-id-585' visibility='default' filepath='./Include/internal/pycore_interp.h' line='191' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3062976'> - <var-decl name='monitoring_tool_names' type-id='type-id-584' visibility='default' filepath='./Include/internal/pycore_interp.h' line='192' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3063488'> - <var-decl name='cached_objects' type-id='type-id-864' visibility='default' filepath='./Include/internal/pycore_interp.h' line='194' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3064768'> - <var-decl name='static_objects' type-id='type-id-865' visibility='default' filepath='./Include/internal/pycore_interp.h' line='195' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3065856'> - <var-decl name='_initial_thread' type-id='type-id-941' visibility='default' filepath='./Include/internal/pycore_interp.h' line='198' column='1'/> - </data-member> - </class-decl> - <class-decl name='pythreads' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='67' column='1' id='type-id-932'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_unique_id' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_interp.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-177' visibility='default' filepath='./Include/internal/pycore_interp.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='count' type-id='type-id-47' visibility='default' filepath='./Include/internal/pycore_interp.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='stacksize' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_interp.h' line='77' column='1'/> - </data-member> - </class-decl> - <class-decl name='_xidregitem' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='226' column='1' id='type-id-942'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='prev' type-id='type-id-943' visibility='default' filepath='./Include/internal/pycore_interp.h' line='227' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='next' type-id='type-id-943' visibility='default' filepath='./Include/internal/pycore_interp.h' line='228' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='cls' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='229' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='getdata' type-id='type-id-787' visibility='default' filepath='./Include/internal/pycore_interp.h' line='230' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_list_state' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_list.h' line='31' column='1' id='type-id-939'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='free_list' type-id='type-id-581' visibility='default' filepath='./Include/internal/pycore_list.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5120'> - <var-decl name='numfree' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_list.h' line='34' column='1'/> - </data-member> - </class-decl> - <class-decl name='_py_object_runtime_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='11' column='1' id='type-id-944'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_not_used' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='15' column='1'/> - </data-member> - </class-decl> - <class-decl name='_py_object_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='18' column='1' id='type-id-936'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_not_used' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='29' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='pymem_uint' type-id='type-id-95' filepath='./Include/internal/pycore_obmalloc.h' line='12' column='1' id='type-id-945'/> - <typedef-decl name='pymem_block' type-id='type-id-325' filepath='./Include/internal/pycore_obmalloc.h' line='251' column='1' id='type-id-946'/> - <class-decl name='pool_header' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='254' column='1' id='type-id-947'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ref' type-id='type-id-948' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='freeblock' type-id='type-id-949' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='257' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='nextpool' type-id='type-id-950' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='258' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='prevpool' type-id='type-id-950' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='259' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='arenaindex' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='260' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='szidx' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='261' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='nextoffset' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='262' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='maxnextoffset' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='263' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1' id='type-id-948'> - <data-member access='public'> - <var-decl name='_padding' type-id='type-id-949' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='count' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='poolp' type-id='type-id-950' filepath='./Include/internal/pycore_obmalloc.h' line='266' column='1' id='type-id-637'/> - <class-decl name='arena_object' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='269' column='1' id='type-id-951'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='address' type-id='type-id-749' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='275' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pool_address' type-id='type-id-949' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='278' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='nfreepools' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='283' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='ntotalpools' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='286' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='freepools' type-id='type-id-950' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='289' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='nextarena' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='305' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='prevarena' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='306' column='1'/> - </data-member> - </class-decl> - <class-decl name='_obmalloc_pools' size-in-bits='4096' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='419' column='1' id='type-id-952'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='used' type-id='type-id-638' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='420' column='1'/> - </data-member> - </class-decl> - <class-decl name='_obmalloc_mgmt' size-in-bits='4672' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='477' column='1' id='type-id-953'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arenas' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='479' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='maxarenas' type-id='type-id-945' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='481' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='unused_arena_objects' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='486' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='usable_arenas' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='491' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='nfp2lasta' type-id='type-id-612' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='494' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4416'> - <var-decl name='narenas_currently_allocated' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='497' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4480'> - <var-decl name='ntimes_arena_allocated' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='500' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4544'> - <var-decl name='narenas_highwater' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='502' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4608'> - <var-decl name='raw_allocated_blocks' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='504' column='1'/> - </data-member> - </class-decl> - <class-decl name='arena_coverage_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-603' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='619' column='1' id='type-id-954'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tail_hi' type-id='type-id-955' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='620' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='tail_lo' type-id='type-id-955' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='621' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='arena_coverage_t' type-id='type-id-954' filepath='./Include/internal/pycore_obmalloc.h' line='622' column='1' id='type-id-603'/> - <class-decl name='arena_map_bot' size-in-bits='1048576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='624' column='1' id='type-id-956'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arenas' type-id='type-id-604' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='629' column='1'/> - </data-member> - </class-decl> - <class-decl name='arena_map_mid' size-in-bits='2097152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='633' column='1' id='type-id-957'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptrs' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='634' column='1'/> - </data-member> - </class-decl> - <class-decl name='arena_map_top' size-in-bits='2097152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='637' column='1' id='type-id-958'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptrs' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='638' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='arena_map_top_t' type-id='type-id-958' filepath='./Include/internal/pycore_obmalloc.h' line='639' column='1' id='type-id-959'/> - <class-decl name='_obmalloc_usage' size-in-bits='2097216' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='642' column='1' id='type-id-960'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arena_map_root' type-id='type-id-959' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='648' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2097152'> - <var-decl name='arena_map_mid_count' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='650' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2097184'> - <var-decl name='arena_map_bot_count' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='651' column='1'/> - </data-member> - </class-decl> - <class-decl name='_obmalloc_global_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='660' column='1' id='type-id-961'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='dump_debug_stats' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='661' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='interpreter_leaks' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='662' column='1'/> - </data-member> - </class-decl> - <class-decl name='_obmalloc_state' size-in-bits='2105984' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='665' column='1' id='type-id-935'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='pools' type-id='type-id-952' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='666' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='mgmt' type-id='type-id-953' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='667' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8768'> - <var-decl name='usage' type-id='type-id-960' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='668' column='1'/> - </data-member> - </class-decl> - <class-decl name='_parser_runtime_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_parser.h' line='21' column='1' id='type-id-962'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_not_used' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_parser.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='dummy_name' type-id='type-id-963' visibility='default' filepath='./Include/internal/pycore_parser.h' line='27' column='1'/> - </data-member> - </class-decl> - <class-decl name='pyhash_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='9' column='1' id='type-id-964'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='urandom_cache' type-id='type-id-965' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='19' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='10' column='1' id='type-id-965'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fd' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_dev' type-id='type-id-966' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='13' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_ino' type-id='type-id-967' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='14' column='1'/> - </data-member> - </class-decl> - <class-decl name='debug_alloc_api_t' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-968' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='14' column='1' id='type-id-969'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='api_id' type-id='type-id-48' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='alloc' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='17' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='debug_alloc_api_t' type-id='type-id-969' filepath='./Include/internal/pycore_pymem.h' line='18' column='1' id='type-id-968'/> - <class-decl name='_pymem_allocators' size-in-bits='2368' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='20' column='1' id='type-id-970'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='standard' type-id='type-id-971' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='debug' type-id='type-id-972' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='obj_arena' type-id='type-id-420' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='32' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='22' column='1' id='type-id-971'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='raw' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='mem' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='obj' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='25' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__1' size-in-bits='1152' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='27' column='1' id='type-id-972'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='raw' type-id='type-id-968' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='mem' type-id='type-id-968' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='obj' type-id='type-id-968' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='30' column='1'/> - </data-member> - </class-decl> - <class-decl name='_pythread_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='54' column='1' id='type-id-973'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_condattr_monotonic' type-id='type-id-974' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='66' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='59' column='1' id='type-id-974'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ptr' type-id='type-id-975' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='val' type-id='type-id-976' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='64' column='1'/> - </data-member> - </class-decl> - <class-decl name='_getargs_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='30' column='1' id='type-id-977'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='static_parsers' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='32' column='1'/> - </data-member> - </class-decl> - <class-decl name='_gilstate_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='37' column='1' id='type-id-978'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='check_enabled' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='autoInterpreterState' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='45' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_AuditHookEntry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='50' column='1' id='type-id-979'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next' type-id='type-id-980' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='hookCFunction' type-id='type-id-234' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='userData' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='53' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_AuditHookEntry' type-id='type-id-979' filepath='./Include/internal/pycore_runtime.h' line='54' column='1' id='type-id-981'/> - <class-decl name='pyruntimestate' size-in-bits='3679104' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='61' column='1' id='type-id-982'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='preinitializing' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='preinitialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='core_initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_finalizing' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='interpreters' type-id='type-id-983' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='main_thread' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='xidregistry' type-id='type-id-984' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='allocators' type-id='type-id-970' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='119' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='obmalloc' type-id='type-id-961' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='pyhash_state' type-id='type-id-964' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3392'> - <var-decl name='time' type-id='type-id-985' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3520'> - <var-decl name='threads' type-id='type-id-973' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3712'> - <var-decl name='signals' type-id='type-id-986' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='124' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12352'> - <var-decl name='autoTSSkey' type-id='type-id-408' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12416'> - <var-decl name='trashTSSkey' type-id='type-id-408' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12480'> - <var-decl name='orig_argv' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12608'> - <var-decl name='parser' type-id='type-id-962' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='134' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='13056'> - <var-decl name='atexit' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15232'> - <var-decl name='imports' type-id='type-id-923' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='138' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='15552'> - <var-decl name='ceval' type-id='type-id-820' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='139' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20480'> - <var-decl name='gilstate' type-id='type-id-978' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='140' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20608'> - <var-decl name='getargs' type-id='type-id-977' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='141' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20736'> - <var-decl name='fileutils' type-id='type-id-843' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='142' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='20800'> - <var-decl name='faulthandler' type-id='type-id-839' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='143' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22144'> - <var-decl name='tracemalloc' type-id='type-id-987' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='144' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24000'> - <var-decl name='preconfig' type-id='type-id-744' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='146' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24320'> - <var-decl name='open_code_hook' type-id='type-id-355' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='150' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24384'> - <var-decl name='open_code_userdata' type-id='type-id-22' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='151' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24448'> - <var-decl name='audit_hooks' type-id='type-id-988' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24576'> - <var-decl name='object_state' type-id='type-id-944' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24608'> - <var-decl name='float_state' type-id='type-id-846' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='158' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24704'> - <var-decl name='unicode_state' type-id='type-id-989' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24832'> - <var-decl name='types' type-id='type-id-990' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='160' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='24896'> - <var-decl name='static_objects' type-id='type-id-860' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='610944'> - <var-decl name='_main_interpreter' type-id='type-id-991' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='180' column='1'/> - </data-member> - </class-decl> - <class-decl name='pyinterpreters' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='87' column='1' id='type-id-983'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='main' type-id='type-id-20' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='94' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='next_id' type-id='type-id-377' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='103' column='1'/> - </data-member> - </class-decl> - <class-decl name='_xidregistry' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='114' column='1' id='type-id-984'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-943' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='116' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__19' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='152' column='1' id='type-id-988'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mutex' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='head' type-id='type-id-980' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='154' column='1'/> - </data-member> - </class-decl> - <class-decl name='_signals_runtime_state' size-in-bits='8640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='37' column='1' id='type-id-986'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='handlers' type-id='type-id-699' visibility='default' filepath='./Include/internal/pycore_signal.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8320'> - <var-decl name='wakeup' type-id='type-id-992' visibility='default' filepath='./Include/internal/pycore_signal.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8384'> - <var-decl name='is_tripped' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_signal.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8448'> - <var-decl name='default_handler' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_signal.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8512'> - <var-decl name='ignore_handler' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_signal.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='8576'> - <var-decl name='unhandled_keyboard_interrupt' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_signal.h' line='78' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='38' column='1' id='type-id-993'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tripped' type-id='type-id-812' visibility='default' filepath='./Include/internal/pycore_signal.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='func' type-id='type-id-810' visibility='default' filepath='./Include/internal/pycore_signal.h' line='43' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__5' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='46' column='1' id='type-id-994'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fd' type-id='type-id-995' visibility='default' filepath='./Include/internal/pycore_signal.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='warn_on_full_buffer' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_signal.h' line='57' column='1'/> - </data-member> - </class-decl> - <class-decl name='_time_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_time.h' line='12' column='1' id='type-id-985'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ticks_per_second_initialized' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_time.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ticks_per_second' type-id='type-id-47' visibility='default' filepath='./Include/internal/pycore_time.h' line='15' column='1'/> - </data-member> - </class-decl> - <class-decl name='_PyTraceMalloc_Config' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='18' column='1' id='type-id-996'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='initialized' type-id='type-id-997' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='tracing' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='max_nframe' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='33' column='1'/> - </data-member> - </class-decl> - <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/internal/pycore_tracemalloc.h' line='21' column='1' id='type-id-997'> - <underlying-type type-id='type-id-24'/> - <enumerator name='TRACEMALLOC_NOT_INITIALIZED' value='0'/> - <enumerator name='TRACEMALLOC_INITIALIZED' value='1'/> - <enumerator name='TRACEMALLOC_FINALIZED' value='2'/> - </enum-decl> - <class-decl name='tracemalloc_frame' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='47' column='1' id='type-id-645'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='filename' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='lineno' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='51' column='1'/> - </data-member> - </class-decl> - <class-decl name='tracemalloc_traceback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='57' column='1' id='type-id-998'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hash' type-id='type-id-910' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='nframe' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='80'> - <var-decl name='total_nframe' type-id='type-id-709' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='frames' type-id='type-id-646' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='63' column='1'/> - </data-member> - </class-decl> - <class-decl name='_tracemalloc_runtime_state' size-in-bits='1856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='67' column='1' id='type-id-987'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='config' type-id='type-id-996' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='allocators' type-id='type-id-999' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='tables_lock' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='traced_memory' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='peak_traced_memory' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='filenames' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='traceback' type-id='type-id-1000' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='tracebacks' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='traces' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='domains' type-id='type-id-926' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='empty_traceback' type-id='type-id-998' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='reentrant_key' type-id='type-id-408' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='106' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__18' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='71' column='1' id='type-id-999'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mem' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='raw' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='obj' type-id='type-id-417' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='74' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_tuple_state' size-in-bits='1920' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tuple.h' line='47' column='1' id='type-id-938'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='free_list' type-id='type-id-588' visibility='default' filepath='./Include/internal/pycore_tuple.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='numfree' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_tuple.h' line='58' column='1'/> - </data-member> - </class-decl> - <class-decl name='_types_runtime_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='19' column='1' id='type-id-990'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version_tag' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='23' column='1'/> - </data-member> - </class-decl> - <class-decl name='type_cache_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='29' column='1' id='type-id-647'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='version' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='value' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='32' column='1'/> - </data-member> - </class-decl> - <class-decl name='type_cache' size-in-bits='786432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='37' column='1' id='type-id-1001'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hashtable' type-id='type-id-648' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='38' column='1'/> - </data-member> - </class-decl> - <class-decl name='static_builtin_state' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-410' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='45' column='1' id='type-id-1002'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='readying' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='ready' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tp_dict' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tp_subclasses' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tp_weaklist' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='57' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='static_builtin_state' type-id='type-id-1002' filepath='./Include/internal/pycore_typeobject.h' line='58' column='1' id='type-id-410'/> - <class-decl name='types_state' size-in-bits='850560' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='60' column='1' id='type-id-940'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='next_version_tag' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type_cache' type-id='type-id-1001' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='786496'> - <var-decl name='num_builtins_initialized' type-id='type-id-19' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='786560'> - <var-decl name='builtins' type-id='type-id-643' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='68' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='pytype_slotdef' type-id='type-id-333' filepath='./Include/internal/pycore_typeobject.h' line='87' column='1' id='type-id-1003'/> - <class-decl name='_PyUnicode_Name_CAPI' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1004' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='16' column='1' id='type-id-1005'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='getname' type-id='type-id-1006' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='getcode' type-id='type-id-1007' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='26' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyUnicode_Name_CAPI' type-id='type-id-1005' filepath='./Include/internal/pycore_ucnhash.h' line='29' column='1' id='type-id-1004'/> - <class-decl name='_Py_unicode_runtime_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='29' column='1' id='type-id-1008'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lock' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='next_index' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='33' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_unicode_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='36' column='1' id='type-id-989'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ids' type-id='type-id-1008' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='37' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_unicode_fs_codec' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='42' column='1' id='type-id-1009'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='encoding' type-id='type-id-15' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='utf8' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='errors' type-id='type-id-15' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='error_handler' type-id='type-id-442' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='46' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_unicode_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='49' column='1' id='type-id-1010'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='array' type-id='type-id-233' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='51' column='1'/> - </data-member> - </class-decl> - <class-decl name='_Py_unicode_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='54' column='1' id='type-id-937'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='fs_codec' type-id='type-id-1009' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ucnhash_capi' type-id='type-id-1011' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ids' type-id='type-id-1010' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='60' column='1'/> - </data-member> - </class-decl> - <class-decl name='_warnings_runtime_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='11' column='1' id='type-id-934'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='filters' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='once_registry' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='default_action' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='filters_version' type-id='type-id-47' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='17' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Py_uhash_t' type-id='type-id-19' filepath='./Include/pyport.h' line='148' column='1' id='type-id-910'/> - <typedef-decl name='PyThread_type_lock' type-id='type-id-22' filepath='./Include/pythread.h' line='4' column='1' id='type-id-801'/> - <typedef-decl name='Py_tss_t' type-id='type-id-788' filepath='./Include/pythread.h' line='113' column='1' id='type-id-408'/> - <typedef-decl name='PyLongObject' type-id='type-id-751' filepath='./Include/pytypedefs.h' line='19' column='1' id='type-id-240'/> - <typedef-decl name='PyCodeObject' type-id='type-id-719' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-1012'/> - <typedef-decl name='PyFrameObject' type-id='type-id-849' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-1013'/> - <typedef-decl name='PyThreadState' type-id='type-id-776' filepath='./Include/pytypedefs.h' line='24' column='1' id='type-id-941'/> - <typedef-decl name='PyInterpreterState' type-id='type-id-931' filepath='./Include/pytypedefs.h' line='25' column='1' id='type-id-991'/> - <class-decl name='PySliceObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1014' visibility='default' filepath='./Include/sliceobject.h' line='22' column='1' id='type-id-1015'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/sliceobject.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='start' type-id='type-id-2' visibility='default' filepath='./Include/sliceobject.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='stop' type-id='type-id-2' visibility='default' filepath='./Include/sliceobject.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='step' type-id='type-id-2' visibility='default' filepath='./Include/sliceobject.h' line='24' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PySliceObject' type-id='type-id-1015' filepath='./Include/sliceobject.h' line='25' column='1' id='type-id-1014'/> - <typedef-decl name='__sighandler_t' type-id='type-id-1016' filepath='/usr/include/signal.h' line='72' column='1' id='type-id-1017'/> - <typedef-decl name='uintptr_t' type-id='type-id-28' filepath='/usr/include/stdint.h' line='90' column='1' id='type-id-749'/> - <union-decl name='__atomic_wide_counter' size-in-bits='64' naming-typedef-id='type-id-1018' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='25' column='1' id='type-id-1019'> - <data-member access='public'> - <var-decl name='__value64' type-id='type-id-387' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='27' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__value32' type-id='type-id-1020' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='32' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__744' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='28' column='1' id='type-id-1020'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__low' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__high' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='31' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__atomic_wide_counter' type-id='type-id-1019' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='33' column='1' id='type-id-1018'/> - <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='type-id-976' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='41' column='1' id='type-id-1021'> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-620' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='43' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='44' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_condattr_t' type-id='type-id-1021' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='45' column='1' id='type-id-976'/> - <typedef-decl name='pthread_key_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='49' column='1' id='type-id-789'/> - <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='type-id-859' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-1022'> - <data-member access='public'> - <var-decl name='__data' type-id='type-id-1023' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-616' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_mutex_t' type-id='type-id-1022' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-859'/> - <union-decl name='pthread_cond_t' size-in-bits='384' naming-typedef-id='type-id-858' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-1024'> - <data-member access='public'> - <var-decl name='__data' type-id='type-id-1025' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-618' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-378' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_cond_t' type-id='type-id-1024' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-858'/> - <class-decl name='sigaction' size-in-bits='1216' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='27' column='1' id='type-id-836'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__sigaction_handler' type-id='type-id-1026' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='sa_mask' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='sa_flags' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='sa_restorer' type-id='type-id-227' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='52' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='31' column='1' id='type-id-1026'> - <data-member access='public'> - <var-decl name='sa_handler' type-id='type-id-1017' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='34' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='sa_sigaction' type-id='type-id-1027' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='36' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='int8_t' type-id='type-id-1028' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='24' column='1' id='type-id-370'/> - <typedef-decl name='int32_t' type-id='type-id-1029' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-955'/> - <typedef-decl name='int64_t' type-id='type-id-1030' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='27' column='1' id='type-id-377'/> - <typedef-decl name='uint8_t' type-id='type-id-1031' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='24' column='1' id='type-id-325'/> - <typedef-decl name='uint16_t' type-id='type-id-1032' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='25' column='1' id='type-id-709'/> - <typedef-decl name='uint64_t' type-id='type-id-1033' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='27' column='1' id='type-id-117'/> - <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='22' column='1' id='type-id-1023'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__lock' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__count' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__owner' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='__nusers' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='__kind' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='__spins' type-id='type-id-71' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='176'> - <var-decl name='__elision' type-id='type-id-71' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='__list' type-id='type-id-1034' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='36' column='1'/> - </data-member> - </class-decl> - <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='51' column='1' id='type-id-1035'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__prev' type-id='type-id-1036' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__next' type-id='type-id-1036' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='54' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__pthread_list_t' type-id='type-id-1035' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='55' column='1' id='type-id-1034'/> - <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='94' column='1' id='type-id-1025'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__wseq' type-id='type-id-1018' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='__g1_start' type-id='type-id-1018' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='__g_refs' type-id='type-id-696' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='__g_size' type-id='type-id-696' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='__g1_orig_size' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='__wrefs' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='__g_signals' type-id='type-id-696' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='102' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__int8_t' type-id='type-id-1037' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='37' column='1' id='type-id-1028'/> - <typedef-decl name='__uint8_t' type-id='type-id-85' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='38' column='1' id='type-id-1031'/> - <typedef-decl name='__uint16_t' type-id='type-id-84' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-1032'/> - <typedef-decl name='__int32_t' type-id='type-id-8' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='41' column='1' id='type-id-1029'/> - <typedef-decl name='__int64_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='44' column='1' id='type-id-1030'/> - <typedef-decl name='__uint64_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='45' column='1' id='type-id-1033'/> - <typedef-decl name='__dev_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='145' column='1' id='type-id-187'/> - <typedef-decl name='__uid_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='146' column='1' id='type-id-125'/> - <typedef-decl name='__ino64_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='149' column='1' id='type-id-83'/> - <typedef-decl name='__pid_t' type-id='type-id-8' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='154' column='1' id='type-id-127'/> - <typedef-decl name='__clock_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='156' column='1' id='type-id-97'/> - <typedef-decl name='__sig_atomic_t' type-id='type-id-8' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='215' column='1' id='type-id-1038'/> - <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='5' column='1' id='type-id-1039'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__val' type-id='type-id-697' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='7' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__sigset_t' type-id='type-id-1039' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='8' column='1' id='type-id-30'/> - <union-decl name='sigval' size-in-bits='64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='24' column='1' id='type-id-1040'> - <data-member access='public'> - <var-decl name='sival_int' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='26' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='sival_ptr' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='27' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='__sigval_t' type-id='type-id-1040' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='30' column='1' id='type-id-1041'/> - <typedef-decl name='sig_atomic_t' type-id='type-id-1038' filepath='/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h' line='8' column='1' id='type-id-995'/> - <class-decl name='siginfo_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-1042' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='36' column='1' id='type-id-1043'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_signo' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='si_errno' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_code' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='__pad0' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_sifields' type-id='type-id-1044' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='123' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__1' size-in-bits='896' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='51' column='1' id='type-id-1044'> - <data-member access='public'> - <var-decl name='_pad' type-id='type-id-635' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='53' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_kill' type-id='type-id-1045' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='60' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_timer' type-id='type-id-1046' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='68' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_rt' type-id='type-id-1047' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='76' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_sigchld' type-id='type-id-1048' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='86' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_sigfault' type-id='type-id-1049' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='105' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_sigpoll' type-id='type-id-1050' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='112' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_sigsys' type-id='type-id-1051' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='121' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__11' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='56' column='1' id='type-id-1045'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-127' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='si_uid' type-id='type-id-125' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='59' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__12' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='63' column='1' id='type-id-1046'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_tid' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='si_overrun' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_sigval' type-id='type-id-1041' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='67' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__13' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='71' column='1' id='type-id-1047'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-127' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='si_uid' type-id='type-id-125' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_sigval' type-id='type-id-1041' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='75' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__14' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='79' column='1' id='type-id-1048'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_pid' type-id='type-id-127' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='si_uid' type-id='type-id-125' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_status' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='si_utime' type-id='type-id-97' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='si_stime' type-id='type-id-97' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='85' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__15' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='89' column='1' id='type-id-1049'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_addr' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_addr_lsb' type-id='type-id-71' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_bounds' type-id='type-id-1052' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='104' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__2' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='94' column='1' id='type-id-1052'> - <data-member access='public'> - <var-decl name='_addr_bnd' type-id='type-id-1053' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='101' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='_pkey' type-id='type-id-1054' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='103' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__16' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='97' column='1' id='type-id-1053'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_lower' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_upper' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='100' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__17' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='108' column='1' id='type-id-1050'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='si_band' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='si_fd' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='111' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__18' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='116' column='1' id='type-id-1051'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_call_addr' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='118' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_syscall' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='119' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='_arch' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='120' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='siginfo_t' type-id='type-id-1043' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='124' column='1' id='type-id-1042'/> - <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-38' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='26' column='1' id='type-id-1055'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ss_sp' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ss_flags' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ss_size' type-id='type-id-19' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='30' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='stack_t' type-id='type-id-1055' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='31' column='1' id='type-id-38'/> - <typedef-decl name='ino_t' type-id='type-id-83' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='49' column='1' id='type-id-967'/> - <typedef-decl name='dev_t' type-id='type-id-187' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='59' column='1' id='type-id-966'/> - <typedef-decl name='wchar_t' type-id='type-id-8' filepath='/usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h' line='321' column='1' id='type-id-422'/> - <pointer-type-def type-id='type-id-832' size-in-bits='64' id='type-id-570'/> - <qualified-type-def type-id='type-id-229' restrict='yes' id='type-id-412'/> - <pointer-type-def type-id='type-id-621' size-in-bits='64' id='type-id-573'/> - <pointer-type-def type-id='type-id-758' size-in-bits='64' id='type-id-835'/> - <pointer-type-def type-id='type-id-1012' size-in-bits='64' id='type-id-328'/> - <pointer-type-def type-id='type-id-726' size-in-bits='64' id='type-id-829'/> - <pointer-type-def type-id='type-id-348' size-in-bits='64' id='type-id-346'/> - <pointer-type-def type-id='type-id-343' size-in-bits='64' id='type-id-340'/> - <pointer-type-def type-id='type-id-349' size-in-bits='64' id='type-id-347'/> - <pointer-type-def type-id='type-id-733' size-in-bits='64' id='type-id-848'/> - <pointer-type-def type-id='type-id-1013' size-in-bits='64' id='type-id-365'/> - <pointer-type-def type-id='type-id-735' size-in-bits='64' id='type-id-310'/> - <pointer-type-def type-id='type-id-852' size-in-bits='64' id='type-id-855'/> - <pointer-type-def type-id='type-id-897' size-in-bits='64' id='type-id-900'/> - <pointer-type-def type-id='type-id-867' size-in-bits='64' id='type-id-830'/> - <pointer-type-def type-id='type-id-991' size-in-bits='64' id='type-id-20'/> - <pointer-type-def type-id='type-id-746' size-in-bits='64' id='type-id-249'/> - <pointer-type-def type-id='type-id-400' size-in-bits='64' id='type-id-390'/> - <pointer-type-def type-id='type-id-1056' size-in-bits='64' id='type-id-727'/> - <pointer-type-def type-id='type-id-1057' size-in-bits='64' id='type-id-779'/> - <pointer-type-def type-id='type-id-1058' size-in-bits='64' id='type-id-783'/> - <pointer-type-def type-id='type-id-1014' size-in-bits='64' id='type-id-424'/> - <pointer-type-def type-id='type-id-941' size-in-bits='64' id='type-id-177'/> - <pointer-type-def type-id='type-id-792' size-in-bits='64' id='type-id-587'/> - <pointer-type-def type-id='type-id-250' size-in-bits='64' id='type-id-440'/> - <pointer-type-def type-id='type-id-752' size-in-bits='64' id='type-id-262'/> - <pointer-type-def type-id='type-id-622' size-in-bits='64' id='type-id-593'/> - <pointer-type-def type-id='type-id-767' size-in-bits='64' id='type-id-768'/> - <pointer-type-def type-id='type-id-711' size-in-bits='64' id='type-id-720'/> - <pointer-type-def type-id='type-id-713' size-in-bits='64' id='type-id-718'/> - <pointer-type-def type-id='type-id-715' size-in-bits='64' id='type-id-721'/> - <pointer-type-def type-id='type-id-782' size-in-bits='64' id='type-id-1059'/> - <pointer-type-def type-id='type-id-369' size-in-bits='64' id='type-id-376'/> - <pointer-type-def type-id='type-id-371' size-in-bits='64' id='type-id-375'/> - <pointer-type-def type-id='type-id-774' size-in-bits='64' id='type-id-778'/> - <pointer-type-def type-id='type-id-1004' size-in-bits='64' id='type-id-1011'/> - <pointer-type-def type-id='type-id-979' size-in-bits='64' id='type-id-980'/> - <pointer-type-def type-id='type-id-707' size-in-bits='64' id='type-id-850'/> - <pointer-type-def type-id='type-id-908' size-in-bits='64' id='type-id-1060'/> - <pointer-type-def type-id='type-id-1061' size-in-bits='64' id='type-id-917'/> - <pointer-type-def type-id='type-id-912' size-in-bits='64' id='type-id-926'/> - <pointer-type-def type-id='type-id-902' size-in-bits='64' id='type-id-903'/> - <pointer-type-def type-id='type-id-904' size-in-bits='64' id='type-id-907'/> - <pointer-type-def type-id='type-id-905' size-in-bits='64' id='type-id-922'/> - <pointer-type-def type-id='type-id-1035' size-in-bits='64' id='type-id-1036'/> - <pointer-type-def type-id='type-id-770' size-in-bits='64' id='type-id-771'/> - <pointer-type-def type-id='type-id-857' size-in-bits='64' id='type-id-824'/> - <pointer-type-def type-id='type-id-740' size-in-bits='64' id='type-id-924'/> - <pointer-type-def type-id='type-id-772' size-in-bits='64' id='type-id-773'/> - <pointer-type-def type-id='type-id-942' size-in-bits='64' id='type-id-943'/> - <pointer-type-def type-id='type-id-956' size-in-bits='64' id='type-id-606'/> - <pointer-type-def type-id='type-id-957' size-in-bits='64' id='type-id-609'/> - <pointer-type-def type-id='type-id-951' size-in-bits='64' id='type-id-611'/> - <pointer-type-def type-id='type-id-802' size-in-bits='64' id='type-id-803'/> - <pointer-type-def type-id='type-id-805' size-in-bits='64' id='type-id-1062'/> - <pointer-type-def type-id='type-id-1062' size-in-bits='64' id='type-id-808'/> - <pointer-type-def type-id='type-id-1063' size-in-bits='64' id='type-id-1064'/> - <qualified-type-def type-id='type-id-15' restrict='yes' id='type-id-183'/> - <pointer-type-def type-id='type-id-623' size-in-bits='64' id='type-id-822'/> - <pointer-type-def type-id='type-id-430' size-in-bits='64' id='type-id-753'/> - <pointer-type-def type-id='type-id-251' size-in-bits='64' id='type-id-182'/> - <pointer-type-def type-id='type-id-838' size-in-bits='64' id='type-id-842'/> - <pointer-type-def type-id='type-id-1065' size-in-bits='64' id='type-id-1066'/> - <pointer-type-def type-id='type-id-1067' size-in-bits='64' id='type-id-765'/> - <pointer-type-def type-id='type-id-1068' size-in-bits='64' id='type-id-786'/> - <pointer-type-def type-id='type-id-1069' size-in-bits='64' id='type-id-754'/> - <pointer-type-def type-id='type-id-1070' size-in-bits='64' id='type-id-791'/> - <pointer-type-def type-id='type-id-1071' size-in-bits='64' id='type-id-1007'/> - <pointer-type-def type-id='type-id-1072' size-in-bits='64' id='type-id-724'/> - <pointer-type-def type-id='type-id-1073' size-in-bits='64' id='type-id-731'/> - <pointer-type-def type-id='type-id-1074' size-in-bits='64' id='type-id-739'/> - <pointer-type-def type-id='type-id-1075' size-in-bits='64' id='type-id-1006'/> - <pointer-type-def type-id='type-id-1076' size-in-bits='64' id='type-id-814'/> - <pointer-type-def type-id='type-id-190' size-in-bits='64' id='type-id-78'/> - <pointer-type-def type-id='type-id-947' size-in-bits='64' id='type-id-950'/> - <pointer-type-def type-id='type-id-976' size-in-bits='64' id='type-id-975'/> - <pointer-type-def type-id='type-id-946' size-in-bits='64' id='type-id-949'/> - <pointer-type-def type-id='type-id-982' size-in-bits='64' id='type-id-933'/> - <pointer-type-def type-id='type-id-1003' size-in-bits='64' id='type-id-640'/> - <pointer-type-def type-id='type-id-1042' size-in-bits='64' id='type-id-189'/> - <pointer-type-def type-id='type-id-998' size-in-bits='64' id='type-id-1000'/> - <pointer-type-def type-id='type-id-1077' size-in-bits='64' id='type-id-913'/> - <pointer-type-def type-id='type-id-325' size-in-bits='64' id='type-id-717'/> - <pointer-type-def type-id='type-id-230' size-in-bits='64' id='type-id-227'/> - <pointer-type-def type-id='type-id-1078' size-in-bits='64' id='type-id-1016'/> - <pointer-type-def type-id='type-id-1079' size-in-bits='64' id='type-id-1027'/> - <pointer-type-def type-id='type-id-1080' size-in-bits='64' id='type-id-764'/> - <pointer-type-def type-id='type-id-1081' size-in-bits='64' id='type-id-757'/> - <pointer-type-def type-id='type-id-1082' size-in-bits='64' id='type-id-819'/> - <pointer-type-def type-id='type-id-1083' size-in-bits='64' id='type-id-818'/> - <pointer-type-def type-id='type-id-1084' size-in-bits='64' id='type-id-921'/> - <pointer-type-def type-id='type-id-1085' size-in-bits='64' id='type-id-756'/> - <pointer-type-def type-id='type-id-1086' size-in-bits='64' id='type-id-762'/> - <pointer-type-def type-id='type-id-1087' size-in-bits='64' id='type-id-763'/> - <qualified-type-def type-id='type-id-993' volatile='yes' id='type-id-698'/> - <qualified-type-def type-id='type-id-994' volatile='yes' id='type-id-992'/> - <pointer-type-def type-id='type-id-422' size-in-bits='64' id='type-id-52'/> - <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-235'/> - <class-decl name='PyAsyncGenASend' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-621'/> - <class-decl name='_PyAsyncGenWrappedValue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-622'/> - <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-623'/> - <function-decl name='PyEval_SaveThread' mangled-name='PyEval_SaveThread' filepath='./Include/ceval.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SaveThread'> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyEval_RestoreThread' mangled-name='PyEval_RestoreThread' filepath='./Include/ceval.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_RestoreThread'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMem_RawRealloc' mangled-name='PyMem_RawRealloc' filepath='./Include/cpython/pymem.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawRealloc'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyMem_RawFree' mangled-name='PyMem_RawFree' filepath='./Include/cpython/pymem.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawFree'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <var-decl name='_PyOS_ReadlineTState' type-id='type-id-177' mangled-name='_PyOS_ReadlineTState' visibility='default' filepath='./Include/cpython/pythonrun.h' line='120' column='1' elf-symbol-id='_PyOS_ReadlineTState'/> - <var-decl name='PyOS_ReadlineFunctionPointer' type-id='type-id-1064' mangled-name='PyOS_ReadlineFunctionPointer' visibility='default' filepath='./Include/cpython/pythonrun.h' line='121' column='1' elf-symbol-id='PyOS_ReadlineFunctionPointer'/> - <function-decl name='_PyOS_InterruptOccurred' mangled-name='_PyOS_InterruptOccurred' filepath='./Include/internal/pycore_pystate.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_InterruptOccurred'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_CheckSignals' mangled-name='PyErr_CheckSignals' filepath='./Include/pyerrors.h' line='239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_CheckSignals'> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='PyOS_InputHook' type-id='type-id-1066' mangled-name='PyOS_InputHook' visibility='default' filepath='./Include/pythonrun.h' line='22' column='1' elf-symbol-id='PyOS_InputHook'/> - <function-decl name='PyThread_allocate_lock' mangled-name='PyThread_allocate_lock' filepath='./Include/pythread.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_allocate_lock'> - <return type-id='type-id-801'/> - </function-decl> - <function-decl name='PyThread_acquire_lock' mangled-name='PyThread_acquire_lock' filepath='./Include/pythread.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock'> - <parameter type-id='type-id-801'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_release_lock' mangled-name='PyThread_release_lock' filepath='./Include/pythread.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_release_lock'> - <parameter type-id='type-id-801'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='fflush' filepath='/usr/include/stdio.h' line='230' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fgets' filepath='/usr/include/stdio.h' line='592' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-412'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='clearerr' filepath='/usr/include/stdio.h' line='786' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='feof' filepath='/usr/include/stdio.h' line='788' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fileno' filepath='/usr/include/stdio.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='isatty' filepath='/usr/include/unistd.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyOS_Readline' mangled-name='PyOS_Readline' filepath='Parser/myreadline.c' line='364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_Readline'> - <parameter type-id='type-id-229' name='sys_stdin' filepath='Parser/myreadline.c' line='364' column='1'/> - <parameter type-id='type-id-229' name='sys_stdout' filepath='Parser/myreadline.c' line='364' column='1'/> - <parameter type-id='type-id-12' name='prompt' filepath='Parser/myreadline.c' line='364' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1056'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1057'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-375'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1058'> - <parameter type-id='type-id-1059'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1061'> - <parameter type-id='type-id-926'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-1060'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1063'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1065'> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1067'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-365'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1068'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-1059'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1069'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1070'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1071'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-440'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1072'> - <parameter type-id='type-id-722'/> - <parameter type-id='type-id-328'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1073'> - <parameter type-id='type-id-729'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1074'> - <parameter type-id='type-id-737'/> - <parameter type-id='type-id-310'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1075'> - <parameter type-id='type-id-250'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1076'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1077'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-910'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1078'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1079'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-189'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1080'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1081'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-46'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1082'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-95'/> - <parameter type-id='type-id-328'/> - <return type-id='type-id-46'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1083'> - <return type-id='type-id-22'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1084'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1085'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1086'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1087'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1088'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1089'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Parser/parser.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='asdl_seq' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1090' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='28' column='1' id='type-id-1091'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='29' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_seq' type-id='type-id-1091' filepath='./Include/internal/pycore_asdl.h' line='30' column='1' id='type-id-1090'/> - <enum-decl name='_cmpop' filepath='./Include/internal/pycore_ast.h' line='31' column='1' id='type-id-1092'> - <underlying-type type-id='type-id-24'/> - <enumerator name='Eq' value='1'/> - <enumerator name='NotEq' value='2'/> - <enumerator name='Lt' value='3'/> - <enumerator name='LtE' value='4'/> - <enumerator name='Gt' value='5'/> - <enumerator name='GtE' value='6'/> - <enumerator name='Is' value='7'/> - <enumerator name='IsNot' value='8'/> - <enumerator name='In' value='9'/> - <enumerator name='NotIn' value='10'/> - </enum-decl> - <typedef-decl name='cmpop_ty' type-id='type-id-1092' filepath='./Include/internal/pycore_ast.h' line='32' column='1' id='type-id-1093'/> - <class-decl name='CmpopExprPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1094' visibility='default' filepath='Parser/pegen.h' line='85' column='1' id='type-id-1095'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cmpop' type-id='type-id-1093' visibility='default' filepath='Parser/pegen.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='expr' type-id='type-id-502' visibility='default' filepath='Parser/pegen.h' line='87' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='CmpopExprPair' type-id='type-id-1095' filepath='Parser/pegen.h' line='88' column='1' id='type-id-1094'/> - <class-decl name='KeyValuePair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1096' visibility='default' filepath='Parser/pegen.h' line='90' column='1' id='type-id-1097'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-502' visibility='default' filepath='Parser/pegen.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='Parser/pegen.h' line='92' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='KeyValuePair' type-id='type-id-1097' filepath='Parser/pegen.h' line='93' column='1' id='type-id-1096'/> - <class-decl name='KeyPatternPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1098' visibility='default' filepath='Parser/pegen.h' line='95' column='1' id='type-id-1099'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-502' visibility='default' filepath='Parser/pegen.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='pattern' type-id='type-id-450' visibility='default' filepath='Parser/pegen.h' line='97' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='KeyPatternPair' type-id='type-id-1099' filepath='Parser/pegen.h' line='98' column='1' id='type-id-1098'/> - <class-decl name='NameDefaultPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1100' visibility='default' filepath='Parser/pegen.h' line='100' column='1' id='type-id-1101'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-567' visibility='default' filepath='Parser/pegen.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='Parser/pegen.h' line='102' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='NameDefaultPair' type-id='type-id-1101' filepath='Parser/pegen.h' line='103' column='1' id='type-id-1100'/> - <class-decl name='SlashWithDefault' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1102' visibility='default' filepath='Parser/pegen.h' line='105' column='1' id='type-id-1103'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='plain_names' type-id='type-id-565' visibility='default' filepath='Parser/pegen.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='names_with_defaults' type-id='type-id-1104' visibility='default' filepath='Parser/pegen.h' line='107' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='SlashWithDefault' type-id='type-id-1103' filepath='Parser/pegen.h' line='108' column='1' id='type-id-1102'/> - <class-decl name='StarEtc' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1105' visibility='default' filepath='Parser/pegen.h' line='110' column='1' id='type-id-1106'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='vararg' type-id='type-id-567' visibility='default' filepath='Parser/pegen.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='kwonlyargs' type-id='type-id-1104' visibility='default' filepath='Parser/pegen.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='kwarg' type-id='type-id-567' visibility='default' filepath='Parser/pegen.h' line='113' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='StarEtc' type-id='type-id-1106' filepath='Parser/pegen.h' line='114' column='1' id='type-id-1105'/> - <class-decl name='AugOperator' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1107' visibility='default' filepath='Parser/pegen.h' line='116' column='1' id='type-id-1108'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-530' visibility='default' filepath='Parser/pegen.h' line='116' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='AugOperator' type-id='type-id-1108' filepath='Parser/pegen.h' line='116' column='1' id='type-id-1107'/> - <class-decl name='KeywordOrStarred' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1109' visibility='default' filepath='Parser/pegen.h' line='117' column='1' id='type-id-1110'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='element' type-id='type-id-22' visibility='default' filepath='Parser/pegen.h' line='118' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='is_keyword' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='119' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='KeywordOrStarred' type-id='type-id-1110' filepath='Parser/pegen.h' line='120' column='1' id='type-id-1109'/> - <class-decl name='ResultTokenWithMetadata' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1111' visibility='default' filepath='Parser/pegen.h' line='122' column='1' id='type-id-1112'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='result' type-id='type-id-22' visibility='default' filepath='Parser/pegen.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='metadata' type-id='type-id-2' visibility='default' filepath='Parser/pegen.h' line='124' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='ResultTokenWithMetadata' type-id='type-id-1112' filepath='Parser/pegen.h' line='125' column='1' id='type-id-1111'/> - <enum-decl name='TARGETS_TYPE' naming-typedef-id='type-id-1113' filepath='Parser/pegen.h' line='156' column='1' id='type-id-1114'> - <underlying-type type-id='type-id-24'/> - <enumerator name='STAR_TARGETS' value='0'/> - <enumerator name='DEL_TARGETS' value='1'/> - <enumerator name='FOR_TARGETS' value='2'/> - </enum-decl> - <typedef-decl name='TARGETS_TYPE' type-id='type-id-1114' filepath='Parser/pegen.h' line='160' column='1' id='type-id-1113'/> - <pointer-type-def type-id='type-id-1107' size-in-bits='64' id='type-id-1115'/> - <pointer-type-def type-id='type-id-1094' size-in-bits='64' id='type-id-1116'/> - <pointer-type-def type-id='type-id-1098' size-in-bits='64' id='type-id-1117'/> - <pointer-type-def type-id='type-id-1096' size-in-bits='64' id='type-id-1118'/> - <pointer-type-def type-id='type-id-1109' size-in-bits='64' id='type-id-1119'/> - <pointer-type-def type-id='type-id-1100' size-in-bits='64' id='type-id-1120'/> - <pointer-type-def type-id='type-id-1111' size-in-bits='64' id='type-id-1121'/> - <pointer-type-def type-id='type-id-1102' size-in-bits='64' id='type-id-1122'/> - <pointer-type-def type-id='type-id-1105' size-in-bits='64' id='type-id-1123'/> - <pointer-type-def type-id='type-id-1124' size-in-bits='64' id='type-id-1125'/> - <pointer-type-def type-id='type-id-1090' size-in-bits='64' id='type-id-1104'/> - <pointer-type-def type-id='type-id-1126' size-in-bits='64' id='type-id-1127'/> - <pointer-type-def type-id='type-id-1128' size-in-bits='64' id='type-id-1129'/> - <pointer-type-def type-id='type-id-1130' size-in-bits='64' id='type-id-1131'/> - <class-decl name='tok_state' size-in-bits='138240' is-struct='yes' visibility='default' filepath='Parser/tokenizer.h' line='68' column='1' id='type-id-1132'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buf' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='cur' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='inp' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fp_interactive' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='interactive_src_start' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='interactive_src_end' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='end' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='done' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='fp' type-id='type-id-229' visibility='default' filepath='Parser/tokenizer.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='tabsize' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='672'> - <var-decl name='indent' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='indstack' type-id='type-id-1133' visibility='default' filepath='Parser/tokenizer.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3904'> - <var-decl name='atbol' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3936'> - <var-decl name='pendin' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='prompt' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4032'> - <var-decl name='nextprompt' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4128'> - <var-decl name='first_lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4160'> - <var-decl name='starting_col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4192'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4224'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4256'> - <var-decl name='parenstack' type-id='type-id-1134' visibility='default' filepath='Parser/tokenizer.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5856'> - <var-decl name='parenlinenostack' type-id='type-id-1135' visibility='default' filepath='Parser/tokenizer.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12256'> - <var-decl name='parencolstack' type-id='type-id-1135' visibility='default' filepath='Parser/tokenizer.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18688'> - <var-decl name='filename' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18752'> - <var-decl name='altindstack' type-id='type-id-1133' visibility='default' filepath='Parser/tokenizer.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21952'> - <var-decl name='decoding_state' type-id='type-id-1136' visibility='default' filepath='Parser/tokenizer.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21984'> - <var-decl name='decoding_erred' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='103' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22016'> - <var-decl name='encoding' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22080'> - <var-decl name='cont_line' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='105' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22144'> - <var-decl name='line_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22208'> - <var-decl name='multi_line_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22272'> - <var-decl name='decoding_readline' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22336'> - <var-decl name='decoding_buffer' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22400'> - <var-decl name='readline' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22464'> - <var-decl name='enc' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='113' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22528'> - <var-decl name='str' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22592'> - <var-decl name='input' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22656'> - <var-decl name='type_comments' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22688'> - <var-decl name='async_hacks' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22720'> - <var-decl name='async_def' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22752'> - <var-decl name='async_def_indent' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22784'> - <var-decl name='async_def_nl' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22816'> - <var-decl name='interactive_underflow' type-id='type-id-1137' visibility='default' filepath='Parser/tokenizer.h' line='126' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22848'> - <var-decl name='report_warnings' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22912'> - <var-decl name='tok_mode_stack' type-id='type-id-1138' visibility='default' filepath='Parser/tokenizer.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138112'> - <var-decl name='tok_mode_stack_index' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138144'> - <var-decl name='tok_extra_tokens' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='131' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138176'> - <var-decl name='comment_newline' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138208'> - <var-decl name='implicit_newline' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='133' column='1'/> - </data-member> - </class-decl> - <function-decl name='_PyAST_Interactive' filepath='./Include/internal/pycore_ast.h' line='681' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyAST_Expression' filepath='./Include/internal/pycore_ast.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyAST_FunctionType' filepath='./Include/internal/pycore_ast.h' line='683' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyAST_Return' filepath='./Include/internal/pycore_ast.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Delete' filepath='./Include/internal/pycore_ast.h' line='703' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Assign' filepath='./Include/internal/pycore_ast.h' line='705' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_TypeAlias' filepath='./Include/internal/pycore_ast.h' line='708' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-528'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_AugAssign' filepath='./Include/internal/pycore_ast.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-530'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_AnnAssign' filepath='./Include/internal/pycore_ast.h' line='714' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_For' filepath='./Include/internal/pycore_ast.h' line='717' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_AsyncFor' filepath='./Include/internal/pycore_ast.h' line='721' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_While' filepath='./Include/internal/pycore_ast.h' line='725' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_If' filepath='./Include/internal/pycore_ast.h' line='728' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_With' filepath='./Include/internal/pycore_ast.h' line='731' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-531'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_AsyncWith' filepath='./Include/internal/pycore_ast.h' line='734' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-531'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Match' filepath='./Include/internal/pycore_ast.h' line='737' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-532'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Raise' filepath='./Include/internal/pycore_ast.h' line='740' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Try' filepath='./Include/internal/pycore_ast.h' line='742' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-533'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_TryStar' filepath='./Include/internal/pycore_ast.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-533'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Assert' filepath='./Include/internal/pycore_ast.h' line='750' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Import' filepath='./Include/internal/pycore_ast.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-534'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_ImportFrom' filepath='./Include/internal/pycore_ast.h' line='754' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-534'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Global' filepath='./Include/internal/pycore_ast.h' line='757' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-535'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Nonlocal' filepath='./Include/internal/pycore_ast.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-535'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Expr' filepath='./Include/internal/pycore_ast.h' line='762' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Pass' filepath='./Include/internal/pycore_ast.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Break' filepath='./Include/internal/pycore_ast.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_Continue' filepath='./Include/internal/pycore_ast.h' line='768' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyAST_BoolOp' filepath='./Include/internal/pycore_ast.h' line='770' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1139'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_NamedExpr' filepath='./Include/internal/pycore_ast.h' line='773' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_BinOp' filepath='./Include/internal/pycore_ast.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-530'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_UnaryOp' filepath='./Include/internal/pycore_ast.h' line='779' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1140'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Lambda' filepath='./Include/internal/pycore_ast.h' line='782' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-526'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_IfExp' filepath='./Include/internal/pycore_ast.h' line='785' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Dict' filepath='./Include/internal/pycore_ast.h' line='788' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Set' filepath='./Include/internal/pycore_ast.h' line='791' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_ListComp' filepath='./Include/internal/pycore_ast.h' line='793' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1141'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_SetComp' filepath='./Include/internal/pycore_ast.h' line='796' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1141'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_DictComp' filepath='./Include/internal/pycore_ast.h' line='799' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1141'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_GeneratorExp' filepath='./Include/internal/pycore_ast.h' line='802' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1141'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Await' filepath='./Include/internal/pycore_ast.h' line='805' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Yield' filepath='./Include/internal/pycore_ast.h' line='807' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_YieldFrom' filepath='./Include/internal/pycore_ast.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Compare' filepath='./Include/internal/pycore_ast.h' line='811' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-564'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Slice' filepath='./Include/internal/pycore_ast.h' line='843' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_comprehension' filepath='./Include/internal/pycore_ast.h' line='846' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-1142'/> - </function-decl> - <function-decl name='_PyAST_ExceptHandler' filepath='./Include/internal/pycore_ast.h' line='849' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-446'/> - </function-decl> - <function-decl name='_PyAST_keyword' filepath='./Include/internal/pycore_ast.h' line='860' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-1143'/> - </function-decl> - <function-decl name='_PyAST_withitem' filepath='./Include/internal/pycore_ast.h' line='866' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-459'/> - </function-decl> - <function-decl name='_PyAST_match_case' filepath='./Include/internal/pycore_ast.h' line='868' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-450'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-500'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-448'/> - </function-decl> - <function-decl name='_PyAST_MatchValue' filepath='./Include/internal/pycore_ast.h' line='870' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchSingleton' filepath='./Include/internal/pycore_ast.h' line='872' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-552'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchSequence' filepath='./Include/internal/pycore_ast.h' line='875' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-553'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchMapping' filepath='./Include/internal/pycore_ast.h' line='878' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-553'/> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchClass' filepath='./Include/internal/pycore_ast.h' line='882' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-553'/> - <parameter type-id='type-id-535'/> - <parameter type-id='type-id-553'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchStar' filepath='./Include/internal/pycore_ast.h' line='886' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchAs' filepath='./Include/internal/pycore_ast.h' line='888' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-450'/> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_MatchOr' filepath='./Include/internal/pycore_ast.h' line='891' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-553'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-450'/> - </function-decl> - <function-decl name='_PyAST_TypeVar' filepath='./Include/internal/pycore_ast.h' line='895' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-456'/> - </function-decl> - <function-decl name='_PyAST_ParamSpec' filepath='./Include/internal/pycore_ast.h' line='898' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-456'/> - </function-decl> - <function-decl name='_PyAST_TypeVarTuple' filepath='./Include/internal/pycore_ast.h' line='900' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-456'/> - </function-decl> - <function-decl name='_PyPegen_insert_memo' filepath='Parser/pegen.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_update_memo' filepath='Parser/pegen.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_is_memoized' filepath='Parser/pegen.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_lookahead_with_name' filepath='Parser/pegen.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1127'/> - <parameter type-id='type-id-568'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_lookahead_with_int' filepath='Parser/pegen.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1125'/> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_lookahead_with_string' filepath='Parser/pegen.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1129'/> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_lookahead' filepath='Parser/pegen.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1131'/> - <parameter type-id='type-id-568'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_expect_token' filepath='Parser/pegen.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-569'/> - </function-decl> - <function-decl name='_PyPegen_expect_forced_token' filepath='Parser/pegen.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-569'/> - </function-decl> - <function-decl name='_PyPegen_expect_soft_keyword' filepath='Parser/pegen.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_soft_keyword_token' filepath='Parser/pegen.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_get_last_nonnwhitespace_token' filepath='Parser/pegen.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-569'/> - </function-decl> - <function-decl name='_PyPegen_name_token' filepath='Parser/pegen.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_number_token' filepath='Parser/pegen.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_string_token' filepath='Parser/pegen.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_Pypegen_stack_overflow' filepath='Parser/pegen.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPegen_get_invalid_target' filepath='Parser/pegen.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1113'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_get_expr_name' filepath='Parser/pegen.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_PyPegen_dummy_name' filepath='Parser/pegen.h' line='248' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_seq_last_item' filepath='Parser/pegen.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_seq_first_item' filepath='Parser/pegen.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_new_type_comment' filepath='Parser/pegen.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyPegen_add_type_comment_to_arg' filepath='Parser/pegen.h' line='295' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-567'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-567'/> - </function-decl> - <function-decl name='_PyPegen_singleton_seq' filepath='Parser/pegen.h' line='297' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-1104'/> - </function-decl> - <function-decl name='_PyPegen_seq_insert_in_front' filepath='Parser/pegen.h' line='298' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-1104'/> - </function-decl> - <function-decl name='_PyPegen_seq_append_to_end' filepath='Parser/pegen.h' line='299' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-1104'/> - </function-decl> - <function-decl name='_PyPegen_seq_flatten' filepath='Parser/pegen.h' line='300' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-1104'/> - </function-decl> - <function-decl name='_PyPegen_join_names_with_dot' filepath='Parser/pegen.h' line='301' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_seq_count_dots' filepath='Parser/pegen.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_alias_for_star' filepath='Parser/pegen.h' line='303' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-444'/> - </function-decl> - <function-decl name='_PyPegen_map_names_to_ids' filepath='Parser/pegen.h' line='304' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-503'/> - <return type-id='type-id-535'/> - </function-decl> - <function-decl name='_PyPegen_cmpop_expr_pair' filepath='Parser/pegen.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1093'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-1116'/> - </function-decl> - <function-decl name='_PyPegen_get_cmpops' filepath='Parser/pegen.h' line='306' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-564'/> - </function-decl> - <function-decl name='_PyPegen_get_exprs' filepath='Parser/pegen.h' line='307' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_PyPegen_set_expr_context' filepath='Parser/pegen.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-566'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_key_value_pair' filepath='Parser/pegen.h' line='309' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-1118'/> - </function-decl> - <function-decl name='_PyPegen_get_keys' filepath='Parser/pegen.h' line='310' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_PyPegen_get_values' filepath='Parser/pegen.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_PyPegen_key_pattern_pair' filepath='Parser/pegen.h' line='312' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-450'/> - <return type-id='type-id-1117'/> - </function-decl> - <function-decl name='_PyPegen_get_pattern_keys' filepath='Parser/pegen.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_PyPegen_get_patterns' filepath='Parser/pegen.h' line='314' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-553'/> - </function-decl> - <function-decl name='_PyPegen_name_default_pair' filepath='Parser/pegen.h' line='315' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-567'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-1120'/> - </function-decl> - <function-decl name='_PyPegen_slash_with_default' filepath='Parser/pegen.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-1122'/> - </function-decl> - <function-decl name='_PyPegen_star_etc' filepath='Parser/pegen.h' line='317' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-567'/> - <parameter type-id='type-id-1104'/> - <parameter type-id='type-id-567'/> - <return type-id='type-id-1123'/> - </function-decl> - <function-decl name='_PyPegen_make_arguments' filepath='Parser/pegen.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-1122'/> - <parameter type-id='type-id-565'/> - <parameter type-id='type-id-1104'/> - <parameter type-id='type-id-1123'/> - <return type-id='type-id-526'/> - </function-decl> - <function-decl name='_PyPegen_empty_arguments' filepath='Parser/pegen.h' line='320' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-526'/> - </function-decl> - <function-decl name='_PyPegen_formatted_value' filepath='Parser/pegen.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-569'/> - <parameter type-id='type-id-1121'/> - <parameter type-id='type-id-1121'/> - <parameter type-id='type-id-569'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_augoperator' filepath='Parser/pegen.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-530'/> - <return type-id='type-id-1115'/> - </function-decl> - <function-decl name='_PyPegen_function_def_decorators' filepath='Parser/pegen.h' line='324' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-452'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyPegen_class_def_decorators' filepath='Parser/pegen.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-452'/> - <return type-id='type-id-452'/> - </function-decl> - <function-decl name='_PyPegen_keyword_or_starred' filepath='Parser/pegen.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-1119'/> - </function-decl> - <function-decl name='_PyPegen_seq_extract_starred_exprs' filepath='Parser/pegen.h' line='327' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-503'/> - </function-decl> - <function-decl name='_PyPegen_seq_delete_starred_exprs' filepath='Parser/pegen.h' line='328' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-529'/> - </function-decl> - <function-decl name='_PyPegen_collect_call_seqs' filepath='Parser/pegen.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-1104'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_constant_from_token' filepath='Parser/pegen.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_decoded_constant_from_token' filepath='Parser/pegen.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_constant_from_string' filepath='Parser/pegen.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_concatenate_strings' filepath='Parser/pegen.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_ensure_imaginary' filepath='Parser/pegen.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_ensure_real' filepath='Parser/pegen.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_join_sequences' filepath='Parser/pegen.h' line='339' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-1104'/> - <parameter type-id='type-id-1104'/> - <return type-id='type-id-1104'/> - </function-decl> - <function-decl name='_PyPegen_check_barry_as_flufl' filepath='Parser/pegen.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_check_legacy_stmt' filepath='Parser/pegen.h' line='341' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_check_fstring_conversion' filepath='Parser/pegen.h' line='342' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-1121'/> - </function-decl> - <function-decl name='_PyPegen_setup_full_format_spec' filepath='Parser/pegen.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-1121'/> - </function-decl> - <function-decl name='_PyPegen_make_module' filepath='Parser/pegen.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-500'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyPegen_arguments_parsing_error' filepath='Parser/pegen.h' line='346' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_get_last_comprehension_item' filepath='Parser/pegen.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1142'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyPegen_nonparen_genexp_in_call' filepath='Parser/pegen.h' line='348' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-502'/> - <parameter type-id='type-id-1141'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_interactive_exit' filepath='Parser/pegen.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-500'/> - </function-decl> - <function-decl name='_PyPegen_joined_str' filepath='Parser/pegen.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <parameter type-id='type-id-503'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-502'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1124'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-569'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1126'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-502'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1128'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-502'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1130'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-22'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Parser/peg_api.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyCompilerFlags' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1144' visibility='default' filepath='./Include/cpython/compile.h' line='26' column='1' id='type-id-1145'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='cf_flags' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='cf_feature_version' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='28' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyCompilerFlags' type-id='type-id-1145' filepath='./Include/cpython/compile.h' line='29' column='1' id='type-id-1144'/> - <pointer-type-def type-id='type-id-1144' size-in-bits='64' id='type-id-208'/> - <function-decl name='PySys_Audit' mangled-name='PySys_Audit' filepath='./Include/cpython/sysmodule.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_Audit'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_run_parser_from_file_pointer' filepath='Parser/pegen.h' line='354' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='_PyPegen_run_parser_from_string' filepath='Parser/pegen.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-468'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/pegen.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-567' size-in-bits='64' id='type-id-1146'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='8' id='type-id-702'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='1600' id='type-id-1134'> - <subrange length='200' type-id='type-id-28' id='type-id-644'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='160' id='type-id-1147'> - <subrange length='20' type-id='type-id-28' id='type-id-589'/> - </array-type-def> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1148'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1149'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1150'/> - <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-1151'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='gp_offset' type-id='type-id-95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='fp_offset' type-id='type-id-95' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='overflow_arg_area' type-id='type-id-22' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='reg_save_area' type-id='type-id-22' visibility='default'/> - </data-member> - </class-decl> - <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1152'/> - <array-type-def dimensions='1' type-id='type-id-1142' size-in-bits='64' id='type-id-1153'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <type-decl name='double' size-in-bits='64' id='type-id-251'/> - <array-type-def dimensions='1' type-id='type-id-502' size-in-bits='64' id='type-id-1154'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='3200' id='type-id-1133'> - <subrange length='100' type-id='type-id-28' id='type-id-1155'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='32' id='type-id-1156'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='6400' id='type-id-1135'> - <subrange length='200' type-id='type-id-28' id='type-id-644'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1143' size-in-bits='64' id='type-id-1157'> - <subrange length='1' type-id='type-id-28' id='type-id-443'/> - </array-type-def> - <type-decl name='long int' size-in-bits='64' id='type-id-47'/> - <type-decl name='signed char' size-in-bits='8' id='type-id-1037'/> - <array-type-def dimensions='1' type-id='type-id-1158' size-in-bits='115200' id='type-id-1138'> - <subrange length='150' type-id='type-id-28' id='type-id-1159'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-352' size-in-bits='64' id='type-id-1160'> - <subrange length='2' type-id='type-id-28' id='type-id-681'/> - </array-type-def> - <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-24'/> - <type-decl name='unsigned char' size-in-bits='8' id='type-id-85'/> - <type-decl name='unsigned int' size-in-bits='32' id='type-id-95'/> - <type-decl name='unsigned short int' size-in-bits='16' id='type-id-84'/> - <type-decl name='void' id='type-id-46'/> - <class-decl name='Py_complex' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-327' visibility='default' filepath='./Include/cpython/complexobject.h' line='5' column='1' id='type-id-1161'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='real' type-id='type-id-251' visibility='default' filepath='./Include/cpython/complexobject.h' line='6' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='imag' type-id='type-id-251' visibility='default' filepath='./Include/cpython/complexobject.h' line='7' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Py_complex' type-id='type-id-1161' filepath='./Include/cpython/complexobject.h' line='8' column='1' id='type-id-327'/> - <class-decl name='PyNumberMethods' size-in-bits='2304' is-struct='yes' naming-typedef-id='type-id-1162' visibility='default' filepath='./Include/cpython/object.h' line='59' column='1' id='type-id-1163'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='nb_add' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='nb_subtract' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='nb_multiply' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='nb_remainder' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='nb_divmod' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='nb_power' type-id='type-id-1165' visibility='default' filepath='./Include/cpython/object.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='nb_negative' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='nb_positive' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='nb_absolute' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='nb_bool' type-id='type-id-396' visibility='default' filepath='./Include/cpython/object.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='nb_invert' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='nb_lshift' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='nb_rshift' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='nb_and' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='nb_xor' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='nb_or' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='nb_int' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='nb_reserved' type-id='type-id-22' visibility='default' filepath='./Include/cpython/object.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='nb_float' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='nb_inplace_add' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='nb_inplace_subtract' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='nb_inplace_multiply' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='nb_inplace_remainder' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='nb_inplace_power' type-id='type-id-1165' visibility='default' filepath='./Include/cpython/object.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='nb_inplace_lshift' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='nb_inplace_rshift' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='90' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='nb_inplace_and' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='nb_inplace_xor' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='nb_inplace_or' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='nb_floor_divide' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='nb_true_divide' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='nb_inplace_floor_divide' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='nb_inplace_true_divide' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='nb_index' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='nb_matrix_multiply' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='nb_inplace_matrix_multiply' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='103' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyNumberMethods' type-id='type-id-1163' filepath='./Include/cpython/object.h' line='104' column='1' id='type-id-1162'/> - <class-decl name='PySequenceMethods' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-1167' visibility='default' filepath='./Include/cpython/object.h' line='106' column='1' id='type-id-1168'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='sq_length' type-id='type-id-1169' visibility='default' filepath='./Include/cpython/object.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='sq_concat' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='108' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='sq_repeat' type-id='type-id-1170' visibility='default' filepath='./Include/cpython/object.h' line='109' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='sq_item' type-id='type-id-1170' visibility='default' filepath='./Include/cpython/object.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='was_sq_slice' type-id='type-id-22' visibility='default' filepath='./Include/cpython/object.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='sq_ass_item' type-id='type-id-1171' visibility='default' filepath='./Include/cpython/object.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='was_sq_ass_slice' type-id='type-id-22' visibility='default' filepath='./Include/cpython/object.h' line='113' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='sq_contains' type-id='type-id-1172' visibility='default' filepath='./Include/cpython/object.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='sq_inplace_concat' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='116' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='sq_inplace_repeat' type-id='type-id-1170' visibility='default' filepath='./Include/cpython/object.h' line='117' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PySequenceMethods' type-id='type-id-1168' filepath='./Include/cpython/object.h' line='118' column='1' id='type-id-1167'/> - <class-decl name='PyMappingMethods' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1173' visibility='default' filepath='./Include/cpython/object.h' line='120' column='1' id='type-id-1174'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='mp_length' type-id='type-id-1169' visibility='default' filepath='./Include/cpython/object.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='mp_subscript' type-id='type-id-1164' visibility='default' filepath='./Include/cpython/object.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mp_ass_subscript' type-id='type-id-1175' visibility='default' filepath='./Include/cpython/object.h' line='123' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyMappingMethods' type-id='type-id-1174' filepath='./Include/cpython/object.h' line='124' column='1' id='type-id-1173'/> - <typedef-decl name='sendfunc' type-id='type-id-1176' filepath='./Include/cpython/object.h' line='126' column='1' id='type-id-1177'/> - <class-decl name='PyAsyncMethods' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1178' visibility='default' filepath='./Include/cpython/object.h' line='128' column='1' id='type-id-1179'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='am_await' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='am_aiter' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='am_anext' type-id='type-id-1166' visibility='default' filepath='./Include/cpython/object.h' line='131' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='am_send' type-id='type-id-1177' visibility='default' filepath='./Include/cpython/object.h' line='132' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyAsyncMethods' type-id='type-id-1179' filepath='./Include/cpython/object.h' line='133' column='1' id='type-id-1178'/> - <class-decl name='PyBufferProcs' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1180' visibility='default' filepath='./Include/cpython/object.h' line='135' column='1' id='type-id-1181'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='bf_getbuffer' type-id='type-id-434' visibility='default' filepath='./Include/cpython/object.h' line='136' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bf_releasebuffer' type-id='type-id-1182' visibility='default' filepath='./Include/cpython/object.h' line='137' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyBufferProcs' type-id='type-id-1181' filepath='./Include/cpython/object.h' line='138' column='1' id='type-id-1180'/> - <class-decl name='_typeobject' size-in-bits='3328' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='146' column='1' id='type-id-1183'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-321' visibility='default' filepath='./Include/cpython/object.h' line='147' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tp_name' type-id='type-id-12' visibility='default' filepath='./Include/cpython/object.h' line='148' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tp_basicsize' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='tp_itemsize' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='149' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='tp_dealloc' type-id='type-id-335' visibility='default' filepath='./Include/cpython/object.h' line='153' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='tp_vectorcall_offset' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='154' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='tp_getattr' type-id='type-id-1184' visibility='default' filepath='./Include/cpython/object.h' line='155' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='tp_setattr' type-id='type-id-1185' visibility='default' filepath='./Include/cpython/object.h' line='156' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='tp_as_async' type-id='type-id-1186' visibility='default' filepath='./Include/cpython/object.h' line='157' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='tp_repr' type-id='type-id-1187' visibility='default' filepath='./Include/cpython/object.h' line='159' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='tp_as_number' type-id='type-id-1188' visibility='default' filepath='./Include/cpython/object.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='tp_as_sequence' type-id='type-id-1189' visibility='default' filepath='./Include/cpython/object.h' line='164' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='tp_as_mapping' type-id='type-id-1190' visibility='default' filepath='./Include/cpython/object.h' line='165' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='tp_hash' type-id='type-id-1191' visibility='default' filepath='./Include/cpython/object.h' line='169' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='tp_call' type-id='type-id-1165' visibility='default' filepath='./Include/cpython/object.h' line='170' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='tp_str' type-id='type-id-1187' visibility='default' filepath='./Include/cpython/object.h' line='171' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='tp_getattro' type-id='type-id-1192' visibility='default' filepath='./Include/cpython/object.h' line='172' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='tp_setattro' type-id='type-id-1193' visibility='default' filepath='./Include/cpython/object.h' line='173' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='tp_as_buffer' type-id='type-id-1194' visibility='default' filepath='./Include/cpython/object.h' line='176' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='tp_flags' type-id='type-id-28' visibility='default' filepath='./Include/cpython/object.h' line='179' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='tp_doc' type-id='type-id-12' visibility='default' filepath='./Include/cpython/object.h' line='181' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='tp_traverse' type-id='type-id-395' visibility='default' filepath='./Include/cpython/object.h' line='185' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='tp_clear' type-id='type-id-396' visibility='default' filepath='./Include/cpython/object.h' line='188' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1600'> - <var-decl name='tp_richcompare' type-id='type-id-1195' visibility='default' filepath='./Include/cpython/object.h' line='192' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1664'> - <var-decl name='tp_weaklistoffset' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='195' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1728'> - <var-decl name='tp_iter' type-id='type-id-1196' visibility='default' filepath='./Include/cpython/object.h' line='198' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1792'> - <var-decl name='tp_iternext' type-id='type-id-1197' visibility='default' filepath='./Include/cpython/object.h' line='199' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1856'> - <var-decl name='tp_methods' type-id='type-id-337' visibility='default' filepath='./Include/cpython/object.h' line='202' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1920'> - <var-decl name='tp_members' type-id='type-id-336' visibility='default' filepath='./Include/cpython/object.h' line='203' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1984'> - <var-decl name='tp_getset' type-id='type-id-338' visibility='default' filepath='./Include/cpython/object.h' line='204' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2048'> - <var-decl name='tp_base' type-id='type-id-1' visibility='default' filepath='./Include/cpython/object.h' line='206' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2112'> - <var-decl name='tp_dict' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='207' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2176'> - <var-decl name='tp_descr_get' type-id='type-id-1198' visibility='default' filepath='./Include/cpython/object.h' line='208' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2240'> - <var-decl name='tp_descr_set' type-id='type-id-1199' visibility='default' filepath='./Include/cpython/object.h' line='209' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2304'> - <var-decl name='tp_dictoffset' type-id='type-id-14' visibility='default' filepath='./Include/cpython/object.h' line='210' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2368'> - <var-decl name='tp_init' type-id='type-id-1200' visibility='default' filepath='./Include/cpython/object.h' line='211' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2432'> - <var-decl name='tp_alloc' type-id='type-id-1201' visibility='default' filepath='./Include/cpython/object.h' line='212' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2496'> - <var-decl name='tp_new' type-id='type-id-1202' visibility='default' filepath='./Include/cpython/object.h' line='213' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2560'> - <var-decl name='tp_free' type-id='type-id-397' visibility='default' filepath='./Include/cpython/object.h' line='214' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2624'> - <var-decl name='tp_is_gc' type-id='type-id-396' visibility='default' filepath='./Include/cpython/object.h' line='215' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2688'> - <var-decl name='tp_bases' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='216' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2752'> - <var-decl name='tp_mro' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='217' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2816'> - <var-decl name='tp_cache' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='218' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2880'> - <var-decl name='tp_subclasses' type-id='type-id-22' visibility='default' filepath='./Include/cpython/object.h' line='219' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='2944'> - <var-decl name='tp_weaklist' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='220' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3008'> - <var-decl name='tp_del' type-id='type-id-335' visibility='default' filepath='./Include/cpython/object.h' line='221' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3072'> - <var-decl name='tp_version_tag' type-id='type-id-95' visibility='default' filepath='./Include/cpython/object.h' line='224' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3136'> - <var-decl name='tp_finalize' type-id='type-id-335' visibility='default' filepath='./Include/cpython/object.h' line='226' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3200'> - <var-decl name='tp_vectorcall' type-id='type-id-311' visibility='default' filepath='./Include/cpython/object.h' line='227' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3264'> - <var-decl name='tp_watched' type-id='type-id-85' visibility='default' filepath='./Include/cpython/object.h' line='230' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='getter' type-id='type-id-732' filepath='./Include/descrobject.h' line='8' column='1' id='type-id-1203'/> - <typedef-decl name='setter' type-id='type-id-1204' filepath='./Include/descrobject.h' line='9' column='1' id='type-id-1205'/> - <class-decl name='PyGetSetDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='11' column='1' id='type-id-1206'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/descrobject.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='get' type-id='type-id-1203' visibility='default' filepath='./Include/descrobject.h' line='13' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='set' type-id='type-id-1205' visibility='default' filepath='./Include/descrobject.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='doc' type-id='type-id-12' visibility='default' filepath='./Include/descrobject.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='closure' type-id='type-id-22' visibility='default' filepath='./Include/descrobject.h' line='16' column='1'/> - </data-member> - </class-decl> - <class-decl name='PyMemberDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='41' column='1' id='type-id-1207'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/descrobject.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type' type-id='type-id-8' visibility='default' filepath='./Include/descrobject.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='offset' type-id='type-id-14' visibility='default' filepath='./Include/descrobject.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='flags' type-id='type-id-8' visibility='default' filepath='./Include/descrobject.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='doc' type-id='type-id-12' visibility='default' filepath='./Include/descrobject.h' line='46' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='identifier' type-id='type-id-2' filepath='./Include/internal/pycore_asdl.h' line='13' column='1' id='type-id-525'/> - <typedef-decl name='string' type-id='type-id-2' filepath='./Include/internal/pycore_asdl.h' line='14' column='1' id='type-id-527'/> - <typedef-decl name='constant' type-id='type-id-2' filepath='./Include/internal/pycore_asdl.h' line='16' column='1' id='type-id-552'/> - <class-decl name='asdl_int_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='42' column='1' id='type-id-1209'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-1156' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='44' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_int_seq' type-id='type-id-1209' filepath='./Include/internal/pycore_asdl.h' line='45' column='1' id='type-id-1208'/> - <typedef-decl name='expr_ty' type-id='type-id-1210' filepath='./Include/internal/pycore_ast.h' line='19' column='1' id='type-id-502'/> - <enum-decl name='_expr_context' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-1211'> - <underlying-type type-id='type-id-24'/> - <enumerator name='Load' value='1'/> - <enumerator name='Store' value='2'/> - <enumerator name='Del' value='3'/> - </enum-decl> - <typedef-decl name='expr_context_ty' type-id='type-id-1211' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-566'/> - <enum-decl name='_boolop' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-1212'> - <underlying-type type-id='type-id-24'/> - <enumerator name='And' value='1'/> - <enumerator name='Or' value='2'/> - </enum-decl> - <typedef-decl name='boolop_ty' type-id='type-id-1212' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-1139'/> - <enum-decl name='_operator' filepath='./Include/internal/pycore_ast.h' line='25' column='1' id='type-id-1213'> - <underlying-type type-id='type-id-24'/> - <enumerator name='Add' value='1'/> - <enumerator name='Sub' value='2'/> - <enumerator name='Mult' value='3'/> - <enumerator name='MatMult' value='4'/> - <enumerator name='Div' value='5'/> - <enumerator name='Mod' value='6'/> - <enumerator name='Pow' value='7'/> - <enumerator name='LShift' value='8'/> - <enumerator name='RShift' value='9'/> - <enumerator name='BitOr' value='10'/> - <enumerator name='BitXor' value='11'/> - <enumerator name='BitAnd' value='12'/> - <enumerator name='FloorDiv' value='13'/> - </enum-decl> - <typedef-decl name='operator_ty' type-id='type-id-1213' filepath='./Include/internal/pycore_ast.h' line='27' column='1' id='type-id-530'/> - <enum-decl name='_unaryop' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-1214'> - <underlying-type type-id='type-id-24'/> - <enumerator name='Invert' value='1'/> - <enumerator name='Not' value='2'/> - <enumerator name='UAdd' value='3'/> - <enumerator name='USub' value='4'/> - </enum-decl> - <typedef-decl name='unaryop_ty' type-id='type-id-1214' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-1140'/> - <typedef-decl name='comprehension_ty' type-id='type-id-1215' filepath='./Include/internal/pycore_ast.h' line='34' column='1' id='type-id-1142'/> - <typedef-decl name='arguments_ty' type-id='type-id-1216' filepath='./Include/internal/pycore_ast.h' line='38' column='1' id='type-id-526'/> - <typedef-decl name='arg_ty' type-id='type-id-1217' filepath='./Include/internal/pycore_ast.h' line='40' column='1' id='type-id-567'/> - <typedef-decl name='keyword_ty' type-id='type-id-1218' filepath='./Include/internal/pycore_ast.h' line='42' column='1' id='type-id-1143'/> - <class-decl name='asdl_expr_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1219' visibility='default' filepath='./Include/internal/pycore_ast.h' line='71' column='1' id='type-id-1220'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_ast.h' line='73' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_expr_seq' type-id='type-id-1220' filepath='./Include/internal/pycore_ast.h' line='74' column='1' id='type-id-1219'/> - <class-decl name='asdl_comprehension_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1221' visibility='default' filepath='./Include/internal/pycore_ast.h' line='78' column='1' id='type-id-1222'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-1153' visibility='default' filepath='./Include/internal/pycore_ast.h' line='80' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_comprehension_seq' type-id='type-id-1222' filepath='./Include/internal/pycore_ast.h' line='81' column='1' id='type-id-1221'/> - <class-decl name='asdl_arg_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1223' visibility='default' filepath='./Include/internal/pycore_ast.h' line='101' column='1' id='type-id-1224'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-1146' visibility='default' filepath='./Include/internal/pycore_ast.h' line='103' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_arg_seq' type-id='type-id-1224' filepath='./Include/internal/pycore_ast.h' line='104' column='1' id='type-id-1223'/> - <class-decl name='asdl_keyword_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1225' visibility='default' filepath='./Include/internal/pycore_ast.h' line='108' column='1' id='type-id-1226'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='size' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_ast.h' line='109' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='elements' type-id='type-id-253' visibility='default' filepath='./Include/internal/pycore_ast.h' line='109' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='typed_elements' type-id='type-id-1157' visibility='default' filepath='./Include/internal/pycore_ast.h' line='110' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='asdl_keyword_seq' type-id='type-id-1226' filepath='./Include/internal/pycore_ast.h' line='111' column='1' id='type-id-1225'/> - <enum-decl name='_expr_kind' filepath='./Include/internal/pycore_ast.h' line='359' column='1' id='type-id-1227'> - <underlying-type type-id='type-id-24'/> - <enumerator name='BoolOp_kind' value='1'/> - <enumerator name='NamedExpr_kind' value='2'/> - <enumerator name='BinOp_kind' value='3'/> - <enumerator name='UnaryOp_kind' value='4'/> - <enumerator name='Lambda_kind' value='5'/> - <enumerator name='IfExp_kind' value='6'/> - <enumerator name='Dict_kind' value='7'/> - <enumerator name='Set_kind' value='8'/> - <enumerator name='ListComp_kind' value='9'/> - <enumerator name='SetComp_kind' value='10'/> - <enumerator name='DictComp_kind' value='11'/> - <enumerator name='GeneratorExp_kind' value='12'/> - <enumerator name='Await_kind' value='13'/> - <enumerator name='Yield_kind' value='14'/> - <enumerator name='YieldFrom_kind' value='15'/> - <enumerator name='Compare_kind' value='16'/> - <enumerator name='Call_kind' value='17'/> - <enumerator name='FormattedValue_kind' value='18'/> - <enumerator name='JoinedStr_kind' value='19'/> - <enumerator name='Constant_kind' value='20'/> - <enumerator name='Attribute_kind' value='21'/> - <enumerator name='Subscript_kind' value='22'/> - <enumerator name='Starred_kind' value='23'/> - <enumerator name='Name_kind' value='24'/> - <enumerator name='List_kind' value='25'/> - <enumerator name='Tuple_kind' value='26'/> - <enumerator name='Slice_kind' value='27'/> - </enum-decl> - <class-decl name='_expr' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='367' column='1' id='type-id-963'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-1227' visibility='default' filepath='./Include/internal/pycore_ast.h' line='368' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='v' type-id='type-id-1228' visibility='default' filepath='./Include/internal/pycore_ast.h' line='509' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='510' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='511' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='512' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='513' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='369' column='1' id='type-id-1228'> - <data-member access='public'> - <var-decl name='BoolOp' type-id='type-id-1229' visibility='default' filepath='./Include/internal/pycore_ast.h' line='373' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='NamedExpr' type-id='type-id-1230' visibility='default' filepath='./Include/internal/pycore_ast.h' line='378' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='BinOp' type-id='type-id-1231' visibility='default' filepath='./Include/internal/pycore_ast.h' line='384' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='UnaryOp' type-id='type-id-1232' visibility='default' filepath='./Include/internal/pycore_ast.h' line='389' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Lambda' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_ast.h' line='394' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='IfExp' type-id='type-id-1234' visibility='default' filepath='./Include/internal/pycore_ast.h' line='400' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Dict' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_ast.h' line='405' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Set' type-id='type-id-1236' visibility='default' filepath='./Include/internal/pycore_ast.h' line='409' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='ListComp' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_ast.h' line='414' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='SetComp' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_ast.h' line='419' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='DictComp' type-id='type-id-1238' visibility='default' filepath='./Include/internal/pycore_ast.h' line='425' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='GeneratorExp' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_ast.h' line='430' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Await' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='434' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Yield' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='438' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='YieldFrom' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_ast.h' line='442' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Compare' type-id='type-id-1239' visibility='default' filepath='./Include/internal/pycore_ast.h' line='448' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Call' type-id='type-id-1240' visibility='default' filepath='./Include/internal/pycore_ast.h' line='454' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='FormattedValue' type-id='type-id-1241' visibility='default' filepath='./Include/internal/pycore_ast.h' line='460' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='JoinedStr' type-id='type-id-1242' visibility='default' filepath='./Include/internal/pycore_ast.h' line='464' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Constant' type-id='type-id-1243' visibility='default' filepath='./Include/internal/pycore_ast.h' line='469' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Attribute' type-id='type-id-1244' visibility='default' filepath='./Include/internal/pycore_ast.h' line='475' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Subscript' type-id='type-id-1245' visibility='default' filepath='./Include/internal/pycore_ast.h' line='481' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Starred' type-id='type-id-1246' visibility='default' filepath='./Include/internal/pycore_ast.h' line='486' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Name' type-id='type-id-1247' visibility='default' filepath='./Include/internal/pycore_ast.h' line='491' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='List' type-id='type-id-1248' visibility='default' filepath='./Include/internal/pycore_ast.h' line='496' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Tuple' type-id='type-id-1248' visibility='default' filepath='./Include/internal/pycore_ast.h' line='501' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='Slice' type-id='type-id-1249' visibility='default' filepath='./Include/internal/pycore_ast.h' line='507' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='370' column='1' id='type-id-1229'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='type-id-1139' visibility='default' filepath='./Include/internal/pycore_ast.h' line='371' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='values' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='372' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='375' column='1' id='type-id-1230'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='376' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='377' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='380' column='1' id='type-id-1231'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='left' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='381' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='op' type-id='type-id-530' visibility='default' filepath='./Include/internal/pycore_ast.h' line='382' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='right' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='383' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='386' column='1' id='type-id-1232'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='op' type-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_ast.h' line='387' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='operand' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='388' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__5' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='391' column='1' id='type-id-1233'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='args' type-id='type-id-526' visibility='default' filepath='./Include/internal/pycore_ast.h' line='392' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='393' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__6' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='396' column='1' id='type-id-1234'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='test' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='397' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='body' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='398' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='orelse' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='399' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='402' column='1' id='type-id-1235'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='keys' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='403' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='values' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='404' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__8' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='407' column='1' id='type-id-1236'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elts' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='408' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__9' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='411' column='1' id='type-id-1237'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elt' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='412' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='generators' type-id='type-id-1141' visibility='default' filepath='./Include/internal/pycore_ast.h' line='413' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__11' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='421' column='1' id='type-id-1238'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='key' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='422' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='423' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='generators' type-id='type-id-1141' visibility='default' filepath='./Include/internal/pycore_ast.h' line='424' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__13' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='432' column='1' id='type-id-509'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='433' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__16' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='444' column='1' id='type-id-1239'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='left' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='445' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ops' type-id='type-id-564' visibility='default' filepath='./Include/internal/pycore_ast.h' line='446' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='comparators' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='447' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__17' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='450' column='1' id='type-id-1240'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='func' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='451' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='452' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='keywords' type-id='type-id-529' visibility='default' filepath='./Include/internal/pycore_ast.h' line='453' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__18' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='456' column='1' id='type-id-1241'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='457' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='conversion' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='458' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='format_spec' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='459' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__19' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='462' column='1' id='type-id-1242'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='values' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='463' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__20' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='466' column='1' id='type-id-1243'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-552' visibility='default' filepath='./Include/internal/pycore_ast.h' line='467' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='kind' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='468' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__21' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='471' column='1' id='type-id-1244'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='472' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='attr' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='473' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ctx' type-id='type-id-566' visibility='default' filepath='./Include/internal/pycore_ast.h' line='474' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__22' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='477' column='1' id='type-id-1245'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='478' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='slice' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='479' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ctx' type-id='type-id-566' visibility='default' filepath='./Include/internal/pycore_ast.h' line='480' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__23' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='483' column='1' id='type-id-1246'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='484' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-566' visibility='default' filepath='./Include/internal/pycore_ast.h' line='485' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__24' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='488' column='1' id='type-id-1247'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='id' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='489' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-566' visibility='default' filepath='./Include/internal/pycore_ast.h' line='490' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__25' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='493' column='1' id='type-id-1248'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='elts' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='494' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ctx' type-id='type-id-566' visibility='default' filepath='./Include/internal/pycore_ast.h' line='495' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__27' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='503' column='1' id='type-id-1249'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lower' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='504' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='upper' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='505' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='step' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='506' column='1'/> - </data-member> - </class-decl> - <class-decl name='_comprehension' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='516' column='1' id='type-id-1250'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='target' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='517' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='iter' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='518' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ifs' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='519' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='is_async' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='520' column='1'/> - </data-member> - </class-decl> - <class-decl name='_arguments' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='540' column='1' id='type-id-1251'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='posonlyargs' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_ast.h' line='541' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='args' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_ast.h' line='542' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='vararg' type-id='type-id-567' visibility='default' filepath='./Include/internal/pycore_ast.h' line='543' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='kwonlyargs' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_ast.h' line='544' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='kw_defaults' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='545' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='kwarg' type-id='type-id-567' visibility='default' filepath='./Include/internal/pycore_ast.h' line='546' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='defaults' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_ast.h' line='547' column='1'/> - </data-member> - </class-decl> - <class-decl name='_arg' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='550' column='1' id='type-id-1252'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='551' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='annotation' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='552' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='type_comment' type-id='type-id-527' visibility='default' filepath='./Include/internal/pycore_ast.h' line='553' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='554' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='555' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='556' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='557' column='1'/> - </data-member> - </class-decl> - <class-decl name='_keyword' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='560' column='1' id='type-id-1253'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='arg' type-id='type-id-525' visibility='default' filepath='./Include/internal/pycore_ast.h' line='561' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='value' type-id='type-id-502' visibility='default' filepath='./Include/internal/pycore_ast.h' line='562' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='563' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='564' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='565' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_ast.h' line='566' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyArena' type-id='type-id-1152' filepath='./Include/internal/pycore_pyarena.h' line='14' column='1' id='type-id-1254'/> - <typedef-decl name='PyCFunction' type-id='type-id-1255' filepath='./Include/methodobject.h' line='19' column='1' id='type-id-388'/> - <class-decl name='PyMethodDef' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/methodobject.h' line='54' column='1' id='type-id-1256'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ml_name' type-id='type-id-12' visibility='default' filepath='./Include/methodobject.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ml_meth' type-id='type-id-388' visibility='default' filepath='./Include/methodobject.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ml_flags' type-id='type-id-8' visibility='default' filepath='./Include/methodobject.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ml_doc' type-id='type-id-12' visibility='default' filepath='./Include/methodobject.h' line='59' column='1'/> - </data-member> - </class-decl> - <class-decl name='_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/object.h' line='166' column='1' id='type-id-1257'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='' type-id='type-id-1258' visibility='default'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='ob_type' type-id='type-id-1' visibility='default' filepath='./Include/object.h' line='190' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/object.h' line='180' column='1' id='type-id-1258'> - <data-member access='public'> - <var-decl name='ob_refcnt' type-id='type-id-14' visibility='default' filepath='./Include/object.h' line='181' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='ob_refcnt_split' type-id='type-id-1160' visibility='default' filepath='./Include/object.h' line='183' column='1'/> - </data-member> - </union-decl> - <class-decl name='PyVarObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-321' visibility='default' filepath='./Include/object.h' line='196' column='1' id='type-id-1259'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/object.h' line='197' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ob_size' type-id='type-id-14' visibility='default' filepath='./Include/object.h' line='198' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyVarObject' type-id='type-id-1259' filepath='./Include/object.h' line='199' column='1' id='type-id-321'/> - <typedef-decl name='unaryfunc' type-id='type-id-1260' filepath='./Include/object.h' line='305' column='1' id='type-id-1166'/> - <typedef-decl name='binaryfunc' type-id='type-id-1255' filepath='./Include/object.h' line='306' column='1' id='type-id-1164'/> - <typedef-decl name='ternaryfunc' type-id='type-id-1261' filepath='./Include/object.h' line='307' column='1' id='type-id-1165'/> - <typedef-decl name='inquiry' type-id='type-id-339' filepath='./Include/object.h' line='308' column='1' id='type-id-396'/> - <typedef-decl name='lenfunc' type-id='type-id-1262' filepath='./Include/object.h' line='309' column='1' id='type-id-1169'/> - <typedef-decl name='ssizeargfunc' type-id='type-id-1263' filepath='./Include/object.h' line='310' column='1' id='type-id-1170'/> - <typedef-decl name='ssizeobjargproc' type-id='type-id-1264' filepath='./Include/object.h' line='312' column='1' id='type-id-1171'/> - <typedef-decl name='objobjargproc' type-id='type-id-1265' filepath='./Include/object.h' line='314' column='1' id='type-id-1175'/> - <typedef-decl name='objobjproc' type-id='type-id-1266' filepath='./Include/object.h' line='316' column='1' id='type-id-1172'/> - <typedef-decl name='visitproc' type-id='type-id-236' filepath='./Include/object.h' line='317' column='1' id='type-id-341'/> - <typedef-decl name='traverseproc' type-id='type-id-1267' filepath='./Include/object.h' line='318' column='1' id='type-id-395'/> - <typedef-decl name='freefunc' type-id='type-id-760' filepath='./Include/object.h' line='321' column='1' id='type-id-397'/> - <typedef-decl name='destructor' type-id='type-id-312' filepath='./Include/object.h' line='322' column='1' id='type-id-335'/> - <typedef-decl name='getattrfunc' type-id='type-id-1268' filepath='./Include/object.h' line='323' column='1' id='type-id-1184'/> - <typedef-decl name='getattrofunc' type-id='type-id-1255' filepath='./Include/object.h' line='324' column='1' id='type-id-1192'/> - <typedef-decl name='setattrfunc' type-id='type-id-1269' filepath='./Include/object.h' line='325' column='1' id='type-id-1185'/> - <typedef-decl name='setattrofunc' type-id='type-id-1265' filepath='./Include/object.h' line='326' column='1' id='type-id-1193'/> - <typedef-decl name='reprfunc' type-id='type-id-1260' filepath='./Include/object.h' line='327' column='1' id='type-id-1187'/> - <typedef-decl name='hashfunc' type-id='type-id-1270' filepath='./Include/object.h' line='328' column='1' id='type-id-1191'/> - <typedef-decl name='richcmpfunc' type-id='type-id-1271' filepath='./Include/object.h' line='329' column='1' id='type-id-1195'/> - <typedef-decl name='getiterfunc' type-id='type-id-1260' filepath='./Include/object.h' line='330' column='1' id='type-id-1196'/> - <typedef-decl name='iternextfunc' type-id='type-id-1260' filepath='./Include/object.h' line='331' column='1' id='type-id-1197'/> - <typedef-decl name='descrgetfunc' type-id='type-id-1261' filepath='./Include/object.h' line='332' column='1' id='type-id-1198'/> - <typedef-decl name='descrsetfunc' type-id='type-id-1265' filepath='./Include/object.h' line='333' column='1' id='type-id-1199'/> - <typedef-decl name='initproc' type-id='type-id-1265' filepath='./Include/object.h' line='334' column='1' id='type-id-1200'/> - <typedef-decl name='newfunc' type-id='type-id-1272' filepath='./Include/object.h' line='335' column='1' id='type-id-1202'/> - <typedef-decl name='allocfunc' type-id='type-id-1273' filepath='./Include/object.h' line='336' column='1' id='type-id-1201'/> - <typedef-decl name='vectorcallfunc' type-id='type-id-1274' filepath='./Include/object.h' line='339' column='1' id='type-id-311'/> - <enum-decl name='PySendResult' naming-typedef-id='type-id-255' filepath='./Include/object.h' line='875' column='1' id='type-id-1275'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PYGEN_RETURN' value='0'/> - <enumerator name='PYGEN_ERROR' value='-1'/> - <enumerator name='PYGEN_NEXT' value='1'/> - </enum-decl> - <typedef-decl name='PySendResult' type-id='type-id-1275' filepath='./Include/object.h' line='879' column='1' id='type-id-255'/> - <class-decl name='Py_buffer' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-243' visibility='default' filepath='./Include/pybuffer.h' line='20' column='1' id='type-id-1276'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buf' type-id='type-id-22' visibility='default' filepath='./Include/pybuffer.h' line='21' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='obj' type-id='type-id-2' visibility='default' filepath='./Include/pybuffer.h' line='22' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='len' type-id='type-id-14' visibility='default' filepath='./Include/pybuffer.h' line='23' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='itemsize' type-id='type-id-14' visibility='default' filepath='./Include/pybuffer.h' line='24' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='readonly' type-id='type-id-8' visibility='default' filepath='./Include/pybuffer.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='ndim' type-id='type-id-8' visibility='default' filepath='./Include/pybuffer.h' line='27' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='format' type-id='type-id-15' visibility='default' filepath='./Include/pybuffer.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='shape' type-id='type-id-13' visibility='default' filepath='./Include/pybuffer.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='strides' type-id='type-id-13' visibility='default' filepath='./Include/pybuffer.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='suboffsets' type-id='type-id-13' visibility='default' filepath='./Include/pybuffer.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='internal' type-id='type-id-22' visibility='default' filepath='./Include/pybuffer.h' line='32' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Py_buffer' type-id='type-id-1276' filepath='./Include/pybuffer.h' line='33' column='1' id='type-id-243'/> - <typedef-decl name='getbufferproc' type-id='type-id-1277' filepath='./Include/pybuffer.h' line='35' column='1' id='type-id-434'/> - <typedef-decl name='releasebufferproc' type-id='type-id-1278' filepath='./Include/pybuffer.h' line='36' column='1' id='type-id-1182'/> - <typedef-decl name='Py_ssize_t' type-id='type-id-185' filepath='./Include/pyport.h' line='131' column='1' id='type-id-14'/> - <typedef-decl name='Py_hash_t' type-id='type-id-14' filepath='./Include/pyport.h' line='145' column='1' id='type-id-305'/> - <typedef-decl name='PyMethodDef' type-id='type-id-1256' filepath='./Include/pytypedefs.h' line='14' column='1' id='type-id-1279'/> - <typedef-decl name='PyGetSetDef' type-id='type-id-1206' filepath='./Include/pytypedefs.h' line='15' column='1' id='type-id-1280'/> - <typedef-decl name='PyMemberDef' type-id='type-id-1207' filepath='./Include/pytypedefs.h' line='16' column='1' id='type-id-1281'/> - <typedef-decl name='PyObject' type-id='type-id-1257' filepath='./Include/pytypedefs.h' line='18' column='1' id='type-id-345'/> - <typedef-decl name='PyTypeObject' type-id='type-id-1183' filepath='./Include/pytypedefs.h' line='20' column='1' id='type-id-256'/> - <typedef-decl name='uint32_t' type-id='type-id-1054' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='26' column='1' id='type-id-352'/> - <typedef-decl name='__uint32_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='42' column='1' id='type-id-1054'/> - <typedef-decl name='__off_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='152' column='1' id='type-id-1282'/> - <typedef-decl name='__off64_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='153' column='1' id='type-id-9'/> - <typedef-decl name='__ssize_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='194' column='1' id='type-id-186'/> - <typedef-decl name='FILE' type-id='type-id-1283' filepath='/usr/include/x86_64-linux-gnu/bits/types/FILE.h' line='7' column='1' id='type-id-1284'/> - <typedef-decl name='_IO_lock_t' type-id='type-id-46' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='43' column='1' id='type-id-1285'/> - <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='49' column='1' id='type-id-1283'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_flags' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='_IO_read_ptr' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='_IO_read_end' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='_IO_read_base' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='_IO_write_base' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='_IO_write_ptr' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='_IO_write_end' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='_IO_buf_base' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='_IO_buf_end' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='_IO_save_base' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='_IO_backup_base' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='_IO_save_end' type-id='type-id-15' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='_markers' type-id='type-id-1286' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='_chain' type-id='type-id-1287' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='_fileno' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='928'> - <var-decl name='_flags2' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='_old_offset' type-id='type-id-1282' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1024'> - <var-decl name='_cur_column' type-id='type-id-84' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1040'> - <var-decl name='_vtable_offset' type-id='type-id-1037' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1048'> - <var-decl name='_shortbuf' type-id='type-id-702' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='_lock' type-id='type-id-1288' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='_offset' type-id='type-id-9' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='_codecvt' type-id='type-id-1289' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1280'> - <var-decl name='_wide_data' type-id='type-id-1290' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='_freeres_list' type-id='type-id-1287' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1408'> - <var-decl name='_freeres_buf' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='94' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1472'> - <var-decl name='__pad5' type-id='type-id-19' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1536'> - <var-decl name='_mode' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1568'> - <var-decl name='_unused2' type-id='type-id-1147' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='98' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='ssize_t' type-id='type-id-186' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='108' column='1' id='type-id-185'/> - <class-decl name='_memo' size-in-bits='256' is-struct='yes' visibility='default' filepath='Parser/pegen.h' line='29' column='1' id='type-id-1291'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='30' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='node' type-id='type-id-22' visibility='default' filepath='Parser/pegen.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mark' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='next' type-id='type-id-1292' visibility='default' filepath='Parser/pegen.h' line='33' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Memo' type-id='type-id-1291' filepath='Parser/pegen.h' line='34' column='1' id='type-id-1293'/> - <class-decl name='Token' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1294' visibility='default' filepath='Parser/pegen.h' line='36' column='1' id='type-id-1295'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='type' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='bytes' type-id='type-id-2' visibility='default' filepath='Parser/pegen.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='memo' type-id='type-id-1296' visibility='default' filepath='Parser/pegen.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='metadata' type-id='type-id-2' visibility='default' filepath='Parser/pegen.h' line='42' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Token' type-id='type-id-1295' filepath='Parser/pegen.h' line='43' column='1' id='type-id-1294'/> - <class-decl name='KeywordToken' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1297' visibility='default' filepath='Parser/pegen.h' line='45' column='1' id='type-id-1298'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='str' type-id='type-id-12' visibility='default' filepath='Parser/pegen.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='type' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='47' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='KeywordToken' type-id='type-id-1298' filepath='Parser/pegen.h' line='48' column='1' id='type-id-1297'/> - <class-decl name='growable_comment_array' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1299' visibility='default' filepath='Parser/pegen.h' line='51' column='1' id='type-id-1300'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='items' type-id='type-id-1301' visibility='default' filepath='Parser/pegen.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='size' type-id='type-id-19' visibility='default' filepath='Parser/pegen.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='num_items' type-id='type-id-19' visibility='default' filepath='Parser/pegen.h' line='57' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='Parser/pegen.h' line='52' column='1' id='type-id-1302'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='comment' type-id='type-id-15' visibility='default' filepath='Parser/pegen.h' line='54' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='growable_comment_array' type-id='type-id-1300' filepath='Parser/pegen.h' line='58' column='1' id='type-id-1299'/> - <class-decl name='Parser' size-in-bits='1280' is-struct='yes' naming-typedef-id='type-id-1303' visibility='default' filepath='Parser/pegen.h' line='60' column='1' id='type-id-1304'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tok' type-id='type-id-1305' visibility='default' filepath='Parser/pegen.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tokens' type-id='type-id-1306' visibility='default' filepath='Parser/pegen.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='mark' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='fill' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='size' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='arena' type-id='type-id-563' visibility='default' filepath='Parser/pegen.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='keywords' type-id='type-id-1307' visibility='default' filepath='Parser/pegen.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='soft_keywords' type-id='type-id-239' visibility='default' filepath='Parser/pegen.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='n_keyword_lists' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='start_rule' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='errcode' type-id='type-id-179' visibility='default' filepath='Parser/pegen.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='parsing_started' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='normalize' type-id='type-id-2' visibility='default' filepath='Parser/pegen.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='starting_lineno' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='starting_col_offset' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='error_indicator' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='flags' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='feature_version' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='type_ignore_comments' type-id='type-id-1299' visibility='default' filepath='Parser/pegen.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1088'> - <var-decl name='known_err_token' type-id='type-id-569' visibility='default' filepath='Parser/pegen.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1152'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1184'> - <var-decl name='call_invalid_rules' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1216'> - <var-decl name='debug' type-id='type-id-8' visibility='default' filepath='Parser/pegen.h' line='82' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='Parser' type-id='type-id-1304' filepath='Parser/pegen.h' line='83' column='1' id='type-id-1303'/> - <enum-decl name='decoding_state' filepath='Parser/tokenizer.h' line='17' column='1' id='type-id-1136'> - <underlying-type type-id='type-id-24'/> - <enumerator name='STATE_INIT' value='0'/> - <enumerator name='STATE_SEEK_CODING' value='1'/> - <enumerator name='STATE_NORMAL' value='2'/> - </enum-decl> - <enum-decl name='interactive_underflow_t' filepath='Parser/tokenizer.h' line='23' column='1' id='type-id-1137'> - <underlying-type type-id='type-id-24'/> - <enumerator name='IUNDERFLOW_NORMAL' value='0'/> - <enumerator name='IUNDERFLOW_STOP' value='1'/> - </enum-decl> - <class-decl name='token' size-in-bits='384' is-struct='yes' visibility='default' filepath='Parser/tokenizer.h' line='31' column='1' id='type-id-1308'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='32' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='end' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='metadata' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='35' column='1'/> - </data-member> - </class-decl> - <enum-decl name='tokenizer_mode_kind_t' filepath='Parser/tokenizer.h' line='38' column='1' id='type-id-1309'> - <underlying-type type-id='type-id-24'/> - <enumerator name='TOK_REGULAR_MODE' value='0'/> - <enumerator name='TOK_FSTRING_MODE' value='1'/> - </enum-decl> - <class-decl name='_tokenizer_mode' size-in-bits='768' is-struct='yes' visibility='default' filepath='Parser/tokenizer.h' line='45' column='1' id='type-id-1310'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='kind' type-id='type-id-1309' visibility='default' filepath='Parser/tokenizer.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='curly_bracket_depth' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='curly_bracket_expr_start_depth' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='f_string_quote' type-id='type-id-48' visibility='default' filepath='Parser/tokenizer.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='f_string_quote_size' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='f_string_raw' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='f_string_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='f_string_multi_line_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='f_string_line_start' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='f_string_start_offset' type-id='type-id-14' visibility='default' filepath='Parser/tokenizer.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='f_string_multi_line_start_offset' type-id='type-id-14' visibility='default' filepath='Parser/tokenizer.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='last_expr_size' type-id='type-id-14' visibility='default' filepath='Parser/tokenizer.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='last_expr_end' type-id='type-id-14' visibility='default' filepath='Parser/tokenizer.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='last_expr_buffer' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='f_string_debug' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='64' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='tokenizer_mode' type-id='type-id-1310' filepath='Parser/tokenizer.h' line='65' column='1' id='type-id-1158'/> - <class-decl name='tok_state' size-in-bits='138240' is-struct='yes' visibility='default' filepath='Parser/tokenizer.h' line='68' column='1' id='type-id-1132'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='buf' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='cur' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='inp' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='fp_interactive' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='interactive_src_start' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='interactive_src_end' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='end' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='done' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='fp' type-id='type-id-229' visibility='default' filepath='Parser/tokenizer.h' line='81' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='tabsize' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='672'> - <var-decl name='indent' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='indstack' type-id='type-id-1133' visibility='default' filepath='Parser/tokenizer.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3904'> - <var-decl name='atbol' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3936'> - <var-decl name='pendin' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='3968'> - <var-decl name='prompt' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4032'> - <var-decl name='nextprompt' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4096'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4128'> - <var-decl name='first_lineno' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4160'> - <var-decl name='starting_col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4192'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4224'> - <var-decl name='level' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='93' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='4256'> - <var-decl name='parenstack' type-id='type-id-1134' visibility='default' filepath='Parser/tokenizer.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='5856'> - <var-decl name='parenlinenostack' type-id='type-id-1135' visibility='default' filepath='Parser/tokenizer.h' line='96' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='12256'> - <var-decl name='parencolstack' type-id='type-id-1135' visibility='default' filepath='Parser/tokenizer.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18688'> - <var-decl name='filename' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='18752'> - <var-decl name='altindstack' type-id='type-id-1133' visibility='default' filepath='Parser/tokenizer.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21952'> - <var-decl name='decoding_state' type-id='type-id-1136' visibility='default' filepath='Parser/tokenizer.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='21984'> - <var-decl name='decoding_erred' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='103' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22016'> - <var-decl name='encoding' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='104' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22080'> - <var-decl name='cont_line' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='105' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22144'> - <var-decl name='line_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='106' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22208'> - <var-decl name='multi_line_start' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='107' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22272'> - <var-decl name='decoding_readline' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='110' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22336'> - <var-decl name='decoding_buffer' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='111' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22400'> - <var-decl name='readline' type-id='type-id-2' visibility='default' filepath='Parser/tokenizer.h' line='112' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22464'> - <var-decl name='enc' type-id='type-id-12' visibility='default' filepath='Parser/tokenizer.h' line='113' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22528'> - <var-decl name='str' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='114' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22592'> - <var-decl name='input' type-id='type-id-15' visibility='default' filepath='Parser/tokenizer.h' line='115' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22656'> - <var-decl name='type_comments' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='117' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22688'> - <var-decl name='async_hacks' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='120' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22720'> - <var-decl name='async_def' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='121' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22752'> - <var-decl name='async_def_indent' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='122' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22784'> - <var-decl name='async_def_nl' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='123' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22816'> - <var-decl name='interactive_underflow' type-id='type-id-1137' visibility='default' filepath='Parser/tokenizer.h' line='126' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22848'> - <var-decl name='report_warnings' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='127' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='22912'> - <var-decl name='tok_mode_stack' type-id='type-id-1138' visibility='default' filepath='Parser/tokenizer.h' line='129' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138112'> - <var-decl name='tok_mode_stack_index' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='130' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138144'> - <var-decl name='tok_extra_tokens' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='131' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138176'> - <var-decl name='comment_newline' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='132' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='138208'> - <var-decl name='implicit_newline' type-id='type-id-8' visibility='default' filepath='Parser/tokenizer.h' line='133' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-1284' size-in-bits='64' id='type-id-229'/> - <pointer-type-def type-id='type-id-1297' size-in-bits='64' id='type-id-1311'/> - <pointer-type-def type-id='type-id-1311' size-in-bits='64' id='type-id-1307'/> - <pointer-type-def type-id='type-id-1293' size-in-bits='64' id='type-id-1296'/> - <pointer-type-def type-id='type-id-1303' size-in-bits='64' id='type-id-568'/> - <pointer-type-def type-id='type-id-1254' size-in-bits='64' id='type-id-563'/> - <pointer-type-def type-id='type-id-1178' size-in-bits='64' id='type-id-1186'/> - <pointer-type-def type-id='type-id-1180' size-in-bits='64' id='type-id-1194'/> - <pointer-type-def type-id='type-id-1280' size-in-bits='64' id='type-id-338'/> - <pointer-type-def type-id='type-id-1173' size-in-bits='64' id='type-id-1190'/> - <pointer-type-def type-id='type-id-1281' size-in-bits='64' id='type-id-336'/> - <pointer-type-def type-id='type-id-1279' size-in-bits='64' id='type-id-337'/> - <pointer-type-def type-id='type-id-1162' size-in-bits='64' id='type-id-1188'/> - <pointer-type-def type-id='type-id-345' size-in-bits='64' id='type-id-2'/> - <pointer-type-def type-id='type-id-1312' size-in-bits='64' id='type-id-1260'/> - <pointer-type-def type-id='type-id-1313' size-in-bits='64' id='type-id-1274'/> - <pointer-type-def type-id='type-id-1314' size-in-bits='64' id='type-id-1255'/> - <pointer-type-def type-id='type-id-1315' size-in-bits='64' id='type-id-1261'/> - <pointer-type-def type-id='type-id-1316' size-in-bits='64' id='type-id-1271'/> - <pointer-type-def type-id='type-id-1317' size-in-bits='64' id='type-id-1268'/> - <pointer-type-def type-id='type-id-1318' size-in-bits='64' id='type-id-1263'/> - <pointer-type-def type-id='type-id-1088' size-in-bits='64' id='type-id-732'/> - <pointer-type-def type-id='type-id-1319' size-in-bits='64' id='type-id-1272'/> - <pointer-type-def type-id='type-id-1320' size-in-bits='64' id='type-id-1273'/> - <qualified-type-def type-id='type-id-2' const='yes' id='type-id-1321'/> - <pointer-type-def type-id='type-id-1321' size-in-bits='64' id='type-id-248'/> - <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-233'/> - <pointer-type-def type-id='type-id-1167' size-in-bits='64' id='type-id-1189'/> - <pointer-type-def type-id='type-id-256' size-in-bits='64' id='type-id-1'/> - <pointer-type-def type-id='type-id-243' size-in-bits='64' id='type-id-254'/> - <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-13'/> - <pointer-type-def type-id='type-id-1294' size-in-bits='64' id='type-id-569'/> - <pointer-type-def type-id='type-id-569' size-in-bits='64' id='type-id-1306'/> - <pointer-type-def type-id='type-id-1283' size-in-bits='64' id='type-id-1287'/> - <pointer-type-def type-id='type-id-1148' size-in-bits='64' id='type-id-1289'/> - <pointer-type-def type-id='type-id-1285' size-in-bits='64' id='type-id-1288'/> - <pointer-type-def type-id='type-id-1149' size-in-bits='64' id='type-id-1286'/> - <pointer-type-def type-id='type-id-1150' size-in-bits='64' id='type-id-1290'/> - <pointer-type-def type-id='type-id-1302' size-in-bits='64' id='type-id-1301'/> - <pointer-type-def type-id='type-id-1151' size-in-bits='64' id='type-id-306'/> - <pointer-type-def type-id='type-id-1252' size-in-bits='64' id='type-id-1217'/> - <pointer-type-def type-id='type-id-1251' size-in-bits='64' id='type-id-1216'/> - <pointer-type-def type-id='type-id-1250' size-in-bits='64' id='type-id-1215'/> - <pointer-type-def type-id='type-id-963' size-in-bits='64' id='type-id-1210'/> - <pointer-type-def type-id='type-id-1253' size-in-bits='64' id='type-id-1218'/> - <pointer-type-def type-id='type-id-1291' size-in-bits='64' id='type-id-1292'/> - <pointer-type-def type-id='type-id-1223' size-in-bits='64' id='type-id-565'/> - <pointer-type-def type-id='type-id-1221' size-in-bits='64' id='type-id-1141'/> - <pointer-type-def type-id='type-id-1219' size-in-bits='64' id='type-id-503'/> - <pointer-type-def type-id='type-id-1208' size-in-bits='64' id='type-id-564'/> - <pointer-type-def type-id='type-id-1225' size-in-bits='64' id='type-id-529'/> - <pointer-type-def type-id='type-id-15' size-in-bits='64' id='type-id-239'/> - <pointer-type-def type-id='type-id-354' size-in-bits='64' id='type-id-339'/> - <pointer-type-def type-id='type-id-1322' size-in-bits='64' id='type-id-1266'/> - <pointer-type-def type-id='type-id-1323' size-in-bits='64' id='type-id-1265'/> - <pointer-type-def type-id='type-id-1324' size-in-bits='64' id='type-id-1204'/> - <pointer-type-def type-id='type-id-1325' size-in-bits='64' id='type-id-1277'/> - <pointer-type-def type-id='type-id-1326' size-in-bits='64' id='type-id-1269'/> - <pointer-type-def type-id='type-id-1327' size-in-bits='64' id='type-id-1264'/> - <pointer-type-def type-id='type-id-1328' size-in-bits='64' id='type-id-1267'/> - <pointer-type-def type-id='type-id-238' size-in-bits='64' id='type-id-236'/> - <pointer-type-def type-id='type-id-8' size-in-bits='64' id='type-id-179'/> - <pointer-type-def type-id='type-id-1132' size-in-bits='64' id='type-id-1305'/> - <pointer-type-def type-id='type-id-1308' size-in-bits='64' id='type-id-1329'/> - <pointer-type-def type-id='type-id-1330' size-in-bits='64' id='type-id-1176'/> - <pointer-type-def type-id='type-id-1331' size-in-bits='64' id='type-id-1270'/> - <pointer-type-def type-id='type-id-1332' size-in-bits='64' id='type-id-1262'/> - <pointer-type-def type-id='type-id-314' size-in-bits='64' id='type-id-312'/> - <pointer-type-def type-id='type-id-1333' size-in-bits='64' id='type-id-1278'/> - <pointer-type-def type-id='type-id-1089' size-in-bits='64' id='type-id-760'/> - <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-22'/> - <pointer-type-def type-id='type-id-22' size-in-bits='64' id='type-id-253'/> - <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1148'/> - <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1149'/> - <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1150'/> - <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1152'/> - <function-decl name='PyBytes_FromStringAndSize' mangled-name='PyBytes_FromStringAndSize' filepath='./Include/bytesobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromStringAndSize'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyBytes_AsString' mangled-name='PyBytes_AsString' filepath='./Include/bytesobject.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_AsString'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='PyBytes_AsStringAndSize' mangled-name='PyBytes_AsStringAndSize' filepath='./Include/bytesobject.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_AsStringAndSize'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_FastCall' mangled-name='_PyObject_FastCall' filepath='./Include/cpython/abstract.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_FastCall'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyComplex_FromCComplex' mangled-name='PyComplex_FromCComplex' filepath='./Include/cpython/complexobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_FromCComplex'> - <parameter type-id='type-id-327'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetModuleAttrString' mangled-name='_PyImport_GetModuleAttrString' filepath='./Include/cpython/import.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_GetModuleAttrString'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyType_Name' mangled-name='_PyType_Name' filepath='./Include/cpython/object.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_Name'> - <parameter type-id='type-id-1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyUnicode_AsUTF8' mangled-name='PyUnicode_AsUTF8' filepath='./Include/cpython/unicodeobject.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyFloat_FromDouble' mangled-name='PyFloat_FromDouble' filepath='./Include/floatobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_FromDouble'> - <parameter type-id='type-id-251'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyAST_Constant' filepath='./Include/internal/pycore_ast.h' line='822' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-552'/> - <parameter type-id='type-id-527'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyAST_Name' filepath='./Include/internal/pycore_ast.h' line='834' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-525'/> - <parameter type-id='type-id-566'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-502'/> - </function-decl> - <function-decl name='_PyArena_Malloc' mangled-name='_PyArena_Malloc' filepath='./Include/internal/pycore_pyarena.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_Malloc'> - <parameter type-id='type-id-563'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyArena_AddPyObject' mangled-name='_PyArena_AddPyObject' filepath='./Include/internal/pycore_pyarena.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_AddPyObject'> - <parameter type-id='type-id-563'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyLong_FromLong' mangled-name='PyLong_FromLong' filepath='./Include/longobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLong'> - <parameter type-id='type-id-47'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyLong_FromString' mangled-name='PyLong_FromString' filepath='./Include/longobject.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromString'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyOS_strtoul' mangled-name='PyOS_strtoul' filepath='./Include/longobject.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_strtoul'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyOS_strtol' mangled-name='PyOS_strtol' filepath='./Include/longobject.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_strtol'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='_Py_Dealloc' mangled-name='_Py_Dealloc' filepath='./Include/object.h' line='611' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Dealloc'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_Occurred' mangled-name='PyErr_Occurred' filepath='./Include/pyerrors.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Occurred'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_Clear' mangled-name='PyErr_Clear' filepath='./Include/pyerrors.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Clear'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_GetRaisedException' mangled-name='PyErr_GetRaisedException' filepath='./Include/pyerrors.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetRaisedException'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_ExceptionMatches' mangled-name='PyErr_ExceptionMatches' filepath='./Include/pyerrors.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ExceptionMatches'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_NoMemory' mangled-name='PyErr_NoMemory' filepath='./Include/pyerrors.h' line='169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NoMemory'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_Format' mangled-name='PyErr_Format' filepath='./Include/pyerrors.h' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Format'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMem_Malloc' mangled-name='PyMem_Malloc' filepath='./Include/pymem.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Malloc'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyMem_Calloc' mangled-name='PyMem_Calloc' filepath='./Include/pymem.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Calloc'> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyMem_Realloc' mangled-name='PyMem_Realloc' filepath='./Include/pymem.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Realloc'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyMem_Free' mangled-name='PyMem_Free' filepath='./Include/pymem.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Free'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyOS_string_to_double' mangled-name='PyOS_string_to_double' filepath='./Include/pystrtod.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_string_to_double'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-239'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='PyUnicode_InternInPlace' mangled-name='PyUnicode_InternInPlace' filepath='./Include/unicodeobject.h' line='254' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternInPlace'> - <parameter type-id='type-id-233'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_InternFromString' mangled-name='PyUnicode_InternFromString' filepath='./Include/unicodeobject.h' line='255' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternFromString'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF8' mangled-name='PyUnicode_DecodeUTF8' filepath='./Include/unicodeobject.h' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF8'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_CompareWithASCIIString' mangled-name='PyUnicode_CompareWithASCIIString' filepath='./Include/unicodeobject.h' line='963' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CompareWithASCIIString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='__errno_location' filepath='/usr/include/errno.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-179'/> - </function-decl> - <function-decl name='strncpy' filepath='/usr/include/string.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='strncmp' filepath='/usr/include/string.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='strchr' filepath='/usr/include/string.h' line='246' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='strlen' filepath='/usr/include/string.h' line='407' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='_Pypegen_raise_decode_error' filepath='Parser/pegen.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_raise_tokenizer_init_error' filepath='Parser/pegen.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Pypegen_tokenizer_error' filepath='Parser/pegen.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_raise_error' filepath='Parser/pegen.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_raise_error_known_location' filepath='Parser/pegen.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-306'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_Pypegen_set_syntax_error' filepath='Parser/pegen.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <parameter type-id='type-id-569'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPegen_parse' filepath='Parser/pegen.h' line='364' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyTokenizer_FromString' filepath='Parser/tokenizer.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-1305'/> - </function-decl> - <function-decl name='_PyTokenizer_FromUTF8' filepath='Parser/tokenizer.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-1305'/> - </function-decl> - <function-decl name='_PyTokenizer_FromFile' filepath='Parser/tokenizer.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-1305'/> - </function-decl> - <function-decl name='_PyTokenizer_Free' filepath='Parser/tokenizer.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1305'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyToken_Free' filepath='Parser/tokenizer.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1329'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyToken_Init' filepath='Parser/tokenizer.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1329'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTokenizer_Get' filepath='Parser/tokenizer.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1305'/> - <parameter type-id='type-id-1329'/> - <return type-id='type-id-8'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1312'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1313'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1314'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1315'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1316'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1317'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-15'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1318'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1319'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1320'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1322'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1323'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1324'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1325'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-254'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1326'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1327'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1328'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-341'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1330'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-255'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1331'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-305'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1332'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1333'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-254'/> - <return type-id='type-id-46'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Parser/pegen_errors.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyErr_ProgramDecodedTextObject' mangled-name='_PyErr_ProgramDecodedTextObject' filepath='./Include/cpython/pyerrors.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ProgramDecodedTextObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_BuildValue' mangled-name='Py_BuildValue' filepath='./Include/modsupport.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_BuildValue'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_Str' mangled-name='PyObject_Str' filepath='./Include/object.h' line='403' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Str'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetNone' mangled-name='PyErr_SetNone' filepath='./Include/pyerrors.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetNone'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SetObject' mangled-name='PyErr_SetObject' filepath='./Include/pyerrors.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SetString' mangled-name='PyErr_SetString' filepath='./Include/pyerrors.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_Fetch' mangled-name='PyErr_Fetch' filepath='./Include/pyerrors.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Fetch'> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_Restore' mangled-name='PyErr_Restore' filepath='./Include/pyerrors.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Restore'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyTuple_Pack' mangled-name='PyTuple_Pack' filepath='./Include/tupleobject.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_Pack'> - <parameter type-id='type-id-14'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_FromStringAndSize' mangled-name='PyUnicode_FromStringAndSize' filepath='./Include/unicodeobject.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromStringAndSize'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_FromFormatV' mangled-name='PyUnicode_FromFormatV' filepath='./Include/unicodeobject.h' line='245' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromFormatV'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-306'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='memcpy' filepath='/usr/include/string.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyPegen_fill_token' filepath='Parser/pegen.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-568'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPegen_byte_offset_to_character_offset' filepath='Parser/pegen.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-14'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/string_parser.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-252'/> - <function-decl name='_PyBytes_DecodeEscape' mangled-name='_PyBytes_DecodeEscape' filepath='./Include/cpython/bytesobject.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_DecodeEscape'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-252'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_DecodeUnicodeEscapeInternal' mangled-name='_PyUnicode_DecodeUnicodeEscapeInternal' filepath='./Include/cpython/unicodeobject.h' line='685' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_DecodeUnicodeEscapeInternal'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-13'/> - <parameter type-id='type-id-252'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_WarnExplicitObject' mangled-name='PyErr_WarnExplicitObject' filepath='./Include/cpython/warnings.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_BadInternalCall' mangled-name='_PyErr_BadInternalCall' filepath='./Include/pyerrors.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_BadInternalCall'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_FromFormat' mangled-name='PyUnicode_FromFormat' filepath='./Include/unicodeobject.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromFormat'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_DecodeUTF8Stateful' mangled-name='PyUnicode_DecodeUTF8Stateful' filepath='./Include/unicodeobject.h' line='443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF8Stateful'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='sprintf' filepath='/usr/include/stdio.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/token.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-430' size-in-bits='4416' id='type-id-1334'> - <subrange length='69' type-id='type-id-28' id='type-id-1335'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-430' size-in-bits='infinite' id='type-id-1336'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <qualified-type-def type-id='type-id-12' const='yes' id='type-id-430'/> - <var-decl name='_PyParser_TokenNames' type-id='type-id-1336' mangled-name='_PyParser_TokenNames' visibility='default' filepath='./Include/internal/pycore_token.h' line='100' column='1' elf-symbol-id='_PyParser_TokenNames'/> - <function-decl name='_PyToken_OneChar' mangled-name='_PyToken_OneChar' filepath='Parser/token.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_OneChar'> - <parameter type-id='type-id-8' name='c1' filepath='Parser/token.c' line='83' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyToken_TwoChars' mangled-name='_PyToken_TwoChars' filepath='Parser/token.c' line='115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_TwoChars'> - <parameter type-id='type-id-8' name='c1' filepath='Parser/token.c' line='115' column='1'/> - <parameter type-id='type-id-8' name='c2' filepath='Parser/token.c' line='115' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyToken_ThreeChars' mangled-name='_PyToken_ThreeChars' filepath='Parser/token.c' line='199' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_ThreeChars'> - <parameter type-id='type-id-8' name='c1' filepath='Parser/token.c' line='199' column='1'/> - <parameter type-id='type-id-8' name='c2' filepath='Parser/token.c' line='199' column='1'/> - <parameter type-id='type-id-8' name='c3' filepath='Parser/token.c' line='199' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Parser/tokenizer.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <qualified-type-def type-id='type-id-84' const='yes' id='type-id-1337'/> - <pointer-type-def type-id='type-id-1337' size-in-bits='64' id='type-id-1338'/> - <pointer-type-def type-id='type-id-1338' size-in-bits='64' id='type-id-1339'/> - <pointer-type-def type-id='type-id-19' size-in-bits='64' id='type-id-441'/> - <function-decl name='PyObject_CallNoArgs' mangled-name='PyObject_CallNoArgs' filepath='./Include/abstract.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallNoArgs'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_CallFunction_SizeT' mangled-name='_PyObject_CallFunction_SizeT' filepath='./Include/abstract.h' line='198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallFunction_SizeT'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_CheckFunctionResult' mangled-name='_Py_CheckFunctionResult' filepath='./Include/cpython/abstract.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckFunctionResult'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyObject_MakeTpCall' mangled-name='_PyObject_MakeTpCall' filepath='./Include/cpython/abstract.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MakeTpCall'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_UniversalNewlineFgetsWithSize' mangled-name='_Py_UniversalNewlineFgetsWithSize' filepath='./Include/cpython/fileobject.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_UniversalNewlineFgetsWithSize'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-441'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_Py_FatalErrorFunc' mangled-name='_Py_FatalErrorFunc' filepath='./Include/cpython/pyerrors.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalErrorFunc'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_IsPrintable' mangled-name='_PyUnicode_IsPrintable' filepath='./Include/cpython/unicodeobject.h' line='894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsPrintable'> - <parameter type-id='type-id-250'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyUnicode_ScanIdentifier' mangled-name='_PyUnicode_ScanIdentifier' filepath='./Include/cpython/unicodeobject.h' line='961' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ScanIdentifier'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_Py_dup' mangled-name='_Py_dup' filepath='./Include/internal/pycore_fileutils.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_dup'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_BuildValue_SizeT' mangled-name='_Py_BuildValue_SizeT' filepath='./Include/modsupport.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_BuildValue_SizeT'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyObject_GetAttr' mangled-name='PyObject_GetAttr' filepath='./Include/object.h' line='411' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAttr'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetFromErrnoWithFilename' mangled-name='PyErr_SetFromErrnoWithFilename' filepath='./Include/pyerrors.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilename'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PySys_WriteStderr' mangled-name='PySys_WriteStderr' filepath='./Include/sysmodule.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStderr'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyUnicode_Substring' mangled-name='PyUnicode_Substring' filepath='./Include/unicodeobject.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Substring'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_Decode' mangled-name='PyUnicode_Decode' filepath='./Include/unicodeobject.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Decode'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsUTF8String' mangled-name='PyUnicode_AsUTF8String' filepath='./Include/unicodeobject.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8String'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnicode_AsUTF8AndSize' mangled-name='PyUnicode_AsUTF8AndSize' filepath='./Include/unicodeobject.h' line='466' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8AndSize'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-13'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='__ctype_b_loc' filepath='/usr/include/ctype.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-1339'/> - </function-decl> - <function-decl name='tolower' filepath='/usr/include/ctype.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fclose' filepath='/usr/include/stdio.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fdopen' filepath='/usr/include/stdio.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-229'/> - </function-decl> - <function-decl name='getc' filepath='/usr/include/stdio.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='ungetc' filepath='/usr/include/stdio.h' line='668' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-229'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='ftell' filepath='/usr/include/stdio.h' line='718' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='memcmp' filepath='/usr/include/string.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='memchr' filepath='/usr/include/string.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='strcspn' filepath='/usr/include/string.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-19'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/Python-ast.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyModule_AddIntConstant' mangled-name='PyModule_AddIntConstant' filepath='./Include/modsupport.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddIntConstant'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-47'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyInit__ast' mangled-name='PyInit__ast' filepath='Python/Python-ast.c' line='13062' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__ast'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/Python-tokenize.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyErr_SyntaxLocationObject' mangled-name='PyErr_SyntaxLocationObject' filepath='./Include/cpython/pyerrors.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocationObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyModule_AddType' mangled-name='PyModule_AddType' filepath='./Include/modsupport.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddType'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTokenizer_FromReadline' filepath='Python/../Parser/tokenizer.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-1305'/> - </function-decl> - <function-decl name='PyInit__tokenize' mangled-name='PyInit__tokenize' filepath='Python/Python-tokenize.c' line='364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__tokenize'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/_warnings.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_IsInterpreterFinalizing' mangled-name='_Py_IsInterpreterFinalizing' filepath='./Include/cpython/pylifecycle.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsInterpreterFinalizing'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySys_GetAttr' mangled-name='_PySys_GetAttr' filepath='./Include/cpython/sysmodule.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetAttr'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_DisplaySourceLine' mangled-name='_Py_DisplaySourceLine' filepath='./Include/cpython/traceback.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DisplaySourceLine'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_GetModules' filepath='./Include/internal/pycore_import.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_BlessMyLoader' filepath='./Include/internal/pycore_import.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyModule_AddObjectRef' mangled-name='PyModule_AddObjectRef' filepath='./Include/modsupport.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddObjectRef'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThreadState_GetFrame' mangled-name='PyThreadState_GetFrame' filepath='./Include/pystate.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetFrame'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='PyErr_ResourceWarning' mangled-name='PyErr_ResourceWarning' filepath='Python/_warnings.c' line='1240' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ResourceWarning'> - <parameter type-id='type-id-2' name='source' filepath='Python/_warnings.c' line='1240' column='1'/> - <parameter type-id='type-id-14' name='stack_level' filepath='Python/_warnings.c' line='1240' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/_warnings.c' line='1241' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_WarnExplicit' mangled-name='PyErr_WarnExplicit' filepath='Python/_warnings.c' line='1299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicit'> - <parameter type-id='type-id-2' name='category' filepath='Python/_warnings.c' line='1299' column='1'/> - <parameter type-id='type-id-12' name='text' filepath='Python/_warnings.c' line='1299' column='1'/> - <parameter type-id='type-id-12' name='filename_str' filepath='Python/_warnings.c' line='1300' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/_warnings.c' line='1300' column='1'/> - <parameter type-id='type-id-12' name='module_str' filepath='Python/_warnings.c' line='1301' column='1'/> - <parameter type-id='type-id-2' name='registry' filepath='Python/_warnings.c' line='1301' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_WarnExplicitFormat' mangled-name='PyErr_WarnExplicitFormat' filepath='Python/_warnings.c' line='1331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitFormat'> - <parameter type-id='type-id-2' name='category' filepath='Python/_warnings.c' line='1331' column='1'/> - <parameter type-id='type-id-12' name='filename_str' filepath='Python/_warnings.c' line='1332' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/_warnings.c' line='1332' column='1'/> - <parameter type-id='type-id-12' name='module_str' filepath='Python/_warnings.c' line='1333' column='1'/> - <parameter type-id='type-id-2' name='registry' filepath='Python/_warnings.c' line='1333' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/_warnings.c' line='1334' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyWarnings_Init' mangled-name='_PyWarnings_Init' filepath='Python/_warnings.c' line='1471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWarnings_Init'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/assemble.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyCompile_ConstCacheMergeOne' filepath='./Include/internal/pycore_compile.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCompile_InstrSize' filepath='./Include/internal/pycore_compile.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_set_localsplus_info' filepath='Python/assemble.c' line='445' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-85'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/ast_opt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyAST_GetDocString' filepath='./Include/internal/pycore_ast.h' line='917' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-500'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='snprintf' filepath='/usr/include/stdio.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/bltinmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-1152' size-in-bits='64' id='type-id-1340'/> - <var-decl name='PyFilter_Type' type-id='type-id-256' mangled-name='PyFilter_Type' visibility='default' filepath='./Include/bltinmodule.h' line='7' column='1' elf-symbol-id='PyFilter_Type'/> - <var-decl name='PyMap_Type' type-id='type-id-256' mangled-name='PyMap_Type' visibility='default' filepath='./Include/bltinmodule.h' line='8' column='1' elf-symbol-id='PyMap_Type'/> - <var-decl name='PyZip_Type' type-id='type-id-256' mangled-name='PyZip_Type' visibility='default' filepath='./Include/bltinmodule.h' line='9' column='1' elf-symbol-id='PyZip_Type'/> - <function-decl name='PyEval_EvalCode' mangled-name='PyEval_EvalCode' filepath='./Include/ceval.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalCode'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_EvalCodeEx' mangled-name='PyEval_EvalCodeEx' filepath='./Include/ceval.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalCodeEx'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_GetBuiltins' mangled-name='PyEval_GetBuiltins' filepath='./Include/ceval.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetBuiltins'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_MergeCompilerFlags' mangled-name='PyEval_MergeCompilerFlags' filepath='./Include/cpython/ceval.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_MergeCompilerFlags'> - <parameter type-id='type-id-208'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_StringFlags' mangled-name='PyRun_StringFlags' filepath='./Include/cpython/pythonrun.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_StringFlags'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-208'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_CompileStringObject' mangled-name='Py_CompileStringObject' filepath='./Include/cpython/pythonrun.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringObject'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_SourceAsString' mangled-name='_Py_SourceAsString' filepath='./Include/cpython/pythonrun.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SourceAsString'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyImport_ImportModuleLevelObject' mangled-name='PyImport_ImportModuleLevelObject' filepath='./Include/import.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleLevelObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyAST_obj2mod' filepath='./Include/internal/pycore_ast.h' line='906' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-563'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-468'/> - </function-decl> - <function-decl name='PyAST_Check' filepath='./Include/internal/pycore_ast.h' line='907' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyAST_Validate' filepath='./Include/internal/pycore_ast.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-468'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyAST_Compile' mangled-name='_PyAST_Compile' filepath='./Include/internal/pycore_compile.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyAST_Compile'> - <parameter type-id='type-id-467'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1340'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='_PyFloat_ExactDealloc' filepath='./Include/internal/pycore_floatobject.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyArena_New' mangled-name='_PyArena_New' filepath='./Include/internal/pycore_pyarena.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_New'> - <return type-id='type-id-563'/> - </function-decl> - <function-decl name='_PyArena_Free' mangled-name='_PyArena_Free' filepath='./Include/internal/pycore_pyarena.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_Free'> - <parameter type-id='type-id-563'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_GetObject' mangled-name='PySys_GetObject' filepath='./Include/sysmodule.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetObject'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyAnextAwaitable_New' filepath='Python/bltinmodule.c' line='1664' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/bootstrap_hash.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_fstat' mangled-name='_Py_fstat' filepath='./Include/internal/pycore_fileutils.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fstat'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-51'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_open' mangled-name='_Py_open' filepath='./Include/internal/pycore_fileutils.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_open'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_open_noraise' mangled-name='_Py_open_noraise' filepath='./Include/internal/pycore_fileutils.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_open_noraise'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_read' mangled-name='_Py_read' filepath='./Include/internal/pycore_fileutils.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_read'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='close' filepath='/usr/include/unistd.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='read' filepath='/usr/include/unistd.h' line='371' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='getrandom' filepath='/usr/include/x86_64-linux-gnu/sys/random.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='_PyOS_URandom' mangled-name='_PyOS_URandom' filepath='Python/bootstrap_hash.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_URandom'> - <parameter type-id='type-id-22' name='buffer' filepath='Python/bootstrap_hash.c' line='527' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Python/bootstrap_hash.c' line='527' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyOS_URandomNonblock' mangled-name='_PyOS_URandomNonblock' filepath='Python/bootstrap_hash.c' line='541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_URandomNonblock'> - <parameter type-id='type-id-22' name='buffer' filepath='Python/bootstrap_hash.c' line='541' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Python/bootstrap_hash.c' line='541' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/ceval.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyEval_SetProfile' mangled-name='_PyEval_SetProfile' filepath='./Include/cpython/ceval.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SetProfile'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-766'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_SetTrace' mangled-name='_PyEval_SetTrace' filepath='./Include/cpython/ceval.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SetTrace'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-766'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_GetTopmostException' mangled-name='_PyErr_GetTopmostException' filepath='./Include/cpython/pyerrors.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_GetTopmostException'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-376'/> - </function-decl> - <function-decl name='_PyErr_WriteUnraisableMsg' mangled-name='_PyErr_WriteUnraisableMsg' filepath='./Include/cpython/pyerrors.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_WriteUnraisableMsg'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_SetImportErrorWithNameFrom' filepath='./Include/cpython/pyerrors.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInterpreterState_ThreadHead' mangled-name='PyInterpreterState_ThreadHead' filepath='./Include/cpython/pystate.h' line='317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_ThreadHead'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyThreadState_Next' mangled-name='PyThreadState_Next' filepath='./Include/cpython/pystate.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Next'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='_PyNumber_PowerNoMod' filepath='./Include/internal/pycore_abstract.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyNumber_InPlacePowerNoMod' filepath='./Include/internal/pycore_abstract.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyStack_UnpackDict' filepath='./Include/internal/pycore_call.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-248'/> - </function-decl> - <function-decl name='_PyStack_UnpackDict_FreeNoDecRef' filepath='./Include/internal/pycore_call.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_MakeCoro' filepath='./Include/internal/pycore_ceval.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-310'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_HandlePending' filepath='./Include/internal/pycore_ceval.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_Specialize_LoadSuperAttr' filepath='./Include/internal/pycore_code.h' line='227' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_LoadAttr' filepath='./Include/internal/pycore_code.h' line='229' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_StoreAttr' filepath='./Include/internal/pycore_code.h' line='231' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_LoadGlobal' filepath='./Include/internal/pycore_code.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_BinarySubscr' filepath='./Include/internal/pycore_code.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_StoreSubscr' filepath='./Include/internal/pycore_code.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_Call' filepath='./Include/internal/pycore_code.h' line='239' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_BinaryOp' filepath='./Include/internal/pycore_code.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_CompareOp' filepath='./Include/internal/pycore_code.h' line='243' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_UnpackSequence' filepath='./Include/internal/pycore_code.h' line='245' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_ForIter' filepath='./Include/internal/pycore_code.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Specialize_Send' filepath='./Include/internal/pycore_code.h' line='248' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Instrument' filepath='./Include/internal/pycore_code.h' line='486' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_LoadGlobal' filepath='./Include/internal/pycore_dict.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyDict_SetItem_Take2' filepath='./Include/internal/pycore_dict.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDict_SendEvent' filepath='./Include/internal/pycore_dict.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-729'/> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFrame_GetLocals' filepath='./Include/internal/pycore_frame.h' line='230' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyFrame_FastToLocalsWithError' filepath='./Include/internal/pycore_frame.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThreadState_PushFrame' filepath='./Include/internal/pycore_frame.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-374'/> - </function-decl> - <function-decl name='_PyThreadState_PopFrame' filepath='./Include/internal/pycore_frame.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-374'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGen_yf' filepath='./Include/internal/pycore_genobject.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-373'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_IsDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation' filepath='./Include/internal/pycore_instruments.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_line' filepath='./Include/internal/pycore_instruments.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_instruction' filepath='./Include/internal/pycore_instruments.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_jump' filepath='./Include/internal/pycore_instruments.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-850'/> - <return type-id='type-id-850'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_arg' filepath='./Include/internal/pycore_instruments.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_2args' filepath='./Include/internal/pycore_instruments.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_call_instrumentation_exc2' filepath='./Include/internal/pycore_instruments.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-850'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyList_AppendTakeRefListResize' filepath='./Include/internal/pycore_list.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-249'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyList_FromArraySteal' filepath='./Include/internal/pycore_list.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_Add' filepath='./Include/internal/pycore_long.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-241'/> - <parameter type-id='type-id-241'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_Multiply' filepath='./Include/internal/pycore_long.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-241'/> - <parameter type-id='type-id-241'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyLong_Subtract' filepath='./Include/internal/pycore_long.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-241'/> - <parameter type-id='type-id-241'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_SetObject' mangled-name='_PyErr_SetObject' filepath='./Include/internal/pycore_pyerrors.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetObject'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyBuildSlice_ConsumeRefs' filepath='./Include/internal/pycore_sliceobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PySys_Audit' filepath='./Include/internal/pycore_sysmodule.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTuple_FromArraySteal' filepath='./Include/internal/pycore_tuple.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-248'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PySuper_Lookup' filepath='./Include/internal/pycore_typeobject.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyUnicode_ExactDealloc' filepath='./Include/internal/pycore_unicodeobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SetHandledException' mangled-name='PyErr_SetHandledException' filepath='./Include/pyerrors.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetHandledException'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyTraceBack_Here' mangled-name='PyTraceBack_Here' filepath='./Include/traceback.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceBack_Here'> - <parameter type-id='type-id-365'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_GetRecursionLimit' mangled-name='Py_GetRecursionLimit' filepath='Python/ceval.c' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetRecursionLimit'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_SetRecursionLimit' mangled-name='Py_SetRecursionLimit' filepath='Python/ceval.c' line='243' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetRecursionLimit'> - <parameter type-id='type-id-8' name='new_limit' filepath='Python/ceval.c' line='243' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_EvalFrame' mangled-name='PyEval_EvalFrame' filepath='Python/ceval.c' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrame'> - <parameter type-id='type-id-365' name='f' filepath='Python/ceval.c' line='579' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_EvalFrameEx' mangled-name='PyEval_EvalFrameEx' filepath='Python/ceval.c' line='587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrameEx'> - <parameter type-id='type-id-365' name='f' filepath='Python/ceval.c' line='587' column='1'/> - <parameter type-id='type-id-8' name='throwflag' filepath='Python/ceval.c' line='587' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyThreadState_EnterTracing' mangled-name='PyThreadState_EnterTracing' filepath='Python/ceval.c' line='2108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_EnterTracing'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/ceval.c' line='2108' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThreadState_LeaveTracing' mangled-name='PyThreadState_LeaveTracing' filepath='Python/ceval.c' line='2115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_LeaveTracing'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/ceval.c' line='2115' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_SetProfile' mangled-name='PyEval_SetProfile' filepath='Python/ceval.c' line='2139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfile'> - <parameter type-id='type-id-766' name='func' filepath='Python/ceval.c' line='2139' column='1'/> - <parameter type-id='type-id-2' name='arg' filepath='Python/ceval.c' line='2139' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_SetProfileAllThreads' mangled-name='PyEval_SetProfileAllThreads' filepath='Python/ceval.c' line='2149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfileAllThreads'> - <parameter type-id='type-id-766' name='func' filepath='Python/ceval.c' line='2149' column='1'/> - <parameter type-id='type-id-2' name='arg' filepath='Python/ceval.c' line='2149' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_SetTrace' mangled-name='PyEval_SetTrace' filepath='Python/ceval.c' line='2170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTrace'> - <parameter type-id='type-id-766' name='func' filepath='Python/ceval.c' line='2170' column='1'/> - <parameter type-id='type-id-2' name='arg' filepath='Python/ceval.c' line='2170' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_SetTraceAllThreads' mangled-name='PyEval_SetTraceAllThreads' filepath='Python/ceval.c' line='2180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTraceAllThreads'> - <parameter type-id='type-id-766' name='func' filepath='Python/ceval.c' line='2180' column='1'/> - <parameter type-id='type-id-2' name='arg' filepath='Python/ceval.c' line='2180' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_GetFrame' mangled-name='PyEval_GetFrame' filepath='Python/ceval.c' line='2268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrame'> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='_PyEval_GetBuiltinId' mangled-name='_PyEval_GetBuiltinId' filepath='Python/ceval.c' line='2314' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetBuiltinId'> - <parameter type-id='type-id-309' name='name' filepath='Python/ceval.c' line='2314' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_GetLocals' mangled-name='PyEval_GetLocals' filepath='Python/ceval.c' line='2320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetLocals'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyEval_GetFuncName' mangled-name='PyEval_GetFuncName' filepath='Python/ceval.c' line='2382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncName'> - <parameter type-id='type-id-2' name='func' filepath='Python/ceval.c' line='2382' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyEval_GetFuncDesc' mangled-name='PyEval_GetFuncDesc' filepath='Python/ceval.c' line='2395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncDesc'> - <parameter type-id='type-id-2' name='func' filepath='Python/ceval.c' line='2395' column='1'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyUnstable_Eval_RequestCodeExtraIndex' mangled-name='PyUnstable_Eval_RequestCodeExtraIndex' filepath='Python/ceval.c' line='2767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Eval_RequestCodeExtraIndex'> - <parameter type-id='type-id-397' name='free' filepath='Python/ceval.c' line='2767' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='Py_EnterRecursiveCall' mangled-name='Py_EnterRecursiveCall' filepath='Python/ceval.c' line='2783' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EnterRecursiveCall'> - <parameter type-id='type-id-12' name='where' filepath='Python/ceval.c' line='2783' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_LeaveRecursiveCall' mangled-name='Py_LeaveRecursiveCall' filepath='Python/ceval.c' line='2788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_LeaveRecursiveCall'> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/ceval_gil.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='type-id-1341' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='32' column='1' id='type-id-1342'> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-620' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='34' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='35' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_mutexattr_t' type-id='type-id-1342' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='36' column='1' id='type-id-1341'/> - <typedef-decl name='__time_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='160' column='1' id='type-id-1343'/> - <typedef-decl name='__syscall_slong_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='197' column='1' id='type-id-116'/> - <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1' id='type-id-1344'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='type-id-1343' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tv_nsec' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='21' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-801' size-in-bits='64' id='type-id-1345'/> - <qualified-type-def type-id='type-id-1341' const='yes' id='type-id-1346'/> - <pointer-type-def type-id='type-id-1346' size-in-bits='64' id='type-id-1347'/> - <qualified-type-def type-id='type-id-1344' const='yes' id='type-id-1348'/> - <pointer-type-def type-id='type-id-1348' size-in-bits='64' id='type-id-188'/> - <qualified-type-def type-id='type-id-188' restrict='yes' id='type-id-206'/> - <pointer-type-def type-id='type-id-858' size-in-bits='64' id='type-id-1349'/> - <qualified-type-def type-id='type-id-1349' restrict='yes' id='type-id-1350'/> - <pointer-type-def type-id='type-id-859' size-in-bits='64' id='type-id-1351'/> - <qualified-type-def type-id='type-id-1351' restrict='yes' id='type-id-1352'/> - <pointer-type-def type-id='type-id-1344' size-in-bits='64' id='type-id-180'/> - <function-decl name='_PyThread_at_fork_reinit' mangled-name='_PyThread_at_fork_reinit' filepath='./Include/cpython/pythread.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_at_fork_reinit'> - <parameter type-id='type-id-1345'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThreadState_SwapNoGIL' filepath='./Include/internal/pycore_ceval.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='_Py_RunGC' filepath='./Include/internal/pycore_gc.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_CheckSignalsTstate' mangled-name='_PyErr_CheckSignalsTstate' filepath='./Include/internal/pycore_pyerrors.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_CheckSignalsTstate'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_Print' mangled-name='_PyErr_Print' filepath='./Include/internal/pycore_pylifecycle.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Print'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThreadState_DeleteExcept' mangled-name='_PyThreadState_DeleteExcept' filepath='./Include/internal/pycore_pystate.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_DeleteExcept'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_init_thread' mangled-name='PyThread_init_thread' filepath='./Include/pythread.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_init_thread'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_exit_thread' mangled-name='PyThread_exit_thread' filepath='./Include/pythread.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_exit_thread'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_get_thread_ident' mangled-name='PyThread_get_thread_ident' filepath='./Include/pythread.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_thread_ident'> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyThread_free_lock' mangled-name='PyThread_free_lock' filepath='./Include/pythread.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_free_lock'> - <parameter type-id='type-id-801'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='pthread_mutex_init' filepath='/usr/include/pthread.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1351'/> - <parameter type-id='type-id-1347'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_mutex_destroy' filepath='/usr/include/pthread.h' line='786' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1351'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_mutex_lock' filepath='/usr/include/pthread.h' line='794' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1351'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_mutex_unlock' filepath='/usr/include/pthread.h' line='835' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1351'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_cond_destroy' filepath='/usr/include/pthread.h' line='1117' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1349'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_cond_signal' filepath='/usr/include/pthread.h' line='1121' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1349'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_cond_wait' filepath='/usr/include/pthread.h' line='1133' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1350'/> - <parameter type-id='type-id-1352'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_cond_timedwait' filepath='/usr/include/pthread.h' line='1145' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1350'/> - <parameter type-id='type-id-1352'/> - <parameter type-id='type-id-206'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_SetSwitchInterval' mangled-name='_PyEval_SetSwitchInterval' filepath='Python/ceval_gil.c' line='492' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SetSwitchInterval'> - <parameter type-id='type-id-28' name='microseconds' filepath='Python/ceval_gil.c' line='492' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_GetSwitchInterval' mangled-name='_PyEval_GetSwitchInterval' filepath='Python/ceval_gil.c' line='500' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetSwitchInterval'> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyEval_ThreadsInitialized' mangled-name='PyEval_ThreadsInitialized' filepath='Python/ceval_gil.c' line='524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ThreadsInitialized'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyEval_InitThreads' mangled-name='PyEval_InitThreads' filepath='Python/ceval_gil.c' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_InitThreads'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_AcquireLock' mangled-name='PyEval_AcquireLock' filepath='Python/ceval_gil.c' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_AcquireLock'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_ReleaseLock' mangled-name='PyEval_ReleaseLock' filepath='Python/ceval_gil.c' line='634' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ReleaseLock'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_AcquireThread' mangled-name='PyEval_AcquireThread' filepath='Python/ceval_gil.c' line='662' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_AcquireThread'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/ceval_gil.c' line='662' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyEval_ReleaseThread' mangled-name='PyEval_ReleaseThread' filepath='Python/ceval_gil.c' line='674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ReleaseThread'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/ceval_gil.c' line='674' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_SignalAsyncExc' mangled-name='_PyEval_SignalAsyncExc' filepath='Python/ceval_gil.c' line='718' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SignalAsyncExc'> - <parameter type-id='type-id-20' name='interp' filepath='Python/ceval_gil.c' line='718' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_SignalReceived' mangled-name='_PyEval_SignalReceived' filepath='Python/ceval_gil.c' line='769' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SignalReceived'> - <parameter type-id='type-id-20' name='interp' filepath='Python/ceval_gil.c' line='769' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_AddPendingCall' mangled-name='_PyEval_AddPendingCall' filepath='Python/ceval_gil.c' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_AddPendingCall'> - <parameter type-id='type-id-20' name='interp' filepath='Python/ceval_gil.c' line='838' column='1'/> - <parameter type-id='type-id-814' name='func' filepath='Python/ceval_gil.c' line='839' column='1'/> - <parameter type-id='type-id-22' name='arg' filepath='Python/ceval_gil.c' line='839' column='1'/> - <parameter type-id='type-id-8' name='mainthreadonly' filepath='Python/ceval_gil.c' line='840' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_AddPendingCall' mangled-name='Py_AddPendingCall' filepath='Python/ceval_gil.c' line='863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AddPendingCall'> - <parameter type-id='type-id-814' name='func' filepath='Python/ceval_gil.c' line='863' column='1'/> - <parameter type-id='type-id-22' name='arg' filepath='Python/ceval_gil.c' line='863' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_MakePendingCalls' mangled-name='_PyEval_MakePendingCalls' filepath='Python/ceval_gil.c' line='991' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MakePendingCalls'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/ceval_gil.c' line='991' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_MakePendingCalls' mangled-name='Py_MakePendingCalls' filepath='Python/ceval_gil.c' line='1016' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_MakePendingCalls'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThread_cond_init' filepath='Python/condvar.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1349'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThread_cond_after' filepath='Python/condvar.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-378'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/codecs.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='Py_hexdigits' type-id='type-id-12' mangled-name='Py_hexdigits' visibility='default' filepath='./Include/codecs.h' line='242' column='1' elf-symbol-id='Py_hexdigits'/> - <function-decl name='PyCodec_Register' mangled-name='PyCodec_Register' filepath='Python/codecs.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Register'> - <parameter type-id='type-id-2' name='search_function' filepath='Python/codecs.c' line='36' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCodec_Unregister' mangled-name='PyCodec_Unregister' filepath='Python/codecs.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Unregister'> - <parameter type-id='type-id-2' name='search_function' filepath='Python/codecs.c' line='56' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_normalize_encoding' filepath='Python/codecs.c' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCodec_KnownEncoding' mangled-name='PyCodec_KnownEncoding' filepath='Python/codecs.c' line='215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_KnownEncoding'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='215' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCodecInfo_GetIncrementalDecoder' mangled-name='_PyCodecInfo_GetIncrementalDecoder' filepath='Python/codecs.c' line='329' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodecInfo_GetIncrementalDecoder'> - <parameter type-id='type-id-2' name='codec_info' filepath='Python/codecs.c' line='329' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='330' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCodecInfo_GetIncrementalEncoder' mangled-name='_PyCodecInfo_GetIncrementalEncoder' filepath='Python/codecs.c' line='336' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodecInfo_GetIncrementalEncoder'> - <parameter type-id='type-id-2' name='codec_info' filepath='Python/codecs.c' line='336' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='337' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_Encoder' mangled-name='PyCodec_Encoder' filepath='Python/codecs.c' line='350' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Encoder'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='350' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_Decoder' mangled-name='PyCodec_Decoder' filepath='Python/codecs.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Decoder'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='355' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_IncrementalEncoder' mangled-name='PyCodec_IncrementalEncoder' filepath='Python/codecs.c' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IncrementalEncoder'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='360' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='361' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_IncrementalDecoder' mangled-name='PyCodec_IncrementalDecoder' filepath='Python/codecs.c' line='366' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IncrementalDecoder'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='366' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='367' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_StreamReader' mangled-name='PyCodec_StreamReader' filepath='Python/codecs.c' line='372' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StreamReader'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='372' column='1'/> - <parameter type-id='type-id-2' name='stream' filepath='Python/codecs.c' line='373' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='374' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_StreamWriter' mangled-name='PyCodec_StreamWriter' filepath='Python/codecs.c' line='379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StreamWriter'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='379' column='1'/> - <parameter type-id='type-id-2' name='stream' filepath='Python/codecs.c' line='380' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/codecs.c' line='381' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCodec_LookupTextEncoding' mangled-name='_PyCodec_LookupTextEncoding' filepath='Python/codecs.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCodec_LookupTextEncoding'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/codecs.c' line='503' column='1'/> - <parameter type-id='type-id-12' name='alternate_command' filepath='Python/codecs.c' line='504' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_RegisterError' mangled-name='PyCodec_RegisterError' filepath='Python/codecs.c' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_RegisterError'> - <parameter type-id='type-id-12' name='name' filepath='Python/codecs.c' line='602' column='1'/> - <parameter type-id='type-id-2' name='error' filepath='Python/codecs.c' line='602' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCodec_IgnoreErrors' mangled-name='PyCodec_IgnoreErrors' filepath='Python/codecs.c' line='655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IgnoreErrors'> - <parameter type-id='type-id-2' name='exc' filepath='Python/codecs.c' line='655' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_ReplaceErrors' mangled-name='PyCodec_ReplaceErrors' filepath='Python/codecs.c' line='679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_ReplaceErrors'> - <parameter type-id='type-id-2' name='exc' filepath='Python/codecs.c' line='679' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_XMLCharRefReplaceErrors' mangled-name='PyCodec_XMLCharRefReplaceErrors' filepath='Python/codecs.c' line='732' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_XMLCharRefReplaceErrors'> - <parameter type-id='type-id-2' name='exc' filepath='Python/codecs.c' line='732' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_BackslashReplaceErrors' mangled-name='PyCodec_BackslashReplaceErrors' filepath='Python/codecs.c' line='830' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_BackslashReplaceErrors'> - <parameter type-id='type-id-2' name='exc' filepath='Python/codecs.c' line='830' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyCodec_NameReplaceErrors' mangled-name='PyCodec_NameReplaceErrors' filepath='Python/codecs.c' line='939' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_NameReplaceErrors'> - <parameter type-id='type-id-2' name='exc' filepath='Python/codecs.c' line='939' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/compile.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-1353' size-in-bits='1344' id='type-id-1354'> - <subrange length='21' type-id='type-id-28' id='type-id-670'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1355' size-in-bits='288' id='type-id-1356'> - <subrange length='9' type-id='type-id-28' id='type-id-695'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-326' size-in-bits='2048' id='type-id-1357'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <class-decl name='_PyCompilerSrcLocation' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1358' visibility='default' filepath='./Include/cpython/compile.h' line='35' column='1' id='type-id-1359'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='lineno' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='col_offset' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='39' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCompilerSrcLocation' type-id='type-id-1359' filepath='./Include/cpython/compile.h' line='40' column='1' id='type-id-1358'/> - <class-decl name='PyFutureFeatures' size-in-bits='160' is-struct='yes' naming-typedef-id='type-id-1360' visibility='default' filepath='./Include/cpython/compile.h' line='51' column='1' id='type-id-1361'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ff_features' type-id='type-id-8' visibility='default' filepath='./Include/cpython/compile.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ff_location' type-id='type-id-1358' visibility='default' filepath='./Include/cpython/compile.h' line='53' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyFutureFeatures' type-id='type-id-1361' filepath='./Include/cpython/compile.h' line='54' column='1' id='type-id-1360'/> - <class-decl name='_PyASTOptimizeState' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1362' visibility='default' filepath='./Include/internal/pycore_compile.h' line='24' column='1' id='type-id-1363'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='optimize' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='25' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='ff_features' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='26' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='recursion_depth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='28' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='recursion_limit' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='29' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyASTOptimizeState' type-id='type-id-1363' filepath='./Include/internal/pycore_compile.h' line='30' column='1' id='type-id-1362'/> - <class-decl name='_PyCompile_ExceptHandlerInfo' size-in-bits='96' is-struct='yes' naming-typedef-id='type-id-1364' visibility='default' filepath='./Include/internal/pycore_compile.h' line='37' column='1' id='type-id-1365'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='h_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='h_startdepth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='h_preserve_lasti' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='40' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCompile_ExceptHandlerInfo' type-id='type-id-1365' filepath='./Include/internal/pycore_compile.h' line='41' column='1' id='type-id-1364'/> - <class-decl name='_PyCompile_Instruction' size-in-bits='288' is-struct='yes' naming-typedef-id='type-id-1366' visibility='default' filepath='./Include/internal/pycore_compile.h' line='43' column='1' id='type-id-1367'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='i_opcode' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='i_oparg' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='i_loc' type-id='type-id-1358' visibility='default' filepath='./Include/internal/pycore_compile.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='i_except_handler_info' type-id='type-id-1364' visibility='default' filepath='./Include/internal/pycore_compile.h' line='47' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCompile_Instruction' type-id='type-id-1367' filepath='./Include/internal/pycore_compile.h' line='48' column='1' id='type-id-1366'/> - <class-decl name='_PyCompile_InstructionSequence' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1368' visibility='default' filepath='./Include/internal/pycore_compile.h' line='50' column='1' id='type-id-1369'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='s_instrs' type-id='type-id-1370' visibility='default' filepath='./Include/internal/pycore_compile.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='s_allocated' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='s_used' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='s_labelmap' type-id='type-id-179' visibility='default' filepath='./Include/internal/pycore_compile.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='s_labelmap_size' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='s_next_free_label' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='57' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCompile_InstructionSequence' type-id='type-id-1369' filepath='./Include/internal/pycore_compile.h' line='58' column='1' id='type-id-1368'/> - <class-decl name='_PyCompile_CodeUnitMetadata' size-in-bits='768' is-struct='yes' naming-typedef-id='type-id-1371' visibility='default' filepath='./Include/internal/pycore_compile.h' line='60' column='1' id='type-id-1372'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='u_name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='u_qualname' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='u_consts' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='u_names' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='u_varnames' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='u_cellvars' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='u_freevars' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='u_fasthidden' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_compile.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='u_argcount' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_compile.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='u_posonlyargcount' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_compile.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='u_kwonlyargcount' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_compile.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='u_firstlineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_compile.h' line='81' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCompile_CodeUnitMetadata' type-id='type-id-1372' filepath='./Include/internal/pycore_compile.h' line='82' column='1' id='type-id-1371'/> - <class-decl name='_PyCfgInstruction' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1373' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='15' column='1' id='type-id-1374'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='i_opcode' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='i_oparg' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='i_loc' type-id='type-id-1358' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='18' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='i_target' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='19' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='i_except' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='20' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCfgInstruction' type-id='type-id-1374' filepath='./Include/internal/pycore_flowgraph.h' line='21' column='1' id='type-id-1373'/> - <class-decl name='_PyCfgJumpTargetLabel' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1375' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='23' column='1' id='type-id-1376'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='id' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='24' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCfgJumpTargetLabel' type-id='type-id-1376' filepath='./Include/internal/pycore_flowgraph.h' line='25' column='1' id='type-id-1375'/> - <class-decl name='_PyCfgExceptStack' size-in-bits='1408' is-struct='yes' naming-typedef-id='type-id-1377' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='28' column='1' id='type-id-1378'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='handlers' type-id='type-id-1354' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='29' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='1344'> - <var-decl name='depth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='30' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCfgExceptStack' type-id='type-id-1378' filepath='./Include/internal/pycore_flowgraph.h' line='31' column='1' id='type-id-1377'/> - <class-decl name='_PyCfgBasicblock_' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='33' column='1' id='type-id-1379'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='b_list' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='b_label' type-id='type-id-1375' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='40' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='b_exceptstack' type-id='type-id-1380' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='b_instr' type-id='type-id-1381' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='b_next' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='b_iused' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='b_ialloc' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='51' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='b_unsafe_locals_mask' type-id='type-id-117' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='53' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='b_predecessors' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='480'> - <var-decl name='b_startdepth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='b_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='544'> - <var-decl name='b_preserve_lasti' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='545'> - <var-decl name='b_visited' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='546'> - <var-decl name='b_except_handler' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='547'> - <var-decl name='b_cold' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='548'> - <var-decl name='b_warm' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='69' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCfgBasicblock' type-id='type-id-1379' filepath='./Include/internal/pycore_flowgraph.h' line='70' column='1' id='type-id-1382'/> - <class-decl name='cfg_builder_' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='74' column='1' id='type-id-1383'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='g_entryblock' type-id='type-id-1384' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='g_block_list' type-id='type-id-1384' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='g_curblock' type-id='type-id-1384' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='g_current_label' type-id='type-id-1375' visibility='default' filepath='./Include/internal/pycore_flowgraph.h' line='84' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyCfgBuilder' type-id='type-id-1383' filepath='./Include/internal/pycore_flowgraph.h' line='85' column='1' id='type-id-1385'/> - <enum-decl name='_block_type' filepath='./Include/internal/pycore_symtable.h' line='13' column='1' id='type-id-1386'> - <underlying-type type-id='type-id-24'/> - <enumerator name='FunctionBlock' value='0'/> - <enumerator name='ClassBlock' value='1'/> - <enumerator name='ModuleBlock' value='2'/> - <enumerator name='AnnotationBlock' value='3'/> - <enumerator name='TypeVarBoundBlock' value='4'/> - <enumerator name='TypeAliasBlock' value='5'/> - <enumerator name='TypeParamBlock' value='6'/> - </enum-decl> - <typedef-decl name='_Py_block_ty' type-id='type-id-1386' filepath='./Include/internal/pycore_symtable.h' line='23' column='1' id='type-id-1387'/> - <enum-decl name='_comprehension_type' filepath='./Include/internal/pycore_symtable.h' line='25' column='1' id='type-id-1388'> - <underlying-type type-id='type-id-24'/> - <enumerator name='NoComprehension' value='0'/> - <enumerator name='ListComprehension' value='1'/> - <enumerator name='DictComprehension' value='2'/> - <enumerator name='SetComprehension' value='3'/> - <enumerator name='GeneratorExpression' value='4'/> - </enum-decl> - <typedef-decl name='_Py_comprehension_ty' type-id='type-id-1388' filepath='./Include/internal/pycore_symtable.h' line='30' column='1' id='type-id-1389'/> - <class-decl name='symtable' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='34' column='1' id='type-id-1390'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='st_filename' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_cur' type-id='type-id-1391' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='37' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_top' type-id='type-id-1391' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='38' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='st_blocks' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='39' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='st_stack' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='41' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='st_global' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='42' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='st_nblocks' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='43' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='st_private' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='46' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='st_future' type-id='type-id-1392' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='recursion_depth' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='49' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='608'> - <var-decl name='recursion_limit' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='50' column='1'/> - </data-member> - </class-decl> - <class-decl name='_symtable_entry' size-in-bits='960' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='53' column='1' id='type-id-1393'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='ob_base' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='54' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='ste_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='ste_symbols' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='ste_name' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='ste_varnames' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='58' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='ste_children' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='59' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='ste_directives' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='ste_type' type-id='type-id-1387' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='544'> - <var-decl name='ste_nested' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='ste_free' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='577'> - <var-decl name='ste_child_free' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='64' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='578'> - <var-decl name='ste_generator' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='579'> - <var-decl name='ste_coroutine' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='608'> - <var-decl name='ste_comprehension' type-id='type-id-1389' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='ste_varargs' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='641'> - <var-decl name='ste_varkeywords' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='642'> - <var-decl name='ste_returns_value' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='643'> - <var-decl name='ste_needs_class_closure' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='644'> - <var-decl name='ste_needs_classdict' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='645'> - <var-decl name='ste_comp_inlined' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='646'> - <var-decl name='ste_comp_iter_target' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='647'> - <var-decl name='ste_can_see_class_scope' type-id='type-id-95' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='672'> - <var-decl name='ste_comp_iter_expr' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='ste_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='83' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='ste_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='768'> - <var-decl name='ste_end_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='85' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='800'> - <var-decl name='ste_end_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='86' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='ste_opt_lineno' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='864'> - <var-decl name='ste_opt_col_offset' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='896'> - <var-decl name='ste_table' type-id='type-id-209' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='89' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PySTEntryObject' type-id='type-id-1393' filepath='./Include/internal/pycore_symtable.h' line='90' column='1' id='type-id-1394'/> - <typedef-decl name='basicblock' type-id='type-id-1382' filepath='Python/compile.c' line='90' column='1' id='type-id-1395'/> - <pointer-type-def type-id='type-id-1360' size-in-bits='64' id='type-id-1392'/> - <pointer-type-def type-id='type-id-1394' size-in-bits='64' id='type-id-1396'/> - <pointer-type-def type-id='type-id-1362' size-in-bits='64' id='type-id-1397'/> - <pointer-type-def type-id='type-id-1382' size-in-bits='64' id='type-id-1384'/> - <pointer-type-def type-id='type-id-1379' size-in-bits='64' id='type-id-1353'/> - <pointer-type-def type-id='type-id-1385' size-in-bits='64' id='type-id-1398'/> - <pointer-type-def type-id='type-id-1377' size-in-bits='64' id='type-id-1380'/> - <pointer-type-def type-id='type-id-1373' size-in-bits='64' id='type-id-1381'/> - <pointer-type-def type-id='type-id-1371' size-in-bits='64' id='type-id-1399'/> - <pointer-type-def type-id='type-id-1366' size-in-bits='64' id='type-id-1370'/> - <pointer-type-def type-id='type-id-1368' size-in-bits='64' id='type-id-1400'/> - <pointer-type-def type-id='type-id-1393' size-in-bits='64' id='type-id-1391'/> - <pointer-type-def type-id='type-id-1395' size-in-bits='64' id='type-id-1401'/> - <qualified-type-def type-id='type-id-352' const='yes' id='type-id-1355'/> - <pointer-type-def type-id='type-id-1390' size-in-bits='64' id='type-id-209'/> - <function-decl name='PyErr_ProgramTextObject' mangled-name='PyErr_ProgramTextObject' filepath='./Include/cpython/pyerrors.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ProgramTextObject'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyAST_ExprAsUnicode' filepath='./Include/internal/pycore_ast.h' line='912' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-502'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCode_GetFreevars' filepath='./Include/internal/pycore_code.h' line='208' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyAST_Optimize' filepath='./Include/internal/pycore_compile.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-467'/> - <parameter type-id='type-id-1340'/> - <parameter type-id='type-id-1397'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyBasicblock_InsertInstruction' filepath='./Include/internal/pycore_flowgraph.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1384'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1381'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfgBuilder_UseLabel' filepath='./Include/internal/pycore_flowgraph.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <parameter type-id='type-id-1375'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfgBuilder_Addop' filepath='./Include/internal/pycore_flowgraph.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1358'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfgBuilder_Init' filepath='./Include/internal/pycore_flowgraph.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfgBuilder_Fini' filepath='./Include/internal/pycore_flowgraph.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyCfg_OptimizeCodeUnit' filepath='./Include/internal/pycore_flowgraph.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfg_Stackdepth' filepath='./Include/internal/pycore_flowgraph.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1384'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCfg_ConvertPseudoOps' filepath='./Include/internal/pycore_flowgraph.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1384'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyCfg_ResolveJumps' filepath='./Include/internal/pycore_flowgraph.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1398'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyAssemble_MakeCodeObject' filepath='./Include/internal/pycore_flowgraph.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1399'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1400'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-328'/> - </function-decl> - <var-decl name='_PyOpcode_Jump' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_opcode.h' line='15' column='1'/> - <var-decl name='_PyOpcode_Caches' type-id='type-id-1357' visibility='default' filepath='./Include/internal/pycore_opcode.h' line='17' column='1'/> - <var-decl name='_PyOpcode_Deopt' type-id='type-id-1357' visibility='default' filepath='./Include/internal/pycore_opcode.h' line='19' column='1'/> - <function-decl name='_PyST_GetSymbol' filepath='./Include/internal/pycore_symtable.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1396'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='_PyST_GetScope' filepath='./Include/internal/pycore_symtable.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1396'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyST_IsFunctionLike' filepath='./Include/internal/pycore_symtable.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1396'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySymtable_Build' filepath='./Include/internal/pycore_symtable.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-467'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-1392'/> - <return type-id='type-id-209'/> - </function-decl> - <function-decl name='PySymtable_Lookup' mangled-name='PySymtable_Lookup' filepath='./Include/internal/pycore_symtable.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySymtable_Lookup'> - <parameter type-id='type-id-209'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-1396'/> - </function-decl> - <function-decl name='_PySymtable_Free' filepath='./Include/internal/pycore_symtable.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-209'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFuture_FromAST' filepath='./Include/internal/pycore_symtable.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-467'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-1392'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyCompile_OpcodeStackEffectWithJump' mangled-name='PyCompile_OpcodeStackEffectWithJump' filepath='Python/compile.c' line='880' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCompile_OpcodeStackEffectWithJump'> - <parameter type-id='type-id-8' name='opcode' filepath='Python/compile.c' line='880' column='1'/> - <parameter type-id='type-id-8' name='oparg' filepath='Python/compile.c' line='880' column='1'/> - <parameter type-id='type-id-8' name='jump' filepath='Python/compile.c' line='880' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCompile_CodeGen' mangled-name='_PyCompile_CodeGen' filepath='Python/compile.c' line='7973' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CodeGen'> - <parameter type-id='type-id-2' name='ast' filepath='Python/compile.c' line='7973' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/compile.c' line='7973' column='1'/> - <parameter type-id='type-id-208' name='pflags' filepath='Python/compile.c' line='7973' column='1'/> - <parameter type-id='type-id-8' name='optimize' filepath='Python/compile.c' line='7974' column='1'/> - <parameter type-id='type-id-8' name='compile_mode' filepath='Python/compile.c' line='7974' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCompile_OptimizeCfg' mangled-name='_PyCompile_OptimizeCfg' filepath='Python/compile.c' line='8058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OptimizeCfg'> - <parameter type-id='type-id-2' name='instructions' filepath='Python/compile.c' line='8058' column='1'/> - <parameter type-id='type-id-2' name='consts' filepath='Python/compile.c' line='8058' column='1'/> - <parameter type-id='type-id-8' name='nlocals' filepath='Python/compile.c' line='8058' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCfg_JumpLabelsToTargets' filepath='Python/compile.c' line='8082' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1401'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCompile_Assemble' mangled-name='_PyCompile_Assemble' filepath='Python/compile.c' line='8085' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_Assemble'> - <parameter type-id='type-id-1399' name='umd' filepath='Python/compile.c' line='8085' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/compile.c' line='8085' column='1'/> - <parameter type-id='type-id-2' name='instructions' filepath='Python/compile.c' line='8086' column='1'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='PyCode_Optimize' mangled-name='PyCode_Optimize' filepath='Python/compile.c' line='8152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Optimize'> - <parameter type-id='type-id-2' name='code' filepath='Python/compile.c' line='8152' column='1'/> - <parameter type-id='type-id-2' name='_unused_consts' filepath='Python/compile.c' line='8152' column='1'/> - <parameter type-id='type-id-2' name='_unused_names' filepath='Python/compile.c' line='8153' column='1'/> - <parameter type-id='type-id-2' name='_unused_lnotab_obj' filepath='Python/compile.c' line='8153' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyOpcode_num_popped' filepath='Python/opcode_metadata.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-615'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyOpcode_num_pushed' filepath='Python/opcode_metadata.h' line='403' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-615'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/context.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PyContext_Type' type-id='type-id-256' mangled-name='PyContext_Type' visibility='default' filepath='./Include/cpython/context.h' line='8' column='1' elf-symbol-id='PyContext_Type'/> - <var-decl name='PyContextVar_Type' type-id='type-id-256' mangled-name='PyContextVar_Type' visibility='default' filepath='./Include/cpython/context.h' line='11' column='1' elf-symbol-id='PyContextVar_Type'/> - <var-decl name='PyContextToken_Type' type-id='type-id-256' mangled-name='PyContextToken_Type' visibility='default' filepath='./Include/cpython/context.h' line='14' column='1' elf-symbol-id='PyContextToken_Type'/> - <var-decl name='_PyContextTokenMissing_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_context.h' line='11' column='1'/> - <function-decl name='_PyHamt_New' filepath='./Include/internal/pycore_hamt.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-830'/> - </function-decl> - <function-decl name='_PyHamt_Assoc' filepath='./Include/internal/pycore_hamt.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-830'/> - </function-decl> - <function-decl name='_PyHamt_Without' filepath='./Include/internal/pycore_hamt.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-830'/> - </function-decl> - <function-decl name='_PyHamt_Find' filepath='./Include/internal/pycore_hamt.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyHamt_Eq' filepath='./Include/internal/pycore_hamt.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <parameter type-id='type-id-830'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyHamt_Len' filepath='./Include/internal/pycore_hamt.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyHamt_NewIterKeys' filepath='./Include/internal/pycore_hamt.h' line='126' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyHamt_NewIterValues' filepath='./Include/internal/pycore_hamt.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyHamt_NewIterItems' filepath='./Include/internal/pycore_hamt.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-830'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyContext_NewHamtForTests' mangled-name='_PyContext_NewHamtForTests' filepath='Python/context.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyContext_NewHamtForTests'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContext_New' mangled-name='PyContext_New' filepath='Python/context.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_New'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContext_Copy' mangled-name='PyContext_Copy' filepath='Python/context.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Copy'> - <parameter type-id='type-id-2' name='octx' filepath='Python/context.c' line='92' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContext_CopyCurrent' mangled-name='PyContext_CopyCurrent' filepath='Python/context.c' line='101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_CopyCurrent'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContext_Enter' mangled-name='PyContext_Enter' filepath='Python/context.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Enter'> - <parameter type-id='type-id-2' name='octx' filepath='Python/context.c' line='135' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyContext_Exit' mangled-name='PyContext_Exit' filepath='Python/context.c' line='173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Exit'> - <parameter type-id='type-id-2' name='octx' filepath='Python/context.c' line='173' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyContextVar_New' mangled-name='PyContextVar_New' filepath='Python/context.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_New'> - <parameter type-id='type-id-12' name='name' filepath='Python/context.c' line='182' column='1'/> - <parameter type-id='type-id-2' name='def' filepath='Python/context.c' line='182' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContextVar_Get' mangled-name='PyContextVar_Get' filepath='Python/context.c' line='195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Get'> - <parameter type-id='type-id-2' name='ovar' filepath='Python/context.c' line='195' column='1'/> - <parameter type-id='type-id-2' name='def' filepath='Python/context.c' line='195' column='1'/> - <parameter type-id='type-id-233' name='val' filepath='Python/context.c' line='195' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyContextVar_Set' mangled-name='PyContextVar_Set' filepath='Python/context.c' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Set'> - <parameter type-id='type-id-2' name='ovar' filepath='Python/context.c' line='258' column='1'/> - <parameter type-id='type-id-2' name='val' filepath='Python/context.c' line='258' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyContextVar_Reset' mangled-name='PyContextVar_Reset' filepath='Python/context.c' line='294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Reset'> - <parameter type-id='type-id-2' name='ovar' filepath='Python/context.c' line='294' column='1'/> - <parameter type-id='type-id-2' name='otok' filepath='Python/context.c' line='294' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/deepfreeze/deepfreeze.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyStaticCode_Fini' filepath='./Include/internal/pycore_code.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyStaticCode_Init' filepath='./Include/internal/pycore_code.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-8'/> - </function-decl> - <var-decl name='_Py_next_func_version' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_code.h' line='463' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Python/errors.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_fopen_obj' mangled-name='_Py_fopen_obj' filepath='./Include/cpython/fileutils.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fopen_obj'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-229'/> - </function-decl> - <function-decl name='_PyTraceBack_FromFrame' mangled-name='_PyTraceBack_FromFrame' filepath='./Include/internal/pycore_traceback.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceBack_FromFrame'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-365'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyTraceBack_Print' mangled-name='PyTraceBack_Print' filepath='./Include/traceback.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceBack_Print'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='strerror' filepath='/usr/include/string.h' line='419' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_PyErr_Restore' mangled-name='_PyErr_Restore' filepath='Python/errors.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Restore'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='65' column='1'/> - <parameter type-id='type-id-2' name='type' filepath='Python/errors.c' line='65' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/errors.c' line='65' column='1'/> - <parameter type-id='type-id-2' name='traceback' filepath='Python/errors.c' line='66' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_SetNone' mangled-name='_PyErr_SetNone' filepath='Python/errors.c' line='276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetNone'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='276' column='1'/> - <parameter type-id='type-id-2' name='exception' filepath='Python/errors.c' line='276' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_NormalizeException' mangled-name='_PyErr_NormalizeException' filepath='Python/errors.c' line='378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_NormalizeException'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='378' column='1'/> - <parameter type-id='type-id-233' name='exc' filepath='Python/errors.c' line='378' column='1'/> - <parameter type-id='type-id-233' name='val' filepath='Python/errors.c' line='379' column='1'/> - <parameter type-id='type-id-233' name='tb' filepath='Python/errors.c' line='379' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_Fetch' mangled-name='_PyErr_Fetch' filepath='Python/errors.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Fetch'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='503' column='1'/> - <parameter type-id='type-id-233' name='p_type' filepath='Python/errors.c' line='503' column='1'/> - <parameter type-id='type-id-233' name='p_value' filepath='Python/errors.c' line='503' column='1'/> - <parameter type-id='type-id-233' name='p_traceback' filepath='Python/errors.c' line='504' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_GetExcInfo' mangled-name='_PyErr_GetExcInfo' filepath='Python/errors.c' line='570' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_GetExcInfo'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='570' column='1'/> - <parameter type-id='type-id-233' name='p_type' filepath='Python/errors.c' line='571' column='1'/> - <parameter type-id='type-id-233' name='p_value' filepath='Python/errors.c' line='571' column='1'/> - <parameter type-id='type-id-233' name='p_traceback' filepath='Python/errors.c' line='571' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_GetHandledException' mangled-name='_PyErr_GetHandledException' filepath='Python/errors.c' line='581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_GetHandledException'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='581' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_GetHandledException' mangled-name='PyErr_GetHandledException' filepath='Python/errors.c' line='592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetHandledException'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_SetHandledException' mangled-name='_PyErr_SetHandledException' filepath='Python/errors.c' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetHandledException'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/errors.c' line='599' column='1'/> - <parameter type-id='type-id-2' name='exc' filepath='Python/errors.c' line='599' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_GetExcInfo' mangled-name='PyErr_GetExcInfo' filepath='Python/errors.c' line='612' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetExcInfo'> - <parameter type-id='type-id-233' name='p_type' filepath='Python/errors.c' line='612' column='1'/> - <parameter type-id='type-id-233' name='p_value' filepath='Python/errors.c' line='612' column='1'/> - <parameter type-id='type-id-233' name='p_traceback' filepath='Python/errors.c' line='612' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SetExcInfo' mangled-name='PyErr_SetExcInfo' filepath='Python/errors.c' line='619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetExcInfo'> - <parameter type-id='type-id-2' name='type' filepath='Python/errors.c' line='619' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/errors.c' line='619' column='1'/> - <parameter type-id='type-id-2' name='traceback' filepath='Python/errors.c' line='619' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_StackItemToExcInfoTuple' mangled-name='_PyErr_StackItemToExcInfoTuple' filepath='Python/errors.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_StackItemToExcInfoTuple'> - <parameter type-id='type-id-376' name='err_info' filepath='Python/errors.c' line='630' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyErr_ChainExceptions' mangled-name='_PyErr_ChainExceptions' filepath='Python/errors.c' line='655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ChainExceptions'> - <parameter type-id='type-id-2' name='typ' filepath='Python/errors.c' line='655' column='1'/> - <parameter type-id='type-id-2' name='val' filepath='Python/errors.c' line='655' column='1'/> - <parameter type-id='type-id-2' name='tb' filepath='Python/errors.c' line='655' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SetFromErrnoWithFilenameObject' mangled-name='PyErr_SetFromErrnoWithFilenameObject' filepath='Python/errors.c' line='813' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilenameObject'> - <parameter type-id='type-id-2' name='exc' filepath='Python/errors.c' line='813' column='1'/> - <parameter type-id='type-id-2' name='filenameObject' filepath='Python/errors.c' line='813' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetFromErrnoWithFilenameObjects' mangled-name='PyErr_SetFromErrnoWithFilenameObjects' filepath='Python/errors.c' line='819' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilenameObjects'> - <parameter type-id='type-id-2' name='exc' filepath='Python/errors.c' line='819' column='1'/> - <parameter type-id='type-id-2' name='filenameObject' filepath='Python/errors.c' line='819' column='1'/> - <parameter type-id='type-id-2' name='filenameObject2' filepath='Python/errors.c' line='819' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetImportErrorSubclass' mangled-name='PyErr_SetImportErrorSubclass' filepath='Python/errors.c' line='1140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetImportErrorSubclass'> - <parameter type-id='type-id-2' name='exception' filepath='Python/errors.c' line='1140' column='1'/> - <parameter type-id='type-id-2' name='msg' filepath='Python/errors.c' line='1140' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Python/errors.c' line='1141' column='1'/> - <parameter type-id='type-id-2' name='path' filepath='Python/errors.c' line='1141' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SetImportError' mangled-name='PyErr_SetImportError' filepath='Python/errors.c' line='1153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetImportError'> - <parameter type-id='type-id-2' name='msg' filepath='Python/errors.c' line='1153' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Python/errors.c' line='1153' column='1'/> - <parameter type-id='type-id-2' name='path' filepath='Python/errors.c' line='1153' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_BadInternalCall' mangled-name='PyErr_BadInternalCall' filepath='Python/errors.c' line='1171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_BadInternalCall'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_FormatV' mangled-name='PyErr_FormatV' filepath='Python/errors.c' line='1201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_FormatV'> - <parameter type-id='type-id-2' name='exception' filepath='Python/errors.c' line='1201' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/errors.c' line='1201' column='1'/> - <parameter type-id='type-id-306' name='vargs' filepath='Python/errors.c' line='1201' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_NewExceptionWithDoc' mangled-name='PyErr_NewExceptionWithDoc' filepath='Python/errors.c' line='1315' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NewExceptionWithDoc'> - <parameter type-id='type-id-12' name='name' filepath='Python/errors.c' line='1315' column='1'/> - <parameter type-id='type-id-12' name='doc' filepath='Python/errors.c' line='1315' column='1'/> - <parameter type-id='type-id-2' name='base' filepath='Python/errors.c' line='1316' column='1'/> - <parameter type-id='type-id-2' name='dict' filepath='Python/errors.c' line='1316' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyErr_SyntaxLocation' mangled-name='PyErr_SyntaxLocation' filepath='Python/errors.c' line='1720' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocation'> - <parameter type-id='type-id-12' name='filename' filepath='Python/errors.c' line='1720' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/errors.c' line='1720' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_RangedSyntaxLocationObject' mangled-name='PyErr_RangedSyntaxLocationObject' filepath='Python/errors.c' line='1844' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_RangedSyntaxLocationObject'> - <parameter type-id='type-id-2' name='filename' filepath='Python/errors.c' line='1844' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/errors.c' line='1844' column='1'/> - <parameter type-id='type-id-8' name='col_offset' filepath='Python/errors.c' line='1844' column='1'/> - <parameter type-id='type-id-8' name='end_lineno' filepath='Python/errors.c' line='1845' column='1'/> - <parameter type-id='type-id-8' name='end_col_offset' filepath='Python/errors.c' line='1845' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_SyntaxLocationEx' mangled-name='PyErr_SyntaxLocationEx' filepath='Python/errors.c' line='1850' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocationEx'> - <parameter type-id='type-id-12' name='filename' filepath='Python/errors.c' line='1850' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/errors.c' line='1850' column='1'/> - <parameter type-id='type-id-8' name='col_offset' filepath='Python/errors.c' line='1850' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_ProgramText' mangled-name='PyErr_ProgramText' filepath='Python/errors.c' line='1915' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ProgramText'> - <parameter type-id='type-id-12' name='filename' filepath='Python/errors.c' line='1915' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/errors.c' line='1915' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/fileutils.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='__mbstate_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1402' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='13' column='1' id='type-id-1403'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='__count' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='__value' type-id='type-id-1404' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='20' column='1'/> - </data-member> - </class-decl> - <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='16' column='1' id='type-id-1404'> - <data-member access='public'> - <var-decl name='__wch' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='18' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__wchb' type-id='type-id-620' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='19' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='__mbstate_t' type-id='type-id-1403' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='21' column='1' id='type-id-1402'/> - <typedef-decl name='mbstate_t' type-id='type-id-1402' filepath='/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h' line='6' column='1' id='type-id-1405'/> - <pointer-type-def type-id='type-id-1405' size-in-bits='64' id='type-id-1406'/> - <qualified-type-def type-id='type-id-1406' restrict='yes' id='type-id-1407'/> - <qualified-type-def type-id='type-id-51' restrict='yes' id='type-id-1408'/> - <function-decl name='realpath' filepath='/usr/include/stdlib.h' line='808' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-183'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='mbstowcs' filepath='/usr/include/stdlib.h' line='941' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='wcstombs' filepath='/usr/include/stdlib.h' line='945' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='write' filepath='/usr/include/unistd.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='getcwd' filepath='/usr/include/unistd.h' line='531' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='readlink' filepath='/usr/include/unistd.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-185'/> - </function-decl> - <function-decl name='close_range' filepath='/usr/include/unistd.h' line='1208' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-95'/> - <parameter type-id='type-id-95'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='297' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-1407'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='ioctl' filepath='/usr/include/x86_64-linux-gnu/sys/ioctl.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-28'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_device_encoding' mangled-name='_Py_device_encoding' filepath='Python/fileutils.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_device_encoding'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='75' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_EncodeLocale' mangled-name='Py_EncodeLocale' filepath='Python/fileutils.c' line='863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EncodeLocale'> - <parameter type-id='type-id-16' name='text' filepath='Python/fileutils.c' line='863' column='1'/> - <parameter type-id='type-id-441' name='error_pos' filepath='Python/fileutils.c' line='863' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_Py_EncodeLocaleRaw' mangled-name='_Py_EncodeLocaleRaw' filepath='Python/fileutils.c' line='872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_EncodeLocaleRaw'> - <parameter type-id='type-id-16' name='text' filepath='Python/fileutils.c' line='872' column='1'/> - <parameter type-id='type-id-441' name='error_pos' filepath='Python/fileutils.c' line='872' column='1'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_Py_GetLocaleEncodingObject' mangled-name='_Py_GetLocaleEncodingObject' filepath='Python/fileutils.c' line='936' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetLocaleEncodingObject'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_stat' mangled-name='_Py_stat' filepath='Python/fileutils.c' line='1355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_stat'> - <parameter type-id='type-id-2' name='path' filepath='Python/fileutils.c' line='1355' column='1'/> - <parameter type-id='type-id-51' name='statbuf' filepath='Python/fileutils.c' line='1355' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_get_inheritable' mangled-name='_Py_get_inheritable' filepath='Python/fileutils.c' line='1435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_get_inheritable'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='1435' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_set_inheritable' mangled-name='_Py_set_inheritable' filepath='Python/fileutils.c' line='1595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_set_inheritable'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='1595' column='1'/> - <parameter type-id='type-id-8' name='inheritable' filepath='Python/fileutils.c' line='1595' column='1'/> - <parameter type-id='type-id-179' name='atomic_flag_works' filepath='Python/fileutils.c' line='1595' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_set_inheritable_async_safe' mangled-name='_Py_set_inheritable_async_safe' filepath='Python/fileutils.c' line='1604' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_set_inheritable_async_safe'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='1604' column='1'/> - <parameter type-id='type-id-8' name='inheritable' filepath='Python/fileutils.c' line='1604' column='1'/> - <parameter type-id='type-id-179' name='atomic_flag_works' filepath='Python/fileutils.c' line='1604' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_wfopen' mangled-name='_Py_wfopen' filepath='Python/fileutils.c' line='1707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_wfopen'> - <parameter type-id='type-id-16' name='path' filepath='Python/fileutils.c' line='1707' column='1'/> - <parameter type-id='type-id-16' name='mode' filepath='Python/fileutils.c' line='1707' column='1'/> - <return type-id='type-id-229'/> - </function-decl> - <function-decl name='_Py_normpath' mangled-name='_Py_normpath' filepath='Python/fileutils.c' line='2514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_normpath'> - <parameter type-id='type-id-52' name='path' filepath='Python/fileutils.c' line='2514' column='1'/> - <parameter type-id='type-id-14' name='size' filepath='Python/fileutils.c' line='2514' column='1'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_get_blocking' mangled-name='_Py_get_blocking' filepath='Python/fileutils.c' line='2629' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_get_blocking'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='2629' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_set_blocking' mangled-name='_Py_set_blocking' filepath='Python/fileutils.c' line='2650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_set_blocking'> - <parameter type-id='type-id-8' name='fd' filepath='Python/fileutils.c' line='2650' column='1'/> - <parameter type-id='type-id-8' name='blocking' filepath='Python/fileutils.c' line='2650' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_closerange' mangled-name='_Py_closerange' filepath='Python/fileutils.c' line='2901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_closerange'> - <parameter type-id='type-id-8' name='first' filepath='Python/fileutils.c' line='2901' column='1'/> - <parameter type-id='type-id-8' name='last' filepath='Python/fileutils.c' line='2901' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/flowgraph.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyCompile_EnsureArrayLargeEnough' filepath='./Include/internal/pycore_compile.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-253'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/formatter_unicode.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='51' column='1' id='type-id-1409'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='decimal_point' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='55' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='thousands_sep' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='56' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='grouping' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='62' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='int_curr_symbol' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='68' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='currency_symbol' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='69' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='mon_decimal_point' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='mon_thousands_sep' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='mon_grouping' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='positive_sign' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='negative_sign' type-id='type-id-15' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='640'> - <var-decl name='int_frac_digits' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='648'> - <var-decl name='frac_digits' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='656'> - <var-decl name='p_cs_precedes' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='664'> - <var-decl name='p_sep_by_space' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='672'> - <var-decl name='n_cs_precedes' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='680'> - <var-decl name='n_sep_by_space' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='688'> - <var-decl name='p_sign_posn' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='91' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='696'> - <var-decl name='n_sign_posn' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='92' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='int_p_cs_precedes' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='95' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='712'> - <var-decl name='int_p_sep_by_space' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='720'> - <var-decl name='int_n_cs_precedes' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='728'> - <var-decl name='int_n_sep_by_space' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='736'> - <var-decl name='int_p_sign_posn' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='108' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='744'> - <var-decl name='int_n_sign_posn' type-id='type-id-48' visibility='default' filepath='/usr/include/locale.h' line='109' column='1'/> - </data-member> - </class-decl> - <pointer-type-def type-id='type-id-1409' size-in-bits='64' id='type-id-1410'/> - <function-decl name='_Py_GetLocaleconvNumeric' mangled-name='_Py_GetLocaleconvNumeric' filepath='./Include/internal/pycore_fileutils.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetLocaleconvNumeric'> - <parameter type-id='type-id-1410'/> - <parameter type-id='type-id-233'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='localeconv' filepath='/usr/include/locale.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-1410'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/frame.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyFrame_New_NoTrack' filepath='./Include/internal/pycore_frame.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-365'/> - </function-decl> - <function-decl name='PyUnstable_InterpreterFrame_GetCode' mangled-name='PyUnstable_InterpreterFrame_GetCode' filepath='Python/frame.c' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetCode'> - <parameter type-id='type-id-375' name='frame' filepath='Python/frame.c' line='150' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyUnstable_InterpreterFrame_GetLasti' mangled-name='PyUnstable_InterpreterFrame_GetLasti' filepath='Python/frame.c' line='158' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetLasti'> - <parameter type-id='type-id-375' name='frame' filepath='Python/frame.c' line='158' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/frozen.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_frozen' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='32' column='1' id='type-id-1411'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/cpython/import.h' line='33' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='code' type-id='type-id-383' visibility='default' filepath='./Include/cpython/import.h' line='34' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='size' type-id='type-id-8' visibility='default' filepath='./Include/cpython/import.h' line='35' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='is_package' type-id='type-id-8' visibility='default' filepath='./Include/cpython/import.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='get_code' type-id='type-id-390' visibility='default' filepath='./Include/cpython/import.h' line='37' column='1'/> - </data-member> - </class-decl> - <class-decl name='_module_alias' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='162' column='1' id='type-id-1412'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/internal/pycore_import.h' line='163' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='orig' type-id='type-id-12' visibility='default' filepath='./Include/internal/pycore_import.h' line='164' column='1'/> - </data-member> - </class-decl> - <qualified-type-def type-id='type-id-1411' const='yes' id='type-id-1413'/> - <pointer-type-def type-id='type-id-1413' size-in-bits='64' id='type-id-1414'/> - <qualified-type-def type-id='type-id-1412' const='yes' id='type-id-1415'/> - <pointer-type-def type-id='type-id-1415' size-in-bits='64' id='type-id-1416'/> - <var-decl name='PyImport_FrozenModules' type-id='type-id-1414' mangled-name='PyImport_FrozenModules' visibility='default' filepath='./Include/cpython/import.h' line='43' column='1' elf-symbol-id='PyImport_FrozenModules'/> - <var-decl name='_PyImport_FrozenBootstrap' type-id='type-id-1414' mangled-name='_PyImport_FrozenBootstrap' visibility='default' filepath='./Include/internal/pycore_import.h' line='167' column='1' elf-symbol-id='_PyImport_FrozenBootstrap'/> - <var-decl name='_PyImport_FrozenStdlib' type-id='type-id-1414' mangled-name='_PyImport_FrozenStdlib' visibility='default' filepath='./Include/internal/pycore_import.h' line='168' column='1' elf-symbol-id='_PyImport_FrozenStdlib'/> - <var-decl name='_PyImport_FrozenTest' type-id='type-id-1414' mangled-name='_PyImport_FrozenTest' visibility='default' filepath='./Include/internal/pycore_import.h' line='169' column='1' elf-symbol-id='_PyImport_FrozenTest'/> - <var-decl name='_PyImport_FrozenAliases' type-id='type-id-1416' visibility='default' filepath='./Include/internal/pycore_import.h' line='170' column='1'/> - <function-decl name='_Py_get_importlib__bootstrap_toplevel' filepath='Python/frozen.c' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_importlib__bootstrap_external_toplevel' filepath='Python/frozen.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_zipimport_toplevel' filepath='Python/frozen.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_abc_toplevel' filepath='Python/frozen.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_codecs_toplevel' filepath='Python/frozen.c' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_io_toplevel' filepath='Python/frozen.c' line='77' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get__collections_abc_toplevel' filepath='Python/frozen.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get__sitebuiltins_toplevel' filepath='Python/frozen.c' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_genericpath_toplevel' filepath='Python/frozen.c' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_ntpath_toplevel' filepath='Python/frozen.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_posixpath_toplevel' filepath='Python/frozen.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_os_toplevel' filepath='Python/frozen.c' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_site_toplevel' filepath='Python/frozen.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_stat_toplevel' filepath='Python/frozen.c' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_importlib_util_toplevel' filepath='Python/frozen.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_importlib_machinery_toplevel' filepath='Python/frozen.c' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_runpy_toplevel' filepath='Python/frozen.c' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get___hello___toplevel' filepath='Python/frozen.c' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get___phello___toplevel' filepath='Python/frozen.c' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get___phello___ham_toplevel' filepath='Python/frozen.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get___phello___ham_eggs_toplevel' filepath='Python/frozen.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get___phello___spam_toplevel' filepath='Python/frozen.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_get_frozen_only_toplevel' filepath='Python/frozen.c' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/frozenmain.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyStatus' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-54' visibility='default' filepath='./Include/cpython/initconfig.h' line='10' column='1' id='type-id-1417'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='_type' type-id='type-id-997' visibility='default' filepath='./Include/cpython/initconfig.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='func' type-id='type-id-12' visibility='default' filepath='./Include/cpython/initconfig.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='err_msg' type-id='type-id-12' visibility='default' filepath='./Include/cpython/initconfig.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='exitcode' type-id='type-id-8' visibility='default' filepath='./Include/cpython/initconfig.h' line='18' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyStatus' type-id='type-id-1417' filepath='./Include/cpython/initconfig.h' line='19' column='1' id='type-id-54'/> - <pointer-type-def type-id='type-id-258' size-in-bits='64' id='type-id-53'/> - <function-decl name='PyStatus_Exception' mangled-name='PyStatus_Exception' filepath='./Include/cpython/initconfig.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Exception'> - <parameter type-id='type-id-54'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyConfig_InitPythonConfig' mangled-name='PyConfig_InitPythonConfig' filepath='./Include/cpython/initconfig.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitPythonConfig'> - <parameter type-id='type-id-53'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyConfig_Clear' mangled-name='PyConfig_Clear' filepath='./Include/cpython/initconfig.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Clear'> - <parameter type-id='type-id-53'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyConfig_SetBytesArgv' mangled-name='PyConfig_SetBytesArgv' filepath='./Include/cpython/initconfig.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesArgv'> - <parameter type-id='type-id-53'/> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-136'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_InitializeFromConfig' mangled-name='Py_InitializeFromConfig' filepath='./Include/cpython/pylifecycle.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeFromConfig'> - <parameter type-id='type-id-260'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_ExitStatusException' mangled-name='Py_ExitStatusException' filepath='./Include/cpython/pylifecycle.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ExitStatusException'> - <parameter type-id='type-id-54'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyRun_AnyFileExFlags' mangled-name='PyRun_AnyFileExFlags' filepath='./Include/cpython/pythonrun.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileExFlags'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-208'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_ImportFrozenModule' mangled-name='PyImport_ImportFrozenModule' filepath='./Include/import.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportFrozenModule'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyRuntime_Initialize' mangled-name='_PyRuntime_Initialize' filepath='./Include/internal/pycore_runtime.h' line='197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRuntime_Initialize'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_FinalizeEx' mangled-name='Py_FinalizeEx' filepath='./Include/pylifecycle.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FinalizeEx'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_GetVersion' mangled-name='Py_GetVersion' filepath='./Include/pylifecycle.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetVersion'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='Py_GetCopyright' mangled-name='Py_GetCopyright' filepath='./Include/pylifecycle.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetCopyright'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='Py_FrozenMain' mangled-name='Py_FrozenMain' filepath='Python/frozenmain.c' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FrozenMain'> - <parameter type-id='type-id-8' name='argc' filepath='Python/frozenmain.c' line='16' column='1'/> - <parameter type-id='type-id-239' name='argv' filepath='Python/frozenmain.c' line='16' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/getargs.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyArg_Parse' mangled-name='PyArg_Parse' filepath='Python/getargs.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_Parse'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='99' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='99' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_Parse_SizeT' mangled-name='_PyArg_Parse_SizeT' filepath='Python/getargs.c' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_Parse_SizeT'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='111' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='111' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseStack' mangled-name='_PyArg_ParseStack' filepath='Python/getargs.c' line='149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStack'> - <parameter type-id='type-id-248' name='args' filepath='Python/getargs.c' line='149' column='1'/> - <parameter type-id='type-id-14' name='nargs' filepath='Python/getargs.c' line='149' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='149' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseStack_SizeT' mangled-name='_PyArg_ParseStack_SizeT' filepath='Python/getargs.c' line='161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStack_SizeT'> - <parameter type-id='type-id-248' name='args' filepath='Python/getargs.c' line='161' column='1'/> - <parameter type-id='type-id-14' name='nargs' filepath='Python/getargs.c' line='161' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='161' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyArg_VaParse' mangled-name='PyArg_VaParse' filepath='Python/getargs.c' line='174' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParse'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='174' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='174' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='174' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_VaParse_SizeT' mangled-name='_PyArg_VaParse_SizeT' filepath='Python/getargs.c' line='187' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParse_SizeT'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='187' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='187' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='187' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyArg_VaParseTupleAndKeywords' mangled-name='PyArg_VaParseTupleAndKeywords' filepath='Python/getargs.c' line='1373' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParseTupleAndKeywords'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1373' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1374' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='1375' column='1'/> - <parameter type-id='type-id-239' name='kwlist' filepath='Python/getargs.c' line='1376' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1376' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_VaParseTupleAndKeywords_SizeT' mangled-name='_PyArg_VaParseTupleAndKeywords_SizeT' filepath='Python/getargs.c' line='1398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywords_SizeT'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1398' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1399' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/getargs.c' line='1400' column='1'/> - <parameter type-id='type-id-239' name='kwlist' filepath='Python/getargs.c' line='1401' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1401' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseTupleAndKeywordsFast' mangled-name='_PyArg_ParseTupleAndKeywordsFast' filepath='Python/getargs.c' line='1424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywordsFast'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1424' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1424' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1425' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseTupleAndKeywordsFast_SizeT' mangled-name='_PyArg_ParseTupleAndKeywordsFast_SizeT' filepath='Python/getargs.c' line='1437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywordsFast_SizeT'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1437' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1437' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1438' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseStackAndKeywords' mangled-name='_PyArg_ParseStackAndKeywords' filepath='Python/getargs.c' line='1450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStackAndKeywords'> - <parameter type-id='type-id-248' name='args' filepath='Python/getargs.c' line='1450' column='1'/> - <parameter type-id='type-id-14' name='nargs' filepath='Python/getargs.c' line='1450' column='1'/> - <parameter type-id='type-id-2' name='kwnames' filepath='Python/getargs.c' line='1450' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1451' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_ParseStackAndKeywords_SizeT' mangled-name='_PyArg_ParseStackAndKeywords_SizeT' filepath='Python/getargs.c' line='1463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStackAndKeywords_SizeT'> - <parameter type-id='type-id-248' name='args' filepath='Python/getargs.c' line='1463' column='1'/> - <parameter type-id='type-id-14' name='nargs' filepath='Python/getargs.c' line='1463' column='1'/> - <parameter type-id='type-id-2' name='kwnames' filepath='Python/getargs.c' line='1463' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1464' column='1'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_VaParseTupleAndKeywordsFast' mangled-name='_PyArg_VaParseTupleAndKeywordsFast' filepath='Python/getargs.c' line='1477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywordsFast'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1477' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1477' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1478' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1478' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_VaParseTupleAndKeywordsFast_SizeT' mangled-name='_PyArg_VaParseTupleAndKeywordsFast_SizeT' filepath='Python/getargs.c' line='1491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywordsFast_SizeT'> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='1491' column='1'/> - <parameter type-id='type-id-2' name='keywords' filepath='Python/getargs.c' line='1491' column='1'/> - <parameter type-id='type-id-262' name='parser' filepath='Python/getargs.c' line='1492' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/getargs.c' line='1492' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArg_NoPositional' mangled-name='_PyArg_NoPositional' filepath='Python/getargs.c' line='2912' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_NoPositional'> - <parameter type-id='type-id-12' name='funcname' filepath='Python/getargs.c' line='2912' column='1'/> - <parameter type-id='type-id-2' name='args' filepath='Python/getargs.c' line='2912' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/getcompiler.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='Py_GetCompiler' mangled-name='Py_GetCompiler' filepath='Python/getcompiler.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetCompiler'> - <return type-id='type-id-12'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/getopt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyOS_opterr' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='8' column='1'/> - <var-decl name='_PyOS_optind' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='9' column='1'/> - <var-decl name='_PyOS_optarg' type-id='type-id-16' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='10' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Python/getversion.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <qualified-type-def type-id='type-id-28' const='yes' id='type-id-1418'/> - <var-decl name='Py_Version' type-id='type-id-1418' mangled-name='Py_Version' visibility='default' filepath='./Include/pylifecycle.h' line='66' column='1' elf-symbol-id='Py_Version'/> - </abi-instr> - <abi-instr address-size='64' path='Python/hamt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyHamt_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='23' column='1'/> - <var-decl name='_PyHamt_ArrayNode_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='24' column='1'/> - <var-decl name='_PyHamt_BitmapNode_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='25' column='1'/> - <var-decl name='_PyHamt_CollisionNode_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='26' column='1'/> - <var-decl name='_PyHamtKeys_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='27' column='1'/> - <var-decl name='_PyHamtValues_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='28' column='1'/> - <var-decl name='_PyHamtItems_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='29' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Python/hashtable.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='_Py_hashtable_foreach_func' type-id='type-id-1419' filepath='./Include/internal/pycore_hashtable.h' line='96' column='1' id='type-id-1420'/> - <pointer-type-def type-id='type-id-919' size-in-bits='64' id='type-id-1421'/> - <qualified-type-def type-id='type-id-912' const='yes' id='type-id-1422'/> - <pointer-type-def type-id='type-id-1422' size-in-bits='64' id='type-id-1423'/> - <pointer-type-def type-id='type-id-1424' size-in-bits='64' id='type-id-1419'/> - <function-decl name='_Py_HashPointerRaw' mangled-name='_Py_HashPointerRaw' filepath='./Include/pyhash.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashPointerRaw'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-305'/> - </function-decl> - <function-decl name='_Py_hashtable_hash_ptr' mangled-name='_Py_hashtable_hash_ptr' filepath='Python/hashtable.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_hash_ptr'> - <parameter type-id='type-id-22' name='key' filepath='Python/hashtable.c' line='92' column='1'/> - <return type-id='type-id-910'/> - </function-decl> - <function-decl name='_Py_hashtable_compare_direct' mangled-name='_Py_hashtable_compare_direct' filepath='Python/hashtable.c' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_compare_direct'> - <parameter type-id='type-id-22' name='key1' filepath='Python/hashtable.c' line='99' column='1'/> - <parameter type-id='type-id-22' name='key2' filepath='Python/hashtable.c' line='99' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_hashtable_size' mangled-name='_Py_hashtable_size' filepath='Python/hashtable.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_size'> - <parameter type-id='type-id-1423' name='ht' filepath='Python/hashtable.c' line='120' column='1'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='_Py_hashtable_steal' mangled-name='_Py_hashtable_steal' filepath='Python/hashtable.c' line='174' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_steal'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='174' column='1'/> - <parameter type-id='type-id-22' name='key' filepath='Python/hashtable.c' line='174' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_Py_hashtable_set' mangled-name='_Py_hashtable_set' filepath='Python/hashtable.c' line='209' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_set'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='209' column='1'/> - <parameter type-id='type-id-22' name='key' filepath='Python/hashtable.c' line='209' column='1'/> - <parameter type-id='type-id-22' name='value' filepath='Python/hashtable.c' line='209' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_hashtable_get' mangled-name='_Py_hashtable_get' filepath='Python/hashtable.c' line='248' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_get'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='248' column='1'/> - <parameter type-id='type-id-22' name='key' filepath='Python/hashtable.c' line='248' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_Py_hashtable_foreach' mangled-name='_Py_hashtable_foreach' filepath='Python/hashtable.c' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_foreach'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='261' column='1'/> - <parameter type-id='type-id-1420' name='func' filepath='Python/hashtable.c' line='262' column='1'/> - <parameter type-id='type-id-22' name='user_data' filepath='Python/hashtable.c' line='263' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_hashtable_new_full' mangled-name='_Py_hashtable_new_full' filepath='Python/hashtable.c' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_new_full'> - <parameter type-id='type-id-914' name='hash_func' filepath='Python/hashtable.c' line='316' column='1'/> - <parameter type-id='type-id-915' name='compare_func' filepath='Python/hashtable.c' line='317' column='1'/> - <parameter type-id='type-id-916' name='key_destroy_func' filepath='Python/hashtable.c' line='318' column='1'/> - <parameter type-id='type-id-916' name='value_destroy_func' filepath='Python/hashtable.c' line='319' column='1'/> - <parameter type-id='type-id-1421' name='allocator' filepath='Python/hashtable.c' line='320' column='1'/> - <return type-id='type-id-926'/> - </function-decl> - <function-decl name='_Py_hashtable_new' mangled-name='_Py_hashtable_new' filepath='Python/hashtable.c' line='363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_new'> - <parameter type-id='type-id-914' name='hash_func' filepath='Python/hashtable.c' line='363' column='1'/> - <parameter type-id='type-id-915' name='compare_func' filepath='Python/hashtable.c' line='364' column='1'/> - <return type-id='type-id-926'/> - </function-decl> - <function-decl name='_Py_hashtable_clear' mangled-name='_Py_hashtable_clear' filepath='Python/hashtable.c' line='385' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_clear'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='385' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_hashtable_destroy' mangled-name='_Py_hashtable_destroy' filepath='Python/hashtable.c' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_destroy'> - <parameter type-id='type-id-926' name='ht' filepath='Python/hashtable.c' line='404' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1424'> - <parameter type-id='type-id-926'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Python/import.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <enum-decl name='_PyTime_round_t' naming-typedef-id='type-id-1425' filepath='./Include/cpython/pytime.h' line='70' column='1' id='type-id-1426'> - <underlying-type type-id='type-id-24'/> - <enumerator name='_PyTime_ROUND_FLOOR' value='0'/> - <enumerator name='_PyTime_ROUND_CEILING' value='1'/> - <enumerator name='_PyTime_ROUND_HALF_EVEN' value='2'/> - <enumerator name='_PyTime_ROUND_UP' value='3'/> - <enumerator name='_PyTime_ROUND_TIMEOUT' value='3'/> - </enum-decl> - <typedef-decl name='_PyTime_round_t' type-id='type-id-1426' filepath='./Include/cpython/pytime.h' line='90' column='1' id='type-id-1425'/> - <var-decl name='PyImport_Inittab' type-id='type-id-924' mangled-name='PyImport_Inittab' visibility='default' filepath='./Include/cpython/import.h' line='29' column='1' elf-symbol-id='PyImport_Inittab'/> - <function-decl name='PyStatus_NoMemory' mangled-name='PyStatus_NoMemory' filepath='./Include/cpython/initconfig.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_NoMemory'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyInterpreterState_HasFeature' mangled-name='_PyInterpreterState_HasFeature' filepath='./Include/cpython/pystate.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_HasFeature'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-28'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_AsMicroseconds' mangled-name='_PyTime_AsMicroseconds' filepath='./Include/cpython/pytime.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMicroseconds'> - <parameter type-id='type-id-790'/> - <parameter type-id='type-id-1425'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_GetPerfCounter' mangled-name='_PyTime_GetPerfCounter' filepath='./Include/cpython/pytime.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetPerfCounter'> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_Py_KeyedHash' filepath='./Include/internal/pycore_pyhash.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-117'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-117'/> - </function-decl> - <function-decl name='_PySys_ClearAttrString' filepath='./Include/internal/pycore_sysmodule.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMarshal_ReadObjectFromString' mangled-name='PyMarshal_ReadObjectFromString' filepath='./Include/marshal.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromString'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_AcquireLock' mangled-name='_PyImport_AcquireLock' filepath='Python/import.c' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_AcquireLock'> - <parameter type-id='type-id-20' name='interp' filepath='Python/import.c' line='105' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_ReleaseLock' mangled-name='_PyImport_ReleaseLock' filepath='Python/import.c' line='132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_ReleaseLock'> - <parameter type-id='type-id-20' name='interp' filepath='Python/import.c' line='132' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_GetModuleDict' mangled-name='PyImport_GetModuleDict' filepath='Python/import.c' line='205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetModuleDict'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetModuleId' mangled-name='_PyImport_GetModuleId' filepath='Python/import.c' line='216' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_GetModuleId'> - <parameter type-id='type-id-309' name='nameid' filepath='Python/import.c' line='216' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_SetModule' mangled-name='_PyImport_SetModule' filepath='Python/import.c' line='226' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_SetModule'> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='226' column='1'/> - <parameter type-id='type-id-2' name='m' filepath='Python/import.c' line='226' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_SetModuleString' mangled-name='_PyImport_SetModuleString' filepath='Python/import.c' line='234' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_SetModuleString'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='234' column='1'/> - <parameter type-id='type-id-2' name='m' filepath='Python/import.c' line='234' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_AddModuleObject' mangled-name='PyImport_AddModuleObject' filepath='Python/import.c' line='356' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AddModuleObject'> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='356' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_AddModule' mangled-name='PyImport_AddModule' filepath='Python/import.c' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AddModule'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='374' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyState_FindModule' mangled-name='PyState_FindModule' filepath='Python/import.c' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_FindModule'> - <parameter type-id='type-id-399' name='module' filepath='Python/import.c' line='490' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyState_AddModule' mangled-name='_PyState_AddModule' filepath='Python/import.c' line='504' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyState_AddModule'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/import.c' line='504' column='1'/> - <parameter type-id='type-id-2' name='module' filepath='Python/import.c' line='504' column='1'/> - <parameter type-id='type-id-399' name='def' filepath='Python/import.c' line='504' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyState_AddModule' mangled-name='PyState_AddModule' filepath='Python/import.c' line='520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_AddModule'> - <parameter type-id='type-id-2' name='module' filepath='Python/import.c' line='520' column='1'/> - <parameter type-id='type-id-399' name='def' filepath='Python/import.c' line='520' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyState_RemoveModule' mangled-name='PyState_RemoveModule' filepath='Python/import.c' line='549' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_RemoveModule'> - <parameter type-id='type-id-399' name='def' filepath='Python/import.c' line='549' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_ClearExtension' mangled-name='_PyImport_ClearExtension' filepath='Python/import.c' line='794' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_ClearExtension'> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='794' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/import.c' line='794' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_FixupExtensionObject' mangled-name='_PyImport_FixupExtensionObject' filepath='Python/import.c' line='1224' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_FixupExtensionObject'> - <parameter type-id='type-id-2' name='mod' filepath='Python/import.c' line='1224' column='1'/> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='1224' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/import.c' line='1225' column='1'/> - <parameter type-id='type-id-2' name='modules' filepath='Python/import.c' line='1225' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_FixupBuiltin' mangled-name='_PyImport_FixupBuiltin' filepath='Python/import.c' line='1346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_FixupBuiltin'> - <parameter type-id='type-id-2' name='mod' filepath='Python/import.c' line='1346' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='1346' column='1'/> - <parameter type-id='type-id-2' name='modules' filepath='Python/import.c' line='1346' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_ExtendInittab' mangled-name='PyImport_ExtendInittab' filepath='Python/import.c' line='1444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExtendInittab'> - <parameter type-id='type-id-924' name='newtab' filepath='Python/import.c' line='1444' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_AppendInittab' mangled-name='PyImport_AppendInittab' filepath='Python/import.c' line='1494' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AppendInittab'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='1494' column='1'/> - <parameter type-id='type-id-390' name='initfunc' filepath='Python/import.c' line='1494' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_GetMagicNumber' mangled-name='PyImport_GetMagicNumber' filepath='Python/import.c' line='1571' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicNumber'> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyImport_GetMagicTag' mangled-name='PyImport_GetMagicTag' filepath='Python/import.c' line='1593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicTag'> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='PyImport_ExecCodeModule' mangled-name='PyImport_ExecCodeModule' filepath='Python/import.c' line='1614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModule'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='1614' column='1'/> - <parameter type-id='type-id-2' name='co' filepath='Python/import.c' line='1614' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ExecCodeModuleEx' mangled-name='PyImport_ExecCodeModuleEx' filepath='Python/import.c' line='1621' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleEx'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='1621' column='1'/> - <parameter type-id='type-id-2' name='co' filepath='Python/import.c' line='1621' column='1'/> - <parameter type-id='type-id-12' name='pathname' filepath='Python/import.c' line='1621' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ExecCodeModuleWithPathnames' mangled-name='PyImport_ExecCodeModuleWithPathnames' filepath='Python/import.c' line='1628' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleWithPathnames'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='1628' column='1'/> - <parameter type-id='type-id-2' name='co' filepath='Python/import.c' line='1628' column='1'/> - <parameter type-id='type-id-12' name='pathname' filepath='Python/import.c' line='1629' column='1'/> - <parameter type-id='type-id-12' name='cpathname' filepath='Python/import.c' line='1630' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ExecCodeModuleObject' mangled-name='PyImport_ExecCodeModuleObject' filepath='Python/import.c' line='1730' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleObject'> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='1730' column='1'/> - <parameter type-id='type-id-2' name='co' filepath='Python/import.c' line='1730' column='1'/> - <parameter type-id='type-id-2' name='pathname' filepath='Python/import.c' line='1730' column='1'/> - <parameter type-id='type-id-2' name='cpathname' filepath='Python/import.c' line='1731' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ImportFrozenModuleObject' mangled-name='PyImport_ImportFrozenModuleObject' filepath='Python/import.c' line='2110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportFrozenModuleObject'> - <parameter type-id='type-id-2' name='name' filepath='Python/import.c' line='2110' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyImport_GetImporter' mangled-name='PyImport_GetImporter' filepath='Python/import.c' line='2424' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetImporter'> - <parameter type-id='type-id-2' name='path' filepath='Python/import.c' line='2424' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ImportModuleNoBlock' mangled-name='PyImport_ImportModuleNoBlock' filepath='Python/import.c' line='2488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleNoBlock'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='2488' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ImportModuleLevel' mangled-name='PyImport_ImportModuleLevel' filepath='Python/import.c' line='2935' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleLevel'> - <parameter type-id='type-id-12' name='name' filepath='Python/import.c' line='2935' column='1'/> - <parameter type-id='type-id-2' name='globals' filepath='Python/import.c' line='2935' column='1'/> - <parameter type-id='type-id-2' name='locals' filepath='Python/import.c' line='2935' column='1'/> - <parameter type-id='type-id-2' name='fromlist' filepath='Python/import.c' line='2936' column='1'/> - <parameter type-id='type-id-8' name='level' filepath='Python/import.c' line='2936' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyImport_ReloadModule' mangled-name='PyImport_ReloadModule' filepath='Python/import.c' line='2953' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ReloadModule'> - <parameter type-id='type-id-2' name='m' filepath='Python/import.c' line='2953' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetModuleAttr' mangled-name='_PyImport_GetModuleAttr' filepath='Python/import.c' line='3266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_GetModuleAttr'> - <parameter type-id='type-id-2' name='modname' filepath='Python/import.c' line='3266' column='1'/> - <parameter type-id='type-id-2' name='attrname' filepath='Python/import.c' line='3266' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInit__imp' mangled-name='PyInit__imp' filepath='Python/import.c' line='3895' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__imp'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_LoadDynamicModuleWithSpec' filepath='Python/importdl.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-229'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/initconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_PyArgv' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='64' column='1' id='type-id-1427'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='argc' type-id='type-id-14' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='use_bytes_argv' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='66' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='bytes_argv' type-id='type-id-136' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='wchar_argv' type-id='type-id-1428' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='68' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyArgv' type-id='type-id-1427' filepath='./Include/internal/pycore_initconfig.h' line='69' column='1' id='type-id-1429'/> - <class-decl name='_PyPreCmdline' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1430' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='97' column='1' id='type-id-1431'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='argv' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='98' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='xoptions' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='99' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='isolated' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='100' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='use_environment' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='101' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='dev_mode' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='102' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='352'> - <var-decl name='warn_default_encoding' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='103' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyPreCmdline' type-id='type-id-1431' filepath='./Include/internal/pycore_initconfig.h' line='104' column='1' id='type-id-1430'/> - <pointer-type-def type-id='type-id-744' size-in-bits='64' id='type-id-1432'/> - <pointer-type-def type-id='type-id-741' size-in-bits='64' id='type-id-1433'/> - <pointer-type-def type-id='type-id-1430' size-in-bits='64' id='type-id-1434'/> - <qualified-type-def type-id='type-id-744' const='yes' id='type-id-1435'/> - <pointer-type-def type-id='type-id-1435' size-in-bits='64' id='type-id-1436'/> - <qualified-type-def type-id='type-id-741' const='yes' id='type-id-1437'/> - <pointer-type-def type-id='type-id-1437' size-in-bits='64' id='type-id-232'/> - <qualified-type-def type-id='type-id-1429' const='yes' id='type-id-1438'/> - <pointer-type-def type-id='type-id-1438' size-in-bits='64' id='type-id-1439'/> - <qualified-type-def type-id='type-id-1430' const='yes' id='type-id-1440'/> - <pointer-type-def type-id='type-id-1440' size-in-bits='64' id='type-id-1441'/> - <qualified-type-def type-id='type-id-16' restrict='yes' id='type-id-18'/> - <qualified-type-def type-id='type-id-52' const='yes' id='type-id-1442'/> - <pointer-type-def type-id='type-id-1442' size-in-bits='64' id='type-id-1428'/> - <qualified-type-def type-id='type-id-52' restrict='yes' id='type-id-17'/> - <qualified-type-def type-id='type-id-235' restrict='yes' id='type-id-1443'/> - <pointer-type-def type-id='type-id-235' size-in-bits='64' id='type-id-1444'/> - <var-decl name='Py_DebugFlag' type-id='type-id-8' mangled-name='Py_DebugFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='8' column='1' elf-symbol-id='Py_DebugFlag'/> - <var-decl name='Py_VerboseFlag' type-id='type-id-8' mangled-name='Py_VerboseFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='9' column='1' elf-symbol-id='Py_VerboseFlag'/> - <var-decl name='Py_QuietFlag' type-id='type-id-8' mangled-name='Py_QuietFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='10' column='1' elf-symbol-id='Py_QuietFlag'/> - <var-decl name='Py_InteractiveFlag' type-id='type-id-8' mangled-name='Py_InteractiveFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='11' column='1' elf-symbol-id='Py_InteractiveFlag'/> - <var-decl name='Py_InspectFlag' type-id='type-id-8' mangled-name='Py_InspectFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='12' column='1' elf-symbol-id='Py_InspectFlag'/> - <var-decl name='Py_OptimizeFlag' type-id='type-id-8' mangled-name='Py_OptimizeFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='13' column='1' elf-symbol-id='Py_OptimizeFlag'/> - <var-decl name='Py_NoSiteFlag' type-id='type-id-8' mangled-name='Py_NoSiteFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='14' column='1' elf-symbol-id='Py_NoSiteFlag'/> - <var-decl name='Py_BytesWarningFlag' type-id='type-id-8' mangled-name='Py_BytesWarningFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='15' column='1' elf-symbol-id='Py_BytesWarningFlag'/> - <var-decl name='Py_FrozenFlag' type-id='type-id-8' mangled-name='Py_FrozenFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='16' column='1' elf-symbol-id='Py_FrozenFlag'/> - <var-decl name='Py_IgnoreEnvironmentFlag' type-id='type-id-8' mangled-name='Py_IgnoreEnvironmentFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='17' column='1' elf-symbol-id='Py_IgnoreEnvironmentFlag'/> - <var-decl name='Py_DontWriteBytecodeFlag' type-id='type-id-8' mangled-name='Py_DontWriteBytecodeFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='18' column='1' elf-symbol-id='Py_DontWriteBytecodeFlag'/> - <var-decl name='Py_NoUserSiteDirectory' type-id='type-id-8' mangled-name='Py_NoUserSiteDirectory' visibility='default' filepath='./Include/cpython/pydebug.h' line='19' column='1' elf-symbol-id='Py_NoUserSiteDirectory'/> - <var-decl name='Py_UnbufferedStdioFlag' type-id='type-id-8' mangled-name='Py_UnbufferedStdioFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='20' column='1' elf-symbol-id='Py_UnbufferedStdioFlag'/> - <var-decl name='Py_HashRandomizationFlag' type-id='type-id-8' mangled-name='Py_HashRandomizationFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='21' column='1' elf-symbol-id='Py_HashRandomizationFlag'/> - <var-decl name='Py_IsolatedFlag' type-id='type-id-8' mangled-name='Py_IsolatedFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='22' column='1' elf-symbol-id='Py_IsolatedFlag'/> - <var-decl name='Py_UTF8Mode' type-id='type-id-8' mangled-name='Py_UTF8Mode' visibility='default' filepath='./Include/fileobject.h' line='29' column='1' elf-symbol-id='Py_UTF8Mode'/> - <function-decl name='Py_DecodeLocale' mangled-name='Py_DecodeLocale' filepath='./Include/fileutils.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_DecodeLocale'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-441'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_GetForceASCII' mangled-name='_Py_GetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetForceASCII'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_GetLocaleEncoding' mangled-name='_Py_GetLocaleEncoding' filepath='./Include/internal/pycore_fileutils.h' line='229' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetLocaleEncoding'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_isabs' filepath='./Include/internal/pycore_fileutils.h' line='244' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_abspath' filepath='./Include/internal/pycore_fileutils.h' line='245' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-235'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyOS_ResetGetOpt' filepath='./Include/internal/pycore_getopt.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyOS_GetOpt' filepath='./Include/internal/pycore_getopt.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-14'/> - <parameter type-id='type-id-1428'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyArgv_AsWstrList' mangled-name='_PyArgv_AsWstrList' filepath='./Include/internal/pycore_initconfig.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArgv_AsWstrList'> - <parameter type-id='type-id-1439'/> - <parameter type-id='type-id-1433'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_str_to_int' mangled-name='_Py_str_to_int' filepath='./Include/internal/pycore_initconfig.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_str_to_int'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-179'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_get_xoption' mangled-name='_Py_get_xoption' filepath='./Include/internal/pycore_initconfig.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_get_xoption'> - <parameter type-id='type-id-232'/> - <parameter type-id='type-id-16'/> - <return type-id='type-id-16'/> - </function-decl> - <function-decl name='_Py_GetEnv' mangled-name='_Py_GetEnv' filepath='./Include/internal/pycore_initconfig.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetEnv'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_Py_get_env_flag' mangled-name='_Py_get_env_flag' filepath='./Include/internal/pycore_initconfig.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_get_env_flag'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPreCmdline_Clear' filepath='./Include/internal/pycore_initconfig.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1434'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPreCmdline_SetConfig' filepath='./Include/internal/pycore_initconfig.h' line='116' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1441'/> - <parameter type-id='type-id-53'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPreCmdline_Read' filepath='./Include/internal/pycore_initconfig.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1434'/> - <parameter type-id='type-id-1436'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPreConfig_InitFromPreConfig' filepath='./Include/internal/pycore_initconfig.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1432'/> - <parameter type-id='type-id-1436'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPreConfig_AsDict' filepath='./Include/internal/pycore_initconfig.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1436'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyPreConfig_GetConfig' filepath='./Include/internal/pycore_initconfig.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1432'/> - <parameter type-id='type-id-260'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyConfig_InitPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_IsLocaleCoercionTarget' mangled-name='_Py_IsLocaleCoercionTarget' filepath='./Include/internal/pycore_pylifecycle.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsLocaleCoercionTarget'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySys_ReadPreinitWarnOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1433'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PySys_ReadPreinitXOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_PreInitializeFromConfig' mangled-name='_Py_PreInitializeFromConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='77' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_PreInitializeFromConfig'> - <parameter type-id='type-id-260'/> - <parameter type-id='type-id-1439'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='setlocale' filepath='/usr/include/locale.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='setvbuf' filepath='/usr/include/stdio.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-412'/> - <parameter type-id='type-id-183'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='printf' filepath='/usr/include/stdio.h' line='356' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='puts' filepath='/usr/include/stdio.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='strtoul' filepath='/usr/include/stdlib.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-184'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='getenv' filepath='/usr/include/stdlib.h' line='641' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='wcschr' filepath='/usr/include/wchar.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-422'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-1443'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='429' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-1443'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyStatus_Ok' mangled-name='PyStatus_Ok' filepath='Python/initconfig.c' line='312' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Ok'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyStatus_Error' mangled-name='PyStatus_Error' filepath='Python/initconfig.c' line='315' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Error'> - <parameter type-id='type-id-12' name='err_msg' filepath='Python/initconfig.c' line='315' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyStatus_Exit' mangled-name='PyStatus_Exit' filepath='Python/initconfig.c' line='325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Exit'> - <parameter type-id='type-id-8' name='exitcode' filepath='Python/initconfig.c' line='325' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyStatus_IsError' mangled-name='PyStatus_IsError' filepath='Python/initconfig.c' line='329' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsError'> - <parameter type-id='type-id-54' name='status' filepath='Python/initconfig.c' line='329' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyStatus_IsExit' mangled-name='PyStatus_IsExit' filepath='Python/initconfig.c' line='332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsExit'> - <parameter type-id='type-id-54' name='status' filepath='Python/initconfig.c' line='332' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_SetFromPyStatus' mangled-name='_PyErr_SetFromPyStatus' filepath='Python/initconfig.c' line='339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetFromPyStatus'> - <parameter type-id='type-id-54' name='status' filepath='Python/initconfig.c' line='339' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyWideStringList_Clear' mangled-name='_PyWideStringList_Clear' filepath='Python/initconfig.c' line='375' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWideStringList_Clear'> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='375' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyWideStringList_Copy' mangled-name='_PyWideStringList_Copy' filepath='Python/initconfig.c' line='388' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWideStringList_Copy'> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='388' column='1'/> - <parameter type-id='type-id-232' name='list2' filepath='Python/initconfig.c' line='388' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyWideStringList_Insert' mangled-name='PyWideStringList_Insert' filepath='Python/initconfig.c' line='423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Insert'> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='423' column='1'/> - <parameter type-id='type-id-14' name='index' filepath='Python/initconfig.c' line='424' column='1'/> - <parameter type-id='type-id-16' name='item' filepath='Python/initconfig.c' line='424' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyWideStringList_Append' mangled-name='PyWideStringList_Append' filepath='Python/initconfig.c' line='464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Append'> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='464' column='1'/> - <parameter type-id='type-id-16' name='item' filepath='Python/initconfig.c' line='464' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyWideStringList_Extend' mangled-name='_PyWideStringList_Extend' filepath='Python/initconfig.c' line='471' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWideStringList_Extend'> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='471' column='1'/> - <parameter type-id='type-id-232' name='list2' filepath='Python/initconfig.c' line='471' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyWideStringList_AsList' mangled-name='_PyWideStringList_AsList' filepath='Python/initconfig.c' line='496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWideStringList_AsList'> - <parameter type-id='type-id-232' name='list' filepath='Python/initconfig.c' line='496' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_SetStandardStreamEncoding' mangled-name='Py_SetStandardStreamEncoding' filepath='Python/initconfig.c' line='527' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetStandardStreamEncoding'> - <parameter type-id='type-id-12' name='encoding' filepath='Python/initconfig.c' line='527' column='1'/> - <parameter type-id='type-id-12' name='errors' filepath='Python/initconfig.c' line='527' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_ClearStandardStreamEncoding' mangled-name='_Py_ClearStandardStreamEncoding' filepath='Python/initconfig.c' line='585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_ClearStandardStreamEncoding'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_ClearArgcArgv' mangled-name='_Py_ClearArgcArgv' filepath='Python/initconfig.c' line='608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_ClearArgcArgv'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_GetArgcArgv' mangled-name='Py_GetArgcArgv' filepath='Python/initconfig.c' line='639' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetArgcArgv'> - <parameter type-id='type-id-179' name='argc' filepath='Python/initconfig.c' line='639' column='1'/> - <parameter type-id='type-id-1444' name='argv' filepath='Python/initconfig.c' line='639' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyConfig_InitCompatConfig' mangled-name='_PyConfig_InitCompatConfig' filepath='Python/initconfig.c' line='758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_InitCompatConfig'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='758' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyConfig_InitIsolatedConfig' mangled-name='PyConfig_InitIsolatedConfig' filepath='Python/initconfig.c' line='842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitIsolatedConfig'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='842' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyConfig_SetString' mangled-name='PyConfig_SetString' filepath='Python/initconfig.c' line='867' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetString'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='867' column='1'/> - <parameter type-id='type-id-235' name='config_str' filepath='Python/initconfig.c' line='867' column='1'/> - <parameter type-id='type-id-16' name='str' filepath='Python/initconfig.c' line='867' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyConfig_SetBytesString' mangled-name='PyConfig_SetBytesString' filepath='Python/initconfig.c' line='929' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesString'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='929' column='1'/> - <parameter type-id='type-id-235' name='config_str' filepath='Python/initconfig.c' line='929' column='1'/> - <parameter type-id='type-id-12' name='str' filepath='Python/initconfig.c' line='930' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyConfig_AsDict' mangled-name='_PyConfig_AsDict' filepath='Python/initconfig.c' line='1038' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_AsDict'> - <parameter type-id='type-id-260' name='config' filepath='Python/initconfig.c' line='1038' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyConfig_FromDict' mangled-name='_PyConfig_FromDict' filepath='Python/initconfig.c' line='1306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_FromDict'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='1306' column='1'/> - <parameter type-id='type-id-2' name='dict' filepath='Python/initconfig.c' line='1306' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyConfig_SetArgv' mangled-name='PyConfig_SetArgv' filepath='Python/initconfig.c' line='2955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetArgv'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='2955' column='1'/> - <parameter type-id='type-id-14' name='argc' filepath='Python/initconfig.c' line='2955' column='1'/> - <parameter type-id='type-id-1428' name='argv' filepath='Python/initconfig.c' line='2955' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyConfig_SetWideStringList' mangled-name='PyConfig_SetWideStringList' filepath='Python/initconfig.c' line='2967' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetWideStringList'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='2967' column='1'/> - <parameter type-id='type-id-1433' name='list' filepath='Python/initconfig.c' line='2967' column='1'/> - <parameter type-id='type-id-14' name='length' filepath='Python/initconfig.c' line='2968' column='1'/> - <parameter type-id='type-id-235' name='items' filepath='Python/initconfig.c' line='2968' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='PyConfig_Read' mangled-name='PyConfig_Read' filepath='Python/initconfig.c' line='3051' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Read'> - <parameter type-id='type-id-53' name='config' filepath='Python/initconfig.c' line='3051' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_GetConfigsAsDict' mangled-name='_Py_GetConfigsAsDict' filepath='Python/initconfig.c' line='3058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfigsAsDict'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/instrumentation.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_PyInstrumentation_MISSING' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='100' column='1'/> - <var-decl name='_PyInstrumentation_DISABLE' type-id='type-id-345' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='101' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Python/intrinsics.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-1445' size-in-bits='768' id='type-id-1446'> - <subrange length='12' type-id='type-id-28' id='type-id-654'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1445' size-in-bits='infinite' id='type-id-1447'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1448' size-in-bits='320' id='type-id-1449'> - <subrange length='5' type-id='type-id-28' id='type-id-689'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1448' size-in-bits='infinite' id='type-id-1450'> - <subrange length='infinite' id='type-id-225'/> - </array-type-def> - <typedef-decl name='instrinsic_func1' type-id='type-id-1451' filepath='./Include/internal/pycore_intrinsics.h' line='29' column='1' id='type-id-1452'/> - <typedef-decl name='instrinsic_func2' type-id='type-id-1453' filepath='./Include/internal/pycore_intrinsics.h' line='30' column='1' id='type-id-1454'/> - <pointer-type-def type-id='type-id-1455' size-in-bits='64' id='type-id-1451'/> - <pointer-type-def type-id='type-id-1456' size-in-bits='64' id='type-id-1453'/> - <qualified-type-def type-id='type-id-1452' const='yes' id='type-id-1445'/> - <qualified-type-def type-id='type-id-1454' const='yes' id='type-id-1448'/> - <function-decl name='_PyFrame_LocalsToFast' filepath='./Include/internal/pycore_frame.h' line='236' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-374'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_set_function_type_params' filepath='./Include/internal/pycore_function.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyAsyncGenValueWrapperNew' filepath='./Include/internal/pycore_genobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='_PyIntrinsics_UnaryFunctions' type-id='type-id-1447' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='31' column='1'/> - <var-decl name='_PyIntrinsics_BinaryFunctions' type-id='type-id-1450' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='32' column='1'/> - <function-decl name='_Py_make_typevar' filepath='./Include/internal/pycore_typevarobject.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_make_paramspec' filepath='./Include/internal/pycore_typevarobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_make_typevartuple' filepath='./Include/internal/pycore_typevarobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_make_typealias' filepath='./Include/internal/pycore_typevarobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_subscript_generic' filepath='./Include/internal/pycore_typevarobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1455'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - <function-type size-in-bits='64' id='type-id-1456'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Python/legacy_tracing.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <typedef-decl name='_PyMonitoringEventSet' type-id='type-id-352' filepath='./Include/internal/pycore_instruments.h' line='49' column='1' id='type-id-1457'/> - <function-decl name='_PyMonitoring_RegisterCallback' filepath='./Include/internal/pycore_instruments.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyMonitoring_SetEvents' filepath='./Include/internal/pycore_instruments.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1457'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_Instrumentation_GetLine' filepath='./Include/internal/pycore_instruments.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/marshal.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-116' size-in-bits='192' id='type-id-1458'> - <subrange length='3' type-id='type-id-28' id='type-id-631'/> - </array-type-def> - <class-decl name='stat' size-in-bits='1152' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='26' column='1' id='type-id-1459'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='st_dev' type-id='type-id-187' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='31' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='st_ino' type-id='type-id-1460' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='36' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='st_nlink' type-id='type-id-1461' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='44' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='st_mode' type-id='type-id-123' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='45' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='st_uid' type-id='type-id-125' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='47' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='st_gid' type-id='type-id-121' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='48' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='288'> - <var-decl name='__pad0' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='50' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='st_rdev' type-id='type-id-187' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='52' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='st_size' type-id='type-id-1282' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='57' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='448'> - <var-decl name='st_blksize' type-id='type-id-1462' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='61' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='512'> - <var-decl name='st_blocks' type-id='type-id-1463' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='63' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='576'> - <var-decl name='st_atim' type-id='type-id-1344' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='704'> - <var-decl name='st_mtim' type-id='type-id-1344' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='832'> - <var-decl name='st_ctim' type-id='type-id-1344' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='960'> - <var-decl name='__glibc_reserved' type-id='type-id-1458' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='89' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='__gid_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='147' column='1' id='type-id-121'/> - <typedef-decl name='__ino_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-1460'/> - <typedef-decl name='__mode_t' type-id='type-id-95' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='150' column='1' id='type-id-123'/> - <typedef-decl name='__nlink_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='151' column='1' id='type-id-1461'/> - <typedef-decl name='__blksize_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='175' column='1' id='type-id-1462'/> - <typedef-decl name='__blkcnt_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='180' column='1' id='type-id-1463'/> - <pointer-type-def type-id='type-id-1459' size-in-bits='64' id='type-id-51'/> - <function-decl name='_Py_fstat_noraise' mangled-name='_Py_fstat_noraise' filepath='./Include/internal/pycore_fileutils.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fstat_noraise'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-51'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='fread' filepath='/usr/include/stdio.h' line='675' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-226'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-412'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='PyMarshal_WriteLongToFile' mangled-name='PyMarshal_WriteLongToFile' filepath='Python/marshal.c' line='633' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteLongToFile'> - <parameter type-id='type-id-47' name='x' filepath='Python/marshal.c' line='633' column='1'/> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='633' column='1'/> - <parameter type-id='type-id-8' name='version' filepath='Python/marshal.c' line='633' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMarshal_WriteObjectToFile' mangled-name='PyMarshal_WriteObjectToFile' filepath='Python/marshal.c' line='648' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToFile'> - <parameter type-id='type-id-2' name='x' filepath='Python/marshal.c' line='648' column='1'/> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='648' column='1'/> - <parameter type-id='type-id-8' name='version' filepath='Python/marshal.c' line='648' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyMarshal_ReadShortFromFile' mangled-name='PyMarshal_ReadShortFromFile' filepath='Python/marshal.c' line='1532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadShortFromFile'> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='1532' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyMarshal_ReadLongFromFile' mangled-name='PyMarshal_ReadLongFromFile' filepath='Python/marshal.c' line='1548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLongFromFile'> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='1548' column='1'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyMarshal_ReadLastObjectFromFile' mangled-name='PyMarshal_ReadLastObjectFromFile' filepath='Python/marshal.c' line='1584' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLastObjectFromFile'> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='1584' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMarshal_ReadObjectFromFile' mangled-name='PyMarshal_ReadObjectFromFile' filepath='Python/marshal.c' line='1609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromFile'> - <parameter type-id='type-id-229' name='fp' filepath='Python/marshal.c' line='1609' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMarshal_WriteObjectToString' mangled-name='PyMarshal_WriteObjectToString' filepath='Python/marshal.c' line='1650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToString'> - <parameter type-id='type-id-2' name='x' filepath='Python/marshal.c' line='1650' column='1'/> - <parameter type-id='type-id-8' name='version' filepath='Python/marshal.c' line='1650' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyMarshal_Init' mangled-name='PyMarshal_Init' filepath='Python/marshal.c' line='1900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_Init'> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/modsupport.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_convert_optional_to_ssize_t' mangled-name='_Py_convert_optional_to_ssize_t' filepath='Python/modsupport.c' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_convert_optional_to_ssize_t'> - <parameter type-id='type-id-2' name='obj' filepath='Python/modsupport.c' line='16' column='1'/> - <parameter type-id='type-id-22' name='result' filepath='Python/modsupport.c' line='16' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_VaBuildValue' mangled-name='Py_VaBuildValue' filepath='Python/modsupport.c' line='530' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_VaBuildValue'> - <parameter type-id='type-id-12' name='format' filepath='Python/modsupport.c' line='530' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/modsupport.c' line='530' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_VaBuildValue_SizeT' mangled-name='_Py_VaBuildValue_SizeT' filepath='Python/modsupport.c' line='536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_VaBuildValue_SizeT'> - <parameter type-id='type-id-12' name='format' filepath='Python/modsupport.c' line='536' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/modsupport.c' line='536' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyModule_Add' mangled-name='_PyModule_Add' filepath='Python/modsupport.c' line='656' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyModule_Add'> - <parameter type-id='type-id-2' name='mod' filepath='Python/modsupport.c' line='656' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/modsupport.c' line='656' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/modsupport.c' line='656' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_AddObject' mangled-name='PyModule_AddObject' filepath='Python/modsupport.c' line='664' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddObject'> - <parameter type-id='type-id-2' name='mod' filepath='Python/modsupport.c' line='664' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/modsupport.c' line='664' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/modsupport.c' line='664' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyModule_AddStringConstant' mangled-name='PyModule_AddStringConstant' filepath='Python/modsupport.c' line='680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddStringConstant'> - <parameter type-id='type-id-2' name='m' filepath='Python/modsupport.c' line='680' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/modsupport.c' line='680' column='1'/> - <parameter type-id='type-id-12' name='value' filepath='Python/modsupport.c' line='680' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/mysnprintf.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='vsnprintf' filepath='/usr/include/stdio.h' line='382' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-306'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyOS_vsnprintf' mangled-name='PyOS_vsnprintf' filepath='Python/mysnprintf.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_vsnprintf'> - <parameter type-id='type-id-15' name='str' filepath='Python/mysnprintf.c' line='53' column='1'/> - <parameter type-id='type-id-19' name='size' filepath='Python/mysnprintf.c' line='53' column='1'/> - <parameter type-id='type-id-12' name='format' filepath='Python/mysnprintf.c' line='53' column='1'/> - <parameter type-id='type-id-306' name='va' filepath='Python/mysnprintf.c' line='53' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pathconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_wreadlink' mangled-name='_Py_wreadlink' filepath='./Include/internal/pycore_fileutils.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_wreadlink'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-52'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_wrealpath' mangled-name='_Py_wrealpath' filepath='./Include/internal/pycore_fileutils.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_wrealpath'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-52'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_Py_wgetcwd' mangled-name='_Py_wgetcwd' filepath='./Include/internal/pycore_fileutils.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_wgetcwd'> - <parameter type-id='type-id-52'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-18'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-17'/> - <parameter type-id='type-id-18'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='wcsrchr' filepath='/usr/include/wchar.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-422'/> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='_PyPathConfig_ClearGlobal' mangled-name='_PyPathConfig_ClearGlobal' filepath='Python/pathconfig.c' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPathConfig_ClearGlobal'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_SetPath' mangled-name='Py_SetPath' filepath='Python/pathconfig.c' line='215' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetPath'> - <parameter type-id='type-id-16' name='path' filepath='Python/pathconfig.c' line='215' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_SetPythonHome' mangled-name='Py_SetPythonHome' filepath='Python/pathconfig.c' line='256' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetPythonHome'> - <parameter type-id='type-id-16' name='home' filepath='Python/pathconfig.c' line='256' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_SetProgramName' mangled-name='Py_SetProgramName' filepath='Python/pathconfig.c' line='279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetProgramName'> - <parameter type-id='type-id-16' name='program_name' filepath='Python/pathconfig.c' line='279' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_SetProgramFullPath' mangled-name='_Py_SetProgramFullPath' filepath='Python/pathconfig.c' line='301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SetProgramFullPath'> - <parameter type-id='type-id-16' name='program_full_path' filepath='Python/pathconfig.c' line='301' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_GetPath' mangled-name='Py_GetPath' filepath='Python/pathconfig.c' line='324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPath'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='Py_GetPrefix' mangled-name='Py_GetPrefix' filepath='Python/pathconfig.c' line='347' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPrefix'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='Py_GetExecPrefix' mangled-name='Py_GetExecPrefix' filepath='Python/pathconfig.c' line='354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetExecPrefix'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='Py_GetProgramFullPath' mangled-name='Py_GetProgramFullPath' filepath='Python/pathconfig.c' line='361' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramFullPath'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='Py_GetPythonHome' mangled-name='Py_GetPythonHome' filepath='Python/pathconfig.c' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPythonHome'> - <return type-id='type-id-52'/> - </function-decl> - <function-decl name='Py_GetProgramName' mangled-name='Py_GetProgramName' filepath='Python/pathconfig.c' line='375' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramName'> - <return type-id='type-id-52'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/perf_trampoline.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='_Py_perfmap_callbacks' type-id='type-id-1464' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='80' column='1'/> - <function-decl name='mprotect' filepath='/usr/include/x86_64-linux-gnu/sys/mman.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/preconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_CoerceLegacyLocale' mangled-name='_Py_CoerceLegacyLocale' filepath='./Include/cpython/pylifecycle.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CoerceLegacyLocale'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_LegacyLocaleDetected' mangled-name='_Py_LegacyLocaleDetected' filepath='./Include/cpython/pylifecycle.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_LegacyLocaleDetected'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_SetLocaleFromEnv' mangled-name='_Py_SetLocaleFromEnv' filepath='./Include/cpython/pylifecycle.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SetLocaleFromEnv'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-15'/> - </function-decl> - <var-decl name='Py_FileSystemDefaultEncoding' type-id='type-id-12' mangled-name='Py_FileSystemDefaultEncoding' visibility='default' filepath='./Include/fileobject.h' line='22' column='1' elf-symbol-id='Py_FileSystemDefaultEncoding'/> - <var-decl name='Py_FileSystemDefaultEncodeErrors' type-id='type-id-12' mangled-name='Py_FileSystemDefaultEncodeErrors' visibility='default' filepath='./Include/fileobject.h' line='24' column='1' elf-symbol-id='Py_FileSystemDefaultEncodeErrors'/> - <var-decl name='Py_HasFileSystemDefaultEncoding' type-id='type-id-8' mangled-name='Py_HasFileSystemDefaultEncoding' visibility='default' filepath='./Include/fileobject.h' line='26' column='1' elf-symbol-id='Py_HasFileSystemDefaultEncoding'/> - <var-decl name='_Py_HasFileSystemDefaultEncodeErrors' type-id='type-id-8' mangled-name='_Py_HasFileSystemDefaultEncodeErrors' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='186' column='1' elf-symbol-id='_Py_HasFileSystemDefaultEncodeErrors'/> - <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-16'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPreConfig_InitCompatConfig' mangled-name='_PyPreConfig_InitCompatConfig' filepath='Python/preconfig.c' line='283' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPreConfig_InitCompatConfig'> - <parameter type-id='type-id-1432' name='config' filepath='Python/preconfig.c' line='283' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyPreConfig_InitPythonConfig' mangled-name='PyPreConfig_InitPythonConfig' filepath='Python/preconfig.c' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPreConfig_InitPythonConfig'> - <parameter type-id='type-id-1432' name='config' filepath='Python/preconfig.c' line='311' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyPreConfig_InitIsolatedConfig' mangled-name='PyPreConfig_InitIsolatedConfig' filepath='Python/preconfig.c' line='332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPreConfig_InitIsolatedConfig'> - <parameter type-id='type-id-1432' name='config' filepath='Python/preconfig.c' line='332' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pyctype.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-382' size-in-bits='2048' id='type-id-1465'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-1466' size-in-bits='8192' id='type-id-1467'> - <subrange length='256' type-id='type-id-28' id='type-id-62'/> - </array-type-def> - <qualified-type-def type-id='type-id-95' const='yes' id='type-id-1466'/> - <var-decl name='_Py_ctype_table' type-id='type-id-1467' mangled-name='_Py_ctype_table' visibility='default' filepath='./Include/cpython/pyctype.h' line='16' column='1' elf-symbol-id='_Py_ctype_table'/> - <var-decl name='_Py_ctype_tolower' type-id='type-id-1465' mangled-name='_Py_ctype_tolower' visibility='default' filepath='./Include/cpython/pyctype.h' line='29' column='1' elf-symbol-id='_Py_ctype_tolower'/> - <var-decl name='_Py_ctype_toupper' type-id='type-id-1465' mangled-name='_Py_ctype_toupper' visibility='default' filepath='./Include/cpython/pyctype.h' line='30' column='1' elf-symbol-id='_Py_ctype_toupper'/> - </abi-instr> - <abi-instr address-size='64' path='Python/pyhash.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-85' size-in-bits='128' id='type-id-1468'> - <subrange length='16' type-id='type-id-28' id='type-id-57'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-85' size-in-bits='192' id='type-id-1469'> - <subrange length='24' type-id='type-id-28' id='type-id-674'/> - </array-type-def> - <union-decl name='_Py_HashSecret_t' size-in-bits='192' naming-typedef-id='type-id-1470' visibility='default' filepath='./Include/pyhash.h' line='55' column='1' id='type-id-1471'> - <data-member access='public'> - <var-decl name='uc' type-id='type-id-1469' visibility='default' filepath='./Include/pyhash.h' line='57' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='fnv' type-id='type-id-1472' visibility='default' filepath='./Include/pyhash.h' line='62' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='siphash' type-id='type-id-1473' visibility='default' filepath='./Include/pyhash.h' line='67' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='djbx33a' type-id='type-id-1474' visibility='default' filepath='./Include/pyhash.h' line='72' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='expat' type-id='type-id-1475' visibility='default' filepath='./Include/pyhash.h' line='76' column='1'/> - </data-member> - </union-decl> - <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/pyhash.h' line='59' column='1' id='type-id-1472'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='prefix' type-id='type-id-305' visibility='default' filepath='./Include/pyhash.h' line='60' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='suffix' type-id='type-id-305' visibility='default' filepath='./Include/pyhash.h' line='61' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/pyhash.h' line='64' column='1' id='type-id-1473'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='k0' type-id='type-id-117' visibility='default' filepath='./Include/pyhash.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='k1' type-id='type-id-117' visibility='default' filepath='./Include/pyhash.h' line='66' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/pyhash.h' line='69' column='1' id='type-id-1474'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='padding' type-id='type-id-1468' visibility='default' filepath='./Include/pyhash.h' line='70' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='suffix' type-id='type-id-305' visibility='default' filepath='./Include/pyhash.h' line='71' column='1'/> - </data-member> - </class-decl> - <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/pyhash.h' line='73' column='1' id='type-id-1475'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='padding' type-id='type-id-1468' visibility='default' filepath='./Include/pyhash.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='hashsalt' type-id='type-id-305' visibility='default' filepath='./Include/pyhash.h' line='75' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_HashSecret_t' type-id='type-id-1471' filepath='./Include/pyhash.h' line='77' column='1' id='type-id-1470'/> - <class-decl name='PyHash_FuncDef' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1476' visibility='default' filepath='./Include/pyhash.h' line='86' column='1' id='type-id-1477'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='hash' type-id='type-id-1478' visibility='default' filepath='./Include/pyhash.h' line='87' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='name' type-id='type-id-12' visibility='default' filepath='./Include/pyhash.h' line='88' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='hash_bits' type-id='type-id-261' visibility='default' filepath='./Include/pyhash.h' line='89' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='seed_bits' type-id='type-id-261' visibility='default' filepath='./Include/pyhash.h' line='90' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyHash_FuncDef' type-id='type-id-1477' filepath='./Include/pyhash.h' line='91' column='1' id='type-id-1476'/> - <pointer-type-def type-id='type-id-1476' size-in-bits='64' id='type-id-1479'/> - <pointer-type-def type-id='type-id-1480' size-in-bits='64' id='type-id-1481'/> - <qualified-type-def type-id='type-id-1481' const='yes' id='type-id-1478'/> - <var-decl name='_Py_HashSecret' type-id='type-id-1470' mangled-name='_Py_HashSecret' visibility='default' filepath='./Include/pyhash.h' line='78' column='1' elf-symbol-id='_Py_HashSecret'/> - <function-decl name='PyHash_GetFuncDef' mangled-name='PyHash_GetFuncDef' filepath='Python/pyhash.c' line='221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyHash_GetFuncDef'> - <return type-id='type-id-1479'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1480'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-305'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Python/pylifecycle.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='PyInterpreterConfig' size-in-bits='224' is-struct='yes' naming-typedef-id='type-id-1482' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='72' column='1' id='type-id-1483'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='use_main_obmalloc' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='74' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='allow_fork' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='75' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='allow_exec' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='76' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='allow_threads' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='77' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='allow_daemon_threads' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='78' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='check_multi_interp_extensions' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='79' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='gil' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='80' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='PyInterpreterConfig' type-id='type-id-1483' filepath='./Include/cpython/pylifecycle.h' line='81' column='1' id='type-id-1482'/> - <class-decl name='_PyPerf_Callbacks' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1464' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='63' column='1' id='type-id-1484'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='init_state' type-id='type-id-818' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='65' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='write_state' type-id='type-id-819' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='67' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='free_state' type-id='type-id-814' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='70' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyPerf_Callbacks' type-id='type-id-1484' filepath='./Include/internal/pycore_ceval.h' line='71' column='1' id='type-id-1464'/> - <class-decl name='_PyShimCodeDef' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='453' column='1' id='type-id-1485'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='code' type-id='type-id-316' visibility='default' filepath='./Include/internal/pycore_code.h' line='454' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='codelen' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='455' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='stacksize' type-id='type-id-8' visibility='default' filepath='./Include/internal/pycore_code.h' line='456' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='cname' type-id='type-id-12' visibility='default' filepath='./Include/internal/pycore_code.h' line='457' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_PyShimCodeDef' type-id='type-id-1485' filepath='./Include/internal/pycore_code.h' line='458' column='1' id='type-id-1486'/> - <typedef-decl name='_PyRuntimeState' type-id='type-id-982' filepath='./Include/internal/pycore_runtime.h' line='181' column='1' id='type-id-1487'/> - <typedef-decl name='PyOS_sighandler_t' type-id='type-id-1016' filepath='./Include/pylifecycle.h' line='61' column='1' id='type-id-1488'/> - <typedef-decl name='nl_item' type-id='type-id-8' filepath='/usr/include/nl_types.h' line='36' column='1' id='type-id-1489'/> - <typedef-decl name='sigset_t' type-id='type-id-30' filepath='/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h' line='7' column='1' id='type-id-73'/> - <pointer-type-def type-id='type-id-177' size-in-bits='64' id='type-id-1490'/> - <pointer-type-def type-id='type-id-1464' size-in-bits='64' id='type-id-231'/> - <pointer-type-def type-id='type-id-1487' size-in-bits='64' id='type-id-178'/> - <qualified-type-def type-id='type-id-1482' const='yes' id='type-id-1491'/> - <pointer-type-def type-id='type-id-1491' size-in-bits='64' id='type-id-1492'/> - <qualified-type-def type-id='type-id-1486' const='yes' id='type-id-1493'/> - <pointer-type-def type-id='type-id-1493' size-in-bits='64' id='type-id-1494'/> - <qualified-type-def type-id='type-id-836' const='yes' id='type-id-1495'/> - <pointer-type-def type-id='type-id-1495' size-in-bits='64' id='type-id-1496'/> - <qualified-type-def type-id='type-id-1496' restrict='yes' id='type-id-1497'/> - <pointer-type-def type-id='type-id-836' size-in-bits='64' id='type-id-1498'/> - <qualified-type-def type-id='type-id-1498' restrict='yes' id='type-id-1499'/> - <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-45'/> - <function-decl name='_Py_FinishPendingCalls' filepath='./Include/internal/pycore_ceval.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_Fini' filepath='./Include/internal/pycore_ceval.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPerfTrampoline_SetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-231'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPerfTrampoline_Init' filepath='./Include/internal/pycore_ceval.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyPerfTrampoline_Fini' filepath='./Include/internal/pycore_ceval.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyEval_InitGIL' filepath='./Include/internal/pycore_ceval.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyEval_FiniGIL' filepath='./Include/internal/pycore_ceval.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_ReleaseLock' filepath='./Include/internal/pycore_ceval.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_MakeShimCode' filepath='./Include/internal/pycore_code.h' line='461' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1494'/> - <return type-id='type-id-328'/> - </function-decl> - <function-decl name='_PyContext_Init' filepath='./Include/internal/pycore_context.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyContext_Fini' filepath='./Include/internal/pycore_context.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyDict_Fini' filepath='./Include/internal/pycore_dict.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyExc_InitState' filepath='./Include/internal/pycore_exceptions.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyExc_InitGlobalObjects' filepath='./Include/internal/pycore_exceptions.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyExc_InitTypes' filepath='./Include/internal/pycore_exceptions.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyExc_Fini' filepath='./Include/internal/pycore_exceptions.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyExc_ClearExceptionGroupType' filepath='./Include/internal/pycore_exceptions.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_write_noraise' mangled-name='_Py_write_noraise' filepath='./Include/internal/pycore_fileutils.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_write_noraise'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_Py_ResetForceASCII' mangled-name='_Py_ResetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_ResetForceASCII'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFloat_InitState' filepath='./Include/internal/pycore_floatobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFloat_InitTypes' filepath='./Include/internal/pycore_floatobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyFloat_Fini' filepath='./Include/internal/pycore_floatobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFloat_FiniType' filepath='./Include/internal/pycore_floatobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGC_CollectNoFail' filepath='./Include/internal/pycore_gc.h' line='195' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyAsyncGen_Fini' filepath='./Include/internal/pycore_genobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_ClearModules' filepath='./Include/internal/pycore_import.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_ClearModulesByIndex' filepath='./Include/internal/pycore_import.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_InitDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyImport_GetImportlibLoader' filepath='./Include/internal/pycore_import.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_Init' filepath='./Include/internal/pycore_import.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyImport_Fini' filepath='./Include/internal/pycore_import.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_InitCore' filepath='./Include/internal/pycore_import.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyImport_InitExternal' filepath='./Include/internal/pycore_import.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyImport_FiniCore' filepath='./Include/internal/pycore_import.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_FiniExternal' filepath='./Include/internal/pycore_import.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPreConfig_InitFromConfig' filepath='./Include/internal/pycore_initconfig.h' line='126' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1432'/> - <parameter type-id='type-id-260'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPreConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1432'/> - <parameter type-id='type-id-1439'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyPreConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1436'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyConfig_Copy' filepath='./Include/internal/pycore_initconfig.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <parameter type-id='type-id-260'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyConfig_InitImportConfig' filepath='./Include/internal/pycore_initconfig.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-53'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-260'/> - <parameter type-id='type-id-933'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyInterpreterState_Clear' filepath='./Include/internal/pycore_interp.h' line='204' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyList_Fini' filepath='./Include/internal/pycore_list.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyLong_InitTypes' filepath='./Include/internal/pycore_long.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyLong_FiniTypes' filepath='./Include/internal/pycore_long.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyPathConfig_UpdateGlobal' filepath='./Include/internal/pycore_pathconfig.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-260'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyErr_InitTypes' filepath='./Include/internal/pycore_pyerrors.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyErr_FiniTypes' filepath='./Include/internal/pycore_pyerrors.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_ClearFileSystemEncoding' filepath='./Include/internal/pycore_pylifecycle.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_InitEncodings' filepath='./Include/internal/pycore_pylifecycle.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_InitVersion' filepath='./Include/internal/pycore_pylifecycle.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFaulthandler_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyBuiltin_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PySys_Create' filepath='./Include/internal/pycore_pylifecycle.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-233'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PySys_UpdateConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySys_FiniTypes' filepath='./Include/internal/pycore_pylifecycle.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyBuiltins_AddExceptions' filepath='./Include/internal/pycore_pylifecycle.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_HashRandomization_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-260'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyTime_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyGC_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyAtExit_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_Py_Deepfreeze_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySignal_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PySignal_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_HashRandomization_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyFaulthandler_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyHash_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTraceMalloc_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThread_FiniType' filepath='./Include/internal/pycore_pylifecycle.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_Deepfreeze_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyArg_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_FinalizeAllocatedBlocks' filepath='./Include/internal/pycore_pylifecycle.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGILState_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyGILState_SetTstate' filepath='./Include/internal/pycore_pylifecycle.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyGILState_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGC_DumpShutdownStats' filepath='./Include/internal/pycore_pylifecycle.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyAtExit_Call' filepath='./Include/internal/pycore_pylifecycle.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyMem_RawMalloc' filepath='./Include/internal/pycore_pymem_init.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_RawCalloc' filepath='./Include/internal/pycore_pymem_init.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_RawRealloc' filepath='./Include/internal/pycore_pymem_init.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_RawFree' filepath='./Include/internal/pycore_pymem_init.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_Malloc' filepath='./Include/internal/pycore_pymem_init.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyObject_Calloc' filepath='./Include/internal/pycore_pymem_init.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyObject_Free' filepath='./Include/internal/pycore_pymem_init.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_Realloc' filepath='./Include/internal/pycore_pymem_init.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_ArenaAlloc' filepath='./Include/internal/pycore_pymem_init.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyMem_ArenaFree' filepath='./Include/internal/pycore_pymem_init.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThreadState_New' mangled-name='_PyThreadState_New' filepath='./Include/internal/pycore_pystate.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_New'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='_PyThreadState_Bind' mangled-name='_PyThreadState_Bind' filepath='./Include/internal/pycore_pystate.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Bind'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyInterpreterState_Enable' mangled-name='_PyInterpreterState_Enable' filepath='./Include/internal/pycore_pystate.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_Enable'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-54'/> - </function-decl> - <var-decl name='_PyRuntime' type-id='type-id-1487' mangled-name='_PyRuntime' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='186' column='1' elf-symbol-id='_PyRuntime'/> - <function-decl name='_PyRuntimeState_Init' mangled-name='_PyRuntimeState_Init' filepath='./Include/internal/pycore_runtime.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRuntimeState_Init'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyRuntimeState_Fini' mangled-name='_PyRuntimeState_Fini' filepath='./Include/internal/pycore_runtime.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRuntimeState_Fini'> - <parameter type-id='type-id-178'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PySlice_Fini' filepath='./Include/internal/pycore_sliceobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PySys_ClearAuditHooks' filepath='./Include/internal/pycore_sysmodule.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PySys_SetAttr' filepath='./Include/internal/pycore_sysmodule.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_DumpTracebackThreads' mangled-name='_Py_DumpTracebackThreads' filepath='./Include/internal/pycore_traceback.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpTracebackThreads'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-177'/> - <return type-id='type-id-12'/> - </function-decl> - <function-decl name='_Py_DumpASCII' mangled-name='_Py_DumpASCII' filepath='./Include/internal/pycore_traceback.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpASCII'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_DumpDecimal' mangled-name='_Py_DumpDecimal' filepath='./Include/internal/pycore_traceback.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpDecimal'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_DumpHexadecimal' mangled-name='_Py_DumpHexadecimal' filepath='./Include/internal/pycore_traceback.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpHexadecimal'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-749'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTuple_Fini' filepath='./Include/internal/pycore_tuple.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTypes_InitTypes' filepath='./Include/internal/pycore_typeobject.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyTypes_FiniTypes' filepath='./Include/internal/pycore_typeobject.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTypes_Fini' filepath='./Include/internal/pycore_typeobject.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_clear_generic_types' filepath='./Include/internal/pycore_typevarobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_InitState' filepath='./Include/internal/pycore_unicodeobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_InitGlobalObjects' filepath='./Include/internal/pycore_unicodeobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyUnicode_InitTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='_PyUnicode_Fini' filepath='./Include/internal/pycore_unicodeobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_FiniTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyUnicode_ClearInterned' filepath='./Include/internal/pycore_unicodeobject.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyWarnings_InitState' filepath='./Include/internal/pycore_warnings.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyModule_IsExtension' filepath='./Include/moduleobject.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyGC_Collect' mangled-name='PyGC_Collect' filepath='./Include/objimpl.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Collect'> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='PyInterpreterState_New' mangled-name='PyInterpreterState_New' filepath='./Include/pystate.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_New'> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='PyInterpreterState_Delete' mangled-name='PyInterpreterState_Delete' filepath='./Include/pystate.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Delete'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThreadState_Clear' mangled-name='PyThreadState_Clear' filepath='./Include/pystate.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Clear'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThreadState_Delete' mangled-name='PyThreadState_Delete' filepath='./Include/pystate.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Delete'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThreadState_Swap' mangled-name='PyThreadState_Swap' filepath='./Include/pystate.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Swap'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyGILState_GetThisThreadState' mangled-name='PyGILState_GetThisThreadState' filepath='./Include/pystate.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_GetThisThreadState'> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyOS_mystrnicmp' mangled-name='PyOS_mystrnicmp' filepath='./Include/pystrcmp.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_mystrnicmp'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-14'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyErr_PrintEx' mangled-name='PyErr_PrintEx' filepath='./Include/pythonrun.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_PrintEx'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_DisplayException' mangled-name='PyErr_DisplayException' filepath='./Include/pythonrun.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_DisplayException'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PySys_SetObject' mangled-name='PySys_SetObject' filepath='./Include/sysmodule.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetObject'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyUnstable_PerfMapState_Fini' mangled-name='PyUnstable_PerfMapState_Fini' filepath='./Include/sysmodule.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Fini'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTraceMalloc_Start' mangled-name='_PyTraceMalloc_Start' filepath='./Include/tracemalloc.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_Start'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='nl_langinfo' filepath='/usr/include/langinfo.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1489'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='sigemptyset' filepath='/usr/include/signal.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-45'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sigaction' filepath='/usr/include/signal.h' line='243' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-1497'/> - <parameter type-id='type-id-1499'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='vfprintf' filepath='/usr/include/stdio.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-412'/> - <parameter type-id='type-id-181'/> - <parameter type-id='type-id-306'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='abort' filepath='/usr/include/stdlib.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='exit' filepath='/usr/include/stdlib.h' line='624' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='setenv' filepath='/usr/include/stdlib.h' line='660' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyRuntime_Finalize' mangled-name='_PyRuntime_Finalize' filepath='Python/pylifecycle.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRuntime_Finalize'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_IsFinalizing' mangled-name='_Py_IsFinalizing' filepath='Python/pylifecycle.c' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsFinalizing'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_IsCoreInitialized' mangled-name='_Py_IsCoreInitialized' filepath='Python/pylifecycle.c' line='144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsCoreInitialized'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyInterpreterState_SetConfig' mangled-name='_PyInterpreterState_SetConfig' filepath='Python/pylifecycle.c' line='414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetConfig'> - <parameter type-id='type-id-260' name='src_config' filepath='Python/pylifecycle.c' line='414' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_PreInitializeFromPyArgv' mangled-name='_Py_PreInitializeFromPyArgv' filepath='Python/pylifecycle.c' line='909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_PreInitializeFromPyArgv'> - <parameter type-id='type-id-1436' name='src_config' filepath='Python/pylifecycle.c' line='909' column='1'/> - <parameter type-id='type-id-1439' name='args' filepath='Python/pylifecycle.c' line='909' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_PreInitializeFromBytesArgs' mangled-name='Py_PreInitializeFromBytesArgs' filepath='Python/pylifecycle.c' line='956' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromBytesArgs'> - <parameter type-id='type-id-1436' name='src_config' filepath='Python/pylifecycle.c' line='956' column='1'/> - <parameter type-id='type-id-14' name='argc' filepath='Python/pylifecycle.c' line='956' column='1'/> - <parameter type-id='type-id-239' name='argv' filepath='Python/pylifecycle.c' line='956' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_PreInitializeFromArgs' mangled-name='Py_PreInitializeFromArgs' filepath='Python/pylifecycle.c' line='964' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromArgs'> - <parameter type-id='type-id-1436' name='src_config' filepath='Python/pylifecycle.c' line='964' column='1'/> - <parameter type-id='type-id-14' name='argc' filepath='Python/pylifecycle.c' line='964' column='1'/> - <parameter type-id='type-id-235' name='argv' filepath='Python/pylifecycle.c' line='964' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_PreInitialize' mangled-name='Py_PreInitialize' filepath='Python/pylifecycle.c' line='972' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitialize'> - <parameter type-id='type-id-1436' name='src_config' filepath='Python/pylifecycle.c' line='972' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_InitializeEx' mangled-name='Py_InitializeEx' filepath='Python/pylifecycle.c' line='1274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeEx'> - <parameter type-id='type-id-8' name='install_sigs' filepath='Python/pylifecycle.c' line='1274' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_Initialize' mangled-name='Py_Initialize' filepath='Python/pylifecycle.c' line='1302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Initialize'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_InitializeMain' mangled-name='_Py_InitializeMain' filepath='Python/pylifecycle.c' line='1309' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_InitializeMain'> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_Finalize' mangled-name='Py_Finalize' filepath='Python/pylifecycle.c' line='1984' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Finalize'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_NewInterpreterFromConfig' mangled-name='Py_NewInterpreterFromConfig' filepath='Python/pylifecycle.c' line='2111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreterFromConfig'> - <parameter type-id='type-id-1490' name='tstate_p' filepath='Python/pylifecycle.c' line='2111' column='1'/> - <parameter type-id='type-id-1492' name='config' filepath='Python/pylifecycle.c' line='2112' column='1'/> - <return type-id='type-id-54'/> - </function-decl> - <function-decl name='Py_NewInterpreter' mangled-name='Py_NewInterpreter' filepath='Python/pylifecycle.c' line='2118' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreter'> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='Py_EndInterpreter' mangled-name='Py_EndInterpreter' filepath='Python/pylifecycle.c' line='2142' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EndInterpreter'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pylifecycle.c' line='2142' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_DumpExtensionModules' mangled-name='_Py_DumpExtensionModules' filepath='Python/pylifecycle.c' line='2724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpExtensionModules'> - <parameter type-id='type-id-8' name='fd' filepath='Python/pylifecycle.c' line='2724' column='1'/> - <parameter type-id='type-id-20' name='interp' filepath='Python/pylifecycle.c' line='2724' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_FatalError' mangled-name='Py_FatalError' filepath='Python/pylifecycle.c' line='2897' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FatalError'> - <parameter type-id='type-id-12' name='msg' filepath='Python/pylifecycle.c' line='2897' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_FatalRefcountErrorFunc' mangled-name='_Py_FatalRefcountErrorFunc' filepath='Python/pylifecycle.c' line='2941' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalRefcountErrorFunc'> - <parameter type-id='type-id-12' name='func' filepath='Python/pylifecycle.c' line='2941' column='1'/> - <parameter type-id='type-id-12' name='msg' filepath='Python/pylifecycle.c' line='2941' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_AtExit' mangled-name='Py_AtExit' filepath='Python/pylifecycle.c' line='2991' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AtExit'> - <parameter type-id='type-id-227' name='func' filepath='Python/pylifecycle.c' line='2991' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_Exit' mangled-name='Py_Exit' filepath='Python/pylifecycle.c' line='3028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Exit'> - <parameter type-id='type-id-8' name='sts' filepath='Python/pylifecycle.c' line='3028' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='Py_FdIsInteractive' mangled-name='Py_FdIsInteractive' filepath='Python/pylifecycle.c' line='3045' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FdIsInteractive'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pylifecycle.c' line='3045' column='1'/> - <parameter type-id='type-id-12' name='filename' filepath='Python/pylifecycle.c' line='3045' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_FdIsInteractive' mangled-name='_Py_FdIsInteractive' filepath='Python/pylifecycle.c' line='3060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FdIsInteractive'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pylifecycle.c' line='3060' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/pylifecycle.c' line='3060' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyOS_getsig' mangled-name='PyOS_getsig' filepath='Python/pylifecycle.c' line='3077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_getsig'> - <parameter type-id='type-id-8' name='sig' filepath='Python/pylifecycle.c' line='3077' column='1'/> - <return type-id='type-id-1488'/> - </function-decl> - <function-decl name='PyOS_setsig' mangled-name='PyOS_setsig' filepath='Python/pylifecycle.c' line='3116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_setsig'> - <parameter type-id='type-id-8' name='sig' filepath='Python/pylifecycle.c' line='3116' column='1'/> - <parameter type-id='type-id-1488' name='handler' filepath='Python/pylifecycle.c' line='3116' column='1'/> - <return type-id='type-id-1488'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pystate.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <pointer-type-def type-id='type-id-823' size-in-bits='64' id='type-id-1500'/> - <pointer-type-def type-id='type-id-854' size-in-bits='64' id='type-id-1501'/> - <qualified-type-def type-id='type-id-19' const='yes' id='type-id-1502'/> - <function-decl name='_PyEval_InitState' filepath='./Include/internal/pycore_ceval.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-801'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_FiniState' filepath='./Include/internal/pycore_ceval.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1500'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyEval_AcquireLock' filepath='./Include/internal/pycore_ceval.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGC_InitState' filepath='./Include/internal/pycore_gc.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1501'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyImport_ClearCore' filepath='./Include/internal/pycore_import.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyType_InitCache' filepath='./Include/internal/pycore_object.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_InitState' filepath='./Include/internal/pycore_object.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_VirtualAlloc' filepath='./Include/internal/pycore_obmalloc.h' line='677' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-19'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='_PyObject_VirtualFree' filepath='./Include/internal/pycore_obmalloc.h' line='678' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyInterpreterState_FinalizeAllocatedBlocks' filepath='./Include/internal/pycore_obmalloc.h' line='686' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyGC_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyWarnings_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyAST_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyAtExit_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <return type-id='type-id-46'/> - </function-decl> - <var-decl name='_Py_tss_tstate' type-id='type-id-177' visibility='default' filepath='./Include/internal/pycore_pystate.h' line='67' column='1'/> - <function-decl name='PyThread_get_thread_native_id' mangled-name='PyThread_get_thread_native_id' filepath='./Include/pythread.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_thread_native_id'> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyThread_tss_create' mangled-name='PyThread_tss_create' filepath='./Include/pythread.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_create'> - <parameter type-id='type-id-409'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_tss_delete' mangled-name='PyThread_tss_delete' filepath='./Include/pythread.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_delete'> - <parameter type-id='type-id-409'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThreadState_GetCurrent' mangled-name='_PyThreadState_GetCurrent' filepath='Python/pystate.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetCurrent'> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyInterpreterState_Clear' mangled-name='PyInterpreterState_Clear' filepath='Python/pystate.c' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Clear'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='921' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyInterpreterState_RequiresIDRef' mangled-name='_PyInterpreterState_RequiresIDRef' filepath='Python/pystate.c' line='1117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequiresIDRef'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1117' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyInterpreterState_RequireIDRef' mangled-name='_PyInterpreterState_RequireIDRef' filepath='Python/pystate.c' line='1123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequireIDRef'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1123' column='1'/> - <parameter type-id='type-id-8' name='required' filepath='Python/pystate.c' line='1123' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyInterpreterState_GetMainModule' mangled-name='_PyInterpreterState_GetMainModule' filepath='Python/pystate.c' line='1129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetMainModule'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1129' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyInterpreterState_GetDict' mangled-name='PyInterpreterState_GetDict' filepath='Python/pystate.c' line='1140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_GetDict'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1140' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyThreadState_New' mangled-name='PyThreadState_New' filepath='Python/pystate.c' line='1382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_New'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1382' column='1'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='_PyThreadState_Prealloc' mangled-name='_PyThreadState_Prealloc' filepath='Python/pystate.c' line='1405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Prealloc'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='1405' column='1'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='_PyThreadState_Init' mangled-name='_PyThreadState_Init' filepath='Python/pystate.c' line='1413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Init'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pystate.c' line='1413' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThreadState_DeleteCurrent' mangled-name='_PyThreadState_DeleteCurrent' filepath='Python/pystate.c' line='1575' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_DeleteCurrent'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pystate.c' line='1575' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThreadState_DeleteCurrent' mangled-name='PyThreadState_DeleteCurrent' filepath='Python/pystate.c' line='1585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_DeleteCurrent'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyThreadState_GetDict' mangled-name='_PyThreadState_GetDict' filepath='Python/pystate.c' line='1647' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetDict'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pystate.c' line='1647' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyThreadState_GetInterpreter' mangled-name='PyThreadState_GetInterpreter' filepath='Python/pystate.c' line='1672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetInterpreter'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pystate.c' line='1672' column='1'/> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='PyThreadState_GetID' mangled-name='PyThreadState_GetID' filepath='Python/pystate.c' line='1696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetID'> - <parameter type-id='type-id-177' name='tstate' filepath='Python/pystate.c' line='1696' column='1'/> - <return type-id='type-id-117'/> - </function-decl> - <function-decl name='PyThreadState_SetAsyncExc' mangled-name='PyThreadState_SetAsyncExc' filepath='Python/pystate.c' line='1750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_SetAsyncExc'> - <parameter type-id='type-id-28' name='id' filepath='Python/pystate.c' line='1750' column='1'/> - <parameter type-id='type-id-2' name='exc' filepath='Python/pystate.c' line='1750' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyThreadState_Swap' mangled-name='_PyThreadState_Swap' filepath='Python/pystate.c' line='1847' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Swap'> - <parameter type-id='type-id-178' name='runtime' filepath='Python/pystate.c' line='1847' column='1'/> - <parameter type-id='type-id-177' name='newts' filepath='Python/pystate.c' line='1847' column='1'/> - <return type-id='type-id-177'/> - </function-decl> - <function-decl name='PyInterpreterState_Main' mangled-name='PyInterpreterState_Main' filepath='Python/pystate.c' line='1893' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Main'> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='_PyThread_CurrentFrames' mangled-name='_PyThread_CurrentFrames' filepath='Python/pystate.c' line='1924' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_CurrentFrames'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyThread_CurrentExceptions' mangled-name='_PyThread_CurrentExceptions' filepath='Python/pystate.c' line='1985' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_CurrentExceptions'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyGILState_GetInterpreterStateUnsafe' mangled-name='_PyGILState_GetInterpreterStateUnsafe' filepath='Python/pystate.c' line='2103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGILState_GetInterpreterStateUnsafe'> - <return type-id='type-id-20'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_Init' mangled-name='_PyCrossInterpreterData_Init' filepath='Python/pystate.c' line='2266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Init'> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2266' column='1'/> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='2267' column='1'/> - <parameter type-id='type-id-22' name='shared' filepath='Python/pystate.c' line='2268' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Python/pystate.c' line='2268' column='1'/> - <parameter type-id='type-id-784' name='new_object' filepath='Python/pystate.c' line='2269' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_InitWithSize' mangled-name='_PyCrossInterpreterData_InitWithSize' filepath='Python/pystate.c' line='2288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_InitWithSize'> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2288' column='1'/> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='2289' column='1'/> - <parameter type-id='type-id-1502' name='size' filepath='Python/pystate.c' line='2290' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Python/pystate.c' line='2290' column='1'/> - <parameter type-id='type-id-784' name='new_object' filepath='Python/pystate.c' line='2291' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_Clear' mangled-name='_PyCrossInterpreterData_Clear' filepath='Python/pystate.c' line='2307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Clear'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='2307' column='1'/> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2308' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyObject_CheckCrossInterpreterData' mangled-name='_PyObject_CheckCrossInterpreterData' filepath='Python/pystate.c' line='2353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CheckCrossInterpreterData'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pystate.c' line='2353' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyObject_GetCrossInterpreterData' mangled-name='_PyObject_GetCrossInterpreterData' filepath='Python/pystate.c' line='2363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetCrossInterpreterData'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pystate.c' line='2363' column='1'/> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2363' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_NewObject' mangled-name='_PyCrossInterpreterData_NewObject' filepath='Python/pystate.c' line='2401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_NewObject'> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2401' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_Release' mangled-name='_PyCrossInterpreterData_Release' filepath='Python/pystate.c' line='2435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Release'> - <parameter type-id='type-id-1059' name='data' filepath='Python/pystate.c' line='2435' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_RegisterClass' mangled-name='_PyCrossInterpreterData_RegisterClass' filepath='Python/pystate.c' line='2536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_RegisterClass'> - <parameter type-id='type-id-1' name='cls' filepath='Python/pystate.c' line='2536' column='1'/> - <parameter type-id='type-id-787' name='getdata' filepath='Python/pystate.c' line='2537' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_UnregisterClass' mangled-name='_PyCrossInterpreterData_UnregisterClass' filepath='Python/pystate.c' line='2559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_UnregisterClass'> - <parameter type-id='type-id-1' name='cls' filepath='Python/pystate.c' line='2559' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyCrossInterpreterData_Lookup' mangled-name='_PyCrossInterpreterData_Lookup' filepath='Python/pystate.c' line='2579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Lookup'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pystate.c' line='2579' column='1'/> - <return type-id='type-id-787'/> - </function-decl> - <function-decl name='_PyInterpreterState_GetEvalFrameFunc' mangled-name='_PyInterpreterState_GetEvalFrameFunc' filepath='Python/pystate.c' line='2728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetEvalFrameFunc'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='2728' column='1'/> - <return type-id='type-id-780'/> - </function-decl> - <function-decl name='_PyInterpreterState_SetEvalFrameFunc' mangled-name='_PyInterpreterState_SetEvalFrameFunc' filepath='Python/pystate.c' line='2738' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetEvalFrameFunc'> - <parameter type-id='type-id-20' name='interp' filepath='Python/pystate.c' line='2738' column='1'/> - <parameter type-id='type-id-780' name='eval_frame' filepath='Python/pystate.c' line='2739' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyInterpreterState_GetConfigCopy' mangled-name='_PyInterpreterState_GetConfigCopy' filepath='Python/pystate.c' line='2758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetConfigCopy'> - <parameter type-id='type-id-53' name='config' filepath='Python/pystate.c' line='2758' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pystrcmp.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyOS_mystricmp' mangled-name='PyOS_mystricmp' filepath='Python/pystrcmp.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_mystricmp'> - <parameter type-id='type-id-12' name='s1' filepath='Python/pystrcmp.c' line='22' column='1'/> - <parameter type-id='type-id-12' name='s2' filepath='Python/pystrcmp.c' line='22' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pystrhex.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_Py_strhex' mangled-name='_Py_strhex' filepath='Python/pystrhex.c' line='148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex'> - <parameter type-id='type-id-12' name='argbuf' filepath='Python/pystrhex.c' line='148' column='1'/> - <parameter type-id='type-id-246' name='arglen' filepath='Python/pystrhex.c' line='148' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_strhex_bytes' mangled-name='_Py_strhex_bytes' filepath='Python/pystrhex.c' line='155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex_bytes'> - <parameter type-id='type-id-12' name='argbuf' filepath='Python/pystrhex.c' line='155' column='1'/> - <parameter type-id='type-id-246' name='arglen' filepath='Python/pystrhex.c' line='155' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_strhex_bytes_with_sep' mangled-name='_Py_strhex_bytes_with_sep' filepath='Python/pystrhex.c' line='170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex_bytes_with_sep'> - <parameter type-id='type-id-12' name='argbuf' filepath='Python/pystrhex.c' line='170' column='1'/> - <parameter type-id='type-id-246' name='arglen' filepath='Python/pystrhex.c' line='170' column='1'/> - <parameter type-id='type-id-2' name='sep' filepath='Python/pystrhex.c' line='171' column='1'/> - <parameter type-id='type-id-261' name='bytes_per_group' filepath='Python/pystrhex.c' line='171' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pythonrun.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='PyAST_mod2obj' filepath='./Include/internal/pycore_ast.h' line='905' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-468'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyImport_GetImportlibExternalLoader' filepath='./Include/internal/pycore_import.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-12'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyParser_ASTFromString' filepath='./Include/internal/pycore_parser.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-467'/> - </function-decl> - <function-decl name='_PyParser_ASTFromFile' filepath='./Include/internal/pycore_parser.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-208'/> - <parameter type-id='type-id-179'/> - <parameter type-id='type-id-563'/> - <return type-id='type-id-467'/> - </function-decl> - <function-decl name='_Py_Offer_Suggestions' filepath='./Include/internal/pycore_pyerrors.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTraceBack_Print_Indented' mangled-name='_PyTraceBack_Print_Indented' filepath='./Include/internal/pycore_traceback.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceBack_Print_Indented'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_WriteIndentedMargin' mangled-name='_Py_WriteIndentedMargin' filepath='./Include/internal/pycore_traceback.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_WriteIndentedMargin'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-12'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_WriteIndent' mangled-name='_Py_WriteIndent' filepath='./Include/internal/pycore_traceback.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_WriteIndent'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='rewind' filepath='/usr/include/stdio.h' line='723' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-229'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyRun_AnyFileObject' mangled-name='_PyRun_AnyFileObject' filepath='Python/pythonrun.c' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRun_AnyFileObject'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='57' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/pythonrun.c' line='57' column='1'/> - <parameter type-id='type-id-8' name='closeit' filepath='Python/pythonrun.c' line='57' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='58' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyRun_InteractiveLoopObject' mangled-name='_PyRun_InteractiveLoopObject' filepath='Python/pythonrun.c' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRun_InteractiveLoopObject'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='111' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/pythonrun.c' line='111' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='111' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_InteractiveLoopFlags' mangled-name='PyRun_InteractiveLoopFlags' filepath='Python/pythonrun.c' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoopFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='167' column='1'/> - <parameter type-id='type-id-12' name='filename' filepath='Python/pythonrun.c' line='167' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='167' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_InteractiveOneObject' mangled-name='PyRun_InteractiveOneObject' filepath='Python/pythonrun.c' line='271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneObject'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='271' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/pythonrun.c' line='271' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='271' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_InteractiveOneFlags' mangled-name='PyRun_InteractiveOneFlags' filepath='Python/pythonrun.c' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='284' column='1'/> - <parameter type-id='type-id-12' name='filename_str' filepath='Python/pythonrun.c' line='284' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='284' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyRun_SimpleFileObject' mangled-name='_PyRun_SimpleFileObject' filepath='Python/pythonrun.c' line='376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRun_SimpleFileObject'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='376' column='1'/> - <parameter type-id='type-id-2' name='filename' filepath='Python/pythonrun.c' line='376' column='1'/> - <parameter type-id='type-id-8' name='closeit' filepath='Python/pythonrun.c' line='376' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='377' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_SimpleFileExFlags' mangled-name='PyRun_SimpleFileExFlags' filepath='Python/pythonrun.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileExFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='459' column='1'/> - <parameter type-id='type-id-12' name='filename' filepath='Python/pythonrun.c' line='459' column='1'/> - <parameter type-id='type-id-8' name='closeit' filepath='Python/pythonrun.c' line='459' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='460' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_SimpleStringFlags' mangled-name='PyRun_SimpleStringFlags' filepath='Python/pythonrun.c' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleStringFlags'> - <parameter type-id='type-id-12' name='command' filepath='Python/pythonrun.c' line='473' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='473' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_Py_HandleSystemExit' mangled-name='_Py_HandleSystemExit' filepath='Python/pythonrun.c' line='688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HandleSystemExit'> - <parameter type-id='type-id-179' name='exitcode_p' filepath='Python/pythonrun.c' line='688' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyErr_Display' mangled-name='_PyErr_Display' filepath='Python/pythonrun.c' line='1496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Display'> - <parameter type-id='type-id-2' name='file' filepath='Python/pythonrun.c' line='1496' column='1'/> - <parameter type-id='type-id-2' name='unused' filepath='Python/pythonrun.c' line='1496' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/pythonrun.c' line='1496' column='1'/> - <parameter type-id='type-id-2' name='tb' filepath='Python/pythonrun.c' line='1496' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyErr_Display' mangled-name='PyErr_Display' filepath='Python/pythonrun.c' line='1545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Display'> - <parameter type-id='type-id-2' name='unused' filepath='Python/pythonrun.c' line='1545' column='1'/> - <parameter type-id='type-id-2' name='value' filepath='Python/pythonrun.c' line='1545' column='1'/> - <parameter type-id='type-id-2' name='tb' filepath='Python/pythonrun.c' line='1545' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyErr_DisplayException' mangled-name='_PyErr_DisplayException' filepath='Python/pythonrun.c' line='1562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_DisplayException'> - <parameter type-id='type-id-2' name='file' filepath='Python/pythonrun.c' line='1562' column='1'/> - <parameter type-id='type-id-2' name='exc' filepath='Python/pythonrun.c' line='1562' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyRun_FileExFlags' mangled-name='PyRun_FileExFlags' filepath='Python/pythonrun.c' line='1626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileExFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1626' column='1'/> - <parameter type-id='type-id-12' name='filename' filepath='Python/pythonrun.c' line='1626' column='1'/> - <parameter type-id='type-id-8' name='start' filepath='Python/pythonrun.c' line='1626' column='1'/> - <parameter type-id='type-id-2' name='globals' filepath='Python/pythonrun.c' line='1626' column='1'/> - <parameter type-id='type-id-2' name='locals' filepath='Python/pythonrun.c' line='1627' column='1'/> - <parameter type-id='type-id-8' name='closeit' filepath='Python/pythonrun.c' line='1627' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='1627' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_CompileStringExFlags' mangled-name='Py_CompileStringExFlags' filepath='Python/pythonrun.c' line='1788' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringExFlags'> - <parameter type-id='type-id-12' name='str' filepath='Python/pythonrun.c' line='1788' column='1'/> - <parameter type-id='type-id-12' name='filename_str' filepath='Python/pythonrun.c' line='1788' column='1'/> - <parameter type-id='type-id-8' name='start' filepath='Python/pythonrun.c' line='1788' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='1789' column='1'/> - <parameter type-id='type-id-8' name='optimize' filepath='Python/pythonrun.c' line='1789' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_AnyFile' mangled-name='PyRun_AnyFile' filepath='Python/pythonrun.c' line='1890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFile'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1890' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/pythonrun.c' line='1890' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_AnyFileEx' mangled-name='PyRun_AnyFileEx' filepath='Python/pythonrun.c' line='1897' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileEx'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1897' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/pythonrun.c' line='1897' column='1'/> - <parameter type-id='type-id-8' name='closeit' filepath='Python/pythonrun.c' line='1897' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_AnyFileFlags' mangled-name='PyRun_AnyFileFlags' filepath='Python/pythonrun.c' line='1904' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1904' column='1'/> - <parameter type-id='type-id-12' name='name' filepath='Python/pythonrun.c' line='1904' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='1904' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_File' mangled-name='PyRun_File' filepath='Python/pythonrun.c' line='1911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_File'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1911' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1911' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1911' column='1'/> - <parameter type-id='type-id-2' name='g' filepath='Python/pythonrun.c' line='1911' column='1'/> - <parameter type-id='type-id-2' name='l' filepath='Python/pythonrun.c' line='1911' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_FileEx' mangled-name='PyRun_FileEx' filepath='Python/pythonrun.c' line='1918' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileEx'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1918' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1918' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1918' column='1'/> - <parameter type-id='type-id-2' name='g' filepath='Python/pythonrun.c' line='1918' column='1'/> - <parameter type-id='type-id-2' name='l' filepath='Python/pythonrun.c' line='1918' column='1'/> - <parameter type-id='type-id-8' name='c' filepath='Python/pythonrun.c' line='1918' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_FileFlags' mangled-name='PyRun_FileFlags' filepath='Python/pythonrun.c' line='1925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileFlags'> - <parameter type-id='type-id-229' name='fp' filepath='Python/pythonrun.c' line='1925' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1925' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1925' column='1'/> - <parameter type-id='type-id-2' name='g' filepath='Python/pythonrun.c' line='1925' column='1'/> - <parameter type-id='type-id-2' name='l' filepath='Python/pythonrun.c' line='1925' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='1926' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_SimpleFile' mangled-name='PyRun_SimpleFile' filepath='Python/pythonrun.c' line='1933' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFile'> - <parameter type-id='type-id-229' name='f' filepath='Python/pythonrun.c' line='1933' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1933' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_SimpleFileEx' mangled-name='PyRun_SimpleFileEx' filepath='Python/pythonrun.c' line='1940' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileEx'> - <parameter type-id='type-id-229' name='f' filepath='Python/pythonrun.c' line='1940' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1940' column='1'/> - <parameter type-id='type-id-8' name='c' filepath='Python/pythonrun.c' line='1940' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_String' mangled-name='PyRun_String' filepath='Python/pythonrun.c' line='1948' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_String'> - <parameter type-id='type-id-12' name='str' filepath='Python/pythonrun.c' line='1948' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1948' column='1'/> - <parameter type-id='type-id-2' name='g' filepath='Python/pythonrun.c' line='1948' column='1'/> - <parameter type-id='type-id-2' name='l' filepath='Python/pythonrun.c' line='1948' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_SimpleString' mangled-name='PyRun_SimpleString' filepath='Python/pythonrun.c' line='1955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleString'> - <parameter type-id='type-id-12' name='s' filepath='Python/pythonrun.c' line='1955' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='Py_CompileString' mangled-name='Py_CompileString' filepath='Python/pythonrun.c' line='1962' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileString'> - <parameter type-id='type-id-12' name='str' filepath='Python/pythonrun.c' line='1962' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1962' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1962' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='Py_CompileStringFlags' mangled-name='Py_CompileStringFlags' filepath='Python/pythonrun.c' line='1969' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringFlags'> - <parameter type-id='type-id-12' name='str' filepath='Python/pythonrun.c' line='1969' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1969' column='1'/> - <parameter type-id='type-id-8' name='s' filepath='Python/pythonrun.c' line='1969' column='1'/> - <parameter type-id='type-id-208' name='flags' filepath='Python/pythonrun.c' line='1970' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='PyRun_InteractiveOne' mangled-name='PyRun_InteractiveOne' filepath='Python/pythonrun.c' line='1977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOne'> - <parameter type-id='type-id-229' name='f' filepath='Python/pythonrun.c' line='1977' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1977' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyRun_InteractiveLoop' mangled-name='PyRun_InteractiveLoop' filepath='Python/pythonrun.c' line='1984' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoop'> - <parameter type-id='type-id-229' name='f' filepath='Python/pythonrun.c' line='1984' column='1'/> - <parameter type-id='type-id-12' name='p' filepath='Python/pythonrun.c' line='1984' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/pytime.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <class-decl name='_Py_clock_info_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1503' visibility='default' filepath='./Include/cpython/pytime.h' line='240' column='1' id='type-id-1504'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='implementation' type-id='type-id-12' visibility='default' filepath='./Include/cpython/pytime.h' line='241' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='monotonic' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pytime.h' line='242' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='adjustable' type-id='type-id-8' visibility='default' filepath='./Include/cpython/pytime.h' line='243' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='resolution' type-id='type-id-251' visibility='default' filepath='./Include/cpython/pytime.h' line='244' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='_Py_clock_info_t' type-id='type-id-1504' filepath='./Include/cpython/pytime.h' line='245' column='1' id='type-id-1503'/> - <typedef-decl name='__suseconds_t' type-id='type-id-47' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='162' column='1' id='type-id-1505'/> - <typedef-decl name='__clockid_t' type-id='type-id-8' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='169' column='1' id='type-id-212'/> - <typedef-decl name='clockid_t' type-id='type-id-212' filepath='/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h' line='7' column='1' id='type-id-221'/> - <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='8' column='1' id='type-id-101'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tv_sec' type-id='type-id-1343' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tv_usec' type-id='type-id-1505' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='15' column='1'/> - </data-member> - </class-decl> - <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='7' column='1' id='type-id-214'> - <data-member access='public' layout-offset-in-bits='0'> - <var-decl name='tm_sec' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='9' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='32'> - <var-decl name='tm_min' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='10' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='64'> - <var-decl name='tm_hour' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='11' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='96'> - <var-decl name='tm_mday' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='12' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='128'> - <var-decl name='tm_mon' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='13' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='160'> - <var-decl name='tm_year' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='14' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='192'> - <var-decl name='tm_wday' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='15' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='224'> - <var-decl name='tm_yday' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='16' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='256'> - <var-decl name='tm_isdst' type-id='type-id-8' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='17' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='320'> - <var-decl name='tm_gmtoff' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='20' column='1'/> - </data-member> - <data-member access='public' layout-offset-in-bits='384'> - <var-decl name='tm_zone' type-id='type-id-12' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='21' column='1'/> - </data-member> - </class-decl> - <typedef-decl name='time_t' type-id='type-id-1343' filepath='/usr/include/x86_64-linux-gnu/bits/types/time_t.h' line='10' column='1' id='type-id-219'/> - <pointer-type-def type-id='type-id-790' size-in-bits='64' id='type-id-1506'/> - <pointer-type-def type-id='type-id-1503' size-in-bits='64' id='type-id-1507'/> - <qualified-type-def type-id='type-id-219' const='yes' id='type-id-1508'/> - <pointer-type-def type-id='type-id-1508' size-in-bits='64' id='type-id-1509'/> - <qualified-type-def type-id='type-id-1509' restrict='yes' id='type-id-1510'/> - <pointer-type-def type-id='type-id-47' size-in-bits='64' id='type-id-1511'/> - <pointer-type-def type-id='type-id-219' size-in-bits='64' id='type-id-218'/> - <pointer-type-def type-id='type-id-101' size-in-bits='64' id='type-id-1512'/> - <pointer-type-def type-id='type-id-214' size-in-bits='64' id='type-id-220'/> - <qualified-type-def type-id='type-id-220' restrict='yes' id='type-id-1513'/> - <function-decl name='gmtime_r' filepath='/usr/include/time.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1510'/> - <parameter type-id='type-id-1513'/> - <return type-id='type-id-220'/> - </function-decl> - <function-decl name='localtime_r' filepath='/usr/include/time.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1510'/> - <parameter type-id='type-id-1513'/> - <return type-id='type-id-220'/> - </function-decl> - <function-decl name='clock_getres' filepath='/usr/include/time.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-221'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='clock_gettime' filepath='/usr/include/time.h' line='279' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-221'/> - <parameter type-id='type-id-180'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_Add' mangled-name='_PyTime_Add' filepath='Python/pytime.c' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_Add'> - <parameter type-id='type-id-790' name='t1' filepath='Python/pytime.c' line='104' column='1'/> - <parameter type-id='type-id-790' name='t2' filepath='Python/pytime.c' line='104' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_MulDiv' mangled-name='_PyTime_MulDiv' filepath='Python/pytime.c' line='152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_MulDiv'> - <parameter type-id='type-id-790' name='ticks' filepath='Python/pytime.c' line='152' column='1'/> - <parameter type-id='type-id-790' name='mul' filepath='Python/pytime.c' line='152' column='1'/> - <parameter type-id='type-id-790' name='div' filepath='Python/pytime.c' line='152' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyLong_AsTime_t' mangled-name='_PyLong_AsTime_t' filepath='Python/pytime.c' line='169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsTime_t'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='169' column='1'/> - <return type-id='type-id-219'/> - </function-decl> - <function-decl name='_PyLong_FromTime_t' mangled-name='_PyLong_FromTime_t' filepath='Python/pytime.c' line='189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromTime_t'> - <parameter type-id='type-id-219' name='t' filepath='Python/pytime.c' line='189' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTime_ObjectToTime_t' mangled-name='_PyTime_ObjectToTime_t' filepath='Python/pytime.c' line='357' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTime_t'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='357' column='1'/> - <parameter type-id='type-id-218' name='sec' filepath='Python/pytime.c' line='357' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='357' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_ObjectToTimespec' mangled-name='_PyTime_ObjectToTimespec' filepath='Python/pytime.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimespec'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='392' column='1'/> - <parameter type-id='type-id-218' name='sec' filepath='Python/pytime.c' line='392' column='1'/> - <parameter type-id='type-id-1511' name='nsec' filepath='Python/pytime.c' line='392' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='393' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_ObjectToTimeval' mangled-name='_PyTime_ObjectToTimeval' filepath='Python/pytime.c' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimeval'> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='400' column='1'/> - <parameter type-id='type-id-218' name='sec' filepath='Python/pytime.c' line='400' column='1'/> - <parameter type-id='type-id-1511' name='usec' filepath='Python/pytime.c' line='400' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='401' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_FromSeconds' mangled-name='_PyTime_FromSeconds' filepath='Python/pytime.c' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromSeconds'> - <parameter type-id='type-id-8' name='seconds' filepath='Python/pytime.c' line='408' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_FromNanoseconds' mangled-name='_PyTime_FromNanoseconds' filepath='Python/pytime.c' line='425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromNanoseconds'> - <parameter type-id='type-id-790' name='ns' filepath='Python/pytime.c' line='425' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_FromMicrosecondsClamp' mangled-name='_PyTime_FromMicrosecondsClamp' filepath='Python/pytime.c' line='432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromMicrosecondsClamp'> - <parameter type-id='type-id-790' name='us' filepath='Python/pytime.c' line='432' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_FromNanosecondsObject' mangled-name='_PyTime_FromNanosecondsObject' filepath='Python/pytime.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromNanosecondsObject'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='440' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='440' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_FromTimespec' mangled-name='_PyTime_FromTimespec' filepath='Python/pytime.c' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromTimespec'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='490' column='1'/> - <parameter type-id='type-id-180' name='ts' filepath='Python/pytime.c' line='490' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_FromTimeval' mangled-name='_PyTime_FromTimeval' filepath='Python/pytime.c' line='521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromTimeval'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='521' column='1'/> - <parameter type-id='type-id-1512' name='tv' filepath='Python/pytime.c' line='521' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_FromSecondsObject' mangled-name='_PyTime_FromSecondsObject' filepath='Python/pytime.c' line='589' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromSecondsObject'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='589' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='589' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='589' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_FromMillisecondsObject' mangled-name='_PyTime_FromMillisecondsObject' filepath='Python/pytime.c' line='596' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromMillisecondsObject'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='596' column='1'/> - <parameter type-id='type-id-2' name='obj' filepath='Python/pytime.c' line='596' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='596' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_AsSecondsDouble' mangled-name='_PyTime_AsSecondsDouble' filepath='Python/pytime.c' line='603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsSecondsDouble'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='603' column='1'/> - <return type-id='type-id-251'/> - </function-decl> - <function-decl name='_PyTime_AsNanosecondsObject' mangled-name='_PyTime_AsNanosecondsObject' filepath='Python/pytime.c' line='624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsNanosecondsObject'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='624' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTime_AsNanoseconds' mangled-name='_PyTime_AsNanoseconds' filepath='Python/pytime.c' line='729' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsNanoseconds'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='729' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_AsMilliseconds' mangled-name='_PyTime_AsMilliseconds' filepath='Python/pytime.c' line='754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMilliseconds'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='754' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='754' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_AsTimeval' mangled-name='_PyTime_AsTimeval' filepath='Python/pytime.c' line='804' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='804' column='1'/> - <parameter type-id='type-id-1512' name='tv' filepath='Python/pytime.c' line='804' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='804' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_AsTimeval_clamp' mangled-name='_PyTime_AsTimeval_clamp' filepath='Python/pytime.c' line='811' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval_clamp'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='811' column='1'/> - <parameter type-id='type-id-1512' name='tv' filepath='Python/pytime.c' line='811' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='811' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTime_AsTimevalTime_t' mangled-name='_PyTime_AsTimevalTime_t' filepath='Python/pytime.c' line='818' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimevalTime_t'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='818' column='1'/> - <parameter type-id='type-id-218' name='p_secs' filepath='Python/pytime.c' line='818' column='1'/> - <parameter type-id='type-id-179' name='us' filepath='Python/pytime.c' line='818' column='1'/> - <parameter type-id='type-id-1425' name='round' filepath='Python/pytime.c' line='819' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_AsTimespec_clamp' mangled-name='_PyTime_AsTimespec_clamp' filepath='Python/pytime.c' line='857' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec_clamp'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='857' column='1'/> - <parameter type-id='type-id-180' name='ts' filepath='Python/pytime.c' line='857' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTime_AsTimespec' mangled-name='_PyTime_AsTimespec' filepath='Python/pytime.c' line='863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec'> - <parameter type-id='type-id-790' name='t' filepath='Python/pytime.c' line='863' column='1'/> - <parameter type-id='type-id-180' name='ts' filepath='Python/pytime.c' line='863' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_GetSystemClock' mangled-name='_PyTime_GetSystemClock' filepath='Python/pytime.c' line='982' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetSystemClock'> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_GetSystemClockWithInfo' mangled-name='_PyTime_GetSystemClockWithInfo' filepath='Python/pytime.c' line='995' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetSystemClockWithInfo'> - <parameter type-id='type-id-1506' name='t' filepath='Python/pytime.c' line='995' column='1'/> - <parameter type-id='type-id-1507' name='info' filepath='Python/pytime.c' line='995' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_GetMonotonicClock' mangled-name='_PyTime_GetMonotonicClock' filepath='Python/pytime.c' line='1179' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetMonotonicClock'> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyTime_GetMonotonicClockWithInfo' mangled-name='_PyTime_GetMonotonicClockWithInfo' filepath='Python/pytime.c' line='1192' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetMonotonicClockWithInfo'> - <parameter type-id='type-id-1506' name='tp' filepath='Python/pytime.c' line='1192' column='1'/> - <parameter type-id='type-id-1507' name='info' filepath='Python/pytime.c' line='1192' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_GetPerfCounterWithInfo' mangled-name='_PyTime_GetPerfCounterWithInfo' filepath='Python/pytime.c' line='1273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_GetPerfCounterWithInfo'> - <parameter type-id='type-id-1506' name='t' filepath='Python/pytime.c' line='1273' column='1'/> - <parameter type-id='type-id-1507' name='info' filepath='Python/pytime.c' line='1273' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_localtime' mangled-name='_PyTime_localtime' filepath='Python/pytime.c' line='1303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_localtime'> - <parameter type-id='type-id-219' name='t' filepath='Python/pytime.c' line='1303' column='1'/> - <parameter type-id='type-id-220' name='tm' filepath='Python/pytime.c' line='1303' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTime_gmtime' mangled-name='_PyTime_gmtime' filepath='Python/pytime.c' line='1342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_gmtime'> - <parameter type-id='type-id-219' name='t' filepath='Python/pytime.c' line='1342' column='1'/> - <parameter type-id='type-id-220' name='tm' filepath='Python/pytime.c' line='1342' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyDeadline_Init' mangled-name='_PyDeadline_Init' filepath='Python/pytime.c' line='1370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Init'> - <parameter type-id='type-id-790' name='timeout' filepath='Python/pytime.c' line='1370' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - <function-decl name='_PyDeadline_Get' mangled-name='_PyDeadline_Get' filepath='Python/pytime.c' line='1378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Get'> - <parameter type-id='type-id-790' name='deadline' filepath='Python/pytime.c' line='1378' column='1'/> - <return type-id='type-id-790'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/specialize.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyDictKeys_GetVersionForCurrentState' filepath='./Include/internal/pycore_dict.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-20'/> - <parameter type-id='type-id-346'/> - <return type-id='type-id-352'/> - </function-decl> - <function-decl name='_PyDict_LookupIndex' filepath='./Include/internal/pycore_dict.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-340'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyDictKeys_StringLookup' filepath='./Include/internal/pycore_dict.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-346'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-14'/> - </function-decl> - <function-decl name='_PyFunction_GetVersionForCurrentState' filepath='./Include/internal/pycore_function.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-310'/> - <return type-id='type-id-352'/> - </function-decl> - <function-decl name='_Py_slot_tp_getattro' filepath='./Include/internal/pycore_typeobject.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_slot_tp_getattr_hook' filepath='./Include/internal/pycore_typeobject.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-2'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/suggestions.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyCode_GetVarnames' filepath='./Include/internal/pycore_code.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-328'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_Py_UTF8_Edit_Cost' mangled-name='_Py_UTF8_Edit_Cost' filepath='Python/suggestions.c' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_UTF8_Edit_Cost'> - <parameter type-id='type-id-2' name='a' filepath='Python/suggestions.c' line='404' column='1'/> - <parameter type-id='type-id-2' name='b' filepath='Python/suggestions.c' line='404' column='1'/> - <parameter type-id='type-id-14' name='max_cost' filepath='Python/suggestions.c' line='404' column='1'/> - <return type-id='type-id-14'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/symtable.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <var-decl name='PySTEntry_Type' type-id='type-id-256' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='92' column='1'/> - </abi-instr> - <abi-instr address-size='64' path='Python/thread.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='256' id='type-id-1514'> - <subrange length='32' type-id='type-id-28' id='type-id-60'/> - </array-type-def> - <array-type-def dimensions='1' type-id='type-id-48' size-in-bits='448' id='type-id-1515'> - <subrange length='56' type-id='type-id-28' id='type-id-1516'/> - </array-type-def> - <enum-decl name='PyLockStatus' filepath='./Include/pythread.h' line='12' column='1' id='type-id-1517'> - <underlying-type type-id='type-id-24'/> - <enumerator name='PY_LOCK_FAILURE' value='0'/> - <enumerator name='PY_LOCK_ACQUIRED' value='1'/> - <enumerator name='PY_LOCK_INTR' value='2'/> - </enum-decl> - <typedef-decl name='PyLockStatus' type-id='type-id-1517' filepath='./Include/pythread.h' line='16' column='1' id='type-id-1518'/> - <typedef-decl name='pthread_t' type-id='type-id-28' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-207'/> - <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-1519'> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-1515' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='pthread_attr_t' type-id='type-id-1519' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-1520'/> - <union-decl name='sem_t' size-in-bits='256' naming-typedef-id='type-id-1521' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='35' column='1' id='type-id-1522'> - <data-member access='public'> - <var-decl name='__size' type-id='type-id-1514' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='37' column='1'/> - </data-member> - <data-member access='public'> - <var-decl name='__align' type-id='type-id-47' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='38' column='1'/> - </data-member> - </union-decl> - <typedef-decl name='sem_t' type-id='type-id-1522' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='39' column='1' id='type-id-1521'/> - <qualified-type-def type-id='type-id-1520' const='yes' id='type-id-1523'/> - <pointer-type-def type-id='type-id-1523' size-in-bits='64' id='type-id-1524'/> - <qualified-type-def type-id='type-id-1524' restrict='yes' id='type-id-1525'/> - <qualified-type-def type-id='type-id-976' const='yes' id='type-id-1526'/> - <pointer-type-def type-id='type-id-1526' size-in-bits='64' id='type-id-1527'/> - <qualified-type-def type-id='type-id-1527' restrict='yes' id='type-id-1528'/> - <pointer-type-def type-id='type-id-1520' size-in-bits='64' id='type-id-1529'/> - <pointer-type-def type-id='type-id-789' size-in-bits='64' id='type-id-1530'/> - <pointer-type-def type-id='type-id-207' size-in-bits='64' id='type-id-1531'/> - <qualified-type-def type-id='type-id-1531' restrict='yes' id='type-id-1532'/> - <pointer-type-def type-id='type-id-1521' size-in-bits='64' id='type-id-1533'/> - <qualified-type-def type-id='type-id-1533' restrict='yes' id='type-id-1534'/> - <pointer-type-def type-id='type-id-1535' size-in-bits='64' id='type-id-1536'/> - <function-decl name='pthread_create' filepath='/usr/include/pthread.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1532'/> - <parameter type-id='type-id-1525'/> - <parameter type-id='type-id-1536'/> - <parameter type-id='type-id-226'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_exit' filepath='/usr/include/pthread.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='pthread_detach' filepath='/usr/include/pthread.h' line='269' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-207'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_self' filepath='/usr/include/pthread.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> - <return type-id='type-id-207'/> - </function-decl> - <function-decl name='pthread_attr_init' filepath='/usr/include/pthread.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1529'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_attr_destroy' filepath='/usr/include/pthread.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1529'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_attr_setscope' filepath='/usr/include/pthread.h' line='349' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1529'/> - <parameter type-id='type-id-8'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_attr_setstacksize' filepath='/usr/include/pthread.h' line='373' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1529'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_cond_init' filepath='/usr/include/pthread.h' line='1112' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1350'/> - <parameter type-id='type-id-1528'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_condattr_init' filepath='/usr/include/pthread.h' line='1194' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-975'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_condattr_setclock' filepath='/usr/include/pthread.h' line='1219' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-975'/> - <parameter type-id='type-id-212'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_key_create' filepath='/usr/include/pthread.h' line='1297' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1530'/> - <parameter type-id='type-id-760'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_key_delete' filepath='/usr/include/pthread.h' line='1302' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-789'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='pthread_getspecific' filepath='/usr/include/pthread.h' line='1305' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-789'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='pthread_setspecific' filepath='/usr/include/pthread.h' line='1308' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-789'/> - <parameter type-id='type-id-22'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_init' filepath='/usr/include/semaphore.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1533'/> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-95'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_destroy' filepath='/usr/include/semaphore.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1533'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_wait' filepath='/usr/include/semaphore.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1533'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_clockwait' filepath='/usr/include/semaphore.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1534'/> - <parameter type-id='type-id-221'/> - <parameter type-id='type-id-206'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_trywait' filepath='/usr/include/semaphore.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1533'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='sem_post' filepath='/usr/include/semaphore.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-1533'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='perror' filepath='/usr/include/stdio.h' line='804' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-12'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='confstr' filepath='/usr/include/unistd.h' line='644' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-15'/> - <parameter type-id='type-id-19'/> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='syscall' filepath='/usr/include/unistd.h' line='1091' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-47'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='__sysconf' filepath='/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <return type-id='type-id-47'/> - </function-decl> - <function-decl name='PyThread_get_stacksize' mangled-name='PyThread_get_stacksize' filepath='Python/thread.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_stacksize'> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='PyThread_set_stacksize' mangled-name='PyThread_set_stacksize' filepath='Python/thread.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_set_stacksize'> - <parameter type-id='type-id-19' name='size' filepath='Python/thread.c' line='65' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_tss_alloc' mangled-name='PyThread_tss_alloc' filepath='Python/thread.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_alloc'> - <return type-id='type-id-409'/> - </function-decl> - <function-decl name='PyThread_tss_free' mangled-name='PyThread_tss_free' filepath='Python/thread.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_free'> - <parameter type-id='type-id-409' name='key' filepath='Python/thread.c' line='92' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_start_new_thread' mangled-name='PyThread_start_new_thread' filepath='Python/thread_pthread.h' line='238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_start_new_thread'> - <parameter type-id='type-id-760' name='func' filepath='Python/thread_pthread.h' line='238' column='1'/> - <parameter type-id='type-id-22' name='arg' filepath='Python/thread_pthread.h' line='238' column='1'/> - <return type-id='type-id-28'/> - </function-decl> - <function-decl name='PyThread_acquire_lock_timed' mangled-name='PyThread_acquire_lock_timed' filepath='Python/thread_pthread.h' line='430' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock_timed'> - <parameter type-id='type-id-801' name='lock' filepath='Python/thread_pthread.h' line='430' column='1'/> - <parameter type-id='type-id-378' name='microseconds' filepath='Python/thread_pthread.h' line='430' column='1'/> - <parameter type-id='type-id-8' name='intr_flag' filepath='Python/thread_pthread.h' line='431' column='1'/> - <return type-id='type-id-1518'/> - </function-decl> - <function-decl name='PyThread_create_key' mangled-name='PyThread_create_key' filepath='Python/thread_pthread.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_create_key'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_delete_key' mangled-name='PyThread_delete_key' filepath='Python/thread_pthread.h' line='829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_delete_key'> - <parameter type-id='type-id-8' name='key' filepath='Python/thread_pthread.h' line='829' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_delete_key_value' mangled-name='PyThread_delete_key_value' filepath='Python/thread_pthread.h' line='837' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_delete_key_value'> - <parameter type-id='type-id-8' name='key' filepath='Python/thread_pthread.h' line='837' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyThread_set_key_value' mangled-name='PyThread_set_key_value' filepath='Python/thread_pthread.h' line='845' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_set_key_value'> - <parameter type-id='type-id-8' name='key' filepath='Python/thread_pthread.h' line='845' column='1'/> - <parameter type-id='type-id-22' name='value' filepath='Python/thread_pthread.h' line='845' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyThread_get_key_value' mangled-name='PyThread_get_key_value' filepath='Python/thread_pthread.h' line='856' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_key_value'> - <parameter type-id='type-id-8' name='key' filepath='Python/thread_pthread.h' line='856' column='1'/> - <return type-id='type-id-22'/> - </function-decl> - <function-decl name='PyThread_ReInitTLS' mangled-name='PyThread_ReInitTLS' filepath='Python/thread_pthread.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_ReInitTLS'> - <return type-id='type-id-46'/> - </function-decl> - <function-type size-in-bits='64' id='type-id-1535'> - <parameter type-id='type-id-22'/> - <return type-id='type-id-22'/> - </function-type> - </abi-instr> - <abi-instr address-size='64' path='Python/traceback.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyObject_CallMethodFormat' filepath='./Include/internal/pycore_call.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-177'/> - <parameter type-id='type-id-2'/> - <parameter type-id='type-id-12'/> - <parameter is-variadic='yes'/> - <return type-id='type-id-2'/> - </function-decl> - <var-decl name='PyTraceBack_Type' type-id='type-id-256' mangled-name='PyTraceBack_Type' visibility='default' filepath='./Include/traceback.h' line='13' column='1' elf-symbol-id='PyTraceBack_Type'/> - <function-decl name='_PyTokenizer_FindEncodingFilename' filepath='Python/traceback.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> - <parameter type-id='type-id-8'/> - <parameter type-id='type-id-2'/> - <return type-id='type-id-15'/> - </function-decl> - <function-decl name='_PyTraceback_Add' mangled-name='_PyTraceback_Add' filepath='Python/traceback.c' line='261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceback_Add'> - <parameter type-id='type-id-12' name='funcname' filepath='Python/traceback.c' line='261' column='1'/> - <parameter type-id='type-id-12' name='filename' filepath='Python/traceback.c' line='261' column='1'/> - <parameter type-id='type-id-8' name='lineno' filepath='Python/traceback.c' line='261' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_Py_DumpTraceback' mangled-name='_Py_DumpTraceback' filepath='Python/traceback.c' line='1251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DumpTraceback'> - <parameter type-id='type-id-8' name='fd' filepath='Python/traceback.c' line='1251' column='1'/> - <parameter type-id='type-id-177' name='tstate' filepath='Python/traceback.c' line='1251' column='1'/> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> - <abi-instr address-size='64' path='Python/tracemalloc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> - <function-decl name='_PyTraceMalloc_Init' mangled-name='_PyTraceMalloc_Init' filepath='Python/tracemalloc.c' line='799' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_Init'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTraceMalloc_Stop' mangled-name='_PyTraceMalloc_Stop' filepath='Python/tracemalloc.c' line='955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_Stop'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='PyTraceMalloc_Track' mangled-name='PyTraceMalloc_Track' filepath='Python/tracemalloc.c' line='1301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Track'> - <parameter type-id='type-id-95' name='domain' filepath='Python/tracemalloc.c' line='1301' column='1'/> - <parameter type-id='type-id-749' name='ptr' filepath='Python/tracemalloc.c' line='1301' column='1'/> - <parameter type-id='type-id-19' name='size' filepath='Python/tracemalloc.c' line='1302' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='PyTraceMalloc_Untrack' mangled-name='PyTraceMalloc_Untrack' filepath='Python/tracemalloc.c' line='1324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Untrack'> - <parameter type-id='type-id-95' name='domain' filepath='Python/tracemalloc.c' line='1324' column='1'/> - <parameter type-id='type-id-749' name='ptr' filepath='Python/tracemalloc.c' line='1324' column='1'/> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetTraceback' mangled-name='_PyTraceMalloc_GetTraceback' filepath='Python/tracemalloc.c' line='1386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTraceback'> - <parameter type-id='type-id-95' name='domain' filepath='Python/tracemalloc.c' line='1386' column='1'/> - <parameter type-id='type-id-749' name='ptr' filepath='Python/tracemalloc.c' line='1386' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTraceMalloc_IsTracing' mangled-name='_PyTraceMalloc_IsTracing' filepath='Python/tracemalloc.c' line='1398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_IsTracing'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTraceMalloc_ClearTraces' mangled-name='_PyTraceMalloc_ClearTraces' filepath='Python/tracemalloc.c' line='1404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_ClearTraces'> - <return type-id='type-id-46'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetTraces' mangled-name='_PyTraceMalloc_GetTraces' filepath='Python/tracemalloc.c' line='1416' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTraces'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetObjectTraceback' mangled-name='_PyTraceMalloc_GetObjectTraceback' filepath='Python/tracemalloc.c' line='1496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetObjectTraceback'> - <parameter type-id='type-id-2' name='obj' filepath='Python/tracemalloc.c' line='1496' column='1'/> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetTracebackLimit' mangled-name='_PyTraceMalloc_GetTracebackLimit' filepath='Python/tracemalloc.c' line='1514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTracebackLimit'> - <return type-id='type-id-8'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetMemory' mangled-name='_PyTraceMalloc_GetMemory' filepath='Python/tracemalloc.c' line='1519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetMemory'> - <return type-id='type-id-19'/> - </function-decl> - <function-decl name='_PyTraceMalloc_GetTracedMemory' mangled-name='_PyTraceMalloc_GetTracedMemory' filepath='Python/tracemalloc.c' line='1536' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTracedMemory'> - <return type-id='type-id-2'/> - </function-decl> - <function-decl name='_PyTraceMalloc_ResetPeak' mangled-name='_PyTraceMalloc_ResetPeak' filepath='Python/tracemalloc.c' line='1552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_ResetPeak'> - <return type-id='type-id-46'/> - </function-decl> - </abi-instr> -</abi-corpus> diff --git a/Doc/data/python3.13.abi b/Doc/data/python3.13.abi new file mode 100644 index 00000000..617006a6 --- /dev/null +++ b/Doc/data/python3.13.abi @@ -0,0 +1,29418 @@ +<abi-corpus version='2.0' path='libpython3.13.so' soname='libpython3.13.so.1.0'> + <elf-needed> + <dependency name='libm.so.6'/> + <dependency name='libc.so.6'/> + <dependency name='ld-linux-x86-64.so.2'/> + </elf-needed> + <elf-function-symbols> + <elf-symbol name='PyAIter_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_Parse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_ParseTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_ParseTupleAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_UnpackTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_VaParse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_VaParseTupleAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyArg_ValidateKeywordArguments' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyAsyncGen_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBool_FromLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_FillContiguousStrides' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_FillInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_FromContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_GetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_IsContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_SizeFromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBuffer_ToContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_AsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_AsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_AsStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_ConcatAndDel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_DecodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_FromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_FromFormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_Repr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_GetFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_GetFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_GetSelf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_NewEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCallIter_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCallable_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_GetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_GetDestructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_GetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_Import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_IsValid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_SetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_SetDestructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_SetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_SetPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCell_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCell_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCell_Set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyClassMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_Addr2Line' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_Addr2Location' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_GetCellvars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_GetFreevars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_GetVarnames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_NewEmpty' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_Optimize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_BackslashReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Decode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Decoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Encode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Encoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_IgnoreErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_IncrementalDecoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_IncrementalEncoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_KnownEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_LookupError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_NameReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_RegisterError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_ReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_StreamReader' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_StreamWriter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_StrictErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_Unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCodec_XMLCharRefReplaceErrors' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCompile_OpcodeStackEffect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCompile_OpcodeStackEffectWithJump' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_AsCComplex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_FromCComplex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_FromDoubles' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_ImagAsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_RealAsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_InitIsolatedConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_InitPythonConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_Read' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_SetArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_SetBytesArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_SetBytesString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyConfig_SetWideStringList' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextVar_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextVar_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextVar_Reset' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextVar_Set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_CopyCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_Enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCoro_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCriticalSection2_Begin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCriticalSection2_End' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCriticalSection_Begin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCriticalSection_End' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_IsData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_NewClassMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_NewGetSet' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_NewMember' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_NewMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDescr_NewWrapper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictProxy_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_ContainsString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_DelItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_GetItemRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_GetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_GetItemStringRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_GetItemWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Items' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Keys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Merge' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_MergeFromSeq2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_PopString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_SetDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_SetDefaultRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_SetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Unwatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Update' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Watch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_BadArgument' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_BadInternalCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_CheckSignals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Display' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_DisplayException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_ExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Fetch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_FormatUnraisable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_FormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_GetExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_GetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_GetRaisedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_GivenExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_NewException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_NewExceptionWithDoc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_NoMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_NormalizeException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Occurred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_PrintEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_ProgramText' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_ProgramTextObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_RangedSyntaxLocationObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_ResourceWarning' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_Restore' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetFromErrno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetFromErrnoWithFilename' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetFromErrnoWithFilenameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetFromErrnoWithFilenameObjects' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetHandledException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetImportError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetImportErrorSubclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetInterrupt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetInterruptEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetRaisedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SyntaxLocation' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SyntaxLocationEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_SyntaxLocationObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WarnEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WarnExplicit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WarnExplicitFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WarnExplicitObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WarnFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyErr_WriteUnraisable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_AcquireLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_AcquireThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_CallFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_CallObjectWithKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_EvalCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_EvalCodeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_EvalFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_EvalFrameEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetBuiltins' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFrameBuiltins' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFrameGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFrameLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFuncDesc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetFuncName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_GetLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_InitThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_MergeCompilerFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_ReleaseLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_ReleaseThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_RestoreThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_SaveThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_SetProfile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_SetProfileAllThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_SetTrace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_SetTraceAllThreads' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEval_ThreadsInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEvent_Wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEvent_WaitTimed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExceptionClass_Name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_GetArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_GetCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_GetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_GetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_SetArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_SetCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_SetContext' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyException_SetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_FromFd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_GetLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_NewStdPrinter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_OpenCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_OpenCodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_SetOpenCodeHook' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_WriteObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFile_WriteString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_AsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_FromDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_GetMax' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_GetMin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Pack2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Pack4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Pack8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Unpack2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Unpack4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Unpack8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_FastToLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_FastToLocalsWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetBack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetBuiltins' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetGenerator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetLasti' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetLineNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetLocals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_GetVarString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_LocalsToFast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrozenSet_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetAnnotations' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetClosure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetGlobals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetKwDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_NewWithQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_SetAnnotations' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_SetClosure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_SetDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_SetKwDefaults' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_SetVectorcall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGC_Collect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGC_Disable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGC_Enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGC_IsEnabled' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGILState_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGILState_Ensure' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGILState_GetThisThreadState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGILState_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGen_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGen_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGen_NewWithQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyHash_GetFuncDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_AddModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_AddModuleRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_AppendInittab' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ExecCodeModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ExecCodeModuleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ExecCodeModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ExecCodeModuleWithPathnames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ExtendInittab' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_GetImporter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_GetMagicNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_GetMagicTag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_GetModuleDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_Import' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportFrozenModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportFrozenModuleObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportModuleLevel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportModuleLevelObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ImportModuleNoBlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_ReloadModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyIndex_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__abc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__ast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__codecs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__collections' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__functools' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__imp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__io' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__locale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__operator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__signal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__sre' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__stat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__suggestions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__symtable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__sysconfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__tokenize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__tracemalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__typing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit__weakref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_atexit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_errno' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_faulthandler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_gc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_itertools' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_posix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_pwd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInit_time' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInstanceMethod_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInstanceMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_GetID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Head' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInterpreterState_ThreadHead' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyIter_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyIter_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyIter_Send' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_AsTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Extend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_GetItemRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Reverse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_SetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Sort' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsInt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsLongAndOverflow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsLongLongAndOverflow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsNativeBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsSize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsUnsignedLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsUnsignedLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsUnsignedLongLongMask' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsUnsignedLongMask' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_AsVoidPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromNativeBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromSize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromUnicodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromUnsignedLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromUnsignedLongLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromUnsignedNativeBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_FromVoidPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_GetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_GetOptionalItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_GetOptionalItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_HasKey' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_HasKeyString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_HasKeyStringWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_HasKeyWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Items' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Keys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_SetItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMapping_Values' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_ReadLastObjectFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_ReadLongFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_ReadObjectFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_ReadObjectFromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_ReadShortFromFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_WriteLongToFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_WriteObjectToFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMarshal_WriteObjectToString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_Calloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_GetAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_RawCalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_RawFree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_RawMalloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_RawRealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_Realloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_SetAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMem_SetupDebugHooks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMember_GetOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMember_SetOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemoryView_FromBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemoryView_FromMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemoryView_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemoryView_GetContiguous' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMethod_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMethod_Self' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModuleDef_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddFunctions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddIntConstant' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddObjectRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddStringConstant' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_AddType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_Create2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_ExecDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_FromDefAndSpec2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetFilename' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetFilenameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetNameObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_GetState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_NewObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_SetDocString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMonitoring_EnterScope' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMonitoring_ExitScope' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMutex_Lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMutex_Unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Absolute' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_And' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_AsSsize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Divmod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Float' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_FloorDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceAdd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceAnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceFloorDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceLshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceMatrixMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceOr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlacePower' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceRemainder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceRshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceSubtract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceTrueDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_InPlaceXor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Invert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Long' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Lshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_MatrixMultiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Multiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Negative' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Or' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Positive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Power' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Remainder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Rshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Subtract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_ToBase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_TrueDivide' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyNumber_Xor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODict_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODict_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODict_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_AfterFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_AfterFork_Child' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_AfterFork_Parent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_BeforeFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_FSPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_InterruptOccurred' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_Readline' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_double_to_string' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_getsig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_mystricmp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_mystrnicmp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_setsig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_snprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_string_to_double' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_strtol' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_strtoul' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_vsnprintf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_ASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_AsCharBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_AsFileDescriptor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_AsReadBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_AsWriteBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Bytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallFinalizer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallFinalizerFromDealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallFunction' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallFunctionObjArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallMethodObjArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallNoArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CallOneArg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Calloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CheckBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CheckReadBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_ClearManagedDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_ClearWeakRefs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_CopyData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_DelAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_DelAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_DelItemString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Dir' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GC_Del' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GC_IsFinalized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GC_IsTracked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GC_Track' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GC_UnTrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GET_WEAKREFS_LISTPTR' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GenericGetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GenericGetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GenericHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GenericSetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GenericSetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetAIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetArenaAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetItemData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetOptionalAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetOptionalAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_GetTypeData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_HasAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_HasAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_HasAttrStringWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_HasAttrWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Hash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_HashNotImplemented' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_IS_GC' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_InitVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_IsInstance' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_IsSubclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_IsTrue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_LengthHint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Not' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Realloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Repr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_RichCompare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_RichCompareBool' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_SelfIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_SetArenaAllocator' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_SetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_SetAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Str' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Type' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_Vectorcall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_VectorcallDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_VectorcallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyObject_VisitManagedDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPickleBuffer_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPickleBuffer_GetBuffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPickleBuffer_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPreConfig_InitIsolatedConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPreConfig_InitPythonConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRefTracer_GetTracer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRefTracer_SetTracer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_AnyFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_AnyFileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_AnyFileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_AnyFileFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_File' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_FileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_FileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_FileFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_InteractiveLoop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_InteractiveLoopFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_InteractiveOne' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_InteractiveOneFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_InteractiveOneObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_SimpleFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_SimpleFileEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_SimpleFileExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_SimpleString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_SimpleStringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRun_StringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySeqIter_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Check' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Count' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_DelItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_DelSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Fast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_In' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_InPlaceConcat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_InPlaceRepeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Length' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_List' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Repeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_SetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySequence_Tuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Discard' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySignal_SetWakeupFd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_AdjustIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_GetIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_GetIndicesEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_Unpack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyState_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyState_FindModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyState_RemoveModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStaticMethod_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_Error' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_Exception' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_IsError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_IsExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_NoMemory' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStatus_Ok' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_InitType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_InitType2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_NewType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_AddAuditHook' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_AddWarnOption' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_AddWarnOptionUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_AddXOption' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_Audit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_AuditTuple' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_FormatStderr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_FormatStdout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_GetXOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_HasWarnOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_ResetWarnOptions' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_SetArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_SetArgvEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_SetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_SetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_WriteStderr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySys_WriteStdout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_Delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_DeleteCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_EnterTracing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_GetFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_GetID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_GetInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_GetUnchecked' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_LeaveTracing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_Next' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_SetAsyncExc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThreadState_Swap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_GetInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_ParseTimeoutArg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_ReInitTLS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_acquire_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_acquire_lock_timed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_acquire_lock_timed_with_retries' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_allocate_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_create_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_delete_key' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_delete_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_detach_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_exit_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_free_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_get_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_get_stacksize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_get_thread_ident' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_get_thread_ident_ex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_get_thread_native_id' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_init_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_join_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_release_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_set_key_value' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_set_stacksize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_start_joinable_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_start_new_thread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_delete' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_is_created' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyThread_tss_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_AsSecondsDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_Monotonic' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_MonotonicRaw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_PerfCounter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_PerfCounterRaw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_Time' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTime_TimeRaw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTraceBack_Here' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTraceBack_Print' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTraceMalloc_Track' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTraceMalloc_Untrack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_GetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_GetSlice' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_Pack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_SetItem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_Size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_AddWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_ClearCache' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_ClearWatcher' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_FromMetaclass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_FromModuleAndSpec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_FromSpec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_FromSpecWithBases' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GenericAlloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GenericNew' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetFullyQualifiedName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetModuleByDef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetModuleName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetModuleState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetQualName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetSlot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_GetTypeDataSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_IsSubtype' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_Modified' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_Ready' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_SUPPORTS_WEAKREFS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_Unwatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_Watch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_Create' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_GetEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeDecodeError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_GetEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeEncodeError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_GetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_GetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_GetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_SetEnd' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_SetReason' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeTranslateError_SetStart' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AppendAndDel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsCharmapString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsDecodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsDecodedUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsEncodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsEncodedString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsEncodedUnicode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsLatin1String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsRawUnicodeEscapeString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUCS4' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUCS4Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUTF16String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUTF32String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUTF8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUTF8AndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUTF8String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsUnicodeEscapeString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsWideChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_AsWideCharString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_BuildEncodingMap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Compare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_CompareWithASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Concat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_CopyCharacters' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Count' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Decode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeCharmap' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeFSDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeFSDefaultAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeLatin1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeLocaleAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeRawUnicodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF16Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF32Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF7' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF7Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUTF8Stateful' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_DecodeUnicodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_EncodeFSDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_EncodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_EqualToUTF8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_EqualToUTF8AndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FSConverter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FSDecoder' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Fill' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FindChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromEncodedObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromFormat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromFormatV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromKindAndData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromOrdinal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromStringAndSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_FromWideChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_GetDefaultEncoding' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_GetLength' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_GetSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_InternFromString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_InternImmortal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_InternInPlace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_IsIdentifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Join' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Partition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_RPartition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_RSplit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_ReadChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Replace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_RichCompare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Split' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Splitlines' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Substring' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Tailmatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Translate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_WriteChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_AtExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Code_GetExtra' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Code_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Code_NewWithPosOnlyArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Code_SetExtra' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_CopyPerfMapFile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Eval_RequestCodeExtraIndex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Exc_PrepReraiseStar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_GC_VisitObjects' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_InterpreterFrame_GetCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_InterpreterFrame_GetLasti' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_InterpreterFrame_GetLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_InterpreterState_GetMainModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Long_CompactValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Long_IsCompact' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Object_ClearWeakRefsNoCallbacks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Object_GC_NewWithExtraData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_PerfMapState_Fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_PerfMapState_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_PerfTrampoline_CompileCode' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_PerfTrampoline_SetPersistAfterFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_Type_AssignVersionTag' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_WritePerfMapEntry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyVectorcall_Call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyVectorcall_Function' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyVectorcall_NARGS' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWeakref_GetObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWeakref_GetRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWeakref_NewProxy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWeakref_NewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWideStringList_Append' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWideStringList_Insert' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWrapper_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_AddPendingCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_AtExit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_BuildValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_BytesMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_CompileString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_CompileStringExFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_CompileStringFlags' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_CompileStringObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_DecRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_DecodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_EncodeLocale' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_EndInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_EnterRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_ExitStatusException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FatalError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FdIsInteractive' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Finalize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FinalizeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FrozenMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GETENV' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GenericAlias' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetArgcArgv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetBuildInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetCompiler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetConstant' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetConstantBorrowed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetCopyright' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetExecPrefix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetPlatform' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetPrefix' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetProgramFullPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetProgramName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetPythonHome' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetRecursionLimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GetVersion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_HashPointer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IncRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_InitializeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_InitializeFromConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Is' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsFalse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsFinalizing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsInitialized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsTrue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_LeaveRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_MakePendingCalls' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_NewInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_NewInterpreterFromConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_NewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_PreInitialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_PreInitializeFromArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_PreInitializeFromBytesArgs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_ReprEnter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_ReprLeave' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_RunMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_SetPath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_SetProgramName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_SetPythonHome' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_SetRecursionLimit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_UniversalNewlineFgets' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_VaBuildValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_XNewRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyAST_Compile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArena_AddPyObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArena_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArena_Malloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArena_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_BadArgument' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_CheckPositional' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_NoKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_NoPositional' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_ParseStack' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_ParseStackAndKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_ParseTupleAndKeywordsFast' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_ParseTupleAndKeywords_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_ParseTuple_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_Parse_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_UnpackKeywords' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_UnpackKeywordsWithVararg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_VaParseTupleAndKeywords_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyArg_VaParse_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBuffer_ReleaseInInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBuffer_ReleaseInInterpreterAndRawFree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Finish' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Prepare' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytesWriter_WriteBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_DecodeEscape' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_Find' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_Join' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_Repeat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyBytes_ReverseFind' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCapsule_SetTraverse' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCode_CheckLineNumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCode_ConstantKey' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_Assemble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_CleanDoc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_CodeGen' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_GetBinaryIntrinsicName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_GetUnaryIntrinsicName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasArg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasConst' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasExc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasFree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasJump' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasLocal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeHasName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OpcodeIsValid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCompile_OptimizeCfg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyConfig_AsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyConfig_FromDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyConfig_InitCompatConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyContext_NewHamtForTests' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCoro_GetAwaitableIter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCriticalSection2_BeginSlow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCriticalSection_BeginSlow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCriticalSection_Resume' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCriticalSection_SuspendAll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_Free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_InitWithSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_NewObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_RegisterClass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_Release' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_ReleaseAndRawFree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyCrossInterpreterData_UnregisterClass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDeadline_Get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDeadline_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_DelItemIf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_DelItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_FromItems' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_GetItemRef_KnownHash_LockHeld' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_GetItemStringWithError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_GetItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_LoadGlobal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_MergeEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_NewPresized' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_Pop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_SetItem_KnownHash' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_SetItem_KnownHash_LockHeld' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_SetItem_Take2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyDict_SizeOf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_BadInternalCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_ChainExceptions1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_Clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_ExceptionMatches' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_FormatFromCause' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_ProgramDecodedTextObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_SetFromPyStatus' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_SetKeyError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyErr_SetString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEvalFramePushAndInit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_AddPendingCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_CheckExceptStarTypeValid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_CheckExceptTypeValid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_EvalFrameDefault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_ExceptionGroupMatch' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_FormatAwaitableError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_FormatExcCheckArg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_FormatExcUnbound' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_FormatKwargsError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_FrameClearAndPop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_GetBuiltin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_MakePendingCalls' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_MatchClass' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_MatchKeys' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_MonitorRaise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_SetProfile' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_SliceIndex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_SliceIndexNotNone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_UnpackIterable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEvent_IsSet' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEvent_Notify' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyFloat_ExactDealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyFrame_IsEntryFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyFunction_SetVersion' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyGen_FetchStopIterationValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyGen_SetStopIterationValue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyGen_yf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_ClearExtension' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_GetModuleAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_GetModuleAttrString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_SetModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInstructionSequence_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterConfig_AsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterConfig_InitFromDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterConfig_InitFromState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterConfig_UpdateFromDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_FailIfRunningMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_GetConfigCopy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_GetEvalFrameFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_GetIDObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_GetWhence' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_IDDecref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_IDIncref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_IDInitref' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_IsReady' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_IsRunningMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_LookUpID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_LookUpIDObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_ObjectToID' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_RequireIDRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_RequiresIDRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_SetConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_SetEvalFrameFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_SetNotRunningMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyInterpreterState_SetRunningMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyList_AppendTakeRefListResize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyList_Extend' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyList_FromArraySteal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_AsByteArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_AsTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_DivmodNear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_FileDescriptor_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Format' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Frexp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_FromByteArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_FromDigits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_FromGid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_FromTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_GCD' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Lshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Multiply' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_NumBits' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Rshift' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Sign' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Size_t_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_Subtract' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_UnsignedInt_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_UnsignedLongLong_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_UnsignedLong_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_UnsignedShort_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMem_GetCurrentAllocatorName' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMem_Strdup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireBranchEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireCRaiseEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireCReturnEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireCallEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireExceptionHandledEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireJumpEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireLineEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyResumeEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyReturnEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyStartEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyThrowEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyUnwindEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FirePyYieldEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireRaiseEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireReraiseEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyMonitoring_FireStopIterationEvent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyNamespace_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyNumber_Index' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyOS_IsMainThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyOS_URandomNonblock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_AssertFailed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_CallFunction_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_CallMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_CallMethodId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_CallMethod_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_CheckCrossInterpreterData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_DebugMallocStats' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_Dump' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_FunctionStr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GC_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GC_NewVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GC_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GenericGetAttrWithDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GenericSetAttrWithDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GetAttrId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GetCrossInterpreterData' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GetDictPtr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GetMethod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_GetState' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_IsFreed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_LookupSpecial' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_MakeTpCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_NewVar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyObject_SetManagedDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyOnceFlag_CallOnceSlow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyParkingLot_AfterFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyParkingLot_Park' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyParkingLot_Unpark' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyParkingLot_UnparkAll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyPathConfig_ClearGlobal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyPreConfig_InitCompatConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRWMutex_Lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRWMutex_RLock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRWMutex_RUnlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRWMutex_Unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRecursiveMutex_IsLockedByCurrentThread' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRecursiveMutex_Lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRecursiveMutex_Unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySemaphore_Destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySemaphore_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySemaphore_Wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySemaphore_Wakeup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_AbandonWrite' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_AfterFork' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_BeginRead' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_EndRead' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_LockWrite' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySeqLock_UnlockWrite' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySet_Contains' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySet_NextEntry' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySet_NextEntryRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySet_Update' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySlice_FromIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySlice_GetLongIndices' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyStack_AsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyState_AddModule' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyStaticType_InitForExtension' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyStructSequence_NewType' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySuper_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySys_GetAttr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySys_GetSizeOf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_GetCurrent' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_New' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_NewBound' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_PopFrame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThreadState_Prealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyThread_CurrentFrames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsMicroseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsMilliseconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsTimespec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsTimespec_clamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsTimeval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsTimevalTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_AsTimeval_clamp' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_FromLong' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_FromMillisecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_FromSeconds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_FromSecondsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_MonotonicWithInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_ObjectToTime_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_ObjectToTimespec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_ObjectToTimeval' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_gmtime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTime_localtime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyToken_OneChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyToken_ThreeChars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyToken_TwoChars' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTraceMalloc_GetTraceback' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTraceback_Add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTrash_thread_deposit_object' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTrash_thread_destroy_chain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTuple_FromArraySteal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyTuple_Resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyType_GetDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyType_GetModuleByDef2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyType_Lookup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyType_LookupRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyType_Name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_Finish' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_PrepareInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_PrepareKindInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_WriteASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_WriteChar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_WriteLatin1String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_WriteStr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicodeWriter_WriteSubstring' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_AsUTF8NoNUL' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_AsUTF8String' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_CheckConsistency' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_Copy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_DecodeUnicodeEscapeInternal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_EncodeUTF16' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_EncodeUTF32' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_Equal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_EqualToASCIIString' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ExactDealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_FromId' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_InternImmortal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_InternInPlace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_InternMortal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsAlpha' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsDecimalDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsLinebreak' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsLowercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsNumeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsPrintable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsTitlecase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsUppercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_IsWhitespace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_JoinArray' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ScanIdentifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToDecimalDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToDigit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToLowercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToNumeric' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToTitlecase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_ToUppercase' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnicode_TransformDecimalAndSpaceToASCII' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWarnings_Init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWeakref_ClearRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWeakref_IsDead' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_ApplyCapturedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_ApplyError' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_ApplyNamespace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_ClearExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_EndInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_Enter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_ExcInfoAsObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_Exit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_FillNamespaceFromDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_FormatExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_FreeNamespace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_HasCapturedException' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_InitExcInfo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_NamespaceFromNames' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyXI_NewInterpreter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_BreakPoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_BuildValue_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_CheckFunctionResult' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_CheckRecursiveCall' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_Dealloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_DecRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_DecodeLocaleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_DisplaySourceLine' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_EncodeLocaleEx' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_FatalErrorFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_FatalRefcountErrorFunc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_GetConfig' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_GetConfigsAsDict' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_GetErrorHandler' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_Get_Getpath_CodeObject' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_Gid_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_HandlePending' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_HashBytes' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_HashDouble' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_IncRef' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_InitializeMain' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_IsInterpreterFinalizing' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_IsValidFD' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_MakeCoro' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_NewReference' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_NewReferenceNoTotal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_RestoreSignals' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_ResurrectReference' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_SetLocaleFromEnv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_SetRefcnt' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_UTF8_Edit_Cost' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_Uid_Converter' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_UniversalNewlineFgetsWithSize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_VaBuildValue_SizeT' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_abs' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_diff' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_neg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_pow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_prod' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_quot' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_c_sum' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_closerange' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_convert_optional_to_ssize_t' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_dup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_fopen_obj' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_fstat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_fstat_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_clear' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_compare_direct' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_foreach' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_hash_ptr' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_len' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_new' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_new_full' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_set' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_size' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_hashtable_steal' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_normpath' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_open' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_open_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_set_inheritable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_set_inheritable_async_safe' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_stat' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_strhex' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_strhex_bytes_with_sep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_union_type_or' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_write' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_write_noraise' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + </elf-function-symbols> + <elf-variable-symbols> + <elf-symbol name='PY_TIMEOUT_MAX' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyAsyncGen_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBaseObject_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBool_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArrayIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyByteArray_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytesIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyBytes_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCFunction_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCallIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCapsule_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCell_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyClassMethodDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyClassMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCode_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyComplex_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextToken_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContextVar_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyContext_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyCoro_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictItems_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictIterItem_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictIterKey_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictIterValue_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictKeys_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictProxy_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictRevIterItem_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictRevIterKey_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictRevIterValue_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDictValues_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyDict_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEllipsis_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyEnum_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ArithmeticError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_AssertionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_AttributeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BaseException' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BaseExceptionGroup' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BlockingIOError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BrokenPipeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BufferError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_BytesWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ChildProcessError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ConnectionAbortedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ConnectionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ConnectionRefusedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ConnectionResetError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_DeprecationWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_EOFError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_EncodingWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_EnvironmentError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_Exception' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_FileExistsError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_FileNotFoundError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_FloatingPointError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_FutureWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_GeneratorExit' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_IOError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ImportError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ImportWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_IndentationError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_IndexError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_InterpreterError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_InterpreterNotFoundError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_InterruptedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_IsADirectoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_KeyError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_KeyboardInterrupt' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_LookupError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_MemoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ModuleNotFoundError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_NameError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_NotADirectoryError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_NotImplementedError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_OSError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_OverflowError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_PendingDeprecationWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_PermissionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ProcessLookupError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_PythonFinalizationError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_RecursionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ReferenceError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ResourceWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_RuntimeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_RuntimeWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_StopAsyncIteration' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_StopIteration' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_SyntaxError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_SyntaxWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_SystemError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_SystemExit' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_TabError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_TimeoutError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_TypeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnboundLocalError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnicodeDecodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnicodeEncodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnicodeError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnicodeTranslateError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UnicodeWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_UserWarning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ValueError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_Warning' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyExc_ZeroDivisionError' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFilter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFloat_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrameLocalsProxy_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrame_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFrozenSet_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyFunction_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGen_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyGetSetDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_FrozenModules' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyImport_Inittab' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyInstanceMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyListIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyListRevIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyList_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLongRangeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyLong_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMap_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemberDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMemoryView_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMethodDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModuleDef_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyModule_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODictItems_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODictIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODictKeys_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODictValues_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyODict_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_InputHook' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyOS_ReadlineFunctionPointer' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyPickleBuffer_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyProperty_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRangeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyRange_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyReversed_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySeqIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySetIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySet_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySlice_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStaticMethod_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStdPrinter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyStructSequence_UnnamedField' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PySuper_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTraceBack_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTupleIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyTuple_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyType_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicodeIter_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnicode_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyUnstable_ExecutableKinds' size='48' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyWrapperDescr_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='PyZip_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_BytesWarningFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_DebugFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_DontWriteBytecodeFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FileSystemDefaultEncodeErrors' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FileSystemDefaultEncoding' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_FrozenFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_GenericAliasType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_HasFileSystemDefaultEncoding' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_HashRandomizationFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IgnoreEnvironmentFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_InspectFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_InteractiveFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_IsolatedFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_NoSiteFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_NoUserSiteDirectory' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_OptimizeFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_QuietFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_UTF8Mode' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_UnbufferedStdioFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_VerboseFlag' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_Version' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='Py_hexdigits' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyAsyncGenASend_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyByteArray_empty_string' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_BinaryOps' size='208' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyEval_ConversionFuncs' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyExc_IncompleteInputError' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_FrozenBootstrap' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_FrozenStdlib' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyImport_FrozenTest' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyIntrinsics_BinaryFunctions' size='96' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyIntrinsics_UnaryFunctions' size='192' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyLong_DigitValue' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyNone_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyNotImplemented_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyOS_ReadlineTState' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyParser_TokenNames' size='536' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyRuntime' size='283376' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PySet_Dummy' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyUnion_Type' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWeakref_CallableProxyType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWeakref_ProxyType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_PyWeakref_RefType' size='416' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_EllipsisObject' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_FalseStruct' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_HashSecret' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_NoneStruct' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_NotImplementedStruct' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_SwappedOp' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_TrueStruct' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_ascii_whitespace' size='128' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_ctype_table' size='1024' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_ctype_tolower' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + <elf-symbol name='_Py_ctype_toupper' size='256' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/> + </elf-variable-symbols> + <abi-instr address-size='64' path='./Modules/_abc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyType_SetFlags' filepath='./Include/internal/pycore_typeobject.h' line='231' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-2'/> + <parameter type-id='type-id-2'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyType_SetFlagsRecursive' filepath='./Include/internal/pycore_typeobject.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-2'/> + <parameter type-id='type-id-2'/> + <return type-id='type-id-3'/> + </function-decl> + <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_codecsmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyUnicode_EncodeUTF7' filepath='./Include/internal/pycore_unicodeobject.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_DecodeUnicodeEscapeStateful' filepath='./Include/internal/pycore_unicodeobject.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_DecodeRawUnicodeEscapeStateful' filepath='./Include/internal/pycore_unicodeobject.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_AsLatin1String' filepath='./Include/internal/pycore_unicodeobject.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_EncodeCharmap' filepath='./Include/internal/pycore_unicodeobject.h' line='187' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/_iomodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyIO_Module' type-id='type-id-9' visibility='default' filepath='./Modules/_io/_iomodule.h' line='143' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/bufferedio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='_PyIO_State' type-id='type-id-10' filepath='./Modules/_io/_iomodule.h' line='35' column='1' id='type-id-11'/> + <typedef-decl name='Py_off_t' type-id='type-id-12' filepath='./Modules/_io/_iomodule.h' line='109' column='1' id='type-id-13'/> + <class-decl name='_io_state' size-in-bits='1024' is-struct='yes' visibility='default' filepath='./Modules/_io/_iomodule.h' line='145' column='1' id='type-id-10'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Modules/_io/_iomodule.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='unsupported_operation' type-id='type-id-4' visibility='default' filepath='./Modules/_io/_iomodule.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='PyIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='PyIncrementalNewlineDecoder_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='PyRawIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='152' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='PyBufferedIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='PyBufferedRWPair_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='154' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='PyBufferedRandom_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='PyBufferedReader_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='PyBufferedWriter_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='PyBytesIOBuffer_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='PyBytesIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='159' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='PyFileIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='PyStringIO_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='PyTextIOBase_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='PyTextIOWrapper_Type' type-id='type-id-1' visibility='default' filepath='./Modules/_io/_iomodule.h' line='163' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='off_t' type-id='type-id-14' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='87' column='1' id='type-id-12'/> + <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-15'/> + <var-decl name='bufferediobase_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='12' column='1'/> + <var-decl name='bufferedrandom_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='13' column='1'/> + <var-decl name='bufferedreader_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='14' column='1'/> + <var-decl name='bufferedrwpair_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='15' column='1'/> + <var-decl name='bufferedwriter_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='16' column='1'/> + <function-decl name='_PyIOBase_check_readable' filepath='./Modules/_io/_iomodule.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyIOBase_check_writable' filepath='./Modules/_io/_iomodule.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyIOBase_check_seekable' filepath='./Modules/_io/_iomodule.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-15'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyFileIO_closed' filepath='./Modules/_io/_iomodule.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyNumber_AsOff_t' filepath='./Modules/_io/_iomodule.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-13'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/bytesio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='bytesio_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='17' column='1'/> + <var-decl name='bytesiobuf_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='18' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/fileio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='fileio_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='19' column='1'/> + <function-decl name='_PyIOBase_finalize' filepath='./Modules/_io/_iomodule.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyIOBase_cannot_pickle' filepath='./Modules/_io/_iomodule.h' line='193' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/iobase.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='iobase_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='20' column='1'/> + <var-decl name='rawiobase_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='22' column='1'/> + <function-decl name='_PyIO_trap_eintr' filepath='./Modules/_io/_iomodule.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/stringio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='stringio_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='23' column='1'/> + <function-decl name='_PyIncrementalNewlineDecoder_decode' filepath='./Modules/_io/_iomodule.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyIO_find_line_ending' filepath='./Modules/_io/_iomodule.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_io/textio.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyCodec_LookupTextEncoding' filepath='./Include/internal/pycore_codecs.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCodecInfo_GetIncrementalDecoder' filepath='./Include/internal/pycore_codecs.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCodecInfo_GetIncrementalEncoder' filepath='./Include/internal/pycore_codecs.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_GetLocaleEncodingObject' filepath='./Include/internal/pycore_fileutils.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='nldecoder_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='21' column='1'/> + <var-decl name='textiobase_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='24' column='1'/> + <var-decl name='textiowrapper_spec' type-id='type-id-16' visibility='default' filepath='./Modules/_io/_iomodule.h' line='25' column='1'/> + <function-decl name='_PyIOBase_check_closed' filepath='./Modules/_io/_iomodule.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_localemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='gettext' filepath='/usr/include/libintl.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='dgettext' filepath='/usr/include/libintl.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='dcgettext' filepath='/usr/include/libintl.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='textdomain' filepath='/usr/include/libintl.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='bindtextdomain' filepath='/usr/include/libintl.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='bind_textdomain_codeset' filepath='/usr/include/libintl.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-21'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_sre/sre.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-22' const='yes' id='type-id-23'/> + <pointer-type-def type-id='type-id-23' size-in-bits='64' id='type-id-24'/> + <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-25'/> + <function-decl name='__ctype_b_loc' filepath='/usr/include/ctype.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-25'/> + </function-decl> + <function-decl name='tolower' filepath='/usr/include/ctype.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='toupper' filepath='/usr/include/ctype.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <type-decl name='unsigned short int' size-in-bits='16' id='type-id-22'/> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_threadmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyMutex_TryUnlock' filepath='./Include/internal/pycore_lock.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-26'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_Display' filepath='./Include/internal/pycore_pylifecycle.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_DeleteCurrent' filepath='./Include/internal/pycore_pylifecycle.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_tracemalloc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyTraceMalloc_IsTracing' filepath='./Include/internal/pycore_tracemalloc.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceMalloc_ClearTraces' filepath='./Include/internal/pycore_tracemalloc.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetTraces' filepath='./Include/internal/pycore_tracemalloc.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetObjectTraceback' filepath='./Include/internal/pycore_tracemalloc.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTraceMalloc_Init' filepath='./Include/internal/pycore_tracemalloc.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceMalloc_Stop' filepath='./Include/internal/pycore_tracemalloc.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetTracebackLimit' filepath='./Include/internal/pycore_tracemalloc.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetMemory' filepath='./Include/internal/pycore_tracemalloc.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetTracedMemory' filepath='./Include/internal/pycore_tracemalloc.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTraceMalloc_ResetPeak' filepath='./Include/internal/pycore_tracemalloc.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/_weakref.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyWeakref_GetWeakrefCount' filepath='./Include/internal/pycore_weakref.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/atexitmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyUnstable_AtExit' mangled-name='PyUnstable_AtExit' filepath='./Modules/atexitmodule.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_AtExit'> + <parameter type-id='type-id-28' name='interp' filepath='./Modules/atexitmodule.c' line='27' column='1'/> + <parameter type-id='type-id-29' name='func' filepath='./Modules/atexitmodule.c' line='28' column='1'/> + <parameter type-id='type-id-30' name='data' filepath='./Modules/atexitmodule.c' line='28' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/faulthandler.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <enum-decl name='__rlimit_resource' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='31' column='1' id='type-id-31'> + <underlying-type type-id='type-id-32'/> + <enumerator name='RLIMIT_CPU' value='0'/> + <enumerator name='RLIMIT_FSIZE' value='1'/> + <enumerator name='RLIMIT_DATA' value='2'/> + <enumerator name='RLIMIT_STACK' value='3'/> + <enumerator name='RLIMIT_CORE' value='4'/> + <enumerator name='__RLIMIT_RSS' value='5'/> + <enumerator name='RLIMIT_NOFILE' value='7'/> + <enumerator name='__RLIMIT_OFILE' value='7'/> + <enumerator name='RLIMIT_AS' value='9'/> + <enumerator name='__RLIMIT_NPROC' value='6'/> + <enumerator name='__RLIMIT_MEMLOCK' value='8'/> + <enumerator name='__RLIMIT_LOCKS' value='10'/> + <enumerator name='__RLIMIT_SIGPENDING' value='11'/> + <enumerator name='__RLIMIT_MSGQUEUE' value='12'/> + <enumerator name='__RLIMIT_NICE' value='13'/> + <enumerator name='__RLIMIT_RTPRIO' value='14'/> + <enumerator name='__RLIMIT_RTTIME' value='15'/> + <enumerator name='__RLIMIT_NLIMITS' value='16'/> + <enumerator name='__RLIM_NLIMITS' value='16'/> + </enum-decl> + <typedef-decl name='rlim_t' type-id='type-id-33' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='133' column='1' id='type-id-34'/> + <class-decl name='rlimit' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='139' column='1' id='type-id-35'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='rlim_cur' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='142' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rlim_max' type-id='type-id-34' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='144' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__rlim64_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='158' column='1' id='type-id-33'/> + <typedef-decl name='__rlimit_resource_t' type-id='type-id-31' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='38' column='1' id='type-id-36'/> + <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-38'/> + <qualified-type-def type-id='type-id-38' restrict='yes' id='type-id-39'/> + <qualified-type-def type-id='type-id-37' const='yes' id='type-id-40'/> + <pointer-type-def type-id='type-id-40' size-in-bits='64' id='type-id-41'/> + <qualified-type-def type-id='type-id-41' restrict='yes' id='type-id-42'/> + <qualified-type-def type-id='type-id-35' const='yes' id='type-id-43'/> + <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/> + <qualified-type-def type-id='type-id-45' const='yes' id='type-id-46'/> + <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-47'/> + <qualified-type-def type-id='type-id-47' restrict='yes' id='type-id-48'/> + <pointer-type-def type-id='type-id-35' size-in-bits='64' id='type-id-49'/> + <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-50'/> + <qualified-type-def type-id='type-id-50' restrict='yes' id='type-id-51'/> + <function-decl name='_Py_DumpExtensionModules' filepath='./Include/internal/pycore_pyerrors.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_DumpTraceback' filepath='./Include/internal/pycore_traceback.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='raise' filepath='/usr/include/signal.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigfillset' filepath='/usr/include/signal.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-52'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigaltstack' filepath='/usr/include/signal.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-48'/> + <parameter type-id='type-id-51'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_exit' filepath='/usr/include/unistd.h' line='624' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='pthread_sigmask' filepath='/usr/include/x86_64-linux-gnu/bits/sigthread.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-42'/> + <parameter type-id='type-id-39'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getauxval' filepath='/usr/include/x86_64-linux-gnu/sys/auxv.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-2'/> + <return type-id='type-id-2'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/getbuildinfo.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <type-decl name='char' size-in-bits='8' id='type-id-53'/> + <type-decl name='int' size-in-bits='32' id='type-id-5'/> + <type-decl name='unsigned long int' size-in-bits='64' id='type-id-2'/> + <type-decl name='variadic parameter type' id='type-id-54'/> + <typedef-decl name='size_t' type-id='type-id-2' filepath='/usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h' line='209' column='1' id='type-id-21'/> + <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-17'/> + <qualified-type-def type-id='type-id-53' const='yes' id='type-id-55'/> + <pointer-type-def type-id='type-id-55' size-in-bits='64' id='type-id-6'/> + <function-decl name='PyOS_snprintf' mangled-name='PyOS_snprintf' filepath='./Include/pyerrors.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_snprintf'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_GetBuildInfo' mangled-name='Py_GetBuildInfo' filepath='./Modules/getbuildinfo.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetBuildInfo'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='strcmp' filepath='/usr/include/string.h' line='156' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/getpath.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_wfopen' filepath='./Include/internal/pycore_fileutils.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <return type-id='type-id-56'/> + </function-decl> + <function-decl name='_Py_DecodeUTF8_surrogateescape' filepath='./Include/internal/pycore_fileutils.h' line='226' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-57'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_wstat' filepath='./Include/internal/pycore_fileutils.h' line='232' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-59'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_join_relfile' filepath='./Include/internal/pycore_fileutils.h' line='272' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_add_relfile' filepath='./Include/internal/pycore_fileutils.h' line='274' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPathConfig_ReadGlobal' filepath='./Include/internal/pycore_pathconfig.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPathConfig_GetGlobalModuleSearchPath' filepath='./Include/internal/pycore_pathconfig.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-18'/> + </function-decl> + <function-decl name='_Py_Get_Getpath_CodeObject' mangled-name='_Py_Get_Getpath_CodeObject' filepath='./Modules/getpath.c' line='841' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Get_Getpath_CodeObject'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/posixmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-62' size-in-bits='1024' id='type-id-63'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-65' size-in-bits='256' id='type-id-66'> + <subrange length='32' type-id='type-id-2' id='type-id-67'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='2048' id='type-id-68'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='520' id='type-id-70'> + <subrange length='65' type-id='type-id-2' id='type-id-71'/> + </array-type-def> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-72'/> + <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-73'/> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='512' id='type-id-74'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <typedef-decl name='DIR' type-id='type-id-72' filepath='/usr/include/dirent.h' line='127' column='1' id='type-id-75'/> + <class-decl name='posix_spawnattr_t' size-in-bits='2688' is-struct='yes' naming-typedef-id='type-id-76' visibility='default' filepath='/usr/include/spawn.h' line='29' column='1' id='type-id-77'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__flags' type-id='type-id-78' visibility='default' filepath='/usr/include/spawn.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__pgrp' type-id='type-id-79' visibility='default' filepath='/usr/include/spawn.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__sd' type-id='type-id-80' visibility='default' filepath='/usr/include/spawn.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='__ss' type-id='type-id-80' visibility='default' filepath='/usr/include/spawn.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='__sp' type-id='type-id-81' visibility='default' filepath='/usr/include/spawn.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2144'> + <var-decl name='__policy' type-id='type-id-5' visibility='default' filepath='/usr/include/spawn.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='__pad' type-id='type-id-74' visibility='default' filepath='/usr/include/spawn.h' line='37' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='posix_spawnattr_t' type-id='type-id-77' filepath='/usr/include/spawn.h' line='38' column='1' id='type-id-76'/> + <class-decl name='posix_spawn_file_actions_t' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-82' visibility='default' filepath='/usr/include/spawn.h' line='43' column='1' id='type-id-83'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__allocated' type-id='type-id-5' visibility='default' filepath='/usr/include/spawn.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__used' type-id='type-id-5' visibility='default' filepath='/usr/include/spawn.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__actions' type-id='type-id-84' visibility='default' filepath='/usr/include/spawn.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__pad' type-id='type-id-74' visibility='default' filepath='/usr/include/spawn.h' line='48' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='posix_spawn_file_actions_t' type-id='type-id-83' filepath='/usr/include/spawn.h' line='49' column='1' id='type-id-82'/> + <typedef-decl name='__compar_fn_t' type-id='type-id-85' filepath='/usr/include/stdlib.h' line='816' column='1' id='type-id-86'/> + <typedef-decl name='__cpu_mask' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='32' column='1' id='type-id-62'/> + <class-decl name='cpu_set_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-87' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='39' column='1' id='type-id-88'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__bits' type-id='type-id-63' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='41' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='cpu_set_t' type-id='type-id-88' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='42' column='1' id='type-id-87'/> + <class-decl name='dirent' size-in-bits='2240' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='22' column='1' id='type-id-89'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='d_ino' type-id='type-id-90' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='d_off' type-id='type-id-14' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='d_reclen' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='144'> + <var-decl name='d_type' type-id='type-id-91' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='152'> + <var-decl name='d_name' type-id='type-id-68' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/dirent.h' line='33' column='1'/> + </data-member> + </class-decl> + <class-decl name='winsize' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='27' column='1' id='type-id-92'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ws_row' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='ws_col' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ws_xpixel' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48'> + <var-decl name='ws_ypixel' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/ioctl-types.h' line='32' column='1'/> + </data-member> + </class-decl> + <enum-decl name='__priority_which' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='187' column='1' id='type-id-93'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PRIO_PROCESS' value='0'/> + <enumerator name='PRIO_PGRP' value='1'/> + <enumerator name='PRIO_USER' value='2'/> + </enum-decl> + <class-decl name='statvfs' size-in-bits='896' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='29' column='1' id='type-id-94'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='f_bsize' type-id='type-id-2' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='f_frsize' type-id='type-id-2' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='f_blocks' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='f_bfree' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='f_bavail' type-id='type-id-95' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='f_files' type-id='type-id-96' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='f_ffree' type-id='type-id-96' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='f_favail' type-id='type-id-96' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='f_fsid' type-id='type-id-2' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='f_flag' type-id='type-id-2' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='f_namemax' type-id='type-id-2' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='__f_spare' type-id='type-id-97' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/statvfs.h' line='54' column='1'/> + </data-member> + </class-decl> + <class-decl name='termios' size-in-bits='480' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='24' column='1' id='type-id-98'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='c_iflag' type-id='type-id-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='c_oflag' type-id='type-id-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='c_cflag' type-id='type-id-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='c_lflag' type-id='type-id-99' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='c_line' type-id='type-id-65' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='136'> + <var-decl name='c_cc' type-id='type-id-66' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='c_ispeed' type-id='type-id-100' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='c_ospeed' type-id='type-id-100' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/termios-struct.h' line='33' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='cc_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='23' column='1' id='type-id-65'/> + <typedef-decl name='speed_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='24' column='1' id='type-id-100'/> + <typedef-decl name='tcflag_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/termios.h' line='25' column='1' id='type-id-99'/> + <typedef-decl name='__id_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='159' column='1' id='type-id-102'/> + <typedef-decl name='__fsblkcnt64_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='185' column='1' id='type-id-95'/> + <typedef-decl name='__fsfilcnt64_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='189' column='1' id='type-id-96'/> + <typedef-decl name='clock_t' type-id='type-id-103' filepath='/usr/include/x86_64-linux-gnu/bits/types/clock_t.h' line='7' column='1' id='type-id-104'/> + <class-decl name='iovec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='26' column='1' id='type-id-105'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='iov_base' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='iov_len' type-id='type-id-21' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_iovec.h' line='29' column='1'/> + </data-member> + </class-decl> + <class-decl name='itimerspec' size-in-bits='256' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h' line='8' column='1' id='type-id-106'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='it_interval' type-id='type-id-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h' line='10' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='it_value' type-id='type-id-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h' line='11' column='1'/> + </data-member> + </class-decl> + <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h' line='23' column='1' id='type-id-81'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='sched_priority' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h' line='25' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='eventfd_t' type-id='type-id-108' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='27' column='1' id='type-id-109'/> + <typedef-decl name='__priority_which_t' type-id='type-id-93' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='40' column='1' id='type-id-110'/> + <class-decl name='tms' size-in-bits='256' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='32' column='1' id='type-id-111'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tms_utime' type-id='type-id-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tms_stime' type-id='type-id-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tms_cutime' type-id='type-id-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tms_cstime' type-id='type-id-104' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='38' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='gid_t' type-id='type-id-112' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='64' column='1' id='type-id-113'/> + <typedef-decl name='mode_t' type-id='type-id-114' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='69' column='1' id='type-id-115'/> + <typedef-decl name='uid_t' type-id='type-id-116' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='79' column='1' id='type-id-117'/> + <typedef-decl name='pid_t' type-id='type-id-118' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='97' column='1' id='type-id-79'/> + <typedef-decl name='id_t' type-id='type-id-102' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='103' column='1' id='type-id-119'/> + <class-decl name='utsname' size-in-bits='3120' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='48' column='1' id='type-id-120'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='sysname' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='520'> + <var-decl name='nodename' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='release' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1560'> + <var-decl name='version' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2080'> + <var-decl name='machine' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2600'> + <var-decl name='domainname' type-id='type-id-70' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='67' column='1'/> + </data-member> + </class-decl> + <enum-decl name='idtype_t' naming-typedef-id='type-id-121' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='75' column='1' id='type-id-122'> + <underlying-type type-id='type-id-32'/> + <enumerator name='P_ALL' value='0'/> + <enumerator name='P_PID' value='1'/> + <enumerator name='P_PGID' value='2'/> + </enum-decl> + <typedef-decl name='idtype_t' type-id='type-id-122' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='79' column='1' id='type-id-121'/> + <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-123'/> + <pointer-type-def type-id='type-id-112' size-in-bits='64' id='type-id-124'/> + <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-125'/> + <pointer-type-def type-id='type-id-73' size-in-bits='64' id='type-id-84'/> + <pointer-type-def type-id='type-id-116' size-in-bits='64' id='type-id-126'/> + <qualified-type-def type-id='type-id-127' restrict='yes' id='type-id-128'/> + <qualified-type-def type-id='type-id-112' const='yes' id='type-id-129'/> + <pointer-type-def type-id='type-id-129' size-in-bits='64' id='type-id-130'/> + <qualified-type-def type-id='type-id-87' const='yes' id='type-id-131'/> + <pointer-type-def type-id='type-id-131' size-in-bits='64' id='type-id-132'/> + <qualified-type-def type-id='type-id-105' const='yes' id='type-id-133'/> + <pointer-type-def type-id='type-id-133' size-in-bits='64' id='type-id-134'/> + <qualified-type-def type-id='type-id-106' const='yes' id='type-id-135'/> + <pointer-type-def type-id='type-id-135' size-in-bits='64' id='type-id-136'/> + <qualified-type-def type-id='type-id-82' const='yes' id='type-id-137'/> + <pointer-type-def type-id='type-id-137' size-in-bits='64' id='type-id-138'/> + <qualified-type-def type-id='type-id-138' restrict='yes' id='type-id-139'/> + <qualified-type-def type-id='type-id-76' const='yes' id='type-id-140'/> + <pointer-type-def type-id='type-id-140' size-in-bits='64' id='type-id-141'/> + <qualified-type-def type-id='type-id-141' restrict='yes' id='type-id-142'/> + <qualified-type-def type-id='type-id-81' const='yes' id='type-id-143'/> + <pointer-type-def type-id='type-id-143' size-in-bits='64' id='type-id-144'/> + <qualified-type-def type-id='type-id-144' restrict='yes' id='type-id-145'/> + <qualified-type-def type-id='type-id-80' const='yes' id='type-id-146'/> + <pointer-type-def type-id='type-id-146' size-in-bits='64' id='type-id-147'/> + <qualified-type-def type-id='type-id-147' restrict='yes' id='type-id-148'/> + <qualified-type-def type-id='type-id-98' const='yes' id='type-id-149'/> + <pointer-type-def type-id='type-id-149' size-in-bits='64' id='type-id-150'/> + <qualified-type-def type-id='type-id-92' const='yes' id='type-id-151'/> + <pointer-type-def type-id='type-id-151' size-in-bits='64' id='type-id-152'/> + <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-153'/> + <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-154'/> + <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-155'/> + <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-156'/> + <pointer-type-def type-id='type-id-106' size-in-bits='64' id='type-id-157'/> + <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-158'/> + <qualified-type-def type-id='type-id-158' restrict='yes' id='type-id-159'/> + <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-160'/> + <qualified-type-def type-id='type-id-160' restrict='yes' id='type-id-161'/> + <pointer-type-def type-id='type-id-76' size-in-bits='64' id='type-id-162'/> + <qualified-type-def type-id='type-id-162' restrict='yes' id='type-id-163'/> + <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-164'/> + <pointer-type-def type-id='type-id-94' size-in-bits='64' id='type-id-165'/> + <qualified-type-def type-id='type-id-165' restrict='yes' id='type-id-166'/> + <pointer-type-def type-id='type-id-111' size-in-bits='64' id='type-id-167'/> + <pointer-type-def type-id='type-id-117' size-in-bits='64' id='type-id-168'/> + <pointer-type-def type-id='type-id-120' size-in-bits='64' id='type-id-169'/> + <class-decl name='__dirstream' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-72'/> + <class-decl name='__spawn_action' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-73'/> + <function-decl name='_PyEval_ReInitThreads' filepath='./Include/internal/pycore_ceval.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_AfterFork_Child' filepath='./Include/internal/pycore_ceval.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_device_encoding' filepath='./Include/internal/pycore_fileutils.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_get_inheritable' filepath='./Include/internal/pycore_fileutils.h' line='174' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_get_blocking' filepath='./Include/internal/pycore_fileutils.h' line='187' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_set_blocking' filepath='./Include/internal/pycore_fileutils.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_normpath_and_size' filepath='./Include/internal/pycore_fileutils.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_skiproot' filepath='./Include/internal/pycore_fileutils.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_GetTicksPerSecond' filepath='./Include/internal/pycore_fileutils.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-170'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_AcquireLock' filepath='./Include/internal/pycore_import.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_ReleaseLock' filepath='./Include/internal/pycore_import.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_ReInitLock' filepath='./Include/internal/pycore_import.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyOS_URandom' filepath='./Include/internal/pycore_pylifecycle.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_ReinitRunningMain' filepath='./Include/internal/pycore_pystate.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_DeleteExceptMain' filepath='./Include/internal/pycore_pystate.h' line='250' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PySignal_AfterFork' filepath='./Include/internal/pycore_pystate.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRuntimeState_ReInitThreads' filepath='./Include/internal/pycore_runtime.h' line='373' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyTime_FromSecondsDouble' filepath='./Include/internal/pycore_time.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-173'/> + <parameter type-id='type-id-174'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_FromTimespec' filepath='./Include/internal/pycore_time.h' line='226' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-174'/> + <parameter type-id='type-id-175'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyType_AddMethod' filepath='./Include/internal/pycore_typeobject.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-176'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyOS_BeforeFork' mangled-name='PyOS_BeforeFork' filepath='./Modules/posixmodule.c' line='619' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_BeforeFork'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyOS_AfterFork_Parent' mangled-name='PyOS_AfterFork_Parent' filepath='./Modules/posixmodule.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork_Parent'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyOS_AfterFork_Child' mangled-name='PyOS_AfterFork_Child' filepath='./Modules/posixmodule.c' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork_Child'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyOS_AfterFork' mangled-name='PyOS_AfterFork' filepath='./Modules/posixmodule.c' line='721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_AfterFork'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyLong_FromGid' mangled-name='_PyLong_FromGid' filepath='./Modules/posixmodule.c' line='750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromGid'> + <parameter type-id='type-id-113' name='gid' filepath='./Modules/posixmodule.c' line='750' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_Uid_Converter' mangled-name='_Py_Uid_Converter' filepath='./Modules/posixmodule.c' line='758' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Uid_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='./Modules/posixmodule.c' line='758' column='1'/> + <parameter type-id='type-id-168' name='p' filepath='./Modules/posixmodule.c' line='758' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_Gid_Converter' mangled-name='_Py_Gid_Converter' filepath='./Modules/posixmodule.c' line='864' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Gid_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='./Modules/posixmodule.c' line='864' column='1'/> + <parameter type-id='type-id-156' name='p' filepath='./Modules/posixmodule.c' line='864' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='opendir' filepath='/usr/include/dirent.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-123'/> + </function-decl> + <function-decl name='fdopendir' filepath='/usr/include/dirent.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-123'/> + </function-decl> + <function-decl name='closedir' filepath='/usr/include/dirent.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-123'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='rewinddir' filepath='/usr/include/dirent.h' line='209' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-123'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='setgroups' filepath='/usr/include/grp.h' line='176' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-130'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getgrouplist' filepath='/usr/include/grp.h' line='186' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-124'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='initgroups' filepath='/usr/include/grp.h' line='197' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='openpty' filepath='/usr/include/pty.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-150'/> + <parameter type-id='type-id-152'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='forkpty' filepath='/usr/include/pty.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-150'/> + <parameter type-id='type-id-152'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_setparam' filepath='/usr/include/sched.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-144'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_getparam' filepath='/usr/include/sched.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-164'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_setscheduler' filepath='/usr/include/sched.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-144'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_getscheduler' filepath='/usr/include/sched.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_get_priority_max' filepath='/usr/include/sched.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_get_priority_min' filepath='/usr/include/sched.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_rr_get_interval' filepath='/usr/include/sched.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_setaffinity' filepath='/usr/include/sched.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-132'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sched_getaffinity' filepath='/usr/include/sched.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-153'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='killpg' filepath='/usr/include/signal.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigaddset' filepath='/usr/include/signal.h' line='205' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-52'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn' filepath='/usr/include/spawn.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-159'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-139'/> + <parameter type-id='type-id-142'/> + <parameter type-id='type-id-128'/> + <parameter type-id='type-id-128'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnp' filepath='/usr/include/spawn.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-158'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-138'/> + <parameter type-id='type-id-141'/> + <parameter type-id='type-id-127'/> + <parameter type-id='type-id-127'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_init' filepath='/usr/include/spawn.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-162'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_destroy' filepath='/usr/include/spawn.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-162'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setsigdefault' filepath='/usr/include/spawn.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-163'/> + <parameter type-id='type-id-148'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setsigmask' filepath='/usr/include/spawn.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-163'/> + <parameter type-id='type-id-148'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setflags' filepath='/usr/include/spawn.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-162'/> + <parameter type-id='type-id-78'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setpgroup' filepath='/usr/include/spawn.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-162'/> + <parameter type-id='type-id-79'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setschedpolicy' filepath='/usr/include/spawn.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-162'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawnattr_setschedparam' filepath='/usr/include/spawn.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-163'/> + <parameter type-id='type-id-145'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_init' filepath='/usr/include/spawn.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-160'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_destroy' filepath='/usr/include/spawn.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-160'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_addopen' filepath='/usr/include/spawn.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-161'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-115'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_addclose' filepath='/usr/include/spawn.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_adddup2' filepath='/usr/include/spawn.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-160'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='posix_spawn_file_actions_addclosefrom_np' filepath='/usr/include/spawn.h' line='219' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='rename' filepath='/usr/include/stdio.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='renameat' filepath='/usr/include/stdio.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='ctermid' filepath='/usr/include/stdio.h' line='837' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='atoi' filepath='/usr/include/stdlib.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='unsetenv' filepath='/usr/include/stdlib.h' line='664' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='system' filepath='/usr/include/stdlib.h' line='791' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='qsort' filepath='/usr/include/stdlib.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-86'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='posix_openpt' filepath='/usr/include/stdlib.h' line='978' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='grantpt' filepath='/usr/include/stdlib.h' line='986' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='unlockpt' filepath='/usr/include/stdlib.h' line='990' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='ptsname' filepath='/usr/include/stdlib.h' line='995' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='ptsname_r' filepath='/usr/include/stdlib.h' line='1002' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getloadavg' filepath='/usr/include/stdlib.h' line='1013' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-180'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='strtok_r' filepath='/usr/include/string.h' line='366' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-182'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='access' filepath='/usr/include/unistd.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='faccessat' filepath='/usr/include/unistd.h' line='309' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pipe' filepath='/usr/include/unistd.h' line='437' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pipe2' filepath='/usr/include/unistd.h' line='442' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='chown' filepath='/usr/include/unistd.h' line='493' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fchown' filepath='/usr/include/unistd.h' line='498' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='lchown' filepath='/usr/include/unistd.h' line='503' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fchownat' filepath='/usr/include/unistd.h' line='511' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='chdir' filepath='/usr/include/unistd.h' line='517' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fchdir' filepath='/usr/include/unistd.h' line='521' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='dup2' filepath='/usr/include/unistd.h' line='555' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='dup3' filepath='/usr/include/unistd.h' line='560' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='execve' filepath='/usr/include/unistd.h' line='572' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-127'/> + <parameter type-id='type-id-127'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fexecve' filepath='/usr/include/unistd.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-127'/> + <parameter type-id='type-id-127'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='execv' filepath='/usr/include/unistd.h' line='584' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-127'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='nice' filepath='/usr/include/unistd.h' line='619' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pathconf' filepath='/usr/include/unistd.h' line='633' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='fpathconf' filepath='/usr/include/unistd.h' line='637' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='getpgrp' filepath='/usr/include/unistd.h' line='656' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='getpgid' filepath='/usr/include/unistd.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='setpgid' filepath='/usr/include/unistd.h' line='668' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-118'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setpgrp' filepath='/usr/include/unistd.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setsid' filepath='/usr/include/unistd.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='getsid' filepath='/usr/include/unistd.h' line='693' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='getuid' filepath='/usr/include/unistd.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-116'/> + </function-decl> + <function-decl name='geteuid' filepath='/usr/include/unistd.h' line='700' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-116'/> + </function-decl> + <function-decl name='getgid' filepath='/usr/include/unistd.h' line='703' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-112'/> + </function-decl> + <function-decl name='getegid' filepath='/usr/include/unistd.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-112'/> + </function-decl> + <function-decl name='getgroups' filepath='/usr/include/unistd.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-124'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setuid' filepath='/usr/include/unistd.h' line='722' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-116'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setreuid' filepath='/usr/include/unistd.h' line='727' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-116'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='seteuid' filepath='/usr/include/unistd.h' line='732' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-116'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setgid' filepath='/usr/include/unistd.h' line='739' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setregid' filepath='/usr/include/unistd.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setegid' filepath='/usr/include/unistd.h' line='749' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getresuid' filepath='/usr/include/unistd.h' line='755' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-126'/> + <parameter type-id='type-id-126'/> + <parameter type-id='type-id-126'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getresgid' filepath='/usr/include/unistd.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-124'/> + <parameter type-id='type-id-124'/> + <parameter type-id='type-id-124'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setresuid' filepath='/usr/include/unistd.h' line='765' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-116'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setresgid' filepath='/usr/include/unistd.h' line='770' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-112'/> + <parameter type-id='type-id-112'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fork' filepath='/usr/include/unistd.h' line='778' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='ttyname_r' filepath='/usr/include/unistd.h' line='803' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='link' filepath='/usr/include/unistd.h' line='819' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='linkat' filepath='/usr/include/unistd.h' line='825' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='symlink' filepath='/usr/include/unistd.h' line='832' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='symlinkat' filepath='/usr/include/unistd.h' line='847' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='readlinkat' filepath='/usr/include/unistd.h' line='851' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='unlink' filepath='/usr/include/unistd.h' line='858' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='unlinkat' filepath='/usr/include/unistd.h' line='862' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='rmdir' filepath='/usr/include/unistd.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='tcgetpgrp' filepath='/usr/include/unistd.h' line='871' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='tcsetpgrp' filepath='/usr/include/unistd.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-118'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getlogin' filepath='/usr/include/unistd.h' line='881' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='chroot' filepath='/usr/include/unistd.h' line='977' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fsync' filepath='/usr/include/unistd.h' line='989' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sync' filepath='/usr/include/unistd.h' line='1005' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='copy_file_range' filepath='/usr/include/unistd.h' line='1142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='fdatasync' filepath='/usr/include/unistd.h' line='1150' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='login_tty' filepath='/usr/include/utmp.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='__sched_cpucount' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-132'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='__sched_cpualloc' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-153'/> + </function-decl> + <function-decl name='__sched_cpufree' filepath='/usr/include/x86_64-linux-gnu/bits/cpu-set.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-153'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='splice' filepath='/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h' line='421' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-125'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-185'/> + </function-decl> + <function-decl name='memfd_create' filepath='/usr/include/x86_64-linux-gnu/bits/mman-shared.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='unshare' filepath='/usr/include/x86_64-linux-gnu/bits/sched.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setns' filepath='/usr/include/x86_64-linux-gnu/bits/sched.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='eventfd' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-101'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='eventfd_read' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-155'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='eventfd_write' filepath='/usr/include/x86_64-linux-gnu/sys/eventfd.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-109'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getpriority' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-110'/> + <parameter type-id='type-id-119'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setpriority' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-110'/> + <parameter type-id='type-id-119'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='chmod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='352' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fchmod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fchmodat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='371' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='umask' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='380' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-114'/> + <return type-id='type-id-114'/> + </function-decl> + <function-decl name='mkdir' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='389' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mkdirat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mknod' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='404' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <parameter type-id='type-id-186'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mknodat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='411' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <parameter type-id='type-id-186'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mkfifo' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='418' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mkfifoat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='425' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-114'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='utimensat' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='433' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-175'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='futimens' filepath='/usr/include/x86_64-linux-gnu/sys/stat.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-175'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='gnu_dev_major' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-186'/> + <return type-id='type-id-101'/> + </function-decl> + <function-decl name='gnu_dev_minor' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-186'/> + <return type-id='type-id-101'/> + </function-decl> + <function-decl name='gnu_dev_makedev' filepath='/usr/include/x86_64-linux-gnu/sys/sysmacros.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-101'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-186'/> + </function-decl> + <function-decl name='timerfd_create' filepath='/usr/include/x86_64-linux-gnu/sys/timerfd.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-187'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='timerfd_settime' filepath='/usr/include/x86_64-linux-gnu/sys/timerfd.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-136'/> + <parameter type-id='type-id-157'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='timerfd_gettime' filepath='/usr/include/x86_64-linux-gnu/sys/timerfd.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-157'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='times' filepath='/usr/include/x86_64-linux-gnu/sys/times.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-167'/> + <return type-id='type-id-104'/> + </function-decl> + <function-decl name='readv' filepath='/usr/include/x86_64-linux-gnu/sys/uio.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-134'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='writev' filepath='/usr/include/x86_64-linux-gnu/sys/uio.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-134'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='uname' filepath='/usr/include/x86_64-linux-gnu/sys/utsname.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-169'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wait' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='waitpid' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='waitid' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-121'/> + <parameter type-id='type-id-102'/> + <parameter type-id='type-id-188'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wait3' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-189'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='wait4' filepath='/usr/include/x86_64-linux-gnu/sys/wait.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-189'/> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='setxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='lsetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fsetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='lgetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='fgetxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='listxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='llistxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='flistxattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='removexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='lremovexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fremovexattr' filepath='/usr/include/x86_64-linux-gnu/sys/xattr.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-190'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='./Modules/pwdmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='passwd' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/pwd.h' line='49' column='1' id='type-id-191'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pw_name' type-id='type-id-17' visibility='default' filepath='/usr/include/pwd.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pw_passwd' type-id='type-id-17' visibility='default' filepath='/usr/include/pwd.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='pw_uid' type-id='type-id-116' visibility='default' filepath='/usr/include/pwd.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='pw_gid' type-id='type-id-112' visibility='default' filepath='/usr/include/pwd.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='pw_gecos' type-id='type-id-17' visibility='default' filepath='/usr/include/pwd.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pw_dir' type-id='type-id-17' visibility='default' filepath='/usr/include/pwd.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='pw_shell' type-id='type-id-17' visibility='default' filepath='/usr/include/pwd.h' line='58' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-191' size-in-bits='64' id='type-id-192'/> + <qualified-type-def type-id='type-id-192' restrict='yes' id='type-id-193'/> + <pointer-type-def type-id='type-id-192' size-in-bits='64' id='type-id-194'/> + <qualified-type-def type-id='type-id-194' restrict='yes' id='type-id-195'/> + <function-decl name='setpwent' filepath='/usr/include/pwd.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='endpwent' filepath='/usr/include/pwd.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='getpwent' filepath='/usr/include/pwd.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-192'/> + </function-decl> + <function-decl name='getpwuid_r' filepath='/usr/include/pwd.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-116'/> + <parameter type-id='type-id-193'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-195'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getpwnam_r' filepath='/usr/include/pwd.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-193'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-195'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/signalmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <enum-decl name='__itimer_which' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='114' column='1' id='type-id-196'> + <underlying-type type-id='type-id-32'/> + <enumerator name='ITIMER_REAL' value='0'/> + <enumerator name='ITIMER_VIRTUAL' value='1'/> + <enumerator name='ITIMER_PROF' value='2'/> + </enum-decl> + <class-decl name='itimerval' size-in-bits='256' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='130' column='1' id='type-id-197'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='it_interval' type-id='type-id-198' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='it_value' type-id='type-id-198' visibility='default' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='135' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__itimer_which_t' type-id='type-id-196' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='141' column='1' id='type-id-199'/> + <qualified-type-def type-id='type-id-197' const='yes' id='type-id-200'/> + <pointer-type-def type-id='type-id-200' size-in-bits='64' id='type-id-201'/> + <qualified-type-def type-id='type-id-201' restrict='yes' id='type-id-202'/> + <qualified-type-def type-id='type-id-177' restrict='yes' id='type-id-203'/> + <pointer-type-def type-id='type-id-197' size-in-bits='64' id='type-id-204'/> + <qualified-type-def type-id='type-id-204' restrict='yes' id='type-id-205'/> + <qualified-type-def type-id='type-id-188' restrict='yes' id='type-id-206'/> + <function-decl name='_PyEval_SignalReceived' filepath='./Include/internal/pycore_ceval.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyLong_FromUid' filepath='./Modules/posixmodule.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-117'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_Sigset_Converter' filepath='./Modules/posixmodule.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySignal_SetWakeupFd' mangled-name='PySignal_SetWakeupFd' filepath='./Modules/signalmodule.c' line='833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySignal_SetWakeupFd'> + <parameter type-id='type-id-5' name='fd' filepath='./Modules/signalmodule.c' line='833' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_SetInterruptEx' mangled-name='PyErr_SetInterruptEx' filepath='./Modules/signalmodule.c' line='1888' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetInterruptEx'> + <parameter type-id='type-id-5' name='signum' filepath='./Modules/signalmodule.c' line='1888' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_SetInterrupt' mangled-name='PyErr_SetInterrupt' filepath='./Modules/signalmodule.c' line='1904' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetInterrupt'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_RestoreSignals' mangled-name='_Py_RestoreSignals' filepath='./Modules/signalmodule.c' line='1942' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_RestoreSignals'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyOS_InterruptOccurred' mangled-name='PyOS_InterruptOccurred' filepath='./Modules/signalmodule.c' line='2014' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_InterruptOccurred'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyOS_IsMainThread' mangled-name='_PyOS_IsMainThread' filepath='./Modules/signalmodule.c' line='2047' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_IsMainThread'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigismember' filepath='/usr/include/signal.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-147'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigpending' filepath='/usr/include/signal.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-52'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigwait' filepath='/usr/include/signal.h' line='255' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-148'/> + <parameter type-id='type-id-203'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigwaitinfo' filepath='/usr/include/signal.h' line='264' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-148'/> + <parameter type-id='type-id-206'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigtimedwait' filepath='/usr/include/signal.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-148'/> + <parameter type-id='type-id-206'/> + <parameter type-id='type-id-207'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='__libc_current_sigrtmin' filepath='/usr/include/signal.h' line='383' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='__libc_current_sigrtmax' filepath='/usr/include/signal.h' line='385' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='strsignal' filepath='/usr/include/string.h' line='478' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='alarm' filepath='/usr/include/unistd.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-101'/> + <return type-id='type-id-101'/> + </function-decl> + <function-decl name='pause' filepath='/usr/include/unistd.h' line='489' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_kill' filepath='/usr/include/x86_64-linux-gnu/bits/sigthread.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-208'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getitimer' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-199'/> + <parameter type-id='type-id-204'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setitimer' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-199'/> + <parameter type-id='type-id-202'/> + <parameter type-id='type-id-205'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/symtablemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_SymtableStringObjectFlags' filepath='./Include/internal/pycore_symtable.h' line='190' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-210'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Modules/timemodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyTimeFraction' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-211' visibility='default' filepath='./Include/internal/pycore_time.h' line='310' column='1' id='type-id-212'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='numer' type-id='type-id-213' visibility='default' filepath='./Include/internal/pycore_time.h' line='311' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='denom' type-id='type-id-213' visibility='default' filepath='./Include/internal/pycore_time.h' line='312' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyTimeFraction' type-id='type-id-212' filepath='./Include/internal/pycore_time.h' line='313' column='1' id='type-id-211'/> + <pointer-type-def type-id='type-id-211' size-in-bits='64' id='type-id-214'/> + <pointer-type-def type-id='type-id-187' size-in-bits='64' id='type-id-215'/> + <qualified-type-def type-id='type-id-211' const='yes' id='type-id-216'/> + <pointer-type-def type-id='type-id-216' size-in-bits='64' id='type-id-217'/> + <qualified-type-def type-id='type-id-218' const='yes' id='type-id-219'/> + <pointer-type-def type-id='type-id-219' size-in-bits='64' id='type-id-220'/> + <qualified-type-def type-id='type-id-220' restrict='yes' id='type-id-221'/> + <function-decl name='_PyTime_FromTimeval' filepath='./Include/internal/pycore_time.h' line='191' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-174'/> + <parameter type-id='type-id-222'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_TimeWithInfo' filepath='./Include/internal/pycore_time.h' line='255' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-174'/> + <parameter type-id='type-id-223'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_PerfCounterWithInfo' filepath='./Include/internal/pycore_time.h' line='290' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-174'/> + <parameter type-id='type-id-223'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTimeFraction_Set' filepath='./Include/internal/pycore_time.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-214'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-213'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTimeFraction_Mul' filepath='./Include/internal/pycore_time.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-217'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='_PyTimeFraction_Resolution' filepath='./Include/internal/pycore_time.h' line='330' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-217'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='pthread_getcpuclockid' filepath='/usr/include/pthread.h' line='1315' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-208'/> + <parameter type-id='type-id-215'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='clock' filepath='/usr/include/time.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-104'/> + </function-decl> + <function-decl name='time' filepath='/usr/include/time.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-224'/> + <return type-id='type-id-225'/> + </function-decl> + <function-decl name='mktime' filepath='/usr/include/time.h' line='83' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-226'/> + <return type-id='type-id-225'/> + </function-decl> + <function-decl name='tzset' filepath='/usr/include/time.h' line='228' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='clock_settime' filepath='/usr/include/time.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-227'/> + <parameter type-id='type-id-175'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='clock_nanosleep' filepath='/usr/include/time.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-227'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-175'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='852' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-221'/> + <return type-id='type-id-21'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Python/dynload_shlib.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='256' id='type-id-228'> + <subrange length='4' type-id='type-id-2' id='type-id-229'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='infinite' id='type-id-230'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <var-decl name='_PyImport_DynLoadFiletab' type-id='type-id-230' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='15' column='1'/> + <function-decl name='dlopen' filepath='/usr/include/dlfcn.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='dlsym' filepath='/usr/include/dlfcn.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-232'/> + <parameter type-id='type-id-179'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='dlerror' filepath='/usr/include/dlfcn.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-17'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Python/getplatform.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='Py_GetPlatform' mangled-name='Py_GetPlatform' filepath='./Python/getplatform.c' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPlatform'> + <return type-id='type-id-6'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='./Python/importdl.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='dl_funcptr' type-id='type-id-233' filepath='./Include/internal/pycore_importdl.h' line='128' column='1' id='type-id-234'/> + <function-decl name='_PyImport_SwapPackageContext' filepath='./Include/internal/pycore_import.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_PyImport_FindSharedFuncptr' filepath='./Python/importdl.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-56'/> + <return type-id='type-id-234'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-235'> + <return type-id='type-id-3'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='./Python/sysmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyEval_SetSwitchInterval' filepath='./Include/internal/pycore_ceval.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-2'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_GetSwitchInterval' filepath='./Include/internal/pycore_ceval.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='_PyEval_CallTracing' filepath='./Include/internal/pycore_ceval.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_GetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_GetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_SetAsyncGenFirstiter' filepath='./Include/internal/pycore_ceval.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_SetAsyncGenFinalizer' filepath='./Include/internal/pycore_ceval.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_GetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_SetCoroutineOriginTrackingDepth' filepath='./Include/internal/pycore_ceval.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_GetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-236'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyIsPerfTrampolineActive' filepath='./Include/internal/pycore_ceval.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_GetItemWithError' filepath='./Include/internal/pycore_dict.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_GetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_SetDLOpenFlags' filepath='./Include/internal/pycore_import.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_InitModules' filepath='./Include/internal/pycore_import.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_GetBuiltinModuleNames' filepath='./Include/internal/pycore_import.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyWideStringList_AsList' filepath='./Include/internal/pycore_initconfig.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-237'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_DebugTypeStats' filepath='./Include/internal/pycore_object.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_GetGlobalAllocatedBlocks' filepath='./Include/internal/pycore_obmalloc.h' line='684' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyPathConfig_ComputeSysPath0' filepath='./Include/internal/pycore_pathconfig.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-237'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_StackItemToExcInfoTuple' filepath='./Include/internal/pycore_pyerrors.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-239'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_GetStdlibDir' filepath='./Include/internal/pycore_pylifecycle.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_PyErr_WriteUnraisableDefaultHook' filepath='./Include/internal/pycore_pylifecycle.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_gitidentifier' filepath='./Include/internal/pycore_pylifecycle.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_Py_gitversion' filepath='./Include/internal/pycore_pylifecycle.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_PyThread_CurrentExceptions' filepath='./Include/internal/pycore_pystate.h' line='238' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_InternedSize' filepath='./Include/internal/pycore_unicodeobject.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyUnicode_InternedSize_Immortal' filepath='./Include/internal/pycore_unicodeobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyThread_GetInfo' mangled-name='PyThread_GetInfo' filepath='./Include/pythread.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_GetInfo'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySys_AuditTuple' mangled-name='PySys_AuditTuple' filepath='./Python/sysmodule.c' line='340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AuditTuple'> + <parameter type-id='type-id-6' name='event' filepath='./Python/sysmodule.c' line='340' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='./Python/sysmodule.c' line='340' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySys_AddAuditHook' mangled-name='PySys_AddAuditHook' filepath='./Python/sysmodule.c' line='415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddAuditHook'> + <parameter type-id='type-id-240' name='hook' filepath='./Python/sysmodule.c' line='415' column='1'/> + <parameter type-id='type-id-30' name='userData' filepath='./Python/sysmodule.c' line='415' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySys_GetSizeOf' mangled-name='_PySys_GetSizeOf' filepath='./Python/sysmodule.c' line='1872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetSizeOf'> + <parameter type-id='type-id-4' name='o' filepath='./Python/sysmodule.c' line='1872' column='1'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='PyUnstable_PerfMapState_Init' mangled-name='PyUnstable_PerfMapState_Init' filepath='./Python/sysmodule.c' line='2451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Init'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_WritePerfMapEntry' mangled-name='PyUnstable_WritePerfMapEntry' filepath='./Python/sysmodule.c' line='2482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_WritePerfMapEntry'> + <parameter type-id='type-id-30' name='code_addr' filepath='./Python/sysmodule.c' line='2483' column='1'/> + <parameter type-id='type-id-101' name='code_size' filepath='./Python/sysmodule.c' line='2484' column='1'/> + <parameter type-id='type-id-6' name='entry_name' filepath='./Python/sysmodule.c' line='2485' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_PerfMapState_Fini' mangled-name='PyUnstable_PerfMapState_Fini' filepath='./Python/sysmodule.c' line='2502' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfMapState_Fini'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnstable_CopyPerfMapFile' mangled-name='PyUnstable_CopyPerfMapFile' filepath='./Python/sysmodule.c' line='2517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_CopyPerfMapFile'> + <parameter type-id='type-id-6' name='parent_filename' filepath='./Python/sysmodule.c' line='2517' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySys_ResetWarnOptions' mangled-name='PySys_ResetWarnOptions' filepath='./Python/sysmodule.c' line='2827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_ResetWarnOptions'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_AddWarnOptionUnicode' mangled-name='PySys_AddWarnOptionUnicode' filepath='./Python/sysmodule.c' line='2856' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOptionUnicode'> + <parameter type-id='type-id-4' name='option' filepath='./Python/sysmodule.c' line='2856' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_AddWarnOption' mangled-name='PySys_AddWarnOption' filepath='./Python/sysmodule.c' line='2869' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddWarnOption'> + <parameter type-id='type-id-18' name='s' filepath='./Python/sysmodule.c' line='2869' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_HasWarnOptions' mangled-name='PySys_HasWarnOptions' filepath='./Python/sysmodule.c' line='2889' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_HasWarnOptions'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySys_AddXOption' mangled-name='PySys_AddXOption' filepath='./Python/sysmodule.c' line='2969' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_AddXOption'> + <parameter type-id='type-id-18' name='s' filepath='./Python/sysmodule.c' line='2969' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_GetXOptions' mangled-name='PySys_GetXOptions' filepath='./Python/sysmodule.c' line='2983' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetXOptions'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_CreateMonitoringObject' filepath='./Python/sysmodule.c' line='3774' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySys_SetPath' mangled-name='PySys_SetPath' filepath='./Python/sysmodule.c' line='3900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetPath'> + <parameter type-id='type-id-18' name='path' filepath='./Python/sysmodule.c' line='3900' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_SetArgvEx' mangled-name='PySys_SetArgvEx' filepath='./Python/sysmodule.c' line='3932' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetArgvEx'> + <parameter type-id='type-id-5' name='argc' filepath='./Python/sysmodule.c' line='3932' column='1'/> + <parameter type-id='type-id-241' name='argv' filepath='./Python/sysmodule.c' line='3932' column='1'/> + <parameter type-id='type-id-5' name='updatepath' filepath='./Python/sysmodule.c' line='3932' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_SetArgv' mangled-name='PySys_SetArgv' filepath='./Python/sysmodule.c' line='3976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetArgv'> + <parameter type-id='type-id-5' name='argc' filepath='./Python/sysmodule.c' line='3976' column='1'/> + <parameter type-id='type-id-241' name='argv' filepath='./Python/sysmodule.c' line='3976' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_WriteStdout' mangled-name='PySys_WriteStdout' filepath='./Python/sysmodule.c' line='4071' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStdout'> + <parameter type-id='type-id-6' name='format' filepath='./Python/sysmodule.c' line='4071' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_FormatStdout' mangled-name='PySys_FormatStdout' filepath='./Python/sysmodule.c' line='4113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStdout'> + <parameter type-id='type-id-6' name='format' filepath='./Python/sysmodule.c' line='4113' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='getpid' filepath='/usr/include/unistd.h' line='650' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-118'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Modules/config.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyInit_atexit' mangled-name='PyInit_atexit' filepath='Modules/config.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_atexit'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_faulthandler' mangled-name='PyInit_faulthandler' filepath='Modules/config.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_faulthandler'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_posix' mangled-name='PyInit_posix' filepath='Modules/config.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_posix'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__signal' mangled-name='PyInit__signal' filepath='Modules/config.c' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__signal'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__tracemalloc' mangled-name='PyInit__tracemalloc' filepath='Modules/config.c' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__tracemalloc'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__suggestions' mangled-name='PyInit__suggestions' filepath='Modules/config.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__suggestions'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__codecs' mangled-name='PyInit__codecs' filepath='Modules/config.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__codecs'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__collections' mangled-name='PyInit__collections' filepath='Modules/config.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__collections'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_errno' mangled-name='PyInit_errno' filepath='Modules/config.c' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_errno'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__io' mangled-name='PyInit__io' filepath='Modules/config.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__io'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_itertools' mangled-name='PyInit_itertools' filepath='Modules/config.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_itertools'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__sre' mangled-name='PyInit__sre' filepath='Modules/config.c' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sre'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__sysconfig' mangled-name='PyInit__sysconfig' filepath='Modules/config.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__sysconfig'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__thread' mangled-name='PyInit__thread' filepath='Modules/config.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__thread'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_time' mangled-name='PyInit_time' filepath='Modules/config.c' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_time'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__typing' mangled-name='PyInit__typing' filepath='Modules/config.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__typing'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__weakref' mangled-name='PyInit__weakref' filepath='Modules/config.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__weakref'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__abc' mangled-name='PyInit__abc' filepath='Modules/config.c' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__abc'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__functools' mangled-name='PyInit__functools' filepath='Modules/config.c' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__functools'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__locale' mangled-name='PyInit__locale' filepath='Modules/config.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__locale'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__operator' mangled-name='PyInit__operator' filepath='Modules/config.c' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__operator'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__stat' mangled-name='PyInit__stat' filepath='Modules/config.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__stat'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__symtable' mangled-name='PyInit__symtable' filepath='Modules/config.c' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__symtable'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_pwd' mangled-name='PyInit_pwd' filepath='Modules/config.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_pwd'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit_gc' mangled-name='PyInit_gc' filepath='Modules/config.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit_gc'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Modules/gcmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <enum-decl name='_PyGC_Reason' naming-typedef-id='type-id-242' filepath='./Include/internal/pycore_gc.h' line='161' column='1' id='type-id-243'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_GC_REASON_HEAP' value='0'/> + <enumerator name='_Py_GC_REASON_SHUTDOWN' value='1'/> + <enumerator name='_Py_GC_REASON_MANUAL' value='2'/> + </enum-decl> + <typedef-decl name='_PyGC_Reason' type-id='type-id-243' filepath='./Include/internal/pycore_gc.h' line='170' column='1' id='type-id-242'/> + <function-decl name='_PyGC_Collect' filepath='./Include/internal/pycore_gc.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-242'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyGC_Freeze' filepath='./Include/internal/pycore_gc.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_Unfreeze' filepath='./Include/internal/pycore_gc.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_GetFreezeCount' filepath='./Include/internal/pycore_gc.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyGC_GetObjects' filepath='./Include/internal/pycore_gc.h' line='349' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyGC_GetReferrers' filepath='./Include/internal/pycore_gc.h' line='350' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Modules/main.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-244' const='yes' id='type-id-245'/> + <pointer-type-def type-id='type-id-245' size-in-bits='64' id='type-id-246'/> + <function-decl name='_PyImport_Fini2' filepath='./Include/internal/pycore_import.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_ClearArgcArgv' filepath='./Include/internal/pycore_initconfig.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_PreInitializeFromPyArgv' filepath='./Include/internal/pycore_pylifecycle.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-247'/> + <parameter type-id='type-id-246'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_HandleSystemExit' filepath='./Include/internal/pycore_pylifecycle.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-177'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRun_SimpleStringFlagsWithName' filepath='./Include/internal/pycore_pylifecycle.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRun_SimpleFileObject' filepath='./Include/internal/pycore_pythonrun.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRun_AnyFileObject' filepath='./Include/internal/pycore_pythonrun.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRuntime_Finalize' filepath='./Include/internal/pycore_runtime.h' line='380' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='kill' filepath='/usr/include/signal.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-118'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_RunMain' mangled-name='Py_RunMain' filepath='Modules/main.c' line='771' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_RunMain'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_Main' mangled-name='Py_Main' filepath='Modules/main.c' line='810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Main'> + <parameter type-id='type-id-5' name='argc' filepath='Modules/main.c' line='810' column='1'/> + <parameter type-id='type-id-241' name='argv' filepath='Modules/main.c' line='810' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_BytesMain' mangled-name='Py_BytesMain' filepath='Modules/main.c' line='822' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_BytesMain'> + <parameter type-id='type-id-5' name='argc' filepath='Modules/main.c' line='822' column='1'/> + <parameter type-id='type-id-248' name='argv' filepath='Modules/main.c' line='822' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/abstract.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='_Py_simple_func' type-id='type-id-249' filepath='./Include/internal/pycore_crossinterp.h' line='26' column='1' id='type-id-250'/> + <pointer-type-def type-id='type-id-251' size-in-bits='64' id='type-id-252'/> + <qualified-type-def type-id='type-id-253' const='yes' id='type-id-254'/> + <pointer-type-def type-id='type-id-254' size-in-bits='64' id='type-id-255'/> + <qualified-type-def type-id='type-id-7' const='yes' id='type-id-256'/> + <pointer-type-def type-id='type-id-256' size-in-bits='64' id='type-id-257'/> + <function-decl name='PyObject_CallFunctionObjArgs' mangled-name='PyObject_CallFunctionObjArgs' filepath='./Include/abstract.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFunctionObjArgs'> + <parameter type-id='type-id-4'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_VectorcallMethod' mangled-name='PyObject_VectorcallMethod' filepath='./Include/abstract.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VectorcallMethod'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_CallOneArg' mangled-name='PyObject_CallOneArg' filepath='./Include/cpython/abstract.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallOneArg'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_Copy' mangled-name='_PyLong_Copy' filepath='./Include/cpython/longintrepr.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Copy'> + <parameter type-id='type-id-252'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromUnicodeObject' mangled-name='PyLong_FromUnicodeObject' filepath='./Include/cpython/longobject.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnicodeObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_FormatUnraisable' mangled-name='PyErr_FormatUnraisable' filepath='./Include/cpython/pyerrors.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_FormatUnraisable'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTuple_Resize' mangled-name='_PyTuple_Resize' filepath='./Include/cpython/tupleobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_Resize'> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_New' mangled-name='PyUnicode_New' filepath='./Include/cpython/unicodeobject.h' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_New'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-259'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_Keys' mangled-name='PyDict_Keys' filepath='./Include/dictobject.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Keys'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_Values' mangled-name='PyDict_Values' filepath='./Include/dictobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Values'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_Items' mangled-name='PyDict_Items' filepath='./Include/dictobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Items'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_GetItemRef' mangled-name='PyDict_GetItemRef' filepath='./Include/dictobject.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemRef'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFloat_FromString' mangled-name='PyFloat_FromString' filepath='./Include/floatobject.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_FromString'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_GenericAlias' mangled-name='Py_GenericAlias' filepath='./Include/genericaliasobject.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GenericAlias'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_CheckRecursiveCall' mangled-name='_Py_CheckRecursiveCall' filepath='./Include/internal/pycore_ceval.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckRecursiveCall'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_CallInInterpreter' filepath='./Include/internal/pycore_crossinterp.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-250'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_CallInInterpreterAndRawFree' filepath='./Include/internal/pycore_crossinterp.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-250'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyGen_FetchStopIterationValue' mangled-name='_PyGen_FetchStopIterationValue' filepath='./Include/internal/pycore_genobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_FetchStopIterationValue'> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyList_Extend' mangled-name='_PyList_Extend' filepath='./Include/internal/pycore_list.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_Extend'> + <parameter type-id='type-id-260'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_FromBytes' filepath='./Include/internal/pycore_long.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_Format' mangled-name='_PyLong_Format' filepath='./Include/internal/pycore_long.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Format'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_LookupSpecial' mangled-name='_PyObject_LookupSpecial' filepath='./Include/internal/pycore_object.h' line='748' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_LookupSpecial'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_NextNotImplemented' filepath='./Include/internal/pycore_object.h' line='753' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_ExceptionMatches' mangled-name='_PyErr_ExceptionMatches' filepath='./Include/internal/pycore_pyerrors.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ExceptionMatches'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_Clear' mangled-name='_PyErr_Clear' filepath='./Include/internal/pycore_pyerrors.h' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Clear'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_SetString' mangled-name='_PyErr_SetString' filepath='./Include/internal/pycore_pyerrors.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetString'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_Format' mangled-name='_PyErr_Format' filepath='./Include/internal/pycore_pyerrors.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_Format'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_union_args' filepath='./Include/internal/pycore_unionobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySeqIter_New' mangled-name='PySeqIter_New' filepath='./Include/iterobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySeqIter_New'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_New' mangled-name='PyList_New' filepath='./Include/listobject.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_New'> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_AsTuple' mangled-name='PyList_AsTuple' filepath='./Include/listobject.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_AsTuple'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromSsize_t' mangled-name='PyLong_FromSsize_t' filepath='./Include/longobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromSsize_t'> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_AsSsize_t' mangled-name='PyLong_AsSsize_t' filepath='./Include/longobject.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsSsize_t'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyLong_AsDouble' mangled-name='PyLong_AsDouble' filepath='./Include/longobject.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsDouble'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyType_IsSubtype' mangled-name='PyType_IsSubtype' filepath='./Include/object.h' line='539' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_IsSubtype'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_RichCompareBool' mangled-name='PyObject_RichCompareBool' filepath='./Include/object.h' line='567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_RichCompareBool'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GetOptionalAttr' mangled-name='PyObject_GetOptionalAttr' filepath='./Include/object.h' line='574' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetOptionalAttr'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_IsTrue' mangled-name='PyObject_IsTrue' filepath='./Include/object.h' line='592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsTrue'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_GivenExceptionMatches' mangled-name='PyErr_GivenExceptionMatches' filepath='./Include/pyerrors.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GivenExceptionMatches'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySlice_FromIndices' mangled-name='_PySlice_FromIndices' filepath='./Include/sliceobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySlice_FromIndices'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyTuple_New' mangled-name='PyTuple_New' filepath='./Include/tupleobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_New'> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_WarnEx' mangled-name='PyErr_WarnEx' filepath='./Include/warnings.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnEx'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_WarnFormat' mangled-name='PyErr_WarnFormat' filepath='./Include/warnings.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnFormat'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_Type' mangled-name='PyObject_Type' filepath='Objects/abstract.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Type'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='41' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Size' mangled-name='PyObject_Size' filepath='Objects/abstract.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Size'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='54' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyObject_Length' mangled-name='PyObject_Length' filepath='Objects/abstract.c' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Length'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='73' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyObject_LengthHint' mangled-name='PyObject_LengthHint' filepath='Objects/abstract.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_LengthHint'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='92' column='1'/> + <parameter type-id='type-id-7' name='defaultvalue' filepath='Objects/abstract.c' line='92' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyObject_GetItem' mangled-name='PyObject_GetItem' filepath='Objects/abstract.c' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItem'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='150' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='150' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMapping_GetOptionalItem' mangled-name='PyMapping_GetOptionalItem' filepath='Objects/abstract.c' line='204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_GetOptionalItem'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='204' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='204' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/abstract.c' line='204' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_SetItem' mangled-name='PyObject_SetItem' filepath='Objects/abstract.c' line='223' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetItem'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='223' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='223' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/abstract.c' line='223' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_DelItem' mangled-name='PyObject_DelItem' filepath='Objects/abstract.c' line='257' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelItem'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='257' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='257' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_DelItemString' mangled-name='PyObject_DelItemString' filepath='Objects/abstract.c' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelItemString'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='291' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='291' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_CheckBuffer' mangled-name='PyObject_CheckBuffer' filepath='Objects/abstract.c' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CheckBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='311' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_CheckReadBuffer' mangled-name='PyObject_CheckReadBuffer' filepath='Objects/abstract.c' line='328' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CheckReadBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='328' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_AsCharBuffer' mangled-name='PyObject_AsCharBuffer' filepath='Objects/abstract.c' line='369' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsCharBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='369' column='1'/> + <parameter type-id='type-id-261' name='buffer' filepath='Objects/abstract.c' line='370' column='1'/> + <parameter type-id='type-id-8' name='buffer_len' filepath='Objects/abstract.c' line='371' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_AsReadBuffer' mangled-name='PyObject_AsReadBuffer' filepath='Objects/abstract.c' line='383' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsReadBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='383' column='1'/> + <parameter type-id='type-id-262' name='buffer' filepath='Objects/abstract.c' line='384' column='1'/> + <parameter type-id='type-id-8' name='buffer_len' filepath='Objects/abstract.c' line='385' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_AsWriteBuffer' mangled-name='PyObject_AsWriteBuffer' filepath='Objects/abstract.c' line='397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsWriteBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='397' column='1'/> + <parameter type-id='type-id-262' name='buffer' filepath='Objects/abstract.c' line='398' column='1'/> + <parameter type-id='type-id-8' name='buffer_len' filepath='Objects/abstract.c' line='399' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GetBuffer' mangled-name='PyObject_GetBuffer' filepath='Objects/abstract.c' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='426' column='1'/> + <parameter type-id='type-id-263' name='view' filepath='Objects/abstract.c' line='426' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/abstract.c' line='426' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyBuffer_IsContiguous' mangled-name='PyBuffer_IsContiguous' filepath='Objects/abstract.c' line='515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_IsContiguous'> + <parameter type-id='type-id-255' name='view' filepath='Objects/abstract.c' line='515' column='1'/> + <parameter type-id='type-id-53' name='order' filepath='Objects/abstract.c' line='515' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyBuffer_GetPointer' mangled-name='PyBuffer_GetPointer' filepath='Objects/abstract.c' line='531' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_GetPointer'> + <parameter type-id='type-id-255' name='view' filepath='Objects/abstract.c' line='531' column='1'/> + <parameter type-id='type-id-257' name='indices' filepath='Objects/abstract.c' line='531' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyBuffer_SizeFromFormat' mangled-name='PyBuffer_SizeFromFormat' filepath='Objects/abstract.c' line='579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_SizeFromFormat'> + <parameter type-id='type-id-6' name='format' filepath='Objects/abstract.c' line='579' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyBuffer_FromContiguous' mangled-name='PyBuffer_FromContiguous' filepath='Objects/abstract.c' line='614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FromContiguous'> + <parameter type-id='type-id-255' name='view' filepath='Objects/abstract.c' line='614' column='1'/> + <parameter type-id='type-id-30' name='buf' filepath='Objects/abstract.c' line='614' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/abstract.c' line='614' column='1'/> + <parameter type-id='type-id-53' name='fort' filepath='Objects/abstract.c' line='614' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_CopyData' mangled-name='PyObject_CopyData' filepath='Objects/abstract.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CopyData'> + <parameter type-id='type-id-4' name='dest' filepath='Objects/abstract.c' line='666' column='1'/> + <parameter type-id='type-id-4' name='src' filepath='Objects/abstract.c' line='666' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyBuffer_FillContiguousStrides' mangled-name='PyBuffer_FillContiguousStrides' filepath='Objects/abstract.c' line='737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FillContiguousStrides'> + <parameter type-id='type-id-5' name='nd' filepath='Objects/abstract.c' line='737' column='1'/> + <parameter type-id='type-id-8' name='shape' filepath='Objects/abstract.c' line='737' column='1'/> + <parameter type-id='type-id-8' name='strides' filepath='Objects/abstract.c' line='738' column='1'/> + <parameter type-id='type-id-5' name='itemsize' filepath='Objects/abstract.c' line='738' column='1'/> + <parameter type-id='type-id-53' name='fort' filepath='Objects/abstract.c' line='739' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyBuffer_FillInfo' mangled-name='PyBuffer_FillInfo' filepath='Objects/abstract.c' line='761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_FillInfo'> + <parameter type-id='type-id-263' name='view' filepath='Objects/abstract.c' line='761' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='761' column='1'/> + <parameter type-id='type-id-30' name='buf' filepath='Objects/abstract.c' line='761' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/abstract.c' line='761' column='1'/> + <parameter type-id='type-id-5' name='readonly' filepath='Objects/abstract.c' line='762' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/abstract.c' line='762' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyBuffer_Release' mangled-name='PyBuffer_Release' filepath='Objects/abstract.c' line='804' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_Release'> + <parameter type-id='type-id-263' name='view' filepath='Objects/abstract.c' line='804' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyBuffer_ReleaseInInterpreter' mangled-name='_PyBuffer_ReleaseInInterpreter' filepath='Objects/abstract.c' line='826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBuffer_ReleaseInInterpreter'> + <parameter type-id='type-id-28' name='interp' filepath='Objects/abstract.c' line='826' column='1'/> + <parameter type-id='type-id-263' name='view' filepath='Objects/abstract.c' line='827' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyBuffer_ReleaseInInterpreterAndRawFree' mangled-name='_PyBuffer_ReleaseInInterpreterAndRawFree' filepath='Objects/abstract.c' line='833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBuffer_ReleaseInInterpreterAndRawFree'> + <parameter type-id='type-id-28' name='interp' filepath='Objects/abstract.c' line='833' column='1'/> + <parameter type-id='type-id-263' name='view' filepath='Objects/abstract.c' line='834' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_Format' mangled-name='PyObject_Format' filepath='Objects/abstract.c' line='840' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Format'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='840' column='1'/> + <parameter type-id='type-id-4' name='format_spec' filepath='Objects/abstract.c' line='840' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Check' mangled-name='PyNumber_Check' filepath='Objects/abstract.c' line='900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Check'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='900' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyNumber_Or' mangled-name='PyNumber_Or' filepath='Objects/abstract.c' line='1130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Or'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1130' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1130' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Xor' mangled-name='PyNumber_Xor' filepath='Objects/abstract.c' line='1131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Xor'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1131' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1131' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_And' mangled-name='PyNumber_And' filepath='Objects/abstract.c' line='1132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_And'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1132' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1132' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Lshift' mangled-name='PyNumber_Lshift' filepath='Objects/abstract.c' line='1133' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Lshift'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1133' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1133' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Rshift' mangled-name='PyNumber_Rshift' filepath='Objects/abstract.c' line='1134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Rshift'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1134' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1134' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Subtract' mangled-name='PyNumber_Subtract' filepath='Objects/abstract.c' line='1135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Subtract'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1135' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1135' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Divmod' mangled-name='PyNumber_Divmod' filepath='Objects/abstract.c' line='1136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Divmod'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1136' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1136' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Add' mangled-name='PyNumber_Add' filepath='Objects/abstract.c' line='1139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Add'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1139' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1139' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Multiply' mangled-name='PyNumber_Multiply' filepath='Objects/abstract.c' line='1177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Multiply'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1177' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1177' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_MatrixMultiply' mangled-name='PyNumber_MatrixMultiply' filepath='Objects/abstract.c' line='1195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_MatrixMultiply'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1195' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1195' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_FloorDivide' mangled-name='PyNumber_FloorDivide' filepath='Objects/abstract.c' line='1196' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_FloorDivide'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1196' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1196' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_TrueDivide' mangled-name='PyNumber_TrueDivide' filepath='Objects/abstract.c' line='1197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_TrueDivide'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1197' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1197' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Remainder' mangled-name='PyNumber_Remainder' filepath='Objects/abstract.c' line='1198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Remainder'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1198' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1198' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Power' mangled-name='PyNumber_Power' filepath='Objects/abstract.c' line='1201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Power'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1201' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1201' column='1'/> + <parameter type-id='type-id-4' name='z' filepath='Objects/abstract.c' line='1201' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceOr' mangled-name='PyNumber_InPlaceOr' filepath='Objects/abstract.c' line='1296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceOr'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1296' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1296' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceXor' mangled-name='PyNumber_InPlaceXor' filepath='Objects/abstract.c' line='1297' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceXor'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1297' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1297' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceAnd' mangled-name='PyNumber_InPlaceAnd' filepath='Objects/abstract.c' line='1298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceAnd'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1298' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1298' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceLshift' mangled-name='PyNumber_InPlaceLshift' filepath='Objects/abstract.c' line='1299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceLshift'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1299' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1299' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceRshift' mangled-name='PyNumber_InPlaceRshift' filepath='Objects/abstract.c' line='1300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceRshift'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1300' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1300' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceSubtract' mangled-name='PyNumber_InPlaceSubtract' filepath='Objects/abstract.c' line='1301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceSubtract'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1301' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1301' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceMatrixMultiply' mangled-name='PyNumber_InPlaceMatrixMultiply' filepath='Objects/abstract.c' line='1302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceMatrixMultiply'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1302' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1302' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceFloorDivide' mangled-name='PyNumber_InPlaceFloorDivide' filepath='Objects/abstract.c' line='1303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceFloorDivide'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1303' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1303' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceTrueDivide' mangled-name='PyNumber_InPlaceTrueDivide' filepath='Objects/abstract.c' line='1304' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceTrueDivide'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1304' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1304' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceRemainder' mangled-name='PyNumber_InPlaceRemainder' filepath='Objects/abstract.c' line='1305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceRemainder'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1305' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1305' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceAdd' mangled-name='PyNumber_InPlaceAdd' filepath='Objects/abstract.c' line='1308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceAdd'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1308' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1308' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlaceMultiply' mangled-name='PyNumber_InPlaceMultiply' filepath='Objects/abstract.c' line='1331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlaceMultiply'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1331' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1331' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_InPlacePower' mangled-name='PyNumber_InPlacePower' filepath='Objects/abstract.c' line='1360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_InPlacePower'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='1360' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='1360' column='1'/> + <parameter type-id='type-id-4' name='z' filepath='Objects/abstract.c' line='1360' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Negative' mangled-name='PyNumber_Negative' filepath='Objects/abstract.c' line='1392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Negative'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1392' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Positive' mangled-name='PyNumber_Positive' filepath='Objects/abstract.c' line='1393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Positive'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1393' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Invert' mangled-name='PyNumber_Invert' filepath='Objects/abstract.c' line='1394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Invert'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1394' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Absolute' mangled-name='PyNumber_Absolute' filepath='Objects/abstract.c' line='1395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Absolute'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1395' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyIndex_Check' mangled-name='PyIndex_Check' filepath='Objects/abstract.c' line='1399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIndex_Check'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='1399' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyNumber_Index' mangled-name='_PyNumber_Index' filepath='Objects/abstract.c' line='1411' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyNumber_Index'> + <parameter type-id='type-id-4' name='item' filepath='Objects/abstract.c' line='1411' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Index' mangled-name='PyNumber_Index' filepath='Objects/abstract.c' line='1457' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Index'> + <parameter type-id='type-id-4' name='item' filepath='Objects/abstract.c' line='1457' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_AsSsize_t' mangled-name='PyNumber_AsSsize_t' filepath='Objects/abstract.c' line='1469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_AsSsize_t'> + <parameter type-id='type-id-4' name='item' filepath='Objects/abstract.c' line='1469' column='1'/> + <parameter type-id='type-id-4' name='err' filepath='Objects/abstract.c' line='1469' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyNumber_Long' mangled-name='PyNumber_Long' filepath='Objects/abstract.c' line='1520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Long'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1520' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_Float' mangled-name='PyNumber_Float' filepath='Objects/abstract.c' line='1635' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_Float'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1635' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyNumber_ToBase' mangled-name='PyNumber_ToBase' filepath='Objects/abstract.c' line='1696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyNumber_ToBase'> + <parameter type-id='type-id-4' name='n' filepath='Objects/abstract.c' line='1696' column='1'/> + <parameter type-id='type-id-5' name='base' filepath='Objects/abstract.c' line='1696' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_Check' mangled-name='PySequence_Check' filepath='Objects/abstract.c' line='1715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Check'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1715' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_Size' mangled-name='PySequence_Size' filepath='Objects/abstract.c' line='1724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Size'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1724' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PySequence_Length' mangled-name='PySequence_Length' filepath='Objects/abstract.c' line='1748' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Length'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1748' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PySequence_Concat' mangled-name='PySequence_Concat' filepath='Objects/abstract.c' line='1755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Concat'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1755' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1755' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_Repeat' mangled-name='PySequence_Repeat' filepath='Objects/abstract.c' line='1781' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Repeat'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1781' column='1'/> + <parameter type-id='type-id-7' name='count' filepath='Objects/abstract.c' line='1781' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_InPlaceConcat' mangled-name='PySequence_InPlaceConcat' filepath='Objects/abstract.c' line='1812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_InPlaceConcat'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1812' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1812' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_InPlaceRepeat' mangled-name='PySequence_InPlaceRepeat' filepath='Objects/abstract.c' line='1841' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_InPlaceRepeat'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1841' column='1'/> + <parameter type-id='type-id-7' name='count' filepath='Objects/abstract.c' line='1841' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_GetItem' mangled-name='PySequence_GetItem' filepath='Objects/abstract.c' line='1875' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_GetItem'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1875' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/abstract.c' line='1875' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_GetSlice' mangled-name='PySequence_GetSlice' filepath='Objects/abstract.c' line='1905' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_GetSlice'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1905' column='1'/> + <parameter type-id='type-id-7' name='i1' filepath='Objects/abstract.c' line='1905' column='1'/> + <parameter type-id='type-id-7' name='i2' filepath='Objects/abstract.c' line='1905' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_SetItem' mangled-name='PySequence_SetItem' filepath='Objects/abstract.c' line='1927' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_SetItem'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1927' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/abstract.c' line='1927' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1927' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_DelItem' mangled-name='PySequence_DelItem' filepath='Objects/abstract.c' line='1960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_DelItem'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1960' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/abstract.c' line='1960' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_SetSlice' mangled-name='PySequence_SetSlice' filepath='Objects/abstract.c' line='1993' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_SetSlice'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='1993' column='1'/> + <parameter type-id='type-id-7' name='i1' filepath='Objects/abstract.c' line='1993' column='1'/> + <parameter type-id='type-id-7' name='i2' filepath='Objects/abstract.c' line='1993' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='1993' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_DelSlice' mangled-name='PySequence_DelSlice' filepath='Objects/abstract.c' line='2016' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_DelSlice'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='2016' column='1'/> + <parameter type-id='type-id-7' name='i1' filepath='Objects/abstract.c' line='2016' column='1'/> + <parameter type-id='type-id-7' name='i2' filepath='Objects/abstract.c' line='2016' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_Tuple' mangled-name='PySequence_Tuple' filepath='Objects/abstract.c' line='2039' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Tuple'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='2039' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_List' mangled-name='PySequence_List' filepath='Objects/abstract.c' line='2122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_List'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='2122' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_Fast' mangled-name='PySequence_Fast' filepath='Objects/abstract.c' line='2145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Fast'> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='2145' column='1'/> + <parameter type-id='type-id-6' name='m' filepath='Objects/abstract.c' line='2145' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySequence_Count' mangled-name='PySequence_Count' filepath='Objects/abstract.c' line='2264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Count'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='2264' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2264' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PySequence_Contains' mangled-name='PySequence_Contains' filepath='Objects/abstract.c' line='2273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Contains'> + <parameter type-id='type-id-4' name='seq' filepath='Objects/abstract.c' line='2273' column='1'/> + <parameter type-id='type-id-4' name='ob' filepath='Objects/abstract.c' line='2273' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_In' mangled-name='PySequence_In' filepath='Objects/abstract.c' line='2288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_In'> + <parameter type-id='type-id-4' name='w' filepath='Objects/abstract.c' line='2288' column='1'/> + <parameter type-id='type-id-4' name='v' filepath='Objects/abstract.c' line='2288' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySequence_Index' mangled-name='PySequence_Index' filepath='Objects/abstract.c' line='2294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySequence_Index'> + <parameter type-id='type-id-4' name='s' filepath='Objects/abstract.c' line='2294' column='1'/> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2294' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyMapping_Check' mangled-name='PyMapping_Check' filepath='Objects/abstract.c' line='2302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Check'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2302' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_Size' mangled-name='PyMapping_Size' filepath='Objects/abstract.c' line='2309' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Size'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2309' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyMapping_Length' mangled-name='PyMapping_Length' filepath='Objects/abstract.c' line='2334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Length'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2334' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyMapping_GetItemString' mangled-name='PyMapping_GetItemString' filepath='Objects/abstract.c' line='2341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_GetItemString'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2341' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='2341' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMapping_GetOptionalItemString' mangled-name='PyMapping_GetOptionalItemString' filepath='Objects/abstract.c' line='2358' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_GetOptionalItemString'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2358' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='2358' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/abstract.c' line='2358' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_SetItemString' mangled-name='PyMapping_SetItemString' filepath='Objects/abstract.c' line='2376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_SetItemString'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2376' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='2376' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/abstract.c' line='2376' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_HasKeyStringWithError' mangled-name='PyMapping_HasKeyStringWithError' filepath='Objects/abstract.c' line='2395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKeyStringWithError'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2395' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='2395' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_HasKeyWithError' mangled-name='PyMapping_HasKeyWithError' filepath='Objects/abstract.c' line='2404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKeyWithError'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2404' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='2404' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_HasKeyString' mangled-name='PyMapping_HasKeyString' filepath='Objects/abstract.c' line='2413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKeyString'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2413' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/abstract.c' line='2413' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_HasKey' mangled-name='PyMapping_HasKey' filepath='Objects/abstract.c' line='2438' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_HasKey'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2438' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/abstract.c' line='2438' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMapping_Keys' mangled-name='PyMapping_Keys' filepath='Objects/abstract.c' line='2495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Keys'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2495' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMapping_Items' mangled-name='PyMapping_Items' filepath='Objects/abstract.c' line='2507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Items'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2507' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMapping_Values' mangled-name='PyMapping_Values' filepath='Objects/abstract.c' line='2519' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMapping_Values'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2519' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_IsInstance' mangled-name='PyObject_IsInstance' filepath='Objects/abstract.c' line='2739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsInstance'> + <parameter type-id='type-id-4' name='inst' filepath='Objects/abstract.c' line='2739' column='1'/> + <parameter type-id='type-id-4' name='cls' filepath='Objects/abstract.c' line='2739' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_IsSubclass' mangled-name='PyObject_IsSubclass' filepath='Objects/abstract.c' line='2827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IsSubclass'> + <parameter type-id='type-id-4' name='derived' filepath='Objects/abstract.c' line='2827' column='1'/> + <parameter type-id='type-id-4' name='cls' filepath='Objects/abstract.c' line='2827' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GetIter' mangled-name='PyObject_GetIter' filepath='Objects/abstract.c' line='2848' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetIter'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2848' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GetAIter' mangled-name='PyObject_GetAIter' filepath='Objects/abstract.c' line='2873' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAIter'> + <parameter type-id='type-id-4' name='o' filepath='Objects/abstract.c' line='2873' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyIter_Check' mangled-name='PyIter_Check' filepath='Objects/abstract.c' line='2892' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Check'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2892' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyAIter_Check' mangled-name='PyAIter_Check' filepath='Objects/abstract.c' line='2900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAIter_Check'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/abstract.c' line='2900' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyIter_Next' mangled-name='PyIter_Next' filepath='Objects/abstract.c' line='2916' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Next'> + <parameter type-id='type-id-4' name='iter' filepath='Objects/abstract.c' line='2916' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyIter_Send' mangled-name='PyIter_Send' filepath='Objects/abstract.c' line='2932' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyIter_Send'> + <parameter type-id='type-id-4' name='iter' filepath='Objects/abstract.c' line='2932' column='1'/> + <parameter type-id='type-id-4' name='arg' filepath='Objects/abstract.c' line='2932' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/abstract.c' line='2932' column='1'/> + <return type-id='type-id-264'/> + </function-decl> + <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-262'/> + <function-type size-in-bits='64' id='type-id-265'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/boolobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_Py_FalseStruct' type-id='type-id-251' mangled-name='_Py_FalseStruct' visibility='default' filepath='./Include/boolobject.h' line='17' column='1' elf-symbol-id='_Py_FalseStruct'/> + <var-decl name='_Py_TrueStruct' type-id='type-id-251' mangled-name='_Py_TrueStruct' visibility='default' filepath='./Include/boolobject.h' line='18' column='1' elf-symbol-id='_Py_TrueStruct'/> + <function-decl name='_PyArg_NoKwnames' filepath='./Include/internal/pycore_modsupport.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_NoKeywords' mangled-name='_PyArg_NoKeywords' filepath='./Include/internal/pycore_modsupport.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_NoKeywords'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_CheckPositional' mangled-name='_PyArg_CheckPositional' filepath='./Include/internal/pycore_modsupport.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_CheckPositional'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_SetImmortal' filepath='./Include/internal/pycore_object.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyArg_UnpackTuple' mangled-name='PyArg_UnpackTuple' filepath='./Include/modsupport.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_UnpackTuple'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyBool_Type' type-id='type-id-266' mangled-name='PyBool_Type' visibility='default' filepath='./Include/object.h' line='343' column='1' elf-symbol-id='PyBool_Type'/> + <function-decl name='PyBool_FromLong' mangled-name='PyBool_FromLong' filepath='Objects/boolobject.c' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBool_FromLong'> + <parameter type-id='type-id-183' name='ok' filepath='Objects/boolobject.c' line='21' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/bytearrayobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='infinite' id='type-id-267'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <qualified-type-def type-id='type-id-268' const='yes' id='type-id-269'/> + <pointer-type-def type-id='type-id-269' size-in-bits='64' id='type-id-270'/> + <qualified-type-def type-id='type-id-5' const='yes' id='type-id-271'/> + <var-decl name='PyByteArray_Type' type-id='type-id-266' mangled-name='PyByteArray_Type' visibility='default' filepath='./Include/bytearrayobject.h' line='20' column='1' elf-symbol-id='PyByteArray_Type'/> + <var-decl name='PyByteArrayIter_Type' type-id='type-id-266' mangled-name='PyByteArrayIter_Type' visibility='default' filepath='./Include/bytearrayobject.h' line='21' column='1' elf-symbol-id='PyByteArrayIter_Type'/> + <var-decl name='_PyByteArray_empty_string' type-id='type-id-267' mangled-name='_PyByteArray_empty_string' visibility='default' filepath='./Include/cpython/bytearrayobject.h' line='14' column='1' elf-symbol-id='_PyByteArray_empty_string'/> + <function-decl name='_PyEval_SliceIndex' mangled-name='_PyEval_SliceIndex' filepath='./Include/cpython/ceval.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SliceIndex'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_bytes_isspace' filepath='./Include/internal/pycore_bytes_methods.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_isalpha' filepath='./Include/internal/pycore_bytes_methods.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_isalnum' filepath='./Include/internal/pycore_bytes_methods.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_isascii' filepath='./Include/internal/pycore_bytes_methods.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_isdigit' filepath='./Include/internal/pycore_bytes_methods.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_islower' filepath='./Include/internal/pycore_bytes_methods.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_isupper' filepath='./Include/internal/pycore_bytes_methods.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_istitle' filepath='./Include/internal/pycore_bytes_methods.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_lower' filepath='./Include/internal/pycore_bytes_methods.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_bytes_upper' filepath='./Include/internal/pycore_bytes_methods.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_bytes_title' filepath='./Include/internal/pycore_bytes_methods.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_bytes_capitalize' filepath='./Include/internal/pycore_bytes_methods.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_bytes_swapcase' filepath='./Include/internal/pycore_bytes_methods.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_bytes_find' filepath='./Include/internal/pycore_bytes_methods.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_index' filepath='./Include/internal/pycore_bytes_methods.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_rfind' filepath='./Include/internal/pycore_bytes_methods.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_rindex' filepath='./Include/internal/pycore_bytes_methods.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_count' filepath='./Include/internal/pycore_bytes_methods.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_contains' filepath='./Include/internal/pycore_bytes_methods.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_bytes_startswith' filepath='./Include/internal/pycore_bytes_methods.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_endswith' filepath='./Include/internal/pycore_bytes_methods.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_bytes_maketrans' filepath='./Include/internal/pycore_bytes_methods.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-263'/> + <parameter type-id='type-id-263'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBytes_FormatEx' filepath='./Include/internal/pycore_bytesobject.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBytes_FromHex' filepath='./Include/internal/pycore_bytesobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBytes_Repeat' mangled-name='_PyBytes_Repeat' filepath='./Include/internal/pycore_bytesobject.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Repeat'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_GetBuiltin' mangled-name='_PyEval_GetBuiltin' filepath='./Include/internal/pycore_ceval.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_GetBuiltin'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyArg_BadArgument' mangled-name='_PyArg_BadArgument' filepath='./Include/internal/pycore_modsupport.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_BadArgument'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyArg_UnpackKeywords' mangled-name='_PyArg_UnpackKeywords' filepath='./Include/internal/pycore_modsupport.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_UnpackKeywords'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-272'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-258'/> + </function-decl> + <function-decl name='_PyObject_GetState' mangled-name='_PyObject_GetState' filepath='./Include/internal/pycore_object.h' line='757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetState'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_GetConfig' mangled-name='_Py_GetConfig' filepath='./Include/internal/pycore_pystate.h' line='271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfig'> + <return type-id='type-id-270'/> + </function-decl> + <function-decl name='_Py_strhex_with_sep' filepath='./Include/internal/pycore_strhex.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-256'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-271'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_Append' mangled-name='PyList_Append' filepath='./Include/listobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Append'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyList_Reverse' mangled-name='PyList_Reverse' filepath='./Include/listobject.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Reverse'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyLong_FromSize_t' mangled-name='PyLong_FromSize_t' filepath='./Include/longobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromSize_t'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_AsLongAndOverflow' mangled-name='PyLong_AsLongAndOverflow' filepath='./Include/longobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongAndOverflow'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyLong_AsInt' mangled-name='PyLong_AsInt' filepath='./Include/longobject.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsInt'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_GenericAlloc' mangled-name='PyType_GenericAlloc' filepath='./Include/object.h' line='555' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GenericAlloc'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GenericNew' mangled-name='PyType_GenericNew' filepath='./Include/object.h' line='556' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GenericNew'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_SelfIter' mangled-name='PyObject_SelfIter' filepath='./Include/object.h' line='584' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SelfIter'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GenericGetAttr' mangled-name='PyObject_GenericGetAttr' filepath='./Include/object.h' line='585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericGetAttr'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Free' mangled-name='PyObject_Free' filepath='./Include/objimpl.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Free'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_New' mangled-name='_PyObject_New' filepath='./Include/objimpl.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_New'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_GC_New' mangled-name='_PyObject_GC_New' filepath='./Include/objimpl.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_New'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GC_Del' mangled-name='PyObject_GC_Del' filepath='./Include/objimpl.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_Del'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyBuffer_ToContiguous' mangled-name='PyBuffer_ToContiguous' filepath='./Include/pybuffer.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBuffer_ToContiguous'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-255'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-53'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_Print' mangled-name='PyErr_Print' filepath='./Include/pythonrun.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Print'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySlice_Unpack' mangled-name='PySlice_Unpack' filepath='./Include/sliceobject.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_Unpack'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySlice_AdjustIndices' mangled-name='PySlice_AdjustIndices' filepath='./Include/sliceobject.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_AdjustIndices'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_FromEncodedObject' mangled-name='PyUnicode_FromEncodedObject' filepath='./Include/unicodeobject.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromEncodedObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_GetDefaultEncoding' mangled-name='PyUnicode_GetDefaultEncoding' filepath='./Include/unicodeobject.h' line='330' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetDefaultEncoding'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyUnicode_AsEncodedString' mangled-name='PyUnicode_AsEncodedString' filepath='./Include/unicodeobject.h' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeLatin1' mangled-name='PyUnicode_DecodeLatin1' filepath='./Include/unicodeobject.h' line='609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLatin1'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='memmove' filepath='/usr/include/string.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='memset' filepath='/usr/include/string.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyByteArray_FromObject' mangled-name='PyByteArray_FromObject' filepath='Objects/bytearrayobject.c' line='83' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_FromObject'> + <parameter type-id='type-id-4' name='input' filepath='Objects/bytearrayobject.c' line='83' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyByteArray_FromStringAndSize' mangled-name='PyByteArray_FromStringAndSize' filepath='Objects/bytearrayobject.c' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_FromStringAndSize'> + <parameter type-id='type-id-6' name='bytes' filepath='Objects/bytearrayobject.c' line='109' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytearrayobject.c' line='109' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyByteArray_Size' mangled-name='PyByteArray_Size' filepath='Objects/bytearrayobject.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Size'> + <parameter type-id='type-id-4' name='self' filepath='Objects/bytearrayobject.c' line='153' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyByteArray_AsString' mangled-name='PyByteArray_AsString' filepath='Objects/bytearrayobject.c' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_AsString'> + <parameter type-id='type-id-4' name='self' filepath='Objects/bytearrayobject.c' line='162' column='1'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyByteArray_Resize' mangled-name='PyByteArray_Resize' filepath='Objects/bytearrayobject.c' line='171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Resize'> + <parameter type-id='type-id-4' name='self' filepath='Objects/bytearrayobject.c' line='171' column='1'/> + <parameter type-id='type-id-7' name='requested_size' filepath='Objects/bytearrayobject.c' line='171' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyByteArray_Concat' mangled-name='PyByteArray_Concat' filepath='Objects/bytearrayobject.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyByteArray_Concat'> + <parameter type-id='type-id-4' name='a' filepath='Objects/bytearrayobject.c' line='250' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Objects/bytearrayobject.c' line='250' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/bytes_methods.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='984' id='type-id-273'> + <subrange length='123' type-id='type-id-2' id='type-id-274'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='992' id='type-id-275'> + <subrange length='124' type-id='type-id-2' id='type-id-276'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1008' id='type-id-277'> + <subrange length='126' type-id='type-id-2' id='type-id-278'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1040' id='type-id-279'> + <subrange length='130' type-id='type-id-2' id='type-id-280'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1056' id='type-id-281'> + <subrange length='132' type-id='type-id-2' id='type-id-282'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1128' id='type-id-283'> + <subrange length='141' type-id='type-id-2' id='type-id-284'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1240' id='type-id-285'> + <subrange length='155' type-id='type-id-2' id='type-id-286'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='1840' id='type-id-287'> + <subrange length='230' type-id='type-id-2' id='type-id-288'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='2328' id='type-id-289'> + <subrange length='291' type-id='type-id-2' id='type-id-290'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='744' id='type-id-291'> + <subrange length='93' type-id='type-id-2' id='type-id-292'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='784' id='type-id-293'> + <subrange length='98' type-id='type-id-2' id='type-id-294'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-55' size-in-bits='infinite' id='type-id-295'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <var-decl name='_Py_isspace__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='51' column='1'/> + <var-decl name='_Py_isalpha__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='52' column='1'/> + <var-decl name='_Py_isalnum__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='53' column='1'/> + <var-decl name='_Py_isascii__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='54' column='1'/> + <var-decl name='_Py_isdigit__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='55' column='1'/> + <var-decl name='_Py_islower__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='56' column='1'/> + <var-decl name='_Py_isupper__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='57' column='1'/> + <var-decl name='_Py_istitle__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='58' column='1'/> + <var-decl name='_Py_lower__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='59' column='1'/> + <var-decl name='_Py_upper__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='60' column='1'/> + <var-decl name='_Py_title__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='61' column='1'/> + <var-decl name='_Py_capitalize__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='62' column='1'/> + <var-decl name='_Py_swapcase__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='63' column='1'/> + <var-decl name='_Py_maketrans__doc__' type-id='type-id-295' visibility='default' filepath='./Include/internal/pycore_bytes_methods.h' line='71' column='1'/> + <function-decl name='memrchr' filepath='/usr/include/string.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/bytesobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='4096' id='type-id-296'> + <subrange length='512' type-id='type-id-2' id='type-id-297'/> + </array-type-def> + <class-decl name='_PyBytesWriter' size-in-bits='4416' is-struct='yes' naming-typedef-id='type-id-298' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='67' column='1' id='type-id-299'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buffer' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='allocated' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='min_size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='use_bytearray' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='overallocate' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='use_small_buffer' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='small_buffer' type-id='type-id-296' visibility='default' filepath='./Include/internal/pycore_bytesobject.h' line='87' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyBytesWriter' type-id='type-id-299' filepath='./Include/internal/pycore_bytesobject.h' line='88' column='1' id='type-id-298'/> + <pointer-type-def type-id='type-id-298' size-in-bits='64' id='type-id-300'/> + <var-decl name='PyBytes_Type' type-id='type-id-266' mangled-name='PyBytes_Type' visibility='default' filepath='./Include/bytesobject.h' line='24' column='1' elf-symbol-id='PyBytes_Type'/> + <var-decl name='PyBytesIter_Type' type-id='type-id-266' mangled-name='PyBytesIter_Type' visibility='default' filepath='./Include/bytesobject.h' line='25' column='1' elf-symbol-id='PyBytesIter_Type'/> + <function-decl name='_Py_NewReference' mangled-name='_Py_NewReference' filepath='./Include/cpython/object.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_NewReference'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_NewReferenceNoTotal' mangled-name='_Py_NewReferenceNoTotal' filepath='./Include/cpython/object.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_NewReferenceNoTotal'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFloat_AsDouble' mangled-name='PyFloat_AsDouble' filepath='./Include/floatobject.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_AsDouble'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='_PyLong_FormatBytesWriter' filepath='./Include/internal/pycore_long.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-300'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_Py_HashBytes' mangled-name='_Py_HashBytes' filepath='./Include/internal/pycore_pyhash.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashBytes'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-301'/> + </function-decl> + <function-decl name='_PyUnicode_FormatLong' filepath='./Include/internal/pycore_unicodeobject.h' line='254' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_ASCII' mangled-name='PyObject_ASCII' filepath='./Include/object.h' line='564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ASCII'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Malloc' mangled-name='PyObject_Malloc' filepath='./Include/objimpl.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Malloc'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyObject_Calloc' mangled-name='PyObject_Calloc' filepath='./Include/objimpl.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Calloc'> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyObject_Realloc' mangled-name='PyObject_Realloc' filepath='./Include/objimpl.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Realloc'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyErr_BadArgument' mangled-name='PyErr_BadArgument' filepath='./Include/pyerrors.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_BadArgument'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyOS_double_to_string' mangled-name='PyOS_double_to_string' filepath='./Include/pystrtod.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_double_to_string'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-53'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyTuple_GetItem' mangled-name='PyTuple_GetItem' filepath='./Include/tupleobject.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_GetItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_FromFormatV' mangled-name='PyBytes_FromFormatV' filepath='Objects/bytesobject.c' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormatV'> + <parameter type-id='type-id-6' name='format' filepath='Objects/bytesobject.c' line='177' column='1'/> + <parameter type-id='type-id-302' name='vargs' filepath='Objects/bytesobject.c' line='177' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_FromFormat' mangled-name='PyBytes_FromFormat' filepath='Objects/bytesobject.c' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromFormat'> + <parameter type-id='type-id-6' name='format' filepath='Objects/bytesobject.c' line='368' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_DecodeEscape' mangled-name='PyBytes_DecodeEscape' filepath='Objects/bytesobject.c' line='1161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_DecodeEscape'> + <parameter type-id='type-id-6' name='s' filepath='Objects/bytesobject.c' line='1161' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/bytesobject.c' line='1162' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/bytesobject.c' line='1163' column='1'/> + <parameter type-id='type-id-7' name='_unused_unicode' filepath='Objects/bytesobject.c' line='1164' column='1'/> + <parameter type-id='type-id-6' name='_unused_recode_encoding' filepath='Objects/bytesobject.c' line='1165' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_Size' mangled-name='PyBytes_Size' filepath='Objects/bytesobject.c' line='1200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Size'> + <parameter type-id='type-id-4' name='op' filepath='Objects/bytesobject.c' line='1200' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyBytes_Find' mangled-name='_PyBytes_Find' filepath='Objects/bytesobject.c' line='1269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Find'> + <parameter type-id='type-id-6' name='haystack' filepath='Objects/bytesobject.c' line='1269' column='1'/> + <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1269' column='1'/> + <parameter type-id='type-id-6' name='needle' filepath='Objects/bytesobject.c' line='1270' column='1'/> + <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1270' column='1'/> + <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1271' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyBytes_ReverseFind' mangled-name='_PyBytes_ReverseFind' filepath='Objects/bytesobject.c' line='1295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_ReverseFind'> + <parameter type-id='type-id-6' name='haystack' filepath='Objects/bytesobject.c' line='1295' column='1'/> + <parameter type-id='type-id-7' name='len_haystack' filepath='Objects/bytesobject.c' line='1295' column='1'/> + <parameter type-id='type-id-6' name='needle' filepath='Objects/bytesobject.c' line='1296' column='1'/> + <parameter type-id='type-id-7' name='len_needle' filepath='Objects/bytesobject.c' line='1296' column='1'/> + <parameter type-id='type-id-7' name='offset' filepath='Objects/bytesobject.c' line='1297' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyBytes_Repr' mangled-name='PyBytes_Repr' filepath='Objects/bytesobject.c' line='1304' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Repr'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/bytesobject.c' line='1304' column='1'/> + <parameter type-id='type-id-5' name='smartquotes' filepath='Objects/bytesobject.c' line='1304' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBytes_Join' mangled-name='_PyBytes_Join' filepath='Objects/bytesobject.c' line='1859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Join'> + <parameter type-id='type-id-4' name='sep' filepath='Objects/bytesobject.c' line='1859' column='1'/> + <parameter type-id='type-id-4' name='x' filepath='Objects/bytesobject.c' line='1859' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_FromObject' mangled-name='PyBytes_FromObject' filepath='Objects/bytesobject.c' line='2920' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromObject'> + <parameter type-id='type-id-4' name='x' filepath='Objects/bytesobject.c' line='2920' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_ConcatAndDel' mangled-name='PyBytes_ConcatAndDel' filepath='Objects/bytesobject.c' line='3111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_ConcatAndDel'> + <parameter type-id='type-id-238' name='pv' filepath='Objects/bytesobject.c' line='3111' column='1'/> + <parameter type-id='type-id-4' name='w' filepath='Objects/bytesobject.c' line='3111' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyBytes_Resize' mangled-name='_PyBytes_Resize' filepath='Objects/bytesobject.c' line='3131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_Resize'> + <parameter type-id='type-id-238' name='pv' filepath='Objects/bytesobject.c' line='3131' column='1'/> + <parameter type-id='type-id-7' name='newsize' filepath='Objects/bytesobject.c' line='3131' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyBytesWriter_Init' mangled-name='_PyBytesWriter_Init' filepath='Objects/bytesobject.c' line='3361' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Init'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3361' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyBytesWriter_Dealloc' mangled-name='_PyBytesWriter_Dealloc' filepath='Objects/bytesobject.c' line='3372' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Dealloc'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3372' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyBytesWriter_Resize' mangled-name='_PyBytesWriter_Resize' filepath='Objects/bytesobject.c' line='3442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Resize'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3442' column='1'/> + <parameter type-id='type-id-30' name='str' filepath='Objects/bytesobject.c' line='3442' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3442' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyBytesWriter_Prepare' mangled-name='_PyBytesWriter_Prepare' filepath='Objects/bytesobject.c' line='3512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Prepare'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3512' column='1'/> + <parameter type-id='type-id-30' name='str' filepath='Objects/bytesobject.c' line='3512' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3512' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyBytesWriter_Alloc' mangled-name='_PyBytesWriter_Alloc' filepath='Objects/bytesobject.c' line='3542' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Alloc'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3542' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3542' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyBytesWriter_Finish' mangled-name='_PyBytesWriter_Finish' filepath='Objects/bytesobject.c' line='3572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_Finish'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3572' column='1'/> + <parameter type-id='type-id-30' name='str' filepath='Objects/bytesobject.c' line='3572' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBytesWriter_WriteBytes' mangled-name='_PyBytesWriter_WriteBytes' filepath='Objects/bytesobject.c' line='3616' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytesWriter_WriteBytes'> + <parameter type-id='type-id-300' name='writer' filepath='Objects/bytesobject.c' line='3616' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/bytesobject.c' line='3616' column='1'/> + <parameter type-id='type-id-30' name='bytes' filepath='Objects/bytesobject.c' line='3617' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/bytesobject.c' line='3617' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/call.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_Py_Identifier' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='38' column='1' id='type-id-303'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='string' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='index' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mutex' type-id='type-id-304' visibility='default' filepath='./Include/cpython/object.h' line='46' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/object.h' line='44' column='1' id='type-id-304'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='type-id-305' visibility='default' filepath='./Include/cpython/object.h' line='45' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_Identifier' type-id='type-id-303' filepath='./Include/cpython/object.h' line='47' column='1' id='type-id-306'/> + <pointer-type-def type-id='type-id-306' size-in-bits='64' id='type-id-307'/> + <function-decl name='_PyObject_GetAttrId' mangled-name='_PyObject_GetAttrId' filepath='./Include/cpython/object.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetAttrId'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-307'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_FromId' mangled-name='_PyUnicode_FromId' filepath='./Include/cpython/unicodeobject.h' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_FromId'> + <parameter type-id='type-id-307'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_Next' mangled-name='PyDict_Next' filepath='./Include/dictobject.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Next'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_Vector' filepath='./Include/internal/pycore_ceval.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-308'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_FromItems' mangled-name='_PyDict_FromItems' filepath='./Include/internal/pycore_dict.h' line='283' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_FromItems'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_VaBuildStack' filepath='./Include/internal/pycore_modsupport.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-302'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-238'/> + </function-decl> + <function-decl name='_PyObject_GetMethod' mangled-name='_PyObject_GetMethod' filepath='./Include/internal/pycore_object.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetMethod'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_FatalErrorFormat' filepath='./Include/internal/pycore_pyerrors.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_NoMemory' filepath='./Include/internal/pycore_pyerrors.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_FormatFromCauseTstate' filepath='./Include/internal/pycore_pyerrors.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTuple_FromArray' filepath='./Include/internal/pycore_tuple.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_GetNameObject' mangled-name='PyModule_GetNameObject' filepath='./Include/moduleobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetNameObject'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GetAttrString' mangled-name='PyObject_GetAttrString' filepath='./Include/object.h' line='568' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAttrString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCallable_Check' mangled-name='PyCallable_Check' filepath='./Include/object.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCallable_Check'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_VectorcallDict' mangled-name='PyObject_VectorcallDict' filepath='Objects/call.c' line='155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VectorcallDict'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='155' column='1'/> + <parameter type-id='type-id-258' name='args' filepath='Objects/call.c' line='155' column='1'/> + <parameter type-id='type-id-21' name='nargsf' filepath='Objects/call.c' line='156' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Objects/call.c' line='156' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyVectorcall_Function' mangled-name='PyVectorcall_Function' filepath='Objects/call.c' line='257' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_Function'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='257' column='1'/> + <return type-id='type-id-309'/> + </function-decl> + <function-decl name='PyVectorcall_Call' mangled-name='PyVectorcall_Call' filepath='Objects/call.c' line='294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_Call'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='294' column='1'/> + <parameter type-id='type-id-4' name='tuple' filepath='Objects/call.c' line='294' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Objects/call.c' line='294' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Call' mangled-name='PyObject_Call' filepath='Objects/call.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Call'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='370' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/call.c' line='370' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Objects/call.c' line='370' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCFunction_Call' mangled-name='PyCFunction_Call' filepath='Objects/call.c' line='379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_Call'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='379' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/call.c' line='379' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Objects/call.c' line='379' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_CallObjectWithKeywords' mangled-name='PyEval_CallObjectWithKeywords' filepath='Objects/call.c' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallObjectWithKeywords'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='426' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/call.c' line='427' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Objects/call.c' line='427' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_CallObject' mangled-name='PyObject_CallObject' filepath='Objects/call.c' line='460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallObject'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='460' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/call.c' line='460' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_CallFunction' mangled-name='PyEval_CallFunction' filepath='Objects/call.c' line='584' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallFunction'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='584' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='584' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_CallFunction_SizeT' mangled-name='_PyObject_CallFunction_SizeT' filepath='Objects/call.c' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallFunction_SizeT'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/call.c' line='602' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='602' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_CallMethod' mangled-name='PyObject_CallMethod' filepath='Objects/call.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallMethod'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='630' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/call.c' line='630' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='630' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_CallMethod' mangled-name='PyEval_CallMethod' filepath='Objects/call.c' line='656' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_CallMethod'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='656' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/call.c' line='656' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='656' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_CallMethod' mangled-name='_PyObject_CallMethod' filepath='Objects/call.c' line='679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethod'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='679' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/call.c' line='679' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='680' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_CallMethodId' mangled-name='_PyObject_CallMethodId' filepath='Objects/call.c' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethodId'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='703' column='1'/> + <parameter type-id='type-id-307' name='name' filepath='Objects/call.c' line='703' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='704' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_CallMethod_SizeT' mangled-name='_PyObject_CallMethod_SizeT' filepath='Objects/call.c' line='740' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CallMethod_SizeT'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='740' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/call.c' line='740' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Objects/call.c' line='741' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_CallMethodObjArgs' mangled-name='PyObject_CallMethodObjArgs' filepath='Objects/call.c' line='864' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallMethodObjArgs'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/call.c' line='864' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/call.c' line='864' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyStack_AsDict' mangled-name='_PyStack_AsDict' filepath='Objects/call.c' line='936' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStack_AsDict'> + <parameter type-id='type-id-258' name='values' filepath='Objects/call.c' line='936' column='1'/> + <parameter type-id='type-id-4' name='kwnames' filepath='Objects/call.c' line='936' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyVectorcall_NARGS' mangled-name='PyVectorcall_NARGS' filepath='Objects/call.c' line='1049' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyVectorcall_NARGS'> + <parameter type-id='type-id-21' name='n' filepath='Objects/call.c' line='1049' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/capsule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='PyCapsule_Destructor' type-id='type-id-310' filepath='./Include/pycapsule.h' line='23' column='1' id='type-id-311'/> + <function-decl name='PyImport_ImportModule' mangled-name='PyImport_ImportModule' filepath='./Include/import.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModule'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GC_UnTrack' mangled-name='PyObject_GC_UnTrack' filepath='./Include/objimpl.h' line='176' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_UnTrack'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='PyCapsule_Type' type-id='type-id-266' mangled-name='PyCapsule_Type' visibility='default' filepath='./Include/pycapsule.h' line='21' column='1' elf-symbol-id='PyCapsule_Type'/> + <function-decl name='PyCapsule_New' mangled-name='PyCapsule_New' filepath='Objects/capsule.c' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_New'> + <parameter type-id='type-id-30' name='pointer' filepath='Objects/capsule.c' line='58' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/capsule.c' line='58' column='1'/> + <parameter type-id='type-id-311' name='destructor' filepath='Objects/capsule.c' line='58' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCapsule_IsValid' mangled-name='PyCapsule_IsValid' filepath='Objects/capsule.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_IsValid'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='85' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/capsule.c' line='85' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCapsule_GetPointer' mangled-name='PyCapsule_GetPointer' filepath='Objects/capsule.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetPointer'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='97' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/capsule.c' line='97' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyCapsule_GetName' mangled-name='PyCapsule_GetName' filepath='Objects/capsule.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetName'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='114' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyCapsule_GetDestructor' mangled-name='PyCapsule_GetDestructor' filepath='Objects/capsule.c' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetDestructor'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='125' column='1'/> + <return type-id='type-id-311'/> + </function-decl> + <function-decl name='PyCapsule_GetContext' mangled-name='PyCapsule_GetContext' filepath='Objects/capsule.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_GetContext'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='136' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyCapsule_SetPointer' mangled-name='PyCapsule_SetPointer' filepath='Objects/capsule.c' line='147' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetPointer'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='147' column='1'/> + <parameter type-id='type-id-30' name='pointer' filepath='Objects/capsule.c' line='147' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCapsule_SetName' mangled-name='PyCapsule_SetName' filepath='Objects/capsule.c' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetName'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='165' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/capsule.c' line='165' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCapsule_SetDestructor' mangled-name='PyCapsule_SetDestructor' filepath='Objects/capsule.c' line='178' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetDestructor'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='178' column='1'/> + <parameter type-id='type-id-311' name='destructor' filepath='Objects/capsule.c' line='178' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCapsule_SetContext' mangled-name='PyCapsule_SetContext' filepath='Objects/capsule.c' line='191' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_SetContext'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='191' column='1'/> + <parameter type-id='type-id-30' name='context' filepath='Objects/capsule.c' line='191' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCapsule_SetTraverse' mangled-name='_PyCapsule_SetTraverse' filepath='Objects/capsule.c' line='204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCapsule_SetTraverse'> + <parameter type-id='type-id-4' name='op' filepath='Objects/capsule.c' line='204' column='1'/> + <parameter type-id='type-id-312' name='traverse_func' filepath='Objects/capsule.c' line='204' column='1'/> + <parameter type-id='type-id-313' name='clear_func' filepath='Objects/capsule.c' line='204' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCapsule_Import' mangled-name='PyCapsule_Import' filepath='Objects/capsule.c' line='228' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCapsule_Import'> + <parameter type-id='type-id-6' name='name' filepath='Objects/capsule.c' line='228' column='1'/> + <parameter type-id='type-id-5' name='no_block' filepath='Objects/capsule.c' line='228' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-314'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/cellobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyCell_Type' type-id='type-id-266' mangled-name='PyCell_Type' visibility='default' filepath='./Include/cpython/cellobject.h' line='16' column='1' elf-symbol-id='PyCell_Type'/> + <function-decl name='PyObject_RichCompare' mangled-name='PyObject_RichCompare' filepath='./Include/object.h' line='566' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_RichCompare'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCell_New' mangled-name='PyCell_New' filepath='Objects/cellobject.c' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_New'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/cellobject.c' line='9' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCell_Get' mangled-name='PyCell_Get' filepath='Objects/cellobject.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_Get'> + <parameter type-id='type-id-4' name='op' filepath='Objects/cellobject.c' line='54' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCell_Set' mangled-name='PyCell_Set' filepath='Objects/cellobject.c' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCell_Set'> + <parameter type-id='type-id-4' name='op' filepath='Objects/cellobject.c' line='64' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/cellobject.c' line='64' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/classobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyMethod_Type' type-id='type-id-266' mangled-name='PyMethod_Type' visibility='default' filepath='./Include/cpython/classobject.h' line='20' column='1' elf-symbol-id='PyMethod_Type'/> + <var-decl name='PyInstanceMethod_Type' type-id='type-id-266' mangled-name='PyInstanceMethod_Type' visibility='default' filepath='./Include/cpython/classobject.h' line='49' column='1' elf-symbol-id='PyInstanceMethod_Type'/> + <function-decl name='_PyType_LookupRef' mangled-name='_PyType_LookupRef' filepath='./Include/cpython/object.h' line='278' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_LookupRef'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GenericHash' mangled-name='PyObject_GenericHash' filepath='./Include/cpython/pyhash.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericHash'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-301'/> + </function-decl> + <function-decl name='_PyType_GetDict' mangled-name='_PyType_GetDict' filepath='./Include/internal/pycore_typeobject.h' line='195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetDict'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_Ready' mangled-name='PyType_Ready' filepath='./Include/object.h' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Ready'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GenericSetAttr' mangled-name='PyObject_GenericSetAttr' filepath='./Include/object.h' line='586' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericSetAttr'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_Hash' mangled-name='PyObject_Hash' filepath='./Include/object.h' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Hash'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-301'/> + </function-decl> + <function-decl name='PyObject_ClearWeakRefs' mangled-name='PyObject_ClearWeakRefs' filepath='./Include/object.h' line='595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearWeakRefs'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMethod_Function' mangled-name='PyMethod_Function' filepath='Objects/classobject.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_Function'> + <parameter type-id='type-id-4' name='im' filepath='Objects/classobject.c' line='22' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMethod_Self' mangled-name='PyMethod_Self' filepath='Objects/classobject.c' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_Self'> + <parameter type-id='type-id-4' name='im' filepath='Objects/classobject.c' line='32' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMethod_New' mangled-name='PyMethod_New' filepath='Objects/classobject.c' line='108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMethod_New'> + <parameter type-id='type-id-4' name='func' filepath='Objects/classobject.c' line='108' column='1'/> + <parameter type-id='type-id-4' name='self' filepath='Objects/classobject.c' line='108' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInstanceMethod_New' mangled-name='PyInstanceMethod_New' filepath='Objects/classobject.c' line='366' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInstanceMethod_New'> + <parameter type-id='type-id-4' name='func' filepath='Objects/classobject.c' line='366' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInstanceMethod_Function' mangled-name='PyInstanceMethod_Function' filepath='Objects/classobject.c' line='377' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInstanceMethod_Function'> + <parameter type-id='type-id-4' name='im' filepath='Objects/classobject.c' line='377' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/codeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_opaque' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='284' column='1' id='type-id-315'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='computed_line' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='285' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='lo_next' type-id='type-id-316' visibility='default' filepath='./Include/cpython/code.h' line='286' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='limit' type-id='type-id-316' visibility='default' filepath='./Include/cpython/code.h' line='287' column='1'/> + </data-member> + </class-decl> + <class-decl name='_line_offsets' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='290' column='1' id='type-id-317'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ar_start' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='291' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ar_end' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='292' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ar_line' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='293' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='opaque' type-id='type-id-315' visibility='default' filepath='./Include/cpython/code.h' line='294' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyCodeAddressRange' type-id='type-id-317' filepath='./Include/cpython/code.h' line='295' column='1' id='type-id-318'/> + <pointer-type-def type-id='type-id-318' size-in-bits='64' id='type-id-319'/> + <pointer-type-def type-id='type-id-320' size-in-bits='64' id='type-id-321'/> + <pointer-type-def type-id='type-id-301' size-in-bits='64' id='type-id-322'/> + <qualified-type-def type-id='type-id-305' const='yes' id='type-id-323'/> + <pointer-type-def type-id='type-id-323' size-in-bits='64' id='type-id-316'/> + <var-decl name='PyCode_Type' type-id='type-id-266' mangled-name='PyCode_Type' visibility='default' filepath='./Include/cpython/code.h' line='179' column='1' elf-symbol-id='PyCode_Type'/> + <function-decl name='PyComplex_AsCComplex' mangled-name='PyComplex_AsCComplex' filepath='./Include/cpython/complexobject.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_AsCComplex'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_GetBaseOpcode' filepath='./Include/internal/pycore_code.h' line='589' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyFunction_ClearCodeByVersion' filepath='./Include/internal/pycore_function.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-326'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySet_NextEntry' mangled-name='_PySet_NextEntry' filepath='./Include/internal/pycore_setobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_NextEntry'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-322'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_Copy' mangled-name='_PyUnicode_Copy' filepath='./Include/internal/pycore_unicodeobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_Copy'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_InternMortal' mangled-name='_PyUnicode_InternMortal' filepath='./Include/internal/pycore_unicodeobject.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternMortal'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyLong_FromVoidPtr' mangled-name='PyLong_FromVoidPtr' filepath='./Include/longobject.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromVoidPtr'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_NewVar' mangled-name='_PyObject_NewVar' filepath='./Include/objimpl.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_NewVar'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-321'/> + </function-decl> + <function-decl name='PyFrozenSet_New' mangled-name='PyFrozenSet_New' filepath='./Include/setobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrozenSet_New'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeFSDefault' mangled-name='PyUnicode_DecodeFSDefault' filepath='./Include/unicodeobject.h' line='754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefault'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Compare' mangled-name='PyUnicode_Compare' filepath='./Include/unicodeobject.h' line='944' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Compare'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='copysign' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='198' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyCode_AddWatcher' mangled-name='PyCode_AddWatcher' filepath='Objects/codeobject.c' line='57' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_AddWatcher'> + <parameter type-id='type-id-327' name='callback' filepath='Objects/codeobject.c' line='57' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCode_ClearWatcher' mangled-name='PyCode_ClearWatcher' filepath='Objects/codeobject.c' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_ClearWatcher'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/codeobject.c' line='89' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCode_Quicken' filepath='Objects/codeobject.c' line='461' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnstable_Code_NewWithPosOnlyArgs' mangled-name='PyUnstable_Code_NewWithPosOnlyArgs' filepath='Objects/codeobject.c' line='703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_NewWithPosOnlyArgs'> + <parameter type-id='type-id-5' name='argcount' filepath='Objects/codeobject.c' line='704' column='1'/> + <parameter type-id='type-id-5' name='posonlyargcount' filepath='Objects/codeobject.c' line='704' column='1'/> + <parameter type-id='type-id-5' name='kwonlyargcount' filepath='Objects/codeobject.c' line='704' column='1'/> + <parameter type-id='type-id-5' name='nlocals' filepath='Objects/codeobject.c' line='705' column='1'/> + <parameter type-id='type-id-5' name='stacksize' filepath='Objects/codeobject.c' line='705' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/codeobject.c' line='705' column='1'/> + <parameter type-id='type-id-4' name='code' filepath='Objects/codeobject.c' line='706' column='1'/> + <parameter type-id='type-id-4' name='consts' filepath='Objects/codeobject.c' line='706' column='1'/> + <parameter type-id='type-id-4' name='names' filepath='Objects/codeobject.c' line='706' column='1'/> + <parameter type-id='type-id-4' name='varnames' filepath='Objects/codeobject.c' line='707' column='1'/> + <parameter type-id='type-id-4' name='freevars' filepath='Objects/codeobject.c' line='707' column='1'/> + <parameter type-id='type-id-4' name='cellvars' filepath='Objects/codeobject.c' line='707' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Objects/codeobject.c' line='708' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/codeobject.c' line='708' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/codeobject.c' line='709' column='1'/> + <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='709' column='1'/> + <parameter type-id='type-id-4' name='linetable' filepath='Objects/codeobject.c' line='710' column='1'/> + <parameter type-id='type-id-4' name='exceptiontable' filepath='Objects/codeobject.c' line='711' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='PyUnstable_Code_New' mangled-name='PyUnstable_Code_New' filepath='Objects/codeobject.c' line='857' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_New'> + <parameter type-id='type-id-5' name='argcount' filepath='Objects/codeobject.c' line='857' column='1'/> + <parameter type-id='type-id-5' name='kwonlyargcount' filepath='Objects/codeobject.c' line='857' column='1'/> + <parameter type-id='type-id-5' name='nlocals' filepath='Objects/codeobject.c' line='858' column='1'/> + <parameter type-id='type-id-5' name='stacksize' filepath='Objects/codeobject.c' line='858' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/codeobject.c' line='858' column='1'/> + <parameter type-id='type-id-4' name='code' filepath='Objects/codeobject.c' line='859' column='1'/> + <parameter type-id='type-id-4' name='consts' filepath='Objects/codeobject.c' line='859' column='1'/> + <parameter type-id='type-id-4' name='names' filepath='Objects/codeobject.c' line='859' column='1'/> + <parameter type-id='type-id-4' name='varnames' filepath='Objects/codeobject.c' line='860' column='1'/> + <parameter type-id='type-id-4' name='freevars' filepath='Objects/codeobject.c' line='860' column='1'/> + <parameter type-id='type-id-4' name='cellvars' filepath='Objects/codeobject.c' line='860' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Objects/codeobject.c' line='861' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/codeobject.c' line='861' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/codeobject.c' line='861' column='1'/> + <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='862' column='1'/> + <parameter type-id='type-id-4' name='linetable' filepath='Objects/codeobject.c' line='863' column='1'/> + <parameter type-id='type-id-4' name='exceptiontable' filepath='Objects/codeobject.c' line='864' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='PyCode_NewEmpty' mangled-name='PyCode_NewEmpty' filepath='Objects/codeobject.c' line='891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_NewEmpty'> + <parameter type-id='type-id-6' name='filename' filepath='Objects/codeobject.c' line='891' column='1'/> + <parameter type-id='type-id-6' name='funcname' filepath='Objects/codeobject.c' line='891' column='1'/> + <parameter type-id='type-id-5' name='firstlineno' filepath='Objects/codeobject.c' line='891' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='PyCode_Addr2Line' mangled-name='PyCode_Addr2Line' filepath='Objects/codeobject.c' line='953' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Line'> + <parameter type-id='type-id-325' name='co' filepath='Objects/codeobject.c' line='953' column='1'/> + <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='953' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCode_CheckLineNumber' mangled-name='_PyCode_CheckLineNumber' filepath='Objects/codeobject.c' line='988' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_CheckLineNumber'> + <parameter type-id='type-id-5' name='lasti' filepath='Objects/codeobject.c' line='988' column='1'/> + <parameter type-id='type-id-319' name='bounds' filepath='Objects/codeobject.c' line='988' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCode_Addr2Location' mangled-name='PyCode_Addr2Location' filepath='Objects/codeobject.c' line='1165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Addr2Location'> + <parameter type-id='type-id-325' name='co' filepath='Objects/codeobject.c' line='1165' column='1'/> + <parameter type-id='type-id-5' name='addrq' filepath='Objects/codeobject.c' line='1165' column='1'/> + <parameter type-id='type-id-177' name='start_line' filepath='Objects/codeobject.c' line='1166' column='1'/> + <parameter type-id='type-id-177' name='start_column' filepath='Objects/codeobject.c' line='1166' column='1'/> + <parameter type-id='type-id-177' name='end_line' filepath='Objects/codeobject.c' line='1167' column='1'/> + <parameter type-id='type-id-177' name='end_column' filepath='Objects/codeobject.c' line='1167' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_Code_GetExtra' mangled-name='PyUnstable_Code_GetExtra' filepath='Objects/codeobject.c' line='1486' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_GetExtra'> + <parameter type-id='type-id-4' name='code' filepath='Objects/codeobject.c' line='1486' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1486' column='1'/> + <parameter type-id='type-id-262' name='extra' filepath='Objects/codeobject.c' line='1486' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_Code_SetExtra' mangled-name='PyUnstable_Code_SetExtra' filepath='Objects/codeobject.c' line='1507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Code_SetExtra'> + <parameter type-id='type-id-4' name='code' filepath='Objects/codeobject.c' line='1507' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/codeobject.c' line='1507' column='1'/> + <parameter type-id='type-id-30' name='extra' filepath='Objects/codeobject.c' line='1507' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCode_GetVarnames' mangled-name='PyCode_GetVarnames' filepath='Objects/codeobject.c' line='1585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetVarnames'> + <parameter type-id='type-id-325' name='code' filepath='Objects/codeobject.c' line='1585' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCode_GetCellvars' mangled-name='PyCode_GetCellvars' filepath='Objects/codeobject.c' line='1600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCellvars'> + <parameter type-id='type-id-325' name='code' filepath='Objects/codeobject.c' line='1600' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCode_GetFreevars' mangled-name='PyCode_GetFreevars' filepath='Objects/codeobject.c' line='1615' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetFreevars'> + <parameter type-id='type-id-325' name='code' filepath='Objects/codeobject.c' line='1615' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCode_GetCode' mangled-name='PyCode_GetCode' filepath='Objects/codeobject.c' line='1694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_GetCode'> + <parameter type-id='type-id-325' name='co' filepath='Objects/codeobject.c' line='1694' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCode_ConstantKey' mangled-name='_PyCode_ConstantKey' filepath='Objects/codeobject.c' line='2393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCode_ConstantKey'> + <parameter type-id='type-id-4' name='op' filepath='Objects/codeobject.c' line='2393' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/complexobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-328' size-in-bits='64' id='type-id-329'/> + <var-decl name='PyComplex_Type' type-id='type-id-266' mangled-name='PyComplex_Type' visibility='default' filepath='./Include/complexobject.h' line='11' column='1' elf-symbol-id='PyComplex_Type'/> + <function-decl name='_Py_HashDouble' mangled-name='_Py_HashDouble' filepath='./Include/cpython/pyhash.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HashDouble'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-301'/> + </function-decl> + <function-decl name='_PyComplex_FormatAdvancedWriter' filepath='./Include/internal/pycore_complexobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_string_to_number_with_underscores' filepath='./Include/internal/pycore_floatobject.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-329'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_TransformDecimalAndSpaceToASCII' mangled-name='_PyUnicode_TransformDecimalAndSpaceToASCII' filepath='./Include/internal/pycore_unicodeobject.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_TransformDecimalAndSpaceToASCII'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='atan2' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='cos' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='sin' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='exp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='log' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='pow' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='hypot' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='floor' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='_Py_c_sum' mangled-name='_Py_c_sum' filepath='Objects/complexobject.c' line='29' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_sum'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='29' column='1'/> + <parameter type-id='type-id-324' name='b' filepath='Objects/complexobject.c' line='29' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_diff' mangled-name='_Py_c_diff' filepath='Objects/complexobject.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_diff'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='38' column='1'/> + <parameter type-id='type-id-324' name='b' filepath='Objects/complexobject.c' line='38' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_neg' mangled-name='_Py_c_neg' filepath='Objects/complexobject.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_neg'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='47' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_prod' mangled-name='_Py_c_prod' filepath='Objects/complexobject.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_prod'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='56' column='1'/> + <parameter type-id='type-id-324' name='b' filepath='Objects/complexobject.c' line='56' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_quot' mangled-name='_Py_c_quot' filepath='Objects/complexobject.c' line='69' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_quot'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='69' column='1'/> + <parameter type-id='type-id-324' name='b' filepath='Objects/complexobject.c' line='69' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_pow' mangled-name='_Py_c_pow' filepath='Objects/complexobject.c' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_pow'> + <parameter type-id='type-id-324' name='a' filepath='Objects/complexobject.c' line='130' column='1'/> + <parameter type-id='type-id-324' name='b' filepath='Objects/complexobject.c' line='130' column='1'/> + <return type-id='type-id-324'/> + </function-decl> + <function-decl name='_Py_c_abs' mangled-name='_Py_c_abs' filepath='Objects/complexobject.c' line='186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_c_abs'> + <parameter type-id='type-id-324' name='z' filepath='Objects/complexobject.c' line='186' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyComplex_FromDoubles' mangled-name='PyComplex_FromDoubles' filepath='Objects/complexobject.c' line='251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_FromDoubles'> + <parameter type-id='type-id-172' name='real' filepath='Objects/complexobject.c' line='251' column='1'/> + <parameter type-id='type-id-172' name='imag' filepath='Objects/complexobject.c' line='251' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyComplex_RealAsDouble' mangled-name='PyComplex_RealAsDouble' filepath='Objects/complexobject.c' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_RealAsDouble'> + <parameter type-id='type-id-4' name='op' filepath='Objects/complexobject.c' line='262' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyComplex_ImagAsDouble' mangled-name='PyComplex_ImagAsDouble' filepath='Objects/complexobject.c' line='283' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_ImagAsDouble'> + <parameter type-id='type-id-4' name='op' filepath='Objects/complexobject.c' line='283' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-328'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-4'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/descrobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-331' size-in-bits='64' id='type-id-332'/> + <function-decl name='_PyObject_FunctionStr' mangled-name='_PyObject_FunctionStr' filepath='./Include/cpython/object.h' line='301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_FunctionStr'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTrash_thread_deposit_object' mangled-name='_PyTrash_thread_deposit_object' filepath='./Include/cpython/object.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_thread_deposit_object'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTrash_thread_destroy_chain' mangled-name='_PyTrash_thread_destroy_chain' filepath='./Include/cpython/object.h' line='469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTrash_thread_destroy_chain'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_HashPointer' mangled-name='Py_HashPointer' filepath='./Include/cpython/pyhash.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_HashPointer'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-301'/> + </function-decl> + <var-decl name='PyClassMethodDescr_Type' type-id='type-id-266' mangled-name='PyClassMethodDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='19' column='1' elf-symbol-id='PyClassMethodDescr_Type'/> + <var-decl name='PyGetSetDescr_Type' type-id='type-id-266' mangled-name='PyGetSetDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='20' column='1' elf-symbol-id='PyGetSetDescr_Type'/> + <var-decl name='PyMemberDescr_Type' type-id='type-id-266' mangled-name='PyMemberDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='21' column='1' elf-symbol-id='PyMemberDescr_Type'/> + <var-decl name='PyMethodDescr_Type' type-id='type-id-266' mangled-name='PyMethodDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='22' column='1' elf-symbol-id='PyMethodDescr_Type'/> + <var-decl name='PyWrapperDescr_Type' type-id='type-id-266' mangled-name='PyWrapperDescr_Type' visibility='default' filepath='./Include/descrobject.h' line='23' column='1' elf-symbol-id='PyWrapperDescr_Type'/> + <var-decl name='PyDictProxy_Type' type-id='type-id-266' mangled-name='PyDictProxy_Type' visibility='default' filepath='./Include/descrobject.h' line='24' column='1' elf-symbol-id='PyDictProxy_Type'/> + <var-decl name='PyProperty_Type' type-id='type-id-266' mangled-name='PyProperty_Type' visibility='default' filepath='./Include/descrobject.h' line='25' column='1' elf-symbol-id='PyProperty_Type'/> + <function-decl name='PyMember_GetOne' mangled-name='PyMember_GetOne' filepath='./Include/descrobject.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMember_GetOne'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-333'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMember_SetOne' mangled-name='PyMember_SetOne' filepath='./Include/descrobject.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMember_SetOne'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-333'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Contains' mangled-name='PyDict_Contains' filepath='./Include/dictobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Contains'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_RealIsSubclass' filepath='./Include/internal/pycore_abstract.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyMethodWrapper_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_descrobject.h' line='23' column='1'/> + <function-decl name='_PyArg_UnpackStack' filepath='./Include/internal/pycore_modsupport.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_SetDeferredRefcount' filepath='./Include/internal/pycore_object.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyType_GetDocFromInternalDoc' filepath='./Include/internal/pycore_object.h' line='699' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyType_GetTextSignatureFromInternalDoc' filepath='./Include/internal/pycore_object.h' line='700' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_IsAbstract' filepath='./Include/internal/pycore_object.h' line='750' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCMethod_New' mangled-name='PyCMethod_New' filepath='./Include/methodobject.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCMethod_New'> + <parameter type-id='type-id-176'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetQualName' mangled-name='PyType_GetQualName' filepath='./Include/object.h' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetQualName'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_SetAttr' mangled-name='PyObject_SetAttr' filepath='./Include/object.h' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttr'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThreadState_Get' mangled-name='PyThreadState_Get' filepath='./Include/pystate.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Get'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyTuple_GetSlice' mangled-name='PyTuple_GetSlice' filepath='./Include/tupleobject.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_GetSlice'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_NewMethod' mangled-name='PyDescr_NewMethod' filepath='Objects/descrobject.c' line='926' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewMethod'> + <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='926' column='1'/> + <parameter type-id='type-id-176' name='method' filepath='Objects/descrobject.c' line='926' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_NewClassMethod' mangled-name='PyDescr_NewClassMethod' filepath='Objects/descrobject.c' line='972' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewClassMethod'> + <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='972' column='1'/> + <parameter type-id='type-id-176' name='method' filepath='Objects/descrobject.c' line='972' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_NewMember' mangled-name='PyDescr_NewMember' filepath='Objects/descrobject.c' line='984' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewMember'> + <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='984' column='1'/> + <parameter type-id='type-id-333' name='member' filepath='Objects/descrobject.c' line='984' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_NewGetSet' mangled-name='PyDescr_NewGetSet' filepath='Objects/descrobject.c' line='1002' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewGetSet'> + <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='1002' column='1'/> + <parameter type-id='type-id-334' name='getset' filepath='Objects/descrobject.c' line='1002' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_NewWrapper' mangled-name='PyDescr_NewWrapper' filepath='Objects/descrobject.c' line='1014' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_NewWrapper'> + <parameter type-id='type-id-1' name='type' filepath='Objects/descrobject.c' line='1014' column='1'/> + <parameter type-id='type-id-332' name='base' filepath='Objects/descrobject.c' line='1014' column='1'/> + <parameter type-id='type-id-30' name='wrapped' filepath='Objects/descrobject.c' line='1014' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDescr_IsData' mangled-name='PyDescr_IsData' filepath='Objects/descrobject.c' line='1028' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDescr_IsData'> + <parameter type-id='type-id-4' name='ob' filepath='Objects/descrobject.c' line='1028' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDictProxy_New' mangled-name='PyDictProxy_New' filepath='Objects/descrobject.c' line='1279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDictProxy_New'> + <parameter type-id='type-id-4' name='mapping' filepath='Objects/descrobject.c' line='1279' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyWrapper_New' mangled-name='PyWrapper_New' filepath='Objects/descrobject.c' line='1489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWrapper_New'> + <parameter type-id='type-id-4' name='d' filepath='Objects/descrobject.c' line='1489' column='1'/> + <parameter type-id='type-id-4' name='self' filepath='Objects/descrobject.c' line='1489' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/dictobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyObject_AssertFailed' mangled-name='_PyObject_AssertFailed' filepath='./Include/cpython/object.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_AssertFailed'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_IS_GC' mangled-name='PyObject_IS_GC' filepath='./Include/cpython/objimpl.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_IS_GC'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyDict_Type' type-id='type-id-266' mangled-name='PyDict_Type' visibility='default' filepath='./Include/dictobject.h' line='15' column='1' elf-symbol-id='PyDict_Type'/> + <var-decl name='PyDictKeys_Type' type-id='type-id-266' mangled-name='PyDictKeys_Type' visibility='default' filepath='./Include/dictobject.h' line='77' column='1' elf-symbol-id='PyDictKeys_Type'/> + <var-decl name='PyDictValues_Type' type-id='type-id-266' mangled-name='PyDictValues_Type' visibility='default' filepath='./Include/dictobject.h' line='78' column='1' elf-symbol-id='PyDictValues_Type'/> + <var-decl name='PyDictItems_Type' type-id='type-id-266' mangled-name='PyDictItems_Type' visibility='default' filepath='./Include/dictobject.h' line='79' column='1' elf-symbol-id='PyDictItems_Type'/> + <var-decl name='PyDictIterKey_Type' type-id='type-id-266' mangled-name='PyDictIterKey_Type' visibility='default' filepath='./Include/dictobject.h' line='90' column='1' elf-symbol-id='PyDictIterKey_Type'/> + <var-decl name='PyDictIterValue_Type' type-id='type-id-266' mangled-name='PyDictIterValue_Type' visibility='default' filepath='./Include/dictobject.h' line='91' column='1' elf-symbol-id='PyDictIterValue_Type'/> + <var-decl name='PyDictIterItem_Type' type-id='type-id-266' mangled-name='PyDictIterItem_Type' visibility='default' filepath='./Include/dictobject.h' line='92' column='1' elf-symbol-id='PyDictIterItem_Type'/> + <var-decl name='PyDictRevIterKey_Type' type-id='type-id-266' mangled-name='PyDictRevIterKey_Type' visibility='default' filepath='./Include/dictobject.h' line='94' column='1' elf-symbol-id='PyDictRevIterKey_Type'/> + <var-decl name='PyDictRevIterItem_Type' type-id='type-id-266' mangled-name='PyDictRevIterItem_Type' visibility='default' filepath='./Include/dictobject.h' line='95' column='1' elf-symbol-id='PyDictRevIterItem_Type'/> + <var-decl name='PyDictRevIterValue_Type' type-id='type-id-266' mangled-name='PyDictRevIterValue_Type' visibility='default' filepath='./Include/dictobject.h' line='96' column='1' elf-symbol-id='PyDictRevIterValue_Type'/> + <function-decl name='_PyType_AllocNoTrack' filepath='./Include/internal/pycore_object.h' line='695' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_ComputedDictPointer' filepath='./Include/internal/pycore_object.h' line='744' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-238'/> + </function-decl> + <function-decl name='_PyErr_GetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PySet_Update' mangled-name='_PySet_Update' filepath='./Include/internal/pycore_setobject.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_Update'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyArg_ValidateKeywordArguments' mangled-name='PyArg_ValidateKeywordArguments' filepath='./Include/modsupport.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ValidateKeywordArguments'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyInterpreterState_Get' mangled-name='PyInterpreterState_Get' filepath='./Include/pystate.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Get'> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='_PyDict_NewPresized' mangled-name='_PyDict_NewPresized' filepath='Objects/dictobject.c' line='2131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_NewPresized'> + <parameter type-id='type-id-7' name='minused' filepath='Objects/dictobject.c' line='2131' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_GetItem_KnownHash' mangled-name='_PyDict_GetItem_KnownHash' filepath='Objects/dictobject.c' line='2259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItem_KnownHash'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2259' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2259' column='1'/> + <parameter type-id='type-id-301' name='hash' filepath='Objects/dictobject.c' line='2259' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_GetItemRef_KnownHash_LockHeld' mangled-name='_PyDict_GetItemRef_KnownHash_LockHeld' filepath='Objects/dictobject.c' line='2285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemRef_KnownHash_LockHeld'> + <parameter type-id='type-id-335' name='op' filepath='Objects/dictobject.c' line='2285' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2285' column='1'/> + <parameter type-id='type-id-301' name='hash' filepath='Objects/dictobject.c' line='2286' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/dictobject.c' line='2286' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_GetItemStringWithError' mangled-name='_PyDict_GetItemStringWithError' filepath='Objects/dictobject.c' line='2433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_GetItemStringWithError'> + <parameter type-id='type-id-4' name='v' filepath='Objects/dictobject.c' line='2433' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2433' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_LoadGlobal' mangled-name='_PyDict_LoadGlobal' filepath='Objects/dictobject.c' line='2458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_LoadGlobal'> + <parameter type-id='type-id-335' name='globals' filepath='Objects/dictobject.c' line='2458' column='1'/> + <parameter type-id='type-id-335' name='builtins' filepath='Objects/dictobject.c' line='2458' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2458' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_SetItem_Take2' mangled-name='_PyDict_SetItem_Take2' filepath='Objects/dictobject.c' line='2508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_Take2'> + <parameter type-id='type-id-335' name='mp' filepath='Objects/dictobject.c' line='2508' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2508' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/dictobject.c' line='2508' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_SetItem_KnownHash_LockHeld' mangled-name='_PyDict_SetItem_KnownHash_LockHeld' filepath='Objects/dictobject.c' line='2547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash_LockHeld'> + <parameter type-id='type-id-335' name='mp' filepath='Objects/dictobject.c' line='2547' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2547' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/dictobject.c' line='2547' column='1'/> + <parameter type-id='type-id-301' name='hash' filepath='Objects/dictobject.c' line='2548' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_SetItem_KnownHash' mangled-name='_PyDict_SetItem_KnownHash' filepath='Objects/dictobject.c' line='2559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SetItem_KnownHash'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2559' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2559' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/dictobject.c' line='2559' column='1'/> + <parameter type-id='type-id-301' name='hash' filepath='Objects/dictobject.c' line='2560' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_DelItem_KnownHash' mangled-name='_PyDict_DelItem_KnownHash' filepath='Objects/dictobject.c' line='2684' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItem_KnownHash'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2684' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2684' column='1'/> + <parameter type-id='type-id-301' name='hash' filepath='Objects/dictobject.c' line='2684' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_DelItemIf' mangled-name='_PyDict_DelItemIf' filepath='Objects/dictobject.c' line='2739' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_DelItemIf'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2739' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='2739' column='1'/> + <parameter type-id='type-id-336' name='predicate' filepath='Objects/dictobject.c' line='2740' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Objects/dictobject.c' line='2741' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Clear' mangled-name='PyDict_Clear' filepath='Objects/dictobject.c' line='2801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Clear'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2801' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyDict_PopString' mangled-name='PyDict_PopString' filepath='Objects/dictobject.c' line='2993' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_PopString'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='2993' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='2993' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/dictobject.c' line='2993' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_Pop' mangled-name='_PyDict_Pop' filepath='Objects/dictobject.c' line='3010' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_Pop'> + <parameter type-id='type-id-4' name='dict' filepath='Objects/dictobject.c' line='3010' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='3010' column='1'/> + <parameter type-id='type-id-4' name='default_value' filepath='Objects/dictobject.c' line='3010' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_MergeFromSeq2' mangled-name='PyDict_MergeFromSeq2' filepath='Objects/dictobject.c' line='3674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_MergeFromSeq2'> + <parameter type-id='type-id-4' name='d' filepath='Objects/dictobject.c' line='3674' column='1'/> + <parameter type-id='type-id-4' name='seq2' filepath='Objects/dictobject.c' line='3674' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='3674' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Merge' mangled-name='PyDict_Merge' filepath='Objects/dictobject.c' line='3893' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Merge'> + <parameter type-id='type-id-4' name='a' filepath='Objects/dictobject.c' line='3893' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Objects/dictobject.c' line='3893' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='3893' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_MergeEx' mangled-name='_PyDict_MergeEx' filepath='Objects/dictobject.c' line='3901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_MergeEx'> + <parameter type-id='type-id-4' name='a' filepath='Objects/dictobject.c' line='3901' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Objects/dictobject.c' line='3901' column='1'/> + <parameter type-id='type-id-5' name='override' filepath='Objects/dictobject.c' line='3901' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_SetDefaultRef' mangled-name='PyDict_SetDefaultRef' filepath='Objects/dictobject.c' line='4327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefaultRef'> + <parameter type-id='type-id-4' name='d' filepath='Objects/dictobject.c' line='4327' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4327' column='1'/> + <parameter type-id='type-id-4' name='default_value' filepath='Objects/dictobject.c' line='4327' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/dictobject.c' line='4328' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_SetDefault' mangled-name='PyDict_SetDefault' filepath='Objects/dictobject.c' line='4338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetDefault'> + <parameter type-id='type-id-4' name='d' filepath='Objects/dictobject.c' line='4338' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/dictobject.c' line='4338' column='1'/> + <parameter type-id='type-id-4' name='defaultobj' filepath='Objects/dictobject.c' line='4338' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_SizeOf' mangled-name='_PyDict_SizeOf' filepath='Objects/dictobject.c' line='4564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDict_SizeOf'> + <parameter type-id='type-id-335' name='mp' filepath='Objects/dictobject.c' line='4564' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyDict_ContainsString' mangled-name='PyDict_ContainsString' filepath='Objects/dictobject.c' line='4671' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_ContainsString'> + <parameter type-id='type-id-4' name='op' filepath='Objects/dictobject.c' line='4671' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4671' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_GetItemString' mangled-name='PyDict_GetItemString' filepath='Objects/dictobject.c' line='4873' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemString'> + <parameter type-id='type-id-4' name='v' filepath='Objects/dictobject.c' line='4873' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4873' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_GetItemStringRef' mangled-name='PyDict_GetItemStringRef' filepath='Objects/dictobject.c' line='4891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemStringRef'> + <parameter type-id='type-id-4' name='v' filepath='Objects/dictobject.c' line='4891' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4891' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/dictobject.c' line='4891' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_DelItemString' mangled-name='PyDict_DelItemString' filepath='Objects/dictobject.c' line='4938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItemString'> + <parameter type-id='type-id-4' name='v' filepath='Objects/dictobject.c' line='4938' column='1'/> + <parameter type-id='type-id-6' name='key' filepath='Objects/dictobject.c' line='4938' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_VisitManagedDict' mangled-name='PyObject_VisitManagedDict' filepath='Objects/dictobject.c' line='7072' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_VisitManagedDict'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/dictobject.c' line='7072' column='1'/> + <parameter type-id='type-id-337' name='visit' filepath='Objects/dictobject.c' line='7072' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Objects/dictobject.c' line='7072' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_SetManagedDict' mangled-name='_PyObject_SetManagedDict' filepath='Objects/dictobject.c' line='7110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_SetManagedDict'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/dictobject.c' line='7110' column='1'/> + <parameter type-id='type-id-4' name='new_dict' filepath='Objects/dictobject.c' line='7110' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_ClearManagedDict' mangled-name='PyObject_ClearManagedDict' filepath='Objects/dictobject.c' line='7173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_ClearManagedDict'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/dictobject.c' line='7173' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyDict_Watch' mangled-name='PyDict_Watch' filepath='Objects/dictobject.c' line='7359' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Watch'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/dictobject.c' line='7359' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Objects/dictobject.c' line='7359' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Unwatch' mangled-name='PyDict_Unwatch' filepath='Objects/dictobject.c' line='7374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Unwatch'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/dictobject.c' line='7374' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Objects/dictobject.c' line='7374' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_AddWatcher' mangled-name='PyDict_AddWatcher' filepath='Objects/dictobject.c' line='7389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_AddWatcher'> + <parameter type-id='type-id-338' name='callback' filepath='Objects/dictobject.c' line='7389' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_ClearWatcher' mangled-name='PyDict_ClearWatcher' filepath='Objects/dictobject.c' line='7406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_ClearWatcher'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/dictobject.c' line='7406' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-339'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/enumobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyEnum_Type' type-id='type-id-266' mangled-name='PyEnum_Type' visibility='default' filepath='./Include/enumobject.h' line='10' column='1' elf-symbol-id='PyEnum_Type'/> + <var-decl name='PyReversed_Type' type-id='type-id-266' mangled-name='PyReversed_Type' visibility='default' filepath='./Include/enumobject.h' line='11' column='1' elf-symbol-id='PyReversed_Type'/> + <function-decl name='_PyUnicode_EqualToASCIIString' mangled-name='_PyUnicode_EqualToASCIIString' filepath='./Include/internal/pycore_unicodeobject.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EqualToASCIIString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/exceptions.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-17' const='yes' id='type-id-340'/> + <pointer-type-def type-id='type-id-340' size-in-bits='64' id='type-id-127'/> + <var-decl name='PyExc_PythonFinalizationError' type-id='type-id-4' mangled-name='PyExc_PythonFinalizationError' visibility='default' filepath='./Include/cpython/pyerrors.h' line='129' column='1' elf-symbol-id='PyExc_PythonFinalizationError'/> + <function-decl name='PyDict_New' mangled-name='PyDict_New' filepath='./Include/dictobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_New'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_GetItemWithError' mangled-name='PyDict_GetItemWithError' filepath='./Include/dictobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItemWithError'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_SetItem' mangled-name='PyDict_SetItem' filepath='./Include/dictobject.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Copy' mangled-name='PyDict_Copy' filepath='./Include/dictobject.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Copy'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_SetItemString' mangled-name='PyDict_SetItemString' filepath='./Include/dictobject.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_SetItemString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GenericGetDict' mangled-name='PyObject_GenericGetDict' filepath='./Include/dictobject.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericGetDict'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_SetRaisedException' filepath='./Include/internal/pycore_pyerrors.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='_PyExc_IncompleteInputError' type-id='type-id-266' mangled-name='_PyExc_IncompleteInputError' visibility='default' filepath='./Include/internal/pycore_pyerrors.h' line='172' column='1' elf-symbol-id='_PyExc_IncompleteInputError'/> + <function-decl name='_PyStaticType_InitBuiltin' filepath='./Include/internal/pycore_typeobject.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyStaticType_FiniBuiltin' filepath='./Include/internal/pycore_typeobject.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyList_GetItem' mangled-name='PyList_GetItem' filepath='./Include/listobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_GetItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyArg_ParseTuple' mangled-name='PyArg_ParseTuple' filepath='./Include/modsupport.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ParseTuple'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyArg_ParseTupleAndKeywords' mangled-name='PyArg_ParseTupleAndKeywords' filepath='./Include/modsupport.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_ParseTupleAndKeywords'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-127'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_GetDict' mangled-name='PyModule_GetDict' filepath='./Include/moduleobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetDict'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Repr' mangled-name='PyObject_Repr' filepath='./Include/object.h' line='562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Repr'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GenericSetDict' mangled-name='PyObject_GenericSetDict' filepath='./Include/object.h' line='588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GenericSetDict'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyExc_BaseException' type-id='type-id-4' mangled-name='PyExc_BaseException' visibility='default' filepath='./Include/pyerrors.h' line='76' column='1' elf-symbol-id='PyExc_BaseException'/> + <var-decl name='PyExc_Exception' type-id='type-id-4' mangled-name='PyExc_Exception' visibility='default' filepath='./Include/pyerrors.h' line='77' column='1' elf-symbol-id='PyExc_Exception'/> + <var-decl name='PyExc_BaseExceptionGroup' type-id='type-id-4' mangled-name='PyExc_BaseExceptionGroup' visibility='default' filepath='./Include/pyerrors.h' line='78' column='1' elf-symbol-id='PyExc_BaseExceptionGroup'/> + <var-decl name='PyExc_StopAsyncIteration' type-id='type-id-4' mangled-name='PyExc_StopAsyncIteration' visibility='default' filepath='./Include/pyerrors.h' line='80' column='1' elf-symbol-id='PyExc_StopAsyncIteration'/> + <var-decl name='PyExc_StopIteration' type-id='type-id-4' mangled-name='PyExc_StopIteration' visibility='default' filepath='./Include/pyerrors.h' line='82' column='1' elf-symbol-id='PyExc_StopIteration'/> + <var-decl name='PyExc_GeneratorExit' type-id='type-id-4' mangled-name='PyExc_GeneratorExit' visibility='default' filepath='./Include/pyerrors.h' line='83' column='1' elf-symbol-id='PyExc_GeneratorExit'/> + <var-decl name='PyExc_ArithmeticError' type-id='type-id-4' mangled-name='PyExc_ArithmeticError' visibility='default' filepath='./Include/pyerrors.h' line='84' column='1' elf-symbol-id='PyExc_ArithmeticError'/> + <var-decl name='PyExc_LookupError' type-id='type-id-4' mangled-name='PyExc_LookupError' visibility='default' filepath='./Include/pyerrors.h' line='85' column='1' elf-symbol-id='PyExc_LookupError'/> + <var-decl name='PyExc_AssertionError' type-id='type-id-4' mangled-name='PyExc_AssertionError' visibility='default' filepath='./Include/pyerrors.h' line='87' column='1' elf-symbol-id='PyExc_AssertionError'/> + <var-decl name='PyExc_AttributeError' type-id='type-id-4' mangled-name='PyExc_AttributeError' visibility='default' filepath='./Include/pyerrors.h' line='88' column='1' elf-symbol-id='PyExc_AttributeError'/> + <var-decl name='PyExc_BufferError' type-id='type-id-4' mangled-name='PyExc_BufferError' visibility='default' filepath='./Include/pyerrors.h' line='89' column='1' elf-symbol-id='PyExc_BufferError'/> + <var-decl name='PyExc_EOFError' type-id='type-id-4' mangled-name='PyExc_EOFError' visibility='default' filepath='./Include/pyerrors.h' line='90' column='1' elf-symbol-id='PyExc_EOFError'/> + <var-decl name='PyExc_FloatingPointError' type-id='type-id-4' mangled-name='PyExc_FloatingPointError' visibility='default' filepath='./Include/pyerrors.h' line='91' column='1' elf-symbol-id='PyExc_FloatingPointError'/> + <var-decl name='PyExc_OSError' type-id='type-id-4' mangled-name='PyExc_OSError' visibility='default' filepath='./Include/pyerrors.h' line='92' column='1' elf-symbol-id='PyExc_OSError'/> + <var-decl name='PyExc_ImportError' type-id='type-id-4' mangled-name='PyExc_ImportError' visibility='default' filepath='./Include/pyerrors.h' line='93' column='1' elf-symbol-id='PyExc_ImportError'/> + <var-decl name='PyExc_ModuleNotFoundError' type-id='type-id-4' mangled-name='PyExc_ModuleNotFoundError' visibility='default' filepath='./Include/pyerrors.h' line='95' column='1' elf-symbol-id='PyExc_ModuleNotFoundError'/> + <var-decl name='PyExc_IndexError' type-id='type-id-4' mangled-name='PyExc_IndexError' visibility='default' filepath='./Include/pyerrors.h' line='97' column='1' elf-symbol-id='PyExc_IndexError'/> + <var-decl name='PyExc_KeyError' type-id='type-id-4' mangled-name='PyExc_KeyError' visibility='default' filepath='./Include/pyerrors.h' line='98' column='1' elf-symbol-id='PyExc_KeyError'/> + <var-decl name='PyExc_KeyboardInterrupt' type-id='type-id-4' mangled-name='PyExc_KeyboardInterrupt' visibility='default' filepath='./Include/pyerrors.h' line='99' column='1' elf-symbol-id='PyExc_KeyboardInterrupt'/> + <var-decl name='PyExc_MemoryError' type-id='type-id-4' mangled-name='PyExc_MemoryError' visibility='default' filepath='./Include/pyerrors.h' line='100' column='1' elf-symbol-id='PyExc_MemoryError'/> + <var-decl name='PyExc_NameError' type-id='type-id-4' mangled-name='PyExc_NameError' visibility='default' filepath='./Include/pyerrors.h' line='101' column='1' elf-symbol-id='PyExc_NameError'/> + <var-decl name='PyExc_OverflowError' type-id='type-id-4' mangled-name='PyExc_OverflowError' visibility='default' filepath='./Include/pyerrors.h' line='102' column='1' elf-symbol-id='PyExc_OverflowError'/> + <var-decl name='PyExc_RuntimeError' type-id='type-id-4' mangled-name='PyExc_RuntimeError' visibility='default' filepath='./Include/pyerrors.h' line='103' column='1' elf-symbol-id='PyExc_RuntimeError'/> + <var-decl name='PyExc_RecursionError' type-id='type-id-4' mangled-name='PyExc_RecursionError' visibility='default' filepath='./Include/pyerrors.h' line='105' column='1' elf-symbol-id='PyExc_RecursionError'/> + <var-decl name='PyExc_NotImplementedError' type-id='type-id-4' mangled-name='PyExc_NotImplementedError' visibility='default' filepath='./Include/pyerrors.h' line='107' column='1' elf-symbol-id='PyExc_NotImplementedError'/> + <var-decl name='PyExc_SyntaxError' type-id='type-id-4' mangled-name='PyExc_SyntaxError' visibility='default' filepath='./Include/pyerrors.h' line='108' column='1' elf-symbol-id='PyExc_SyntaxError'/> + <var-decl name='PyExc_IndentationError' type-id='type-id-4' mangled-name='PyExc_IndentationError' visibility='default' filepath='./Include/pyerrors.h' line='109' column='1' elf-symbol-id='PyExc_IndentationError'/> + <var-decl name='PyExc_TabError' type-id='type-id-4' mangled-name='PyExc_TabError' visibility='default' filepath='./Include/pyerrors.h' line='110' column='1' elf-symbol-id='PyExc_TabError'/> + <var-decl name='PyExc_ReferenceError' type-id='type-id-4' mangled-name='PyExc_ReferenceError' visibility='default' filepath='./Include/pyerrors.h' line='111' column='1' elf-symbol-id='PyExc_ReferenceError'/> + <var-decl name='PyExc_SystemError' type-id='type-id-4' mangled-name='PyExc_SystemError' visibility='default' filepath='./Include/pyerrors.h' line='112' column='1' elf-symbol-id='PyExc_SystemError'/> + <var-decl name='PyExc_SystemExit' type-id='type-id-4' mangled-name='PyExc_SystemExit' visibility='default' filepath='./Include/pyerrors.h' line='113' column='1' elf-symbol-id='PyExc_SystemExit'/> + <var-decl name='PyExc_TypeError' type-id='type-id-4' mangled-name='PyExc_TypeError' visibility='default' filepath='./Include/pyerrors.h' line='114' column='1' elf-symbol-id='PyExc_TypeError'/> + <var-decl name='PyExc_UnboundLocalError' type-id='type-id-4' mangled-name='PyExc_UnboundLocalError' visibility='default' filepath='./Include/pyerrors.h' line='115' column='1' elf-symbol-id='PyExc_UnboundLocalError'/> + <var-decl name='PyExc_UnicodeError' type-id='type-id-4' mangled-name='PyExc_UnicodeError' visibility='default' filepath='./Include/pyerrors.h' line='116' column='1' elf-symbol-id='PyExc_UnicodeError'/> + <var-decl name='PyExc_UnicodeEncodeError' type-id='type-id-4' mangled-name='PyExc_UnicodeEncodeError' visibility='default' filepath='./Include/pyerrors.h' line='117' column='1' elf-symbol-id='PyExc_UnicodeEncodeError'/> + <var-decl name='PyExc_UnicodeDecodeError' type-id='type-id-4' mangled-name='PyExc_UnicodeDecodeError' visibility='default' filepath='./Include/pyerrors.h' line='118' column='1' elf-symbol-id='PyExc_UnicodeDecodeError'/> + <var-decl name='PyExc_UnicodeTranslateError' type-id='type-id-4' mangled-name='PyExc_UnicodeTranslateError' visibility='default' filepath='./Include/pyerrors.h' line='119' column='1' elf-symbol-id='PyExc_UnicodeTranslateError'/> + <var-decl name='PyExc_ValueError' type-id='type-id-4' mangled-name='PyExc_ValueError' visibility='default' filepath='./Include/pyerrors.h' line='120' column='1' elf-symbol-id='PyExc_ValueError'/> + <var-decl name='PyExc_ZeroDivisionError' type-id='type-id-4' mangled-name='PyExc_ZeroDivisionError' visibility='default' filepath='./Include/pyerrors.h' line='121' column='1' elf-symbol-id='PyExc_ZeroDivisionError'/> + <var-decl name='PyExc_BlockingIOError' type-id='type-id-4' mangled-name='PyExc_BlockingIOError' visibility='default' filepath='./Include/pyerrors.h' line='124' column='1' elf-symbol-id='PyExc_BlockingIOError'/> + <var-decl name='PyExc_BrokenPipeError' type-id='type-id-4' mangled-name='PyExc_BrokenPipeError' visibility='default' filepath='./Include/pyerrors.h' line='125' column='1' elf-symbol-id='PyExc_BrokenPipeError'/> + <var-decl name='PyExc_ChildProcessError' type-id='type-id-4' mangled-name='PyExc_ChildProcessError' visibility='default' filepath='./Include/pyerrors.h' line='126' column='1' elf-symbol-id='PyExc_ChildProcessError'/> + <var-decl name='PyExc_ConnectionError' type-id='type-id-4' mangled-name='PyExc_ConnectionError' visibility='default' filepath='./Include/pyerrors.h' line='127' column='1' elf-symbol-id='PyExc_ConnectionError'/> + <var-decl name='PyExc_ConnectionAbortedError' type-id='type-id-4' mangled-name='PyExc_ConnectionAbortedError' visibility='default' filepath='./Include/pyerrors.h' line='128' column='1' elf-symbol-id='PyExc_ConnectionAbortedError'/> + <var-decl name='PyExc_ConnectionRefusedError' type-id='type-id-4' mangled-name='PyExc_ConnectionRefusedError' visibility='default' filepath='./Include/pyerrors.h' line='129' column='1' elf-symbol-id='PyExc_ConnectionRefusedError'/> + <var-decl name='PyExc_ConnectionResetError' type-id='type-id-4' mangled-name='PyExc_ConnectionResetError' visibility='default' filepath='./Include/pyerrors.h' line='130' column='1' elf-symbol-id='PyExc_ConnectionResetError'/> + <var-decl name='PyExc_FileExistsError' type-id='type-id-4' mangled-name='PyExc_FileExistsError' visibility='default' filepath='./Include/pyerrors.h' line='131' column='1' elf-symbol-id='PyExc_FileExistsError'/> + <var-decl name='PyExc_FileNotFoundError' type-id='type-id-4' mangled-name='PyExc_FileNotFoundError' visibility='default' filepath='./Include/pyerrors.h' line='132' column='1' elf-symbol-id='PyExc_FileNotFoundError'/> + <var-decl name='PyExc_InterruptedError' type-id='type-id-4' mangled-name='PyExc_InterruptedError' visibility='default' filepath='./Include/pyerrors.h' line='133' column='1' elf-symbol-id='PyExc_InterruptedError'/> + <var-decl name='PyExc_IsADirectoryError' type-id='type-id-4' mangled-name='PyExc_IsADirectoryError' visibility='default' filepath='./Include/pyerrors.h' line='134' column='1' elf-symbol-id='PyExc_IsADirectoryError'/> + <var-decl name='PyExc_NotADirectoryError' type-id='type-id-4' mangled-name='PyExc_NotADirectoryError' visibility='default' filepath='./Include/pyerrors.h' line='135' column='1' elf-symbol-id='PyExc_NotADirectoryError'/> + <var-decl name='PyExc_PermissionError' type-id='type-id-4' mangled-name='PyExc_PermissionError' visibility='default' filepath='./Include/pyerrors.h' line='136' column='1' elf-symbol-id='PyExc_PermissionError'/> + <var-decl name='PyExc_ProcessLookupError' type-id='type-id-4' mangled-name='PyExc_ProcessLookupError' visibility='default' filepath='./Include/pyerrors.h' line='137' column='1' elf-symbol-id='PyExc_ProcessLookupError'/> + <var-decl name='PyExc_TimeoutError' type-id='type-id-4' mangled-name='PyExc_TimeoutError' visibility='default' filepath='./Include/pyerrors.h' line='138' column='1' elf-symbol-id='PyExc_TimeoutError'/> + <var-decl name='PyExc_EnvironmentError' type-id='type-id-4' mangled-name='PyExc_EnvironmentError' visibility='default' filepath='./Include/pyerrors.h' line='143' column='1' elf-symbol-id='PyExc_EnvironmentError'/> + <var-decl name='PyExc_IOError' type-id='type-id-4' mangled-name='PyExc_IOError' visibility='default' filepath='./Include/pyerrors.h' line='144' column='1' elf-symbol-id='PyExc_IOError'/> + <var-decl name='PyExc_Warning' type-id='type-id-4' mangled-name='PyExc_Warning' visibility='default' filepath='./Include/pyerrors.h' line='150' column='1' elf-symbol-id='PyExc_Warning'/> + <var-decl name='PyExc_UserWarning' type-id='type-id-4' mangled-name='PyExc_UserWarning' visibility='default' filepath='./Include/pyerrors.h' line='151' column='1' elf-symbol-id='PyExc_UserWarning'/> + <var-decl name='PyExc_DeprecationWarning' type-id='type-id-4' mangled-name='PyExc_DeprecationWarning' visibility='default' filepath='./Include/pyerrors.h' line='152' column='1' elf-symbol-id='PyExc_DeprecationWarning'/> + <var-decl name='PyExc_PendingDeprecationWarning' type-id='type-id-4' mangled-name='PyExc_PendingDeprecationWarning' visibility='default' filepath='./Include/pyerrors.h' line='153' column='1' elf-symbol-id='PyExc_PendingDeprecationWarning'/> + <var-decl name='PyExc_SyntaxWarning' type-id='type-id-4' mangled-name='PyExc_SyntaxWarning' visibility='default' filepath='./Include/pyerrors.h' line='154' column='1' elf-symbol-id='PyExc_SyntaxWarning'/> + <var-decl name='PyExc_RuntimeWarning' type-id='type-id-4' mangled-name='PyExc_RuntimeWarning' visibility='default' filepath='./Include/pyerrors.h' line='155' column='1' elf-symbol-id='PyExc_RuntimeWarning'/> + <var-decl name='PyExc_FutureWarning' type-id='type-id-4' mangled-name='PyExc_FutureWarning' visibility='default' filepath='./Include/pyerrors.h' line='156' column='1' elf-symbol-id='PyExc_FutureWarning'/> + <var-decl name='PyExc_ImportWarning' type-id='type-id-4' mangled-name='PyExc_ImportWarning' visibility='default' filepath='./Include/pyerrors.h' line='157' column='1' elf-symbol-id='PyExc_ImportWarning'/> + <var-decl name='PyExc_UnicodeWarning' type-id='type-id-4' mangled-name='PyExc_UnicodeWarning' visibility='default' filepath='./Include/pyerrors.h' line='158' column='1' elf-symbol-id='PyExc_UnicodeWarning'/> + <var-decl name='PyExc_BytesWarning' type-id='type-id-4' mangled-name='PyExc_BytesWarning' visibility='default' filepath='./Include/pyerrors.h' line='159' column='1' elf-symbol-id='PyExc_BytesWarning'/> + <var-decl name='PyExc_EncodingWarning' type-id='type-id-4' mangled-name='PyExc_EncodingWarning' visibility='default' filepath='./Include/pyerrors.h' line='160' column='1' elf-symbol-id='PyExc_EncodingWarning'/> + <var-decl name='PyExc_ResourceWarning' type-id='type-id-4' mangled-name='PyExc_ResourceWarning' visibility='default' filepath='./Include/pyerrors.h' line='161' column='1' elf-symbol-id='PyExc_ResourceWarning'/> + <function-decl name='PyErr_NewException' mangled-name='PyErr_NewException' filepath='./Include/pyerrors.h' line='229' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NewException'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySet_New' mangled-name='PySet_New' filepath='./Include/setobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_New'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySet_Add' mangled-name='PySet_Add' filepath='./Include/setobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Add'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySet_Contains' mangled-name='PySet_Contains' filepath='./Include/setobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Contains'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTuple_Size' mangled-name='PyTuple_Size' filepath='./Include/tupleobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_Size'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_ReadChar' mangled-name='PyUnicode_ReadChar' filepath='./Include/unicodeobject.h' line='169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_ReadChar'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-259'/> + </function-decl> + <function-decl name='PyException_GetTraceback' mangled-name='PyException_GetTraceback' filepath='Objects/exceptions.c' line='378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetTraceback'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='378' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyException_SetTraceback' mangled-name='PyException_SetTraceback' filepath='Objects/exceptions.c' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetTraceback'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='386' column='1'/> + <parameter type-id='type-id-4' name='tb' filepath='Objects/exceptions.c' line='386' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyException_GetCause' mangled-name='PyException_GetCause' filepath='Objects/exceptions.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetCause'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='392' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyException_SetCause' mangled-name='PyException_SetCause' filepath='Objects/exceptions.c' line='400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetCause'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='400' column='1'/> + <parameter type-id='type-id-4' name='cause' filepath='Objects/exceptions.c' line='400' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyException_GetContext' mangled-name='PyException_GetContext' filepath='Objects/exceptions.c' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetContext'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='408' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyException_SetContext' mangled-name='PyException_SetContext' filepath='Objects/exceptions.c' line='416' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetContext'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='416' column='1'/> + <parameter type-id='type-id-4' name='context' filepath='Objects/exceptions.c' line='416' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyException_GetArgs' mangled-name='PyException_GetArgs' filepath='Objects/exceptions.c' line='422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_GetArgs'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='422' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyException_SetArgs' mangled-name='PyException_SetArgs' filepath='Objects/exceptions.c' line='429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyException_SetArgs'> + <parameter type-id='type-id-4' name='self' filepath='Objects/exceptions.c' line='429' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/exceptions.c' line='429' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyExceptionClass_Name' mangled-name='PyExceptionClass_Name' filepath='Objects/exceptions.c' line='436' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyExceptionClass_Name'> + <parameter type-id='type-id-4' name='ob' filepath='Objects/exceptions.c' line='436' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyUnstable_Exc_PrepReraiseStar' mangled-name='PyUnstable_Exc_PrepReraiseStar' filepath='Objects/exceptions.c' line='1435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Exc_PrepReraiseStar'> + <parameter type-id='type-id-4' name='orig' filepath='Objects/exceptions.c' line='1435' column='1'/> + <parameter type-id='type-id-4' name='excs' filepath='Objects/exceptions.c' line='1435' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_GetEncoding' mangled-name='PyUnicodeEncodeError_GetEncoding' filepath='Objects/exceptions.c' line='2677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetEncoding'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2677' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_GetEncoding' mangled-name='PyUnicodeDecodeError_GetEncoding' filepath='Objects/exceptions.c' line='2683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetEncoding'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2683' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_GetObject' mangled-name='PyUnicodeEncodeError_GetObject' filepath='Objects/exceptions.c' line='2689' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetObject'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2689' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_GetObject' mangled-name='PyUnicodeDecodeError_GetObject' filepath='Objects/exceptions.c' line='2695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetObject'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2695' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_GetObject' mangled-name='PyUnicodeTranslateError_GetObject' filepath='Objects/exceptions.c' line='2701' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetObject'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2701' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_GetStart' mangled-name='PyUnicodeEncodeError_GetStart' filepath='Objects/exceptions.c' line='2707' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2707' column='1'/> + <parameter type-id='type-id-8' name='start' filepath='Objects/exceptions.c' line='2707' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_GetStart' mangled-name='PyUnicodeDecodeError_GetStart' filepath='Objects/exceptions.c' line='2726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2726' column='1'/> + <parameter type-id='type-id-8' name='start' filepath='Objects/exceptions.c' line='2726' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_GetStart' mangled-name='PyUnicodeTranslateError_GetStart' filepath='Objects/exceptions.c' line='2744' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2744' column='1'/> + <parameter type-id='type-id-8' name='start' filepath='Objects/exceptions.c' line='2744' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_SetStart' mangled-name='PyUnicodeEncodeError_SetStart' filepath='Objects/exceptions.c' line='2751' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2751' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/exceptions.c' line='2751' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_SetStart' mangled-name='PyUnicodeDecodeError_SetStart' filepath='Objects/exceptions.c' line='2759' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2759' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/exceptions.c' line='2759' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_SetStart' mangled-name='PyUnicodeTranslateError_SetStart' filepath='Objects/exceptions.c' line='2767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetStart'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2767' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/exceptions.c' line='2767' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_GetEnd' mangled-name='PyUnicodeEncodeError_GetEnd' filepath='Objects/exceptions.c' line='2775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2775' column='1'/> + <parameter type-id='type-id-8' name='end' filepath='Objects/exceptions.c' line='2775' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_GetEnd' mangled-name='PyUnicodeDecodeError_GetEnd' filepath='Objects/exceptions.c' line='2794' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2794' column='1'/> + <parameter type-id='type-id-8' name='end' filepath='Objects/exceptions.c' line='2794' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_GetEnd' mangled-name='PyUnicodeTranslateError_GetEnd' filepath='Objects/exceptions.c' line='2812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2812' column='1'/> + <parameter type-id='type-id-8' name='end' filepath='Objects/exceptions.c' line='2812' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_SetEnd' mangled-name='PyUnicodeEncodeError_SetEnd' filepath='Objects/exceptions.c' line='2819' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2819' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/exceptions.c' line='2819' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_SetEnd' mangled-name='PyUnicodeDecodeError_SetEnd' filepath='Objects/exceptions.c' line='2827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2827' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/exceptions.c' line='2827' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_SetEnd' mangled-name='PyUnicodeTranslateError_SetEnd' filepath='Objects/exceptions.c' line='2835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetEnd'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2835' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/exceptions.c' line='2835' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_GetReason' mangled-name='PyUnicodeEncodeError_GetReason' filepath='Objects/exceptions.c' line='2842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_GetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2842' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_GetReason' mangled-name='PyUnicodeDecodeError_GetReason' filepath='Objects/exceptions.c' line='2849' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_GetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2849' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_GetReason' mangled-name='PyUnicodeTranslateError_GetReason' filepath='Objects/exceptions.c' line='2856' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_GetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2856' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicodeEncodeError_SetReason' mangled-name='PyUnicodeEncodeError_SetReason' filepath='Objects/exceptions.c' line='2863' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeEncodeError_SetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2863' column='1'/> + <parameter type-id='type-id-6' name='reason' filepath='Objects/exceptions.c' line='2863' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_SetReason' mangled-name='PyUnicodeDecodeError_SetReason' filepath='Objects/exceptions.c' line='2871' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_SetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2871' column='1'/> + <parameter type-id='type-id-6' name='reason' filepath='Objects/exceptions.c' line='2871' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeTranslateError_SetReason' mangled-name='PyUnicodeTranslateError_SetReason' filepath='Objects/exceptions.c' line='2879' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeTranslateError_SetReason'> + <parameter type-id='type-id-4' name='exc' filepath='Objects/exceptions.c' line='2879' column='1'/> + <parameter type-id='type-id-6' name='reason' filepath='Objects/exceptions.c' line='2879' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicodeDecodeError_Create' mangled-name='PyUnicodeDecodeError_Create' filepath='Objects/exceptions.c' line='3146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicodeDecodeError_Create'> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/exceptions.c' line='3147' column='1'/> + <parameter type-id='type-id-6' name='object' filepath='Objects/exceptions.c' line='3147' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/exceptions.c' line='3147' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/exceptions.c' line='3148' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/exceptions.c' line='3148' column='1'/> + <parameter type-id='type-id-6' name='reason' filepath='Objects/exceptions.c' line='3148' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/fileobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyStdPrinter_Type' type-id='type-id-266' mangled-name='PyStdPrinter_Type' visibility='default' filepath='./Include/cpython/fileobject.h' line='10' column='1' elf-symbol-id='PyStdPrinter_Type'/> + <function-decl name='_Py_write' mangled-name='_Py_write' filepath='./Include/internal/pycore_fileutils.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_write'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyUnicode_AsUTF8String' mangled-name='_PyUnicode_AsUTF8String' filepath='./Include/internal/pycore_unicodeobject.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8String'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_IsInitialized' mangled-name='Py_IsInitialized' filepath='./Include/pylifecycle.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsInitialized'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getc_unlocked' filepath='/usr/include/stdio.h' line='527' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='flockfile' filepath='/usr/include/stdio.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='funlockfile' filepath='/usr/include/stdio.h' line='874' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFile_FromFd' mangled-name='PyFile_FromFd' filepath='Objects/fileobject.c' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_FromFd'> + <parameter type-id='type-id-5' name='fd' filepath='Objects/fileobject.c' line='31' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/fileobject.c' line='31' column='1'/> + <parameter type-id='type-id-6' name='mode' filepath='Objects/fileobject.c' line='31' column='1'/> + <parameter type-id='type-id-5' name='buffering' filepath='Objects/fileobject.c' line='31' column='1'/> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/fileobject.c' line='31' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/fileobject.c' line='32' column='1'/> + <parameter type-id='type-id-6' name='newline' filepath='Objects/fileobject.c' line='32' column='1'/> + <parameter type-id='type-id-5' name='closefd' filepath='Objects/fileobject.c' line='32' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFile_GetLine' mangled-name='PyFile_GetLine' filepath='Objects/fileobject.c' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_GetLine'> + <parameter type-id='type-id-4' name='f' filepath='Objects/fileobject.c' line='52' column='1'/> + <parameter type-id='type-id-5' name='n' filepath='Objects/fileobject.c' line='52' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFile_WriteObject' mangled-name='PyFile_WriteObject' filepath='Objects/fileobject.c' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_WriteObject'> + <parameter type-id='type-id-4' name='v' filepath='Objects/fileobject.c' line='105' column='1'/> + <parameter type-id='type-id-4' name='f' filepath='Objects/fileobject.c' line='105' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/fileobject.c' line='105' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFile_WriteString' mangled-name='PyFile_WriteString' filepath='Objects/fileobject.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_WriteString'> + <parameter type-id='type-id-6' name='s' filepath='Objects/fileobject.c' line='135' column='1'/> + <parameter type-id='type-id-4' name='f' filepath='Objects/fileobject.c' line='135' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_AsFileDescriptor' mangled-name='PyObject_AsFileDescriptor' filepath='Objects/fileobject.c' line='165' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_AsFileDescriptor'> + <parameter type-id='type-id-4' name='o' filepath='Objects/fileobject.c' line='165' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_FileDescriptor_Converter' mangled-name='_PyLong_FileDescriptor_Converter' filepath='Objects/fileobject.c' line='218' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FileDescriptor_Converter'> + <parameter type-id='type-id-4' name='o' filepath='Objects/fileobject.c' line='218' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/fileobject.c' line='218' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_UniversalNewlineFgets' mangled-name='Py_UniversalNewlineFgets' filepath='Objects/fileobject.c' line='272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_UniversalNewlineFgets'> + <parameter type-id='type-id-17' name='buf' filepath='Objects/fileobject.c' line='272' column='1'/> + <parameter type-id='type-id-5' name='n' filepath='Objects/fileobject.c' line='272' column='1'/> + <parameter type-id='type-id-56' name='stream' filepath='Objects/fileobject.c' line='272' column='1'/> + <parameter type-id='type-id-4' name='fobj' filepath='Objects/fileobject.c' line='272' column='1'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyFile_NewStdPrinter' mangled-name='PyFile_NewStdPrinter' filepath='Objects/fileobject.c' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_NewStdPrinter'> + <parameter type-id='type-id-5' name='fd' filepath='Objects/fileobject.c' line='288' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFile_SetOpenCodeHook' mangled-name='PyFile_SetOpenCodeHook' filepath='Objects/fileobject.c' line='475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_SetOpenCodeHook'> + <parameter type-id='type-id-341' name='hook' filepath='Objects/fileobject.c' line='475' column='1'/> + <parameter type-id='type-id-30' name='userData' filepath='Objects/fileobject.c' line='475' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFile_OpenCodeObject' mangled-name='PyFile_OpenCodeObject' filepath='Objects/fileobject.c' line='495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_OpenCodeObject'> + <parameter type-id='type-id-4' name='path' filepath='Objects/fileobject.c' line='495' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFile_OpenCode' mangled-name='PyFile_OpenCode' filepath='Objects/fileobject.c' line='520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFile_OpenCode'> + <parameter type-id='type-id-6' name='utf8path' filepath='Objects/fileobject.c' line='520' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/floatobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyStructSequence_Field' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/structseq.h' line='10' column='1' id='type-id-342'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/structseq.h' line='11' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='doc' type-id='type-id-6' visibility='default' filepath='./Include/structseq.h' line='12' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyStructSequence_Field' type-id='type-id-342' filepath='./Include/structseq.h' line='13' column='1' id='type-id-343'/> + <class-decl name='PyStructSequence_Desc' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/structseq.h' line='15' column='1' id='type-id-344'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/structseq.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='doc' type-id='type-id-6' visibility='default' filepath='./Include/structseq.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fields' type-id='type-id-345' visibility='default' filepath='./Include/structseq.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='n_in_sequence' type-id='type-id-5' visibility='default' filepath='./Include/structseq.h' line='19' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyStructSequence_Desc' type-id='type-id-344' filepath='./Include/structseq.h' line='20' column='1' id='type-id-346'/> + <pointer-type-def type-id='type-id-346' size-in-bits='64' id='type-id-347'/> + <pointer-type-def type-id='type-id-343' size-in-bits='64' id='type-id-345'/> + <qualified-type-def type-id='type-id-248' restrict='yes' id='type-id-182'/> + <qualified-type-def type-id='type-id-6' restrict='yes' id='type-id-179'/> + <function-decl name='_PyLong_Sign' mangled-name='_PyLong_Sign' filepath='./Include/cpython/longobject.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Sign'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_NumBits' mangled-name='_PyLong_NumBits' filepath='./Include/cpython/longobject.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_NumBits'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-21'/> + </function-decl> + <var-decl name='PyFloat_Type' type-id='type-id-266' mangled-name='PyFloat_Type' visibility='default' filepath='./Include/floatobject.h' line='14' column='1' elf-symbol-id='PyFloat_Type'/> + <function-decl name='_Py_dg_strtod' filepath='./Include/internal/pycore_dtoa.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='_Py_dg_dtoa' filepath='./Include/internal/pycore_dtoa.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-248'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_Py_dg_freedtoa' filepath='./Include/internal/pycore_dtoa.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFloat_FormatAdvancedWriter' filepath='./Include/internal/pycore_floatobject.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_parse_inf_or_nan' filepath='./Include/internal/pycore_floatobject.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='_PyLong_Lshift' mangled-name='_PyLong_Lshift' filepath='./Include/internal/pycore_long.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Lshift'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDebugAllocatorStats' filepath='./Include/internal/pycore_object.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_get_387controlword' filepath='./Include/internal/pycore_pymath.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-22'/> + </function-decl> + <function-decl name='_Py_set_387controlword' filepath='./Include/internal/pycore_pymath.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-22'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyStructSequence_InitBuiltinWithFlags' filepath='./Include/internal/pycore_structseq.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-347'/> + <parameter type-id='type-id-2'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyStructSequence_FiniBuiltin' filepath='./Include/internal/pycore_structseq.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_FromASCII' filepath='./Include/internal/pycore_unicodeobject.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromDouble' mangled-name='PyLong_FromDouble' filepath='./Include/longobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromDouble'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetFromErrno' mangled-name='PyErr_SetFromErrno' filepath='./Include/pyerrors.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrno'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyStructSequence_New' mangled-name='PyStructSequence_New' filepath='./Include/structseq.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_New'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyStructSequence_SetItem' mangled-name='PyStructSequence_SetItem' filepath='./Include/structseq.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_SetItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='strtol' filepath='/usr/include/stdlib.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-182'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='frexp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='ldexp' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='101' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='modf' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-180'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='ceil' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='fmod' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='round' filepath='/usr/include/x86_64-linux-gnu/bits/mathcalls.h' line='301' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyFloat_GetMax' mangled-name='PyFloat_GetMax' filepath='Objects/floatobject.c' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMax'> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyFloat_GetMin' mangled-name='PyFloat_GetMin' filepath='Objects/floatobject.c' line='47' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetMin'> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyFloat_GetInfo' mangled-name='PyFloat_GetInfo' filepath='Objects/floatobject.c' line='91' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_GetInfo'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyFloat_ExactDealloc' mangled-name='_PyFloat_ExactDealloc' filepath='Objects/floatobject.c' line='248' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFloat_ExactDealloc'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/floatobject.c' line='248' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFloat_Pack2' mangled-name='PyFloat_Pack2' filepath='Objects/floatobject.c' line='2049' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack2'> + <parameter type-id='type-id-172' name='x' filepath='Objects/floatobject.c' line='2049' column='1'/> + <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2049' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2049' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFloat_Pack4' mangled-name='PyFloat_Pack4' filepath='Objects/floatobject.c' line='2154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack4'> + <parameter type-id='type-id-172' name='x' filepath='Objects/floatobject.c' line='2154' column='1'/> + <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2154' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2154' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFloat_Pack8' mangled-name='PyFloat_Pack8' filepath='Objects/floatobject.c' line='2262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Pack8'> + <parameter type-id='type-id-172' name='x' filepath='Objects/floatobject.c' line='2262' column='1'/> + <parameter type-id='type-id-17' name='data' filepath='Objects/floatobject.c' line='2262' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2262' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFloat_Unpack2' mangled-name='PyFloat_Unpack2' filepath='Objects/floatobject.c' line='2392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack2'> + <parameter type-id='type-id-6' name='data' filepath='Objects/floatobject.c' line='2392' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2392' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyFloat_Unpack4' mangled-name='PyFloat_Unpack4' filepath='Objects/floatobject.c' line='2444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack4'> + <parameter type-id='type-id-6' name='data' filepath='Objects/floatobject.c' line='2444' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2444' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyFloat_Unpack8' mangled-name='PyFloat_Unpack8' filepath='Objects/floatobject.c' line='2523' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_Unpack8'> + <parameter type-id='type-id-6' name='data' filepath='Objects/floatobject.c' line='2523' column='1'/> + <parameter type-id='type-id-5' name='le' filepath='Objects/floatobject.c' line='2523' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/frameobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyFrameConstructor' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-348' visibility='default' filepath='./Include/cpython/funcobject.h' line='21' column='1' id='type-id-349'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fc_globals' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='fc_builtins' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fc_name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='fc_qualname' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='fc_code' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='fc_defaults' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='fc_kwdefaults' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='fc_closure' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='22' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyFrameConstructor' type-id='type-id-349' filepath='./Include/cpython/funcobject.h' line='23' column='1' id='type-id-348'/> + <pointer-type-def type-id='type-id-348' size-in-bits='64' id='type-id-350'/> + <function-decl name='PyCompile_OpcodeStackEffect' mangled-name='PyCompile_OpcodeStackEffect' filepath='./Include/cpython/compile.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCompile_OpcodeStackEffect'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Pop' mangled-name='PyDict_Pop' filepath='./Include/cpython/dictobject.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Pop'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyFrame_Type' type-id='type-id-266' mangled-name='PyFrame_Type' visibility='default' filepath='./Include/cpython/pyframe.h' line='5' column='1' elf-symbol-id='PyFrame_Type'/> + <var-decl name='PyFrameLocalsProxy_Type' type-id='type-id-266' mangled-name='PyFrameLocalsProxy_Type' visibility='default' filepath='./Include/cpython/pyframe.h' line='6' column='1' elf-symbol-id='PyFrameLocalsProxy_Type'/> + <function-decl name='PyDict_GetItem' mangled-name='PyDict_GetItem' filepath='./Include/dictobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_GetItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyDict_DelItem' mangled-name='PyDict_DelItem' filepath='./Include/dictobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_DelItem'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyDict_Size' mangled-name='PyDict_Size' filepath='./Include/dictobject.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Size'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyDict_Update' mangled-name='PyDict_Update' filepath='./Include/dictobject.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyDict_Update'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_SetOpcodeTrace' filepath='./Include/internal/pycore_ceval.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-351'/> + <parameter type-id='type-id-352'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_GetBuiltins' filepath='./Include/internal/pycore_ceval.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCode_GetCode' filepath='./Include/internal/pycore_code.h' line='295' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCode_InitAddressRange' filepath='./Include/internal/pycore_code.h' line='298' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-319'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLineTable_NextAddressRange' filepath='./Include/internal/pycore_code.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-319'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyFunction_FromConstructor' filepath='./Include/internal/pycore_function.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-350'/> + <return type-id='type-id-308'/> + </function-decl> + <function-decl name='_PyGen_Finalize' filepath='./Include/internal/pycore_genobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_SetKeyError' mangled-name='_PyErr_SetKeyError' filepath='./Include/internal/pycore_pyerrors.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetKeyError'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_Equal' mangled-name='_PyUnicode_Equal' filepath='./Include/internal/pycore_unicodeobject.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_Equal'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_ReprEnter' mangled-name='Py_ReprEnter' filepath='./Include/object.h' line='605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ReprEnter'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_ReprLeave' mangled-name='Py_ReprLeave' filepath='./Include/object.h' line='606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ReprLeave'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFrame_GetLineNumber' mangled-name='PyFrame_GetLineNumber' filepath='Objects/frameobject.c' line='881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLineNumber'> + <parameter type-id='type-id-351' name='f' filepath='Objects/frameobject.c' line='881' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFrame_New' mangled-name='PyFrame_New' filepath='Objects/frameobject.c' line='1899' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_New'> + <parameter type-id='type-id-27' name='tstate' filepath='Objects/frameobject.c' line='1899' column='1'/> + <parameter type-id='type-id-325' name='code' filepath='Objects/frameobject.c' line='1899' column='1'/> + <parameter type-id='type-id-4' name='globals' filepath='Objects/frameobject.c' line='1900' column='1'/> + <parameter type-id='type-id-4' name='locals' filepath='Objects/frameobject.c' line='1900' column='1'/> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='PyFrame_GetVar' mangled-name='PyFrame_GetVar' filepath='Objects/frameobject.c' line='2091' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVar'> + <parameter type-id='type-id-351' name='frame_obj' filepath='Objects/frameobject.c' line='2091' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/frameobject.c' line='2091' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFrame_GetVarString' mangled-name='PyFrame_GetVarString' filepath='Objects/frameobject.c' line='2125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetVarString'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2125' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/frameobject.c' line='2125' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFrame_FastToLocalsWithError' mangled-name='PyFrame_FastToLocalsWithError' filepath='Objects/frameobject.c' line='2138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocalsWithError'> + <parameter type-id='type-id-351' name='f' filepath='Objects/frameobject.c' line='2138' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFrame_FastToLocals' mangled-name='PyFrame_FastToLocals' filepath='Objects/frameobject.c' line='2146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_FastToLocals'> + <parameter type-id='type-id-351' name='f' filepath='Objects/frameobject.c' line='2146' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFrame_LocalsToFast' mangled-name='PyFrame_LocalsToFast' filepath='Objects/frameobject.c' line='2154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_LocalsToFast'> + <parameter type-id='type-id-351' name='f' filepath='Objects/frameobject.c' line='2154' column='1'/> + <parameter type-id='type-id-5' name='clear' filepath='Objects/frameobject.c' line='2154' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFrame_IsEntryFrame' mangled-name='_PyFrame_IsEntryFrame' filepath='Objects/frameobject.c' line='2162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFrame_IsEntryFrame'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2162' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFrame_GetCode' mangled-name='PyFrame_GetCode' filepath='Objects/frameobject.c' line='2171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetCode'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2171' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='PyFrame_GetBack' mangled-name='PyFrame_GetBack' filepath='Objects/frameobject.c' line='2182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBack'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2182' column='1'/> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='PyFrame_GetLocals' mangled-name='PyFrame_GetLocals' filepath='Objects/frameobject.c' line='2198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLocals'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2198' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFrame_GetGlobals' mangled-name='PyFrame_GetGlobals' filepath='Objects/frameobject.c' line='2205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGlobals'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2205' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFrame_GetBuiltins' mangled-name='PyFrame_GetBuiltins' filepath='Objects/frameobject.c' line='2212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetBuiltins'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2212' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFrame_GetLasti' mangled-name='PyFrame_GetLasti' filepath='Objects/frameobject.c' line='2219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetLasti'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2219' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFrame_GetGenerator' mangled-name='PyFrame_GetGenerator' filepath='Objects/frameobject.c' line='2230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFrame_GetGenerator'> + <parameter type-id='type-id-351' name='frame' filepath='Objects/frameobject.c' line='2230' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <type-decl name='bool' size-in-bits='8' id='type-id-352'/> + </abi-instr> + <abi-instr address-size='64' path='Objects/funcobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyFunction_Type' type-id='type-id-266' mangled-name='PyFunction_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='65' column='1' elf-symbol-id='PyFunction_Type'/> + <var-decl name='PyClassMethod_Type' type-id='type-id-266' mangled-name='PyClassMethod_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='125' column='1' elf-symbol-id='PyClassMethod_Type'/> + <var-decl name='PyStaticMethod_Type' type-id='type-id-266' mangled-name='PyStaticMethod_Type' visibility='default' filepath='./Include/cpython/funcobject.h' line='126' column='1' elf-symbol-id='PyStaticMethod_Type'/> + <function-decl name='_PyEval_BuiltinsFromGlobals' filepath='./Include/internal/pycore_ceval.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyFunction_Vectorcall' filepath='./Include/internal/pycore_function.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_AddWatcher' mangled-name='PyFunction_AddWatcher' filepath='Objects/funcobject.c' line='68' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_AddWatcher'> + <parameter type-id='type-id-353' name='callback' filepath='Objects/funcobject.c' line='68' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFunction_ClearWatcher' mangled-name='PyFunction_ClearWatcher' filepath='Objects/funcobject.c' line='84' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_ClearWatcher'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/funcobject.c' line='84' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFunction_NewWithQualName' mangled-name='PyFunction_NewWithQualName' filepath='Objects/funcobject.c' line='139' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_NewWithQualName'> + <parameter type-id='type-id-4' name='code' filepath='Objects/funcobject.c' line='139' column='1'/> + <parameter type-id='type-id-4' name='globals' filepath='Objects/funcobject.c' line='139' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/funcobject.c' line='139' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyFunction_SetVersion' mangled-name='_PyFunction_SetVersion' filepath='Objects/funcobject.c' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyFunction_SetVersion'> + <parameter type-id='type-id-308' name='func' filepath='Objects/funcobject.c' line='288' column='1'/> + <parameter type-id='type-id-326' name='version' filepath='Objects/funcobject.c' line='288' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFunction_New' mangled-name='PyFunction_New' filepath='Objects/funcobject.c' line='368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_New'> + <parameter type-id='type-id-4' name='code' filepath='Objects/funcobject.c' line='368' column='1'/> + <parameter type-id='type-id-4' name='globals' filepath='Objects/funcobject.c' line='368' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_GetCode' mangled-name='PyFunction_GetCode' filepath='Objects/funcobject.c' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetCode'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='374' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_GetGlobals' mangled-name='PyFunction_GetGlobals' filepath='Objects/funcobject.c' line='384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetGlobals'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='384' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_GetModule' mangled-name='PyFunction_GetModule' filepath='Objects/funcobject.c' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetModule'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='394' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_GetDefaults' mangled-name='PyFunction_GetDefaults' filepath='Objects/funcobject.c' line='404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetDefaults'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='404' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_SetDefaults' mangled-name='PyFunction_SetDefaults' filepath='Objects/funcobject.c' line='414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetDefaults'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='414' column='1'/> + <parameter type-id='type-id-4' name='defaults' filepath='Objects/funcobject.c' line='414' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFunction_SetVectorcall' mangled-name='PyFunction_SetVectorcall' filepath='Objects/funcobject.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetVectorcall'> + <parameter type-id='type-id-308' name='func' filepath='Objects/funcobject.c' line='437' column='1'/> + <parameter type-id='type-id-309' name='vectorcall' filepath='Objects/funcobject.c' line='437' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyFunction_GetKwDefaults' mangled-name='PyFunction_GetKwDefaults' filepath='Objects/funcobject.c' line='445' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetKwDefaults'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='445' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_SetKwDefaults' mangled-name='PyFunction_SetKwDefaults' filepath='Objects/funcobject.c' line='455' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetKwDefaults'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='455' column='1'/> + <parameter type-id='type-id-4' name='defaults' filepath='Objects/funcobject.c' line='455' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFunction_GetClosure' mangled-name='PyFunction_GetClosure' filepath='Objects/funcobject.c' line='479' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetClosure'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='479' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_SetClosure' mangled-name='PyFunction_SetClosure' filepath='Objects/funcobject.c' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetClosure'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='489' column='1'/> + <parameter type-id='type-id-4' name='closure' filepath='Objects/funcobject.c' line='489' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyFunction_GetAnnotations' mangled-name='PyFunction_GetAnnotations' filepath='Objects/funcobject.c' line='542' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_GetAnnotations'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='542' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyFunction_SetAnnotations' mangled-name='PyFunction_SetAnnotations' filepath='Objects/funcobject.c' line='552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFunction_SetAnnotations'> + <parameter type-id='type-id-4' name='op' filepath='Objects/funcobject.c' line='552' column='1'/> + <parameter type-id='type-id-4' name='annotations' filepath='Objects/funcobject.c' line='552' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyClassMethod_New' mangled-name='PyClassMethod_New' filepath='Objects/funcobject.c' line='1307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyClassMethod_New'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/funcobject.c' line='1307' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyStaticMethod_New' mangled-name='PyStaticMethod_New' filepath='Objects/funcobject.c' line='1501' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStaticMethod_New'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/funcobject.c' line='1501' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/genericaliasobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyUnicodeWriter_WriteASCIIString' mangled-name='_PyUnicodeWriter_WriteASCIIString' filepath='./Include/cpython/unicodeobject.h' line='539' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteASCIIString'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='Py_GenericAliasType' type-id='type-id-266' mangled-name='Py_GenericAliasType' visibility='default' filepath='./Include/genericaliasobject.h' line='9' column='1' elf-symbol-id='Py_GenericAliasType'/> + <function-decl name='_Py_union_type_or' mangled-name='_Py_union_type_or' filepath='./Include/internal/pycore_unionobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_union_type_or'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_SetSlice' mangled-name='PyList_SetSlice' filepath='./Include/listobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_SetSlice'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_HasAttrWithError' mangled-name='PyObject_HasAttrWithError' filepath='./Include/object.h' line='581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttrWithError'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_Dir' mangled-name='PyObject_Dir' filepath='./Include/object.h' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Dir'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GC_Track' mangled-name='PyObject_GC_Track' filepath='./Include/objimpl.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_Track'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/genobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyGenObject' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-354' visibility='default' filepath='./Include/cpython/genobject.h' line='31' column='1' id='type-id-355'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='gi_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='gi_name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='gi_qualname' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='gi_exc_state' type-id='type-id-357' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='gi_origin_or_finalizer' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='gi_hooks_inited' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='520'> + <var-decl name='gi_closed' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='528'> + <var-decl name='gi_running_async' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='536'> + <var-decl name='gi_frame_state' type-id='type-id-358' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='gi_iframe' type-id='type-id-359' visibility='default' filepath='./Include/cpython/genobject.h' line='33' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyGenObject' type-id='type-id-355' filepath='./Include/cpython/genobject.h' line='34' column='1' id='type-id-354'/> + <class-decl name='PyAsyncGenObject' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-360' visibility='default' filepath='./Include/cpython/genobject.h' line='62' column='1' id='type-id-361'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ag_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ag_name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ag_qualname' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ag_exc_state' type-id='type-id-357' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='ag_origin_or_finalizer' type-id='type-id-4' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='ag_hooks_inited' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='520'> + <var-decl name='ag_closed' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='528'> + <var-decl name='ag_running_async' type-id='type-id-53' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='536'> + <var-decl name='ag_frame_state' type-id='type-id-358' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='ag_iframe' type-id='type-id-359' visibility='default' filepath='./Include/cpython/genobject.h' line='63' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyAsyncGenObject' type-id='type-id-361' filepath='./Include/cpython/genobject.h' line='64' column='1' id='type-id-360'/> + <typedef-decl name='_PyInterpreterFrame' type-id='type-id-362' filepath='./Include/internal/pycore_frame.h' line='75' column='1' id='type-id-363'/> + <pointer-type-def type-id='type-id-360' size-in-bits='64' id='type-id-364'/> + <pointer-type-def type-id='type-id-354' size-in-bits='64' id='type-id-365'/> + <pointer-type-def type-id='type-id-363' size-in-bits='64' id='type-id-366'/> + <function-decl name='_PyEval_EvalFrameDefault' mangled-name='_PyEval_EvalFrameDefault' filepath='./Include/cpython/ceval.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_EvalFrameDefault'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-367'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='PyGen_Type' type-id='type-id-266' mangled-name='PyGen_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='36' column='1' elf-symbol-id='PyGen_Type'/> + <var-decl name='PyCoro_Type' type-id='type-id-266' mangled-name='PyCoro_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='53' column='1' elf-symbol-id='PyCoro_Type'/> + <var-decl name='PyAsyncGen_Type' type-id='type-id-266' mangled-name='PyAsyncGen_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='66' column='1' elf-symbol-id='PyAsyncGen_Type'/> + <var-decl name='_PyAsyncGenASend_Type' type-id='type-id-266' mangled-name='_PyAsyncGenASend_Type' visibility='default' filepath='./Include/cpython/genobject.h' line='67' column='1' elf-symbol-id='_PyAsyncGenASend_Type'/> + <function-decl name='PyObject_CallFinalizerFromDealloc' mangled-name='PyObject_CallFinalizerFromDealloc' filepath='./Include/cpython/object.h' line='289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFinalizerFromDealloc'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_InterpreterFrame_GetLine' mangled-name='PyUnstable_InterpreterFrame_GetLine' filepath='./Include/cpython/pyframe.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetLine'> + <parameter type-id='type-id-367'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_GetFrame' filepath='./Include/internal/pycore_ceval.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-367'/> + </function-decl> + <function-decl name='_PyFrame_MakeAndSetFrameObject' filepath='./Include/internal/pycore_frame.h' line='217' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-366'/> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='_PyFrame_ClearLocals' filepath='./Include/internal/pycore_frame.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-366'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFrame_ClearExceptCode' filepath='./Include/internal/pycore_frame.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-366'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFrame_Traverse' filepath='./Include/internal/pycore_frame.h' line='250' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-337'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyCoroWrapper_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='25' column='1'/> + <var-decl name='_PyAsyncGenWrappedValue_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='26' column='1'/> + <var-decl name='_PyAsyncGenAThrow_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_genobject.h' line='27' column='1'/> + <function-decl name='_PyErr_ChainStackItem' filepath='./Include/internal/pycore_pyerrors.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_WarnUnawaitedCoroutine' filepath='./Include/internal/pycore_warnings.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_WarnUnawaitedAgenMethod' filepath='./Include/internal/pycore_warnings.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-364'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_GC_NewVar' mangled-name='_PyObject_GC_NewVar' filepath='./Include/objimpl.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_NewVar'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-321'/> + </function-decl> + <function-decl name='PyErr_SetRaisedException' mangled-name='PyErr_SetRaisedException' filepath='./Include/pyerrors.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetRaisedException'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_NormalizeException' mangled-name='PyErr_NormalizeException' filepath='./Include/pyerrors.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NormalizeException'> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_WriteUnraisable' mangled-name='PyErr_WriteUnraisable' filepath='./Include/pyerrors.h' line='233' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WriteUnraisable'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyGen_GetCode' mangled-name='PyGen_GetCode' filepath='Objects/genobject.c' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_GetCode'> + <parameter type-id='type-id-365' name='gen' filepath='Objects/genobject.c' line='38' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='_PyGen_yf' mangled-name='_PyGen_yf' filepath='Objects/genobject.c' line='342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_yf'> + <parameter type-id='type-id-365' name='gen' filepath='Objects/genobject.c' line='342' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyGen_SetStopIterationValue' mangled-name='_PyGen_SetStopIterationValue' filepath='Objects/genobject.c' line='605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyGen_SetStopIterationValue'> + <parameter type-id='type-id-4' name='value' filepath='Objects/genobject.c' line='605' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_MakeCoro' mangled-name='_Py_MakeCoro' filepath='Objects/genobject.c' line='893' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_MakeCoro'> + <parameter type-id='type-id-308' name='func' filepath='Objects/genobject.c' line='893' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyGen_NewWithQualName' mangled-name='PyGen_NewWithQualName' filepath='Objects/genobject.c' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_NewWithQualName'> + <parameter type-id='type-id-351' name='f' filepath='Objects/genobject.c' line='976' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/genobject.c' line='976' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/genobject.c' line='976' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyGen_New' mangled-name='PyGen_New' filepath='Objects/genobject.c' line='982' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGen_New'> + <parameter type-id='type-id-351' name='f' filepath='Objects/genobject.c' line='982' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCoro_GetAwaitableIter' mangled-name='_PyCoro_GetAwaitableIter' filepath='Objects/genobject.c' line='1015' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCoro_GetAwaitableIter'> + <parameter type-id='type-id-4' name='o' filepath='Objects/genobject.c' line='1015' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCoro_New' mangled-name='PyCoro_New' filepath='Objects/genobject.c' line='1341' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCoro_New'> + <parameter type-id='type-id-351' name='f' filepath='Objects/genobject.c' line='1341' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/genobject.c' line='1341' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/genobject.c' line='1341' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyAsyncGen_New' mangled-name='PyAsyncGen_New' filepath='Objects/genobject.c' line='1654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyAsyncGen_New'> + <parameter type-id='type-id-351' name='f' filepath='Objects/genobject.c' line='1654' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/genobject.c' line='1654' column='1'/> + <parameter type-id='type-id-4' name='qualname' filepath='Objects/genobject.c' line='1654' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/iterobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyObject_HasLen' filepath='./Include/internal/pycore_abstract.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PySeqIter_Type' type-id='type-id-266' mangled-name='PySeqIter_Type' visibility='default' filepath='./Include/iterobject.h' line='8' column='1' elf-symbol-id='PySeqIter_Type'/> + <var-decl name='PyCallIter_Type' type-id='type-id-266' mangled-name='PyCallIter_Type' visibility='default' filepath='./Include/iterobject.h' line='9' column='1' elf-symbol-id='PyCallIter_Type'/> + <function-decl name='PyCallIter_New' mangled-name='PyCallIter_New' filepath='Objects/iterobject.c' line='186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCallIter_New'> + <parameter type-id='type-id-4' name='callable' filepath='Objects/iterobject.c' line='186' column='1'/> + <parameter type-id='type-id-4' name='sentinel' filepath='Objects/iterobject.c' line='186' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/listobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyEval_SliceIndexNotNone' mangled-name='_PyEval_SliceIndexNotNone' filepath='./Include/cpython/ceval.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SliceIndexNotNone'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_WriteChar' mangled-name='_PyUnicodeWriter_WriteChar' filepath='./Include/cpython/unicodeobject.h' line='516' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteChar'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_Next' filepath='./Include/internal/pycore_dict.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-322'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySet_NextEntryRef' mangled-name='_PySet_NextEntryRef' filepath='./Include/internal/pycore_setobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_NextEntryRef'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-322'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyList_Type' type-id='type-id-266' mangled-name='PyList_Type' visibility='default' filepath='./Include/listobject.h' line='20' column='1' elf-symbol-id='PyList_Type'/> + <var-decl name='PyListIter_Type' type-id='type-id-266' mangled-name='PyListIter_Type' visibility='default' filepath='./Include/listobject.h' line='21' column='1' elf-symbol-id='PyListIter_Type'/> + <var-decl name='PyListRevIter_Type' type-id='type-id-266' mangled-name='PyListRevIter_Type' visibility='default' filepath='./Include/listobject.h' line='22' column='1' elf-symbol-id='PyListRevIter_Type'/> + <function-decl name='PyObject_HashNotImplemented' mangled-name='PyObject_HashNotImplemented' filepath='./Include/object.h' line='591' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HashNotImplemented'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-301'/> + </function-decl> + <function-decl name='PyList_Size' mangled-name='PyList_Size' filepath='Objects/listobject.c' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Size'> + <parameter type-id='type-id-4' name='op' filepath='Objects/listobject.c' line='316' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyList_GetItemRef' mangled-name='PyList_GetItemRef' filepath='Objects/listobject.c' line='417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_GetItemRef'> + <parameter type-id='type-id-4' name='op' filepath='Objects/listobject.c' line='417' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/listobject.c' line='417' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_SetItem' mangled-name='PyList_SetItem' filepath='Objects/listobject.c' line='433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_SetItem'> + <parameter type-id='type-id-4' name='op' filepath='Objects/listobject.c' line='433' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/listobject.c' line='433' column='1'/> + <parameter type-id='type-id-4' name='newitem' filepath='Objects/listobject.c' line='434' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyList_Insert' mangled-name='PyList_Insert' filepath='Objects/listobject.c' line='489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Insert'> + <parameter type-id='type-id-4' name='op' filepath='Objects/listobject.c' line='489' column='1'/> + <parameter type-id='type-id-7' name='where' filepath='Objects/listobject.c' line='489' column='1'/> + <parameter type-id='type-id-4' name='newitem' filepath='Objects/listobject.c' line='489' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyList_AppendTakeRefListResize' mangled-name='_PyList_AppendTakeRefListResize' filepath='Objects/listobject.c' line='505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_AppendTakeRefListResize'> + <parameter type-id='type-id-260' name='self' filepath='Objects/listobject.c' line='505' column='1'/> + <parameter type-id='type-id-4' name='newitem' filepath='Objects/listobject.c' line='505' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyList_GetSlice' mangled-name='PyList_GetSlice' filepath='Objects/listobject.c' line='700' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_GetSlice'> + <parameter type-id='type-id-4' name='a' filepath='Objects/listobject.c' line='700' column='1'/> + <parameter type-id='type-id-7' name='ilow' filepath='Objects/listobject.c' line='700' column='1'/> + <parameter type-id='type-id-7' name='ihigh' filepath='Objects/listobject.c' line='700' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyList_Extend' mangled-name='PyList_Extend' filepath='Objects/listobject.c' line='1442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Extend'> + <parameter type-id='type-id-4' name='self' filepath='Objects/listobject.c' line='1442' column='1'/> + <parameter type-id='type-id-4' name='iterable' filepath='Objects/listobject.c' line='1442' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyList_Clear' mangled-name='PyList_Clear' filepath='Objects/listobject.c' line='1453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Clear'> + <parameter type-id='type-id-4' name='self' filepath='Objects/listobject.c' line='1453' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyList_Sort' mangled-name='PyList_Sort' filepath='Objects/listobject.c' line='3122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyList_Sort'> + <parameter type-id='type-id-4' name='v' filepath='Objects/listobject.c' line='3122' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyList_FromArraySteal' mangled-name='_PyList_FromArraySteal' filepath='Objects/listobject.c' line='3186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyList_FromArraySteal'> + <parameter type-id='type-id-258' name='src' filepath='Objects/listobject.c' line='3186' column='1'/> + <parameter type-id='type-id-7' name='n' filepath='Objects/listobject.c' line='3186' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/longobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-91' size-in-bits='2048' id='type-id-368'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <qualified-type-def type-id='type-id-251' const='yes' id='type-id-369'/> + <pointer-type-def type-id='type-id-369' size-in-bits='64' id='type-id-370'/> + <qualified-type-def type-id='type-id-91' const='yes' id='type-id-371'/> + <pointer-type-def type-id='type-id-371' size-in-bits='64' id='type-id-372'/> + <pointer-type-def type-id='type-id-373' size-in-bits='64' id='type-id-374'/> + <pointer-type-def type-id='type-id-91' size-in-bits='64' id='type-id-375'/> + <function-decl name='_PyUnicodeWriter_PrepareInternal' mangled-name='_PyUnicodeWriter_PrepareInternal' filepath='./Include/cpython/unicodeobject.h' line='494' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareInternal'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyLong_DigitValue' type-id='type-id-368' mangled-name='_PyLong_DigitValue' visibility='default' filepath='./Include/internal/pycore_long.h' line='118' column='1' elf-symbol-id='_PyLong_DigitValue'/> + <function-decl name='_PyLong_FormatAdvancedWriter' filepath='./Include/internal/pycore_long.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PyLong_Type' type-id='type-id-266' mangled-name='PyLong_Type' visibility='default' filepath='./Include/object.h' line='342' column='1' elf-symbol-id='PyLong_Type'/> + <function-decl name='PyObject_Bytes' mangled-name='PyObject_Bytes' filepath='./Include/object.h' line='565' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Bytes'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_New' mangled-name='_PyLong_New' filepath='Objects/longobject.c' line='140' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_New'> + <parameter type-id='type-id-7' name='size' filepath='Objects/longobject.c' line='140' column='1'/> + <return type-id='type-id-252'/> + </function-decl> + <function-decl name='_PyLong_FromDigits' mangled-name='_PyLong_FromDigits' filepath='Objects/longobject.c' line='172' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromDigits'> + <parameter type-id='type-id-5' name='negative' filepath='Objects/longobject.c' line='172' column='1'/> + <parameter type-id='type-id-7' name='digit_count' filepath='Objects/longobject.c' line='172' column='1'/> + <parameter type-id='type-id-374' name='digits' filepath='Objects/longobject.c' line='172' column='1'/> + <return type-id='type-id-252'/> + </function-decl> + <function-decl name='PyLong_FromUnsignedLong' mangled-name='PyLong_FromUnsignedLong' filepath='Objects/longobject.c' line='359' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLong'> + <parameter type-id='type-id-2' name='ival' filepath='Objects/longobject.c' line='359' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromUnsignedLongLong' mangled-name='PyLong_FromUnsignedLongLong' filepath='Objects/longobject.c' line='367' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedLongLong'> + <parameter type-id='type-id-376' name='ival' filepath='Objects/longobject.c' line='367' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_AsLong' mangled-name='PyLong_AsLong' filepath='Objects/longobject.c' line='541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLong'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='541' column='1'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyLong_AsUnsignedLong' mangled-name='PyLong_AsUnsignedLong' filepath='Objects/longobject.c' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLong'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='625' column='1'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='PyLong_AsSize_t' mangled-name='PyLong_AsSize_t' filepath='Objects/longobject.c' line='679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsSize_t'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='679' column='1'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='PyLong_AsUnsignedLongMask' mangled-name='PyLong_AsUnsignedLongMask' filepath='Objects/longobject.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongMask'> + <parameter type-id='type-id-4' name='op' filepath='Objects/longobject.c' line='749' column='1'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='_PyLong_FromByteArray' mangled-name='_PyLong_FromByteArray' filepath='Objects/longobject.c' line='826' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromByteArray'> + <parameter type-id='type-id-372' name='bytes' filepath='Objects/longobject.c' line='826' column='1'/> + <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='826' column='1'/> + <parameter type-id='type-id-5' name='little_endian' filepath='Objects/longobject.c' line='827' column='1'/> + <parameter type-id='type-id-5' name='is_signed' filepath='Objects/longobject.c' line='827' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_AsByteArray' mangled-name='_PyLong_AsByteArray' filepath='Objects/longobject.c' line='941' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsByteArray'> + <parameter type-id='type-id-252' name='v' filepath='Objects/longobject.c' line='941' column='1'/> + <parameter type-id='type-id-375' name='bytes' filepath='Objects/longobject.c' line='942' column='1'/> + <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='942' column='1'/> + <parameter type-id='type-id-5' name='little_endian' filepath='Objects/longobject.c' line='943' column='1'/> + <parameter type-id='type-id-5' name='is_signed' filepath='Objects/longobject.c' line='943' column='1'/> + <parameter type-id='type-id-5' name='with_exceptions' filepath='Objects/longobject.c' line='944' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyLong_AsNativeBytes' mangled-name='PyLong_AsNativeBytes' filepath='Objects/longobject.c' line='1108' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsNativeBytes'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='1108' column='1'/> + <parameter type-id='type-id-30' name='buffer' filepath='Objects/longobject.c' line='1108' column='1'/> + <parameter type-id='type-id-7' name='n' filepath='Objects/longobject.c' line='1108' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1108' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyLong_FromNativeBytes' mangled-name='PyLong_FromNativeBytes' filepath='Objects/longobject.c' line='1296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromNativeBytes'> + <parameter type-id='type-id-30' name='buffer' filepath='Objects/longobject.c' line='1296' column='1'/> + <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='1296' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1296' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromUnsignedNativeBytes' mangled-name='PyLong_FromUnsignedNativeBytes' filepath='Objects/longobject.c' line='1318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromUnsignedNativeBytes'> + <parameter type-id='type-id-30' name='buffer' filepath='Objects/longobject.c' line='1318' column='1'/> + <parameter type-id='type-id-21' name='n' filepath='Objects/longobject.c' line='1318' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/longobject.c' line='1318' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_AsVoidPtr' mangled-name='PyLong_AsVoidPtr' filepath='Objects/longobject.c' line='1354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsVoidPtr'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='1354' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyLong_FromLongLong' mangled-name='PyLong_FromLongLong' filepath='Objects/longobject.c' line='1395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLongLong'> + <parameter type-id='type-id-377' name='ival' filepath='Objects/longobject.c' line='1395' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_AsLongLong' mangled-name='PyLong_AsLongLong' filepath='Objects/longobject.c' line='1480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLong'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='1480' column='1'/> + <return type-id='type-id-377'/> + </function-decl> + <function-decl name='PyLong_AsUnsignedLongLong' mangled-name='PyLong_AsUnsignedLongLong' filepath='Objects/longobject.c' line='1525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLong'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='1525' column='1'/> + <return type-id='type-id-376'/> + </function-decl> + <function-decl name='PyLong_AsUnsignedLongLongMask' mangled-name='PyLong_AsUnsignedLongLongMask' filepath='Objects/longobject.c' line='1601' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsUnsignedLongLongMask'> + <parameter type-id='type-id-4' name='op' filepath='Objects/longobject.c' line='1601' column='1'/> + <return type-id='type-id-376'/> + </function-decl> + <function-decl name='PyLong_AsLongLongAndOverflow' mangled-name='PyLong_AsLongLongAndOverflow' filepath='Objects/longobject.c' line='1635' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_AsLongLongAndOverflow'> + <parameter type-id='type-id-4' name='vv' filepath='Objects/longobject.c' line='1635' column='1'/> + <parameter type-id='type-id-177' name='overflow' filepath='Objects/longobject.c' line='1635' column='1'/> + <return type-id='type-id-377'/> + </function-decl> + <function-decl name='_PyLong_UnsignedShort_Converter' mangled-name='_PyLong_UnsignedShort_Converter' filepath='Objects/longobject.c' line='1713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedShort_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='1713' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/longobject.c' line='1713' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_UnsignedInt_Converter' mangled-name='_PyLong_UnsignedInt_Converter' filepath='Objects/longobject.c' line='1735' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedInt_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='1735' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/longobject.c' line='1735' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_UnsignedLong_Converter' mangled-name='_PyLong_UnsignedLong_Converter' filepath='Objects/longobject.c' line='1757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLong_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='1757' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/longobject.c' line='1757' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_UnsignedLongLong_Converter' mangled-name='_PyLong_UnsignedLongLong_Converter' filepath='Objects/longobject.c' line='1774' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_UnsignedLongLong_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='1774' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/longobject.c' line='1774' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_Size_t_Converter' mangled-name='_PyLong_Size_t_Converter' filepath='Objects/longobject.c' line='1791' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Size_t_Converter'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/longobject.c' line='1791' column='1'/> + <parameter type-id='type-id-30' name='ptr' filepath='Objects/longobject.c' line='1791' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_Frexp' mangled-name='_PyLong_Frexp' filepath='Objects/longobject.c' line='3404' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Frexp'> + <parameter type-id='type-id-252' name='a' filepath='Objects/longobject.c' line='3404' column='1'/> + <parameter type-id='type-id-8' name='e' filepath='Objects/longobject.c' line='3404' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='_PyLong_Add' mangled-name='_PyLong_Add' filepath='Objects/longobject.c' line='3752' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Add'> + <parameter type-id='type-id-252' name='a' filepath='Objects/longobject.c' line='3752' column='1'/> + <parameter type-id='type-id-252' name='b' filepath='Objects/longobject.c' line='3752' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_Subtract' mangled-name='_PyLong_Subtract' filepath='Objects/longobject.c' line='3791' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Subtract'> + <parameter type-id='type-id-252' name='a' filepath='Objects/longobject.c' line='3791' column='1'/> + <parameter type-id='type-id-252' name='b' filepath='Objects/longobject.c' line='3791' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_Multiply' mangled-name='_PyLong_Multiply' filepath='Objects/longobject.c' line='4242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Multiply'> + <parameter type-id='type-id-252' name='a' filepath='Objects/longobject.c' line='4242' column='1'/> + <parameter type-id='type-id-252' name='b' filepath='Objects/longobject.c' line='4242' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_Rshift' mangled-name='_PyLong_Rshift' filepath='Objects/longobject.c' line='5351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_Rshift'> + <parameter type-id='type-id-4' name='a' filepath='Objects/longobject.c' line='5351' column='1'/> + <parameter type-id='type-id-21' name='shiftby' filepath='Objects/longobject.c' line='5351' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_GCD' mangled-name='_PyLong_GCD' filepath='Objects/longobject.c' line='5630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_GCD'> + <parameter type-id='type-id-4' name='aarg' filepath='Objects/longobject.c' line='5630' column='1'/> + <parameter type-id='type-id-4' name='barg' filepath='Objects/longobject.c' line='5630' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyLong_DivmodNear' mangled-name='_PyLong_DivmodNear' filepath='Objects/longobject.c' line='5996' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_DivmodNear'> + <parameter type-id='type-id-4' name='a' filepath='Objects/longobject.c' line='5996' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Objects/longobject.c' line='5996' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_GetInfo' mangled-name='PyLong_GetInfo' filepath='Objects/longobject.c' line='6654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_GetInfo'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnstable_Long_IsCompact' mangled-name='PyUnstable_Long_IsCompact' filepath='Objects/longobject.c' line='6709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_IsCompact'> + <parameter type-id='type-id-370' name='op' filepath='Objects/longobject.c' line='6709' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_Long_CompactValue' mangled-name='PyUnstable_Long_CompactValue' filepath='Objects/longobject.c' line='6716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Long_CompactValue'> + <parameter type-id='type-id-370' name='op' filepath='Objects/longobject.c' line='6716' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/memoryobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyManagedBuffer_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_memoryobject.h' line='11' column='1'/> + <var-decl name='PyMemoryView_Type' type-id='type-id-266' mangled-name='PyMemoryView_Type' visibility='default' filepath='./Include/memoryobject.h' line='9' column='1' elf-symbol-id='PyMemoryView_Type'/> + <function-decl name='PyUnicode_AsASCIIString' mangled-name='PyUnicode_AsASCIIString' filepath='./Include/unicodeobject.h' line='631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsASCIIString'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMemoryView_FromMemory' mangled-name='PyMemoryView_FromMemory' filepath='Objects/memoryobject.c' line='741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromMemory'> + <parameter type-id='type-id-17' name='mem' filepath='Objects/memoryobject.c' line='741' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/memoryobject.c' line='741' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/memoryobject.c' line='741' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMemoryView_FromBuffer' mangled-name='PyMemoryView_FromBuffer' filepath='Objects/memoryobject.c' line='770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromBuffer'> + <parameter type-id='type-id-255' name='info' filepath='Objects/memoryobject.c' line='770' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMemoryView_FromObject' mangled-name='PyMemoryView_FromObject' filepath='Objects/memoryobject.c' line='854' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_FromObject'> + <parameter type-id='type-id-4' name='v' filepath='Objects/memoryobject.c' line='854' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMemoryView_GetContiguous' mangled-name='PyMemoryView_GetContiguous' filepath='Objects/memoryobject.c' line='966' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMemoryView_GetContiguous'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/memoryobject.c' line='966' column='1'/> + <parameter type-id='type-id-5' name='buffertype' filepath='Objects/memoryobject.c' line='966' column='1'/> + <parameter type-id='type-id-53' name='order' filepath='Objects/memoryobject.c' line='966' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/methodobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyCMethod_Type' type-id='type-id-266' mangled-name='PyCMethod_Type' visibility='default' filepath='./Include/cpython/methodobject.h' line='32' column='1' elf-symbol-id='PyCMethod_Type'/> + <var-decl name='PyCFunction_Type' type-id='type-id-266' mangled-name='PyCFunction_Type' visibility='default' filepath='./Include/methodobject.h' line='14' column='1' elf-symbol-id='PyCFunction_Type'/> + <function-decl name='PyCFunction_New' mangled-name='PyCFunction_New' filepath='Objects/methodobject.c' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_New'> + <parameter type-id='type-id-176' name='ml' filepath='Objects/methodobject.c' line='33' column='1'/> + <parameter type-id='type-id-4' name='self' filepath='Objects/methodobject.c' line='33' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCFunction_NewEx' mangled-name='PyCFunction_NewEx' filepath='Objects/methodobject.c' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_NewEx'> + <parameter type-id='type-id-176' name='ml' filepath='Objects/methodobject.c' line='39' column='1'/> + <parameter type-id='type-id-4' name='self' filepath='Objects/methodobject.c' line='39' column='1'/> + <parameter type-id='type-id-4' name='module' filepath='Objects/methodobject.c' line='39' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCFunction_GetFunction' mangled-name='PyCFunction_GetFunction' filepath='Objects/methodobject.c' line='117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetFunction'> + <parameter type-id='type-id-4' name='op' filepath='Objects/methodobject.c' line='117' column='1'/> + <return type-id='type-id-378'/> + </function-decl> + <function-decl name='PyCFunction_GetSelf' mangled-name='PyCFunction_GetSelf' filepath='Objects/methodobject.c' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetSelf'> + <parameter type-id='type-id-4' name='op' filepath='Objects/methodobject.c' line='127' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCFunction_GetFlags' mangled-name='PyCFunction_GetFlags' filepath='Objects/methodobject.c' line='137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCFunction_GetFlags'> + <parameter type-id='type-id-4' name='op' filepath='Objects/methodobject.c' line='137' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/moduleobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyModuleDef_Base' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='39' column='1' id='type-id-379'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/moduleobject.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='m_init' type-id='type-id-380' visibility='default' filepath='./Include/moduleobject.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='m_index' type-id='type-id-7' visibility='default' filepath='./Include/moduleobject.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='m_copy' type-id='type-id-4' visibility='default' filepath='./Include/moduleobject.h' line='57' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyModuleDef_Base' type-id='type-id-379' filepath='./Include/moduleobject.h' line='58' column='1' id='type-id-381'/> + <class-decl name='PyModuleDef_Slot' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='69' column='1' id='type-id-382'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='slot' type-id='type-id-5' visibility='default' filepath='./Include/moduleobject.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-30' visibility='default' filepath='./Include/moduleobject.h' line='71' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyModuleDef' size-in-bits='832' is-struct='yes' visibility='default' filepath='./Include/moduleobject.h' line='107' column='1' id='type-id-383'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='m_base' type-id='type-id-381' visibility='default' filepath='./Include/moduleobject.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='m_name' type-id='type-id-6' visibility='default' filepath='./Include/moduleobject.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='m_doc' type-id='type-id-6' visibility='default' filepath='./Include/moduleobject.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='m_size' type-id='type-id-7' visibility='default' filepath='./Include/moduleobject.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='m_methods' type-id='type-id-176' visibility='default' filepath='./Include/moduleobject.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='m_slots' type-id='type-id-384' visibility='default' filepath='./Include/moduleobject.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='m_traverse' type-id='type-id-312' visibility='default' filepath='./Include/moduleobject.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='m_clear' type-id='type-id-313' visibility='default' filepath='./Include/moduleobject.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='m_free' type-id='type-id-385' visibility='default' filepath='./Include/moduleobject.h' line='116' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyModuleDef' type-id='type-id-383' filepath='./Include/pytypedefs.h' line='12' column='1' id='type-id-9'/> + <typedef-decl name='PyModuleDef_Slot' type-id='type-id-382' filepath='./Include/pytypedefs.h' line='13' column='1' id='type-id-386'/> + <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-387'/> + <pointer-type-def type-id='type-id-386' size-in-bits='64' id='type-id-384'/> + <qualified-type-def type-id='type-id-388' const='yes' id='type-id-389'/> + <pointer-type-def type-id='type-id-389' size-in-bits='64' id='type-id-18'/> + <function-decl name='_PyObject_GenericGetAttrWithDict' mangled-name='_PyObject_GenericGetAttrWithDict' filepath='./Include/cpython/object.h' line='296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GenericGetAttrWithDict'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_wgetcwd' filepath='./Include/internal/pycore_fileutils.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_PyImport_IsInitialized' filepath='./Include/internal/pycore_import.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_GetNextModuleIndex' filepath='./Include/internal/pycore_import.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyImport_ResolveNameWithPackageContext' filepath='./Include/internal/pycore_import.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_PyImport_ImportlibModuleRepr' filepath='./Include/internal/pycore_import.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_CheckSubinterpIncompatibleExtensionAllowed' filepath='./Include/internal/pycore_import.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_FormatFromCause' mangled-name='_PyErr_FormatFromCause' filepath='./Include/internal/pycore_pyerrors.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_FormatFromCause'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='PyModule_Type' type-id='type-id-266' mangled-name='PyModule_Type' visibility='default' filepath='./Include/moduleobject.h' line='10' column='1' elf-symbol-id='PyModule_Type'/> + <var-decl name='PyModuleDef_Type' type-id='type-id-266' mangled-name='PyModuleDef_Type' visibility='default' filepath='./Include/moduleobject.h' line='36' column='1' elf-symbol-id='PyModuleDef_Type'/> + <function-decl name='PyObject_SetAttrString' mangled-name='PyObject_SetAttrString' filepath='./Include/object.h' line='569' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetAttrString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySys_GetObject' mangled-name='PySys_GetObject' filepath='./Include/sysmodule.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_GetObject'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySys_FormatStderr' mangled-name='PySys_FormatStderr' filepath='./Include/sysmodule.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_FormatStderr'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_AsWideChar' mangled-name='PyUnicode_AsWideChar' filepath='./Include/unicodeobject.h' line='277' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideChar'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wcsrchr' filepath='/usr/include/wchar.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-388'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='PyModuleDef_Init' mangled-name='PyModuleDef_Init' filepath='Objects/moduleobject.c' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModuleDef_Init'> + <parameter type-id='type-id-387' name='def' filepath='Objects/moduleobject.c' line='45' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_NewObject' mangled-name='PyModule_NewObject' filepath='Objects/moduleobject.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_NewObject'> + <parameter type-id='type-id-4' name='name' filepath='Objects/moduleobject.c' line='121' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_New' mangled-name='PyModule_New' filepath='Objects/moduleobject.c' line='137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_New'> + <parameter type-id='type-id-6' name='name' filepath='Objects/moduleobject.c' line='137' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_Create2' mangled-name='PyModule_Create2' filepath='Objects/moduleobject.c' line='198' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_Create2'> + <parameter type-id='type-id-387' name='module' filepath='Objects/moduleobject.c' line='198' column='1'/> + <parameter type-id='type-id-5' name='module_api_version' filepath='Objects/moduleobject.c' line='198' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_FromDefAndSpec2' mangled-name='PyModule_FromDefAndSpec2' filepath='Objects/moduleobject.c' line='260' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_FromDefAndSpec2'> + <parameter type-id='type-id-387' name='def' filepath='Objects/moduleobject.c' line='260' column='1'/> + <parameter type-id='type-id-4' name='spec' filepath='Objects/moduleobject.c' line='260' column='1'/> + <parameter type-id='type-id-5' name='module_api_version' filepath='Objects/moduleobject.c' line='260' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_ExecDef' mangled-name='PyModule_ExecDef' filepath='Objects/moduleobject.c' line='454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_ExecDef'> + <parameter type-id='type-id-4' name='module' filepath='Objects/moduleobject.c' line='454' column='1'/> + <parameter type-id='type-id-387' name='def' filepath='Objects/moduleobject.c' line='454' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_AddFunctions' mangled-name='PyModule_AddFunctions' filepath='Objects/moduleobject.c' line='523' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddFunctions'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='523' column='1'/> + <parameter type-id='type-id-176' name='functions' filepath='Objects/moduleobject.c' line='523' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_SetDocString' mangled-name='PyModule_SetDocString' filepath='Objects/moduleobject.c' line='537' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_SetDocString'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='537' column='1'/> + <parameter type-id='type-id-6' name='doc' filepath='Objects/moduleobject.c' line='537' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_GetName' mangled-name='PyModule_GetName' filepath='Objects/moduleobject.c' line='590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetName'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='590' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyModule_GetFilenameObject' mangled-name='PyModule_GetFilenameObject' filepath='Objects/moduleobject.c' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetFilenameObject'> + <parameter type-id='type-id-4' name='mod' filepath='Objects/moduleobject.c' line='602' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_GetFilename' mangled-name='PyModule_GetFilename' filepath='Objects/moduleobject.c' line='631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetFilename'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='631' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyModule_GetDef' mangled-name='PyModule_GetDef' filepath='Objects/moduleobject.c' line='644' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetDef'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='644' column='1'/> + <return type-id='type-id-387'/> + </function-decl> + <function-decl name='PyModule_GetState' mangled-name='PyModule_GetState' filepath='Objects/moduleobject.c' line='654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_GetState'> + <parameter type-id='type-id-4' name='m' filepath='Objects/moduleobject.c' line='654' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-390'> + <return type-id='type-id-4'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/namespaceobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyArg_NoPositional' mangled-name='_PyArg_NoPositional' filepath='./Include/internal/pycore_modsupport.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_NoPositional'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyNamespace_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_namespace.h' line='13' column='1'/> + <function-decl name='PyUnicode_Join' mangled-name='PyUnicode_Join' filepath='./Include/unicodeobject.h' line='881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Join'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyNamespace_New' mangled-name='_PyNamespace_New' filepath='Objects/namespaceobject.c' line='297' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyNamespace_New'> + <parameter type-id='type-id-4' name='kwds' filepath='Objects/namespaceobject.c' line='297' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/object.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='192' id='type-id-97'> + <subrange length='6' type-id='type-id-2' id='type-id-391'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='infinite' id='type-id-392'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <class-decl name='PyModuleObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-393' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='19' column='1' id='type-id-394'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='20' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='md_dict' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='md_def' type-id='type-id-387' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='md_state' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='md_weaklist' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='md_name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_moduleobject.h' line='26' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyModuleObject' type-id='type-id-394' filepath='./Include/internal/pycore_moduleobject.h' line='30' column='1' id='type-id-393'/> + <enum-decl name='PyGILState_STATE' naming-typedef-id='type-id-395' filepath='./Include/pystate.h' line='77' column='1' id='type-id-396'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PyGILState_LOCKED' value='0'/> + <enumerator name='PyGILState_UNLOCKED' value='1'/> + </enum-decl> + <typedef-decl name='PyGILState_STATE' type-id='type-id-396' filepath='./Include/pystate.h' line='78' column='1' id='type-id-395'/> + <pointer-type-def type-id='type-id-393' size-in-bits='64' id='type-id-397'/> + <pointer-type-def type-id='type-id-398' size-in-bits='64' id='type-id-399'/> + <pointer-type-def type-id='type-id-400' size-in-bits='64' id='type-id-401'/> + <qualified-type-def type-id='type-id-30' restrict='yes' id='type-id-232'/> + <function-decl name='_PyEval_GetFrameLocals' filepath='./Include/internal/pycore_ceval.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_DebugMallocStats' filepath='./Include/internal/pycore_dict.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObjectDict_SetItem' filepath='./Include/internal/pycore_dict.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_MaterializeManagedDict' filepath='./Include/internal/pycore_dict.h' line='281' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-335'/> + </function-decl> + <function-decl name='_PyFloat_DebugMallocStats' filepath='./Include/internal/pycore_floatobject.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTuple_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFloat_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyList_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySlice_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyDict_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyAsyncGen_ClearFreeLists' filepath='./Include/internal/pycore_freelist.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyContext_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObjectStackChunk_ClearFreeList' filepath='./Include/internal/pycore_freelist.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyList_DebugMallocStats' filepath='./Include/internal/pycore_list.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_module_getattro_impl' filepath='./Include/internal/pycore_moduleobject.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-397'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_module_getattro' filepath='./Include/internal/pycore_moduleobject.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-397'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyType_CheckConsistency' filepath='./Include/internal/pycore_object.h' line='277' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_CheckConsistency' filepath='./Include/internal/pycore_object.h' line='278' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_StoreInstanceAttribute' filepath='./Include/internal/pycore_object.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_TryGetInstanceAttribute' filepath='./Include/internal/pycore_object.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-352'/> + </function-decl> + <var-decl name='_PyNone_Type' type-id='type-id-266' mangled-name='_PyNone_Type' visibility='default' filepath='./Include/internal/pycore_object.h' line='781' column='1' elf-symbol-id='_PyNone_Type'/> + <var-decl name='_PyNotImplemented_Type' type-id='type-id-266' mangled-name='_PyNotImplemented_Type' visibility='default' filepath='./Include/internal/pycore_object.h' line='782' column='1' elf-symbol-id='_PyNotImplemented_Type'/> + <var-decl name='_Py_SwappedOp' type-id='type-id-392' mangled-name='_Py_SwappedOp' visibility='default' filepath='./Include/internal/pycore_object.h' line='786' column='1' elf-symbol-id='_Py_SwappedOp'/> + <function-decl name='_PyTuple_DebugMallocStats' filepath='./Include/internal/pycore_tuple.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyStaticType_GetState' filepath='./Include/internal/pycore_typeobject.h' line='168' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-401'/> + </function-decl> + <function-decl name='_Py_type_getattro_impl' filepath='./Include/internal/pycore_typeobject.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_type_getattro' filepath='./Include/internal/pycore_typeobject.h' line='213' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_BaseObject_RichCompare' filepath='./Include/internal/pycore_typeobject.h' line='215' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_initialize_generic' filepath='./Include/internal/pycore_typevarobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_CheckConsistency' mangled-name='_PyUnicode_CheckConsistency' filepath='./Include/internal/pycore_unicodeobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_CheckConsistency'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_AsASCIIString' filepath='./Include/internal/pycore_unicodeobject.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='_Py_NoneStruct' type-id='type-id-356' mangled-name='_Py_NoneStruct' visibility='default' filepath='./Include/object.h' line='1101' column='1' elf-symbol-id='_Py_NoneStruct'/> + <var-decl name='_Py_NotImplementedStruct' type-id='type-id-356' mangled-name='_Py_NotImplementedStruct' visibility='default' filepath='./Include/object.h' line='1120' column='1' elf-symbol-id='_Py_NotImplementedStruct'/> + <function-decl name='PyThreadState_GetDict' mangled-name='PyThreadState_GetDict' filepath='./Include/pystate.h' line='66' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetDict'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyGILState_Ensure' mangled-name='PyGILState_Ensure' filepath='./Include/pystate.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Ensure'> + <return type-id='type-id-395'/> + </function-decl> + <function-decl name='PyGILState_Release' mangled-name='PyGILState_Release' filepath='./Include/pystate.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Release'> + <parameter type-id='type-id-395'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_DecodeASCII' mangled-name='PyUnicode_DecodeASCII' filepath='./Include/unicodeobject.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeASCII'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='fprintf' filepath='/usr/include/stdio.h' line='350' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-402'/> + <parameter type-id='type-id-179'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fwrite' filepath='/usr/include/stdio.h' line='681' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-232'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-402'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='ferror' filepath='/usr/include/stdio.h' line='790' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMem_DumpTraceback' filepath='Objects/object.c' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_IncRef' mangled-name='Py_IncRef' filepath='Objects/object.c' line='327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IncRef'> + <parameter type-id='type-id-4' name='o' filepath='Objects/object.c' line='327' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_DecRef' mangled-name='Py_DecRef' filepath='Objects/object.c' line='333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_DecRef'> + <parameter type-id='type-id-4' name='o' filepath='Objects/object.c' line='333' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_IncRef' mangled-name='_Py_IncRef' filepath='Objects/object.c' line='339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IncRef'> + <parameter type-id='type-id-4' name='o' filepath='Objects/object.c' line='339' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_DecRef' mangled-name='_Py_DecRef' filepath='Objects/object.c' line='345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecRef'> + <parameter type-id='type-id-4' name='o' filepath='Objects/object.c' line='345' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_Init' mangled-name='PyObject_Init' filepath='Objects/object.c' line='479' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Init'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='479' column='1'/> + <parameter type-id='type-id-1' name='tp' filepath='Objects/object.c' line='479' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_InitVar' mangled-name='PyObject_InitVar' filepath='Objects/object.c' line='490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_InitVar'> + <parameter type-id='type-id-321' name='op' filepath='Objects/object.c' line='490' column='1'/> + <parameter type-id='type-id-1' name='tp' filepath='Objects/object.c' line='490' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/object.c' line='490' column='1'/> + <return type-id='type-id-321'/> + </function-decl> + <function-decl name='PyObject_CallFinalizer' mangled-name='PyObject_CallFinalizer' filepath='Objects/object.c' line='525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFinalizer'> + <parameter type-id='type-id-4' name='self' filepath='Objects/object.c' line='525' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_Print' mangled-name='PyObject_Print' filepath='Objects/object.c' line='577' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Print'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='577' column='1'/> + <parameter type-id='type-id-56' name='fp' filepath='Objects/object.c' line='577' column='1'/> + <parameter type-id='type-id-5' name='flags' filepath='Objects/object.c' line='577' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_BreakPoint' mangled-name='_Py_BreakPoint' filepath='Objects/object.c' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_BreakPoint'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_IsFreed' mangled-name='_PyObject_IsFreed' filepath='Objects/object.c' line='655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_IsFreed'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='655' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_Dump' mangled-name='_PyObject_Dump' filepath='Objects/object.c' line='666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_Dump'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='666' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_HasAttrStringWithError' mangled-name='PyObject_HasAttrStringWithError' filepath='Objects/object.c' line='1107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttrStringWithError'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1107' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/object.c' line='1107' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_HasAttrString' mangled-name='PyObject_HasAttrString' filepath='Objects/object.c' line='1117' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttrString'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1117' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/object.c' line='1117' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_DelAttrString' mangled-name='PyObject_DelAttrString' filepath='Objects/object.c' line='1147' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelAttrString'> + <parameter type-id='type-id-4' name='v' filepath='Objects/object.c' line='1147' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/object.c' line='1147' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GetOptionalAttrString' mangled-name='PyObject_GetOptionalAttrString' filepath='Objects/object.c' line='1321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetOptionalAttrString'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1321' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Objects/object.c' line='1321' column='1'/> + <parameter type-id='type-id-238' name='result' filepath='Objects/object.c' line='1321' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_HasAttr' mangled-name='PyObject_HasAttr' filepath='Objects/object.c' line='1355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_HasAttr'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1355' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/object.c' line='1355' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_DelAttr' mangled-name='PyObject_DelAttr' filepath='Objects/object.c' line='1419' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_DelAttr'> + <parameter type-id='type-id-4' name='v' filepath='Objects/object.c' line='1419' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/object.c' line='1419' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_GetDictPtr' mangled-name='_PyObject_GetDictPtr' filepath='Objects/object.c' line='1460' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetDictPtr'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1460' column='1'/> + <return type-id='type-id-238'/> + </function-decl> + <function-decl name='_PyObject_GenericSetAttrWithDict' mangled-name='_PyObject_GenericSetAttrWithDict' filepath='Objects/object.c' line='1721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GenericSetAttrWithDict'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='1721' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/object.c' line='1721' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/object.c' line='1722' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Objects/object.c' line='1722' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_Not' mangled-name='PyObject_Not' filepath='Objects/object.c' line='1888' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Not'> + <parameter type-id='type-id-4' name='v' filepath='Objects/object.c' line='1888' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_ResurrectReference' mangled-name='_Py_ResurrectReference' filepath='Objects/object.c' line='2511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_ResurrectReference'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='2511' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_GET_WEAKREFS_LISTPTR' mangled-name='PyObject_GET_WEAKREFS_LISTPTR' filepath='Objects/object.c' line='2946' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GET_WEAKREFS_LISTPTR'> + <parameter type-id='type-id-4' name='op' filepath='Objects/object.c' line='2946' column='1'/> + <return type-id='type-id-238'/> + </function-decl> + <function-decl name='Py_NewRef' mangled-name='Py_NewRef' filepath='Objects/object.c' line='2957' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewRef'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='2957' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_XNewRef' mangled-name='Py_XNewRef' filepath='Objects/object.c' line='2963' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_XNewRef'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/object.c' line='2963' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_Is' mangled-name='Py_Is' filepath='Objects/object.c' line='2975' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Is'> + <parameter type-id='type-id-4' name='x' filepath='Objects/object.c' line='2975' column='1'/> + <parameter type-id='type-id-4' name='y' filepath='Objects/object.c' line='2975' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_IsNone' mangled-name='Py_IsNone' filepath='Objects/object.c' line='2980' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsNone'> + <parameter type-id='type-id-4' name='x' filepath='Objects/object.c' line='2980' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_IsTrue' mangled-name='Py_IsTrue' filepath='Objects/object.c' line='2985' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsTrue'> + <parameter type-id='type-id-4' name='x' filepath='Objects/object.c' line='2985' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_IsFalse' mangled-name='Py_IsFalse' filepath='Objects/object.c' line='2990' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsFalse'> + <parameter type-id='type-id-4' name='x' filepath='Objects/object.c' line='2990' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_SetRefcnt' mangled-name='_Py_SetRefcnt' filepath='Objects/object.c' line='2998' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SetRefcnt'> + <parameter type-id='type-id-4' name='ob' filepath='Objects/object.c' line='2998' column='1'/> + <parameter type-id='type-id-7' name='refcnt' filepath='Objects/object.c' line='2998' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyRefTracer_SetTracer' mangled-name='PyRefTracer_SetTracer' filepath='Objects/object.c' line='3003' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRefTracer_SetTracer'> + <parameter type-id='type-id-403' name='tracer' filepath='Objects/object.c' line='3003' column='1'/> + <parameter type-id='type-id-30' name='data' filepath='Objects/object.c' line='3003' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRefTracer_GetTracer' mangled-name='PyRefTracer_GetTracer' filepath='Objects/object.c' line='3010' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRefTracer_GetTracer'> + <parameter type-id='type-id-262' name='data' filepath='Objects/object.c' line='3010' column='1'/> + <return type-id='type-id-403'/> + </function-decl> + <function-decl name='Py_GetConstant' mangled-name='Py_GetConstant' filepath='Objects/object.c' line='3050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetConstant'> + <parameter type-id='type-id-101' name='constant_id' filepath='Objects/object.c' line='3050' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_GetConstantBorrowed' mangled-name='Py_GetConstantBorrowed' filepath='Objects/object.c' line='3063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetConstantBorrowed'> + <parameter type-id='type-id-101' name='constant_id' filepath='Objects/object.c' line='3063' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <class-decl name='_Py_object_freelists' size-in-bits='28288' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='127' column='1' id='type-id-398'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='floats' type-id='type-id-404' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tuples' type-id='type-id-405' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='lists' type-id='type-id-406' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7232'> + <var-decl name='dicts' type-id='type-id-407' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12416'> + <var-decl name='dictkeys' type-id='type-id-408' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17600'> + <var-decl name='slices' type-id='type-id-409' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17664'> + <var-decl name='contexts' type-id='type-id-410' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='134' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17792'> + <var-decl name='async_gens' type-id='type-id-411' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22976'> + <var-decl name='async_gen_asends' type-id='type-id-412' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='136' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='28160'> + <var-decl name='object_stacks' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='137' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_dictkeys_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='78' column='1' id='type-id-408'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-414' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='82' column='1'/> + </data-member> + </class-decl> + <array-type-def dimensions='1' type-id='type-id-415' size-in-bits='5120' id='type-id-414'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + </abi-instr> + <abi-instr address-size='64' path='Objects/obmalloc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-417' size-in-bits='14400' id='type-id-418'> + <subrange length='75' type-id='type-id-2' id='type-id-419'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-420' size-in-bits='8256' id='type-id-421'> + <subrange length='129' type-id='type-id-2' id='type-id-422'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-423' size-in-bits='6912' id='type-id-424'> + <subrange length='36' type-id='type-id-2' id='type-id-425'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-326' size-in-bits='512' id='type-id-426'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-427' size-in-bits='64' id='type-id-428'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-427' size-in-bits='128' id='type-id-430'> + <subrange length='2' type-id='type-id-2' id='type-id-431'/> + </array-type-def> + <enum-decl name='PyMemAllocatorDomain' naming-typedef-id='type-id-432' filepath='./Include/cpython/pymem.h' line='5' column='1' id='type-id-433'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PYMEM_DOMAIN_RAW' value='0'/> + <enumerator name='PYMEM_DOMAIN_MEM' value='1'/> + <enumerator name='PYMEM_DOMAIN_OBJ' value='2'/> + </enum-decl> + <typedef-decl name='PyMemAllocatorDomain' type-id='type-id-433' filepath='./Include/cpython/pymem.h' line='14' column='1' id='type-id-432'/> + <typedef-decl name='mi_heap_t' type-id='type-id-434' filepath='./Include/internal/mimalloc/mimalloc.h' line='188' column='1' id='type-id-435'/> + <typedef-decl name='mi_arena_id_t' type-id='type-id-5' filepath='./Include/internal/mimalloc/mimalloc.h' line='281' column='1' id='type-id-436'/> + <typedef-decl name='mi_encoded_t' type-id='type-id-427' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='231' column='1' id='type-id-437'/> + <typedef-decl name='mi_threadid_t' type-id='type-id-21' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='234' column='1' id='type-id-438'/> + <class-decl name='mi_block_s' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='237' column='1' id='type-id-439'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-437' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='238' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_block_t' type-id='type-id-439' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='239' column='1' id='type-id-440'/> + <union-decl name='mi_page_flags_s' size-in-bits='8' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='254' column='1' id='type-id-441'> + <data-member access='public'> + <var-decl name='full_aligned' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='255' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='x' type-id='type-id-442' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='259' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='256' column='1' id='type-id-442'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='in_full' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1'> + <var-decl name='has_aligned' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='258' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_page_flags_t' type-id='type-id-441' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='260' column='1' id='type-id-443'/> + <class-decl name='mi_page_s' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='308' column='1' id='type-id-444'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='slice_count' type-id='type-id-326' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='310' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='slice_offset' type-id='type-id-326' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='311' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='is_committed' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='312' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='65'> + <var-decl name='is_zero_init' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='313' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='66'> + <var-decl name='use_qsbr' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='314' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67'> + <var-decl name='tag' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='315' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='72'> + <var-decl name='debug_offset' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='316' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='capacity' type-id='type-id-445' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='319' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='reserved' type-id='type-id-445' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='320' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='112'> + <var-decl name='flags' type-id='type-id-443' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='321' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='120'> + <var-decl name='free_is_zero' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='322' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='121'> + <var-decl name='retire_expire' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='323' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='free' type-id='type-id-446' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='325' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='used' type-id='type-id-326' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='326' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='xblock_size' type-id='type-id-326' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='327' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='local_free' type-id='type-id-446' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='328' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='next' type-id='type-id-447' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='337' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='prev' type-id='type-id-447' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='338' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='padding' type-id='type-id-428' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='347' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_page_t' type-id='type-id-444' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='349' column='1' id='type-id-448'/> + <typedef-decl name='mi_slice_t' type-id='type-id-448' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='395' column='1' id='type-id-449'/> + <class-decl name='mi_abandoned_pool_s' size-in-bits='2560' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='476' column='1' id='type-id-450'/> + <typedef-decl name='mi_abandoned_pool_t' type-id='type-id-450' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='493' column='1' id='type-id-451'/> + <typedef-decl name='mi_tld_t' type-id='type-id-452' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='510' column='1' id='type-id-453'/> + <class-decl name='mi_page_queue_s' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='513' column='1' id='type-id-454'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='first' type-id='type-id-420' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='514' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='last' type-id='type-id-420' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='515' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='block_size' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='516' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_page_queue_t' type-id='type-id-454' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='517' column='1' id='type-id-417'/> + <class-decl name='mi_random_cxt_s' size-in-bits='1088' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='522' column='1' id='type-id-455'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='input' type-id='type-id-426' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='523' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='output' type-id='type-id-426' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='524' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='output_available' type-id='type-id-5' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='525' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1056'> + <var-decl name='weak' type-id='type-id-352' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='526' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_random_ctx_t' type-id='type-id-455' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='527' column='1' id='type-id-456'/> + <class-decl name='mi_heap_s' size-in-bits='24512' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='547' column='1' id='type-id-434'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tld' type-id='type-id-457' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='548' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pages_free_direct' type-id='type-id-421' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='549' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8320'> + <var-decl name='pages' type-id='type-id-418' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='550' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22784'> + <var-decl name='thread_id' type-id='type-id-438' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='552' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22848'> + <var-decl name='arena_id' type-id='type-id-436' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='553' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22912'> + <var-decl name='cookie' type-id='type-id-427' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='554' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22976'> + <var-decl name='keys' type-id='type-id-430' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='555' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='23104'> + <var-decl name='random' type-id='type-id-456' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='556' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24192'> + <var-decl name='page_count' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='557' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24256'> + <var-decl name='page_retired_min' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='558' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24320'> + <var-decl name='page_retired_max' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='559' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24384'> + <var-decl name='next' type-id='type-id-458' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='560' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24448'> + <var-decl name='no_reclaim' type-id='type-id-352' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='561' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24456'> + <var-decl name='tag' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='562' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24464'> + <var-decl name='debug_offset' type-id='type-id-305' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='563' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24472'> + <var-decl name='page_use_qsbr' type-id='type-id-352' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='564' column='1'/> + </data-member> + </class-decl> + <class-decl name='mi_stat_count_s' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='615' column='1' id='type-id-459'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='allocated' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='616' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='freed' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='617' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='peak' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='618' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='current' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='619' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_stat_count_t' type-id='type-id-459' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='620' column='1' id='type-id-461'/> + <class-decl name='mi_stat_counter_s' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='622' column='1' id='type-id-462'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='total' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='623' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='count' type-id='type-id-460' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='624' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_stat_counter_t' type-id='type-id-462' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='625' column='1' id='type-id-463'/> + <class-decl name='mi_stats_s' size-in-bits='5120' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='627' column='1' id='type-id-464'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='segments' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='628' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pages' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='629' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='reserved' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='630' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='committed' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='631' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='reset' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='632' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='purged' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='633' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='page_committed' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='634' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='segments_abandoned' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='635' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='pages_abandoned' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='636' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='threads' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='637' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='normal' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='638' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='huge' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='639' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3072'> + <var-decl name='large' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='640' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='malloc' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='641' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3584'> + <var-decl name='segments_cache' type-id='type-id-461' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='642' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3840'> + <var-decl name='pages_extended' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='643' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3968'> + <var-decl name='mmap_calls' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='644' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='commit_calls' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='645' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4224'> + <var-decl name='reset_calls' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='646' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4352'> + <var-decl name='purge_calls' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='647' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4480'> + <var-decl name='page_no_retire' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='648' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4608'> + <var-decl name='searches' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='649' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4736'> + <var-decl name='normal_count' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='650' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4864'> + <var-decl name='huge_count' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='651' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4992'> + <var-decl name='large_count' type-id='type-id-463' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='652' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_stats_t' type-id='type-id-464' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='656' column='1' id='type-id-465'/> + <class-decl name='mi_span_queue_s' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='683' column='1' id='type-id-466'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='first' type-id='type-id-467' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='684' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='last' type-id='type-id-467' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='685' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='slice_count' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='686' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_span_queue_t' type-id='type-id-466' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='687' column='1' id='type-id-423'/> + <class-decl name='mi_os_tld_s' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='692' column='1' id='type-id-468'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='region_idx' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='693' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='stats' type-id='type-id-469' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='694' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_os_tld_t' type-id='type-id-468' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='695' column='1' id='type-id-470'/> + <class-decl name='mi_segments_tld_s' size-in-bits='7360' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='699' column='1' id='type-id-471'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='spans' type-id='type-id-424' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='700' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6912'> + <var-decl name='count' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='701' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6976'> + <var-decl name='peak_count' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='702' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7040'> + <var-decl name='current_size' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='703' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7104'> + <var-decl name='peak_size' type-id='type-id-21' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='704' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7168'> + <var-decl name='stats' type-id='type-id-469' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='705' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7232'> + <var-decl name='os' type-id='type-id-472' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='706' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7296'> + <var-decl name='abandoned' type-id='type-id-473' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='707' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='mi_segments_tld_t' type-id='type-id-471' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='708' column='1' id='type-id-474'/> + <class-decl name='mi_tld_s' size-in-bits='12864' is-struct='yes' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='711' column='1' id='type-id-452'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='heartbeat' type-id='type-id-376' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='712' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='recurse' type-id='type-id-352' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='713' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='heap_backing' type-id='type-id-458' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='714' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='heaps' type-id='type-id-458' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='715' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='segments' type-id='type-id-474' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='716' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7616'> + <var-decl name='os' type-id='type-id-470' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='717' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7744'> + <var-decl name='stats' type-id='type-id-465' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/types.h' line='718' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_PyLockFlags' filepath='./Include/internal/pycore_lock.h' line='41' column='1' id='type-id-475'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_LOCK_DONT_DETACH' value='0'/> + <enumerator name='_PY_LOCK_DETACH' value='1'/> + <enumerator name='_PY_LOCK_HANDLE_SIGNALS' value='2'/> + </enum-decl> + <typedef-decl name='_PyLockFlags' type-id='type-id-475' filepath='./Include/internal/pycore_lock.h' line='50' column='1' id='type-id-476'/> + <typedef-decl name='_PyRuntimeState' type-id='type-id-477' filepath='./Include/internal/pycore_runtime.h' line='359' column='1' id='type-id-478'/> + <enum-decl name='PyLockStatus' filepath='./Include/pythread.h' line='12' column='1' id='type-id-479'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PY_LOCK_FAILURE' value='0'/> + <enumerator name='PY_LOCK_ACQUIRED' value='1'/> + <enumerator name='PY_LOCK_INTR' value='2'/> + </enum-decl> + <typedef-decl name='PyLockStatus' type-id='type-id-479' filepath='./Include/pythread.h' line='16' column='1' id='type-id-480'/> + <enum-decl name='__rusage_who' filepath='/usr/include/x86_64-linux-gnu/bits/resource.h' line='158' column='1' id='type-id-481'> + <underlying-type type-id='type-id-32'/> + <enumerator name='RUSAGE_SELF' value='0'/> + <enumerator name='RUSAGE_CHILDREN' value='-1'/> + <enumerator name='RUSAGE_THREAD' value='1'/> + </enum-decl> + <typedef-decl name='__time_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='160' column='1' id='type-id-482'/> + <typedef-decl name='__suseconds_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='162' column='1' id='type-id-483'/> + <typedef-decl name='__clockid_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='169' column='1' id='type-id-187'/> + <typedef-decl name='__syscall_slong_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='197' column='1' id='type-id-484'/> + <typedef-decl name='clockid_t' type-id='type-id-187' filepath='/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h' line='7' column='1' id='type-id-227'/> + <class-decl name='rusage' size-in-bits='1152' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='33' column='1' id='type-id-485'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ru_utime' type-id='type-id-198' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ru_stime' type-id='type-id-198' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='' type-id='type-id-486' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='' type-id='type-id-487' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='' type-id='type-id-488' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='' type-id='type-id-489' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='' type-id='type-id-490' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='' type-id='type-id-491' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='' type-id='type-id-492' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='' type-id='type-id-493' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='' type-id='type-id-494' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='' type-id='type-id-495' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='' type-id='type-id-496' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='' type-id='type-id-497' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='' type-id='type-id-498' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='' type-id='type-id-499' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='40' column='1' id='type-id-486'> + <data-member access='public'> + <var-decl name='ru_maxrss' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='42' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_maxrss_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='43' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='47' column='1' id='type-id-487'> + <data-member access='public'> + <var-decl name='ru_ixrss' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='49' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_ixrss_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='50' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='53' column='1' id='type-id-488'> + <data-member access='public'> + <var-decl name='ru_idrss' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='55' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_idrss_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='56' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='59' column='1' id='type-id-489'> + <data-member access='public'> + <var-decl name='ru_isrss' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='61' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_isrss_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='62' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='66' column='1' id='type-id-490'> + <data-member access='public'> + <var-decl name='ru_minflt' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='68' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_minflt_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='69' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='72' column='1' id='type-id-491'> + <data-member access='public'> + <var-decl name='ru_majflt' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='74' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_majflt_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='75' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='78' column='1' id='type-id-492'> + <data-member access='public'> + <var-decl name='ru_nswap' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='80' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_nswap_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='81' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='85' column='1' id='type-id-493'> + <data-member access='public'> + <var-decl name='ru_inblock' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='87' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_inblock_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='88' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='91' column='1' id='type-id-494'> + <data-member access='public'> + <var-decl name='ru_oublock' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='93' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_oublock_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='94' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='97' column='1' id='type-id-495'> + <data-member access='public'> + <var-decl name='ru_msgsnd' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='99' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_msgsnd_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='100' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__10' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='103' column='1' id='type-id-496'> + <data-member access='public'> + <var-decl name='ru_msgrcv' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='105' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_msgrcv_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='106' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='109' column='1' id='type-id-497'> + <data-member access='public'> + <var-decl name='ru_nsignals' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='111' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_nsignals_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='112' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__12' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='117' column='1' id='type-id-498'> + <data-member access='public'> + <var-decl name='ru_nvcsw' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='119' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_nvcsw_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='120' column='1'/> + </data-member> + </union-decl> + <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='124' column='1' id='type-id-499'> + <data-member access='public'> + <var-decl name='ru_nivcsw' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='126' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__ru_nivcsw_word' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_rusage.h' line='127' column='1'/> + </data-member> + </union-decl> + <class-decl name='timespec' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='11' column='1' id='type-id-107'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tv_sec' type-id='type-id-482' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tv_nsec' type-id='type-id-484' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h' line='21' column='1'/> + </data-member> + </class-decl> + <class-decl name='timeval' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='8' column='1' id='type-id-198'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tv_sec' type-id='type-id-482' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tv_usec' type-id='type-id-483' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h' line='15' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__rusage_who_t' type-id='type-id-481' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='39' column='1' id='type-id-500'/> + <pointer-type-def type-id='type-id-501' size-in-bits='64' id='type-id-502'/> + <pointer-type-def type-id='type-id-503' size-in-bits='64' id='type-id-504'/> + <pointer-type-def type-id='type-id-478' size-in-bits='64' id='type-id-171'/> + <qualified-type-def type-id='type-id-435' const='yes' id='type-id-505'/> + <qualified-type-def type-id='type-id-448' const='yes' id='type-id-506'/> + <pointer-type-def type-id='type-id-451' size-in-bits='64' id='type-id-473'/> + <pointer-type-def type-id='type-id-440' size-in-bits='64' id='type-id-446'/> + <pointer-type-def type-id='type-id-435' size-in-bits='64' id='type-id-458'/> + <pointer-type-def type-id='type-id-470' size-in-bits='64' id='type-id-472'/> + <pointer-type-def type-id='type-id-444' size-in-bits='64' id='type-id-447'/> + <pointer-type-def type-id='type-id-448' size-in-bits='64' id='type-id-420'/> + <pointer-type-def type-id='type-id-449' size-in-bits='64' id='type-id-467'/> + <pointer-type-def type-id='type-id-465' size-in-bits='64' id='type-id-469'/> + <pointer-type-def type-id='type-id-453' size-in-bits='64' id='type-id-457'/> + <pointer-type-def type-id='type-id-507' size-in-bits='64' id='type-id-508'/> + <pointer-type-def type-id='type-id-485' size-in-bits='64' id='type-id-189'/> + <pointer-type-def type-id='type-id-107' size-in-bits='64' id='type-id-178'/> + <function-decl name='Py_GETENV' mangled-name='Py_GETENV' filepath='./Include/cpython/pydebug.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GETENV'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyGILState_Check' mangled-name='PyGILState_Check' filepath='./Include/cpython/pystate.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_Check'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyInterpreterState_Head' mangled-name='PyInterpreterState_Head' filepath='./Include/cpython/pystate.h' line='263' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Head'> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='PyInterpreterState_Next' mangled-name='PyInterpreterState_Next' filepath='./Include/cpython/pystate.h' line='264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Next'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-28'/> + </function-decl> + <var-decl name='_mi_stats_main' type-id='type-id-465' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='62' column='1'/> + <var-decl name='_mi_page_empty' type-id='type-id-506' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='63' column='1'/> + <var-decl name='_mi_abandoned_default' type-id='type-id-451' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='117' column='1'/> + <var-decl name='_mi_heap_empty' type-id='type-id-505' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/internal.h' line='368' column='1'/> + <var-decl name='_mi_heap_default' type-id='type-id-458' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/prim.h' line='129' column='1'/> + <var-decl name='_mi_process_is_initialized' type-id='type-id-352' visibility='default' filepath='./Include/internal/mimalloc/mimalloc/prim.h' line='130' column='1'/> + <function-decl name='_PyInterpreterState_HasFeature' filepath='./Include/internal/pycore_interp.h' line='396' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-2'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMutex_LockTimed' filepath='./Include/internal/pycore_lock.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-26'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-476'/> + <return type-id='type-id-480'/> + </function-decl> + <function-decl name='_PyEval_StopTheWorldAll' filepath='./Include/internal/pycore_pystate.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_StartTheWorldAll' filepath='./Include/internal/pycore_pystate.h' line='176' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_qsbr_poll' filepath='./Include/internal/pycore_qsbr.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-509'/> + <parameter type-id='type-id-108'/> + <return type-id='type-id-352'/> + </function-decl> + <function-decl name='pthread_key_create' filepath='/usr/include/pthread.h' line='1297' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-508'/> + <parameter type-id='type-id-510'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_setspecific' filepath='/usr/include/pthread.h' line='1308' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-507'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='snprintf' filepath='/usr/include/stdio.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='vsnprintf' filepath='/usr/include/stdio.h' line='382' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-302'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fputc' filepath='/usr/include/stdio.h' line='549' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fputs' filepath='/usr/include/stdio.h' line='655' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-402'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='malloc' filepath='/usr/include/stdlib.h' line='540' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='calloc' filepath='/usr/include/stdlib.h' line='543' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='realloc' filepath='/usr/include/stdlib.h' line='551' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='free' filepath='/usr/include/stdlib.h' line='555' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='abort' filepath='/usr/include/stdlib.h' line='598' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='atexit' filepath='/usr/include/stdlib.h' line='602' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-233'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getenv' filepath='/usr/include/stdlib.h' line='641' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='realpath' filepath='/usr/include/stdlib.h' line='808' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-181'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='strstr' filepath='/usr/include/string.h' line='350' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='clock_gettime' filepath='/usr/include/time.h' line='279' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-227'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sysconf' filepath='/usr/include/unistd.h' line='640' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='syscall' filepath='/usr/include/unistd.h' line='1091' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-183'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='munmap' filepath='/usr/include/x86_64-linux-gnu/sys/mman.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mprotect' filepath='/usr/include/x86_64-linux-gnu/sys/mman.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='madvise' filepath='/usr/include/x86_64-linux-gnu/sys/mman.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='getrusage' filepath='/usr/include/x86_64-linux-gnu/sys/resource.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-500'/> + <parameter type-id='type-id-189'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_mi_heap_main' type-id='type-id-435' visibility='default' filepath='Objects/mimalloc/init.c' line='128' column='1'/> + <function-decl name='_PyMem_GetCurrentAllocatorName' mangled-name='_PyMem_GetCurrentAllocatorName' filepath='Objects/obmalloc.c' line='728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_GetCurrentAllocatorName'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyMem_SetupDebugHooks' mangled-name='PyMem_SetupDebugHooks' filepath='Objects/obmalloc.c' line='832' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_SetupDebugHooks'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMem_GetAllocator' mangled-name='PyMem_GetAllocator' filepath='Objects/obmalloc.c' line='870' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_GetAllocator'> + <parameter type-id='type-id-432' name='domain' filepath='Objects/obmalloc.c' line='870' column='1'/> + <parameter type-id='type-id-502' name='allocator' filepath='Objects/obmalloc.c' line='870' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMem_SetAllocator' mangled-name='PyMem_SetAllocator' filepath='Objects/obmalloc.c' line='878' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_SetAllocator'> + <parameter type-id='type-id-432' name='domain' filepath='Objects/obmalloc.c' line='878' column='1'/> + <parameter type-id='type-id-502' name='allocator' filepath='Objects/obmalloc.c' line='878' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_GetArenaAllocator' mangled-name='PyObject_GetArenaAllocator' filepath='Objects/obmalloc.c' line='886' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetArenaAllocator'> + <parameter type-id='type-id-504' name='allocator' filepath='Objects/obmalloc.c' line='886' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyObject_SetArenaAllocator' mangled-name='PyObject_SetArenaAllocator' filepath='Objects/obmalloc.c' line='894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_SetArenaAllocator'> + <parameter type-id='type-id-504' name='allocator' filepath='Objects/obmalloc.c' line='894' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMem_RawMalloc' mangled-name='PyMem_RawMalloc' filepath='Objects/obmalloc.c' line='938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawMalloc'> + <parameter type-id='type-id-21' name='size' filepath='Objects/obmalloc.c' line='938' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyMem_RawCalloc' mangled-name='PyMem_RawCalloc' filepath='Objects/obmalloc.c' line='952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawCalloc'> + <parameter type-id='type-id-21' name='nelem' filepath='Objects/obmalloc.c' line='952' column='1'/> + <parameter type-id='type-id-21' name='elsize' filepath='Objects/obmalloc.c' line='952' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_Strdup' mangled-name='_PyMem_Strdup' filepath='Objects/obmalloc.c' line='1060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMem_Strdup'> + <parameter type-id='type-id-6' name='str' filepath='Objects/obmalloc.c' line='1060' column='1'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyObject_DebugMallocStats' mangled-name='_PyObject_DebugMallocStats' filepath='Objects/obmalloc.c' line='3439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_DebugMallocStats'> + <parameter type-id='type-id-56' name='out' filepath='Objects/obmalloc.c' line='3439' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-511'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Objects/odictobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyODict_Type' type-id='type-id-266' mangled-name='PyODict_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='15' column='1' elf-symbol-id='PyODict_Type'/> + <var-decl name='PyODictIter_Type' type-id='type-id-266' mangled-name='PyODictIter_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='16' column='1' elf-symbol-id='PyODictIter_Type'/> + <var-decl name='PyODictKeys_Type' type-id='type-id-266' mangled-name='PyODictKeys_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='17' column='1' elf-symbol-id='PyODictKeys_Type'/> + <var-decl name='PyODictItems_Type' type-id='type-id-266' mangled-name='PyODictItems_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='18' column='1' elf-symbol-id='PyODictItems_Type'/> + <var-decl name='PyODictValues_Type' type-id='type-id-266' mangled-name='PyODictValues_Type' visibility='default' filepath='./Include/cpython/odictobject.h' line='19' column='1' elf-symbol-id='PyODictValues_Type'/> + <function-decl name='_PyErr_ChainExceptions1' mangled-name='_PyErr_ChainExceptions1' filepath='./Include/cpython/pyerrors.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ChainExceptions1'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyDictView_New' filepath='./Include/internal/pycore_dict.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_FromKeys' filepath='./Include/internal/pycore_dict.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_dict_lookup' filepath='./Include/internal/pycore_dict.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-301'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyDict_Pop_KnownHash' filepath='./Include/internal/pycore_dict.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-301'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyODict_New' mangled-name='PyODict_New' filepath='Objects/odictobject.c' line='1576' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_New'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyODict_SetItem' mangled-name='PyODict_SetItem' filepath='Objects/odictobject.c' line='1599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_SetItem'> + <parameter type-id='type-id-4' name='od' filepath='Objects/odictobject.c' line='1599' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/odictobject.c' line='1599' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Objects/odictobject.c' line='1599' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyODict_DelItem' mangled-name='PyODict_DelItem' filepath='Objects/odictobject.c' line='1608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyODict_DelItem'> + <parameter type-id='type-id-4' name='od' filepath='Objects/odictobject.c' line='1608' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/odictobject.c' line='1608' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <pointer-type-def type-id='type-id-512' size-in-bits='64' id='type-id-415'/> + <typedef-decl name='PyDictKeysObject' type-id='type-id-513' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-512'/> + <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='140' column='1' id='type-id-513'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='dk_refcnt' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='dk_log2_size' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='72'> + <var-decl name='dk_log2_index_bytes' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='dk_kind' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='dk_version' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_dict.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='dk_usable' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='dk_nentries' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='dk_indices' type-id='type-id-267' visibility='default' filepath='./Include/internal/pycore_dict.h' line='180' column='1'/> + </data-member> + </class-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/picklebufobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyPickleBuffer_Type' type-id='type-id-266' mangled-name='PyPickleBuffer_Type' visibility='default' filepath='./Include/cpython/picklebufobject.h' line='13' column='1' elf-symbol-id='PyPickleBuffer_Type'/> + <function-decl name='PyPickleBuffer_FromObject' mangled-name='PyPickleBuffer_FromObject' filepath='Objects/picklebufobject.c' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_FromObject'> + <parameter type-id='type-id-4' name='base' filepath='Objects/picklebufobject.c' line='16' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyPickleBuffer_GetBuffer' mangled-name='PyPickleBuffer_GetBuffer' filepath='Objects/picklebufobject.c' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_GetBuffer'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/picklebufobject.c' line='35' column='1'/> + <return type-id='type-id-255'/> + </function-decl> + <function-decl name='PyPickleBuffer_Release' mangled-name='PyPickleBuffer_Release' filepath='Objects/picklebufobject.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPickleBuffer_Release'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/picklebufobject.c' line='54' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/rangeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PySequence_IterSearch' filepath='./Include/internal/pycore_abstract.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-7'/> + </function-decl> + <var-decl name='PyRange_Type' type-id='type-id-266' mangled-name='PyRange_Type' visibility='default' filepath='./Include/rangeobject.h' line='18' column='1' elf-symbol-id='PyRange_Type'/> + <var-decl name='PyRangeIter_Type' type-id='type-id-266' mangled-name='PyRangeIter_Type' visibility='default' filepath='./Include/rangeobject.h' line='19' column='1' elf-symbol-id='PyRangeIter_Type'/> + <var-decl name='PyLongRangeIter_Type' type-id='type-id-266' mangled-name='PyLongRangeIter_Type' visibility='default' filepath='./Include/rangeobject.h' line='20' column='1' elf-symbol-id='PyLongRangeIter_Type'/> + <function-decl name='_PySlice_GetLongIndices' mangled-name='_PySlice_GetLongIndices' filepath='./Include/sliceobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySlice_GetLongIndices'> + <parameter type-id='type-id-514'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/setobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-515' size-in-bits='1024' id='type-id-516'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <class-decl name='setentry' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-515' visibility='default' filepath='./Include/cpython/setobject.h' line='20' column='1' id='type-id-518'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='key' type-id='type-id-4' visibility='default' filepath='./Include/cpython/setobject.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='hash' type-id='type-id-301' visibility='default' filepath='./Include/cpython/setobject.h' line='22' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='setentry' type-id='type-id-518' filepath='./Include/cpython/setobject.h' line='23' column='1' id='type-id-515'/> + <class-decl name='PySetObject' size-in-bits='1600' is-struct='yes' naming-typedef-id='type-id-519' visibility='default' filepath='./Include/cpython/setobject.h' line='36' column='1' id='type-id-520'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/setobject.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fill' type-id='type-id-7' visibility='default' filepath='./Include/cpython/setobject.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='used' type-id='type-id-7' visibility='default' filepath='./Include/cpython/setobject.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mask' type-id='type-id-7' visibility='default' filepath='./Include/cpython/setobject.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='table' type-id='type-id-521' visibility='default' filepath='./Include/cpython/setobject.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='hash' type-id='type-id-301' visibility='default' filepath='./Include/cpython/setobject.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='finger' type-id='type-id-7' visibility='default' filepath='./Include/cpython/setobject.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='smalltable' type-id='type-id-516' visibility='default' filepath='./Include/cpython/setobject.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/setobject.h' line='58' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PySetObject' type-id='type-id-520' filepath='./Include/cpython/setobject.h' line='59' column='1' id='type-id-519'/> + <pointer-type-def type-id='type-id-519' size-in-bits='64' id='type-id-522'/> + <pointer-type-def type-id='type-id-515' size-in-bits='64' id='type-id-521'/> + <function-decl name='_PyDict_Contains_KnownHash' filepath='./Include/internal/pycore_dict.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-301'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PySet_Dummy' type-id='type-id-4' mangled-name='_PySet_Dummy' visibility='default' filepath='./Include/internal/pycore_setobject.h' line='29' column='1' elf-symbol-id='_PySet_Dummy'/> + <function-decl name='_PyUnicode_EQ' filepath='./Include/internal/pycore_unicodeobject.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='PySet_Type' type-id='type-id-266' mangled-name='PySet_Type' visibility='default' filepath='./Include/setobject.h' line='9' column='1' elf-symbol-id='PySet_Type'/> + <var-decl name='PyFrozenSet_Type' type-id='type-id-266' mangled-name='PyFrozenSet_Type' visibility='default' filepath='./Include/setobject.h' line='10' column='1' elf-symbol-id='PyFrozenSet_Type'/> + <var-decl name='PySetIter_Type' type-id='type-id-266' mangled-name='PySetIter_Type' visibility='default' filepath='./Include/setobject.h' line='11' column='1' elf-symbol-id='PySetIter_Type'/> + <function-decl name='_PySet_Contains' mangled-name='_PySet_Contains' filepath='Objects/setobject.c' line='2152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySet_Contains'> + <parameter type-id='type-id-522' name='so' filepath='Objects/setobject.c' line='2152' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/setobject.c' line='2152' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySet_Size' mangled-name='PySet_Size' filepath='Objects/setobject.c' line='2588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Size'> + <parameter type-id='type-id-4' name='anyset' filepath='Objects/setobject.c' line='2588' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PySet_Clear' mangled-name='PySet_Clear' filepath='Objects/setobject.c' line='2598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Clear'> + <parameter type-id='type-id-4' name='set' filepath='Objects/setobject.c' line='2598' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySet_Discard' mangled-name='PySet_Discard' filepath='Objects/setobject.c' line='2630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Discard'> + <parameter type-id='type-id-4' name='set' filepath='Objects/setobject.c' line='2630' column='1'/> + <parameter type-id='type-id-4' name='key' filepath='Objects/setobject.c' line='2630' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySet_Pop' mangled-name='PySet_Pop' filepath='Objects/setobject.c' line='2694' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySet_Pop'> + <parameter type-id='type-id-4' name='set' filepath='Objects/setobject.c' line='2694' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/sliceobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_Py_EllipsisObject' type-id='type-id-356' mangled-name='_Py_EllipsisObject' visibility='default' filepath='./Include/sliceobject.h' line='9' column='1' elf-symbol-id='_Py_EllipsisObject'/> + <var-decl name='PySlice_Type' type-id='type-id-266' mangled-name='PySlice_Type' visibility='default' filepath='./Include/sliceobject.h' line='32' column='1' elf-symbol-id='PySlice_Type'/> + <var-decl name='PyEllipsis_Type' type-id='type-id-266' mangled-name='PyEllipsis_Type' visibility='default' filepath='./Include/sliceobject.h' line='33' column='1' elf-symbol-id='PyEllipsis_Type'/> + <function-decl name='PySlice_New' mangled-name='PySlice_New' filepath='Objects/sliceobject.c' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_New'> + <parameter type-id='type-id-4' name='start' filepath='Objects/sliceobject.c' line='163' column='1'/> + <parameter type-id='type-id-4' name='stop' filepath='Objects/sliceobject.c' line='163' column='1'/> + <parameter type-id='type-id-4' name='step' filepath='Objects/sliceobject.c' line='163' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySlice_GetIndices' mangled-name='PySlice_GetIndices' filepath='Objects/sliceobject.c' line='205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_GetIndices'> + <parameter type-id='type-id-4' name='_r' filepath='Objects/sliceobject.c' line='205' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/sliceobject.c' line='205' column='1'/> + <parameter type-id='type-id-8' name='start' filepath='Objects/sliceobject.c' line='206' column='1'/> + <parameter type-id='type-id-8' name='stop' filepath='Objects/sliceobject.c' line='206' column='1'/> + <parameter type-id='type-id-8' name='step' filepath='Objects/sliceobject.c' line='206' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PySlice_GetIndicesEx' mangled-name='PySlice_GetIndicesEx' filepath='Objects/sliceobject.c' line='327' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySlice_GetIndicesEx'> + <parameter type-id='type-id-4' name='_r' filepath='Objects/sliceobject.c' line='327' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/sliceobject.c' line='327' column='1'/> + <parameter type-id='type-id-8' name='start' filepath='Objects/sliceobject.c' line='328' column='1'/> + <parameter type-id='type-id-8' name='stop' filepath='Objects/sliceobject.c' line='328' column='1'/> + <parameter type-id='type-id-8' name='step' filepath='Objects/sliceobject.c' line='328' column='1'/> + <parameter type-id='type-id-8' name='slicelength' filepath='Objects/sliceobject.c' line='329' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/structseq.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyType_Slot' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-523' visibility='default' filepath='./Include/object.h' line='499' column='1' id='type-id-524'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='slot' type-id='type-id-5' visibility='default' filepath='./Include/object.h' line='500' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pfunc' type-id='type-id-30' visibility='default' filepath='./Include/object.h' line='501' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyType_Slot' type-id='type-id-524' filepath='./Include/object.h' line='502' column='1' id='type-id-523'/> + <class-decl name='PyType_Spec' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-16' visibility='default' filepath='./Include/object.h' line='504' column='1' id='type-id-525'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/object.h' line='505' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='basicsize' type-id='type-id-5' visibility='default' filepath='./Include/object.h' line='506' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='itemsize' type-id='type-id-5' visibility='default' filepath='./Include/object.h' line='507' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='flags' type-id='type-id-101' visibility='default' filepath='./Include/object.h' line='508' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='slots' type-id='type-id-526' visibility='default' filepath='./Include/object.h' line='509' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyType_Spec' type-id='type-id-525' filepath='./Include/object.h' line='510' column='1' id='type-id-16'/> + <pointer-type-def type-id='type-id-523' size-in-bits='64' id='type-id-526'/> + <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-527'/> + <function-decl name='_PyType_HasSubclasses' filepath='./Include/internal/pycore_typeobject.h' line='200' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_FromSpecWithBases' mangled-name='PyType_FromSpecWithBases' filepath='./Include/object.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpecWithBases'> + <parameter type-id='type-id-527'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='PyStructSequence_UnnamedField' type-id='type-id-528' mangled-name='PyStructSequence_UnnamedField' visibility='default' filepath='./Include/structseq.h' line='22' column='1' elf-symbol-id='PyStructSequence_UnnamedField'/> + <function-decl name='PyStructSequence_GetItem' mangled-name='PyStructSequence_GetItem' filepath='Objects/structseq.c' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_GetItem'> + <parameter type-id='type-id-4' name='op' filepath='Objects/structseq.c' line='98' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/structseq.c' line='98' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyStructSequence_InitType2' mangled-name='PyStructSequence_InitType2' filepath='Objects/structseq.c' line='677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_InitType2'> + <parameter type-id='type-id-1' name='type' filepath='Objects/structseq.c' line='677' column='1'/> + <parameter type-id='type-id-347' name='desc' filepath='Objects/structseq.c' line='677' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyStructSequence_InitType' mangled-name='PyStructSequence_InitType' filepath='Objects/structseq.c' line='711' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_InitType'> + <parameter type-id='type-id-1' name='type' filepath='Objects/structseq.c' line='711' column='1'/> + <parameter type-id='type-id-347' name='desc' filepath='Objects/structseq.c' line='711' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyStructSequence_NewType' mangled-name='_PyStructSequence_NewType' filepath='Objects/structseq.c' line='749' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStructSequence_NewType'> + <parameter type-id='type-id-347' name='desc' filepath='Objects/structseq.c' line='749' column='1'/> + <parameter type-id='type-id-2' name='tp_flags' filepath='Objects/structseq.c' line='749' column='1'/> + <return type-id='type-id-1'/> + </function-decl> + <function-decl name='PyStructSequence_NewType' mangled-name='PyStructSequence_NewType' filepath='Objects/structseq.c' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStructSequence_NewType'> + <parameter type-id='type-id-347' name='desc' filepath='Objects/structseq.c' line='801' column='1'/> + <return type-id='type-id-1'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/tupleobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyObject_GC_Resize' mangled-name='_PyObject_GC_Resize' filepath='./Include/objimpl.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GC_Resize'> + <parameter type-id='type-id-321'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-321'/> + </function-decl> + <var-decl name='PyTuple_Type' type-id='type-id-266' mangled-name='PyTuple_Type' visibility='default' filepath='./Include/tupleobject.h' line='23' column='1' elf-symbol-id='PyTuple_Type'/> + <var-decl name='PyTupleIter_Type' type-id='type-id-266' mangled-name='PyTupleIter_Type' visibility='default' filepath='./Include/tupleobject.h' line='24' column='1' elf-symbol-id='PyTupleIter_Type'/> + <function-decl name='PyTuple_SetItem' mangled-name='PyTuple_SetItem' filepath='Objects/tupleobject.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_SetItem'> + <parameter type-id='type-id-4' name='op' filepath='Objects/tupleobject.c' line='113' column='1'/> + <parameter type-id='type-id-7' name='i' filepath='Objects/tupleobject.c' line='113' column='1'/> + <parameter type-id='type-id-4' name='newitem' filepath='Objects/tupleobject.c' line='113' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTuple_FromArraySteal' mangled-name='_PyTuple_FromArraySteal' filepath='Objects/tupleobject.c' line='394' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTuple_FromArraySteal'> + <parameter type-id='type-id-258' name='src' filepath='Objects/tupleobject.c' line='394' column='1'/> + <parameter type-id='type-id-7' name='n' filepath='Objects/tupleobject.c' line='394' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/typeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyEval_GetGlobals' mangled-name='PyEval_GetGlobals' filepath='./Include/ceval.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetGlobals'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_GetModule' mangled-name='PyImport_GetModule' filepath='./Include/import.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetModule'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_Import' mangled-name='PyImport_Import' filepath='./Include/import.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_Import'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_RealIsInstance' filepath='./Include/internal/pycore_abstract.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_Call_Prepend' filepath='./Include/internal/pycore_call.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_Call' filepath='./Include/internal/pycore_call.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyDict_HasOnlyStringKeys' filepath='./Include/internal/pycore_dict.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_NewKeysForClass' filepath='./Include/internal/pycore_dict.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-415'/> + </function-decl> + <function-decl name='_PyDict_KeysSize' filepath='./Include/internal/pycore_dict.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-415'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='_PyDictKeys_DecRef' filepath='./Include/internal/pycore_dict.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-415'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyDict_SetItem_LockHeld' filepath='./Include/internal/pycore_dict.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_GetItemRef_KnownHash' filepath='./Include/internal/pycore_dict.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-301'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_GetItemRef_Unicode_LockHeld' filepath='./Include/internal/pycore_dict.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_DetachFromObject' filepath='./Include/internal/pycore_dict.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_MaterializeManagedDict_LockHeld' filepath='./Include/internal/pycore_dict.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-335'/> + </function-decl> + <function-decl name='_PyMemoryView_FromBufferProc' filepath='./Include/internal/pycore_memoryobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-529'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_SetImmortalUntracked' filepath='./Include/internal/pycore_object.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_GC_Link' filepath='./Include/internal/pycore_object.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_SetAttributeErrorContext' filepath='./Include/internal/pycore_object.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_InitInlineValues' filepath='./Include/internal/pycore_object.h' line='703' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_IsInstanceDictEmpty' filepath='./Include/internal/pycore_object.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_FormatNote' filepath='./Include/internal/pycore_pyerrors.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Mangle' filepath='./Include/internal/pycore_symtable.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyStaticType_ClearWeakRefs' filepath='./Include/internal/pycore_typeobject.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='_PyBufferWrapper_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='220' column='1'/> + <function-decl name='_PyWeakref_ClearWeakRefsNoCallbacks' filepath='./Include/internal/pycore_weakref.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='PyType_Type' type-id='type-id-266' mangled-name='PyType_Type' visibility='default' filepath='./Include/object.h' line='548' column='1' elf-symbol-id='PyType_Type'/> + <var-decl name='PyBaseObject_Type' type-id='type-id-266' mangled-name='PyBaseObject_Type' visibility='default' filepath='./Include/object.h' line='549' column='1' elf-symbol-id='PyBaseObject_Type'/> + <var-decl name='PySuper_Type' type-id='type-id-266' mangled-name='PySuper_Type' visibility='default' filepath='./Include/object.h' line='550' column='1' elf-symbol-id='PySuper_Type'/> + <function-decl name='PyUnicode_IsIdentifier' mangled-name='PyUnicode_IsIdentifier' filepath='./Include/unicodeobject.h' line='1008' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_IsIdentifier'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyWeakref_NewRef' mangled-name='PyWeakref_NewRef' filepath='./Include/weakrefobject.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_NewRef'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='strrchr' filepath='/usr/include/string.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyType_GetDict' mangled-name='PyType_GetDict' filepath='Objects/typeobject.c' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetDict'> + <parameter type-id='type-id-1' name='self' filepath='Objects/typeobject.c' line='387' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_ClearCache' mangled-name='PyType_ClearCache' filepath='Objects/typeobject.c' line='861' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearCache'> + <return type-id='type-id-101'/> + </function-decl> + <function-decl name='PyType_AddWatcher' mangled-name='PyType_AddWatcher' filepath='Objects/typeobject.c' line='887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_AddWatcher'> + <parameter type-id='type-id-530' name='callback' filepath='Objects/typeobject.c' line='887' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_ClearWatcher' mangled-name='PyType_ClearWatcher' filepath='Objects/typeobject.c' line='917' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_ClearWatcher'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/typeobject.c' line='917' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_Watch' mangled-name='PyType_Watch' filepath='Objects/typeobject.c' line='930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Watch'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/typeobject.c' line='930' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Objects/typeobject.c' line='930' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_Unwatch' mangled-name='PyType_Unwatch' filepath='Objects/typeobject.c' line='950' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Unwatch'> + <parameter type-id='type-id-5' name='watcher_id' filepath='Objects/typeobject.c' line='950' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Objects/typeobject.c' line='950' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_Modified' mangled-name='PyType_Modified' filepath='Objects/typeobject.c' line='1050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_Modified'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='1050' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnstable_Type_AssignVersionTag' mangled-name='PyUnstable_Type_AssignVersionTag' filepath='Objects/typeobject.c' line='1175' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Type_AssignVersionTag'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='1175' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_GetFullyQualifiedName' mangled-name='PyType_GetFullyQualifiedName' filepath='Objects/typeobject.c' line='1395' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetFullyQualifiedName'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='1395' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetFlags' mangled-name='PyType_GetFlags' filepath='Objects/typeobject.c' line='3406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetFlags'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='3406' column='1'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='PyType_SUPPORTS_WEAKREFS' mangled-name='PyType_SUPPORTS_WEAKREFS' filepath='Objects/typeobject.c' line='3413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_SUPPORTS_WEAKREFS'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='3413' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyType_FromMetaclass' mangled-name='PyType_FromMetaclass' filepath='Objects/typeobject.c' line='4858' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromMetaclass'> + <parameter type-id='type-id-1' name='metaclass' filepath='Objects/typeobject.c' line='4858' column='1'/> + <parameter type-id='type-id-4' name='module' filepath='Objects/typeobject.c' line='4858' column='1'/> + <parameter type-id='type-id-527' name='spec' filepath='Objects/typeobject.c' line='4859' column='1'/> + <parameter type-id='type-id-4' name='bases_in' filepath='Objects/typeobject.c' line='4859' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_FromModuleAndSpec' mangled-name='PyType_FromModuleAndSpec' filepath='Objects/typeobject.c' line='4865' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromModuleAndSpec'> + <parameter type-id='type-id-4' name='module' filepath='Objects/typeobject.c' line='4865' column='1'/> + <parameter type-id='type-id-527' name='spec' filepath='Objects/typeobject.c' line='4865' column='1'/> + <parameter type-id='type-id-4' name='bases' filepath='Objects/typeobject.c' line='4865' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_FromSpec' mangled-name='PyType_FromSpec' filepath='Objects/typeobject.c' line='4877' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_FromSpec'> + <parameter type-id='type-id-527' name='spec' filepath='Objects/typeobject.c' line='4877' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetName' mangled-name='PyType_GetName' filepath='Objects/typeobject.c' line='4883' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetName'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4883' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetModuleName' mangled-name='PyType_GetModuleName' filepath='Objects/typeobject.c' line='4895' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModuleName'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4895' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetSlot' mangled-name='PyType_GetSlot' filepath='Objects/typeobject.c' line='4901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetSlot'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4901' column='1'/> + <parameter type-id='type-id-5' name='slot' filepath='Objects/typeobject.c' line='4901' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyType_GetModule' mangled-name='PyType_GetModule' filepath='Objects/typeobject.c' line='4923' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModule'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4923' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyType_GetModuleState' mangled-name='PyType_GetModuleState' filepath='Objects/typeobject.c' line='4947' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModuleState'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='4947' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyType_GetModuleByDef' mangled-name='PyType_GetModuleByDef' filepath='Objects/typeobject.c' line='5011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetModuleByDef'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='5011' column='1'/> + <parameter type-id='type-id-387' name='def' filepath='Objects/typeobject.c' line='5011' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyType_GetModuleByDef2' mangled-name='_PyType_GetModuleByDef2' filepath='Objects/typeobject.c' line='5024' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_GetModuleByDef2'> + <parameter type-id='type-id-1' name='left' filepath='Objects/typeobject.c' line='5024' column='1'/> + <parameter type-id='type-id-1' name='right' filepath='Objects/typeobject.c' line='5024' column='1'/> + <parameter type-id='type-id-387' name='def' filepath='Objects/typeobject.c' line='5025' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GetTypeData' mangled-name='PyObject_GetTypeData' filepath='Objects/typeobject.c' line='5041' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetTypeData'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/typeobject.c' line='5041' column='1'/> + <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='5041' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyType_GetTypeDataSize' mangled-name='PyType_GetTypeDataSize' filepath='Objects/typeobject.c' line='5048' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyType_GetTypeDataSize'> + <parameter type-id='type-id-1' name='cls' filepath='Objects/typeobject.c' line='5048' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyObject_GetItemData' mangled-name='PyObject_GetItemData' filepath='Objects/typeobject.c' line='5058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetItemData'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/typeobject.c' line='5058' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyType_Lookup' mangled-name='_PyType_Lookup' filepath='Objects/typeobject.c' line='5295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_Lookup'> + <parameter type-id='type-id-1' name='type' filepath='Objects/typeobject.c' line='5295' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/typeobject.c' line='5295' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyStaticType_InitForExtension' mangled-name='_PyStaticType_InitForExtension' filepath='Objects/typeobject.c' line='8314' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyStaticType_InitForExtension'> + <parameter type-id='type-id-28' name='interp' filepath='Objects/typeobject.c' line='8314' column='1'/> + <parameter type-id='type-id-1' name='self' filepath='Objects/typeobject.c' line='8314' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySuper_Lookup' mangled-name='_PySuper_Lookup' filepath='Objects/typeobject.c' line='11271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySuper_Lookup'> + <parameter type-id='type-id-1' name='su_type' filepath='Objects/typeobject.c' line='11271' column='1'/> + <parameter type-id='type-id-4' name='su_obj' filepath='Objects/typeobject.c' line='11271' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Objects/typeobject.c' line='11271' column='1'/> + <parameter type-id='type-id-177' name='method' filepath='Objects/typeobject.c' line='11271' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/typevarobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyArg_UnpackKeywordsWithVararg' mangled-name='_PyArg_UnpackKeywordsWithVararg' filepath='./Include/internal/pycore_modsupport.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_UnpackKeywordsWithVararg'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-272'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-258'/> + </function-decl> + <var-decl name='_PyTypeAlias_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='20' column='1'/> + <var-decl name='_PyNoDefault_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='21' column='1'/> + <var-decl name='_Py_NoDefaultStruct' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_typevarobject.h' line='22' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Objects/unicodectype.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyUnicode_ToTitlecase' mangled-name='_PyUnicode_ToTitlecase' filepath='Objects/unicodectype.c' line='62' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToTitlecase'> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodectype.c' line='62' column='1'/> + <return type-id='type-id-259'/> + </function-decl> + <function-decl name='_PyUnicode_ToDigit' mangled-name='_PyUnicode_ToDigit' filepath='Objects/unicodectype.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToDigit'> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodectype.c' line='121' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToUppercase' mangled-name='_PyUnicode_ToUppercase' filepath='Objects/unicodectype.c' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToUppercase'> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodectype.c' line='188' column='1'/> + <return type-id='type-id-259'/> + </function-decl> + <function-decl name='_PyUnicode_ToLowercase' mangled-name='_PyUnicode_ToLowercase' filepath='Objects/unicodectype.c' line='200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToLowercase'> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodectype.c' line='200' column='1'/> + <return type-id='type-id-259'/> + </function-decl> + <function-decl name='_PyUnicode_ToNumeric' mangled-name='_PyUnicode_ToNumeric' filepath='Objects/unicodetype_db.h' line='4294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToNumeric'> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodetype_db.h' line='4294' column='1'/> + <return type-id='type-id-172'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/unicodeobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='1024' id='type-id-531'> + <subrange length='128' type-id='type-id-2' id='type-id-532'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='infinite' id='type-id-533'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <class-decl name='PyStatus' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-61' visibility='default' filepath='./Include/cpython/initconfig.h' line='10' column='1' id='type-id-534'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_type' type-id='type-id-535' visibility='default' filepath='./Include/cpython/initconfig.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='func' type-id='type-id-6' visibility='default' filepath='./Include/cpython/initconfig.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='err_msg' type-id='type-id-6' visibility='default' filepath='./Include/cpython/initconfig.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='exitcode' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='18' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyStatus' type-id='type-id-534' filepath='./Include/cpython/initconfig.h' line='19' column='1' id='type-id-61'/> + <pointer-type-def type-id='type-id-536' size-in-bits='64' id='type-id-537'/> + <qualified-type-def type-id='type-id-259' const='yes' id='type-id-538'/> + <qualified-type-def type-id='type-id-539' const='yes' id='type-id-540'/> + <pointer-type-def type-id='type-id-540' size-in-bits='64' id='type-id-541'/> + <function-decl name='PyCodec_Encode' mangled-name='PyCodec_Encode' filepath='./Include/codecs.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Encode'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_Decode' mangled-name='PyCodec_Decode' filepath='./Include/codecs.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Decode'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_LookupError' mangled-name='PyCodec_LookupError' filepath='./Include/codecs.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_LookupError'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_StrictErrors' mangled-name='PyCodec_StrictErrors' filepath='./Include/codecs.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StrictErrors'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_IsLowercase' mangled-name='_PyUnicode_IsLowercase' filepath='./Include/cpython/unicodeobject.h' line='593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLowercase'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsUppercase' mangled-name='_PyUnicode_IsUppercase' filepath='./Include/cpython/unicodeobject.h' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsUppercase'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsTitlecase' mangled-name='_PyUnicode_IsTitlecase' filepath='./Include/cpython/unicodeobject.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsTitlecase'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsWhitespace' mangled-name='_PyUnicode_IsWhitespace' filepath='./Include/cpython/unicodeobject.h' line='605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsWhitespace'> + <parameter type-id='type-id-538'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsLinebreak' mangled-name='_PyUnicode_IsLinebreak' filepath='./Include/cpython/unicodeobject.h' line='609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsLinebreak'> + <parameter type-id='type-id-538'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToDecimalDigit' mangled-name='_PyUnicode_ToDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ToDecimalDigit'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsDecimalDigit' mangled-name='_PyUnicode_IsDecimalDigit' filepath='./Include/cpython/unicodeobject.h' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDecimalDigit'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsDigit' mangled-name='_PyUnicode_IsDigit' filepath='./Include/cpython/unicodeobject.h' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsDigit'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsNumeric' mangled-name='_PyUnicode_IsNumeric' filepath='./Include/cpython/unicodeobject.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsNumeric'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsAlpha' mangled-name='_PyUnicode_IsAlpha' filepath='./Include/cpython/unicodeobject.h' line='653' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsAlpha'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_Py_ascii_whitespace' type-id='type-id-533' mangled-name='_Py_ascii_whitespace' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='658' column='1' elf-symbol-id='_Py_ascii_whitespace'/> + <function-decl name='_PyCodec_InitRegistry' filepath='./Include/internal/pycore_codecs.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyCodec_Lookup' filepath='./Include/internal/pycore_codecs.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCodec_EncodeText' filepath='./Include/internal/pycore_codecs.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCodec_DecodeText' filepath='./Include/internal/pycore_codecs.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_DecodeLocaleEx' mangled-name='_Py_DecodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DecodeLocaleEx'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-241'/> + <parameter type-id='type-id-57'/> + <parameter type-id='type-id-261'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-542'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_EncodeLocaleEx' mangled-name='_Py_EncodeLocaleEx' filepath='./Include/internal/pycore_fileutils.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_EncodeLocaleEx'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-57'/> + <parameter type-id='type-id-261'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-542'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_hashtable_new_full' mangled-name='_Py_hashtable_new_full' filepath='./Include/internal/pycore_hashtable.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_new_full'> + <parameter type-id='type-id-543'/> + <parameter type-id='type-id-544'/> + <parameter type-id='type-id-545'/> + <parameter type-id='type-id-545'/> + <parameter type-id='type-id-537'/> + <return type-id='type-id-546'/> + </function-decl> + <function-decl name='_Py_hashtable_destroy' mangled-name='_Py_hashtable_destroy' filepath='./Include/internal/pycore_hashtable.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_destroy'> + <parameter type-id='type-id-546'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_hashtable_len' mangled-name='_Py_hashtable_len' filepath='./Include/internal/pycore_hashtable.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_len'> + <parameter type-id='type-id-541'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='_Py_hashtable_set' mangled-name='_Py_hashtable_set' filepath='./Include/internal/pycore_hashtable.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_set'> + <parameter type-id='type-id-546'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_hashtable_get' mangled-name='_Py_hashtable_get' filepath='./Include/internal/pycore_hashtable.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_get'> + <parameter type-id='type-id-546'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_Py_DumpPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='186' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_GetConfig' filepath='./Include/internal/pycore_interp.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-270'/> + </function-decl> + <function-decl name='_PyLong_FormatWriter' filepath='./Include/internal/pycore_long.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicodeTranslateError_Create' filepath='./Include/internal/pycore_pyerrors.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_SetFileSystemEncoding' filepath='./Include/internal/pycore_pylifecycle.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMem_RawWcsdup' filepath='./Include/internal/pycore_pymem.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_PyType_GetFullyQualifiedName' filepath='./Include/internal/pycore_typeobject.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-53'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_IsXidStart' filepath='./Include/internal/pycore_unicodeobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsXidContinue' filepath='./Include/internal/pycore_unicodeobject.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToLowerFull' filepath='./Include/internal/pycore_unicodeobject.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <parameter type-id='type-id-547'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToTitleFull' filepath='./Include/internal/pycore_unicodeobject.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <parameter type-id='type-id-547'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToUpperFull' filepath='./Include/internal/pycore_unicodeobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <parameter type-id='type-id-547'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ToFoldedFull' filepath='./Include/internal/pycore_unicodeobject.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <parameter type-id='type-id-547'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsCaseIgnorable' filepath='./Include/internal/pycore_unicodeobject.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_IsCased' filepath='./Include/internal/pycore_unicodeobject.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_FormatAdvancedWriter' filepath='./Include/internal/pycore_unicodeobject.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyUnicodeASCIIIter_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='278' column='1'/> + <function-decl name='PyOS_FSPath' mangled-name='PyOS_FSPath' filepath='./Include/osmodule.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_FSPath'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='PyUnicode_Type' type-id='type-id-266' mangled-name='PyUnicode_Type' visibility='default' filepath='./Include/unicodeobject.h' line='103' column='1' elf-symbol-id='PyUnicode_Type'/> + <var-decl name='PyUnicodeIter_Type' type-id='type-id-266' mangled-name='PyUnicodeIter_Type' visibility='default' filepath='./Include/unicodeobject.h' line='104' column='1' elf-symbol-id='PyUnicodeIter_Type'/> + <function-decl name='wmemchr' filepath='/usr/include/wchar.h' line='254' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-388'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='259' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_GetErrorHandler' mangled-name='_Py_GetErrorHandler' filepath='Objects/unicodeobject.c' line='511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetErrorHandler'> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='511' column='1'/> + <return type-id='type-id-542'/> + </function-decl> + <function-decl name='PyUnicode_CopyCharacters' mangled-name='PyUnicode_CopyCharacters' filepath='Objects/unicodeobject.c' line='1597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CopyCharacters'> + <parameter type-id='type-id-4' name='to' filepath='Objects/unicodeobject.c' line='1597' column='1'/> + <parameter type-id='type-id-7' name='to_start' filepath='Objects/unicodeobject.c' line='1597' column='1'/> + <parameter type-id='type-id-4' name='from' filepath='Objects/unicodeobject.c' line='1598' column='1'/> + <parameter type-id='type-id-7' name='from_start' filepath='Objects/unicodeobject.c' line='1598' column='1'/> + <parameter type-id='type-id-7' name='how_many' filepath='Objects/unicodeobject.c' line='1599' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_Resize' mangled-name='PyUnicode_Resize' filepath='Objects/unicodeobject.c' line='1858' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Resize'> + <parameter type-id='type-id-238' name='p_unicode' filepath='Objects/unicodeobject.c' line='1858' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='1858' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_FromWideChar' mangled-name='PyUnicode_FromWideChar' filepath='Objects/unicodeobject.c' line='1960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromWideChar'> + <parameter type-id='type-id-18' name='u' filepath='Objects/unicodeobject.c' line='1960' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='1960' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_FromKindAndData' mangled-name='PyUnicode_FromKindAndData' filepath='Objects/unicodeobject.c' line='2267' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromKindAndData'> + <parameter type-id='type-id-5' name='kind' filepath='Objects/unicodeobject.c' line='2267' column='1'/> + <parameter type-id='type-id-30' name='buffer' filepath='Objects/unicodeobject.c' line='2267' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='2267' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsUCS4' mangled-name='PyUnicode_AsUCS4' filepath='Objects/unicodeobject.c' line='2487' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4'> + <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='2487' column='1'/> + <parameter type-id='type-id-547' name='target' filepath='Objects/unicodeobject.c' line='2487' column='1'/> + <parameter type-id='type-id-7' name='targetsize' filepath='Objects/unicodeobject.c' line='2487' column='1'/> + <parameter type-id='type-id-5' name='copy_null' filepath='Objects/unicodeobject.c' line='2488' column='1'/> + <return type-id='type-id-547'/> + </function-decl> + <function-decl name='PyUnicode_AsUCS4Copy' mangled-name='PyUnicode_AsUCS4Copy' filepath='Objects/unicodeobject.c' line='2498' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUCS4Copy'> + <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='2498' column='1'/> + <return type-id='type-id-547'/> + </function-decl> + <function-decl name='PyUnicode_AsWideCharString' mangled-name='PyUnicode_AsWideCharString' filepath='Objects/unicodeobject.c' line='3226' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsWideCharString'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3226' column='1'/> + <parameter type-id='type-id-8' name='size' filepath='Objects/unicodeobject.c' line='3227' column='1'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='PyUnicode_FromOrdinal' mangled-name='PyUnicode_FromOrdinal' filepath='Objects/unicodeobject.c' line='3322' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromOrdinal'> + <parameter type-id='type-id-5' name='ordinal' filepath='Objects/unicodeobject.c' line='3322' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_FromObject' mangled-name='PyUnicode_FromObject' filepath='Objects/unicodeobject.c' line='3334' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromObject'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/unicodeobject.c' line='3334' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsDecodedObject' mangled-name='PyUnicode_AsDecodedObject' filepath='Objects/unicodeobject.c' line='3545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedObject'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3545' column='1'/> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/unicodeobject.c' line='3546' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3547' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsDecodedUnicode' mangled-name='PyUnicode_AsDecodedUnicode' filepath='Objects/unicodeobject.c' line='3567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsDecodedUnicode'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3567' column='1'/> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/unicodeobject.c' line='3568' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3569' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsEncodedObject' mangled-name='PyUnicode_AsEncodedObject' filepath='Objects/unicodeobject.c' line='3606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedObject'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3606' column='1'/> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/unicodeobject.c' line='3607' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3608' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_EncodeLocale' mangled-name='PyUnicode_EncodeLocale' filepath='Objects/unicodeobject.c' line='3688' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeLocale'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3688' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3688' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_EncodeFSDefault' mangled-name='PyUnicode_EncodeFSDefault' filepath='Objects/unicodeobject.c' line='3695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EncodeFSDefault'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3695' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsEncodedUnicode' mangled-name='PyUnicode_AsEncodedUnicode' filepath='Objects/unicodeobject.c' line='3829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsEncodedUnicode'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='3829' column='1'/> + <parameter type-id='type-id-6' name='encoding' filepath='Objects/unicodeobject.c' line='3830' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3831' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeLocaleAndSize' mangled-name='PyUnicode_DecodeLocaleAndSize' filepath='Objects/unicodeobject.c' line='3909' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocaleAndSize'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='3909' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='3909' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3910' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeLocale' mangled-name='PyUnicode_DecodeLocale' filepath='Objects/unicodeobject.c' line='3917' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeLocale'> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='3917' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='3917' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeFSDefaultAndSize' mangled-name='PyUnicode_DecodeFSDefaultAndSize' filepath='Objects/unicodeobject.c' line='3932' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeFSDefaultAndSize'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='3932' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='3932' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_FSConverter' mangled-name='PyUnicode_FSConverter' filepath='Objects/unicodeobject.c' line='3968' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSConverter'> + <parameter type-id='type-id-4' name='arg' filepath='Objects/unicodeobject.c' line='3968' column='1'/> + <parameter type-id='type-id-30' name='addr' filepath='Objects/unicodeobject.c' line='3968' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_FSDecoder' mangled-name='PyUnicode_FSDecoder' filepath='Objects/unicodeobject.c' line='4008' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FSDecoder'> + <parameter type-id='type-id-4' name='arg' filepath='Objects/unicodeobject.c' line='4008' column='1'/> + <parameter type-id='type-id-30' name='addr' filepath='Objects/unicodeobject.c' line='4008' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_AsUTF8NoNUL' mangled-name='_PyUnicode_AsUTF8NoNUL' filepath='Objects/unicodeobject.c' line='4087' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_AsUTF8NoNUL'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='4087' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyUnicode_GetSize' mangled-name='PyUnicode_GetSize' filepath='Objects/unicodeobject.c' line='4107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetSize'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='4107' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_GetLength' mangled-name='PyUnicode_GetLength' filepath='Objects/unicodeobject.c' line='4115' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_GetLength'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='4115' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_WriteChar' mangled-name='PyUnicode_WriteChar' filepath='Objects/unicodeobject.c' line='4144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_WriteChar'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='4144' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Objects/unicodeobject.c' line='4144' column='1'/> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodeobject.c' line='4144' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF7' mangled-name='PyUnicode_DecodeUTF7' filepath='Objects/unicodeobject.c' line='4506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='4506' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4507' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='4508' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF7Stateful' mangled-name='PyUnicode_DecodeUTF7Stateful' filepath='Objects/unicodeobject.c' line='4521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF7Stateful'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='4521' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='4522' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='4523' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='4524' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF32' mangled-name='PyUnicode_DecodeUTF32' filepath='Objects/unicodeobject.c' line='5468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='5468' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5469' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5470' column='1'/> + <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5471' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF32Stateful' mangled-name='PyUnicode_DecodeUTF32Stateful' filepath='Objects/unicodeobject.c' line='5477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF32Stateful'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='5477' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5478' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5479' column='1'/> + <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5480' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='5481' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_EncodeUTF32' mangled-name='_PyUnicode_EncodeUTF32' filepath='Objects/unicodeobject.c' line='5622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF32'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='5622' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5623' column='1'/> + <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='5624' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsUTF32String' mangled-name='PyUnicode_AsUTF32String' filepath='Objects/unicodeobject.c' line='5767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF32String'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='5767' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF16' mangled-name='PyUnicode_DecodeUTF16' filepath='Objects/unicodeobject.c' line='5775' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='5775' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5776' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5777' column='1'/> + <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5778' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF16Stateful' mangled-name='PyUnicode_DecodeUTF16Stateful' filepath='Objects/unicodeobject.c' line='5784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF16Stateful'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='5784' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='5785' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5786' column='1'/> + <parameter type-id='type-id-177' name='byteorder' filepath='Objects/unicodeobject.c' line='5787' column='1'/> + <parameter type-id='type-id-8' name='consumed' filepath='Objects/unicodeobject.c' line='5788' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_EncodeUTF16' mangled-name='_PyUnicode_EncodeUTF16' filepath='Objects/unicodeobject.c' line='5939' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_EncodeUTF16'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='5939' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='5940' column='1'/> + <parameter type-id='type-id-5' name='byteorder' filepath='Objects/unicodeobject.c' line='5941' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsUTF16String' mangled-name='PyUnicode_AsUTF16String' filepath='Objects/unicodeobject.c' line='6103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF16String'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='6103' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUnicodeEscape' mangled-name='PyUnicode_DecodeUnicodeEscape' filepath='Objects/unicodeobject.c' line='6405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUnicodeEscape'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='6405' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6406' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='6407' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsUnicodeEscapeString' mangled-name='PyUnicode_AsUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUnicodeEscapeString'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='6415' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeRawUnicodeEscape' mangled-name='PyUnicode_DecodeRawUnicodeEscape' filepath='Objects/unicodeobject.c' line='6668' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeRawUnicodeEscape'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='6668' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='6669' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='6670' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsRawUnicodeEscapeString' mangled-name='PyUnicode_AsRawUnicodeEscapeString' filepath='Objects/unicodeobject.c' line='6677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsRawUnicodeEscapeString'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='6677' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsLatin1String' mangled-name='PyUnicode_AsLatin1String' filepath='Objects/unicodeobject.c' line='7058' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsLatin1String'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='7058' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeCharmap' mangled-name='PyUnicode_DecodeCharmap' filepath='Objects/unicodeobject.c' line='8107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeCharmap'> + <parameter type-id='type-id-6' name='s' filepath='Objects/unicodeobject.c' line='8107' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='8108' column='1'/> + <parameter type-id='type-id-4' name='mapping' filepath='Objects/unicodeobject.c' line='8109' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='8110' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_BuildEncodingMap' mangled-name='PyUnicode_BuildEncodingMap' filepath='Objects/unicodeobject.c' line='8183' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_BuildEncodingMap'> + <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='8183' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsCharmapString' mangled-name='PyUnicode_AsCharmapString' filepath='Objects/unicodeobject.c' line='8664' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsCharmapString'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='8664' column='1'/> + <parameter type-id='type-id-4' name='mapping' filepath='Objects/unicodeobject.c' line='8665' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Translate' mangled-name='PyUnicode_Translate' filepath='Objects/unicodeobject.c' line='9080' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Translate'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='9080' column='1'/> + <parameter type-id='type-id-4' name='mapping' filepath='Objects/unicodeobject.c' line='9081' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Objects/unicodeobject.c' line='9082' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Count' mangled-name='PyUnicode_Count' filepath='Objects/unicodeobject.c' line='9372' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Count'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='9372' column='1'/> + <parameter type-id='type-id-4' name='substr' filepath='Objects/unicodeobject.c' line='9373' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9374' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9375' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_Find' mangled-name='PyUnicode_Find' filepath='Objects/unicodeobject.c' line='9384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Find'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='9384' column='1'/> + <parameter type-id='type-id-4' name='substr' filepath='Objects/unicodeobject.c' line='9385' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9386' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9387' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9388' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_FindChar' mangled-name='PyUnicode_FindChar' filepath='Objects/unicodeobject.c' line='9397' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FindChar'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='9397' column='1'/> + <parameter type-id='type-id-259' name='ch' filepath='Objects/unicodeobject.c' line='9397' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9398' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9398' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9399' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_Tailmatch' mangled-name='PyUnicode_Tailmatch' filepath='Objects/unicodeobject.c' line='9480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Tailmatch'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='9480' column='1'/> + <parameter type-id='type-id-4' name='substr' filepath='Objects/unicodeobject.c' line='9481' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9482' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='9483' column='1'/> + <parameter type-id='type-id-5' name='direction' filepath='Objects/unicodeobject.c' line='9484' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyUnicode_JoinArray' mangled-name='_PyUnicode_JoinArray' filepath='Objects/unicodeobject.c' line='9750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_JoinArray'> + <parameter type-id='type-id-4' name='separator' filepath='Objects/unicodeobject.c' line='9750' column='1'/> + <parameter type-id='type-id-258' name='items' filepath='Objects/unicodeobject.c' line='9750' column='1'/> + <parameter type-id='type-id-7' name='seqlen' filepath='Objects/unicodeobject.c' line='9750' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Fill' mangled-name='PyUnicode_Fill' filepath='Objects/unicodeobject.c' line='9930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Fill'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='9930' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='9930' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Objects/unicodeobject.c' line='9930' column='1'/> + <parameter type-id='type-id-259' name='fill_char' filepath='Objects/unicodeobject.c' line='9931' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_Splitlines' mangled-name='PyUnicode_Splitlines' filepath='Objects/unicodeobject.c' line='10004' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Splitlines'> + <parameter type-id='type-id-4' name='string' filepath='Objects/unicodeobject.c' line='10004' column='1'/> + <parameter type-id='type-id-5' name='keepends' filepath='Objects/unicodeobject.c' line='10004' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_EqualToUTF8' mangled-name='PyUnicode_EqualToUTF8' filepath='Objects/unicodeobject.c' line='10874' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='10874' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='10874' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_EqualToUTF8AndSize' mangled-name='PyUnicode_EqualToUTF8AndSize' filepath='Objects/unicodeobject.c' line='10880' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_EqualToUTF8AndSize'> + <parameter type-id='type-id-4' name='unicode' filepath='Objects/unicodeobject.c' line='10880' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='10880' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Objects/unicodeobject.c' line='10880' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_RichCompare' mangled-name='PyUnicode_RichCompare' filepath='Objects/unicodeobject.c' line='11009' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RichCompare'> + <parameter type-id='type-id-4' name='left' filepath='Objects/unicodeobject.c' line='11009' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Objects/unicodeobject.c' line='11009' column='1'/> + <parameter type-id='type-id-5' name='op' filepath='Objects/unicodeobject.c' line='11009' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Contains' mangled-name='PyUnicode_Contains' filepath='Objects/unicodeobject.c' line='11050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Contains'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='11050' column='1'/> + <parameter type-id='type-id-4' name='substr' filepath='Objects/unicodeobject.c' line='11050' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_Concat' mangled-name='PyUnicode_Concat' filepath='Objects/unicodeobject.c' line='11111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Concat'> + <parameter type-id='type-id-4' name='left' filepath='Objects/unicodeobject.c' line='11111' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Objects/unicodeobject.c' line='11111' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Append' mangled-name='PyUnicode_Append' filepath='Objects/unicodeobject.c' line='11160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Append'> + <parameter type-id='type-id-238' name='p_left' filepath='Objects/unicodeobject.c' line='11160' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Objects/unicodeobject.c' line='11160' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_AppendAndDel' mangled-name='PyUnicode_AppendAndDel' filepath='Objects/unicodeobject.c' line='11237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AppendAndDel'> + <parameter type-id='type-id-238' name='pleft' filepath='Objects/unicodeobject.c' line='11237' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Objects/unicodeobject.c' line='11237' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_Replace' mangled-name='PyUnicode_Replace' filepath='Objects/unicodeobject.c' line='12346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Replace'> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='12346' column='1'/> + <parameter type-id='type-id-4' name='substr' filepath='Objects/unicodeobject.c' line='12347' column='1'/> + <parameter type-id='type-id-4' name='replstr' filepath='Objects/unicodeobject.c' line='12348' column='1'/> + <parameter type-id='type-id-7' name='maxcount' filepath='Objects/unicodeobject.c' line='12349' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Split' mangled-name='PyUnicode_Split' filepath='Objects/unicodeobject.c' line='12666' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Split'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='12666' column='1'/> + <parameter type-id='type-id-4' name='sep' filepath='Objects/unicodeobject.c' line='12666' column='1'/> + <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='12666' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_Partition' mangled-name='PyUnicode_Partition' filepath='Objects/unicodeobject.c' line='12713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Partition'> + <parameter type-id='type-id-4' name='str_obj' filepath='Objects/unicodeobject.c' line='12713' column='1'/> + <parameter type-id='type-id-4' name='sep_obj' filepath='Objects/unicodeobject.c' line='12713' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_RPartition' mangled-name='PyUnicode_RPartition' filepath='Objects/unicodeobject.c' line='12765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RPartition'> + <parameter type-id='type-id-4' name='str_obj' filepath='Objects/unicodeobject.c' line='12765' column='1'/> + <parameter type-id='type-id-4' name='sep_obj' filepath='Objects/unicodeobject.c' line='12765' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_RSplit' mangled-name='PyUnicode_RSplit' filepath='Objects/unicodeobject.c' line='12859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_RSplit'> + <parameter type-id='type-id-4' name='s' filepath='Objects/unicodeobject.c' line='12859' column='1'/> + <parameter type-id='type-id-4' name='sep' filepath='Objects/unicodeobject.c' line='12859' column='1'/> + <parameter type-id='type-id-7' name='maxsplit' filepath='Objects/unicodeobject.c' line='12859' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_PrepareKindInternal' mangled-name='_PyUnicodeWriter_PrepareKindInternal' filepath='Objects/unicodeobject.c' line='13374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_PrepareKindInternal'> + <parameter type-id='type-id-330' name='writer' filepath='Objects/unicodeobject.c' line='13374' column='1'/> + <parameter type-id='type-id-5' name='kind' filepath='Objects/unicodeobject.c' line='13375' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_WriteSubstring' mangled-name='_PyUnicodeWriter_WriteSubstring' filepath='Objects/unicodeobject.c' line='13440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteSubstring'> + <parameter type-id='type-id-330' name='writer' filepath='Objects/unicodeobject.c' line='13440' column='1'/> + <parameter type-id='type-id-4' name='str' filepath='Objects/unicodeobject.c' line='13440' column='1'/> + <parameter type-id='type-id-7' name='start' filepath='Objects/unicodeobject.c' line='13441' column='1'/> + <parameter type-id='type-id-7' name='end' filepath='Objects/unicodeobject.c' line='13441' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_WriteLatin1String' mangled-name='_PyUnicodeWriter_WriteLatin1String' filepath='Objects/unicodeobject.c' line='13532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteLatin1String'> + <parameter type-id='type-id-330' name='writer' filepath='Objects/unicodeobject.c' line='13532' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Objects/unicodeobject.c' line='13533' column='1'/> + <parameter type-id='type-id-7' name='len' filepath='Objects/unicodeobject.c' line='13533' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnicode_Format' mangled-name='PyUnicode_Format' filepath='Objects/unicodeobject.c' line='14684' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Format'> + <parameter type-id='type-id-4' name='format' filepath='Objects/unicodeobject.c' line='14684' column='1'/> + <parameter type-id='type-id-4' name='args' filepath='Objects/unicodeobject.c' line='14684' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_ExactDealloc' mangled-name='_PyUnicode_ExactDealloc' filepath='Objects/unicodeobject.c' line='14938' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ExactDealloc'> + <parameter type-id='type-id-4' name='op' filepath='Objects/unicodeobject.c' line='14938' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_InternInPlace' mangled-name='_PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='15292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternInPlace'> + <parameter type-id='type-id-28' name='interp' filepath='Objects/unicodeobject.c' line='15292' column='1'/> + <parameter type-id='type-id-238' name='p' filepath='Objects/unicodeobject.c' line='15292' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_InternInPlace' mangled-name='PyUnicode_InternInPlace' filepath='Objects/unicodeobject.c' line='15299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternInPlace'> + <parameter type-id='type-id-238' name='p' filepath='Objects/unicodeobject.c' line='15299' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_InternImmortal' mangled-name='PyUnicode_InternImmortal' filepath='Objects/unicodeobject.c' line='15308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternImmortal'> + <parameter type-id='type-id-238' name='p' filepath='Objects/unicodeobject.c' line='15308' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyInit__string' mangled-name='PyInit__string' filepath='Objects/unicodeobject.c' line='15905' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__string'> + <return type-id='type-id-4'/> + </function-decl> + <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/cpython/initconfig.h' line='11' column='1' id='type-id-535'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_PyStatus_TYPE_OK' value='0'/> + <enumerator name='_PyStatus_TYPE_ERROR' value='1'/> + <enumerator name='_PyStatus_TYPE_EXIT' value='2'/> + </enum-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/unionobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyUnion_Type' type-id='type-id-266' mangled-name='_PyUnion_Type' visibility='default' filepath='./Include/internal/pycore_unionobject.h' line='12' column='1' elf-symbol-id='_PyUnion_Type'/> + <function-decl name='_Py_subs_parameters' filepath='./Include/internal/pycore_unionobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_make_parameters' filepath='./Include/internal/pycore_unionobject.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Objects/weakrefobject.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyWeakReference' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='8' column='1' id='type-id-548'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='9' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='wr_object' type-id='type-id-4' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='wr_callback' type-id='type-id-4' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='hash' type-id='type-id-301' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='wr_prev' type-id='type-id-549' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='wr_next' type-id='type-id-549' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='vectorcall' type-id='type-id-309' visibility='default' filepath='./Include/cpython/weakrefobject.h' line='32' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyWeakReference' type-id='type-id-548' filepath='./Include/weakrefobject.h' line='9' column='1' id='type-id-550'/> + <pointer-type-def type-id='type-id-550' size-in-bits='64' id='type-id-549'/> + <var-decl name='_PyWeakref_RefType' type-id='type-id-266' mangled-name='_PyWeakref_RefType' visibility='default' filepath='./Include/weakrefobject.h' line='11' column='1' elf-symbol-id='_PyWeakref_RefType'/> + <var-decl name='_PyWeakref_ProxyType' type-id='type-id-266' mangled-name='_PyWeakref_ProxyType' visibility='default' filepath='./Include/weakrefobject.h' line='12' column='1' elf-symbol-id='_PyWeakref_ProxyType'/> + <var-decl name='_PyWeakref_CallableProxyType' type-id='type-id-266' mangled-name='_PyWeakref_CallableProxyType' visibility='default' filepath='./Include/weakrefobject.h' line='13' column='1' elf-symbol-id='_PyWeakref_CallableProxyType'/> + <function-decl name='_PyWeakref_ClearRef' mangled-name='_PyWeakref_ClearRef' filepath='Objects/weakrefobject.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWeakref_ClearRef'> + <parameter type-id='type-id-549' name='self' filepath='Objects/weakrefobject.c' line='131' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyWeakref_NewProxy' mangled-name='PyWeakref_NewProxy' filepath='Objects/weakrefobject.c' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_NewProxy'> + <parameter type-id='type-id-4' name='ob' filepath='Objects/weakrefobject.c' line='921' column='1'/> + <parameter type-id='type-id-4' name='callback' filepath='Objects/weakrefobject.c' line='921' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyWeakref_GetRef' mangled-name='PyWeakref_GetRef' filepath='Objects/weakrefobject.c' line='932' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_GetRef'> + <parameter type-id='type-id-4' name='ref' filepath='Objects/weakrefobject.c' line='932' column='1'/> + <parameter type-id='type-id-238' name='pobj' filepath='Objects/weakrefobject.c' line='932' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyWeakref_GetObject' mangled-name='PyWeakref_GetObject' filepath='Objects/weakrefobject.c' line='950' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWeakref_GetObject'> + <parameter type-id='type-id-4' name='ref' filepath='Objects/weakrefobject.c' line='950' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnstable_Object_ClearWeakRefsNoCallbacks' mangled-name='PyUnstable_Object_ClearWeakRefsNoCallbacks' filepath='Objects/weakrefobject.c' line='1068' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Object_ClearWeakRefsNoCallbacks'> + <parameter type-id='type-id-4' name='obj' filepath='Objects/weakrefobject.c' line='1068' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyWeakref_IsDead' mangled-name='_PyWeakref_IsDead' filepath='Objects/weakrefobject.c' line='1109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWeakref_IsDead'> + <parameter type-id='type-id-4' name='weakref' filepath='Objects/weakrefobject.c' line='1109' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/action_helpers.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-551' size-in-bits='64' id='type-id-552'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-553' size-in-bits='64' id='type-id-554'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-555' size-in-bits='64' id='type-id-556'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-557' size-in-bits='64' id='type-id-558'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-559' size-in-bits='64' id='type-id-560'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-561' size-in-bits='64' id='type-id-562'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-563' size-in-bits='64' id='type-id-564'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-30' size-in-bits='64' id='type-id-565'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-566' size-in-bits='64' id='type-id-567'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <class-decl name='_PyUnicodeWriter' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-568' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='449' column='1' id='type-id-569'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buffer' type-id='type-id-4' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='450' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='data' type-id='type-id-30' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='451' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='kind' type-id='type-id-5' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='452' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='maxchar' type-id='type-id-259' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='453' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='454' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pos' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='455' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='min_length' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='458' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='min_char' type-id='type-id-259' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='461' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='overallocate' type-id='type-id-91' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='464' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='424'> + <var-decl name='readonly' type-id='type-id-91' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='468' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyUnicodeWriter' type-id='type-id-569' filepath='./Include/cpython/unicodeobject.h' line='469' column='1' id='type-id-568'/> + <class-decl name='asdl_generic_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-570' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='32' column='1' id='type-id-571'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-565' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='34' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_generic_seq' type-id='type-id-571' filepath='./Include/internal/pycore_asdl.h' line='35' column='1' id='type-id-570'/> + <class-decl name='asdl_identifier_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-572' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='37' column='1' id='type-id-573'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-359' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='39' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_identifier_seq' type-id='type-id-573' filepath='./Include/internal/pycore_asdl.h' line='40' column='1' id='type-id-572'/> + <typedef-decl name='mod_ty' type-id='type-id-574' filepath='./Include/internal/pycore_ast.h' line='15' column='1' id='type-id-575'/> + <typedef-decl name='stmt_ty' type-id='type-id-576' filepath='./Include/internal/pycore_ast.h' line='17' column='1' id='type-id-559'/> + <typedef-decl name='excepthandler_ty' type-id='type-id-577' filepath='./Include/internal/pycore_ast.h' line='36' column='1' id='type-id-553'/> + <typedef-decl name='alias_ty' type-id='type-id-578' filepath='./Include/internal/pycore_ast.h' line='44' column='1' id='type-id-551'/> + <typedef-decl name='withitem_ty' type-id='type-id-579' filepath='./Include/internal/pycore_ast.h' line='46' column='1' id='type-id-566'/> + <typedef-decl name='match_case_ty' type-id='type-id-580' filepath='./Include/internal/pycore_ast.h' line='48' column='1' id='type-id-555'/> + <typedef-decl name='pattern_ty' type-id='type-id-581' filepath='./Include/internal/pycore_ast.h' line='50' column='1' id='type-id-557'/> + <typedef-decl name='type_ignore_ty' type-id='type-id-582' filepath='./Include/internal/pycore_ast.h' line='52' column='1' id='type-id-561'/> + <typedef-decl name='type_param_ty' type-id='type-id-583' filepath='./Include/internal/pycore_ast.h' line='54' column='1' id='type-id-563'/> + <class-decl name='asdl_stmt_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-584' visibility='default' filepath='./Include/internal/pycore_ast.h' line='64' column='1' id='type-id-585'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-560' visibility='default' filepath='./Include/internal/pycore_ast.h' line='66' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_stmt_seq' type-id='type-id-585' filepath='./Include/internal/pycore_ast.h' line='67' column='1' id='type-id-584'/> + <class-decl name='asdl_excepthandler_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-586' visibility='default' filepath='./Include/internal/pycore_ast.h' line='86' column='1' id='type-id-587'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-554' visibility='default' filepath='./Include/internal/pycore_ast.h' line='88' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_excepthandler_seq' type-id='type-id-587' filepath='./Include/internal/pycore_ast.h' line='89' column='1' id='type-id-586'/> + <class-decl name='asdl_alias_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-588' visibility='default' filepath='./Include/internal/pycore_ast.h' line='115' column='1' id='type-id-589'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-552' visibility='default' filepath='./Include/internal/pycore_ast.h' line='117' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_alias_seq' type-id='type-id-589' filepath='./Include/internal/pycore_ast.h' line='118' column='1' id='type-id-588'/> + <class-decl name='asdl_withitem_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-590' visibility='default' filepath='./Include/internal/pycore_ast.h' line='122' column='1' id='type-id-591'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-567' visibility='default' filepath='./Include/internal/pycore_ast.h' line='124' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_withitem_seq' type-id='type-id-591' filepath='./Include/internal/pycore_ast.h' line='125' column='1' id='type-id-590'/> + <class-decl name='asdl_match_case_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-592' visibility='default' filepath='./Include/internal/pycore_ast.h' line='129' column='1' id='type-id-593'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-556' visibility='default' filepath='./Include/internal/pycore_ast.h' line='131' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_match_case_seq' type-id='type-id-593' filepath='./Include/internal/pycore_ast.h' line='132' column='1' id='type-id-592'/> + <class-decl name='asdl_pattern_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-594' visibility='default' filepath='./Include/internal/pycore_ast.h' line='137' column='1' id='type-id-595'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-558' visibility='default' filepath='./Include/internal/pycore_ast.h' line='139' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_pattern_seq' type-id='type-id-595' filepath='./Include/internal/pycore_ast.h' line='140' column='1' id='type-id-594'/> + <class-decl name='asdl_type_ignore_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-596' visibility='default' filepath='./Include/internal/pycore_ast.h' line='144' column='1' id='type-id-597'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-562' visibility='default' filepath='./Include/internal/pycore_ast.h' line='146' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_type_ignore_seq' type-id='type-id-597' filepath='./Include/internal/pycore_ast.h' line='147' column='1' id='type-id-596'/> + <class-decl name='asdl_type_param_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-598' visibility='default' filepath='./Include/internal/pycore_ast.h' line='152' column='1' id='type-id-599'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-564' visibility='default' filepath='./Include/internal/pycore_ast.h' line='154' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_type_param_seq' type-id='type-id-599' filepath='./Include/internal/pycore_ast.h' line='155' column='1' id='type-id-598'/> + <enum-decl name='_mod_kind' filepath='./Include/internal/pycore_ast.h' line='161' column='1' id='type-id-600'> + <underlying-type type-id='type-id-32'/> + <enumerator name='Module_kind' value='1'/> + <enumerator name='Interactive_kind' value='2'/> + <enumerator name='Expression_kind' value='3'/> + <enumerator name='FunctionType_kind' value='4'/> + </enum-decl> + <class-decl name='_mod' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='163' column='1' id='type-id-601'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-600' visibility='default' filepath='./Include/internal/pycore_ast.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-602' visibility='default' filepath='./Include/internal/pycore_ast.h' line='184' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='165' column='1' id='type-id-602'> + <data-member access='public'> + <var-decl name='Module' type-id='type-id-603' visibility='default' filepath='./Include/internal/pycore_ast.h' line='169' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Interactive' type-id='type-id-604' visibility='default' filepath='./Include/internal/pycore_ast.h' line='173' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Expression' type-id='type-id-605' visibility='default' filepath='./Include/internal/pycore_ast.h' line='177' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='FunctionType' type-id='type-id-606' visibility='default' filepath='./Include/internal/pycore_ast.h' line='182' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='166' column='1' id='type-id-603'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='167' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='type_ignores' type-id='type-id-608' visibility='default' filepath='./Include/internal/pycore_ast.h' line='168' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__39' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='171' column='1' id='type-id-604'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='172' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__40' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='175' column='1' id='type-id-605'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='body' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='176' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__41' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='179' column='1' id='type-id-606'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='argtypes' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='returns' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='181' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_stmt_kind' filepath='./Include/internal/pycore_ast.h' line='187' column='1' id='type-id-611'> + <underlying-type type-id='type-id-32'/> + <enumerator name='FunctionDef_kind' value='1'/> + <enumerator name='AsyncFunctionDef_kind' value='2'/> + <enumerator name='ClassDef_kind' value='3'/> + <enumerator name='Return_kind' value='4'/> + <enumerator name='Delete_kind' value='5'/> + <enumerator name='Assign_kind' value='6'/> + <enumerator name='TypeAlias_kind' value='7'/> + <enumerator name='AugAssign_kind' value='8'/> + <enumerator name='AnnAssign_kind' value='9'/> + <enumerator name='For_kind' value='10'/> + <enumerator name='AsyncFor_kind' value='11'/> + <enumerator name='While_kind' value='12'/> + <enumerator name='If_kind' value='13'/> + <enumerator name='With_kind' value='14'/> + <enumerator name='AsyncWith_kind' value='15'/> + <enumerator name='Match_kind' value='16'/> + <enumerator name='Raise_kind' value='17'/> + <enumerator name='Try_kind' value='18'/> + <enumerator name='TryStar_kind' value='19'/> + <enumerator name='Assert_kind' value='20'/> + <enumerator name='Import_kind' value='21'/> + <enumerator name='ImportFrom_kind' value='22'/> + <enumerator name='Global_kind' value='23'/> + <enumerator name='Nonlocal_kind' value='24'/> + <enumerator name='Expr_kind' value='25'/> + <enumerator name='Pass_kind' value='26'/> + <enumerator name='Break_kind' value='27'/> + <enumerator name='Continue_kind' value='28'/> + </enum-decl> + <class-decl name='_stmt' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='196' column='1' id='type-id-612'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-611' visibility='default' filepath='./Include/internal/pycore_ast.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-613' visibility='default' filepath='./Include/internal/pycore_ast.h' line='352' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='353' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='544'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='354' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='355' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='608'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='356' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__1' size-in-bits='448' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='198' column='1' id='type-id-613'> + <data-member access='public'> + <var-decl name='FunctionDef' type-id='type-id-614' visibility='default' filepath='./Include/internal/pycore_ast.h' line='207' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='AsyncFunctionDef' type-id='type-id-614' visibility='default' filepath='./Include/internal/pycore_ast.h' line='217' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='ClassDef' type-id='type-id-615' visibility='default' filepath='./Include/internal/pycore_ast.h' line='226' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Return' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='230' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Delete' type-id='type-id-617' visibility='default' filepath='./Include/internal/pycore_ast.h' line='234' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Assign' type-id='type-id-618' visibility='default' filepath='./Include/internal/pycore_ast.h' line='240' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='TypeAlias' type-id='type-id-619' visibility='default' filepath='./Include/internal/pycore_ast.h' line='246' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='AugAssign' type-id='type-id-620' visibility='default' filepath='./Include/internal/pycore_ast.h' line='252' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='AnnAssign' type-id='type-id-621' visibility='default' filepath='./Include/internal/pycore_ast.h' line='259' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='For' type-id='type-id-622' visibility='default' filepath='./Include/internal/pycore_ast.h' line='267' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='AsyncFor' type-id='type-id-622' visibility='default' filepath='./Include/internal/pycore_ast.h' line='275' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='While' type-id='type-id-623' visibility='default' filepath='./Include/internal/pycore_ast.h' line='281' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='If' type-id='type-id-623' visibility='default' filepath='./Include/internal/pycore_ast.h' line='287' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='With' type-id='type-id-624' visibility='default' filepath='./Include/internal/pycore_ast.h' line='293' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='AsyncWith' type-id='type-id-624' visibility='default' filepath='./Include/internal/pycore_ast.h' line='299' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Match' type-id='type-id-625' visibility='default' filepath='./Include/internal/pycore_ast.h' line='304' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Raise' type-id='type-id-626' visibility='default' filepath='./Include/internal/pycore_ast.h' line='309' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Try' type-id='type-id-627' visibility='default' filepath='./Include/internal/pycore_ast.h' line='316' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='TryStar' type-id='type-id-627' visibility='default' filepath='./Include/internal/pycore_ast.h' line='323' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Assert' type-id='type-id-628' visibility='default' filepath='./Include/internal/pycore_ast.h' line='328' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Import' type-id='type-id-629' visibility='default' filepath='./Include/internal/pycore_ast.h' line='332' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='ImportFrom' type-id='type-id-630' visibility='default' filepath='./Include/internal/pycore_ast.h' line='338' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Global' type-id='type-id-631' visibility='default' filepath='./Include/internal/pycore_ast.h' line='342' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Nonlocal' type-id='type-id-631' visibility='default' filepath='./Include/internal/pycore_ast.h' line='346' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Expr' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='350' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__2' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='199' column='1' id='type-id-614'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='args' type-id='type-id-633' visibility='default' filepath='./Include/internal/pycore_ast.h' line='201' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='202' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='decorator_list' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='returns' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='type_comment' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='205' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='type_params' type-id='type-id-635' visibility='default' filepath='./Include/internal/pycore_ast.h' line='206' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__6' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='219' column='1' id='type-id-615'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='220' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='bases' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='221' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='keywords' type-id='type-id-636' visibility='default' filepath='./Include/internal/pycore_ast.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='223' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='decorator_list' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='224' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='type_params' type-id='type-id-635' visibility='default' filepath='./Include/internal/pycore_ast.h' line='225' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__8' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='232' column='1' id='type-id-617'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='targets' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='233' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__9' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='236' column='1' id='type-id-618'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='targets' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='237' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='238' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='type_comment' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='239' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__10' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='242' column='1' id='type-id-619'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='243' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='type_params' type-id='type-id-635' visibility='default' filepath='./Include/internal/pycore_ast.h' line='244' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='245' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__11' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='248' column='1' id='type-id-620'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='249' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='op' type-id='type-id-637' visibility='default' filepath='./Include/internal/pycore_ast.h' line='250' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='251' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__12' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='254' column='1' id='type-id-621'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='255' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='annotation' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='simple' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='258' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__13' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='261' column='1' id='type-id-622'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='262' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='iter' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='263' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='264' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='orelse' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='265' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='type_comment' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='266' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__15' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='277' column='1' id='type-id-623'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='test' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='278' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='279' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='orelse' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='280' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__17' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='289' column='1' id='type-id-624'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-638' visibility='default' filepath='./Include/internal/pycore_ast.h' line='290' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='291' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='type_comment' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='292' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__19' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='301' column='1' id='type-id-625'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='subject' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='302' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='cases' type-id='type-id-639' visibility='default' filepath='./Include/internal/pycore_ast.h' line='303' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__28' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='306' column='1' id='type-id-626'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='exc' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='307' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='cause' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='308' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__29' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='311' column='1' id='type-id-627'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='312' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='handlers' type-id='type-id-640' visibility='default' filepath='./Include/internal/pycore_ast.h' line='313' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='orelse' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='314' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='finalbody' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='315' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__32' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='325' column='1' id='type-id-628'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='test' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='326' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='msg' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='327' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__33' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='330' column='1' id='type-id-629'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='names' type-id='type-id-641' visibility='default' filepath='./Include/internal/pycore_ast.h' line='331' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__34' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='334' column='1' id='type-id-630'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='module' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='335' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='names' type-id='type-id-641' visibility='default' filepath='./Include/internal/pycore_ast.h' line='336' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='337' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__35' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='340' column='1' id='type-id-631'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='names' type-id='type-id-642' visibility='default' filepath='./Include/internal/pycore_ast.h' line='341' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_excepthandler_kind' filepath='./Include/internal/pycore_ast.h' line='523' column='1' id='type-id-643'> + <underlying-type type-id='type-id-32'/> + <enumerator name='ExceptHandler_kind' value='1'/> + </enum-decl> + <class-decl name='_excepthandler' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='524' column='1' id='type-id-644'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-643' visibility='default' filepath='./Include/internal/pycore_ast.h' line='525' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-645' visibility='default' filepath='./Include/internal/pycore_ast.h' line='533' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='534' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='535' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='536' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='537' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='526' column='1' id='type-id-645'> + <data-member access='public'> + <var-decl name='ExceptHandler' type-id='type-id-646' visibility='default' filepath='./Include/internal/pycore_ast.h' line='531' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__31' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='527' column='1' id='type-id-646'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='528' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='529' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='530' column='1'/> + </data-member> + </class-decl> + <class-decl name='_alias' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='569' column='1' id='type-id-647'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='570' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='asname' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='571' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='572' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='573' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='574' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='575' column='1'/> + </data-member> + </class-decl> + <class-decl name='_withitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='578' column='1' id='type-id-648'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='context_expr' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='579' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='optional_vars' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='580' column='1'/> + </data-member> + </class-decl> + <class-decl name='_match_case' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='583' column='1' id='type-id-649'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pattern' type-id='type-id-557' visibility='default' filepath='./Include/internal/pycore_ast.h' line='584' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='guard' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='585' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='body' type-id='type-id-607' visibility='default' filepath='./Include/internal/pycore_ast.h' line='586' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_pattern_kind' filepath='./Include/internal/pycore_ast.h' line='589' column='1' id='type-id-650'> + <underlying-type type-id='type-id-32'/> + <enumerator name='MatchValue_kind' value='1'/> + <enumerator name='MatchSingleton_kind' value='2'/> + <enumerator name='MatchSequence_kind' value='3'/> + <enumerator name='MatchMapping_kind' value='4'/> + <enumerator name='MatchClass_kind' value='5'/> + <enumerator name='MatchStar_kind' value='6'/> + <enumerator name='MatchAs_kind' value='7'/> + <enumerator name='MatchOr_kind' value='8'/> + </enum-decl> + <class-decl name='_pattern' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='593' column='1' id='type-id-651'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-650' visibility='default' filepath='./Include/internal/pycore_ast.h' line='594' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-652' visibility='default' filepath='./Include/internal/pycore_ast.h' line='634' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='635' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='636' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='637' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='638' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__3' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='595' column='1' id='type-id-652'> + <data-member access='public'> + <var-decl name='MatchValue' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='598' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchSingleton' type-id='type-id-653' visibility='default' filepath='./Include/internal/pycore_ast.h' line='602' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchSequence' type-id='type-id-654' visibility='default' filepath='./Include/internal/pycore_ast.h' line='606' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchMapping' type-id='type-id-655' visibility='default' filepath='./Include/internal/pycore_ast.h' line='612' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchClass' type-id='type-id-656' visibility='default' filepath='./Include/internal/pycore_ast.h' line='619' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchStar' type-id='type-id-657' visibility='default' filepath='./Include/internal/pycore_ast.h' line='623' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchAs' type-id='type-id-658' visibility='default' filepath='./Include/internal/pycore_ast.h' line='628' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='MatchOr' type-id='type-id-654' visibility='default' filepath='./Include/internal/pycore_ast.h' line='632' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__22' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='600' column='1' id='type-id-653'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-659' visibility='default' filepath='./Include/internal/pycore_ast.h' line='601' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__23' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='604' column='1' id='type-id-654'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='patterns' type-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='605' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__24' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='608' column='1' id='type-id-655'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='keys' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='609' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='patterns' type-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='610' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='rest' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='611' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__25' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='614' column='1' id='type-id-656'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cls' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='615' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='patterns' type-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='616' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='kwd_attrs' type-id='type-id-642' visibility='default' filepath='./Include/internal/pycore_ast.h' line='617' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='kwd_patterns' type-id='type-id-660' visibility='default' filepath='./Include/internal/pycore_ast.h' line='618' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__26' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='621' column='1' id='type-id-657'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='622' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__27' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='625' column='1' id='type-id-658'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pattern' type-id='type-id-557' visibility='default' filepath='./Include/internal/pycore_ast.h' line='626' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='627' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_type_ignore_kind' filepath='./Include/internal/pycore_ast.h' line='641' column='1' id='type-id-661'> + <underlying-type type-id='type-id-32'/> + <enumerator name='TypeIgnore_kind' value='1'/> + </enum-decl> + <class-decl name='_type_ignore' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='642' column='1' id='type-id-662'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-661' visibility='default' filepath='./Include/internal/pycore_ast.h' line='643' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-663' visibility='default' filepath='./Include/internal/pycore_ast.h' line='650' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='644' column='1' id='type-id-663'> + <data-member access='public'> + <var-decl name='TypeIgnore' type-id='type-id-664' visibility='default' filepath='./Include/internal/pycore_ast.h' line='648' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__39' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='645' column='1' id='type-id-664'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='646' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tag' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='647' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_type_param_kind' filepath='./Include/internal/pycore_ast.h' line='653' column='1' id='type-id-665'> + <underlying-type type-id='type-id-32'/> + <enumerator name='TypeVar_kind' value='1'/> + <enumerator name='ParamSpec_kind' value='2'/> + <enumerator name='TypeVarTuple_kind' value='3'/> + </enum-decl> + <class-decl name='_type_param' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='654' column='1' id='type-id-666'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-665' visibility='default' filepath='./Include/internal/pycore_ast.h' line='655' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-667' visibility='default' filepath='./Include/internal/pycore_ast.h' line='673' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='674' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='675' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='676' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='677' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__2' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='656' column='1' id='type-id-667'> + <data-member access='public'> + <var-decl name='TypeVar' type-id='type-id-668' visibility='default' filepath='./Include/internal/pycore_ast.h' line='661' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='ParamSpec' type-id='type-id-669' visibility='default' filepath='./Include/internal/pycore_ast.h' line='666' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='TypeVarTuple' type-id='type-id-669' visibility='default' filepath='./Include/internal/pycore_ast.h' line='671' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='657' column='1' id='type-id-668'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='658' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='bound' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='659' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='default_value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='660' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='663' column='1' id='type-id-669'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='664' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='default_value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='665' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-568' size-in-bits='64' id='type-id-330'/> + <pointer-type-def type-id='type-id-647' size-in-bits='64' id='type-id-578'/> + <pointer-type-def type-id='type-id-644' size-in-bits='64' id='type-id-577'/> + <pointer-type-def type-id='type-id-649' size-in-bits='64' id='type-id-580'/> + <pointer-type-def type-id='type-id-601' size-in-bits='64' id='type-id-574'/> + <pointer-type-def type-id='type-id-651' size-in-bits='64' id='type-id-581'/> + <pointer-type-def type-id='type-id-612' size-in-bits='64' id='type-id-576'/> + <pointer-type-def type-id='type-id-662' size-in-bits='64' id='type-id-582'/> + <pointer-type-def type-id='type-id-666' size-in-bits='64' id='type-id-583'/> + <pointer-type-def type-id='type-id-648' size-in-bits='64' id='type-id-579'/> + <pointer-type-def type-id='type-id-588' size-in-bits='64' id='type-id-641'/> + <pointer-type-def type-id='type-id-586' size-in-bits='64' id='type-id-640'/> + <pointer-type-def type-id='type-id-570' size-in-bits='64' id='type-id-670'/> + <pointer-type-def type-id='type-id-572' size-in-bits='64' id='type-id-642'/> + <pointer-type-def type-id='type-id-592' size-in-bits='64' id='type-id-639'/> + <pointer-type-def type-id='type-id-594' size-in-bits='64' id='type-id-660'/> + <pointer-type-def type-id='type-id-584' size-in-bits='64' id='type-id-607'/> + <pointer-type-def type-id='type-id-596' size-in-bits='64' id='type-id-608'/> + <pointer-type-def type-id='type-id-598' size-in-bits='64' id='type-id-635'/> + <pointer-type-def type-id='type-id-590' size-in-bits='64' id='type-id-638'/> + <class-decl name='tok_state' size-in-bits='138176' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='65' column='1' id='type-id-671'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buf' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='cur' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='inp' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='fp_interactive' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='interactive_src_start' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='interactive_src_end' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='end' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='done' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='fp' type-id='type-id-56' visibility='default' filepath='Parser/lexer/state.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='tabsize' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='672'> + <var-decl name='indent' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='indstack' type-id='type-id-672' visibility='default' filepath='Parser/lexer/state.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3904'> + <var-decl name='atbol' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3936'> + <var-decl name='pendin' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3968'> + <var-decl name='prompt' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4032'> + <var-decl name='nextprompt' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4128'> + <var-decl name='first_lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4160'> + <var-decl name='starting_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4192'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4224'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4256'> + <var-decl name='parenstack' type-id='type-id-673' visibility='default' filepath='Parser/lexer/state.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5856'> + <var-decl name='parenlinenostack' type-id='type-id-674' visibility='default' filepath='Parser/lexer/state.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12256'> + <var-decl name='parencolstack' type-id='type-id-674' visibility='default' filepath='Parser/lexer/state.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18688'> + <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18752'> + <var-decl name='altindstack' type-id='type-id-672' visibility='default' filepath='Parser/lexer/state.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21952'> + <var-decl name='decoding_state' type-id='type-id-675' visibility='default' filepath='Parser/lexer/state.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21984'> + <var-decl name='decoding_erred' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22016'> + <var-decl name='encoding' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22080'> + <var-decl name='cont_line' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22144'> + <var-decl name='line_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22208'> + <var-decl name='multi_line_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22272'> + <var-decl name='decoding_readline' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22336'> + <var-decl name='decoding_buffer' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22400'> + <var-decl name='readline' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22464'> + <var-decl name='enc' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22528'> + <var-decl name='str' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22592'> + <var-decl name='input' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22656'> + <var-decl name='type_comments' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22688'> + <var-decl name='interactive_underflow' type-id='type-id-676' visibility='default' filepath='Parser/lexer/state.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22720'> + <var-decl name='underflow' type-id='type-id-677' visibility='default' filepath='Parser/lexer/state.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22784'> + <var-decl name='report_warnings' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22848'> + <var-decl name='tok_mode_stack' type-id='type-id-678' visibility='default' filepath='Parser/lexer/state.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138048'> + <var-decl name='tok_mode_stack_index' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138080'> + <var-decl name='tok_extra_tokens' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138112'> + <var-decl name='comment_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138144'> + <var-decl name='implicit_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='126' column='1'/> + </data-member> + </class-decl> + <function-decl name='PyBytes_FromString' mangled-name='PyBytes_FromString' filepath='./Include/bytesobject.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromString'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_Concat' mangled-name='PyBytes_Concat' filepath='./Include/bytesobject.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_Concat'> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_Init' mangled-name='_PyUnicodeWriter_Init' filepath='./Include/cpython/unicodeobject.h' line='477' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Init'> + <parameter type-id='type-id-330'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_WriteStr' mangled-name='_PyUnicodeWriter_WriteStr' filepath='./Include/cpython/unicodeobject.h' line='523' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_WriteStr'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_Finish' mangled-name='_PyUnicodeWriter_Finish' filepath='./Include/cpython/unicodeobject.h' line='556' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Finish'> + <parameter type-id='type-id-330'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicodeWriter_Dealloc' mangled-name='_PyUnicodeWriter_Dealloc' filepath='./Include/cpython/unicodeobject.h' line='560' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicodeWriter_Dealloc'> + <parameter type-id='type-id-330'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_asdl_generic_seq_new' filepath='./Include/internal/pycore_asdl.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-670'/> + </function-decl> + <function-decl name='_Py_asdl_identifier_seq_new' filepath='./Include/internal/pycore_asdl.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-642'/> + </function-decl> + <function-decl name='_Py_asdl_int_seq_new' filepath='./Include/internal/pycore_asdl.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-680'/> + </function-decl> + <function-decl name='_Py_asdl_expr_seq_new' filepath='./Include/internal/pycore_ast.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_Py_asdl_arg_seq_new' filepath='./Include/internal/pycore_ast.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-681'/> + </function-decl> + <function-decl name='_Py_asdl_keyword_seq_new' filepath='./Include/internal/pycore_ast.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-636'/> + </function-decl> + <function-decl name='_Py_asdl_pattern_seq_new' filepath='./Include/internal/pycore_ast.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-660'/> + </function-decl> + <function-decl name='_Py_asdl_type_ignore_seq_new' filepath='./Include/internal/pycore_ast.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-608'/> + </function-decl> + <function-decl name='_PyAST_Module' filepath='./Include/internal/pycore_ast.h' line='682' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-608'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyAST_FunctionDef' filepath='./Include/internal/pycore_ast.h' line='688' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-633'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-635'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_AsyncFunctionDef' filepath='./Include/internal/pycore_ast.h' line='693' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-633'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-635'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_ClassDef' filepath='./Include/internal/pycore_ast.h' line='699' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-636'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-635'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Call' filepath='./Include/internal/pycore_ast.h' line='817' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-636'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_FormattedValue' filepath='./Include/internal/pycore_ast.h' line='820' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_JoinedStr' filepath='./Include/internal/pycore_ast.h' line='823' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Attribute' filepath='./Include/internal/pycore_ast.h' line='828' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Subscript' filepath='./Include/internal/pycore_ast.h' line='831' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Starred' filepath='./Include/internal/pycore_ast.h' line='834' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_List' filepath='./Include/internal/pycore_ast.h' line='840' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Tuple' filepath='./Include/internal/pycore_ast.h' line='843' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_arguments' filepath='./Include/internal/pycore_ast.h' line='856' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-633'/> + </function-decl> + <function-decl name='_PyAST_arg' filepath='./Include/internal/pycore_ast.h' line='860' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-683'/> + </function-decl> + <function-decl name='_PyAST_alias' filepath='./Include/internal/pycore_ast.h' line='866' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-551'/> + </function-decl> + <function-decl name='_PyAST_TypeIgnore' filepath='./Include/internal/pycore_ast.h' line='897' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-561'/> + </function-decl> + <function-decl name='PyUnicode_FromFormat' mangled-name='PyUnicode_FromFormat' filepath='./Include/unicodeobject.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromFormat'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='strpbrk' filepath='/usr/include/string.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyPegen_new_identifier' filepath='Parser/pegen.h' line='296' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyPegen_parse_string' filepath='Parser/string_parser.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyPegen_decode_string' filepath='Parser/string_parser.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-4'/> + </function-decl> + <pointer-type-def type-id='type-id-686' size-in-bits='64' id='type-id-684'/> + <class-decl name='__anonymous_struct__7' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='228' column='1' id='type-id-616'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='229' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Parser' type-id='type-id-687' filepath='Parser/pegen.h' line='81' column='1' id='type-id-686'/> + <class-decl name='Parser' size-in-bits='1280' is-struct='yes' naming-typedef-id='type-id-686' visibility='default' filepath='Parser/pegen.h' line='58' column='1' id='type-id-687'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tok' type-id='type-id-688' visibility='default' filepath='Parser/pegen.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tokens' type-id='type-id-689' visibility='default' filepath='Parser/pegen.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mark' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='fill' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='size' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='arena' type-id='type-id-679' visibility='default' filepath='Parser/pegen.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='keywords' type-id='type-id-690' visibility='default' filepath='Parser/pegen.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='soft_keywords' type-id='type-id-248' visibility='default' filepath='Parser/pegen.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='n_keyword_lists' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='start_rule' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='errcode' type-id='type-id-177' visibility='default' filepath='Parser/pegen.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='parsing_started' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='normalize' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='starting_lineno' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='starting_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='error_indicator' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='800'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='feature_version' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='type_ignore_comments' type-id='type-id-691' visibility='default' filepath='Parser/pegen.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='known_err_token' type-id='type-id-685' visibility='default' filepath='Parser/pegen.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1184'> + <var-decl name='call_invalid_rules' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='debug' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='80' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-671' size-in-bits='64' id='type-id-688'/> + </abi-instr> + <abi-instr address-size='64' path='Parser/lexer/lexer.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_FatalErrorFunc' mangled-name='_Py_FatalErrorFunc' filepath='./Include/cpython/pyerrors.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalErrorFunc'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_IsPrintable' mangled-name='_PyUnicode_IsPrintable' filepath='./Include/cpython/unicodeobject.h' line='649' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_IsPrintable'> + <parameter type-id='type-id-259'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_ScanIdentifier' mangled-name='_PyUnicode_ScanIdentifier' filepath='./Include/internal/pycore_unicodeobject.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_ScanIdentifier'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnicode_Substring' mangled-name='PyUnicode_Substring' filepath='./Include/unicodeobject.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Substring'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_AsUTF8String' mangled-name='PyUnicode_AsUTF8String' filepath='./Include/unicodeobject.h' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8String'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='memcmp' filepath='/usr/include/string.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='memchr' filepath='/usr/include/string.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyTokenizer_syntaxerror' filepath='Parser/lexer/../tokenizer/helpers.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_syntaxerror_known_range' filepath='Parser/lexer/../tokenizer/helpers.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_indenterror' filepath='Parser/lexer/../tokenizer/helpers.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_warn_invalid_escape_sequence' filepath='Parser/lexer/../tokenizer/helpers.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_parser_warn' filepath='Parser/lexer/../tokenizer/helpers.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLexer_type_comment_token_setup' filepath='Parser/lexer/state.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-692'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLexer_token_setup' filepath='Parser/lexer/state.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-692'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/myreadline.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-56' restrict='yes' id='type-id-402'/> + <pointer-type-def type-id='type-id-693' size-in-bits='64' id='type-id-26'/> + <pointer-type-def type-id='type-id-694' size-in-bits='64' id='type-id-695'/> + <qualified-type-def type-id='type-id-17' restrict='yes' id='type-id-181'/> + <pointer-type-def type-id='type-id-696' size-in-bits='64' id='type-id-697'/> + <function-decl name='PyEval_SaveThread' mangled-name='PyEval_SaveThread' filepath='./Include/ceval.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SaveThread'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyEval_RestoreThread' mangled-name='PyEval_RestoreThread' filepath='./Include/ceval.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_RestoreThread'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMutex_Lock' mangled-name='PyMutex_Lock' filepath='./Include/cpython/lock.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMutex_Lock'> + <parameter type-id='type-id-26'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMutex_Unlock' mangled-name='PyMutex_Unlock' filepath='./Include/cpython/lock.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMutex_Unlock'> + <parameter type-id='type-id-26'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='PyOS_ReadlineFunctionPointer' type-id='type-id-695' mangled-name='PyOS_ReadlineFunctionPointer' visibility='default' filepath='./Include/cpython/pythonrun.h' line='96' column='1' elf-symbol-id='PyOS_ReadlineFunctionPointer'/> + <function-decl name='_PyOS_InterruptOccurred' filepath='./Include/internal/pycore_pystate.h' line='261' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_CheckSignals' mangled-name='PyErr_CheckSignals' filepath='./Include/pyerrors.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_CheckSignals'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMem_RawRealloc' mangled-name='PyMem_RawRealloc' filepath='./Include/pymem.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawRealloc'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyMem_RawFree' mangled-name='PyMem_RawFree' filepath='./Include/pymem.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_RawFree'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='PyOS_InputHook' type-id='type-id-697' mangled-name='PyOS_InputHook' visibility='default' filepath='./Include/pythonrun.h' line='22' column='1' elf-symbol-id='PyOS_InputHook'/> + <function-decl name='fflush' filepath='/usr/include/stdio.h' line='230' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fgets' filepath='/usr/include/stdio.h' line='592' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-402'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='clearerr' filepath='/usr/include/stdio.h' line='786' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='feof' filepath='/usr/include/stdio.h' line='788' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='isatty' filepath='/usr/include/unistd.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyOS_ReadlineTState' type-id='type-id-27' mangled-name='_PyOS_ReadlineTState' visibility='default' filepath='Parser/myreadline.c' line='28' column='1' elf-symbol-id='_PyOS_ReadlineTState'/> + <function-type size-in-bits='64' id='type-id-694'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-type> + <function-type size-in-bits='64' id='type-id-696'> + <return type-id='type-id-5'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Parser/parser.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='asdl_seq' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-698' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='28' column='1' id='type-id-699'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='29' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_seq' type-id='type-id-699' filepath='./Include/internal/pycore_asdl.h' line='30' column='1' id='type-id-698'/> + <enum-decl name='_cmpop' filepath='./Include/internal/pycore_ast.h' line='31' column='1' id='type-id-700'> + <underlying-type type-id='type-id-32'/> + <enumerator name='Eq' value='1'/> + <enumerator name='NotEq' value='2'/> + <enumerator name='Lt' value='3'/> + <enumerator name='LtE' value='4'/> + <enumerator name='Gt' value='5'/> + <enumerator name='GtE' value='6'/> + <enumerator name='Is' value='7'/> + <enumerator name='IsNot' value='8'/> + <enumerator name='In' value='9'/> + <enumerator name='NotIn' value='10'/> + </enum-decl> + <typedef-decl name='cmpop_ty' type-id='type-id-700' filepath='./Include/internal/pycore_ast.h' line='32' column='1' id='type-id-701'/> + <class-decl name='CmpopExprPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-702' visibility='default' filepath='Parser/pegen.h' line='83' column='1' id='type-id-703'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cmpop' type-id='type-id-701' visibility='default' filepath='Parser/pegen.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='expr' type-id='type-id-609' visibility='default' filepath='Parser/pegen.h' line='85' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='CmpopExprPair' type-id='type-id-703' filepath='Parser/pegen.h' line='86' column='1' id='type-id-702'/> + <class-decl name='KeyValuePair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-704' visibility='default' filepath='Parser/pegen.h' line='88' column='1' id='type-id-705'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='key' type-id='type-id-609' visibility='default' filepath='Parser/pegen.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='Parser/pegen.h' line='90' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='KeyValuePair' type-id='type-id-705' filepath='Parser/pegen.h' line='91' column='1' id='type-id-704'/> + <class-decl name='KeyPatternPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-706' visibility='default' filepath='Parser/pegen.h' line='93' column='1' id='type-id-707'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='key' type-id='type-id-609' visibility='default' filepath='Parser/pegen.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pattern' type-id='type-id-557' visibility='default' filepath='Parser/pegen.h' line='95' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='KeyPatternPair' type-id='type-id-707' filepath='Parser/pegen.h' line='96' column='1' id='type-id-706'/> + <class-decl name='NameDefaultPair' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-708' visibility='default' filepath='Parser/pegen.h' line='98' column='1' id='type-id-709'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arg' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='Parser/pegen.h' line='100' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='NameDefaultPair' type-id='type-id-709' filepath='Parser/pegen.h' line='101' column='1' id='type-id-708'/> + <class-decl name='SlashWithDefault' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-710' visibility='default' filepath='Parser/pegen.h' line='103' column='1' id='type-id-711'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='plain_names' type-id='type-id-681' visibility='default' filepath='Parser/pegen.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='names_with_defaults' type-id='type-id-712' visibility='default' filepath='Parser/pegen.h' line='105' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='SlashWithDefault' type-id='type-id-711' filepath='Parser/pegen.h' line='106' column='1' id='type-id-710'/> + <class-decl name='StarEtc' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-713' visibility='default' filepath='Parser/pegen.h' line='108' column='1' id='type-id-714'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='vararg' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='kwonlyargs' type-id='type-id-712' visibility='default' filepath='Parser/pegen.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='kwarg' type-id='type-id-683' visibility='default' filepath='Parser/pegen.h' line='111' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='StarEtc' type-id='type-id-714' filepath='Parser/pegen.h' line='112' column='1' id='type-id-713'/> + <class-decl name='AugOperator' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-715' visibility='default' filepath='Parser/pegen.h' line='114' column='1' id='type-id-716'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-637' visibility='default' filepath='Parser/pegen.h' line='114' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='AugOperator' type-id='type-id-716' filepath='Parser/pegen.h' line='114' column='1' id='type-id-715'/> + <class-decl name='KeywordOrStarred' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-717' visibility='default' filepath='Parser/pegen.h' line='115' column='1' id='type-id-718'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='element' type-id='type-id-30' visibility='default' filepath='Parser/pegen.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='is_keyword' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='117' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='KeywordOrStarred' type-id='type-id-718' filepath='Parser/pegen.h' line='118' column='1' id='type-id-717'/> + <class-decl name='ResultTokenWithMetadata' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-719' visibility='default' filepath='Parser/pegen.h' line='120' column='1' id='type-id-720'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='result' type-id='type-id-30' visibility='default' filepath='Parser/pegen.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='metadata' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='122' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='ResultTokenWithMetadata' type-id='type-id-720' filepath='Parser/pegen.h' line='123' column='1' id='type-id-719'/> + <enum-decl name='TARGETS_TYPE' naming-typedef-id='type-id-721' filepath='Parser/pegen.h' line='156' column='1' id='type-id-722'> + <underlying-type type-id='type-id-32'/> + <enumerator name='STAR_TARGETS' value='0'/> + <enumerator name='DEL_TARGETS' value='1'/> + <enumerator name='FOR_TARGETS' value='2'/> + </enum-decl> + <typedef-decl name='TARGETS_TYPE' type-id='type-id-722' filepath='Parser/pegen.h' line='160' column='1' id='type-id-721'/> + <pointer-type-def type-id='type-id-715' size-in-bits='64' id='type-id-723'/> + <pointer-type-def type-id='type-id-702' size-in-bits='64' id='type-id-724'/> + <pointer-type-def type-id='type-id-706' size-in-bits='64' id='type-id-725'/> + <pointer-type-def type-id='type-id-704' size-in-bits='64' id='type-id-726'/> + <pointer-type-def type-id='type-id-717' size-in-bits='64' id='type-id-727'/> + <pointer-type-def type-id='type-id-708' size-in-bits='64' id='type-id-728'/> + <pointer-type-def type-id='type-id-719' size-in-bits='64' id='type-id-729'/> + <pointer-type-def type-id='type-id-710' size-in-bits='64' id='type-id-730'/> + <pointer-type-def type-id='type-id-713' size-in-bits='64' id='type-id-731'/> + <pointer-type-def type-id='type-id-732' size-in-bits='64' id='type-id-733'/> + <pointer-type-def type-id='type-id-698' size-in-bits='64' id='type-id-712'/> + <pointer-type-def type-id='type-id-734' size-in-bits='64' id='type-id-735'/> + <pointer-type-def type-id='type-id-736' size-in-bits='64' id='type-id-737'/> + <pointer-type-def type-id='type-id-738' size-in-bits='64' id='type-id-739'/> + <function-decl name='_PyAST_Interactive' filepath='./Include/internal/pycore_ast.h' line='684' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyAST_Expression' filepath='./Include/internal/pycore_ast.h' line='685' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyAST_FunctionType' filepath='./Include/internal/pycore_ast.h' line='686' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyAST_Return' filepath='./Include/internal/pycore_ast.h' line='704' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Delete' filepath='./Include/internal/pycore_ast.h' line='706' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Assign' filepath='./Include/internal/pycore_ast.h' line='708' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_TypeAlias' filepath='./Include/internal/pycore_ast.h' line='711' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-635'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_AugAssign' filepath='./Include/internal/pycore_ast.h' line='714' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-637'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_AnnAssign' filepath='./Include/internal/pycore_ast.h' line='717' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_For' filepath='./Include/internal/pycore_ast.h' line='720' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_AsyncFor' filepath='./Include/internal/pycore_ast.h' line='724' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_While' filepath='./Include/internal/pycore_ast.h' line='728' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_If' filepath='./Include/internal/pycore_ast.h' line='731' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_With' filepath='./Include/internal/pycore_ast.h' line='734' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-638'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_AsyncWith' filepath='./Include/internal/pycore_ast.h' line='737' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-638'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Match' filepath='./Include/internal/pycore_ast.h' line='740' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-639'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Raise' filepath='./Include/internal/pycore_ast.h' line='743' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Try' filepath='./Include/internal/pycore_ast.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-640'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_TryStar' filepath='./Include/internal/pycore_ast.h' line='749' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-640'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Assert' filepath='./Include/internal/pycore_ast.h' line='753' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Import' filepath='./Include/internal/pycore_ast.h' line='755' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-641'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_ImportFrom' filepath='./Include/internal/pycore_ast.h' line='757' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-641'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Global' filepath='./Include/internal/pycore_ast.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-642'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Nonlocal' filepath='./Include/internal/pycore_ast.h' line='762' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-642'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Expr' filepath='./Include/internal/pycore_ast.h' line='765' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Pass' filepath='./Include/internal/pycore_ast.h' line='767' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Break' filepath='./Include/internal/pycore_ast.h' line='769' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_Continue' filepath='./Include/internal/pycore_ast.h' line='771' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyAST_BoolOp' filepath='./Include/internal/pycore_ast.h' line='773' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-740'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_NamedExpr' filepath='./Include/internal/pycore_ast.h' line='776' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_BinOp' filepath='./Include/internal/pycore_ast.h' line='779' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-637'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_UnaryOp' filepath='./Include/internal/pycore_ast.h' line='782' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-741'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Lambda' filepath='./Include/internal/pycore_ast.h' line='785' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-633'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_IfExp' filepath='./Include/internal/pycore_ast.h' line='788' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Dict' filepath='./Include/internal/pycore_ast.h' line='791' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Set' filepath='./Include/internal/pycore_ast.h' line='794' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_ListComp' filepath='./Include/internal/pycore_ast.h' line='796' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-742'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_SetComp' filepath='./Include/internal/pycore_ast.h' line='799' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-742'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_DictComp' filepath='./Include/internal/pycore_ast.h' line='802' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-742'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_GeneratorExp' filepath='./Include/internal/pycore_ast.h' line='805' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-742'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Await' filepath='./Include/internal/pycore_ast.h' line='808' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Yield' filepath='./Include/internal/pycore_ast.h' line='810' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_YieldFrom' filepath='./Include/internal/pycore_ast.h' line='812' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Compare' filepath='./Include/internal/pycore_ast.h' line='814' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-680'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Slice' filepath='./Include/internal/pycore_ast.h' line='846' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_comprehension' filepath='./Include/internal/pycore_ast.h' line='849' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-743'/> + </function-decl> + <function-decl name='_PyAST_ExceptHandler' filepath='./Include/internal/pycore_ast.h' line='852' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-553'/> + </function-decl> + <function-decl name='_PyAST_keyword' filepath='./Include/internal/pycore_ast.h' line='863' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-744'/> + </function-decl> + <function-decl name='_PyAST_withitem' filepath='./Include/internal/pycore_ast.h' line='869' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-566'/> + </function-decl> + <function-decl name='_PyAST_match_case' filepath='./Include/internal/pycore_ast.h' line='871' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-557'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-607'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-555'/> + </function-decl> + <function-decl name='_PyAST_MatchValue' filepath='./Include/internal/pycore_ast.h' line='873' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchSingleton' filepath='./Include/internal/pycore_ast.h' line='875' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-659'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchSequence' filepath='./Include/internal/pycore_ast.h' line='878' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-660'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchMapping' filepath='./Include/internal/pycore_ast.h' line='881' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-660'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchClass' filepath='./Include/internal/pycore_ast.h' line='885' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-660'/> + <parameter type-id='type-id-642'/> + <parameter type-id='type-id-660'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchStar' filepath='./Include/internal/pycore_ast.h' line='889' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchAs' filepath='./Include/internal/pycore_ast.h' line='891' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-557'/> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_MatchOr' filepath='./Include/internal/pycore_ast.h' line='894' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-660'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-557'/> + </function-decl> + <function-decl name='_PyAST_TypeVar' filepath='./Include/internal/pycore_ast.h' line='898' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-563'/> + </function-decl> + <function-decl name='_PyAST_ParamSpec' filepath='./Include/internal/pycore_ast.h' line='901' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-563'/> + </function-decl> + <function-decl name='_PyAST_TypeVarTuple' filepath='./Include/internal/pycore_ast.h' line='904' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-563'/> + </function-decl> + <function-decl name='_PyPegen_insert_memo' filepath='Parser/pegen.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_update_memo' filepath='Parser/pegen.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_is_memoized' filepath='Parser/pegen.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_lookahead_with_name' filepath='Parser/pegen.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-735'/> + <parameter type-id='type-id-684'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_lookahead_with_int' filepath='Parser/pegen.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-733'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_lookahead_with_string' filepath='Parser/pegen.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-737'/> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_lookahead' filepath='Parser/pegen.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-739'/> + <parameter type-id='type-id-684'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_expect_token' filepath='Parser/pegen.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-685'/> + </function-decl> + <function-decl name='_PyPegen_expect_forced_token' filepath='Parser/pegen.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-685'/> + </function-decl> + <function-decl name='_PyPegen_expect_soft_keyword' filepath='Parser/pegen.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_soft_keyword_token' filepath='Parser/pegen.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_get_last_nonnwhitespace_token' filepath='Parser/pegen.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-685'/> + </function-decl> + <function-decl name='_PyPegen_name_token' filepath='Parser/pegen.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_number_token' filepath='Parser/pegen.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_string_token' filepath='Parser/pegen.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_Pypegen_stack_overflow' filepath='Parser/pegen.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPegen_get_invalid_target' filepath='Parser/pegen.h' line='222' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-721'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_get_expr_name' filepath='Parser/pegen.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_PyPegen_dummy_name' filepath='Parser/pegen.h' line='248' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_seq_last_item' filepath='Parser/pegen.h' line='249' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-712'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_seq_first_item' filepath='Parser/pegen.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-712'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_new_type_comment' filepath='Parser/pegen.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyPegen_add_type_comment_to_arg' filepath='Parser/pegen.h' line='295' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-683'/> + </function-decl> + <function-decl name='_PyPegen_singleton_seq' filepath='Parser/pegen.h' line='297' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-712'/> + </function-decl> + <function-decl name='_PyPegen_seq_insert_in_front' filepath='Parser/pegen.h' line='298' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-712'/> + </function-decl> + <function-decl name='_PyPegen_seq_append_to_end' filepath='Parser/pegen.h' line='299' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-712'/> + </function-decl> + <function-decl name='_PyPegen_seq_flatten' filepath='Parser/pegen.h' line='300' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-712'/> + </function-decl> + <function-decl name='_PyPegen_join_names_with_dot' filepath='Parser/pegen.h' line='301' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_seq_count_dots' filepath='Parser/pegen.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-712'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_alias_for_star' filepath='Parser/pegen.h' line='303' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-551'/> + </function-decl> + <function-decl name='_PyPegen_map_names_to_ids' filepath='Parser/pegen.h' line='304' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-610'/> + <return type-id='type-id-642'/> + </function-decl> + <function-decl name='_PyPegen_cmpop_expr_pair' filepath='Parser/pegen.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-701'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-724'/> + </function-decl> + <function-decl name='_PyPegen_get_cmpops' filepath='Parser/pegen.h' line='306' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-680'/> + </function-decl> + <function-decl name='_PyPegen_get_exprs' filepath='Parser/pegen.h' line='307' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_PyPegen_set_expr_context' filepath='Parser/pegen.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-682'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_key_value_pair' filepath='Parser/pegen.h' line='309' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-726'/> + </function-decl> + <function-decl name='_PyPegen_get_keys' filepath='Parser/pegen.h' line='310' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_PyPegen_get_values' filepath='Parser/pegen.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_PyPegen_key_pattern_pair' filepath='Parser/pegen.h' line='312' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-557'/> + <return type-id='type-id-725'/> + </function-decl> + <function-decl name='_PyPegen_get_pattern_keys' filepath='Parser/pegen.h' line='313' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_PyPegen_get_patterns' filepath='Parser/pegen.h' line='314' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-660'/> + </function-decl> + <function-decl name='_PyPegen_name_default_pair' filepath='Parser/pegen.h' line='315' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-728'/> + </function-decl> + <function-decl name='_PyPegen_slash_with_default' filepath='Parser/pegen.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-730'/> + </function-decl> + <function-decl name='_PyPegen_star_etc' filepath='Parser/pegen.h' line='317' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-683'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-683'/> + <return type-id='type-id-731'/> + </function-decl> + <function-decl name='_PyPegen_make_arguments' filepath='Parser/pegen.h' line='318' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-730'/> + <parameter type-id='type-id-681'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-731'/> + <return type-id='type-id-633'/> + </function-decl> + <function-decl name='_PyPegen_empty_arguments' filepath='Parser/pegen.h' line='320' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-633'/> + </function-decl> + <function-decl name='_PyPegen_formatted_value' filepath='Parser/pegen.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-685'/> + <parameter type-id='type-id-729'/> + <parameter type-id='type-id-729'/> + <parameter type-id='type-id-685'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_augoperator' filepath='Parser/pegen.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-637'/> + <return type-id='type-id-723'/> + </function-decl> + <function-decl name='_PyPegen_function_def_decorators' filepath='Parser/pegen.h' line='324' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-559'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyPegen_class_def_decorators' filepath='Parser/pegen.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-559'/> + <return type-id='type-id-559'/> + </function-decl> + <function-decl name='_PyPegen_keyword_or_starred' filepath='Parser/pegen.h' line='326' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-727'/> + </function-decl> + <function-decl name='_PyPegen_seq_extract_starred_exprs' filepath='Parser/pegen.h' line='327' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-610'/> + </function-decl> + <function-decl name='_PyPegen_seq_delete_starred_exprs' filepath='Parser/pegen.h' line='328' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-636'/> + </function-decl> + <function-decl name='_PyPegen_collect_call_seqs' filepath='Parser/pegen.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_constant_from_token' filepath='Parser/pegen.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_decoded_constant_from_token' filepath='Parser/pegen.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_constant_from_string' filepath='Parser/pegen.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_concatenate_strings' filepath='Parser/pegen.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_ensure_imaginary' filepath='Parser/pegen.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_ensure_real' filepath='Parser/pegen.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_join_sequences' filepath='Parser/pegen.h' line='339' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-712'/> + <parameter type-id='type-id-712'/> + <return type-id='type-id-712'/> + </function-decl> + <function-decl name='_PyPegen_check_barry_as_flufl' filepath='Parser/pegen.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_check_legacy_stmt' filepath='Parser/pegen.h' line='341' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_check_fstring_conversion' filepath='Parser/pegen.h' line='342' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-729'/> + </function-decl> + <function-decl name='_PyPegen_setup_full_format_spec' filepath='Parser/pegen.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-729'/> + </function-decl> + <function-decl name='_PyPegen_make_module' filepath='Parser/pegen.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-607'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyPegen_arguments_parsing_error' filepath='Parser/pegen.h' line='346' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_get_last_comprehension_item' filepath='Parser/pegen.h' line='347' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-743'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyPegen_nonparen_genexp_in_call' filepath='Parser/pegen.h' line='348' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-609'/> + <parameter type-id='type-id-742'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_interactive_exit' filepath='Parser/pegen.h' line='359' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-607'/> + </function-decl> + <function-decl name='_PyPegen_joined_str' filepath='Parser/pegen.h' line='362' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <parameter type-id='type-id-610'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-609'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-732'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-685'/> + </function-type> + <function-type size-in-bits='64' id='type-id-734'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-609'/> + </function-type> + <function-type size-in-bits='64' id='type-id-736'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-609'/> + </function-type> + <function-type size-in-bits='64' id='type-id-738'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-30'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Parser/peg_api.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyCompilerFlags' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-745' visibility='default' filepath='./Include/cpython/compile.h' line='27' column='1' id='type-id-746'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cf_flags' type-id='type-id-5' visibility='default' filepath='./Include/cpython/compile.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='cf_feature_version' type-id='type-id-5' visibility='default' filepath='./Include/cpython/compile.h' line='29' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyCompilerFlags' type-id='type-id-746' filepath='./Include/cpython/compile.h' line='30' column='1' id='type-id-745'/> + <pointer-type-def type-id='type-id-745' size-in-bits='64' id='type-id-209'/> + <function-decl name='PySys_Audit' mangled-name='PySys_Audit' filepath='./Include/sysmodule.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_Audit'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_run_parser_from_file_pointer' filepath='Parser/pegen.h' line='354' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='_PyPegen_run_parser_from_string' filepath='Parser/pegen.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-575'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/pegen.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-747' size-in-bits='512' id='type-id-748'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-749' size-in-bits='5120' id='type-id-750'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-327' size-in-bits='512' id='type-id-751'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-415' size-in-bits='5120' id='type-id-414'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-335' size-in-bits='5120' id='type-id-752'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-338' size-in-bits='512' id='type-id-753'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-353' size-in-bits='512' id='type-id-754'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-260' size-in-bits='5120' id='type-id-755'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-251' size-in-bits='67072' id='type-id-756'> + <subrange length='262' type-id='type-id-2' id='type-id-757'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='64' id='type-id-359'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='16256' id='type-id-758'> + <subrange length='254' type-id='type-id-2' id='type-id-759'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='512' id='type-id-760'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='2' type-id='type-id-4' size-in-bits='8704' id='type-id-761'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + <subrange length='17' type-id='type-id-2' id='type-id-762'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-763' size-in-bits='1280' id='type-id-764'> + <subrange length='20' type-id='type-id-2' id='type-id-765'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-530' size-in-bits='512' id='type-id-766'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-767' size-in-bits='32' id='type-id-768'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-769' size-in-bits='5120' id='type-id-770'> + <subrange length='80' type-id='type-id-2' id='type-id-416'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-771' size-in-bits='64' id='type-id-772'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-773' size-in-bits='128' id='type-id-774'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-775' size-in-bits='49152' id='type-id-776'> + <subrange length='128' type-id='type-id-2' id='type-id-532'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-777' size-in-bits='65536' id='type-id-778'> + <subrange length='128' type-id='type-id-2' id='type-id-532'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-779' size-in-bits='26880' id='type-id-780'> + <subrange length='210' type-id='type-id-2' id='type-id-781'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-782' size-in-bits='98304' id='type-id-783'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-784' size-in-bits='8320' id='type-id-785'> + <subrange length='65' type-id='type-id-2' id='type-id-71'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-786' size-in-bits='524288' id='type-id-787'> + <subrange length='4096' type-id='type-id-2' id='type-id-788'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-789' size-in-bits='57600' id='type-id-790'> + <subrange length='300' type-id='type-id-2' id='type-id-791'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-792' size-in-bits='1048576' id='type-id-793'> + <subrange length='16384' type-id='type-id-2' id='type-id-794'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-795' size-in-bits='2097152' id='type-id-796'> + <subrange length='32768' type-id='type-id-2' id='type-id-797'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-798' size-in-bits='2097152' id='type-id-799'> + <subrange length='32768' type-id='type-id-2' id='type-id-797'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-800' size-in-bits='4160' id='type-id-801'> + <subrange length='65' type-id='type-id-2' id='type-id-71'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-683' size-in-bits='64' id='type-id-802'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-803' size-in-bits='2048' id='type-id-804'> + <subrange length='32' type-id='type-id-2' id='type-id-67'/> + </array-type-def> + <type-decl name='bool' size-in-bits='8' id='type-id-352'/> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='8' id='type-id-805'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='1600' id='type-id-673'> + <subrange length='200' type-id='type-id-2' id='type-id-806'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='160' id='type-id-807'> + <subrange length='20' type-id='type-id-2' id='type-id-765'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='192' id='type-id-808'> + <subrange length='24' type-id='type-id-2' id='type-id-809'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='320' id='type-id-810'> + <subrange length='40' type-id='type-id-2' id='type-id-811'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='384' id='type-id-812'> + <subrange length='48' type-id='type-id-2' id='type-id-813'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='32' id='type-id-814'> + <subrange length='4' type-id='type-id-2' id='type-id-229'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='64' id='type-id-815'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <class-decl name='PyAsyncGenASend' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-816'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-817'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-818'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-819'/> + <class-decl name='_PyAsyncGenWrappedValue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-820'/> + <class-decl name='__va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-821'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='gp_offset' type-id='type-id-101' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='fp_offset' type-id='type-id-101' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='overflow_arg_area' type-id='type-id-30' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='reg_save_area' type-id='type-id-30' visibility='default'/> + </data-member> + </class-decl> + <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-822'/> + <class-decl name='_dictkeysobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='140' column='1' id='type-id-513'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='dk_refcnt' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='dk_log2_size' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='72'> + <var-decl name='dk_log2_index_bytes' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='dk_kind' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='dk_version' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_dict.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='dk_usable' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='dk_nentries' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_dict.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='dk_indices' type-id='type-id-267' visibility='default' filepath='./Include/internal/pycore_dict.h' line='180' column='1'/> + </data-member> + </class-decl> + <class-decl name='_dictvalues' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict.h' line='196' column='1' id='type-id-823'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='capacity' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='size' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='198' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='embedded' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24'> + <var-decl name='valid' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_dict.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='values' type-id='type-id-359' visibility='default' filepath='./Include/internal/pycore_dict.h' line='201' column='1'/> + </data-member> + </class-decl> + <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-824'/> + <array-type-def dimensions='1' type-id='type-id-743' size-in-bits='64' id='type-id-825'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-373' size-in-bits='32' id='type-id-826'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <type-decl name='double' size-in-bits='64' id='type-id-172'/> + <array-type-def dimensions='1' type-id='type-id-172' size-in-bits='18432' id='type-id-827'> + <subrange length='288' type-id='type-id-2' id='type-id-828'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-609' size-in-bits='64' id='type-id-829'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-385' size-in-bits='16320' id='type-id-830'> + <subrange length='255' type-id='type-id-2' id='type-id-831'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-832' size-in-bits='576' id='type-id-833'> + <subrange length='3' type-id='type-id-2' id='type-id-834'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-835' size-in-bits='576' id='type-id-836'> + <subrange length='3' type-id='type-id-2' id='type-id-834'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='3200' id='type-id-672'> + <subrange length='100' type-id='type-id-2' id='type-id-837'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='32' id='type-id-838'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='6400' id='type-id-674'> + <subrange length='200' type-id='type-id-2' id='type-id-806'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='640' id='type-id-839'> + <subrange length='20' type-id='type-id-2' id='type-id-765'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-5' size-in-bits='896' id='type-id-840'> + <subrange length='28' type-id='type-id-2' id='type-id-841'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-744' size-in-bits='64' id='type-id-842'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <type-decl name='long int' size-in-bits='64' id='type-id-183'/> + <type-decl name='long long int' size-in-bits='64' id='type-id-377'/> + <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-376'/> + <array-type-def dimensions='1' type-id='type-id-400' size-in-bits='3840' id='type-id-843'> + <subrange length='10' type-id='type-id-2' id='type-id-844'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-400' size-in-bits='76800' id='type-id-845'> + <subrange length='200' type-id='type-id-2' id='type-id-806'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-846' size-in-bits='4096' id='type-id-847'> + <subrange length='64' type-id='type-id-2' id='type-id-848'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-849' size-in-bits='640' id='type-id-850'> + <subrange length='10' type-id='type-id-2' id='type-id-844'/> + </array-type-def> + <type-decl name='short int' size-in-bits='16' id='type-id-78'/> + <type-decl name='signed char' size-in-bits='8' id='type-id-851'/> + <array-type-def dimensions='1' type-id='type-id-852' size-in-bits='115200' id='type-id-678'> + <subrange length='150' type-id='type-id-2' id='type-id-853'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-854' size-in-bits='96' id='type-id-855'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-856' size-in-bits='786432' id='type-id-857'> + <subrange length='4096' type-id='type-id-2' id='type-id-788'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-326' size-in-bits='64' id='type-id-858'> + <subrange length='2' type-id='type-id-2' id='type-id-431'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-326' size-in-bits='256' id='type-id-859'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='80' id='type-id-860'> + <subrange length='10' type-id='type-id-2' id='type-id-844'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='88' id='type-id-861'> + <subrange length='11' type-id='type-id-2' id='type-id-862'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='96' id='type-id-863'> + <subrange length='12' type-id='type-id-2' id='type-id-864'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='104' id='type-id-865'> + <subrange length='13' type-id='type-id-2' id='type-id-866'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='112' id='type-id-867'> + <subrange length='14' type-id='type-id-2' id='type-id-868'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='120' id='type-id-869'> + <subrange length='15' type-id='type-id-2' id='type-id-870'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='128' id='type-id-871'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='136' id='type-id-872'> + <subrange length='17' type-id='type-id-2' id='type-id-762'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='144' id='type-id-873'> + <subrange length='18' type-id='type-id-2' id='type-id-874'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='152' id='type-id-875'> + <subrange length='19' type-id='type-id-2' id='type-id-876'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='8' id='type-id-877'> + <subrange length='1' type-id='type-id-2' id='type-id-429'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='160' id='type-id-878'> + <subrange length='20' type-id='type-id-2' id='type-id-765'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='168' id='type-id-879'> + <subrange length='21' type-id='type-id-2' id='type-id-880'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='176' id='type-id-881'> + <subrange length='22' type-id='type-id-2' id='type-id-882'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='184' id='type-id-883'> + <subrange length='23' type-id='type-id-2' id='type-id-884'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='192' id='type-id-885'> + <subrange length='24' type-id='type-id-2' id='type-id-809'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='200' id='type-id-886'> + <subrange length='25' type-id='type-id-2' id='type-id-887'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='208' id='type-id-888'> + <subrange length='26' type-id='type-id-2' id='type-id-889'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='224' id='type-id-890'> + <subrange length='28' type-id='type-id-2' id='type-id-841'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='16' id='type-id-891'> + <subrange length='2' type-id='type-id-2' id='type-id-431'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='248' id='type-id-892'> + <subrange length='31' type-id='type-id-2' id='type-id-893'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='288' id='type-id-894'> + <subrange length='36' type-id='type-id-2' id='type-id-425'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='24' id='type-id-895'> + <subrange length='3' type-id='type-id-2' id='type-id-834'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='32' id='type-id-896'> + <subrange length='4' type-id='type-id-2' id='type-id-229'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='40' id='type-id-897'> + <subrange length='5' type-id='type-id-2' id='type-id-898'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='48' id='type-id-899'> + <subrange length='6' type-id='type-id-2' id='type-id-391'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='56' id='type-id-900'> + <subrange length='7' type-id='type-id-2' id='type-id-901'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='64' id='type-id-902'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-305' size-in-bits='72' id='type-id-903'> + <subrange length='9' type-id='type-id-2' id='type-id-904'/> + </array-type-def> + <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-32'/> + <type-decl name='unsigned char' size-in-bits='8' id='type-id-91'/> + <type-decl name='unsigned int' size-in-bits='32' id='type-id-101'/> + <array-type-def dimensions='1' type-id='type-id-101' size-in-bits='64' id='type-id-905'> + <subrange length='2' type-id='type-id-2' id='type-id-431'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='1024' id='type-id-906'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <type-decl name='unsigned short int' size-in-bits='16' id='type-id-22'/> + <type-decl name='void' id='type-id-3'/> + <class-decl name='PyBytesObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-907' visibility='default' filepath='./Include/cpython/bytesobject.h' line='5' column='1' id='type-id-908'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/cpython/bytesobject.h' line='6' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ob_shash' type-id='type-id-301' visibility='default' filepath='./Include/cpython/bytesobject.h' line='7' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ob_sval' type-id='type-id-805' visibility='default' filepath='./Include/cpython/bytesobject.h' line='8' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyBytesObject' type-id='type-id-908' filepath='./Include/cpython/bytesobject.h' line='15' column='1' id='type-id-907'/> + <class-decl name='_Py_LocalMonitors' size-in-bits='80' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='19' column='1' id='type-id-909'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tools' type-id='type-id-860' visibility='default' filepath='./Include/cpython/code.h' line='20' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_LocalMonitors' type-id='type-id-909' filepath='./Include/cpython/code.h' line='21' column='1' id='type-id-910'/> + <class-decl name='_Py_GlobalMonitors' size-in-bits='120' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='23' column='1' id='type-id-911'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tools' type-id='type-id-869' visibility='default' filepath='./Include/cpython/code.h' line='24' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_GlobalMonitors' type-id='type-id-911' filepath='./Include/cpython/code.h' line='25' column='1' id='type-id-912'/> + <class-decl name='_PyCoCached' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-913' visibility='default' filepath='./Include/cpython/code.h' line='28' column='1' id='type-id-914'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_co_code' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_co_varnames' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_co_cellvars' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_co_freevars' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='32' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyCoCached' type-id='type-id-914' filepath='./Include/cpython/code.h' line='33' column='1' id='type-id-913'/> + <class-decl name='_PyCoLineInstrumentationData' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-915' visibility='default' filepath='./Include/cpython/code.h' line='38' column='1' id='type-id-916'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='original_opcode' type-id='type-id-305' visibility='default' filepath='./Include/cpython/code.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='line_delta' type-id='type-id-358' visibility='default' filepath='./Include/cpython/code.h' line='40' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyCoLineInstrumentationData' type-id='type-id-916' filepath='./Include/cpython/code.h' line='41' column='1' id='type-id-915'/> + <class-decl name='_PyExecutorArray' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-917' visibility='default' filepath='./Include/cpython/code.h' line='44' column='1' id='type-id-918'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='capacity' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='executors' type-id='type-id-772' visibility='default' filepath='./Include/cpython/code.h' line='47' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyExecutorArray' type-id='type-id-918' filepath='./Include/cpython/code.h' line='48' column='1' id='type-id-917'/> + <class-decl name='_PyCoMonitoringData' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-919' visibility='default' filepath='./Include/cpython/code.h' line='53' column='1' id='type-id-920'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='local_monitors' type-id='type-id-910' visibility='default' filepath='./Include/cpython/code.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='active_monitors' type-id='type-id-910' visibility='default' filepath='./Include/cpython/code.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tools' type-id='type-id-921' visibility='default' filepath='./Include/cpython/code.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='lines' type-id='type-id-922' visibility='default' filepath='./Include/cpython/code.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='line_tools' type-id='type-id-921' visibility='default' filepath='./Include/cpython/code.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='per_instruction_opcodes' type-id='type-id-921' visibility='default' filepath='./Include/cpython/code.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='per_instruction_tools' type-id='type-id-921' visibility='default' filepath='./Include/cpython/code.h' line='68' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyCoMonitoringData' type-id='type-id-920' filepath='./Include/cpython/code.h' line='69' column='1' id='type-id-919'/> + <class-decl name='PyCodeObject' size-in-bits='1664' is-struct='yes' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1' id='type-id-923'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='co_consts' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='co_names' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='co_exceptiontable' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='co_flags' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='co_argcount' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='co_posonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='co_kwonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='co_stacksize' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='544'> + <var-decl name='co_firstlineno' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='co_nlocalsplus' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='608'> + <var-decl name='co_framesize' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='co_nlocals' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='672'> + <var-decl name='co_ncellvars' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='co_nfreevars' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='co_version' type-id='type-id-326' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='co_localsplusnames' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='co_localspluskinds' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='co_filename' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='co_name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='co_qualname' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='co_linetable' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='co_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='co_executors' type-id='type-id-924' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_co_cached' type-id='type-id-925' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_co_instrumentation_version' type-id='type-id-427' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_co_monitoring' type-id='type-id-926' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='_co_firsttraceable' type-id='type-id-5' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='co_extra' type-id='type-id-30' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='co_code_adaptive' type-id='type-id-805' visibility='default' filepath='./Include/cpython/code.h' line='140' column='1'/> + </data-member> + </class-decl> + <enum-decl name='PyCodeEvent' naming-typedef-id='type-id-927' filepath='./Include/cpython/code.h' line='247' column='1' id='type-id-928'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PY_CODE_EVENT_CREATE' value='0'/> + <enumerator name='PY_CODE_EVENT_DESTROY' value='1'/> + </enum-decl> + <typedef-decl name='PyCodeEvent' type-id='type-id-928' filepath='./Include/cpython/code.h' line='251' column='1' id='type-id-927'/> + <typedef-decl name='PyCode_WatchCallback' type-id='type-id-929' filepath='./Include/cpython/code.h' line='263' column='1' id='type-id-327'/> + <class-decl name='Py_complex' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-324' visibility='default' filepath='./Include/cpython/complexobject.h' line='5' column='1' id='type-id-930'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='real' type-id='type-id-172' visibility='default' filepath='./Include/cpython/complexobject.h' line='6' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='imag' type-id='type-id-172' visibility='default' filepath='./Include/cpython/complexobject.h' line='7' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Py_complex' type-id='type-id-930' filepath='./Include/cpython/complexobject.h' line='8' column='1' id='type-id-324'/> + <typedef-decl name='PyContext' type-id='type-id-931' filepath='./Include/cpython/context.h' line='9' column='1' id='type-id-932'/> + <typedef-decl name='wrapperfunc' type-id='type-id-933' filepath='./Include/cpython/descrobject.h' line='5' column='1' id='type-id-934'/> + <class-decl name='wrapperbase' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/cpython/descrobject.h' line='11' column='1' id='type-id-331'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/descrobject.h' line='12' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='offset' type-id='type-id-5' visibility='default' filepath='./Include/cpython/descrobject.h' line='13' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='function' type-id='type-id-30' visibility='default' filepath='./Include/cpython/descrobject.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='wrapper' type-id='type-id-934' visibility='default' filepath='./Include/cpython/descrobject.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='doc' type-id='type-id-6' visibility='default' filepath='./Include/cpython/descrobject.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='./Include/cpython/descrobject.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='name_strobj' type-id='type-id-4' visibility='default' filepath='./Include/cpython/descrobject.h' line='18' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyDictKeysObject' type-id='type-id-513' filepath='./Include/cpython/dictobject.h' line='5' column='1' id='type-id-512'/> + <typedef-decl name='PyDictValues' type-id='type-id-823' filepath='./Include/cpython/dictobject.h' line='6' column='1' id='type-id-935'/> + <class-decl name='PyDictObject' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-936' visibility='default' filepath='./Include/cpython/dictobject.h' line='11' column='1' id='type-id-937'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/dictobject.h' line='12' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ma_used' type-id='type-id-7' visibility='default' filepath='./Include/cpython/dictobject.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ma_version_tag' type-id='type-id-108' visibility='default' filepath='./Include/cpython/dictobject.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ma_keys' type-id='type-id-415' visibility='default' filepath='./Include/cpython/dictobject.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ma_values' type-id='type-id-938' visibility='default' filepath='./Include/cpython/dictobject.h' line='35' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyDictObject' type-id='type-id-937' filepath='./Include/cpython/dictobject.h' line='36' column='1' id='type-id-936'/> + <enum-decl name='PyDict_WatchEvent' naming-typedef-id='type-id-939' filepath='./Include/cpython/dictobject.h' line='85' column='1' id='type-id-940'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PyDict_EVENT_ADDED' value='0'/> + <enumerator name='PyDict_EVENT_MODIFIED' value='1'/> + <enumerator name='PyDict_EVENT_DELETED' value='2'/> + <enumerator name='PyDict_EVENT_CLONED' value='3'/> + <enumerator name='PyDict_EVENT_CLEARED' value='4'/> + <enumerator name='PyDict_EVENT_DEALLOCATED' value='5'/> + </enum-decl> + <typedef-decl name='PyDict_WatchEvent' type-id='type-id-940' filepath='./Include/cpython/dictobject.h' line='89' column='1' id='type-id-939'/> + <typedef-decl name='PyDict_WatchCallback' type-id='type-id-941' filepath='./Include/cpython/dictobject.h' line='94' column='1' id='type-id-338'/> + <typedef-decl name='Py_OpenCodeHookFunction' type-id='type-id-942' filepath='./Include/cpython/fileobject.h' line='12' column='1' id='type-id-341'/> + <class-decl name='PyFloatObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-943' visibility='default' filepath='./Include/cpython/floatobject.h' line='5' column='1' id='type-id-944'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/floatobject.h' line='6' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_fval' type-id='type-id-172' visibility='default' filepath='./Include/cpython/floatobject.h' line='7' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyFloatObject' type-id='type-id-944' filepath='./Include/cpython/floatobject.h' line='8' column='1' id='type-id-943'/> + <class-decl name='PyFunctionObject' size-in-bits='1152' is-struct='yes' naming-typedef-id='type-id-945' visibility='default' filepath='./Include/cpython/funcobject.h' line='36' column='1' id='type-id-946'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/funcobject.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='func_globals' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='func_builtins' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='func_name' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='func_qualname' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='func_code' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='func_defaults' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='func_kwdefaults' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='func_closure' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='func_doc' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='func_dict' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='func_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='func_module' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='func_annotations' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='func_typeparams' type-id='type-id-4' visibility='default' filepath='./Include/cpython/funcobject.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='vectorcall' type-id='type-id-309' visibility='default' filepath='./Include/cpython/funcobject.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='func_version' type-id='type-id-326' visibility='default' filepath='./Include/cpython/funcobject.h' line='54' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyFunctionObject' type-id='type-id-946' filepath='./Include/cpython/funcobject.h' line='61' column='1' id='type-id-945'/> + <enum-decl name='PyFunction_WatchEvent' naming-typedef-id='type-id-947' filepath='./Include/cpython/funcobject.h' line='138' column='1' id='type-id-948'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PyFunction_EVENT_CREATE' value='0'/> + <enumerator name='PyFunction_EVENT_DESTROY' value='1'/> + <enumerator name='PyFunction_EVENT_MODIFY_CODE' value='2'/> + <enumerator name='PyFunction_EVENT_MODIFY_DEFAULTS' value='3'/> + <enumerator name='PyFunction_EVENT_MODIFY_KWDEFAULTS' value='4'/> + </enum-decl> + <typedef-decl name='PyFunction_WatchEvent' type-id='type-id-948' filepath='./Include/cpython/funcobject.h' line='142' column='1' id='type-id-947'/> + <typedef-decl name='PyFunction_WatchCallback' type-id='type-id-949' filepath='./Include/cpython/funcobject.h' line='159' column='1' id='type-id-353'/> + <class-decl name='_inittab' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='7' column='1' id='type-id-950'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/import.h' line='8' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='initfunc' type-id='type-id-380' visibility='default' filepath='./Include/cpython/import.h' line='9' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyWideStringList' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='31' column='1' id='type-id-952'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='length' type-id='type-id-7' visibility='default' filepath='./Include/cpython/initconfig.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='items' type-id='type-id-241' visibility='default' filepath='./Include/cpython/initconfig.h' line='35' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyWideStringList' type-id='type-id-952' filepath='./Include/cpython/initconfig.h' line='36' column='1' id='type-id-951'/> + <class-decl name='PyPreConfig' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='47' column='1' id='type-id-953'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_config_init' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='parse_argv' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='isolated' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='use_environment' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='configure_locale' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='coerce_c_locale' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='coerce_c_locale_warn' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='utf8_mode' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='dev_mode' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='allocator' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='124' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyPreConfig' type-id='type-id-953' filepath='./Include/cpython/initconfig.h' line='125' column='1' id='type-id-954'/> + <class-decl name='PyConfig' size-in-bits='3584' is-struct='yes' visibility='default' filepath='./Include/cpython/initconfig.h' line='134' column='1' id='type-id-955'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_config_init' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='isolated' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='137' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='use_environment' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='dev_mode' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='139' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='install_signal_handlers' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='use_hash_seed' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='hash_seed' type-id='type-id-2' visibility='default' filepath='./Include/cpython/initconfig.h' line='142' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='faulthandler' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='143' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='tracemalloc' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='perf_profiling' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='import_time' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='code_debug_ranges' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='show_ref_count' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='148' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='dump_refs' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='149' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='dump_refs_file' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='malloc_stats' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='filesystem_encoding' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='152' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='filesystem_errors' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='pycache_prefix' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='154' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='parse_argv' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='orig_argv' type-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='argv' type-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='xoptions' type-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='warnoptions' type-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='159' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='site_import' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1440'> + <var-decl name='bytes_warning' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='warn_default_encoding' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1504'> + <var-decl name='inspect' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='163' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='interactive' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='optimization_level' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='165' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='parser_debug' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='166' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1632'> + <var-decl name='write_bytecode' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='167' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='verbose' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='168' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1696'> + <var-decl name='quiet' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='169' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='user_site_directory' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='170' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1760'> + <var-decl name='configure_c_stdio' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='buffered_stdio' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='172' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='stdio_encoding' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1920'> + <var-decl name='stdio_errors' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='174' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1984'> + <var-decl name='check_hash_pycs_mode' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='178' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='use_frozen_modules' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='179' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2080'> + <var-decl name='safe_path' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='int_max_str_digits' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='181' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2144'> + <var-decl name='cpu_count' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='183' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='pathconfig_warnings' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='189' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='program_name' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='190' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='pythonpath_env' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='191' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='home' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='platlibdir' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='193' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> + <var-decl name='module_search_paths_set' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='module_search_paths' type-id='type-id-951' visibility='default' filepath='./Include/cpython/initconfig.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2688'> + <var-decl name='stdlib_dir' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='198' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2752'> + <var-decl name='executable' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='base_executable' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='prefix' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='201' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2944'> + <var-decl name='base_prefix' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='202' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3008'> + <var-decl name='exec_prefix' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3072'> + <var-decl name='base_exec_prefix' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3136'> + <var-decl name='skip_source_first_line' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='207' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3200'> + <var-decl name='run_command' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='208' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3264'> + <var-decl name='run_module' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='209' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='run_filename' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='210' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='sys_path_0' type-id='type-id-58' visibility='default' filepath='./Include/cpython/initconfig.h' line='213' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3456'> + <var-decl name='_install_importlib' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='219' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3488'> + <var-decl name='_init_main' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3520'> + <var-decl name='_is_python_build' type-id='type-id-5' visibility='default' filepath='./Include/cpython/initconfig.h' line='225' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyConfig' type-id='type-id-955' filepath='./Include/cpython/initconfig.h' line='237' column='1' id='type-id-268'/> + <class-decl name='PyListObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-956' visibility='default' filepath='./Include/cpython/listobject.h' line='5' column='1' id='type-id-957'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/cpython/listobject.h' line='6' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ob_item' type-id='type-id-238' visibility='default' filepath='./Include/cpython/listobject.h' line='8' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='allocated' type-id='type-id-7' visibility='default' filepath='./Include/cpython/listobject.h' line='21' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyListObject' type-id='type-id-957' filepath='./Include/cpython/listobject.h' line='22' column='1' id='type-id-956'/> + <class-decl name='PyMutex' size-in-bits='8' is-struct='yes' visibility='default' filepath='./Include/cpython/lock.h' line='29' column='1' id='type-id-958'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_bits' type-id='type-id-305' visibility='default' filepath='./Include/cpython/lock.h' line='30' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyMutex' type-id='type-id-958' filepath='./Include/cpython/lock.h' line='31' column='1' id='type-id-693'/> + <typedef-decl name='digit' type-id='type-id-326' filepath='./Include/cpython/longintrepr.h' line='43' column='1' id='type-id-373'/> + <class-decl name='_PyLongValue' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='93' column='1' id='type-id-959'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lv_tag' type-id='type-id-427' visibility='default' filepath='./Include/cpython/longintrepr.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_digit' type-id='type-id-826' visibility='default' filepath='./Include/cpython/longintrepr.h' line='95' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyLongValue' type-id='type-id-959' filepath='./Include/cpython/longintrepr.h' line='96' column='1' id='type-id-960'/> + <class-decl name='_longobject' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/longintrepr.h' line='98' column='1' id='type-id-961'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/longintrepr.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='long_value' type-id='type-id-960' visibility='default' filepath='./Include/cpython/longintrepr.h' line='100' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyOnceFlag' size-in-bits='8' is-struct='yes' naming-typedef-id='type-id-962' visibility='default' filepath='./Include/cpython/modsupport.h' line='7' column='1' id='type-id-963'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='type-id-305' visibility='default' filepath='./Include/cpython/modsupport.h' line='8' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyOnceFlag' type-id='type-id-963' filepath='./Include/cpython/modsupport.h' line='9' column='1' id='type-id-962'/> + <class-decl name='_PyArg_Parser' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/cpython/modsupport.h' line='11' column='1' id='type-id-964'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='format' type-id='type-id-6' visibility='default' filepath='./Include/cpython/modsupport.h' line='12' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='keywords' type-id='type-id-965' visibility='default' filepath='./Include/cpython/modsupport.h' line='13' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fname' type-id='type-id-6' visibility='default' filepath='./Include/cpython/modsupport.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='custom_msg' type-id='type-id-6' visibility='default' filepath='./Include/cpython/modsupport.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='once' type-id='type-id-962' visibility='default' filepath='./Include/cpython/modsupport.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='is_kwtuple_owned' type-id='type-id-5' visibility='default' filepath='./Include/cpython/modsupport.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='pos' type-id='type-id-5' visibility='default' filepath='./Include/cpython/modsupport.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='min' type-id='type-id-5' visibility='default' filepath='./Include/cpython/modsupport.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='max' type-id='type-id-5' visibility='default' filepath='./Include/cpython/modsupport.h' line='20' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='kwtuple' type-id='type-id-4' visibility='default' filepath='./Include/cpython/modsupport.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='next' type-id='type-id-272' visibility='default' filepath='./Include/cpython/modsupport.h' line='22' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyNumberMethods' size-in-bits='2304' is-struct='yes' naming-typedef-id='type-id-966' visibility='default' filepath='./Include/cpython/object.h' line='60' column='1' id='type-id-967'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='nb_add' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='nb_subtract' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nb_multiply' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='nb_remainder' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='nb_divmod' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='nb_power' type-id='type-id-969' visibility='default' filepath='./Include/cpython/object.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='nb_negative' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='nb_positive' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='nb_absolute' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='nb_bool' type-id='type-id-313' visibility='default' filepath='./Include/cpython/object.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='nb_invert' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='nb_lshift' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='nb_rshift' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='nb_and' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='nb_xor' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='nb_or' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='nb_int' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='nb_reserved' type-id='type-id-30' visibility='default' filepath='./Include/cpython/object.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='nb_float' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='nb_inplace_add' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='nb_inplace_subtract' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='nb_inplace_multiply' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='nb_inplace_remainder' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='nb_inplace_power' type-id='type-id-969' visibility='default' filepath='./Include/cpython/object.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='nb_inplace_lshift' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='nb_inplace_rshift' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='nb_inplace_and' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='nb_inplace_xor' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='nb_inplace_or' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='nb_floor_divide' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1920'> + <var-decl name='nb_true_divide' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1984'> + <var-decl name='nb_inplace_floor_divide' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='nb_inplace_true_divide' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='nb_index' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='nb_matrix_multiply' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='nb_inplace_matrix_multiply' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='104' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyNumberMethods' type-id='type-id-967' filepath='./Include/cpython/object.h' line='105' column='1' id='type-id-966'/> + <class-decl name='PySequenceMethods' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-971' visibility='default' filepath='./Include/cpython/object.h' line='107' column='1' id='type-id-972'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='sq_length' type-id='type-id-973' visibility='default' filepath='./Include/cpython/object.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='sq_concat' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='sq_repeat' type-id='type-id-974' visibility='default' filepath='./Include/cpython/object.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='sq_item' type-id='type-id-974' visibility='default' filepath='./Include/cpython/object.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='was_sq_slice' type-id='type-id-30' visibility='default' filepath='./Include/cpython/object.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='sq_ass_item' type-id='type-id-975' visibility='default' filepath='./Include/cpython/object.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='was_sq_ass_slice' type-id='type-id-30' visibility='default' filepath='./Include/cpython/object.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='sq_contains' type-id='type-id-976' visibility='default' filepath='./Include/cpython/object.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='sq_inplace_concat' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='sq_inplace_repeat' type-id='type-id-974' visibility='default' filepath='./Include/cpython/object.h' line='118' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PySequenceMethods' type-id='type-id-972' filepath='./Include/cpython/object.h' line='119' column='1' id='type-id-971'/> + <class-decl name='PyMappingMethods' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-977' visibility='default' filepath='./Include/cpython/object.h' line='121' column='1' id='type-id-978'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mp_length' type-id='type-id-973' visibility='default' filepath='./Include/cpython/object.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mp_subscript' type-id='type-id-968' visibility='default' filepath='./Include/cpython/object.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mp_ass_subscript' type-id='type-id-979' visibility='default' filepath='./Include/cpython/object.h' line='124' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyMappingMethods' type-id='type-id-978' filepath='./Include/cpython/object.h' line='125' column='1' id='type-id-977'/> + <typedef-decl name='sendfunc' type-id='type-id-980' filepath='./Include/cpython/object.h' line='127' column='1' id='type-id-981'/> + <class-decl name='PyAsyncMethods' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-982' visibility='default' filepath='./Include/cpython/object.h' line='129' column='1' id='type-id-983'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='am_await' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='am_aiter' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='am_anext' type-id='type-id-970' visibility='default' filepath='./Include/cpython/object.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='am_send' type-id='type-id-981' visibility='default' filepath='./Include/cpython/object.h' line='133' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyAsyncMethods' type-id='type-id-983' filepath='./Include/cpython/object.h' line='134' column='1' id='type-id-982'/> + <class-decl name='PyBufferProcs' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-984' visibility='default' filepath='./Include/cpython/object.h' line='136' column='1' id='type-id-985'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='bf_getbuffer' type-id='type-id-529' visibility='default' filepath='./Include/cpython/object.h' line='137' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='bf_releasebuffer' type-id='type-id-986' visibility='default' filepath='./Include/cpython/object.h' line='138' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyBufferProcs' type-id='type-id-985' filepath='./Include/cpython/object.h' line='139' column='1' id='type-id-984'/> + <class-decl name='_typeobject' size-in-bits='3328' is-struct='yes' visibility='default' filepath='./Include/cpython/object.h' line='147' column='1' id='type-id-987'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/cpython/object.h' line='148' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tp_name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='149' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tp_basicsize' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tp_itemsize' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='tp_dealloc' type-id='type-id-988' visibility='default' filepath='./Include/cpython/object.h' line='154' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='tp_vectorcall_offset' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='tp_getattr' type-id='type-id-989' visibility='default' filepath='./Include/cpython/object.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='tp_setattr' type-id='type-id-990' visibility='default' filepath='./Include/cpython/object.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='tp_as_async' type-id='type-id-991' visibility='default' filepath='./Include/cpython/object.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='tp_repr' type-id='type-id-992' visibility='default' filepath='./Include/cpython/object.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='tp_as_number' type-id='type-id-993' visibility='default' filepath='./Include/cpython/object.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='tp_as_sequence' type-id='type-id-994' visibility='default' filepath='./Include/cpython/object.h' line='165' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='tp_as_mapping' type-id='type-id-995' visibility='default' filepath='./Include/cpython/object.h' line='166' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='tp_hash' type-id='type-id-996' visibility='default' filepath='./Include/cpython/object.h' line='170' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='tp_call' type-id='type-id-969' visibility='default' filepath='./Include/cpython/object.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='tp_str' type-id='type-id-992' visibility='default' filepath='./Include/cpython/object.h' line='172' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='tp_getattro' type-id='type-id-997' visibility='default' filepath='./Include/cpython/object.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='tp_setattro' type-id='type-id-998' visibility='default' filepath='./Include/cpython/object.h' line='174' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='tp_as_buffer' type-id='type-id-999' visibility='default' filepath='./Include/cpython/object.h' line='177' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='tp_flags' type-id='type-id-2' visibility='default' filepath='./Include/cpython/object.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='tp_doc' type-id='type-id-6' visibility='default' filepath='./Include/cpython/object.h' line='182' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='tp_traverse' type-id='type-id-312' visibility='default' filepath='./Include/cpython/object.h' line='186' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='tp_clear' type-id='type-id-313' visibility='default' filepath='./Include/cpython/object.h' line='189' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='tp_richcompare' type-id='type-id-1000' visibility='default' filepath='./Include/cpython/object.h' line='193' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='tp_weaklistoffset' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='tp_iter' type-id='type-id-1001' visibility='default' filepath='./Include/cpython/object.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='tp_iternext' type-id='type-id-1002' visibility='default' filepath='./Include/cpython/object.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='tp_methods' type-id='type-id-176' visibility='default' filepath='./Include/cpython/object.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1920'> + <var-decl name='tp_members' type-id='type-id-333' visibility='default' filepath='./Include/cpython/object.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1984'> + <var-decl name='tp_getset' type-id='type-id-334' visibility='default' filepath='./Include/cpython/object.h' line='205' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='tp_base' type-id='type-id-1' visibility='default' filepath='./Include/cpython/object.h' line='207' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='tp_dict' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='208' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='tp_descr_get' type-id='type-id-1003' visibility='default' filepath='./Include/cpython/object.h' line='209' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='tp_descr_set' type-id='type-id-1004' visibility='default' filepath='./Include/cpython/object.h' line='210' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='tp_dictoffset' type-id='type-id-7' visibility='default' filepath='./Include/cpython/object.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='tp_init' type-id='type-id-1005' visibility='default' filepath='./Include/cpython/object.h' line='212' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='tp_alloc' type-id='type-id-1006' visibility='default' filepath='./Include/cpython/object.h' line='213' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> + <var-decl name='tp_new' type-id='type-id-1007' visibility='default' filepath='./Include/cpython/object.h' line='214' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='tp_free' type-id='type-id-385' visibility='default' filepath='./Include/cpython/object.h' line='215' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2624'> + <var-decl name='tp_is_gc' type-id='type-id-313' visibility='default' filepath='./Include/cpython/object.h' line='216' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2688'> + <var-decl name='tp_bases' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='217' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2752'> + <var-decl name='tp_mro' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='218' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='tp_cache' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='219' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='tp_subclasses' type-id='type-id-30' visibility='default' filepath='./Include/cpython/object.h' line='220' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2944'> + <var-decl name='tp_weaklist' type-id='type-id-4' visibility='default' filepath='./Include/cpython/object.h' line='221' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3008'> + <var-decl name='tp_del' type-id='type-id-988' visibility='default' filepath='./Include/cpython/object.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3072'> + <var-decl name='tp_version_tag' type-id='type-id-101' visibility='default' filepath='./Include/cpython/object.h' line='225' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3136'> + <var-decl name='tp_finalize' type-id='type-id-988' visibility='default' filepath='./Include/cpython/object.h' line='227' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3200'> + <var-decl name='tp_vectorcall' type-id='type-id-309' visibility='default' filepath='./Include/cpython/object.h' line='228' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3264'> + <var-decl name='tp_watched' type-id='type-id-91' visibility='default' filepath='./Include/cpython/object.h' line='231' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3280'> + <var-decl name='tp_versions_used' type-id='type-id-445' visibility='default' filepath='./Include/cpython/object.h' line='232' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyType_WatchCallback' type-id='type-id-1008' filepath='./Include/cpython/object.h' line='504' column='1' id='type-id-530'/> + <enum-decl name='PyRefTracerEvent' naming-typedef-id='type-id-1009' filepath='./Include/cpython/object.h' line='518' column='1' id='type-id-1010'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PyRefTracer_CREATE' value='0'/> + <enumerator name='PyRefTracer_DESTROY' value='1'/> + </enum-decl> + <typedef-decl name='PyRefTracerEvent' type-id='type-id-1010' filepath='./Include/cpython/object.h' line='521' column='1' id='type-id-1009'/> + <typedef-decl name='PyRefTracer' type-id='type-id-1011' filepath='./Include/cpython/object.h' line='523' column='1' id='type-id-403'/> + <class-decl name='PyObjectArenaAllocator' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-503' visibility='default' filepath='./Include/cpython/objimpl.h' line='59' column='1' id='type-id-1012'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ctx' type-id='type-id-30' visibility='default' filepath='./Include/cpython/objimpl.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='alloc' type-id='type-id-1013' visibility='default' filepath='./Include/cpython/objimpl.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='free' type-id='type-id-1014' visibility='default' filepath='./Include/cpython/objimpl.h' line='67' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyObjectArenaAllocator' type-id='type-id-1012' filepath='./Include/cpython/objimpl.h' line='68' column='1' id='type-id-503'/> + <class-decl name='PyBaseExceptionObject' size-in-bits='576' is-struct='yes' naming-typedef-id='type-id-1015' visibility='default' filepath='./Include/cpython/pyerrors.h' line='13' column='1' id='type-id-1016'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='dict' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='args' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='notes' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='traceback' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='context' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='cause' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='suppress_context' type-id='type-id-53' visibility='default' filepath='./Include/cpython/pyerrors.h' line='14' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyBaseExceptionObject' type-id='type-id-1016' filepath='./Include/cpython/pyerrors.h' line='15' column='1' id='type-id-1015'/> + <typedef-decl name='atexit_datacallbackfunc' type-id='type-id-510' filepath='./Include/cpython/pylifecycle.h' line='90' column='1' id='type-id-29'/> + <class-decl name='PyMemAllocatorEx' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-501' visibility='default' filepath='./Include/cpython/pymem.h' line='33' column='1' id='type-id-1017'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ctx' type-id='type-id-30' visibility='default' filepath='./Include/cpython/pymem.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='malloc' type-id='type-id-1013' visibility='default' filepath='./Include/cpython/pymem.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='calloc' type-id='type-id-1018' visibility='default' filepath='./Include/cpython/pymem.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='realloc' type-id='type-id-1019' visibility='default' filepath='./Include/cpython/pymem.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='free' type-id='type-id-1020' visibility='default' filepath='./Include/cpython/pymem.h' line='47' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyMemAllocatorEx' type-id='type-id-1017' filepath='./Include/cpython/pymem.h' line='48' column='1' id='type-id-501'/> + <typedef-decl name='Py_tracefunc' type-id='type-id-1021' filepath='./Include/cpython/pystate.h' line='16' column='1' id='type-id-1022'/> + <class-decl name='_err_stackitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='32' column='1' id='type-id-1023'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='exc_value' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='previous_item' type-id='type-id-1024' visibility='default' filepath='./Include/cpython/pystate.h' line='48' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyErr_StackItem' type-id='type-id-1023' filepath='./Include/cpython/pystate.h' line='50' column='1' id='type-id-357'/> + <class-decl name='_stack_chunk' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='52' column='1' id='type-id-1025'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='previous' type-id='type-id-1026' visibility='default' filepath='./Include/cpython/pystate.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='size' type-id='type-id-21' visibility='default' filepath='./Include/cpython/pystate.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='top' type-id='type-id-21' visibility='default' filepath='./Include/cpython/pystate.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='data' type-id='type-id-359' visibility='default' filepath='./Include/cpython/pystate.h' line='56' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyStackChunk' type-id='type-id-1025' filepath='./Include/cpython/pystate.h' line='57' column='1' id='type-id-1027'/> + <class-decl name='_ts' size-in-bits='2432' is-struct='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='59' column='1' id='type-id-1028'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='prev' type-id='type-id-27' visibility='default' filepath='./Include/cpython/pystate.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='next' type-id='type-id-27' visibility='default' filepath='./Include/cpython/pystate.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='interp' type-id='type-id-28' visibility='default' filepath='./Include/cpython/pystate.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='eval_breaker' type-id='type-id-427' visibility='default' filepath='./Include/cpython/pystate.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_status' type-id='type-id-1029' visibility='default' filepath='./Include/cpython/pystate.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='_whence' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='state' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='py_recursion_remaining' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='py_recursion_limit' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='416'> + <var-decl name='c_recursion_remaining' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='recursion_headroom' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='tracing' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='what_event' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='current_frame' type-id='type-id-367' visibility='default' filepath='./Include/cpython/pystate.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='c_profilefunc' type-id='type-id-1022' visibility='default' filepath='./Include/cpython/pystate.h' line='127' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='c_tracefunc' type-id='type-id-1022' visibility='default' filepath='./Include/cpython/pystate.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='c_profileobj' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='c_traceobj' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='current_exception' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='exc_info' type-id='type-id-239' visibility='default' filepath='./Include/cpython/pystate.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='dict' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='gilstate_counter' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='142' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='async_exc' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='thread_id' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='native_thread_id' type-id='type-id-2' visibility='default' filepath='./Include/cpython/pystate.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='delete_later' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='critical_section' type-id='type-id-427' visibility='default' filepath='./Include/cpython/pystate.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='coroutine_origin_tracking_depth' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pystate.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='async_gen_firstiter' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='async_gen_finalizer' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='165' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='context' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='167' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='context_ver' type-id='type-id-108' visibility='default' filepath='./Include/cpython/pystate.h' line='168' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='id' type-id='type-id-108' visibility='default' filepath='./Include/cpython/pystate.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='datastack_chunk' type-id='type-id-1030' visibility='default' filepath='./Include/cpython/pystate.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1920'> + <var-decl name='datastack_top' type-id='type-id-238' visibility='default' filepath='./Include/cpython/pystate.h' line='174' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1984'> + <var-decl name='datastack_limit' type-id='type-id-238' visibility='default' filepath='./Include/cpython/pystate.h' line='175' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='exc_state' type-id='type-id-357' visibility='default' filepath='./Include/cpython/pystate.h' line='190' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='previous_executor' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='dict_global_version' type-id='type-id-108' visibility='default' filepath='./Include/cpython/pystate.h' line='194' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='threading_local_key' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='threading_local_sentinel' type-id='type-id-4' visibility='default' filepath='./Include/cpython/pystate.h' line='202' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__28' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/pystate.h' line='71' column='1' id='type-id-1029'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='initialized' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1'> + <var-decl name='bound' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2'> + <var-decl name='unbound' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3'> + <var-decl name='bound_gilstate' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4'> + <var-decl name='active' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5'> + <var-decl name='holds_gil' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6'> + <var-decl name='finalizing' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7'> + <var-decl name='cleared' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='finalized' type-id='type-id-101' visibility='default' filepath='./Include/cpython/pystate.h' line='92' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyFrameEvalFunction' type-id='type-id-1031' filepath='./Include/cpython/pystate.h' line='271' column='1' id='type-id-1032'/> + <class-decl name='_Py_tss_t' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/cpython/pythread.h' line='35' column='1' id='type-id-1033'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_is_initialized' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pythread.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='_key' type-id='type-id-507' visibility='default' filepath='./Include/cpython/pythread.h' line='37' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyTime_t' type-id='type-id-460' filepath='./Include/cpython/pytime.h' line='10' column='1' id='type-id-213'/> + <typedef-decl name='Py_AuditHookFunction' type-id='type-id-1034' filepath='./Include/cpython/sysmodule.h' line='5' column='1' id='type-id-240'/> + <class-decl name='PyTupleObject' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1035' visibility='default' filepath='./Include/cpython/tupleobject.h' line='5' column='1' id='type-id-1036'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/cpython/tupleobject.h' line='6' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ob_item' type-id='type-id-359' visibility='default' filepath='./Include/cpython/tupleobject.h' line='10' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyTupleObject' type-id='type-id-1036' filepath='./Include/cpython/tupleobject.h' line='11' column='1' id='type-id-1035'/> + <class-decl name='PyASCIIObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1037' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='54' column='1' id='type-id-1038'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='length' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='hash' type-id='type-id-301' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='state' type-id='type-id-1039' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='150' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__60' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='102' column='1' id='type-id-1039'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='interned' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2'> + <var-decl name='kind' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5'> + <var-decl name='compact' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6'> + <var-decl name='ascii' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7'> + <var-decl name='statically_allocated' type-id='type-id-101' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='146' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyASCIIObject' type-id='type-id-1038' filepath='./Include/cpython/unicodeobject.h' line='151' column='1' id='type-id-1037'/> + <class-decl name='PyCompactUnicodeObject' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1040' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='156' column='1' id='type-id-1041'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_base' type-id='type-id-1037' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='utf8_length' type-id='type-id-7' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='utf8' type-id='type-id-17' visibility='default' filepath='./Include/cpython/unicodeobject.h' line='160' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyCompactUnicodeObject' type-id='type-id-1041' filepath='./Include/cpython/unicodeobject.h' line='161' column='1' id='type-id-1040'/> + <typedef-decl name='getter' type-id='type-id-942' filepath='./Include/descrobject.h' line='8' column='1' id='type-id-1042'/> + <typedef-decl name='setter' type-id='type-id-1043' filepath='./Include/descrobject.h' line='9' column='1' id='type-id-1044'/> + <class-decl name='PyGetSetDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='11' column='1' id='type-id-1045'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/descrobject.h' line='12' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='get' type-id='type-id-1042' visibility='default' filepath='./Include/descrobject.h' line='13' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='set' type-id='type-id-1044' visibility='default' filepath='./Include/descrobject.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='doc' type-id='type-id-6' visibility='default' filepath='./Include/descrobject.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='closure' type-id='type-id-30' visibility='default' filepath='./Include/descrobject.h' line='16' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyMemberDef' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/descrobject.h' line='41' column='1' id='type-id-1046'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/descrobject.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='type' type-id='type-id-5' visibility='default' filepath='./Include/descrobject.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='offset' type-id='type-id-7' visibility='default' filepath='./Include/descrobject.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='./Include/descrobject.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='doc' type-id='type-id-6' visibility='default' filepath='./Include/descrobject.h' line='46' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='identifier' type-id='type-id-4' filepath='./Include/internal/pycore_asdl.h' line='13' column='1' id='type-id-632'/> + <typedef-decl name='string' type-id='type-id-4' filepath='./Include/internal/pycore_asdl.h' line='14' column='1' id='type-id-634'/> + <typedef-decl name='constant' type-id='type-id-4' filepath='./Include/internal/pycore_asdl.h' line='16' column='1' id='type-id-659'/> + <class-decl name='asdl_int_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1047' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='42' column='1' id='type-id-1048'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-838' visibility='default' filepath='./Include/internal/pycore_asdl.h' line='44' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_int_seq' type-id='type-id-1048' filepath='./Include/internal/pycore_asdl.h' line='45' column='1' id='type-id-1047'/> + <typedef-decl name='expr_ty' type-id='type-id-1049' filepath='./Include/internal/pycore_ast.h' line='19' column='1' id='type-id-609'/> + <enum-decl name='_expr_context' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-1050'> + <underlying-type type-id='type-id-32'/> + <enumerator name='Load' value='1'/> + <enumerator name='Store' value='2'/> + <enumerator name='Del' value='3'/> + </enum-decl> + <typedef-decl name='expr_context_ty' type-id='type-id-1050' filepath='./Include/internal/pycore_ast.h' line='21' column='1' id='type-id-682'/> + <enum-decl name='_boolop' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-1051'> + <underlying-type type-id='type-id-32'/> + <enumerator name='And' value='1'/> + <enumerator name='Or' value='2'/> + </enum-decl> + <typedef-decl name='boolop_ty' type-id='type-id-1051' filepath='./Include/internal/pycore_ast.h' line='23' column='1' id='type-id-740'/> + <enum-decl name='_operator' filepath='./Include/internal/pycore_ast.h' line='25' column='1' id='type-id-1052'> + <underlying-type type-id='type-id-32'/> + <enumerator name='Add' value='1'/> + <enumerator name='Sub' value='2'/> + <enumerator name='Mult' value='3'/> + <enumerator name='MatMult' value='4'/> + <enumerator name='Div' value='5'/> + <enumerator name='Mod' value='6'/> + <enumerator name='Pow' value='7'/> + <enumerator name='LShift' value='8'/> + <enumerator name='RShift' value='9'/> + <enumerator name='BitOr' value='10'/> + <enumerator name='BitXor' value='11'/> + <enumerator name='BitAnd' value='12'/> + <enumerator name='FloorDiv' value='13'/> + </enum-decl> + <typedef-decl name='operator_ty' type-id='type-id-1052' filepath='./Include/internal/pycore_ast.h' line='27' column='1' id='type-id-637'/> + <enum-decl name='_unaryop' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-1053'> + <underlying-type type-id='type-id-32'/> + <enumerator name='Invert' value='1'/> + <enumerator name='Not' value='2'/> + <enumerator name='UAdd' value='3'/> + <enumerator name='USub' value='4'/> + </enum-decl> + <typedef-decl name='unaryop_ty' type-id='type-id-1053' filepath='./Include/internal/pycore_ast.h' line='29' column='1' id='type-id-741'/> + <typedef-decl name='comprehension_ty' type-id='type-id-1054' filepath='./Include/internal/pycore_ast.h' line='34' column='1' id='type-id-743'/> + <typedef-decl name='arguments_ty' type-id='type-id-1055' filepath='./Include/internal/pycore_ast.h' line='38' column='1' id='type-id-633'/> + <typedef-decl name='arg_ty' type-id='type-id-1056' filepath='./Include/internal/pycore_ast.h' line='40' column='1' id='type-id-683'/> + <typedef-decl name='keyword_ty' type-id='type-id-1057' filepath='./Include/internal/pycore_ast.h' line='42' column='1' id='type-id-744'/> + <class-decl name='asdl_expr_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1058' visibility='default' filepath='./Include/internal/pycore_ast.h' line='71' column='1' id='type-id-1059'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-829' visibility='default' filepath='./Include/internal/pycore_ast.h' line='73' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_expr_seq' type-id='type-id-1059' filepath='./Include/internal/pycore_ast.h' line='74' column='1' id='type-id-1058'/> + <class-decl name='asdl_comprehension_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1060' visibility='default' filepath='./Include/internal/pycore_ast.h' line='78' column='1' id='type-id-1061'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-825' visibility='default' filepath='./Include/internal/pycore_ast.h' line='80' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_comprehension_seq' type-id='type-id-1061' filepath='./Include/internal/pycore_ast.h' line='81' column='1' id='type-id-1060'/> + <class-decl name='asdl_arg_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1062' visibility='default' filepath='./Include/internal/pycore_ast.h' line='101' column='1' id='type-id-1063'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-802' visibility='default' filepath='./Include/internal/pycore_ast.h' line='103' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_arg_seq' type-id='type-id-1063' filepath='./Include/internal/pycore_ast.h' line='104' column='1' id='type-id-1062'/> + <class-decl name='asdl_keyword_seq' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1064' visibility='default' filepath='./Include/internal/pycore_ast.h' line='108' column='1' id='type-id-1065'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ast.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='elements' type-id='type-id-262' visibility='default' filepath='./Include/internal/pycore_ast.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='typed_elements' type-id='type-id-842' visibility='default' filepath='./Include/internal/pycore_ast.h' line='110' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='asdl_keyword_seq' type-id='type-id-1065' filepath='./Include/internal/pycore_ast.h' line='111' column='1' id='type-id-1064'/> + <enum-decl name='_expr_kind' filepath='./Include/internal/pycore_ast.h' line='359' column='1' id='type-id-1066'> + <underlying-type type-id='type-id-32'/> + <enumerator name='BoolOp_kind' value='1'/> + <enumerator name='NamedExpr_kind' value='2'/> + <enumerator name='BinOp_kind' value='3'/> + <enumerator name='UnaryOp_kind' value='4'/> + <enumerator name='Lambda_kind' value='5'/> + <enumerator name='IfExp_kind' value='6'/> + <enumerator name='Dict_kind' value='7'/> + <enumerator name='Set_kind' value='8'/> + <enumerator name='ListComp_kind' value='9'/> + <enumerator name='SetComp_kind' value='10'/> + <enumerator name='DictComp_kind' value='11'/> + <enumerator name='GeneratorExp_kind' value='12'/> + <enumerator name='Await_kind' value='13'/> + <enumerator name='Yield_kind' value='14'/> + <enumerator name='YieldFrom_kind' value='15'/> + <enumerator name='Compare_kind' value='16'/> + <enumerator name='Call_kind' value='17'/> + <enumerator name='FormattedValue_kind' value='18'/> + <enumerator name='JoinedStr_kind' value='19'/> + <enumerator name='Constant_kind' value='20'/> + <enumerator name='Attribute_kind' value='21'/> + <enumerator name='Subscript_kind' value='22'/> + <enumerator name='Starred_kind' value='23'/> + <enumerator name='Name_kind' value='24'/> + <enumerator name='List_kind' value='25'/> + <enumerator name='Tuple_kind' value='26'/> + <enumerator name='Slice_kind' value='27'/> + </enum-decl> + <class-decl name='_expr' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='367' column='1' id='type-id-1067'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-1066' visibility='default' filepath='./Include/internal/pycore_ast.h' line='368' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='v' type-id='type-id-1068' visibility='default' filepath='./Include/internal/pycore_ast.h' line='509' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='510' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='511' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='512' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='513' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='369' column='1' id='type-id-1068'> + <data-member access='public'> + <var-decl name='BoolOp' type-id='type-id-1069' visibility='default' filepath='./Include/internal/pycore_ast.h' line='373' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='NamedExpr' type-id='type-id-1070' visibility='default' filepath='./Include/internal/pycore_ast.h' line='378' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='BinOp' type-id='type-id-1071' visibility='default' filepath='./Include/internal/pycore_ast.h' line='384' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='UnaryOp' type-id='type-id-1072' visibility='default' filepath='./Include/internal/pycore_ast.h' line='389' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Lambda' type-id='type-id-1073' visibility='default' filepath='./Include/internal/pycore_ast.h' line='394' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='IfExp' type-id='type-id-1074' visibility='default' filepath='./Include/internal/pycore_ast.h' line='400' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Dict' type-id='type-id-1075' visibility='default' filepath='./Include/internal/pycore_ast.h' line='405' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Set' type-id='type-id-1076' visibility='default' filepath='./Include/internal/pycore_ast.h' line='409' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='ListComp' type-id='type-id-1077' visibility='default' filepath='./Include/internal/pycore_ast.h' line='414' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='SetComp' type-id='type-id-1077' visibility='default' filepath='./Include/internal/pycore_ast.h' line='419' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='DictComp' type-id='type-id-1078' visibility='default' filepath='./Include/internal/pycore_ast.h' line='425' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='GeneratorExp' type-id='type-id-1077' visibility='default' filepath='./Include/internal/pycore_ast.h' line='430' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Await' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='434' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Yield' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='438' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='YieldFrom' type-id='type-id-616' visibility='default' filepath='./Include/internal/pycore_ast.h' line='442' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Compare' type-id='type-id-1079' visibility='default' filepath='./Include/internal/pycore_ast.h' line='448' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Call' type-id='type-id-1080' visibility='default' filepath='./Include/internal/pycore_ast.h' line='454' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='FormattedValue' type-id='type-id-1081' visibility='default' filepath='./Include/internal/pycore_ast.h' line='460' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='JoinedStr' type-id='type-id-1082' visibility='default' filepath='./Include/internal/pycore_ast.h' line='464' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Constant' type-id='type-id-1083' visibility='default' filepath='./Include/internal/pycore_ast.h' line='469' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Attribute' type-id='type-id-1084' visibility='default' filepath='./Include/internal/pycore_ast.h' line='475' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Subscript' type-id='type-id-1085' visibility='default' filepath='./Include/internal/pycore_ast.h' line='481' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Starred' type-id='type-id-1086' visibility='default' filepath='./Include/internal/pycore_ast.h' line='486' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Name' type-id='type-id-1087' visibility='default' filepath='./Include/internal/pycore_ast.h' line='491' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='List' type-id='type-id-1088' visibility='default' filepath='./Include/internal/pycore_ast.h' line='496' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Tuple' type-id='type-id-1088' visibility='default' filepath='./Include/internal/pycore_ast.h' line='501' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='Slice' type-id='type-id-1089' visibility='default' filepath='./Include/internal/pycore_ast.h' line='507' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='370' column='1' id='type-id-1069'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='op' type-id='type-id-740' visibility='default' filepath='./Include/internal/pycore_ast.h' line='371' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='values' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='372' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='375' column='1' id='type-id-1070'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='376' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='377' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='380' column='1' id='type-id-1071'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='left' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='381' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='op' type-id='type-id-637' visibility='default' filepath='./Include/internal/pycore_ast.h' line='382' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='right' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='383' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='386' column='1' id='type-id-1072'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='op' type-id='type-id-741' visibility='default' filepath='./Include/internal/pycore_ast.h' line='387' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='operand' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='388' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__5' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='391' column='1' id='type-id-1073'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='args' type-id='type-id-633' visibility='default' filepath='./Include/internal/pycore_ast.h' line='392' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='body' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='393' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__6' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='396' column='1' id='type-id-1074'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='test' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='397' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='body' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='398' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='orelse' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='399' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__7' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='402' column='1' id='type-id-1075'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='keys' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='403' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='values' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='404' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__8' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='407' column='1' id='type-id-1076'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='elts' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='408' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__9' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='411' column='1' id='type-id-1077'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='elt' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='412' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='generators' type-id='type-id-742' visibility='default' filepath='./Include/internal/pycore_ast.h' line='413' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__11' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='421' column='1' id='type-id-1078'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='key' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='422' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='423' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='generators' type-id='type-id-742' visibility='default' filepath='./Include/internal/pycore_ast.h' line='424' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__13' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='432' column='1' id='type-id-616'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='433' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__16' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='444' column='1' id='type-id-1079'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='left' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='445' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ops' type-id='type-id-680' visibility='default' filepath='./Include/internal/pycore_ast.h' line='446' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='comparators' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='447' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__17' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='450' column='1' id='type-id-1080'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='451' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='args' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='452' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='keywords' type-id='type-id-636' visibility='default' filepath='./Include/internal/pycore_ast.h' line='453' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__18' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='456' column='1' id='type-id-1081'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='457' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='conversion' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='458' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='format_spec' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='459' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__19' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='462' column='1' id='type-id-1082'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='values' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='463' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__20' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='466' column='1' id='type-id-1083'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-659' visibility='default' filepath='./Include/internal/pycore_ast.h' line='467' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='kind' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='468' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__21' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='471' column='1' id='type-id-1084'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='472' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='attr' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='473' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ctx' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='474' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__22' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='477' column='1' id='type-id-1085'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='478' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='slice' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='479' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ctx' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='480' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__23' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='483' column='1' id='type-id-1086'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='484' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ctx' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='485' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__24' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='488' column='1' id='type-id-1087'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='id' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='489' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ctx' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='490' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__25' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='493' column='1' id='type-id-1088'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='elts' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='494' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ctx' type-id='type-id-682' visibility='default' filepath='./Include/internal/pycore_ast.h' line='495' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__27' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='503' column='1' id='type-id-1089'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lower' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='504' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='upper' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='505' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='step' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='506' column='1'/> + </data-member> + </class-decl> + <class-decl name='_comprehension' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='516' column='1' id='type-id-1090'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='517' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='iter' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='518' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ifs' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='519' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='is_async' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='520' column='1'/> + </data-member> + </class-decl> + <class-decl name='_arguments' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='540' column='1' id='type-id-1091'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='posonlyargs' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='541' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='args' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='542' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='vararg' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='543' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='kwonlyargs' type-id='type-id-681' visibility='default' filepath='./Include/internal/pycore_ast.h' line='544' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='kw_defaults' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='545' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='kwarg' type-id='type-id-683' visibility='default' filepath='./Include/internal/pycore_ast.h' line='546' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='defaults' type-id='type-id-610' visibility='default' filepath='./Include/internal/pycore_ast.h' line='547' column='1'/> + </data-member> + </class-decl> + <class-decl name='_arg' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='550' column='1' id='type-id-1092'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arg' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='551' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='annotation' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='552' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='type_comment' type-id='type-id-634' visibility='default' filepath='./Include/internal/pycore_ast.h' line='553' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='554' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='555' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='556' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='557' column='1'/> + </data-member> + </class-decl> + <class-decl name='_keyword' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast.h' line='560' column='1' id='type-id-1093'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arg' type-id='type-id-632' visibility='default' filepath='./Include/internal/pycore_ast.h' line='561' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='value' type-id='type-id-609' visibility='default' filepath='./Include/internal/pycore_ast.h' line='562' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='563' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='564' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='565' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast.h' line='566' column='1'/> + </data-member> + </class-decl> + <class-decl name='ast_state' size-in-bits='15616' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='16' column='1' id='type-id-1094'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='once' type-id='type-id-962' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='finalized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='AST_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='Add_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='20' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='Add_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='And_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='And_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='AnnAssign_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='Assert_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='Assign_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='AsyncFor_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='AsyncFunctionDef_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='AsyncWith_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='Attribute_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='AugAssign_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='Await_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='BinOp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='BitAnd_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='BitAnd_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='BitOr_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='BitOr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='BitXor_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='BitXor_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='BoolOp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='Break_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='Call_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='ClassDef_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='Compare_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='Constant_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='Continue_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='Del_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1920'> + <var-decl name='Del_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1984'> + <var-decl name='Delete_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='DictComp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='Dict_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='Div_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='Div_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2304'> + <var-decl name='Eq_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2368'> + <var-decl name='Eq_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='ExceptHandler_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> + <var-decl name='Expr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='Expression_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2624'> + <var-decl name='FloorDiv_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2688'> + <var-decl name='FloorDiv_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2752'> + <var-decl name='For_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='FormattedValue_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2880'> + <var-decl name='FunctionDef_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2944'> + <var-decl name='FunctionType_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3008'> + <var-decl name='GeneratorExp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3072'> + <var-decl name='Global_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3136'> + <var-decl name='GtE_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3200'> + <var-decl name='GtE_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3264'> + <var-decl name='Gt_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='Gt_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='IfExp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3456'> + <var-decl name='If_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3520'> + <var-decl name='ImportFrom_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3584'> + <var-decl name='Import_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3648'> + <var-decl name='In_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3712'> + <var-decl name='In_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3776'> + <var-decl name='Interactive_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3840'> + <var-decl name='Invert_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3904'> + <var-decl name='Invert_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3968'> + <var-decl name='IsNot_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4032'> + <var-decl name='IsNot_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='Is_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4160'> + <var-decl name='Is_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4224'> + <var-decl name='JoinedStr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4288'> + <var-decl name='LShift_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4352'> + <var-decl name='LShift_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4416'> + <var-decl name='Lambda_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4480'> + <var-decl name='ListComp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4544'> + <var-decl name='List_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4608'> + <var-decl name='Load_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4672'> + <var-decl name='Load_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4736'> + <var-decl name='LtE_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4800'> + <var-decl name='LtE_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4864'> + <var-decl name='Lt_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4928'> + <var-decl name='Lt_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4992'> + <var-decl name='MatMult_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5056'> + <var-decl name='MatMult_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='MatchAs_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5184'> + <var-decl name='MatchClass_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5248'> + <var-decl name='MatchMapping_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5312'> + <var-decl name='MatchOr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5376'> + <var-decl name='MatchSequence_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5440'> + <var-decl name='MatchSingleton_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5504'> + <var-decl name='MatchStar_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5568'> + <var-decl name='MatchValue_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5632'> + <var-decl name='Match_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5696'> + <var-decl name='Mod_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5760'> + <var-decl name='Mod_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5824'> + <var-decl name='Module_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5888'> + <var-decl name='Mult_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5952'> + <var-decl name='Mult_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6016'> + <var-decl name='Name_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6080'> + <var-decl name='NamedExpr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6144'> + <var-decl name='Nonlocal_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6208'> + <var-decl name='NotEq_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6272'> + <var-decl name='NotEq_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6336'> + <var-decl name='NotIn_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6400'> + <var-decl name='NotIn_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6464'> + <var-decl name='Not_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='119' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6528'> + <var-decl name='Not_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6592'> + <var-decl name='Or_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6656'> + <var-decl name='Or_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6720'> + <var-decl name='ParamSpec_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6784'> + <var-decl name='Pass_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6848'> + <var-decl name='Pow_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6912'> + <var-decl name='Pow_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='126' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6976'> + <var-decl name='RShift_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='127' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7040'> + <var-decl name='RShift_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7104'> + <var-decl name='Raise_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7168'> + <var-decl name='Return_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7232'> + <var-decl name='SetComp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7296'> + <var-decl name='Set_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7360'> + <var-decl name='Slice_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7424'> + <var-decl name='Starred_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='134' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7488'> + <var-decl name='Store_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7552'> + <var-decl name='Store_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='136' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7616'> + <var-decl name='Sub_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='137' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7680'> + <var-decl name='Sub_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7744'> + <var-decl name='Subscript_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='139' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7808'> + <var-decl name='TryStar_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7872'> + <var-decl name='Try_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7936'> + <var-decl name='Tuple_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='142' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8000'> + <var-decl name='TypeAlias_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='143' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8064'> + <var-decl name='TypeIgnore_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8128'> + <var-decl name='TypeVarTuple_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8192'> + <var-decl name='TypeVar_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8256'> + <var-decl name='UAdd_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8320'> + <var-decl name='UAdd_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='148' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8384'> + <var-decl name='USub_singleton' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='149' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8448'> + <var-decl name='USub_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8512'> + <var-decl name='UnaryOp_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8576'> + <var-decl name='While_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='152' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8640'> + <var-decl name='With_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8704'> + <var-decl name='YieldFrom_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='154' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8768'> + <var-decl name='Yield_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8832'> + <var-decl name='__dict__' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8896'> + <var-decl name='__doc__' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8960'> + <var-decl name='__match_args__' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9024'> + <var-decl name='__module__' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='159' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9088'> + <var-decl name='_attributes' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9152'> + <var-decl name='_fields' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9216'> + <var-decl name='alias_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9280'> + <var-decl name='annotation' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='163' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9344'> + <var-decl name='arg' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9408'> + <var-decl name='arg_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='165' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9472'> + <var-decl name='args' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='166' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9536'> + <var-decl name='argtypes' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='167' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9600'> + <var-decl name='arguments_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='168' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9664'> + <var-decl name='asname' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='169' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9728'> + <var-decl name='ast' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='170' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9792'> + <var-decl name='attr' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9856'> + <var-decl name='bases' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='172' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9920'> + <var-decl name='body' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9984'> + <var-decl name='boolop_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='174' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10048'> + <var-decl name='bound' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='175' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10112'> + <var-decl name='cases' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='176' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10176'> + <var-decl name='cause' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='177' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10240'> + <var-decl name='cls' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='178' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10304'> + <var-decl name='cmpop_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='179' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10368'> + <var-decl name='col_offset' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10432'> + <var-decl name='comparators' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='181' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10496'> + <var-decl name='comprehension_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='182' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10560'> + <var-decl name='context_expr' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='183' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10624'> + <var-decl name='conversion' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='184' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10688'> + <var-decl name='ctx' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='185' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10752'> + <var-decl name='decorator_list' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='186' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10816'> + <var-decl name='default_value' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='187' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10880'> + <var-decl name='defaults' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='188' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10944'> + <var-decl name='elt' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='189' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11008'> + <var-decl name='elts' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='190' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11072'> + <var-decl name='end_col_offset' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='191' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11136'> + <var-decl name='end_lineno' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11200'> + <var-decl name='exc' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='193' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11264'> + <var-decl name='excepthandler_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='194' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11328'> + <var-decl name='expr_context_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='195' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11392'> + <var-decl name='expr_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11456'> + <var-decl name='finalbody' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11520'> + <var-decl name='format_spec' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='198' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11584'> + <var-decl name='func' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11648'> + <var-decl name='generators' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11712'> + <var-decl name='guard' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='201' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11776'> + <var-decl name='handlers' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='202' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11840'> + <var-decl name='id' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11904'> + <var-decl name='ifs' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11968'> + <var-decl name='is_async' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='205' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12032'> + <var-decl name='items' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='206' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12096'> + <var-decl name='iter' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='207' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12160'> + <var-decl name='key' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='208' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12224'> + <var-decl name='keys' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='209' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12288'> + <var-decl name='keyword_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='210' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12352'> + <var-decl name='keywords' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12416'> + <var-decl name='kind' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='212' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12480'> + <var-decl name='kw_defaults' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='213' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12544'> + <var-decl name='kwarg' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='214' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12608'> + <var-decl name='kwd_attrs' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='215' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12672'> + <var-decl name='kwd_patterns' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='216' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12736'> + <var-decl name='kwonlyargs' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='217' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12800'> + <var-decl name='left' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='218' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12864'> + <var-decl name='level' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='219' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12928'> + <var-decl name='lineno' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='220' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12992'> + <var-decl name='lower' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='221' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13056'> + <var-decl name='match_case_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13120'> + <var-decl name='mod_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='223' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13184'> + <var-decl name='module' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='224' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13248'> + <var-decl name='msg' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='225' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13312'> + <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='226' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13376'> + <var-decl name='names' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='227' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13440'> + <var-decl name='op' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='228' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13504'> + <var-decl name='operand' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='229' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13568'> + <var-decl name='operator_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='230' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13632'> + <var-decl name='ops' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='231' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13696'> + <var-decl name='optional_vars' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='232' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13760'> + <var-decl name='orelse' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='233' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13824'> + <var-decl name='pattern' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='234' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13888'> + <var-decl name='pattern_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='235' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13952'> + <var-decl name='patterns' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='236' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14016'> + <var-decl name='posonlyargs' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='237' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14080'> + <var-decl name='rest' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='238' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14144'> + <var-decl name='returns' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='239' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14208'> + <var-decl name='right' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='240' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14272'> + <var-decl name='simple' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='241' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14336'> + <var-decl name='slice' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='242' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14400'> + <var-decl name='step' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='243' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14464'> + <var-decl name='stmt_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='244' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14528'> + <var-decl name='subject' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='245' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14592'> + <var-decl name='tag' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14656'> + <var-decl name='target' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='247' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14720'> + <var-decl name='targets' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14784'> + <var-decl name='test' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='249' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14848'> + <var-decl name='type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='250' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14912'> + <var-decl name='type_comment' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='251' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14976'> + <var-decl name='type_ignore_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='252' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15040'> + <var-decl name='type_ignores' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='253' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15104'> + <var-decl name='type_param_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='254' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15168'> + <var-decl name='type_params' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='255' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15232'> + <var-decl name='unaryop_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15296'> + <var-decl name='upper' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15360'> + <var-decl name='value' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='258' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15424'> + <var-decl name='values' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='259' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15488'> + <var-decl name='vararg' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='260' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15552'> + <var-decl name='withitem_type' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_ast_state.h' line='261' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='atexit_callbackfunc' type-id='type-id-233' filepath='./Include/internal/pycore_atexit.h' line='18' column='1' id='type-id-803'/> + <class-decl name='_atexit_runtime_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='20' column='1' id='type-id-1095'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='callbacks' type-id='type-id-804' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='ncallbacks' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='24' column='1'/> + </data-member> + </class-decl> + <class-decl name='atexit_callback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='33' column='1' id='type-id-1096'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-29' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='data' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='next' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='36' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='atexit_callback' type-id='type-id-1096' filepath='./Include/internal/pycore_atexit.h' line='37' column='1' id='type-id-1098'/> + <class-decl name='atexit_py_callback' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1099' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='39' column='1' id='type-id-1100'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='args' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='kwargs' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='42' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='atexit_py_callback' type-id='type-id-1100' filepath='./Include/internal/pycore_atexit.h' line='43' column='1' id='type-id-1099'/> + <class-decl name='atexit_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='45' column='1' id='type-id-1101'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ll_callbacks' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='last_ll_callback' type-id='type-id-1097' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='callbacks' type-id='type-id-1102' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ncallbacks' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='callback_len' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_atexit.h' line='54' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_BackoffCounter' size-in-bits='16' is-struct='yes' naming-typedef-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='17' column='1' id='type-id-1104'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='' type-id='type-id-1105' visibility='default'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__3' size-in-bits='16' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='18' column='1' id='type-id-1105'> + <data-member access='public'> + <var-decl name='' type-id='type-id-1106' visibility='default'/> + </data-member> + <data-member access='public'> + <var-decl name='as_counter' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='23' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__31' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='19' column='1' id='type-id-1106'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='backoff' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='20' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4'> + <var-decl name='value' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_backoff.h' line='21' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_BackoffCounter' type-id='type-id-1104' filepath='./Include/internal/pycore_backoff.h' line='25' column='1' id='type-id-1103'/> + <typedef-decl name='_Py_pending_call_func' type-id='type-id-249' filepath='./Include/internal/pycore_ceval_state.h' line='15' column='1' id='type-id-1107'/> + <class-decl name='_pending_call' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='17' column='1' id='type-id-789'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-1107' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='arg' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='20' column='1'/> + </data-member> + </class-decl> + <class-decl name='_pending_calls' size-in-bits='57856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='43' column='1' id='type-id-1108'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='handling_thread' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='npending' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='max' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='maxloop' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='calls' type-id='type-id-790' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='57792'> + <var-decl name='first' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='57824'> + <var-decl name='next' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='59' column='1'/> + </data-member> + </class-decl> + <enum-decl name='perf_status_t' naming-typedef-id='type-id-1110' filepath='./Include/internal/pycore_ceval_state.h' line='63' column='1' id='type-id-1111'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PERF_STATUS_FAILED' value='-1'/> + <enumerator name='PERF_STATUS_NO_INIT' value='0'/> + <enumerator name='PERF_STATUS_OK' value='1'/> + </enum-decl> + <typedef-decl name='perf_status_t' type-id='type-id-1111' filepath='./Include/internal/pycore_ceval_state.h' line='67' column='1' id='type-id-1110'/> + <class-decl name='trampoline_api_st' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='72' column='1' id='type-id-1112'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='init_state' type-id='type-id-1113' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='write_state' type-id='type-id-1114' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='free_state' type-id='type-id-249' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='state' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='code_padding' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='78' column='1'/> + </data-member> + </class-decl> + <class-decl name='_ceval_runtime_state' size-in-bits='58560' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='83' column='1' id='type-id-1115'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='perf' type-id='type-id-1116' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='pending_mainthread' type-id='type-id-1108' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58496'> + <var-decl name='sys_trace_profile_mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='103' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__39' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='84' column='1' id='type-id-1116'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='status' type-id='type-id-1110' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='perf_trampoline_type' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='extra_code_index' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='code_arena' type-id='type-id-1117' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='trampoline_api' type-id='type-id-1112' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='map_file' type-id='type-id-56' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='persist_after_fork' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='92' column='1'/> + </data-member> + </class-decl> + <class-decl name='_ceval_state' size-in-bits='58112' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='119' column='1' id='type-id-1118'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='instrumentation_version' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='recursion_limit' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='gil' type-id='type-id-1119' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='own_gil' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='126' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pending' type-id='type-id-1108' visibility='default' filepath='./Include/internal/pycore_ceval_state.h' line='127' column='1'/> + </data-member> + </class-decl> + <union-decl name='_Py_CODEUNIT' size-in-bits='16' naming-typedef-id='type-id-1120' visibility='default' filepath='./Include/internal/pycore_code.h' line='24' column='1' id='type-id-1121'> + <data-member access='public'> + <var-decl name='cache' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_code.h' line='25' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='op' type-id='type-id-1122' visibility='default' filepath='./Include/internal/pycore_code.h' line='29' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='counter' type-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_code.h' line='30' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__29' size-in-bits='16' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='26' column='1' id='type-id-1122'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='code' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_code.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='arg' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_code.h' line='28' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_CODEUNIT' type-id='type-id-1121' filepath='./Include/internal/pycore_code.h' line='31' column='1' id='type-id-1120'/> + <class-decl name='_py_code_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='68' column='1' id='type-id-1123'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_code.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='constants' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_code.h' line='71' column='1'/> + </data-member> + </class-decl> + <class-decl name='callable_cache' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='191' column='1' id='type-id-1124'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='isinstance' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='len' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='193' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='list_append' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='194' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='object__getattribute__' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='195' column='1'/> + </data-member> + </class-decl> + <class-decl name='codecs_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_codecs.h' line='63' column='1' id='type-id-1125'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='search_path' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_codecs.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='search_cache' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_codecs.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='error_registry' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_codecs.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_codecs.h' line='80' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyContextTokenMissing' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1126' visibility='default' filepath='./Include/internal/pycore_context.h' line='21' column='1' id='type-id-1127'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_context.h' line='22' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyContextTokenMissing' type-id='type-id-1127' filepath='./Include/internal/pycore_context.h' line='23' column='1' id='type-id-1126'/> + <class-decl name='_pycontextobject' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_context.h' line='25' column='1' id='type-id-931'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_context.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ctx_prev' type-id='type-id-1128' visibility='default' filepath='./Include/internal/pycore_context.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ctx_vars' type-id='type-id-1129' visibility='default' filepath='./Include/internal/pycore_context.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ctx_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_context.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ctx_entered' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_context.h' line='30' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyCrossInterpreterData' type-id='type-id-1130' filepath='./Include/internal/pycore_crossinterp.h' line='41' column='1' id='type-id-1131'/> + <typedef-decl name='xid_newobjectfunc' type-id='type-id-1132' filepath='./Include/internal/pycore_crossinterp.h' line='42' column='1' id='type-id-1133'/> + <typedef-decl name='xid_freefunc' type-id='type-id-510' filepath='./Include/internal/pycore_crossinterp.h' line='43' column='1' id='type-id-1134'/> + <class-decl name='_xid' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='48' column='1' id='type-id-1130'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='data' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='obj' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='interpid' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='new_object' type-id='type-id-1133' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='free' type-id='type-id-1134' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='84' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='crossinterpdatafunc' type-id='type-id-1135' filepath='./Include/internal/pycore_crossinterp.h' line='144' column='1' id='type-id-1136'/> + <class-decl name='_xidregitem' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='149' column='1' id='type-id-1137'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='prev' type-id='type-id-1138' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='next' type-id='type-id-1138' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='cls' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='weakref' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='refcount' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='getdata' type-id='type-id-1136' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='157' column='1'/> + </data-member> + </class-decl> + <class-decl name='_xidregistry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='160' column='1' id='type-id-1139'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='global' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='163' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='head' type-id='type-id-1138' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='164' column='1'/> + </data-member> + </class-decl> + <class-decl name='_xi_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='176' column='1' id='type-id-1140'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='registry' type-id='type-id-1139' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='179' column='1'/> + </data-member> + </class-decl> + <class-decl name='_xi_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='182' column='1' id='type-id-1141'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='registry' type-id='type-id-1139' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='185' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='PyExc_NotShareableError' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='188' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_dict_state' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='14' column='1' id='type-id-1142'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='global_version' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='next_keys_version' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='watchers' type-id='type-id-753' visibility='default' filepath='./Include/internal/pycore_dict_state.h' line='20' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='ULong' type-id='type-id-326' filepath='./Include/internal/pycore_dtoa.h' line='14' column='1' id='type-id-767'/> + <class-decl name='Bigint' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='17' column='1' id='type-id-1143'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-747' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='k' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='maxwds' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='sign' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='wds' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='19' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='x' type-id='type-id-768' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='20' column='1'/> + </data-member> + </class-decl> + <class-decl name='_dtoa_state' size-in-bits='19520' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='45' column='1' id='type-id-1144'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='p5s' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='freelist' type-id='type-id-748' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='preallocated' type-id='type-id-827' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='19456'> + <var-decl name='preallocated_next' type-id='type-id-180' visibility='default' filepath='./Include/internal/pycore_dtoa.h' line='52' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_exc_state' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='22' column='1' id='type-id-1145'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='errnomap' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='memerrors_freelist' type-id='type-id-1146' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='memerrors_numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='PyExc_ExceptionGroup' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_exceptions.h' line='28' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_sighandler_t' type-id='type-id-1147' filepath='./Include/internal/pycore_faulthandler.h' line='30' column='1' id='type-id-1148'/> + <class-decl name='faulthandler_user_signal' size-in-bits='1536' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='37' column='1' id='type-id-1149'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='enabled' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='file' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='all_threads' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='chain' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='previous' type-id='type-id-1148' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='interp' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='44' column='1'/> + </data-member> + </class-decl> + <class-decl name='_faulthandler_runtime_state' size-in-bits='1344' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='49' column='1' id='type-id-1150'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fatal_error' type-id='type-id-1151' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='thread' type-id='type-id-1152' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='user_signals' type-id='type-id-1153' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='stack' type-id='type-id-45' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='old_stack' type-id='type-id-45' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='84' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__41' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='50' column='1' id='type-id-1151'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='enabled' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='file' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='all_threads' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='interp' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='55' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__42' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='61' column='1' id='type-id-1152'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='file' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='timeout_us' type-id='type-id-377' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='repeat' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='interp' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='exit' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='header' type-id='type-id-17' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='header_len' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='cancel_event' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='running' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_faulthandler.h' line='75' column='1'/> + </data-member> + </class-decl> + <class-decl name='_fileutils_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='22' column='1' id='type-id-1155'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='force_ascii' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='23' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_Py_error_handler' naming-typedef-id='type-id-542' filepath='./Include/internal/pycore_fileutils.h' line='26' column='1' id='type-id-1156'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_ERROR_UNKNOWN' value='0'/> + <enumerator name='_Py_ERROR_STRICT' value='1'/> + <enumerator name='_Py_ERROR_SURROGATEESCAPE' value='2'/> + <enumerator name='_Py_ERROR_REPLACE' value='3'/> + <enumerator name='_Py_ERROR_IGNORE' value='4'/> + <enumerator name='_Py_ERROR_BACKSLASHREPLACE' value='5'/> + <enumerator name='_Py_ERROR_SURROGATEPASS' value='6'/> + <enumerator name='_Py_ERROR_XMLCHARREFREPLACE' value='7'/> + <enumerator name='_Py_ERROR_OTHER' value='8'/> + </enum-decl> + <typedef-decl name='_Py_error_handler' type-id='type-id-1156' filepath='./Include/internal/pycore_fileutils.h' line='36' column='1' id='type-id-542'/> + <enum-decl name='_py_float_format_type' filepath='./Include/internal/pycore_floatobject.h' line='23' column='1' id='type-id-1157'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_py_float_format_unknown' value='0'/> + <enumerator name='_py_float_format_ieee_big_endian' value='1'/> + <enumerator name='_py_float_format_ieee_little_endian' value='2'/> + </enum-decl> + <class-decl name='_Py_float_runtime_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='29' column='1' id='type-id-1158'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='float_format' type-id='type-id-1157' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='double_format' type-id='type-id-1157' visibility='default' filepath='./Include/internal/pycore_floatobject.h' line='31' column='1'/> + </data-member> + </class-decl> + <class-decl name='_frame' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='20' column='1' id='type-id-1159'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_frame.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='f_back' type-id='type-id-351' visibility='default' filepath='./Include/internal/pycore_frame.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='f_frame' type-id='type-id-367' visibility='default' filepath='./Include/internal/pycore_frame.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='f_trace' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='f_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_frame.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='f_trace_lines' type-id='type-id-53' visibility='default' filepath='./Include/internal/pycore_frame.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='360'> + <var-decl name='f_trace_opcodes' type-id='type-id-53' visibility='default' filepath='./Include/internal/pycore_frame.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='f_extra_locals' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='f_locals_cache' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_f_frame_data' type-id='type-id-359' visibility='default' filepath='./Include/internal/pycore_frame.h' line='34' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyInterpreterFrame' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_frame.h' line='61' column='1' id='type-id-362'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='f_executable' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='previous' type-id='type-id-367' visibility='default' filepath='./Include/internal/pycore_frame.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='f_funcobj' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='f_globals' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='f_builtins' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='f_locals' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_frame.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='frame_obj' type-id='type-id-351' visibility='default' filepath='./Include/internal/pycore_frame.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='instr_ptr' type-id='type-id-1160' visibility='default' filepath='./Include/internal/pycore_frame.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='stacktop' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_frame.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='544'> + <var-decl name='return_offset' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_frame.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='560'> + <var-decl name='owner' type-id='type-id-53' visibility='default' filepath='./Include/internal/pycore_frame.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='localsplus' type-id='type-id-359' visibility='default' filepath='./Include/internal/pycore_frame.h' line='74' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_list_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='36' column='1' id='type-id-406'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-755' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='39' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_tuple_freelist' size-in-bits='1920' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='43' column='1' id='type-id-405'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-764' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='numfree' type-id='type-id-839' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='54' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_float_freelist' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='60' column='1' id='type-id-404'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='items' type-id='type-id-1161' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='66' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_dict_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='70' column='1' id='type-id-407'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-752' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='74' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_dictkeys_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='78' column='1' id='type-id-408'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-414' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='82' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_slice_freelist' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='86' column='1' id='type-id-409'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='slice_cache' type-id='type-id-514' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='90' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_context_freelist' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='94' column='1' id='type-id-410'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-1128' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='98' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_async_gen_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='102' column='1' id='type-id-411'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-770' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='109' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_async_gen_asend_freelist' size-in-bits='5184' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='113' column='1' id='type-id-412'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-750' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='numfree' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='116' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_object_stack_freelist' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='122' column='1' id='type-id-413'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-1162' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='numfree' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='124' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_object_freelists' size-in-bits='28288' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='127' column='1' id='type-id-398'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='floats' type-id='type-id-404' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tuples' type-id='type-id-405' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2048'> + <var-decl name='lists' type-id='type-id-406' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7232'> + <var-decl name='dicts' type-id='type-id-407' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12416'> + <var-decl name='dictkeys' type-id='type-id-408' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17600'> + <var-decl name='slices' type-id='type-id-409' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17664'> + <var-decl name='contexts' type-id='type-id-410' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='134' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17792'> + <var-decl name='async_gens' type-id='type-id-411' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22976'> + <var-decl name='async_gen_asends' type-id='type-id-412' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='136' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='28160'> + <var-decl name='object_stacks' type-id='type-id-413' visibility='default' filepath='./Include/internal/pycore_freelist.h' line='137' column='1'/> + </data-member> + </class-decl> + <class-decl name='_func_version_cache_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_function.h' line='23' column='1' id='type-id-786'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-308' visibility='default' filepath='./Include/internal/pycore_function.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='code' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_function.h' line='25' column='1'/> + </data-member> + </class-decl> + <class-decl name='_py_func_state' size-in-bits='524352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_function.h' line='28' column='1' id='type-id-1163'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next_version' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_function.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='func_version_cache' type-id='type-id-787' visibility='default' filepath='./Include/internal/pycore_function.h' line='39' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyGC_Head' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_gc.h' line='14' column='1' id='type-id-1165'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_gc_next' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_gc.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_gc_prev' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_gc.h' line='21' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyGC_Head' type-id='type-id-1165' filepath='./Include/internal/pycore_gc.h' line='22' column='1' id='type-id-1164'/> + <class-decl name='gc_generation' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='265' column='1' id='type-id-832'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='head' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_gc.h' line='266' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='threshold' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='count' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='268' column='1'/> + </data-member> + </class-decl> + <class-decl name='gc_generation_stats' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='273' column='1' id='type-id-835'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='collections' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_gc.h' line='275' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='collected' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_gc.h' line='277' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uncollectable' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_gc.h' line='279' column='1'/> + </data-member> + </class-decl> + <class-decl name='_gc_runtime_state' size-in-bits='1920' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gc.h' line='282' column='1' id='type-id-1166'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='trash_delete_later' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_gc.h' line='285' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='trash_delete_nesting' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='287' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='enabled' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='290' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='debug' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='291' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='generations' type-id='type-id-833' visibility='default' filepath='./Include/internal/pycore_gc.h' line='293' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='generation0' type-id='type-id-1167' visibility='default' filepath='./Include/internal/pycore_gc.h' line='294' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='permanent_generation' type-id='type-id-832' visibility='default' filepath='./Include/internal/pycore_gc.h' line='296' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='generation_stats' type-id='type-id-836' visibility='default' filepath='./Include/internal/pycore_gc.h' line='297' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='collecting' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gc.h' line='299' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1664'> + <var-decl name='garbage' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_gc.h' line='301' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='callbacks' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_gc.h' line='303' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='long_lived_total' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_gc.h' line='311' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1856'> + <var-decl name='long_lived_pending' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_gc.h' line='315' column='1'/> + </data-member> + </class-decl> + <class-decl name='_gil_runtime_state' size-in-bits='1664' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_gil.h' line='22' column='1' id='type-id-1168'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='interval' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_gil.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='last_holder' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_gil.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='locked' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_gil.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='switch_number' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_gil.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='cond' type-id='type-id-1169' visibility='default' filepath='./Include/internal/pycore_gil.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='mutex' type-id='type-id-1170' visibility='default' filepath='./Include/internal/pycore_gil.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='switch_cond' type-id='type-id-1169' visibility='default' filepath='./Include/internal/pycore_gil.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='switch_mutex' type-id='type-id-1170' visibility='default' filepath='./Include/internal/pycore_gil.h' line='59' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_cached_objects' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='32' column='1' id='type-id-1171'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='interned_strings' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='34' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_static_objects' size-in-bits='596480' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='37' column='1' id='type-id-1172'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='singletons' type-id='type-id-1173' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='60' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__55' size-in-bits='596480' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='38' column='1' id='type-id-1173'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='small_ints' type-id='type-id-756' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67072'> + <var-decl name='bytes_empty' type-id='type-id-907' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67392'> + <var-decl name='bytes_characters' type-id='type-id-783' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='165696'> + <var-decl name='strings' type-id='type-id-1174' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='595520'> + <var-decl name='_tuple_empty_gc_not_used' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='595648'> + <var-decl name='tuple_empty' type-id='type-id-1035' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='595904'> + <var-decl name='_hamt_bitmap_node_empty_gc_not_used' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='596032'> + <var-decl name='hamt_bitmap_node_empty' type-id='type-id-1175' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='596352'> + <var-decl name='context_token_missing' type-id='type-id-1126' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='59' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__56' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='47' column='1' id='type-id-782'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob' type-id='type-id-907' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='eos' type-id='type-id-53' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='49' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_interp_cached_objects' size-in-bits='1280' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='66' column='1' id='type-id-1176'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='interned_strings' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_unused_str_replace_inf' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='objreduce' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='type_slots_pname' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='type_slots_ptrs' type-id='type-id-850' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='generic_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='typevar_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='typevartuple_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='paramspec_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='paramspecargs_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='paramspeckwargs_type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='83' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_interp_static_objects' size-in-bits='1088' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='91' column='1' id='type-id-1177'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='singletons' type-id='type-id-1178' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='98' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__805' size-in-bits='1088' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='92' column='1' id='type-id-1178'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_not_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_hamt_empty_gc_not_used' type-id='type-id-1164' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='hamt_empty' type-id='type-id-1179' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='last_resort_memory_error' type-id='type-id-1015' visibility='default' filepath='./Include/internal/pycore_global_objects.h' line='97' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_global_strings' size-in-bits='429824' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='29' column='1' id='type-id-1174'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='literals' type-id='type-id-1180' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9472'> + <var-decl name='identifiers' type-id='type-id-1181' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='774' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='315136'> + <var-decl name='ascii' type-id='type-id-776' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='778' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='364288'> + <var-decl name='latin1' type-id='type-id-778' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='782' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__57' size-in-bits='9472' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='30' column='1' id='type-id-1180'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_py_anon_dictcomp' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_py_anon_genexpr' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_py_anon_lambda' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_py_anon_listcomp' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='_py_anon_module' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='_py_anon_null' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2624'> + <var-decl name='_py_anon_setcomp' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3072'> + <var-decl name='_py_anon_string' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3520'> + <var-decl name='_py_anon_unknown' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3968'> + <var-decl name='_py_dbl_close_br' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4352'> + <var-decl name='_py_dbl_open_br' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4736'> + <var-decl name='_py_dbl_percent' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5120'> + <var-decl name='_py_defaults' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5568'> + <var-decl name='_py_dot_locals' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6016'> + <var-decl name='_py_empty' type-id='type-id-1187' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6400'> + <var-decl name='_py_generic_base' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6848'> + <var-decl name='_py_json_decoder' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7296'> + <var-decl name='_py_kwdefaults' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7744'> + <var-decl name='_py_list_err' type-id='type-id-1191' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8256'> + <var-decl name='_py_str_replace_inf' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8640'> + <var-decl name='_py_type_params' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9088'> + <var-decl name='_py_utf_8' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='52' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__58' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1' id='type-id-1182'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-861' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='31' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__60' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1' id='type-id-1183'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-860' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='32' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__61' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1' id='type-id-1184'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-903' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='33' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__64' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1' id='type-id-1185'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-900' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='36' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__68' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1' id='type-id-1186'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-895' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='40' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__73' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1' id='type-id-1187'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-877' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='45' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__74' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1' id='type-id-1188'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-867' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='46' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__75' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1' id='type-id-1189'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-865' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='47' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__76' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1' id='type-id-1190'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-863' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='48' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__77' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1' id='type-id-1191'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-885' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='49' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__78' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1' id='type-id-1192'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-899' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='50' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__81' size-in-bits='305664' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='55' column='1' id='type-id-1181'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_py_CANCELLED' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_py_FINISHED' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_py_False' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_py_JSONDecodeError' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1728'> + <var-decl name='_py_PENDING' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2112'> + <var-decl name='_py_Py_Repr' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> + <var-decl name='_py_TextIOWrapper' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2944'> + <var-decl name='_py_True' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3328'> + <var-decl name='_py_WarningMessage' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3776'> + <var-decl name='_py__WindowsConsoleIO' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4288'> + <var-decl name='_py___IOBase_closed' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4736'> + <var-decl name='_py___abc_tpflags__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5184'> + <var-decl name='_py___abs__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5568'> + <var-decl name='_py___abstractmethods__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6080'> + <var-decl name='_py___add__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6464'> + <var-decl name='_py___aenter__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='6912'> + <var-decl name='_py___aexit__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7360'> + <var-decl name='_py___aiter__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='7808'> + <var-decl name='_py___all__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8192'> + <var-decl name='_py___and__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8576'> + <var-decl name='_py___anext__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9024'> + <var-decl name='_py___annotations__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9472'> + <var-decl name='_py___args__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='9920'> + <var-decl name='_py___await__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10368'> + <var-decl name='_py___bases__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='10816'> + <var-decl name='_py___bool__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11264'> + <var-decl name='_py___buffer__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='11712'> + <var-decl name='_py___build_class__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12160'> + <var-decl name='_py___builtins__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12608'> + <var-decl name='_py___bytes__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13056'> + <var-decl name='_py___call__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13504'> + <var-decl name='_py___cantrace__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='87' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='13952'> + <var-decl name='_py___class__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14400'> + <var-decl name='_py___class_getitem__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14912'> + <var-decl name='_py___classcell__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15360'> + <var-decl name='_py___classdict__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='15808'> + <var-decl name='_py___classdictcell__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16320'> + <var-decl name='_py___complex__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16768'> + <var-decl name='_py___contains__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17216'> + <var-decl name='_py___copy__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17664'> + <var-decl name='_py___ctypes_from_outparam__' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18240'> + <var-decl name='_py___del__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18624'> + <var-decl name='_py___delattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='19072'> + <var-decl name='_py___delete__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='19520'> + <var-decl name='_py___delitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='19968'> + <var-decl name='_py___dict__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='20416'> + <var-decl name='_py___dictoffset__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='20864'> + <var-decl name='_py___dir__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21248'> + <var-decl name='_py___divmod__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21696'> + <var-decl name='_py___doc__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22080'> + <var-decl name='_py___enter__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22528'> + <var-decl name='_py___eq__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22912'> + <var-decl name='_py___exit__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='23360'> + <var-decl name='_py___file__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='23808'> + <var-decl name='_py___firstlineno__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24256'> + <var-decl name='_py___float__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24704'> + <var-decl name='_py___floordiv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='25152'> + <var-decl name='_py___format__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='25600'> + <var-decl name='_py___fspath__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='26048'> + <var-decl name='_py___ge__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='26432'> + <var-decl name='_py___get__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='26816'> + <var-decl name='_py___getattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='27264'> + <var-decl name='_py___getattribute__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='27776'> + <var-decl name='_py___getinitargs__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='119' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='28224'> + <var-decl name='_py___getitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='28672'> + <var-decl name='_py___getnewargs__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='29120'> + <var-decl name='_py___getnewargs_ex__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='29632'> + <var-decl name='_py___getstate__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='30080'> + <var-decl name='_py___gt__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='30464'> + <var-decl name='_py___hash__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='30912'> + <var-decl name='_py___iadd__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='126' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='31360'> + <var-decl name='_py___iand__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='127' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='31808'> + <var-decl name='_py___ifloordiv__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32256'> + <var-decl name='_py___ilshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32704'> + <var-decl name='_py___imatmul__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33152'> + <var-decl name='_py___imod__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='33600'> + <var-decl name='_py___import__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='34048'> + <var-decl name='_py___imul__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='34496'> + <var-decl name='_py___index__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='134' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='34944'> + <var-decl name='_py___init__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='35392'> + <var-decl name='_py___init_subclass__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='136' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='35904'> + <var-decl name='_py___instancecheck__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='137' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='36416'> + <var-decl name='_py___int__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='138' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='36800'> + <var-decl name='_py___invert__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='139' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='37248'> + <var-decl name='_py___ior__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='140' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='37632'> + <var-decl name='_py___ipow__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='38080'> + <var-decl name='_py___irshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='142' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='38528'> + <var-decl name='_py___isabstractmethod__' type-id='type-id-1201' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='39040'> + <var-decl name='_py___isub__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='39488'> + <var-decl name='_py___iter__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='145' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='39936'> + <var-decl name='_py___itruediv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='40384'> + <var-decl name='_py___ixor__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='147' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='40832'> + <var-decl name='_py___le__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='148' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='41216'> + <var-decl name='_py___len__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='149' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='41600'> + <var-decl name='_py___length_hint__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='42048'> + <var-decl name='_py___lltrace__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='42496'> + <var-decl name='_py___loader__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='152' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='42944'> + <var-decl name='_py___lshift__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='43392'> + <var-decl name='_py___lt__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='154' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='43776'> + <var-decl name='_py___main__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='44224'> + <var-decl name='_py___match_args__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='44672'> + <var-decl name='_py___matmul__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='45120'> + <var-decl name='_py___missing__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='45568'> + <var-decl name='_py___mod__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='159' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='45952'> + <var-decl name='_py___module__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='46400'> + <var-decl name='_py___mro_entries__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='161' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='46848'> + <var-decl name='_py___mul__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='162' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='47232'> + <var-decl name='_py___name__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='163' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='47680'> + <var-decl name='_py___ne__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48064'> + <var-decl name='_py___neg__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='165' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48448'> + <var-decl name='_py___new__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='166' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='48832'> + <var-decl name='_py___newobj__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='167' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='49280'> + <var-decl name='_py___newobj_ex__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='168' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='49728'> + <var-decl name='_py___next__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='169' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='50176'> + <var-decl name='_py___notes__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='170' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='50624'> + <var-decl name='_py___or__' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='51008'> + <var-decl name='_py___orig_class__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='172' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='51456'> + <var-decl name='_py___origin__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='51904'> + <var-decl name='_py___package__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='174' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='52352'> + <var-decl name='_py___parameters__' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='175' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='52800'> + <var-decl name='_py___path__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='176' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='53248'> + <var-decl name='_py___pos__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='177' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='53632'> + <var-decl name='_py___pow__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='178' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='54016'> + <var-decl name='_py___prepare__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='179' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='54464'> + <var-decl name='_py___qualname__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='54912'> + <var-decl name='_py___radd__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='181' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='55360'> + <var-decl name='_py___rand__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='182' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='55808'> + <var-decl name='_py___rdivmod__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='183' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='56256'> + <var-decl name='_py___reduce__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='184' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='56704'> + <var-decl name='_py___reduce_ex__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='185' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='57152'> + <var-decl name='_py___release_buffer__' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='57664'> + <var-decl name='_py___repr__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='187' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58112'> + <var-decl name='_py___reversed__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='188' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58560'> + <var-decl name='_py___rfloordiv__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='189' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59008'> + <var-decl name='_py___rlshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='190' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59456'> + <var-decl name='_py___rmatmul__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='191' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59904'> + <var-decl name='_py___rmod__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='60352'> + <var-decl name='_py___rmul__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='193' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='60800'> + <var-decl name='_py___ror__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='194' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='61184'> + <var-decl name='_py___round__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='195' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='61632'> + <var-decl name='_py___rpow__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='62080'> + <var-decl name='_py___rrshift__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='62528'> + <var-decl name='_py___rshift__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='198' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='62976'> + <var-decl name='_py___rsub__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='63424'> + <var-decl name='_py___rtruediv__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='200' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='63872'> + <var-decl name='_py___rxor__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='201' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64320'> + <var-decl name='_py___set__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='202' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64704'> + <var-decl name='_py___set_name__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='65152'> + <var-decl name='_py___setattr__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='65600'> + <var-decl name='_py___setitem__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='205' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='66048'> + <var-decl name='_py___setstate__' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='206' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='66496'> + <var-decl name='_py___sizeof__' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='207' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='66944'> + <var-decl name='_py___slotnames__' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='208' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67392'> + <var-decl name='_py___slots__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='209' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67840'> + <var-decl name='_py___spec__' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='210' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='68288'> + <var-decl name='_py___static_attributes__' type-id='type-id-1203' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='68800'> + <var-decl name='_py___str__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='212' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='69184'> + <var-decl name='_py___sub__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='213' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='69568'> + <var-decl name='_py___subclasscheck__' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='214' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='70080'> + <var-decl name='_py___subclasshook__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='215' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='70592'> + <var-decl name='_py___truediv__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='216' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='71040'> + <var-decl name='_py___trunc__' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='217' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='71488'> + <var-decl name='_py___type_params__' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='218' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='71936'> + <var-decl name='_py___typing_is_unpacked_typevartuple__' type-id='type-id-1204' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='72576'> + <var-decl name='_py___typing_prepare_subst__' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='220' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='73152'> + <var-decl name='_py___typing_subst__' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='221' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='73664'> + <var-decl name='_py___typing_unpacked_tuple_args__' type-id='type-id-1205' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='74240'> + <var-decl name='_py___warningregistry__' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='223' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='74752'> + <var-decl name='_py___weaklistoffset__' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='224' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='75264'> + <var-decl name='_py___weakref__' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='225' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='75712'> + <var-decl name='_py___xor__' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='226' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='76096'> + <var-decl name='_py__abc_impl' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='227' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='76544'> + <var-decl name='_py__abstract_' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='228' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='76992'> + <var-decl name='_py__active' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='229' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='77376'> + <var-decl name='_py__align_' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='230' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='77760'> + <var-decl name='_py__annotation' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='231' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='78208'> + <var-decl name='_py__anonymous_' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='232' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='78656'> + <var-decl name='_py__argtypes_' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='233' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79104'> + <var-decl name='_py__as_parameter_' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='234' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79552'> + <var-decl name='_py__asyncio_future_blocking' type-id='type-id-1199' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='235' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80128'> + <var-decl name='_py__blksize' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='236' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80576'> + <var-decl name='_py__bootstrap' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='237' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='81024'> + <var-decl name='_py__check_retval_' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='238' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='81472'> + <var-decl name='_py__dealloc_warn' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='239' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='81920'> + <var-decl name='_py__feature_version' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='240' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82432'> + <var-decl name='_py__field_types' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='241' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82880'> + <var-decl name='_py__fields_' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='242' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83328'> + <var-decl name='_py__finalizing' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='243' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83776'> + <var-decl name='_py__find_and_load' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='244' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='84224'> + <var-decl name='_py__fix_up_module' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='245' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='84672'> + <var-decl name='_py__flags_' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85056'> + <var-decl name='_py__get_sourcefile' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='247' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85504'> + <var-decl name='_py__handle_fromlist' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86016'> + <var-decl name='_py__initializing' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='249' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86464'> + <var-decl name='_py__io' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86848'> + <var-decl name='_py__is_text_encoding' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='251' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='87360'> + <var-decl name='_py__length_' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='252' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='87808'> + <var-decl name='_py__limbo' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='253' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='88192'> + <var-decl name='_py__lock_unlock_module' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='254' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='88704'> + <var-decl name='_py__loop' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='255' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='89088'> + <var-decl name='_py__needs_com_addref_' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='89600'> + <var-decl name='_py__only_immortal' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='90048'> + <var-decl name='_py__pack_' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='258' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='90432'> + <var-decl name='_py__restype_' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='259' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='90880'> + <var-decl name='_py__showwarnmsg' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='260' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='91328'> + <var-decl name='_py__shutdown' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='261' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='91776'> + <var-decl name='_py__slotnames' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='262' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='92224'> + <var-decl name='_py__strptime' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='263' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='92672'> + <var-decl name='_py__strptime_datetime' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='264' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='93184'> + <var-decl name='_py__swappedbytes_' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='265' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='93632'> + <var-decl name='_py__type_' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='266' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='94016'> + <var-decl name='_py__uninitialized_submodules' type-id='type-id-1207' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='94592'> + <var-decl name='_py__warn_unawaited_coroutine' type-id='type-id-1207' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='268' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='95168'> + <var-decl name='_py__xoptions' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='269' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='95616'> + <var-decl name='_py_abs_tol' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='270' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96000'> + <var-decl name='_py_access' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='271' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96384'> + <var-decl name='_py_aclose' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='272' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96768'> + <var-decl name='_py_add' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='273' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='97152'> + <var-decl name='_py_add_done_callback' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='274' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='97664'> + <var-decl name='_py_after_in_child' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='275' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='98112'> + <var-decl name='_py_after_in_parent' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='276' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='98560'> + <var-decl name='_py_aggregate_class' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='277' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='99008'> + <var-decl name='_py_alias' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='278' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='99392'> + <var-decl name='_py_allow_code' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='279' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='99840'> + <var-decl name='_py_append' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='280' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100224'> + <var-decl name='_py_arg' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='281' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100608'> + <var-decl name='_py_argdefs' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='282' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='100992'> + <var-decl name='_py_args' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='283' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101376'> + <var-decl name='_py_arguments' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='284' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='101824'> + <var-decl name='_py_argv' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='285' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='102208'> + <var-decl name='_py_as_integer_ratio' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='286' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='102720'> + <var-decl name='_py_asend' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='287' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='103104'> + <var-decl name='_py_ast' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='288' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='103488'> + <var-decl name='_py_athrow' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='289' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='103872'> + <var-decl name='_py_attribute' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='290' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='104320'> + <var-decl name='_py_authorizer_callback' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='291' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='104832'> + <var-decl name='_py_autocommit' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='292' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='105280'> + <var-decl name='_py_backtick' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='293' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='105728'> + <var-decl name='_py_base' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='294' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='106112'> + <var-decl name='_py_before' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='295' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='106496'> + <var-decl name='_py_big' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='296' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='106880'> + <var-decl name='_py_binary_form' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='297' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='107328'> + <var-decl name='_py_block' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='298' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='107712'> + <var-decl name='_py_bound' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='299' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='108096'> + <var-decl name='_py_buffer' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='300' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='108480'> + <var-decl name='_py_buffer_callback' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='301' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='108928'> + <var-decl name='_py_buffer_size' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='302' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109376'> + <var-decl name='_py_buffering' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='303' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='109824'> + <var-decl name='_py_buffers' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='304' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='110208'> + <var-decl name='_py_bufsize' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='305' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='110592'> + <var-decl name='_py_builtins' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='306' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='111040'> + <var-decl name='_py_byteorder' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='307' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='111488'> + <var-decl name='_py_bytes' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='308' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='111872'> + <var-decl name='_py_bytes_per_sep' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='309' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='112320'> + <var-decl name='_py_c_call' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='310' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='112704'> + <var-decl name='_py_c_exception' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='311' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='113152'> + <var-decl name='_py_c_return' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='312' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='113600'> + <var-decl name='_py_cached_datetime_module' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='114112'> + <var-decl name='_py_cached_statements' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='314' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='114624'> + <var-decl name='_py_cadata' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='315' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='115008'> + <var-decl name='_py_cafile' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='316' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='115392'> + <var-decl name='_py_call' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='317' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='115776'> + <var-decl name='_py_call_exception_handler' type-id='type-id-1208' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='318' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='116288'> + <var-decl name='_py_call_soon' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='319' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='116736'> + <var-decl name='_py_callback' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='320' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='117184'> + <var-decl name='_py_cancel' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='321' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='117568'> + <var-decl name='_py_capath' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='322' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='117952'> + <var-decl name='_py_category' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='323' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='118400'> + <var-decl name='_py_cb_type' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='324' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='118784'> + <var-decl name='_py_certfile' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='325' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='119232'> + <var-decl name='_py_check_same_thread' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='326' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='119744'> + <var-decl name='_py_clear' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='327' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='120128'> + <var-decl name='_py_close' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='328' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='120512'> + <var-decl name='_py_closed' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='329' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='120896'> + <var-decl name='_py_closefd' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='330' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='121280'> + <var-decl name='_py_closure' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='331' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='121664'> + <var-decl name='_py_co_argcount' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='332' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='122112'> + <var-decl name='_py_co_cellvars' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='333' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='122560'> + <var-decl name='_py_co_code' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='334' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='122944'> + <var-decl name='_py_co_consts' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='335' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='123392'> + <var-decl name='_py_co_exceptiontable' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='336' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='123904'> + <var-decl name='_py_co_filename' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='337' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='124352'> + <var-decl name='_py_co_firstlineno' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='338' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='124800'> + <var-decl name='_py_co_flags' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='339' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='125248'> + <var-decl name='_py_co_freevars' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='340' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='125696'> + <var-decl name='_py_co_kwonlyargcount' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='341' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='126208'> + <var-decl name='_py_co_linetable' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='342' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='126656'> + <var-decl name='_py_co_name' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='343' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='127040'> + <var-decl name='_py_co_names' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='344' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='127488'> + <var-decl name='_py_co_nlocals' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='345' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='127936'> + <var-decl name='_py_co_posonlyargcount' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='346' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128448'> + <var-decl name='_py_co_qualname' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='347' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128896'> + <var-decl name='_py_co_stacksize' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='348' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='129344'> + <var-decl name='_py_co_varnames' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='349' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='129792'> + <var-decl name='_py_code' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='350' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='130176'> + <var-decl name='_py_col_offset' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='351' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='130624'> + <var-decl name='_py_command' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='352' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='131008'> + <var-decl name='_py_comment_factory' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='353' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='131456'> + <var-decl name='_py_compile_mode' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='354' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='131904'> + <var-decl name='_py_consts' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='355' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='132288'> + <var-decl name='_py_context' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='356' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='132672'> + <var-decl name='_py_contravariant' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='357' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='133120'> + <var-decl name='_py_cookie' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='358' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='133504'> + <var-decl name='_py_copy' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='359' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='133888'> + <var-decl name='_py_copyreg' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='360' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='134272'> + <var-decl name='_py_coro' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='361' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='134656'> + <var-decl name='_py_count' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='362' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='135040'> + <var-decl name='_py_covariant' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='363' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='135488'> + <var-decl name='_py_cwd' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='364' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='135872'> + <var-decl name='_py_data' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='365' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='136256'> + <var-decl name='_py_database' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='366' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='136704'> + <var-decl name='_py_day' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='367' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='137088'> + <var-decl name='_py_decode' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='368' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='137472'> + <var-decl name='_py_decoder' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='369' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='137856'> + <var-decl name='_py_default' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='370' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138240'> + <var-decl name='_py_defaultaction' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='371' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138688'> + <var-decl name='_py_delete' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='372' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='139072'> + <var-decl name='_py_depth' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='373' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='139456'> + <var-decl name='_py_desired_access' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='374' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='139904'> + <var-decl name='_py_detect_types' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='375' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='140352'> + <var-decl name='_py_deterministic' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='376' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='140800'> + <var-decl name='_py_device' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='377' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='141184'> + <var-decl name='_py_dict' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='378' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='141568'> + <var-decl name='_py_dictcomp' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='379' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='142016'> + <var-decl name='_py_difference_update' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='380' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='142528'> + <var-decl name='_py_digest' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='381' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='142912'> + <var-decl name='_py_digest_size' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='382' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='143360'> + <var-decl name='_py_digestmod' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='383' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='143808'> + <var-decl name='_py_dir_fd' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='384' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='144192'> + <var-decl name='_py_discard' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='385' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='144576'> + <var-decl name='_py_dispatch_table' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='386' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='145024'> + <var-decl name='_py_displayhook' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='387' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='145472'> + <var-decl name='_py_dklen' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='388' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='145856'> + <var-decl name='_py_doc' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='389' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='146240'> + <var-decl name='_py_dont_inherit' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='390' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='146688'> + <var-decl name='_py_dst' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='391' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='147072'> + <var-decl name='_py_dst_dir_fd' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='392' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='147520'> + <var-decl name='_py_eager_start' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='393' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='147968'> + <var-decl name='_py_effective_ids' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='394' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='148416'> + <var-decl name='_py_element_factory' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='395' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='148864'> + <var-decl name='_py_encode' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='396' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='149248'> + <var-decl name='_py_encoding' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='397' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='149696'> + <var-decl name='_py_end' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='398' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='150080'> + <var-decl name='_py_end_col_offset' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='399' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='150528'> + <var-decl name='_py_end_lineno' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='400' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='150976'> + <var-decl name='_py_end_offset' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='401' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='151424'> + <var-decl name='_py_endpos' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='402' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='151808'> + <var-decl name='_py_entrypoint' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='403' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='152256'> + <var-decl name='_py_env' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='404' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='152640'> + <var-decl name='_py_errors' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='405' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='153024'> + <var-decl name='_py_event' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='406' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='153408'> + <var-decl name='_py_eventmask' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='407' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='153856'> + <var-decl name='_py_exc_type' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='408' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='154304'> + <var-decl name='_py_exc_value' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='409' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='154752'> + <var-decl name='_py_excepthook' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='410' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='155200'> + <var-decl name='_py_exception' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='411' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='155648'> + <var-decl name='_py_existing_file_name' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='412' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='156160'> + <var-decl name='_py_exp' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='413' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='156544'> + <var-decl name='_py_extend' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='414' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='156928'> + <var-decl name='_py_extra_tokens' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='415' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='157376'> + <var-decl name='_py_facility' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='416' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='157824'> + <var-decl name='_py_factory' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='417' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='158208'> + <var-decl name='_py_false' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='418' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='158592'> + <var-decl name='_py_family' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='419' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='158976'> + <var-decl name='_py_fanout' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='420' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='159360'> + <var-decl name='_py_fd' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='421' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='159744'> + <var-decl name='_py_fd2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='422' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160128'> + <var-decl name='_py_fdel' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='423' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160512'> + <var-decl name='_py_fget' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='424' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160896'> + <var-decl name='_py_file' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='425' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='161280'> + <var-decl name='_py_file_actions' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='426' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='161728'> + <var-decl name='_py_filename' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='427' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='162176'> + <var-decl name='_py_fileno' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='428' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='162560'> + <var-decl name='_py_filepath' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='429' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='163008'> + <var-decl name='_py_fillvalue' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='430' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='163456'> + <var-decl name='_py_filter' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='431' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='163840'> + <var-decl name='_py_filters' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='432' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='164224'> + <var-decl name='_py_final' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='433' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='164608'> + <var-decl name='_py_find_class' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='434' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='165056'> + <var-decl name='_py_fix_imports' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='435' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='165504'> + <var-decl name='_py_flags' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='436' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='165888'> + <var-decl name='_py_flush' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='437' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='166272'> + <var-decl name='_py_fold' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='438' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='166656'> + <var-decl name='_py_follow_symlinks' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='439' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='167104'> + <var-decl name='_py_format' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='440' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='167488'> + <var-decl name='_py_from_param' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='441' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='167936'> + <var-decl name='_py_fromlist' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='442' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='168384'> + <var-decl name='_py_fromtimestamp' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='443' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='168832'> + <var-decl name='_py_fromutc' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='444' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='169216'> + <var-decl name='_py_fset' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='445' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='169600'> + <var-decl name='_py_func' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='446' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='169984'> + <var-decl name='_py_future' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='447' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='170368'> + <var-decl name='_py_generation' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='448' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='170816'> + <var-decl name='_py_genexpr' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='449' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='171200'> + <var-decl name='_py_get' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='450' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='171584'> + <var-decl name='_py_get_debug' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='451' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='172032'> + <var-decl name='_py_get_event_loop' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='452' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='172480'> + <var-decl name='_py_get_loop' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='453' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='172928'> + <var-decl name='_py_get_source' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='454' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='173376'> + <var-decl name='_py_getattr' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='455' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='173760'> + <var-decl name='_py_getstate' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='456' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='174208'> + <var-decl name='_py_gid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='457' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='174592'> + <var-decl name='_py_globals' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='458' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='174976'> + <var-decl name='_py_groupindex' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='459' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='175424'> + <var-decl name='_py_groups' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='460' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='175808'> + <var-decl name='_py_handle' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='461' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176192'> + <var-decl name='_py_handle_seq' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='462' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176640'> + <var-decl name='_py_has_location' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='463' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='177088'> + <var-decl name='_py_hash_name' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='464' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='177536'> + <var-decl name='_py_header' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='465' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='177920'> + <var-decl name='_py_headers' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='466' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='178304'> + <var-decl name='_py_hi' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='467' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='178688'> + <var-decl name='_py_hook' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='468' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='179072'> + <var-decl name='_py_hour' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='469' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='179456'> + <var-decl name='_py_ident' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='470' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='179840'> + <var-decl name='_py_identity_hint' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='471' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='180288'> + <var-decl name='_py_ignore' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='472' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='180672'> + <var-decl name='_py_imag' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='473' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='181056'> + <var-decl name='_py_importlib' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='474' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='181504'> + <var-decl name='_py_in_fd' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='475' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='181888'> + <var-decl name='_py_incoming' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='476' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='182336'> + <var-decl name='_py_indexgroup' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='477' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='182784'> + <var-decl name='_py_inf' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='478' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='183168'> + <var-decl name='_py_infer_variance' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='479' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='183616'> + <var-decl name='_py_inherit_handle' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='480' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='184064'> + <var-decl name='_py_inheritable' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='481' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='184512'> + <var-decl name='_py_initial' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='482' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='184896'> + <var-decl name='_py_initial_bytes' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='483' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='185344'> + <var-decl name='_py_initial_owner' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='484' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='185792'> + <var-decl name='_py_initial_state' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='485' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='186240'> + <var-decl name='_py_initial_value' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='486' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='186688'> + <var-decl name='_py_initval' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='487' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='187072'> + <var-decl name='_py_inner_size' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='488' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='187520'> + <var-decl name='_py_input' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='489' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='187904'> + <var-decl name='_py_insert_comments' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='490' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='188352'> + <var-decl name='_py_insert_pis' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='491' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='188800'> + <var-decl name='_py_instructions' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='492' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='189248'> + <var-decl name='_py_intern' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='493' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='189632'> + <var-decl name='_py_intersection' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='494' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='190080'> + <var-decl name='_py_interval' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='495' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='190528'> + <var-decl name='_py_is_running' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='496' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='190976'> + <var-decl name='_py_isatty' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='497' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='191360'> + <var-decl name='_py_isinstance' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='498' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='191808'> + <var-decl name='_py_isoformat' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='499' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192256'> + <var-decl name='_py_isolation_level' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='500' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192704'> + <var-decl name='_py_istext' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='501' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='193088'> + <var-decl name='_py_item' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='502' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='193472'> + <var-decl name='_py_items' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='503' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='193856'> + <var-decl name='_py_iter' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='504' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='194240'> + <var-decl name='_py_iterable' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='505' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='194688'> + <var-decl name='_py_iterations' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='506' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='195136'> + <var-decl name='_py_join' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='507' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='195520'> + <var-decl name='_py_jump' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='508' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='195904'> + <var-decl name='_py_keepends' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='509' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='196352'> + <var-decl name='_py_key' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='510' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='196736'> + <var-decl name='_py_keyfile' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='511' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='197120'> + <var-decl name='_py_keys' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='512' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='197504'> + <var-decl name='_py_kind' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='513' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='197888'> + <var-decl name='_py_kw' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='514' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='198272'> + <var-decl name='_py_kw1' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='515' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='198656'> + <var-decl name='_py_kw2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='516' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='199040'> + <var-decl name='_py_kwdefaults' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='517' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='199488'> + <var-decl name='_py_label' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='518' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='199872'> + <var-decl name='_py_lambda' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='519' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='200256'> + <var-decl name='_py_last' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='520' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='200640'> + <var-decl name='_py_last_exc' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='521' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='201088'> + <var-decl name='_py_last_node' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='522' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='201536'> + <var-decl name='_py_last_traceback' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='523' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='201984'> + <var-decl name='_py_last_type' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='524' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='202432'> + <var-decl name='_py_last_value' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='525' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='202880'> + <var-decl name='_py_latin1' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='526' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='203264'> + <var-decl name='_py_leaf_size' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='527' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='203712'> + <var-decl name='_py_len' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='528' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='204096'> + <var-decl name='_py_length' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='529' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='204480'> + <var-decl name='_py_level' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='530' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='204864'> + <var-decl name='_py_limit' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='531' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='205248'> + <var-decl name='_py_line' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='532' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='205632'> + <var-decl name='_py_line_buffering' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='533' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='206080'> + <var-decl name='_py_lineno' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='534' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='206464'> + <var-decl name='_py_listcomp' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='535' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='206912'> + <var-decl name='_py_little' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='536' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='207296'> + <var-decl name='_py_lo' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='537' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='207680'> + <var-decl name='_py_locale' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='538' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='208064'> + <var-decl name='_py_locals' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='539' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='208448'> + <var-decl name='_py_logoption' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='540' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='208896'> + <var-decl name='_py_loop' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='541' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='209280'> + <var-decl name='_py_manual_reset' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='542' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='209728'> + <var-decl name='_py_mapping' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='543' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='210112'> + <var-decl name='_py_match' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='544' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='210496'> + <var-decl name='_py_max_length' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='545' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='210944'> + <var-decl name='_py_maxdigits' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='546' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='211392'> + <var-decl name='_py_maxevents' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='547' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='211840'> + <var-decl name='_py_maxlen' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='548' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='212224'> + <var-decl name='_py_maxmem' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='549' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='212608'> + <var-decl name='_py_maxsplit' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='550' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='213056'> + <var-decl name='_py_maxvalue' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='551' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='213504'> + <var-decl name='_py_memLevel' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='552' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='213952'> + <var-decl name='_py_memlimit' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='553' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='214400'> + <var-decl name='_py_message' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='554' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='214784'> + <var-decl name='_py_metaclass' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='555' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='215232'> + <var-decl name='_py_metadata' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='556' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='215680'> + <var-decl name='_py_method' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='557' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='216064'> + <var-decl name='_py_microsecond' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='558' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='216512'> + <var-decl name='_py_milliseconds' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='559' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='216960'> + <var-decl name='_py_minute' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='560' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='217344'> + <var-decl name='_py_mod' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='561' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='217728'> + <var-decl name='_py_mode' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='562' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='218112'> + <var-decl name='_py_module' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='563' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='218496'> + <var-decl name='_py_module_globals' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='564' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='218944'> + <var-decl name='_py_modules' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='565' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='219328'> + <var-decl name='_py_month' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='566' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='219712'> + <var-decl name='_py_mro' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='567' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='220096'> + <var-decl name='_py_msg' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='568' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='220480'> + <var-decl name='_py_mutex' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='569' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='220864'> + <var-decl name='_py_mycmp' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='570' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='221248'> + <var-decl name='_py_n_arg' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='571' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='221632'> + <var-decl name='_py_n_fields' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='572' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='222080'> + <var-decl name='_py_n_sequence_fields' type-id='type-id-1197' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='573' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='222592'> + <var-decl name='_py_n_unnamed_fields' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='574' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='223104'> + <var-decl name='_py_name' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='575' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='223488'> + <var-decl name='_py_name_from' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='576' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='223936'> + <var-decl name='_py_namespace_separator' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='577' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224448'> + <var-decl name='_py_namespaces' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='578' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224896'> + <var-decl name='_py_narg' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='579' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='225280'> + <var-decl name='_py_ndigits' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='580' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='225664'> + <var-decl name='_py_nested' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='581' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='226048'> + <var-decl name='_py_new_file_name' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='582' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='226496'> + <var-decl name='_py_new_limit' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='583' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='226944'> + <var-decl name='_py_newline' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='584' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='227328'> + <var-decl name='_py_newlines' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='585' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='227776'> + <var-decl name='_py_next' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='586' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='228160'> + <var-decl name='_py_nlocals' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='587' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='228544'> + <var-decl name='_py_node_depth' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='588' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='228992'> + <var-decl name='_py_node_offset' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='589' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='229440'> + <var-decl name='_py_ns' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='590' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='229824'> + <var-decl name='_py_nstype' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='591' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='230208'> + <var-decl name='_py_nt' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='592' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='230592'> + <var-decl name='_py_null' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='593' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='230976'> + <var-decl name='_py_number' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='594' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='231360'> + <var-decl name='_py_obj' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='595' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='231744'> + <var-decl name='_py_object' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='596' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='232128'> + <var-decl name='_py_offset' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='597' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='232512'> + <var-decl name='_py_offset_dst' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='598' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='232960'> + <var-decl name='_py_offset_src' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='599' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='233408'> + <var-decl name='_py_on_type_read' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='600' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='233856'> + <var-decl name='_py_onceregistry' type-id='type-id-1189' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='601' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='234304'> + <var-decl name='_py_only_keys' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='602' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='234752'> + <var-decl name='_py_oparg' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='603' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='235136'> + <var-decl name='_py_opcode' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='604' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='235520'> + <var-decl name='_py_open' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='605' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='235904'> + <var-decl name='_py_opener' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='606' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='236288'> + <var-decl name='_py_operation' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='607' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='236736'> + <var-decl name='_py_optimize' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='608' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='237184'> + <var-decl name='_py_options' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='609' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='237568'> + <var-decl name='_py_order' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='610' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='237952'> + <var-decl name='_py_origin' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='611' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='238336'> + <var-decl name='_py_out_fd' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='612' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='238720'> + <var-decl name='_py_outgoing' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='613' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='239168'> + <var-decl name='_py_overlapped' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='614' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='239616'> + <var-decl name='_py_owner' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='615' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='240000'> + <var-decl name='_py_pages' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='616' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='240384'> + <var-decl name='_py_parent' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='617' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='240768'> + <var-decl name='_py_password' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='618' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='241216'> + <var-decl name='_py_path' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='619' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='241600'> + <var-decl name='_py_pattern' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='620' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='241984'> + <var-decl name='_py_peek' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='621' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='242368'> + <var-decl name='_py_persistent_id' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='622' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='242816'> + <var-decl name='_py_persistent_load' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='623' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='243264'> + <var-decl name='_py_person' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='624' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='243648'> + <var-decl name='_py_pi_factory' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='625' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='244096'> + <var-decl name='_py_pid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='626' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='244480'> + <var-decl name='_py_policy' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='627' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='244864'> + <var-decl name='_py_pos' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='628' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='245248'> + <var-decl name='_py_pos1' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='629' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='245632'> + <var-decl name='_py_pos2' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='630' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='246016'> + <var-decl name='_py_posix' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='631' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='246400'> + <var-decl name='_py_print_file_and_line' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='632' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='246912'> + <var-decl name='_py_priority' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='633' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='247360'> + <var-decl name='_py_progress' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='634' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='247808'> + <var-decl name='_py_progress_handler' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='635' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='248320'> + <var-decl name='_py_progress_routine' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='636' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='248832'> + <var-decl name='_py_proto' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='637' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='249216'> + <var-decl name='_py_protocol' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='638' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='249664'> + <var-decl name='_py_ps1' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='639' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='250048'> + <var-decl name='_py_ps2' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='640' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='250432'> + <var-decl name='_py_query' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='641' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='250816'> + <var-decl name='_py_quotetabs' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='642' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='251264'> + <var-decl name='_py_raw' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='643' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='251648'> + <var-decl name='_py_read' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='644' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='252032'> + <var-decl name='_py_read1' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='645' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='252416'> + <var-decl name='_py_readable' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='646' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='252864'> + <var-decl name='_py_readall' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='647' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='253248'> + <var-decl name='_py_readinto' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='648' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='253696'> + <var-decl name='_py_readinto1' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='649' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='254144'> + <var-decl name='_py_readline' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='650' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='254592'> + <var-decl name='_py_readonly' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='651' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='255040'> + <var-decl name='_py_real' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='652' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='255424'> + <var-decl name='_py_reducer_override' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='653' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='255936'> + <var-decl name='_py_registry' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='654' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256384'> + <var-decl name='_py_rel_tol' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='655' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256768'> + <var-decl name='_py_release' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='656' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='257152'> + <var-decl name='_py_reload' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='657' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='257536'> + <var-decl name='_py_repl' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='658' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='257920'> + <var-decl name='_py_replace' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='659' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='258304'> + <var-decl name='_py_reserved' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='660' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='258752'> + <var-decl name='_py_reset' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='661' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='259136'> + <var-decl name='_py_resetids' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='662' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='259584'> + <var-decl name='_py_return' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='663' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='259968'> + <var-decl name='_py_reverse' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='664' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='260352'> + <var-decl name='_py_reversed' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='665' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='260800'> + <var-decl name='_py_salt' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='666' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='261184'> + <var-decl name='_py_sched_priority' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='667' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='261632'> + <var-decl name='_py_scheduler' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='668' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='262080'> + <var-decl name='_py_second' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='669' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='262464'> + <var-decl name='_py_security_attributes' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='670' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='262976'> + <var-decl name='_py_seek' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='671' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='263360'> + <var-decl name='_py_seekable' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='672' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='263808'> + <var-decl name='_py_selectors' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='673' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='264256'> + <var-decl name='_py_self' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='674' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='264640'> + <var-decl name='_py_send' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='675' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='265024'> + <var-decl name='_py_sep' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='676' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='265408'> + <var-decl name='_py_sequence' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='677' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='265856'> + <var-decl name='_py_server_hostname' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='678' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='266304'> + <var-decl name='_py_server_side' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='679' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='266752'> + <var-decl name='_py_session' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='680' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='267136'> + <var-decl name='_py_setcomp' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='681' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='267520'> + <var-decl name='_py_setpgroup' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='682' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='267968'> + <var-decl name='_py_setsid' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='683' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='268352'> + <var-decl name='_py_setsigdef' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='684' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='268800'> + <var-decl name='_py_setsigmask' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='685' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='269248'> + <var-decl name='_py_setstate' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='686' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='269696'> + <var-decl name='_py_shape' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='687' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='270080'> + <var-decl name='_py_show_cmd' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='688' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='270528'> + <var-decl name='_py_signed' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='689' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='270912'> + <var-decl name='_py_size' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='690' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='271296'> + <var-decl name='_py_sizehint' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='691' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='271744'> + <var-decl name='_py_skip_file_prefixes' type-id='type-id-1202' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='692' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='272256'> + <var-decl name='_py_sleep' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='693' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='272640'> + <var-decl name='_py_sock' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='694' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='273024'> + <var-decl name='_py_sort' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='695' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='273408'> + <var-decl name='_py_source' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='696' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='273792'> + <var-decl name='_py_source_traceback' type-id='type-id-1200' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='697' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='274304'> + <var-decl name='_py_spam' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='698' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='274688'> + <var-decl name='_py_src' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='699' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='275072'> + <var-decl name='_py_src_dir_fd' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='700' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='275520'> + <var-decl name='_py_stacklevel' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='701' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='275968'> + <var-decl name='_py_start' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='702' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='276352'> + <var-decl name='_py_statement' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='703' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='276800'> + <var-decl name='_py_status' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='704' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='277184'> + <var-decl name='_py_stderr' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='705' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='277568'> + <var-decl name='_py_stdin' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='706' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='277952'> + <var-decl name='_py_stdout' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='707' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='278336'> + <var-decl name='_py_step' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='708' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='278720'> + <var-decl name='_py_steps' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='709' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='279104'> + <var-decl name='_py_store_name' type-id='type-id-1182' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='710' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='279552'> + <var-decl name='_py_strategy' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='711' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='280000'> + <var-decl name='_py_strftime' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='712' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='280448'> + <var-decl name='_py_strict' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='713' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='280832'> + <var-decl name='_py_strict_mode' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='714' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='281280'> + <var-decl name='_py_string' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='715' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='281664'> + <var-decl name='_py_sub_key' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='716' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='282048'> + <var-decl name='_py_symmetric_difference_update' type-id='type-id-1209' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='282624'> + <var-decl name='_py_tabsize' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='718' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='283008'> + <var-decl name='_py_tag' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='719' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='283392'> + <var-decl name='_py_target' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='720' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='283776'> + <var-decl name='_py_target_is_directory' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='721' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='284288'> + <var-decl name='_py_task' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='722' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='284672'> + <var-decl name='_py_tb_frame' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='723' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='285120'> + <var-decl name='_py_tb_lasti' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='724' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='285568'> + <var-decl name='_py_tb_lineno' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='725' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='286016'> + <var-decl name='_py_tb_next' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='726' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='286400'> + <var-decl name='_py_tell' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='727' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='286784'> + <var-decl name='_py_template' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='728' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='287232'> + <var-decl name='_py_term' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='729' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='287616'> + <var-decl name='_py_text' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='730' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288000'> + <var-decl name='_py_threading' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='731' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288448'> + <var-decl name='_py_throw' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='732' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288832'> + <var-decl name='_py_timeout' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='733' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='289216'> + <var-decl name='_py_times' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='734' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='289600'> + <var-decl name='_py_timetuple' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='735' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='290048'> + <var-decl name='_py_top' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='736' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='290432'> + <var-decl name='_py_trace_callback' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='737' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='290880'> + <var-decl name='_py_traceback' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='738' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='291328'> + <var-decl name='_py_trailers' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='739' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='291776'> + <var-decl name='_py_translate' type-id='type-id-1183' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='740' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='292224'> + <var-decl name='_py_true' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='741' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='292608'> + <var-decl name='_py_truncate' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='742' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='293056'> + <var-decl name='_py_twice' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='743' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='293440'> + <var-decl name='_py_txt' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='744' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='293824'> + <var-decl name='_py_type' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='745' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='294208'> + <var-decl name='_py_type_params' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='746' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='294656'> + <var-decl name='_py_tz' type-id='type-id-1186' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='747' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='295040'> + <var-decl name='_py_tzinfo' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='748' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='295424'> + <var-decl name='_py_tzname' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='749' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='295808'> + <var-decl name='_py_uid' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='750' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='296192'> + <var-decl name='_py_unlink' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='751' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='296576'> + <var-decl name='_py_unraisablehook' type-id='type-id-1196' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='752' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='297024'> + <var-decl name='_py_uri' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='753' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='297408'> + <var-decl name='_py_usedforsecurity' type-id='type-id-1193' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='754' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='297856'> + <var-decl name='_py_value' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='755' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='298240'> + <var-decl name='_py_values' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='756' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='298624'> + <var-decl name='_py_version' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='757' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='299008'> + <var-decl name='_py_volume' type-id='type-id-1185' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='758' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='299392'> + <var-decl name='_py_wait_all' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='759' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='299840'> + <var-decl name='_py_warn_on_full_buffer' type-id='type-id-1198' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='760' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='300352'> + <var-decl name='_py_warnings' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='761' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='300800'> + <var-decl name='_py_warnoptions' type-id='type-id-1190' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='762' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='301248'> + <var-decl name='_py_wbits' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='763' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='301632'> + <var-decl name='_py_week' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='764' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='302016'> + <var-decl name='_py_weekday' type-id='type-id-1194' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='765' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='302400'> + <var-decl name='_py_which' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='766' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='302784'> + <var-decl name='_py_who' type-id='type-id-1206' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='767' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='303168'> + <var-decl name='_py_withdata' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='768' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='303616'> + <var-decl name='_py_writable' type-id='type-id-1184' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='769' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='304064'> + <var-decl name='_py_write' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='770' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='304448'> + <var-decl name='_py_write_through' type-id='type-id-1188' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='771' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='304896'> + <var-decl name='_py_year' type-id='type-id-1195' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='772' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='305280'> + <var-decl name='_py_zdict' type-id='type-id-1192' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='773' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__85' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1' id='type-id-1193'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-871' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='59' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__86' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1' id='type-id-1194'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-902' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='60' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__89' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1' id='type-id-1195'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-897' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='63' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__90' size-in-bits='448' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1' id='type-id-1196'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-869' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='64' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__91' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1' id='type-id-1197'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-873' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='65' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__95' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' column='1' id='type-id-1198'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-878' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='69' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__122' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1' id='type-id-1199'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-886' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='96' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__144' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1' id='type-id-1200'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-872' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='118' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__169' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1' id='type-id-1201'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-879' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='143' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__212' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1' id='type-id-1202'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-875' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='186' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__237' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1' id='type-id-1203'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-881' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='211' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__245' size-in-bits='640' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1' id='type-id-1204'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-894' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='219' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__248' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1' id='type-id-1205'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-892' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='222' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__276' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1' id='type-id-1206'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-896' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='250' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__293' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1' id='type-id-1207'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-888' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='267' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__339' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1' id='type-id-1208'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-883' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='313' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__743' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1' id='type-id-1209'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-890' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='717' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__800' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='775' column='1' id='type-id-775'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_ascii' type-id='type-id-1037' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='776' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_data' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='777' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__801' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='779' column='1' id='type-id-777'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_latin1' type-id='type-id-1040' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='780' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_data' type-id='type-id-891' visibility='default' filepath='./Include/internal/pycore_global_strings.h' line='781' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyHamtNode' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1210' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='38' column='1' id='type-id-1211'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='39' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyHamtNode' type-id='type-id-1211' filepath='./Include/internal/pycore_hamt.h' line='40' column='1' id='type-id-1210'/> + <class-decl name='PyHamtObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1179' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='44' column='1' id='type-id-1212'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='h_root' type-id='type-id-1213' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='h_weakreflist' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='h_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='48' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyHamtObject' type-id='type-id-1212' filepath='./Include/internal/pycore_hamt.h' line='49' column='1' id='type-id-1179'/> + <class-decl name='PyHamtNode_Bitmap' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1175' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='52' column='1' id='type-id-1214'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='b_bitmap' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='b_array' type-id='type-id-359' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='55' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyHamtNode_Bitmap' type-id='type-id-1214' filepath='./Include/internal/pycore_hamt.h' line='56' column='1' id='type-id-1175'/> + <class-decl name='_Py_slist_item_s' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='13' column='1' id='type-id-1215'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-1216' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='14' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_slist_item_t' type-id='type-id-1215' filepath='./Include/internal/pycore_hashtable.h' line='15' column='1' id='type-id-1217'/> + <class-decl name='_Py_slist_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1218' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='17' column='1' id='type-id-1219'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='head' type-id='type-id-1220' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='18' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_slist_t' type-id='type-id-1219' filepath='./Include/internal/pycore_hashtable.h' line='19' column='1' id='type-id-1218'/> + <class-decl name='_Py_hashtable_entry_t' size-in-bits='256' is-struct='yes' naming-typedef-id='type-id-1221' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='28' column='1' id='type-id-1222'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_Py_slist_item' type-id='type-id-1217' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='key_hash' type-id='type-id-1223' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='key' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='value' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='34' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_hashtable_entry_t' type-id='type-id-1222' filepath='./Include/internal/pycore_hashtable.h' line='35' column='1' id='type-id-1221'/> + <typedef-decl name='_Py_hashtable_t' type-id='type-id-1224' filepath='./Include/internal/pycore_hashtable.h' line='42' column='1' id='type-id-539'/> + <typedef-decl name='_Py_hashtable_hash_func' type-id='type-id-1225' filepath='./Include/internal/pycore_hashtable.h' line='44' column='1' id='type-id-543'/> + <typedef-decl name='_Py_hashtable_compare_func' type-id='type-id-85' filepath='./Include/internal/pycore_hashtable.h' line='45' column='1' id='type-id-544'/> + <typedef-decl name='_Py_hashtable_destroy_func' type-id='type-id-510' filepath='./Include/internal/pycore_hashtable.h' line='46' column='1' id='type-id-545'/> + <typedef-decl name='_Py_hashtable_get_entry_func' type-id='type-id-1226' filepath='./Include/internal/pycore_hashtable.h' line='47' column='1' id='type-id-1227'/> + <class-decl name='_Py_hashtable_allocator_t' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-536' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='50' column='1' id='type-id-1228'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='malloc' type-id='type-id-1229' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='free' type-id='type-id-510' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='55' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_hashtable_allocator_t' type-id='type-id-1228' filepath='./Include/internal/pycore_hashtable.h' line='56' column='1' id='type-id-536'/> + <class-decl name='_Py_hashtable_t' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='60' column='1' id='type-id-1224'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='nentries' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='nbuckets' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='buckets' type-id='type-id-1230' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='get_entry_func' type-id='type-id-1227' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='hash_func' type-id='type-id-543' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='compare_func' type-id='type-id-544' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='key_destroy_func' type-id='type-id-545' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='value_destroy_func' type-id='type-id-545' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='alloc' type-id='type-id-536' visibility='default' filepath='./Include/internal/pycore_hashtable.h' line='70' column='1'/> + </data-member> + </class-decl> + <class-decl name='_import_runtime_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='41' column='1' id='type-id-1231'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='inittab' type-id='type-id-1232' visibility='default' filepath='./Include/internal/pycore_import.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='last_module_index' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_import.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='extensions' type-id='type-id-1233' visibility='default' filepath='./Include/internal/pycore_import.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='pkgcontext' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_import.h' line='61' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__38' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='49' column='1' id='type-id-1233'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_import.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='hashtable' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_import.h' line='58' column='1'/> + </data-member> + </class-decl> + <class-decl name='_import_state' size-in-bits='768' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='64' column='1' id='type-id-1234'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='modules' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='modules_by_index' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='importlib' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='override_frozen_modules' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_import.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='override_multi_interp_extensions_check' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_import.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='dlopenflags' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_import.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='import_func' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_import.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='lock' type-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_import.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='find_and_load' type-id='type-id-1236' visibility='default' filepath='./Include/internal/pycore_import.h' line='104' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__802' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='100' column='1' id='type-id-1236'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='import_level' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_import.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='accumulated' type-id='type-id-213' visibility='default' filepath='./Include/internal/pycore_import.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='header' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_import.h' line='103' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_long_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='43' column='1' id='type-id-1237'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='max_str_digits' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp.h' line='44' column='1'/> + </data-member> + </class-decl> + <class-decl name='_stoptheworld_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='49' column='1' id='type-id-1238'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_interp.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='requested' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_interp.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='world_stopped' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_interp.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24'> + <var-decl name='is_global' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_interp.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='stop_event' type-id='type-id-1239' visibility='default' filepath='./Include/internal/pycore_interp.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='thread_countdown' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='requester' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_interp.h' line='61' column='1'/> + </data-member> + </class-decl> + <class-decl name='_rare_events' size-in-bits='40' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='74' column='1' id='type-id-1240'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='set_class' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='set_bases' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='set_eval_frame_func' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24'> + <var-decl name='builtin_dict' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='func_modification' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='84' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_rare_events' type-id='type-id-1240' filepath='./Include/internal/pycore_interp.h' line='85' column='1' id='type-id-1241'/> + <class-decl name='_is' size-in-bits='1559808' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='94' column='1' id='type-id-1242'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ceval' type-id='type-id-1118' visibility='default' filepath='./Include/internal/pycore_interp.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58112'> + <var-decl name='next' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_interp.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58176'> + <var-decl name='id' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_interp.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58240'> + <var-decl name='id_refcount' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_interp.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58304'> + <var-decl name='requires_idref' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58368'> + <var-decl name='id_mutex' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_interp.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58432'> + <var-decl name='_whence' type-id='type-id-183' visibility='default' filepath='./Include/internal/pycore_interp.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58496'> + <var-decl name='_initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58528'> + <var-decl name='_ready' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58560'> + <var-decl name='finalizing' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_interp.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58624'> + <var-decl name='last_restart_version' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_interp.h' line='127' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='58688'> + <var-decl name='threads' type-id='type-id-1243' visibility='default' filepath='./Include/internal/pycore_interp.h' line='141' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59008'> + <var-decl name='runtime' type-id='type-id-1244' visibility='default' filepath='./Include/internal/pycore_interp.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59072'> + <var-decl name='_finalizing' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_interp.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59136'> + <var-decl name='_finalizing_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='155' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='59200'> + <var-decl name='gc' type-id='type-id-1166' visibility='default' filepath='./Include/internal/pycore_interp.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='61120'> + <var-decl name='sysdict' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='172' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='61184'> + <var-decl name='builtins' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='175' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='61248'> + <var-decl name='imports' type-id='type-id-1234' visibility='default' filepath='./Include/internal/pycore_interp.h' line='177' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='62016'> + <var-decl name='_gil' type-id='type-id-1168' visibility='default' filepath='./Include/internal/pycore_interp.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='63680'> + <var-decl name='codecs' type-id='type-id-1125' visibility='default' filepath='./Include/internal/pycore_interp.h' line='187' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='63936'> + <var-decl name='config' type-id='type-id-268' visibility='default' filepath='./Include/internal/pycore_interp.h' line='189' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67520'> + <var-decl name='feature_flags' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_interp.h' line='190' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67584'> + <var-decl name='dict' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67648'> + <var-decl name='sysdict_copy' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='194' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67712'> + <var-decl name='builtins_copy' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='195' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67776'> + <var-decl name='eval_frame' type-id='type-id-1032' visibility='default' filepath='./Include/internal/pycore_interp.h' line='197' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='67840'> + <var-decl name='func_watchers' type-id='type-id-754' visibility='default' filepath='./Include/internal/pycore_interp.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='68352'> + <var-decl name='active_func_watchers' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='201' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='68416'> + <var-decl name='co_extra_user_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='203' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='68480'> + <var-decl name='co_extra_freefuncs' type-id='type-id-830' visibility='default' filepath='./Include/internal/pycore_interp.h' line='204' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='84800'> + <var-decl name='xi' type-id='type-id-1141' visibility='default' filepath='./Include/internal/pycore_interp.h' line='207' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85056'> + <var-decl name='before_forkers' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='210' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85120'> + <var-decl name='after_forkers_parent' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85184'> + <var-decl name='after_forkers_child' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='212' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85248'> + <var-decl name='warnings' type-id='type-id-1245' visibility='default' filepath='./Include/internal/pycore_interp.h' line='215' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85568'> + <var-decl name='atexit' type-id='type-id-1101' visibility='default' filepath='./Include/internal/pycore_interp.h' line='216' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='85824'> + <var-decl name='stoptheworld' type-id='type-id-1238' visibility='default' filepath='./Include/internal/pycore_interp.h' line='217' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86016'> + <var-decl name='qsbr' type-id='type-id-1246' visibility='default' filepath='./Include/internal/pycore_interp.h' line='218' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86400'> + <var-decl name='obmalloc' type-id='type-id-1247' visibility='default' filepath='./Include/internal/pycore_interp.h' line='236' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86464'> + <var-decl name='audit_hooks' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_interp.h' line='238' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='86528'> + <var-decl name='type_watchers' type-id='type-id-766' visibility='default' filepath='./Include/internal/pycore_interp.h' line='239' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='87040'> + <var-decl name='code_watchers' type-id='type-id-751' visibility='default' filepath='./Include/internal/pycore_interp.h' line='240' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='87552'> + <var-decl name='active_code_watchers' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_interp.h' line='242' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='87616'> + <var-decl name='object_state' type-id='type-id-1248' visibility='default' filepath='./Include/internal/pycore_interp.h' line='244' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='115968'> + <var-decl name='unicode' type-id='type-id-1249' visibility='default' filepath='./Include/internal/pycore_interp.h' line='245' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='116416'> + <var-decl name='long_state' type-id='type-id-1237' visibility='default' filepath='./Include/internal/pycore_interp.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='116480'> + <var-decl name='dtoa' type-id='type-id-1144' visibility='default' filepath='./Include/internal/pycore_interp.h' line='247' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='136000'> + <var-decl name='func_state' type-id='type-id-1163' visibility='default' filepath='./Include/internal/pycore_interp.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='660352'> + <var-decl name='code_state' type-id='type-id-1123' visibility='default' filepath='./Include/internal/pycore_interp.h' line='249' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='660480'> + <var-decl name='dict_state' type-id='type-id-1142' visibility='default' filepath='./Include/internal/pycore_interp.h' line='251' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='661120'> + <var-decl name='exc_state' type-id='type-id-1145' visibility='default' filepath='./Include/internal/pycore_interp.h' line='252' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='661376'> + <var-decl name='mem_free_queue' type-id='type-id-1250' visibility='default' filepath='./Include/internal/pycore_interp.h' line='253' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='661568'> + <var-decl name='ast' type-id='type-id-1094' visibility='default' filepath='./Include/internal/pycore_interp.h' line='255' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='677184'> + <var-decl name='types' type-id='type-id-1251' visibility='default' filepath='./Include/internal/pycore_interp.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1544576'> + <var-decl name='callable_cache' type-id='type-id-1124' visibility='default' filepath='./Include/internal/pycore_interp.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1544832'> + <var-decl name='optimizer' type-id='type-id-1252' visibility='default' filepath='./Include/internal/pycore_interp.h' line='258' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1544896'> + <var-decl name='executor_list_head' type-id='type-id-771' visibility='default' filepath='./Include/internal/pycore_interp.h' line='259' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1544960'> + <var-decl name='rare_events' type-id='type-id-1241' visibility='default' filepath='./Include/internal/pycore_interp.h' line='261' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545024'> + <var-decl name='builtins_dict_watcher' type-id='type-id-338' visibility='default' filepath='./Include/internal/pycore_interp.h' line='262' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545088'> + <var-decl name='monitors' type-id='type-id-912' visibility='default' filepath='./Include/internal/pycore_interp.h' line='264' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545208'> + <var-decl name='sys_profile_initialized' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_interp.h' line='265' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545216'> + <var-decl name='sys_trace_initialized' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_interp.h' line='266' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545280'> + <var-decl name='sys_profiling_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545344'> + <var-decl name='sys_tracing_threads' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='268' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1545408'> + <var-decl name='monitoring_callables' type-id='type-id-761' visibility='default' filepath='./Include/internal/pycore_interp.h' line='269' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1554112'> + <var-decl name='monitoring_tool_names' type-id='type-id-760' visibility='default' filepath='./Include/internal/pycore_interp.h' line='270' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1554624'> + <var-decl name='cached_objects' type-id='type-id-1176' visibility='default' filepath='./Include/internal/pycore_interp.h' line='272' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1555904'> + <var-decl name='static_objects' type-id='type-id-1177' visibility='default' filepath='./Include/internal/pycore_interp.h' line='273' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1556992'> + <var-decl name='_initial_thread' type-id='type-id-1253' visibility='default' filepath='./Include/internal/pycore_interp.h' line='276' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1559680'> + <var-decl name='_interactive_src_count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='277' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1559744'> + <var-decl name='threads_preallocated' type-id='type-id-1254' visibility='default' filepath='./Include/internal/pycore_interp.h' line='279' column='1'/> + </data-member> + </class-decl> + <class-decl name='pythreads' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_interp.h' line='128' column='1' id='type-id-1243'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next_unique_id' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_interp.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='head' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_interp.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='main' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_interp.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='count' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_interp.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='stacksize' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_interp.h' line='140' column='1'/> + </data-member> + </class-decl> + <class-decl name='llist_node' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_llist.h' line='34' column='1' id='type-id-1255'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-1256' visibility='default' filepath='./Include/internal/pycore_llist.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='prev' type-id='type-id-1256' visibility='default' filepath='./Include/internal/pycore_llist.h' line='36' column='1'/> + </data-member> + </class-decl> + <class-decl name='PyEvent' size-in-bits='8' is-struct='yes' naming-typedef-id='type-id-1239' visibility='default' filepath='./Include/internal/pycore_lock.h' line='73' column='1' id='type-id-1257'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_lock.h' line='74' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyEvent' type-id='type-id-1257' filepath='./Include/internal/pycore_lock.h' line='75' column='1' id='type-id-1239'/> + <class-decl name='_PyRecursiveMutex' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1235' visibility='default' filepath='./Include/internal/pycore_lock.h' line='155' column='1' id='type-id-1258'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_lock.h' line='156' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='thread' type-id='type-id-376' visibility='default' filepath='./Include/internal/pycore_lock.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='level' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_lock.h' line='158' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyRecursiveMutex' type-id='type-id-1258' filepath='./Include/internal/pycore_lock.h' line='159' column='1' id='type-id-1235'/> + <class-decl name='_PyRWMutex' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_lock.h' line='192' column='1' id='type-id-1260'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='bits' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_lock.h' line='193' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyRWMutex' type-id='type-id-1260' filepath='./Include/internal/pycore_lock.h' line='194' column='1' id='type-id-1259'/> + <class-decl name='_PyObjectStackChunk' size-in-bits='16384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_stack.h' line='20' column='1' id='type-id-1261'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='prev' type-id='type-id-1162' visibility='default' filepath='./Include/internal/pycore_object_stack.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='n' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_object_stack.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='objs' type-id='type-id-758' visibility='default' filepath='./Include/internal/pycore_object_stack.h' line='23' column='1'/> + </data-member> + </class-decl> + <class-decl name='_py_object_runtime_state' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='14' column='1' id='type-id-1262'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_not_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='18' column='1'/> + </data-member> + </class-decl> + <class-decl name='_py_object_state' size-in-bits='28352' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='21' column='1' id='type-id-1248'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='freelists' type-id='type-id-398' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='28288'> + <var-decl name='_not_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_object_state.h' line='34' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='pymem_uint' type-id='type-id-101' filepath='./Include/internal/pycore_obmalloc.h' line='12' column='1' id='type-id-1263'/> + <typedef-decl name='pymem_block' type-id='type-id-305' filepath='./Include/internal/pycore_obmalloc.h' line='251' column='1' id='type-id-1264'/> + <class-decl name='pool_header' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='254' column='1' id='type-id-1265'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ref' type-id='type-id-1266' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='freeblock' type-id='type-id-1267' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nextpool' type-id='type-id-1268' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='258' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='prevpool' type-id='type-id-1268' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='259' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='arenaindex' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='260' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='szidx' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='261' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='nextoffset' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='262' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='maxnextoffset' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='263' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1' id='type-id-1266'> + <data-member access='public'> + <var-decl name='_padding' type-id='type-id-1267' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='255' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='count' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='256' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='poolp' type-id='type-id-1268' filepath='./Include/internal/pycore_obmalloc.h' line='266' column='1' id='type-id-846'/> + <class-decl name='arena_object' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='269' column='1' id='type-id-1269'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='address' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='275' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='pool_address' type-id='type-id-1267' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='278' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='nfreepools' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='283' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='ntotalpools' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='286' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='freepools' type-id='type-id-1268' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='289' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='nextarena' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='305' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='prevarena' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='306' column='1'/> + </data-member> + </class-decl> + <class-decl name='_obmalloc_pools' size-in-bits='4096' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='419' column='1' id='type-id-1270'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='used' type-id='type-id-847' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='420' column='1'/> + </data-member> + </class-decl> + <class-decl name='_obmalloc_mgmt' size-in-bits='4672' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='477' column='1' id='type-id-1271'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arenas' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='479' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='maxarenas' type-id='type-id-1263' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='481' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='unused_arena_objects' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='486' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='usable_arenas' type-id='type-id-800' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='491' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='nfp2lasta' type-id='type-id-801' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='494' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4416'> + <var-decl name='narenas_currently_allocated' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='497' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4480'> + <var-decl name='ntimes_arena_allocated' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='500' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4544'> + <var-decl name='narenas_highwater' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='502' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4608'> + <var-decl name='raw_allocated_blocks' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='504' column='1'/> + </data-member> + </class-decl> + <class-decl name='arena_coverage_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-792' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='619' column='1' id='type-id-1272'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tail_hi' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='620' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tail_lo' type-id='type-id-1109' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='621' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='arena_coverage_t' type-id='type-id-1272' filepath='./Include/internal/pycore_obmalloc.h' line='622' column='1' id='type-id-792'/> + <class-decl name='arena_map_bot' size-in-bits='1048576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='624' column='1' id='type-id-1273'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arenas' type-id='type-id-793' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='629' column='1'/> + </data-member> + </class-decl> + <class-decl name='arena_map_mid' size-in-bits='2097152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='633' column='1' id='type-id-1274'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ptrs' type-id='type-id-796' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='634' column='1'/> + </data-member> + </class-decl> + <class-decl name='arena_map_top' size-in-bits='2097152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='637' column='1' id='type-id-1275'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ptrs' type-id='type-id-799' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='638' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='arena_map_top_t' type-id='type-id-1275' filepath='./Include/internal/pycore_obmalloc.h' line='639' column='1' id='type-id-1276'/> + <class-decl name='_obmalloc_usage' size-in-bits='2097216' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='642' column='1' id='type-id-1277'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='arena_map_root' type-id='type-id-1276' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='648' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2097152'> + <var-decl name='arena_map_mid_count' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='650' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2097184'> + <var-decl name='arena_map_bot_count' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='651' column='1'/> + </data-member> + </class-decl> + <class-decl name='_obmalloc_global_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='660' column='1' id='type-id-1278'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='dump_debug_stats' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='661' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='interpreter_leaks' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='662' column='1'/> + </data-member> + </class-decl> + <class-decl name='_obmalloc_state' size-in-bits='2105984' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='665' column='1' id='type-id-1279'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='pools' type-id='type-id-1270' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='666' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='mgmt' type-id='type-id-1271' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='667' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8768'> + <var-decl name='usage' type-id='type-id-1277' visibility='default' filepath='./Include/internal/pycore_obmalloc.h' line='669' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyExecutorLinkListNode' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='15' column='1' id='type-id-1280'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-771' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='previous' type-id='type-id-771' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='17' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyExecutorLinkListNode' type-id='type-id-1280' filepath='./Include/internal/pycore_optimizer.h' line='18' column='1' id='type-id-1281'/> + <class-decl name='_bloom_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='25' column='1' id='type-id-1282'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='bits' type-id='type-id-859' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='26' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyBloomFilter' type-id='type-id-1282' filepath='./Include/internal/pycore_optimizer.h' line='27' column='1' id='type-id-1283'/> + <class-decl name='_PyVMData' size-in-bits='512' is-struct='yes' naming-typedef-id='type-id-1284' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='29' column='1' id='type-id-1285'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opcode' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='oparg' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='valid' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24'> + <var-decl name='linked' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='index' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='bloom' type-id='type-id-1283' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='links' type-id='type-id-1281' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='code' type-id='type-id-325' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='37' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyVMData' type-id='type-id-1285' filepath='./Include/internal/pycore_optimizer.h' line='38' column='1' id='type-id-1284'/> + <class-decl name='_PyUOpInstruction' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1286' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='56' column='1' id='type-id-1287'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='opcode' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='14'> + <var-decl name='format' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='oparg' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='' type-id='type-id-1288' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='operand' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='70' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__3' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='60' column='1' id='type-id-1288'> + <data-member access='public'> + <var-decl name='target' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='61' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='' type-id='type-id-1289' visibility='default'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__42' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='62' column='1' id='type-id-1289'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='' type-id='type-id-1290' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='error_target' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='67' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__4' size-in-bits='16' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='63' column='1' id='type-id-1290'> + <data-member access='public'> + <var-decl name='exit_index' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='64' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='jump_target' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='65' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='_PyUOpInstruction' type-id='type-id-1287' filepath='./Include/internal/pycore_optimizer.h' line='71' column='1' id='type-id-1286'/> + <class-decl name='_exit_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='97' column='1' id='type-id-1291'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='target' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='temperature' type-id='type-id-1103' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='executor' type-id='type-id-1292' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='100' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyExitData' type-id='type-id-1291' filepath='./Include/internal/pycore_optimizer.h' line='101' column='1' id='type-id-773'/> + <class-decl name='_PyExecutorObject' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='103' column='1' id='type-id-1293'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-320' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='trace' type-id='type-id-1294' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='vm_data' type-id='type-id-1284' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='exit_count' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='800'> + <var-decl name='code_size' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='jit_size' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='jit_code' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='jit_side_entry' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='exits' type-id='type-id-774' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='112' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyExecutorObject' type-id='type-id-1293' filepath='./Include/internal/pycore_optimizer.h' line='113' column='1' id='type-id-1295'/> + <typedef-decl name='_PyOptimizerObject' type-id='type-id-1296' filepath='./Include/internal/pycore_optimizer.h' line='115' column='1' id='type-id-1297'/> + <typedef-decl name='optimize_func' type-id='type-id-1298' filepath='./Include/internal/pycore_optimizer.h' line='118' column='1' id='type-id-1299'/> + <class-decl name='_PyOptimizerObject' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='123' column='1' id='type-id-1296'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='optimize' type-id='type-id-1299' visibility='default' filepath='./Include/internal/pycore_optimizer.h' line='125' column='1'/> + </data-member> + </class-decl> + <class-decl name='_parser_runtime_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_parser.h' line='21' column='1' id='type-id-1300'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_not_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_parser.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='dummy_name' type-id='type-id-1067' visibility='default' filepath='./Include/internal/pycore_parser.h' line='30' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyArena' type-id='type-id-822' filepath='./Include/internal/pycore_pyarena.h' line='13' column='1' id='type-id-1301'/> + <class-decl name='pyhash_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='77' column='1' id='type-id-1302'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='urandom_cache' type-id='type-id-1303' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='87' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__34' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='78' column='1' id='type-id-1303'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fd' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_dev' type-id='type-id-1304' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_ino' type-id='type-id-1305' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='82' column='1'/> + </data-member> + </class-decl> + <class-decl name='debug_alloc_api_t' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1306' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='30' column='1' id='type-id-1307'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='api_id' type-id='type-id-53' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='alloc' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='33' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='debug_alloc_api_t' type-id='type-id-1307' filepath='./Include/internal/pycore_pymem.h' line='34' column='1' id='type-id-1306'/> + <class-decl name='_pymem_allocators' size-in-bits='2432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='36' column='1' id='type-id-1308'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='standard' type-id='type-id-1309' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='debug' type-id='type-id-1310' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='is_debug_enabled' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2240'> + <var-decl name='obj_arena' type-id='type-id-503' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='49' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__32' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='38' column='1' id='type-id-1309'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='raw' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='mem' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='obj' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='41' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__33' size-in-bits='1152' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='43' column='1' id='type-id-1310'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='raw' type-id='type-id-1306' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='mem' type-id='type-id-1306' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='obj' type-id='type-id-1306' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='46' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_mem_interp_free_queue' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='52' column='1' id='type-id-1250'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='has_work' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='head' type-id='type-id-1255' visibility='default' filepath='./Include/internal/pycore_pymem.h' line='55' column='1'/> + </data-member> + </class-decl> + <class-decl name='_pythread_runtime_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='59' column='1' id='type-id-1311'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_condattr_monotonic' type-id='type-id-1312' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='handles' type-id='type-id-1255' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='82' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__35' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='64' column='1' id='type-id-1312'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ptr' type-id='type-id-1313' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='val' type-id='type-id-1314' visibility='default' filepath='./Include/internal/pycore_pythread.h' line='69' column='1'/> + </data-member> + </class-decl> + <class-decl name='_qsbr_thread_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='42' column='1' id='type-id-1315'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='seq' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='shared' type-id='type-id-1316' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tstate' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='deferrals' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='allocated' type-id='type-id-352' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='freelist_next' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='57' column='1'/> + </data-member> + </class-decl> + <class-decl name='_qsbr_pad' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='61' column='1' id='type-id-1317'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='qsbr' type-id='type-id-1315' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='__padding' type-id='type-id-808' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='63' column='1'/> + </data-member> + </class-decl> + <class-decl name='_qsbr_shared' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='67' column='1' id='type-id-1246'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='wr_seq' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='rd_seq' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='array' type-id='type-id-1318' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='freelist' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_qsbr.h' line='80' column='1'/> + </data-member> + </class-decl> + <class-decl name='_getargs_runtime_state' size-in-bits='64' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='28' column='1' id='type-id-1319'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='static_parsers' type-id='type-id-272' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='29' column='1'/> + </data-member> + </class-decl> + <class-decl name='_gilstate_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='34' column='1' id='type-id-1320'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='check_enabled' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='autoInterpreterState' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='42' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_AuditHookEntry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='56' column='1' id='type-id-1321'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next' type-id='type-id-1322' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='hookCFunction' type-id='type-id-240' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='userData' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='59' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_AuditHookEntry' type-id='type-id-1321' filepath='./Include/internal/pycore_runtime.h' line='60' column='1' id='type-id-1323'/> + <class-decl name='_Py_DebugOffsets' size-in-bits='4672' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='62' column='1' id='type-id-1324'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='cookie' type-id='type-id-815' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='version' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='free_threaded' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='runtime_state' type-id='type-id-1325' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='interpreter_state' type-id='type-id-1326' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='thread_state' type-id='type-id-1327' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='interpreter_frame' type-id='type-id-1328' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2176'> + <var-decl name='code_object' type-id='type-id-1329' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2816'> + <var-decl name='pyobject' type-id='type-id-1330' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2944'> + <var-decl name='type_object' type-id='type-id-1331' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='139' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3200'> + <var-decl name='tuple_object' type-id='type-id-1332' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='146' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3392'> + <var-decl name='list_object' type-id='type-id-1333' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='153' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3584'> + <var-decl name='dict_object' type-id='type-id-1334' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='160' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3776'> + <var-decl name='float_object' type-id='type-id-1335' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='166' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3904'> + <var-decl name='long_object' type-id='type-id-1336' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='173' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='bytes_object' type-id='type-id-1337' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='180' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4288'> + <var-decl name='unicode_object' type-id='type-id-1338' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='188' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4544'> + <var-decl name='gc' type-id='type-id-1339' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='194' column='1'/> + </data-member> + </class-decl> + <class-decl name='_runtime_state' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='67' column='1' id='type-id-1325'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='finalizing' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='interpreters_head' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='70' column='1'/> + </data-member> + </class-decl> + <class-decl name='_interpreter_state' size-in-bits='832' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='74' column='1' id='type-id-1326'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='id' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='next' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='threads_head' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='gc' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='imports_modules' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='sysdict' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='builtins' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='ceval_gil' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='gil_runtime_state' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='gil_runtime_state_enabled' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='gil_runtime_state_locked' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='gil_runtime_state_holder' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='87' column='1'/> + </data-member> + </class-decl> + <class-decl name='_thread_state' size-in-bits='576' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='91' column='1' id='type-id-1327'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='prev' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='next' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='interp' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='current_frame' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='thread_id' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='native_thread_id' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='datastack_chunk' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='status' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='100' column='1'/> + </data-member> + </class-decl> + <class-decl name='_interpreter_frame' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='104' column='1' id='type-id-1328'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='previous' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='executable' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='instr_ptr' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='localsplus' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='owner' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='110' column='1'/> + </data-member> + </class-decl> + <class-decl name='_code_object' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='114' column='1' id='type-id-1329'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='filename' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='name' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='qualname' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='linetable' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='119' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='firstlineno' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='argcount' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='localsplusnames' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='localspluskinds' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='co_code_adaptive' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='124' column='1'/> + </data-member> + </class-decl> + <class-decl name='_pyobject' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='128' column='1' id='type-id-1330'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_type' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='130' column='1'/> + </data-member> + </class-decl> + <class-decl name='_type_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='134' column='1' id='type-id-1331'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='135' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tp_name' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='136' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tp_repr' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='137' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tp_flags' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='138' column='1'/> + </data-member> + </class-decl> + <class-decl name='_tuple_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='142' column='1' id='type-id-1332'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='143' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_item' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='144' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='145' column='1'/> + </data-member> + </class-decl> + <class-decl name='_list_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='149' column='1' id='type-id-1333'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='150' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_item' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='151' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='152' column='1'/> + </data-member> + </class-decl> + <class-decl name='_dict_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='156' column='1' id='type-id-1334'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='157' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ma_keys' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='158' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ma_values' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='159' column='1'/> + </data-member> + </class-decl> + <class-decl name='_float_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='163' column='1' id='type-id-1335'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='164' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_fval' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='165' column='1'/> + </data-member> + </class-decl> + <class-decl name='_long_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='169' column='1' id='type-id-1336'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='170' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='lv_tag' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='171' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_digit' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='172' column='1'/> + </data-member> + </class-decl> + <class-decl name='_bytes_object' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='176' column='1' id='type-id-1337'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='177' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='178' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_sval' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='179' column='1'/> + </data-member> + </class-decl> + <class-decl name='_unicode_object' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='183' column='1' id='type-id-1338'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='184' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='state' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='185' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='length' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='186' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='asciiobject_size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='187' column='1'/> + </data-member> + </class-decl> + <class-decl name='_gc' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='191' column='1' id='type-id-1339'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='192' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='collecting' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='193' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_DebugOffsets' type-id='type-id-1324' filepath='./Include/internal/pycore_runtime.h' line='195' column='1' id='type-id-1340'/> + <class-decl name='_reftracer_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='198' column='1' id='type-id-1341'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tracer_func' type-id='type-id-403' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='199' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tracer_data' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='200' column='1'/> + </data-member> + </class-decl> + <class-decl name='pyruntimestate' size-in-bits='2267008' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='208' column='1' id='type-id-477'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='debug_offsets' type-id='type-id-1340' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='221' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4672'> + <var-decl name='_initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='227' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4704'> + <var-decl name='preinitializing' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='230' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4736'> + <var-decl name='preinitialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='233' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4768'> + <var-decl name='core_initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='236' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4800'> + <var-decl name='initialized' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='239' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4864'> + <var-decl name='_finalizing' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4928'> + <var-decl name='_finalizing_id' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4992'> + <var-decl name='interpreters' type-id='type-id-1342' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5248'> + <var-decl name='main_thread' type-id='type-id-2' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='271' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5312'> + <var-decl name='main_tstate' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='272' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5376'> + <var-decl name='xi' type-id='type-id-1140' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='280' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5568'> + <var-decl name='allocators' type-id='type-id-1308' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='282' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8000'> + <var-decl name='obmalloc' type-id='type-id-1278' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='283' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8128'> + <var-decl name='pyhash_state' type-id='type-id-1302' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='284' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8320'> + <var-decl name='threads' type-id='type-id-1311' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='285' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8640'> + <var-decl name='signals' type-id='type-id-1343' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='286' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17280'> + <var-decl name='autoTSSkey' type-id='type-id-1344' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='289' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17344'> + <var-decl name='trashTSSkey' type-id='type-id-1344' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='292' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17408'> + <var-decl name='orig_argv' type-id='type-id-951' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='294' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17536'> + <var-decl name='parser' type-id='type-id-1300' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='296' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='17984'> + <var-decl name='atexit' type-id='type-id-1095' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='298' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='20160'> + <var-decl name='imports' type-id='type-id-1231' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='300' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='20480'> + <var-decl name='ceval' type-id='type-id-1115' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='301' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79040'> + <var-decl name='gilstate' type-id='type-id-1320' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='302' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79168'> + <var-decl name='getargs' type-id='type-id-1319' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='303' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79232'> + <var-decl name='fileutils' type-id='type-id-1155' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='304' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='79296'> + <var-decl name='faulthandler' type-id='type-id-1150' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='305' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80640'> + <var-decl name='tracemalloc' type-id='type-id-1345' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='306' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82496'> + <var-decl name='ref_tracer' type-id='type-id-1341' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='307' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82624'> + <var-decl name='stoptheworld_mutex' type-id='type-id-1259' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='313' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82688'> + <var-decl name='stoptheworld' type-id='type-id-1238' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='314' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='82880'> + <var-decl name='preconfig' type-id='type-id-954' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='316' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83200'> + <var-decl name='open_code_hook' type-id='type-id-341' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='320' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83264'> + <var-decl name='open_code_userdata' type-id='type-id-30' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='321' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83328'> + <var-decl name='audit_hooks' type-id='type-id-1346' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='325' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83456'> + <var-decl name='object_state' type-id='type-id-1262' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='327' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83488'> + <var-decl name='float_state' type-id='type-id-1158' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='328' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83584'> + <var-decl name='unicode_state' type-id='type-id-1347' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='329' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='83712'> + <var-decl name='types' type-id='type-id-1348' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='330' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='110656'> + <var-decl name='cached_objects' type-id='type-id-1171' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='333' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='110720'> + <var-decl name='static_objects' type-id='type-id-1172' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='334' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='707200'> + <var-decl name='_main_interpreter' type-id='type-id-1349' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='351' column='1'/> + </data-member> + </class-decl> + <class-decl name='pyinterpreters' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='250' column='1' id='type-id-1342'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='251' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='head' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='253' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='main' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='next_id' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='266' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__52' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='322' column='1' id='type-id-1346'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='323' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='head' type-id='type-id-1322' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='324' column='1'/> + </data-member> + </class-decl> + <class-decl name='_signals_runtime_state' size-in-bits='8640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='39' column='1' id='type-id-1343'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='handlers' type-id='type-id-785' visibility='default' filepath='./Include/internal/pycore_signal.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8320'> + <var-decl name='wakeup' type-id='type-id-1350' visibility='default' filepath='./Include/internal/pycore_signal.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8384'> + <var-decl name='is_tripped' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_signal.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8448'> + <var-decl name='default_handler' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_signal.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8512'> + <var-decl name='ignore_handler' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_signal.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8576'> + <var-decl name='unhandled_keyboard_interrupt' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_signal.h' line='79' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__36' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='40' column='1' id='type-id-784'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tripped' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_signal.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='func' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_signal.h' line='43' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__37' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_signal.h' line='46' column='1' id='type-id-1351'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fd' type-id='type-id-1352' visibility='default' filepath='./Include/internal/pycore_signal.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='warn_on_full_buffer' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_signal.h' line='57' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyTraceMalloc_Config' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='18' column='1' id='type-id-1353'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='initialized' type-id='type-id-535' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tracing' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='max_nframe' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='33' column='1'/> + </data-member> + </class-decl> + <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='./Include/internal/pycore_tracemalloc.h' line='21' column='1' id='type-id-535'> + <underlying-type type-id='type-id-32'/> + <enumerator name='TRACEMALLOC_NOT_INITIALIZED' value='0'/> + <enumerator name='TRACEMALLOC_INITIALIZED' value='1'/> + <enumerator name='TRACEMALLOC_FINALIZED' value='2'/> + </enum-decl> + <class-decl name='tracemalloc_frame' size-in-bits='96' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='47' column='1' id='type-id-854'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='lineno' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='51' column='1'/> + </data-member> + </class-decl> + <class-decl name='tracemalloc_traceback' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='57' column='1' id='type-id-1354'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='hash' type-id='type-id-1223' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='nframe' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='80'> + <var-decl name='total_nframe' type-id='type-id-445' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='frames' type-id='type-id-855' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='63' column='1'/> + </data-member> + </class-decl> + <class-decl name='_tracemalloc_runtime_state' size-in-bits='1856' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='67' column='1' id='type-id-1345'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='config' type-id='type-id-1353' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='allocators' type-id='type-id-1355' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='tables_lock' type-id='type-id-1154' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='traced_memory' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='peak_traced_memory' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='filenames' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='traceback' type-id='type-id-1356' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='tracebacks' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='traces' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='domains' type-id='type-id-546' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1600'> + <var-decl name='empty_traceback' type-id='type-id-1354' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1792'> + <var-decl name='reentrant_key' type-id='type-id-1344' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='106' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__51' size-in-bits='960' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='71' column='1' id='type-id-1355'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mem' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='raw' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='obj' type-id='type-id-501' visibility='default' filepath='./Include/internal/pycore_tracemalloc.h' line='74' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyThreadStateImpl' size-in-bits='2688' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='20' column='1' id='type-id-1357'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='base' type-id='type-id-1358' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2432'> + <var-decl name='asyncio_running_loop' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2496'> + <var-decl name='qsbr' type-id='type-id-509' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='2560'> + <var-decl name='mem_free_queue' type-id='type-id-1255' visibility='default' filepath='./Include/internal/pycore_tstate.h' line='27' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyThreadStateImpl' type-id='type-id-1357' filepath='./Include/internal/pycore_tstate.h' line='40' column='1' id='type-id-1253'/> + <class-decl name='_types_runtime_state' size-in-bits='26944' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='27' column='1' id='type-id-1348'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next_version_tag' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='managed_static' type-id='type-id-1359' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='38' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__53' size-in-bits='26880' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='33' column='1' id='type-id-1359'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='types' type-id='type-id-780' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='37' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__54' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='34' column='1' id='type-id-779'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='interp_count' type-id='type-id-460' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='36' column='1'/> + </data-member> + </class-decl> + <class-decl name='type_cache_entry' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='44' column='1' id='type-id-856'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='version' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='value' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='50' column='1'/> + </data-member> + </class-decl> + <class-decl name='type_cache' size-in-bits='786432' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='55' column='1' id='type-id-1360'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='hashtable' type-id='type-id-857' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='56' column='1'/> + </data-member> + </class-decl> + <class-decl name='managed_static_type_state' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-400' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='59' column='1' id='type-id-1361'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='isbuiltin' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='readying' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ready' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tp_dict' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tp_subclasses' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tp_weaklist' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='72' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='managed_static_type_state' type-id='type-id-1361' filepath='./Include/internal/pycore_typeobject.h' line='73' column='1' id='type-id-400'/> + <class-decl name='types_state' size-in-bits='867392' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='75' column='1' id='type-id-1251'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='next_version_tag' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='type_cache' type-id='type-id-1360' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='786496'> + <var-decl name='builtins' type-id='type-id-1362' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='863360'> + <var-decl name='for_extensions' type-id='type-id-1363' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='867328'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='129' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__803' size-in-bits='76864' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='119' column='1' id='type-id-1362'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='num_initialized' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='initialized' type-id='type-id-845' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='121' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__804' size-in-bits='3968' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='124' column='1' id='type-id-1363'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='num_initialized' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='next_index' type-id='type-id-21' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='126' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='initialized' type-id='type-id-843' visibility='default' filepath='./Include/internal/pycore_typeobject.h' line='127' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='pytype_slotdef' type-id='type-id-331' filepath='./Include/internal/pycore_typeobject.h' line='149' column='1' id='type-id-1364'/> + <class-decl name='_PyUnicode_Name_CAPI' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1365' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='16' column='1' id='type-id-1366'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='getname' type-id='type-id-1367' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='getcode' type-id='type-id-1368' visibility='default' filepath='./Include/internal/pycore_ucnhash.h' line='26' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyUnicode_Name_CAPI' type-id='type-id-1366' filepath='./Include/internal/pycore_ucnhash.h' line='29' column='1' id='type-id-1365'/> + <class-decl name='_Py_unicode_runtime_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='294' column='1' id='type-id-1369'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='295' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='next_index' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='298' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_unicode_runtime_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='301' column='1' id='type-id-1347'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ids' type-id='type-id-1369' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='302' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_unicode_fs_codec' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='307' column='1' id='type-id-1370'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='encoding' type-id='type-id-17' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='308' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='utf8' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='309' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='errors' type-id='type-id-17' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='310' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='error_handler' type-id='type-id-542' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='311' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_unicode_ids' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='314' column='1' id='type-id-1371'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='size' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='315' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='array' type-id='type-id-238' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='316' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_unicode_state' size-in-bits='448' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='319' column='1' id='type-id-1249'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='fs_codec' type-id='type-id-1370' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='320' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ucnhash_capi' type-id='type-id-1372' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='322' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ids' type-id='type-id-1371' visibility='default' filepath='./Include/internal/pycore_unicodeobject.h' line='325' column='1'/> + </data-member> + </class-decl> + <class-decl name='_warnings_runtime_state' size-in-bits='320' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='11' column='1' id='type-id-1245'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='filters' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='once_registry' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='default_action' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='mutex' type-id='type-id-693' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='filters_version' type-id='type-id-183' visibility='default' filepath='./Include/internal/pycore_warnings.h' line='18' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyCFunction' type-id='type-id-1373' filepath='./Include/methodobject.h' line='19' column='1' id='type-id-378'/> + <class-decl name='PyMethodDef' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/methodobject.h' line='59' column='1' id='type-id-1374'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ml_name' type-id='type-id-6' visibility='default' filepath='./Include/methodobject.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ml_meth' type-id='type-id-378' visibility='default' filepath='./Include/methodobject.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ml_flags' type-id='type-id-5' visibility='default' filepath='./Include/methodobject.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ml_doc' type-id='type-id-6' visibility='default' filepath='./Include/methodobject.h' line='64' column='1'/> + </data-member> + </class-decl> + <class-decl name='_object' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/object.h' line='163' column='1' id='type-id-1375'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='' type-id='type-id-1376' visibility='default'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ob_type' type-id='type-id-1' visibility='default' filepath='./Include/object.h' line='185' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='./Include/object.h' line='175' column='1' id='type-id-1376'> + <data-member access='public'> + <var-decl name='ob_refcnt' type-id='type-id-7' visibility='default' filepath='./Include/object.h' line='176' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='ob_refcnt_split' type-id='type-id-858' visibility='default' filepath='./Include/object.h' line='178' column='1'/> + </data-member> + </union-decl> + <class-decl name='PyVarObject' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-320' visibility='default' filepath='./Include/object.h' line='224' column='1' id='type-id-1377'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/object.h' line='225' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ob_size' type-id='type-id-7' visibility='default' filepath='./Include/object.h' line='226' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyVarObject' type-id='type-id-1377' filepath='./Include/object.h' line='227' column='1' id='type-id-320'/> + <typedef-decl name='unaryfunc' type-id='type-id-1378' filepath='./Include/object.h' line='461' column='1' id='type-id-970'/> + <typedef-decl name='binaryfunc' type-id='type-id-1373' filepath='./Include/object.h' line='462' column='1' id='type-id-968'/> + <typedef-decl name='ternaryfunc' type-id='type-id-1379' filepath='./Include/object.h' line='463' column='1' id='type-id-969'/> + <typedef-decl name='inquiry' type-id='type-id-1380' filepath='./Include/object.h' line='464' column='1' id='type-id-313'/> + <typedef-decl name='lenfunc' type-id='type-id-1381' filepath='./Include/object.h' line='465' column='1' id='type-id-973'/> + <typedef-decl name='ssizeargfunc' type-id='type-id-1382' filepath='./Include/object.h' line='466' column='1' id='type-id-974'/> + <typedef-decl name='ssizeobjargproc' type-id='type-id-1383' filepath='./Include/object.h' line='468' column='1' id='type-id-975'/> + <typedef-decl name='objobjargproc' type-id='type-id-1384' filepath='./Include/object.h' line='470' column='1' id='type-id-979'/> + <typedef-decl name='objobjproc' type-id='type-id-1385' filepath='./Include/object.h' line='472' column='1' id='type-id-976'/> + <typedef-decl name='visitproc' type-id='type-id-336' filepath='./Include/object.h' line='473' column='1' id='type-id-337'/> + <typedef-decl name='traverseproc' type-id='type-id-1386' filepath='./Include/object.h' line='474' column='1' id='type-id-312'/> + <typedef-decl name='freefunc' type-id='type-id-510' filepath='./Include/object.h' line='477' column='1' id='type-id-385'/> + <typedef-decl name='destructor' type-id='type-id-310' filepath='./Include/object.h' line='478' column='1' id='type-id-988'/> + <typedef-decl name='getattrfunc' type-id='type-id-1387' filepath='./Include/object.h' line='479' column='1' id='type-id-989'/> + <typedef-decl name='getattrofunc' type-id='type-id-1373' filepath='./Include/object.h' line='480' column='1' id='type-id-997'/> + <typedef-decl name='setattrfunc' type-id='type-id-1388' filepath='./Include/object.h' line='481' column='1' id='type-id-990'/> + <typedef-decl name='setattrofunc' type-id='type-id-1384' filepath='./Include/object.h' line='482' column='1' id='type-id-998'/> + <typedef-decl name='reprfunc' type-id='type-id-1378' filepath='./Include/object.h' line='483' column='1' id='type-id-992'/> + <typedef-decl name='hashfunc' type-id='type-id-1389' filepath='./Include/object.h' line='484' column='1' id='type-id-996'/> + <typedef-decl name='richcmpfunc' type-id='type-id-1390' filepath='./Include/object.h' line='485' column='1' id='type-id-1000'/> + <typedef-decl name='getiterfunc' type-id='type-id-1378' filepath='./Include/object.h' line='486' column='1' id='type-id-1001'/> + <typedef-decl name='iternextfunc' type-id='type-id-1378' filepath='./Include/object.h' line='487' column='1' id='type-id-1002'/> + <typedef-decl name='descrgetfunc' type-id='type-id-1379' filepath='./Include/object.h' line='488' column='1' id='type-id-1003'/> + <typedef-decl name='descrsetfunc' type-id='type-id-1384' filepath='./Include/object.h' line='489' column='1' id='type-id-1004'/> + <typedef-decl name='initproc' type-id='type-id-1384' filepath='./Include/object.h' line='490' column='1' id='type-id-1005'/> + <typedef-decl name='newfunc' type-id='type-id-1391' filepath='./Include/object.h' line='491' column='1' id='type-id-1007'/> + <typedef-decl name='allocfunc' type-id='type-id-1392' filepath='./Include/object.h' line='492' column='1' id='type-id-1006'/> + <typedef-decl name='vectorcallfunc' type-id='type-id-1393' filepath='./Include/object.h' line='495' column='1' id='type-id-309'/> + <enum-decl name='PySendResult' naming-typedef-id='type-id-264' filepath='./Include/object.h' line='1141' column='1' id='type-id-1394'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PYGEN_RETURN' value='0'/> + <enumerator name='PYGEN_ERROR' value='-1'/> + <enumerator name='PYGEN_NEXT' value='1'/> + </enum-decl> + <typedef-decl name='PySendResult' type-id='type-id-1394' filepath='./Include/object.h' line='1145' column='1' id='type-id-264'/> + <class-decl name='Py_buffer' size-in-bits='640' is-struct='yes' naming-typedef-id='type-id-253' visibility='default' filepath='./Include/pybuffer.h' line='20' column='1' id='type-id-1395'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buf' type-id='type-id-30' visibility='default' filepath='./Include/pybuffer.h' line='21' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='obj' type-id='type-id-4' visibility='default' filepath='./Include/pybuffer.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='len' type-id='type-id-7' visibility='default' filepath='./Include/pybuffer.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='itemsize' type-id='type-id-7' visibility='default' filepath='./Include/pybuffer.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='readonly' type-id='type-id-5' visibility='default' filepath='./Include/pybuffer.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='ndim' type-id='type-id-5' visibility='default' filepath='./Include/pybuffer.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='format' type-id='type-id-17' visibility='default' filepath='./Include/pybuffer.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='shape' type-id='type-id-8' visibility='default' filepath='./Include/pybuffer.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='strides' type-id='type-id-8' visibility='default' filepath='./Include/pybuffer.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='suboffsets' type-id='type-id-8' visibility='default' filepath='./Include/pybuffer.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='internal' type-id='type-id-30' visibility='default' filepath='./Include/pybuffer.h' line='32' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Py_buffer' type-id='type-id-1395' filepath='./Include/pybuffer.h' line='33' column='1' id='type-id-253'/> + <typedef-decl name='getbufferproc' type-id='type-id-1396' filepath='./Include/pybuffer.h' line='35' column='1' id='type-id-529'/> + <typedef-decl name='releasebufferproc' type-id='type-id-1397' filepath='./Include/pybuffer.h' line='36' column='1' id='type-id-986'/> + <typedef-decl name='Py_ssize_t' type-id='type-id-184' filepath='./Include/pyport.h' line='127' column='1' id='type-id-7'/> + <typedef-decl name='Py_hash_t' type-id='type-id-7' filepath='./Include/pyport.h' line='141' column='1' id='type-id-301'/> + <typedef-decl name='Py_uhash_t' type-id='type-id-21' filepath='./Include/pyport.h' line='144' column='1' id='type-id-1223'/> + <typedef-decl name='PyThread_type_lock' type-id='type-id-30' filepath='./Include/pythread.h' line='4' column='1' id='type-id-1154'/> + <typedef-decl name='Py_tss_t' type-id='type-id-1033' filepath='./Include/pythread.h' line='90' column='1' id='type-id-1344'/> + <typedef-decl name='PyMethodDef' type-id='type-id-1374' filepath='./Include/pytypedefs.h' line='14' column='1' id='type-id-1398'/> + <typedef-decl name='PyGetSetDef' type-id='type-id-1045' filepath='./Include/pytypedefs.h' line='15' column='1' id='type-id-1399'/> + <typedef-decl name='PyMemberDef' type-id='type-id-1046' filepath='./Include/pytypedefs.h' line='16' column='1' id='type-id-1400'/> + <typedef-decl name='PyObject' type-id='type-id-1375' filepath='./Include/pytypedefs.h' line='18' column='1' id='type-id-356'/> + <typedef-decl name='PyLongObject' type-id='type-id-961' filepath='./Include/pytypedefs.h' line='19' column='1' id='type-id-251'/> + <typedef-decl name='PyTypeObject' type-id='type-id-987' filepath='./Include/pytypedefs.h' line='20' column='1' id='type-id-266'/> + <typedef-decl name='PyCodeObject' type-id='type-id-923' filepath='./Include/pytypedefs.h' line='21' column='1' id='type-id-1401'/> + <typedef-decl name='PyFrameObject' type-id='type-id-1159' filepath='./Include/pytypedefs.h' line='22' column='1' id='type-id-1402'/> + <typedef-decl name='PyThreadState' type-id='type-id-1028' filepath='./Include/pytypedefs.h' line='24' column='1' id='type-id-1358'/> + <typedef-decl name='PyInterpreterState' type-id='type-id-1242' filepath='./Include/pytypedefs.h' line='25' column='1' id='type-id-1349'/> + <class-decl name='PySliceObject' size-in-bits='320' is-struct='yes' naming-typedef-id='type-id-1403' visibility='default' filepath='./Include/sliceobject.h' line='26' column='1' id='type-id-1404'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/sliceobject.h' line='27' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='start' type-id='type-id-4' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='stop' type-id='type-id-4' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='step' type-id='type-id-4' visibility='default' filepath='./Include/sliceobject.h' line='28' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PySliceObject' type-id='type-id-1404' filepath='./Include/sliceobject.h' line='29' column='1' id='type-id-1403'/> + <typedef-decl name='Py_UCS4' type-id='type-id-326' filepath='./Include/unicodeobject.h' line='94' column='1' id='type-id-259'/> + <typedef-decl name='__sighandler_t' type-id='type-id-1405' filepath='/usr/include/signal.h' line='72' column='1' id='type-id-1406'/> + <typedef-decl name='uintptr_t' type-id='type-id-2' filepath='/usr/include/stdint.h' line='90' column='1' id='type-id-427'/> + <union-decl name='__atomic_wide_counter' size-in-bits='64' naming-typedef-id='type-id-1407' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='25' column='1' id='type-id-1408'> + <data-member access='public'> + <var-decl name='__value64' type-id='type-id-376' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='27' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__value32' type-id='type-id-1409' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='32' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__31' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='28' column='1' id='type-id-1409'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__low' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__high' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='31' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__atomic_wide_counter' type-id='type-id-1408' filepath='/usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h' line='33' column='1' id='type-id-1407'/> + <union-decl name='pthread_condattr_t' size-in-bits='32' naming-typedef-id='type-id-1314' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='41' column='1' id='type-id-1410'> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-814' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='43' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='44' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_condattr_t' type-id='type-id-1410' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='45' column='1' id='type-id-1314'/> + <typedef-decl name='pthread_key_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='49' column='1' id='type-id-507'/> + <union-decl name='pthread_mutex_t' size-in-bits='320' naming-typedef-id='type-id-1170' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='67' column='1' id='type-id-1411'> + <data-member access='public'> + <var-decl name='__data' type-id='type-id-1412' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='69' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-810' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='70' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='71' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutex_t' type-id='type-id-1411' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='72' column='1' id='type-id-1170'/> + <union-decl name='pthread_cond_t' size-in-bits='384' naming-typedef-id='type-id-1169' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='75' column='1' id='type-id-1413'> + <data-member access='public'> + <var-decl name='__data' type-id='type-id-1414' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='77' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-812' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='78' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-377' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='79' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_cond_t' type-id='type-id-1413' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='80' column='1' id='type-id-1169'/> + <class-decl name='sigaction' size-in-bits='1216' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='27' column='1' id='type-id-1147'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__sigaction_handler' type-id='type-id-1415' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='sa_mask' type-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='sa_flags' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='sa_restorer' type-id='type-id-233' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='52' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='31' column='1' id='type-id-1415'> + <data-member access='public'> + <var-decl name='sa_handler' type-id='type-id-1406' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='34' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='sa_sigaction' type-id='type-id-1416' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/sigaction.h' line='36' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='int8_t' type-id='type-id-1417' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='24' column='1' id='type-id-358'/> + <typedef-decl name='int32_t' type-id='type-id-1418' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='26' column='1' id='type-id-1109'/> + <typedef-decl name='int64_t' type-id='type-id-1419' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='27' column='1' id='type-id-460'/> + <typedef-decl name='uint8_t' type-id='type-id-1420' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='24' column='1' id='type-id-305'/> + <typedef-decl name='uint16_t' type-id='type-id-1421' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='25' column='1' id='type-id-445'/> + <typedef-decl name='uint32_t' type-id='type-id-1422' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='26' column='1' id='type-id-326'/> + <typedef-decl name='uint64_t' type-id='type-id-1423' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h' line='27' column='1' id='type-id-108'/> + <class-decl name='__pthread_mutex_s' size-in-bits='320' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='22' column='1' id='type-id-1412'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__lock' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__count' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__owner' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='26' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__nusers' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__kind' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='32' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='__spins' type-id='type-id-78' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='176'> + <var-decl name='__elision' type-id='type-id-78' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='__list' type-id='type-id-1424' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_mutex.h' line='36' column='1'/> + </data-member> + </class-decl> + <class-decl name='__pthread_internal_list' size-in-bits='128' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='51' column='1' id='type-id-1425'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__prev' type-id='type-id-1426' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__next' type-id='type-id-1426' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='54' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__pthread_list_t' type-id='type-id-1425' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='55' column='1' id='type-id-1424'/> + <class-decl name='__pthread_cond_s' size-in-bits='384' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='94' column='1' id='type-id-1414'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__wseq' type-id='type-id-1407' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='__g1_start' type-id='type-id-1407' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='__g_refs' type-id='type-id-905' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='__g_size' type-id='type-id-905' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='__g1_orig_size' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='__wrefs' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='__g_signals' type-id='type-id-905' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h' line='102' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__int8_t' type-id='type-id-851' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='37' column='1' id='type-id-1417'/> + <typedef-decl name='__uint8_t' type-id='type-id-91' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='38' column='1' id='type-id-1420'/> + <typedef-decl name='__uint16_t' type-id='type-id-22' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='40' column='1' id='type-id-1421'/> + <typedef-decl name='__int32_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='41' column='1' id='type-id-1418'/> + <typedef-decl name='__uint32_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='42' column='1' id='type-id-1422'/> + <typedef-decl name='__int64_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='44' column='1' id='type-id-1419'/> + <typedef-decl name='__uint64_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='45' column='1' id='type-id-1423'/> + <typedef-decl name='__dev_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='145' column='1' id='type-id-186'/> + <typedef-decl name='__uid_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='146' column='1' id='type-id-116'/> + <typedef-decl name='__ino64_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='149' column='1' id='type-id-90'/> + <typedef-decl name='__off_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='152' column='1' id='type-id-1427'/> + <typedef-decl name='__off64_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='153' column='1' id='type-id-14'/> + <typedef-decl name='__pid_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='154' column='1' id='type-id-118'/> + <typedef-decl name='__clock_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='156' column='1' id='type-id-103'/> + <typedef-decl name='__ssize_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='194' column='1' id='type-id-185'/> + <typedef-decl name='__sig_atomic_t' type-id='type-id-5' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='215' column='1' id='type-id-1428'/> + <typedef-decl name='FILE' type-id='type-id-1429' filepath='/usr/include/x86_64-linux-gnu/bits/types/FILE.h' line='7' column='1' id='type-id-1430'/> + <class-decl name='__sigset_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-37' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='5' column='1' id='type-id-1431'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__val' type-id='type-id-906' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='7' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__sigset_t' type-id='type-id-1431' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h' line='8' column='1' id='type-id-37'/> + <union-decl name='sigval' size-in-bits='64' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='24' column='1' id='type-id-1432'> + <data-member access='public'> + <var-decl name='sival_int' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='26' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='sival_ptr' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='27' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='__sigval_t' type-id='type-id-1432' filepath='/usr/include/x86_64-linux-gnu/bits/types/__sigval_t.h' line='30' column='1' id='type-id-1433'/> + <typedef-decl name='sig_atomic_t' type-id='type-id-1428' filepath='/usr/include/x86_64-linux-gnu/bits/types/sig_atomic_t.h' line='8' column='1' id='type-id-1352'/> + <class-decl name='siginfo_t' size-in-bits='1024' is-struct='yes' naming-typedef-id='type-id-1434' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='36' column='1' id='type-id-1435'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_signo' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_errno' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_code' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='__pad0' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_sifields' type-id='type-id-1436' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='123' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__6' size-in-bits='896' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='51' column='1' id='type-id-1436'> + <data-member access='public'> + <var-decl name='_pad' type-id='type-id-840' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='53' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_kill' type-id='type-id-1437' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='60' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_timer' type-id='type-id-1438' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='68' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_rt' type-id='type-id-1439' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='76' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigchld' type-id='type-id-1440' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='86' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigfault' type-id='type-id-1441' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='105' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigpoll' type-id='type-id-1442' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='112' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_sigsys' type-id='type-id-1443' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='121' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__44' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='56' column='1' id='type-id-1437'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='type-id-118' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='59' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__45' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='63' column='1' id='type-id-1438'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_tid' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_overrun' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_sigval' type-id='type-id-1433' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='67' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__46' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='71' column='1' id='type-id-1439'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='type-id-118' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_sigval' type-id='type-id-1433' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='75' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__47' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='79' column='1' id='type-id-1440'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_pid' type-id='type-id-118' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='si_uid' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_status' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='si_utime' type-id='type-id-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='si_stime' type-id='type-id-103' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='85' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__48' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='89' column='1' id='type-id-1441'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_addr' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_addr_lsb' type-id='type-id-78' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_bounds' type-id='type-id-1444' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='104' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__7' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='94' column='1' id='type-id-1444'> + <data-member access='public'> + <var-decl name='_addr_bnd' type-id='type-id-1445' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='101' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='_pkey' type-id='type-id-1422' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='103' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__49' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='97' column='1' id='type-id-1445'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_lower' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_upper' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='100' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__50' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='108' column='1' id='type-id-1442'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='si_band' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='si_fd' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='111' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__51' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='116' column='1' id='type-id-1443'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_call_addr' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_syscall' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='119' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='_arch' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='120' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='siginfo_t' type-id='type-id-1435' filepath='/usr/include/x86_64-linux-gnu/bits/types/siginfo_t.h' line='124' column='1' id='type-id-1434'/> + <class-decl name='stack_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-45' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='26' column='1' id='type-id-1446'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ss_sp' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='ss_flags' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ss_size' type-id='type-id-21' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='30' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='stack_t' type-id='type-id-1446' filepath='/usr/include/x86_64-linux-gnu/bits/types/stack_t.h' line='31' column='1' id='type-id-45'/> + <typedef-decl name='_IO_lock_t' type-id='type-id-3' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='43' column='1' id='type-id-1447'/> + <class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='49' column='1' id='type-id-1429'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='_flags' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='_IO_read_ptr' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='_IO_read_end' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='_IO_read_base' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_IO_write_base' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='_IO_write_ptr' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_IO_write_end' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='_IO_buf_base' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='_IO_buf_end' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='_IO_save_base' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='_IO_backup_base' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='_IO_save_end' type-id='type-id-17' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='_markers' type-id='type-id-1448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='_chain' type-id='type-id-1449' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_fileno' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='_flags2' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='_old_offset' type-id='type-id-1427' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='_cur_column' type-id='type-id-22' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1040'> + <var-decl name='_vtable_offset' type-id='type-id-851' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1048'> + <var-decl name='_shortbuf' type-id='type-id-805' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='_lock' type-id='type-id-1450' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='_offset' type-id='type-id-14' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='_codecvt' type-id='type-id-1451' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1280'> + <var-decl name='_wide_data' type-id='type-id-1452' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1344'> + <var-decl name='_freeres_list' type-id='type-id-1449' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1408'> + <var-decl name='_freeres_buf' type-id='type-id-30' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1472'> + <var-decl name='__pad5' type-id='type-id-21' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1536'> + <var-decl name='_mode' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1568'> + <var-decl name='_unused2' type-id='type-id-807' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='98' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='ino_t' type-id='type-id-90' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='49' column='1' id='type-id-1305'/> + <typedef-decl name='dev_t' type-id='type-id-186' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='59' column='1' id='type-id-1304'/> + <typedef-decl name='ssize_t' type-id='type-id-185' filepath='/usr/include/x86_64-linux-gnu/sys/types.h' line='108' column='1' id='type-id-184'/> + <typedef-decl name='wchar_t' type-id='type-id-5' filepath='/usr/lib/gcc/x86_64-linux-gnu/11/include/stddef.h' line='321' column='1' id='type-id-388'/> + <enum-decl name='decoding_state' filepath='Parser/lexer/state.h' line='13' column='1' id='type-id-675'> + <underlying-type type-id='type-id-32'/> + <enumerator name='STATE_INIT' value='0'/> + <enumerator name='STATE_SEEK_CODING' value='1'/> + <enumerator name='STATE_NORMAL' value='2'/> + </enum-decl> + <enum-decl name='interactive_underflow_t' filepath='Parser/lexer/state.h' line='19' column='1' id='type-id-676'> + <underlying-type type-id='type-id-32'/> + <enumerator name='IUNDERFLOW_NORMAL' value='0'/> + <enumerator name='IUNDERFLOW_STOP' value='1'/> + </enum-decl> + <class-decl name='token' size-in-bits='384' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='27' column='1' id='type-id-1453'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='end' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='metadata' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='31' column='1'/> + </data-member> + </class-decl> + <enum-decl name='tokenizer_mode_kind_t' filepath='Parser/lexer/state.h' line='34' column='1' id='type-id-1454'> + <underlying-type type-id='type-id-32'/> + <enumerator name='TOK_REGULAR_MODE' value='0'/> + <enumerator name='TOK_FSTRING_MODE' value='1'/> + </enum-decl> + <class-decl name='_tokenizer_mode' size-in-bits='768' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='41' column='1' id='type-id-1455'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-1454' visibility='default' filepath='Parser/lexer/state.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='curly_bracket_depth' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='curly_bracket_expr_start_depth' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='f_string_quote' type-id='type-id-53' visibility='default' filepath='Parser/lexer/state.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='f_string_quote_size' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='f_string_raw' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='f_string_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='f_string_multi_line_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='f_string_line_start' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='f_string_start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='f_string_multi_line_start_offset' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='last_expr_size' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='last_expr_end' type-id='type-id-7' visibility='default' filepath='Parser/lexer/state.h' line='58' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='last_expr_buffer' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='f_string_debug' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='in_format_spec' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='61' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='tokenizer_mode' type-id='type-id-1455' filepath='Parser/lexer/state.h' line='62' column='1' id='type-id-852'/> + <class-decl name='tok_state' size-in-bits='138176' is-struct='yes' visibility='default' filepath='Parser/lexer/state.h' line='65' column='1' id='type-id-671'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='buf' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='cur' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='inp' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='fp_interactive' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='interactive_src_start' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='interactive_src_end' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='end' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='done' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='fp' type-id='type-id-56' visibility='default' filepath='Parser/lexer/state.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='tabsize' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='672'> + <var-decl name='indent' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='indstack' type-id='type-id-672' visibility='default' filepath='Parser/lexer/state.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3904'> + <var-decl name='atbol' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3936'> + <var-decl name='pendin' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='83' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='3968'> + <var-decl name='prompt' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4032'> + <var-decl name='nextprompt' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4096'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='85' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4128'> + <var-decl name='first_lineno' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='86' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4160'> + <var-decl name='starting_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='88' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4192'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4224'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='4256'> + <var-decl name='parenstack' type-id='type-id-673' visibility='default' filepath='Parser/lexer/state.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='5856'> + <var-decl name='parenlinenostack' type-id='type-id-674' visibility='default' filepath='Parser/lexer/state.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='12256'> + <var-decl name='parencolstack' type-id='type-id-674' visibility='default' filepath='Parser/lexer/state.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18688'> + <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='18752'> + <var-decl name='altindstack' type-id='type-id-672' visibility='default' filepath='Parser/lexer/state.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21952'> + <var-decl name='decoding_state' type-id='type-id-675' visibility='default' filepath='Parser/lexer/state.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='21984'> + <var-decl name='decoding_erred' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='100' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22016'> + <var-decl name='encoding' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22080'> + <var-decl name='cont_line' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='102' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22144'> + <var-decl name='line_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22208'> + <var-decl name='multi_line_start' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22272'> + <var-decl name='decoding_readline' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22336'> + <var-decl name='decoding_buffer' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22400'> + <var-decl name='readline' type-id='type-id-4' visibility='default' filepath='Parser/lexer/state.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22464'> + <var-decl name='enc' type-id='type-id-6' visibility='default' filepath='Parser/lexer/state.h' line='110' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22528'> + <var-decl name='str' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22592'> + <var-decl name='input' type-id='type-id-17' visibility='default' filepath='Parser/lexer/state.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22656'> + <var-decl name='type_comments' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22688'> + <var-decl name='interactive_underflow' type-id='type-id-676' visibility='default' filepath='Parser/lexer/state.h' line='117' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22720'> + <var-decl name='underflow' type-id='type-id-677' visibility='default' filepath='Parser/lexer/state.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22784'> + <var-decl name='report_warnings' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='120' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='22848'> + <var-decl name='tok_mode_stack' type-id='type-id-678' visibility='default' filepath='Parser/lexer/state.h' line='122' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138048'> + <var-decl name='tok_mode_stack_index' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138080'> + <var-decl name='tok_extra_tokens' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138112'> + <var-decl name='comment_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='138144'> + <var-decl name='implicit_newline' type-id='type-id-5' visibility='default' filepath='Parser/lexer/state.h' line='126' column='1'/> + </data-member> + </class-decl> + <class-decl name='_memo' size-in-bits='256' is-struct='yes' visibility='default' filepath='Parser/pegen.h' line='27' column='1' id='type-id-1456'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='node' type-id='type-id-30' visibility='default' filepath='Parser/pegen.h' line='29' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mark' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='30' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='next' type-id='type-id-1457' visibility='default' filepath='Parser/pegen.h' line='31' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Memo' type-id='type-id-1456' filepath='Parser/pegen.h' line='32' column='1' id='type-id-1458'/> + <class-decl name='Token' size-in-bits='448' is-struct='yes' naming-typedef-id='type-id-1459' visibility='default' filepath='Parser/pegen.h' line='34' column='1' id='type-id-1460'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='bytes' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='memo' type-id='type-id-1461' visibility='default' filepath='Parser/pegen.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='metadata' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='40' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Token' type-id='type-id-1460' filepath='Parser/pegen.h' line='41' column='1' id='type-id-1459'/> + <class-decl name='KeywordToken' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1462' visibility='default' filepath='Parser/pegen.h' line='43' column='1' id='type-id-1463'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='str' type-id='type-id-6' visibility='default' filepath='Parser/pegen.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='type' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='45' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='KeywordToken' type-id='type-id-1463' filepath='Parser/pegen.h' line='46' column='1' id='type-id-1462'/> + <class-decl name='growable_comment_array' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-691' visibility='default' filepath='Parser/pegen.h' line='49' column='1' id='type-id-1464'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='items' type-id='type-id-1465' visibility='default' filepath='Parser/pegen.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='size' type-id='type-id-21' visibility='default' filepath='Parser/pegen.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='num_items' type-id='type-id-21' visibility='default' filepath='Parser/pegen.h' line='55' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='Parser/pegen.h' line='50' column='1' id='type-id-1466'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='comment' type-id='type-id-17' visibility='default' filepath='Parser/pegen.h' line='52' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='growable_comment_array' type-id='type-id-1464' filepath='Parser/pegen.h' line='56' column='1' id='type-id-691'/> + <class-decl name='Parser' size-in-bits='1280' is-struct='yes' naming-typedef-id='type-id-686' visibility='default' filepath='Parser/pegen.h' line='58' column='1' id='type-id-687'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tok' type-id='type-id-688' visibility='default' filepath='Parser/pegen.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tokens' type-id='type-id-689' visibility='default' filepath='Parser/pegen.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='mark' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='fill' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='size' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='arena' type-id='type-id-679' visibility='default' filepath='Parser/pegen.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='keywords' type-id='type-id-690' visibility='default' filepath='Parser/pegen.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='soft_keywords' type-id='type-id-248' visibility='default' filepath='Parser/pegen.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='n_keyword_lists' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='480'> + <var-decl name='start_rule' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='errcode' type-id='type-id-177' visibility='default' filepath='Parser/pegen.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='parsing_started' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='normalize' type-id='type-id-4' visibility='default' filepath='Parser/pegen.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='starting_lineno' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='starting_col_offset' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='error_indicator' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='800'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='feature_version' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='type_ignore_comments' type-id='type-id-691' visibility='default' filepath='Parser/pegen.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='known_err_token' type-id='type-id-685' visibility='default' filepath='Parser/pegen.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1152'> + <var-decl name='level' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1184'> + <var-decl name='call_invalid_rules' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='79' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1216'> + <var-decl name='debug' type-id='type-id-5' visibility='default' filepath='Parser/pegen.h' line='80' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='Parser' type-id='type-id-687' filepath='Parser/pegen.h' line='81' column='1' id='type-id-686'/> + <pointer-type-def type-id='type-id-1143' size-in-bits='64' id='type-id-747'/> + <pointer-type-def type-id='type-id-1430' size-in-bits='64' id='type-id-56'/> + <pointer-type-def type-id='type-id-1462' size-in-bits='64' id='type-id-1467'/> + <pointer-type-def type-id='type-id-1467' size-in-bits='64' id='type-id-690'/> + <pointer-type-def type-id='type-id-1458' size-in-bits='64' id='type-id-1461'/> + <pointer-type-def type-id='type-id-686' size-in-bits='64' id='type-id-684'/> + <pointer-type-def type-id='type-id-1301' size-in-bits='64' id='type-id-679'/> + <pointer-type-def type-id='type-id-816' size-in-bits='64' id='type-id-749'/> + <pointer-type-def type-id='type-id-982' size-in-bits='64' id='type-id-991'/> + <pointer-type-def type-id='type-id-1015' size-in-bits='64' id='type-id-1146'/> + <pointer-type-def type-id='type-id-984' size-in-bits='64' id='type-id-999'/> + <pointer-type-def type-id='type-id-1401' size-in-bits='64' id='type-id-325'/> + <pointer-type-def type-id='type-id-932' size-in-bits='64' id='type-id-1128'/> + <pointer-type-def type-id='type-id-512' size-in-bits='64' id='type-id-415'/> + <pointer-type-def type-id='type-id-936' size-in-bits='64' id='type-id-335'/> + <pointer-type-def type-id='type-id-935' size-in-bits='64' id='type-id-938'/> + <pointer-type-def type-id='type-id-943' size-in-bits='64' id='type-id-1161'/> + <pointer-type-def type-id='type-id-1402' size-in-bits='64' id='type-id-351'/> + <pointer-type-def type-id='type-id-945' size-in-bits='64' id='type-id-308'/> + <pointer-type-def type-id='type-id-1164' size-in-bits='64' id='type-id-1167'/> + <pointer-type-def type-id='type-id-1399' size-in-bits='64' id='type-id-334'/> + <pointer-type-def type-id='type-id-1210' size-in-bits='64' id='type-id-1213'/> + <pointer-type-def type-id='type-id-1179' size-in-bits='64' id='type-id-1129'/> + <pointer-type-def type-id='type-id-1349' size-in-bits='64' id='type-id-28'/> + <pointer-type-def type-id='type-id-956' size-in-bits='64' id='type-id-260'/> + <pointer-type-def type-id='type-id-977' size-in-bits='64' id='type-id-995'/> + <pointer-type-def type-id='type-id-1400' size-in-bits='64' id='type-id-333'/> + <pointer-type-def type-id='type-id-1398' size-in-bits='64' id='type-id-176'/> + <pointer-type-def type-id='type-id-966' size-in-bits='64' id='type-id-993'/> + <pointer-type-def type-id='type-id-356' size-in-bits='64' id='type-id-4'/> + <pointer-type-def type-id='type-id-390' size-in-bits='64' id='type-id-380'/> + <pointer-type-def type-id='type-id-1468' size-in-bits='64' id='type-id-1378'/> + <pointer-type-def type-id='type-id-1469' size-in-bits='64' id='type-id-1393'/> + <pointer-type-def type-id='type-id-1470' size-in-bits='64' id='type-id-1373'/> + <pointer-type-def type-id='type-id-1471' size-in-bits='64' id='type-id-1379'/> + <pointer-type-def type-id='type-id-1472' size-in-bits='64' id='type-id-1390'/> + <pointer-type-def type-id='type-id-1473' size-in-bits='64' id='type-id-933'/> + <pointer-type-def type-id='type-id-1474' size-in-bits='64' id='type-id-1387'/> + <pointer-type-def type-id='type-id-1475' size-in-bits='64' id='type-id-1382'/> + <pointer-type-def type-id='type-id-1476' size-in-bits='64' id='type-id-942'/> + <pointer-type-def type-id='type-id-1477' size-in-bits='64' id='type-id-1031'/> + <pointer-type-def type-id='type-id-1478' size-in-bits='64' id='type-id-1391'/> + <pointer-type-def type-id='type-id-1479' size-in-bits='64' id='type-id-1392'/> + <pointer-type-def type-id='type-id-1480' size-in-bits='64' id='type-id-1132'/> + <qualified-type-def type-id='type-id-4' const='yes' id='type-id-1481'/> + <pointer-type-def type-id='type-id-1481' size-in-bits='64' id='type-id-258'/> + <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-238'/> + <pointer-type-def type-id='type-id-971' size-in-bits='64' id='type-id-994'/> + <pointer-type-def type-id='type-id-1403' size-in-bits='64' id='type-id-514'/> + <pointer-type-def type-id='type-id-1358' size-in-bits='64' id='type-id-27'/> + <pointer-type-def type-id='type-id-1035' size-in-bits='64' id='type-id-763'/> + <pointer-type-def type-id='type-id-266' size-in-bits='64' id='type-id-1'/> + <pointer-type-def type-id='type-id-259' size-in-bits='64' id='type-id-547'/> + <pointer-type-def type-id='type-id-253' size-in-bits='64' id='type-id-263'/> + <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-8'/> + <pointer-type-def type-id='type-id-1459' size-in-bits='64' id='type-id-685'/> + <pointer-type-def type-id='type-id-685' size-in-bits='64' id='type-id-689'/> + <pointer-type-def type-id='type-id-1429' size-in-bits='64' id='type-id-1449'/> + <pointer-type-def type-id='type-id-817' size-in-bits='64' id='type-id-1451'/> + <pointer-type-def type-id='type-id-1447' size-in-bits='64' id='type-id-1450'/> + <pointer-type-def type-id='type-id-818' size-in-bits='64' id='type-id-1448'/> + <pointer-type-def type-id='type-id-819' size-in-bits='64' id='type-id-1452'/> + <pointer-type-def type-id='type-id-964' size-in-bits='64' id='type-id-272'/> + <pointer-type-def type-id='type-id-820' size-in-bits='64' id='type-id-769'/> + <pointer-type-def type-id='type-id-913' size-in-bits='64' id='type-id-925'/> + <pointer-type-def type-id='type-id-915' size-in-bits='64' id='type-id-922'/> + <pointer-type-def type-id='type-id-919' size-in-bits='64' id='type-id-926'/> + <pointer-type-def type-id='type-id-1131' size-in-bits='64' id='type-id-1482'/> + <pointer-type-def type-id='type-id-357' size-in-bits='64' id='type-id-239'/> + <pointer-type-def type-id='type-id-917' size-in-bits='64' id='type-id-924'/> + <pointer-type-def type-id='type-id-1293' size-in-bits='64' id='type-id-771'/> + <pointer-type-def type-id='type-id-771' size-in-bits='64' id='type-id-1483'/> + <pointer-type-def type-id='type-id-362' size-in-bits='64' id='type-id-367'/> + <pointer-type-def type-id='type-id-1261' size-in-bits='64' id='type-id-1162'/> + <pointer-type-def type-id='type-id-1297' size-in-bits='64' id='type-id-1252'/> + <pointer-type-def type-id='type-id-1027' size-in-bits='64' id='type-id-1030'/> + <pointer-type-def type-id='type-id-1253' size-in-bits='64' id='type-id-1254'/> + <pointer-type-def type-id='type-id-1365' size-in-bits='64' id='type-id-1372'/> + <pointer-type-def type-id='type-id-1321' size-in-bits='64' id='type-id-1322'/> + <pointer-type-def type-id='type-id-1120' size-in-bits='64' id='type-id-1160'/> + <pointer-type-def type-id='type-id-1221' size-in-bits='64' id='type-id-1484'/> + <pointer-type-def type-id='type-id-1485' size-in-bits='64' id='type-id-1226'/> + <pointer-type-def type-id='type-id-539' size-in-bits='64' id='type-id-546'/> + <pointer-type-def type-id='type-id-1215' size-in-bits='64' id='type-id-1216'/> + <pointer-type-def type-id='type-id-1217' size-in-bits='64' id='type-id-1220'/> + <pointer-type-def type-id='type-id-1218' size-in-bits='64' id='type-id-1230'/> + <pointer-type-def type-id='type-id-1466' size-in-bits='64' id='type-id-1465'/> + <pointer-type-def type-id='type-id-1425' size-in-bits='64' id='type-id-1426'/> + <pointer-type-def type-id='type-id-821' size-in-bits='64' id='type-id-302'/> + <pointer-type-def type-id='type-id-1092' size-in-bits='64' id='type-id-1056'/> + <pointer-type-def type-id='type-id-1091' size-in-bits='64' id='type-id-1055'/> + <pointer-type-def type-id='type-id-1090' size-in-bits='64' id='type-id-1054'/> + <pointer-type-def type-id='type-id-1023' size-in-bits='64' id='type-id-1024'/> + <pointer-type-def type-id='type-id-1067' size-in-bits='64' id='type-id-1049'/> + <pointer-type-def type-id='type-id-1168' size-in-bits='64' id='type-id-1119'/> + <pointer-type-def type-id='type-id-950' size-in-bits='64' id='type-id-1232'/> + <pointer-type-def type-id='type-id-1093' size-in-bits='64' id='type-id-1057'/> + <pointer-type-def type-id='type-id-1456' size-in-bits='64' id='type-id-1457'/> + <pointer-type-def type-id='type-id-1279' size-in-bits='64' id='type-id-1247'/> + <pointer-type-def type-id='type-id-1317' size-in-bits='64' id='type-id-1318'/> + <pointer-type-def type-id='type-id-1246' size-in-bits='64' id='type-id-1316'/> + <pointer-type-def type-id='type-id-1315' size-in-bits='64' id='type-id-509'/> + <pointer-type-def type-id='type-id-1025' size-in-bits='64' id='type-id-1026'/> + <pointer-type-def type-id='type-id-1137' size-in-bits='64' id='type-id-1138'/> + <pointer-type-def type-id='type-id-1273' size-in-bits='64' id='type-id-795'/> + <pointer-type-def type-id='type-id-1274' size-in-bits='64' id='type-id-798'/> + <pointer-type-def type-id='type-id-1269' size-in-bits='64' id='type-id-800'/> + <pointer-type-def type-id='type-id-1062' size-in-bits='64' id='type-id-681'/> + <pointer-type-def type-id='type-id-1060' size-in-bits='64' id='type-id-742'/> + <pointer-type-def type-id='type-id-1058' size-in-bits='64' id='type-id-610'/> + <pointer-type-def type-id='type-id-1047' size-in-bits='64' id='type-id-680'/> + <pointer-type-def type-id='type-id-1064' size-in-bits='64' id='type-id-636'/> + <pointer-type-def type-id='type-id-1096' size-in-bits='64' id='type-id-1097'/> + <pointer-type-def type-id='type-id-1099' size-in-bits='64' id='type-id-1486'/> + <pointer-type-def type-id='type-id-1486' size-in-bits='64' id='type-id-1102'/> + <pointer-type-def type-id='type-id-17' size-in-bits='64' id='type-id-248'/> + <pointer-type-def type-id='type-id-824' size-in-bits='64' id='type-id-1117'/> + <qualified-type-def type-id='type-id-1293' const='yes' id='type-id-1487'/> + <pointer-type-def type-id='type-id-1487' size-in-bits='64' id='type-id-1292'/> + <qualified-type-def type-id='type-id-1286' const='yes' id='type-id-1488'/> + <pointer-type-def type-id='type-id-1488' size-in-bits='64' id='type-id-1294'/> + <pointer-type-def type-id='type-id-528' size-in-bits='64' id='type-id-965'/> + <pointer-type-def type-id='type-id-172' size-in-bits='64' id='type-id-180'/> + <pointer-type-def type-id='type-id-1149' size-in-bits='64' id='type-id-1153'/> + <pointer-type-def type-id='type-id-1489' size-in-bits='64' id='type-id-1380'/> + <pointer-type-def type-id='type-id-1490' size-in-bits='64' id='type-id-1021'/> + <pointer-type-def type-id='type-id-1491' size-in-bits='64' id='type-id-1385'/> + <pointer-type-def type-id='type-id-1492' size-in-bits='64' id='type-id-1384'/> + <pointer-type-def type-id='type-id-1493' size-in-bits='64' id='type-id-1043'/> + <pointer-type-def type-id='type-id-1494' size-in-bits='64' id='type-id-1396'/> + <pointer-type-def type-id='type-id-1495' size-in-bits='64' id='type-id-1388'/> + <pointer-type-def type-id='type-id-1496' size-in-bits='64' id='type-id-1011'/> + <pointer-type-def type-id='type-id-1497' size-in-bits='64' id='type-id-1383'/> + <pointer-type-def type-id='type-id-1498' size-in-bits='64' id='type-id-1386'/> + <pointer-type-def type-id='type-id-339' size-in-bits='64' id='type-id-336'/> + <pointer-type-def type-id='type-id-1499' size-in-bits='64' id='type-id-1135'/> + <pointer-type-def type-id='type-id-1500' size-in-bits='64' id='type-id-1008'/> + <pointer-type-def type-id='type-id-1501' size-in-bits='64' id='type-id-1298'/> + <pointer-type-def type-id='type-id-1502' size-in-bits='64' id='type-id-1034'/> + <pointer-type-def type-id='type-id-1503' size-in-bits='64' id='type-id-1368'/> + <pointer-type-def type-id='type-id-1504' size-in-bits='64' id='type-id-677'/> + <pointer-type-def type-id='type-id-1505' size-in-bits='64' id='type-id-929'/> + <pointer-type-def type-id='type-id-1506' size-in-bits='64' id='type-id-941'/> + <pointer-type-def type-id='type-id-1507' size-in-bits='64' id='type-id-949'/> + <pointer-type-def type-id='type-id-1508' size-in-bits='64' id='type-id-1367'/> + <pointer-type-def type-id='type-id-265' size-in-bits='64' id='type-id-249'/> + <pointer-type-def type-id='type-id-190' size-in-bits='64' id='type-id-85'/> + <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-177'/> + <pointer-type-def type-id='type-id-1255' size-in-bits='64' id='type-id-1256'/> + <pointer-type-def type-id='type-id-1265' size-in-bits='64' id='type-id-1268'/> + <pointer-type-def type-id='type-id-1314' size-in-bits='64' id='type-id-1313'/> + <pointer-type-def type-id='type-id-1264' size-in-bits='64' id='type-id-1267'/> + <pointer-type-def type-id='type-id-477' size-in-bits='64' id='type-id-1244'/> + <pointer-type-def type-id='type-id-1364' size-in-bits='64' id='type-id-849'/> + <pointer-type-def type-id='type-id-1434' size-in-bits='64' id='type-id-188'/> + <pointer-type-def type-id='type-id-671' size-in-bits='64' id='type-id-688'/> + <pointer-type-def type-id='type-id-1453' size-in-bits='64' id='type-id-692'/> + <pointer-type-def type-id='type-id-1354' size-in-bits='64' id='type-id-1356'/> + <pointer-type-def type-id='type-id-1509' size-in-bits='64' id='type-id-980'/> + <pointer-type-def type-id='type-id-1510' size-in-bits='64' id='type-id-1389'/> + <pointer-type-def type-id='type-id-1511' size-in-bits='64' id='type-id-1381'/> + <pointer-type-def type-id='type-id-1512' size-in-bits='64' id='type-id-1225'/> + <pointer-type-def type-id='type-id-305' size-in-bits='64' id='type-id-921'/> + <pointer-type-def type-id='type-id-235' size-in-bits='64' id='type-id-233'/> + <pointer-type-def type-id='type-id-314' size-in-bits='64' id='type-id-310'/> + <pointer-type-def type-id='type-id-1513' size-in-bits='64' id='type-id-1397'/> + <pointer-type-def type-id='type-id-1514' size-in-bits='64' id='type-id-1405'/> + <pointer-type-def type-id='type-id-1515' size-in-bits='64' id='type-id-1416'/> + <pointer-type-def type-id='type-id-511' size-in-bits='64' id='type-id-510'/> + <pointer-type-def type-id='type-id-1516' size-in-bits='64' id='type-id-1020'/> + <pointer-type-def type-id='type-id-1517' size-in-bits='64' id='type-id-1014'/> + <pointer-type-def type-id='type-id-1518' size-in-bits='64' id='type-id-1114'/> + <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-30'/> + <pointer-type-def type-id='type-id-1519' size-in-bits='64' id='type-id-1113'/> + <pointer-type-def type-id='type-id-1520' size-in-bits='64' id='type-id-1229'/> + <pointer-type-def type-id='type-id-1521' size-in-bits='64' id='type-id-1013'/> + <pointer-type-def type-id='type-id-1522' size-in-bits='64' id='type-id-1018'/> + <pointer-type-def type-id='type-id-1523' size-in-bits='64' id='type-id-1019'/> + <pointer-type-def type-id='type-id-30' size-in-bits='64' id='type-id-262'/> + <qualified-type-def type-id='type-id-1351' volatile='yes' id='type-id-1350'/> + <pointer-type-def type-id='type-id-388' size-in-bits='64' id='type-id-58'/> + <pointer-type-def type-id='type-id-58' size-in-bits='64' id='type-id-241'/> + <class-decl name='PyAsyncGenASend' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-816'/> + <class-decl name='_IO_codecvt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-817'/> + <class-decl name='_IO_marker' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-818'/> + <class-decl name='_IO_wide_data' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-819'/> + <class-decl name='_PyAsyncGenWrappedValue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-820'/> + <class-decl name='_arena' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-822'/> + <class-decl name='code_arena_st' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-824'/> + <function-decl name='PyObject_Vectorcall' mangled-name='PyObject_Vectorcall' filepath='./Include/abstract.h' line='280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Vectorcall'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_FromStringAndSize' mangled-name='PyBytes_FromStringAndSize' filepath='./Include/bytesobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_FromStringAndSize'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyBytes_AsString' mangled-name='PyBytes_AsString' filepath='./Include/bytesobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_AsString'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyBytes_AsStringAndSize' mangled-name='PyBytes_AsStringAndSize' filepath='./Include/bytesobject.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyBytes_AsStringAndSize'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyComplex_FromCComplex' mangled-name='PyComplex_FromCComplex' filepath='./Include/cpython/complexobject.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyComplex_FromCComplex'> + <parameter type-id='type-id-324'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyType_Name' mangled-name='_PyType_Name' filepath='./Include/cpython/object.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyType_Name'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyUnicode_AsUTF8' mangled-name='PyUnicode_AsUTF8' filepath='./Include/cpython/unicodeobject.h' line='578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyFloat_FromDouble' mangled-name='PyFloat_FromDouble' filepath='./Include/floatobject.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyFloat_FromDouble'> + <parameter type-id='type-id-172'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyAST_Constant' filepath='./Include/internal/pycore_ast.h' line='825' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-659'/> + <parameter type-id='type-id-634'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyAST_Name' filepath='./Include/internal/pycore_ast.h' line='837' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-632'/> + <parameter type-id='type-id-682'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-609'/> + </function-decl> + <function-decl name='_PyImport_GetModuleAttrString' mangled-name='_PyImport_GetModuleAttrString' filepath='./Include/internal/pycore_import.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_GetModuleAttrString'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyArena_Malloc' mangled-name='_PyArena_Malloc' filepath='./Include/internal/pycore_pyarena.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_Malloc'> + <parameter type-id='type-id-679'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyArena_AddPyObject' mangled-name='_PyArena_AddPyObject' filepath='./Include/internal/pycore_pyarena.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_AddPyObject'> + <parameter type-id='type-id-679'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_InternImmortal' mangled-name='_PyUnicode_InternImmortal' filepath='./Include/internal/pycore_unicodeobject.h' line='286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_InternImmortal'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyLong_FromLong' mangled-name='PyLong_FromLong' filepath='./Include/longobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromLong'> + <parameter type-id='type-id-183'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyLong_FromString' mangled-name='PyLong_FromString' filepath='./Include/longobject.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyLong_FromString'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyOS_strtoul' mangled-name='PyOS_strtoul' filepath='./Include/longobject.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_strtoul'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='PyOS_strtol' mangled-name='PyOS_strtol' filepath='./Include/longobject.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_strtol'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='_Py_Dealloc' mangled-name='_Py_Dealloc' filepath='./Include/object.h' line='780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_Dealloc'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_SetString' mangled-name='PyErr_SetString' filepath='./Include/pyerrors.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_Occurred' mangled-name='PyErr_Occurred' filepath='./Include/pyerrors.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Occurred'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_Clear' mangled-name='PyErr_Clear' filepath='./Include/pyerrors.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Clear'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_GetRaisedException' mangled-name='PyErr_GetRaisedException' filepath='./Include/pyerrors.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetRaisedException'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_ExceptionMatches' mangled-name='PyErr_ExceptionMatches' filepath='./Include/pyerrors.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ExceptionMatches'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_NoMemory' mangled-name='PyErr_NoMemory' filepath='./Include/pyerrors.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NoMemory'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_Format' mangled-name='PyErr_Format' filepath='./Include/pyerrors.h' line='180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Format'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMem_Malloc' mangled-name='PyMem_Malloc' filepath='./Include/pymem.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Malloc'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyMem_Calloc' mangled-name='PyMem_Calloc' filepath='./Include/pymem.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Calloc'> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyMem_Realloc' mangled-name='PyMem_Realloc' filepath='./Include/pymem.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Realloc'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyMem_Free' mangled-name='PyMem_Free' filepath='./Include/pymem.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMem_Free'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyOS_string_to_double' mangled-name='PyOS_string_to_double' filepath='./Include/pystrtod.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_string_to_double'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyUnicode_FromString' mangled-name='PyUnicode_FromString' filepath='./Include/unicodeobject.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromString'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_InternFromString' mangled-name='PyUnicode_InternFromString' filepath='./Include/unicodeobject.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_InternFromString'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF8' mangled-name='PyUnicode_DecodeUTF8' filepath='./Include/unicodeobject.h' line='429' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF8'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_CompareWithASCIIString' mangled-name='PyUnicode_CompareWithASCIIString' filepath='./Include/unicodeobject.h' line='955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_CompareWithASCIIString'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='__errno_location' filepath='/usr/include/errno.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-177'/> + </function-decl> + <function-decl name='strncpy' filepath='/usr/include/string.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='strncmp' filepath='/usr/include/string.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='strchr' filepath='/usr/include/string.h' line='246' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='strlen' filepath='/usr/include/string.h' line='407' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='_PyTokenizer_Get' filepath='Parser/lexer/lexer.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-692'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_Free' filepath='Parser/lexer/state.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyToken_Free' filepath='Parser/lexer/state.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-692'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyToken_Init' filepath='Parser/lexer/state.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-692'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Pypegen_raise_decode_error' filepath='Parser/pegen.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_raise_tokenizer_init_error' filepath='Parser/pegen.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Pypegen_tokenizer_error' filepath='Parser/pegen.h' line='164' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_raise_error' filepath='Parser/pegen.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyPegen_raise_error_known_location' filepath='Parser/pegen.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-302'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_Pypegen_set_syntax_error' filepath='Parser/pegen.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <parameter type-id='type-id-685'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPegen_parse' filepath='Parser/pegen.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyTokenizer_FromString' filepath='Parser/tokenizer/tokenizer.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-688'/> + </function-decl> + <function-decl name='_PyTokenizer_FromUTF8' filepath='Parser/tokenizer/tokenizer.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-688'/> + </function-decl> + <function-decl name='_PyTokenizer_FromFile' filepath='Parser/tokenizer/tokenizer.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-688'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1468'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1469'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1470'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1471'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1472'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1473'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1474'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-17'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1475'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1476'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1477'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-367'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1478'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1479'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1480'> + <parameter type-id='type-id-1482'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1485'> + <parameter type-id='type-id-546'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-1484'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1489'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1490'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-351'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1491'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1492'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1493'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1494'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-263'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1495'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1496'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1009'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1497'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1498'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-337'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1499'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1482'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1500'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1501'> + <parameter type-id='type-id-1252'/> + <parameter type-id='type-id-367'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-1483'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1502'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1503'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-547'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1504'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1505'> + <parameter type-id='type-id-927'/> + <parameter type-id='type-id-325'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1506'> + <parameter type-id='type-id-939'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1507'> + <parameter type-id='type-id-947'/> + <parameter type-id='type-id-308'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1508'> + <parameter type-id='type-id-259'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1509'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-264'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1510'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-301'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1511'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1512'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-1223'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1513'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-263'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1514'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1515'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-188'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1516'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1517'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1518'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-101'/> + <parameter type-id='type-id-325'/> + <return type-id='type-id-3'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1519'> + <return type-id='type-id-30'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1520'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1521'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1522'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1523'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Parser/pegen_errors.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyErr_ProgramDecodedTextObject' mangled-name='_PyErr_ProgramDecodedTextObject' filepath='./Include/internal/pycore_pyerrors.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_ProgramDecodedTextObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_BuildValue' mangled-name='Py_BuildValue' filepath='./Include/modsupport.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_BuildValue'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_Str' mangled-name='PyObject_Str' filepath='./Include/object.h' line='563' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_Str'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetNone' mangled-name='PyErr_SetNone' filepath='./Include/pyerrors.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetNone'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_SetObject' mangled-name='PyErr_SetObject' filepath='./Include/pyerrors.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_Fetch' mangled-name='PyErr_Fetch' filepath='./Include/pyerrors.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Fetch'> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_Restore' mangled-name='PyErr_Restore' filepath='./Include/pyerrors.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Restore'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyTuple_Pack' mangled-name='PyTuple_Pack' filepath='./Include/tupleobject.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTuple_Pack'> + <parameter type-id='type-id-7'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_FromStringAndSize' mangled-name='PyUnicode_FromStringAndSize' filepath='./Include/unicodeobject.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromStringAndSize'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnicode_FromFormatV' mangled-name='PyUnicode_FromFormatV' filepath='./Include/unicodeobject.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_FromFormatV'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-302'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyPegen_fill_token' filepath='Parser/pegen.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-684'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_byte_offset_to_character_offset' filepath='Parser/pegen.h' line='152' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/string_parser.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-6' size-in-bits='64' id='type-id-261'/> + <function-decl name='PyErr_WarnExplicitObject' mangled-name='PyErr_WarnExplicitObject' filepath='./Include/cpython/warnings.h' line='5' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyBytes_DecodeEscape' mangled-name='_PyBytes_DecodeEscape' filepath='./Include/internal/pycore_bytesobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyBytes_DecodeEscape'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-261'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyUnicode_DecodeUnicodeEscapeInternal' mangled-name='_PyUnicode_DecodeUnicodeEscapeInternal' filepath='./Include/internal/pycore_unicodeobject.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyUnicode_DecodeUnicodeEscapeInternal'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-8'/> + <parameter type-id='type-id-261'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_BadInternalCall' mangled-name='_PyErr_BadInternalCall' filepath='./Include/pyerrors.h' line='223' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_BadInternalCall'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_DecodeUTF8Stateful' mangled-name='PyUnicode_DecodeUTF8Stateful' filepath='./Include/unicodeobject.h' line='435' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_DecodeUTF8Stateful'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='sprintf' filepath='/usr/include/stdio.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/token.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-528' size-in-bits='4288' id='type-id-1524'> + <subrange length='67' type-id='type-id-2' id='type-id-1525'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-528' size-in-bits='infinite' id='type-id-1526'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <qualified-type-def type-id='type-id-6' const='yes' id='type-id-528'/> + <var-decl name='_PyParser_TokenNames' type-id='type-id-1526' mangled-name='_PyParser_TokenNames' visibility='default' filepath='./Include/internal/pycore_token.h' line='98' column='1' elf-symbol-id='_PyParser_TokenNames'/> + <function-decl name='_PyToken_OneChar' mangled-name='_PyToken_OneChar' filepath='Parser/token.c' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_OneChar'> + <parameter type-id='type-id-5' name='c1' filepath='Parser/token.c' line='81' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyToken_TwoChars' mangled-name='_PyToken_TwoChars' filepath='Parser/token.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_TwoChars'> + <parameter type-id='type-id-5' name='c1' filepath='Parser/token.c' line='113' column='1'/> + <parameter type-id='type-id-5' name='c2' filepath='Parser/token.c' line='113' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyToken_ThreeChars' mangled-name='_PyToken_ThreeChars' filepath='Parser/token.c' line='197' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyToken_ThreeChars'> + <parameter type-id='type-id-5' name='c1' filepath='Parser/token.c' line='197' column='1'/> + <parameter type-id='type-id-5' name='c2' filepath='Parser/token.c' line='197' column='1'/> + <parameter type-id='type-id-5' name='c3' filepath='Parser/token.c' line='197' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/tokenizer/file_tokenizer.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-1527' size-in-bits='64' id='type-id-1528'/> + <pointer-type-def type-id='type-id-21' size-in-bits='64' id='type-id-57'/> + <pointer-type-def type-id='type-id-1529' size-in-bits='64' id='type-id-1530'/> + <function-decl name='PyObject_CallNoArgs' mangled-name='PyObject_CallNoArgs' filepath='./Include/abstract.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallNoArgs'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_CallFunction' mangled-name='PyObject_CallFunction' filepath='./Include/abstract.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_CallFunction'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyOS_Readline' mangled-name='PyOS_Readline' filepath='./Include/cpython/pythonrun.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_Readline'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_Py_CheckFunctionResult' mangled-name='_Py_CheckFunctionResult' filepath='./Include/internal/pycore_call.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_CheckFunctionResult'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyObject_MakeTpCall' mangled-name='_PyObject_MakeTpCall' filepath='./Include/internal/pycore_call.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_MakeTpCall'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_dup' mangled-name='_Py_dup' filepath='./Include/internal/pycore_fileutils.h' line='185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_dup'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_UniversalNewlineFgetsWithSize' mangled-name='_Py_UniversalNewlineFgetsWithSize' filepath='./Include/internal/pycore_fileutils.h' line='321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_UniversalNewlineFgetsWithSize'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-57'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyObject_GetAttr' mangled-name='PyObject_GetAttr' filepath='./Include/object.h' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GetAttr'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetFromErrnoWithFilename' mangled-name='PyErr_SetFromErrnoWithFilename' filepath='./Include/pyerrors.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilename'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PySys_WriteStderr' mangled-name='PySys_WriteStderr' filepath='./Include/sysmodule.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_WriteStderr'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnicode_AsUTF8AndSize' mangled-name='PyUnicode_AsUTF8AndSize' filepath='./Include/unicodeobject.h' line='458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_AsUTF8AndSize'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-8'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='fclose' filepath='/usr/include/stdio.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fdopen' filepath='/usr/include/stdio.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-56'/> + </function-decl> + <function-decl name='getc' filepath='/usr/include/stdio.h' line='514' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='ungetc' filepath='/usr/include/stdio.h' line='668' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='ftell' filepath='/usr/include/stdio.h' line='718' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='fileno' filepath='/usr/include/stdio.h' line='809' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='memcpy' filepath='/usr/include/string.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='strcpy' filepath='/usr/include/string.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyLexer_remember_fstring_buffers' filepath='Parser/tokenizer/../lexer/buffer.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyLexer_restore_fstring_buffers' filepath='Parser/tokenizer/../lexer/buffer.h' line='7' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyLexer_tok_reserve_buf' filepath='Parser/tokenizer/../lexer/buffer.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLexer_update_fstring_expr' filepath='Parser/tokenizer/../lexer/lexer.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-53'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_tok_new' filepath='Parser/tokenizer/../lexer/state.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-688'/> + </function-decl> + <function-decl name='_PyTokenizer_error_ret' filepath='Parser/tokenizer/helpers.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-688'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyTokenizer_new_string' filepath='Parser/tokenizer/helpers.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-688'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyTokenizer_translate_newlines' filepath='Parser/tokenizer/helpers.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-688'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyTokenizer_translate_into_utf8' filepath='Parser/tokenizer/helpers.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTokenizer_check_bom' filepath='Parser/tokenizer/helpers.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-677'/> + <parameter type-id='type-id-1530'/> + <parameter type-id='type-id-1528'/> + <parameter type-id='type-id-688'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_check_coding_spec' filepath='Parser/tokenizer/helpers.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-1528'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTokenizer_ensure_utf8' filepath='Parser/tokenizer/helpers.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-688'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1527'> + <parameter type-id='type-id-688'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1529'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-688'/> + <return type-id='type-id-3'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Parser/tokenizer/helpers.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='strcspn' filepath='/usr/include/string.h' line='293' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-21'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Parser/tokenizer/readline_tokenizer.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyUnicode_Decode' mangled-name='PyUnicode_Decode' filepath='./Include/unicodeobject.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnicode_Decode'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/Python-ast.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='_Py_once_fn_t' type-id='type-id-265' filepath='./Include/internal/pycore_lock.h' line='133' column='1' id='type-id-1531'/> + <pointer-type-def type-id='type-id-962' size-in-bits='64' id='type-id-1532'/> + <pointer-type-def type-id='type-id-1531' size-in-bits='64' id='type-id-1533'/> + <function-decl name='_PyOnceFlag_CallOnceSlow' mangled-name='_PyOnceFlag_CallOnceSlow' filepath='./Include/internal/pycore_lock.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOnceFlag_CallOnceSlow'> + <parameter type-id='type-id-1532'/> + <parameter type-id='type-id-1533'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_AddIntConstant' mangled-name='PyModule_AddIntConstant' filepath='./Include/modsupport.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddIntConstant'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyInit__ast' mangled-name='PyInit__ast' filepath='Python/Python-ast.c' line='17618' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__ast'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/Python-tokenize.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyErr_SyntaxLocationObject' mangled-name='PyErr_SyntaxLocationObject' filepath='./Include/cpython/pyerrors.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocationObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyModule_AddType' mangled-name='PyModule_AddType' filepath='./Include/modsupport.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddType'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPegen_byte_offset_to_character_offset_line' filepath='Python/../Parser/pegen.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyPegen_byte_offset_to_character_offset_raw' filepath='Python/../Parser/pegen.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyTokenizer_FromReadline' filepath='Python/../Parser/tokenizer/tokenizer.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-688'/> + </function-decl> + <function-decl name='PyInit__tokenize' mangled-name='PyInit__tokenize' filepath='Python/Python-tokenize.c' line='440' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__tokenize'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/_warnings.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyImport_GetModules' filepath='./Include/internal/pycore_import.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_BlessMyLoader' filepath='./Include/internal/pycore_import.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_IsInterpreterFinalizing' mangled-name='_Py_IsInterpreterFinalizing' filepath='./Include/internal/pycore_pylifecycle.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsInterpreterFinalizing'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySys_GetAttr' mangled-name='_PySys_GetAttr' filepath='./Include/internal/pycore_sysmodule.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySys_GetAttr'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_DisplaySourceLine' mangled-name='_Py_DisplaySourceLine' filepath='./Include/internal/pycore_traceback.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_DisplaySourceLine'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_AddObjectRef' mangled-name='PyModule_AddObjectRef' filepath='./Include/modsupport.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddObjectRef'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThreadState_GetFrame' mangled-name='PyThreadState_GetFrame' filepath='./Include/pystate.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetFrame'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='PyErr_ResourceWarning' mangled-name='PyErr_ResourceWarning' filepath='Python/_warnings.c' line='1254' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ResourceWarning'> + <parameter type-id='type-id-4' name='source' filepath='Python/_warnings.c' line='1254' column='1'/> + <parameter type-id='type-id-7' name='stack_level' filepath='Python/_warnings.c' line='1254' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/_warnings.c' line='1255' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_WarnExplicit' mangled-name='PyErr_WarnExplicit' filepath='Python/_warnings.c' line='1321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicit'> + <parameter type-id='type-id-4' name='category' filepath='Python/_warnings.c' line='1321' column='1'/> + <parameter type-id='type-id-6' name='text' filepath='Python/_warnings.c' line='1321' column='1'/> + <parameter type-id='type-id-6' name='filename_str' filepath='Python/_warnings.c' line='1322' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1322' column='1'/> + <parameter type-id='type-id-6' name='module_str' filepath='Python/_warnings.c' line='1323' column='1'/> + <parameter type-id='type-id-4' name='registry' filepath='Python/_warnings.c' line='1323' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_WarnExplicitFormat' mangled-name='PyErr_WarnExplicitFormat' filepath='Python/_warnings.c' line='1353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_WarnExplicitFormat'> + <parameter type-id='type-id-4' name='category' filepath='Python/_warnings.c' line='1353' column='1'/> + <parameter type-id='type-id-6' name='filename_str' filepath='Python/_warnings.c' line='1354' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/_warnings.c' line='1354' column='1'/> + <parameter type-id='type-id-6' name='module_str' filepath='Python/_warnings.c' line='1355' column='1'/> + <parameter type-id='type-id-4' name='registry' filepath='Python/_warnings.c' line='1355' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/_warnings.c' line='1356' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyWarnings_Init' mangled-name='_PyWarnings_Init' filepath='Python/_warnings.c' line='1515' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyWarnings_Init'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/assemble.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyCodeConstructor' size-in-bits='896' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_code.h' line='243' column='1' id='type-id-1534'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='245' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='qualname' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='247' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='flags' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='code' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='251' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='firstlineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='252' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='linetable' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='253' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='consts' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='256' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='names' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='257' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='localsplusnames' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='260' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='localspluskinds' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='261' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='argcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='264' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='posonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='265' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='kwonlyargcount' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='267' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='800'> + <var-decl name='stacksize' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_code.h' line='270' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='exceptiontable' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_code.h' line='273' column='1'/> + </data-member> + </class-decl> + <class-decl name='_PyExceptHandlerInfo' size-in-bits='96' is-struct='yes' naming-typedef-id='type-id-1535' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='15' column='1' id='type-id-1536'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='h_label' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='h_startdepth' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='h_preserve_lasti' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='18' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyExceptHandlerInfo' type-id='type-id-1536' filepath='./Include/internal/pycore_instruction_sequence.h' line='19' column='1' id='type-id-1535'/> + <class-decl name='_PyInstruction' size-in-bits='352' is-struct='yes' naming-typedef-id='type-id-1537' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='21' column='1' id='type-id-1538'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='i_opcode' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='22' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='i_oparg' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='23' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='i_loc' type-id='type-id-1539' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='24' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='i_except_handler_info' type-id='type-id-1535' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='25' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='i_target' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='28' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='i_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='29' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyInstruction' type-id='type-id-1538' filepath='./Include/internal/pycore_instruction_sequence.h' line='30' column='1' id='type-id-1537'/> + <class-decl name='instruction_sequence' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='32' column='1' id='type-id-1540'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='s_instrs' type-id='type-id-1541' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='34' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='s_allocated' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='s_used' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='s_next_free_label' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='s_labelmap' type-id='type-id-177' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='s_labelmap_size' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='s_nested' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='47' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyInstructionSequence' type-id='type-id-1540' filepath='./Include/internal/pycore_instruction_sequence.h' line='48' column='1' id='type-id-1542'/> + <class-decl name='_Py_SourceLocation' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1539' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='45' column='1' id='type-id-1543'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='49' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_SourceLocation' type-id='type-id-1543' filepath='./Include/internal/pycore_symtable.h' line='50' column='1' id='type-id-1539'/> + <pointer-type-def type-id='type-id-1534' size-in-bits='64' id='type-id-1544'/> + <pointer-type-def type-id='type-id-1537' size-in-bits='64' id='type-id-1541'/> + <pointer-type-def type-id='type-id-1542' size-in-bits='64' id='type-id-1545'/> + <function-decl name='_PyCode_Validate' filepath='./Include/internal/pycore_code.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1544'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCode_New' filepath='./Include/internal/pycore_code.h' line='286' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1544'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='_PyCompile_ConstCacheMergeOne' filepath='./Include/internal/pycore_compile.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInstructionSequence_ApplyLabelMap' filepath='./Include/internal/pycore_instruction_sequence.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_set_localsplus_info' filepath='Python/assemble.c' line='471' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-91'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/ast_opt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyAST_GetDocString' filepath='./Include/internal/pycore_ast.h' line='921' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-607'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/bltinmodule.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-822' size-in-bits='64' id='type-id-1546'/> + <var-decl name='PyFilter_Type' type-id='type-id-266' mangled-name='PyFilter_Type' visibility='default' filepath='./Include/bltinmodule.h' line='7' column='1' elf-symbol-id='PyFilter_Type'/> + <var-decl name='PyMap_Type' type-id='type-id-266' mangled-name='PyMap_Type' visibility='default' filepath='./Include/bltinmodule.h' line='8' column='1' elf-symbol-id='PyMap_Type'/> + <var-decl name='PyZip_Type' type-id='type-id-266' mangled-name='PyZip_Type' visibility='default' filepath='./Include/bltinmodule.h' line='9' column='1' elf-symbol-id='PyZip_Type'/> + <function-decl name='PyEval_EvalCode' mangled-name='PyEval_EvalCode' filepath='./Include/ceval.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalCode'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_EvalCodeEx' mangled-name='PyEval_EvalCodeEx' filepath='./Include/ceval.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalCodeEx'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_GetBuiltins' mangled-name='PyEval_GetBuiltins' filepath='./Include/ceval.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetBuiltins'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_MergeCompilerFlags' mangled-name='PyEval_MergeCompilerFlags' filepath='./Include/cpython/ceval.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_MergeCompilerFlags'> + <parameter type-id='type-id-209'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_StringFlags' mangled-name='PyRun_StringFlags' filepath='./Include/cpython/pythonrun.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_StringFlags'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_CompileStringObject' mangled-name='Py_CompileStringObject' filepath='./Include/cpython/pythonrun.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringObject'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ImportModuleLevelObject' mangled-name='PyImport_ImportModuleLevelObject' filepath='./Include/import.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleLevelObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyAST_mod2obj' filepath='./Include/internal/pycore_ast.h' line='909' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-575'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyAST_obj2mod' filepath='./Include/internal/pycore_ast.h' line='910' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-679'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-575'/> + </function-decl> + <function-decl name='PyAST_Check' filepath='./Include/internal/pycore_ast.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyAST_Validate' filepath='./Include/internal/pycore_ast.h' line='913' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-575'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyAST_Compile' mangled-name='_PyAST_Compile' filepath='./Include/internal/pycore_compile.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyAST_Compile'> + <parameter type-id='type-id-574'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1546'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='_PyCompile_AstOptimize' filepath='./Include/internal/pycore_compile.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-574'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1546'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyFile_Flush' filepath='./Include/internal/pycore_fileutils.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyModule_CreateInitialized' filepath='./Include/internal/pycore_modsupport.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-387'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyArg_ParseStackAndKeywords' mangled-name='_PyArg_ParseStackAndKeywords' filepath='./Include/internal/pycore_modsupport.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStackAndKeywords'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-272'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyType_CalculateMetaclass' filepath='./Include/internal/pycore_object.h' line='698' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-1'/> + </function-decl> + <function-decl name='_PyArena_New' mangled-name='_PyArena_New' filepath='./Include/internal/pycore_pyarena.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_New'> + <return type-id='type-id-679'/> + </function-decl> + <function-decl name='_PyArena_Free' mangled-name='_PyArena_Free' filepath='./Include/internal/pycore_pyarena.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArena_Free'> + <parameter type-id='type-id-679'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_SourceAsString' filepath='./Include/internal/pycore_pythonrun.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyAnextAwaitable_New' filepath='Python/bltinmodule.c' line='1710' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/bootstrap_hash.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_fstat' mangled-name='_Py_fstat' filepath='./Include/internal/pycore_fileutils.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fstat'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-59'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_open' mangled-name='_Py_open' filepath='./Include/internal/pycore_fileutils.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_open'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_open_noraise' mangled-name='_Py_open_noraise' filepath='./Include/internal/pycore_fileutils.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_open_noraise'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_read' filepath='./Include/internal/pycore_fileutils.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='close' filepath='/usr/include/unistd.h' line='358' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='read' filepath='/usr/include/unistd.h' line='371' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='getrandom' filepath='/usr/include/x86_64-linux-gnu/sys/random.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='_PyOS_URandomNonblock' mangled-name='_PyOS_URandomNonblock' filepath='Python/bootstrap_hash.c' line='545' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyOS_URandomNonblock'> + <parameter type-id='type-id-30' name='buffer' filepath='Python/bootstrap_hash.c' line='545' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Python/bootstrap_hash.c' line='545' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/ceval.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-1547' size-in-bits='1664' id='type-id-1548'> + <subrange length='26' type-id='type-id-2' id='type-id-889'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1547' size-in-bits='infinite' id='type-id-1549'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1550' size-in-bits='256' id='type-id-1551'> + <subrange length='4' type-id='type-id-2' id='type-id-229'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1550' size-in-bits='infinite' id='type-id-1552'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <typedef-decl name='conversion_func' type-id='type-id-1378' filepath='./Include/internal/pycore_ceval.h' line='243' column='1' id='type-id-1553'/> + <qualified-type-def type-id='type-id-968' const='yes' id='type-id-1547'/> + <qualified-type-def type-id='type-id-1553' const='yes' id='type-id-1550'/> + <function-decl name='PyInterpreterState_ThreadHead' mangled-name='PyInterpreterState_ThreadHead' filepath='./Include/cpython/pystate.h' line='265' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_ThreadHead'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyThreadState_Next' mangled-name='PyThreadState_Next' filepath='./Include/cpython/pystate.h' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Next'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='_PyNumber_PowerNoMod' filepath='./Include/internal/pycore_abstract.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyNumber_InPlacePowerNoMod' filepath='./Include/internal/pycore_abstract.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyStack_UnpackDict' filepath='./Include/internal/pycore_call.h' line='189' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-258'/> + </function-decl> + <function-decl name='_PyStack_UnpackDict_FreeNoDecRef' filepath='./Include/internal/pycore_call.h' line='198' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-258'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_SetProfile' mangled-name='_PyEval_SetProfile' filepath='./Include/internal/pycore_ceval.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_SetProfile'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-1022'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_SetTrace' filepath='./Include/internal/pycore_ceval.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-1022'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_HandlePending' mangled-name='_Py_HandlePending' filepath='./Include/internal/pycore_ceval.h' line='239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_HandlePending'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <var-decl name='_PyEval_BinaryOps' type-id='type-id-1549' mangled-name='_PyEval_BinaryOps' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='245' column='1' elf-symbol-id='_PyEval_BinaryOps'/> + <var-decl name='_PyEval_ConversionFuncs' type-id='type-id-1552' mangled-name='_PyEval_ConversionFuncs' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='246' column='1' elf-symbol-id='_PyEval_ConversionFuncs'/> + <function-decl name='_Py_Specialize_LoadSuperAttr' filepath='./Include/internal/pycore_code.h' line='323' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_LoadAttr' filepath='./Include/internal/pycore_code.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_StoreAttr' filepath='./Include/internal/pycore_code.h' line='327' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_LoadGlobal' filepath='./Include/internal/pycore_code.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_BinarySubscr' filepath='./Include/internal/pycore_code.h' line='331' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_StoreSubscr' filepath='./Include/internal/pycore_code.h' line='333' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_Call' filepath='./Include/internal/pycore_code.h' line='335' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_BinaryOp' filepath='./Include/internal/pycore_code.h' line='337' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_CompareOp' filepath='./Include/internal/pycore_code.h' line='339' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_UnpackSequence' filepath='./Include/internal/pycore_code.h' line='341' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_ForIter' filepath='./Include/internal/pycore_code.h' line='343' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_Send' filepath='./Include/internal/pycore_code.h' line='344' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_ToBool' filepath='./Include/internal/pycore_code.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Specialize_ContainsOp' filepath='./Include/internal/pycore_code.h' line='346' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_Instrument' filepath='./Include/internal/pycore_code.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_SendEvent' filepath='./Include/internal/pycore_dict.h' line='259' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-939'/> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFrame_GetLocals' filepath='./Include/internal/pycore_frame.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-366'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyThreadState_PushFrame' filepath='./Include/internal/pycore_frame.h' line='271' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-366'/> + </function-decl> + <function-decl name='_PyThreadState_PopFrame' mangled-name='_PyThreadState_PopFrame' filepath='./Include/internal/pycore_frame.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_PopFrame'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-366'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_IsDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation' filepath='./Include/internal/pycore_instruments.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_line' filepath='./Include/internal/pycore_instruments.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_instruction' filepath='./Include/internal/pycore_instruments.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_jump' filepath='./Include/internal/pycore_instruments.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-1160'/> + <return type-id='type-id-1160'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_arg' filepath='./Include/internal/pycore_instruments.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_2args' filepath='./Include/internal/pycore_instruments.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_call_instrumentation_exc2' filepath='./Include/internal/pycore_instruments.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-366'/> + <parameter type-id='type-id-1160'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyModuleSpec_IsInitializing' filepath='./Include/internal/pycore_moduleobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyModuleSpec_GetFileOrigin' filepath='./Include/internal/pycore_moduleobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyModule_IsPossiblyShadowing' filepath='./Include/internal/pycore_moduleobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyType_NewManagedObject' filepath='./Include/internal/pycore_object.h' line='696' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_GetTopmostException' filepath='./Include/internal/pycore_pyerrors.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-239'/> + </function-decl> + <function-decl name='_PyErr_SetImportErrorWithNameFrom' filepath='./Include/internal/pycore_pyerrors.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyErr_SetObject' filepath='./Include/internal/pycore_pyerrors.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyExc_CreateExceptionGroup' filepath='./Include/internal/pycore_pyerrors.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_CalculateSuggestions' filepath='./Include/internal/pycore_pyerrors.h' line='157' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyBuildSlice_ConsumeRefs' filepath='./Include/internal/pycore_sliceobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PySys_Audit' filepath='./Include/internal/pycore_sysmodule.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_SetHandledException' mangled-name='PyErr_SetHandledException' filepath='./Include/pyerrors.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetHandledException'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyTraceBack_Here' mangled-name='PyTraceBack_Here' filepath='./Include/traceback.h' line='9' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceBack_Here'> + <parameter type-id='type-id-351'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_GetRecursionLimit' mangled-name='Py_GetRecursionLimit' filepath='Python/ceval.c' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetRecursionLimit'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_SetRecursionLimit' mangled-name='Py_SetRecursionLimit' filepath='Python/ceval.c' line='269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetRecursionLimit'> + <parameter type-id='type-id-5' name='new_limit' filepath='Python/ceval.c' line='269' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_MatchKeys' mangled-name='_PyEval_MatchKeys' filepath='Python/ceval.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchKeys'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='355' column='1'/> + <parameter type-id='type-id-4' name='map' filepath='Python/ceval.c' line='355' column='1'/> + <parameter type-id='type-id-4' name='keys' filepath='Python/ceval.c' line='355' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_MatchClass' mangled-name='_PyEval_MatchClass' filepath='Python/ceval.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MatchClass'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='459' column='1'/> + <parameter type-id='type-id-4' name='subject' filepath='Python/ceval.c' line='459' column='1'/> + <parameter type-id='type-id-4' name='type' filepath='Python/ceval.c' line='459' column='1'/> + <parameter type-id='type-id-7' name='nargs' filepath='Python/ceval.c' line='460' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Python/ceval.c' line='460' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_EvalFrame' mangled-name='PyEval_EvalFrame' filepath='Python/ceval.c' line='610' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrame'> + <parameter type-id='type-id-351' name='f' filepath='Python/ceval.c' line='610' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_EvalFrameEx' mangled-name='PyEval_EvalFrameEx' filepath='Python/ceval.c' line='618' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_EvalFrameEx'> + <parameter type-id='type-id-351' name='f' filepath='Python/ceval.c' line='618' column='1'/> + <parameter type-id='type-id-5' name='throwflag' filepath='Python/ceval.c' line='618' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_FrameClearAndPop' mangled-name='_PyEval_FrameClearAndPop' filepath='Python/ceval.c' line='1697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FrameClearAndPop'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='1697' column='1'/> + <parameter type-id='type-id-366' name='frame' filepath='Python/ceval.c' line='1697' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEvalFramePushAndInit' mangled-name='_PyEvalFramePushAndInit' filepath='Python/ceval.c' line='1709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvalFramePushAndInit'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='1709' column='1'/> + <parameter type-id='type-id-308' name='func' filepath='Python/ceval.c' line='1709' column='1'/> + <parameter type-id='type-id-4' name='locals' filepath='Python/ceval.c' line='1710' column='1'/> + <parameter type-id='type-id-258' name='args' filepath='Python/ceval.c' line='1710' column='1'/> + <parameter type-id='type-id-21' name='argcount' filepath='Python/ceval.c' line='1711' column='1'/> + <parameter type-id='type-id-4' name='kwnames' filepath='Python/ceval.c' line='1711' column='1'/> + <return type-id='type-id-366'/> + </function-decl> + <function-decl name='_PyEval_ExceptionGroupMatch' mangled-name='_PyEval_ExceptionGroupMatch' filepath='Python/ceval.c' line='1994' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_ExceptionGroupMatch'> + <parameter type-id='type-id-4' name='exc_value' filepath='Python/ceval.c' line='1994' column='1'/> + <parameter type-id='type-id-4' name='match_type' filepath='Python/ceval.c' line='1994' column='1'/> + <parameter type-id='type-id-238' name='match' filepath='Python/ceval.c' line='1995' column='1'/> + <parameter type-id='type-id-238' name='rest' filepath='Python/ceval.c' line='1995' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_UnpackIterable' mangled-name='_PyEval_UnpackIterable' filepath='Python/ceval.c' line='2057' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_UnpackIterable'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2057' column='1'/> + <parameter type-id='type-id-4' name='v' filepath='Python/ceval.c' line='2057' column='1'/> + <parameter type-id='type-id-5' name='argcnt' filepath='Python/ceval.c' line='2058' column='1'/> + <parameter type-id='type-id-5' name='argcntafter' filepath='Python/ceval.c' line='2058' column='1'/> + <parameter type-id='type-id-238' name='sp' filepath='Python/ceval.c' line='2058' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_MonitorRaise' mangled-name='_PyEval_MonitorRaise' filepath='Python/ceval.c' line='2190' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MonitorRaise'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2190' column='1'/> + <parameter type-id='type-id-366' name='frame' filepath='Python/ceval.c' line='2190' column='1'/> + <parameter type-id='type-id-1160' name='instr' filepath='Python/ceval.c' line='2191' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThreadState_EnterTracing' mangled-name='PyThreadState_EnterTracing' filepath='Python/ceval.c' line='2261' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_EnterTracing'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2261' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThreadState_LeaveTracing' mangled-name='PyThreadState_LeaveTracing' filepath='Python/ceval.c' line='2268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_LeaveTracing'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2268' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_SetProfile' mangled-name='PyEval_SetProfile' filepath='Python/ceval.c' line='2292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfile'> + <parameter type-id='type-id-1022' name='func' filepath='Python/ceval.c' line='2292' column='1'/> + <parameter type-id='type-id-4' name='arg' filepath='Python/ceval.c' line='2292' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_SetProfileAllThreads' mangled-name='PyEval_SetProfileAllThreads' filepath='Python/ceval.c' line='2302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetProfileAllThreads'> + <parameter type-id='type-id-1022' name='func' filepath='Python/ceval.c' line='2302' column='1'/> + <parameter type-id='type-id-4' name='arg' filepath='Python/ceval.c' line='2302' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_SetTrace' mangled-name='PyEval_SetTrace' filepath='Python/ceval.c' line='2323' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTrace'> + <parameter type-id='type-id-1022' name='func' filepath='Python/ceval.c' line='2323' column='1'/> + <parameter type-id='type-id-4' name='arg' filepath='Python/ceval.c' line='2323' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_SetTraceAllThreads' mangled-name='PyEval_SetTraceAllThreads' filepath='Python/ceval.c' line='2333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_SetTraceAllThreads'> + <parameter type-id='type-id-1022' name='func' filepath='Python/ceval.c' line='2333' column='1'/> + <parameter type-id='type-id-4' name='arg' filepath='Python/ceval.c' line='2333' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_GetFrame' mangled-name='PyEval_GetFrame' filepath='Python/ceval.c' line='2421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrame'> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='PyEval_GetLocals' mangled-name='PyEval_GetLocals' filepath='Python/ceval.c' line='2469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetLocals'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_GetFrameLocals' mangled-name='PyEval_GetFrameLocals' filepath='Python/ceval.c' line='2559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameLocals'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_GetFrameGlobals' mangled-name='PyEval_GetFrameGlobals' filepath='Python/ceval.c' line='2564' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameGlobals'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_GetFrameBuiltins' mangled-name='PyEval_GetFrameBuiltins' filepath='Python/ceval.c' line='2574' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFrameBuiltins'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyEval_GetFuncName' mangled-name='PyEval_GetFuncName' filepath='Python/ceval.c' line='2600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncName'> + <parameter type-id='type-id-4' name='func' filepath='Python/ceval.c' line='2600' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyEval_GetFuncDesc' mangled-name='PyEval_GetFuncDesc' filepath='Python/ceval.c' line='2613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_GetFuncDesc'> + <parameter type-id='type-id-4' name='func' filepath='Python/ceval.c' line='2613' column='1'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_PyEval_CheckExceptTypeValid' mangled-name='_PyEval_CheckExceptTypeValid' filepath='Python/ceval.c' line='2866' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptTypeValid'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2866' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Python/ceval.c' line='2866' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_CheckExceptStarTypeValid' mangled-name='_PyEval_CheckExceptStarTypeValid' filepath='Python/ceval.c' line='2891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_CheckExceptStarTypeValid'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2891' column='1'/> + <parameter type-id='type-id-4' name='right' filepath='Python/ceval.c' line='2891' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_FormatKwargsError' mangled-name='_PyEval_FormatKwargsError' filepath='Python/ceval.c' line='2948' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatKwargsError'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2948' column='1'/> + <parameter type-id='type-id-4' name='func' filepath='Python/ceval.c' line='2948' column='1'/> + <parameter type-id='type-id-4' name='kwargs' filepath='Python/ceval.c' line='2948' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_FormatExcCheckArg' mangled-name='_PyEval_FormatExcCheckArg' filepath='Python/ceval.c' line='2990' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcCheckArg'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='2990' column='1'/> + <parameter type-id='type-id-4' name='exc' filepath='Python/ceval.c' line='2990' column='1'/> + <parameter type-id='type-id-6' name='format_str' filepath='Python/ceval.c' line='2991' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/ceval.c' line='2991' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_FormatExcUnbound' mangled-name='_PyEval_FormatExcUnbound' filepath='Python/ceval.c' line='3019' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatExcUnbound'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='3019' column='1'/> + <parameter type-id='type-id-325' name='co' filepath='Python/ceval.c' line='3019' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3019' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_FormatAwaitableError' mangled-name='_PyEval_FormatAwaitableError' filepath='Python/ceval.c' line='3036' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_FormatAwaitableError'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval.c' line='3036' column='1'/> + <parameter type-id='type-id-1' name='type' filepath='Python/ceval.c' line='3036' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/ceval.c' line='3036' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyUnstable_Eval_RequestCodeExtraIndex' mangled-name='PyUnstable_Eval_RequestCodeExtraIndex' filepath='Python/ceval.c' line='3056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Eval_RequestCodeExtraIndex'> + <parameter type-id='type-id-385' name='free' filepath='Python/ceval.c' line='3056' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='Py_EnterRecursiveCall' mangled-name='Py_EnterRecursiveCall' filepath='Python/ceval.c' line='3072' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EnterRecursiveCall'> + <parameter type-id='type-id-6' name='where' filepath='Python/ceval.c' line='3072' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_LeaveRecursiveCall' mangled-name='Py_LeaveRecursiveCall' filepath='Python/ceval.c' line='3077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_LeaveRecursiveCall'> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/ceval_gil.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <union-decl name='pthread_mutexattr_t' size-in-bits='32' naming-typedef-id='type-id-1554' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='32' column='1' id='type-id-1555'> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-814' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='34' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='35' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_mutexattr_t' type-id='type-id-1555' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='36' column='1' id='type-id-1554'/> + <qualified-type-def type-id='type-id-1554' const='yes' id='type-id-1556'/> + <pointer-type-def type-id='type-id-1556' size-in-bits='64' id='type-id-1557'/> + <qualified-type-def type-id='type-id-107' const='yes' id='type-id-1558'/> + <pointer-type-def type-id='type-id-1558' size-in-bits='64' id='type-id-175'/> + <qualified-type-def type-id='type-id-175' restrict='yes' id='type-id-207'/> + <pointer-type-def type-id='type-id-1169' size-in-bits='64' id='type-id-1559'/> + <qualified-type-def type-id='type-id-1559' restrict='yes' id='type-id-1560'/> + <pointer-type-def type-id='type-id-1170' size-in-bits='64' id='type-id-1561'/> + <qualified-type-def type-id='type-id-1561' restrict='yes' id='type-id-1562'/> + <function-decl name='_Py_RunGC' filepath='./Include/internal/pycore_gc.h' line='355' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_SetNone' filepath='./Include/internal/pycore_pyerrors.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyErr_CheckSignalsTstate' filepath='./Include/internal/pycore_pyerrors.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyErr_Print' filepath='./Include/internal/pycore_pylifecycle.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_MustExit' filepath='./Include/internal/pycore_pystate.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyThreadState_Attach' filepath='./Include/internal/pycore_pystate.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_Detach' filepath='./Include/internal/pycore_pystate.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_Suspend' filepath='./Include/internal/pycore_pystate.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_init_thread' mangled-name='PyThread_init_thread' filepath='./Include/pythread.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_init_thread'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_exit_thread' mangled-name='PyThread_exit_thread' filepath='./Include/pythread.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_exit_thread'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_get_thread_ident' mangled-name='PyThread_get_thread_ident' filepath='./Include/pythread.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_thread_ident'> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='pthread_mutex_init' filepath='/usr/include/pthread.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1561'/> + <parameter type-id='type-id-1557'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_mutex_destroy' filepath='/usr/include/pthread.h' line='786' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1561'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_mutex_lock' filepath='/usr/include/pthread.h' line='794' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1561'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_mutex_unlock' filepath='/usr/include/pthread.h' line='835' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1561'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_cond_destroy' filepath='/usr/include/pthread.h' line='1117' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1559'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_cond_signal' filepath='/usr/include/pthread.h' line='1121' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1559'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_cond_wait' filepath='/usr/include/pthread.h' line='1133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1560'/> + <parameter type-id='type-id-1562'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_cond_timedwait' filepath='/usr/include/pthread.h' line='1145' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1560'/> + <parameter type-id='type-id-1562'/> + <parameter type-id='type-id-207'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyEval_ThreadsInitialized' mangled-name='PyEval_ThreadsInitialized' filepath='Python/ceval_gil.c' line='450' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ThreadsInitialized'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyEval_InitThreads' mangled-name='PyEval_InitThreads' filepath='Python/ceval_gil.c' line='547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_InitThreads'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_AcquireLock' mangled-name='PyEval_AcquireLock' filepath='Python/ceval_gil.c' line='562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_AcquireLock'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_ReleaseLock' mangled-name='PyEval_ReleaseLock' filepath='Python/ceval_gil.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ReleaseLock'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_AcquireThread' mangled-name='PyEval_AcquireThread' filepath='Python/ceval_gil.c' line='599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_AcquireThread'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval_gil.c' line='599' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEval_ReleaseThread' mangled-name='PyEval_ReleaseThread' filepath='Python/ceval_gil.c' line='606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEval_ReleaseThread'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval_gil.c' line='606' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_AddPendingCall' mangled-name='Py_AddPendingCall' filepath='Python/ceval_gil.c' line='804' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AddPendingCall'> + <parameter type-id='type-id-1107' name='func' filepath='Python/ceval_gil.c' line='804' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Python/ceval_gil.c' line='804' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEval_MakePendingCalls' mangled-name='_PyEval_MakePendingCalls' filepath='Python/ceval_gil.c' line='1037' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_MakePendingCalls'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/ceval_gil.c' line='1037' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_MakePendingCalls' mangled-name='Py_MakePendingCalls' filepath='Python/ceval_gil.c' line='1062' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_MakePendingCalls'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyThread_cond_init' filepath='Python/condvar.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1559'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyThread_cond_after' filepath='Python/condvar.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-377'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/codecs.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='Py_hexdigits' type-id='type-id-6' mangled-name='Py_hexdigits' visibility='default' filepath='./Include/codecs.h' line='170' column='1' elf-symbol-id='Py_hexdigits'/> + <function-decl name='PyStatus_Ok' mangled-name='PyStatus_Ok' filepath='./Include/cpython/initconfig.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Ok'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyStatus_Error' mangled-name='PyStatus_Error' filepath='./Include/cpython/initconfig.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Error'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyStatus_NoMemory' mangled-name='PyStatus_NoMemory' filepath='./Include/cpython/initconfig.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_NoMemory'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyUnicode_GetNameCAPI' filepath='./Include/internal/pycore_ucnhash.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-1372'/> + </function-decl> + <function-decl name='PyCodec_Register' mangled-name='PyCodec_Register' filepath='Python/codecs.c' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Register'> + <parameter type-id='type-id-4' name='search_function' filepath='Python/codecs.c' line='23' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCodec_Unregister' mangled-name='PyCodec_Unregister' filepath='Python/codecs.c' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Unregister'> + <parameter type-id='type-id-4' name='search_function' filepath='Python/codecs.c' line='49' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_normalize_encoding' filepath='Python/codecs.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCodec_KnownEncoding' mangled-name='PyCodec_KnownEncoding' filepath='Python/codecs.c' line='222' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_KnownEncoding'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='222' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCodec_Encoder' mangled-name='PyCodec_Encoder' filepath='Python/codecs.c' line='357' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Encoder'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='357' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_Decoder' mangled-name='PyCodec_Decoder' filepath='Python/codecs.c' line='362' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_Decoder'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='362' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_IncrementalEncoder' mangled-name='PyCodec_IncrementalEncoder' filepath='Python/codecs.c' line='367' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IncrementalEncoder'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='367' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Python/codecs.c' line='368' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_IncrementalDecoder' mangled-name='PyCodec_IncrementalDecoder' filepath='Python/codecs.c' line='373' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IncrementalDecoder'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='373' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Python/codecs.c' line='374' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_StreamReader' mangled-name='PyCodec_StreamReader' filepath='Python/codecs.c' line='379' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StreamReader'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='379' column='1'/> + <parameter type-id='type-id-4' name='stream' filepath='Python/codecs.c' line='380' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Python/codecs.c' line='381' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_StreamWriter' mangled-name='PyCodec_StreamWriter' filepath='Python/codecs.c' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_StreamWriter'> + <parameter type-id='type-id-6' name='encoding' filepath='Python/codecs.c' line='386' column='1'/> + <parameter type-id='type-id-4' name='stream' filepath='Python/codecs.c' line='387' column='1'/> + <parameter type-id='type-id-6' name='errors' filepath='Python/codecs.c' line='388' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_RegisterError' mangled-name='PyCodec_RegisterError' filepath='Python/codecs.c' line='609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_RegisterError'> + <parameter type-id='type-id-6' name='name' filepath='Python/codecs.c' line='609' column='1'/> + <parameter type-id='type-id-4' name='error' filepath='Python/codecs.c' line='609' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCodec_IgnoreErrors' mangled-name='PyCodec_IgnoreErrors' filepath='Python/codecs.c' line='659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_IgnoreErrors'> + <parameter type-id='type-id-4' name='exc' filepath='Python/codecs.c' line='659' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_ReplaceErrors' mangled-name='PyCodec_ReplaceErrors' filepath='Python/codecs.c' line='683' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_ReplaceErrors'> + <parameter type-id='type-id-4' name='exc' filepath='Python/codecs.c' line='683' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_XMLCharRefReplaceErrors' mangled-name='PyCodec_XMLCharRefReplaceErrors' filepath='Python/codecs.c' line='736' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_XMLCharRefReplaceErrors'> + <parameter type-id='type-id-4' name='exc' filepath='Python/codecs.c' line='736' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_BackslashReplaceErrors' mangled-name='PyCodec_BackslashReplaceErrors' filepath='Python/codecs.c' line='834' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_BackslashReplaceErrors'> + <parameter type-id='type-id-4' name='exc' filepath='Python/codecs.c' line='834' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyCodec_NameReplaceErrors' mangled-name='PyCodec_NameReplaceErrors' filepath='Python/codecs.c' line='941' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCodec_NameReplaceErrors'> + <parameter type-id='type-id-4' name='exc' filepath='Python/codecs.c' line='941' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/compile.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-1563' size-in-bits='256' id='type-id-1564'> + <subrange length='8' type-id='type-id-2' id='type-id-517'/> + </array-type-def> + <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/> + <array-type-def dimensions='1' type-id='type-id-6' size-in-bits='17152' id='type-id-1566'> + <subrange length='268' type-id='type-id-2' id='type-id-1567'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1568' size-in-bits='73728' id='type-id-1569'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1570' size-in-bits='8576' id='type-id-1571'> + <subrange length='268' type-id='type-id-2' id='type-id-1567'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1572' size-in-bits='288' id='type-id-1573'> + <subrange length='12' type-id='type-id-2' id='type-id-864'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-323' size-in-bits='2048' id='type-id-1574'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <class-decl name='_PyCompile_CodeUnitMetadata' size-in-bits='768' is-struct='yes' naming-typedef-id='type-id-1575' visibility='default' filepath='./Include/internal/pycore_compile.h' line='42' column='1' id='type-id-1576'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='u_name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='u_qualname' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='u_consts' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='u_names' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='u_varnames' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='u_cellvars' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='53' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='u_freevars' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='54' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='u_fasthidden' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_compile.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='u_argcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='59' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='u_posonlyargcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='u_kwonlyargcount' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_compile.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='u_firstlineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_compile.h' line='63' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyCompile_CodeUnitMetadata' type-id='type-id-1576' filepath='./Include/internal/pycore_compile.h' line='64' column='1' id='type-id-1575'/> + <class-decl name='_PyJumpTargetLabel' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1577' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='50' column='1' id='type-id-1578'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='id' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='51' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyJumpTargetLabel' type-id='type-id-1578' filepath='./Include/internal/pycore_instruction_sequence.h' line='52' column='1' id='type-id-1577'/> + <class-decl name='opcode_metadata' size-in-bits='32' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='958' column='1' id='type-id-1579'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='valid_entry' type-id='type-id-305' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='959' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='instr_format' type-id='type-id-358' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='960' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='flags' type-id='type-id-1580' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='961' column='1'/> + </data-member> + </class-decl> + <class-decl name='opcode_macro_expansion' size-in-bits='288' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1194' column='1' id='type-id-1581'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='nuops' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1195' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='uops' type-id='type-id-1564' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1196' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1196' column='1' id='type-id-1563'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='uop' type-id='type-id-1580' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='16'> + <var-decl name='size' type-id='type-id-358' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1196' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='24'> + <var-decl name='offset' type-id='type-id-358' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1196' column='1'/> + </data-member> + </class-decl> + <class-decl name='pseudo_targets' size-in-bits='24' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1886' column='1' id='type-id-1582'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='targets' type-id='type-id-895' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1887' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_block_type' filepath='./Include/internal/pycore_symtable.h' line='13' column='1' id='type-id-1583'> + <underlying-type type-id='type-id-32'/> + <enumerator name='FunctionBlock' value='0'/> + <enumerator name='ClassBlock' value='1'/> + <enumerator name='ModuleBlock' value='2'/> + <enumerator name='AnnotationBlock' value='3'/> + <enumerator name='TypeAliasBlock' value='4'/> + <enumerator name='TypeParametersBlock' value='5'/> + <enumerator name='TypeVariableBlock' value='6'/> + </enum-decl> + <typedef-decl name='_Py_block_ty' type-id='type-id-1583' filepath='./Include/internal/pycore_symtable.h' line='35' column='1' id='type-id-1584'/> + <enum-decl name='_comprehension_type' filepath='./Include/internal/pycore_symtable.h' line='37' column='1' id='type-id-1585'> + <underlying-type type-id='type-id-32'/> + <enumerator name='NoComprehension' value='0'/> + <enumerator name='ListComprehension' value='1'/> + <enumerator name='DictComprehension' value='2'/> + <enumerator name='SetComprehension' value='3'/> + <enumerator name='GeneratorExpression' value='4'/> + </enum-decl> + <typedef-decl name='_Py_comprehension_ty' type-id='type-id-1585' filepath='./Include/internal/pycore_symtable.h' line='42' column='1' id='type-id-1586'/> + <class-decl name='_PyFutureFeatures' size-in-bits='160' is-struct='yes' naming-typedef-id='type-id-1587' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='62' column='1' id='type-id-1588'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ff_features' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='ff_location' type-id='type-id-1539' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='64' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyFutureFeatures' type-id='type-id-1588' filepath='./Include/internal/pycore_symtable.h' line='65' column='1' id='type-id-1587'/> + <class-decl name='symtable' size-in-bits='640' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='69' column='1' id='type-id-1589'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='st_filename' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_cur' type-id='type-id-1590' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_top' type-id='type-id-1590' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='st_blocks' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='st_stack' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='st_global' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='77' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='st_nblocks' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='st_private' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='81' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='st_future' type-id='type-id-1591' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='recursion_depth' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='608'> + <var-decl name='recursion_limit' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='85' column='1'/> + </data-member> + </class-decl> + <class-decl name='_symtable_entry' size-in-bits='1152' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='88' column='1' id='type-id-1592'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='ob_base' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='89' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='ste_id' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='90' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='ste_symbols' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='ste_name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='ste_varnames' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='93' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='ste_children' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='ste_directives' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='ste_mangled_names' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='ste_type' type-id='type-id-1584' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='98' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='ste_scope_info' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='ste_nested' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='ste_free' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='737'> + <var-decl name='ste_child_free' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='109' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='738'> + <var-decl name='ste_generator' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='111' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='739'> + <var-decl name='ste_coroutine' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='112' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='768'> + <var-decl name='ste_comprehension' type-id='type-id-1586' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='113' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='800'> + <var-decl name='ste_varargs' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='114' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='801'> + <var-decl name='ste_varkeywords' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='115' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='802'> + <var-decl name='ste_returns_value' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='116' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='803'> + <var-decl name='ste_needs_class_closure' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='118' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='804'> + <var-decl name='ste_needs_classdict' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='121' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='805'> + <var-decl name='ste_comp_inlined' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='123' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='806'> + <var-decl name='ste_comp_iter_target' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='124' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='807'> + <var-decl name='ste_can_see_class_scope' type-id='type-id-101' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='125' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='ste_comp_iter_expr' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='127' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='864'> + <var-decl name='ste_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='128' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='ste_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='129' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='928'> + <var-decl name='ste_end_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='130' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='ste_end_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='131' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='992'> + <var-decl name='ste_opt_lineno' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='132' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1024'> + <var-decl name='ste_opt_col_offset' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='133' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='1088'> + <var-decl name='ste_table' type-id='type-id-210' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='134' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PySTEntryObject' type-id='type-id-1592' filepath='./Include/internal/pycore_symtable.h' line='135' column='1' id='type-id-1593'/> + <typedef-decl name='int16_t' type-id='type-id-1594' filepath='/usr/include/x86_64-linux-gnu/bits/stdint-intn.h' line='25' column='1' id='type-id-1580'/> + <typedef-decl name='__int16_t' type-id='type-id-78' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='39' column='1' id='type-id-1594'/> + <typedef-decl name='cfg_builder' type-id='type-id-1565' filepath='Python/compile.c' line='75' column='1' id='type-id-1595'/> + <pointer-type-def type-id='type-id-1593' size-in-bits='64' id='type-id-1596'/> + <pointer-type-def type-id='type-id-1565' size-in-bits='64' id='type-id-1597'/> + <pointer-type-def type-id='type-id-1575' size-in-bits='64' id='type-id-1598'/> + <pointer-type-def type-id='type-id-1587' size-in-bits='64' id='type-id-1591'/> + <pointer-type-def type-id='type-id-1592' size-in-bits='64' id='type-id-1590'/> + <pointer-type-def type-id='type-id-1595' size-in-bits='64' id='type-id-1599'/> + <qualified-type-def type-id='type-id-1581' const='yes' id='type-id-1568'/> + <qualified-type-def type-id='type-id-1579' const='yes' id='type-id-1570'/> + <qualified-type-def type-id='type-id-1582' const='yes' id='type-id-1572'/> + <pointer-type-def type-id='type-id-1589' size-in-bits='64' id='type-id-210'/> + <class-decl name='_PyCfgBuilder' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/> + <function-decl name='PyErr_ProgramTextObject' mangled-name='PyErr_ProgramTextObject' filepath='./Include/cpython/pyerrors.h' line='119' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ProgramTextObject'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyAST_ExprAsUnicode' filepath='./Include/internal/pycore_ast.h' line='916' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-609'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCode_GetFreevars' filepath='./Include/internal/pycore_code.h' line='294' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyAST_Optimize' filepath='./Include/internal/pycore_compile.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-574'/> + <parameter type-id='type-id-1546'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfgBuilder_UseLabel' filepath='./Include/internal/pycore_flowgraph.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <parameter type-id='type-id-1577'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfgBuilder_Addop' filepath='./Include/internal/pycore_flowgraph.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1539'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfgBuilder_New' filepath='./Include/internal/pycore_flowgraph.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-1597'/> + </function-decl> + <function-decl name='_PyCfgBuilder_Free' filepath='./Include/internal/pycore_flowgraph.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCfgBuilder_CheckSize' filepath='./Include/internal/pycore_flowgraph.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfg_OptimizeCodeUnit' filepath='./Include/internal/pycore_flowgraph.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfg_ToInstructionSequence' filepath='./Include/internal/pycore_flowgraph.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCfg_OptimizedCfgToInstructionSequence' filepath='./Include/internal/pycore_flowgraph.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1597'/> + <parameter type-id='type-id-1598'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyAssemble_MakeCodeObject' filepath='./Include/internal/pycore_flowgraph.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1598'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='_PyInstructionSequence_New' mangled-name='_PyInstructionSequence_New' filepath='./Include/internal/pycore_instruction_sequence.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInstructionSequence_New'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyInstructionSequence_UseLabel' filepath='./Include/internal/pycore_instruction_sequence.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInstructionSequence_Addop' filepath='./Include/internal/pycore_instruction_sequence.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1539'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInstructionSequence_NewLabel' filepath='./Include/internal/pycore_instruction_sequence.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-1577'/> + </function-decl> + <function-decl name='_PyInstructionSequence_InsertInstruction' filepath='./Include/internal/pycore_instruction_sequence.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1539'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInstructionSequence_AddNested' filepath='./Include/internal/pycore_instruction_sequence.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyInstructionSequence_Fini' filepath='./Include/internal/pycore_instruction_sequence.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1545'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='_PyOpcode_opcode_metadata' type-id='type-id-1571' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='964' column='1'/> + <var-decl name='_PyOpcode_macro_expansion' type-id='type-id-1569' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1198' column='1'/> + <var-decl name='_PyOpcode_OpName' type-id='type-id-1566' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1366' column='1'/> + <var-decl name='_PyOpcode_Caches' type-id='type-id-1574' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1596' column='1'/> + <var-decl name='_PyOpcode_Deopt' type-id='type-id-1574' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1621' column='1'/> + <var-decl name='_PyOpcode_PseudoTargets' type-id='type-id-1573' visibility='default' filepath='./Include/internal/pycore_opcode_metadata.h' line='1889' column='1'/> + <function-decl name='_PyST_GetSymbol' filepath='./Include/internal/pycore_symtable.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1596'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='_PyST_GetScope' filepath='./Include/internal/pycore_symtable.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1596'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyST_IsFunctionLike' filepath='./Include/internal/pycore_symtable.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1596'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySymtable_Build' filepath='./Include/internal/pycore_symtable.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-574'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1591'/> + <return type-id='type-id-210'/> + </function-decl> + <function-decl name='_PySymtable_Lookup' filepath='./Include/internal/pycore_symtable.h' line='149' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-210'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-1596'/> + </function-decl> + <function-decl name='_PySymtable_Free' filepath='./Include/internal/pycore_symtable.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-210'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_MaybeMangle' filepath='./Include/internal/pycore_symtable.h' line='153' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1596'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyFuture_FromAST' filepath='./Include/internal/pycore_symtable.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-574'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-1591'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyCompile_OpcodeStackEffectWithJump' mangled-name='PyCompile_OpcodeStackEffectWithJump' filepath='Python/compile.c' line='773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCompile_OpcodeStackEffectWithJump'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='773' column='1'/> + <parameter type-id='type-id-5' name='oparg' filepath='Python/compile.c' line='773' column='1'/> + <parameter type-id='type-id-5' name='jump' filepath='Python/compile.c' line='773' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeIsValid' mangled-name='_PyCompile_OpcodeIsValid' filepath='Python/compile.c' line='785' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeIsValid'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='785' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasArg' mangled-name='_PyCompile_OpcodeHasArg' filepath='Python/compile.c' line='791' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasArg'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='791' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasConst' mangled-name='_PyCompile_OpcodeHasConst' filepath='Python/compile.c' line='797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasConst'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='797' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasName' mangled-name='_PyCompile_OpcodeHasName' filepath='Python/compile.c' line='803' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasName'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='803' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasJump' mangled-name='_PyCompile_OpcodeHasJump' filepath='Python/compile.c' line='809' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasJump'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='809' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasFree' mangled-name='_PyCompile_OpcodeHasFree' filepath='Python/compile.c' line='815' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasFree'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='815' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasLocal' mangled-name='_PyCompile_OpcodeHasLocal' filepath='Python/compile.c' line='821' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasLocal'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='821' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_OpcodeHasExc' mangled-name='_PyCompile_OpcodeHasExc' filepath='Python/compile.c' line='827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OpcodeHasExc'> + <parameter type-id='type-id-5' name='opcode' filepath='Python/compile.c' line='827' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_CleanDoc' mangled-name='_PyCompile_CleanDoc' filepath='Python/compile.c' line='7745' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CleanDoc'> + <parameter type-id='type-id-4' name='doc' filepath='Python/compile.c' line='7745' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCompile_CodeGen' mangled-name='_PyCompile_CodeGen' filepath='Python/compile.c' line='7832' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_CodeGen'> + <parameter type-id='type-id-4' name='ast' filepath='Python/compile.c' line='7832' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Python/compile.c' line='7832' column='1'/> + <parameter type-id='type-id-209' name='pflags' filepath='Python/compile.c' line='7832' column='1'/> + <parameter type-id='type-id-5' name='optimize' filepath='Python/compile.c' line='7833' column='1'/> + <parameter type-id='type-id-5' name='compile_mode' filepath='Python/compile.c' line='7833' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCompile_OptimizeCfg' mangled-name='_PyCompile_OptimizeCfg' filepath='Python/compile.c' line='7922' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_OptimizeCfg'> + <parameter type-id='type-id-4' name='seq' filepath='Python/compile.c' line='7922' column='1'/> + <parameter type-id='type-id-4' name='consts' filepath='Python/compile.c' line='7922' column='1'/> + <parameter type-id='type-id-5' name='nlocals' filepath='Python/compile.c' line='7922' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCfg_JumpLabelsToTargets' filepath='Python/compile.c' line='7950' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1599'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCompile_Assemble' mangled-name='_PyCompile_Assemble' filepath='Python/compile.c' line='7953' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_Assemble'> + <parameter type-id='type-id-1598' name='umd' filepath='Python/compile.c' line='7953' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Python/compile.c' line='7953' column='1'/> + <parameter type-id='type-id-4' name='seq' filepath='Python/compile.c' line='7954' column='1'/> + <return type-id='type-id-325'/> + </function-decl> + <function-decl name='PyCode_Optimize' mangled-name='PyCode_Optimize' filepath='Python/compile.c' line='8008' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCode_Optimize'> + <parameter type-id='type-id-4' name='code' filepath='Python/compile.c' line='8008' column='1'/> + <parameter type-id='type-id-4' name='_unused_consts' filepath='Python/compile.c' line='8008' column='1'/> + <parameter type-id='type-id-4' name='_unused_names' filepath='Python/compile.c' line='8009' column='1'/> + <parameter type-id='type-id-4' name='_unused_lnotab_obj' filepath='Python/compile.c' line='8009' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/context.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PyContext_Type' type-id='type-id-266' mangled-name='PyContext_Type' visibility='default' filepath='./Include/cpython/context.h' line='8' column='1' elf-symbol-id='PyContext_Type'/> + <var-decl name='PyContextVar_Type' type-id='type-id-266' mangled-name='PyContextVar_Type' visibility='default' filepath='./Include/cpython/context.h' line='11' column='1' elf-symbol-id='PyContextVar_Type'/> + <var-decl name='PyContextToken_Type' type-id='type-id-266' mangled-name='PyContextToken_Type' visibility='default' filepath='./Include/cpython/context.h' line='14' column='1' elf-symbol-id='PyContextToken_Type'/> + <var-decl name='_PyContextTokenMissing_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_context.h' line='12' column='1'/> + <function-decl name='_PyHamt_New' filepath='./Include/internal/pycore_hamt.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-1129'/> + </function-decl> + <function-decl name='_PyHamt_Assoc' filepath='./Include/internal/pycore_hamt.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-1129'/> + </function-decl> + <function-decl name='_PyHamt_Without' filepath='./Include/internal/pycore_hamt.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-1129'/> + </function-decl> + <function-decl name='_PyHamt_Find' filepath='./Include/internal/pycore_hamt.h' line='111' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyHamt_Eq' filepath='./Include/internal/pycore_hamt.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <parameter type-id='type-id-1129'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyHamt_Len' filepath='./Include/internal/pycore_hamt.h' line='123' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyHamt_NewIterKeys' filepath='./Include/internal/pycore_hamt.h' line='126' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyHamt_NewIterValues' filepath='./Include/internal/pycore_hamt.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyHamt_NewIterItems' filepath='./Include/internal/pycore_hamt.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1129'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyContext_NewHamtForTests' mangled-name='_PyContext_NewHamtForTests' filepath='Python/context.c' line='78' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyContext_NewHamtForTests'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContext_New' mangled-name='PyContext_New' filepath='Python/context.c' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_New'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContext_Copy' mangled-name='PyContext_Copy' filepath='Python/context.c' line='92' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Copy'> + <parameter type-id='type-id-4' name='octx' filepath='Python/context.c' line='92' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContext_CopyCurrent' mangled-name='PyContext_CopyCurrent' filepath='Python/context.c' line='101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_CopyCurrent'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContext_Enter' mangled-name='PyContext_Enter' filepath='Python/context.c' line='135' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Enter'> + <parameter type-id='type-id-4' name='octx' filepath='Python/context.c' line='135' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyContext_Exit' mangled-name='PyContext_Exit' filepath='Python/context.c' line='173' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContext_Exit'> + <parameter type-id='type-id-4' name='octx' filepath='Python/context.c' line='173' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyContextVar_New' mangled-name='PyContextVar_New' filepath='Python/context.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_New'> + <parameter type-id='type-id-6' name='name' filepath='Python/context.c' line='182' column='1'/> + <parameter type-id='type-id-4' name='def' filepath='Python/context.c' line='182' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContextVar_Get' mangled-name='PyContextVar_Get' filepath='Python/context.c' line='195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Get'> + <parameter type-id='type-id-4' name='ovar' filepath='Python/context.c' line='195' column='1'/> + <parameter type-id='type-id-4' name='def' filepath='Python/context.c' line='195' column='1'/> + <parameter type-id='type-id-238' name='val' filepath='Python/context.c' line='195' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyContextVar_Set' mangled-name='PyContextVar_Set' filepath='Python/context.c' line='262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Set'> + <parameter type-id='type-id-4' name='ovar' filepath='Python/context.c' line='262' column='1'/> + <parameter type-id='type-id-4' name='val' filepath='Python/context.c' line='262' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyContextVar_Reset' mangled-name='PyContextVar_Reset' filepath='Python/context.c' line='298' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyContextVar_Reset'> + <parameter type-id='type-id-4' name='ovar' filepath='Python/context.c' line='298' column='1'/> + <parameter type-id='type-id-4' name='otok' filepath='Python/context.c' line='298' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/critical_section.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyCriticalSection' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1600'/> + <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1601'/> + <typedef-decl name='PyCriticalSection' type-id='type-id-1600' filepath='./Include/cpython/critical_section.h' line='70' column='1' id='type-id-1602'/> + <typedef-decl name='PyCriticalSection2' type-id='type-id-1601' filepath='./Include/cpython/critical_section.h' line='71' column='1' id='type-id-1603'/> + <pointer-type-def type-id='type-id-1602' size-in-bits='64' id='type-id-1604'/> + <pointer-type-def type-id='type-id-1603' size-in-bits='64' id='type-id-1605'/> + <class-decl name='PyCriticalSection' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1600'/> + <class-decl name='PyCriticalSection2' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1601'/> + <function-decl name='_PyCriticalSection_BeginSlow' mangled-name='_PyCriticalSection_BeginSlow' filepath='Python/critical_section.c' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_BeginSlow'> + <parameter type-id='type-id-1604' name='c' filepath='Python/critical_section.c' line='12' column='1'/> + <parameter type-id='type-id-26' name='m' filepath='Python/critical_section.c' line='12' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCriticalSection2_BeginSlow' mangled-name='_PyCriticalSection2_BeginSlow' filepath='Python/critical_section.c' line='26' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection2_BeginSlow'> + <parameter type-id='type-id-1605' name='c' filepath='Python/critical_section.c' line='26' column='1'/> + <parameter type-id='type-id-26' name='m1' filepath='Python/critical_section.c' line='26' column='1'/> + <parameter type-id='type-id-26' name='m2' filepath='Python/critical_section.c' line='26' column='1'/> + <parameter type-id='type-id-5' name='is_m1_locked' filepath='Python/critical_section.c' line='27' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCriticalSection_SuspendAll' mangled-name='_PyCriticalSection_SuspendAll' filepath='Python/critical_section.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_SuspendAll'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/critical_section.c' line='56' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCriticalSection_Resume' mangled-name='_PyCriticalSection_Resume' filepath='Python/critical_section.c' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCriticalSection_Resume'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/critical_section.c' line='80' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyCriticalSection_Begin' mangled-name='PyCriticalSection_Begin' filepath='Python/critical_section.c' line='116' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_Begin'> + <parameter type-id='type-id-1604' name='c' filepath='Python/critical_section.c' line='116' column='1'/> + <parameter type-id='type-id-4' name='op' filepath='Python/critical_section.c' line='116' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyCriticalSection_End' mangled-name='PyCriticalSection_End' filepath='Python/critical_section.c' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection_End'> + <parameter type-id='type-id-1604' name='c' filepath='Python/critical_section.c' line='125' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyCriticalSection2_Begin' mangled-name='PyCriticalSection2_Begin' filepath='Python/critical_section.c' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_Begin'> + <parameter type-id='type-id-1605' name='c' filepath='Python/critical_section.c' line='134' column='1'/> + <parameter type-id='type-id-4' name='a' filepath='Python/critical_section.c' line='134' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Python/critical_section.c' line='134' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyCriticalSection2_End' mangled-name='PyCriticalSection2_End' filepath='Python/critical_section.c' line='143' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyCriticalSection2_End'> + <parameter type-id='type-id-1605' name='c' filepath='Python/critical_section.c' line='143' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/crossinterp.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='PyInterpreterConfig' size-in-bits='224' is-struct='yes' naming-typedef-id='type-id-1606' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='44' column='1' id='type-id-1607'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='use_main_obmalloc' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='46' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='allow_fork' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='allow_exec' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='allow_threads' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='49' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='allow_daemon_threads' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='check_multi_interp_extensions' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='51' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='gil' type-id='type-id-5' visibility='default' filepath='./Include/cpython/pylifecycle.h' line='52' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyInterpreterConfig' type-id='type-id-1607' filepath='./Include/cpython/pylifecycle.h' line='53' column='1' id='type-id-1606'/> + <typedef-decl name='_Py_add_pending_call_result' type-id='type-id-5' filepath='./Include/internal/pycore_ceval.h' line='51' column='1' id='type-id-1608'/> + <class-decl name='_excinfo' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='209' column='1' id='type-id-1609'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='type' type-id='type-id-1610' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='215' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='msg' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='216' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='errdisplay' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='217' column='1'/> + </data-member> + </class-decl> + <class-decl name='_excinfo_type' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='210' column='1' id='type-id-1610'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='builtin' type-id='type-id-1' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='211' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='212' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='qualname' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='213' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='module' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='214' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyXI_excinfo' type-id='type-id-1609' filepath='./Include/internal/pycore_crossinterp.h' line='218' column='1' id='type-id-1611'/> + <enum-decl name='error_code' filepath='./Include/internal/pycore_crossinterp.h' line='226' column='1' id='type-id-1612'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_PyXI_ERR_NO_ERROR' value='0'/> + <enumerator name='_PyXI_ERR_UNCAUGHT_EXCEPTION' value='-1'/> + <enumerator name='_PyXI_ERR_OTHER' value='-2'/> + <enumerator name='_PyXI_ERR_NO_MEMORY' value='-3'/> + <enumerator name='_PyXI_ERR_ALREADY_RUNNING' value='-4'/> + <enumerator name='_PyXI_ERR_MAIN_NS_FAILURE' value='-5'/> + <enumerator name='_PyXI_ERR_APPLY_NS_FAILURE' value='-6'/> + <enumerator name='_PyXI_ERR_NOT_SHAREABLE' value='-7'/> + </enum-decl> + <typedef-decl name='_PyXI_errcode' type-id='type-id-1612' filepath='./Include/internal/pycore_crossinterp.h' line='235' column='1' id='type-id-1613'/> + <class-decl name='_sharedexception' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='238' column='1' id='type-id-1614'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='interp' type-id='type-id-28' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='240' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='code' type-id='type-id-1613' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='242' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='uncaught' type-id='type-id-1611' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='246' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyXI_error' type-id='type-id-1614' filepath='./Include/internal/pycore_crossinterp.h' line='247' column='1' id='type-id-1615'/> + <typedef-decl name='_PyXI_session' type-id='type-id-1616' filepath='./Include/internal/pycore_crossinterp.h' line='252' column='1' id='type-id-1617'/> + <typedef-decl name='_PyXI_namespace' type-id='type-id-1618' filepath='./Include/internal/pycore_crossinterp.h' line='253' column='1' id='type-id-1619'/> + <class-decl name='xi_session' size-in-bits='960' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='277' column='1' id='type-id-1616'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='prev_tstate' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='282' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='init_tstate' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='285' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='own_init_tstate' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='287' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='running' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='294' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='main_ns' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='298' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='error_override' type-id='type-id-1620' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='302' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='error' type-id='type-id-1621' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='304' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='_error' type-id='type-id-1615' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='307' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='896'> + <var-decl name='_error_override' type-id='type-id-1613' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='308' column='1'/> + </data-member> + </class-decl> + <class-decl name='_sharednsitem' size-in-bits='128' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='1095' column='1' id='type-id-1622'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='Python/crossinterp.c' line='1096' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='data' type-id='type-id-1482' visibility='default' filepath='Python/crossinterp.c' line='1097' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyXI_namespace_item' type-id='type-id-1622' filepath='Python/crossinterp.c' line='1103' column='1' id='type-id-1623'/> + <class-decl name='_sharedns' size-in-bits='128' is-struct='yes' visibility='default' filepath='Python/crossinterp.c' line='1223' column='1' id='type-id-1618'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='len' type-id='type-id-7' visibility='default' filepath='Python/crossinterp.c' line='1224' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='items' type-id='type-id-1624' visibility='default' filepath='Python/crossinterp.c' line='1225' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-1606' size-in-bits='64' id='type-id-1625'/> + <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-1626'/> + <pointer-type-def type-id='type-id-1613' size-in-bits='64' id='type-id-1620'/> + <pointer-type-def type-id='type-id-1615' size-in-bits='64' id='type-id-1621'/> + <pointer-type-def type-id='type-id-1611' size-in-bits='64' id='type-id-1627'/> + <pointer-type-def type-id='type-id-1619' size-in-bits='64' id='type-id-1628'/> + <pointer-type-def type-id='type-id-1623' size-in-bits='64' id='type-id-1624'/> + <pointer-type-def type-id='type-id-1617' size-in-bits='64' id='type-id-1629'/> + <qualified-type-def type-id='type-id-1606' const='yes' id='type-id-1630'/> + <pointer-type-def type-id='type-id-1630' size-in-bits='64' id='type-id-1631'/> + <qualified-type-def type-id='type-id-21' const='yes' id='type-id-1632'/> + <pointer-type-def type-id='type-id-183' size-in-bits='64' id='type-id-170'/> + <function-decl name='PyStatus_Exception' mangled-name='PyStatus_Exception' filepath='./Include/cpython/initconfig.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Exception'> + <parameter type-id='type-id-61'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_NewInterpreterFromConfig' mangled-name='Py_NewInterpreterFromConfig' filepath='./Include/cpython/pylifecycle.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreterFromConfig'> + <parameter type-id='type-id-1626'/> + <parameter type-id='type-id-1631'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyUnstable_InterpreterState_GetMainModule' mangled-name='PyUnstable_InterpreterState_GetMainModule' filepath='./Include/cpython/pystate.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterState_GetMainModule'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyEval_AddPendingCall' mangled-name='_PyEval_AddPendingCall' filepath='./Include/internal/pycore_ceval.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEval_AddPendingCall'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-1107'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-1608'/> + </function-decl> + <var-decl name='PyExc_InterpreterError' type-id='type-id-4' mangled-name='PyExc_InterpreterError' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='18' column='1' elf-symbol-id='PyExc_InterpreterError'/> + <var-decl name='PyExc_InterpreterNotFoundError' type-id='type-id-4' mangled-name='PyExc_InterpreterNotFoundError' visibility='default' filepath='./Include/internal/pycore_crossinterp.h' line='19' column='1' elf-symbol-id='PyExc_InterpreterNotFoundError'/> + <function-decl name='_PyErr_SetFromPyStatus' mangled-name='_PyErr_SetFromPyStatus' filepath='./Include/internal/pycore_initconfig.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyErr_SetFromPyStatus'> + <parameter type-id='type-id-61'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_LookUpID' mangled-name='_PyInterpreterState_LookUpID' filepath='./Include/internal/pycore_interp.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpID'> + <parameter type-id='type-id-460'/> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='_PyInterpreterState_IsReady' mangled-name='_PyInterpreterState_IsReady' filepath='./Include/internal/pycore_interp.h' line='322' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IsReady'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_SetWhence' filepath='./Include/internal/pycore_interp.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-183'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_SetRunningMain' mangled-name='_PyInterpreterState_SetRunningMain' filepath='./Include/internal/pycore_pystate.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetRunningMain'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_SetNotRunningMain' mangled-name='_PyInterpreterState_SetNotRunningMain' filepath='./Include/internal/pycore_pystate.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetNotRunningMain'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_NewBound' mangled-name='_PyThreadState_NewBound' filepath='./Include/internal/pycore_pystate.h' line='225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_NewBound'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='Py_EndInterpreter' mangled-name='Py_EndInterpreter' filepath='./Include/pylifecycle.h' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EndInterpreter'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyInterpreterState_Delete' mangled-name='PyInterpreterState_Delete' filepath='./Include/pystate.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Delete'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyInterpreterState_GetID' mangled-name='PyInterpreterState_GetID' filepath='./Include/pystate.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_GetID'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-460'/> + </function-decl> + <function-decl name='PyThreadState_Clear' mangled-name='PyThreadState_Clear' filepath='./Include/pystate.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Clear'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThreadState_Delete' mangled-name='PyThreadState_Delete' filepath='./Include/pystate.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Delete'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThreadState_Swap' mangled-name='PyThreadState_Swap' filepath='./Include/pystate.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_Swap'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyThreadState_GetInterpreter' mangled-name='PyThreadState_GetInterpreter' filepath='./Include/pystate.h' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetInterpreter'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='PyErr_PrintEx' mangled-name='PyErr_PrintEx' filepath='./Include/pythonrun.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_PrintEx'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_New' mangled-name='_PyCrossInterpreterData_New' filepath='Python/crossinterp.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_New'> + <return type-id='type-id-1482'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_Free' mangled-name='_PyCrossInterpreterData_Free' filepath='Python/crossinterp.c' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Free'> + <parameter type-id='type-id-1482' name='xid' filepath='Python/crossinterp.c' line='86' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_Init' mangled-name='_PyCrossInterpreterData_Init' filepath='Python/crossinterp.c' line='124' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Init'> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='124' column='1'/> + <parameter type-id='type-id-28' name='interp' filepath='Python/crossinterp.c' line='125' column='1'/> + <parameter type-id='type-id-30' name='shared' filepath='Python/crossinterp.c' line='126' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/crossinterp.c' line='126' column='1'/> + <parameter type-id='type-id-1133' name='new_object' filepath='Python/crossinterp.c' line='127' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_InitWithSize' mangled-name='_PyCrossInterpreterData_InitWithSize' filepath='Python/crossinterp.c' line='148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_InitWithSize'> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='148' column='1'/> + <parameter type-id='type-id-28' name='interp' filepath='Python/crossinterp.c' line='149' column='1'/> + <parameter type-id='type-id-1632' name='size' filepath='Python/crossinterp.c' line='150' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/crossinterp.c' line='150' column='1'/> + <parameter type-id='type-id-1133' name='new_object' filepath='Python/crossinterp.c' line='151' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_Clear' mangled-name='_PyCrossInterpreterData_Clear' filepath='Python/crossinterp.c' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Clear'> + <parameter type-id='type-id-28' name='interp' filepath='Python/crossinterp.c' line='167' column='1'/> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='168' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_CheckCrossInterpreterData' mangled-name='_PyObject_CheckCrossInterpreterData' filepath='Python/crossinterp.c' line='224' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_CheckCrossInterpreterData'> + <parameter type-id='type-id-4' name='obj' filepath='Python/crossinterp.c' line='224' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_GetCrossInterpreterData' mangled-name='_PyObject_GetCrossInterpreterData' filepath='Python/crossinterp.c' line='238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyObject_GetCrossInterpreterData'> + <parameter type-id='type-id-4' name='obj' filepath='Python/crossinterp.c' line='238' column='1'/> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='238' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_NewObject' mangled-name='_PyCrossInterpreterData_NewObject' filepath='Python/crossinterp.c' line='274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_NewObject'> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='274' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_Release' mangled-name='_PyCrossInterpreterData_Release' filepath='Python/crossinterp.c' line='324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Release'> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='324' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_ReleaseAndRawFree' mangled-name='_PyCrossInterpreterData_ReleaseAndRawFree' filepath='Python/crossinterp.c' line='330' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_ReleaseAndRawFree'> + <parameter type-id='type-id-1482' name='data' filepath='Python/crossinterp.c' line='330' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_InitExcInfo' mangled-name='_PyXI_InitExcInfo' filepath='Python/crossinterp.c' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_InitExcInfo'> + <parameter type-id='type-id-1627' name='info' filepath='Python/crossinterp.c' line='921' column='1'/> + <parameter type-id='type-id-4' name='exc' filepath='Python/crossinterp.c' line='921' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_FormatExcInfo' mangled-name='_PyXI_FormatExcInfo' filepath='Python/crossinterp.c' line='943' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FormatExcInfo'> + <parameter type-id='type-id-1627' name='info' filepath='Python/crossinterp.c' line='943' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyXI_ExcInfoAsObject' mangled-name='_PyXI_ExcInfoAsObject' filepath='Python/crossinterp.c' line='949' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ExcInfoAsObject'> + <parameter type-id='type-id-1627' name='info' filepath='Python/crossinterp.c' line='949' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyXI_ClearExcInfo' mangled-name='_PyXI_ClearExcInfo' filepath='Python/crossinterp.c' line='955' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ClearExcInfo'> + <parameter type-id='type-id-1627' name='info' filepath='Python/crossinterp.c' line='955' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyXI_ApplyError' mangled-name='_PyXI_ApplyError' filepath='Python/crossinterp.c' line='1054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ApplyError'> + <parameter type-id='type-id-1621' name='error' filepath='Python/crossinterp.c' line='1054' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyXI_FreeNamespace' mangled-name='_PyXI_FreeNamespace' filepath='Python/crossinterp.c' line='1396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FreeNamespace'> + <parameter type-id='type-id-1628' name='ns' filepath='Python/crossinterp.c' line='1396' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyXI_NamespaceFromNames' mangled-name='_PyXI_NamespaceFromNames' filepath='Python/crossinterp.c' line='1421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NamespaceFromNames'> + <parameter type-id='type-id-4' name='names' filepath='Python/crossinterp.c' line='1421' column='1'/> + <return type-id='type-id-1628'/> + </function-decl> + <function-decl name='_PyXI_FillNamespaceFromDict' mangled-name='_PyXI_FillNamespaceFromDict' filepath='Python/crossinterp.c' line='1449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_FillNamespaceFromDict'> + <parameter type-id='type-id-1628' name='ns' filepath='Python/crossinterp.c' line='1449' column='1'/> + <parameter type-id='type-id-4' name='nsobj' filepath='Python/crossinterp.c' line='1449' column='1'/> + <parameter type-id='type-id-1629' name='session' filepath='Python/crossinterp.c' line='1450' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_ApplyNamespace' mangled-name='_PyXI_ApplyNamespace' filepath='Python/crossinterp.c' line='1511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ApplyNamespace'> + <parameter type-id='type-id-1628' name='ns' filepath='Python/crossinterp.c' line='1511' column='1'/> + <parameter type-id='type-id-4' name='nsobj' filepath='Python/crossinterp.c' line='1511' column='1'/> + <parameter type-id='type-id-4' name='dflt' filepath='Python/crossinterp.c' line='1511' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_ApplyCapturedException' mangled-name='_PyXI_ApplyCapturedException' filepath='Python/crossinterp.c' line='1679' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_ApplyCapturedException'> + <parameter type-id='type-id-1629' name='session' filepath='Python/crossinterp.c' line='1679' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyXI_HasCapturedException' mangled-name='_PyXI_HasCapturedException' filepath='Python/crossinterp.c' line='1690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_HasCapturedException'> + <parameter type-id='type-id-1629' name='session' filepath='Python/crossinterp.c' line='1690' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_Enter' mangled-name='_PyXI_Enter' filepath='Python/crossinterp.c' line='1696' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Enter'> + <parameter type-id='type-id-1629' name='session' filepath='Python/crossinterp.c' line='1696' column='1'/> + <parameter type-id='type-id-28' name='interp' filepath='Python/crossinterp.c' line='1697' column='1'/> + <parameter type-id='type-id-4' name='nsupdates' filepath='Python/crossinterp.c' line='1697' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyXI_Exit' mangled-name='_PyXI_Exit' filepath='Python/crossinterp.c' line='1764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_Exit'> + <parameter type-id='type-id-1629' name='session' filepath='Python/crossinterp.c' line='1764' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyXI_NewInterpreter' mangled-name='_PyXI_NewInterpreter' filepath='Python/crossinterp.c' line='1824' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_NewInterpreter'> + <parameter type-id='type-id-1625' name='config' filepath='Python/crossinterp.c' line='1824' column='1'/> + <parameter type-id='type-id-170' name='maybe_whence' filepath='Python/crossinterp.c' line='1824' column='1'/> + <parameter type-id='type-id-1626' name='p_tstate' filepath='Python/crossinterp.c' line='1825' column='1'/> + <parameter type-id='type-id-1626' name='p_save_tstate' filepath='Python/crossinterp.c' line='1825' column='1'/> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='_PyXI_EndInterpreter' mangled-name='_PyXI_EndInterpreter' filepath='Python/crossinterp.c' line='1871' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyXI_EndInterpreter'> + <parameter type-id='type-id-28' name='interp' filepath='Python/crossinterp.c' line='1871' column='1'/> + <parameter type-id='type-id-27' name='tstate' filepath='Python/crossinterp.c' line='1872' column='1'/> + <parameter type-id='type-id-1626' name='p_save_tstate' filepath='Python/crossinterp.c' line='1872' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_Lookup' mangled-name='_PyCrossInterpreterData_Lookup' filepath='Python/crossinterp_data_lookup.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_Lookup'> + <parameter type-id='type-id-4' name='obj' filepath='Python/crossinterp_data_lookup.h' line='15' column='1'/> + <return type-id='type-id-1136'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_RegisterClass' mangled-name='_PyCrossInterpreterData_RegisterClass' filepath='Python/crossinterp_data_lookup.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_RegisterClass'> + <parameter type-id='type-id-1' name='cls' filepath='Python/crossinterp_data_lookup.h' line='241' column='1'/> + <parameter type-id='type-id-1136' name='getdata' filepath='Python/crossinterp_data_lookup.h' line='242' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyCrossInterpreterData_UnregisterClass' mangled-name='_PyCrossInterpreterData_UnregisterClass' filepath='Python/crossinterp_data_lookup.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCrossInterpreterData_UnregisterClass'> + <parameter type-id='type-id-1' name='cls' filepath='Python/crossinterp_data_lookup.h' line='273' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/errors.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_fopen_obj' mangled-name='_Py_fopen_obj' filepath='./Include/cpython/fileutils.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fopen_obj'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-56'/> + </function-decl> + <function-decl name='_PyException_AddNote' filepath='./Include/internal/pycore_pyerrors.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceBack_FromFrame' filepath='./Include/internal/pycore_traceback.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-351'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyTraceBack_Print' mangled-name='PyTraceBack_Print' filepath='./Include/traceback.h' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceBack_Print'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='strerror' filepath='/usr/include/string.h' line='419' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='PyErr_GetHandledException' mangled-name='PyErr_GetHandledException' filepath='Python/errors.c' line='586' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetHandledException'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_GetExcInfo' mangled-name='PyErr_GetExcInfo' filepath='Python/errors.c' line='606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_GetExcInfo'> + <parameter type-id='type-id-238' name='p_type' filepath='Python/errors.c' line='606' column='1'/> + <parameter type-id='type-id-238' name='p_value' filepath='Python/errors.c' line='606' column='1'/> + <parameter type-id='type-id-238' name='p_traceback' filepath='Python/errors.c' line='606' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_SetExcInfo' mangled-name='PyErr_SetExcInfo' filepath='Python/errors.c' line='613' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetExcInfo'> + <parameter type-id='type-id-4' name='type' filepath='Python/errors.c' line='613' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Python/errors.c' line='613' column='1'/> + <parameter type-id='type-id-4' name='traceback' filepath='Python/errors.c' line='613' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_SetFromErrnoWithFilenameObject' mangled-name='PyErr_SetFromErrnoWithFilenameObject' filepath='Python/errors.c' line='783' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilenameObject'> + <parameter type-id='type-id-4' name='exc' filepath='Python/errors.c' line='783' column='1'/> + <parameter type-id='type-id-4' name='filenameObject' filepath='Python/errors.c' line='783' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetFromErrnoWithFilenameObjects' mangled-name='PyErr_SetFromErrnoWithFilenameObjects' filepath='Python/errors.c' line='789' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetFromErrnoWithFilenameObjects'> + <parameter type-id='type-id-4' name='exc' filepath='Python/errors.c' line='789' column='1'/> + <parameter type-id='type-id-4' name='filenameObject' filepath='Python/errors.c' line='789' column='1'/> + <parameter type-id='type-id-4' name='filenameObject2' filepath='Python/errors.c' line='789' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetImportErrorSubclass' mangled-name='PyErr_SetImportErrorSubclass' filepath='Python/errors.c' line='1110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetImportErrorSubclass'> + <parameter type-id='type-id-4' name='exception' filepath='Python/errors.c' line='1110' column='1'/> + <parameter type-id='type-id-4' name='msg' filepath='Python/errors.c' line='1110' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/errors.c' line='1111' column='1'/> + <parameter type-id='type-id-4' name='path' filepath='Python/errors.c' line='1111' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SetImportError' mangled-name='PyErr_SetImportError' filepath='Python/errors.c' line='1123' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SetImportError'> + <parameter type-id='type-id-4' name='msg' filepath='Python/errors.c' line='1123' column='1'/> + <parameter type-id='type-id-4' name='name' filepath='Python/errors.c' line='1123' column='1'/> + <parameter type-id='type-id-4' name='path' filepath='Python/errors.c' line='1123' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_BadInternalCall' mangled-name='PyErr_BadInternalCall' filepath='Python/errors.c' line='1141' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_BadInternalCall'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_FormatV' mangled-name='PyErr_FormatV' filepath='Python/errors.c' line='1171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_FormatV'> + <parameter type-id='type-id-4' name='exception' filepath='Python/errors.c' line='1171' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/errors.c' line='1171' column='1'/> + <parameter type-id='type-id-302' name='vargs' filepath='Python/errors.c' line='1171' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_NewExceptionWithDoc' mangled-name='PyErr_NewExceptionWithDoc' filepath='Python/errors.c' line='1285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_NewExceptionWithDoc'> + <parameter type-id='type-id-6' name='name' filepath='Python/errors.c' line='1285' column='1'/> + <parameter type-id='type-id-6' name='doc' filepath='Python/errors.c' line='1285' column='1'/> + <parameter type-id='type-id-4' name='base' filepath='Python/errors.c' line='1286' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Python/errors.c' line='1286' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyErr_SyntaxLocation' mangled-name='PyErr_SyntaxLocation' filepath='Python/errors.c' line='1709' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocation'> + <parameter type-id='type-id-6' name='filename' filepath='Python/errors.c' line='1709' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/errors.c' line='1709' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_RangedSyntaxLocationObject' mangled-name='PyErr_RangedSyntaxLocationObject' filepath='Python/errors.c' line='1829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_RangedSyntaxLocationObject'> + <parameter type-id='type-id-4' name='filename' filepath='Python/errors.c' line='1829' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/errors.c' line='1829' column='1'/> + <parameter type-id='type-id-5' name='col_offset' filepath='Python/errors.c' line='1829' column='1'/> + <parameter type-id='type-id-5' name='end_lineno' filepath='Python/errors.c' line='1830' column='1'/> + <parameter type-id='type-id-5' name='end_col_offset' filepath='Python/errors.c' line='1830' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_SyntaxLocationEx' mangled-name='PyErr_SyntaxLocationEx' filepath='Python/errors.c' line='1835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_SyntaxLocationEx'> + <parameter type-id='type-id-6' name='filename' filepath='Python/errors.c' line='1835' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/errors.c' line='1835' column='1'/> + <parameter type-id='type-id-5' name='col_offset' filepath='Python/errors.c' line='1835' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyErr_ProgramText' mangled-name='PyErr_ProgramText' filepath='Python/errors.c' line='1900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_ProgramText'> + <parameter type-id='type-id-6' name='filename' filepath='Python/errors.c' line='1900' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/errors.c' line='1900' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTokenizer_FindEncodingFilename' filepath='Python/errors.c' line='1917' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-17'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/fileutils.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='__mbstate_t' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1633' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='13' column='1' id='type-id-1634'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='__count' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='__value' type-id='type-id-1635' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='20' column='1'/> + </data-member> + </class-decl> + <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='16' column='1' id='type-id-1635'> + <data-member access='public'> + <var-decl name='__wch' type-id='type-id-101' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='18' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__wchb' type-id='type-id-814' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='19' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='__mbstate_t' type-id='type-id-1634' filepath='/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h' line='21' column='1' id='type-id-1633'/> + <typedef-decl name='mbstate_t' type-id='type-id-1633' filepath='/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h' line='6' column='1' id='type-id-1636'/> + <pointer-type-def type-id='type-id-1636' size-in-bits='64' id='type-id-1637'/> + <qualified-type-def type-id='type-id-1637' restrict='yes' id='type-id-1638'/> + <qualified-type-def type-id='type-id-59' restrict='yes' id='type-id-1639'/> + <function-decl name='_Py_DecodeUTF8Ex' filepath='./Include/internal/pycore_fileutils.h' line='210' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-241'/> + <parameter type-id='type-id-57'/> + <parameter type-id='type-id-261'/> + <parameter type-id='type-id-542'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_EncodeUTF8Ex' filepath='./Include/internal/pycore_fileutils.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-248'/> + <parameter type-id='type-id-57'/> + <parameter type-id='type-id-261'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-542'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mbstowcs' filepath='/usr/include/stdlib.h' line='941' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='wcstombs' filepath='/usr/include/stdlib.h' line='945' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='closefrom' filepath='/usr/include/unistd.h' line='363' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='write' filepath='/usr/include/unistd.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='getcwd' filepath='/usr/include/unistd.h' line='531' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='readlink' filepath='/usr/include/unistd.h' line='838' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-184'/> + </function-decl> + <function-decl name='close_range' filepath='/usr/include/unistd.h' line='1208' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-101'/> + <parameter type-id='type-id-101'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='297' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-1638'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='ioctl' filepath='/usr/include/x86_64-linux-gnu/sys/ioctl.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-2'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_EncodeLocale' mangled-name='Py_EncodeLocale' filepath='Python/fileutils.c' line='866' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_EncodeLocale'> + <parameter type-id='type-id-18' name='text' filepath='Python/fileutils.c' line='866' column='1'/> + <parameter type-id='type-id-57' name='error_pos' filepath='Python/fileutils.c' line='866' column='1'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_Py_stat' mangled-name='_Py_stat' filepath='Python/fileutils.c' line='1363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_stat'> + <parameter type-id='type-id-4' name='path' filepath='Python/fileutils.c' line='1363' column='1'/> + <parameter type-id='type-id-59' name='statbuf' filepath='Python/fileutils.c' line='1363' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_set_inheritable' mangled-name='_Py_set_inheritable' filepath='Python/fileutils.c' line='1605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_set_inheritable'> + <parameter type-id='type-id-5' name='fd' filepath='Python/fileutils.c' line='1605' column='1'/> + <parameter type-id='type-id-5' name='inheritable' filepath='Python/fileutils.c' line='1605' column='1'/> + <parameter type-id='type-id-177' name='atomic_flag_works' filepath='Python/fileutils.c' line='1605' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_set_inheritable_async_safe' mangled-name='_Py_set_inheritable_async_safe' filepath='Python/fileutils.c' line='1614' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_set_inheritable_async_safe'> + <parameter type-id='type-id-5' name='fd' filepath='Python/fileutils.c' line='1614' column='1'/> + <parameter type-id='type-id-5' name='inheritable' filepath='Python/fileutils.c' line='1614' column='1'/> + <parameter type-id='type-id-177' name='atomic_flag_works' filepath='Python/fileutils.c' line='1614' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_normpath' mangled-name='_Py_normpath' filepath='Python/fileutils.c' line='2608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_normpath'> + <parameter type-id='type-id-58' name='path' filepath='Python/fileutils.c' line='2608' column='1'/> + <parameter type-id='type-id-7' name='size' filepath='Python/fileutils.c' line='2608' column='1'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_closerange' mangled-name='_Py_closerange' filepath='Python/fileutils.c' line='2995' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_closerange'> + <parameter type-id='type-id-5' name='first' filepath='Python/fileutils.c' line='2995' column='1'/> + <parameter type-id='type-id-5' name='last' filepath='Python/fileutils.c' line='2995' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/flowgraph.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyCompile_EnsureArrayLargeEnough' filepath='./Include/internal/pycore_compile.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-262'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/formatter_unicode.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='51' column='1' id='type-id-1640'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='decimal_point' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='thousands_sep' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='56' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='grouping' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='62' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='int_curr_symbol' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='currency_symbol' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='69' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='mon_decimal_point' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='mon_thousands_sep' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='mon_grouping' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='positive_sign' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='negative_sign' type-id='type-id-17' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='640'> + <var-decl name='int_frac_digits' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='648'> + <var-decl name='frac_digits' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='656'> + <var-decl name='p_cs_precedes' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='664'> + <var-decl name='p_sep_by_space' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='672'> + <var-decl name='n_cs_precedes' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='680'> + <var-decl name='n_sep_by_space' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='688'> + <var-decl name='p_sign_posn' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='91' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='696'> + <var-decl name='n_sign_posn' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='92' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='int_p_cs_precedes' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='95' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='712'> + <var-decl name='int_p_sep_by_space' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='720'> + <var-decl name='int_n_cs_precedes' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='728'> + <var-decl name='int_n_sep_by_space' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='736'> + <var-decl name='int_p_sign_posn' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='108' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='744'> + <var-decl name='int_n_sign_posn' type-id='type-id-53' visibility='default' filepath='/usr/include/locale.h' line='109' column='1'/> + </data-member> + </class-decl> + <pointer-type-def type-id='type-id-1640' size-in-bits='64' id='type-id-1641'/> + <function-decl name='_Py_GetLocaleconvNumeric' filepath='./Include/internal/pycore_fileutils.h' line='244' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1641'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyUnicode_FastFill' filepath='./Include/internal/pycore_unicodeobject.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-259'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_FastCopyCharacters' filepath='./Include/internal/pycore_unicodeobject.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_FindMaxChar' filepath='./Include/internal/pycore_unicodeobject.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-259'/> + </function-decl> + <function-decl name='_PyUnicode_InsertThousandsGrouping' filepath='./Include/internal/pycore_unicodeobject.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-330'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-547'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='localeconv' filepath='/usr/include/locale.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-1641'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/frame.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-1642' size-in-bits='384' id='type-id-1643'> + <subrange length='6' type-id='type-id-2' id='type-id-391'/> + </array-type-def> + <qualified-type-def type-id='type-id-266' const='yes' id='type-id-1644'/> + <pointer-type-def type-id='type-id-1644' size-in-bits='64' id='type-id-1645'/> + <qualified-type-def type-id='type-id-1645' const='yes' id='type-id-1642'/> + <var-decl name='PyUnstable_ExecutableKinds' type-id='type-id-1643' mangled-name='PyUnstable_ExecutableKinds' visibility='default' filepath='./Include/cpython/pyframe.h' line='45' column='1' elf-symbol-id='PyUnstable_ExecutableKinds'/> + <function-decl name='_PyFrame_New_NoTrack' filepath='./Include/internal/pycore_frame.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <return type-id='type-id-351'/> + </function-decl> + <function-decl name='PyUnstable_InterpreterFrame_GetCode' mangled-name='PyUnstable_InterpreterFrame_GetCode' filepath='Python/frame.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetCode'> + <parameter type-id='type-id-367' name='frame' filepath='Python/frame.c' line='136' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyUnstable_InterpreterFrame_GetLasti' mangled-name='PyUnstable_InterpreterFrame_GetLasti' filepath='Python/frame.c' line='144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_InterpreterFrame_GetLasti'> + <parameter type-id='type-id-367' name='frame' filepath='Python/frame.c' line='144' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/frozen.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_frozen' size-in-bits='192' is-struct='yes' visibility='default' filepath='./Include/cpython/import.h' line='15' column='1' id='type-id-1646'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/import.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='code' type-id='type-id-372' visibility='default' filepath='./Include/cpython/import.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='size' type-id='type-id-5' visibility='default' filepath='./Include/cpython/import.h' line='18' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='is_package' type-id='type-id-5' visibility='default' filepath='./Include/cpython/import.h' line='19' column='1'/> + </data-member> + </class-decl> + <class-decl name='_module_alias' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_import.h' line='177' column='1' id='type-id-1647'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_import.h' line='178' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='orig' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_import.h' line='179' column='1'/> + </data-member> + </class-decl> + <qualified-type-def type-id='type-id-1646' const='yes' id='type-id-1648'/> + <pointer-type-def type-id='type-id-1648' size-in-bits='64' id='type-id-1649'/> + <qualified-type-def type-id='type-id-1647' const='yes' id='type-id-1650'/> + <pointer-type-def type-id='type-id-1650' size-in-bits='64' id='type-id-1651'/> + <var-decl name='PyImport_FrozenModules' type-id='type-id-1649' mangled-name='PyImport_FrozenModules' visibility='default' filepath='./Include/cpython/import.h' line='25' column='1' elf-symbol-id='PyImport_FrozenModules'/> + <var-decl name='_PyImport_FrozenBootstrap' type-id='type-id-1649' mangled-name='_PyImport_FrozenBootstrap' visibility='default' filepath='./Include/internal/pycore_import.h' line='183' column='1' elf-symbol-id='_PyImport_FrozenBootstrap'/> + <var-decl name='_PyImport_FrozenStdlib' type-id='type-id-1649' mangled-name='_PyImport_FrozenStdlib' visibility='default' filepath='./Include/internal/pycore_import.h' line='184' column='1' elf-symbol-id='_PyImport_FrozenStdlib'/> + <var-decl name='_PyImport_FrozenTest' type-id='type-id-1649' mangled-name='_PyImport_FrozenTest' visibility='default' filepath='./Include/internal/pycore_import.h' line='185' column='1' elf-symbol-id='_PyImport_FrozenTest'/> + <var-decl name='_PyImport_FrozenAliases' type-id='type-id-1651' visibility='default' filepath='./Include/internal/pycore_import.h' line='187' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Python/frozenmain.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-268' size-in-bits='64' id='type-id-60'/> + <function-decl name='PyConfig_InitPythonConfig' mangled-name='PyConfig_InitPythonConfig' filepath='./Include/cpython/initconfig.h' line='239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitPythonConfig'> + <parameter type-id='type-id-60'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyConfig_Clear' mangled-name='PyConfig_Clear' filepath='./Include/cpython/initconfig.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Clear'> + <parameter type-id='type-id-60'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyConfig_SetBytesArgv' mangled-name='PyConfig_SetBytesArgv' filepath='./Include/cpython/initconfig.h' line='251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesArgv'> + <parameter type-id='type-id-60'/> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-127'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_InitializeFromConfig' mangled-name='Py_InitializeFromConfig' filepath='./Include/cpython/pylifecycle.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeFromConfig'> + <parameter type-id='type-id-270'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_ExitStatusException' mangled-name='Py_ExitStatusException' filepath='./Include/cpython/pylifecycle.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_ExitStatusException'> + <parameter type-id='type-id-61'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyRun_AnyFileExFlags' mangled-name='PyRun_AnyFileExFlags' filepath='./Include/cpython/pythonrun.h' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileExFlags'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_ImportFrozenModule' mangled-name='PyImport_ImportFrozenModule' filepath='./Include/import.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportFrozenModule'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRuntime_Initialize' filepath='./Include/internal/pycore_runtime.h' line='378' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_FinalizeEx' mangled-name='Py_FinalizeEx' filepath='./Include/pylifecycle.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FinalizeEx'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_GetVersion' mangled-name='Py_GetVersion' filepath='./Include/pylifecycle.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetVersion'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='Py_GetCopyright' mangled-name='Py_GetCopyright' filepath='./Include/pylifecycle.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetCopyright'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='exit' filepath='/usr/include/stdlib.h' line='624' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_FrozenMain' mangled-name='Py_FrozenMain' filepath='Python/frozenmain.c' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FrozenMain'> + <parameter type-id='type-id-5' name='argc' filepath='Python/frozenmain.c' line='21' column='1'/> + <parameter type-id='type-id-248' name='argv' filepath='Python/frozenmain.c' line='21' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/gc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='gcvisitobjects_t' type-id='type-id-336' filepath='./Include/cpython/objimpl.h' line='103' column='1' id='type-id-1652'/> + <pointer-type-def type-id='type-id-213' size-in-bits='64' id='type-id-174'/> + <function-decl name='PyTime_AsSecondsDouble' mangled-name='PyTime_AsSecondsDouble' filepath='./Include/cpython/pytime.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_AsSecondsDouble'> + <parameter type-id='type-id-213'/> + <return type-id='type-id-172'/> + </function-decl> + <function-decl name='PyTime_PerfCounterRaw' mangled-name='PyTime_PerfCounterRaw' filepath='./Include/cpython/pytime.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_PerfCounterRaw'> + <parameter type-id='type-id-174'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDict_MaybeUntrack' filepath='./Include/internal/pycore_dict.h' line='47' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_ClearAllFreeLists' filepath='./Include/internal/pycore_gc.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTuple_MaybeUntrack' filepath='./Include/internal/pycore_tuple.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyGC_Enable' mangled-name='PyGC_Enable' filepath='Python/gc.c' line='1599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Enable'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyGC_Disable' mangled-name='PyGC_Disable' filepath='Python/gc.c' line='1608' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Disable'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyGC_IsEnabled' mangled-name='PyGC_IsEnabled' filepath='Python/gc.c' line='1617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_IsEnabled'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyGC_Collect' mangled-name='PyGC_Collect' filepath='Python/gc.c' line='1625' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGC_Collect'> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='PyUnstable_Object_GC_NewWithExtraData' mangled-name='PyUnstable_Object_GC_NewWithExtraData' filepath='Python/gc.c' line='1896' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_Object_GC_NewWithExtraData'> + <parameter type-id='type-id-1' name='tp' filepath='Python/gc.c' line='1896' column='1'/> + <parameter type-id='type-id-21' name='extra_size' filepath='Python/gc.c' line='1896' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyObject_GC_IsTracked' mangled-name='PyObject_GC_IsTracked' filepath='Python/gc.c' line='1952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsTracked'> + <parameter type-id='type-id-4' name='obj' filepath='Python/gc.c' line='1952' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyObject_GC_IsFinalized' mangled-name='PyObject_GC_IsFinalized' filepath='Python/gc.c' line='1961' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyObject_GC_IsFinalized'> + <parameter type-id='type-id-4' name='obj' filepath='Python/gc.c' line='1961' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_GC_VisitObjects' mangled-name='PyUnstable_GC_VisitObjects' filepath='Python/gc.c' line='1970' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_GC_VisitObjects'> + <parameter type-id='type-id-1652' name='callback' filepath='Python/gc.c' line='1970' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Python/gc.c' line='1970' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/gc_gil.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyObject_ClearFreeLists' filepath='./Include/internal/pycore_freelist.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-399'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/getargs.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyThreadState_New' mangled-name='PyThreadState_New' filepath='./Include/pystate.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_New'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyArg_Parse' mangled-name='PyArg_Parse' filepath='Python/getargs.c' line='70' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_Parse'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='70' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='70' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_Parse_SizeT' mangled-name='_PyArg_Parse_SizeT' filepath='Python/getargs.c' line='82' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_Parse_SizeT'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='82' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='82' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_ParseTuple_SizeT' mangled-name='_PyArg_ParseTuple_SizeT' filepath='Python/getargs.c' line='107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTuple_SizeT'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='107' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='107' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_ParseStack' mangled-name='_PyArg_ParseStack' filepath='Python/getargs.c' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseStack'> + <parameter type-id='type-id-258' name='args' filepath='Python/getargs.c' line='120' column='1'/> + <parameter type-id='type-id-7' name='nargs' filepath='Python/getargs.c' line='120' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='120' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyArg_VaParse' mangled-name='PyArg_VaParse' filepath='Python/getargs.c' line='132' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParse'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='132' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='132' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/getargs.c' line='132' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_VaParse_SizeT' mangled-name='_PyArg_VaParse_SizeT' filepath='Python/getargs.c' line='145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParse_SizeT'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='145' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='145' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/getargs.c' line='145' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_ParseTupleAndKeywords_SizeT' mangled-name='_PyArg_ParseTupleAndKeywords_SizeT' filepath='Python/getargs.c' line='1274' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywords_SizeT'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='1274' column='1'/> + <parameter type-id='type-id-4' name='keywords' filepath='Python/getargs.c' line='1275' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='1276' column='1'/> + <parameter type-id='type-id-965' name='kwlist' filepath='Python/getargs.c' line='1277' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyArg_VaParseTupleAndKeywords' mangled-name='PyArg_VaParseTupleAndKeywords' filepath='Python/getargs.c' line='1300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyArg_VaParseTupleAndKeywords'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='1300' column='1'/> + <parameter type-id='type-id-4' name='keywords' filepath='Python/getargs.c' line='1301' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='1302' column='1'/> + <parameter type-id='type-id-965' name='kwlist' filepath='Python/getargs.c' line='1303' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/getargs.c' line='1303' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_VaParseTupleAndKeywords_SizeT' mangled-name='_PyArg_VaParseTupleAndKeywords_SizeT' filepath='Python/getargs.c' line='1325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_VaParseTupleAndKeywords_SizeT'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='1325' column='1'/> + <parameter type-id='type-id-4' name='keywords' filepath='Python/getargs.c' line='1326' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/getargs.c' line='1327' column='1'/> + <parameter type-id='type-id-965' name='kwlist' filepath='Python/getargs.c' line='1328' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/getargs.c' line='1328' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArg_ParseTupleAndKeywordsFast' mangled-name='_PyArg_ParseTupleAndKeywordsFast' filepath='Python/getargs.c' line='1351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyArg_ParseTupleAndKeywordsFast'> + <parameter type-id='type-id-4' name='args' filepath='Python/getargs.c' line='1351' column='1'/> + <parameter type-id='type-id-4' name='keywords' filepath='Python/getargs.c' line='1351' column='1'/> + <parameter type-id='type-id-272' name='parser' filepath='Python/getargs.c' line='1352' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/getcompiler.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='Py_GetCompiler' mangled-name='Py_GetCompiler' filepath='Python/getcompiler.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetCompiler'> + <return type-id='type-id-6'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/getopt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyOS_opterr' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='8' column='1'/> + <var-decl name='_PyOS_optind' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='9' column='1'/> + <var-decl name='_PyOS_optarg' type-id='type-id-18' visibility='default' filepath='./Include/internal/pycore_getopt.h' line='10' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Python/getversion.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-2' const='yes' id='type-id-1653'/> + <var-decl name='Py_Version' type-id='type-id-1653' mangled-name='Py_Version' visibility='default' filepath='./Include/pylifecycle.h' line='64' column='1' elf-symbol-id='Py_Version'/> + </abi-instr> + <abi-instr address-size='64' path='Python/hamt.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyHamt_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='23' column='1'/> + <var-decl name='_PyHamt_ArrayNode_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='24' column='1'/> + <var-decl name='_PyHamt_BitmapNode_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='25' column='1'/> + <var-decl name='_PyHamt_CollisionNode_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='26' column='1'/> + <var-decl name='_PyHamtKeys_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='27' column='1'/> + <var-decl name='_PyHamtValues_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='28' column='1'/> + <var-decl name='_PyHamtItems_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_hamt.h' line='29' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Python/hashtable.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='_Py_hashtable_foreach_func' type-id='type-id-1654' filepath='./Include/internal/pycore_hashtable.h' line='97' column='1' id='type-id-1655'/> + <pointer-type-def type-id='type-id-1656' size-in-bits='64' id='type-id-1654'/> + <function-decl name='_Py_hashtable_hash_ptr' mangled-name='_Py_hashtable_hash_ptr' filepath='Python/hashtable.c' line='93' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_hash_ptr'> + <parameter type-id='type-id-30' name='key' filepath='Python/hashtable.c' line='93' column='1'/> + <return type-id='type-id-1223'/> + </function-decl> + <function-decl name='_Py_hashtable_compare_direct' mangled-name='_Py_hashtable_compare_direct' filepath='Python/hashtable.c' line='100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_compare_direct'> + <parameter type-id='type-id-30' name='key1' filepath='Python/hashtable.c' line='100' column='1'/> + <parameter type-id='type-id-30' name='key2' filepath='Python/hashtable.c' line='100' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_hashtable_size' mangled-name='_Py_hashtable_size' filepath='Python/hashtable.c' line='121' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_size'> + <parameter type-id='type-id-541' name='ht' filepath='Python/hashtable.c' line='121' column='1'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='_Py_hashtable_steal' mangled-name='_Py_hashtable_steal' filepath='Python/hashtable.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_steal'> + <parameter type-id='type-id-546' name='ht' filepath='Python/hashtable.c' line='182' column='1'/> + <parameter type-id='type-id-30' name='key' filepath='Python/hashtable.c' line='182' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_Py_hashtable_foreach' mangled-name='_Py_hashtable_foreach' filepath='Python/hashtable.c' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_foreach'> + <parameter type-id='type-id-546' name='ht' filepath='Python/hashtable.c' line='268' column='1'/> + <parameter type-id='type-id-1655' name='func' filepath='Python/hashtable.c' line='269' column='1'/> + <parameter type-id='type-id-30' name='user_data' filepath='Python/hashtable.c' line='270' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_hashtable_new' mangled-name='_Py_hashtable_new' filepath='Python/hashtable.c' line='370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_new'> + <parameter type-id='type-id-543' name='hash_func' filepath='Python/hashtable.c' line='370' column='1'/> + <parameter type-id='type-id-544' name='compare_func' filepath='Python/hashtable.c' line='371' column='1'/> + <return type-id='type-id-546'/> + </function-decl> + <function-decl name='_Py_hashtable_clear' mangled-name='_Py_hashtable_clear' filepath='Python/hashtable.c' line='392' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_hashtable_clear'> + <parameter type-id='type-id-546' name='ht' filepath='Python/hashtable.c' line='392' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1656'> + <parameter type-id='type-id-546'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Python/import.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <enum-decl name='ext_module_kind' filepath='./Include/internal/pycore_importdl.h' line='18' column='1' id='type-id-1657'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_ext_module_kind_UNKNOWN' value='0'/> + <enumerator name='_Py_ext_module_kind_SINGLEPHASE' value='1'/> + <enumerator name='_Py_ext_module_kind_MULTIPHASE' value='2'/> + <enumerator name='_Py_ext_module_kind_INVALID' value='3'/> + </enum-decl> + <typedef-decl name='_Py_ext_module_kind' type-id='type-id-1657' filepath='./Include/internal/pycore_importdl.h' line='23' column='1' id='type-id-1658'/> + <enum-decl name='ext_module_origin' filepath='./Include/internal/pycore_importdl.h' line='25' column='1' id='type-id-1659'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_ext_module_origin_CORE' value='1'/> + <enumerator name='_Py_ext_module_origin_BUILTIN' value='2'/> + <enumerator name='_Py_ext_module_origin_DYNAMIC' value='3'/> + </enum-decl> + <typedef-decl name='_Py_ext_module_origin' type-id='type-id-1659' filepath='./Include/internal/pycore_importdl.h' line='29' column='1' id='type-id-1660'/> + <class-decl name='_Py_ext_module_loader_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='32' column='1' id='type-id-1661'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='filename' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='33' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='filename_encoded' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='35' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='name' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='37' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='name_encoded' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='path' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='41' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='origin' type-id='type-id-1660' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='42' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='hook_prefix' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='43' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='newcontext' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='44' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_ext_module_loader_result' size-in-bits='384' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='64' column='1' id='type-id-1662'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='def' type-id='type-id-387' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='65' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='module' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='66' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='kind' type-id='type-id-1658' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='67' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='err' type-id='type-id-1663' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='68' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='_err' type-id='type-id-1664' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='80' column='1'/> + </data-member> + </class-decl> + <class-decl name='_Py_ext_module_loader_result_error' size-in-bits='128' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='69' column='1' id='type-id-1664'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='kind' type-id='type-id-1665' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='78' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='exc' type-id='type-id-4' visibility='default' filepath='./Include/internal/pycore_importdl.h' line='79' column='1'/> + </data-member> + </class-decl> + <enum-decl name='_Py_ext_module_loader_result_error_kind' filepath='./Include/internal/pycore_importdl.h' line='70' column='1' id='type-id-1665'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_Py_ext_module_loader_result_EXCEPTION' value='0'/> + <enumerator name='_Py_ext_module_loader_result_ERR_MISSING' value='1'/> + <enumerator name='_Py_ext_module_loader_result_ERR_UNREPORTED_EXC' value='2'/> + <enumerator name='_Py_ext_module_loader_result_ERR_UNINITIALIZED' value='3'/> + <enumerator name='_Py_ext_module_loader_result_ERR_NONASCII_NOT_MULTIPHASE' value='4'/> + <enumerator name='_Py_ext_module_loader_result_ERR_NOT_MODULE' value='5'/> + <enumerator name='_Py_ext_module_loader_result_ERR_MISSING_DEF' value='6'/> + </enum-decl> + <typedef-decl name='PyModInitFunction' type-id='type-id-380' filepath='./Include/internal/pycore_importdl.h' line='89' column='1' id='type-id-1666'/> + <typedef-decl name='PyThread_ident_t' type-id='type-id-376' filepath='./Include/internal/pycore_pythread.h' line='119' column='1' id='type-id-1667'/> + <enum-decl name='_PyTime_round_t' naming-typedef-id='type-id-173' filepath='./Include/internal/pycore_time.h' line='67' column='1' id='type-id-1668'> + <underlying-type type-id='type-id-32'/> + <enumerator name='_PyTime_ROUND_FLOOR' value='0'/> + <enumerator name='_PyTime_ROUND_CEILING' value='1'/> + <enumerator name='_PyTime_ROUND_HALF_EVEN' value='2'/> + <enumerator name='_PyTime_ROUND_UP' value='3'/> + <enumerator name='_PyTime_ROUND_TIMEOUT' value='3'/> + </enum-decl> + <typedef-decl name='_PyTime_round_t' type-id='type-id-1668' filepath='./Include/internal/pycore_time.h' line='91' column='1' id='type-id-173'/> + <pointer-type-def type-id='type-id-1235' size-in-bits='64' id='type-id-1669'/> + <pointer-type-def type-id='type-id-1661' size-in-bits='64' id='type-id-1670'/> + <pointer-type-def type-id='type-id-1662' size-in-bits='64' id='type-id-1671'/> + <pointer-type-def type-id='type-id-1664' size-in-bits='64' id='type-id-1663'/> + <var-decl name='PyImport_Inittab' type-id='type-id-1232' mangled-name='PyImport_Inittab' visibility='default' filepath='./Include/cpython/import.h' line='12' column='1' elf-symbol-id='PyImport_Inittab'/> + <function-decl name='_Py_ext_module_loader_info_clear' filepath='./Include/internal/pycore_importdl.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1670'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_ext_module_loader_info_init_for_builtin' filepath='./Include/internal/pycore_importdl.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1670'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_ext_module_loader_info_init_from_spec' filepath='./Include/internal/pycore_importdl.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1670'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_ext_module_loader_result_clear' filepath='./Include/internal/pycore_importdl.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1671'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_ext_module_loader_result_apply_error' filepath='./Include/internal/pycore_importdl.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1671'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_GetModInitFunc' filepath='./Include/internal/pycore_importdl.h' line='90' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1670'/> + <parameter type-id='type-id-56'/> + <return type-id='type-id-1666'/> + </function-decl> + <function-decl name='_PyImport_RunModInitFunc' filepath='./Include/internal/pycore_importdl.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1666'/> + <parameter type-id='type-id-1670'/> + <parameter type-id='type-id-1671'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRecursiveMutex_IsLockedByCurrentThread' mangled-name='_PyRecursiveMutex_IsLockedByCurrentThread' filepath='./Include/internal/pycore_lock.h' line='161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_IsLockedByCurrentThread'> + <parameter type-id='type-id-1669'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRecursiveMutex_Lock' mangled-name='_PyRecursiveMutex_Lock' filepath='./Include/internal/pycore_lock.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Lock'> + <parameter type-id='type-id-1669'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRecursiveMutex_Unlock' mangled-name='_PyRecursiveMutex_Unlock' filepath='./Include/internal/pycore_lock.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRecursiveMutex_Unlock'> + <parameter type-id='type-id-1669'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_KeyedHash' filepath='./Include/internal/pycore_pyhash.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-108'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-108'/> + </function-decl> + <function-decl name='_PyMem_SetDefaultAllocator' filepath='./Include/internal/pycore_pymem.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-432'/> + <parameter type-id='type-id-502'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_get_thread_ident_ex' mangled-name='PyThread_get_thread_ident_ex' filepath='./Include/internal/pycore_pythread.h' line='125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_thread_ident_ex'> + <return type-id='type-id-1667'/> + </function-decl> + <function-decl name='_PySys_ClearAttrString' filepath='./Include/internal/pycore_sysmodule.h' line='29' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_AsMicroseconds' mangled-name='_PyTime_AsMicroseconds' filepath='./Include/internal/pycore_time.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMicroseconds'> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-173'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='PyMarshal_ReadObjectFromString' mangled-name='PyMarshal_ReadObjectFromString' filepath='./Include/marshal.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromString'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_Add' mangled-name='PyModule_Add' filepath='./Include/modsupport.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_Add'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_GetModuleDict' mangled-name='PyImport_GetModuleDict' filepath='Python/import.c' line='179' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetModuleDict'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_SetModule' mangled-name='_PyImport_SetModule' filepath='Python/import.c' line='186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_SetModule'> + <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='186' column='1'/> + <parameter type-id='type-id-4' name='m' filepath='Python/import.c' line='186' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_AddModuleRef' mangled-name='PyImport_AddModuleRef' filepath='Python/import.c' line='295' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AddModuleRef'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='295' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_AddModuleObject' mangled-name='PyImport_AddModuleObject' filepath='Python/import.c' line='309' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AddModuleObject'> + <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='309' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_AddModule' mangled-name='PyImport_AddModule' filepath='Python/import.c' line='346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AddModule'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='346' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyState_FindModule' mangled-name='PyState_FindModule' filepath='Python/import.c' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_FindModule'> + <parameter type-id='type-id-387' name='module' filepath='Python/import.c' line='491' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyState_AddModule' mangled-name='_PyState_AddModule' filepath='Python/import.c' line='506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyState_AddModule'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/import.c' line='506' column='1'/> + <parameter type-id='type-id-4' name='module' filepath='Python/import.c' line='506' column='1'/> + <parameter type-id='type-id-387' name='def' filepath='Python/import.c' line='506' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyState_AddModule' mangled-name='PyState_AddModule' filepath='Python/import.c' line='524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_AddModule'> + <parameter type-id='type-id-4' name='module' filepath='Python/import.c' line='524' column='1'/> + <parameter type-id='type-id-387' name='def' filepath='Python/import.c' line='524' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyState_RemoveModule' mangled-name='PyState_RemoveModule' filepath='Python/import.c' line='554' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyState_RemoveModule'> + <parameter type-id='type-id-387' name='def' filepath='Python/import.c' line='554' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_ClearExtension' mangled-name='_PyImport_ClearExtension' filepath='Python/import.c' line='827' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_ClearExtension'> + <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='827' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Python/import.c' line='827' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_ExtendInittab' mangled-name='PyImport_ExtendInittab' filepath='Python/import.c' line='2364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExtendInittab'> + <parameter type-id='type-id-1232' name='newtab' filepath='Python/import.c' line='2364' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_AppendInittab' mangled-name='PyImport_AppendInittab' filepath='Python/import.c' line='2414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_AppendInittab'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='2414' column='1'/> + <parameter type-id='type-id-380' name='initfunc' filepath='Python/import.c' line='2414' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_GetMagicNumber' mangled-name='PyImport_GetMagicNumber' filepath='Python/import.c' line='2491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicNumber'> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyImport_GetMagicTag' mangled-name='PyImport_GetMagicTag' filepath='Python/import.c' line='2513' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetMagicTag'> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='PyImport_ExecCodeModule' mangled-name='PyImport_ExecCodeModule' filepath='Python/import.c' line='2534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModule'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='2534' column='1'/> + <parameter type-id='type-id-4' name='co' filepath='Python/import.c' line='2534' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ExecCodeModuleEx' mangled-name='PyImport_ExecCodeModuleEx' filepath='Python/import.c' line='2541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleEx'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='2541' column='1'/> + <parameter type-id='type-id-4' name='co' filepath='Python/import.c' line='2541' column='1'/> + <parameter type-id='type-id-6' name='pathname' filepath='Python/import.c' line='2541' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ExecCodeModuleWithPathnames' mangled-name='PyImport_ExecCodeModuleWithPathnames' filepath='Python/import.c' line='2548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleWithPathnames'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='2548' column='1'/> + <parameter type-id='type-id-4' name='co' filepath='Python/import.c' line='2548' column='1'/> + <parameter type-id='type-id-6' name='pathname' filepath='Python/import.c' line='2549' column='1'/> + <parameter type-id='type-id-6' name='cpathname' filepath='Python/import.c' line='2550' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ExecCodeModuleObject' mangled-name='PyImport_ExecCodeModuleObject' filepath='Python/import.c' line='2650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ExecCodeModuleObject'> + <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='2650' column='1'/> + <parameter type-id='type-id-4' name='co' filepath='Python/import.c' line='2650' column='1'/> + <parameter type-id='type-id-4' name='pathname' filepath='Python/import.c' line='2650' column='1'/> + <parameter type-id='type-id-4' name='cpathname' filepath='Python/import.c' line='2651' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ImportFrozenModuleObject' mangled-name='PyImport_ImportFrozenModuleObject' filepath='Python/import.c' line='3019' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportFrozenModuleObject'> + <parameter type-id='type-id-4' name='name' filepath='Python/import.c' line='3019' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyImport_GetImporter' mangled-name='PyImport_GetImporter' filepath='Python/import.c' line='3339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_GetImporter'> + <parameter type-id='type-id-4' name='path' filepath='Python/import.c' line='3339' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ImportModuleNoBlock' mangled-name='PyImport_ImportModuleNoBlock' filepath='Python/import.c' line='3413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleNoBlock'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='3413' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ImportModuleLevel' mangled-name='PyImport_ImportModuleLevel' filepath='Python/import.c' line='3860' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ImportModuleLevel'> + <parameter type-id='type-id-6' name='name' filepath='Python/import.c' line='3860' column='1'/> + <parameter type-id='type-id-4' name='globals' filepath='Python/import.c' line='3860' column='1'/> + <parameter type-id='type-id-4' name='locals' filepath='Python/import.c' line='3860' column='1'/> + <parameter type-id='type-id-4' name='fromlist' filepath='Python/import.c' line='3861' column='1'/> + <parameter type-id='type-id-5' name='level' filepath='Python/import.c' line='3861' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyImport_ReloadModule' mangled-name='PyImport_ReloadModule' filepath='Python/import.c' line='3878' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyImport_ReloadModule'> + <parameter type-id='type-id-4' name='m' filepath='Python/import.c' line='3878' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_GetModuleAttr' mangled-name='_PyImport_GetModuleAttr' filepath='Python/import.c' line='4186' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyImport_GetModuleAttr'> + <parameter type-id='type-id-4' name='modname' filepath='Python/import.c' line='4186' column='1'/> + <parameter type-id='type-id-4' name='attrname' filepath='Python/import.c' line='4186' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyInit__imp' mangled-name='PyInit__imp' filepath='Python/import.c' line='4862' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInit__imp'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/initconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyArgv' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='69' column='1' id='type-id-244'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='argc' type-id='type-id-7' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='70' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='use_bytes_argv' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='71' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='bytes_argv' type-id='type-id-127' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='72' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='wchar_argv' type-id='type-id-1672' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='73' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyArgv' type-id='type-id-244' filepath='./Include/internal/pycore_initconfig.h' line='74' column='1' id='type-id-1673'/> + <class-decl name='_PyPreCmdline' size-in-bits='384' is-struct='yes' naming-typedef-id='type-id-1674' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='102' column='1' id='type-id-1675'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='argv' type-id='type-id-951' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='103' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='xoptions' type-id='type-id-951' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='104' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='isolated' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='105' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='use_environment' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='106' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='dev_mode' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='107' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='352'> + <var-decl name='warn_default_encoding' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_initconfig.h' line='108' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyPreCmdline' type-id='type-id-1675' filepath='./Include/internal/pycore_initconfig.h' line='109' column='1' id='type-id-1674'/> + <pointer-type-def type-id='type-id-954' size-in-bits='64' id='type-id-1676'/> + <pointer-type-def type-id='type-id-951' size-in-bits='64' id='type-id-1677'/> + <pointer-type-def type-id='type-id-1674' size-in-bits='64' id='type-id-1678'/> + <qualified-type-def type-id='type-id-954' const='yes' id='type-id-1679'/> + <pointer-type-def type-id='type-id-1679' size-in-bits='64' id='type-id-247'/> + <qualified-type-def type-id='type-id-951' const='yes' id='type-id-1680'/> + <pointer-type-def type-id='type-id-1680' size-in-bits='64' id='type-id-237'/> + <qualified-type-def type-id='type-id-1673' const='yes' id='type-id-1681'/> + <pointer-type-def type-id='type-id-1681' size-in-bits='64' id='type-id-1682'/> + <qualified-type-def type-id='type-id-1674' const='yes' id='type-id-1683'/> + <pointer-type-def type-id='type-id-1683' size-in-bits='64' id='type-id-1684'/> + <qualified-type-def type-id='type-id-18' restrict='yes' id='type-id-20'/> + <qualified-type-def type-id='type-id-58' const='yes' id='type-id-1685'/> + <pointer-type-def type-id='type-id-1685' size-in-bits='64' id='type-id-1672'/> + <qualified-type-def type-id='type-id-58' restrict='yes' id='type-id-19'/> + <qualified-type-def type-id='type-id-241' restrict='yes' id='type-id-1686'/> + <pointer-type-def type-id='type-id-241' size-in-bits='64' id='type-id-1687'/> + <var-decl name='Py_DebugFlag' type-id='type-id-5' mangled-name='Py_DebugFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='8' column='1' elf-symbol-id='Py_DebugFlag'/> + <var-decl name='Py_VerboseFlag' type-id='type-id-5' mangled-name='Py_VerboseFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='9' column='1' elf-symbol-id='Py_VerboseFlag'/> + <var-decl name='Py_QuietFlag' type-id='type-id-5' mangled-name='Py_QuietFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='10' column='1' elf-symbol-id='Py_QuietFlag'/> + <var-decl name='Py_InteractiveFlag' type-id='type-id-5' mangled-name='Py_InteractiveFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='11' column='1' elf-symbol-id='Py_InteractiveFlag'/> + <var-decl name='Py_InspectFlag' type-id='type-id-5' mangled-name='Py_InspectFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='12' column='1' elf-symbol-id='Py_InspectFlag'/> + <var-decl name='Py_OptimizeFlag' type-id='type-id-5' mangled-name='Py_OptimizeFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='13' column='1' elf-symbol-id='Py_OptimizeFlag'/> + <var-decl name='Py_NoSiteFlag' type-id='type-id-5' mangled-name='Py_NoSiteFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='14' column='1' elf-symbol-id='Py_NoSiteFlag'/> + <var-decl name='Py_BytesWarningFlag' type-id='type-id-5' mangled-name='Py_BytesWarningFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='15' column='1' elf-symbol-id='Py_BytesWarningFlag'/> + <var-decl name='Py_FrozenFlag' type-id='type-id-5' mangled-name='Py_FrozenFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='16' column='1' elf-symbol-id='Py_FrozenFlag'/> + <var-decl name='Py_IgnoreEnvironmentFlag' type-id='type-id-5' mangled-name='Py_IgnoreEnvironmentFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='17' column='1' elf-symbol-id='Py_IgnoreEnvironmentFlag'/> + <var-decl name='Py_DontWriteBytecodeFlag' type-id='type-id-5' mangled-name='Py_DontWriteBytecodeFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='18' column='1' elf-symbol-id='Py_DontWriteBytecodeFlag'/> + <var-decl name='Py_NoUserSiteDirectory' type-id='type-id-5' mangled-name='Py_NoUserSiteDirectory' visibility='default' filepath='./Include/cpython/pydebug.h' line='19' column='1' elf-symbol-id='Py_NoUserSiteDirectory'/> + <var-decl name='Py_UnbufferedStdioFlag' type-id='type-id-5' mangled-name='Py_UnbufferedStdioFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='20' column='1' elf-symbol-id='Py_UnbufferedStdioFlag'/> + <var-decl name='Py_HashRandomizationFlag' type-id='type-id-5' mangled-name='Py_HashRandomizationFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='21' column='1' elf-symbol-id='Py_HashRandomizationFlag'/> + <var-decl name='Py_IsolatedFlag' type-id='type-id-5' mangled-name='Py_IsolatedFlag' visibility='default' filepath='./Include/cpython/pydebug.h' line='22' column='1' elf-symbol-id='Py_IsolatedFlag'/> + <var-decl name='Py_UTF8Mode' type-id='type-id-5' mangled-name='Py_UTF8Mode' visibility='default' filepath='./Include/fileobject.h' line='29' column='1' elf-symbol-id='Py_UTF8Mode'/> + <function-decl name='Py_DecodeLocale' mangled-name='Py_DecodeLocale' filepath='./Include/fileutils.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_DecodeLocale'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-57'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_GetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_GetLocaleEncoding' filepath='./Include/internal/pycore_fileutils.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_Py_isabs' filepath='./Include/internal/pycore_fileutils.h' line='267' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_abspath' filepath='./Include/internal/pycore_fileutils.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-241'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyOS_ResetGetOpt' filepath='./Include/internal/pycore_getopt.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyOS_GetOpt' filepath='./Include/internal/pycore_getopt.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-7'/> + <parameter type-id='type-id-1672'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyArgv_AsWstrList' filepath='./Include/internal/pycore_initconfig.h' line='76' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1682'/> + <parameter type-id='type-id-1677'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_str_to_int' filepath='./Include/internal/pycore_initconfig.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-177'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_get_xoption' filepath='./Include/internal/pycore_initconfig.h' line='85' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-237'/> + <parameter type-id='type-id-18'/> + <return type-id='type-id-18'/> + </function-decl> + <function-decl name='_Py_GetEnv' filepath='./Include/internal/pycore_initconfig.h' line='88' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_Py_get_env_flag' filepath='./Include/internal/pycore_initconfig.h' line='91' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPreCmdline_Clear' filepath='./Include/internal/pycore_initconfig.h' line='118' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1678'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPreCmdline_SetConfig' filepath='./Include/internal/pycore_initconfig.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1684'/> + <parameter type-id='type-id-60'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPreCmdline_Read' filepath='./Include/internal/pycore_initconfig.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1678'/> + <parameter type-id='type-id-247'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPreConfig_InitFromPreConfig' filepath='./Include/internal/pycore_initconfig.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1676'/> + <parameter type-id='type-id-247'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPreConfig_AsDict' filepath='./Include/internal/pycore_initconfig.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-247'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyPreConfig_GetConfig' filepath='./Include/internal/pycore_initconfig.h' line='140' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1676'/> + <parameter type-id='type-id-270'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyConfig_InitPathConfig' filepath='./Include/internal/pycore_initconfig.h' line='174' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_IsLocaleCoercionTarget' filepath='./Include/internal/pycore_pylifecycle.h' line='26' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySys_ReadPreinitWarnOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1677'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PySys_ReadPreinitXOptions' filepath='./Include/internal/pycore_pylifecycle.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_PreInitializeFromConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='72' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-270'/> + <parameter type-id='type-id-1682'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyMem_RawStrdup' filepath='./Include/internal/pycore_pymem.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='setlocale' filepath='/usr/include/locale.h' line='122' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='setvbuf' filepath='/usr/include/stdio.h' line='332' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-402'/> + <parameter type-id='type-id-181'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='printf' filepath='/usr/include/stdio.h' line='356' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='putchar' filepath='/usr/include/stdio.h' line='556' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='puts' filepath='/usr/include/stdio.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='strtoul' filepath='/usr/include/stdlib.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-182'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='wcschr' filepath='/usr/include/wchar.h' line='165' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-388'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-1686'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='429' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-1686'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyStatus_Exit' mangled-name='PyStatus_Exit' filepath='Python/initconfig.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_Exit'> + <parameter type-id='type-id-5' name='exitcode' filepath='Python/initconfig.c' line='437' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyStatus_IsError' mangled-name='PyStatus_IsError' filepath='Python/initconfig.c' line='441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsError'> + <parameter type-id='type-id-61' name='status' filepath='Python/initconfig.c' line='441' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyStatus_IsExit' mangled-name='PyStatus_IsExit' filepath='Python/initconfig.c' line='444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyStatus_IsExit'> + <parameter type-id='type-id-61' name='status' filepath='Python/initconfig.c' line='444' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyWideStringList_Insert' mangled-name='PyWideStringList_Insert' filepath='Python/initconfig.c' line='548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Insert'> + <parameter type-id='type-id-1677' name='list' filepath='Python/initconfig.c' line='548' column='1'/> + <parameter type-id='type-id-7' name='index' filepath='Python/initconfig.c' line='549' column='1'/> + <parameter type-id='type-id-18' name='item' filepath='Python/initconfig.c' line='549' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyWideStringList_Append' mangled-name='PyWideStringList_Append' filepath='Python/initconfig.c' line='589' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyWideStringList_Append'> + <parameter type-id='type-id-1677' name='list' filepath='Python/initconfig.c' line='589' column='1'/> + <parameter type-id='type-id-18' name='item' filepath='Python/initconfig.c' line='589' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_GetArgcArgv' mangled-name='Py_GetArgcArgv' filepath='Python/initconfig.c' line='676' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetArgcArgv'> + <parameter type-id='type-id-177' name='argc' filepath='Python/initconfig.c' line='676' column='1'/> + <parameter type-id='type-id-1687' name='argv' filepath='Python/initconfig.c' line='676' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyConfig_InitCompatConfig' mangled-name='_PyConfig_InitCompatConfig' filepath='Python/initconfig.c' line='804' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_InitCompatConfig'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='804' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyConfig_InitIsolatedConfig' mangled-name='PyConfig_InitIsolatedConfig' filepath='Python/initconfig.c' line='892' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_InitIsolatedConfig'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='892' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyConfig_SetString' mangled-name='PyConfig_SetString' filepath='Python/initconfig.c' line='917' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetString'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='917' column='1'/> + <parameter type-id='type-id-241' name='config_str' filepath='Python/initconfig.c' line='917' column='1'/> + <parameter type-id='type-id-18' name='str' filepath='Python/initconfig.c' line='917' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyConfig_SetBytesString' mangled-name='PyConfig_SetBytesString' filepath='Python/initconfig.c' line='979' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetBytesString'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='979' column='1'/> + <parameter type-id='type-id-241' name='config_str' filepath='Python/initconfig.c' line='979' column='1'/> + <parameter type-id='type-id-6' name='str' filepath='Python/initconfig.c' line='980' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyConfig_AsDict' mangled-name='_PyConfig_AsDict' filepath='Python/initconfig.c' line='1036' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_AsDict'> + <parameter type-id='type-id-270' name='config' filepath='Python/initconfig.c' line='1036' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyConfig_FromDict' mangled-name='_PyConfig_FromDict' filepath='Python/initconfig.c' line='1250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyConfig_FromDict'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='1250' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Python/initconfig.c' line='1250' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyConfig_SetArgv' mangled-name='PyConfig_SetArgv' filepath='Python/initconfig.c' line='2999' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetArgv'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='2999' column='1'/> + <parameter type-id='type-id-7' name='argc' filepath='Python/initconfig.c' line='2999' column='1'/> + <parameter type-id='type-id-1672' name='argv' filepath='Python/initconfig.c' line='2999' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyConfig_SetWideStringList' mangled-name='PyConfig_SetWideStringList' filepath='Python/initconfig.c' line='3011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_SetWideStringList'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='3011' column='1'/> + <parameter type-id='type-id-1677' name='list' filepath='Python/initconfig.c' line='3011' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Python/initconfig.c' line='3012' column='1'/> + <parameter type-id='type-id-241' name='items' filepath='Python/initconfig.c' line='3012' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='PyConfig_Read' mangled-name='PyConfig_Read' filepath='Python/initconfig.c' line='3095' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyConfig_Read'> + <parameter type-id='type-id-60' name='config' filepath='Python/initconfig.c' line='3095' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_GetConfigsAsDict' mangled-name='_Py_GetConfigsAsDict' filepath='Python/initconfig.c' line='3102' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_GetConfigsAsDict'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/instruction_sequence.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_PyInstructionSequence_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_instruction_sequence.h' line='67' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Python/instrumentation.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyMonitoringState' size-in-bits='16' is-struct='yes' visibility='default' filepath='./Include/cpython/monitoring.h' line='37' column='1' id='type-id-1688'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='active' type-id='type-id-305' visibility='default' filepath='./Include/cpython/monitoring.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='8'> + <var-decl name='opaque' type-id='type-id-305' visibility='default' filepath='./Include/cpython/monitoring.h' line='39' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyMonitoringState' type-id='type-id-1688' filepath='./Include/cpython/monitoring.h' line='40' column='1' id='type-id-1689'/> + <pointer-type-def type-id='type-id-1689' size-in-bits='64' id='type-id-1690'/> + <pointer-type-def type-id='type-id-108' size-in-bits='64' id='type-id-1691'/> + <var-decl name='_PyInstrumentation_MISSING' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='69' column='1'/> + <var-decl name='_PyInstrumentation_DISABLE' type-id='type-id-356' visibility='default' filepath='./Include/internal/pycore_instruments.h' line='70' column='1'/> + <function-decl name='_PyEval_StopTheWorld' filepath='./Include/internal/pycore_pystate.h' line='181' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_StartTheWorld' filepath='./Include/internal/pycore_pystate.h' line='182' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMonitoring_EnterScope' mangled-name='PyMonitoring_EnterScope' filepath='Python/instrumentation.c' line='2488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMonitoring_EnterScope'> + <parameter type-id='type-id-1690' name='state_array' filepath='Python/instrumentation.c' line='2488' column='1'/> + <parameter type-id='type-id-1691' name='version' filepath='Python/instrumentation.c' line='2488' column='1'/> + <parameter type-id='type-id-316' name='event_types' filepath='Python/instrumentation.c' line='2489' column='1'/> + <parameter type-id='type-id-7' name='length' filepath='Python/instrumentation.c' line='2489' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMonitoring_ExitScope' mangled-name='PyMonitoring_ExitScope' filepath='Python/instrumentation.c' line='2506' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMonitoring_ExitScope'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyStartEvent' mangled-name='_PyMonitoring_FirePyStartEvent' filepath='Python/instrumentation.c' line='2512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyStartEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2512' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2512' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2512' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyResumeEvent' mangled-name='_PyMonitoring_FirePyResumeEvent' filepath='Python/instrumentation.c' line='2521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyResumeEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2521' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2521' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2521' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyReturnEvent' mangled-name='_PyMonitoring_FirePyReturnEvent' filepath='Python/instrumentation.c' line='2532' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyReturnEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2532' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2532' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2532' column='1'/> + <parameter type-id='type-id-4' name='retval' filepath='Python/instrumentation.c' line='2533' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyYieldEvent' mangled-name='_PyMonitoring_FirePyYieldEvent' filepath='Python/instrumentation.c' line='2542' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyYieldEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2542' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2542' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2542' column='1'/> + <parameter type-id='type-id-4' name='retval' filepath='Python/instrumentation.c' line='2543' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireCallEvent' mangled-name='_PyMonitoring_FireCallEvent' filepath='Python/instrumentation.c' line='2552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCallEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2552' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2552' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2552' column='1'/> + <parameter type-id='type-id-4' name='callable' filepath='Python/instrumentation.c' line='2553' column='1'/> + <parameter type-id='type-id-4' name='arg0' filepath='Python/instrumentation.c' line='2553' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireLineEvent' mangled-name='_PyMonitoring_FireLineEvent' filepath='Python/instrumentation.c' line='2562' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireLineEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2562' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2562' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2562' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/instrumentation.c' line='2563' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireJumpEvent' mangled-name='_PyMonitoring_FireJumpEvent' filepath='Python/instrumentation.c' line='2578' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireJumpEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2578' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2578' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2578' column='1'/> + <parameter type-id='type-id-4' name='target_offset' filepath='Python/instrumentation.c' line='2579' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireBranchEvent' mangled-name='_PyMonitoring_FireBranchEvent' filepath='Python/instrumentation.c' line='2588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireBranchEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2588' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2588' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2588' column='1'/> + <parameter type-id='type-id-4' name='target_offset' filepath='Python/instrumentation.c' line='2589' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireCReturnEvent' mangled-name='_PyMonitoring_FireCReturnEvent' filepath='Python/instrumentation.c' line='2598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCReturnEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2598' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2598' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2598' column='1'/> + <parameter type-id='type-id-4' name='retval' filepath='Python/instrumentation.c' line='2599' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyThrowEvent' mangled-name='_PyMonitoring_FirePyThrowEvent' filepath='Python/instrumentation.c' line='2633' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyThrowEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2633' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2633' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2633' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireRaiseEvent' mangled-name='_PyMonitoring_FireRaiseEvent' filepath='Python/instrumentation.c' line='2647' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireRaiseEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2647' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2647' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2647' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireCRaiseEvent' mangled-name='_PyMonitoring_FireCRaiseEvent' filepath='Python/instrumentation.c' line='2661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireCRaiseEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2661' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2661' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2661' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireReraiseEvent' mangled-name='_PyMonitoring_FireReraiseEvent' filepath='Python/instrumentation.c' line='2675' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireReraiseEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2675' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2675' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2675' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireExceptionHandledEvent' mangled-name='_PyMonitoring_FireExceptionHandledEvent' filepath='Python/instrumentation.c' line='2689' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireExceptionHandledEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2689' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2689' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2689' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FirePyUnwindEvent' mangled-name='_PyMonitoring_FirePyUnwindEvent' filepath='Python/instrumentation.c' line='2703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FirePyUnwindEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2703' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2703' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2703' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_FireStopIterationEvent' mangled-name='_PyMonitoring_FireStopIterationEvent' filepath='Python/instrumentation.c' line='2717' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyMonitoring_FireStopIterationEvent'> + <parameter type-id='type-id-1690' name='state' filepath='Python/instrumentation.c' line='2717' column='1'/> + <parameter type-id='type-id-4' name='codelike' filepath='Python/instrumentation.c' line='2717' column='1'/> + <parameter type-id='type-id-1109' name='offset' filepath='Python/instrumentation.c' line='2717' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Python/instrumentation.c' line='2717' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/interpconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyInterpreterConfig_AsDict' mangled-name='_PyInterpreterConfig_AsDict' filepath='Python/interpconfig.c' line='54' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_AsDict'> + <parameter type-id='type-id-1625' name='config' filepath='Python/interpconfig.c' line='54' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyInterpreterConfig_InitFromDict' mangled-name='_PyInterpreterConfig_InitFromDict' filepath='Python/interpconfig.c' line='223' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_InitFromDict'> + <parameter type-id='type-id-1625' name='config' filepath='Python/interpconfig.c' line='223' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Python/interpconfig.c' line='223' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterConfig_UpdateFromDict' mangled-name='_PyInterpreterConfig_UpdateFromDict' filepath='Python/interpconfig.c' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_UpdateFromDict'> + <parameter type-id='type-id-1625' name='config' filepath='Python/interpconfig.c' line='236' column='1'/> + <parameter type-id='type-id-4' name='dict' filepath='Python/interpconfig.c' line='236' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterConfig_InitFromState' mangled-name='_PyInterpreterConfig_InitFromState' filepath='Python/interpconfig.c' line='249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterConfig_InitFromState'> + <parameter type-id='type-id-1625' name='config' filepath='Python/interpconfig.c' line='249' column='1'/> + <parameter type-id='type-id-28' name='interp' filepath='Python/interpconfig.c' line='250' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/intrinsics.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-1692' size-in-bits='1536' id='type-id-1693'> + <subrange length='12' type-id='type-id-2' id='type-id-864'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1692' size-in-bits='infinite' id='type-id-1694'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1695' size-in-bits='768' id='type-id-1696'> + <subrange length='6' type-id='type-id-2' id='type-id-391'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1695' size-in-bits='infinite' id='type-id-1697'> + <subrange length='infinite' id='type-id-231'/> + </array-type-def> + <typedef-decl name='intrinsic_func1' type-id='type-id-1698' filepath='./Include/internal/pycore_intrinsics.h' line='35' column='1' id='type-id-1699'/> + <typedef-decl name='intrinsic_func2' type-id='type-id-1700' filepath='./Include/internal/pycore_intrinsics.h' line='36' column='1' id='type-id-1701'/> + <class-decl name='intrinsic_func1_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1702' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='38' column='1' id='type-id-1703'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-1699' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='40' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='intrinsic_func1_info' type-id='type-id-1703' filepath='./Include/internal/pycore_intrinsics.h' line='41' column='1' id='type-id-1702'/> + <class-decl name='intrinsic_func2_info' size-in-bits='128' is-struct='yes' naming-typedef-id='type-id-1704' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='43' column='1' id='type-id-1705'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='func' type-id='type-id-1701' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='45' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='intrinsic_func2_info' type-id='type-id-1705' filepath='./Include/internal/pycore_intrinsics.h' line='46' column='1' id='type-id-1704'/> + <pointer-type-def type-id='type-id-1706' size-in-bits='64' id='type-id-1698'/> + <pointer-type-def type-id='type-id-1707' size-in-bits='64' id='type-id-1700'/> + <qualified-type-def type-id='type-id-1702' const='yes' id='type-id-1692'/> + <qualified-type-def type-id='type-id-1704' const='yes' id='type-id-1695'/> + <function-decl name='_Py_set_function_type_params' filepath='./Include/internal/pycore_function.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyAsyncGenValueWrapperNew' filepath='./Include/internal/pycore_genobject.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <var-decl name='_PyIntrinsics_UnaryFunctions' type-id='type-id-1694' mangled-name='_PyIntrinsics_UnaryFunctions' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='48' column='1' elf-symbol-id='_PyIntrinsics_UnaryFunctions'/> + <var-decl name='_PyIntrinsics_BinaryFunctions' type-id='type-id-1697' mangled-name='_PyIntrinsics_BinaryFunctions' visibility='default' filepath='./Include/internal/pycore_intrinsics.h' line='49' column='1' elf-symbol-id='_PyIntrinsics_BinaryFunctions'/> + <function-decl name='_PyExc_PrepReraiseStar' filepath='./Include/internal/pycore_pyerrors.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_make_typevar' filepath='./Include/internal/pycore_typevarobject.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_make_paramspec' filepath='./Include/internal/pycore_typevarobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_make_typevartuple' filepath='./Include/internal/pycore_typevarobject.h' line='13' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_make_typealias' filepath='./Include/internal/pycore_typevarobject.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_subscript_generic' filepath='./Include/internal/pycore_typevarobject.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_set_typeparam_default' filepath='./Include/internal/pycore_typevarobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCompile_GetUnaryIntrinsicName' mangled-name='_PyCompile_GetUnaryIntrinsicName' filepath='Python/intrinsics.c' line='271' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_GetUnaryIntrinsicName'> + <parameter type-id='type-id-5' name='index' filepath='Python/intrinsics.c' line='271' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyCompile_GetBinaryIntrinsicName' mangled-name='_PyCompile_GetBinaryIntrinsicName' filepath='Python/intrinsics.c' line='280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyCompile_GetBinaryIntrinsicName'> + <parameter type-id='type-id-5' name='index' filepath='Python/intrinsics.c' line='280' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1706'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + <function-type size-in-bits='64' id='type-id-1707'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Python/legacy_tracing.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <typedef-decl name='_PyMonitoringEventSet' type-id='type-id-326' filepath='./Include/internal/pycore_instruments.h' line='16' column='1' id='type-id-1708'/> + <pointer-type-def type-id='type-id-1708' size-in-bits='64' id='type-id-1709'/> + <function-decl name='_PyMonitoring_RegisterCallback' filepath='./Include/internal/pycore_instruments.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyMonitoring_SetEvents' filepath='./Include/internal/pycore_instruments.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1708'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_SetLocalEvents' filepath='./Include/internal/pycore_instruments.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1708'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMonitoring_GetLocalEvents' filepath='./Include/internal/pycore_instruments.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1709'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_Instrumentation_GetLine' filepath='./Include/internal/pycore_instruments.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-325'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/lock.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='256' id='type-id-1710'> + <subrange length='32' type-id='type-id-2' id='type-id-67'/> + </array-type-def> + <class-decl name='_PySeqLock' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-1711' visibility='default' filepath='./Include/internal/pycore_lock.h' line='213' column='1' id='type-id-1712'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='sequence' type-id='type-id-326' visibility='default' filepath='./Include/internal/pycore_lock.h' line='214' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PySeqLock' type-id='type-id-1712' filepath='./Include/internal/pycore_lock.h' line='215' column='1' id='type-id-1711'/> + <typedef-decl name='_Py_unpark_fn_t' type-id='type-id-1713' filepath='./Include/internal/pycore_parking_lot.h' line='74' column='1' id='type-id-1714'/> + <class-decl name='_PySemaphore' size-in-bits='256' is-struct='yes' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='34' column='1' id='type-id-1715'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='platform_sem' type-id='type-id-1716' visibility='default' filepath='./Include/internal/pycore_semaphore.h' line='38' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PySemaphore' type-id='type-id-1715' filepath='./Include/internal/pycore_semaphore.h' line='44' column='1' id='type-id-1717'/> + <union-decl name='sem_t' size-in-bits='256' naming-typedef-id='type-id-1716' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='35' column='1' id='type-id-1718'> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-1710' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='37' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='38' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='sem_t' type-id='type-id-1718' filepath='/usr/include/x86_64-linux-gnu/bits/semaphore.h' line='39' column='1' id='type-id-1716'/> + <pointer-type-def type-id='type-id-1239' size-in-bits='64' id='type-id-1719'/> + <pointer-type-def type-id='type-id-1259' size-in-bits='64' id='type-id-1720'/> + <pointer-type-def type-id='type-id-1717' size-in-bits='64' id='type-id-1721'/> + <pointer-type-def type-id='type-id-1711' size-in-bits='64' id='type-id-1722'/> + <pointer-type-def type-id='type-id-1714' size-in-bits='64' id='type-id-1723'/> + <function-decl name='PyTime_MonotonicRaw' mangled-name='PyTime_MonotonicRaw' filepath='./Include/cpython/pytime.h' line='19' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_MonotonicRaw'> + <parameter type-id='type-id-174'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyParkingLot_Park' mangled-name='_PyParkingLot_Park' filepath='./Include/internal/pycore_parking_lot.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyParkingLot_Park'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyParkingLot_Unpark' mangled-name='_PyParkingLot_Unpark' filepath='./Include/internal/pycore_parking_lot.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyParkingLot_Unpark'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-1723'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyParkingLot_UnparkAll' mangled-name='_PyParkingLot_UnparkAll' filepath='./Include/internal/pycore_parking_lot.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyParkingLot_UnparkAll'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySemaphore_Wait' mangled-name='_PySemaphore_Wait' filepath='./Include/internal/pycore_semaphore.h' line='50' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Wait'> + <parameter type-id='type-id-1721'/> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySemaphore_Wakeup' mangled-name='_PySemaphore_Wakeup' filepath='./Include/internal/pycore_semaphore.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Wakeup'> + <parameter type-id='type-id-1721'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySemaphore_Init' mangled-name='_PySemaphore_Init' filepath='./Include/internal/pycore_semaphore.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Init'> + <parameter type-id='type-id-1721'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySemaphore_Destroy' mangled-name='_PySemaphore_Destroy' filepath='./Include/internal/pycore_semaphore.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySemaphore_Destroy'> + <parameter type-id='type-id-1721'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTime_Add' filepath='./Include/internal/pycore_time.h' line='242' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-213'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='_PyDeadline_Get' mangled-name='_PyDeadline_Get' filepath='./Include/internal/pycore_time.h' line='305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Get'> + <parameter type-id='type-id-213'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='sched_yield' filepath='/usr/include/sched.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEvent_IsSet' mangled-name='_PyEvent_IsSet' filepath='Python/lock.c' line='243' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvent_IsSet'> + <parameter type-id='type-id-1719' name='evt' filepath='Python/lock.c' line='243' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyEvent_Notify' mangled-name='_PyEvent_Notify' filepath='Python/lock.c' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyEvent_Notify'> + <parameter type-id='type-id-1719' name='evt' filepath='Python/lock.c' line='250' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEvent_Wait' mangled-name='PyEvent_Wait' filepath='Python/lock.c' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEvent_Wait'> + <parameter type-id='type-id-1719' name='evt' filepath='Python/lock.c' line='268' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyEvent_WaitTimed' mangled-name='PyEvent_WaitTimed' filepath='Python/lock.c' line='275' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyEvent_WaitTimed'> + <parameter type-id='type-id-1719' name='evt' filepath='Python/lock.c' line='275' column='1'/> + <parameter type-id='type-id-213' name='timeout_ns' filepath='Python/lock.c' line='275' column='1'/> + <parameter type-id='type-id-5' name='detach' filepath='Python/lock.c' line='275' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyRWMutex_RLock' mangled-name='_PyRWMutex_RLock' filepath='Python/lock.c' line='426' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_RLock'> + <parameter type-id='type-id-1720' name='rwmutex' filepath='Python/lock.c' line='426' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRWMutex_RUnlock' mangled-name='_PyRWMutex_RUnlock' filepath='Python/lock.c' line='457' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_RUnlock'> + <parameter type-id='type-id-1720' name='rwmutex' filepath='Python/lock.c' line='457' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRWMutex_Lock' mangled-name='_PyRWMutex_Lock' filepath='Python/lock.c' line='470' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_Lock'> + <parameter type-id='type-id-1720' name='rwmutex' filepath='Python/lock.c' line='470' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRWMutex_Unlock' mangled-name='_PyRWMutex_Unlock' filepath='Python/lock.c' line='491' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyRWMutex_Unlock'> + <parameter type-id='type-id-1720' name='rwmutex' filepath='Python/lock.c' line='491' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySeqLock_LockWrite' mangled-name='_PySeqLock_LockWrite' filepath='Python/lock.c' line='505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_LockWrite'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='505' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySeqLock_AbandonWrite' mangled-name='_PySeqLock_AbandonWrite' filepath='Python/lock.c' line='526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_AbandonWrite'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='526' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySeqLock_UnlockWrite' mangled-name='_PySeqLock_UnlockWrite' filepath='Python/lock.c' line='533' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_UnlockWrite'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='533' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySeqLock_BeginRead' mangled-name='_PySeqLock_BeginRead' filepath='Python/lock.c' line='540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_BeginRead'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='540' column='1'/> + <return type-id='type-id-326'/> + </function-decl> + <function-decl name='_PySeqLock_EndRead' mangled-name='_PySeqLock_EndRead' filepath='Python/lock.c' line='551' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_EndRead'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='551' column='1'/> + <parameter type-id='type-id-326' name='previous' filepath='Python/lock.c' line='551' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySeqLock_AfterFork' mangled-name='_PySeqLock_AfterFork' filepath='Python/lock.c' line='566' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PySeqLock_AfterFork'> + <parameter type-id='type-id-1722' name='seqlock' filepath='Python/lock.c' line='566' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1713'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Python/marshal.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-484' size-in-bits='192' id='type-id-1724'> + <subrange length='3' type-id='type-id-2' id='type-id-834'/> + </array-type-def> + <class-decl name='stat' size-in-bits='1152' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='26' column='1' id='type-id-1725'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='st_dev' type-id='type-id-186' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='31' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='st_ino' type-id='type-id-1726' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='36' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='st_nlink' type-id='type-id-1727' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='44' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='st_mode' type-id='type-id-114' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='45' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='st_uid' type-id='type-id-116' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='47' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='st_gid' type-id='type-id-112' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='48' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='288'> + <var-decl name='__pad0' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='st_rdev' type-id='type-id-186' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='52' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='st_size' type-id='type-id-1427' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='57' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='448'> + <var-decl name='st_blksize' type-id='type-id-1728' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='61' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='512'> + <var-decl name='st_blocks' type-id='type-id-1729' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='63' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='576'> + <var-decl name='st_atim' type-id='type-id-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='74' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='704'> + <var-decl name='st_mtim' type-id='type-id-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='75' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='832'> + <var-decl name='st_ctim' type-id='type-id-107' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='76' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='960'> + <var-decl name='__glibc_reserved' type-id='type-id-1724' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/struct_stat.h' line='89' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='__gid_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='147' column='1' id='type-id-112'/> + <typedef-decl name='__ino_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='148' column='1' id='type-id-1726'/> + <typedef-decl name='__mode_t' type-id='type-id-101' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='150' column='1' id='type-id-114'/> + <typedef-decl name='__nlink_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='151' column='1' id='type-id-1727'/> + <typedef-decl name='__blksize_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='175' column='1' id='type-id-1728'/> + <typedef-decl name='__blkcnt_t' type-id='type-id-183' filepath='/usr/include/x86_64-linux-gnu/bits/types.h' line='180' column='1' id='type-id-1729'/> + <pointer-type-def type-id='type-id-1725' size-in-bits='64' id='type-id-59'/> + <function-decl name='_Py_fstat_noraise' mangled-name='_Py_fstat_noraise' filepath='./Include/internal/pycore_fileutils.h' line='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_fstat_noraise'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-59'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='fread' filepath='/usr/include/stdio.h' line='675' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-232'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-402'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='PyMarshal_WriteLongToFile' mangled-name='PyMarshal_WriteLongToFile' filepath='Python/marshal.c' line='658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteLongToFile'> + <parameter type-id='type-id-183' name='x' filepath='Python/marshal.c' line='658' column='1'/> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='658' column='1'/> + <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='658' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMarshal_WriteObjectToFile' mangled-name='PyMarshal_WriteObjectToFile' filepath='Python/marshal.c' line='673' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToFile'> + <parameter type-id='type-id-4' name='x' filepath='Python/marshal.c' line='673' column='1'/> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='673' column='1'/> + <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='673' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyMarshal_ReadShortFromFile' mangled-name='PyMarshal_ReadShortFromFile' filepath='Python/marshal.c' line='1572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadShortFromFile'> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='1572' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyMarshal_ReadLongFromFile' mangled-name='PyMarshal_ReadLongFromFile' filepath='Python/marshal.c' line='1588' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLongFromFile'> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='1588' column='1'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyMarshal_ReadLastObjectFromFile' mangled-name='PyMarshal_ReadLastObjectFromFile' filepath='Python/marshal.c' line='1624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadLastObjectFromFile'> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='1624' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMarshal_ReadObjectFromFile' mangled-name='PyMarshal_ReadObjectFromFile' filepath='Python/marshal.c' line='1649' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_ReadObjectFromFile'> + <parameter type-id='type-id-56' name='fp' filepath='Python/marshal.c' line='1649' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMarshal_WriteObjectToString' mangled-name='PyMarshal_WriteObjectToString' filepath='Python/marshal.c' line='1745' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_WriteObjectToString'> + <parameter type-id='type-id-4' name='x' filepath='Python/marshal.c' line='1745' column='1'/> + <parameter type-id='type-id-5' name='version' filepath='Python/marshal.c' line='1745' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyMarshal_Init' mangled-name='PyMarshal_Init' filepath='Python/marshal.c' line='1977' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyMarshal_Init'> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/modsupport.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_convert_optional_to_ssize_t' mangled-name='_Py_convert_optional_to_ssize_t' filepath='Python/modsupport.c' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_convert_optional_to_ssize_t'> + <parameter type-id='type-id-4' name='obj' filepath='Python/modsupport.c' line='14' column='1'/> + <parameter type-id='type-id-30' name='result' filepath='Python/modsupport.c' line='14' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_BuildValue_SizeT' mangled-name='_Py_BuildValue_SizeT' filepath='Python/modsupport.c' line='486' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_BuildValue_SizeT'> + <parameter type-id='type-id-6' name='format' filepath='Python/modsupport.c' line='486' column='1'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_VaBuildValue' mangled-name='Py_VaBuildValue' filepath='Python/modsupport.c' line='497' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_VaBuildValue'> + <parameter type-id='type-id-6' name='format' filepath='Python/modsupport.c' line='497' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/modsupport.c' line='497' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_VaBuildValue_SizeT' mangled-name='_Py_VaBuildValue_SizeT' filepath='Python/modsupport.c' line='503' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_VaBuildValue_SizeT'> + <parameter type-id='type-id-6' name='format' filepath='Python/modsupport.c' line='503' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/modsupport.c' line='503' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyModule_AddObject' mangled-name='PyModule_AddObject' filepath='Python/modsupport.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddObject'> + <parameter type-id='type-id-4' name='mod' filepath='Python/modsupport.c' line='617' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/modsupport.c' line='617' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Python/modsupport.c' line='617' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyModule_AddStringConstant' mangled-name='PyModule_AddStringConstant' filepath='Python/modsupport.c' line='633' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyModule_AddStringConstant'> + <parameter type-id='type-id-4' name='m' filepath='Python/modsupport.c' line='633' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/modsupport.c' line='633' column='1'/> + <parameter type-id='type-id-6' name='value' filepath='Python/modsupport.c' line='633' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/mysnprintf.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyOS_vsnprintf' mangled-name='PyOS_vsnprintf' filepath='Python/mysnprintf.c' line='53' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_vsnprintf'> + <parameter type-id='type-id-17' name='str' filepath='Python/mysnprintf.c' line='53' column='1'/> + <parameter type-id='type-id-21' name='size' filepath='Python/mysnprintf.c' line='53' column='1'/> + <parameter type-id='type-id-6' name='format' filepath='Python/mysnprintf.c' line='53' column='1'/> + <parameter type-id='type-id-302' name='va' filepath='Python/mysnprintf.c' line='53' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/parking_lot.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyRawMutex' size-in-bits='64' is-struct='yes' naming-typedef-id='type-id-1730' visibility='default' filepath='./Include/internal/pycore_lock.h' line='103' column='1' id='type-id-1731'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='v' type-id='type-id-427' visibility='default' filepath='./Include/internal/pycore_lock.h' line='104' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyRawMutex' type-id='type-id-1731' filepath='./Include/internal/pycore_lock.h' line='105' column='1' id='type-id-1730'/> + <pointer-type-def type-id='type-id-1730' size-in-bits='64' id='type-id-1732'/> + <pointer-type-def type-id='type-id-1716' size-in-bits='64' id='type-id-1733'/> + <qualified-type-def type-id='type-id-1733' restrict='yes' id='type-id-1734'/> + <function-decl name='_PyRawMutex_LockSlow' filepath='./Include/internal/pycore_lock.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1732'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyRawMutex_UnlockSlow' filepath='./Include/internal/pycore_lock.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1732'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTime_AsTimespec_clamp' mangled-name='_PyTime_AsTimespec_clamp' filepath='./Include/internal/pycore_time.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec_clamp'> + <parameter type-id='type-id-213'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='sem_init' filepath='/usr/include/semaphore.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1733'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-101'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sem_destroy' filepath='/usr/include/semaphore.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1733'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sem_wait' filepath='/usr/include/semaphore.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1733'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sem_clockwait' filepath='/usr/include/semaphore.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1734'/> + <parameter type-id='type-id-227'/> + <parameter type-id='type-id-207'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sem_post' filepath='/usr/include/semaphore.h' line='103' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1733'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyParkingLot_AfterFork' mangled-name='_PyParkingLot_AfterFork' filepath='Python/parking_lot.c' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyParkingLot_AfterFork'> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pathconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_wreadlink' filepath='./Include/internal/pycore_fileutils.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_wrealpath' filepath='./Include/internal/pycore_fileutils.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-58'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='87' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-20'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='92' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-19'/> + <parameter type-id='type-id-20'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='_PyPathConfig_ClearGlobal' mangled-name='_PyPathConfig_ClearGlobal' filepath='Python/pathconfig.c' line='55' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPathConfig_ClearGlobal'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_SetPath' mangled-name='Py_SetPath' filepath='Python/pathconfig.c' line='214' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetPath'> + <parameter type-id='type-id-18' name='path' filepath='Python/pathconfig.c' line='214' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_SetPythonHome' mangled-name='Py_SetPythonHome' filepath='Python/pathconfig.c' line='255' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetPythonHome'> + <parameter type-id='type-id-18' name='home' filepath='Python/pathconfig.c' line='255' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_SetProgramName' mangled-name='Py_SetProgramName' filepath='Python/pathconfig.c' line='278' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_SetProgramName'> + <parameter type-id='type-id-18' name='program_name' filepath='Python/pathconfig.c' line='278' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_GetPath' mangled-name='Py_GetPath' filepath='Python/pathconfig.c' line='301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPath'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='Py_GetPrefix' mangled-name='Py_GetPrefix' filepath='Python/pathconfig.c' line='324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPrefix'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='Py_GetExecPrefix' mangled-name='Py_GetExecPrefix' filepath='Python/pathconfig.c' line='331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetExecPrefix'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='Py_GetProgramFullPath' mangled-name='Py_GetProgramFullPath' filepath='Python/pathconfig.c' line='338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramFullPath'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='Py_GetPythonHome' mangled-name='Py_GetPythonHome' filepath='Python/pathconfig.c' line='345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetPythonHome'> + <return type-id='type-id-58'/> + </function-decl> + <function-decl name='Py_GetProgramName' mangled-name='Py_GetProgramName' filepath='Python/pathconfig.c' line='352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_GetProgramName'> + <return type-id='type-id-58'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/perf_jit_trampoline.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <qualified-type-def type-id='type-id-222' restrict='yes' id='type-id-1735'/> + <var-decl name='_Py_perfmap_jit_callbacks' type-id='type-id-1736' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='111' column='1'/> + <function-decl name='gettimeofday' filepath='/usr/include/x86_64-linux-gnu/sys/time.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1735'/> + <parameter type-id='type-id-232'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/perf_trampoline.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='_Py_perfmap_callbacks' type-id='type-id-1736' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='110' column='1'/> + <function-decl name='getppid' filepath='/usr/include/unistd.h' line='653' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-118'/> + </function-decl> + <function-decl name='PyUnstable_PerfTrampoline_CompileCode' mangled-name='PyUnstable_PerfTrampoline_CompileCode' filepath='Python/perf_trampoline.c' line='412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfTrampoline_CompileCode'> + <parameter type-id='type-id-325' name='co' filepath='Python/perf_trampoline.c' line='412' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyUnstable_PerfTrampoline_SetPersistAfterFork' mangled-name='PyUnstable_PerfTrampoline_SetPersistAfterFork' filepath='Python/perf_trampoline.c' line='537' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyUnstable_PerfTrampoline_SetPersistAfterFork'> + <parameter type-id='type-id-5' name='enable' filepath='Python/perf_trampoline.c' line='537' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/preconfig.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <enum-decl name='PyMemAllocatorName' naming-typedef-id='type-id-1737' filepath='./Include/cpython/pymem.h' line='16' column='1' id='type-id-1738'> + <underlying-type type-id='type-id-32'/> + <enumerator name='PYMEM_ALLOCATOR_NOT_SET' value='0'/> + <enumerator name='PYMEM_ALLOCATOR_DEFAULT' value='1'/> + <enumerator name='PYMEM_ALLOCATOR_DEBUG' value='2'/> + <enumerator name='PYMEM_ALLOCATOR_MALLOC' value='3'/> + <enumerator name='PYMEM_ALLOCATOR_MALLOC_DEBUG' value='4'/> + <enumerator name='PYMEM_ALLOCATOR_PYMALLOC' value='5'/> + <enumerator name='PYMEM_ALLOCATOR_PYMALLOC_DEBUG' value='6'/> + <enumerator name='PYMEM_ALLOCATOR_MIMALLOC' value='7'/> + <enumerator name='PYMEM_ALLOCATOR_MIMALLOC_DEBUG' value='8'/> + </enum-decl> + <typedef-decl name='PyMemAllocatorName' type-id='type-id-1738' filepath='./Include/cpython/pymem.h' line='30' column='1' id='type-id-1737'/> + <pointer-type-def type-id='type-id-1737' size-in-bits='64' id='type-id-1739'/> + <var-decl name='Py_FileSystemDefaultEncoding' type-id='type-id-6' mangled-name='Py_FileSystemDefaultEncoding' visibility='default' filepath='./Include/fileobject.h' line='22' column='1' elf-symbol-id='Py_FileSystemDefaultEncoding'/> + <var-decl name='Py_FileSystemDefaultEncodeErrors' type-id='type-id-6' mangled-name='Py_FileSystemDefaultEncodeErrors' visibility='default' filepath='./Include/fileobject.h' line='24' column='1' elf-symbol-id='Py_FileSystemDefaultEncodeErrors'/> + <var-decl name='Py_HasFileSystemDefaultEncoding' type-id='type-id-5' mangled-name='Py_HasFileSystemDefaultEncoding' visibility='default' filepath='./Include/fileobject.h' line='26' column='1' elf-symbol-id='Py_HasFileSystemDefaultEncoding'/> + <var-decl name='_Py_HasFileSystemDefaultEncodeErrors' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_fileutils.h' line='208' column='1'/> + <function-decl name='_PyWideStringList_Clear' filepath='./Include/internal/pycore_initconfig.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1677'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyWideStringList_Copy' filepath='./Include/internal/pycore_initconfig.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1677'/> + <parameter type-id='type-id-237'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyWideStringList_Extend' filepath='./Include/internal/pycore_initconfig.h' line='62' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1677'/> + <parameter type-id='type-id-237'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_CoerceLegacyLocale' filepath='./Include/internal/pycore_pylifecycle.h' line='108' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_LegacyLocaleDetected' filepath='./Include/internal/pycore_pylifecycle.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_SetLocaleFromEnv' mangled-name='_Py_SetLocaleFromEnv' filepath='./Include/internal/pycore_pylifecycle.h' line='112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_SetLocaleFromEnv'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='_PyMem_GetAllocatorName' filepath='./Include/internal/pycore_pymem.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-1739'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyMem_SetupAllocators' filepath='./Include/internal/pycore_pymem.h' line='114' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1737'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-18'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPreConfig_InitCompatConfig' mangled-name='_PyPreConfig_InitCompatConfig' filepath='Python/preconfig.c' line='284' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyPreConfig_InitCompatConfig'> + <parameter type-id='type-id-1676' name='config' filepath='Python/preconfig.c' line='284' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyPreConfig_InitPythonConfig' mangled-name='PyPreConfig_InitPythonConfig' filepath='Python/preconfig.c' line='312' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPreConfig_InitPythonConfig'> + <parameter type-id='type-id-1676' name='config' filepath='Python/preconfig.c' line='312' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyPreConfig_InitIsolatedConfig' mangled-name='PyPreConfig_InitIsolatedConfig' filepath='Python/preconfig.c' line='333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyPreConfig_InitIsolatedConfig'> + <parameter type-id='type-id-1676' name='config' filepath='Python/preconfig.c' line='333' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pyctype.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-371' size-in-bits='2048' id='type-id-1740'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-1741' size-in-bits='8192' id='type-id-1742'> + <subrange length='256' type-id='type-id-2' id='type-id-69'/> + </array-type-def> + <qualified-type-def type-id='type-id-101' const='yes' id='type-id-1741'/> + <var-decl name='_Py_ctype_table' type-id='type-id-1742' mangled-name='_Py_ctype_table' visibility='default' filepath='./Include/cpython/pyctype.h' line='16' column='1' elf-symbol-id='_Py_ctype_table'/> + <var-decl name='_Py_ctype_tolower' type-id='type-id-1740' mangled-name='_Py_ctype_tolower' visibility='default' filepath='./Include/cpython/pyctype.h' line='29' column='1' elf-symbol-id='_Py_ctype_tolower'/> + <var-decl name='_Py_ctype_toupper' type-id='type-id-1740' mangled-name='_Py_ctype_toupper' visibility='default' filepath='./Include/cpython/pyctype.h' line='30' column='1' elf-symbol-id='_Py_ctype_toupper'/> + </abi-instr> + <abi-instr address-size='64' path='Python/pyhash.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-91' size-in-bits='128' id='type-id-1743'> + <subrange length='16' type-id='type-id-2' id='type-id-64'/> + </array-type-def> + <array-type-def dimensions='1' type-id='type-id-91' size-in-bits='192' id='type-id-1744'> + <subrange length='24' type-id='type-id-2' id='type-id-809'/> + </array-type-def> + <class-decl name='PyHash_FuncDef' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1745' visibility='default' filepath='./Include/cpython/pyhash.h' line='37' column='1' id='type-id-1746'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='hash' type-id='type-id-1747' visibility='default' filepath='./Include/cpython/pyhash.h' line='38' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='name' type-id='type-id-6' visibility='default' filepath='./Include/cpython/pyhash.h' line='39' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='hash_bits' type-id='type-id-271' visibility='default' filepath='./Include/cpython/pyhash.h' line='40' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='seed_bits' type-id='type-id-271' visibility='default' filepath='./Include/cpython/pyhash.h' line='41' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='PyHash_FuncDef' type-id='type-id-1746' filepath='./Include/cpython/pyhash.h' line='42' column='1' id='type-id-1745'/> + <union-decl name='_Py_HashSecret_t' size-in-bits='192' naming-typedef-id='type-id-1748' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='45' column='1' id='type-id-1749'> + <data-member access='public'> + <var-decl name='uc' type-id='type-id-1744' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='47' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='fnv' type-id='type-id-1750' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='52' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='siphash' type-id='type-id-1751' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='57' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='djbx33a' type-id='type-id-1752' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='62' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='expat' type-id='type-id-1753' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='66' column='1'/> + </data-member> + </union-decl> + <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='49' column='1' id='type-id-1750'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='prefix' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='50' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='suffix' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='51' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='54' column='1' id='type-id-1751'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='k0' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='55' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='k1' type-id='type-id-108' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='56' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__2' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='59' column='1' id='type-id-1752'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='padding' type-id='type-id-1743' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='60' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='suffix' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='61' column='1'/> + </data-member> + </class-decl> + <class-decl name='__anonymous_struct__3' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='63' column='1' id='type-id-1753'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='padding' type-id='type-id-1743' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='64' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='hashsalt' type-id='type-id-301' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='65' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_HashSecret_t' type-id='type-id-1749' filepath='./Include/internal/pycore_pyhash.h' line='67' column='1' id='type-id-1748'/> + <pointer-type-def type-id='type-id-1745' size-in-bits='64' id='type-id-1754'/> + <pointer-type-def type-id='type-id-1755' size-in-bits='64' id='type-id-1756'/> + <qualified-type-def type-id='type-id-1756' const='yes' id='type-id-1747'/> + <var-decl name='_Py_HashSecret' type-id='type-id-1748' mangled-name='_Py_HashSecret' visibility='default' filepath='./Include/internal/pycore_pyhash.h' line='70' column='1' elf-symbol-id='_Py_HashSecret'/> + <function-decl name='PyHash_GetFuncDef' mangled-name='PyHash_GetFuncDef' filepath='Python/pyhash.c' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyHash_GetFuncDef'> + <return type-id='type-id-1754'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1755'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-301'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Python/pylifecycle.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_PyPerf_Callbacks' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1736' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='92' column='1' id='type-id-1757'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='init_state' type-id='type-id-1113' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='94' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='write_state' type-id='type-id-1114' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='96' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='free_state' type-id='type-id-249' visibility='default' filepath='./Include/internal/pycore_ceval.h' line='99' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_PyPerf_Callbacks' type-id='type-id-1757' filepath='./Include/internal/pycore_ceval.h' line='100' column='1' id='type-id-1736'/> + <typedef-decl name='PyOS_sighandler_t' type-id='type-id-1405' filepath='./Include/pylifecycle.h' line='59' column='1' id='type-id-1758'/> + <typedef-decl name='nl_item' type-id='type-id-5' filepath='/usr/include/nl_types.h' line='36' column='1' id='type-id-1759'/> + <typedef-decl name='sigset_t' type-id='type-id-37' filepath='/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h' line='7' column='1' id='type-id-80'/> + <pointer-type-def type-id='type-id-28' size-in-bits='64' id='type-id-1760'/> + <pointer-type-def type-id='type-id-1736' size-in-bits='64' id='type-id-236'/> + <qualified-type-def type-id='type-id-1147' const='yes' id='type-id-1761'/> + <pointer-type-def type-id='type-id-1761' size-in-bits='64' id='type-id-1762'/> + <qualified-type-def type-id='type-id-1762' restrict='yes' id='type-id-1763'/> + <pointer-type-def type-id='type-id-1147' size-in-bits='64' id='type-id-1764'/> + <qualified-type-def type-id='type-id-1764' restrict='yes' id='type-id-1765'/> + <pointer-type-def type-id='type-id-80' size-in-bits='64' id='type-id-52'/> + <function-decl name='_Py_FinishPendingCalls' filepath='./Include/internal/pycore_ceval.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_Fini' filepath='./Include/internal/pycore_ceval.h' line='82' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_SetCallbacks' filepath='./Include/internal/pycore_ceval.h' line='102' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-236'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_Init' filepath='./Include/internal/pycore_ceval.h' line='104' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_Fini' filepath='./Include/internal/pycore_ceval.h' line='105' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPerfTrampoline_FreeArenas' filepath='./Include/internal/pycore_ceval.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_InitGIL' filepath='./Include/internal/pycore_ceval.h' line='131' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_FiniGIL' filepath='./Include/internal/pycore_ceval.h' line='132' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCode_Init' filepath='./Include/internal/pycore_code.h' line='74' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyCode_Fini' filepath='./Include/internal/pycore_code.h' line='75' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyContext_Init' filepath='./Include/internal/pycore_context.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyXI_Init' filepath='./Include/internal/pycore_crossinterp.h' line='191' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyXI_Fini' filepath='./Include/internal/pycore_crossinterp.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyXI_InitTypes' filepath='./Include/internal/pycore_crossinterp.h' line='194' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyXI_FiniTypes' filepath='./Include/internal/pycore_crossinterp.h' line='195' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyDtoa_Init' filepath='./Include/internal/pycore_dtoa.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyDtoa_Fini' filepath='./Include/internal/pycore_dtoa.h' line='69' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyExc_InitState' filepath='./Include/internal/pycore_exceptions.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyExc_InitGlobalObjects' filepath='./Include/internal/pycore_exceptions.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyExc_InitTypes' filepath='./Include/internal/pycore_exceptions.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyExc_Fini' filepath='./Include/internal/pycore_exceptions.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyExc_ClearExceptionGroupType' filepath='./Include/internal/pycore_exceptions.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_write_noraise' mangled-name='_Py_write_noraise' filepath='./Include/internal/pycore_fileutils.h' line='145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_write_noraise'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_Py_ResetForceASCII' filepath='./Include/internal/pycore_fileutils.h' line='241' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_IsValidFD' mangled-name='_Py_IsValidFD' filepath='./Include/internal/pycore_fileutils.h' line='330' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_IsValidFD'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyFloat_InitState' filepath='./Include/internal/pycore_floatobject.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFloat_InitTypes' filepath='./Include/internal/pycore_floatobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyFloat_FiniType' filepath='./Include/internal/pycore_floatobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_CollectNoFail' filepath='./Include/internal/pycore_gc.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_FixupBuiltin' filepath='./Include/internal/pycore_import.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_ClearModules' filepath='./Include/internal/pycore_import.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_ClearModulesByIndex' filepath='./Include/internal/pycore_import.h' line='141' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_InitDefaultImportFunc' filepath='./Include/internal/pycore_import.h' line='143' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyImport_GetImportlibLoader' filepath='./Include/internal/pycore_import.h' line='148' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyImport_Init' filepath='./Include/internal/pycore_import.h' line='162' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyImport_Fini' filepath='./Include/internal/pycore_import.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_InitCore' filepath='./Include/internal/pycore_import.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyImport_InitExternal' filepath='./Include/internal/pycore_import.h' line='170' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyImport_FiniCore' filepath='./Include/internal/pycore_import.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_FiniExternal' filepath='./Include/internal/pycore_import.h' line='172' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPreConfig_InitFromConfig' filepath='./Include/internal/pycore_initconfig.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1676'/> + <parameter type-id='type-id-270'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyPreConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='142' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1676'/> + <parameter type-id='type-id-1682'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyPreConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='144' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-247'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyConfig_Copy' filepath='./Include/internal/pycore_initconfig.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <parameter type-id='type-id-270'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyConfig_InitImportConfig' filepath='./Include/internal/pycore_initconfig.h' line='177' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyConfig_Read' filepath='./Include/internal/pycore_initconfig.h' line='178' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-60'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyConfig_Write' filepath='./Include/internal/pycore_initconfig.h' line='179' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-270'/> + <parameter type-id='type-id-1244'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyInterpreterState_Clear' filepath='./Include/internal/pycore_interp.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_New' mangled-name='_PyInterpreterState_New' filepath='./Include/internal/pycore_interp.h' line='399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_New'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-1760'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyLong_InitTypes' filepath='./Include/internal/pycore_long.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyLong_FiniTypes' filepath='./Include/internal/pycore_long.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyModule_Clear' filepath='./Include/internal/pycore_moduleobject.h' line='11' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyModule_ClearDict' filepath='./Include/internal/pycore_moduleobject.h' line='12' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyModule_IsExtension' filepath='./Include/internal/pycore_moduleobject.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyObject_InitState' filepath='./Include/internal/pycore_object.h' line='294' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_GetConstant_Init' filepath='./Include/internal/pycore_object.h' line='788' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyMem_init_obmalloc' filepath='./Include/internal/pycore_obmalloc.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyPathConfig_UpdateGlobal' filepath='./Include/internal/pycore_pathconfig.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-270'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyErr_InitTypes' filepath='./Include/internal/pycore_pyerrors.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyErr_FiniTypes' filepath='./Include/internal/pycore_pyerrors.h' line='68' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_ClearFileSystemEncoding' filepath='./Include/internal/pycore_pylifecycle.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_InitEncodings' filepath='./Include/internal/pycore_pylifecycle.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_Py_InitVersion' filepath='./Include/internal/pycore_pylifecycle.h' line='30' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFaulthandler_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyBuiltin_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PySys_Create' filepath='./Include/internal/pycore_pylifecycle.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-238'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PySys_UpdateConfig' filepath='./Include/internal/pycore_pylifecycle.h' line='38' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySys_FiniTypes' filepath='./Include/internal/pycore_pylifecycle.h' line='39' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyBuiltins_AddExceptions' filepath='./Include/internal/pycore_pylifecycle.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_HashRandomization_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-270'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyGC_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyAtExit_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PySignal_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='48' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PySignal_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='49' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_HashRandomization_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='52' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyFaulthandler_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='53' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyHash_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTraceMalloc_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='55' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThread_FiniType' filepath='./Include/internal/pycore_pylifecycle.h' line='59' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyArg_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='60' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_FinalizeAllocatedBlocks' filepath='./Include/internal/pycore_pylifecycle.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGILState_Init' filepath='./Include/internal/pycore_pylifecycle.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyGILState_SetTstate' filepath='./Include/internal/pycore_pylifecycle.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGILState_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='65' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_DumpShutdownStats' filepath='./Include/internal/pycore_pylifecycle.h' line='67' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyAtExit_Call' filepath='./Include/internal/pycore_pylifecycle.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyMem_FiniDelayed' filepath='./Include/internal/pycore_pymem.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyMem_RawMalloc' filepath='./Include/internal/pycore_pymem_init.h' line='15' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_RawCalloc' filepath='./Include/internal/pycore_pymem_init.h' line='16' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_RawRealloc' filepath='./Include/internal/pycore_pymem_init.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_RawFree' filepath='./Include/internal/pycore_pymem_init.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_Malloc' filepath='./Include/internal/pycore_pymem_init.h' line='34' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyObject_Calloc' filepath='./Include/internal/pycore_pymem_init.h' line='35' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyObject_Free' filepath='./Include/internal/pycore_pymem_init.h' line='36' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_Realloc' filepath='./Include/internal/pycore_pymem_init.h' line='37' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_ArenaAlloc' filepath='./Include/internal/pycore_pymem_init.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyMem_ArenaFree' filepath='./Include/internal/pycore_pymem_init.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_IsRunningMain' filepath='./Include/internal/pycore_pystate.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyThreadState_New' mangled-name='_PyThreadState_New' filepath='./Include/internal/pycore_pystate.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_New'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='_PyThreadState_Bind' filepath='./Include/internal/pycore_pystate.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_RemoveExcept' filepath='./Include/internal/pycore_pystate.h' line='228' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='_PyThreadState_DeleteList' filepath='./Include/internal/pycore_pystate.h' line='229' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_ClearMimallocHeaps' filepath='./Include/internal/pycore_pystate.h' line='230' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_Enable' filepath='./Include/internal/pycore_pystate.h' line='247' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-61'/> + </function-decl> + <var-decl name='_PyRuntime' type-id='type-id-478' mangled-name='_PyRuntime' visibility='default' filepath='./Include/internal/pycore_runtime.h' line='367' column='1' elf-symbol-id='_PyRuntime'/> + <function-decl name='_PyRuntimeState_Init' filepath='./Include/internal/pycore_runtime.h' line='369' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyRuntimeState_Fini' filepath='./Include/internal/pycore_runtime.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-171'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySys_ClearAuditHooks' filepath='./Include/internal/pycore_sysmodule.h' line='25' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PySys_SetAttr' filepath='./Include/internal/pycore_sysmodule.h' line='27' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_Py_DumpTracebackThreads' filepath='./Include/internal/pycore_traceback.h' line='61' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-27'/> + <return type-id='type-id-6'/> + </function-decl> + <function-decl name='_Py_DumpASCII' filepath='./Include/internal/pycore_traceback.h' line='73' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_DumpDecimal' filepath='./Include/internal/pycore_traceback.h' line='78' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_DumpHexadecimal' filepath='./Include/internal/pycore_traceback.h' line='84' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-427'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTraceMalloc_Start' filepath='./Include/internal/pycore_tracemalloc.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTypes_InitTypes' filepath='./Include/internal/pycore_typeobject.h' line='135' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyTypes_FiniTypes' filepath='./Include/internal/pycore_typeobject.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTypes_FiniExtTypes' filepath='./Include/internal/pycore_typeobject.h' line='137' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTypes_Fini' filepath='./Include/internal/pycore_typeobject.h' line='138' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_clear_generic_types' filepath='./Include/internal/pycore_typevarobject.h' line='18' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_InitState' filepath='./Include/internal/pycore_unicodeobject.h' line='272' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_InitGlobalObjects' filepath='./Include/internal/pycore_unicodeobject.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyUnicode_InitTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='274' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='_PyUnicode_Fini' filepath='./Include/internal/pycore_unicodeobject.h' line='275' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_FiniTypes' filepath='./Include/internal/pycore_unicodeobject.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyUnicode_ClearInterned' filepath='./Include/internal/pycore_unicodeobject.h' line='328' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyWarnings_InitState' filepath='./Include/internal/pycore_warnings.h' line='21' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyInterpreterState_New' mangled-name='PyInterpreterState_New' filepath='./Include/pystate.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_New'> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='PyGILState_GetThisThreadState' mangled-name='PyGILState_GetThisThreadState' filepath='./Include/pystate.h' line='120' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyGILState_GetThisThreadState'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyOS_mystrnicmp' mangled-name='PyOS_mystrnicmp' filepath='./Include/pystrcmp.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_mystrnicmp'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-7'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_DisplayException' mangled-name='PyErr_DisplayException' filepath='./Include/pythonrun.h' line='17' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_DisplayException'> + <parameter type-id='type-id-4'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PySys_SetObject' mangled-name='PySys_SetObject' filepath='./Include/sysmodule.h' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PySys_SetObject'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='nl_langinfo' filepath='/usr/include/langinfo.h' line='661' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1759'/> + <return type-id='type-id-17'/> + </function-decl> + <function-decl name='sigemptyset' filepath='/usr/include/signal.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-52'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='sigaction' filepath='/usr/include/signal.h' line='243' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-1763'/> + <parameter type-id='type-id-1765'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='vfprintf' filepath='/usr/include/stdio.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-402'/> + <parameter type-id='type-id-179'/> + <parameter type-id='type-id-302'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='setenv' filepath='/usr/include/stdlib.h' line='660' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_IsFinalizing' mangled-name='Py_IsFinalizing' filepath='Python/pylifecycle.c' line='136' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_IsFinalizing'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_SetConfig' mangled-name='_PyInterpreterState_SetConfig' filepath='Python/pylifecycle.c' line='422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetConfig'> + <parameter type-id='type-id-270' name='src_config' filepath='Python/pylifecycle.c' line='422' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_PreInitializeFromBytesArgs' mangled-name='Py_PreInitializeFromBytesArgs' filepath='Python/pylifecycle.c' line='999' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromBytesArgs'> + <parameter type-id='type-id-247' name='src_config' filepath='Python/pylifecycle.c' line='999' column='1'/> + <parameter type-id='type-id-7' name='argc' filepath='Python/pylifecycle.c' line='999' column='1'/> + <parameter type-id='type-id-248' name='argv' filepath='Python/pylifecycle.c' line='999' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_PreInitializeFromArgs' mangled-name='Py_PreInitializeFromArgs' filepath='Python/pylifecycle.c' line='1007' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitializeFromArgs'> + <parameter type-id='type-id-247' name='src_config' filepath='Python/pylifecycle.c' line='1007' column='1'/> + <parameter type-id='type-id-7' name='argc' filepath='Python/pylifecycle.c' line='1007' column='1'/> + <parameter type-id='type-id-241' name='argv' filepath='Python/pylifecycle.c' line='1007' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_PreInitialize' mangled-name='Py_PreInitialize' filepath='Python/pylifecycle.c' line='1015' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_PreInitialize'> + <parameter type-id='type-id-247' name='src_config' filepath='Python/pylifecycle.c' line='1015' column='1'/> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_InitializeEx' mangled-name='Py_InitializeEx' filepath='Python/pylifecycle.c' line='1423' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_InitializeEx'> + <parameter type-id='type-id-5' name='install_sigs' filepath='Python/pylifecycle.c' line='1423' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_Initialize' mangled-name='Py_Initialize' filepath='Python/pylifecycle.c' line='1451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Initialize'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_InitializeMain' mangled-name='_Py_InitializeMain' filepath='Python/pylifecycle.c' line='1458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_InitializeMain'> + <return type-id='type-id-61'/> + </function-decl> + <function-decl name='Py_Finalize' mangled-name='Py_Finalize' filepath='Python/pylifecycle.c' line='2217' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Finalize'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_NewInterpreter' mangled-name='Py_NewInterpreter' filepath='Python/pylifecycle.c' line='2363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_NewInterpreter'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='Py_FatalError' mangled-name='Py_FatalError' filepath='Python/pylifecycle.c' line='3269' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FatalError'> + <parameter type-id='type-id-6' name='msg' filepath='Python/pylifecycle.c' line='3269' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_FatalRefcountErrorFunc' mangled-name='_Py_FatalRefcountErrorFunc' filepath='Python/pylifecycle.c' line='3313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_FatalRefcountErrorFunc'> + <parameter type-id='type-id-6' name='func' filepath='Python/pylifecycle.c' line='3313' column='1'/> + <parameter type-id='type-id-6' name='msg' filepath='Python/pylifecycle.c' line='3313' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_AtExit' mangled-name='Py_AtExit' filepath='Python/pylifecycle.c' line='3363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_AtExit'> + <parameter type-id='type-id-233' name='func' filepath='Python/pylifecycle.c' line='3363' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_Exit' mangled-name='Py_Exit' filepath='Python/pylifecycle.c' line='3400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_Exit'> + <parameter type-id='type-id-5' name='sts' filepath='Python/pylifecycle.c' line='3400' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='Py_FdIsInteractive' mangled-name='Py_FdIsInteractive' filepath='Python/pylifecycle.c' line='3421' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_FdIsInteractive'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pylifecycle.c' line='3421' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/pylifecycle.c' line='3421' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyOS_getsig' mangled-name='PyOS_getsig' filepath='Python/pylifecycle.c' line='3453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_getsig'> + <parameter type-id='type-id-5' name='sig' filepath='Python/pylifecycle.c' line='3453' column='1'/> + <return type-id='type-id-1758'/> + </function-decl> + <function-decl name='PyOS_setsig' mangled-name='PyOS_setsig' filepath='Python/pylifecycle.c' line='3492' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_setsig'> + <parameter type-id='type-id-5' name='sig' filepath='Python/pylifecycle.c' line='3492' column='1'/> + <parameter type-id='type-id-1758' name='handler' filepath='Python/pylifecycle.c' line='3492' column='1'/> + <return type-id='type-id-1758'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pystate.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <pointer-type-def type-id='type-id-1154' size-in-bits='64' id='type-id-1766'/> + <pointer-type-def type-id='type-id-1344' size-in-bits='64' id='type-id-1767'/> + <pointer-type-def type-id='type-id-1166' size-in-bits='64' id='type-id-1768'/> + <pointer-type-def type-id='type-id-1311' size-in-bits='64' id='type-id-1769'/> + <function-decl name='_PyEval_InitState' filepath='./Include/internal/pycore_ceval.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_AcquireLock' filepath='./Include/internal/pycore_ceval.h' line='134' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyEval_ReleaseLock' filepath='./Include/internal/pycore_ceval.h' line='136' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyCodec_Fini' filepath='./Include/internal/pycore_codecs.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyGC_InitState' filepath='./Include/internal/pycore_gc.h' line='336' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1768'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyImport_ClearCore' filepath='./Include/internal/pycore_import.h' line='128' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyType_InitCache' filepath='./Include/internal/pycore_object.h' line='292' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_FiniState' filepath='./Include/internal/pycore_object.h' line='295' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyObject_VirtualAlloc' filepath='./Include/internal/pycore_obmalloc.h' line='679' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-21'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyObject_VirtualFree' filepath='./Include/internal/pycore_obmalloc.h' line='680' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_FinalizeAllocatedBlocks' filepath='./Include/internal/pycore_obmalloc.h' line='688' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyMem_obmalloc_state_on_heap' filepath='./Include/internal/pycore_obmalloc.h' line='690' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-352'/> + </function-decl> + <function-decl name='_PyGC_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='51' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyWarnings_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='56' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyAST_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='57' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyAtExit_Fini' filepath='./Include/internal/pycore_pylifecycle.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyMem_AbandonDelayed' filepath='./Include/internal/pycore_pymem.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <return type-id='type-id-3'/> + </function-decl> + <var-decl name='_Py_tss_tstate' type-id='type-id-27' visibility='default' filepath='./Include/internal/pycore_pystate.h' line='116' column='1'/> + <function-decl name='_PyThread_at_fork_reinit' filepath='./Include/internal/pycore_pythread.h' line='94' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1766'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyThread_AfterFork' filepath='./Include/internal/pycore_pythread.h' line='95' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1769'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_Py_qsbr_fini' filepath='./Include/internal/pycore_qsbr.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTypes_AfterFork' filepath='./Include/internal/pycore_typeobject.h' line='139' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_get_thread_native_id' mangled-name='PyThread_get_thread_native_id' filepath='./Include/pythread.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_thread_native_id'> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='PyThread_allocate_lock' mangled-name='PyThread_allocate_lock' filepath='./Include/pythread.h' line='31' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_allocate_lock'> + <return type-id='type-id-1154'/> + </function-decl> + <function-decl name='PyThread_free_lock' mangled-name='PyThread_free_lock' filepath='./Include/pythread.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_free_lock'> + <parameter type-id='type-id-1154'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_acquire_lock' mangled-name='PyThread_acquire_lock' filepath='./Include/pythread.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock'> + <parameter type-id='type-id-1154'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_release_lock' mangled-name='PyThread_release_lock' filepath='./Include/pythread.h' line='58' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_release_lock'> + <parameter type-id='type-id-1154'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_tss_is_created' mangled-name='PyThread_tss_is_created' filepath='./Include/pythread.h' line='96' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_is_created'> + <parameter type-id='type-id-1767'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_tss_create' mangled-name='PyThread_tss_create' filepath='./Include/pythread.h' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_create'> + <parameter type-id='type-id-1767'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_tss_delete' mangled-name='PyThread_tss_delete' filepath='./Include/pythread.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_delete'> + <parameter type-id='type-id-1767'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_tss_set' mangled-name='PyThread_tss_set' filepath='./Include/pythread.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_set'> + <parameter type-id='type-id-1767'/> + <parameter type-id='type-id-30'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_tss_get' mangled-name='PyThread_tss_get' filepath='./Include/pythread.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_get'> + <parameter type-id='type-id-1767'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='_PyThreadState_GetCurrent' mangled-name='_PyThreadState_GetCurrent' filepath='Python/pystate.c' line='110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetCurrent'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyInterpreterState_Clear' mangled-name='PyInterpreterState_Clear' filepath='Python/pystate.c' line='916' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Clear'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='916' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_IsRunningMain' mangled-name='_PyInterpreterState_IsRunningMain' filepath='Python/pystate.c' line='1084' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IsRunningMain'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1084' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_FailIfRunningMain' mangled-name='_PyInterpreterState_FailIfRunningMain' filepath='Python/pystate.c' line='1109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_FailIfRunningMain'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1109' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_GetWhence' mangled-name='_PyInterpreterState_GetWhence' filepath='Python/pystate.c' line='1154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetWhence'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1154' column='1'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyInterpreterState_GetDict' mangled-name='PyInterpreterState_GetDict' filepath='Python/pystate.c' line='1182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_GetDict'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1182' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyInterpreterState_ObjectToID' mangled-name='_PyInterpreterState_ObjectToID' filepath='Python/pystate.c' line='1200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_ObjectToID'> + <parameter type-id='type-id-4' name='idobj' filepath='Python/pystate.c' line='1200' column='1'/> + <return type-id='type-id-460'/> + </function-decl> + <function-decl name='_PyInterpreterState_GetIDObject' mangled-name='_PyInterpreterState_GetIDObject' filepath='Python/pystate.c' line='1244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetIDObject'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1244' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyInterpreterState_IDInitref' mangled-name='_PyInterpreterState_IDInitref' filepath='Python/pystate.c' line='1259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDInitref'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1259' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_IDIncref' mangled-name='_PyInterpreterState_IDIncref' filepath='Python/pystate.c' line='1276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDIncref'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1276' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_IDDecref' mangled-name='_PyInterpreterState_IDDecref' filepath='Python/pystate.c' line='1290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_IDDecref'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1290' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_RequiresIDRef' mangled-name='_PyInterpreterState_RequiresIDRef' filepath='Python/pystate.c' line='1313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequiresIDRef'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1313' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyInterpreterState_RequireIDRef' mangled-name='_PyInterpreterState_RequireIDRef' filepath='Python/pystate.c' line='1319' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_RequireIDRef'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1319' column='1'/> + <parameter type-id='type-id-5' name='required' filepath='Python/pystate.c' line='1319' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_LookUpIDObject' mangled-name='_PyInterpreterState_LookUpIDObject' filepath='Python/pystate.c' line='1386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_LookUpIDObject'> + <parameter type-id='type-id-4' name='requested_id' filepath='Python/pystate.c' line='1386' column='1'/> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='_PyThreadState_Prealloc' mangled-name='_PyThreadState_Prealloc' filepath='Python/pystate.c' line='1637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Prealloc'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='1637' column='1'/> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='_PyThreadState_Init' mangled-name='_PyThreadState_Init' filepath='Python/pystate.c' line='1645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_Init'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/pystate.c' line='1645' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThreadState_DeleteCurrent' mangled-name='PyThreadState_DeleteCurrent' filepath='Python/pystate.c' line='1867' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_DeleteCurrent'> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyThreadState_GetDict' mangled-name='_PyThreadState_GetDict' filepath='Python/pystate.c' line='1944' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThreadState_GetDict'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/pystate.c' line='1944' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyThreadState_GetID' mangled-name='PyThreadState_GetID' filepath='Python/pystate.c' line='1993' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetID'> + <parameter type-id='type-id-27' name='tstate' filepath='Python/pystate.c' line='1993' column='1'/> + <return type-id='type-id-108'/> + </function-decl> + <function-decl name='PyThreadState_SetAsyncExc' mangled-name='PyThreadState_SetAsyncExc' filepath='Python/pystate.c' line='2374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_SetAsyncExc'> + <parameter type-id='type-id-2' name='id' filepath='Python/pystate.c' line='2374' column='1'/> + <parameter type-id='type-id-4' name='exc' filepath='Python/pystate.c' line='2374' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThreadState_GetUnchecked' mangled-name='PyThreadState_GetUnchecked' filepath='Python/pystate.c' line='2415' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThreadState_GetUnchecked'> + <return type-id='type-id-27'/> + </function-decl> + <function-decl name='PyInterpreterState_Main' mangled-name='PyInterpreterState_Main' filepath='Python/pystate.c' line='2493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyInterpreterState_Main'> + <return type-id='type-id-28'/> + </function-decl> + <function-decl name='_PyThread_CurrentFrames' mangled-name='_PyThread_CurrentFrames' filepath='Python/pystate.c' line='2524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyThread_CurrentFrames'> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyInterpreterState_GetEvalFrameFunc' mangled-name='_PyInterpreterState_GetEvalFrameFunc' filepath='Python/pystate.c' line='2854' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetEvalFrameFunc'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='2854' column='1'/> + <return type-id='type-id-1032'/> + </function-decl> + <function-decl name='_PyInterpreterState_SetEvalFrameFunc' mangled-name='_PyInterpreterState_SetEvalFrameFunc' filepath='Python/pystate.c' line='2864' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_SetEvalFrameFunc'> + <parameter type-id='type-id-28' name='interp' filepath='Python/pystate.c' line='2864' column='1'/> + <parameter type-id='type-id-1032' name='eval_frame' filepath='Python/pystate.c' line='2865' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyInterpreterState_GetConfigCopy' mangled-name='_PyInterpreterState_GetConfigCopy' filepath='Python/pystate.c' line='2891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyInterpreterState_GetConfigCopy'> + <parameter type-id='type-id-60' name='config' filepath='Python/pystate.c' line='2891' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pystrcmp.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyOS_mystricmp' mangled-name='PyOS_mystricmp' filepath='Python/pystrcmp.c' line='22' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyOS_mystricmp'> + <parameter type-id='type-id-6' name='s1' filepath='Python/pystrcmp.c' line='22' column='1'/> + <parameter type-id='type-id-6' name='s2' filepath='Python/pystrcmp.c' line='22' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pystrhex.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_strhex' mangled-name='_Py_strhex' filepath='Python/pystrhex.c' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex'> + <parameter type-id='type-id-6' name='argbuf' filepath='Python/pystrhex.c' line='146' column='1'/> + <parameter type-id='type-id-256' name='arglen' filepath='Python/pystrhex.c' line='146' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_strhex_bytes_with_sep' mangled-name='_Py_strhex_bytes_with_sep' filepath='Python/pystrhex.c' line='168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_strhex_bytes_with_sep'> + <parameter type-id='type-id-6' name='argbuf' filepath='Python/pystrhex.c' line='168' column='1'/> + <parameter type-id='type-id-256' name='arglen' filepath='Python/pystrhex.c' line='168' column='1'/> + <parameter type-id='type-id-4' name='sep' filepath='Python/pystrhex.c' line='169' column='1'/> + <parameter type-id='type-id-271' name='bytes_per_group' filepath='Python/pystrhex.c' line='169' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pythonrun.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyImport_GetImportlibExternalLoader' filepath='./Include/internal/pycore_import.h' line='151' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-6'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyParser_ASTFromString' filepath='./Include/internal/pycore_parser.h' line='63' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-574'/> + </function-decl> + <function-decl name='_PyParser_ASTFromFile' filepath='./Include/internal/pycore_parser.h' line='70' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-574'/> + </function-decl> + <function-decl name='_PyParser_InteractiveASTFromFile' filepath='./Include/internal/pycore_parser.h' line='80' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-209'/> + <parameter type-id='type-id-177'/> + <parameter type-id='type-id-238'/> + <parameter type-id='type-id-679'/> + <return type-id='type-id-574'/> + </function-decl> + <function-decl name='_Py_FdIsInteractive' filepath='./Include/internal/pycore_pylifecycle.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceBack_Print' filepath='./Include/internal/pycore_traceback.h' line='98' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='rewind' filepath='/usr/include/stdio.h' line='723' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-56'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyRun_InteractiveLoopFlags' mangled-name='PyRun_InteractiveLoopFlags' filepath='Python/pythonrun.c' line='161' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoopFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='161' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/pythonrun.c' line='161' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='161' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_InteractiveOneObject' mangled-name='PyRun_InteractiveOneObject' filepath='Python/pythonrun.c' line='326' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneObject'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='326' column='1'/> + <parameter type-id='type-id-4' name='filename' filepath='Python/pythonrun.c' line='326' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='326' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_InteractiveOneFlags' mangled-name='PyRun_InteractiveOneFlags' filepath='Python/pythonrun.c' line='339' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOneFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='339' column='1'/> + <parameter type-id='type-id-6' name='filename_str' filepath='Python/pythonrun.c' line='339' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='339' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_SimpleFileExFlags' mangled-name='PyRun_SimpleFileExFlags' filepath='Python/pythonrun.c' line='517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileExFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='517' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/pythonrun.c' line='517' column='1'/> + <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='517' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='518' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_SimpleStringFlags' mangled-name='PyRun_SimpleStringFlags' filepath='Python/pythonrun.c' line='561' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleStringFlags'> + <parameter type-id='type-id-6' name='command' filepath='Python/pythonrun.c' line='561' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='561' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyErr_Display' mangled-name='PyErr_Display' filepath='Python/pythonrun.c' line='1166' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyErr_Display'> + <parameter type-id='type-id-4' name='unused' filepath='Python/pythonrun.c' line='1166' column='1'/> + <parameter type-id='type-id-4' name='value' filepath='Python/pythonrun.c' line='1166' column='1'/> + <parameter type-id='type-id-4' name='tb' filepath='Python/pythonrun.c' line='1166' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyRun_FileExFlags' mangled-name='PyRun_FileExFlags' filepath='Python/pythonrun.c' line='1267' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileExFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1267' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/pythonrun.c' line='1267' column='1'/> + <parameter type-id='type-id-5' name='start' filepath='Python/pythonrun.c' line='1267' column='1'/> + <parameter type-id='type-id-4' name='globals' filepath='Python/pythonrun.c' line='1267' column='1'/> + <parameter type-id='type-id-4' name='locals' filepath='Python/pythonrun.c' line='1268' column='1'/> + <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='1268' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1268' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_CompileStringExFlags' mangled-name='Py_CompileStringExFlags' filepath='Python/pythonrun.c' line='1501' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringExFlags'> + <parameter type-id='type-id-6' name='str' filepath='Python/pythonrun.c' line='1501' column='1'/> + <parameter type-id='type-id-6' name='filename_str' filepath='Python/pythonrun.c' line='1501' column='1'/> + <parameter type-id='type-id-5' name='start' filepath='Python/pythonrun.c' line='1501' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1502' column='1'/> + <parameter type-id='type-id-5' name='optimize' filepath='Python/pythonrun.c' line='1502' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_AnyFile' mangled-name='PyRun_AnyFile' filepath='Python/pythonrun.c' line='1603' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFile'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1603' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/pythonrun.c' line='1603' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_AnyFileEx' mangled-name='PyRun_AnyFileEx' filepath='Python/pythonrun.c' line='1610' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileEx'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1610' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/pythonrun.c' line='1610' column='1'/> + <parameter type-id='type-id-5' name='closeit' filepath='Python/pythonrun.c' line='1610' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_AnyFileFlags' mangled-name='PyRun_AnyFileFlags' filepath='Python/pythonrun.c' line='1617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_AnyFileFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1617' column='1'/> + <parameter type-id='type-id-6' name='name' filepath='Python/pythonrun.c' line='1617' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1617' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_File' mangled-name='PyRun_File' filepath='Python/pythonrun.c' line='1624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_File'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1624' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1624' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1624' column='1'/> + <parameter type-id='type-id-4' name='g' filepath='Python/pythonrun.c' line='1624' column='1'/> + <parameter type-id='type-id-4' name='l' filepath='Python/pythonrun.c' line='1624' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_FileEx' mangled-name='PyRun_FileEx' filepath='Python/pythonrun.c' line='1631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileEx'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1631' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1631' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1631' column='1'/> + <parameter type-id='type-id-4' name='g' filepath='Python/pythonrun.c' line='1631' column='1'/> + <parameter type-id='type-id-4' name='l' filepath='Python/pythonrun.c' line='1631' column='1'/> + <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1631' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_FileFlags' mangled-name='PyRun_FileFlags' filepath='Python/pythonrun.c' line='1638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_FileFlags'> + <parameter type-id='type-id-56' name='fp' filepath='Python/pythonrun.c' line='1638' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1638' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1638' column='1'/> + <parameter type-id='type-id-4' name='g' filepath='Python/pythonrun.c' line='1638' column='1'/> + <parameter type-id='type-id-4' name='l' filepath='Python/pythonrun.c' line='1638' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1639' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_SimpleFile' mangled-name='PyRun_SimpleFile' filepath='Python/pythonrun.c' line='1646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFile'> + <parameter type-id='type-id-56' name='f' filepath='Python/pythonrun.c' line='1646' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1646' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_SimpleFileEx' mangled-name='PyRun_SimpleFileEx' filepath='Python/pythonrun.c' line='1653' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleFileEx'> + <parameter type-id='type-id-56' name='f' filepath='Python/pythonrun.c' line='1653' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1653' column='1'/> + <parameter type-id='type-id-5' name='c' filepath='Python/pythonrun.c' line='1653' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_String' mangled-name='PyRun_String' filepath='Python/pythonrun.c' line='1661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_String'> + <parameter type-id='type-id-6' name='str' filepath='Python/pythonrun.c' line='1661' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1661' column='1'/> + <parameter type-id='type-id-4' name='g' filepath='Python/pythonrun.c' line='1661' column='1'/> + <parameter type-id='type-id-4' name='l' filepath='Python/pythonrun.c' line='1661' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_SimpleString' mangled-name='PyRun_SimpleString' filepath='Python/pythonrun.c' line='1668' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_SimpleString'> + <parameter type-id='type-id-6' name='s' filepath='Python/pythonrun.c' line='1668' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='Py_CompileString' mangled-name='Py_CompileString' filepath='Python/pythonrun.c' line='1675' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileString'> + <parameter type-id='type-id-6' name='str' filepath='Python/pythonrun.c' line='1675' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1675' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1675' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='Py_CompileStringFlags' mangled-name='Py_CompileStringFlags' filepath='Python/pythonrun.c' line='1682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='Py_CompileStringFlags'> + <parameter type-id='type-id-6' name='str' filepath='Python/pythonrun.c' line='1682' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1682' column='1'/> + <parameter type-id='type-id-5' name='s' filepath='Python/pythonrun.c' line='1682' column='1'/> + <parameter type-id='type-id-209' name='flags' filepath='Python/pythonrun.c' line='1683' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='PyRun_InteractiveOne' mangled-name='PyRun_InteractiveOne' filepath='Python/pythonrun.c' line='1690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveOne'> + <parameter type-id='type-id-56' name='f' filepath='Python/pythonrun.c' line='1690' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1690' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyRun_InteractiveLoop' mangled-name='PyRun_InteractiveLoop' filepath='Python/pythonrun.c' line='1697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyRun_InteractiveLoop'> + <parameter type-id='type-id-56' name='f' filepath='Python/pythonrun.c' line='1697' column='1'/> + <parameter type-id='type-id-6' name='p' filepath='Python/pythonrun.c' line='1697' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/pytime.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <class-decl name='_Py_clock_info_t' size-in-bits='192' is-struct='yes' naming-typedef-id='type-id-1770' visibility='default' filepath='./Include/internal/pycore_time.h' line='245' column='1' id='type-id-1771'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='implementation' type-id='type-id-6' visibility='default' filepath='./Include/internal/pycore_time.h' line='246' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='monotonic' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_time.h' line='247' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='adjustable' type-id='type-id-5' visibility='default' filepath='./Include/internal/pycore_time.h' line='248' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='resolution' type-id='type-id-172' visibility='default' filepath='./Include/internal/pycore_time.h' line='249' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='_Py_clock_info_t' type-id='type-id-1771' filepath='./Include/internal/pycore_time.h' line='250' column='1' id='type-id-1770'/> + <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='7' column='1' id='type-id-218'> + <data-member access='public' layout-offset-in-bits='0'> + <var-decl name='tm_sec' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='9' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='32'> + <var-decl name='tm_min' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='10' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='64'> + <var-decl name='tm_hour' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='11' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='96'> + <var-decl name='tm_mday' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='12' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='128'> + <var-decl name='tm_mon' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='13' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='160'> + <var-decl name='tm_year' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='14' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='192'> + <var-decl name='tm_wday' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='15' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='224'> + <var-decl name='tm_yday' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='16' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='256'> + <var-decl name='tm_isdst' type-id='type-id-5' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='17' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='320'> + <var-decl name='tm_gmtoff' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='20' column='1'/> + </data-member> + <data-member access='public' layout-offset-in-bits='384'> + <var-decl name='tm_zone' type-id='type-id-6' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h' line='21' column='1'/> + </data-member> + </class-decl> + <typedef-decl name='time_t' type-id='type-id-482' filepath='/usr/include/x86_64-linux-gnu/bits/types/time_t.h' line='10' column='1' id='type-id-225'/> + <pointer-type-def type-id='type-id-1770' size-in-bits='64' id='type-id-223'/> + <qualified-type-def type-id='type-id-225' const='yes' id='type-id-1772'/> + <pointer-type-def type-id='type-id-1772' size-in-bits='64' id='type-id-1773'/> + <qualified-type-def type-id='type-id-1773' restrict='yes' id='type-id-1774'/> + <pointer-type-def type-id='type-id-225' size-in-bits='64' id='type-id-224'/> + <pointer-type-def type-id='type-id-198' size-in-bits='64' id='type-id-222'/> + <pointer-type-def type-id='type-id-218' size-in-bits='64' id='type-id-226'/> + <qualified-type-def type-id='type-id-226' restrict='yes' id='type-id-1775'/> + <function-decl name='gmtime_r' filepath='/usr/include/time.h' line='154' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1774'/> + <parameter type-id='type-id-1775'/> + <return type-id='type-id-226'/> + </function-decl> + <function-decl name='localtime_r' filepath='/usr/include/time.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1774'/> + <parameter type-id='type-id-1775'/> + <return type-id='type-id-226'/> + </function-decl> + <function-decl name='clock_getres' filepath='/usr/include/time.h' line='276' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-227'/> + <parameter type-id='type-id-178'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyLong_AsTime_t' mangled-name='_PyLong_AsTime_t' filepath='Python/pytime.c' line='210' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_AsTime_t'> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='210' column='1'/> + <return type-id='type-id-225'/> + </function-decl> + <function-decl name='_PyLong_FromTime_t' mangled-name='_PyLong_FromTime_t' filepath='Python/pytime.c' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyLong_FromTime_t'> + <parameter type-id='type-id-225' name='t' filepath='Python/pytime.c' line='230' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTime_ObjectToTime_t' mangled-name='_PyTime_ObjectToTime_t' filepath='Python/pytime.c' line='398' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTime_t'> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='398' column='1'/> + <parameter type-id='type-id-224' name='sec' filepath='Python/pytime.c' line='398' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='398' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_ObjectToTimespec' mangled-name='_PyTime_ObjectToTimespec' filepath='Python/pytime.c' line='433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimespec'> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='433' column='1'/> + <parameter type-id='type-id-224' name='sec' filepath='Python/pytime.c' line='433' column='1'/> + <parameter type-id='type-id-170' name='nsec' filepath='Python/pytime.c' line='433' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='434' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_ObjectToTimeval' mangled-name='_PyTime_ObjectToTimeval' filepath='Python/pytime.c' line='441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_ObjectToTimeval'> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='441' column='1'/> + <parameter type-id='type-id-224' name='sec' filepath='Python/pytime.c' line='441' column='1'/> + <parameter type-id='type-id-170' name='usec' filepath='Python/pytime.c' line='441' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='442' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_FromSeconds' mangled-name='_PyTime_FromSeconds' filepath='Python/pytime.c' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromSeconds'> + <parameter type-id='type-id-5' name='seconds' filepath='Python/pytime.c' line='449' column='1'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='_PyTime_FromLong' mangled-name='_PyTime_FromLong' filepath='Python/pytime.c' line='474' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromLong'> + <parameter type-id='type-id-174' name='tp' filepath='Python/pytime.c' line='474' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='474' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_FromSecondsObject' mangled-name='_PyTime_FromSecondsObject' filepath='Python/pytime.c' line='623' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromSecondsObject'> + <parameter type-id='type-id-174' name='tp' filepath='Python/pytime.c' line='623' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='623' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='623' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_FromMillisecondsObject' mangled-name='_PyTime_FromMillisecondsObject' filepath='Python/pytime.c' line='630' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_FromMillisecondsObject'> + <parameter type-id='type-id-174' name='tp' filepath='Python/pytime.c' line='630' column='1'/> + <parameter type-id='type-id-4' name='obj' filepath='Python/pytime.c' line='630' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='630' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_AsLong' mangled-name='_PyTime_AsLong' filepath='Python/pytime.c' line='657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsLong'> + <parameter type-id='type-id-213' name='ns' filepath='Python/pytime.c' line='657' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyTime_AsMilliseconds' mangled-name='_PyTime_AsMilliseconds' filepath='Python/pytime.c' line='783' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsMilliseconds'> + <parameter type-id='type-id-213' name='ns' filepath='Python/pytime.c' line='783' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='783' column='1'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='_PyTime_AsTimeval' mangled-name='_PyTime_AsTimeval' filepath='Python/pytime.c' line='831' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval'> + <parameter type-id='type-id-213' name='t' filepath='Python/pytime.c' line='831' column='1'/> + <parameter type-id='type-id-222' name='tv' filepath='Python/pytime.c' line='831' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='831' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_AsTimeval_clamp' mangled-name='_PyTime_AsTimeval_clamp' filepath='Python/pytime.c' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimeval_clamp'> + <parameter type-id='type-id-213' name='t' filepath='Python/pytime.c' line='838' column='1'/> + <parameter type-id='type-id-222' name='tv' filepath='Python/pytime.c' line='838' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='838' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='_PyTime_AsTimevalTime_t' mangled-name='_PyTime_AsTimevalTime_t' filepath='Python/pytime.c' line='845' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimevalTime_t'> + <parameter type-id='type-id-213' name='t' filepath='Python/pytime.c' line='845' column='1'/> + <parameter type-id='type-id-224' name='p_secs' filepath='Python/pytime.c' line='845' column='1'/> + <parameter type-id='type-id-177' name='us' filepath='Python/pytime.c' line='845' column='1'/> + <parameter type-id='type-id-173' name='round' filepath='Python/pytime.c' line='846' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_AsTimespec' mangled-name='_PyTime_AsTimespec' filepath='Python/pytime.c' line='889' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_AsTimespec'> + <parameter type-id='type-id-213' name='t' filepath='Python/pytime.c' line='889' column='1'/> + <parameter type-id='type-id-178' name='ts' filepath='Python/pytime.c' line='889' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTime_Time' mangled-name='PyTime_Time' filepath='Python/pytime.c' line='1012' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_Time'> + <parameter type-id='type-id-174' name='result' filepath='Python/pytime.c' line='1012' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTime_TimeRaw' mangled-name='PyTime_TimeRaw' filepath='Python/pytime.c' line='1023' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_TimeRaw'> + <parameter type-id='type-id-174' name='result' filepath='Python/pytime.c' line='1023' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTime_Monotonic' mangled-name='PyTime_Monotonic' filepath='Python/pytime.c' line='1236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_Monotonic'> + <parameter type-id='type-id-174' name='result' filepath='Python/pytime.c' line='1236' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_MonotonicWithInfo' mangled-name='_PyTime_MonotonicWithInfo' filepath='Python/pytime.c' line='1258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_MonotonicWithInfo'> + <parameter type-id='type-id-174' name='tp' filepath='Python/pytime.c' line='1258' column='1'/> + <parameter type-id='type-id-223' name='info' filepath='Python/pytime.c' line='1258' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTime_PerfCounter' mangled-name='PyTime_PerfCounter' filepath='Python/pytime.c' line='1272' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTime_PerfCounter'> + <parameter type-id='type-id-174' name='result' filepath='Python/pytime.c' line='1272' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_localtime' mangled-name='_PyTime_localtime' filepath='Python/pytime.c' line='1286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_localtime'> + <parameter type-id='type-id-225' name='t' filepath='Python/pytime.c' line='1286' column='1'/> + <parameter type-id='type-id-226' name='tm' filepath='Python/pytime.c' line='1286' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTime_gmtime' mangled-name='_PyTime_gmtime' filepath='Python/pytime.c' line='1325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTime_gmtime'> + <parameter type-id='type-id-225' name='t' filepath='Python/pytime.c' line='1325' column='1'/> + <parameter type-id='type-id-226' name='tm' filepath='Python/pytime.c' line='1325' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyDeadline_Init' mangled-name='_PyDeadline_Init' filepath='Python/pytime.c' line='1353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyDeadline_Init'> + <parameter type-id='type-id-213' name='timeout' filepath='Python/pytime.c' line='1353' column='1'/> + <return type-id='type-id-213'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/specialize.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyDictKeys_GetVersionForCurrentState' filepath='./Include/internal/pycore_dict.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-28'/> + <parameter type-id='type-id-415'/> + <return type-id='type-id-326'/> + </function-decl> + <function-decl name='_PyDict_LookupIndex' filepath='./Include/internal/pycore_dict.h' line='106' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-335'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyDictKeys_StringLookup' filepath='./Include/internal/pycore_dict.h' line='107' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-415'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-7'/> + </function-decl> + <function-decl name='_PyFunction_GetVersionForCurrentState' filepath='./Include/internal/pycore_function.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-308'/> + <return type-id='type-id-326'/> + </function-decl> + <function-decl name='_Py_slot_tp_getattro' filepath='./Include/internal/pycore_typeobject.h' line='217' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_Py_slot_tp_getattr_hook' filepath='./Include/internal/pycore_typeobject.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-4'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/suggestions.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_Py_UTF8_Edit_Cost' mangled-name='_Py_UTF8_Edit_Cost' filepath='Python/suggestions.c' line='180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Py_UTF8_Edit_Cost'> + <parameter type-id='type-id-4' name='a' filepath='Python/suggestions.c' line='180' column='1'/> + <parameter type-id='type-id-4' name='b' filepath='Python/suggestions.c' line='180' column='1'/> + <parameter type-id='type-id-7' name='max_cost' filepath='Python/suggestions.c' line='180' column='1'/> + <return type-id='type-id-7'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/symtable.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <var-decl name='PySTEntry_Type' type-id='type-id-266' visibility='default' filepath='./Include/internal/pycore_symtable.h' line='137' column='1'/> + </abi-instr> + <abi-instr address-size='64' path='Python/thread.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <array-type-def dimensions='1' type-id='type-id-53' size-in-bits='448' id='type-id-1776'> + <subrange length='56' type-id='type-id-2' id='type-id-1777'/> + </array-type-def> + <typedef-decl name='PyThread_handle_t' type-id='type-id-1778' filepath='./Include/internal/pycore_pythread.h' line='120' column='1' id='type-id-1779'/> + <typedef-decl name='Py_uintptr_t' type-id='type-id-427' filepath='./Include/pyport.h' line='116' column='1' id='type-id-1778'/> + <typedef-decl name='pthread_t' type-id='type-id-2' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='27' column='1' id='type-id-208'/> + <union-decl name='pthread_attr_t' size-in-bits='448' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='56' column='1' id='type-id-1780'> + <data-member access='public'> + <var-decl name='__size' type-id='type-id-1776' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='58' column='1'/> + </data-member> + <data-member access='public'> + <var-decl name='__align' type-id='type-id-183' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='59' column='1'/> + </data-member> + </union-decl> + <typedef-decl name='pthread_attr_t' type-id='type-id-1780' filepath='/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h' line='62' column='1' id='type-id-1781'/> + <pointer-type-def type-id='type-id-1779' size-in-bits='64' id='type-id-1782'/> + <pointer-type-def type-id='type-id-1667' size-in-bits='64' id='type-id-1783'/> + <qualified-type-def type-id='type-id-377' const='yes' id='type-id-1784'/> + <qualified-type-def type-id='type-id-1781' const='yes' id='type-id-1785'/> + <pointer-type-def type-id='type-id-1785' size-in-bits='64' id='type-id-1786'/> + <qualified-type-def type-id='type-id-1786' restrict='yes' id='type-id-1787'/> + <qualified-type-def type-id='type-id-1314' const='yes' id='type-id-1788'/> + <pointer-type-def type-id='type-id-1788' size-in-bits='64' id='type-id-1789'/> + <qualified-type-def type-id='type-id-1789' restrict='yes' id='type-id-1790'/> + <pointer-type-def type-id='type-id-377' size-in-bits='64' id='type-id-1791'/> + <pointer-type-def type-id='type-id-1781' size-in-bits='64' id='type-id-1792'/> + <pointer-type-def type-id='type-id-208' size-in-bits='64' id='type-id-1793'/> + <qualified-type-def type-id='type-id-1793' restrict='yes' id='type-id-1794'/> + <pointer-type-def type-id='type-id-1795' size-in-bits='64' id='type-id-1796'/> + <var-decl name='PY_TIMEOUT_MAX' type-id='type-id-1784' mangled-name='PY_TIMEOUT_MAX' visibility='default' filepath='./Include/cpython/pythread.h' line='11' column='1' elf-symbol-id='PY_TIMEOUT_MAX'/> + <function-decl name='_PyTime_FromMicrosecondsClamp' filepath='./Include/internal/pycore_time.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-213'/> + <return type-id='type-id-213'/> + </function-decl> + <function-decl name='pthread_create' filepath='/usr/include/pthread.h' line='202' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1794'/> + <parameter type-id='type-id-1787'/> + <parameter type-id='type-id-1796'/> + <parameter type-id='type-id-232'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_exit' filepath='/usr/include/pthread.h' line='211' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='pthread_join' filepath='/usr/include/pthread.h' line='219' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-208'/> + <parameter type-id='type-id-262'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_detach' filepath='/usr/include/pthread.h' line='269' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-208'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_self' filepath='/usr/include/pthread.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-208'/> + </function-decl> + <function-decl name='pthread_attr_init' filepath='/usr/include/pthread.h' line='285' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_attr_destroy' filepath='/usr/include/pthread.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_attr_setscope' filepath='/usr/include/pthread.h' line='349' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> + <parameter type-id='type-id-5'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_attr_setstacksize' filepath='/usr/include/pthread.h' line='373' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1792'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_cond_init' filepath='/usr/include/pthread.h' line='1112' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1560'/> + <parameter type-id='type-id-1790'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_condattr_init' filepath='/usr/include/pthread.h' line='1194' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1313'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_condattr_setclock' filepath='/usr/include/pthread.h' line='1219' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1313'/> + <parameter type-id='type-id-187'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_key_delete' filepath='/usr/include/pthread.h' line='1302' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-507'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='pthread_getspecific' filepath='/usr/include/pthread.h' line='1305' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-507'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='sem_trywait' filepath='/usr/include/semaphore.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-1733'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='perror' filepath='/usr/include/stdio.h' line='804' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-6'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='confstr' filepath='/usr/include/unistd.h' line='644' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <parameter type-id='type-id-17'/> + <parameter type-id='type-id-21'/> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='__sysconf' filepath='/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h' line='24' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-5'/> + <return type-id='type-id-183'/> + </function-decl> + <function-decl name='PyThread_get_stacksize' mangled-name='PyThread_get_stacksize' filepath='Python/thread.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_stacksize'> + <return type-id='type-id-21'/> + </function-decl> + <function-decl name='PyThread_set_stacksize' mangled-name='PyThread_set_stacksize' filepath='Python/thread.c' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_set_stacksize'> + <parameter type-id='type-id-21' name='size' filepath='Python/thread.c' line='86' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_ParseTimeoutArg' mangled-name='PyThread_ParseTimeoutArg' filepath='Python/thread.c' line='97' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_ParseTimeoutArg'> + <parameter type-id='type-id-4' name='arg' filepath='Python/thread.c' line='97' column='1'/> + <parameter type-id='type-id-5' name='blocking' filepath='Python/thread.c' line='97' column='1'/> + <parameter type-id='type-id-1791' name='timeout_p' filepath='Python/thread.c' line='97' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_acquire_lock_timed_with_retries' mangled-name='PyThread_acquire_lock_timed_with_retries' filepath='Python/thread.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock_timed_with_retries'> + <parameter type-id='type-id-1154' name='lock' filepath='Python/thread.c' line='131' column='1'/> + <parameter type-id='type-id-377' name='timeout' filepath='Python/thread.c' line='132' column='1'/> + <return type-id='type-id-480'/> + </function-decl> + <function-decl name='PyThread_tss_alloc' mangled-name='PyThread_tss_alloc' filepath='Python/thread.c' line='185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_alloc'> + <return type-id='type-id-1767'/> + </function-decl> + <function-decl name='PyThread_tss_free' mangled-name='PyThread_tss_free' filepath='Python/thread.c' line='196' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_tss_free'> + <parameter type-id='type-id-1767' name='key' filepath='Python/thread.c' line='196' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_start_joinable_thread' mangled-name='PyThread_start_joinable_thread' filepath='Python/thread_pthread.h' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_start_joinable_thread'> + <parameter type-id='type-id-510' name='func' filepath='Python/thread_pthread.h' line='311' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Python/thread_pthread.h' line='311' column='1'/> + <parameter type-id='type-id-1783' name='ident' filepath='Python/thread_pthread.h' line='312' column='1'/> + <parameter type-id='type-id-1782' name='handle' filepath='Python/thread_pthread.h' line='312' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_start_new_thread' mangled-name='PyThread_start_new_thread' filepath='Python/thread_pthread.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_start_new_thread'> + <parameter type-id='type-id-510' name='func' filepath='Python/thread_pthread.h' line='325' column='1'/> + <parameter type-id='type-id-30' name='arg' filepath='Python/thread_pthread.h' line='325' column='1'/> + <return type-id='type-id-2'/> + </function-decl> + <function-decl name='PyThread_join_thread' mangled-name='PyThread_join_thread' filepath='Python/thread_pthread.h' line='340' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_join_thread'> + <parameter type-id='type-id-1779' name='th' filepath='Python/thread_pthread.h' line='340' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_detach_thread' mangled-name='PyThread_detach_thread' filepath='Python/thread_pthread.h' line='345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_detach_thread'> + <parameter type-id='type-id-1779' name='th' filepath='Python/thread_pthread.h' line='345' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_acquire_lock_timed' mangled-name='PyThread_acquire_lock_timed' filepath='Python/thread_pthread.h' line='482' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_acquire_lock_timed'> + <parameter type-id='type-id-1154' name='lock' filepath='Python/thread_pthread.h' line='482' column='1'/> + <parameter type-id='type-id-377' name='microseconds' filepath='Python/thread_pthread.h' line='482' column='1'/> + <parameter type-id='type-id-5' name='intr_flag' filepath='Python/thread_pthread.h' line='483' column='1'/> + <return type-id='type-id-480'/> + </function-decl> + <function-decl name='PyThread_create_key' mangled-name='PyThread_create_key' filepath='Python/thread_pthread.h' line='867' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_create_key'> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_delete_key' mangled-name='PyThread_delete_key' filepath='Python/thread_pthread.h' line='887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_delete_key'> + <parameter type-id='type-id-5' name='key' filepath='Python/thread_pthread.h' line='887' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_delete_key_value' mangled-name='PyThread_delete_key_value' filepath='Python/thread_pthread.h' line='895' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_delete_key_value'> + <parameter type-id='type-id-5' name='key' filepath='Python/thread_pthread.h' line='895' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + <function-decl name='PyThread_set_key_value' mangled-name='PyThread_set_key_value' filepath='Python/thread_pthread.h' line='903' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_set_key_value'> + <parameter type-id='type-id-5' name='key' filepath='Python/thread_pthread.h' line='903' column='1'/> + <parameter type-id='type-id-30' name='value' filepath='Python/thread_pthread.h' line='903' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyThread_get_key_value' mangled-name='PyThread_get_key_value' filepath='Python/thread_pthread.h' line='914' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_get_key_value'> + <parameter type-id='type-id-5' name='key' filepath='Python/thread_pthread.h' line='914' column='1'/> + <return type-id='type-id-30'/> + </function-decl> + <function-decl name='PyThread_ReInitTLS' mangled-name='PyThread_ReInitTLS' filepath='Python/thread_pthread.h' line='925' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyThread_ReInitTLS'> + <return type-id='type-id-3'/> + </function-decl> + <function-type size-in-bits='64' id='type-id-1795'> + <parameter type-id='type-id-30'/> + <return type-id='type-id-30'/> + </function-type> + </abi-instr> + <abi-instr address-size='64' path='Python/traceback.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='_PyObject_CallMethodFormat' filepath='./Include/internal/pycore_call.h' line='54' column='1' visibility='default' binding='global' size-in-bits='64'> + <parameter type-id='type-id-27'/> + <parameter type-id='type-id-4'/> + <parameter type-id='type-id-6'/> + <parameter is-variadic='yes'/> + <return type-id='type-id-4'/> + </function-decl> + <function-decl name='_PyGILState_GetInterpreterStateUnsafe' filepath='./Include/internal/pycore_pystate.h' line='280' column='1' visibility='default' binding='global' size-in-bits='64'> + <return type-id='type-id-28'/> + </function-decl> + <var-decl name='PyTraceBack_Type' type-id='type-id-266' mangled-name='PyTraceBack_Type' visibility='default' filepath='./Include/traceback.h' line='13' column='1' elf-symbol-id='PyTraceBack_Type'/> + <function-decl name='_PyTraceback_Add' mangled-name='_PyTraceback_Add' filepath='Python/traceback.c' line='280' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceback_Add'> + <parameter type-id='type-id-6' name='funcname' filepath='Python/traceback.c' line='280' column='1'/> + <parameter type-id='type-id-6' name='filename' filepath='Python/traceback.c' line='280' column='1'/> + <parameter type-id='type-id-5' name='lineno' filepath='Python/traceback.c' line='280' column='1'/> + <return type-id='type-id-3'/> + </function-decl> + </abi-instr> + <abi-instr address-size='64' path='Python/tracemalloc.c' comp-dir-path='/home/runner/work/cpython/cpython' language='LANG_C11'> + <function-decl name='PyTraceMalloc_Track' mangled-name='PyTraceMalloc_Track' filepath='Python/tracemalloc.c' line='1307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Track'> + <parameter type-id='type-id-101' name='domain' filepath='Python/tracemalloc.c' line='1307' column='1'/> + <parameter type-id='type-id-427' name='ptr' filepath='Python/tracemalloc.c' line='1307' column='1'/> + <parameter type-id='type-id-21' name='size' filepath='Python/tracemalloc.c' line='1308' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='PyTraceMalloc_Untrack' mangled-name='PyTraceMalloc_Untrack' filepath='Python/tracemalloc.c' line='1330' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='PyTraceMalloc_Untrack'> + <parameter type-id='type-id-101' name='domain' filepath='Python/tracemalloc.c' line='1330' column='1'/> + <parameter type-id='type-id-427' name='ptr' filepath='Python/tracemalloc.c' line='1330' column='1'/> + <return type-id='type-id-5'/> + </function-decl> + <function-decl name='_PyTraceMalloc_GetTraceback' mangled-name='_PyTraceMalloc_GetTraceback' filepath='Python/tracemalloc.c' line='1396' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_PyTraceMalloc_GetTraceback'> + <parameter type-id='type-id-101' name='domain' filepath='Python/tracemalloc.c' line='1396' column='1'/> + <parameter type-id='type-id-427' name='ptr' filepath='Python/tracemalloc.c' line='1396' column='1'/> + <return type-id='type-id-4'/> + </function-decl> + </abi-instr> +</abi-corpus> diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index ee64ffdc..e5bb0bf7 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -180,7 +180,7 @@ PyCapsule_IsValid:const char*:name:: PyCapsule_New:PyObject*::+1: PyCapsule_New:void*:pointer:: PyCapsule_New:const char *:name:: -PyCapsule_New::void (* destructor)(PyObject* ):: +PyCapsule_New:void (*)(PyObject *):destructor:: PyCapsule_SetContext:int::: PyCapsule_SetContext:PyObject*:self:0: @@ -349,11 +349,11 @@ PyComplex_CheckExact:int::: PyComplex_CheckExact:PyObject*:p:0: PyComplex_FromCComplex:PyObject*::+1: -PyComplex_FromCComplex::Py_complex v:: +PyComplex_FromCComplex:Py_complex:v:: PyComplex_FromDoubles:PyObject*::+1: -PyComplex_FromDoubles::double real:: -PyComplex_FromDoubles::double imag:: +PyComplex_FromDoubles:double:real:: +PyComplex_FromDoubles:double:imag:: PyComplex_ImagAsDouble:double::: PyComplex_ImagAsDouble:PyObject*:op:0: @@ -402,6 +402,21 @@ PyContextVar_Reset:int::: PyContextVar_Reset:PyObject*:var:0: PyContextVar_Reset:PyObject*:token:-1: +PyCFunction_New:PyObject*::+1: +PyCFunction_New:PyMethodDef*:ml:: +PyCFunction_New:PyObject*:self:+1: + +PyCFunction_NewEx:PyObject*::+1: +PyCFunction_NewEx:PyMethodDef*:ml:: +PyCFunction_NewEx:PyObject*:self:+1: +PyCFunction_NewEx:PyObject*:module:+1: + +PyCMethod_New:PyObject*::+1: +PyCMethod_New:PyMethodDef*:ml:: +PyCMethod_New:PyObject*:self:+1: +PyCMethod_New:PyObject*:module:+1: +PyCMethod_New:PyObject*:cls:+1: + PyDate_Check:int::: PyDate_Check:PyObject*:ob:0: @@ -607,7 +622,9 @@ PyErr_GetExcInfo:PyObject**:pvalue:+1: PyErr_GetExcInfo:PyObject**:ptraceback:+1: PyErr_GetRaisedException:PyObject*::+1: -PyErr_SetRaisedException:::: + +PyErr_SetRaisedException:void::: +PyErr_SetRaisedException:PyObject *:exc:0:stolen PyErr_GivenExceptionMatches:int::: PyErr_GivenExceptionMatches:PyObject*:given:0: @@ -627,9 +644,9 @@ PyErr_NewExceptionWithDoc:PyObject*:dict:0: PyErr_NoMemory:PyObject*::null: PyErr_NormalizeException:void::: -PyErr_NormalizeException:PyObject**:exc::??? -PyErr_NormalizeException:PyObject**:val::??? -PyErr_NormalizeException:PyObject**:tb::??? +PyErr_NormalizeException:PyObject**:exc:+1:??? +PyErr_NormalizeException:PyObject**:val:+1:??? +PyErr_NormalizeException:PyObject**:tb:+1:??? PyErr_Occurred:PyObject*::0: @@ -764,8 +781,6 @@ PyErr_WarnFormat::...:: PyErr_WriteUnraisable:void::: PyErr_WriteUnraisable:PyObject*:obj:0: -PyEval_AcquireLock:void::: - PyEval_AcquireThread:void::: PyEval_AcquireThread:PyThreadState*:tstate:: @@ -777,16 +792,18 @@ PyEval_GetGlobals:PyObject*::0: PyEval_GetFrame:PyObject*::0: +PyEval_GetFrameBuiltins:PyObject*::+1: + +PyEval_GetFrameLocals:PyObject*::+1: + +PyEval_GetFrameGlobals:PyObject*::+1: + PyEval_GetFuncDesc:const char*::: PyEval_GetFuncDesc:PyObject*:func:0: PyEval_GetFuncName:const char*::: PyEval_GetFuncName:PyObject*:func:0: -PyEval_InitThreads:void::: - -PyEval_ReleaseLock:void::: - PyEval_ReleaseThread:void::: PyEval_ReleaseThread:PyThreadState*:tstate:: @@ -907,6 +924,32 @@ PyFloat_FromString:PyObject*:str:0: PyFloat_GetInfo:PyObject*::+1: PyFloat_GetInfo::void:: +PyFrame_GetBack:PyObject*::+1: +PyFrame_GetBack:PyFrameObject*:frame:0: + +PyFrame_GetBuiltins:PyObject*::+1: +PyFrame_GetBuiltins:PyFrameObject*:frame:0: + +PyFrame_GetCode:PyObject*::+1: +PyFrame_GetCode:PyFrameObject*:frame:0: + +PyFrame_GetGenerator:PyObject*::+1: +PyFrame_GetGenerator:PyFrameObject*:frame:0: + +PyFrame_GetGlobals:PyObject*::+1: +PyFrame_GetGlobals:PyFrameObject*:frame:0: + +PyFrame_GetLocals:PyObject*::+1: +PyFrame_GetLocals:PyFrameObject*:frame:0: + +PyFrame_GetVar:PyObject*::+1: +PyFrame_GetVar:PyFrameObject*:frame:0: +PyFrame_GetVar:PyObject*:name:0: + +PyFrame_GetVarString:PyObject*::+1: +PyFrame_GetVarString:PyFrameObject*:frame:0: +PyFrame_GetVarString:const char*:name:: + PyFrozenSet_Check:int::: PyFrozenSet_Check:PyObject*:p:0: @@ -980,6 +1023,9 @@ PyCoro_New:PyFrameObject*:frame:0: PyCoro_New:PyObject*:name:0: PyCoro_New:PyObject*:qualname:0: +PyImport_AddModuleRef:PyObject*::+1: +PyImport_AddModuleRef:const char*:name:: + PyImport_AddModule:PyObject*::0:reference borrowed from sys.modules PyImport_AddModule:const char*:name:: @@ -1121,6 +1167,10 @@ PyList_GetItem:PyObject*::0: PyList_GetItem:PyObject*:list:0: PyList_GetItem:Py_ssize_t:index:: +PyList_GetItemRef:PyObject*::+1: +PyList_GetItemRef:PyObject*:list:0: +PyList_GetItemRef:Py_ssize_t:index:: + PyList_GetSlice:PyObject*::+1: PyList_GetSlice:PyObject*:list:0: PyList_GetSlice:Py_ssize_t:low:: @@ -1253,7 +1303,7 @@ PyMapping_GetItemString:const char*:key:: PyMapping_HasKey:int::: PyMapping_HasKey:PyObject*:o:0: -PyMapping_HasKey:PyObject*:key:: +PyMapping_HasKey:PyObject*:key:0: PyMapping_HasKeyString:int::: PyMapping_HasKeyString:PyObject*:o:0: @@ -1413,7 +1463,7 @@ PyModule_GetState:void*::: PyModule_GetState:PyObject*:module:0: PyModule_New:PyObject*::+1: -PyModule_New::char* name:: +PyModule_New:char*:name:: PyModule_NewObject:PyObject*::+1: PyModule_NewObject:PyObject*:name:+1: @@ -1423,7 +1473,7 @@ PyModule_SetDocString:PyObject*:module:0: PyModule_SetDocString:const char*:docstring:: PyModuleDef_Init:PyObject*::0: -PyModuleDef_Init:PyModuleDef*:def:0: +PyModuleDef_Init:PyModuleDef*:def:: PyNumber_Absolute:PyObject*::+1: PyNumber_Absolute:PyObject*:o:0: @@ -1584,21 +1634,6 @@ PyOS_FSPath:PyObject*:path:0: PyObject_ASCII:PyObject*::+1: PyObject_ASCII:PyObject*:o:0: -PyObject_AsCharBuffer:int::: -PyObject_AsCharBuffer:PyObject*:obj:0: -PyObject_AsCharBuffer:const char**:buffer:: -PyObject_AsCharBuffer:Py_ssize_t*:buffer_len:: - -PyObject_AsReadBuffer:int::: -PyObject_AsReadBuffer:PyObject*:obj:0: -PyObject_AsReadBuffer:const void**:buffer:: -PyObject_AsReadBuffer:Py_ssize_t*:buffer_len:: - -PyObject_AsWriteBuffer:int::: -PyObject_AsWriteBuffer:PyObject*:obj:0: -PyObject_AsWriteBuffer:void**:buffer:: -PyObject_AsWriteBuffer:Py_ssize_t*:buffer_len:: - PyObject_Bytes:PyObject*::+1: PyObject_Bytes:PyObject*:o:0: @@ -1607,6 +1642,13 @@ PyObject_Call:PyObject*:callable_object:0: PyObject_Call:PyObject*:args:0: PyObject_Call:PyObject*:kw:0: +PyObject_CallNoArgs:PyObject*::+1: +PyObject_CallNoArgs:PyObject*:callable_object:0: + +PyObject_CallOneArg:PyObject*::+1: +PyObject_CallOneArg:PyObject*:callable_object:0: +PyObject_CallOneArg:PyObject*:arg:0: + PyObject_CallFunction:PyObject*::+1: PyObject_CallFunction:PyObject*:callable_object:0: PyObject_CallFunction:const char*:format:: @@ -1815,6 +1857,9 @@ PyObject_Size:PyObject*:o:0: PyObject_Str:PyObject*::+1: PyObject_Str:PyObject*:o:0: +Py_TYPE:PyObject*::0: +Py_TYPE:PyObject*:ob:0: + PyObject_Type:PyObject*::+1: PyObject_Type:PyObject*:o:0: @@ -1928,10 +1973,10 @@ PyRun_StringFlags:PyObject*:locals:0: PyRun_StringFlags:PyCompilerFlags*:flags:: PySeqIter_Check:int::: -PySeqIter_Check::op:: +PySeqIter_Check:PyObject *:op:0: PySeqIter_New:PyObject*::+1: -PySeqIter_New:PyObject*:seq:: +PySeqIter_New:PyObject*:seq:0: PySequence_Check:int::: PySequence_Check:PyObject*:o:0: @@ -2371,79 +2416,59 @@ PyUnicode_GET_DATA_SIZE:PyObject*:o:0: PyUnicode_KIND:int::: PyUnicode_KIND:PyObject*:o:0: -PyUnicode_MAX_CHAR_VALUE:::: +PyUnicode_MAX_CHAR_VALUE:Py_UCS4::: PyUnicode_MAX_CHAR_VALUE:PyObject*:o:0: -PyUnicode_AS_UNICODE:Py_UNICODE*::: -PyUnicode_AS_UNICODE:PyObject*:o:0: - -PyUnicode_AS_DATA:const char*::: -PyUnicode_AS_DATA:PyObject*:o:0: - Py_UNICODE_ISALNUM:int::: -Py_UNICODE_ISALNUM:Py_UNICODE:ch:: +Py_UNICODE_ISALNUM:Py_UCS4:ch:: Py_UNICODE_ISALPHA:int::: -Py_UNICODE_ISALPHA:Py_UNICODE:ch:: +Py_UNICODE_ISALPHA:Py_UCS4:ch:: Py_UNICODE_ISSPACE:int::: -Py_UNICODE_ISSPACE:Py_UNICODE:ch:: +Py_UNICODE_ISSPACE:Py_UCS4:ch:: Py_UNICODE_ISLOWER:int::: -Py_UNICODE_ISLOWER:Py_UNICODE:ch:: +Py_UNICODE_ISLOWER:Py_UCS4:ch:: Py_UNICODE_ISUPPER:int::: -Py_UNICODE_ISUPPER:Py_UNICODE:ch:: +Py_UNICODE_ISUPPER:Py_UCS4:ch:: Py_UNICODE_ISTITLE:int::: -Py_UNICODE_ISTITLE:Py_UNICODE:ch:: +Py_UNICODE_ISTITLE:Py_UCS4:ch:: Py_UNICODE_ISLINEBREAK:int::: -Py_UNICODE_ISLINEBREAK:Py_UNICODE:ch:: +Py_UNICODE_ISLINEBREAK:Py_UCS4:ch:: Py_UNICODE_ISDECIMAL:int::: -Py_UNICODE_ISDECIMAL:Py_UNICODE:ch:: +Py_UNICODE_ISDECIMAL:Py_UCS4:ch:: Py_UNICODE_ISDIGIT:int::: -Py_UNICODE_ISDIGIT:Py_UNICODE:ch:: +Py_UNICODE_ISDIGIT:Py_UCS4:ch:: Py_UNICODE_ISNUMERIC:int::: -Py_UNICODE_ISNUMERIC:Py_UNICODE:ch:: +Py_UNICODE_ISNUMERIC:Py_UCS4:ch:: Py_UNICODE_ISPRINTABLE:int::: -Py_UNICODE_ISPRINTABLE:Py_UNICODE:ch:: +Py_UNICODE_ISPRINTABLE:Py_UCS4:ch:: -Py_UNICODE_TOLOWER:Py_UNICODE::: -Py_UNICODE_TOLOWER:Py_UNICODE:ch:: +Py_UNICODE_TOLOWER:Py_UCS4::: +Py_UNICODE_TOLOWER:Py_UCS4:ch:: -Py_UNICODE_TOUPPER:Py_UNICODE::: -Py_UNICODE_TOUPPER:Py_UNICODE:ch:: +Py_UNICODE_TOUPPER:Py_UCS4::: +Py_UNICODE_TOUPPER:Py_UCS4:ch:: -Py_UNICODE_TOTITLE:Py_UNICODE::: -Py_UNICODE_TOTITLE:Py_UNICODE:ch:: +Py_UNICODE_TOTITLE:Py_UCS4::: +Py_UNICODE_TOTITLE:Py_UCS4:ch:: Py_UNICODE_TODECIMAL:int::: -Py_UNICODE_TODECIMAL:Py_UNICODE:ch:: +Py_UNICODE_TODECIMAL:Py_UCS4:ch:: Py_UNICODE_TODIGIT:int::: -Py_UNICODE_TODIGIT:Py_UNICODE:ch:: +Py_UNICODE_TODIGIT:Py_UCS4:ch:: Py_UNICODE_TONUMERIC:double::: -Py_UNICODE_TONUMERIC:Py_UNICODE:ch:: - -PyUnicode_FromUnicode:PyObject*::+1: -PyUnicode_FromUnicode:const Py_UNICODE*:u:: -PyUnicode_FromUnicode:Py_ssize_t:size:: - -PyUnicode_AsUnicode:Py_UNICODE*::: -PyUnicode_AsUnicode:PyObject*:unicode:0: - -PyUnicode_AsUnicodeAndSize:Py_UNICODE*::: -PyUnicode_AsUnicodeAndSize:PyObject*:unicode:0: -PyUnicode_AsUnicodeAndSize:Py_ssize_t*:size:: - -PyUnicode_GetSize:Py_ssize_t::: -PyUnicode_GetSize:PyObject*:unicode:0: +Py_UNICODE_TONUMERIC:Py_UCS4:ch:: PyUnicode_FromObject:PyObject*::+1: PyUnicode_FromObject:PyObject*:obj:0: @@ -2458,7 +2483,7 @@ PyUnicode_FromWideChar:const wchar_t*:w:: PyUnicode_FromWideChar:Py_ssize_t:size:: PyUnicode_AsWideChar:Py_ssize_t::: -PyUnicode_AsWideChar:PyObject*:*unicode:0: +PyUnicode_AsWideChar:PyObject*:unicode:0: PyUnicode_AsWideChar:wchar_t*:w:: PyUnicode_AsWideChar:Py_ssize_t:size:: @@ -2511,7 +2536,7 @@ PyUnicode_AsUTF8String:PyObject*:unicode:0: PyUnicode_AsUTF8AndSize:const char*::: PyUnicode_AsUTF8AndSize:PyObject*:unicode:0: -PyUnicode_AsUTF8AndSize:Py_ssize_t*:size:0: +PyUnicode_AsUTF8AndSize:Py_ssize_t*:size:: PyUnicode_AsUTF8:const char*::: PyUnicode_AsUTF8:PyObject*:unicode:0: @@ -2834,13 +2859,13 @@ PyUnicodeDecodeError_SetStart:PyObject*:exc:0: PyUnicodeDecodeError_SetStart:Py_ssize_t:start:: PyWeakref_Check:int::: -PyWeakref_Check:PyObject*:ob:: +PyWeakref_Check:PyObject*:ob:0: PyWeakref_CheckProxy:int::: -PyWeakref_CheckProxy:PyObject*:ob:: +PyWeakref_CheckProxy:PyObject*:ob:0: PyWeakref_CheckRef:int::: -PyWeakref_CheckRef:PyObject*:ob:: +PyWeakref_CheckRef:PyObject*:ob:0: PyWeakref_GET_OBJECT:PyObject*::0: PyWeakref_GET_OBJECT:PyObject*:ref:0: @@ -2848,6 +2873,10 @@ PyWeakref_GET_OBJECT:PyObject*:ref:0: PyWeakref_GetObject:PyObject*::0: PyWeakref_GetObject:PyObject*:ref:0: +PyWeakref_GetRef:int::: +PyWeakref_GetRef:PyObject*:ref:0: +PyWeakref_GetRef:PyObject**:pobj:+1: + PyWeakref_NewProxy:PyObject*::+1: PyWeakref_NewProxy:PyObject*:ob:0: PyWeakref_NewProxy:PyObject*:callback:0: diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index f112d268..75bc5ea9 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -1,868 +1,887 @@ role,name,added,ifdef_note,struct_abi_kind macro,PY_VECTORCALL_ARGUMENTS_OFFSET,3.12,, -function,PyAIter_Check,3.10,, -function,PyArg_Parse,3.2,, -function,PyArg_ParseTuple,3.2,, -function,PyArg_ParseTupleAndKeywords,3.2,, -function,PyArg_UnpackTuple,3.2,, -function,PyArg_VaParse,3.2,, -function,PyArg_VaParseTupleAndKeywords,3.2,, -function,PyArg_ValidateKeywordArguments,3.2,, -var,PyBaseObject_Type,3.2,, -function,PyBool_FromLong,3.2,, -var,PyBool_Type,3.2,, -function,PyBuffer_FillContiguousStrides,3.11,, -function,PyBuffer_FillInfo,3.11,, -function,PyBuffer_FromContiguous,3.11,, -function,PyBuffer_GetPointer,3.11,, -function,PyBuffer_IsContiguous,3.11,, -function,PyBuffer_Release,3.11,, -function,PyBuffer_SizeFromFormat,3.11,, -function,PyBuffer_ToContiguous,3.11,, -var,PyByteArrayIter_Type,3.2,, -function,PyByteArray_AsString,3.2,, -function,PyByteArray_Concat,3.2,, -function,PyByteArray_FromObject,3.2,, -function,PyByteArray_FromStringAndSize,3.2,, -function,PyByteArray_Resize,3.2,, -function,PyByteArray_Size,3.2,, -var,PyByteArray_Type,3.2,, -var,PyBytesIter_Type,3.2,, -function,PyBytes_AsString,3.2,, -function,PyBytes_AsStringAndSize,3.2,, -function,PyBytes_Concat,3.2,, -function,PyBytes_ConcatAndDel,3.2,, -function,PyBytes_DecodeEscape,3.2,, -function,PyBytes_FromFormat,3.2,, -function,PyBytes_FromFormatV,3.2,, -function,PyBytes_FromObject,3.2,, -function,PyBytes_FromString,3.2,, -function,PyBytes_FromStringAndSize,3.2,, -function,PyBytes_Repr,3.2,, -function,PyBytes_Size,3.2,, -var,PyBytes_Type,3.2,, +func,PyAIter_Check,3.10,, +func,PyArg_Parse,3.2,, +func,PyArg_ParseTuple,3.2,, +func,PyArg_ParseTupleAndKeywords,3.2,, +func,PyArg_UnpackTuple,3.2,, +func,PyArg_VaParse,3.2,, +func,PyArg_VaParseTupleAndKeywords,3.2,, +func,PyArg_ValidateKeywordArguments,3.2,, +data,PyBaseObject_Type,3.2,, +func,PyBool_FromLong,3.2,, +data,PyBool_Type,3.2,, +func,PyBuffer_FillContiguousStrides,3.11,, +func,PyBuffer_FillInfo,3.11,, +func,PyBuffer_FromContiguous,3.11,, +func,PyBuffer_GetPointer,3.11,, +func,PyBuffer_IsContiguous,3.11,, +func,PyBuffer_Release,3.11,, +func,PyBuffer_SizeFromFormat,3.11,, +func,PyBuffer_ToContiguous,3.11,, +data,PyByteArrayIter_Type,3.2,, +func,PyByteArray_AsString,3.2,, +func,PyByteArray_Concat,3.2,, +func,PyByteArray_FromObject,3.2,, +func,PyByteArray_FromStringAndSize,3.2,, +func,PyByteArray_Resize,3.2,, +func,PyByteArray_Size,3.2,, +data,PyByteArray_Type,3.2,, +data,PyBytesIter_Type,3.2,, +func,PyBytes_AsString,3.2,, +func,PyBytes_AsStringAndSize,3.2,, +func,PyBytes_Concat,3.2,, +func,PyBytes_ConcatAndDel,3.2,, +func,PyBytes_DecodeEscape,3.2,, +func,PyBytes_FromFormat,3.2,, +func,PyBytes_FromFormatV,3.2,, +func,PyBytes_FromObject,3.2,, +func,PyBytes_FromString,3.2,, +func,PyBytes_FromStringAndSize,3.2,, +func,PyBytes_Repr,3.2,, +func,PyBytes_Size,3.2,, +data,PyBytes_Type,3.2,, type,PyCFunction,3.2,, +type,PyCFunctionFast,3.13,, +type,PyCFunctionFastWithKeywords,3.13,, type,PyCFunctionWithKeywords,3.2,, -function,PyCFunction_Call,3.2,, -function,PyCFunction_GetFlags,3.2,, -function,PyCFunction_GetFunction,3.2,, -function,PyCFunction_GetSelf,3.2,, -function,PyCFunction_New,3.4,, -function,PyCFunction_NewEx,3.2,, -var,PyCFunction_Type,3.2,, -function,PyCMethod_New,3.9,, -function,PyCallIter_New,3.2,, -var,PyCallIter_Type,3.2,, -function,PyCallable_Check,3.2,, +func,PyCFunction_GetFlags,3.2,, +func,PyCFunction_GetFunction,3.2,, +func,PyCFunction_GetSelf,3.2,, +func,PyCFunction_New,3.4,, +func,PyCFunction_NewEx,3.2,, +data,PyCFunction_Type,3.2,, +func,PyCMethod_New,3.9,, +func,PyCallIter_New,3.2,, +data,PyCallIter_Type,3.2,, +func,PyCallable_Check,3.2,, type,PyCapsule_Destructor,3.2,, -function,PyCapsule_GetContext,3.2,, -function,PyCapsule_GetDestructor,3.2,, -function,PyCapsule_GetName,3.2,, -function,PyCapsule_GetPointer,3.2,, -function,PyCapsule_Import,3.2,, -function,PyCapsule_IsValid,3.2,, -function,PyCapsule_New,3.2,, -function,PyCapsule_SetContext,3.2,, -function,PyCapsule_SetDestructor,3.2,, -function,PyCapsule_SetName,3.2,, -function,PyCapsule_SetPointer,3.2,, -var,PyCapsule_Type,3.2,, -var,PyClassMethodDescr_Type,3.2,, -function,PyCodec_BackslashReplaceErrors,3.2,, -function,PyCodec_Decode,3.2,, -function,PyCodec_Decoder,3.2,, -function,PyCodec_Encode,3.2,, -function,PyCodec_Encoder,3.2,, -function,PyCodec_IgnoreErrors,3.2,, -function,PyCodec_IncrementalDecoder,3.2,, -function,PyCodec_IncrementalEncoder,3.2,, -function,PyCodec_KnownEncoding,3.2,, -function,PyCodec_LookupError,3.2,, -function,PyCodec_NameReplaceErrors,3.7,, -function,PyCodec_Register,3.2,, -function,PyCodec_RegisterError,3.2,, -function,PyCodec_ReplaceErrors,3.2,, -function,PyCodec_StreamReader,3.2,, -function,PyCodec_StreamWriter,3.2,, -function,PyCodec_StrictErrors,3.2,, -function,PyCodec_Unregister,3.10,, -function,PyCodec_XMLCharRefReplaceErrors,3.2,, -function,PyComplex_FromDoubles,3.2,, -function,PyComplex_ImagAsDouble,3.2,, -function,PyComplex_RealAsDouble,3.2,, -var,PyComplex_Type,3.2,, -function,PyDescr_NewClassMethod,3.2,, -function,PyDescr_NewGetSet,3.2,, -function,PyDescr_NewMember,3.2,, -function,PyDescr_NewMethod,3.2,, -var,PyDictItems_Type,3.2,, -var,PyDictIterItem_Type,3.2,, -var,PyDictIterKey_Type,3.2,, -var,PyDictIterValue_Type,3.2,, -var,PyDictKeys_Type,3.2,, -function,PyDictProxy_New,3.2,, -var,PyDictProxy_Type,3.2,, -var,PyDictRevIterItem_Type,3.8,, -var,PyDictRevIterKey_Type,3.8,, -var,PyDictRevIterValue_Type,3.8,, -var,PyDictValues_Type,3.2,, -function,PyDict_Clear,3.2,, -function,PyDict_Contains,3.2,, -function,PyDict_Copy,3.2,, -function,PyDict_DelItem,3.2,, -function,PyDict_DelItemString,3.2,, -function,PyDict_GetItem,3.2,, -function,PyDict_GetItemString,3.2,, -function,PyDict_GetItemWithError,3.2,, -function,PyDict_Items,3.2,, -function,PyDict_Keys,3.2,, -function,PyDict_Merge,3.2,, -function,PyDict_MergeFromSeq2,3.2,, -function,PyDict_New,3.2,, -function,PyDict_Next,3.2,, -function,PyDict_SetItem,3.2,, -function,PyDict_SetItemString,3.2,, -function,PyDict_Size,3.2,, -var,PyDict_Type,3.2,, -function,PyDict_Update,3.2,, -function,PyDict_Values,3.2,, -var,PyEllipsis_Type,3.2,, -var,PyEnum_Type,3.2,, -function,PyErr_BadArgument,3.2,, -function,PyErr_BadInternalCall,3.2,, -function,PyErr_CheckSignals,3.2,, -function,PyErr_Clear,3.2,, -function,PyErr_Display,3.2,, -function,PyErr_DisplayException,3.12,, -function,PyErr_ExceptionMatches,3.2,, -function,PyErr_Fetch,3.2,, -function,PyErr_Format,3.2,, -function,PyErr_FormatV,3.5,, -function,PyErr_GetExcInfo,3.7,, -function,PyErr_GetHandledException,3.11,, -function,PyErr_GetRaisedException,3.12,, -function,PyErr_GivenExceptionMatches,3.2,, -function,PyErr_NewException,3.2,, -function,PyErr_NewExceptionWithDoc,3.2,, -function,PyErr_NoMemory,3.2,, -function,PyErr_NormalizeException,3.2,, -function,PyErr_Occurred,3.2,, -function,PyErr_Print,3.2,, -function,PyErr_PrintEx,3.2,, -function,PyErr_ProgramText,3.2,, -function,PyErr_ResourceWarning,3.6,, -function,PyErr_Restore,3.2,, -function,PyErr_SetExcFromWindowsErr,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilename,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilenameObject,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilenameObjects,3.7,on Windows, -function,PyErr_SetExcInfo,3.7,, -function,PyErr_SetFromErrno,3.2,, -function,PyErr_SetFromErrnoWithFilename,3.2,, -function,PyErr_SetFromErrnoWithFilenameObject,3.2,, -function,PyErr_SetFromErrnoWithFilenameObjects,3.7,, -function,PyErr_SetFromWindowsErr,3.7,on Windows, -function,PyErr_SetFromWindowsErrWithFilename,3.7,on Windows, -function,PyErr_SetHandledException,3.11,, -function,PyErr_SetImportError,3.7,, -function,PyErr_SetImportErrorSubclass,3.6,, -function,PyErr_SetInterrupt,3.2,, -function,PyErr_SetInterruptEx,3.10,, -function,PyErr_SetNone,3.2,, -function,PyErr_SetObject,3.2,, -function,PyErr_SetRaisedException,3.12,, -function,PyErr_SetString,3.2,, -function,PyErr_SyntaxLocation,3.2,, -function,PyErr_SyntaxLocationEx,3.7,, -function,PyErr_WarnEx,3.2,, -function,PyErr_WarnExplicit,3.2,, -function,PyErr_WarnFormat,3.2,, -function,PyErr_WriteUnraisable,3.2,, -function,PyEval_AcquireLock,3.2,, -function,PyEval_AcquireThread,3.2,, -function,PyEval_CallFunction,3.2,, -function,PyEval_CallMethod,3.2,, -function,PyEval_CallObjectWithKeywords,3.2,, -function,PyEval_EvalCode,3.2,, -function,PyEval_EvalCodeEx,3.2,, -function,PyEval_EvalFrame,3.2,, -function,PyEval_EvalFrameEx,3.2,, -function,PyEval_GetBuiltins,3.2,, -function,PyEval_GetFrame,3.2,, -function,PyEval_GetFuncDesc,3.2,, -function,PyEval_GetFuncName,3.2,, -function,PyEval_GetGlobals,3.2,, -function,PyEval_GetLocals,3.2,, -function,PyEval_InitThreads,3.2,, -function,PyEval_ReleaseLock,3.2,, -function,PyEval_ReleaseThread,3.2,, -function,PyEval_RestoreThread,3.2,, -function,PyEval_SaveThread,3.2,, -function,PyEval_ThreadsInitialized,3.2,, -var,PyExc_ArithmeticError,3.2,, -var,PyExc_AssertionError,3.2,, -var,PyExc_AttributeError,3.2,, -var,PyExc_BaseException,3.2,, -var,PyExc_BaseExceptionGroup,3.11,, -var,PyExc_BlockingIOError,3.7,, -var,PyExc_BrokenPipeError,3.7,, -var,PyExc_BufferError,3.2,, -var,PyExc_BytesWarning,3.2,, -var,PyExc_ChildProcessError,3.7,, -var,PyExc_ConnectionAbortedError,3.7,, -var,PyExc_ConnectionError,3.7,, -var,PyExc_ConnectionRefusedError,3.7,, -var,PyExc_ConnectionResetError,3.7,, -var,PyExc_DeprecationWarning,3.2,, -var,PyExc_EOFError,3.2,, -var,PyExc_EncodingWarning,3.10,, -var,PyExc_EnvironmentError,3.2,, -var,PyExc_Exception,3.2,, -var,PyExc_FileExistsError,3.7,, -var,PyExc_FileNotFoundError,3.7,, -var,PyExc_FloatingPointError,3.2,, -var,PyExc_FutureWarning,3.2,, -var,PyExc_GeneratorExit,3.2,, -var,PyExc_IOError,3.2,, -var,PyExc_ImportError,3.2,, -var,PyExc_ImportWarning,3.2,, -var,PyExc_IndentationError,3.2,, -var,PyExc_IndexError,3.2,, -var,PyExc_InterruptedError,3.7,, -var,PyExc_IsADirectoryError,3.7,, -var,PyExc_KeyError,3.2,, -var,PyExc_KeyboardInterrupt,3.2,, -var,PyExc_LookupError,3.2,, -var,PyExc_MemoryError,3.2,, -var,PyExc_ModuleNotFoundError,3.6,, -var,PyExc_NameError,3.2,, -var,PyExc_NotADirectoryError,3.7,, -var,PyExc_NotImplementedError,3.2,, -var,PyExc_OSError,3.2,, -var,PyExc_OverflowError,3.2,, -var,PyExc_PendingDeprecationWarning,3.2,, -var,PyExc_PermissionError,3.7,, -var,PyExc_ProcessLookupError,3.7,, -var,PyExc_RecursionError,3.7,, -var,PyExc_ReferenceError,3.2,, -var,PyExc_ResourceWarning,3.7,, -var,PyExc_RuntimeError,3.2,, -var,PyExc_RuntimeWarning,3.2,, -var,PyExc_StopAsyncIteration,3.7,, -var,PyExc_StopIteration,3.2,, -var,PyExc_SyntaxError,3.2,, -var,PyExc_SyntaxWarning,3.2,, -var,PyExc_SystemError,3.2,, -var,PyExc_SystemExit,3.2,, -var,PyExc_TabError,3.2,, -var,PyExc_TimeoutError,3.7,, -var,PyExc_TypeError,3.2,, -var,PyExc_UnboundLocalError,3.2,, -var,PyExc_UnicodeDecodeError,3.2,, -var,PyExc_UnicodeEncodeError,3.2,, -var,PyExc_UnicodeError,3.2,, -var,PyExc_UnicodeTranslateError,3.2,, -var,PyExc_UnicodeWarning,3.2,, -var,PyExc_UserWarning,3.2,, -var,PyExc_ValueError,3.2,, -var,PyExc_Warning,3.2,, -var,PyExc_WindowsError,3.7,on Windows, -var,PyExc_ZeroDivisionError,3.2,, -function,PyExceptionClass_Name,3.8,, -function,PyException_GetArgs,3.12,, -function,PyException_GetCause,3.2,, -function,PyException_GetContext,3.2,, -function,PyException_GetTraceback,3.2,, -function,PyException_SetArgs,3.12,, -function,PyException_SetCause,3.2,, -function,PyException_SetContext,3.2,, -function,PyException_SetTraceback,3.2,, -function,PyFile_FromFd,3.2,, -function,PyFile_GetLine,3.2,, -function,PyFile_WriteObject,3.2,, -function,PyFile_WriteString,3.2,, -var,PyFilter_Type,3.2,, -function,PyFloat_AsDouble,3.2,, -function,PyFloat_FromDouble,3.2,, -function,PyFloat_FromString,3.2,, -function,PyFloat_GetInfo,3.2,, -function,PyFloat_GetMax,3.2,, -function,PyFloat_GetMin,3.2,, -var,PyFloat_Type,3.2,, +func,PyCapsule_GetContext,3.2,, +func,PyCapsule_GetDestructor,3.2,, +func,PyCapsule_GetName,3.2,, +func,PyCapsule_GetPointer,3.2,, +func,PyCapsule_Import,3.2,, +func,PyCapsule_IsValid,3.2,, +func,PyCapsule_New,3.2,, +func,PyCapsule_SetContext,3.2,, +func,PyCapsule_SetDestructor,3.2,, +func,PyCapsule_SetName,3.2,, +func,PyCapsule_SetPointer,3.2,, +data,PyCapsule_Type,3.2,, +data,PyClassMethodDescr_Type,3.2,, +func,PyCodec_BackslashReplaceErrors,3.2,, +func,PyCodec_Decode,3.2,, +func,PyCodec_Decoder,3.2,, +func,PyCodec_Encode,3.2,, +func,PyCodec_Encoder,3.2,, +func,PyCodec_IgnoreErrors,3.2,, +func,PyCodec_IncrementalDecoder,3.2,, +func,PyCodec_IncrementalEncoder,3.2,, +func,PyCodec_KnownEncoding,3.2,, +func,PyCodec_LookupError,3.2,, +func,PyCodec_NameReplaceErrors,3.7,, +func,PyCodec_Register,3.2,, +func,PyCodec_RegisterError,3.2,, +func,PyCodec_ReplaceErrors,3.2,, +func,PyCodec_StreamReader,3.2,, +func,PyCodec_StreamWriter,3.2,, +func,PyCodec_StrictErrors,3.2,, +func,PyCodec_Unregister,3.10,, +func,PyCodec_XMLCharRefReplaceErrors,3.2,, +func,PyComplex_FromDoubles,3.2,, +func,PyComplex_ImagAsDouble,3.2,, +func,PyComplex_RealAsDouble,3.2,, +data,PyComplex_Type,3.2,, +func,PyDescr_NewClassMethod,3.2,, +func,PyDescr_NewGetSet,3.2,, +func,PyDescr_NewMember,3.2,, +func,PyDescr_NewMethod,3.2,, +data,PyDictItems_Type,3.2,, +data,PyDictIterItem_Type,3.2,, +data,PyDictIterKey_Type,3.2,, +data,PyDictIterValue_Type,3.2,, +data,PyDictKeys_Type,3.2,, +func,PyDictProxy_New,3.2,, +data,PyDictProxy_Type,3.2,, +data,PyDictRevIterItem_Type,3.8,, +data,PyDictRevIterKey_Type,3.8,, +data,PyDictRevIterValue_Type,3.8,, +data,PyDictValues_Type,3.2,, +func,PyDict_Clear,3.2,, +func,PyDict_Contains,3.2,, +func,PyDict_Copy,3.2,, +func,PyDict_DelItem,3.2,, +func,PyDict_DelItemString,3.2,, +func,PyDict_GetItem,3.2,, +func,PyDict_GetItemRef,3.13,, +func,PyDict_GetItemString,3.2,, +func,PyDict_GetItemStringRef,3.13,, +func,PyDict_GetItemWithError,3.2,, +func,PyDict_Items,3.2,, +func,PyDict_Keys,3.2,, +func,PyDict_Merge,3.2,, +func,PyDict_MergeFromSeq2,3.2,, +func,PyDict_New,3.2,, +func,PyDict_Next,3.2,, +func,PyDict_SetItem,3.2,, +func,PyDict_SetItemString,3.2,, +func,PyDict_Size,3.2,, +data,PyDict_Type,3.2,, +func,PyDict_Update,3.2,, +func,PyDict_Values,3.2,, +data,PyEllipsis_Type,3.2,, +data,PyEnum_Type,3.2,, +func,PyErr_BadArgument,3.2,, +func,PyErr_BadInternalCall,3.2,, +func,PyErr_CheckSignals,3.2,, +func,PyErr_Clear,3.2,, +func,PyErr_Display,3.2,, +func,PyErr_DisplayException,3.12,, +func,PyErr_ExceptionMatches,3.2,, +func,PyErr_Fetch,3.2,, +func,PyErr_Format,3.2,, +func,PyErr_FormatV,3.5,, +func,PyErr_GetExcInfo,3.7,, +func,PyErr_GetHandledException,3.11,, +func,PyErr_GetRaisedException,3.12,, +func,PyErr_GivenExceptionMatches,3.2,, +func,PyErr_NewException,3.2,, +func,PyErr_NewExceptionWithDoc,3.2,, +func,PyErr_NoMemory,3.2,, +func,PyErr_NormalizeException,3.2,, +func,PyErr_Occurred,3.2,, +func,PyErr_Print,3.2,, +func,PyErr_PrintEx,3.2,, +func,PyErr_ProgramText,3.2,, +func,PyErr_ResourceWarning,3.6,, +func,PyErr_Restore,3.2,, +func,PyErr_SetExcFromWindowsErr,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilename,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilenameObject,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilenameObjects,3.7,on Windows, +func,PyErr_SetExcInfo,3.7,, +func,PyErr_SetFromErrno,3.2,, +func,PyErr_SetFromErrnoWithFilename,3.2,, +func,PyErr_SetFromErrnoWithFilenameObject,3.2,, +func,PyErr_SetFromErrnoWithFilenameObjects,3.7,, +func,PyErr_SetFromWindowsErr,3.7,on Windows, +func,PyErr_SetFromWindowsErrWithFilename,3.7,on Windows, +func,PyErr_SetHandledException,3.11,, +func,PyErr_SetImportError,3.7,, +func,PyErr_SetImportErrorSubclass,3.6,, +func,PyErr_SetInterrupt,3.2,, +func,PyErr_SetInterruptEx,3.10,, +func,PyErr_SetNone,3.2,, +func,PyErr_SetObject,3.2,, +func,PyErr_SetRaisedException,3.12,, +func,PyErr_SetString,3.2,, +func,PyErr_SyntaxLocation,3.2,, +func,PyErr_SyntaxLocationEx,3.7,, +func,PyErr_WarnEx,3.2,, +func,PyErr_WarnExplicit,3.2,, +func,PyErr_WarnFormat,3.2,, +func,PyErr_WriteUnraisable,3.2,, +func,PyEval_AcquireThread,3.2,, +func,PyEval_EvalCode,3.2,, +func,PyEval_EvalCodeEx,3.2,, +func,PyEval_EvalFrame,3.2,, +func,PyEval_EvalFrameEx,3.2,, +func,PyEval_GetBuiltins,3.2,, +func,PyEval_GetFrame,3.2,, +func,PyEval_GetFrameBuiltins,3.13,, +func,PyEval_GetFrameGlobals,3.13,, +func,PyEval_GetFrameLocals,3.13,, +func,PyEval_GetFuncDesc,3.2,, +func,PyEval_GetFuncName,3.2,, +func,PyEval_GetGlobals,3.2,, +func,PyEval_GetLocals,3.2,, +func,PyEval_InitThreads,3.2,, +func,PyEval_ReleaseThread,3.2,, +func,PyEval_RestoreThread,3.2,, +func,PyEval_SaveThread,3.2,, +data,PyExc_ArithmeticError,3.2,, +data,PyExc_AssertionError,3.2,, +data,PyExc_AttributeError,3.2,, +data,PyExc_BaseException,3.2,, +data,PyExc_BaseExceptionGroup,3.11,, +data,PyExc_BlockingIOError,3.7,, +data,PyExc_BrokenPipeError,3.7,, +data,PyExc_BufferError,3.2,, +data,PyExc_BytesWarning,3.2,, +data,PyExc_ChildProcessError,3.7,, +data,PyExc_ConnectionAbortedError,3.7,, +data,PyExc_ConnectionError,3.7,, +data,PyExc_ConnectionRefusedError,3.7,, +data,PyExc_ConnectionResetError,3.7,, +data,PyExc_DeprecationWarning,3.2,, +data,PyExc_EOFError,3.2,, +data,PyExc_EncodingWarning,3.10,, +data,PyExc_EnvironmentError,3.2,, +data,PyExc_Exception,3.2,, +data,PyExc_FileExistsError,3.7,, +data,PyExc_FileNotFoundError,3.7,, +data,PyExc_FloatingPointError,3.2,, +data,PyExc_FutureWarning,3.2,, +data,PyExc_GeneratorExit,3.2,, +data,PyExc_IOError,3.2,, +data,PyExc_ImportError,3.2,, +data,PyExc_ImportWarning,3.2,, +data,PyExc_IndentationError,3.2,, +data,PyExc_IndexError,3.2,, +data,PyExc_InterruptedError,3.7,, +data,PyExc_IsADirectoryError,3.7,, +data,PyExc_KeyError,3.2,, +data,PyExc_KeyboardInterrupt,3.2,, +data,PyExc_LookupError,3.2,, +data,PyExc_MemoryError,3.2,, +data,PyExc_ModuleNotFoundError,3.6,, +data,PyExc_NameError,3.2,, +data,PyExc_NotADirectoryError,3.7,, +data,PyExc_NotImplementedError,3.2,, +data,PyExc_OSError,3.2,, +data,PyExc_OverflowError,3.2,, +data,PyExc_PendingDeprecationWarning,3.2,, +data,PyExc_PermissionError,3.7,, +data,PyExc_ProcessLookupError,3.7,, +data,PyExc_RecursionError,3.7,, +data,PyExc_ReferenceError,3.2,, +data,PyExc_ResourceWarning,3.7,, +data,PyExc_RuntimeError,3.2,, +data,PyExc_RuntimeWarning,3.2,, +data,PyExc_StopAsyncIteration,3.7,, +data,PyExc_StopIteration,3.2,, +data,PyExc_SyntaxError,3.2,, +data,PyExc_SyntaxWarning,3.2,, +data,PyExc_SystemError,3.2,, +data,PyExc_SystemExit,3.2,, +data,PyExc_TabError,3.2,, +data,PyExc_TimeoutError,3.7,, +data,PyExc_TypeError,3.2,, +data,PyExc_UnboundLocalError,3.2,, +data,PyExc_UnicodeDecodeError,3.2,, +data,PyExc_UnicodeEncodeError,3.2,, +data,PyExc_UnicodeError,3.2,, +data,PyExc_UnicodeTranslateError,3.2,, +data,PyExc_UnicodeWarning,3.2,, +data,PyExc_UserWarning,3.2,, +data,PyExc_ValueError,3.2,, +data,PyExc_Warning,3.2,, +data,PyExc_WindowsError,3.7,on Windows, +data,PyExc_ZeroDivisionError,3.2,, +func,PyExceptionClass_Name,3.8,, +func,PyException_GetArgs,3.12,, +func,PyException_GetCause,3.2,, +func,PyException_GetContext,3.2,, +func,PyException_GetTraceback,3.2,, +func,PyException_SetArgs,3.12,, +func,PyException_SetCause,3.2,, +func,PyException_SetContext,3.2,, +func,PyException_SetTraceback,3.2,, +func,PyFile_FromFd,3.2,, +func,PyFile_GetLine,3.2,, +func,PyFile_WriteObject,3.2,, +func,PyFile_WriteString,3.2,, +data,PyFilter_Type,3.2,, +func,PyFloat_AsDouble,3.2,, +func,PyFloat_FromDouble,3.2,, +func,PyFloat_FromString,3.2,, +func,PyFloat_GetInfo,3.2,, +func,PyFloat_GetMax,3.2,, +func,PyFloat_GetMin,3.2,, +data,PyFloat_Type,3.2,, type,PyFrameObject,3.2,,opaque -function,PyFrame_GetCode,3.10,, -function,PyFrame_GetLineNumber,3.10,, -function,PyFrozenSet_New,3.2,, -var,PyFrozenSet_Type,3.2,, -function,PyGC_Collect,3.2,, -function,PyGC_Disable,3.10,, -function,PyGC_Enable,3.10,, -function,PyGC_IsEnabled,3.10,, -function,PyGILState_Ensure,3.2,, -function,PyGILState_GetThisThreadState,3.2,, -function,PyGILState_Release,3.2,, +func,PyFrame_GetCode,3.10,, +func,PyFrame_GetLineNumber,3.10,, +func,PyFrozenSet_New,3.2,, +data,PyFrozenSet_Type,3.2,, +func,PyGC_Collect,3.2,, +func,PyGC_Disable,3.10,, +func,PyGC_Enable,3.10,, +func,PyGC_IsEnabled,3.10,, +func,PyGILState_Ensure,3.2,, +func,PyGILState_GetThisThreadState,3.2,, +func,PyGILState_Release,3.2,, type,PyGILState_STATE,3.2,, type,PyGetSetDef,3.2,,full-abi -var,PyGetSetDescr_Type,3.2,, -function,PyImport_AddModule,3.2,, -function,PyImport_AddModuleObject,3.7,, -function,PyImport_AppendInittab,3.2,, -function,PyImport_ExecCodeModule,3.2,, -function,PyImport_ExecCodeModuleEx,3.2,, -function,PyImport_ExecCodeModuleObject,3.7,, -function,PyImport_ExecCodeModuleWithPathnames,3.2,, -function,PyImport_GetImporter,3.2,, -function,PyImport_GetMagicNumber,3.2,, -function,PyImport_GetMagicTag,3.2,, -function,PyImport_GetModule,3.8,, -function,PyImport_GetModuleDict,3.2,, -function,PyImport_Import,3.2,, -function,PyImport_ImportFrozenModule,3.2,, -function,PyImport_ImportFrozenModuleObject,3.7,, -function,PyImport_ImportModule,3.2,, -function,PyImport_ImportModuleLevel,3.2,, -function,PyImport_ImportModuleLevelObject,3.7,, -function,PyImport_ImportModuleNoBlock,3.2,, -function,PyImport_ReloadModule,3.2,, -function,PyIndex_Check,3.8,, +data,PyGetSetDescr_Type,3.2,, +func,PyImport_AddModule,3.2,, +func,PyImport_AddModuleObject,3.7,, +func,PyImport_AddModuleRef,3.13,, +func,PyImport_AppendInittab,3.2,, +func,PyImport_ExecCodeModule,3.2,, +func,PyImport_ExecCodeModuleEx,3.2,, +func,PyImport_ExecCodeModuleObject,3.7,, +func,PyImport_ExecCodeModuleWithPathnames,3.2,, +func,PyImport_GetImporter,3.2,, +func,PyImport_GetMagicNumber,3.2,, +func,PyImport_GetMagicTag,3.2,, +func,PyImport_GetModule,3.8,, +func,PyImport_GetModuleDict,3.2,, +func,PyImport_Import,3.2,, +func,PyImport_ImportFrozenModule,3.2,, +func,PyImport_ImportFrozenModuleObject,3.7,, +func,PyImport_ImportModule,3.2,, +func,PyImport_ImportModuleLevel,3.2,, +func,PyImport_ImportModuleLevelObject,3.7,, +func,PyImport_ImportModuleNoBlock,3.2,, +func,PyImport_ReloadModule,3.2,, +func,PyIndex_Check,3.8,, type,PyInterpreterState,3.2,,opaque -function,PyInterpreterState_Clear,3.2,, -function,PyInterpreterState_Delete,3.2,, -function,PyInterpreterState_Get,3.9,, -function,PyInterpreterState_GetDict,3.8,, -function,PyInterpreterState_GetID,3.7,, -function,PyInterpreterState_New,3.2,, -function,PyIter_Check,3.8,, -function,PyIter_Next,3.2,, -function,PyIter_Send,3.10,, -var,PyListIter_Type,3.2,, -var,PyListRevIter_Type,3.2,, -function,PyList_Append,3.2,, -function,PyList_AsTuple,3.2,, -function,PyList_GetItem,3.2,, -function,PyList_GetSlice,3.2,, -function,PyList_Insert,3.2,, -function,PyList_New,3.2,, -function,PyList_Reverse,3.2,, -function,PyList_SetItem,3.2,, -function,PyList_SetSlice,3.2,, -function,PyList_Size,3.2,, -function,PyList_Sort,3.2,, -var,PyList_Type,3.2,, +func,PyInterpreterState_Clear,3.2,, +func,PyInterpreterState_Delete,3.2,, +func,PyInterpreterState_Get,3.9,, +func,PyInterpreterState_GetDict,3.8,, +func,PyInterpreterState_GetID,3.7,, +func,PyInterpreterState_New,3.2,, +func,PyIter_Check,3.8,, +func,PyIter_Next,3.2,, +func,PyIter_Send,3.10,, +data,PyListIter_Type,3.2,, +data,PyListRevIter_Type,3.2,, +func,PyList_Append,3.2,, +func,PyList_AsTuple,3.2,, +func,PyList_GetItem,3.2,, +func,PyList_GetItemRef,3.13,, +func,PyList_GetSlice,3.2,, +func,PyList_Insert,3.2,, +func,PyList_New,3.2,, +func,PyList_Reverse,3.2,, +func,PyList_SetItem,3.2,, +func,PyList_SetSlice,3.2,, +func,PyList_Size,3.2,, +func,PyList_Sort,3.2,, +data,PyList_Type,3.2,, type,PyLongObject,3.2,,opaque -var,PyLongRangeIter_Type,3.2,, -function,PyLong_AsDouble,3.2,, -function,PyLong_AsLong,3.2,, -function,PyLong_AsLongAndOverflow,3.2,, -function,PyLong_AsLongLong,3.2,, -function,PyLong_AsLongLongAndOverflow,3.2,, -function,PyLong_AsSize_t,3.2,, -function,PyLong_AsSsize_t,3.2,, -function,PyLong_AsUnsignedLong,3.2,, -function,PyLong_AsUnsignedLongLong,3.2,, -function,PyLong_AsUnsignedLongLongMask,3.2,, -function,PyLong_AsUnsignedLongMask,3.2,, -function,PyLong_AsVoidPtr,3.2,, -function,PyLong_FromDouble,3.2,, -function,PyLong_FromLong,3.2,, -function,PyLong_FromLongLong,3.2,, -function,PyLong_FromSize_t,3.2,, -function,PyLong_FromSsize_t,3.2,, -function,PyLong_FromString,3.2,, -function,PyLong_FromUnsignedLong,3.2,, -function,PyLong_FromUnsignedLongLong,3.2,, -function,PyLong_FromVoidPtr,3.2,, -function,PyLong_GetInfo,3.2,, -var,PyLong_Type,3.2,, -var,PyMap_Type,3.2,, -function,PyMapping_Check,3.2,, -function,PyMapping_GetItemString,3.2,, -function,PyMapping_HasKey,3.2,, -function,PyMapping_HasKeyString,3.2,, -function,PyMapping_Items,3.2,, -function,PyMapping_Keys,3.2,, -function,PyMapping_Length,3.2,, -function,PyMapping_SetItemString,3.2,, -function,PyMapping_Size,3.2,, -function,PyMapping_Values,3.2,, -function,PyMem_Calloc,3.7,, -function,PyMem_Free,3.2,, -function,PyMem_Malloc,3.2,, -function,PyMem_Realloc,3.2,, +data,PyLongRangeIter_Type,3.2,, +func,PyLong_AsDouble,3.2,, +func,PyLong_AsInt,3.13,, +func,PyLong_AsLong,3.2,, +func,PyLong_AsLongAndOverflow,3.2,, +func,PyLong_AsLongLong,3.2,, +func,PyLong_AsLongLongAndOverflow,3.2,, +func,PyLong_AsSize_t,3.2,, +func,PyLong_AsSsize_t,3.2,, +func,PyLong_AsUnsignedLong,3.2,, +func,PyLong_AsUnsignedLongLong,3.2,, +func,PyLong_AsUnsignedLongLongMask,3.2,, +func,PyLong_AsUnsignedLongMask,3.2,, +func,PyLong_AsVoidPtr,3.2,, +func,PyLong_FromDouble,3.2,, +func,PyLong_FromLong,3.2,, +func,PyLong_FromLongLong,3.2,, +func,PyLong_FromSize_t,3.2,, +func,PyLong_FromSsize_t,3.2,, +func,PyLong_FromString,3.2,, +func,PyLong_FromUnsignedLong,3.2,, +func,PyLong_FromUnsignedLongLong,3.2,, +func,PyLong_FromVoidPtr,3.2,, +func,PyLong_GetInfo,3.2,, +data,PyLong_Type,3.2,, +data,PyMap_Type,3.2,, +func,PyMapping_Check,3.2,, +func,PyMapping_GetItemString,3.2,, +func,PyMapping_GetOptionalItem,3.13,, +func,PyMapping_GetOptionalItemString,3.13,, +func,PyMapping_HasKey,3.2,, +func,PyMapping_HasKeyString,3.2,, +func,PyMapping_HasKeyStringWithError,3.13,, +func,PyMapping_HasKeyWithError,3.13,, +func,PyMapping_Items,3.2,, +func,PyMapping_Keys,3.2,, +func,PyMapping_Length,3.2,, +func,PyMapping_SetItemString,3.2,, +func,PyMapping_Size,3.2,, +func,PyMapping_Values,3.2,, +func,PyMem_Calloc,3.7,, +func,PyMem_Free,3.2,, +func,PyMem_Malloc,3.2,, +func,PyMem_RawCalloc,3.13,, +func,PyMem_RawFree,3.13,, +func,PyMem_RawMalloc,3.13,, +func,PyMem_RawRealloc,3.13,, +func,PyMem_Realloc,3.2,, type,PyMemberDef,3.2,,full-abi -var,PyMemberDescr_Type,3.2,, -function,PyMember_GetOne,3.2,, -function,PyMember_SetOne,3.2,, -function,PyMemoryView_FromBuffer,3.11,, -function,PyMemoryView_FromMemory,3.7,, -function,PyMemoryView_FromObject,3.2,, -function,PyMemoryView_GetContiguous,3.2,, -var,PyMemoryView_Type,3.2,, +data,PyMemberDescr_Type,3.2,, +func,PyMember_GetOne,3.2,, +func,PyMember_SetOne,3.2,, +func,PyMemoryView_FromBuffer,3.11,, +func,PyMemoryView_FromMemory,3.7,, +func,PyMemoryView_FromObject,3.2,, +func,PyMemoryView_GetContiguous,3.2,, +data,PyMemoryView_Type,3.2,, type,PyMethodDef,3.2,,full-abi -var,PyMethodDescr_Type,3.2,, +data,PyMethodDescr_Type,3.2,, type,PyModuleDef,3.2,,full-abi type,PyModuleDef_Base,3.2,,full-abi -function,PyModuleDef_Init,3.5,, -var,PyModuleDef_Type,3.5,, -function,PyModule_AddFunctions,3.7,, -function,PyModule_AddIntConstant,3.2,, -function,PyModule_AddObject,3.2,, -function,PyModule_AddObjectRef,3.10,, -function,PyModule_AddStringConstant,3.2,, -function,PyModule_AddType,3.10,, -function,PyModule_Create2,3.2,, -function,PyModule_ExecDef,3.7,, -function,PyModule_FromDefAndSpec2,3.7,, -function,PyModule_GetDef,3.2,, -function,PyModule_GetDict,3.2,, -function,PyModule_GetFilename,3.2,, -function,PyModule_GetFilenameObject,3.2,, -function,PyModule_GetName,3.2,, -function,PyModule_GetNameObject,3.7,, -function,PyModule_GetState,3.2,, -function,PyModule_New,3.2,, -function,PyModule_NewObject,3.7,, -function,PyModule_SetDocString,3.7,, -var,PyModule_Type,3.2,, -function,PyNumber_Absolute,3.2,, -function,PyNumber_Add,3.2,, -function,PyNumber_And,3.2,, -function,PyNumber_AsSsize_t,3.2,, -function,PyNumber_Check,3.2,, -function,PyNumber_Divmod,3.2,, -function,PyNumber_Float,3.2,, -function,PyNumber_FloorDivide,3.2,, -function,PyNumber_InPlaceAdd,3.2,, -function,PyNumber_InPlaceAnd,3.2,, -function,PyNumber_InPlaceFloorDivide,3.2,, -function,PyNumber_InPlaceLshift,3.2,, -function,PyNumber_InPlaceMatrixMultiply,3.7,, -function,PyNumber_InPlaceMultiply,3.2,, -function,PyNumber_InPlaceOr,3.2,, -function,PyNumber_InPlacePower,3.2,, -function,PyNumber_InPlaceRemainder,3.2,, -function,PyNumber_InPlaceRshift,3.2,, -function,PyNumber_InPlaceSubtract,3.2,, -function,PyNumber_InPlaceTrueDivide,3.2,, -function,PyNumber_InPlaceXor,3.2,, -function,PyNumber_Index,3.2,, -function,PyNumber_Invert,3.2,, -function,PyNumber_Long,3.2,, -function,PyNumber_Lshift,3.2,, -function,PyNumber_MatrixMultiply,3.7,, -function,PyNumber_Multiply,3.2,, -function,PyNumber_Negative,3.2,, -function,PyNumber_Or,3.2,, -function,PyNumber_Positive,3.2,, -function,PyNumber_Power,3.2,, -function,PyNumber_Remainder,3.2,, -function,PyNumber_Rshift,3.2,, -function,PyNumber_Subtract,3.2,, -function,PyNumber_ToBase,3.2,, -function,PyNumber_TrueDivide,3.2,, -function,PyNumber_Xor,3.2,, -function,PyOS_AfterFork,3.2,on platforms with fork(), -function,PyOS_AfterFork_Child,3.7,on platforms with fork(), -function,PyOS_AfterFork_Parent,3.7,on platforms with fork(), -function,PyOS_BeforeFork,3.7,on platforms with fork(), -function,PyOS_CheckStack,3.7,on platforms with USE_STACKCHECK, -function,PyOS_FSPath,3.6,, -var,PyOS_InputHook,3.2,, -function,PyOS_InterruptOccurred,3.2,, -function,PyOS_double_to_string,3.2,, -function,PyOS_getsig,3.2,, -function,PyOS_mystricmp,3.2,, -function,PyOS_mystrnicmp,3.2,, -function,PyOS_setsig,3.2,, +func,PyModuleDef_Init,3.5,, +data,PyModuleDef_Type,3.5,, +func,PyModule_Add,3.13,, +func,PyModule_AddFunctions,3.7,, +func,PyModule_AddIntConstant,3.2,, +func,PyModule_AddObject,3.2,, +func,PyModule_AddObjectRef,3.10,, +func,PyModule_AddStringConstant,3.2,, +func,PyModule_AddType,3.10,, +func,PyModule_Create2,3.2,, +func,PyModule_ExecDef,3.7,, +func,PyModule_FromDefAndSpec2,3.7,, +func,PyModule_GetDef,3.2,, +func,PyModule_GetDict,3.2,, +func,PyModule_GetFilename,3.2,, +func,PyModule_GetFilenameObject,3.2,, +func,PyModule_GetName,3.2,, +func,PyModule_GetNameObject,3.7,, +func,PyModule_GetState,3.2,, +func,PyModule_New,3.2,, +func,PyModule_NewObject,3.7,, +func,PyModule_SetDocString,3.7,, +data,PyModule_Type,3.2,, +func,PyNumber_Absolute,3.2,, +func,PyNumber_Add,3.2,, +func,PyNumber_And,3.2,, +func,PyNumber_AsSsize_t,3.2,, +func,PyNumber_Check,3.2,, +func,PyNumber_Divmod,3.2,, +func,PyNumber_Float,3.2,, +func,PyNumber_FloorDivide,3.2,, +func,PyNumber_InPlaceAdd,3.2,, +func,PyNumber_InPlaceAnd,3.2,, +func,PyNumber_InPlaceFloorDivide,3.2,, +func,PyNumber_InPlaceLshift,3.2,, +func,PyNumber_InPlaceMatrixMultiply,3.7,, +func,PyNumber_InPlaceMultiply,3.2,, +func,PyNumber_InPlaceOr,3.2,, +func,PyNumber_InPlacePower,3.2,, +func,PyNumber_InPlaceRemainder,3.2,, +func,PyNumber_InPlaceRshift,3.2,, +func,PyNumber_InPlaceSubtract,3.2,, +func,PyNumber_InPlaceTrueDivide,3.2,, +func,PyNumber_InPlaceXor,3.2,, +func,PyNumber_Index,3.2,, +func,PyNumber_Invert,3.2,, +func,PyNumber_Long,3.2,, +func,PyNumber_Lshift,3.2,, +func,PyNumber_MatrixMultiply,3.7,, +func,PyNumber_Multiply,3.2,, +func,PyNumber_Negative,3.2,, +func,PyNumber_Or,3.2,, +func,PyNumber_Positive,3.2,, +func,PyNumber_Power,3.2,, +func,PyNumber_Remainder,3.2,, +func,PyNumber_Rshift,3.2,, +func,PyNumber_Subtract,3.2,, +func,PyNumber_ToBase,3.2,, +func,PyNumber_TrueDivide,3.2,, +func,PyNumber_Xor,3.2,, +func,PyOS_AfterFork,3.2,on platforms with fork(), +func,PyOS_AfterFork_Child,3.7,on platforms with fork(), +func,PyOS_AfterFork_Parent,3.7,on platforms with fork(), +func,PyOS_BeforeFork,3.7,on platforms with fork(), +func,PyOS_CheckStack,3.7,on platforms with USE_STACKCHECK, +func,PyOS_FSPath,3.6,, +data,PyOS_InputHook,3.2,, +func,PyOS_InterruptOccurred,3.2,, +func,PyOS_double_to_string,3.2,, +func,PyOS_getsig,3.2,, +func,PyOS_mystricmp,3.2,, +func,PyOS_mystrnicmp,3.2,, +func,PyOS_setsig,3.2,, type,PyOS_sighandler_t,3.2,, -function,PyOS_snprintf,3.2,, -function,PyOS_string_to_double,3.2,, -function,PyOS_strtol,3.2,, -function,PyOS_strtoul,3.2,, -function,PyOS_vsnprintf,3.2,, +func,PyOS_snprintf,3.2,, +func,PyOS_string_to_double,3.2,, +func,PyOS_strtol,3.2,, +func,PyOS_strtoul,3.2,, +func,PyOS_vsnprintf,3.2,, type,PyObject,3.2,,members member,PyObject.ob_refcnt,3.2,, member,PyObject.ob_type,3.2,, -function,PyObject_ASCII,3.2,, -function,PyObject_AsCharBuffer,3.2,, -function,PyObject_AsFileDescriptor,3.2,, -function,PyObject_AsReadBuffer,3.2,, -function,PyObject_AsWriteBuffer,3.2,, -function,PyObject_Bytes,3.2,, -function,PyObject_Call,3.2,, -function,PyObject_CallFunction,3.2,, -function,PyObject_CallFunctionObjArgs,3.2,, -function,PyObject_CallMethod,3.2,, -function,PyObject_CallMethodObjArgs,3.2,, -function,PyObject_CallNoArgs,3.10,, -function,PyObject_CallObject,3.2,, -function,PyObject_Calloc,3.7,, -function,PyObject_CheckBuffer,3.11,, -function,PyObject_CheckReadBuffer,3.2,, -function,PyObject_ClearWeakRefs,3.2,, -function,PyObject_CopyData,3.11,, -function,PyObject_DelItem,3.2,, -function,PyObject_DelItemString,3.2,, -function,PyObject_Dir,3.2,, -function,PyObject_Format,3.2,, -function,PyObject_Free,3.2,, -function,PyObject_GC_Del,3.2,, -function,PyObject_GC_IsFinalized,3.9,, -function,PyObject_GC_IsTracked,3.9,, -function,PyObject_GC_Track,3.2,, -function,PyObject_GC_UnTrack,3.2,, -function,PyObject_GenericGetAttr,3.2,, -function,PyObject_GenericGetDict,3.10,, -function,PyObject_GenericSetAttr,3.2,, -function,PyObject_GenericSetDict,3.7,, -function,PyObject_GetAIter,3.10,, -function,PyObject_GetAttr,3.2,, -function,PyObject_GetAttrString,3.2,, -function,PyObject_GetBuffer,3.11,, -function,PyObject_GetItem,3.2,, -function,PyObject_GetIter,3.2,, -function,PyObject_GetTypeData,3.12,, -function,PyObject_HasAttr,3.2,, -function,PyObject_HasAttrString,3.2,, -function,PyObject_Hash,3.2,, -function,PyObject_HashNotImplemented,3.2,, -function,PyObject_Init,3.2,, -function,PyObject_InitVar,3.2,, -function,PyObject_IsInstance,3.2,, -function,PyObject_IsSubclass,3.2,, -function,PyObject_IsTrue,3.2,, -function,PyObject_Length,3.2,, -function,PyObject_Malloc,3.2,, -function,PyObject_Not,3.2,, -function,PyObject_Realloc,3.2,, -function,PyObject_Repr,3.2,, -function,PyObject_RichCompare,3.2,, -function,PyObject_RichCompareBool,3.2,, -function,PyObject_SelfIter,3.2,, -function,PyObject_SetAttr,3.2,, -function,PyObject_SetAttrString,3.2,, -function,PyObject_SetItem,3.2,, -function,PyObject_Size,3.2,, -function,PyObject_Str,3.2,, -function,PyObject_Type,3.2,, -function,PyObject_Vectorcall,3.12,, -function,PyObject_VectorcallMethod,3.12,, -var,PyProperty_Type,3.2,, -var,PyRangeIter_Type,3.2,, -var,PyRange_Type,3.2,, -var,PyReversed_Type,3.2,, -function,PySeqIter_New,3.2,, -var,PySeqIter_Type,3.2,, -function,PySequence_Check,3.2,, -function,PySequence_Concat,3.2,, -function,PySequence_Contains,3.2,, -function,PySequence_Count,3.2,, -function,PySequence_DelItem,3.2,, -function,PySequence_DelSlice,3.2,, -function,PySequence_Fast,3.2,, -function,PySequence_GetItem,3.2,, -function,PySequence_GetSlice,3.2,, -function,PySequence_In,3.2,, -function,PySequence_InPlaceConcat,3.2,, -function,PySequence_InPlaceRepeat,3.2,, -function,PySequence_Index,3.2,, -function,PySequence_Length,3.2,, -function,PySequence_List,3.2,, -function,PySequence_Repeat,3.2,, -function,PySequence_SetItem,3.2,, -function,PySequence_SetSlice,3.2,, -function,PySequence_Size,3.2,, -function,PySequence_Tuple,3.2,, -var,PySetIter_Type,3.2,, -function,PySet_Add,3.2,, -function,PySet_Clear,3.2,, -function,PySet_Contains,3.2,, -function,PySet_Discard,3.2,, -function,PySet_New,3.2,, -function,PySet_Pop,3.2,, -function,PySet_Size,3.2,, -var,PySet_Type,3.2,, -function,PySlice_AdjustIndices,3.7,, -function,PySlice_GetIndices,3.2,, -function,PySlice_GetIndicesEx,3.2,, -function,PySlice_New,3.2,, -var,PySlice_Type,3.2,, -function,PySlice_Unpack,3.7,, -function,PyState_AddModule,3.3,, -function,PyState_FindModule,3.2,, -function,PyState_RemoveModule,3.3,, +func,PyObject_ASCII,3.2,, +func,PyObject_AsFileDescriptor,3.2,, +func,PyObject_Bytes,3.2,, +func,PyObject_Call,3.2,, +func,PyObject_CallFunction,3.2,, +func,PyObject_CallFunctionObjArgs,3.2,, +func,PyObject_CallMethod,3.2,, +func,PyObject_CallMethodObjArgs,3.2,, +func,PyObject_CallNoArgs,3.10,, +func,PyObject_CallObject,3.2,, +func,PyObject_Calloc,3.7,, +func,PyObject_CheckBuffer,3.11,, +func,PyObject_ClearWeakRefs,3.2,, +func,PyObject_CopyData,3.11,, +func,PyObject_DelAttr,3.13,, +func,PyObject_DelAttrString,3.13,, +func,PyObject_DelItem,3.2,, +func,PyObject_DelItemString,3.2,, +func,PyObject_Dir,3.2,, +func,PyObject_Format,3.2,, +func,PyObject_Free,3.2,, +func,PyObject_GC_Del,3.2,, +func,PyObject_GC_IsFinalized,3.9,, +func,PyObject_GC_IsTracked,3.9,, +func,PyObject_GC_Track,3.2,, +func,PyObject_GC_UnTrack,3.2,, +func,PyObject_GenericGetAttr,3.2,, +func,PyObject_GenericGetDict,3.10,, +func,PyObject_GenericSetAttr,3.2,, +func,PyObject_GenericSetDict,3.7,, +func,PyObject_GetAIter,3.10,, +func,PyObject_GetAttr,3.2,, +func,PyObject_GetAttrString,3.2,, +func,PyObject_GetBuffer,3.11,, +func,PyObject_GetItem,3.2,, +func,PyObject_GetIter,3.2,, +func,PyObject_GetOptionalAttr,3.13,, +func,PyObject_GetOptionalAttrString,3.13,, +func,PyObject_GetTypeData,3.12,, +func,PyObject_HasAttr,3.2,, +func,PyObject_HasAttrString,3.2,, +func,PyObject_HasAttrStringWithError,3.13,, +func,PyObject_HasAttrWithError,3.13,, +func,PyObject_Hash,3.2,, +func,PyObject_HashNotImplemented,3.2,, +func,PyObject_Init,3.2,, +func,PyObject_InitVar,3.2,, +func,PyObject_IsInstance,3.2,, +func,PyObject_IsSubclass,3.2,, +func,PyObject_IsTrue,3.2,, +func,PyObject_Length,3.2,, +func,PyObject_Malloc,3.2,, +func,PyObject_Not,3.2,, +func,PyObject_Realloc,3.2,, +func,PyObject_Repr,3.2,, +func,PyObject_RichCompare,3.2,, +func,PyObject_RichCompareBool,3.2,, +func,PyObject_SelfIter,3.2,, +func,PyObject_SetAttr,3.2,, +func,PyObject_SetAttrString,3.2,, +func,PyObject_SetItem,3.2,, +func,PyObject_Size,3.2,, +func,PyObject_Str,3.2,, +func,PyObject_Type,3.2,, +func,PyObject_Vectorcall,3.12,, +func,PyObject_VectorcallMethod,3.12,, +data,PyProperty_Type,3.2,, +data,PyRangeIter_Type,3.2,, +data,PyRange_Type,3.2,, +data,PyReversed_Type,3.2,, +func,PySeqIter_New,3.2,, +data,PySeqIter_Type,3.2,, +func,PySequence_Check,3.2,, +func,PySequence_Concat,3.2,, +func,PySequence_Contains,3.2,, +func,PySequence_Count,3.2,, +func,PySequence_DelItem,3.2,, +func,PySequence_DelSlice,3.2,, +func,PySequence_Fast,3.2,, +func,PySequence_GetItem,3.2,, +func,PySequence_GetSlice,3.2,, +func,PySequence_In,3.2,, +func,PySequence_InPlaceConcat,3.2,, +func,PySequence_InPlaceRepeat,3.2,, +func,PySequence_Index,3.2,, +func,PySequence_Length,3.2,, +func,PySequence_List,3.2,, +func,PySequence_Repeat,3.2,, +func,PySequence_SetItem,3.2,, +func,PySequence_SetSlice,3.2,, +func,PySequence_Size,3.2,, +func,PySequence_Tuple,3.2,, +data,PySetIter_Type,3.2,, +func,PySet_Add,3.2,, +func,PySet_Clear,3.2,, +func,PySet_Contains,3.2,, +func,PySet_Discard,3.2,, +func,PySet_New,3.2,, +func,PySet_Pop,3.2,, +func,PySet_Size,3.2,, +data,PySet_Type,3.2,, +func,PySlice_AdjustIndices,3.7,, +func,PySlice_GetIndices,3.2,, +func,PySlice_GetIndicesEx,3.2,, +func,PySlice_New,3.2,, +data,PySlice_Type,3.2,, +func,PySlice_Unpack,3.7,, +func,PyState_AddModule,3.3,, +func,PyState_FindModule,3.2,, +func,PyState_RemoveModule,3.3,, type,PyStructSequence_Desc,3.2,,full-abi type,PyStructSequence_Field,3.2,,full-abi -function,PyStructSequence_GetItem,3.2,, -function,PyStructSequence_New,3.2,, -function,PyStructSequence_NewType,3.2,, -function,PyStructSequence_SetItem,3.2,, -var,PyStructSequence_UnnamedField,3.11,, -var,PySuper_Type,3.2,, -function,PySys_AddWarnOption,3.2,, -function,PySys_AddWarnOptionUnicode,3.2,, -function,PySys_AddXOption,3.7,, -function,PySys_FormatStderr,3.2,, -function,PySys_FormatStdout,3.2,, -function,PySys_GetObject,3.2,, -function,PySys_GetXOptions,3.7,, -function,PySys_HasWarnOptions,3.2,, -function,PySys_ResetWarnOptions,3.2,, -function,PySys_SetArgv,3.2,, -function,PySys_SetArgvEx,3.2,, -function,PySys_SetObject,3.2,, -function,PySys_SetPath,3.2,, -function,PySys_WriteStderr,3.2,, -function,PySys_WriteStdout,3.2,, +func,PyStructSequence_GetItem,3.2,, +func,PyStructSequence_New,3.2,, +func,PyStructSequence_NewType,3.2,, +func,PyStructSequence_SetItem,3.2,, +data,PyStructSequence_UnnamedField,3.11,, +data,PySuper_Type,3.2,, +func,PySys_Audit,3.13,, +func,PySys_AuditTuple,3.13,, +func,PySys_FormatStderr,3.2,, +func,PySys_FormatStdout,3.2,, +func,PySys_GetObject,3.2,, +func,PySys_GetXOptions,3.7,, +func,PySys_ResetWarnOptions,3.2,, +func,PySys_SetArgv,3.2,, +func,PySys_SetArgvEx,3.2,, +func,PySys_SetObject,3.2,, +func,PySys_WriteStderr,3.2,, +func,PySys_WriteStdout,3.2,, type,PyThreadState,3.2,,opaque -function,PyThreadState_Clear,3.2,, -function,PyThreadState_Delete,3.2,, -function,PyThreadState_Get,3.2,, -function,PyThreadState_GetDict,3.2,, -function,PyThreadState_GetFrame,3.10,, -function,PyThreadState_GetID,3.10,, -function,PyThreadState_GetInterpreter,3.10,, -function,PyThreadState_New,3.2,, -function,PyThreadState_SetAsyncExc,3.2,, -function,PyThreadState_Swap,3.2,, -function,PyThread_GetInfo,3.3,, -function,PyThread_ReInitTLS,3.2,, -function,PyThread_acquire_lock,3.2,, -function,PyThread_acquire_lock_timed,3.2,, -function,PyThread_allocate_lock,3.2,, -function,PyThread_create_key,3.2,, -function,PyThread_delete_key,3.2,, -function,PyThread_delete_key_value,3.2,, -function,PyThread_exit_thread,3.2,, -function,PyThread_free_lock,3.2,, -function,PyThread_get_key_value,3.2,, -function,PyThread_get_stacksize,3.2,, -function,PyThread_get_thread_ident,3.2,, -function,PyThread_get_thread_native_id,3.2,on platforms with native thread IDs, -function,PyThread_init_thread,3.2,, -function,PyThread_release_lock,3.2,, -function,PyThread_set_key_value,3.2,, -function,PyThread_set_stacksize,3.2,, -function,PyThread_start_new_thread,3.2,, -function,PyThread_tss_alloc,3.7,, -function,PyThread_tss_create,3.7,, -function,PyThread_tss_delete,3.7,, -function,PyThread_tss_free,3.7,, -function,PyThread_tss_get,3.7,, -function,PyThread_tss_is_created,3.7,, -function,PyThread_tss_set,3.7,, -function,PyTraceBack_Here,3.2,, -function,PyTraceBack_Print,3.2,, -var,PyTraceBack_Type,3.2,, -var,PyTupleIter_Type,3.2,, -function,PyTuple_GetItem,3.2,, -function,PyTuple_GetSlice,3.2,, -function,PyTuple_New,3.2,, -function,PyTuple_Pack,3.2,, -function,PyTuple_SetItem,3.2,, -function,PyTuple_Size,3.2,, -var,PyTuple_Type,3.2,, +func,PyThreadState_Clear,3.2,, +func,PyThreadState_Delete,3.2,, +func,PyThreadState_Get,3.2,, +func,PyThreadState_GetDict,3.2,, +func,PyThreadState_GetFrame,3.10,, +func,PyThreadState_GetID,3.10,, +func,PyThreadState_GetInterpreter,3.10,, +func,PyThreadState_New,3.2,, +func,PyThreadState_SetAsyncExc,3.2,, +func,PyThreadState_Swap,3.2,, +func,PyThread_GetInfo,3.3,, +func,PyThread_ReInitTLS,3.2,, +func,PyThread_acquire_lock,3.2,, +func,PyThread_acquire_lock_timed,3.2,, +func,PyThread_allocate_lock,3.2,, +func,PyThread_create_key,3.2,, +func,PyThread_delete_key,3.2,, +func,PyThread_delete_key_value,3.2,, +func,PyThread_exit_thread,3.2,, +func,PyThread_free_lock,3.2,, +func,PyThread_get_key_value,3.2,, +func,PyThread_get_stacksize,3.2,, +func,PyThread_get_thread_ident,3.2,, +func,PyThread_get_thread_native_id,3.2,on platforms with native thread IDs, +func,PyThread_init_thread,3.2,, +func,PyThread_release_lock,3.2,, +func,PyThread_set_key_value,3.2,, +func,PyThread_set_stacksize,3.2,, +func,PyThread_start_new_thread,3.2,, +func,PyThread_tss_alloc,3.7,, +func,PyThread_tss_create,3.7,, +func,PyThread_tss_delete,3.7,, +func,PyThread_tss_free,3.7,, +func,PyThread_tss_get,3.7,, +func,PyThread_tss_is_created,3.7,, +func,PyThread_tss_set,3.7,, +func,PyTraceBack_Here,3.2,, +func,PyTraceBack_Print,3.2,, +data,PyTraceBack_Type,3.2,, +data,PyTupleIter_Type,3.2,, +func,PyTuple_GetItem,3.2,, +func,PyTuple_GetSlice,3.2,, +func,PyTuple_New,3.2,, +func,PyTuple_Pack,3.2,, +func,PyTuple_SetItem,3.2,, +func,PyTuple_Size,3.2,, +data,PyTuple_Type,3.2,, type,PyTypeObject,3.2,,opaque -function,PyType_ClearCache,3.2,, -function,PyType_FromMetaclass,3.12,, -function,PyType_FromModuleAndSpec,3.10,, -function,PyType_FromSpec,3.2,, -function,PyType_FromSpecWithBases,3.3,, -function,PyType_GenericAlloc,3.2,, -function,PyType_GenericNew,3.2,, -function,PyType_GetFlags,3.2,, -function,PyType_GetModule,3.10,, -function,PyType_GetModuleState,3.10,, -function,PyType_GetName,3.11,, -function,PyType_GetQualName,3.11,, -function,PyType_GetSlot,3.4,, -function,PyType_GetTypeDataSize,3.12,, -function,PyType_IsSubtype,3.2,, -function,PyType_Modified,3.2,, -function,PyType_Ready,3.2,, +func,PyType_ClearCache,3.2,, +func,PyType_FromMetaclass,3.12,, +func,PyType_FromModuleAndSpec,3.10,, +func,PyType_FromSpec,3.2,, +func,PyType_FromSpecWithBases,3.3,, +func,PyType_GenericAlloc,3.2,, +func,PyType_GenericNew,3.2,, +func,PyType_GetFlags,3.2,, +func,PyType_GetFullyQualifiedName,3.13,, +func,PyType_GetModule,3.10,, +func,PyType_GetModuleByDef,3.13,, +func,PyType_GetModuleName,3.13,, +func,PyType_GetModuleState,3.10,, +func,PyType_GetName,3.11,, +func,PyType_GetQualName,3.11,, +func,PyType_GetSlot,3.4,, +func,PyType_GetTypeDataSize,3.12,, +func,PyType_IsSubtype,3.2,, +func,PyType_Modified,3.2,, +func,PyType_Ready,3.2,, type,PyType_Slot,3.2,,full-abi type,PyType_Spec,3.2,,full-abi -var,PyType_Type,3.2,, -function,PyUnicodeDecodeError_Create,3.2,, -function,PyUnicodeDecodeError_GetEncoding,3.2,, -function,PyUnicodeDecodeError_GetEnd,3.2,, -function,PyUnicodeDecodeError_GetObject,3.2,, -function,PyUnicodeDecodeError_GetReason,3.2,, -function,PyUnicodeDecodeError_GetStart,3.2,, -function,PyUnicodeDecodeError_SetEnd,3.2,, -function,PyUnicodeDecodeError_SetReason,3.2,, -function,PyUnicodeDecodeError_SetStart,3.2,, -function,PyUnicodeEncodeError_GetEncoding,3.2,, -function,PyUnicodeEncodeError_GetEnd,3.2,, -function,PyUnicodeEncodeError_GetObject,3.2,, -function,PyUnicodeEncodeError_GetReason,3.2,, -function,PyUnicodeEncodeError_GetStart,3.2,, -function,PyUnicodeEncodeError_SetEnd,3.2,, -function,PyUnicodeEncodeError_SetReason,3.2,, -function,PyUnicodeEncodeError_SetStart,3.2,, -var,PyUnicodeIter_Type,3.2,, -function,PyUnicodeTranslateError_GetEnd,3.2,, -function,PyUnicodeTranslateError_GetObject,3.2,, -function,PyUnicodeTranslateError_GetReason,3.2,, -function,PyUnicodeTranslateError_GetStart,3.2,, -function,PyUnicodeTranslateError_SetEnd,3.2,, -function,PyUnicodeTranslateError_SetReason,3.2,, -function,PyUnicodeTranslateError_SetStart,3.2,, -function,PyUnicode_Append,3.2,, -function,PyUnicode_AppendAndDel,3.2,, -function,PyUnicode_AsASCIIString,3.2,, -function,PyUnicode_AsCharmapString,3.2,, -function,PyUnicode_AsDecodedObject,3.2,, -function,PyUnicode_AsDecodedUnicode,3.2,, -function,PyUnicode_AsEncodedObject,3.2,, -function,PyUnicode_AsEncodedString,3.2,, -function,PyUnicode_AsEncodedUnicode,3.2,, -function,PyUnicode_AsLatin1String,3.2,, -function,PyUnicode_AsMBCSString,3.7,on Windows, -function,PyUnicode_AsRawUnicodeEscapeString,3.2,, -function,PyUnicode_AsUCS4,3.7,, -function,PyUnicode_AsUCS4Copy,3.7,, -function,PyUnicode_AsUTF16String,3.2,, -function,PyUnicode_AsUTF32String,3.2,, -function,PyUnicode_AsUTF8AndSize,3.10,, -function,PyUnicode_AsUTF8String,3.2,, -function,PyUnicode_AsUnicodeEscapeString,3.2,, -function,PyUnicode_AsWideChar,3.2,, -function,PyUnicode_AsWideCharString,3.7,, -function,PyUnicode_BuildEncodingMap,3.2,, -function,PyUnicode_Compare,3.2,, -function,PyUnicode_CompareWithASCIIString,3.2,, -function,PyUnicode_Concat,3.2,, -function,PyUnicode_Contains,3.2,, -function,PyUnicode_Count,3.2,, -function,PyUnicode_Decode,3.2,, -function,PyUnicode_DecodeASCII,3.2,, -function,PyUnicode_DecodeCharmap,3.2,, -function,PyUnicode_DecodeCodePageStateful,3.7,on Windows, -function,PyUnicode_DecodeFSDefault,3.2,, -function,PyUnicode_DecodeFSDefaultAndSize,3.2,, -function,PyUnicode_DecodeLatin1,3.2,, -function,PyUnicode_DecodeLocale,3.7,, -function,PyUnicode_DecodeLocaleAndSize,3.7,, -function,PyUnicode_DecodeMBCS,3.7,on Windows, -function,PyUnicode_DecodeMBCSStateful,3.7,on Windows, -function,PyUnicode_DecodeRawUnicodeEscape,3.2,, -function,PyUnicode_DecodeUTF16,3.2,, -function,PyUnicode_DecodeUTF16Stateful,3.2,, -function,PyUnicode_DecodeUTF32,3.2,, -function,PyUnicode_DecodeUTF32Stateful,3.2,, -function,PyUnicode_DecodeUTF7,3.2,, -function,PyUnicode_DecodeUTF7Stateful,3.2,, -function,PyUnicode_DecodeUTF8,3.2,, -function,PyUnicode_DecodeUTF8Stateful,3.2,, -function,PyUnicode_DecodeUnicodeEscape,3.2,, -function,PyUnicode_EncodeCodePage,3.7,on Windows, -function,PyUnicode_EncodeFSDefault,3.2,, -function,PyUnicode_EncodeLocale,3.7,, -function,PyUnicode_FSConverter,3.2,, -function,PyUnicode_FSDecoder,3.2,, -function,PyUnicode_Find,3.2,, -function,PyUnicode_FindChar,3.7,, -function,PyUnicode_Format,3.2,, -function,PyUnicode_FromEncodedObject,3.2,, -function,PyUnicode_FromFormat,3.2,, -function,PyUnicode_FromFormatV,3.2,, -function,PyUnicode_FromObject,3.2,, -function,PyUnicode_FromOrdinal,3.2,, -function,PyUnicode_FromString,3.2,, -function,PyUnicode_FromStringAndSize,3.2,, -function,PyUnicode_FromWideChar,3.2,, -function,PyUnicode_GetDefaultEncoding,3.2,, -function,PyUnicode_GetLength,3.7,, -function,PyUnicode_InternFromString,3.2,, -function,PyUnicode_InternInPlace,3.2,, -function,PyUnicode_IsIdentifier,3.2,, -function,PyUnicode_Join,3.2,, -function,PyUnicode_Partition,3.2,, -function,PyUnicode_RPartition,3.2,, -function,PyUnicode_RSplit,3.2,, -function,PyUnicode_ReadChar,3.7,, -function,PyUnicode_Replace,3.2,, -function,PyUnicode_Resize,3.2,, -function,PyUnicode_RichCompare,3.2,, -function,PyUnicode_Split,3.2,, -function,PyUnicode_Splitlines,3.2,, -function,PyUnicode_Substring,3.7,, -function,PyUnicode_Tailmatch,3.2,, -function,PyUnicode_Translate,3.2,, -var,PyUnicode_Type,3.2,, -function,PyUnicode_WriteChar,3.7,, +data,PyType_Type,3.2,, +func,PyUnicodeDecodeError_Create,3.2,, +func,PyUnicodeDecodeError_GetEncoding,3.2,, +func,PyUnicodeDecodeError_GetEnd,3.2,, +func,PyUnicodeDecodeError_GetObject,3.2,, +func,PyUnicodeDecodeError_GetReason,3.2,, +func,PyUnicodeDecodeError_GetStart,3.2,, +func,PyUnicodeDecodeError_SetEnd,3.2,, +func,PyUnicodeDecodeError_SetReason,3.2,, +func,PyUnicodeDecodeError_SetStart,3.2,, +func,PyUnicodeEncodeError_GetEncoding,3.2,, +func,PyUnicodeEncodeError_GetEnd,3.2,, +func,PyUnicodeEncodeError_GetObject,3.2,, +func,PyUnicodeEncodeError_GetReason,3.2,, +func,PyUnicodeEncodeError_GetStart,3.2,, +func,PyUnicodeEncodeError_SetEnd,3.2,, +func,PyUnicodeEncodeError_SetReason,3.2,, +func,PyUnicodeEncodeError_SetStart,3.2,, +data,PyUnicodeIter_Type,3.2,, +func,PyUnicodeTranslateError_GetEnd,3.2,, +func,PyUnicodeTranslateError_GetObject,3.2,, +func,PyUnicodeTranslateError_GetReason,3.2,, +func,PyUnicodeTranslateError_GetStart,3.2,, +func,PyUnicodeTranslateError_SetEnd,3.2,, +func,PyUnicodeTranslateError_SetReason,3.2,, +func,PyUnicodeTranslateError_SetStart,3.2,, +func,PyUnicode_Append,3.2,, +func,PyUnicode_AppendAndDel,3.2,, +func,PyUnicode_AsASCIIString,3.2,, +func,PyUnicode_AsCharmapString,3.2,, +func,PyUnicode_AsDecodedObject,3.2,, +func,PyUnicode_AsDecodedUnicode,3.2,, +func,PyUnicode_AsEncodedObject,3.2,, +func,PyUnicode_AsEncodedString,3.2,, +func,PyUnicode_AsEncodedUnicode,3.2,, +func,PyUnicode_AsLatin1String,3.2,, +func,PyUnicode_AsMBCSString,3.7,on Windows, +func,PyUnicode_AsRawUnicodeEscapeString,3.2,, +func,PyUnicode_AsUCS4,3.7,, +func,PyUnicode_AsUCS4Copy,3.7,, +func,PyUnicode_AsUTF16String,3.2,, +func,PyUnicode_AsUTF32String,3.2,, +func,PyUnicode_AsUTF8AndSize,3.10,, +func,PyUnicode_AsUTF8String,3.2,, +func,PyUnicode_AsUnicodeEscapeString,3.2,, +func,PyUnicode_AsWideChar,3.2,, +func,PyUnicode_AsWideCharString,3.7,, +func,PyUnicode_BuildEncodingMap,3.2,, +func,PyUnicode_Compare,3.2,, +func,PyUnicode_CompareWithASCIIString,3.2,, +func,PyUnicode_Concat,3.2,, +func,PyUnicode_Contains,3.2,, +func,PyUnicode_Count,3.2,, +func,PyUnicode_Decode,3.2,, +func,PyUnicode_DecodeASCII,3.2,, +func,PyUnicode_DecodeCharmap,3.2,, +func,PyUnicode_DecodeCodePageStateful,3.7,on Windows, +func,PyUnicode_DecodeFSDefault,3.2,, +func,PyUnicode_DecodeFSDefaultAndSize,3.2,, +func,PyUnicode_DecodeLatin1,3.2,, +func,PyUnicode_DecodeLocale,3.7,, +func,PyUnicode_DecodeLocaleAndSize,3.7,, +func,PyUnicode_DecodeMBCS,3.7,on Windows, +func,PyUnicode_DecodeMBCSStateful,3.7,on Windows, +func,PyUnicode_DecodeRawUnicodeEscape,3.2,, +func,PyUnicode_DecodeUTF16,3.2,, +func,PyUnicode_DecodeUTF16Stateful,3.2,, +func,PyUnicode_DecodeUTF32,3.2,, +func,PyUnicode_DecodeUTF32Stateful,3.2,, +func,PyUnicode_DecodeUTF7,3.2,, +func,PyUnicode_DecodeUTF7Stateful,3.2,, +func,PyUnicode_DecodeUTF8,3.2,, +func,PyUnicode_DecodeUTF8Stateful,3.2,, +func,PyUnicode_DecodeUnicodeEscape,3.2,, +func,PyUnicode_EncodeCodePage,3.7,on Windows, +func,PyUnicode_EncodeFSDefault,3.2,, +func,PyUnicode_EncodeLocale,3.7,, +func,PyUnicode_EqualToUTF8,3.13,, +func,PyUnicode_EqualToUTF8AndSize,3.13,, +func,PyUnicode_FSConverter,3.2,, +func,PyUnicode_FSDecoder,3.2,, +func,PyUnicode_Find,3.2,, +func,PyUnicode_FindChar,3.7,, +func,PyUnicode_Format,3.2,, +func,PyUnicode_FromEncodedObject,3.2,, +func,PyUnicode_FromFormat,3.2,, +func,PyUnicode_FromFormatV,3.2,, +func,PyUnicode_FromObject,3.2,, +func,PyUnicode_FromOrdinal,3.2,, +func,PyUnicode_FromString,3.2,, +func,PyUnicode_FromStringAndSize,3.2,, +func,PyUnicode_FromWideChar,3.2,, +func,PyUnicode_GetDefaultEncoding,3.2,, +func,PyUnicode_GetLength,3.7,, +func,PyUnicode_InternFromString,3.2,, +func,PyUnicode_InternInPlace,3.2,, +func,PyUnicode_IsIdentifier,3.2,, +func,PyUnicode_Join,3.2,, +func,PyUnicode_Partition,3.2,, +func,PyUnicode_RPartition,3.2,, +func,PyUnicode_RSplit,3.2,, +func,PyUnicode_ReadChar,3.7,, +func,PyUnicode_Replace,3.2,, +func,PyUnicode_Resize,3.2,, +func,PyUnicode_RichCompare,3.2,, +func,PyUnicode_Split,3.2,, +func,PyUnicode_Splitlines,3.2,, +func,PyUnicode_Substring,3.7,, +func,PyUnicode_Tailmatch,3.2,, +func,PyUnicode_Translate,3.2,, +data,PyUnicode_Type,3.2,, +func,PyUnicode_WriteChar,3.7,, type,PyVarObject,3.2,,members member,PyVarObject.ob_base,3.2,, member,PyVarObject.ob_size,3.2,, -function,PyVectorcall_Call,3.12,, -function,PyVectorcall_NARGS,3.12,, +func,PyVectorcall_Call,3.12,, +func,PyVectorcall_NARGS,3.12,, type,PyWeakReference,3.2,,opaque -function,PyWeakref_GetObject,3.2,, -function,PyWeakref_NewProxy,3.2,, -function,PyWeakref_NewRef,3.2,, -var,PyWrapperDescr_Type,3.2,, -function,PyWrapper_New,3.2,, -var,PyZip_Type,3.2,, -function,Py_AddPendingCall,3.2,, -function,Py_AtExit,3.2,, +func,PyWeakref_GetObject,3.2,, +func,PyWeakref_GetRef,3.13,, +func,PyWeakref_NewProxy,3.2,, +func,PyWeakref_NewRef,3.2,, +data,PyWrapperDescr_Type,3.2,, +func,PyWrapper_New,3.2,, +data,PyZip_Type,3.2,, +func,Py_AddPendingCall,3.2,, +func,Py_AtExit,3.2,, macro,Py_BEGIN_ALLOW_THREADS,3.2,, macro,Py_BLOCK_THREADS,3.2,, -function,Py_BuildValue,3.2,, -function,Py_BytesMain,3.8,, -function,Py_CompileString,3.2,, -function,Py_DecRef,3.2,, -function,Py_DecodeLocale,3.7,, +func,Py_BuildValue,3.2,, +func,Py_BytesMain,3.8,, +func,Py_CompileString,3.2,, +func,Py_DecRef,3.2,, +func,Py_DecodeLocale,3.7,, macro,Py_END_ALLOW_THREADS,3.2,, -function,Py_EncodeLocale,3.7,, -function,Py_EndInterpreter,3.2,, -function,Py_EnterRecursiveCall,3.9,, -function,Py_Exit,3.2,, -function,Py_FatalError,3.2,, -var,Py_FileSystemDefaultEncodeErrors,3.10,, -var,Py_FileSystemDefaultEncoding,3.2,, -function,Py_Finalize,3.2,, -function,Py_FinalizeEx,3.6,, -function,Py_GenericAlias,3.9,, -var,Py_GenericAliasType,3.9,, -function,Py_GetBuildInfo,3.2,, -function,Py_GetCompiler,3.2,, -function,Py_GetCopyright,3.2,, -function,Py_GetExecPrefix,3.2,, -function,Py_GetPath,3.2,, -function,Py_GetPlatform,3.2,, -function,Py_GetPrefix,3.2,, -function,Py_GetProgramFullPath,3.2,, -function,Py_GetProgramName,3.2,, -function,Py_GetPythonHome,3.2,, -function,Py_GetRecursionLimit,3.2,, -function,Py_GetVersion,3.2,, -var,Py_HasFileSystemDefaultEncoding,3.2,, -function,Py_IncRef,3.2,, -function,Py_Initialize,3.2,, -function,Py_InitializeEx,3.2,, -function,Py_Is,3.10,, -function,Py_IsFalse,3.10,, -function,Py_IsInitialized,3.2,, -function,Py_IsNone,3.10,, -function,Py_IsTrue,3.10,, -function,Py_LeaveRecursiveCall,3.9,, -function,Py_Main,3.2,, -function,Py_MakePendingCalls,3.2,, -function,Py_NewInterpreter,3.2,, -function,Py_NewRef,3.10,, -function,Py_ReprEnter,3.2,, -function,Py_ReprLeave,3.2,, -function,Py_SetPath,3.7,, -function,Py_SetProgramName,3.2,, -function,Py_SetPythonHome,3.2,, -function,Py_SetRecursionLimit,3.2,, +func,Py_EncodeLocale,3.7,, +func,Py_EndInterpreter,3.2,, +func,Py_EnterRecursiveCall,3.9,, +func,Py_Exit,3.2,, +func,Py_FatalError,3.2,, +data,Py_FileSystemDefaultEncodeErrors,3.10,, +data,Py_FileSystemDefaultEncoding,3.2,, +func,Py_Finalize,3.2,, +func,Py_FinalizeEx,3.6,, +func,Py_GenericAlias,3.9,, +data,Py_GenericAliasType,3.9,, +func,Py_GetBuildInfo,3.2,, +func,Py_GetCompiler,3.2,, +func,Py_GetConstant,3.13,, +func,Py_GetConstantBorrowed,3.13,, +func,Py_GetCopyright,3.2,, +func,Py_GetExecPrefix,3.2,, +func,Py_GetPath,3.2,, +func,Py_GetPlatform,3.2,, +func,Py_GetPrefix,3.2,, +func,Py_GetProgramFullPath,3.2,, +func,Py_GetProgramName,3.2,, +func,Py_GetPythonHome,3.2,, +func,Py_GetRecursionLimit,3.2,, +func,Py_GetVersion,3.2,, +data,Py_HasFileSystemDefaultEncoding,3.2,, +func,Py_IncRef,3.2,, +func,Py_Initialize,3.2,, +func,Py_InitializeEx,3.2,, +func,Py_Is,3.10,, +func,Py_IsFalse,3.10,, +func,Py_IsFinalizing,3.13,, +func,Py_IsInitialized,3.2,, +func,Py_IsNone,3.10,, +func,Py_IsTrue,3.10,, +func,Py_LeaveRecursiveCall,3.9,, +func,Py_Main,3.2,, +func,Py_MakePendingCalls,3.2,, +func,Py_NewInterpreter,3.2,, +func,Py_NewRef,3.10,, +func,Py_ReprEnter,3.2,, +func,Py_ReprLeave,3.2,, +func,Py_SetProgramName,3.2,, +func,Py_SetPythonHome,3.2,, +func,Py_SetRecursionLimit,3.2,, type,Py_UCS4,3.2,, macro,Py_UNBLOCK_THREADS,3.2,, -var,Py_UTF8Mode,3.8,, -function,Py_VaBuildValue,3.2,, -var,Py_Version,3.11,, -function,Py_XNewRef,3.10,, +data,Py_UTF8Mode,3.8,, +func,Py_VaBuildValue,3.2,, +data,Py_Version,3.11,, +func,Py_XNewRef,3.10,, type,Py_buffer,3.11,,full-abi type,Py_intptr_t,3.2,, type,Py_ssize_t,3.2,, diff --git a/Doc/deprecations/c-api-pending-removal-in-3.14.rst b/Doc/deprecations/c-api-pending-removal-in-3.14.rst new file mode 100644 index 00000000..d16da66c --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-3.14.rst @@ -0,0 +1,72 @@ +Pending Removal in Python 3.14 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules + (:pep:`699`; :gh:`101193`). + +* Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable + bases (:gh:`95388`). + +* Functions to configure Python's initialization, deprecated in Python 3.11: + + * :c:func:`!PySys_SetArgvEx()`: + Set :c:member:`PyConfig.argv` instead. + * :c:func:`!PySys_SetArgv()`: + Set :c:member:`PyConfig.argv` instead. + * :c:func:`!Py_SetProgramName()`: + Set :c:member:`PyConfig.program_name` instead. + * :c:func:`!Py_SetPythonHome()`: + Set :c:member:`PyConfig.home` instead. + + The :c:func:`Py_InitializeFromConfig` API should be used with + :c:type:`PyConfig` instead. + +* Global configuration variables: + + * :c:var:`Py_DebugFlag`: + Use :c:member:`PyConfig.parser_debug` instead. + * :c:var:`Py_VerboseFlag`: + Use :c:member:`PyConfig.verbose` instead. + * :c:var:`Py_QuietFlag`: + Use :c:member:`PyConfig.quiet` instead. + * :c:var:`Py_InteractiveFlag`: + Use :c:member:`PyConfig.interactive` instead. + * :c:var:`Py_InspectFlag`: + Use :c:member:`PyConfig.inspect` instead. + * :c:var:`Py_OptimizeFlag`: + Use :c:member:`PyConfig.optimization_level` instead. + * :c:var:`Py_NoSiteFlag`: + Use :c:member:`PyConfig.site_import` instead. + * :c:var:`Py_BytesWarningFlag`: + Use :c:member:`PyConfig.bytes_warning` instead. + * :c:var:`Py_FrozenFlag`: + Use :c:member:`PyConfig.pathconfig_warnings` instead. + * :c:var:`Py_IgnoreEnvironmentFlag`: + Use :c:member:`PyConfig.use_environment` instead. + * :c:var:`Py_DontWriteBytecodeFlag`: + Use :c:member:`PyConfig.write_bytecode` instead. + * :c:var:`Py_NoUserSiteDirectory`: + Use :c:member:`PyConfig.user_site_directory` instead. + * :c:var:`Py_UnbufferedStdioFlag`: + Use :c:member:`PyConfig.buffered_stdio` instead. + * :c:var:`Py_HashRandomizationFlag`: + Use :c:member:`PyConfig.use_hash_seed` + and :c:member:`PyConfig.hash_seed` instead. + * :c:var:`Py_IsolatedFlag`: + Use :c:member:`PyConfig.isolated` instead. + * :c:var:`Py_LegacyWindowsFSEncodingFlag`: + Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` instead. + * :c:var:`Py_LegacyWindowsStdioFlag`: + Use :c:member:`PyConfig.legacy_windows_stdio` instead. + * :c:var:`!Py_FileSystemDefaultEncoding`: + Use :c:member:`PyConfig.filesystem_encoding` instead. + * :c:var:`!Py_HasFileSystemDefaultEncoding`: + Use :c:member:`PyConfig.filesystem_encoding` instead. + * :c:var:`!Py_FileSystemDefaultEncodeErrors`: + Use :c:member:`PyConfig.filesystem_errors` instead. + * :c:var:`!Py_UTF8Mode`: + Use :c:member:`PyPreConfig.utf8_mode` instead. + (see :c:func:`Py_PreInitialize`) + + The :c:func:`Py_InitializeFromConfig` API should be used with + :c:type:`PyConfig` instead. diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst new file mode 100644 index 00000000..fcb703e6 --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -0,0 +1,27 @@ +Pending Removal in Python 3.15 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The bundled copy of ``libmpdecimal``. +* The :c:func:`PyImport_ImportModuleNoBlock`: + Use :c:func:`PyImport_ImportModule` instead. +* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`: + Use :c:func:`PyWeakref_GetRef` instead. +* :c:type:`Py_UNICODE` type and the :c:macro:`!Py_UNICODE_WIDE` macro: + Use :c:type:`wchar_t` instead. +* Python initialization functions: + + * :c:func:`PySys_ResetWarnOptions`: + Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead. + * :c:func:`Py_GetExecPrefix`: + Get :data:`sys.base_exec_prefix` and :data:`sys.exec_prefix` instead. + * :c:func:`Py_GetPath`: + Get :data:`sys.path` instead. + * :c:func:`Py_GetPrefix`: + Get :data:`sys.base_prefix` and :data:`sys.prefix` instead. + * :c:func:`Py_GetProgramFullPath`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetProgramName`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetPythonHome`: + Get :c:member:`PyConfig.home` + or the :envvar:`PYTHONHOME` environment variable instead. diff --git a/Doc/deprecations/c-api-pending-removal-in-future.rst b/Doc/deprecations/c-api-pending-removal-in-future.rst new file mode 100644 index 00000000..0c3ae52b --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-future.rst @@ -0,0 +1,51 @@ +Pending Removal in Future Versions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following APIs are deprecated and will be removed, +although there is currently no date scheduled for their removal. + +* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: + Unneeded since Python 3.8. +* :c:func:`PyErr_Fetch`: + Use :c:func:`PyErr_GetRaisedException` instead. +* :c:func:`PyErr_NormalizeException`: + Use :c:func:`PyErr_GetRaisedException` instead. +* :c:func:`PyErr_Restore`: + Use :c:func:`PyErr_SetRaisedException` instead. +* :c:func:`PyModule_GetFilename`: + Use :c:func:`PyModule_GetFilenameObject` instead. +* :c:func:`PyOS_AfterFork`: + Use :c:func:`PyOS_AfterFork_Child` instead. +* :c:func:`PySlice_GetIndicesEx`: + Use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` instead. +* :c:func:`!PyUnicode_AsDecodedObject`: + Use :c:func:`PyCodec_Decode` instead. +* :c:func:`!PyUnicode_AsDecodedUnicode`: + Use :c:func:`PyCodec_Decode` instead. +* :c:func:`!PyUnicode_AsEncodedObject`: + Use :c:func:`PyCodec_Encode` instead. +* :c:func:`!PyUnicode_AsEncodedUnicode`: + Use :c:func:`PyCodec_Encode` instead. +* :c:func:`PyUnicode_READY`: + Unneeded since Python 3.12 +* :c:func:`!PyErr_Display`: + Use :c:func:`PyErr_DisplayException` instead. +* :c:func:`!_PyErr_ChainExceptions`: + Use :c:func:`!_PyErr_ChainExceptions1` instead. +* :c:member:`!PyBytesObject.ob_shash` member: + call :c:func:`PyObject_Hash` instead. +* :c:member:`!PyDictObject.ma_version_tag` member. +* Thread Local Storage (TLS) API: + + * :c:func:`PyThread_create_key`: + Use :c:func:`PyThread_tss_alloc` instead. + * :c:func:`PyThread_delete_key`: + Use :c:func:`PyThread_tss_free` instead. + * :c:func:`PyThread_set_key_value`: + Use :c:func:`PyThread_tss_set` instead. + * :c:func:`PyThread_get_key_value`: + Use :c:func:`PyThread_tss_get` instead. + * :c:func:`PyThread_delete_key_value`: + Use :c:func:`PyThread_tss_delete` instead. + * :c:func:`PyThread_ReInitTLS`: + Unneeded since Python 3.7. diff --git a/Doc/deprecations/index.rst b/Doc/deprecations/index.rst new file mode 100644 index 00000000..5aa7062a --- /dev/null +++ b/Doc/deprecations/index.rst @@ -0,0 +1,19 @@ +Deprecations +============ + +.. include:: pending-removal-in-3.14.rst + +.. include:: pending-removal-in-3.15.rst + +.. include:: pending-removal-in-3.16.rst + +.. include:: pending-removal-in-future.rst + +C API Deprecations +------------------ + +.. include:: c-api-pending-removal-in-3.14.rst + +.. include:: c-api-pending-removal-in-3.15.rst + +.. include:: c-api-pending-removal-in-future.rst diff --git a/Doc/deprecations/pending-removal-in-3.13.rst b/Doc/deprecations/pending-removal-in-3.13.rst new file mode 100644 index 00000000..89790497 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.13.rst @@ -0,0 +1,52 @@ +Pending Removal in Python 3.13 +------------------------------ + +Modules (see :pep:`594`): + +* :mod:`!aifc` +* :mod:`!audioop` +* :mod:`!cgi` +* :mod:`!cgitb` +* :mod:`!chunk` +* :mod:`!crypt` +* :mod:`!imghdr` +* :mod:`!mailcap` +* :mod:`!msilib` +* :mod:`!nis` +* :mod:`!nntplib` +* :mod:`!ossaudiodev` +* :mod:`!pipes` +* :mod:`!sndhdr` +* :mod:`!spwd` +* :mod:`!sunau` +* :mod:`!telnetlib` +* :mod:`!uu` +* :mod:`!xdrlib` + +Other modules: + +* :mod:`!lib2to3`, and the :program:`2to3` program (:gh:`84540`) + +APIs: + +* :class:`!configparser.LegacyInterpolation` (:gh:`90765`) +* ``locale.resetlocale()`` (:gh:`90817`) +* :meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`) +* :func:`!unittest.findTestCases` (:gh:`50096`) +* :func:`!unittest.getTestCaseNames` (:gh:`50096`) +* :func:`!unittest.makeSuite` (:gh:`50096`) +* :meth:`!unittest.TestProgram.usageExit` (:gh:`67048`) +* :class:`!webbrowser.MacOSX` (:gh:`86421`) +* :class:`classmethod` descriptor chaining (:gh:`89519`) +* :mod:`importlib.resources` deprecated methods: + + * ``contents()`` + * ``is_resource()`` + * ``open_binary()`` + * ``open_text()`` + * ``path()`` + * ``read_binary()`` + * ``read_text()`` + + Use :func:`importlib.resources.files` instead. Refer to `importlib-resources: Migrating from Legacy + <https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy>`_ (:gh:`106531`) diff --git a/Doc/deprecations/pending-removal-in-3.14.rst b/Doc/deprecations/pending-removal-in-3.14.rst new file mode 100644 index 00000000..15606f61 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.14.rst @@ -0,0 +1,105 @@ +Pending Removal in Python 3.14 +------------------------------ + +* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters + of :class:`!argparse.BooleanOptionalAction` are deprecated + and will be removed in 3.14. + (Contributed by Nikita Sobolev in :gh:`92248`.) + +* :mod:`ast`: The following features have been deprecated in documentation + since Python 3.8, now cause a :exc:`DeprecationWarning` to be emitted at + runtime when they are accessed or used, and will be removed in Python 3.14: + + * :class:`!ast.Num` + * :class:`!ast.Str` + * :class:`!ast.Bytes` + * :class:`!ast.NameConstant` + * :class:`!ast.Ellipsis` + + Use :class:`ast.Constant` instead. + (Contributed by Serhiy Storchaka in :gh:`90953`.) + +* :mod:`asyncio`: + + * The child watcher classes :class:`~asyncio.MultiLoopChildWatcher`, + :class:`~asyncio.FastChildWatcher`, :class:`~asyncio.AbstractChildWatcher` + and :class:`~asyncio.SafeChildWatcher` are deprecated and + will be removed in Python 3.14. + (Contributed by Kumar Aditya in :gh:`94597`.) + + * :func:`asyncio.set_child_watcher`, :func:`asyncio.get_child_watcher`, + :meth:`asyncio.AbstractEventLoopPolicy.set_child_watcher` and + :meth:`asyncio.AbstractEventLoopPolicy.get_child_watcher` are deprecated + and will be removed in Python 3.14. + (Contributed by Kumar Aditya in :gh:`94597`.) + + * The :meth:`~asyncio.get_event_loop` method of the + default event loop policy now emits a :exc:`DeprecationWarning` if there + is no current event loop set and it decides to create one. + (Contributed by Serhiy Storchaka and Guido van Rossum in :gh:`100160`.) + +* :mod:`collections.abc`: Deprecated :class:`~collections.abc.ByteString`. + Prefer :class:`!Sequence` or :class:`~collections.abc.Buffer`. + For use in typing, prefer a union, like ``bytes | bytearray``, + or :class:`collections.abc.Buffer`. + (Contributed by Shantanu Jain in :gh:`91896`.) + +* :mod:`email`: Deprecated the *isdst* parameter in :func:`email.utils.localtime`. + (Contributed by Alan Williams in :gh:`72346`.) + +* :mod:`importlib.abc` deprecated classes: + + * :class:`!importlib.abc.ResourceReader` + * :class:`!importlib.abc.Traversable` + * :class:`!importlib.abc.TraversableResources` + + Use :mod:`importlib.resources.abc` classes instead: + + * :class:`importlib.resources.abc.Traversable` + * :class:`importlib.resources.abc.TraversableResources` + + (Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.) + +* :mod:`itertools` had undocumented, inefficient, historically buggy, + and inconsistent support for copy, deepcopy, and pickle operations. + This will be removed in 3.14 for a significant reduction in code + volume and maintenance burden. + (Contributed by Raymond Hettinger in :gh:`101588`.) + +* :mod:`multiprocessing`: The default start method will change to a safer one on + Linux, BSDs, and other non-macOS POSIX platforms where ``'fork'`` is currently + the default (:gh:`84559`). Adding a runtime warning about this was deemed too + disruptive as the majority of code is not expected to care. Use the + :func:`~multiprocessing.get_context` or + :func:`~multiprocessing.set_start_method` APIs to explicitly specify when + your code *requires* ``'fork'``. See :ref:`multiprocessing-start-methods`. + +* :mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to` and + :meth:`~pathlib.PurePath.relative_to`: passing additional arguments is + deprecated. + +* :mod:`pkgutil`: :func:`~pkgutil.find_loader` and :func:`~pkgutil.get_loader` + now raise :exc:`DeprecationWarning`; + use :func:`importlib.util.find_spec` instead. + (Contributed by Nikita Sobolev in :gh:`97850`.) + +* :mod:`pty`: + + * ``master_open()``: use :func:`pty.openpty`. + * ``slave_open()``: use :func:`pty.openpty`. + +* :mod:`sqlite3`: + + * :data:`~sqlite3.version` and :data:`~sqlite3.version_info`. + + * :meth:`~sqlite3.Cursor.execute` and :meth:`~sqlite3.Cursor.executemany` + if :ref:`named placeholders <sqlite3-placeholders>` are used and + *parameters* is a sequence instead of a :class:`dict`. + +* :mod:`typing`: :class:`~typing.ByteString`, deprecated since Python 3.9, + now causes a :exc:`DeprecationWarning` to be emitted when it is used. + +* :mod:`urllib`: + :class:`!urllib.parse.Quoter` is deprecated: it was not intended to be a + public API. + (Contributed by Gregory P. Smith in :gh:`88168`.) diff --git a/Doc/deprecations/pending-removal-in-3.15.rst b/Doc/deprecations/pending-removal-in-3.15.rst new file mode 100644 index 00000000..f0b184b6 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.15.rst @@ -0,0 +1,89 @@ +Pending Removal in Python 3.15 +------------------------------ + +* The import system: + + * Setting :attr:`~module.__cached__` on a module while + failing to set :attr:`__spec__.cached <importlib.machinery.ModuleSpec.cached>` + is deprecated. In Python 3.15, :attr:`!__cached__` will cease to be set or + take into consideration by the import system or standard library. (:gh:`97879`) + + * Setting :attr:`~module.__package__` on a module while + failing to set :attr:`__spec__.parent <importlib.machinery.ModuleSpec.parent>` + is deprecated. In Python 3.15, :attr:`!__package__` will cease to be set or + take into consideration by the import system or standard library. (:gh:`97879`) + +* :mod:`ctypes`: + + * The undocumented :func:`!ctypes.SetPointerType` function + has been deprecated since Python 3.13. + +* :mod:`http.server`: + + * The obsolete and rarely used :class:`~http.server.CGIHTTPRequestHandler` + has been deprecated since Python 3.13. + No direct replacement exists. + *Anything* is better than CGI to interface + a web server with a request handler. + + * The :option:`!--cgi` flag to the :program:`python -m http.server` + command-line interface has been deprecated since Python 3.13. + +* :class:`locale`: + + * The :func:`~locale.getdefaultlocale` function + has been deprecated since Python 3.11. + Its removal was originally planned for Python 3.13 (:gh:`90817`), + but has been postponed to Python 3.15. + Use :func:`~locale.getlocale`, :func:`~locale.setlocale`, + and :func:`~locale.getencoding` instead. + (Contributed by Hugo van Kemenade in :gh:`111187`.) + +* :mod:`pathlib`: + + * :meth:`.PurePath.is_reserved` + has been deprecated since Python 3.13. + Use :func:`os.path.isreserved` to detect reserved paths on Windows. + +* :mod:`platform`: + + * :func:`~platform.java_ver` has been deprecated since Python 3.13. + This function is only useful for Jython support, has a confusing API, + and is largely untested. + +* :mod:`threading`: + + * :func:`~threading.RLock` will take no arguments in Python 3.15. + Passing any arguments has been deprecated since Python 3.14, + as the Python version does not permit any arguments, + but the C version allows any number of positional or keyword arguments, + ignoring every argument. + +* :mod:`types`: + + * :class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was + deprecated in :pep:`626` + since 3.10 and was planned to be removed in 3.12, + but it only got a proper :exc:`DeprecationWarning` in 3.12. + May be removed in 3.15. + (Contributed by Nikita Sobolev in :gh:`101866`.) + +* :mod:`typing`: + + * The undocumented keyword argument syntax for creating + :class:`~typing.NamedTuple` classes + (e.g. ``Point = NamedTuple("Point", x=int, y=int)``) + has been deprecated since Python 3.13. + Use the class-based syntax or the functional syntax instead. + + * The :func:`typing.no_type_check_decorator` decorator function + has been deprecated since Python 3.13. + After eight years in the :mod:`typing` module, + it has yet to be supported by any major type checker. + +* :mod:`wave`: + + * The :meth:`~wave.Wave_read.getmark`, :meth:`!setmark`, + and :meth:`~wave.Wave_read.getmarkers` methods of + the :class:`~wave.Wave_read` and :class:`~wave.Wave_write` classes + have been deprecated since Python 3.13. diff --git a/Doc/deprecations/pending-removal-in-3.16.rst b/Doc/deprecations/pending-removal-in-3.16.rst new file mode 100644 index 00000000..6f6954b7 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.16.rst @@ -0,0 +1,56 @@ +Pending removal in Python 3.16 +------------------------------ + +* The import system: + + * Setting :attr:`~module.__loader__` on a module while + failing to set :attr:`__spec__.loader <importlib.machinery.ModuleSpec.loader>` + is deprecated. In Python 3.16, :attr:`!__loader__` will cease to be set or + taken into consideration by the import system or the standard library. + +* :mod:`array`: + + * The ``'u'`` format code (:c:type:`wchar_t`) + has been deprecated in documentation since Python 3.3 + and at runtime since Python 3.13. + Use the ``'w'`` format code (:c:type:`Py_UCS4`) + for Unicode characters instead. + +* :mod:`asyncio`: + + * :func:`!asyncio.iscoroutinefunction` is deprecated + and will be removed in Python 3.16, + use :func:`inspect.iscoroutinefunction` instead. + (Contributed by Jiahao Li and Kumar Aditya in :gh:`122875`.) + +* :mod:`builtins`: + + * Bitwise inversion on boolean types, ``~True`` or ``~False`` + has been deprecated since Python 3.12, + as it produces surprising and unintuitive results (``-2`` and ``-1``). + Use ``not x`` instead for the logical negation of a Boolean. + In the rare case that you need the bitwise inversion of + the underlying integer, convert to ``int`` explicitly (``~int(x)``). + +* :mod:`shutil`: + + * The :class:`!ExecError` exception + has been deprecated since Python 3.14. + It has not been used by any function in :mod:`!shutil` since Python 3.4, + and is now an alias of :exc:`RuntimeError`. + +* :mod:`symtable`: + + * The :meth:`Class.get_methods <symtable.Class.get_methods>` method + has been deprecated since Python 3.14. + +* :mod:`sys`: + + * The :func:`~sys._enablelegacywindowsfsencoding` function + has been deprecated since Python 3.13. + Use the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable instead. + +* :mod:`tarfile`: + + * The undocumented and unused :attr:`!TarFile.tarfile` attribute + has been deprecated since Python 3.13. diff --git a/Doc/deprecations/pending-removal-in-future.rst b/Doc/deprecations/pending-removal-in-future.rst new file mode 100644 index 00000000..3f9cf6f2 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-future.rst @@ -0,0 +1,155 @@ +Pending Removal in Future Versions +---------------------------------- + +The following APIs will be removed in the future, +although there is currently no date scheduled for their removal. + +* :mod:`argparse`: Nesting argument groups and nesting mutually exclusive + groups are deprecated. + +* :mod:`array`'s ``'u'`` format code (:gh:`57281`) + +* :mod:`builtins`: + + * ``bool(NotImplemented)``. + * Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)`` + signature is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead, + the single argument signature. + * Currently Python accepts numeric literals immediately followed by keywords, + for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing and + ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as + ``[0x1 for x in y]`` or ``[0x1f or x in y]``). A syntax warning is raised + if the numeric literal is immediately followed by one of keywords + :keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`, + :keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it + will be changed to a syntax error. (:gh:`87999`) + * Support for ``__index__()`` and ``__int__()`` method returning non-int type: + these methods will be required to return an instance of a strict subclass of + :class:`int`. + * Support for ``__float__()`` method returning a strict subclass of + :class:`float`: these methods will be required to return an instance of + :class:`float`. + * Support for ``__complex__()`` method returning a strict subclass of + :class:`complex`: these methods will be required to return an instance of + :class:`complex`. + * Delegation of ``int()`` to ``__trunc__()`` method. + * Passing a complex number as the *real* or *imag* argument in the + :func:`complex` constructor is now deprecated; it should only be passed + as a single positional argument. + (Contributed by Serhiy Storchaka in :gh:`109218`.) + +* :mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants are + deprecated and replaced by :data:`calendar.JANUARY` and + :data:`calendar.FEBRUARY`. + (Contributed by Prince Roshan in :gh:`103636`.) + +* :attr:`codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method + instead. + +* :mod:`datetime`: + + * :meth:`~datetime.datetime.utcnow`: + use ``datetime.datetime.now(tz=datetime.UTC)``. + * :meth:`~datetime.datetime.utcfromtimestamp`: + use ``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``. + +* :mod:`gettext`: Plural value must be an integer. + +* :mod:`importlib`: + + * ``load_module()`` method: use ``exec_module()`` instead. + * :func:`~importlib.util.cache_from_source` *debug_override* parameter is + deprecated: use the *optimization* parameter instead. + +* :mod:`importlib.metadata`: + + * ``EntryPoints`` tuple interface. + * Implicit ``None`` on return values. + +* :mod:`logging`: the ``warn()`` method has been deprecated + since Python 3.3, use :meth:`~logging.warning` instead. + +* :mod:`mailbox`: Use of StringIO input and text mode is deprecated, use + BytesIO and binary mode instead. + +* :mod:`os`: Calling :func:`os.register_at_fork` in multi-threaded process. + +* :class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is + deprecated, use an exception instance. + +* :mod:`re`: More strict rules are now applied for numerical group references + and group names in regular expressions. Only sequence of ASCII digits is now + accepted as a numerical reference. The group name in bytes patterns and + replacement strings can now only contain ASCII letters and digits and + underscore. + (Contributed by Serhiy Storchaka in :gh:`91760`.) + +* :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules. + +* :mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in + Python 3.12; use the *onexc* parameter instead. + +* :mod:`ssl` options and protocols: + + * :class:`ssl.SSLContext` without protocol argument is deprecated. + * :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and + :meth:`!selected_npn_protocol` are deprecated: use ALPN + instead. + * ``ssl.OP_NO_SSL*`` options + * ``ssl.OP_NO_TLS*`` options + * ``ssl.PROTOCOL_SSLv3`` + * ``ssl.PROTOCOL_TLS`` + * ``ssl.PROTOCOL_TLSv1`` + * ``ssl.PROTOCOL_TLSv1_1`` + * ``ssl.PROTOCOL_TLSv1_2`` + * ``ssl.TLSVersion.SSLv3`` + * ``ssl.TLSVersion.TLSv1`` + * ``ssl.TLSVersion.TLSv1_1`` + +* :func:`sysconfig.is_python_build` *check_home* parameter is deprecated and + ignored. + +* :mod:`threading` methods: + + * :meth:`!threading.Condition.notifyAll`: use :meth:`~threading.Condition.notify_all`. + * :meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`. + * :meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: + use :attr:`threading.Thread.daemon` attribute. + * :meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: + use :attr:`threading.Thread.name` attribute. + * :meth:`!threading.currentThread`: use :meth:`threading.current_thread`. + * :meth:`!threading.activeCount`: use :meth:`threading.active_count`. + +* :class:`typing.Text` (:gh:`92332`). + +* :class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value + that is not ``None`` from a test case. + +* :mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` instead + + * ``splitattr()`` + * ``splithost()`` + * ``splitnport()`` + * ``splitpasswd()`` + * ``splitport()`` + * ``splitquery()`` + * ``splittag()`` + * ``splittype()`` + * ``splituser()`` + * ``splitvalue()`` + * ``to_bytes()`` + +* :mod:`urllib.request`: :class:`~urllib.request.URLopener` and + :class:`~urllib.request.FancyURLopener` style of invoking requests is + deprecated. Use newer :func:`~urllib.request.urlopen` functions and methods. + +* :mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial + writes. + +* :mod:`xml.etree.ElementTree`: Testing the truth value of an + :class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it + will always return ``True``. Prefer explicit ``len(elem)`` or + ``elem is not None`` tests instead. + +* :meth:`zipimport.zipimporter.load_module` is deprecated: + use :meth:`~zipimport.zipimporter.exec_module` instead. diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst index 4c7c7ec9..20397dc5 100644 --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -59,24 +59,43 @@ perform some operation on a file. :: int main(int argc, char *argv[]) { - wchar_t *program = Py_DecodeLocale(argv[0], NULL); - if (program == NULL) { - fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); - exit(1); + PyStatus status; + PyConfig config; + PyConfig_InitPythonConfig(&config); + + /* optional but recommended */ + status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]); + if (PyStatus_Exception(status)) { + goto exception; } - Py_SetProgramName(program); /* optional but recommended */ - Py_Initialize(); + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto exception; + } + PyConfig_Clear(&config); + PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) { exit(120); } - PyMem_RawFree(program); return 0; + + exception: + PyConfig_Clear(&config); + Py_ExitStatusException(status); } -The :c:func:`Py_SetProgramName` function should be called before -:c:func:`Py_Initialize` to inform the interpreter about paths to Python run-time +.. note:: + + ``#define PY_SSIZE_T_CLEAN`` was used to indicate that ``Py_ssize_t`` should be + used in some APIs instead of ``int``. + It is not necessary since Python 3.13, but we keep it here for backward compatibility. + See :ref:`arg-parsing-string-and-buffers` for a description of this macro. + +Setting :c:member:`PyConfig.program_name` should be called before +:c:func:`Py_InitializeFromConfig` to inform the interpreter about paths to Python run-time libraries. Next, the Python interpreter is initialized with :c:func:`Py_Initialize`, followed by the execution of a hard-coded Python script that prints the date and time. Afterwards, the :c:func:`Py_FinalizeEx` call shuts diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index 68f8e0c6..b0493bed 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -69,8 +69,10 @@ the module and a copyright notice if you like). headers on some systems, you *must* include :file:`Python.h` before any standard headers are included. - It is recommended to always define ``PY_SSIZE_T_CLEAN`` before including - ``Python.h``. See :ref:`parsetuple` for a description of this macro. + ``#define PY_SSIZE_T_CLEAN`` was used to indicate that ``Py_ssize_t`` should be + used in some APIs instead of ``int``. + It is not necessary since Python 3.13, but we keep it here for backward compatibility. + See :ref:`arg-parsing-string-and-buffers` for a description of this macro. All user-visible symbols defined by :file:`Python.h` have a prefix of ``Py`` or ``PY``, except those defined in standard header files. For convenience, and @@ -219,9 +221,7 @@ with an exception object:: return NULL; SpamError = PyErr_NewException("spam.error", NULL, NULL); - Py_XINCREF(SpamError); - if (PyModule_AddObject(m, "error", SpamError) < 0) { - Py_XDECREF(SpamError); + if (PyModule_AddObjectRef(m, "error", SpamError) < 0) { Py_CLEAR(SpamError); Py_DECREF(m); return NULL; @@ -383,14 +383,15 @@ automatically unless there's an entry in the :c:data:`PyImport_Inittab` table. To add the module to the initialization table, use :c:func:`PyImport_AppendInittab`, optionally followed by an import of the module:: + #define PY_SSIZE_T_CLEAN + #include <Python.h> + int main(int argc, char *argv[]) { - wchar_t *program = Py_DecodeLocale(argv[0], NULL); - if (program == NULL) { - fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); - exit(1); - } + PyStatus status; + PyConfig config; + PyConfig_InitPythonConfig(&config); /* Add a built-in module, before Py_Initialize */ if (PyImport_AppendInittab("spam", PyInit_spam) == -1) { @@ -399,11 +400,18 @@ optionally followed by an import of the module:: } /* Pass argv[0] to the Python interpreter */ - Py_SetProgramName(program); + status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]); + if (PyStatus_Exception(status)) { + goto exception; + } /* Initialize the Python interpreter. Required. If this step fails, it will be a fatal error. */ - Py_Initialize(); + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto exception; + } + PyConfig_Clear(&config); /* Optionally import the module; alternatively, import can be deferred until the embedded script @@ -414,10 +422,13 @@ optionally followed by an import of the module:: fprintf(stderr, "Error: could not import module 'spam'\n"); } - ... + // ... use Python C API here ... - PyMem_RawFree(program); return 0; + + exception: + PyConfig_Clear(&config); + Py_ExitStatusException(status); } .. note:: @@ -536,7 +547,7 @@ reference count of an object and are safe in the presence of ``NULL`` pointers (but note that *temp* will not be ``NULL`` in this context). More info on them in section :ref:`refcounts`. -.. index:: single: PyObject_CallObject() +.. index:: single: PyObject_CallObject (C function) Later, when it is time to call the function, you call the C function :c:func:`PyObject_CallObject`. This function has two arguments, both pointers to @@ -627,7 +638,7 @@ the above example, we use :c:func:`Py_BuildValue` to construct the dictionary. : Extracting Parameters in Extension Functions ============================================ -.. index:: single: PyArg_ParseTuple() +.. index:: single: PyArg_ParseTuple (C function) The :c:func:`PyArg_ParseTuple` function is declared as follows:: @@ -649,7 +660,7 @@ Note that any Python object references which are provided to the caller are Some example calls:: - #define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */ + #define PY_SSIZE_T_CLEAN #include <Python.h> :: @@ -719,12 +730,12 @@ Some example calls:: Keyword Parameters for Extension Functions ========================================== -.. index:: single: PyArg_ParseTupleAndKeywords() +.. index:: single: PyArg_ParseTupleAndKeywords (C function) The :c:func:`PyArg_ParseTupleAndKeywords` function is declared as follows:: int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, - const char *format, char *kwlist[], ...); + const char *format, char * const *kwlist, ...); The *arg* and *format* parameters are identical to those of the :c:func:`PyArg_ParseTuple` function. The *kwdict* parameter is the dictionary of @@ -745,7 +756,7 @@ it returns false and raises an appropriate exception. Here is an example module which uses keywords, based on an example by Geoff Philbrick (philbrick@hks.com):: - #define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */ + #define PY_SSIZE_T_CLEAN #include <Python.h> static PyObject * @@ -857,7 +868,7 @@ It is important to call :c:func:`free` at the right time. If a block's address is forgotten but :c:func:`free` is not called for it, the memory it occupies cannot be reused until the program terminates. This is called a :dfn:`memory leak`. On the other hand, if a program calls :c:func:`free` for a block and then -continues to use the block, it creates a conflict with re-use of the block +continues to use the block, it creates a conflict with reuse of the block through another :c:func:`malloc` call. This is called :dfn:`using freed memory`. It has the same bad consequences as referencing uninitialized data --- core dumps, wrong results, mysterious crashes. @@ -1268,8 +1279,7 @@ function must take care of initializing the C API pointer array:: /* Create a Capsule containing the API pointer array's address */ c_api_object = PyCapsule_New((void *)PySpam_API, "spam._C_API", NULL); - if (PyModule_AddObject(m, "_C_API", c_api_object) < 0) { - Py_XDECREF(c_api_object); + if (PyModule_Add(m, "_C_API", c_api_object) < 0) { Py_DECREF(m); return NULL; } diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 9f166eb8..7f57a3a6 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -89,8 +89,8 @@ If your type supports garbage collection, the destructor should call } .. index:: - single: PyErr_Fetch() - single: PyErr_Restore() + single: PyErr_Fetch (C function) + single: PyErr_Restore (C function) One important requirement of the deallocator function is that it leaves any pending exceptions alone. This is important since deallocators are frequently @@ -296,7 +296,7 @@ An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` table descriptors that are used at runtime is that any attribute defined this way can have an associated doc string simply by providing the text in the table. An application can use the introspection API to retrieve the descriptor from the -class object, and get the doc string using its :attr:`__doc__` attribute. +class object, and get the doc string using its :attr:`~type.__doc__` attribute. As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :c:member:`~PyMethodDef.ml_name` value of ``NULL`` is required. @@ -545,7 +545,7 @@ performance-critical objects (such as numbers). .. seealso:: Documentation for the :mod:`weakref` module. -For an object to be weakly referencable, the extension type must set the +For an object to be weakly referenceable, the extension type must set the ``Py_TPFLAGS_MANAGED_WEAKREF`` bit of the :c:member:`~PyTypeObject.tp_flags` field. The legacy :c:member:`~PyTypeObject.tp_weaklistoffset` field should be left as zero. diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index c2bc5f69..bcf938f1 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -144,7 +144,7 @@ only used for variable-sized objects and should otherwise be zero. If you want your type to be subclassable from Python, and your type has the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple inheritance. A Python subclass of your type will have to list your type first - in its :attr:`~class.__bases__`, or else it will not be able to call your type's + in its :attr:`~type.__bases__`, or else it will not be able to call your type's :meth:`~object.__new__` method without getting an error. You can avoid this problem by ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of the time, this will be true anyway, because either your @@ -180,9 +180,7 @@ This initializes the :class:`!Custom` type, filling in a number of members to the appropriate default values, including :c:member:`~PyObject.ob_type` that we initially set to ``NULL``. :: - Py_INCREF(&CustomType); - if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { - Py_DECREF(&CustomType); + if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) { Py_DECREF(m); return NULL; } @@ -449,7 +447,7 @@ Further, the attributes can be deleted, setting the C pointers to ``NULL``. Eve though we can make sure the members are initialized to non-``NULL`` values, the members can be set to ``NULL`` if the attributes are deleted. -We define a single method, :meth:`!Custom.name()`, that outputs the objects name as the +We define a single method, :meth:`!Custom.name`, that outputs the objects name as the concatenation of the first and last names. :: static PyObject * @@ -862,9 +860,7 @@ function:: if (m == NULL) return NULL; - Py_INCREF(&SubListType); - if (PyModule_AddObject(m, "SubList", (PyObject *) &SubListType) < 0) { - Py_DECREF(&SubListType); + if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) { Py_DECREF(m); return NULL; } diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index ae02c443..e2710fab 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -70,7 +70,7 @@ operations. This means that as far as floating-point operations are concerned, Python behaves like many popular languages including C and Java. Many numbers that can be written easily in decimal notation cannot be expressed -exactly in binary floating-point. For example, after:: +exactly in binary floating point. For example, after:: >>> x = 1.2 @@ -87,7 +87,7 @@ which is exactly:: The typical precision of 53 bits provides Python floats with 15--16 decimal digits of accuracy. -For a fuller explanation, please see the :ref:`floating point arithmetic +For a fuller explanation, please see the :ref:`floating-point arithmetic <tut-fp-issues>` chapter in the Python tutorial. @@ -259,9 +259,11 @@ is evaluated in all cases. Why isn't there a switch or case statement in Python? ----------------------------------------------------- -You can do this easily enough with a sequence of ``if... elif... elif... else``. -For literal values, or constants within a namespace, you can also use a -``match ... case`` statement. +In general, structured switch statements execute one block of code +when an expression has a particular value or set of values. +Since Python 3.10 one can easily match literal values, or constants +within a namespace, with a ``match ... case`` statement. +An older alternative is a sequence of ``if... elif... elif... else``. For cases where you need to choose from a very large number of possibilities, you can create a dictionary mapping case values to functions to call. For @@ -290,6 +292,9 @@ It's suggested that you use a prefix for the method names, such as ``visit_`` in this example. Without such a prefix, if values are coming from an untrusted source, an attacker would be able to call any method on your object. +Imitating switch with fallthrough, as with C's switch-case-default, +is possible, much harder, and less needed. + Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation? -------------------------------------------------------------------------------------------------------- @@ -323,7 +328,7 @@ Can Python be compiled to machine code, C or some other language? ----------------------------------------------------------------- `Cython <https://cython.org/>`_ compiles a modified version of Python with -optional annotations into C extensions. `Nuitka <https://www.nuitka.net/>`_ is +optional annotations into C extensions. `Nuitka <https://nuitka.net/>`_ is an up-and-coming compiler of Python into C++ code, aiming to support the full Python language. @@ -340,7 +345,7 @@ to perform a garbage collection, obtain debugging statistics, and tune the collector's parameters. Other implementations (such as `Jython <https://www.jython.org>`_ or -`PyPy <https://www.pypy.org>`_), however, can rely on a different mechanism +`PyPy <https://pypy.org>`_), however, can rely on a different mechanism such as a full-blown garbage collector. This difference can cause some subtle porting problems if your Python code depends on the behavior of the reference counting implementation. @@ -451,7 +456,7 @@ on the key and a per-process seed; for example, ``'Python'`` could hash to to ``1142331976``. The hash code is then used to calculate a location in an internal array where the value will be stored. Assuming that you're storing keys that all have different hash values, this means that dictionaries take -constant time -- O(1), in Big-O notation -- to retrieve a key. +constant time -- *O*\ (1), in Big-O notation -- to retrieve a key. Why must dictionary keys be immutable? diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst index 2a8b9769..3147fda7 100644 --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -50,7 +50,7 @@ to learn Python's C API. If you need to interface to some C or C++ library for which no Python extension currently exists, you can try wrapping the library's data types and functions with a tool such as `SWIG <https://www.swig.org>`_. `SIP -<https://riverbankcomputing.com/software/sip/intro>`__, `CXX +<https://github.com/Python-SIP/sip>`__, `CXX <https://cxx.sourceforge.net/>`_ `Boost <https://www.boost.org/libs/python/doc/index.html>`_, or `Weave <https://github.com/scipy/weave>`_ are also @@ -246,13 +246,12 @@ Then, when you run GDB: I want to compile a Python module on my Linux system, but some files are missing. Why? -------------------------------------------------------------------------------------- -Most packaged versions of Python don't include the -:file:`/usr/lib/python2.{x}/config/` directory, which contains various files +Most packaged versions of Python omit some files required for compiling Python extensions. -For Red Hat, install the python-devel RPM to get the necessary files. +For Red Hat, install the python3-devel RPM to get the necessary files. -For Debian, run ``apt-get install python-dev``. +For Debian, run ``apt-get install python3-dev``. How do I tell "incomplete input" from "invalid input"? ------------------------------------------------------ diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index 87273325..2a55f6b6 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -122,6 +122,8 @@ available. Consult `the Python Package Index <https://pypi.org>`_ to find packages of interest to you. +.. _faq-version-numbering-scheme: + How does the Python version numbering scheme work? -------------------------------------------------- @@ -133,8 +135,6 @@ Python versions are numbered "A.B.C" or "A.B": changes. * *C* is the micro version number -- it is incremented for each bugfix release. -See :pep:`6` for more information about bugfix releases. - Not all releases are bugfix releases. In the run-up to a new feature release, a series of development releases are made, denoted as alpha, beta, or release candidate. Alphas are early releases in which interfaces aren't yet finalized; @@ -157,7 +157,11 @@ unreleased versions, built directly from the CPython development repository. In practice, after a final minor release is made, the version is incremented to the next minor version, which becomes the "a0" version, e.g. "2.4a0". -See also the documentation for :data:`sys.version`, :data:`sys.hexversion`, and +See the `Developer's Guide +<https://devguide.python.org/developer-workflow/development-cycle/>`__ +for more information about the development cycle, and +:pep:`387` to learn more about Python's backward compatibility policy. See also +the documentation for :data:`sys.version`, :data:`sys.hexversion`, and :data:`sys.version_info`. @@ -181,8 +185,6 @@ information on getting the source code and compiling it. How do I get documentation on Python? ------------------------------------- -.. XXX mention py3k - The standard documentation for the current stable version of Python is available at https://docs.python.org/3/. PDF, plain text, and downloadable HTML versions are also available at https://docs.python.org/3/download.html. @@ -307,10 +309,10 @@ guaranteed that interfaces will remain the same throughout a series of bugfix releases. The latest stable releases can always be found on the `Python download page -<https://www.python.org/downloads/>`_. There are two production-ready versions -of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by -most widely used libraries. Although 2.x is still widely used, `it is not -maintained anymore <https://peps.python.org/pep-0373/>`_. +<https://www.python.org/downloads/>`_. +Python 3.x is the recommended version and supported by most widely used libraries. +Python 2.x :pep:`is not maintained anymore <373>`. + How many people are using Python? --------------------------------- diff --git a/Doc/faq/gui.rst b/Doc/faq/gui.rst index 886833ce..cfa60fec 100644 --- a/Doc/faq/gui.rst +++ b/Doc/faq/gui.rst @@ -46,15 +46,8 @@ One solution is to ship the application with the Tcl and Tk libraries, and point to them at run-time using the :envvar:`!TCL_LIBRARY` and :envvar:`!TK_LIBRARY` environment variables. -To get truly stand-alone applications, the Tcl scripts that form the library -have to be integrated into the application as well. One tool supporting that is -SAM (stand-alone modules), which is part of the Tix distribution -(https://tix.sourceforge.net/). - -Build Tix with SAM enabled, perform the appropriate call to -:c:func:`!Tclsam_init`, etc. inside Python's -:file:`Modules/tkappinit.c`, and link with libtclsam and libtksam (you -might include the Tix libraries as well). +Various third-party freeze libraries such as py2exe and cx_Freeze have +handling for Tkinter applications built-in. Can I have Tk events handled while waiting for I/O? diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index c6991071..52292357 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -405,22 +405,37 @@ lists. When in doubt, use a mutex! Can't we get rid of the Global Interpreter Lock? ------------------------------------------------ -.. XXX link to dbeazley's talk about GIL? - The :term:`global interpreter lock` (GIL) is often seen as a hindrance to Python's deployment on high-end multiprocessor server machines, because a multi-threaded Python program effectively only uses one CPU, due to the insistence that (almost) all Python code can only run while the GIL is held. -Back in the days of Python 1.5, Greg Stein actually implemented a comprehensive +With the approval of :pep:`703` work is now underway to remove the GIL from the +CPython implementation of Python. Initially it will be implemented as an +optional compiler flag when building the interpreter, and so separate +builds will be available with and without the GIL. Long-term, the hope is +to settle on a single build, once the performance implications of removing the +GIL are fully understood. Python 3.13 is likely to be the first release +containing this work, although it may not be completely functional in this +release. + +The current work to remove the GIL is based on a +`fork of Python 3.9 with the GIL removed <https://github.com/colesbury/nogil>`_ +by Sam Gross. +Prior to that, +in the days of Python 1.5, Greg Stein actually implemented a comprehensive patch set (the "free threading" patches) that removed the GIL and replaced it -with fine-grained locking. Adam Olsen recently did a similar experiment +with fine-grained locking. Adam Olsen did a similar experiment in his `python-safethread <https://code.google.com/archive/p/python-safethread>`_ -project. Unfortunately, both experiments exhibited a sharp drop in single-thread +project. Unfortunately, both of these earlier experiments exhibited a sharp +drop in single-thread performance (at least 30% slower), due to the amount of fine-grained locking -necessary to compensate for the removal of the GIL. +necessary to compensate for the removal of the GIL. The Python 3.9 fork +is the first attempt at removing the GIL with an acceptable performance +impact. -This doesn't mean that you can't make good use of Python on multi-CPU machines! +The presence of the GIL in current Python releases +doesn't mean that you can't make good use of Python on multi-CPU machines! You just have to be creative with dividing the work up between multiple *processes* rather than multiple *threads*. The :class:`~concurrent.futures.ProcessPoolExecutor` class in the new @@ -434,22 +449,13 @@ thread of execution is in the C code and allow other threads to get some work done. Some standard library modules such as :mod:`zlib` and :mod:`hashlib` already do this. -It has been suggested that the GIL should be a per-interpreter-state lock rather -than truly global; interpreters then wouldn't be able to share objects. -Unfortunately, this isn't likely to happen either. It would be a tremendous -amount of work, because many object implementations currently have global state. -For example, small integers and short strings are cached; these caches would -have to be moved to the interpreter state. Other object types have their own -free list; these free lists would have to be moved to the interpreter state. -And so on. - -And I doubt that it can even be done in finite time, because the same problem -exists for 3rd party extensions. It is likely that 3rd party extensions are -being written at a faster rate than you can convert them to store all their -global state in the interpreter state. - -And finally, once you have multiple interpreters not sharing any state, what -have you gained over running each interpreter in a separate process? +An alternative approach to reducing the impact of the GIL is +to make the GIL a per-interpreter-state lock rather than truly global. +This was :ref:`first implemented in Python 3.12 <whatsnew312-pep684>` and is +available in the C API. A Python interface to it is expected in Python 3.13. +The main limitation to it at the moment is likely to be 3rd party extension +modules, since these must be written with multiple interpreters in mind in +order to be usable, so many older extension modules will not be usable. Input and Output @@ -610,8 +616,7 @@ use ``p.read(n)``. ("ptys") instead of pipes. Or you can use a Python interface to Don Libes' "expect" library. A Python extension that interfaces to expect is called "expy" and available from https://expectpy.sourceforge.net. A pure Python - solution that works like expect is `pexpect - <https://pypi.org/project/pexpect/>`_. + solution that works like expect is :pypi:`pexpect`. How do I access the serial (RS232) port? @@ -619,7 +624,7 @@ How do I access the serial (RS232) port? For Win32, OSX, Linux, BSD, Jython, IronPython: - https://pypi.org/project/pyserial/ + :pypi:`pyserial` For Unix, see a Usenet post by Mitch Chapman: @@ -669,41 +674,6 @@ and client-side web systems. A summary of available frameworks is maintained by Paul Boddie at https://wiki.python.org/moin/WebProgramming\ . -Cameron Laird maintains a useful set of pages about Python web technologies at -https://web.archive.org/web/20210224183619/http://phaseit.net/claird/comp.lang.python/web_python. - - -How can I mimic CGI form submission (METHOD=POST)? --------------------------------------------------- - -I would like to retrieve web pages that are the result of POSTing a form. Is -there existing code that would let me do this easily? - -Yes. Here's a simple example that uses :mod:`urllib.request`:: - - #!/usr/local/bin/python - - import urllib.request - - # build the query string - qs = "First=Josephine&MI=Q&Last=Public" - - # connect and send the server a path - req = urllib.request.urlopen('http://www.some-server.out-there' - '/cgi-bin/some-cgi-script', data=qs) - with req: - msg, hdrs = req.read(), req.info() - -Note that in general for percent-encoded POST operations, query strings must be -quoted using :func:`urllib.parse.urlencode`. For example, to send -``name=Guy Steele, Jr.``:: - - >>> import urllib.parse - >>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'}) - 'name=Guy+Steele%2C+Jr.' - -.. seealso:: :ref:`urllib-howto` for extensive examples. - What module should I use to help with generating HTML? ------------------------------------------------------ @@ -826,12 +796,12 @@ is simple:: import random random.random() -This returns a random floating point number in the range [0, 1). +This returns a random floating-point number in the range [0, 1). There are also many other specialized generators in this module, such as: * ``randrange(a, b)`` chooses an integer in the range [a, b). -* ``uniform(a, b)`` chooses a floating point number in the range [a, b). +* ``uniform(a, b)`` chooses a floating-point number in the range [a, b). * ``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution. Some higher-level functions operate on sequences directly, such as: diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index f43f69b8..fa7b22bd 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -869,7 +869,7 @@ How do I convert a string to a number? -------------------------------------- For integers, use the built-in :func:`int` type constructor, e.g. ``int('144') -== 144``. Similarly, :func:`float` converts to floating-point, +== 144``. Similarly, :func:`float` converts to a floating-point number, e.g. ``float('144') == 144.0``. By default, these interpret the number as decimal, so that ``int('0144') == @@ -924,12 +924,12 @@ module:: 'Hello, there!' >>> import array - >>> a = array.array('u', s) + >>> a = array.array('w', s) >>> print(a) - array('u', 'Hello, world') + array('w', 'Hello, world') >>> a[0] = 'y' >>> print(a) - array('u', 'yello, world') + array('w', 'yello, world') >>> a.tounicode() 'yello, world' @@ -1013,7 +1013,7 @@ Not as such. For simple input parsing, the easiest approach is usually to split the line into whitespace-delimited words using the :meth:`~str.split` method of string objects and then convert decimal strings to numeric values using :func:`int` or -:func:`float`. :meth:`!split()` supports an optional "sep" parameter which is useful +:func:`float`. :meth:`!split` supports an optional "sep" parameter which is useful if the line uses something other than whitespace as a separator. For more complicated input parsing, regular expressions are more powerful @@ -1613,9 +1613,16 @@ method too, and it must do so carefully. The basic implementation of self.__dict__[name] = value ... -Most :meth:`!__setattr__` implementations must modify -:meth:`self.__dict__ <object.__dict__>` to store -local state for self without causing an infinite recursion. +Many :meth:`~object.__setattr__` implementations call :meth:`!object.__setattr__` to set +an attribute on self without causing infinite recursion:: + + class X: + def __setattr__(self, name, value): + # Custom logic here... + object.__setattr__(self, name, value) + +Alternatively, it is possible to set attributes by inserting +entries into :attr:`self.__dict__ <object.__dict__>` directly. How do I call a method defined in a base class from a derived class that extends it? @@ -1741,11 +1748,31 @@ but effective way to define class private variables. Any identifier of the form is textually replaced with ``_classname__spam``, where ``classname`` is the current class name with any leading underscores stripped. -This doesn't guarantee privacy: an outside user can still deliberately access -the "_classname__spam" attribute, and private values are visible in the object's -``__dict__``. Many Python programmers never bother to use private variable -names at all. +The identifier can be used unchanged within the class, but to access it outside +the class, the mangled name must be used: + +.. code-block:: python + + class A: + def __one(self): + return 1 + def two(self): + return 2 * self.__one() + + class B(A): + def three(self): + return 3 * self._A__one() + + four = 4 * A()._A__one() + +In particular, this does not guarantee privacy since an outside user can still +deliberately access the private attribute; many Python programmers never bother +to use private variable names at all. + +.. seealso:: + The :ref:`private name mangling specifications <private-name-mangling>` + for details and special cases. My class defines __del__ but it is not called when I delete the object. ----------------------------------------------------------------------- diff --git a/Doc/glossary.rst b/Doc/glossary.rst index f3d5c5ee..5c56c419 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -9,28 +9,20 @@ Glossary .. glossary:: ``>>>`` - The default Python prompt of the interactive shell. Often seen for code - examples which can be executed interactively in the interpreter. + The default Python prompt of the :term:`interactive` shell. Often + seen for code examples which can be executed interactively in the + interpreter. ``...`` Can refer to: - * The default Python prompt of the interactive shell when entering the + * The default Python prompt of the :term:`interactive` shell when entering the code for an indented code block, when within a pair of matching left and right delimiters (parentheses, square brackets, curly braces or triple quotes), or after specifying a decorator. * The :const:`Ellipsis` built-in constant. - 2to3 - A tool that tries to convert Python 2.x code to Python 3.x code by - handling most of the incompatibilities which can be detected by parsing the - source and traversing the parse tree. - - 2to3 is available in the standard library as :mod:`lib2to3`; a standalone - entry point is provided as :file:`Tools/scripts/2to3`. See - :ref:`2to3-reference`. - abstract base class Abstract base classes complement :term:`duck-typing` by providing a way to define interfaces when other techniques like @@ -160,9 +152,9 @@ Glossary A :term:`file object` able to read and write :term:`bytes-like objects <bytes-like object>`. Examples of binary files are files opened in binary mode (``'rb'``, - ``'wb'`` or ``'rb+'``), :data:`sys.stdin.buffer`, - :data:`sys.stdout.buffer`, and instances of :class:`io.BytesIO` and - :class:`gzip.GzipFile`. + ``'wb'`` or ``'rb+'``), :data:`sys.stdin.buffer <sys.stdin>`, + :data:`sys.stdout.buffer <sys.stdout>`, and instances of + :class:`io.BytesIO` and :class:`gzip.GzipFile`. See also :term:`text file` for a file object able to read and write :class:`str` objects. @@ -234,6 +226,28 @@ Glossary A variable defined in a class and intended to be modified only at class level (i.e., not in an instance of the class). + closure variable + A :term:`free variable` referenced from a :term:`nested scope` that is defined in an outer + scope rather than being resolved at runtime from the globals or builtin namespaces. + May be explicitly defined with the :keyword:`nonlocal` keyword to allow write access, + or implicitly defined if the variable is only being read. + + For example, in the ``inner`` function in the following code, both ``x`` and ``print`` are + :term:`free variables <free variable>`, but only ``x`` is a *closure variable*:: + + def outer(): + x = 0 + def inner(): + nonlocal x + x += 1 + print(x) + return inner + + Due to the :attr:`codeobject.co_freevars` attribute (which, despite its name, only + includes the names of closure variables rather than listing all referenced free + variables), the more general :term:`free variable` term is sometimes used even + when the intended meaning is to refer specifically to closure variables. + complex number An extension of the familiar real number system in which all numbers are expressed as a sum of a real part and an imaginary part. Imaginary @@ -246,19 +260,33 @@ Glossary advanced mathematical feature. If you're not aware of a need for them, it's almost certain you can safely ignore them. + context + This term has different meanings depending on where and how it is used. + Some common meanings: + + * The temporary state or environment established by a :term:`context + manager` via a :keyword:`with` statement. + * The collection of key­value bindings associated with a particular + :class:`contextvars.Context` object and accessed via + :class:`~contextvars.ContextVar` objects. Also see :term:`context + variable`. + * A :class:`contextvars.Context` object. Also see :term:`current + context`. + + context management protocol + The :meth:`~object.__enter__` and :meth:`~object.__exit__` methods called + by the :keyword:`with` statement. See :pep:`343`. + context manager - An object which controls the environment seen in a :keyword:`with` - statement by defining :meth:`__enter__` and :meth:`__exit__` methods. - See :pep:`343`. + An object which implements the :term:`context management protocol` and + controls the environment seen in a :keyword:`with` statement. See + :pep:`343`. context variable - A variable which can have different values depending on its context. - This is similar to Thread-Local Storage in which each execution - thread may have a different value for a variable. However, with context - variables, there may be several contexts in one execution thread and the - main usage for context variables is to keep track of variables in + A variable whose value depends on which context is the :term:`current + context`. Values are accessed via :class:`contextvars.ContextVar` + objects. Context variables are primarily used to isolate state between concurrent asynchronous tasks. - See :mod:`contextvars`. contiguous .. index:: C-contiguous, Fortran contiguous @@ -292,6 +320,14 @@ Glossary is used when necessary to distinguish this implementation from others such as Jython or IronPython. + current context + The :term:`context` (:class:`contextvars.Context` object) that is + currently used by :class:`~contextvars.ContextVar` objects to access (get + or set) the values of :term:`context variables <context variable>`. Each + thread has its own current context. Frameworks for executing asynchronous + tasks (see :mod:`asyncio`) associate each task with a context which + becomes the current context whenever the task starts or resumes execution. + decorator A function returning another function, usually applied as a function transformation using the ``@wrapper`` syntax. Common examples for @@ -313,8 +349,9 @@ Glossary :ref:`class definitions <class>` for more about decorators. descriptor - Any object which defines the methods :meth:`__get__`, :meth:`__set__`, or - :meth:`__delete__`. When a class attribute is a descriptor, its special + Any object which defines the methods :meth:`~object.__get__`, + :meth:`~object.__set__`, or :meth:`~object.__delete__`. + When a class attribute is a descriptor, its special binding behavior is triggered upon attribute lookup. Normally, using *a.b* to get, set or delete an attribute looks up the object named *b* in the class dictionary for *a*, but if *b* is a descriptor, the respective @@ -328,7 +365,8 @@ Glossary dictionary An associative array, where arbitrary keys are mapped to values. The - keys can be any object with :meth:`__hash__` and :meth:`__eq__` methods. + keys can be any object with :meth:`~object.__hash__` and + :meth:`~object.__eq__` methods. Called a hash in Perl. dictionary comprehension @@ -348,7 +386,7 @@ Glossary docstring A string literal which appears as the first expression in a class, function or module. While ignored when the suite is executed, it is - recognized by the compiler and put into the :attr:`__doc__` attribute + recognized by the compiler and put into the :attr:`~definition.__doc__` attribute of the enclosing class, function or module. Since it is available via introspection, it is the canonical place for documentation of the object. @@ -392,7 +430,7 @@ Glossary file object An object exposing a file-oriented API (with methods such as - :meth:`read()` or :meth:`write()`) to an underlying resource. Depending + :meth:`!read` or :meth:`!write`) to an underlying resource. Depending on the way it was created, a file object can mediate access to a real on-disk file or to another type of storage or communication device (for example standard input/output, in-memory buffers, sockets, pipes, @@ -431,11 +469,11 @@ Glossary An object that tries to find the :term:`loader` for a module that is being imported. - Since Python 3.3, there are two types of finder: :term:`meta path finders + There are two types of finder: :term:`meta path finders <meta path finder>` for use with :data:`sys.meta_path`, and :term:`path entry finders <path entry finder>` for use with :data:`sys.path_hooks`. - See :pep:`302`, :pep:`420` and :pep:`451` for much more detail. + See :ref:`finders-and-loaders` and :mod:`importlib` for much more detail. floor division Mathematical division that rounds down to nearest integer. The floor @@ -444,6 +482,19 @@ Glossary division. Note that ``(-11) // 4`` is ``-3`` because that is ``-2.75`` rounded *downward*. See :pep:`238`. + free threading + A threading model where multiple threads can run Python bytecode + simultaneously within the same interpreter. This is in contrast to + the :term:`global interpreter lock` which allows only one thread to + execute Python bytecode at a time. See :pep:`703`. + + free variable + Formally, as defined in the :ref:`language execution model <bind_names>`, a free + variable is any variable used in a namespace which is not a local variable in that + namespace. See :term:`closure variable` for an example. + Pragmatically, due to the name of the :attr:`codeobject.co_freevars` attribute, + the term is also sometimes used as a synonym for :term:`closure variable`. + function A series of statements which returns some value to a caller. It can also be passed zero or more :term:`arguments <argument>` which may be used in @@ -511,7 +562,7 @@ Glossary .. index:: single: generator expression generator expression - An expression that returns an iterator. It looks like a normal expression + An :term:`expression` that returns an :term:`iterator`. It looks like a normal expression followed by a :keyword:`!for` clause defining a loop variable, range, and an optional :keyword:`!if` clause. The combined expression generates values for an enclosing function:: @@ -554,12 +605,12 @@ Glossary tasks such as compression or hashing. Also, the GIL is always released when doing I/O. - Past efforts to create a "free-threaded" interpreter (one which locks - shared data at a much finer granularity) have not been successful - because performance suffered in the common single-processor case. It - is believed that overcoming this performance issue would make the - implementation much more complicated and therefore costlier to maintain. - + As of Python 3.13, the GIL can be disabled using the :option:`--disable-gil` + build configuration. After building Python with this option, code must be + run with :option:`-X gil=0 <-X>` or after setting the :envvar:`PYTHON_GIL=0 <PYTHON_GIL>` + environment variable. This feature enables improved performance for + multi-threaded applications and makes it easier to use multi-core CPUs + efficiently. For more details, see :pep:`703`. hash-based pyc A bytecode cache file that uses the hash rather than the last-modified @@ -568,8 +619,9 @@ Glossary hashable An object is *hashable* if it has a hash value which never changes during - its lifetime (it needs a :meth:`__hash__` method), and can be compared to - other objects (it needs an :meth:`__eq__` method). Hashable objects which + its lifetime (it needs a :meth:`~object.__hash__` method), and can be + compared to other objects (it needs an :meth:`~object.__eq__` method). + Hashable objects which compare equal must have the same hash value. Hashability makes an object usable as a dictionary key and a set member, @@ -588,6 +640,14 @@ Glossary :ref:`idle` is a basic editor and interpreter environment which ships with the standard distribution of Python. + immortal + *Immortal objects* are a CPython implementation detail introduced + in :pep:`683`. + + If an object is immortal, its :term:`reference count` is never modified, + and therefore it is never deallocated while the interpreter is running. + For example, :const:`True` and :const:`None` are immortal in CPython. + immutable An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to @@ -616,7 +676,8 @@ Glossary execute them and see their results. Just launch ``python`` with no arguments (possibly by selecting it from your computer's main menu). It is a very powerful way to test out new ideas or inspect - modules and packages (remember ``help(x)``). + modules and packages (remember ``help(x)``). For more on interactive + mode, see :ref:`tut-interac`. interpreted Python is an interpreted language, as opposed to a compiled one, @@ -645,7 +706,8 @@ Glossary iterables include all sequence types (such as :class:`list`, :class:`str`, and :class:`tuple`) and some non-sequence types like :class:`dict`, :term:`file objects <file object>`, and objects of any classes you define - with an :meth:`__iter__` method or with a :meth:`__getitem__` method + with an :meth:`~iterator.__iter__` method or with a + :meth:`~object.__getitem__` method that implements :term:`sequence` semantics. Iterables can be @@ -654,7 +716,7 @@ Glossary as an argument to the built-in function :func:`iter`, it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call - :func:`iter` or deal with iterator objects yourself. The ``for`` + :func:`iter` or deal with iterator objects yourself. The :keyword:`for` statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also :term:`iterator`, :term:`sequence`, and :term:`generator`. @@ -665,8 +727,8 @@ Glossary :func:`next`) return successive items in the stream. When no more data are available a :exc:`StopIteration` exception is raised instead. At this point, the iterator object is exhausted and any further calls to its - :meth:`__next__` method just raise :exc:`StopIteration` again. Iterators - are required to have an :meth:`__iter__` method that returns the iterator + :meth:`!__next__` method just raise :exc:`StopIteration` again. Iterators + are required to have an :meth:`~iterator.__iter__` method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted. One notable exception is code which attempts multiple iteration passes. A container object (such as a @@ -680,7 +742,10 @@ Glossary .. impl-detail:: CPython does not consistently apply the requirement that an iterator - define :meth:`__iter__`. + define :meth:`~iterator.__iter__`. + And also please note that the free-threading CPython does not guarantee + the thread-safety of iterator operations. + key function A key function or collation function is a callable that returns a value @@ -722,22 +787,10 @@ Glossary thread removes *key* from *mapping* after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach. - locale encoding - On Unix, it is the encoding of the LC_CTYPE locale. It can be set with - :func:`locale.setlocale(locale.LC_CTYPE, new_locale) <locale.setlocale>`. - - On Windows, it is the ANSI code page (ex: ``"cp1252"``). - - On Android and VxWorks, Python uses ``"utf-8"`` as the locale encoding. - - ``locale.getencoding()`` can be used to get the locale encoding. - - See also the :term:`filesystem encoding and error handler`. - list A built-in Python :term:`sequence`. Despite its name it is more akin to an array in other languages than to a linked list since access to - elements is O(1). + elements is *O*\ (1). list comprehension A compact way to process all or part of the elements in a sequence and @@ -750,8 +803,23 @@ Glossary loader An object that loads a module. It must define a method named :meth:`load_module`. A loader is typically returned by a - :term:`finder`. See :pep:`302` for details and - :class:`importlib.abc.Loader` for an :term:`abstract base class`. + :term:`finder`. See also: + + * :ref:`finders-and-loaders` + * :class:`importlib.abc.Loader` + * :pep:`302` + + locale encoding + On Unix, it is the encoding of the LC_CTYPE locale. It can be set with + :func:`locale.setlocale(locale.LC_CTYPE, new_locale) <locale.setlocale>`. + + On Windows, it is the ANSI code page (ex: ``"cp1252"``). + + On Android and VxWorks, Python uses ``"utf-8"`` as the locale encoding. + + :func:`locale.getencoding` can be used to get the locale encoding. + + See also the :term:`filesystem encoding and error handler`. magic method .. index:: pair: magic; method @@ -795,8 +863,7 @@ Glossary method resolution order Method Resolution Order is the order in which base classes are searched - for a member during lookup. See `The Python 2.3 Method Resolution Order - <https://www.python.org/download/releases/2.3/mro/>`_ for details of the + for a member during lookup. See :ref:`python_2.3_mro` for details of the algorithm used by the Python interpreter since the 2.3 release. module @@ -810,6 +877,8 @@ Glossary A namespace containing the import-related information used to load a module. An instance of :class:`importlib.machinery.ModuleSpec`. + See also :ref:`module-specs`. + MRO See :term:`method resolution order`. @@ -836,10 +905,11 @@ Glossary Some named tuples are built-in types (such as the above examples). Alternatively, a named tuple can be created from a regular class definition that inherits from :class:`tuple` and that defines named - fields. Such a class can be written by hand or it can be created with - the factory function :func:`collections.namedtuple`. The latter - technique also adds some extra methods that may not be found in - hand-written or built-in named tuples. + fields. Such a class can be written by hand, or it can be created by + inheriting :class:`typing.NamedTuple`, or with the factory function + :func:`collections.namedtuple`. The latter techniques also add some + extra methods that may not be found in hand-written or built-in named + tuples. namespace The place where a variable is stored. Namespaces are implemented as @@ -874,13 +944,23 @@ Glossary Old name for the flavor of classes now used for all class objects. In earlier Python versions, only new-style classes could use Python's newer, versatile features like :attr:`~object.__slots__`, descriptors, - properties, :meth:`__getattribute__`, class methods, and static methods. + properties, :meth:`~object.__getattribute__`, class methods, and static + methods. object Any data with state (attributes or value) and defined behavior (methods). Also the ultimate base class of any :term:`new-style class`. + optimized scope + A scope where target local variable names are reliably known to the + compiler when the code is compiled, allowing optimization of read and + write access to these names. The local namespaces for functions, + generators, coroutines, comprehensions, and generator expressions are + optimized in this fashion. Note: most interpreter optimizations are + applied to all scopes, only those relying on a known set of local + and nonlocal variable names are restricted to optimized scopes. + package A Python :term:`module` which can contain submodules or recursively, subpackages. Technically, a package is a Python module with a @@ -954,7 +1034,7 @@ Glossary finders implement. path entry hook - A callable on the :data:`sys.path_hook` list which returns a :term:`path + A callable on the :data:`sys.path_hooks` list which returns a :term:`path entry finder` if it knows how to find modules on a specific :term:`path entry`. @@ -1065,7 +1145,7 @@ Glossary reference count The number of references to an object. When the reference count of an object drops to zero, it is deallocated. Some objects are - "immortal" and have reference counts that are never modified, and + :term:`immortal` and have reference counts that are never modified, and therefore the objects are never deallocated. Reference counting is generally not visible to Python code, but it is a key element of the :term:`CPython` implementation. Programmers can call the @@ -1078,6 +1158,10 @@ Glossary See also :term:`namespace package`. + REPL + An acronym for the "read–eval–print loop", another name for the + :term:`interactive` interpreter shell. + __slots__ A declaration inside a class that saves memory by pre-declaring space for instance attributes and eliminating instance dictionaries. Though @@ -1087,21 +1171,23 @@ Glossary sequence An :term:`iterable` which supports efficient element access using integer - indices via the :meth:`__getitem__` special method and defines a - :meth:`__len__` method that returns the length of the sequence. + indices via the :meth:`~object.__getitem__` special method and defines a + :meth:`~object.__len__` method that returns the length of the sequence. Some built-in sequence types are :class:`list`, :class:`str`, :class:`tuple`, and :class:`bytes`. Note that :class:`dict` also - supports :meth:`__getitem__` and :meth:`__len__`, but is considered a + supports :meth:`~object.__getitem__` and :meth:`!__len__`, but is considered a mapping rather than a sequence because the lookups use arbitrary - :term:`immutable` keys rather than integers. + :term:`hashable` keys rather than integers. The :class:`collections.abc.Sequence` abstract base class defines a much richer interface that goes beyond just - :meth:`__getitem__` and :meth:`__len__`, adding :meth:`count`, - :meth:`index`, :meth:`__contains__`, and - :meth:`__reversed__`. Types that implement this expanded + :meth:`~object.__getitem__` and :meth:`~object.__len__`, adding + :meth:`!count`, :meth:`!index`, :meth:`~object.__contains__`, and + :meth:`~object.__reversed__`. Types that implement this expanded interface can be registered explicitly using - :func:`~abc.ABCMeta.register`. + :func:`~abc.ABCMeta.register`. For more documentation on sequence + methods generally, see + :ref:`Common Sequence Operations <typesseq-common>`. set comprehension A compact way to process all or part of the elements in an iterable and @@ -1119,6 +1205,17 @@ Glossary when several are given, such as in ``variable_name[1:3:5]``. The bracket (subscript) notation uses :class:`slice` objects internally. + soft deprecated + A soft deprecated API should not be used in new code, + but it is safe for already existing code to use it. + The API remains documented and tested, but will not be enhanced further. + + Soft deprecation, unlike normal deprecation, does not plan on removing the API + and will not emit warnings. + + See `PEP 387: Soft Deprecation + <https://peps.python.org/pep-0387/#soft-deprecation>`_. + special method .. index:: pair: special; method @@ -1132,6 +1229,11 @@ Glossary an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. + static type checker + An external tool that reads Python code and analyzes it, looking for + issues such as incorrect types. See also :term:`type hints <type hint>` + and the :mod:`typing` module. + strong reference In Python's C API, a strong reference is a reference to an object which is owned by the code holding the reference. The strong @@ -1181,7 +1283,7 @@ Glossary type The type of a Python object determines what kind of object it is; every object has a type. An object's type is accessible as its - :attr:`~instance.__class__` attribute or can be retrieved with + :attr:`~object.__class__` attribute or can be retrieved with ``type(obj)``. type alias @@ -1208,8 +1310,8 @@ Glossary attribute, or a function parameter or return value. Type hints are optional and are not enforced by Python but - they are useful to static type analysis tools, and aid IDEs with code - completion and refactoring. + they are useful to :term:`static type checkers <static type checker>`. + They can also aid IDEs with code completion and refactoring. Type hints of global variables, class attributes, and functions, but not local variables, can be accessed using diff --git a/Doc/howto/annotations.rst b/Doc/howto/annotations.rst index 1134686c..174078b8 100644 --- a/Doc/howto/annotations.rst +++ b/Doc/howto/annotations.rst @@ -102,9 +102,9 @@ Your code will have to have a separate code path if the object you're examining is a class (``isinstance(o, type)``). In that case, best practice relies on an implementation detail of Python 3.9 and before: if a class has annotations defined, -they are stored in the class's ``__dict__`` dictionary. Since +they are stored in the class's :attr:`~type.__dict__` dictionary. Since the class may or may not have annotations defined, best practice -is to call the ``get`` method on the class dict. +is to call the :meth:`~dict.get` method on the class dict. To put it all together, here is some sample code that safely accesses the ``__annotations__`` attribute on an arbitrary @@ -121,8 +121,8 @@ the type of ``ann`` using :func:`isinstance` before further examination. Note that some exotic or malformed type objects may not have -a ``__dict__`` attribute, so for extra safety you may also wish -to use :func:`getattr` to access ``__dict__``. +a :attr:`~type.__dict__` attribute, so for extra safety you may also wish +to use :func:`getattr` to access :attr:`!__dict__`. Manually Un-Stringizing Stringized Annotations @@ -153,7 +153,8 @@ on an arbitrary object ``o``: unwrap it by accessing either ``o.__wrapped__`` or ``o.func`` as appropriate, until you have found the root unwrapped function. * If ``o`` is a callable (but not a class), use - ``o.__globals__`` as the globals when calling :func:`eval`. + :attr:`o.__globals__ <function.__globals__>` as the globals when calling + :func:`eval`. However, not all string values used as annotations can be successfully turned into Python values by :func:`eval`. diff --git a/Doc/howto/argparse-optparse.rst b/Doc/howto/argparse-optparse.rst new file mode 100644 index 00000000..cef2d893 --- /dev/null +++ b/Doc/howto/argparse-optparse.rst @@ -0,0 +1,55 @@ +.. currentmodule:: argparse + +.. _upgrading-optparse-code: + +========================== +Upgrading optparse code +========================== + +Originally, the :mod:`argparse` module had attempted to maintain compatibility +with :mod:`optparse`. However, :mod:`optparse` was difficult to extend +transparently, particularly with the changes required to support +``nargs=`` specifiers and better usage messages. When most everything in +:mod:`optparse` had either been copy-pasted over or monkey-patched, it no +longer seemed practical to try to maintain the backwards compatibility. + +The :mod:`argparse` module improves on the :mod:`optparse` +module in a number of ways including: + +* Handling positional arguments. +* Supporting subcommands. +* Allowing alternative option prefixes like ``+`` and ``/``. +* Handling zero-or-more and one-or-more style arguments. +* Producing more informative usage messages. +* Providing a much simpler interface for custom ``type`` and ``action``. + +A partial upgrade path from :mod:`optparse` to :mod:`argparse`: + +* Replace all :meth:`optparse.OptionParser.add_option` calls with + :meth:`ArgumentParser.add_argument` calls. + +* Replace ``(options, args) = parser.parse_args()`` with ``args = + parser.parse_args()`` and add additional :meth:`ArgumentParser.add_argument` + calls for the positional arguments. Keep in mind that what was previously + called ``options``, now in the :mod:`argparse` context is called ``args``. + +* Replace :meth:`optparse.OptionParser.disable_interspersed_args` + by using :meth:`~ArgumentParser.parse_intermixed_args` instead of + :meth:`~ArgumentParser.parse_args`. + +* Replace callback actions and the ``callback_*`` keyword arguments with + ``type`` or ``action`` arguments. + +* Replace string names for ``type`` keyword arguments with the corresponding + type objects (e.g. int, float, complex, etc). + +* Replace :class:`optparse.Values` with :class:`Namespace` and + :exc:`optparse.OptionError` and :exc:`optparse.OptionValueError` with + :exc:`ArgumentError`. + +* Replace strings with implicit arguments such as ``%default`` or ``%prog`` with + the standard Python syntax to use dictionaries to format strings, that is, + ``%(default)s`` and ``%(prog)s``. + +* Replace the OptionParser constructor ``version`` argument with a call to + ``parser.add_argument('--version', action='version', version='<the version>')``. diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index ae5bab90..1efbee64 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -444,7 +444,7 @@ And the output: options: -h, --help show this help message and exit - -v {0,1,2}, --verbosity {0,1,2} + -v, --verbosity {0,1,2} increase output verbosity Note that the change also reflects both in the error message as well as the @@ -841,6 +841,53 @@ translated messages. To translate your own strings in the :mod:`argparse` output, use :mod:`gettext`. +Custom type converters +====================== + +The :mod:`argparse` module allows you to specify custom type converters for +your command-line arguments. This allows you to modify user input before it's +stored in the :class:`argparse.Namespace`. This can be useful when you need to +pre-process the input before it is used in your program. + +When using a custom type converter, you can use any callable that takes a +single string argument (the argument value) and returns the converted value. +However, if you need to handle more complex scenarios, you can use a custom +action class with the **action** parameter instead. + +For example, let's say you want to handle arguments with different prefixes and +process them accordingly:: + + import argparse + + parser = argparse.ArgumentParser(prefix_chars='-+') + + parser.add_argument('-a', metavar='<value>', action='append', + type=lambda x: ('-', x)) + parser.add_argument('+a', metavar='<value>', action='append', + type=lambda x: ('+', x)) + + args = parser.parse_args() + print(args) + +Output: + +.. code-block:: shell-session + + $ python prog.py -a value1 +a value2 + Namespace(a=[('-', 'value1'), ('+', 'value2')]) + +In this example, we: + +* Created a parser with custom prefix characters using the ``prefix_chars`` + parameter. + +* Defined two arguments, ``-a`` and ``+a``, which used the ``type`` parameter to + create custom type converters to store the value in a tuple with the prefix. + +Without the custom type converters, the arguments would have treated the ``-a`` +and ``+a`` as the same argument, which would have been undesirable. By using custom +type converters, we were able to differentiate between the two arguments. + Conclusion ========== diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index e8e6aace..06097724 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1,1900 +1,14 @@ -.. highlight:: c +:orphan: -.. _howto-clinic: +.. This page is retained solely for existing links to /howto/clinic.html. + Direct readers to the devguide. ********************** Argument Clinic How-To ********************** -:author: Larry Hastings - -**Source code:** :source:`Tools/clinic/clinic.py`. - -.. topic:: Abstract - - Argument Clinic is a preprocessor for CPython C files. - It was introduced in Python 3.4 with :pep:`436`, - in order to provide introspection signatures, - and to generate performant and tailor-made boilerplate code - for argument parsing in CPython builtins, - module level functions, and class methods. - This document is divided in four major sections: - - * :ref:`clinic-background` talks about the basic concepts and goals of - Argument Clinic. - * :ref:`clinic-reference` describes the command-line interface and Argument - Clinic terminology. - * :ref:`clinic-tutorial` guides you through all the steps required to - adapt an existing C function to Argument Clinic. - * :ref:`clinic-howtos` details how to handle specific tasks. - - -.. note:: - - Argument Clinic is considered internal-only - for CPython. Its use is not supported for files outside - CPython, and no guarantees are made regarding backwards - compatibility for future versions. In other words: if you - maintain an external C extension for CPython, you're welcome - to experiment with Argument Clinic in your own code. But the - version of Argument Clinic that ships with the next version - of CPython *could* be totally incompatible and break all your code. - - -.. _clinic-background: - -Background -========== - -Basic concepts --------------- - -When Argument Clinic is run on a file, either via the :ref:`clinic-cli` -or via ``make clinic``, it will scan over the input files looking for -:term:`start lines <start line>`: - -.. code-block:: none - - /*[clinic input] - -When it finds one, it reads everything up to the :term:`end line`: - -.. code-block:: none - - [clinic start generated code]*/ - -Everything in between these two lines is Argument Clinic :term:`input`. -When Argument Clinic parses input, it generates :term:`output`. -The output is rewritten into the C file immediately after the input, -followed by a :term:`checksum line`. -All of these lines, including the :term:`start line` and :term:`checksum line`, -are collectively called an Argument Clinic :term:`block`: - -.. code-block:: none - - /*[clinic input] - ... clinic input goes here ... - [clinic start generated code]*/ - ... clinic output goes here ... - /*[clinic end generated code: ...]*/ - -If you run Argument Clinic on the same file a second time, Argument Clinic -will discard the old :term:`output` and write out the new output with a fresh -:term:`checksum line`. -If the :term:`input` hasn't changed, the output won't change either. .. note:: - You should never modify the output of an Argument Clinic block, - as any change will be lost in future Argument Clinic runs; - Argument Clinic will detect an output checksum mismatch and regenerate the - correct output. - If you are not happy with the generated output, - you should instead change the input until it produces the output you want. - - -.. _clinic-reference: - -Reference -========= - - -.. _clinic-terminology: - -Terminology ------------ - -.. glossary:: - - start line - The line ``/*[clinic input]``. - This line marks the beginning of Argument Clinic input. - Note that the *start line* opens a C block comment. - - end line - The line ``[clinic start generated code]*/``. - The *end line* marks the _end_ of Argument Clinic :term:`input`, - but at the same time marks the _start_ of Argument Clinic :term:`output`, - thus the text *"clinic start start generated code"* - Note that the *end line* closes the C block comment opened - by the *start line*. - - checksum - A hash to distinguish unique :term:`inputs <input>` - and :term:`outputs <output>`. - - checksum line - A line that looks like ``/*[clinic end generated code: ...]*/``. - The three dots will be replaced by a :term:`checksum` generated from the - :term:`input`, and a :term:`checksum` generated from the :term:`output`. - The checksum line marks the end of Argument Clinic generated code, - and is used by Argument Clinic to determine if it needs to regenerate - output. - - input - The text between the :term:`start line` and the :term:`end line`. - Note that the start and end lines open and close a C block comment; - the *input* is thus a part of that same C block comment. - - output - The text between the :term:`end line` and the :term:`checksum line`. - - block - All text from the :term:`start line` to the :term:`checksum line` inclusively. - - -.. _clinic-cli: - -Command-line interface ----------------------- - -The Argument Clinic :abbr:`CLI (Command-Line Interface)` is typically used to -process a single source file, like this: - -.. code-block:: shell-session - - $ python3 ./Tools/clinic/clinic.py foo.c - -The CLI supports the following options: - -.. program:: ./Tools/clinic/clinic.py [-h] [-f] [-o OUTPUT] [-v] \ - [--converters] [--make] [--srcdir SRCDIR] [FILE ...] - -.. option:: -h, --help - - Print CLI usage. - -.. option:: -f, --force - - Force output regeneration. - -.. option:: -o, --output OUTPUT - - Redirect file output to OUTPUT - -.. option:: -v, --verbose - - Enable verbose mode. - -.. option:: --converters - - Print a list of all supported converters and return converters. - -.. option:: --make - - Walk :option:`--srcdir` to run over all relevant files. - -.. option:: --srcdir SRCDIR - - The directory tree to walk in :option:`--make` mode. - -.. option:: FILE ... - - The list of files to process. - - -.. _clinic-classes: - -Classes for extending Argument Clinic -------------------------------------- - -.. module:: clinic - -.. class:: CConverter - - The base class for all converters. - See :ref:`clinic-howto-custom-converter` for how to subclass this class. - - .. attribute:: type - - The C type to use for this variable. - :attr:`!type` should be a Python string specifying the type, - e.g. ``'int'``. - If this is a pointer type, the type string should end with ``' *'``. - - .. attribute:: default - - The Python default value for this parameter, as a Python value. - Or the magic value ``unspecified`` if there is no default. - - .. attribute:: py_default - - :attr:`!default` as it should appear in Python code, - as a string. - Or ``None`` if there is no default. - - .. attribute:: c_default - - :attr:`!default` as it should appear in C code, - as a string. - Or ``None`` if there is no default. - - .. attribute:: c_ignored_default - - The default value used to initialize the C variable when - there is no default, but not specifying a default may - result in an "uninitialized variable" warning. This can - easily happen when using option groups—although - properly written code will never actually use this value, - the variable does get passed in to the impl, and the - C compiler will complain about the "use" of the - uninitialized value. This value should always be a - non-empty string. - - .. attribute:: converter - - The name of the C converter function, as a string. - - .. attribute:: impl_by_reference - - A boolean value. If true, - Argument Clinic will add a ``&`` in front of the name of - the variable when passing it into the impl function. - - .. attribute:: parse_by_reference - - A boolean value. If true, - Argument Clinic will add a ``&`` in front of the name of - the variable when passing it into :c:func:`PyArg_ParseTuple`. - - -.. _clinic-tutorial: - -Tutorial -======== - -The best way to get a sense of how Argument Clinic works is to -convert a function to work with it. Here, then, are the bare -minimum steps you'd need to follow to convert a function to -work with Argument Clinic. Note that for code you plan to -check in to CPython, you really should take the conversion farther, -using some of the :ref:`advanced concepts <clinic-howtos>` -you'll see later on in the document, -like :ref:`clinic-howto-return-converters` -and :ref:`clinic-howto-self-converter`. -But we'll keep it simple for this walkthrough so you can learn. - -First, make sure you're working with a freshly updated checkout -of the CPython trunk. - -Next, find a Python builtin that calls either :c:func:`PyArg_ParseTuple` -or :c:func:`PyArg_ParseTupleAndKeywords`, and hasn't been converted -to work with Argument Clinic yet. -For this tutorial, we'll be using -:py:meth:`_pickle.Pickler.dump <pickle.Pickler.dump>`. - -If the call to the :c:func:`!PyArg_Parse*` function uses any of the -following format units...: - - .. code-block:: none - - O& - O! - es - es# - et - et# - -... or if it has multiple calls to :c:func:`PyArg_ParseTuple`, -you should choose a different function. -(See :ref:`clinic-howto-advanced-converters` for those scenarios.) - -Also, if the function has multiple calls to :c:func:`!PyArg_ParseTuple` -or :c:func:`PyArg_ParseTupleAndKeywords` where it supports different -types for the same argument, or if the function uses something besides -:c:func:`!PyArg_Parse*` functions to parse its arguments, it probably -isn't suitable for conversion to Argument Clinic. Argument Clinic -doesn't support generic functions or polymorphic parameters. - -Next, add the following boilerplate above the function, -creating our input block:: - - /*[clinic input] - [clinic start generated code]*/ - -Cut the docstring and paste it in between the ``[clinic]`` lines, -removing all the junk that makes it a properly quoted C string. -When you're done you should have just the text, based at the left -margin, with no line wider than 80 characters. -Argument Clinic will preserve indents inside the docstring. - -If the old docstring had a first line that looked like a function -signature, throw that line away; The docstring doesn't need it anymore --- -when you use :py:func:`help` on your builtin in the future, -the first line will be built automatically based on the function's signature. - -Example docstring summary line:: - - /*[clinic input] - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -If your docstring doesn't have a "summary" line, Argument Clinic will -complain, so let's make sure it has one. The "summary" line should -be a paragraph consisting of a single 80-column line -at the beginning of the docstring. -(See :pep:`257` regarding docstring conventions.) - -Our example docstring consists solely of a summary line, so the sample -code doesn't have to change for this step. - -Now, above the docstring, enter the name of the function, followed -by a blank line. This should be the Python name of the function, -and should be the full dotted path to the function --- -it should start with the name of the module, -include any sub-modules, and if the function is a method on -a class it should include the class name too. - -In our example, :mod:`!_pickle` is the module, :py:class:`!Pickler` is the class, -and :py:meth:`!dump` is the method, so the name becomes -:py:meth:`!_pickle.Pickler.dump`:: - - /*[clinic input] - _pickle.Pickler.dump - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -If this is the first time that module or class has been used with Argument -Clinic in this C file, -you must declare the module and/or class. Proper Argument Clinic hygiene -prefers declaring these in a separate block somewhere near the -top of the C file, in the same way that include files and statics go at -the top. -In our sample code we'll just show the two blocks next to each other. - -The name of the class and module should be the same as the one -seen by Python. Check the name defined in the :c:type:`PyModuleDef` -or :c:type:`PyTypeObject` as appropriate. - -When you declare a class, you must also specify two aspects of its type -in C: the type declaration you'd use for a pointer to an instance of -this class, and a pointer to the :c:type:`!PyTypeObject` for this class:: - - /*[clinic input] - module _pickle - class _pickle.Pickler "PicklerObject *" "&Pickler_Type" - [clinic start generated code]*/ - - /*[clinic input] - _pickle.Pickler.dump - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -Declare each of the parameters to the function. Each parameter -should get its own line. All the parameter lines should be -indented from the function name and the docstring. -The general form of these parameter lines is as follows: - -.. code-block:: none - - name_of_parameter: converter - -If the parameter has a default value, add that after the -converter: - -.. code-block:: none - - name_of_parameter: converter = default_value - -Argument Clinic's support for "default values" is quite sophisticated; -see :ref:`clinic-howto-default-values` for more information. - -Next, add a blank line below the parameters. - -What's a "converter"? -It establishes both the type of the variable used in C, -and the method to convert the Python value into a C value at runtime. -For now you're going to use what's called a "legacy converter" --- -a convenience syntax intended to make porting old code into Argument -Clinic easier. - -For each parameter, copy the "format unit" for that -parameter from the :c:func:`PyArg_Parse` format argument and -specify *that* as its converter, as a quoted string. -The "format unit" is the formal name for the one-to-three -character substring of the *format* parameter that tells -the argument parsing function what the type of the variable -is and how to convert it. -For more on format units please see :ref:`arg-parsing`. - -For multicharacter format units like ``z#``, -use the entire two-or-three character string. - -Sample:: - - /*[clinic input] - module _pickle - class _pickle.Pickler "PicklerObject *" "&Pickler_Type" - [clinic start generated code]*/ - - /*[clinic input] - _pickle.Pickler.dump - - obj: 'O' - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -If your function has ``|`` in the format string, -meaning some parameters have default values, you can ignore it. -Argument Clinic infers which parameters are optional -based on whether or not they have default values. - -If your function has ``$`` in the format string, -meaning it takes keyword-only arguments, -specify ``*`` on a line by itself before the first keyword-only argument, -indented the same as the parameter lines. - -:py:meth:`!_pickle.Pickler.dump` has neither, so our sample is unchanged. - -Next, if the existing C function calls :c:func:`PyArg_ParseTuple` -(as opposed to :c:func:`PyArg_ParseTupleAndKeywords`), then all its -arguments are positional-only. - -To mark parameters as positional-only in Argument Clinic, -add a ``/`` on a line by itself after the last positional-only parameter, -indented the same as the parameter lines. - -Sample:: - - /*[clinic input] - module _pickle - class _pickle.Pickler "PicklerObject *" "&Pickler_Type" - [clinic start generated code]*/ - - /*[clinic input] - _pickle.Pickler.dump - - obj: 'O' - / - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -It can be helpful to write a per-parameter docstring for each parameter. -Since per-parameter docstrings are optional, -you can skip this step if you prefer. - -Nevertheless, here's how to add a per-parameter docstring. -The first line of the per-parameter docstring -must be indented further than the parameter definition. -The left margin of this first line establishes -the left margin for the whole per-parameter docstring; -all the text you write will be outdented by this amount. -You can write as much text as you like, across multiple lines if you wish. - -Sample:: - - /*[clinic input] - module _pickle - class _pickle.Pickler "PicklerObject *" "&Pickler_Type" - [clinic start generated code]*/ - - /*[clinic input] - _pickle.Pickler.dump - - obj: 'O' - The object to be pickled. - / - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -Save and close the file, then run ``Tools/clinic/clinic.py`` on it. -With luck everything worked---your block now has output, -and a :file:`.c.h` file has been generated! -Reload the file in your text editor to see the generated code:: - - /*[clinic input] - _pickle.Pickler.dump - - obj: 'O' - The object to be pickled. - / - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - - static PyObject * - _pickle_Pickler_dump(PicklerObject *self, PyObject *obj) - /*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/ - -Obviously, if Argument Clinic didn't produce any output, -it's because it found an error in your input. -Keep fixing your errors and retrying until Argument Clinic processes your file -without complaint. - -For readability, most of the glue code has been generated to a :file:`.c.h` -file. You'll need to include that in your original :file:`.c` file, -typically right after the clinic module block:: - - #include "clinic/_pickle.c.h" - -Double-check that the argument-parsing code Argument Clinic generated -looks basically the same as the existing code. - -First, ensure both places use the same argument-parsing function. -The existing code must call either -:c:func:`PyArg_ParseTuple` or :c:func:`PyArg_ParseTupleAndKeywords`; -ensure that the code generated by Argument Clinic calls the -*exact* same function. - -Second, the format string passed in to :c:func:`!PyArg_ParseTuple` or -:c:func:`!PyArg_ParseTupleAndKeywords` should be *exactly* the same -as the hand-written one in the existing function, -up to the colon or semi-colon. - -Argument Clinic always generates its format strings -with a ``:`` followed by the name of the function. -If the existing code's format string ends with ``;``, -to provide usage help, this change is harmless --- don't worry about it. - -Third, for parameters whose format units require two arguments, -like a length variable, an encoding string, or a pointer -to a conversion function, ensure that the second argument is -*exactly* the same between the two invocations. - -Fourth, inside the output portion of the block, -you'll find a preprocessor macro defining the appropriate static -:c:type:`PyMethodDef` structure for this builtin:: - - #define __PICKLE_PICKLER_DUMP_METHODDEF \ - {"dump", (PyCFunction)__pickle_Pickler_dump, METH_O, __pickle_Pickler_dump__doc__}, - -This static structure should be *exactly* the same as the existing static -:c:type:`!PyMethodDef` structure for this builtin. - -If any of these items differ in *any way*, -adjust your Argument Clinic function specification and rerun -``Tools/clinic/clinic.py`` until they *are* the same. - -Notice that the last line of its output is the declaration -of your "impl" function. This is where the builtin's implementation goes. -Delete the existing prototype of the function you're modifying, but leave -the opening curly brace. Now delete its argument parsing code and the -declarations of all the variables it dumps the arguments into. -Notice how the Python arguments are now arguments to this impl function; -if the implementation used different names for these variables, fix it. - -Let's reiterate, just because it's kind of weird. -Your code should now look like this:: - - static return_type - your_function_impl(...) - /*[clinic end generated code: input=..., output=...]*/ - { - ... - -Argument Clinic generated the checksum line and the function prototype just -above it. You should write the opening and closing curly braces for the -function, and the implementation inside. - -Sample:: - - /*[clinic input] - module _pickle - class _pickle.Pickler "PicklerObject *" "&Pickler_Type" - [clinic start generated code]*/ - /*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ - - /*[clinic input] - _pickle.Pickler.dump - - obj: 'O' - The object to be pickled. - / - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - - PyDoc_STRVAR(__pickle_Pickler_dump__doc__, - "Write a pickled representation of obj to the open file.\n" - "\n" - ... - static PyObject * - _pickle_Pickler_dump_impl(PicklerObject *self, PyObject *obj) - /*[clinic end generated code: checksum=3bd30745bf206a48f8b576a1da3d90f55a0a4187]*/ - { - /* Check whether the Pickler was initialized correctly (issue3664). - Developers often forget to call __init__() in their subclasses, which - would trigger a segfault without this check. */ - if (self->write == NULL) { - PyErr_Format(PicklingError, - "Pickler.__init__() was not called by %s.__init__()", - Py_TYPE(self)->tp_name); - return NULL; - } - - if (_Pickler_ClearBuffer(self) < 0) { - return NULL; - } - - ... - -Remember the macro with the :c:type:`PyMethodDef` structure for this function? -Find the existing :c:type:`!PyMethodDef` structure for this -function and replace it with a reference to the macro. If the builtin -is at module scope, this will probably be very near the end of the file; -if the builtin is a class method, this will probably be below but relatively -near to the implementation. - -Note that the body of the macro contains a trailing comma; when you -replace the existing static :c:type:`!PyMethodDef` structure with the macro, -*don't* add a comma to the end. - -Sample:: - - static struct PyMethodDef Pickler_methods[] = { - __PICKLE_PICKLER_DUMP_METHODDEF - __PICKLE_PICKLER_CLEAR_MEMO_METHODDEF - {NULL, NULL} /* sentinel */ - }; - -Argument Clinic may generate new instances of ``_Py_ID``. For example:: - - &_Py_ID(new_unique_py_id) - -If it does, you'll have to run ``make regen-global-objects`` -to regenerate the list of precompiled identifiers at this point. - -Finally, compile, then run the relevant portions of the regression-test suite. -This change should not introduce any new compile-time warnings or errors, -and there should be no externally visible change to Python's behavior, -except for one difference: :py:func:`inspect.signature` run on your function -should now provide a valid signature! - -Congratulations, you've ported your first function to work with Argument Clinic! - - -.. _clinic-howtos: - -How-to guides -============= - - -How to rename C functions and variables generated by Argument Clinic --------------------------------------------------------------------- - -Argument Clinic automatically names the functions it generates for you. -Occasionally this may cause a problem, if the generated name collides with -the name of an existing C function. There's an easy solution: override the names -used for the C functions. Just add the keyword ``"as"`` -to your function declaration line, followed by the function name you wish to use. -Argument Clinic will use that function name for the base (generated) function, -then add ``"_impl"`` to the end and use that for the name of the impl function. - -For example, if we wanted to rename the C function names generated for -:py:meth:`pickle.Pickler.dump`, it'd look like this:: - - /*[clinic input] - pickle.Pickler.dump as pickler_dumper - - ... - -The base function would now be named :c:func:`!pickler_dumper`, -and the impl function would now be named :c:func:`!pickler_dumper_impl`. - - -Similarly, you may have a problem where you want to give a parameter -a specific Python name, but that name may be inconvenient in C. Argument -Clinic allows you to give a parameter different names in Python and in C, -using the same ``"as"`` syntax:: - - /*[clinic input] - pickle.Pickler.dump - - obj: object - file as file_obj: object - protocol: object = NULL - * - fix_imports: bool = True - -Here, the name used in Python (in the signature and the ``keywords`` -array) would be *file*, but the C variable would be named ``file_obj``. - -You can use this to rename the *self* parameter too! - - -How to convert functions using ``PyArg_UnpackTuple`` ----------------------------------------------------- - -To convert a function parsing its arguments with :c:func:`PyArg_UnpackTuple`, -simply write out all the arguments, specifying each as an ``object``. You -may specify the *type* argument to cast the type as appropriate. All -arguments should be marked positional-only (add a ``/`` on a line by itself -after the last argument). - -Currently the generated code will use :c:func:`PyArg_ParseTuple`, but this -will change soon. - - -How to use optional groups --------------------------- - -Some legacy functions have a tricky approach to parsing their arguments: -they count the number of positional arguments, then use a ``switch`` statement -to call one of several different :c:func:`PyArg_ParseTuple` calls depending on -how many positional arguments there are. (These functions cannot accept -keyword-only arguments.) This approach was used to simulate optional -arguments back before :c:func:`PyArg_ParseTupleAndKeywords` was created. - -While functions using this approach can often be converted to -use :c:func:`!PyArg_ParseTupleAndKeywords`, optional arguments, and default values, -it's not always possible. Some of these legacy functions have -behaviors :c:func:`!PyArg_ParseTupleAndKeywords` doesn't directly support. -The most obvious example is the builtin function :py:func:`range`, which has -an optional argument on the *left* side of its required argument! -Another example is :py:meth:`curses.window.addch`, which has a group of two -arguments that must always be specified together. (The arguments are -called *x* and *y*; if you call the function passing in *x*, -you must also pass in *y* — and if you don't pass in *x* you may not -pass in *y* either.) - -In any case, the goal of Argument Clinic is to support argument parsing -for all existing CPython builtins without changing their semantics. -Therefore Argument Clinic supports -this alternate approach to parsing, using what are called *optional groups*. -Optional groups are groups of arguments that must all be passed in together. -They can be to the left or the right of the required arguments. They -can *only* be used with positional-only parameters. - -.. note:: Optional groups are *only* intended for use when converting - functions that make multiple calls to :c:func:`PyArg_ParseTuple`! - Functions that use *any* other approach for parsing arguments - should *almost never* be converted to Argument Clinic using - optional groups. Functions using optional groups currently - cannot have accurate signatures in Python, because Python just - doesn't understand the concept. Please avoid using optional - groups wherever possible. - -To specify an optional group, add a ``[`` on a line by itself before -the parameters you wish to group together, and a ``]`` on a line by itself -after these parameters. As an example, here's how :py:meth:`curses.window.addch` -uses optional groups to make the first two parameters and the last -parameter optional:: - - /*[clinic input] - - curses.window.addch - - [ - x: int - X-coordinate. - y: int - Y-coordinate. - ] - - ch: object - Character to add. - - [ - attr: long - Attributes for the character. - ] - / - - ... - - -Notes: - -* For every optional group, one additional parameter will be passed into the - impl function representing the group. The parameter will be an int named - ``group_{direction}_{number}``, - where ``{direction}`` is either ``right`` or ``left`` depending on whether the group - is before or after the required parameters, and ``{number}`` is a monotonically - increasing number (starting at 1) indicating how far away the group is from - the required parameters. When the impl is called, this parameter will be set - to zero if this group was unused, and set to non-zero if this group was used. - (By used or unused, I mean whether or not the parameters received arguments - in this invocation.) - -* If there are no required arguments, the optional groups will behave - as if they're to the right of the required arguments. - -* In the case of ambiguity, the argument parsing code - favors parameters on the left (before the required parameters). - -* Optional groups can only contain positional-only parameters. - -* Optional groups are *only* intended for legacy code. Please do not - use optional groups for new code. - - -How to use real Argument Clinic converters, instead of "legacy converters" --------------------------------------------------------------------------- - -To save time, and to minimize how much you need to learn -to achieve your first port to Argument Clinic, the walkthrough above tells -you to use "legacy converters". "Legacy converters" are a convenience, -designed explicitly to make porting existing code to Argument Clinic -easier. And to be clear, their use is acceptable when porting code for -Python 3.4. - -However, in the long term we probably want all our blocks to -use Argument Clinic's real syntax for converters. Why? A couple -reasons: - -* The proper converters are far easier to read and clearer in their intent. -* There are some format units that are unsupported as "legacy converters", - because they require arguments, and the legacy converter syntax doesn't - support specifying arguments. -* In the future we may have a new argument parsing library that isn't - restricted to what :c:func:`PyArg_ParseTuple` supports; this flexibility - won't be available to parameters using legacy converters. - -Therefore, if you don't mind a little extra effort, please use the normal -converters instead of legacy converters. - -In a nutshell, the syntax for Argument Clinic (non-legacy) converters -looks like a Python function call. However, if there are no explicit -arguments to the function (all functions take their default values), -you may omit the parentheses. Thus ``bool`` and ``bool()`` are exactly -the same converters. - -All arguments to Argument Clinic converters are keyword-only. -All Argument Clinic converters accept the following arguments: - - *c_default* - The default value for this parameter when defined in C. - Specifically, this will be the initializer for the variable declared - in the "parse function". See :ref:`the section on default values <default_values>` - for how to use this. - Specified as a string. - - *annotation* - The annotation value for this parameter. Not currently supported, - because :pep:`8` mandates that the Python library may not use - annotations. - - *unused* - Wrap the argument with :c:macro:`Py_UNUSED` in the impl function signature. - -In addition, some converters accept additional arguments. Here is a list -of these arguments, along with their meanings: - - *accept* - A set of Python types (and possibly pseudo-types); - this restricts the allowable Python argument to values of these types. - (This is not a general-purpose facility; as a rule it only supports - specific lists of types as shown in the legacy converter table.) - - To accept ``None``, add ``NoneType`` to this set. - - *bitwise* - Only supported for unsigned integers. The native integer value of this - Python argument will be written to the parameter without any range checking, - even for negative values. - - *converter* - Only supported by the ``object`` converter. Specifies the name of a - :ref:`C "converter function" <o_ampersand>` - to use to convert this object to a native type. - - *encoding* - Only supported for strings. Specifies the encoding to use when converting - this string from a Python str (Unicode) value into a C ``char *`` value. - - - *subclass_of* - Only supported for the ``object`` converter. Requires that the Python - value be a subclass of a Python type, as expressed in C. - - *type* - Only supported for the ``object`` and ``self`` converters. Specifies - the C type that will be used to declare the variable. Default value is - ``"PyObject *"``. - - *zeroes* - Only supported for strings. If true, embedded NUL bytes (``'\\0'``) are - permitted inside the value. The length of the string will be passed in - to the impl function, just after the string parameter, as a parameter named - ``<parameter_name>_length``. - -Please note, not every possible combination of arguments will work. -Usually these arguments are implemented by specific :c:func:`PyArg_ParseTuple` -*format units*, with specific behavior. For example, currently you cannot -call ``unsigned_short`` without also specifying ``bitwise=True``. -Although it's perfectly reasonable to think this would work, these semantics don't -map to any existing format unit. So Argument Clinic doesn't support it. (Or, at -least, not yet.) - -Below is a table showing the mapping of legacy converters into real -Argument Clinic converters. On the left is the legacy converter, -on the right is the text you'd replace it with. - -========= ================================================================================= -``'B'`` ``unsigned_char(bitwise=True)`` -``'b'`` ``unsigned_char`` -``'c'`` ``char`` -``'C'`` ``int(accept={str})`` -``'d'`` ``double`` -``'D'`` ``Py_complex`` -``'es'`` ``str(encoding='name_of_encoding')`` -``'es#'`` ``str(encoding='name_of_encoding', zeroes=True)`` -``'et'`` ``str(encoding='name_of_encoding', accept={bytes, bytearray, str})`` -``'et#'`` ``str(encoding='name_of_encoding', accept={bytes, bytearray, str}, zeroes=True)`` -``'f'`` ``float`` -``'h'`` ``short`` -``'H'`` ``unsigned_short(bitwise=True)`` -``'i'`` ``int`` -``'I'`` ``unsigned_int(bitwise=True)`` -``'k'`` ``unsigned_long(bitwise=True)`` -``'K'`` ``unsigned_long_long(bitwise=True)`` -``'l'`` ``long`` -``'L'`` ``long long`` -``'n'`` ``Py_ssize_t`` -``'O'`` ``object`` -``'O!'`` ``object(subclass_of='&PySomething_Type')`` -``'O&'`` ``object(converter='name_of_c_function')`` -``'p'`` ``bool`` -``'S'`` ``PyBytesObject`` -``'s'`` ``str`` -``'s#'`` ``str(zeroes=True)`` -``'s*'`` ``Py_buffer(accept={buffer, str})`` -``'U'`` ``unicode`` -``'u'`` ``wchar_t`` -``'u#'`` ``wchar_t(zeroes=True)`` -``'w*'`` ``Py_buffer(accept={rwbuffer})`` -``'Y'`` ``PyByteArrayObject`` -``'y'`` ``str(accept={bytes})`` -``'y#'`` ``str(accept={robuffer}, zeroes=True)`` -``'y*'`` ``Py_buffer`` -``'Z'`` ``wchar_t(accept={str, NoneType})`` -``'Z#'`` ``wchar_t(accept={str, NoneType}, zeroes=True)`` -``'z'`` ``str(accept={str, NoneType})`` -``'z#'`` ``str(accept={str, NoneType}, zeroes=True)`` -``'z*'`` ``Py_buffer(accept={buffer, str, NoneType})`` -========= ================================================================================= - -As an example, here's our sample ``pickle.Pickler.dump`` using the proper -converter:: - - /*[clinic input] - pickle.Pickler.dump - - obj: object - The object to be pickled. - / - - Write a pickled representation of obj to the open file. - [clinic start generated code]*/ - -One advantage of real converters is that they're more flexible than legacy -converters. For example, the ``unsigned_int`` converter (and all the -``unsigned_`` converters) can be specified without ``bitwise=True``. Their -default behavior performs range checking on the value, and they won't accept -negative numbers. You just can't do that with a legacy converter! - -Argument Clinic will show you all the converters it has -available. For each converter it'll show you all the parameters -it accepts, along with the default value for each parameter. -Just run ``Tools/clinic/clinic.py --converters`` to see the full list. - - -How to use the ``Py_buffer`` converter --------------------------------------- - -When using the ``Py_buffer`` converter -(or the ``'s*'``, ``'w*'``, ``'*y'``, or ``'z*'`` legacy converters), -you *must* not call :c:func:`PyBuffer_Release` on the provided buffer. -Argument Clinic generates code that does it for you (in the parsing function). - - -.. _clinic-howto-advanced-converters: - -How to use advanced converters ------------------------------- - -Remember those format units you skipped for your first -time because they were advanced? Here's how to handle those too. - -The trick is, all those format units take arguments—either -conversion functions, or types, or strings specifying an encoding. -(But "legacy converters" don't support arguments. That's why we -skipped them for your first function.) The argument you specified -to the format unit is now an argument to the converter; this -argument is either *converter* (for ``O&``), *subclass_of* (for ``O!``), -or *encoding* (for all the format units that start with ``e``). - -When using *subclass_of*, you may also want to use the other -custom argument for ``object()``: *type*, which lets you set the type -actually used for the parameter. For example, if you want to ensure -that the object is a subclass of :c:var:`PyUnicode_Type`, you probably want -to use the converter ``object(type='PyUnicodeObject *', subclass_of='&PyUnicode_Type')``. - -One possible problem with using Argument Clinic: it takes away some possible -flexibility for the format units starting with ``e``. When writing a -:c:func:`!PyArg_Parse*` call by hand, you could theoretically decide at runtime what -encoding string to pass to that call. But now this string must -be hard-coded at Argument-Clinic-preprocessing-time. This limitation is deliberate; -it made supporting this format unit much easier, and may allow for future optimizations. -This restriction doesn't seem unreasonable; CPython itself always passes in static -hard-coded encoding strings for parameters whose format units start with ``e``. - - -.. _clinic-howto-default-values: -.. _default_values: - -How to assign default values to parameter ------------------------------------------ - -Default values for parameters can be any of a number of values. -At their simplest, they can be string, int, or float literals: - -.. code-block:: none - - foo: str = "abc" - bar: int = 123 - bat: float = 45.6 - -They can also use any of Python's built-in constants: - -.. code-block:: none - - yep: bool = True - nope: bool = False - nada: object = None - -There's also special support for a default value of ``NULL``, and -for simple expressions, documented in the following sections. - - -The ``NULL`` default value -^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For string and object parameters, you can set them to ``None`` to indicate -that there's no default. However, that means the C variable will be -initialized to ``Py_None``. For convenience's sakes, there's a special -value called ``NULL`` for just this reason: from Python's perspective it -behaves like a default value of ``None``, but the C variable is initialized -with ``NULL``. - - -Symbolic default values -^^^^^^^^^^^^^^^^^^^^^^^ - -The default value you provide for a parameter can't be any arbitrary -expression. Currently the following are explicitly supported: - -* Numeric constants (integer and float) -* String constants -* ``True``, ``False``, and ``None`` -* Simple symbolic constants like :py:data:`sys.maxsize`, which must - start with the name of the module - -(In the future, this may need to get even more elaborate, -to allow full expressions like ``CONSTANT - 1``.) - - -Expressions as default values -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The default value for a parameter can be more than just a literal value. -It can be an entire expression, using math operators and looking up attributes -on objects. However, this support isn't exactly simple, because of some -non-obvious semantics. - -Consider the following example: - -.. code-block:: none - - foo: Py_ssize_t = sys.maxsize - 1 - -:py:data:`sys.maxsize` can have different values on different platforms. Therefore -Argument Clinic can't simply evaluate that expression locally and hard-code it -in C. So it stores the default in such a way that it will get evaluated at -runtime, when the user asks for the function's signature. - -What namespace is available when the expression is evaluated? It's evaluated -in the context of the module the builtin came from. So, if your module has an -attribute called :py:attr:`!max_widgets`, you may simply use it: - -.. code-block:: none - - foo: Py_ssize_t = max_widgets - -If the symbol isn't found in the current module, it fails over to looking in -:py:data:`sys.modules`. That's how it can find :py:data:`sys.maxsize` for example. -(Since you don't know in advance what modules the user will load into their interpreter, -it's best to restrict yourself to modules that are preloaded by Python itself.) - -Evaluating default values only at runtime means Argument Clinic can't compute -the correct equivalent C default value. So you need to tell it explicitly. -When you use an expression, you must also specify the equivalent expression -in C, using the *c_default* parameter to the converter: - -.. code-block:: none - - foo: Py_ssize_t(c_default="PY_SSIZE_T_MAX - 1") = sys.maxsize - 1 - -Another complication: Argument Clinic can't know in advance whether or not the -expression you supply is valid. It parses it to make sure it looks legal, but -it can't *actually* know. You must be very careful when using expressions to -specify values that are guaranteed to be valid at runtime! - -Finally, because expressions must be representable as static C values, there -are many restrictions on legal expressions. Here's a list of Python features -you're not permitted to use: - -* Function calls. -* Inline if statements (``3 if foo else 5``). -* Automatic sequence unpacking (``*[1, 2, 3]``). -* List/set/dict comprehensions and generator expressions. -* Tuple/list/set/dict literals. - - -.. _clinic-howto-return-converters: - -How to use return converters ----------------------------- - -By default, the impl function Argument Clinic generates for you returns -:c:type:`PyObject * <PyObject>`. -But your C function often computes some C type, -then converts it into the :c:type:`!PyObject *` -at the last moment. Argument Clinic handles converting your inputs from Python types -into native C types—why not have it convert your return value from a native C type -into a Python type too? - -That's what a "return converter" does. It changes your impl function to return -some C type, then adds code to the generated (non-impl) function to handle converting -that value into the appropriate :c:type:`!PyObject *`. - -The syntax for return converters is similar to that of parameter converters. -You specify the return converter like it was a return annotation on the -function itself, using ``->`` notation. - -For example: - -.. code-block:: c - - /*[clinic input] - add -> int - - a: int - b: int - / - - [clinic start generated code]*/ - -Return converters behave much the same as parameter converters; -they take arguments, the arguments are all keyword-only, and if you're not changing -any of the default arguments you can omit the parentheses. - -(If you use both ``"as"`` *and* a return converter for your function, -the ``"as"`` should come before the return converter.) - -There's one additional complication when using return converters: how do you -indicate an error has occurred? Normally, a function returns a valid (non-``NULL``) -pointer for success, and ``NULL`` for failure. But if you use an integer return converter, -all integers are valid. How can Argument Clinic detect an error? Its solution: each return -converter implicitly looks for a special value that indicates an error. If you return -that value, and an error has been set (c:func:`PyErr_Occurred` returns a true -value), then the generated code will propagate the error. Otherwise it will -encode the value you return like normal. - -Currently Argument Clinic supports only a few return converters: - -.. code-block:: none - - bool - double - float - int - long - Py_ssize_t - size_t - unsigned int - unsigned long - -None of these take parameters. -For all of these, return ``-1`` to indicate error. - -To see all the return converters Argument Clinic supports, along with -their parameters (if any), -just run ``Tools/clinic/clinic.py --converters`` for the full list. - - -How to clone existing functions -------------------------------- - -If you have a number of functions that look similar, you may be able to -use Clinic's "clone" feature. When you clone an existing function, -you reuse: - -* its parameters, including - - * their names, - - * their converters, with all parameters, - - * their default values, - - * their per-parameter docstrings, - - * their *kind* (whether they're positional only, - positional or keyword, or keyword only), and - -* its return converter. - -The only thing not copied from the original function is its docstring; -the syntax allows you to specify a new docstring. - -Here's the syntax for cloning a function:: - - /*[clinic input] - module.class.new_function [as c_basename] = module.class.existing_function - - Docstring for new_function goes here. - [clinic start generated code]*/ - -(The functions can be in different modules or classes. I wrote -``module.class`` in the sample just to illustrate that you must -use the full path to *both* functions.) - -Sorry, there's no syntax for partially cloning a function, or cloning a function -then modifying it. Cloning is an all-or nothing proposition. - -Also, the function you are cloning from must have been previously defined -in the current file. - - -How to call Python code ------------------------ - -The rest of the advanced topics require you to write Python code -which lives inside your C file and modifies Argument Clinic's -runtime state. This is simple: you simply define a Python block. - -A Python block uses different delimiter lines than an Argument -Clinic function block. It looks like this:: - - /*[python input] - # python code goes here - [python start generated code]*/ - -All the code inside the Python block is executed at the -time it's parsed. All text written to stdout inside the block -is redirected into the "output" after the block. - -As an example, here's a Python block that adds a static integer -variable to the C code:: - - /*[python input] - print('static int __ignored_unused_variable__ = 0;') - [python start generated code]*/ - static int __ignored_unused_variable__ = 0; - /*[python checksum:...]*/ - - -.. _clinic-howto-self-converter: - -How to use the "self converter" -------------------------------- - -Argument Clinic automatically adds a "self" parameter for you -using a default converter. It automatically sets the ``type`` -of this parameter to the "pointer to an instance" you specified -when you declared the type. However, you can override -Argument Clinic's converter and specify one yourself. -Just add your own *self* parameter as the first parameter in a -block, and ensure that its converter is an instance of -:class:`!self_converter` or a subclass thereof. - -What's the point? This lets you override the type of ``self``, -or give it a different default name. - -How do you specify the custom type you want to cast ``self`` to? -If you only have one or two functions with the same type for ``self``, -you can directly use Argument Clinic's existing ``self`` converter, -passing in the type you want to use as the *type* parameter:: - - /*[clinic input] - - _pickle.Pickler.dump - - self: self(type="PicklerObject *") - obj: object - / - - Write a pickled representation of the given object to the open file. - [clinic start generated code]*/ - -On the other hand, if you have a lot of functions that will use the same -type for ``self``, it's best to create your own converter, subclassing -:class:`!self_converter` but overwriting the :py:attr:`!type` member:: - - /*[python input] - class PicklerObject_converter(self_converter): - type = "PicklerObject *" - [python start generated code]*/ - - /*[clinic input] - - _pickle.Pickler.dump - - self: PicklerObject - obj: object - / - - Write a pickled representation of the given object to the open file. - [clinic start generated code]*/ - - -How to use the "defining class" converter ------------------------------------------ - -Argument Clinic facilitates gaining access to the defining class of a method. -This is useful for :ref:`heap type <heap-types>` methods that need to fetch -module level state. Use :c:func:`PyType_FromModuleAndSpec` to associate a new -heap type with a module. You can now use :c:func:`PyType_GetModuleState` on -the defining class to fetch the module state, for example from a module method. - -Example from :source:`Modules/zlibmodule.c`. -First, ``defining_class`` is added to the clinic input:: - - /*[clinic input] - zlib.Compress.compress - - cls: defining_class - data: Py_buffer - Binary data to be compressed. - / - - -After running the Argument Clinic tool, the following function signature is -generated:: - - /*[clinic start generated code]*/ - static PyObject * - zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, - Py_buffer *data) - /*[clinic end generated code: output=6731b3f0ff357ca6 input=04d00f65ab01d260]*/ - - -The following code can now use ``PyType_GetModuleState(cls)`` to fetch the -module state:: - - zlibstate *state = PyType_GetModuleState(cls); - - -Each method may only have one argument using this converter, and it must appear -after ``self``, or, if ``self`` is not used, as the first argument. The argument -will be of type ``PyTypeObject *``. The argument will not appear in the -:py:attr:`!__text_signature__`. - -The ``defining_class`` converter is not compatible with :py:meth:`!__init__` -and :py:meth:`!__new__` methods, which cannot use the :c:macro:`METH_METHOD` -convention. - -It is not possible to use ``defining_class`` with slot methods. In order to -fetch the module state from such methods, use :c:func:`PyType_GetModuleByDef` -to look up the module and then :c:func:`PyModule_GetState` to fetch the module -state. Example from the ``setattro`` slot method in -:source:`Modules/_threadmodule.c`:: - - static int - local_setattro(localobject *self, PyObject *name, PyObject *v) - { - PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &thread_module); - thread_module_state *state = get_thread_state(module); - ... - } - - -See also :pep:`573`. - - -.. _clinic-howto-custom-converter: - -How to write a custom converter -------------------------------- - -A converter is a Python class that inherits from :py:class:`CConverter`. -The main purpose of a custom converter, is for parameters parsed with -the ``O&`` format unit --- parsing such a parameter means calling -a :c:func:`PyArg_ParseTuple` "converter function". - -Your converter class should be named :samp:`{ConverterName}_converter`. -By following this convention, your converter class will be automatically -registered with Argument Clinic, with its *converter name* being the name of -your converter class with the ``_converter`` suffix stripped off. - -Instead of subclassing :py:meth:`!CConverter.__init__`, -write a :py:meth:`!converter_init` method. -:py:meth:`!converter_init` always accepts a *self* parameter. -After *self*, all additional parameters **must** be keyword-only. -Any arguments passed to the converter in Argument Clinic -will be passed along to your :py:meth:`!converter_init` method. -See :py:class:`CConverter` for a list of members you may wish to specify in -your subclass. - -Here's the simplest example of a custom converter, from :source:`Modules/zlibmodule.c`:: - - /*[python input] - - class ssize_t_converter(CConverter): - type = 'Py_ssize_t' - converter = 'ssize_t_converter' - - [python start generated code]*/ - /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ - -This block adds a converter named ``ssize_t`` to Argument Clinic. -Parameters declared as ``ssize_t`` will be declared with type :c:type:`Py_ssize_t`, -and will be parsed by the ``'O&'`` format unit, -which will call the :c:func:`!ssize_t_converter` converter C function. -``ssize_t`` variables automatically support default values. - -More sophisticated custom converters can insert custom C code to -handle initialization and cleanup. -You can see more examples of custom converters in the CPython -source tree; grep the C files for the string ``CConverter``. - - -How to write a custom return converter --------------------------------------- - -Writing a custom return converter is much like writing -a custom converter. Except it's somewhat simpler, because return -converters are themselves much simpler. - -Return converters must subclass :py:class:`!CReturnConverter`. -There are no examples yet of custom return converters, -because they are not widely used yet. If you wish to -write your own return converter, please read :source:`Tools/clinic/clinic.py`, -specifically the implementation of :py:class:`!CReturnConverter` and -all its subclasses. - - -How to convert ``METH_O`` and ``METH_NOARGS`` functions -------------------------------------------------------- - -To convert a function using :c:macro:`METH_O`, make sure the function's -single argument is using the ``object`` converter, and mark the -arguments as positional-only:: - - /*[clinic input] - meth_o_sample - - argument: object - / - [clinic start generated code]*/ - - -To convert a function using :c:macro:`METH_NOARGS`, just don't specify -any arguments. - -You can still use a self converter, a return converter, and specify -a *type* argument to the object converter for :c:macro:`METH_O`. - - -How to convert ``tp_new`` and ``tp_init`` functions ---------------------------------------------------- - -You can convert :c:member:`~PyTypeObject.tp_new` and -:c:member:`~PyTypeObject.tp_init` functions. -Just name them ``__new__`` or ``__init__`` as appropriate. Notes: - -* The function name generated for ``__new__`` doesn't end in ``__new__`` - like it would by default. It's just the name of the class, converted - into a valid C identifier. - -* No :c:type:`PyMethodDef` ``#define`` is generated for these functions. - -* ``__init__`` functions return ``int``, not ``PyObject *``. - -* Use the docstring as the class docstring. - -* Although ``__new__`` and ``__init__`` functions must always - accept both the ``args`` and ``kwargs`` objects, when converting - you may specify any signature for these functions that you like. - (If your function doesn't support keywords, the parsing function - generated will throw an exception if it receives any.) - - -How to change and redirect Clinic's output ------------------------------------------- - -It can be inconvenient to have Clinic's output interspersed with -your conventional hand-edited C code. Luckily, Clinic is configurable: -you can buffer up its output for printing later (or earlier!), or write -its output to a separate file. You can also add a prefix or suffix to -every line of Clinic's generated output. - -While changing Clinic's output in this manner can be a boon to readability, -it may result in Clinic code using types before they are defined, or -your code attempting to use Clinic-generated code before it is defined. -These problems can be easily solved by rearranging the declarations in your file, -or moving where Clinic's generated code goes. (This is why the default behavior -of Clinic is to output everything into the current block; while many people -consider this hampers readability, it will never require rearranging your -code to fix definition-before-use problems.) - -Let's start with defining some terminology: - -*field* - A field, in this context, is a subsection of Clinic's output. - For example, the ``#define`` for the :c:type:`PyMethodDef` structure - is a field, called ``methoddef_define``. Clinic has seven - different fields it can output per function definition: - - .. code-block:: none - - docstring_prototype - docstring_definition - methoddef_define - impl_prototype - parser_prototype - parser_definition - impl_definition - - All the names are of the form ``"<a>_<b>"``, - where ``"<a>"`` is the semantic object represented (the parsing function, - the impl function, the docstring, or the methoddef structure) and ``"<b>"`` - represents what kind of statement the field is. Field names that end in - ``"_prototype"`` - represent forward declarations of that thing, without the actual body/data - of the thing; field names that end in ``"_definition"`` represent the actual - definition of the thing, with the body/data of the thing. (``"methoddef"`` - is special, it's the only one that ends with ``"_define"``, representing that - it's a preprocessor #define.) - -*destination* - A destination is a place Clinic can write output to. There are - five built-in destinations: - - ``block`` - The default destination: printed in the output section of - the current Clinic block. - - ``buffer`` - A text buffer where you can save text for later. Text sent - here is appended to the end of any existing text. It's an - error to have any text left in the buffer when Clinic finishes - processing a file. - - ``file`` - A separate "clinic file" that will be created automatically by Clinic. - The filename chosen for the file is ``{basename}.clinic{extension}``, - where ``basename`` and ``extension`` were assigned the output - from ``os.path.splitext()`` run on the current file. (Example: - the ``file`` destination for :file:`_pickle.c` would be written to - :file:`_pickle.clinic.c`.) - - **Important: When using a** ``file`` **destination, you** - *must check in* **the generated file!** - - ``two-pass`` - A buffer like ``buffer``. However, a two-pass buffer can only - be dumped once, and it prints out all text sent to it during - all processing, even from Clinic blocks *after* the dumping point. - - ``suppress`` - The text is suppressed—thrown away. - - -Clinic defines five new directives that let you reconfigure its output. - -The first new directive is ``dump``: - -.. code-block:: none - - dump <destination> - -This dumps the current contents of the named destination into the output of -the current block, and empties it. This only works with ``buffer`` and -``two-pass`` destinations. - -The second new directive is ``output``. The most basic form of ``output`` -is like this: - -.. code-block:: none - - output <field> <destination> - -This tells Clinic to output *field* to *destination*. ``output`` also -supports a special meta-destination, called ``everything``, which tells -Clinic to output *all* fields to that *destination*. - -``output`` has a number of other functions: - -.. code-block:: none - - output push - output pop - output preset <preset> - - -``output push`` and ``output pop`` allow you to push and pop -configurations on an internal configuration stack, so that you -can temporarily modify the output configuration, then easily restore -the previous configuration. Simply push before your change to save -the current configuration, then pop when you wish to restore the -previous configuration. - -``output preset`` sets Clinic's output to one of several built-in -preset configurations, as follows: - - ``block`` - Clinic's original starting configuration. Writes everything - immediately after the input block. - - Suppress the ``parser_prototype`` - and ``docstring_prototype``, write everything else to ``block``. - - ``file`` - Designed to write everything to the "clinic file" that it can. - You then ``#include`` this file near the top of your file. - You may need to rearrange your file to make this work, though - usually this just means creating forward declarations for various - ``typedef`` and ``PyTypeObject`` definitions. - - Suppress the ``parser_prototype`` - and ``docstring_prototype``, write the ``impl_definition`` to - ``block``, and write everything else to ``file``. - - The default filename is ``"{dirname}/clinic/{basename}.h"``. - - ``buffer`` - Save up most of the output from Clinic, to be written into - your file near the end. For Python files implementing modules - or builtin types, it's recommended that you dump the buffer - just above the static structures for your module or - builtin type; these are normally very near the end. Using - ``buffer`` may require even more editing than ``file``, if - your file has static ``PyMethodDef`` arrays defined in the - middle of the file. - - Suppress the ``parser_prototype``, ``impl_prototype``, - and ``docstring_prototype``, write the ``impl_definition`` to - ``block``, and write everything else to ``file``. - - ``two-pass`` - Similar to the ``buffer`` preset, but writes forward declarations to - the ``two-pass`` buffer, and definitions to the ``buffer``. - This is similar to the ``buffer`` preset, but may require - less editing than ``buffer``. Dump the ``two-pass`` buffer - near the top of your file, and dump the ``buffer`` near - the end just like you would when using the ``buffer`` preset. - - Suppresses the ``impl_prototype``, write the ``impl_definition`` - to ``block``, write ``docstring_prototype``, ``methoddef_define``, - and ``parser_prototype`` to ``two-pass``, write everything else - to ``buffer``. - - ``partial-buffer`` - Similar to the ``buffer`` preset, but writes more things to ``block``, - only writing the really big chunks of generated code to ``buffer``. - This avoids the definition-before-use problem of ``buffer`` completely, - at the small cost of having slightly more stuff in the block's output. - Dump the ``buffer`` near the end, just like you would when using - the ``buffer`` preset. - - Suppresses the ``impl_prototype``, write the ``docstring_definition`` - and ``parser_definition`` to ``buffer``, write everything else to ``block``. - -The third new directive is ``destination``: - -.. code-block:: none - - destination <name> <command> [...] - -This performs an operation on the destination named ``name``. - -There are two defined subcommands: ``new`` and ``clear``. - -The ``new`` subcommand works like this: - -.. code-block:: none - - destination <name> new <type> - -This creates a new destination with name ``<name>`` and type ``<type>``. - -There are five destination types: - - ``suppress`` - Throws the text away. - - ``block`` - Writes the text to the current block. This is what Clinic - originally did. - - ``buffer`` - A simple text buffer, like the "buffer" builtin destination above. - - ``file`` - A text file. The file destination takes an extra argument, - a template to use for building the filename, like so: - - destination <name> new <type> <file_template> - - The template can use three strings internally that will be replaced - by bits of the filename: - - {path} - The full path to the file, including directory and full filename. - {dirname} - The name of the directory the file is in. - {basename} - Just the name of the file, not including the directory. - {basename_root} - Basename with the extension clipped off - (everything up to but not including the last '.'). - {basename_extension} - The last '.' and everything after it. If the basename - does not contain a period, this will be the empty string. - - If there are no periods in the filename, {basename} and {filename} - are the same, and {extension} is empty. "{basename}{extension}" - is always exactly the same as "{filename}"." - - ``two-pass`` - A two-pass buffer, like the "two-pass" builtin destination above. - - -The ``clear`` subcommand works like this: - -.. code-block:: none - - destination <name> clear - -It removes all the accumulated text up to this point in the destination. -(I don't know what you'd need this for, but I thought maybe it'd be -useful while someone's experimenting.) - -The fourth new directive is ``set``: - -.. code-block:: none - - set line_prefix "string" - set line_suffix "string" - -``set`` lets you set two internal variables in Clinic. -``line_prefix`` is a string that will be prepended to every line of Clinic's output; -``line_suffix`` is a string that will be appended to every line of Clinic's output. - -Both of these support two format strings: - - ``{block comment start}`` - Turns into the string ``/*``, the start-comment text sequence for C files. - - ``{block comment end}`` - Turns into the string ``*/``, the end-comment text sequence for C files. - -The final new directive is one you shouldn't need to use directly, -called ``preserve``: - -.. code-block:: none - - preserve - -This tells Clinic that the current contents of the output should be kept, unmodified. -This is used internally by Clinic when dumping output into ``file`` files; wrapping -it in a Clinic block lets Clinic use its existing checksum functionality to ensure -the file was not modified by hand before it gets overwritten. - - -How to use the ``#ifdef`` trick -------------------------------- - -If you're converting a function that isn't available on all platforms, -there's a trick you can use to make life a little easier. The existing -code probably looks like this:: - - #ifdef HAVE_FUNCTIONNAME - static module_functionname(...) - { - ... - } - #endif /* HAVE_FUNCTIONNAME */ - -And then in the ``PyMethodDef`` structure at the bottom the existing code -will have: - -.. code-block:: none - - #ifdef HAVE_FUNCTIONNAME - {'functionname', ... }, - #endif /* HAVE_FUNCTIONNAME */ - -In this scenario, you should enclose the body of your impl function inside the ``#ifdef``, -like so:: - - #ifdef HAVE_FUNCTIONNAME - /*[clinic input] - module.functionname - ... - [clinic start generated code]*/ - static module_functionname(...) - { - ... - } - #endif /* HAVE_FUNCTIONNAME */ - -Then, remove those three lines from the :c:type:`PyMethodDef` structure, -replacing them with the macro Argument Clinic generated: - -.. code-block:: none - - MODULE_FUNCTIONNAME_METHODDEF - -(You can find the real name for this macro inside the generated code. -Or you can calculate it yourself: it's the name of your function as defined -on the first line of your block, but with periods changed to underscores, -uppercased, and ``"_METHODDEF"`` added to the end.) - -Perhaps you're wondering: what if ``HAVE_FUNCTIONNAME`` isn't defined? -The ``MODULE_FUNCTIONNAME_METHODDEF`` macro won't be defined either! - -Here's where Argument Clinic gets very clever. It actually detects that the -Argument Clinic block might be deactivated by the ``#ifdef``. When that -happens, it generates a little extra code that looks like this:: - - #ifndef MODULE_FUNCTIONNAME_METHODDEF - #define MODULE_FUNCTIONNAME_METHODDEF - #endif /* !defined(MODULE_FUNCTIONNAME_METHODDEF) */ - -That means the macro always works. If the function is defined, this turns -into the correct structure, including the trailing comma. If the function is -undefined, this turns into nothing. - -However, this causes one ticklish problem: where should Argument Clinic put this -extra code when using the "block" output preset? It can't go in the output block, -because that could be deactivated by the ``#ifdef``. (That's the whole point!) - -In this situation, Argument Clinic writes the extra code to the "buffer" destination. -This may mean that you get a complaint from Argument Clinic: - -.. code-block:: none - - Warning in file "Modules/posixmodule.c" on line 12357: - Destination buffer 'buffer' not empty at end of file, emptying. - -When this happens, just open your file, find the ``dump buffer`` block that -Argument Clinic added to your file (it'll be at the very bottom), then -move it above the :c:type:`PyMethodDef` structure where that macro is used. - - -How to use Argument Clinic in Python files ------------------------------------------- - -It's actually possible to use Argument Clinic to preprocess Python files. -There's no point to using Argument Clinic blocks, of course, as the output -wouldn't make any sense to the Python interpreter. But using Argument Clinic -to run Python blocks lets you use Python as a Python preprocessor! - -Since Python comments are different from C comments, Argument Clinic -blocks embedded in Python files look slightly different. They look like this: - -.. code-block:: python3 - - #/*[python input] - #print("def foo(): pass") - #[python start generated code]*/ - def foo(): pass - #/*[python checksum:...]*/ + The Argument Clinic How-TO has been moved to the `Python Developer's Guide + <https://devguide.python.org/development-tools/clinic/>`__. diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst index 4828e2fa..f9ad81e3 100644 --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -43,7 +43,7 @@ appearance---and the curses library will figure out what control codes need to be sent to the terminal to produce the right output. curses doesn't provide many user-interface concepts such as buttons, checkboxes, or dialogs; if you need such features, consider a user interface library such as -`Urwid <https://pypi.org/project/urwid/>`_. +:pypi:`Urwid`. The curses library was originally written for BSD Unix; the later System V versions of Unix from AT&T added many enhancements and new functions. BSD curses @@ -56,8 +56,7 @@ versions of curses carried by some proprietary Unixes may not support everything, though. The Windows version of Python doesn't include the :mod:`curses` -module. A ported version called `UniCurses -<https://pypi.org/project/UniCurses>`_ is available. +module. A ported version called :pypi:`UniCurses` is available. The Python curses module @@ -429,8 +428,7 @@ User Input The C curses library offers only very simple input mechanisms. Python's :mod:`curses` module adds a basic text-input widget. (Other libraries -such as `Urwid <https://pypi.org/project/urwid/>`_ have more extensive -collections of widgets.) +such as :pypi:`Urwid` have more extensive collections of widgets.) There are two methods for getting input from a window: diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 1d9424cb..50a368b7 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1,8 +1,8 @@ .. _descriptorhowto: -====================== -Descriptor HowTo Guide -====================== +================ +Descriptor Guide +================ :Author: Raymond Hettinger :Contact: <python at rcn dot com> @@ -42,7 +42,7 @@ add new capabilities one by one. Simple example: A descriptor that returns a constant ---------------------------------------------------- -The :class:`Ten` class is a descriptor whose :meth:`__get__` method always +The :class:`!Ten` class is a descriptor whose :meth:`~object.__get__` method always returns the constant ``10``: .. testcode:: @@ -120,10 +120,10 @@ different, updated answers each time:: 2 Besides showing how descriptors can run computations, this example also -reveals the purpose of the parameters to :meth:`__get__`. The *self* +reveals the purpose of the parameters to :meth:`~object.__get__`. The *self* parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is either *g* or *s*, an instance of *Directory*. It is the *obj* parameter that -lets the :meth:`__get__` method learn the target directory. The *objtype* +lets the :meth:`~object.__get__` method learn the target directory. The *objtype* parameter is the class *Directory*. @@ -133,7 +133,7 @@ Managed attributes A popular use for descriptors is managing access to instance data. The descriptor is assigned to a public attribute in the class dictionary while the actual data is stored as a private attribute in the instance dictionary. The -descriptor's :meth:`__get__` and :meth:`__set__` methods are triggered when +descriptor's :meth:`~object.__get__` and :meth:`~object.__set__` methods are triggered when the public attribute is accessed. In the following example, *age* is the public attribute and *_age* is the @@ -215,9 +215,9 @@ Customized names When a class uses descriptors, it can inform each descriptor about which variable name was used. -In this example, the :class:`Person` class has two descriptor instances, -*name* and *age*. When the :class:`Person` class is defined, it makes a -callback to :meth:`__set_name__` in *LoggedAccess* so that the field names can +In this example, the :class:`!Person` class has two descriptor instances, +*name* and *age*. When the :class:`!Person` class is defined, it makes a +callback to :meth:`~object.__set_name__` in *LoggedAccess* so that the field names can be recorded, giving each descriptor its own *public_name* and *private_name*: .. testcode:: @@ -253,8 +253,8 @@ be recorded, giving each descriptor its own *public_name* and *private_name*: def birthday(self): self.age += 1 -An interactive session shows that the :class:`Person` class has called -:meth:`__set_name__` so that the field names would be recorded. Here +An interactive session shows that the :class:`!Person` class has called +:meth:`~object.__set_name__` so that the field names would be recorded. Here we call :func:`vars` to look up the descriptor without triggering it: .. doctest:: @@ -294,10 +294,10 @@ The two *Person* instances contain only the private names: Closing thoughts ---------------- -A :term:`descriptor` is what we call any object that defines :meth:`__get__`, -:meth:`__set__`, or :meth:`__delete__`. +A :term:`descriptor` is what we call any object that defines :meth:`~object.__get__`, +:meth:`~object.__set__`, or :meth:`~object.__delete__`. -Optionally, descriptors can have a :meth:`__set_name__` method. This is only +Optionally, descriptors can have a :meth:`~object.__set_name__` method. This is only used in cases where a descriptor needs to know either the class where it was created or the name of class variable it was assigned to. (This method, if present, is called even if the class is not a descriptor.) @@ -337,7 +337,7 @@ any data, it verifies that the new value meets various type and range restrictions. If those restrictions aren't met, it raises an exception to prevent data corruption at its source. -This :class:`Validator` class is both an :term:`abstract base class` and a +This :class:`!Validator` class is both an :term:`abstract base class` and a managed attribute descriptor: .. testcode:: @@ -360,8 +360,8 @@ managed attribute descriptor: def validate(self, value): pass -Custom validators need to inherit from :class:`Validator` and must supply a -:meth:`validate` method to test various restrictions as needed. +Custom validators need to inherit from :class:`!Validator` and must supply a +:meth:`!validate` method to test various restrictions as needed. Custom validators @@ -369,13 +369,13 @@ Custom validators Here are three practical data validation utilities: -1) :class:`OneOf` verifies that a value is one of a restricted set of options. +1) :class:`!OneOf` verifies that a value is one of a restricted set of options. -2) :class:`Number` verifies that a value is either an :class:`int` or +2) :class:`!Number` verifies that a value is either an :class:`int` or :class:`float`. Optionally, it verifies that a value is between a given minimum or maximum. -3) :class:`String` verifies that a value is a :class:`str`. Optionally, it +3) :class:`!String` verifies that a value is a :class:`str`. Optionally, it validates a given minimum or maximum length. It can validate a user-defined `predicate <https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)>`_ as well. @@ -389,7 +389,9 @@ Here are three practical data validation utilities: def validate(self, value): if value not in self.options: - raise ValueError(f'Expected {value!r} to be one of {self.options!r}') + raise ValueError( + f'Expected {value!r} to be one of {self.options!r}' + ) class Number(Validator): @@ -469,6 +471,7 @@ The descriptors prevent invalid instances from being created: Traceback (most recent call last): ... ValueError: Expected -5 to be at least 0 + >>> Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number Traceback (most recent call last): ... @@ -498,8 +501,8 @@ Definition and introduction --------------------------- In general, a descriptor is an attribute value that has one of the methods in -the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, -and :meth:`__delete__`. If any of those methods are defined for an +the descriptor protocol. Those methods are :meth:`~object.__get__`, :meth:`~object.__set__`, +and :meth:`~object.__delete__`. If any of those methods are defined for an attribute, it is said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the @@ -513,7 +516,7 @@ were defined. Descriptors are a powerful, general purpose protocol. They are the mechanism behind properties, methods, static methods, class methods, and -:func:`super()`. They are used throughout Python itself. Descriptors +:func:`super`. They are used throughout Python itself. Descriptors simplify the underlying C code and offer a flexible set of new tools for everyday Python programs. @@ -521,18 +524,18 @@ everyday Python programs. Descriptor protocol ------------------- -``descr.__get__(self, obj, type=None) -> value`` +``descr.__get__(self, obj, type=None)`` -``descr.__set__(self, obj, value) -> None`` +``descr.__set__(self, obj, value)`` -``descr.__delete__(self, obj) -> None`` +``descr.__delete__(self, obj)`` That is all there is to it. Define any of these methods and an object is considered a descriptor and can override default behavior upon being looked up as an attribute. -If an object defines :meth:`__set__` or :meth:`__delete__`, it is considered -a data descriptor. Descriptors that only define :meth:`__get__` are called +If an object defines :meth:`~object.__set__` or :meth:`~object.__delete__`, it is considered +a data descriptor. Descriptors that only define :meth:`~object.__get__` are called non-data descriptors (they are often used for methods but other uses are possible). @@ -542,9 +545,9 @@ has an entry with the same name as a data descriptor, the data descriptor takes precedence. If an instance's dictionary has an entry with the same name as a non-data descriptor, the dictionary entry takes precedence. -To make a read-only data descriptor, define both :meth:`__get__` and -:meth:`__set__` with the :meth:`__set__` raising an :exc:`AttributeError` when -called. Defining the :meth:`__set__` method with an exception raising +To make a read-only data descriptor, define both :meth:`~object.__get__` and +:meth:`~object.__set__` with the :meth:`~object.__set__` raising an :exc:`AttributeError` when +called. Defining the :meth:`~object.__set__` method with an exception raising placeholder is enough to make it a data descriptor. @@ -559,8 +562,8 @@ attribute access. The expression ``obj.x`` looks up the attribute ``x`` in the chain of namespaces for ``obj``. If the search finds a descriptor outside of the -instance ``__dict__``, its :meth:`__get__` method is invoked according to the -precedence rules listed below. +instance :attr:`~object.__dict__`, its :meth:`~object.__get__` method is +invoked according to the precedence rules listed below. The details of invocation depend on whether ``obj`` is an object, class, or instance of super. @@ -571,7 +574,7 @@ Invocation from an instance Instance lookup scans through a chain of namespaces giving data descriptors the highest priority, followed by instance variables, then non-data -descriptors, then class variables, and lastly :meth:`__getattr__` if it is +descriptors, then class variables, and lastly :meth:`~object.__getattr__` if it is provided. If a descriptor is found for ``a.x``, then it is invoked with: @@ -716,12 +719,12 @@ a pure Python equivalent: >>> object_getattribute(u2, 'x') == u2.x == (D1, u2, U2) True -Note, there is no :meth:`__getattr__` hook in the :meth:`__getattribute__` -code. That is why calling :meth:`__getattribute__` directly or with -``super().__getattribute__`` will bypass :meth:`__getattr__` entirely. +Note, there is no :meth:`~object.__getattr__` hook in the :meth:`~object.__getattribute__` +code. That is why calling :meth:`~object.__getattribute__` directly or with +``super().__getattribute__`` will bypass :meth:`~object.__getattr__` entirely. Instead, it is the dot operator and the :func:`getattr` function that are -responsible for invoking :meth:`__getattr__` whenever :meth:`__getattribute__` +responsible for invoking :meth:`~object.__getattr__` whenever :meth:`~object.__getattribute__` raises an :exc:`AttributeError`. Their logic is encapsulated in a helper function: @@ -773,8 +776,8 @@ Invocation from a class ----------------------- The logic for a dotted lookup such as ``A.x`` is in -:meth:`type.__getattribute__`. The steps are similar to those for -:meth:`object.__getattribute__` but the instance dictionary lookup is replaced +:meth:`!type.__getattribute__`. The steps are similar to those for +:meth:`!object.__getattribute__` but the instance dictionary lookup is replaced by a search through the class's :term:`method resolution order`. If a descriptor is found, it is invoked with ``desc.__get__(None, A)``. @@ -786,8 +789,8 @@ The full C implementation can be found in :c:func:`!type_getattro` and Invocation from super --------------------- -The logic for super's dotted lookup is in the :meth:`__getattribute__` method for -object returned by :class:`super()`. +The logic for super's dotted lookup is in the :meth:`~object.__getattribute__` method for +object returned by :func:`super`. A dotted lookup such as ``super(A, obj).m`` searches ``obj.__class__.__mro__`` for the base class ``B`` immediately following ``A`` and then returns @@ -803,21 +806,21 @@ The full C implementation can be found in :c:func:`!super_getattro` in Summary of invocation logic --------------------------- -The mechanism for descriptors is embedded in the :meth:`__getattribute__()` +The mechanism for descriptors is embedded in the :meth:`~object.__getattribute__` methods for :class:`object`, :class:`type`, and :func:`super`. The important points to remember are: -* Descriptors are invoked by the :meth:`__getattribute__` method. +* Descriptors are invoked by the :meth:`~object.__getattribute__` method. * Classes inherit this machinery from :class:`object`, :class:`type`, or :func:`super`. -* Overriding :meth:`__getattribute__` prevents automatic descriptor calls +* Overriding :meth:`~object.__getattribute__` prevents automatic descriptor calls because all the descriptor logic is in that method. -* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make - different calls to :meth:`__get__`. The first includes the instance and may +* :meth:`!object.__getattribute__` and :meth:`!type.__getattribute__` make + different calls to :meth:`~object.__get__`. The first includes the instance and may include the class. The second puts in ``None`` for the instance and always includes the class. @@ -832,16 +835,16 @@ Automatic name notification Sometimes it is desirable for a descriptor to know what class variable name it was assigned to. When a new class is created, the :class:`type` metaclass scans the dictionary of the new class. If any of the entries are descriptors -and if they define :meth:`__set_name__`, that method is called with two +and if they define :meth:`~object.__set_name__`, that method is called with two arguments. The *owner* is the class where the descriptor is used, and the *name* is the class variable the descriptor was assigned to. The implementation details are in :c:func:`!type_new` and :c:func:`!set_names` in :source:`Objects/typeobject.c`. -Since the update logic is in :meth:`type.__new__`, notifications only take +Since the update logic is in :meth:`!type.__new__`, notifications only take place at the time of class creation. If descriptors are added to the class -afterwards, :meth:`__set_name__` will need to be called manually. +afterwards, :meth:`~object.__set_name__` will need to be called manually. ORM example @@ -870,7 +873,7 @@ care of lookups or updates: conn.execute(self.store, [value, obj.key]) conn.commit() -We can use the :class:`Field` class to define `models +We can use the :class:`!Field` class to define `models <https://en.wikipedia.org/wiki/Database_model>`_ that describe the schema for each table in a database: @@ -943,6 +946,10 @@ it can be updated: >>> Movie('Star Wars').director 'J.J. Abrams' +.. testcleanup:: + + conn.close() + Pure Python Equivalents ^^^^^^^^^^^^^^^^^^^^^^^ @@ -986,7 +993,7 @@ The documentation shows a typical use to define a managed attribute ``x``: AttributeError: 'C' object has no attribute '_C__x' To see how :func:`property` is implemented in terms of the descriptor protocol, -here is a pure Python equivalent: +here is a pure Python equivalent that implements most of the core functionality: .. testcode:: @@ -1000,42 +1007,35 @@ here is a pure Python equivalent: if doc is None and fget is not None: doc = fget.__doc__ self.__doc__ = doc - self._name = '' def __set_name__(self, owner, name): - self._name = name + self.__name__ = name def __get__(self, obj, objtype=None): if obj is None: return self if self.fget is None: - raise AttributeError(f"property '{self._name}' has no getter") + raise AttributeError return self.fget(obj) def __set__(self, obj, value): if self.fset is None: - raise AttributeError(f"property '{self._name}' has no setter") + raise AttributeError self.fset(obj, value) def __delete__(self, obj): if self.fdel is None: - raise AttributeError(f"property '{self._name}' has no deleter") + raise AttributeError self.fdel(obj) def getter(self, fget): - prop = type(self)(fget, self.fset, self.fdel, self.__doc__) - prop._name = self._name - return prop + return type(self)(fget, self.fset, self.fdel, self.__doc__) def setter(self, fset): - prop = type(self)(self.fget, fset, self.fdel, self.__doc__) - prop._name = self._name - return prop + return type(self)(self.fget, fset, self.fdel, self.__doc__) def deleter(self, fdel): - prop = type(self)(self.fget, self.fset, fdel, self.__doc__) - prop._name = self._name - return prop + return type(self)(self.fget, self.fset, fdel, self.__doc__) .. testcode:: :hide: @@ -1050,6 +1050,11 @@ here is a pure Python equivalent: def delx(self): del self.__x x = Property(getx, setx, delx, "I'm the 'x' property.") + no_getter = Property(None, setx, delx, "I'm the 'x' property.") + no_setter = Property(getx, None, delx, "I'm the 'x' property.") + no_deleter = Property(getx, setx, None, "I'm the 'x' property.") + no_doc = Property(getx, setx, delx, None) + # Now do it again but use the decorator style @@ -1088,6 +1093,32 @@ here is a pure Python equivalent: >>> hasattr(ccc, 'x') False + >>> cc = CC() + >>> cc.x = 33 + >>> try: + ... cc.no_getter + ... except AttributeError as e: + ... type(e).__name__ + ... + 'AttributeError' + + >>> try: + ... cc.no_setter = 33 + ... except AttributeError as e: + ... type(e).__name__ + ... + 'AttributeError' + + >>> try: + ... del cc.no_deleter + ... except AttributeError as e: + ... type(e).__name__ + ... + 'AttributeError' + + >>> CC.no_doc.__doc__ is None + True + The :func:`property` builtin helps whenever a user interface has granted attribute access and then subsequent changes require the intervention of a method. @@ -1109,7 +1140,7 @@ to wrap access to the value attribute in a property data descriptor: self.recalc() return self._value -Either the built-in :func:`property` or our :func:`Property` equivalent would +Either the built-in :func:`property` or our :func:`!Property` equivalent would work in this example. @@ -1141,8 +1172,22 @@ roughly equivalent to: obj = self.__self__ return func(obj, *args, **kwargs) + def __getattribute__(self, name): + "Emulate method_getset() in Objects/classobject.c" + if name == '__doc__': + return self.__func__.__doc__ + return object.__getattribute__(self, name) + + def __getattr__(self, name): + "Emulate method_getattro() in Objects/classobject.c" + return getattr(self.__func__, name) + + def __get__(self, obj, objtype=None): + "Emulate method_descr_get() in Objects/classobject.c" + return self + To support automatic creation of methods, functions include the -:meth:`__get__` method for binding methods during attribute access. This +:meth:`~object.__get__` method for binding methods during attribute access. This means that functions are non-data descriptors that return bound methods during dotted lookup from an instance. Here's how it works: @@ -1163,8 +1208,20 @@ descriptor works in practice: .. testcode:: class D: - def f(self, x): - return x + def f(self): + return self + + class D2: + pass + +.. doctest:: + :hide: + + >>> d = D() + >>> d2 = D2() + >>> d2.f = d.f.__get__(d2, D2) + >>> d2.f() is d + True The function has a :term:`qualified name` attribute to support introspection: @@ -1174,19 +1231,19 @@ The function has a :term:`qualified name` attribute to support introspection: 'D.f' Accessing the function through the class dictionary does not invoke -:meth:`__get__`. Instead, it just returns the underlying function object:: +:meth:`~object.__get__`. Instead, it just returns the underlying function object:: >>> D.__dict__['f'] <function D.f at 0x00C45070> -Dotted access from a class calls :meth:`__get__` which just returns the +Dotted access from a class calls :meth:`~object.__get__` which just returns the underlying function unchanged:: >>> D.f <function D.f at 0x00C45070> The interesting behavior occurs during dotted access from an instance. The -dotted lookup calls :meth:`__get__` which returns a bound method object:: +dotted lookup calls :meth:`~object.__get__` which returns a bound method object:: >>> d = D() >>> d.f @@ -1199,7 +1256,7 @@ instance:: <function D.f at 0x00C45070> >>> d.f.__self__ - <__main__.D object at 0x1012e1f98> + <__main__.D object at 0x00B18C90> If you have ever wondered where *self* comes from in regular methods or where *cls* comes from in class methods, this is it! @@ -1211,7 +1268,7 @@ Kinds of methods Non-data descriptors provide a simple mechanism for variations on the usual patterns of binding functions into methods. -To recap, functions have a :meth:`__get__` method so that they can be converted +To recap, functions have a :meth:`~object.__get__` method so that they can be converted to a method when accessed as attributes. The non-data descriptor transforms an ``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``cls.f(*args)`` becomes ``f(*args)``. @@ -1248,8 +1305,8 @@ mean, median, and other descriptive statistics that depend on the data. However, there may be useful functions which are conceptually related but do not depend on the data. For instance, ``erf(x)`` is handy conversion routine that comes up in statistical work but does not directly depend on a particular dataset. -It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` or -``Sample.erf(1.5) --> .9332``. +It can be called either from an object or the class: ``s.erf(1.5) --> 0.9332`` +or ``Sample.erf(1.5) --> 0.9332``. Since static methods return the underlying function with no changes, the example calls are unexciting: @@ -1291,7 +1348,8 @@ Using the non-data descriptor protocol, a pure Python version of The :func:`functools.update_wrapper` call adds a ``__wrapped__`` attribute that refers to the underlying function. Also it carries forward the attributes necessary to make the wrapper look like the wrapped -function: ``__name__``, ``__qualname__``, ``__doc__``, and ``__annotations__``. +function: :attr:`~function.__name__`, :attr:`~function.__qualname__`, +:attr:`~function.__doc__`, and :attr:`~function.__annotations__`. .. testcode:: :hide: @@ -1420,10 +1478,6 @@ Using the non-data descriptor protocol, a pure Python version of def __get__(self, obj, cls=None): if cls is None: cls = type(obj) - if hasattr(type(self.f), '__get__'): - # This code path was added in Python 3.9 - # and was deprecated in Python 3.11. - return self.f.__get__(cls, cls) return MethodType(self.f, cls) .. testcode:: @@ -1436,11 +1490,6 @@ Using the non-data descriptor protocol, a pure Python version of "Class method that returns a tuple" return (cls.__name__, x, y) - @ClassMethod - @property - def __doc__(cls): - return f'A doc for {cls.__name__!r}' - .. doctest:: :hide: @@ -1453,10 +1502,6 @@ Using the non-data descriptor protocol, a pure Python version of >>> t.cm(11, 22) ('T', 11, 22) - # Check the alternate path for chained descriptors - >>> T.__doc__ - "A doc for 'T'" - # Verify that T uses our emulation >>> type(vars(T)['cm']).__name__ 'ClassMethod' @@ -1481,29 +1526,12 @@ Using the non-data descriptor protocol, a pure Python version of ('T', 11, 22) -The code path for ``hasattr(type(self.f), '__get__')`` was added in -Python 3.9 and makes it possible for :func:`classmethod` to support -chained decorators. For example, a classmethod and property could be -chained together. In Python 3.11, this functionality was deprecated. - -.. testcode:: - - class G: - @classmethod - @property - def __doc__(cls): - return f'A doc for {cls.__name__!r}' - -.. doctest:: - - >>> G.__doc__ - "A doc for 'G'" - The :func:`functools.update_wrapper` call in ``ClassMethod`` adds a ``__wrapped__`` attribute that refers to the underlying function. Also it carries forward the attributes necessary to make the wrapper look -like the wrapped function: ``__name__``, ``__qualname__``, ``__doc__``, -and ``__annotations__``. +like the wrapped function: :attr:`~function.__name__`, +:attr:`~function.__qualname__`, :attr:`~function.__doc__`, +and :attr:`~function.__annotations__`. Member objects and __slots__ @@ -1639,7 +1667,7 @@ by member descriptors: 'Emulate member_repr() in Objects/descrobject.c' return f'<Member {self.name!r} of {self.clsname!r}>' -The :meth:`type.__new__` method takes care of adding member objects to class +The :meth:`!type.__new__` method takes care of adding member objects to class variables: .. testcode:: @@ -1690,7 +1718,7 @@ Python: ) super().__delattr__(name) -To use the simulation in a real class, just inherit from :class:`Object` and +To use the simulation in a real class, just inherit from :class:`!Object` and set the :term:`metaclass` to :class:`Type`: .. testcode:: diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index 28749754..6441b7ae 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -1,3 +1,5 @@ +.. _enum-howto: + ========== Enum HOWTO ========== @@ -7,7 +9,7 @@ Enum HOWTO .. currentmodule:: enum An :class:`Enum` is a set of symbolic names bound to unique values. They are -similar to global variables, but they offer a more useful :func:`repr()`, +similar to global variables, but they offer a more useful :func:`repr`, grouping, type-safety, and a few other features. They are most useful when you have a variable that can take one of a limited @@ -62,12 +64,12 @@ The *type* of an enumeration member is the enum it belongs to:: >>> isinstance(Weekday.FRIDAY, Weekday) True -Enum members have an attribute that contains just their :attr:`name`:: +Enum members have an attribute that contains just their :attr:`!name`:: >>> print(Weekday.TUESDAY.name) TUESDAY -Likewise, they have an attribute for their :attr:`value`:: +Likewise, they have an attribute for their :attr:`!value`:: >>> Weekday.WEDNESDAY.value @@ -75,17 +77,18 @@ Likewise, they have an attribute for their :attr:`value`:: Unlike many languages that treat enumerations solely as name/value pairs, Python Enums can have behavior added. For example, :class:`datetime.date` -has two methods for returning the weekday: :meth:`weekday` and :meth:`isoweekday`. +has two methods for returning the weekday: +:meth:`~datetime.date.weekday` and :meth:`~datetime.date.isoweekday`. The difference is that one of them counts from 0-6 and the other from 1-7. -Rather than keep track of that ourselves we can add a method to the :class:`Weekday` -enum to extract the day from the :class:`date` instance and return the matching +Rather than keep track of that ourselves we can add a method to the :class:`!Weekday` +enum to extract the day from the :class:`~datetime.date` instance and return the matching enum member:: @classmethod def from_date(cls, date): return cls(date.isoweekday()) -The complete :class:`Weekday` enum now looks like this:: +The complete :class:`!Weekday` enum now looks like this:: >>> class Weekday(Enum): ... MONDAY = 1 @@ -108,7 +111,7 @@ Now we can find out what today is! Observe:: Of course, if you're reading this on some other day, you'll see that day instead. -This :class:`Weekday` enum is great if our variable only needs one day, but +This :class:`!Weekday` enum is great if our variable only needs one day, but what if we need several? Maybe we're writing a function to plot chores during a week, and don't want to use a :class:`list` -- we could use a different type of :class:`Enum`:: @@ -126,7 +129,7 @@ of :class:`Enum`:: We've changed two things: we're inherited from :class:`Flag`, and the values are all powers of 2. -Just like the original :class:`Weekday` enum above, we can have a single selection:: +Just like the original :class:`!Weekday` enum above, we can have a single selection:: >>> first_week_day = Weekday.MONDAY >>> first_week_day @@ -165,7 +168,7 @@ And a function to display the chores for a given day:: answer SO questions In cases where the actual values of the members do not matter, you can save -yourself some work and use :func:`auto()` for the values:: +yourself some work and use :func:`auto` for the values:: >>> from enum import auto >>> class Weekday(Flag): @@ -201,7 +204,7 @@ If you want to access enum members by *name*, use item access:: >>> Color['GREEN'] <Color.GREEN: 2> -If you have an enum member and need its :attr:`name` or :attr:`value`:: +If you have an enum member and need its :attr:`!name` or :attr:`!value`:: >>> member = Color.RED >>> member.name @@ -282,7 +285,7 @@ If the exact value is unimportant you can use :class:`auto`:: >>> [member.value for member in Color] [1, 2, 3] -The values are chosen by :func:`_generate_next_value_`, which can be +The values are chosen by :func:`~Enum._generate_next_value_`, which can be overridden:: >>> class AutoName(Enum): @@ -301,7 +304,7 @@ overridden:: .. note:: - The :meth:`_generate_next_value_` method must be defined before any members. + The :meth:`~Enum._generate_next_value_` method must be defined before any members. Iteration --------- @@ -422,18 +425,18 @@ Then:: The rules for what is allowed are as follows: names that start and end with a single underscore are reserved by enum and cannot be used; all other attributes defined within an enumeration will become members of this -enumeration, with the exception of special methods (:meth:`__str__`, -:meth:`__add__`, etc.), descriptors (methods are also descriptors), and -variable names listed in :attr:`_ignore_`. +enumeration, with the exception of special methods (:meth:`~object.__str__`, +:meth:`~object.__add__`, etc.), descriptors (methods are also descriptors), and +variable names listed in :attr:`~Enum._ignore_`. -Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__`, +Note: if your enumeration defines :meth:`~object.__new__` and/or :meth:`~object.__init__`, any value(s) given to the enum member will be passed into those methods. See `Planet`_ for an example. .. note:: - The :meth:`__new__` method, if defined, is used during creation of the Enum - members; it is then replaced by Enum's :meth:`__new__` which is used after + The :meth:`~object.__new__` method, if defined, is used during creation of the Enum + members; it is then replaced by Enum's :meth:`~object.__new__` which is used after class creation for lookup of existing members. See :ref:`new-vs-init` for more details. @@ -483,6 +486,7 @@ Dataclass support When inheriting from a :class:`~dataclasses.dataclass`, the :meth:`~Enum.__repr__` omits the inherited class' name. For example:: + >>> from dataclasses import dataclass, field >>> @dataclass ... class CreatureDataMixin: ... size: str @@ -496,13 +500,30 @@ the :meth:`~Enum.__repr__` omits the inherited class' name. For example:: >>> Creature.DOG <Creature.DOG: size='medium', legs=4> -Use the :func:`!dataclass` argument ``repr=False`` +Use the :func:`~dataclasses.dataclass` argument ``repr=False`` to use the standard :func:`repr`. .. versionchanged:: 3.12 Only the dataclass fields are shown in the value area, not the dataclass' name. +.. note:: + + Adding :func:`~dataclasses.dataclass` decorator to :class:`Enum` + and its subclasses is not supported. It will not raise any errors, + but it will produce very strange results at runtime, such as members + being equal to each other:: + + >>> @dataclass # don't do this: it does not make any sense + ... class Color(Enum): + ... RED = 1 + ... BLUE = 2 + ... + >>> Color.RED is Color.BLUE + False + >>> Color.RED == Color.BLUE # problem is here: they should not be equal + True + Pickling -------- @@ -524,10 +545,11 @@ from that module. nested in other classes. It is possible to modify how enum members are pickled/unpickled by defining -:meth:`__reduce_ex__` in the enumeration class. The default method is by-value, +:meth:`~object.__reduce_ex__` in the enumeration class. The default method is by-value, but enums with complicated values may want to use by-name:: - >>> class MyEnum(Enum): + >>> import enum + >>> class MyEnum(enum.Enum): ... __reduce_ex__ = enum.pickle_by_enum_name .. note:: @@ -559,7 +581,7 @@ values. The last two options enable assigning arbitrary values to enumerations; the others auto-assign increasing integers starting with 1 (use the ``start`` parameter to specify a different starting value). A new class derived from :class:`Enum` is returned. In other words, the above -assignment to :class:`Animal` is equivalent to:: +assignment to :class:`!Animal` is equivalent to:: >>> class Animal(Enum): ... ANT = 1 @@ -587,7 +609,7 @@ The solution is to specify the module name explicitly as follows:: the source, pickling will be disabled. The new pickle protocol 4 also, in some circumstances, relies on -:attr:`~definition.__qualname__` being set to the location where pickle will be able +:attr:`~type.__qualname__` being set to the location where pickle will be able to find the class. For example, if the class was made available in class SomeData in the global scope:: @@ -605,9 +627,9 @@ The complete signature is:: start=1, ) -:value: What the new enum class will record as its name. +* *value*: What the new enum class will record as its name. -:names: The enum members. This can be a whitespace- or comma-separated string +* *names*: The enum members. This can be a whitespace- or comma-separated string (values will start at 1 unless otherwise specified):: 'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE' @@ -624,13 +646,13 @@ The complete signature is:: {'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42} -:module: name of module where new enum class can be found. +* *module*: name of module where new enum class can be found. -:qualname: where in module new enum class can be found. +* *qualname*: where in module new enum class can be found. -:type: type to mix in to new enum class. +* *type*: type to mix in to new enum class. -:start: number to start counting at if only names are passed in. +* *start*: number to start counting at if only names are passed in. .. versionchanged:: 3.5 The *start* parameter was added. @@ -770,7 +792,7 @@ be combined with them (but may lose :class:`IntFlag` membership:: >>> Perm.X | 4 <Perm.R|X: 5> - >>> Perm.X | 8 + >>> Perm.X + 8 9 .. note:: @@ -866,16 +888,16 @@ Others While :class:`IntEnum` is part of the :mod:`enum` module, it would be very simple to implement independently:: - class IntEnum(int, Enum): + class IntEnum(int, ReprEnum): # or Enum instead of ReprEnum pass This demonstrates how similar derived enumerations can be defined; for example -a :class:`FloatEnum` that mixes in :class:`float` instead of :class:`int`. +a :class:`!FloatEnum` that mixes in :class:`float` instead of :class:`int`. Some rules: -1. When subclassing :class:`Enum`, mix-in types must appear before - :class:`Enum` itself in the sequence of bases, as in the :class:`IntEnum` +1. When subclassing :class:`Enum`, mix-in types must appear before the + :class:`Enum` class itself in the sequence of bases, as in the :class:`IntEnum` example above. 2. Mix-in types must be subclassable. For example, :class:`bool` and :class:`range` are not subclassable and will throw an error during Enum @@ -884,32 +906,32 @@ Some rules: additional type, all the members must have values of that type, e.g. :class:`int` above. This restriction does not apply to mix-ins which only add methods and don't specify another type. -4. When another data type is mixed in, the :attr:`value` attribute is *not the +4. When another data type is mixed in, the :attr:`~Enum.value` attribute is *not the same* as the enum member itself, although it is equivalent and will compare equal. -5. A ``data type`` is a mixin that defines :meth:`__new__`, or a +5. A ``data type`` is a mixin that defines :meth:`~object.__new__`, or a :class:`~dataclasses.dataclass` 6. %-style formatting: ``%s`` and ``%r`` call the :class:`Enum` class's - :meth:`__str__` and :meth:`__repr__` respectively; other codes (such as + :meth:`~object.__str__` and :meth:`~object.__repr__` respectively; other codes (such as ``%i`` or ``%h`` for IntEnum) treat the enum member as its mixed-in type. 7. :ref:`Formatted string literals <f-strings>`, :meth:`str.format`, - and :func:`format` will use the enum's :meth:`__str__` method. + and :func:`format` will use the enum's :meth:`~object.__str__` method. .. note:: Because :class:`IntEnum`, :class:`IntFlag`, and :class:`StrEnum` are designed to be drop-in replacements for existing constants, their - :meth:`__str__` method has been reset to their data types' - :meth:`__str__` method. + :meth:`~object.__str__` method has been reset to their data types' + :meth:`~object.__str__` method. .. _new-vs-init: -When to use :meth:`__new__` vs. :meth:`__init__` ------------------------------------------------- +When to use :meth:`~object.__new__` vs. :meth:`~object.__init__` +---------------------------------------------------------------- -:meth:`__new__` must be used whenever you want to customize the actual value of +:meth:`~object.__new__` must be used whenever you want to customize the actual value of the :class:`Enum` member. Any other modifications may go in either -:meth:`__new__` or :meth:`__init__`, with :meth:`__init__` being preferred. +:meth:`~object.__new__` or :meth:`~object.__init__`, with :meth:`~object.__init__` being preferred. For example, if you want to pass several items to the constructor, but only want one of them to be the value:: @@ -948,43 +970,47 @@ Finer Points Supported ``__dunder__`` names """""""""""""""""""""""""""""" -:attr:`__members__` is a read-only ordered mapping of ``member_name``:``member`` +:attr:`~enum.EnumType.__members__` is a read-only ordered mapping of ``member_name``:``member`` items. It is only available on the class. -:meth:`__new__`, if specified, must create and return the enum members; it is -also a very good idea to set the member's :attr:`_value_` appropriately. Once +:meth:`~object.__new__`, if specified, must create and return the enum members; it is +also a very good idea to set the member's :attr:`~Enum._value_` appropriately. Once all the members are created it is no longer used. Supported ``_sunder_`` names """""""""""""""""""""""""""" -- ``_name_`` -- name of the member -- ``_value_`` -- value of the member; can be set / modified in ``__new__`` +- :attr:`~Enum._name_` -- name of the member +- :attr:`~Enum._value_` -- value of the member; can be set in ``__new__`` +- :meth:`~Enum._missing_` -- a lookup function used when a value is not found; + may be overridden +- :attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a + :class:`str`, that will not be transformed into members, and will be removed + from the final class +- :meth:`~Enum._generate_next_value_` -- used to get an appropriate value for + an enum member; may be overridden +- :meth:`~EnumType._add_alias_` -- adds a new name as an alias to an existing + member. +- :meth:`~EnumType._add_value_alias_` -- adds a new value as an alias to an + existing member. See `MultiValueEnum`_ for an example. -- ``_missing_`` -- a lookup function used when a value is not found; may be - overridden -- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`, - that will not be transformed into members, and will be removed from the final - class -- ``_order_`` -- used in Python 2/3 code to ensure member order is consistent - (class attribute, removed during class creation) -- ``_generate_next_value_`` -- used by the `Functional API`_ and by - :class:`auto` to get an appropriate value for an enum member; may be - overridden + .. note:: -.. note:: + For standard :class:`Enum` classes the next value chosen is the highest + value seen incremented by one. - For standard :class:`Enum` classes the next value chosen is the last value seen - incremented by one. + For :class:`Flag` classes the next value chosen will be the next highest + power-of-two. - For :class:`Flag` classes the next value chosen will be the next highest - power-of-two, regardless of the last value seen. + .. versionchanged:: 3.13 + Prior versions would use the last seen value instead of the highest value. .. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_`` .. versionadded:: 3.7 ``_ignore_`` +.. versionadded:: 3.13 ``_add_alias_``, ``_add_value_alias_`` -To help keep Python 2 / Python 3 code in sync an :attr:`_order_` attribute can +To help keep Python 2 / Python 3 code in sync an :attr:`~Enum._order_` attribute can be provided. It will be checked against the actual order of the enumeration and raise an error if the two do not match:: @@ -1002,7 +1028,7 @@ and raise an error if the two do not match:: .. note:: - In Python 2 code the :attr:`_order_` attribute is necessary as definition + In Python 2 code the :attr:`~Enum._order_` attribute is necessary as definition order is lost before it can be recorded. @@ -1127,6 +1153,14 @@ the following are true: >>> (Color.RED | Color.GREEN).name 'RED|GREEN' + >>> class Perm(IntFlag): + ... R = 4 + ... W = 2 + ... X = 1 + ... + >>> (Perm.R & Perm.W).name is None # effectively Perm(0) + True + - multi-bit flags, aka aliases, can be returned from operations:: >>> Color.RED | Color.BLUE @@ -1156,13 +1190,14 @@ the following are true: There is a new boundary mechanism that controls how out-of-range / invalid bits are handled: ``STRICT``, ``CONFORM``, ``EJECT``, and ``KEEP``: - * STRICT --> raises an exception when presented with invalid values - * CONFORM --> discards any invalid bits - * EJECT --> lose Flag status and become a normal int with the given value - * KEEP --> keep the extra bits - - keeps Flag status and extra bits - - extra bits do not show up in iteration - - extra bits do show up in repr() and str() +* STRICT --> raises an exception when presented with invalid values +* CONFORM --> discards any invalid bits +* EJECT --> lose Flag status and become a normal int with the given value +* KEEP --> keep the extra bits + + - keeps Flag status and extra bits + - extra bits do not show up in iteration + - extra bits do show up in repr() and str() The default for Flag is ``STRICT``, the default for ``IntFlag`` is ``EJECT``, and the default for ``_convert_`` is ``KEEP`` (see ``ssl.Options`` for an @@ -1182,12 +1217,12 @@ Enum Classes ^^^^^^^^^^^^ The :class:`EnumType` metaclass is responsible for providing the -:meth:`__contains__`, :meth:`__dir__`, :meth:`__iter__` and other methods that +:meth:`~object.__contains__`, :meth:`~object.__dir__`, :meth:`~object.__iter__` and other methods that allow one to do things with an :class:`Enum` class that fail on a typical class, such as ``list(Color)`` or ``some_enum_var in Color``. :class:`EnumType` is responsible for ensuring that various other methods on the final :class:`Enum` -class are correct (such as :meth:`__new__`, :meth:`__getnewargs__`, -:meth:`__str__` and :meth:`__repr__`). +class are correct (such as :meth:`~object.__new__`, :meth:`~object.__getnewargs__`, +:meth:`~object.__str__` and :meth:`~object.__repr__`). Flag Classes ^^^^^^^^^^^^ @@ -1202,7 +1237,7 @@ Enum Members (aka instances) The most interesting thing about enum members is that they are singletons. :class:`EnumType` creates them all while it is creating the enum class itself, -and then puts a custom :meth:`__new__` in place to ensure that no new ones are +and then puts a custom :meth:`~object.__new__` in place to ensure that no new ones are ever instantiated by returning only the existing member instances. Flag Members @@ -1250,7 +1285,7 @@ is. There are several ways to define this type of simple enumeration: - use instances of :class:`auto` for the value - use instances of :class:`object` as the value - use a descriptive string as the value -- use a tuple as the value and a custom :meth:`__new__` to replace the +- use a tuple as the value and a custom :meth:`~object.__new__` to replace the tuple with an :class:`int` value Using any of these methods signifies to the user that these values are not @@ -1286,7 +1321,7 @@ Using :class:`object` would look like:: <Color.GREEN: <object object at 0x...>> This is also a good example of why you might want to write your own -:meth:`__repr__`:: +:meth:`~object.__repr__`:: >>> class Color(Enum): ... RED = object() @@ -1314,10 +1349,10 @@ Using a string as the value would look like:: <Color.GREEN: 'go'> -Using a custom :meth:`__new__` -"""""""""""""""""""""""""""""" +Using a custom :meth:`~object.__new__` +"""""""""""""""""""""""""""""""""""""" -Using an auto-numbering :meth:`__new__` would look like:: +Using an auto-numbering :meth:`~object.__new__` would look like:: >>> class AutoNumber(Enum): ... def __new__(cls): @@ -1363,8 +1398,8 @@ to handle any extra arguments:: .. note:: - The :meth:`__new__` method, if defined, is used during creation of the Enum - members; it is then replaced by Enum's :meth:`__new__` which is used after + The :meth:`~object.__new__` method, if defined, is used during creation of the Enum + members; it is then replaced by Enum's :meth:`~object.__new__` which is used after class creation for lookup of existing members. .. warning:: @@ -1434,7 +1469,7 @@ alias:: ... GRENE = 2 ... Traceback (most recent call last): - ... + ... ValueError: aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN' .. note:: @@ -1444,10 +1479,33 @@ alias:: disallowing aliases, the :func:`unique` decorator can be used instead. +MultiValueEnum +^^^^^^^^^^^^^^^^^ + +Supports having more than one value per member:: + + >>> class MultiValueEnum(Enum): + ... def __new__(cls, value, *values): + ... self = object.__new__(cls) + ... self._value_ = value + ... for v in values: + ... self._add_value_alias_(v) + ... return self + ... + >>> class DType(MultiValueEnum): + ... float32 = 'f', 8 + ... double64 = 'd', 9 + ... + >>> DType('f') + <DType.float32: 'f'> + >>> DType(9) + <DType.double64: 'd'> + + Planet ^^^^^^ -If :meth:`__new__` or :meth:`__init__` is defined, the value of the enum member +If :meth:`~object.__new__` or :meth:`~object.__init__` is defined, the value of the enum member will be passed to those methods:: >>> class Planet(Enum): @@ -1478,7 +1536,7 @@ will be passed to those methods:: TimePeriod ^^^^^^^^^^ -An example to show the :attr:`_ignore_` attribute in use:: +An example to show the :attr:`~Enum._ignore_` attribute in use:: >>> from datetime import timedelta >>> class Period(timedelta, Enum): diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst new file mode 100644 index 00000000..6abe93d7 --- /dev/null +++ b/Doc/howto/free-threading-extensions.rst @@ -0,0 +1,280 @@ +.. highlight:: c + +.. _freethreading-extensions-howto: + +****************************************** +C API Extension Support for Free Threading +****************************************** + +Starting with the 3.13 release, CPython has experimental support for running +with the :term:`global interpreter lock` (GIL) disabled in a configuration +called :term:`free threading`. This document describes how to adapt C API +extensions to support free threading. + + +Identifying the Free-Threaded Build in C +======================================== + +The CPython C API exposes the ``Py_GIL_DISABLED`` macro: in the free-threaded +build it's defined to ``1``, and in the regular build it's not defined. +You can use it to enable code that only runs under the free-threaded build:: + + #ifdef Py_GIL_DISABLED + /* code that only runs in the free-threaded build */ + #endif + +Module Initialization +===================== + +Extension modules need to explicitly indicate that they support running with +the GIL disabled; otherwise importing the extension will raise a warning and +enable the GIL at runtime. + +There are two ways to indicate that an extension module supports running with +the GIL disabled depending on whether the extension uses multi-phase or +single-phase initialization. + +Multi-Phase Initialization +.......................... + +Extensions that use multi-phase initialization (i.e., +:c:func:`PyModuleDef_Init`) should add a :c:data:`Py_mod_gil` slot in the +module definition. If your extension supports older versions of CPython, +you should guard the slot with a :c:data:`PY_VERSION_HEX` check. + +:: + + static struct PyModuleDef_Slot module_slots[] = { + ... + #if PY_VERSION_HEX >= 0x030D0000 + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, + #endif + {0, NULL} + }; + + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + .m_slots = module_slots, + ... + }; + + +Single-Phase Initialization +........................... + +Extensions that use single-phase initialization (i.e., +:c:func:`PyModule_Create`) should call :c:func:`PyUnstable_Module_SetGIL` to +indicate that they support running with the GIL disabled. The function is +only defined in the free-threaded build, so you should guard the call with +``#ifdef Py_GIL_DISABLED`` to avoid compilation errors in the regular build. + +:: + + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + ... + }; + + PyMODINIT_FUNC + PyInit_mymodule(void) + { + PyObject *m = PyModule_Create(&moduledef); + if (m == NULL) { + return NULL; + } + #ifdef Py_GIL_DISABLED + PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED); + #endif + return m; + } + + +General API Guidelines +====================== + +Most of the C API is thread-safe, but there are some exceptions. + +* **Struct Fields**: Accessing fields in Python C API objects or structs + directly is not thread-safe if the field may be concurrently modified. +* **Macros**: Accessor macros like :c:macro:`PyList_GET_ITEM` and + :c:macro:`PyList_SET_ITEM` do not perform any error checking or locking. + These macros are not thread-safe if the container object may be modified + concurrently. +* **Borrowed References**: C API functions that return + :term:`borrowed references <borrowed reference>` may not be thread-safe if + the containing object is modified concurrently. See the section on + :ref:`borrowed references <borrowed-references>` for more information. + + +Container Thread Safety +....................... + +Containers like :c:struct:`PyListObject`, +:c:struct:`PyDictObject`, and :c:struct:`PySetObject` perform internal locking +in the free-threaded build. For example, the :c:func:`PyList_Append` will +lock the list before appending an item. + +.. _PyDict_Next: + +``PyDict_Next`` +''''''''''''''' + +A notable exception is :c:func:`PyDict_Next`, which does not lock the +dictionary. You should use :c:macro:`Py_BEGIN_CRITICAL_SECTION` to protect +the dictionary while iterating over it if the dictionary may be concurrently +modified:: + + Py_BEGIN_CRITICAL_SECTION(dict); + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(dict, &pos, &key, &value)) { + ... + } + Py_END_CRITICAL_SECTION(); + + +Borrowed References +=================== + +.. _borrowed-references: + +Some C API functions return :term:`borrowed references <borrowed reference>`. +These APIs are not thread-safe if the containing object is modified +concurrently. For example, it's not safe to use :c:func:`PyList_GetItem` +if the list may be modified concurrently. + +The following table lists some borrowed reference APIs and their replacements +that return :term:`strong references <strong reference>`. + ++-----------------------------------+-----------------------------------+ +| Borrowed reference API | Strong reference API | ++===================================+===================================+ +| :c:func:`PyList_GetItem` | :c:func:`PyList_GetItemRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyDict_GetItem` | :c:func:`PyDict_GetItemRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyDict_GetItemWithError` | :c:func:`PyDict_GetItemRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyDict_GetItemString` | :c:func:`PyDict_GetItemStringRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyDict_SetDefault` | :c:func:`PyDict_SetDefaultRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyDict_Next` | none (see :ref:`PyDict_Next`) | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyWeakref_GetObject` | :c:func:`PyWeakref_GetRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyWeakref_GET_OBJECT` | :c:func:`PyWeakref_GetRef` | ++-----------------------------------+-----------------------------------+ +| :c:func:`PyImport_AddModule` | :c:func:`PyImport_AddModuleRef` | ++-----------------------------------+-----------------------------------+ + +Not all APIs that return borrowed references are problematic. For +example, :c:func:`PyTuple_GetItem` is safe because tuples are immutable. +Similarly, not all uses of the above APIs are problematic. For example, +:c:func:`PyDict_GetItem` is often used for parsing keyword argument +dictionaries in function calls; those keyword argument dictionaries are +effectively private (not accessible by other threads), so using borrowed +references in that context is safe. + +Some of these functions were added in Python 3.13. You can use the +`pythoncapi-compat <https://github.com/python/pythoncapi-compat>`_ package +to provide implementations of these functions for older Python versions. + + +.. _free-threaded-memory-allocation: + +Memory Allocation APIs +====================== + +Python's memory management C API provides functions in three different +:ref:`allocation domains <allocator-domains>`: "raw", "mem", and "object". +For thread-safety, the free-threaded build requires that only Python objects +are allocated using the object domain, and that all Python object are +allocated using that domain. This differs from the prior Python versions, +where this was only a best practice and not a hard requirement. + +.. note:: + + Search for uses of :c:func:`PyObject_Malloc` in your + extension and check that the allocated memory is used for Python objects. + Use :c:func:`PyMem_Malloc` to allocate buffers instead of + :c:func:`PyObject_Malloc`. + + +Thread State and GIL APIs +========================= + +Python provides a set of functions and macros to manage thread state and the +GIL, such as: + +* :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release` +* :c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread` +* :c:macro:`Py_BEGIN_ALLOW_THREADS` and :c:macro:`Py_END_ALLOW_THREADS` + +These functions should still be used in the free-threaded build to manage +thread state even when the :term:`GIL` is disabled. For example, if you +create a thread outside of Python, you must call :c:func:`PyGILState_Ensure` +before calling into the Python API to ensure that the thread has a valid +Python thread state. + +You should continue to call :c:func:`PyEval_SaveThread` or +:c:macro:`Py_BEGIN_ALLOW_THREADS` around blocking operations, such as I/O or +lock acquisitions, to allow other threads to run the +:term:`cyclic garbage collector <garbage collection>`. + + +Protecting Internal Extension State +=================================== + +Your extension may have internal state that was previously protected by the +GIL. You may need to add locking to protect this state. The approach will +depend on your extension, but some common patterns include: + +* **Caches**: global caches are a common source of shared state. Consider + using a lock to protect the cache or disabling it in the free-threaded build + if the cache is not critical for performance. +* **Global State**: global state may need to be protected by a lock or moved + to thread local storage. C11 and C++11 provide the ``thread_local`` or + ``_Thread_local`` for + `thread-local storage <https://en.cppreference.com/w/c/language/storage_duration>`_. + + +Building Extensions for the Free-Threaded Build +=============================================== + +C API extensions need to be built specifically for the free-threaded build. +The wheels, shared libraries, and binaries are indicated by a ``t`` suffix. + +* `pypa/manylinux <https://github.com/pypa/manylinux>`_ supports the + free-threaded build, with the ``t`` suffix, such as ``python3.13t``. +* `pypa/cibuildwheel <https://github.com/pypa/cibuildwheel>`_ supports the + free-threaded build if you set + `CIBW_FREE_THREADED_SUPPORT <https://cibuildwheel.pypa.io/en/stable/options/#free-threaded-support>`_. + +Limited C API and Stable ABI +............................ + +The free-threaded build does not currently support the +:ref:`Limited C API <limited-c-api>` or the stable ABI. If you use +`setuptools <https://setuptools.pypa.io/en/latest/setuptools.html>`_ to build +your extension and currently set ``py_limited_api=True`` you can use +``py_limited_api=not sysconfig.get_config_var("Py_GIL_DISABLED")`` to opt out +of the limited API when building with the free-threaded build. + +.. note:: + You will need to build separate wheels specifically for the free-threaded + build. If you currently use the stable ABI, you can continue to build a + single wheel for multiple non-free-threaded Python versions. + + +Windows +....... + +Due to a limitation of the official Windows installer, you will need to +manually define ``Py_GIL_DISABLED=1`` when building extensions from source. + +.. seealso:: + + `Porting Extension Modules to Support Free-Threading + <https://py-free-threading.github.io/porting/>`_: + A community-maintained porting guide for extension authors. diff --git a/Doc/howto/free-threading-python.rst b/Doc/howto/free-threading-python.rst new file mode 100644 index 00000000..b21e3287 --- /dev/null +++ b/Doc/howto/free-threading-python.rst @@ -0,0 +1,154 @@ +.. _freethreading-python-howto: + +********************************************** +Python experimental support for free threading +********************************************** + +Starting with the 3.13 release, CPython has experimental support for a build of +Python called :term:`free threading` where the :term:`global interpreter lock` +(GIL) is disabled. Free-threaded execution allows for full utilization of the +available processing power by running threads in parallel on available CPU cores. +While not all software will benefit from this automatically, programs +designed with threading in mind will run faster on multi-core hardware. + +**The free-threaded mode is experimental** and work is ongoing to improve it: +expect some bugs and a substantial single-threaded performance hit. + +This document describes the implications of free threading +for Python code. See :ref:`freethreading-extensions-howto` for information on +how to write C extensions that support the free-threaded build. + +.. seealso:: + + :pep:`703` – Making the Global Interpreter Lock Optional in CPython for an + overall description of free-threaded Python. + + +Installation +============ + +Starting with Python 3.13, the official macOS and Windows installers +optionally support installing free-threaded Python binaries. The installers +are available at https://www.python.org/downloads/. + +For information on other platforms, see the `Installing a Free-Threaded Python +<https://py-free-threading.github.io/installing_cpython/>`_, a +community-maintained installation guide for installing free-threaded Python. + +When building CPython from source, the :option:`--disable-gil` configure option +should be used to build a free-threaded Python interpreter. + + +Identifying free-threaded Python +================================ + +To check if the current interpreter supports free-threading, :option:`python -VV <-V>` +and :attr:`sys.version` contain "experimental free-threading build". +The new :func:`sys._is_gil_enabled` function can be used to check whether +the GIL is actually disabled in the running process. + +The ``sysconfig.get_config_var("Py_GIL_DISABLED")`` configuration variable can +be used to determine whether the build supports free threading. If the variable +is set to ``1``, then the build supports free threading. This is the recommended +mechanism for decisions related to the build configuration. + + +The global interpreter lock in free-threaded Python +=================================================== + +Free-threaded builds of CPython support optionally running with the GIL enabled +at runtime using the environment variable :envvar:`PYTHON_GIL` or +the command-line option :option:`-X gil`. + +The GIL may also automatically be enabled when importing a C-API extension +module that is not explicitly marked as supporting free threading. A warning +will be printed in this case. + +In addition to individual package documentation, the following websites track +the status of popular packages support for free threading: + +* https://py-free-threading.github.io/tracking/ +* https://hugovk.github.io/free-threaded-wheels/ + + +Thread safety +============= + +The free-threaded build of CPython aims to provide similar thread-safety +behavior at the Python level to the default GIL-enabled build. Built-in +types like :class:`dict`, :class:`list`, and :class:`set` use internal locks +to protect against concurrent modifications in ways that behave similarly to +the GIL. However, Python has not historically guaranteed specific behavior for +concurrent modifications to these built-in types, so this should be treated +as a description of the current implementation, not a guarantee of current or +future behavior. + +.. note:: + + It's recommended to use the :class:`threading.Lock` or other synchronization + primitives instead of relying on the internal locks of built-in types, when + possible. + + +Known limitations +================= + +This section describes known limitations of the free-threaded CPython build. + +Immortalization +--------------- + +The free-threaded build of the 3.13 release makes some objects :term:`immortal`. +Immortal objects are not deallocated and have reference counts that are +never modified. This is done to avoid reference count contention that would +prevent efficient multi-threaded scaling. + +An object will be made immortal when a new thread is started for the first time +after the main thread is running. The following objects are immortalized: + +* :ref:`function <user-defined-funcs>` objects declared at the module level +* :ref:`method <instance-methods>` descriptors +* :ref:`code <code-objects>` objects +* :term:`module` objects and their dictionaries +* :ref:`classes <classes>` (type objects) + +Because immortal objects are never deallocated, applications that create many +objects of these types may see increased memory usage. This is expected to be +addressed in the 3.14 release. + +Additionally, numeric and string literals in the code as well as strings +returned by :func:`sys.intern` are also immortalized. This behavior is +expected to remain in the 3.14 free-threaded build. + + +Frame objects +------------- + +It is not safe to access :ref:`frame <frame-objects>` objects from other +threads and doing so may cause your program to crash . This means that +:func:`sys._current_frames` is generally not safe to use in a free-threaded +build. Functions like :func:`inspect.currentframe` and :func:`sys._getframe` +are generally safe as long as the resulting frame object is not passed to +another thread. + +Iterators +--------- + +Sharing the same iterator object between multiple threads is generally not +safe and threads may see duplicate or missing elements when iterating or crash +the interpreter. + + +Single-threaded performance +--------------------------- + +The free-threaded build has additional overhead when executing Python code +compared to the default GIL-enabled build. In 3.13, this overhead is about +40% on the `pyperformance <https://pyperformance.readthedocs.io/>`_ suite. +Programs that spend most of their time in C extensions or I/O will see +less of an impact. The largest impact is because the specializing adaptive +interpreter (:pep:`659`) is disabled in the free-threaded build. We expect +to re-enable it in a thread-safe way in the 3.14 release. This overhead is +expected to be reduced in upcoming Python release. We are aiming for an +overhead of 10% or less on the pyperformance suite compared to the default +GIL-enabled build. diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index b0f9d22d..1f0608fb 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1,3 +1,5 @@ +.. _functional-howto: + ******************************** Functional Programming HOWTO ******************************** diff --git a/Doc/howto/gdb_helpers.rst b/Doc/howto/gdb_helpers.rst new file mode 100644 index 00000000..53bbf7dd --- /dev/null +++ b/Doc/howto/gdb_helpers.rst @@ -0,0 +1,449 @@ +.. _gdb: + +========================================================= +Debugging C API extensions and CPython Internals with GDB +========================================================= + +.. highlight:: none + +This document explains how the Python GDB extension, ``python-gdb.py``, can +be used with the GDB debugger to debug CPython extensions and the +CPython interpreter itself. + +When debugging low-level problems such as crashes or deadlocks, a low-level +debugger, such as GDB, is useful to diagnose and correct the issue. +By default, GDB (or any of its front-ends) doesn't support high-level +information specific to the CPython interpreter. + +The ``python-gdb.py`` extension adds CPython interpreter information to GDB. +The extension helps introspect the stack of currently executing Python functions. +Given a Python object represented by a :c:expr:`PyObject *` pointer, +the extension surfaces the type and value of the object. + +Developers who are working on CPython extensions or tinkering with parts +of CPython that are written in C can use this document to learn how to use the +``python-gdb.py`` extension with GDB. + +.. note:: + + This document assumes that you are familiar with the basics of GDB and the + CPython C API. It consolidates guidance from the + `devguide <https://devguide.python.org>`_ and the + `Python wiki <https://wiki.python.org/moin/DebuggingWithGdb>`_. + + +Prerequisites +============= + +You need to have: + +- GDB 7 or later. (For earlier versions of GDB, see ``Misc/gdbinit`` in the + sources of Python 3.11 or earlier.) +- GDB-compatible debugging information for Python and any extension you are + debugging. +- The ``python-gdb.py`` extension. + +The extension is built with Python, but might be distributed separately or +not at all. Below, we include tips for a few common systems as examples. +Note that even if the instructions match your system, they might be outdated. + + +Setup with Python built from source +----------------------------------- + +When you build CPython from source, debugging information should be available, +and the build should add a ``python-gdb.py`` file to the root directory of +your repository. + +To activate support, you must add the directory containing ``python-gdb.py`` +to GDB's "auto-load-safe-path". +If you haven't done this, recent versions of GDB will print out a warning +with instructions on how to do this. + +.. note:: + + If you do not see instructions for your version of GDB, put this in your + configuration file (``~/.gdbinit`` or ``~/.config/gdb/gdbinit``):: + + add-auto-load-safe-path /path/to/cpython + + You can also add multiple paths, separated by ``:``. + + +Setup for Python from a Linux distro +------------------------------------ + +Most Linux systems provide debug information for the system Python +in a package called ``python-debuginfo``, ``python-dbg`` or similar. +For example: + +- Fedora: + + .. code-block:: shell + + sudo dnf install gdb + sudo dnf debuginfo-install python3 + +- Ubuntu: + + .. code-block:: shell + + sudo apt install gdb python3-dbg + +On several recent Linux systems, GDB can download debugging symbols +automatically using *debuginfod*. +However, this will not install the ``python-gdb.py`` extension; +you generally do need to install the debug info package separately. + + +Using the Debug build and Development mode +========================================== + +For easier debugging, you might want to: + +- Use a :ref:`debug build <debug-build>` of Python. (When building from source, + use ``configure --with-pydebug``. On Linux distros, install and run a package + like ``python-debug`` or ``python-dbg``, if available.) +- Use the runtime :ref:`development mode <devmode>` (``-X dev``). + +Both enable extra assertions and disable some optimizations. +Sometimes this hides the bug you are trying to find, but in most cases they +make the process easier. + + +Using the ``python-gdb`` extension +================================== + +When the extension is loaded, it provides two main features: +pretty printers for Python values, and additional commands. + +Pretty-printers +--------------- + +This is what a GDB backtrace looks like (truncated) when this extension is +enabled:: + + #0 0x000000000041a6b1 in PyObject_Malloc (nbytes=Cannot access memory at address 0x7fffff7fefe8 + ) at Objects/obmalloc.c:748 + #1 0x000000000041b7c0 in _PyObject_DebugMallocApi (id=111 'o', nbytes=24) at Objects/obmalloc.c:1445 + #2 0x000000000041b717 in _PyObject_DebugMalloc (nbytes=24) at Objects/obmalloc.c:1412 + #3 0x000000000044060a in _PyUnicode_New (length=11) at Objects/unicodeobject.c:346 + #4 0x00000000004466aa in PyUnicodeUCS2_DecodeUTF8Stateful (s=0x5c2b8d "__lltrace__", size=11, errors=0x0, consumed= + 0x0) at Objects/unicodeobject.c:2531 + #5 0x0000000000446647 in PyUnicodeUCS2_DecodeUTF8 (s=0x5c2b8d "__lltrace__", size=11, errors=0x0) + at Objects/unicodeobject.c:2495 + #6 0x0000000000440d1b in PyUnicodeUCS2_FromStringAndSize (u=0x5c2b8d "__lltrace__", size=11) + at Objects/unicodeobject.c:551 + #7 0x0000000000440d94 in PyUnicodeUCS2_FromString (u=0x5c2b8d "__lltrace__") at Objects/unicodeobject.c:569 + #8 0x0000000000584abd in PyDict_GetItemString (v= + {'Yuck': <type at remote 0xad4730>, '__builtins__': <module at remote 0x7ffff7fd5ee8>, '__file__': 'Lib/test/crashers/nasty_eq_vs_dict.py', '__package__': None, 'y': <Yuck(i=0) at remote 0xaacd80>, 'dict': {0: 0, 1: 1, 2: 2, 3: 3}, '__cached__': None, '__name__': '__main__', 'z': <Yuck(i=0) at remote 0xaace60>, '__doc__': None}, key= + 0x5c2b8d "__lltrace__") at Objects/dictobject.c:2171 + +Notice how the dictionary argument to ``PyDict_GetItemString`` is displayed +as its ``repr()``, rather than an opaque ``PyObject *`` pointer. + +The extension works by supplying a custom printing routine for values of type +``PyObject *``. If you need to access lower-level details of an object, then +cast the value to a pointer of the appropriate type. For example:: + + (gdb) p globals + $1 = {'__builtins__': <module at remote 0x7ffff7fb1868>, '__name__': + '__main__', 'ctypes': <module at remote 0x7ffff7f14360>, '__doc__': None, + '__package__': None} + + (gdb) p *(PyDictObject*)globals + $2 = {ob_refcnt = 3, ob_type = 0x3dbdf85820, ma_fill = 5, ma_used = 5, + ma_mask = 7, ma_table = 0x63d0f8, ma_lookup = 0x3dbdc7ea70 + <lookdict_string>, ma_smalltable = {{me_hash = 7065186196740147912, + me_key = '__builtins__', me_value = <module at remote 0x7ffff7fb1868>}, + {me_hash = -368181376027291943, me_key = '__name__', + me_value ='__main__'}, {me_hash = 0, me_key = 0x0, me_value = 0x0}, + {me_hash = 0, me_key = 0x0, me_value = 0x0}, + {me_hash = -9177857982131165996, me_key = 'ctypes', + me_value = <module at remote 0x7ffff7f14360>}, + {me_hash = -8518757509529533123, me_key = '__doc__', me_value = None}, + {me_hash = 0, me_key = 0x0, me_value = 0x0}, { + me_hash = 6614918939584953775, me_key = '__package__', me_value = None}}} + +Note that the pretty-printers do not actually call ``repr()``. +For basic types, they try to match its result closely. + +An area that can be confusing is that the custom printer for some types look a +lot like GDB's built-in printer for standard types. For example, the +pretty-printer for a Python ``int`` (:c:expr:`PyLongObject *`) +gives a representation that is not distinguishable from one of a +regular machine-level integer:: + + (gdb) p some_machine_integer + $3 = 42 + + (gdb) p some_python_integer + $4 = 42 + +The internal structure can be revealed with a cast to :c:expr:`PyLongObject *`: + + (gdb) p *(PyLongObject*)some_python_integer + $5 = {ob_base = {ob_base = {ob_refcnt = 8, ob_type = 0x3dad39f5e0}, ob_size = 1}, + ob_digit = {42}} + +A similar confusion can arise with the ``str`` type, where the output looks a +lot like gdb's built-in printer for ``char *``:: + + (gdb) p ptr_to_python_str + $6 = '__builtins__' + +The pretty-printer for ``str`` instances defaults to using single-quotes (as +does Python's ``repr`` for strings) whereas the standard printer for ``char *`` +values uses double-quotes and contains a hexadecimal address:: + + (gdb) p ptr_to_char_star + $7 = 0x6d72c0 "hello world" + +Again, the implementation details can be revealed with a cast to +:c:expr:`PyUnicodeObject *`:: + + (gdb) p *(PyUnicodeObject*)$6 + $8 = {ob_base = {ob_refcnt = 33, ob_type = 0x3dad3a95a0}, length = 12, + str = 0x7ffff2128500, hash = 7065186196740147912, state = 1, defenc = 0x0} + +``py-list`` +----------- + + The extension adds a ``py-list`` command, which + lists the Python source code (if any) for the current frame in the selected + thread. The current line is marked with a ">":: + + (gdb) py-list + 901 if options.profile: + 902 options.profile = False + 903 profile_me() + 904 return + 905 + >906 u = UI() + 907 if not u.quit: + 908 try: + 909 gtk.main() + 910 except KeyboardInterrupt: + 911 # properly quit on a keyboard interrupt... + + Use ``py-list START`` to list at a different line number within the Python + source, and ``py-list START,END`` to list a specific range of lines within + the Python source. + +``py-up`` and ``py-down`` +------------------------- + + The ``py-up`` and ``py-down`` commands are analogous to GDB's regular ``up`` + and ``down`` commands, but try to move at the level of CPython frames, rather + than C frames. + + GDB is not always able to read the relevant frame information, depending on + the optimization level with which CPython was compiled. Internally, the + commands look for C frames that are executing the default frame evaluation + function (that is, the core bytecode interpreter loop within CPython) and + look up the value of the related ``PyFrameObject *``. + + They emit the frame number (at the C level) within the thread. + + For example:: + + (gdb) py-up + #37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/ + gnome_sudoku/main.py, line 906, in start_game () + u = UI() + (gdb) py-up + #40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/ + gnome_sudoku/gnome_sudoku.py, line 22, in start_game(main=<module at remote 0xb771b7f4>) + main.start_game() + (gdb) py-up + Unable to find an older python frame + + so we're at the top of the Python stack. + + The frame numbers correspond to those displayed by GDB's standard + ``backtrace`` command. + The command skips C frames which are not executing Python code. + + Going back down:: + + (gdb) py-down + #37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game () + u = UI() + (gdb) py-down + #34 (unable to read python frame information) + (gdb) py-down + #23 (unable to read python frame information) + (gdb) py-down + #19 (unable to read python frame information) + (gdb) py-down + #14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated) + swallower.run_dialog(self.dialog) + (gdb) py-down + #11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>) + gtk.main() + (gdb) py-down + #8 (unable to read python frame information) + (gdb) py-down + Unable to find a newer python frame + + and we're at the bottom of the Python stack. + + Note that in Python 3.12 and newer, the same C stack frame can be used for + multiple Python stack frames. This means that ``py-up`` and ``py-down`` + may move multiple Python frames at once. For example:: + + (gdb) py-up + #6 Frame 0x7ffff7fb62b0, for file /tmp/rec.py, line 5, in recursive_function (n=0) + time.sleep(5) + #6 Frame 0x7ffff7fb6240, for file /tmp/rec.py, line 7, in recursive_function (n=1) + recursive_function(n-1) + #6 Frame 0x7ffff7fb61d0, for file /tmp/rec.py, line 7, in recursive_function (n=2) + recursive_function(n-1) + #6 Frame 0x7ffff7fb6160, for file /tmp/rec.py, line 7, in recursive_function (n=3) + recursive_function(n-1) + #6 Frame 0x7ffff7fb60f0, for file /tmp/rec.py, line 7, in recursive_function (n=4) + recursive_function(n-1) + #6 Frame 0x7ffff7fb6080, for file /tmp/rec.py, line 7, in recursive_function (n=5) + recursive_function(n-1) + #6 Frame 0x7ffff7fb6020, for file /tmp/rec.py, line 9, in <module> () + recursive_function(5) + (gdb) py-up + Unable to find an older python frame + + +``py-bt`` +--------- + + The ``py-bt`` command attempts to display a Python-level backtrace of the + current thread. + + For example:: + + (gdb) py-bt + #8 (unable to read python frame information) + #11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=<SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, main_page=0) at remote 0x98fa6e4>, d=<gtk.Dialog at remote 0x98faaa4>) + gtk.main() + #14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=<NewOrSavedGameSelector(new_game_model=<gtk.ListStore at remote 0x98fab44>, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': <float at remote 0x984b474>, 'gsd.hints': 0, 'timer.active_time': <float at remote 0x984b494>, 'timer.total_time': <float at remote 0x984b464>}], dialog=<gtk.Dialog at remote 0x98faaa4>, saved_game_model=<gtk.ListStore at remote 0x98fad24>, sudoku_maker=<SudokuMaker(terminated=False, played=[], batch_siz...(truncated) + swallower.run_dialog(self.dialog) + #19 (unable to read python frame information) + #23 (unable to read python frame information) + #34 (unable to read python frame information) + #37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game () + u = UI() + #40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/gnome_sudoku/gnome_sudoku.py, line 22, in start_game (main=<module at remote 0xb771b7f4>) + main.start_game() + + The frame numbers correspond to those displayed by GDB's standard + ``backtrace`` command. + +``py-print`` +------------ + + The ``py-print`` command looks up a Python name and tries to print it. + It looks in locals within the current thread, then globals, then finally + builtins:: + + (gdb) py-print self + local 'self' = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, + main_page=0) at remote 0x98fa6e4> + (gdb) py-print __name__ + global '__name__' = 'gnome_sudoku.dialog_swallower' + (gdb) py-print len + builtin 'len' = <built-in function len> + (gdb) py-print scarlet_pimpernel + 'scarlet_pimpernel' not found + + If the current C frame corresponds to multiple Python frames, ``py-print`` + only considers the first one. + +``py-locals`` +------------- + + The ``py-locals`` command looks up all Python locals within the current + Python frame in the selected thread, and prints their representations:: + + (gdb) py-locals + self = <SwappableArea(running=<gtk.Dialog at remote 0x98faaa4>, + main_page=0) at remote 0x98fa6e4> + d = <gtk.Dialog at remote 0x98faaa4> + + If the current C frame corresponds to multiple Python frames, locals from + all of them will be shown:: + + (gdb) py-locals + Locals for recursive_function + n = 0 + Locals for recursive_function + n = 1 + Locals for recursive_function + n = 2 + Locals for recursive_function + n = 3 + Locals for recursive_function + n = 4 + Locals for recursive_function + n = 5 + Locals for <module> + + +Use with GDB commands +===================== + +The extension commands complement GDB's built-in commands. +For example, you can use a frame numbers shown by ``py-bt`` with the ``frame`` +command to go a specific frame within the selected thread, like this:: + + (gdb) py-bt + (output snipped) + #68 Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> () + main() + (gdb) frame 68 + #68 0x00000000004cd1e6 in PyEval_EvalFrameEx (f=Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in <module> (), throwflag=0) at Python/ceval.c:2665 + 2665 x = call_function(&sp, oparg); + (gdb) py-list + 1543 # Run the tests in a context manager that temporary changes the CWD to a + 1544 # temporary and writable directory. If it's not possible to create or + 1545 # change the CWD, the original CWD will be used. The original CWD is + 1546 # available from test_support.SAVEDCWD. + 1547 with test_support.temp_cwd(TESTCWD, quiet=True): + >1548 main() + +The ``info threads`` command will give you a list of the threads within the +process, and you can use the ``thread`` command to select a different one:: + + (gdb) info threads + 105 Thread 0x7fffefa18710 (LWP 10260) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86 + 104 Thread 0x7fffdf5fe710 (LWP 10259) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86 + * 1 Thread 0x7ffff7fe2700 (LWP 10145) 0x00000038e46d73e3 in select () at ../sysdeps/unix/syscall-template.S:82 + +You can use ``thread apply all COMMAND`` or (``t a a COMMAND`` for short) to run +a command on all threads. With ``py-bt``, this lets you see what every +thread is doing at the Python level:: + + (gdb) t a a py-bt + + Thread 105 (Thread 0x7fffefa18710 (LWP 10260)): + #5 Frame 0x7fffd00019d0, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140737213728528), count=1, owner=140737213728528) + self.__block.acquire() + #8 Frame 0x7fffac001640, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858a90>, saved_state=(1, 140737213728528)) + self._acquire_restore(saved_state) + #12 Frame 0x7fffb8001a10, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f () + cond.wait() + #16 Frame 0x7fffb8001c40, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140737213728528) + f() + + Thread 104 (Thread 0x7fffdf5fe710 (LWP 10259)): + #5 Frame 0x7fffe4001580, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140736940992272), count=1, owner=140736940992272) + self.__block.acquire() + #8 Frame 0x7fffc8002090, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=<thread.lock at remote 0x858770>, _RLock__count=1) at remote 0xd7ff40>, acquire=<instancemethod at remote 0xd80260>, _is_owned=<instancemethod at remote 0xd80160>, _release_save=<instancemethod at remote 0xd803e0>, release=<instancemethod at remote 0xd802e0>, _acquire_restore=<instancemethod at remote 0xd7ee60>, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=<thread.lock at remote 0x858860>, saved_state=(1, 140736940992272)) + self._acquire_restore(saved_state) + #12 Frame 0x7fffac001c90, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f () + cond.wait() + #16 Frame 0x7fffac0011c0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140736940992272) + f() + + Thread 1 (Thread 0x7ffff7fe2700 (LWP 10145)): + #5 Frame 0xcb5380, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 16, in _wait () + time.sleep(0.01) + #8 Frame 0x7fffd00024a0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 378, in _check_notify (self=<ConditionTests(_testMethodName='test_notify', _resultForDoCleanups=<TestResult(_original_stdout=<cStringIO.StringO at remote 0xc191e0>, skipped=[], _mirrorOutput=False, testsRun=39, buffer=False, _original_stderr=<file at remote 0x7ffff7fc6340>, _stdout_buffer=<cStringIO.StringO at remote 0xc9c7f8>, _stderr_buffer=<cStringIO.StringO at remote 0xc9c790>, _moduleSetUpFailed=False, expectedFailures=[], errors=[], _previousTestClass=<type at remote 0x928310>, unexpectedSuccesses=[], failures=[], shouldStop=False, failfast=False) at remote 0xc185a0>, _threads=(0,), _cleanups=[], _type_equality_funcs={<type at remote 0x7eba00>: <instancemethod at remote 0xd750e0>, <type at remote 0x7e7820>: <instancemethod at remote 0xd75160>, <type at remote 0x7e30e0>: <instancemethod at remote 0xd75060>, <type at remote 0x7e7d20>: <instancemethod at remote 0xd751e0>, <type at remote 0x7f19e0...(truncated) + _wait() diff --git a/Doc/howto/index.rst b/Doc/howto/index.rst index f521276a..c09f92c9 100644 --- a/Doc/howto/index.rst +++ b/Doc/howto/index.rst @@ -2,21 +2,19 @@ Python HOWTOs *************** -Python HOWTOs are documents that cover a single, specific topic, -and attempt to cover it fairly completely. Modelled on the Linux -Documentation Project's HOWTO collection, this collection is an +Python HOWTOs are documents that cover a specific topic in-depth. +Modeled on the Linux Documentation Project's HOWTO collection, this collection is an effort to foster documentation that's more detailed than the Python Library Reference. -Currently, the HOWTOs are: - .. toctree:: :maxdepth: 1 + :hidden: - pyporting.rst cporting.rst curses.rst descriptor.rst + gdb_helpers.rst enum.rst functional.rst logging.rst @@ -28,9 +26,43 @@ Currently, the HOWTOs are: urllib2.rst argparse.rst ipaddress.rst - clinic.rst instrumentation.rst perf_profiling.rst annotations.rst isolating-extensions.rst + timerfd.rst + mro.rst + free-threading-python.rst + free-threading-extensions.rst + +General: + +* :ref:`annotations-howto` +* :ref:`argparse-tutorial` +* :ref:`descriptorhowto` +* :ref:`enum-howto` +* :ref:`functional-howto` +* :ref:`ipaddress-howto` +* :ref:`logging-howto` +* :ref:`logging-cookbook` +* :ref:`regex-howto` +* :ref:`sortinghowto` +* :ref:`unicode-howto` +* :ref:`urllib-howto` + +Advanced development: + +* :ref:`curses-howto` +* :ref:`freethreading-python-howto` +* :ref:`freethreading-extensions-howto` +* :ref:`isolating-extensions-howto` +* :ref:`python_2.3_mro` +* :ref:`socket-howto` +* :ref:`timerfd-howto` +* :ref:`cporting-howto` + +Debugging and profiling: +* :ref:`gdb` +* :ref:`instrumentation` +* :ref:`perf_profiling` diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst index 875f846a..6e03ef20 100644 --- a/Doc/howto/instrumentation.rst +++ b/Doc/howto/instrumentation.rst @@ -13,9 +13,9 @@ DTrace and SystemTap are monitoring tools, each providing a way to inspect what the processes on a computer system are doing. They both use domain-specific languages allowing a user to write scripts which: - - filter which processes are to be observed - - gather data from the processes of interest - - generate reports on the data +- filter which processes are to be observed +- gather data from the processes of interest +- generate reports on the data As of Python 3.6, CPython can be built with embedded "markers", also known as "probes", that can be observed by a DTrace or SystemTap script, @@ -246,11 +246,9 @@ The output looks like this: where the columns are: - - time in microseconds since start of script - - - name of executable - - - PID of process +- time in microseconds since start of script +- name of executable +- PID of process and the remainder indicates the call/return hierarchy as the script executes. @@ -309,7 +307,7 @@ Available static markers .. object:: gc__start(int generation) Fires when the Python interpreter starts a garbage collection cycle. - ``arg0`` is the generation to scan, like :func:`gc.collect()`. + ``arg0`` is the generation to scan, like :func:`gc.collect`. .. object:: gc__done(long collected) diff --git a/Doc/howto/isolating-extensions.rst b/Doc/howto/isolating-extensions.rst index 8f3787f2..a636e06b 100644 --- a/Doc/howto/isolating-extensions.rst +++ b/Doc/howto/isolating-extensions.rst @@ -337,14 +337,46 @@ That is, heap types should: - Have the :c:macro:`Py_TPFLAGS_HAVE_GC` flag. - Define a traverse function using ``Py_tp_traverse``, which - visits the type (e.g. using :c:expr:`Py_VISIT(Py_TYPE(self))`). + visits the type (e.g. using ``Py_VISIT(Py_TYPE(self))``). -Please refer to the :ref:`the documentation <type-structs>` of +Please refer to the documentation of :c:macro:`Py_TPFLAGS_HAVE_GC` and :c:member:`~PyTypeObject.tp_traverse` for additional considerations. -If your traverse function delegates to the ``tp_traverse`` of its base class -(or another type), ensure that ``Py_TYPE(self)`` is visited only once. +The API for defining heap types grew organically, leaving it +somewhat awkward to use in its current state. +The following sections will guide you through common issues. + + +``tp_traverse`` in Python 3.8 and lower +....................................... + +The requirement to visit the type from ``tp_traverse`` was added in Python 3.9. +If you support Python 3.8 and lower, the traverse function must *not* +visit the type, so it must be more complicated:: + + static int my_traverse(PyObject *self, visitproc visit, void *arg) + { + if (Py_Version >= 0x03090000) { + Py_VISIT(Py_TYPE(self)); + } + return 0; + } + +Unfortunately, :c:data:`Py_Version` was only added in Python 3.11. +As a replacement, use: + +* :c:macro:`PY_VERSION_HEX`, if not using the stable ABI, or +* :py:data:`sys.version_info` (via :c:func:`PySys_GetObject` and + :c:func:`PyArg_ParseTuple`). + + +Delegating ``tp_traverse`` +.......................... + +If your traverse function delegates to the :c:member:`~PyTypeObject.tp_traverse` +of its base class (or another type), ensure that ``Py_TYPE(self)`` is visited +only once. Note that only heap type are expected to visit the type in ``tp_traverse``. For example, if your traverse function includes:: @@ -356,11 +388,70 @@ For example, if your traverse function includes:: if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { - Py_VISIT(Py_TYPE(self)); + if (Py_Version >= 0x03090000) { + Py_VISIT(Py_TYPE(self)); + } } -It is not necessary to handle the type's reference count in ``tp_new`` -and ``tp_clear``. +It is not necessary to handle the type's reference count in +:c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_clear`. + + +Defining ``tp_dealloc`` +....................... + +If your type has a custom :c:member:`~PyTypeObject.tp_dealloc` function, +it needs to: + +- call :c:func:`PyObject_GC_UnTrack` before any fields are invalidated, and +- decrement the reference count of the type. + +To keep the type valid while ``tp_free`` is called, the type's refcount needs +to be decremented *after* the instance is deallocated. For example:: + + static void my_dealloc(PyObject *self) + { + PyObject_GC_UnTrack(self); + ... + PyTypeObject *type = Py_TYPE(self); + type->tp_free(self); + Py_DECREF(type); + } + +The default ``tp_dealloc`` function does this, so +if your type does *not* override +``tp_dealloc`` you don't need to add it. + + +Not overriding ``tp_free`` +.......................... + +The :c:member:`~PyTypeObject.tp_free` slot of a heap type must be set to +:c:func:`PyObject_GC_Del`. +This is the default; do not override it. + + +Avoiding ``PyObject_New`` +......................... + +GC-tracked objects need to be allocated using GC-aware functions. + +If you use use :c:func:`PyObject_New` or :c:func:`PyObject_NewVar`: + +- Get and call type's :c:member:`~PyTypeObject.tp_alloc` slot, if possible. + That is, replace ``TYPE *o = PyObject_New(TYPE, typeobj)`` with:: + + TYPE *o = typeobj->tp_alloc(typeobj, 0); + + Replace ``o = PyObject_NewVar(TYPE, typeobj, size)`` with the same, + but use size instead of the 0. + +- If the above is not possible (e.g. inside a custom ``tp_alloc``), + call :c:func:`PyObject_GC_New` or :c:func:`PyObject_GC_NewVar`:: + + TYPE *o = PyObject_GC_New(TYPE, typeobj); + + TYPE *o = PyObject_GC_NewVar(TYPE, typeobj, size); Module State Access from Classes @@ -391,7 +482,7 @@ The largest roadblock is getting *the class a method was defined in*, or that method's "defining class" for short. The defining class can have a reference to the module it is part of. -Do not confuse the defining class with :c:expr:`Py_TYPE(self)`. If the method +Do not confuse the defining class with ``Py_TYPE(self)``. If the method is called on a *subclass* of your type, ``Py_TYPE(self)`` will refer to that subclass, which may be defined in different module than yours. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 588f5a0a..849a7526 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -332,10 +332,10 @@ Suppose you configure logging with the following JSON: } } -This configuration does *almost* what we want, except that ``sys.stdout`` would -show messages of severity ``ERROR`` and above as well as ``INFO`` and -``WARNING`` messages. To prevent this, we can set up a filter which excludes -those messages and add it to the relevant handler. This can be configured by +This configuration does *almost* what we want, except that ``sys.stdout`` would show messages +of severity ``ERROR`` and only events of this severity and higher will be tracked +as well as ``INFO`` and ``WARNING`` messages. To prevent this, we can set up a filter which +excludes those messages and add it to the relevant handler. This can be configured by adding a ``filters`` section parallel to ``formatters`` and ``handlers``: .. code-block:: json @@ -1267,11 +1267,8 @@ to adapt in your own applications. You could also write your own handler which uses the :class:`~multiprocessing.Lock` class from the :mod:`multiprocessing` module to serialize access to the -file from your processes. The existing :class:`FileHandler` and subclasses do -not make use of :mod:`multiprocessing` at present, though they may do so in the -future. Note that at present, the :mod:`multiprocessing` module does not provide -working lock functionality on all platforms (see -https://bugs.python.org/issue3770). +file from your processes. The stdlib :class:`FileHandler` and subclasses do +not make use of :mod:`multiprocessing`. .. currentmodule:: logging.handlers @@ -1744,13 +1741,11 @@ to the above, as in the following example:: return self.fmt.format(*self.args) class StyleAdapter(logging.LoggerAdapter): - def __init__(self, logger, extra=None): - super().__init__(logger, extra or {}) - - def log(self, level, msg, /, *args, **kwargs): + def log(self, level, msg, /, *args, stacklevel=1, **kwargs): if self.isEnabledFor(level): msg, kwargs = self.process(msg, kwargs) - self.logger._log(level, Message(msg, args), (), **kwargs) + self.logger.log(level, Message(msg, args), **kwargs, + stacklevel=stacklevel+1) logger = StyleAdapter(logging.getLogger(__name__)) @@ -1762,7 +1757,7 @@ to the above, as in the following example:: main() The above script should log the message ``Hello, world!`` when run with -Python 3.2 or later. +Python 3.8 or later. .. currentmodule:: logging @@ -1848,8 +1843,11 @@ the use of a :class:`Filter` does not provide the desired result. .. _zeromq-handlers: -Subclassing QueueHandler - a ZeroMQ example -------------------------------------------- +Subclassing QueueHandler and QueueListener- a ZeroMQ example +------------------------------------------------------------ + +Subclass ``QueueHandler`` +^^^^^^^^^^^^^^^^^^^^^^^^^ You can use a :class:`QueueHandler` subclass to send messages to other kinds of queues, for example a ZeroMQ 'publish' socket. In the example below,the @@ -1887,8 +1885,8 @@ data needed by the handler to create the socket:: self.queue.close() -Subclassing QueueListener - a ZeroMQ example --------------------------------------------- +Subclass ``QueueListener`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ You can also subclass :class:`QueueListener` to get messages from other kinds of queues, for example a ZeroMQ 'subscribe' socket. Here's an example:: @@ -1905,25 +1903,194 @@ of queues, for example a ZeroMQ 'subscribe' socket. Here's an example:: msg = self.queue.recv_json() return logging.makeLogRecord(msg) +.. _pynng-handlers: -.. seealso:: +Subclassing QueueHandler and QueueListener- a ``pynng`` example +--------------------------------------------------------------- - Module :mod:`logging` - API reference for the logging module. +In a similar way to the above section, we can implement a listener and handler +using :pypi:`pynng`, which is a Python binding to +`NNG <https://nng.nanomsg.org/>`_, billed as a spiritual successor to ZeroMQ. +The following snippets illustrate -- you can test them in an environment which has +``pynng`` installed. Just for variety, we present the listener first. - Module :mod:`logging.config` - Configuration API for the logging module. - Module :mod:`logging.handlers` - Useful handlers included with the logging module. +Subclass ``QueueListener`` +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # listener.py + import json + import logging + import logging.handlers - :ref:`A basic logging tutorial <logging-basic-tutorial>` + import pynng - :ref:`A more advanced logging tutorial <logging-advanced-tutorial>` + DEFAULT_ADDR = "tcp://localhost:13232" + interrupted = False + + class NNGSocketListener(logging.handlers.QueueListener): + + def __init__(self, uri, /, *handlers, **kwargs): + # Have a timeout for interruptability, and open a + # subscriber socket + socket = pynng.Sub0(listen=uri, recv_timeout=500) + # The b'' subscription matches all topics + topics = kwargs.pop('topics', None) or b'' + socket.subscribe(topics) + # We treat the socket as a queue + super().__init__(socket, *handlers, **kwargs) + + def dequeue(self, block): + data = None + # Keep looping while not interrupted and no data received over the + # socket + while not interrupted: + try: + data = self.queue.recv(block=block) + break + except pynng.Timeout: + pass + except pynng.Closed: # sometimes happens when you hit Ctrl-C + break + if data is None: + return None + # Get the logging event sent from a publisher + event = json.loads(data.decode('utf-8')) + return logging.makeLogRecord(event) + + def enqueue_sentinel(self): + # Not used in this implementation, as the socket isn't really a + # queue + pass + + logging.getLogger('pynng').propagate = False + listener = NNGSocketListener(DEFAULT_ADDR, logging.StreamHandler(), topics=b'') + listener.start() + print('Press Ctrl-C to stop.') + try: + while True: + pass + except KeyboardInterrupt: + interrupted = True + finally: + listener.stop() + + +Subclass ``QueueHandler`` +^^^^^^^^^^^^^^^^^^^^^^^^^ .. currentmodule:: logging +.. code-block:: python + + # sender.py + import json + import logging + import logging.handlers + import time + import random + + import pynng + + DEFAULT_ADDR = "tcp://localhost:13232" + + class NNGSocketHandler(logging.handlers.QueueHandler): + + def __init__(self, uri): + socket = pynng.Pub0(dial=uri, send_timeout=500) + super().__init__(socket) + + def enqueue(self, record): + # Send the record as UTF-8 encoded JSON + d = dict(record.__dict__) + data = json.dumps(d) + self.queue.send(data.encode('utf-8')) + + def close(self): + self.queue.close() + + logging.getLogger('pynng').propagate = False + handler = NNGSocketHandler(DEFAULT_ADDR) + # Make sure the process ID is in the output + logging.basicConfig(level=logging.DEBUG, + handlers=[logging.StreamHandler(), handler], + format='%(levelname)-8s %(name)10s %(process)6s %(message)s') + levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, + logging.CRITICAL) + logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2') + msgno = 1 + while True: + # Just randomly select some loggers and levels and log away + level = random.choice(levels) + logger = logging.getLogger(random.choice(logger_names)) + logger.log(level, 'Message no. %5d' % msgno) + msgno += 1 + delay = random.random() * 2 + 0.5 + time.sleep(delay) + +You can run the above two snippets in separate command shells. If we run the +listener in one shell and run the sender in two separate shells, we should see +something like the following. In the first sender shell: + +.. code-block:: console + + $ python sender.py + DEBUG myapp 613 Message no. 1 + WARNING myapp.lib2 613 Message no. 2 + CRITICAL myapp.lib2 613 Message no. 3 + WARNING myapp.lib2 613 Message no. 4 + CRITICAL myapp.lib1 613 Message no. 5 + DEBUG myapp 613 Message no. 6 + CRITICAL myapp.lib1 613 Message no. 7 + INFO myapp.lib1 613 Message no. 8 + (and so on) + +In the second sender shell: + +.. code-block:: console + + $ python sender.py + INFO myapp.lib2 657 Message no. 1 + CRITICAL myapp.lib2 657 Message no. 2 + CRITICAL myapp 657 Message no. 3 + CRITICAL myapp.lib1 657 Message no. 4 + INFO myapp.lib1 657 Message no. 5 + WARNING myapp.lib2 657 Message no. 6 + CRITICAL myapp 657 Message no. 7 + DEBUG myapp.lib1 657 Message no. 8 + (and so on) + +In the listener shell: + +.. code-block:: console + + $ python listener.py + Press Ctrl-C to stop. + DEBUG myapp 613 Message no. 1 + WARNING myapp.lib2 613 Message no. 2 + INFO myapp.lib2 657 Message no. 1 + CRITICAL myapp.lib2 613 Message no. 3 + CRITICAL myapp.lib2 657 Message no. 2 + CRITICAL myapp 657 Message no. 3 + WARNING myapp.lib2 613 Message no. 4 + CRITICAL myapp.lib1 613 Message no. 5 + CRITICAL myapp.lib1 657 Message no. 4 + INFO myapp.lib1 657 Message no. 5 + DEBUG myapp 613 Message no. 6 + WARNING myapp.lib2 657 Message no. 6 + CRITICAL myapp 657 Message no. 7 + CRITICAL myapp.lib1 613 Message no. 7 + INFO myapp.lib1 613 Message no. 8 + DEBUG myapp.lib1 657 Message no. 8 + (and so on) + +As you can see, the logging from the two sender processes is interleaved in the +listener's output. + + An example dictionary-based configuration ----------------------------------------- @@ -1933,30 +2100,28 @@ This dictionary is passed to :func:`~config.dictConfig` to put the configuration LOGGING = { 'version': 1, - 'disable_existing_loggers': True, + 'disable_existing_loggers': False, 'formatters': { 'verbose': { - 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' + 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', + 'style': '{', }, 'simple': { - 'format': '%(levelname)s %(message)s' + 'format': '{levelname} {message}', + 'style': '{', }, }, 'filters': { 'special': { '()': 'project.logging.SpecialFilter', 'foo': 'bar', - } + }, }, 'handlers': { - 'null': { - 'level':'DEBUG', - 'class':'django.utils.log.NullHandler', - }, - 'console':{ - 'level':'DEBUG', - 'class':'logging.StreamHandler', - 'formatter': 'simple' + 'console': { + 'level': 'INFO', + 'class': 'logging.StreamHandler', + 'formatter': 'simple', }, 'mail_admins': { 'level': 'ERROR', @@ -1966,9 +2131,8 @@ This dictionary is passed to :func:`~config.dictConfig` to put the configuration }, 'loggers': { 'django': { - 'handlers':['null'], + 'handlers': ['console'], 'propagate': True, - 'level':'INFO', }, 'django.request': { 'handlers': ['mail_admins'], @@ -3408,9 +3572,8 @@ A Qt GUI for logging A question that comes up from time to time is about how to log to a GUI application. The `Qt <https://www.qt.io/>`_ framework is a popular -cross-platform UI framework with Python bindings using `PySide2 -<https://pypi.org/project/PySide2/>`_ or `PyQt5 -<https://pypi.org/project/PyQt5/>`_ libraries. +cross-platform UI framework with Python bindings using :pypi:`PySide2` +or :pypi:`PyQt5` libraries. The following example shows how to log to a Qt GUI. This introduces a simple ``QtHandler`` class which takes a callable, which should be a slot in the main @@ -3423,9 +3586,10 @@ The worker thread is implemented using Qt's ``QThread`` class rather than the :mod:`threading` module, as there are circumstances where one has to use ``QThread``, which offers better integration with other ``Qt`` components. -The code should work with recent releases of either ``PySide2`` or ``PyQt5``. -You should be able to adapt the approach to earlier versions of Qt. Please -refer to the comments in the code snippet for more detailed information. +The code should work with recent releases of any of ``PySide6``, ``PyQt6``, +``PySide2`` or ``PyQt5``. You should be able to adapt the approach to earlier +versions of Qt. Please refer to the comments in the code snippet for more +detailed information. .. code-block:: python3 @@ -3435,16 +3599,25 @@ refer to the comments in the code snippet for more detailed information. import sys import time - # Deal with minor differences between PySide2 and PyQt5 + # Deal with minor differences between different Qt packages try: - from PySide2 import QtCore, QtGui, QtWidgets + from PySide6 import QtCore, QtGui, QtWidgets Signal = QtCore.Signal Slot = QtCore.Slot except ImportError: - from PyQt5 import QtCore, QtGui, QtWidgets - Signal = QtCore.pyqtSignal - Slot = QtCore.pyqtSlot - + try: + from PyQt6 import QtCore, QtGui, QtWidgets + Signal = QtCore.pyqtSignal + Slot = QtCore.pyqtSlot + except ImportError: + try: + from PySide2 import QtCore, QtGui, QtWidgets + Signal = QtCore.Signal + Slot = QtCore.Slot + except ImportError: + from PyQt5 import QtCore, QtGui, QtWidgets + Signal = QtCore.pyqtSignal + Slot = QtCore.pyqtSlot logger = logging.getLogger(__name__) @@ -3516,8 +3689,14 @@ refer to the comments in the code snippet for more detailed information. while not QtCore.QThread.currentThread().isInterruptionRequested(): delay = 0.5 + random.random() * 2 time.sleep(delay) - level = random.choice(LEVELS) - logger.log(level, 'Message after delay of %3.1f: %d', delay, i, extra=extra) + try: + if random.random() < 0.1: + raise ValueError('Exception raised: %d' % i) + else: + level = random.choice(LEVELS) + logger.log(level, 'Message after delay of %3.1f: %d', delay, i, extra=extra) + except ValueError as e: + logger.exception('Failed: %s', e, extra=extra) i += 1 # @@ -3544,7 +3723,10 @@ refer to the comments in the code snippet for more detailed information. self.textedit = te = QtWidgets.QPlainTextEdit(self) # Set whatever the default monospace font is for the platform f = QtGui.QFont('nosuchfont') - f.setStyleHint(f.Monospace) + if hasattr(f, 'Monospace'): + f.setStyleHint(f.Monospace) + else: + f.setStyleHint(f.StyleHint.Monospace) # for Qt6 te.setFont(f) te.setReadOnly(True) PB = QtWidgets.QPushButton @@ -3631,7 +3813,11 @@ refer to the comments in the code snippet for more detailed information. app = QtWidgets.QApplication(sys.argv) example = Window(app) example.show() - sys.exit(app.exec_()) + if hasattr(app, 'exec'): + rc = app.exec() + else: + rc = app.exec_() + sys.exit(rc) if __name__=='__main__': main() @@ -3833,7 +4019,7 @@ As you can see, this output isn't ideal. That's because the underlying code which writes to ``sys.stderr`` makes multiple writes, each of which results in a separate logged line (for example, the last three lines above). To get around this problem, you need to buffer things and only output log lines when newlines -are seen. Let's use a slghtly better implementation of ``LoggerWriter``: +are seen. Let's use a slightly better implementation of ``LoggerWriter``: .. code-block:: python diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 7330cf67..3182d566 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -1,3 +1,5 @@ +.. _logging-howto: + ============= Logging HOWTO ============= @@ -25,10 +27,12 @@ or *severity*. When to use logging ^^^^^^^^^^^^^^^^^^^ -Logging provides a set of convenience functions for simple logging usage. These -are :func:`debug`, :func:`info`, :func:`warning`, :func:`error` and -:func:`critical`. To determine when to use logging, see the table below, which -states, for each of a set of common tasks, the best tool to use for it. +You can access logging functionality by creating a logger via ``logger = +getLogger(__name__)``, and then calling the logger's :meth:`~Logger.debug`, +:meth:`~Logger.info`, :meth:`~Logger.warning`, :meth:`~Logger.error` and +:meth:`~Logger.critical` methods. To determine when to use logging, and to see +which logger methods to use when, see the table below. It states, for each of a +set of common tasks, the best tool to use for that task. +-------------------------------------+--------------------------------------+ | Task you want to perform | The best tool for the task | @@ -37,8 +41,8 @@ states, for each of a set of common tasks, the best tool to use for it. | usage of a command line script or | | | program | | +-------------------------------------+--------------------------------------+ -| Report events that occur during | :func:`logging.info` (or | -| normal operation of a program (e.g. | :func:`logging.debug` for very | +| Report events that occur during | A logger's :meth:`~Logger.info` (or | +| normal operation of a program (e.g. | :meth:`~Logger.debug` method for very| | for status monitoring or fault | detailed output for diagnostic | | investigation) | purposes) | +-------------------------------------+--------------------------------------+ @@ -47,22 +51,23 @@ states, for each of a set of common tasks, the best tool to use for it. | | the client application should be | | | modified to eliminate the warning | | | | -| | :func:`logging.warning` if there is | -| | nothing the client application can do| -| | about the situation, but the event | -| | should still be noted | +| | A logger's :meth:`~Logger.warning` | +| | method if there is nothing the client| +| | application can do about the | +| | situation, but the event should still| +| | be noted | +-------------------------------------+--------------------------------------+ | Report an error regarding a | Raise an exception | | particular runtime event | | +-------------------------------------+--------------------------------------+ -| Report suppression of an error | :func:`logging.error`, | -| without raising an exception (e.g. | :func:`logging.exception` or | -| error handler in a long-running | :func:`logging.critical` as | +| Report suppression of an error | A logger's :meth:`~Logger.error`, | +| without raising an exception (e.g. | :meth:`~Logger.exception` or | +| error handler in a long-running | :meth:`~Logger.critical` method as | | server process) | appropriate for the specific error | | | and application domain | +-------------------------------------+--------------------------------------+ -The logging functions are named after the level or severity of the events +The logger methods are named after the level or severity of the events they are used to track. The standard levels and their applicability are described below (in increasing order of severity): @@ -89,9 +94,8 @@ described below (in increasing order of severity): | | itself may be unable to continue running. | +--------------+---------------------------------------------+ -The default level is ``WARNING``, which means that only events of this level -and above will be tracked, unless the logging package is configured to do -otherwise. +The default level is ``WARNING``, which means that only events of this severity and higher +will be tracked, unless the logging package is configured to do otherwise. Events that are tracked can be handled in different ways. The simplest way of handling tracked events is to print them to the console. Another common way @@ -116,12 +120,18 @@ If you type these lines into a script and run it, you'll see: WARNING:root:Watch out! printed out on the console. The ``INFO`` message doesn't appear because the -default level is ``WARNING``. The printed message includes the indication of -the level and the description of the event provided in the logging call, i.e. -'Watch out!'. Don't worry about the 'root' part for now: it will be explained -later. The actual output can be formatted quite flexibly if you need that; -formatting options will also be explained later. - +default level is ``WARNING``. The printed message includes the indication of the +level and the description of the event provided in the logging call, i.e. +'Watch out!'. The actual output can be formatted quite flexibly if you need +that; formatting options will also be explained later. + +Notice that in this example, we use functions directly on the ``logging`` +module, like ``logging.debug``, rather than creating a logger and calling +functions on it. These functions operation on the root logger, but can be useful +as they will call :func:`~logging.basicConfig` for you if it has not been called yet, like in +this example. In larger programs you'll usually want to control the logging +configuration explicitly however - so for that reason as well as others, it's +better to create loggers and call their methods. Logging to a file ^^^^^^^^^^^^^^^^^ @@ -131,11 +141,12 @@ look at that next. Be sure to try the following in a newly started Python interpreter, and don't just continue from the session described above:: import logging + logger = logging.getLogger(__name__) logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) - logging.debug('This message should go to the log file') - logging.info('So should this') - logging.warning('And this, too') - logging.error('And non-ASCII stuff, too, like Øresund and Malmö') + logger.debug('This message should go to the log file') + logger.info('So should this') + logger.warning('And this, too') + logger.error('And non-ASCII stuff, too, like Øresund and Malmö') .. versionchanged:: 3.9 The *encoding* argument was added. In earlier Python versions, or if not @@ -149,10 +160,10 @@ messages: .. code-block:: none - DEBUG:root:This message should go to the log file - INFO:root:So should this - WARNING:root:And this, too - ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö + DEBUG:__main__:This message should go to the log file + INFO:__main__:So should this + WARNING:__main__:And this, too + ERROR:__main__:And non-ASCII stuff, too, like Øresund and Malmö This example also shows how you can set the logging level which acts as the threshold for tracking. In this case, because we set the threshold to @@ -181,11 +192,9 @@ following example:: raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) -The call to :func:`basicConfig` should come *before* any calls to -:func:`debug`, :func:`info`, etc. Otherwise, those functions will call -:func:`basicConfig` for you with the default options. As it's intended as a -one-off simple configuration facility, only the first call will actually do -anything: subsequent calls are effectively no-ops. +The call to :func:`basicConfig` should come *before* any calls to a logger's +methods such as :meth:`~Logger.debug`, :meth:`~Logger.info`, etc. Otherwise, +that logging event may not be handled in the desired manner. If you run the above script several times, the messages from successive runs are appended to the file *example.log*. If you want each run to start afresh, @@ -198,50 +207,6 @@ The output will be the same as before, but the log file is no longer appended to, so the messages from earlier runs are lost. -Logging from multiple modules -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If your program consists of multiple modules, here's an example of how you -could organize logging in it:: - - # myapp.py - import logging - import mylib - - def main(): - logging.basicConfig(filename='myapp.log', level=logging.INFO) - logging.info('Started') - mylib.do_something() - logging.info('Finished') - - if __name__ == '__main__': - main() - -:: - - # mylib.py - import logging - - def do_something(): - logging.info('Doing something') - -If you run *myapp.py*, you should see this in *myapp.log*: - -.. code-block:: none - - INFO:root:Started - INFO:root:Doing something - INFO:root:Finished - -which is hopefully what you were expecting to see. You can generalize this to -multiple modules, using the pattern in *mylib.py*. Note that for this simple -usage pattern, you won't know, by looking in the log file, *where* in your -application your messages came from, apart from looking at the event -description. If you want to track the location of your messages, you'll need -to refer to the documentation beyond the tutorial level -- see -:ref:`logging-advanced-tutorial`. - - Logging variable data ^^^^^^^^^^^^^^^^^^^^^ @@ -417,8 +382,52 @@ Logging Flow The flow of log event information in loggers and handlers is illustrated in the following diagram. -.. image:: logging_flow.png - :class: invert-in-dark-mode +.. only:: not html + + .. image:: logging_flow.* + +.. raw:: html + :file: logging_flow.svg + +.. raw:: html + + <script> + /* + * This snippet is needed to handle the case where a light or dark theme is + * chosen via the theme is selected in the page. We call the existing handler + * and then add a dark-theme class to the body when the dark theme is selected. + * The SVG styling (above) then does the rest. + * + * If the pydoc theme is updated to set the dark-theme class, this snippet + * won't be needed any more. + */ + (function() { + var oldActivateTheme = activateTheme; + + function updateBody(theme) { + let elem = document.body; + + elem.classList.remove('dark-theme'); + elem.classList.remove('light-theme'); + if (theme === 'dark') { + elem.classList.add('dark-theme'); + } + else if (theme === 'light') { + elem.classList.add('light-theme'); + } + } + + activateTheme = function(theme) { + oldActivateTheme(theme); + updateBody(theme); + }; + /* + * If the page is refreshed, make sure we update the body - the overriding + * of activateTheme won't have taken effect yet. + */ + updateBody(localStorage.getItem('currentTheme') || 'auto'); + })(); + </script> Loggers ^^^^^^^ @@ -521,7 +530,7 @@ custom handlers) are the following configuration methods: * The :meth:`~Handler.setLevel` method, just as in logger objects, specifies the lowest severity that will be dispatched to the appropriate destination. Why - are there two :func:`setLevel` methods? The level set in the logger + are there two :meth:`~Handler.setLevel` methods? The level set in the logger determines which severity of messages it will pass to its handlers. The level set in each handler determines which messages that handler will send on. @@ -775,29 +784,29 @@ What happens if no configuration is provided If no logging configuration is provided, it is possible to have a situation where a logging event needs to be output, but no handlers can be found to -output the event. The behaviour of the logging package in these -circumstances is dependent on the Python version. +output the event. -For versions of Python prior to 3.2, the behaviour is as follows: +The event is output using a 'handler of last resort', stored in +:data:`lastResort`. This internal handler is not associated with any +logger, and acts like a :class:`~logging.StreamHandler` which writes the +event description message to the current value of ``sys.stderr`` (therefore +respecting any redirections which may be in effect). No formatting is +done on the message - just the bare event description message is printed. +The handler's level is set to ``WARNING``, so all events at this and +greater severities will be output. -* If *logging.raiseExceptions* is ``False`` (production mode), the event is - silently dropped. +.. versionchanged:: 3.2 -* If *logging.raiseExceptions* is ``True`` (development mode), a message - 'No handlers could be found for logger X.Y.Z' is printed once. + For versions of Python prior to 3.2, the behaviour is as follows: -In Python 3.2 and later, the behaviour is as follows: + * If :data:`raiseExceptions` is ``False`` (production mode), the event is + silently dropped. -* The event is output using a 'handler of last resort', stored in - ``logging.lastResort``. This internal handler is not associated with any - logger, and acts like a :class:`~logging.StreamHandler` which writes the - event description message to the current value of ``sys.stderr`` (therefore - respecting any redirections which may be in effect). No formatting is - done on the message - just the bare event description message is printed. - The handler's level is set to ``WARNING``, so all events at this and - greater severities will be output. + * If :data:`raiseExceptions` is ``True`` (development mode), a message + 'No handlers could be found for logger X.Y.Z' is printed once. -To obtain the pre-3.2 behaviour, ``logging.lastResort`` can be set to ``None``. + To obtain the pre-3.2 behaviour, + :data:`lastResort` can be set to ``None``. .. _library-config: @@ -999,7 +1008,7 @@ Logged messages are formatted for presentation through instances of the use with the % operator and a dictionary. For formatting multiple messages in a batch, instances of -:class:`~handlers.BufferingFormatter` can be used. In addition to the format +:class:`BufferingFormatter` can be used. In addition to the format string (which is applied to each message in the batch), there is provision for header and trailer format strings. @@ -1035,7 +1044,8 @@ checks to see if a module-level variable, :data:`raiseExceptions`, is set. If set, a traceback is printed to :data:`sys.stderr`. If not set, the exception is swallowed. -.. note:: The default value of :data:`raiseExceptions` is ``True``. This is +.. note:: + The default value of :data:`raiseExceptions` is ``True``. This is because during development, you typically want to be notified of any exceptions that occur. It's advised that you set :data:`raiseExceptions` to ``False`` for production usage. @@ -1073,7 +1083,7 @@ You can write code like this:: expensive_func2()) so that if the logger's threshold is set above ``DEBUG``, the calls to -:func:`expensive_func1` and :func:`expensive_func2` are never made. +``expensive_func1`` and ``expensive_func2`` are never made. .. note:: In some cases, :meth:`~Logger.isEnabledFor` can itself be more expensive than you'd like (e.g. for deeply nested loggers where an explicit diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index d65e597f811db5e0a70e6c3ce7124e23b6be86de..d60ed7c031585a426e344961ca9e09c2b51d70a7 100644 GIT binary patch literal 39133 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 literal 21907 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 GxBmyOs;SEW diff --git a/Doc/howto/logging_flow.svg b/Doc/howto/logging_flow.svg new file mode 100644 index 00000000..4974994a --- /dev/null +++ b/Doc/howto/logging_flow.svg @@ -0,0 +1,327 @@ +<svg width="22cm" height="23cm" viewBox="1 1 439 446" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Invert color in dark mode --> + <style type="text/css"> + svg { + background-color: transparent !important; + } + line { + stroke: #000000; + fill: none; + stroke-opacity: 1; + } + polygon, rect { + fill: none; + stroke: #000000; + fill-opacity: 1; + stroke-opacity: 1; + } + polygon.filled { + fill: #000000; + } + polyline { + fill: none; + stroke-opacity: 1; + stroke: #000000; + } + text { + fill: #000000; + fill-opacity: 1; + stroke: none; + font-family: sans-serif; + font-style: normal; + font-weight: normal; + text-anchor: start; + } + @media (prefers-color-scheme: dark) { + polygon, rect, polyline, line { + stroke: #ffffff; + } + polygon.filled { + fill: #ffffff; + } + text { + fill: #ffffff; + } + image { + filter: invert(100%) hue-rotate(180deg) saturate(1.25); + } + } + /* These rules are for when the theme selector is used, perhaps in contrast to the browser theme. */ + body.dark-theme polygon, body.dark-theme rect, body.dark-theme polyline, body.dark-theme line { + stroke: #ffffff; + } + body.dark-theme polygon.filled { + fill: #ffffff; + } + body.dark-theme text { + fill: #ffffff; + } + body.light-theme polygon, body.light-theme rect, body.light-theme polyline, body.light-theme line { + stroke: #000000; + } + body.light-theme polygon.filled { + fill: #000000; + } + body.light-theme text { + fill: #000000; + } + </style> + + <defs /> + <g id="Background"> + <rect style="stroke-width: 1.8; stroke-dasharray: 3;" x="227.504" y="1.91011" width="211.607" height="207.375" rx="0" ry="0" /> + <rect style="stroke-width: 1.2;" x="230.966" y="5.62454" width="68.4216" height="21.9166" rx="0" ry="0" /> + <rect style="stroke-width: 1.2;" x="5.27912" y="5.70399" width="68.4216" height="21.9166" rx="0" ry="0" /> + <text font-size="6.77333" style="font-weight: 700;" x="17.0649" y="19.0071"> + <tspan x="17.0649" y="19.0071">Logger flow</tspan> + </text> + <g> + <rect x="81.5533" y="106.469" width="44.45" height="25.9333" rx="0" ry="0" /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="117.256"> + <tspan x="103.778" y="117.256">Create</tspan> + <tspan x="103.778" y="125.723" style="font-family: monospace">LogRecord</tspan> + </text> + </g> + <g> + <line x1="103.778" y1="82.8734" x2="103.778" y2="102.351" /> + <polygon fill-rule="evenodd" points="103.778,105.351 101.778,101.351 103.778,102.351 105.778,101.351 " /> + </g> + <g> + <line x1="103.774" y1="3.65583" x2="103.778" y2="30.3755" /> + <polygon fill-rule="evenodd" points="103.778,33.3755 101.778,29.3758 103.778,30.3755 105.778,29.3752 " /> + </g> + <text font-size="6.77333" style="text-anchor: middle;" x="144.365" y="10.4604"> + <tspan x="143.798" y="10.4604">Logging call in user</tspan> + <tspan x="143.798" y="18.927">code, e.g.</tspan> + </text> + <text font-size="6.77333" style="font-family: monospace;" x="110.837" y="27.4696"> + <tspan x="111.893" y="27.4696">logger.info(...)</tspan> + </text> + <g> + <line x1="155.62" y1="58.6834" x2="183.943" y2="58.6924" /> + <polygon fill-rule="evenodd" points="186.943,58.6933 182.942,60.6921 183.943,58.6924 182.943,56.6921 " /> + </g> + <g> + <rect x="188.061" y="49.9604" width="24.4" height="17.4667" rx="6" ry="6" /> + <text font-size="6.77333" style="text-anchor: middle;" x="200.261" y="60.7475"> + <tspan x="200.261" y="60.7475">Stop</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="103.778,162.482 169.307,193.042 103.778,223.603 38.2493,193.042 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="186.629"> + <tspan x="103.778" y="188.741">Does a filter attached</tspan> + <tspan x="103.778" y="197.208">to logger reject the</tspan> + <tspan x="103.778" y="205.675">record?</tspan> + </text> + </g> + <g> + <line x1="103.778" y1="132.402" x2="103.778" y2="158.364" /> + <polygon class="filled" fill-rule="evenodd" points="103.778,161.364 101.778,157.364 103.778,158.364 105.778,157.364 " /> + </g> + <g> + <rect x="75.2033" y="249.478" width="57.15" height="34.4" rx="0" ry="0" /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="260.265"> + <tspan x="103.778" y="260.265">Pass record to</tspan> + <tspan x="103.778" y="268.732">handlers of</tspan> + <tspan x="103.778" y="277.198">current logger</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="103.778,326.569 158.193,352.399 103.778,378.229 49.3637,352.399 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="350.22"> + <tspan x="103.778" y="351.276">Is propagate true for</tspan> + <tspan x="103.778" y="359.742">current logger?</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="103.778,399.9 150.573,422.994 103.778,446.087 56.984,422.994 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="420.814"> + <tspan x="103.778" y="422.926">Is there a parent</tspan> + <tspan x="103.778" y="431.393">logger?</tspan> + </text> + </g> + <g> + <rect x="2.43852" y="295.984" width="63.9" height="26.5909" rx="0" ry="0" /> + <text font-size="6.77333" style="text-anchor: middle;" x="34.3885" y="307.1"> + <tspan x="34.3885" y="307.1">Set current</tspan> + <tspan x="34.3885" y="315.566">logger to parent</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="278.422,240.202 330.96,266.686 278.422,293.169 225.885,266.686 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="278.422" y="264.506"> + <tspan x="278.422" y="266.618">At least one handler</tspan> + <tspan x="278.422" y="275.085">in hierarchy?</tspan> + </text> + </g> + <g> + <rect x="298.963" y="312.257" width="57.75" height="25.9333" rx="0" ry="0" /> + <text font-size="6.77333" x="327.838" y="323.044"> + <tspan x="301" y="324.100">Use</tspan> + <tspan x="315" y="324.100" style="font-family: monospace">lastResort</tspan> + <tspan x="316" y="332.567">handler</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="320.041,35.7307 373.377,60.8536 320.041,85.9765 266.704,60.8536 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="320.041" y="58.6741"> + <tspan x="320.041" y="58.6741">Handler enabled for</tspan> + <tspan x="320.041" y="67.1407">level of record?</tspan> + </text> + </g> + <g> + <polygon fill-rule="evenodd" points="320.041,105.448 386.002,135.748 320.041,166.047 254.08,135.748 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="320.041" y="129.335"> + <tspan x="320.041" y="132.508">Does a filter attached</tspan> + <tspan x="320.041" y="140.970">to handler reject the</tspan> + <tspan x="320.041" y="149.436">record?</tspan> + </text> + </g> + <g> + <rect x="409.532" y="52.4436" width="24.4" height="17.4667" rx="6" ry="6" /> + <text font-size="6.77333" style="text-anchor: middle;" x="421.732" y="63.2307"> + <tspan x="421.732" y="63.2307">Stop</tspan> + </text> + </g> + <g> + <rect x="271.091" y="185.519" width="97.9" height="17.4667" rx="6" ry="6" /> + <text font-size="6.77333" style="text-anchor: middle;" x="320.041" y="196.306"> + <tspan x="320.041" y="196.306">Emit (includes formatting)</tspan> + </text> + </g> + <text font-size="6.77333" style="font-weight: 700;" x="241.002" y="18.9277"> + <tspan x="241.002" y="18.9277">Handler flow</tspan> + </text> + <g> + <polygon fill-rule="evenodd" points="103.778,34.4935 155.62,58.6834 103.778,82.8734 51.9368,58.6834 " /> + <text font-size="6.77333" style="text-anchor: middle;" x="103.778" y="56.5039"> + <tspan x="103.778" y="57.560">Logger enabled for</tspan> + <tspan x="103.778" y="66.026">level of call?</tspan> + </text> + </g> + <g> + <line x1="103.778" y1="223.603" x2="103.778" y2="245.36" /> + <polygon class="filled" fill-rule="evenodd" points="103.778,248.36 101.778,244.36 103.778,245.36 105.778,244.36 " /> + </g> + <g> + <line x1="103.778" y1="283.878" x2="103.778" y2="322.451" /> + <polygon class="filled" fill-rule="evenodd" points="103.778,325.451 101.778,321.451 103.778,322.451 105.778,321.451 " /> + </g> + <g> + <line x1="103.778" y1="378.229" x2="103.778" y2="395.782" /> + <polygon class="filled" fill-rule="evenodd" points="103.778,398.782 101.778,394.782 103.778,395.782 105.778,394.782 " /> + </g> + <g> + <polyline points="56.984,422.994 34.3885,422.994 34.3885,326.693 " /> + <polygon class="filled" fill-rule="evenodd" points="34.3885,323.693 36.3885,327.693 34.3885,326.693 32.3885,327.693 " /> + </g> + <g> + <polyline points="34.3885,295.984 34.3885,266.678 71.0853,266.678 " /> + <polygon class="filled" fill-rule="evenodd" points="74.0853,266.678 70.0853,268.678 71.0853,266.678 70.0853,264.678 " /> + </g> + <g> + <polyline points="150.573,422.994 200.261,422.994 200.261,71.5451 " /> + <polygon class="filled" fill-rule="evenodd" points="200.261,68.5451 202.261,72.5451 200.261,71.5451 198.261,72.5451 " /> + </g> + <g> + <line style="stroke-dasharray: 5" x1="132.353" y1="266.678" x2="221.767" y2="266.685" /> + <polygon class="filled" fill-rule="evenodd" points="224.767,266.686 220.766,268.685 221.767,266.685 220.767,264.685 " /> + </g> + <g> + <polyline style="stroke-dasharray: 5" points="278.422,293.169 278.422,325.224 294.845,325.224 " /> + <polygon class="filled" fill-rule="evenodd" points="297.845,325.224 293.845,327.224 294.845,325.224 293.845,323.224 " /> + </g> + <g> + <polyline points="169.307,193.042 200.261,193.042 200.261,71.5451 " /> + <polygon class="filled" fill-rule="evenodd" points="200.261,68.5451 202.261,72.5451 200.261,71.5451 198.261,72.5451 " /> + </g> + <g> + <polyline points="158.193,352.399 200.261,352.399 200.261,71.5451 " /> + <polygon class="filled" fill-rule="evenodd" points="200.261,68.5451 202.261,72.5451 200.261,71.5451 198.261,72.5451 " /> + </g> + <g> + <line x1="319.981" y1="4.27261" x2="320.033" y2="31.6127" /> + <polygon class="filled" fill-rule="evenodd" points="320.039,34.6127 318.031,30.6165 320.033,31.6127 322.031,30.6089 " /> + </g> + <g> + <line x1="320.041" y1="85.9765" x2="320.041" y2="101.33" /> + <polygon class="filled" fill-rule="evenodd" points="320.041,104.33 318.041,100.33 320.041,101.33 322.041,100.33 " /> + </g> + <g> + <line x1="320.041" y1="166.047" x2="320.041" y2="181.401" /> + <polygon class="filled" fill-rule="evenodd" points="320.041,184.401 318.041,180.401 320.041,181.401 322.041,180.401 " /> + </g> + <g> + <polyline points="386.002,135.748 421.732,135.748 421.732,74.0283 " /> + <polygon class="filled" fill-rule="evenodd" points="421.732,71.0283 423.732,75.0283 421.732,74.0283 419.732,75.0283 " /> + </g> + <g> + <line x1="373.377" y1="60.8536" x2="405.415" y2="61.1401" /> + <polygon class="filled" fill-rule="evenodd" points="408.414,61.1669 404.397,63.1311 405.415,61.1401 404.433,59.1312 " /> + </g> + <text font-size="6.77333" x="164.96" y="55.5649"> + <tspan x="164.96" y="55.5649">No</tspan> + </text> + <text font-size="6.77333" x="106.571" y="97.8453"> + <tspan x="106.571" y="97.8453">Yes</tspan> + </text> + <text font-size="6.77333" x="173.856" y="188.452"> + <tspan x="173.856" y="188.452">Yes</tspan> + </text> + <text font-size="6.77333" x="107.446" y="239.221"> + <tspan x="107.446" y="239.221">No</tspan> + </text> + <text font-size="6.77333" x="174.731" y="349.418"> + <tspan x="174.731" y="349.418">No</tspan> + </text> + <text font-size="6.77333" x="106.571" y="390.507"> + <tspan x="106.571" y="390.507">Yes</tspan> + </text> + <text font-size="6.77333" x="39.4722" y="417.667"> + <tspan x="39.4722" y="417.667">Yes</tspan> + </text> + <text font-size="6.77333" x="174.731" y="417.667"> + <tspan x="174.731" y="417.667">No</tspan> + </text> + <text font-size="6.77333" x="281.451" y="313.406"> + <tspan x="281.451" y="313.406">No</tspan> + </text> + <text font-size="6.77333" x="333.909" y="263.96"> + <tspan x="333.909" y="263.96">Yes</tspan> + </text> + <text font-size="6.77333" x="333.307" y="105.598"> + <tspan x="333.307" y="105.598"></tspan> + </text> + <text font-size="6.77333" x="385.766" y="56.9098"> + <tspan x="385.766" y="56.9098">No</tspan> + </text> + <text font-size="6.77333" x="333.307" y="105.598"> + <tspan x="333.307" y="105.598"></tspan> + </text> + <text font-size="6.77333" x="333.307" y="105.598"> + <tspan x="333.307" y="105.598"></tspan> + </text> + <text font-size="6.77333" x="397.102" y="130.471"> + <tspan x="397.102" y="130.471">Yes</tspan> + </text> + <text font-size="6.77333" x="323.563" y="178.785"> + <tspan x="323.563" y="178.785">No</tspan> + </text> + <text font-size="6.77333" x="333.307" y="105.598"> + <tspan x="333.307" y="105.598"></tspan> + </text> + <text font-size="6.77333" x="323.75" y="99.0042"> + <tspan x="323.75" y="99.0042">Yes</tspan> + </text> + <text font-size="6.77323" style="text-anchor: middle;" x="355.762" y="18.2449"> + <tspan x="355.762" y="18.2449">Record passed</tspan> + <tspan x="355.762" y="26.7116">to handler</tspan> + </text> + <line style="stroke-dasharray: 5" x1="330.96" y1="266.686" x2="377.733" y2="267.908" /> + <g> + <polyline style="fill: none; stroke-opacity: 1; stroke-dasharray: 5" points="356.713,325.224 377.733,325.224 377.733,214.711 " /> + <polygon class="filled" fill-rule="evenodd" points="377.733,211.711 379.733,215.711 377.733,214.711 375.733,215.711 " /> + </g> + </g> +</svg> diff --git a/Doc/howto/mro.rst b/Doc/howto/mro.rst new file mode 100644 index 00000000..46db516e --- /dev/null +++ b/Doc/howto/mro.rst @@ -0,0 +1,671 @@ +.. _python_2.3_mro: + +The Python 2.3 Method Resolution Order +====================================== + +.. note:: + + This is a historical document, provided as an appendix to the official + documentation. + The Method Resolution Order discussed here was *introduced* in Python 2.3, + but it is still used in later versions -- including Python 3. + +By `Michele Simionato <https://www.phyast.pitt.edu/~micheles/>`__. + +:Abstract: + + *This document is intended for Python programmers who want to + understand the C3 Method Resolution Order used in Python 2.3. + Although it is not intended for newbies, it is quite pedagogical with + many worked out examples. I am not aware of other publicly available + documents with the same scope, therefore it should be useful.* + +Disclaimer: + + *I donate this document to the Python Software Foundation, under the + Python 2.3 license. As usual in these circumstances, I warn the + reader that what follows* should *be correct, but I don't give any + warranty. Use it at your own risk and peril!* + +Acknowledgments: + + *All the people of the Python mailing list who sent me their support. + Paul Foley who pointed out various imprecisions and made me to add the + part on local precedence ordering. David Goodger for help with the + formatting in reStructuredText. David Mertz for help with the editing. + Finally, Guido van Rossum who enthusiastically added this document to + the official Python 2.3 home-page.* + +The beginning +------------- + + *Felix qui potuit rerum cognoscere causas* -- Virgilius + +Everything started with a post by Samuele Pedroni to the Python +development mailing list [#]_. In his post, Samuele showed that the +Python 2.2 method resolution order is not monotonic and he proposed to +replace it with the C3 method resolution order. Guido agreed with his +arguments and therefore now Python 2.3 uses C3. The C3 method itself +has nothing to do with Python, since it was invented by people working +on Dylan and it is described in a paper intended for lispers [#]_. The +present paper gives a (hopefully) readable discussion of the C3 +algorithm for Pythonistas who want to understand the reasons for the +change. + +First of all, let me point out that what I am going to say only applies +to the *new style classes* introduced in Python 2.2: *classic classes* +maintain their old method resolution order, depth first and then left to +right. Therefore, there is no breaking of old code for classic classes; +and even if in principle there could be breaking of code for Python 2.2 +new style classes, in practice the cases in which the C3 resolution +order differs from the Python 2.2 method resolution order are so rare +that no real breaking of code is expected. Therefore: + + *Don't be scared!* + +Moreover, unless you make strong use of multiple inheritance and you +have non-trivial hierarchies, you don't need to understand the C3 +algorithm, and you can easily skip this paper. On the other hand, if +you really want to know how multiple inheritance works, then this paper +is for you. The good news is that things are not as complicated as you +might expect. + +Let me begin with some basic definitions. + +1) Given a class C in a complicated multiple inheritance hierarchy, it + is a non-trivial task to specify the order in which methods are + overridden, i.e. to specify the order of the ancestors of C. + +2) The list of the ancestors of a class C, including the class itself, + ordered from the nearest ancestor to the furthest, is called the + class precedence list or the *linearization* of C. + +3) The *Method Resolution Order* (MRO) is the set of rules that + construct the linearization. In the Python literature, the idiom + "the MRO of C" is also used as a synonymous for the linearization of + the class C. + +4) For instance, in the case of single inheritance hierarchy, if C is a + subclass of C1, and C1 is a subclass of C2, then the linearization of + C is simply the list [C, C1 , C2]. However, with multiple + inheritance hierarchies, the construction of the linearization is + more cumbersome, since it is more difficult to construct a + linearization that respects *local precedence ordering* and + *monotonicity*. + +5) I will discuss the local precedence ordering later, but I can give + the definition of monotonicity here. A MRO is monotonic when the + following is true: *if C1 precedes C2 in the linearization of C, + then C1 precedes C2 in the linearization of any subclass of C*. + Otherwise, the innocuous operation of deriving a new class could + change the resolution order of methods, potentially introducing very + subtle bugs. Examples where this happens will be shown later. + +6) Not all classes admit a linearization. There are cases, in + complicated hierarchies, where it is not possible to derive a class + such that its linearization respects all the desired properties. + +Here I give an example of this situation. Consider the hierarchy + + >>> O = object + >>> class X(O): pass + >>> class Y(O): pass + >>> class A(X,Y): pass + >>> class B(Y,X): pass + +which can be represented with the following inheritance graph, where I +have denoted with O the ``object`` class, which is the beginning of any +hierarchy for new style classes: + + .. code-block:: text + + ----------- + | | + | O | + | / \ | + - X Y / + | / | / + | / |/ + A B + \ / + ? + +In this case, it is not possible to derive a new class C from A and B, +since X precedes Y in A, but Y precedes X in B, therefore the method +resolution order would be ambiguous in C. + +Python 2.3 raises an exception in this situation (TypeError: MRO +conflict among bases Y, X) forbidding the naive programmer from creating +ambiguous hierarchies. Python 2.2 instead does not raise an exception, +but chooses an *ad hoc* ordering (CABXYO in this case). + +The C3 Method Resolution Order +------------------------------ + +Let me introduce a few simple notations which will be useful for the +following discussion. I will use the shortcut notation:: + + C1 C2 ... CN + +to indicate the list of classes [C1, C2, ... , CN]. + +The *head* of the list is its first element:: + + head = C1 + +whereas the *tail* is the rest of the list:: + + tail = C2 ... CN. + +I shall also use the notation:: + + C + (C1 C2 ... CN) = C C1 C2 ... CN + +to denote the sum of the lists [C] + [C1, C2, ... ,CN]. + +Now I can explain how the MRO works in Python 2.3. + +Consider a class C in a multiple inheritance hierarchy, with C +inheriting from the base classes B1, B2, ... , BN. We want to +compute the linearization L[C] of the class C. The rule is the +following: + + *the linearization of C is the sum of C plus the merge of the + linearizations of the parents and the list of the parents.* + +In symbolic notation:: + + L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN) + +In particular, if C is the ``object`` class, which has no parents, the +linearization is trivial:: + + L[object] = object. + +However, in general one has to compute the merge according to the following +prescription: + + *take the head of the first list, i.e L[B1][0]; if this head is not in + the tail of any of the other lists, then add it to the linearization + of C and remove it from the lists in the merge, otherwise look at the + head of the next list and take it, if it is a good head. Then repeat + the operation until all the class are removed or it is impossible to + find good heads. In this case, it is impossible to construct the + merge, Python 2.3 will refuse to create the class C and will raise an + exception.* + +This prescription ensures that the merge operation *preserves* the +ordering, if the ordering can be preserved. On the other hand, if the +order cannot be preserved (as in the example of serious order +disagreement discussed above) then the merge cannot be computed. + +The computation of the merge is trivial if C has only one parent +(single inheritance); in this case:: + + L[C(B)] = C + merge(L[B],B) = C + L[B] + +However, in the case of multiple inheritance things are more cumbersome +and I don't expect you can understand the rule without a couple of +examples ;-) + +Examples +-------- + +First example. Consider the following hierarchy: + + >>> O = object + >>> class F(O): pass + >>> class E(O): pass + >>> class D(O): pass + >>> class C(D,F): pass + >>> class B(D,E): pass + >>> class A(B,C): pass + +In this case the inheritance graph can be drawn as: + + .. code-block:: text + + 6 + --- + Level 3 | O | (more general) + / --- \ + / | \ | + / | \ | + / | \ | + --- --- --- | + Level 2 3 | D | 4| E | | F | 5 | + --- --- --- | + \ \ _ / | | + \ / \ _ | | + \ / \ | | + --- --- | + Level 1 1 | B | | C | 2 | + --- --- | + \ / | + \ / \ / + --- + Level 0 0 | A | (more specialized) + --- + + +The linearizations of O,D,E and F are trivial:: + + L[O] = O + L[D] = D O + L[E] = E O + L[F] = F O + +The linearization of B can be computed as:: + + L[B] = B + merge(DO, EO, DE) + +We see that D is a good head, therefore we take it and we are reduced to +compute ``merge(O,EO,E)``. Now O is not a good head, since it is in the +tail of the sequence EO. In this case the rule says that we have to +skip to the next sequence. Then we see that E is a good head; we take +it and we are reduced to compute ``merge(O,O)`` which gives O. Therefore:: + + L[B] = B D E O + +Using the same procedure one finds:: + + L[C] = C + merge(DO,FO,DF) + = C + D + merge(O,FO,F) + = C + D + F + merge(O,O) + = C D F O + +Now we can compute:: + + L[A] = A + merge(BDEO,CDFO,BC) + = A + B + merge(DEO,CDFO,C) + = A + B + C + merge(DEO,DFO) + = A + B + C + D + merge(EO,FO) + = A + B + C + D + E + merge(O,FO) + = A + B + C + D + E + F + merge(O,O) + = A B C D E F O + +In this example, the linearization is ordered in a pretty nice way +according to the inheritance level, in the sense that lower levels (i.e. +more specialized classes) have higher precedence (see the inheritance +graph). However, this is not the general case. + +I leave as an exercise for the reader to compute the linearization for +my second example: + + >>> O = object + >>> class F(O): pass + >>> class E(O): pass + >>> class D(O): pass + >>> class C(D,F): pass + >>> class B(E,D): pass + >>> class A(B,C): pass + +The only difference with the previous example is the change B(D,E) --> +B(E,D); however even such a little modification completely changes the +ordering of the hierarchy: + + .. code-block:: text + + 6 + --- + Level 3 | O | + / --- \ + / | \ + / | \ + / | \ + --- --- --- + Level 2 2 | E | 4 | D | | F | 5 + --- --- --- + \ / \ / + \ / \ / + \ / \ / + --- --- + Level 1 1 | B | | C | 3 + --- --- + \ / + \ / + --- + Level 0 0 | A | + --- + + +Notice that the class E, which is in the second level of the hierarchy, +precedes the class C, which is in the first level of the hierarchy, i.e. +E is more specialized than C, even if it is in a higher level. + +A lazy programmer can obtain the MRO directly from Python 2.2, since in +this case it coincides with the Python 2.3 linearization. It is enough +to invoke the :meth:`~type.mro` method of class A: + + >>> A.mro() # doctest: +NORMALIZE_WHITESPACE + [<class 'A'>, <class 'B'>, <class 'E'>, + <class 'C'>, <class 'D'>, <class 'F'>, + <class 'object'>] + +Finally, let me consider the example discussed in the first section, +involving a serious order disagreement. In this case, it is +straightforward to compute the linearizations of O, X, Y, A and B: + + .. code-block:: text + + L[O] = 0 + L[X] = X O + L[Y] = Y O + L[A] = A X Y O + L[B] = B Y X O + +However, it is impossible to compute the linearization for a class C +that inherits from A and B:: + + L[C] = C + merge(AXYO, BYXO, AB) + = C + A + merge(XYO, BYXO, B) + = C + A + B + merge(XYO, YXO) + +At this point we cannot merge the lists XYO and YXO, since X is in the +tail of YXO whereas Y is in the tail of XYO: therefore there are no +good heads and the C3 algorithm stops. Python 2.3 raises an error and +refuses to create the class C. + +Bad Method Resolution Orders +---------------------------- + +A MRO is *bad* when it breaks such fundamental properties as local +precedence ordering and monotonicity. In this section, I will show +that both the MRO for classic classes and the MRO for new style classes +in Python 2.2 are bad. + +It is easier to start with the local precedence ordering. Consider the +following example: + + >>> F=type('Food',(),{'remember2buy':'spam'}) + >>> E=type('Eggs',(F,),{'remember2buy':'eggs'}) + >>> G=type('GoodFood',(F,E),{}) # under Python 2.3 this is an error! # doctest: +SKIP + +with inheritance diagram + + .. code-block:: text + + O + | + (buy spam) F + | \ + | E (buy eggs) + | / + G + + (buy eggs or spam ?) + + +We see that class G inherits from F and E, with F *before* E: therefore +we would expect the attribute *G.remember2buy* to be inherited by +*F.rembermer2buy* and not by *E.remember2buy*: nevertheless Python 2.2 +gives + + >>> G.remember2buy # doctest: +SKIP + 'eggs' + +This is a breaking of local precedence ordering since the order in the +local precedence list, i.e. the list of the parents of G, is not +preserved in the Python 2.2 linearization of G:: + + L[G,P22]= G E F object # F *follows* E + +One could argue that the reason why F follows E in the Python 2.2 +linearization is that F is less specialized than E, since F is the +superclass of E; nevertheless the breaking of local precedence ordering +is quite non-intuitive and error prone. This is particularly true since +it is a different from old style classes: + + >>> class F: remember2buy='spam' + >>> class E(F): remember2buy='eggs' + >>> class G(F,E): pass # doctest: +SKIP + >>> G.remember2buy # doctest: +SKIP + 'spam' + +In this case the MRO is GFEF and the local precedence ordering is +preserved. + +As a general rule, hierarchies such as the previous one should be +avoided, since it is unclear if F should override E or vice-versa. +Python 2.3 solves the ambiguity by raising an exception in the creation +of class G, effectively stopping the programmer from generating +ambiguous hierarchies. The reason for that is that the C3 algorithm +fails when the merge:: + + merge(FO,EFO,FE) + +cannot be computed, because F is in the tail of EFO and E is in the tail +of FE. + +The real solution is to design a non-ambiguous hierarchy, i.e. to derive +G from E and F (the more specific first) and not from F and E; in this +case the MRO is GEF without any doubt. + + .. code-block:: text + + O + | + F (spam) + / | + (eggs) E | + \ | + G + (eggs, no doubt) + + +Python 2.3 forces the programmer to write good hierarchies (or, at +least, less error-prone ones). + +On a related note, let me point out that the Python 2.3 algorithm is +smart enough to recognize obvious mistakes, as the duplication of +classes in the list of parents: + + >>> class A(object): pass + >>> class C(A,A): pass # error + Traceback (most recent call last): + File "<stdin>", line 1, in ? + TypeError: duplicate base class A + +Python 2.2 (both for classic classes and new style classes) in this +situation, would not raise any exception. + +Finally, I would like to point out two lessons we have learned from this +example: + +1. despite the name, the MRO determines the resolution order of + attributes, not only of methods; + +2. the default food for Pythonistas is spam ! (but you already knew + that ;-) + +Having discussed the issue of local precedence ordering, let me now +consider the issue of monotonicity. My goal is to show that neither the +MRO for classic classes nor that for Python 2.2 new style classes is +monotonic. + +To prove that the MRO for classic classes is non-monotonic is rather +trivial, it is enough to look at the diamond diagram: + + .. code-block:: text + + + C + / \ + / \ + A B + \ / + \ / + D + +One easily discerns the inconsistency:: + + L[B,P21] = B C # B precedes C : B's methods win + L[D,P21] = D A C B C # B follows C : C's methods win! + +On the other hand, there are no problems with the Python 2.2 and 2.3 +MROs, they give both:: + + L[D] = D A B C + +Guido points out in his essay [#]_ that the classic MRO is not so bad in +practice, since one can typically avoids diamonds for classic classes. +But all new style classes inherit from ``object``, therefore diamonds are +unavoidable and inconsistencies shows up in every multiple inheritance +graph. + +The MRO of Python 2.2 makes breaking monotonicity difficult, but not +impossible. The following example, originally provided by Samuele +Pedroni, shows that the MRO of Python 2.2 is non-monotonic: + + >>> class A(object): pass + >>> class B(object): pass + >>> class C(object): pass + >>> class D(object): pass + >>> class E(object): pass + >>> class K1(A,B,C): pass + >>> class K2(D,B,E): pass + >>> class K3(D,A): pass + >>> class Z(K1,K2,K3): pass + +Here are the linearizations according to the C3 MRO (the reader should +verify these linearizations as an exercise and draw the inheritance +diagram ;-) :: + + L[A] = A O + L[B] = B O + L[C] = C O + L[D] = D O + L[E] = E O + L[K1]= K1 A B C O + L[K2]= K2 D B E O + L[K3]= K3 D A O + L[Z] = Z K1 K2 K3 D A B C E O + +Python 2.2 gives exactly the same linearizations for A, B, C, D, E, K1, +K2 and K3, but a different linearization for Z:: + + L[Z,P22] = Z K1 K3 A K2 D B C E O + +It is clear that this linearization is *wrong*, since A comes before D +whereas in the linearization of K3 A comes *after* D. In other words, in +K3 methods derived by D override methods derived by A, but in Z, which +still is a subclass of K3, methods derived by A override methods derived +by D! This is a violation of monotonicity. Moreover, the Python 2.2 +linearization of Z is also inconsistent with local precedence ordering, +since the local precedence list of the class Z is [K1, K2, K3] (K2 +precedes K3), whereas in the linearization of Z K2 *follows* K3. These +problems explain why the 2.2 rule has been dismissed in favor of the C3 +rule. + +The end +------- + +This section is for the impatient reader, who skipped all the previous +sections and jumped immediately to the end. This section is for the +lazy programmer too, who didn't want to exercise her/his brain. +Finally, it is for the programmer with some hubris, otherwise s/he would +not be reading a paper on the C3 method resolution order in multiple +inheritance hierarchies ;-) These three virtues taken all together (and +*not* separately) deserve a prize: the prize is a short Python 2.2 +script that allows you to compute the 2.3 MRO without risk to your +brain. Simply change the last line to play with the various examples I +have discussed in this paper.:: + + #<mro.py> + + """C3 algorithm by Samuele Pedroni (with readability enhanced by me).""" + + class __metaclass__(type): + "All classes are metamagically modified to be nicely printed" + __repr__ = lambda cls: cls.__name__ + + class ex_2: + "Serious order disagreement" #From Guido + class O: pass + class X(O): pass + class Y(O): pass + class A(X,Y): pass + class B(Y,X): pass + try: + class Z(A,B): pass #creates Z(A,B) in Python 2.2 + except TypeError: + pass # Z(A,B) cannot be created in Python 2.3 + + class ex_5: + "My first example" + class O: pass + class F(O): pass + class E(O): pass + class D(O): pass + class C(D,F): pass + class B(D,E): pass + class A(B,C): pass + + class ex_6: + "My second example" + class O: pass + class F(O): pass + class E(O): pass + class D(O): pass + class C(D,F): pass + class B(E,D): pass + class A(B,C): pass + + class ex_9: + "Difference between Python 2.2 MRO and C3" #From Samuele + class O: pass + class A(O): pass + class B(O): pass + class C(O): pass + class D(O): pass + class E(O): pass + class K1(A,B,C): pass + class K2(D,B,E): pass + class K3(D,A): pass + class Z(K1,K2,K3): pass + + def merge(seqs): + print '\n\nCPL[%s]=%s' % (seqs[0][0],seqs), + res = []; i=0 + while 1: + nonemptyseqs=[seq for seq in seqs if seq] + if not nonemptyseqs: return res + i+=1; print '\n',i,'round: candidates...', + for seq in nonemptyseqs: # find merge candidates among seq heads + cand = seq[0]; print ' ',cand, + nothead=[s for s in nonemptyseqs if cand in s[1:]] + if nothead: cand=None #reject candidate + else: break + if not cand: raise "Inconsistent hierarchy" + res.append(cand) + for seq in nonemptyseqs: # remove cand + if seq[0] == cand: del seq[0] + + def mro(C): + "Compute the class precedence list (mro) according to C3" + return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)]) + + def print_mro(C): + print '\nMRO[%s]=%s' % (C,mro(C)) + print '\nP22 MRO[%s]=%s' % (C,C.mro()) + + print_mro(ex_9.Z) + + #</mro.py> + +That's all folks, + + enjoy ! + + +Resources +--------- + +.. [#] The thread on python-dev started by Samuele Pedroni: + https://mail.python.org/pipermail/python-dev/2002-October/029035.html + +.. [#] The paper *A Monotonic Superclass Linearization for Dylan*: + https://doi.org/10.1145/236337.236343 + +.. [#] Guido van Rossum's essay, *Unifying types and classes in Python 2.2*: + https://web.archive.org/web/20140210194412/http://www.python.org/download/releases/2.2.2/descrintro diff --git a/Doc/howto/perf_profiling.rst b/Doc/howto/perf_profiling.rst index 61812c19..06459d1b 100644 --- a/Doc/howto/perf_profiling.rst +++ b/Doc/howto/perf_profiling.rst @@ -97,7 +97,7 @@ Then we can use ``perf report`` to analyze the data: | | | | | |--2.97%--_PyObject_Malloc ... -As you can see, the Python functions are not shown in the output, only ``_Py_Eval_EvalFrameDefault`` +As you can see, the Python functions are not shown in the output, only ``_PyEval_EvalFrameDefault`` (the function that evaluates the Python bytecode) shows up. Unfortunately that's not very useful because all Python functions use the same C function to evaluate bytecode so we cannot know which Python function corresponds to which bytecode-evaluating function. @@ -162,13 +162,12 @@ the :option:`!-X` option takes precedence over the environment variable. Example, using the environment variable:: - $ PYTHONPERFSUPPORT=1 - $ python script.py + $ PYTHONPERFSUPPORT=1 perf record -F 9999 -g -o perf.data python script.py $ perf report -g -i perf.data Example, using the :option:`!-X` option:: - $ python -X perf script.py + $ perf record -F 9999 -g -o perf.data python -X perf script.py $ perf report -g -i perf.data Example, using the :mod:`sys` APIs in file :file:`example.py`: @@ -185,7 +184,7 @@ Example, using the :mod:`sys` APIs in file :file:`example.py`: ...then:: - $ python ./example.py + $ perf record -F 9999 -g -o perf.data python ./example.py $ perf report -g -i perf.data @@ -206,3 +205,62 @@ You can check if your system has been compiled with this flag by running:: If you don't see any output it means that your interpreter has not been compiled with frame pointers and therefore it may not be able to show Python functions in the output of ``perf``. + + +How to work without frame pointers +---------------------------------- + +If you are working with a Python interpreter that has been compiled without +frame pointers, you can still use the ``perf`` profiler, but the overhead will be +a bit higher because Python needs to generate unwinding information for every +Python function call on the fly. Additionally, ``perf`` will take more time to +process the data because it will need to use the DWARF debugging information to +unwind the stack and this is a slow process. + +To enable this mode, you can use the environment variable +:envvar:`PYTHON_PERF_JIT_SUPPORT` or the :option:`-X perf_jit <-X>` option, +which will enable the JIT mode for the ``perf`` profiler. + +.. note:: + + Due to a bug in the ``perf`` tool, only ``perf`` versions higher than v6.8 + will work with the JIT mode. The fix was also backported to the v6.7.2 + version of the tool. + + Note that when checking the version of the ``perf`` tool (which can be done + by running ``perf version``) you must take into account that some distros + add some custom version numbers including a ``-`` character. This means + that ``perf 6.7-3`` is not necessarily ``perf 6.7.3``. + +When using the perf JIT mode, you need an extra step before you can run ``perf +report``. You need to call the ``perf inject`` command to inject the JIT +information into the ``perf.data`` file.:: + + $ perf record -F 9999 -g --call-graph dwarf -o perf.data python -Xperf_jit my_script.py + $ perf inject -i perf.data --jit --output perf.jit.data + $ perf report -g -i perf.jit.data + +or using the environment variable:: + + $ PYTHON_PERF_JIT_SUPPORT=1 perf record -F 9999 -g --call-graph dwarf -o perf.data python my_script.py + $ perf inject -i perf.data --jit --output perf.jit.data + $ perf report -g -i perf.jit.data + +``perf inject --jit`` command will read ``perf.data``, +automatically pick up the perf dump file that Python creates (in +``/tmp/perf-$PID.dump``), and then create ``perf.jit.data`` which merges all the +JIT information together. It should also create a lot of ``jitted-XXXX-N.so`` +files in the current directory which are ELF images for all the JIT trampolines +that were created by Python. + +.. warning:: + Notice that when using ``--call-graph dwarf`` the ``perf`` tool will take + snapshots of the stack of the process being profiled and save the + information in the ``perf.data`` file. By default the size of the stack dump + is 8192 bytes but the user can change the size by passing the size after + comma like ``--call-graph dwarf,4096``. The size of the stack dump is + important because if the size is too small ``perf`` will not be able to + unwind the stack and the output will be incomplete. On the other hand, if + the size is too big, then ``perf`` won't be able to sample the process as + frequently as it would like as the overhead will be higher. + diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 6c30a0dd..9f73c811 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -1,3 +1,5 @@ +:orphan: + .. _pyporting-howto: ************************************* @@ -6,422 +8,30 @@ How to port Python 2 Code to Python 3 :author: Brett Cannon -.. topic:: Abstract - - Python 2 reached its official end-of-life at the start of 2020. This means - that no new bug reports, fixes, or changes will be made to Python 2 - it's - no longer supported. - - This guide is intended to provide you with a path to Python 3 for your - code, that includes compatibility with Python 2 as a first step. - - If you are looking to port an extension module instead of pure Python code, - please see :ref:`cporting-howto`. - - The archived python-porting_ mailing list may contain some useful guidance. - - -The Short Explanation -===================== - -To achieve Python 2/3 compatibility in a single code base, the basic steps -are: - -#. Only worry about supporting Python 2.7 -#. Make sure you have good test coverage (coverage.py_ can help; - ``python -m pip install coverage``) -#. Learn the differences between Python 2 and 3 -#. Use Futurize_ (or Modernize_) to update your code (e.g. ``python -m pip install future``) -#. Use Pylint_ to help make sure you don't regress on your Python 3 support - (``python -m pip install pylint``) -#. Use caniusepython3_ to find out which of your dependencies are blocking your - use of Python 3 (``python -m pip install caniusepython3``) -#. Once your dependencies are no longer blocking you, use continuous integration - to make sure you stay compatible with Python 2 and 3 (tox_ can help test - against multiple versions of Python; ``python -m pip install tox``) -#. Consider using optional static type checking to make sure your type usage - works in both Python 2 and 3 (e.g. use mypy_ to check your typing under both - Python 2 and Python 3; ``python -m pip install mypy``). - -.. note:: - - Note: Using ``python -m pip install`` guarantees that the ``pip`` you invoke - is the one installed for the Python currently in use, whether it be - a system-wide ``pip`` or one installed within a - :ref:`virtual environment <tut-venv>`. - -Details -======= - -Even if other factors - say, dependencies over which you have no control - -still require you to support Python 2, that does not prevent you taking the -step of including Python 3 support. - -Most changes required to support Python 3 lead to cleaner code using newer -practices even in Python 2 code. - - -Different versions of Python 2 ------------------------------- - -Ideally, your code should be compatible with Python 2.7, which was the -last supported version of Python 2. - -Some of the tools mentioned in this guide will not work with Python 2.6. - -If absolutely necessary, the six_ project can help you support Python 2.5 and -3 simultaneously. Do realize, though, that nearly all the projects listed in -this guide will not be available to you. - -If you are able to skip Python 2.5 and older, the required changes to your -code will be minimal. At worst you will have to use a function instead of a -method in some instances or have to import a function instead of using a -built-in one. - - -Make sure you specify the proper version support in your ``setup.py`` file --------------------------------------------------------------------------- - -In your ``setup.py`` file you should have the proper `trove classifier`_ -specifying what versions of Python you support. As your project does not support -Python 3 yet you should at least have -``Programming Language :: Python :: 2 :: Only`` specified. Ideally you should -also specify each major/minor version of Python that you do support, e.g. -``Programming Language :: Python :: 2.7``. - - -Have good test coverage ------------------------ - -Once you have your code supporting the oldest version of Python 2 you want it -to, you will want to make sure your test suite has good coverage. A good rule of -thumb is that if you want to be confident enough in your test suite that any -failures that appear after having tools rewrite your code are actual bugs in the -tools and not in your code. If you want a number to aim for, try to get over 80% -coverage (and don't feel bad if you find it hard to get better than 90% -coverage). If you don't already have a tool to measure test coverage then -coverage.py_ is recommended. - - -Be aware of the differences between Python 2 and 3 --------------------------------------------------- - -Once you have your code well-tested you are ready to begin porting your code to -Python 3! But to fully understand how your code is going to change and what -you want to look out for while you code, you will want to learn what changes -Python 3 makes in terms of Python 2. - -Some resources for understanding the differences and their implications for you -code: - -* the :ref:`"What's New" <whatsnew-index>` doc for each release of Python 3 -* the `Porting to Python 3`_ book (which is free online) -* the handy `cheat sheet`_ from the Python-Future project. - - -Update your code ----------------- - -There are tools available that can port your code automatically. - -Futurize_ does its best to make Python 3 idioms and practices exist in Python -2, e.g. backporting the ``bytes`` type from Python 3 so that you have -semantic parity between the major versions of Python. This is the better -approach for most cases. - -Modernize_, on the other hand, is more conservative and targets a Python 2/3 -subset of Python, directly relying on six_ to help provide compatibility. - -A good approach is to run the tool over your test suite first and visually -inspect the diff to make sure the transformation is accurate. After you have -transformed your test suite and verified that all the tests still pass as -expected, then you can transform your application code knowing that any tests -which fail is a translation failure. - -Unfortunately the tools can't automate everything to make your code work under -Python 3, and you will also need to read the tools' documentation in case some -options you need are turned off by default. - -Key issues to be aware of and check for: - -Division -++++++++ - -In Python 3, ``5 / 2 == 2.5`` and not ``2`` as it was in Python 2; all -division between ``int`` values result in a ``float``. This change has -actually been planned since Python 2.2 which was released in 2002. Since then -users have been encouraged to add ``from __future__ import division`` to any -and all files which use the ``/`` and ``//`` operators or to be running the -interpreter with the ``-Q`` flag. If you have not been doing this then you -will need to go through your code and do two things: - -#. Add ``from __future__ import division`` to your files -#. Update any division operator as necessary to either use ``//`` to use floor - division or continue using ``/`` and expect a float - -The reason that ``/`` isn't simply translated to ``//`` automatically is that if -an object defines a ``__truediv__`` method but not ``__floordiv__`` then your -code would begin to fail (e.g. a user-defined class that uses ``/`` to -signify some operation but not ``//`` for the same thing or at all). +Python 2 reached its official end-of-life at the start of 2020. This means +that no new bug reports, fixes, or changes will be made to Python 2 - it's +no longer supported: see :pep:`373` and +`status of Python versions <https://devguide.python.org/versions>`_. +If you are looking to port an extension module instead of pure Python code, +please see :ref:`cporting-howto`. -Text versus binary data -+++++++++++++++++++++++ +The archived python-porting_ mailing list may contain some useful guidance. -In Python 2 you could use the ``str`` type for both text and binary data. -Unfortunately this confluence of two different concepts could lead to brittle -code which sometimes worked for either kind of data, sometimes not. It also -could lead to confusing APIs if people didn't explicitly state that something -that accepted ``str`` accepted either text or binary data instead of one -specific type. This complicated the situation especially for anyone supporting -multiple languages as APIs wouldn't bother explicitly supporting ``unicode`` -when they claimed text data support. +Since Python 3.11 the original porting guide was discontinued. +You can find the old guide in the +`archive <https://docs.python.org/3.10/howto/pyporting.html>`_. -Python 3 made text and binary data distinct types that cannot simply be mixed -together. For any code that deals only with text or only binary data, this -separation doesn't pose an issue. But for code that has to deal with both, it -does mean you might have to now care about when you are using text compared -to binary data, which is why this cannot be entirely automated. -Decide which APIs take text and which take binary (it is **highly** recommended -you don't design APIs that can take both due to the difficulty of keeping the -code working; as stated earlier it is difficult to do well). In Python 2 this -means making sure the APIs that take text can work with ``unicode`` and those -that work with binary data work with the ``bytes`` type from Python 3 -(which is a subset of ``str`` in Python 2 and acts as an alias for ``bytes`` -type in Python 2). Usually the biggest issue is realizing which methods exist -on which types in Python 2 and 3 simultaneously (for text that's ``unicode`` -in Python 2 and ``str`` in Python 3, for binary that's ``str``/``bytes`` in -Python 2 and ``bytes`` in Python 3). +Third-party guides +================== -The following table lists the **unique** methods of each data type across -Python 2 and 3 (e.g., the ``decode()`` method is usable on the equivalent binary -data type in either Python 2 or 3, but it can't be used by the textual data -type consistently between Python 2 and 3 because ``str`` in Python 3 doesn't -have the method). Do note that as of Python 3.5 the ``__mod__`` method was -added to the bytes type. +There are also multiple third-party guides that might be useful: -======================== ===================== -**Text data** **Binary data** ------------------------- --------------------- -\ decode ------------------------- --------------------- -encode ------------------------- --------------------- -format ------------------------- --------------------- -isdecimal ------------------------- --------------------- -isnumeric -======================== ===================== +- `Guide by Fedora <https://portingguide.readthedocs.io>`_ +- `PyCon 2020 tutorial <https://www.youtube.com/watch?v=JgIgEjASOlk>`_ +- `Guide by DigitalOcean <https://www.digitalocean.com/community/tutorials/how-to-port-python-2-code-to-python-3>`_ +- `Guide by ActiveState <https://www.activestate.com/blog/how-to-migrate-python-2-applications-to-python-3>`_ -Making the distinction easier to handle can be accomplished by encoding and -decoding between binary data and text at the edge of your code. This means that -when you receive text in binary data, you should immediately decode it. And if -your code needs to send text as binary data then encode it as late as possible. -This allows your code to work with only text internally and thus eliminates -having to keep track of what type of data you are working with. -The next issue is making sure you know whether the string literals in your code -represent text or binary data. You should add a ``b`` prefix to any -literal that presents binary data. For text you should add a ``u`` prefix to -the text literal. (There is a :mod:`__future__` import to force all unspecified -literals to be Unicode, but usage has shown it isn't as effective as adding a -``b`` or ``u`` prefix to all literals explicitly) - -You also need to be careful about opening files. Possibly you have not always -bothered to add the ``b`` mode when opening a binary file (e.g., ``rb`` for -binary reading). Under Python 3, binary files and text files are clearly -distinct and mutually incompatible; see the :mod:`io` module for details. -Therefore, you **must** make a decision of whether a file will be used for -binary access (allowing binary data to be read and/or written) or textual access -(allowing text data to be read and/or written). You should also use :func:`io.open` -for opening files instead of the built-in :func:`open` function as the :mod:`io` -module is consistent from Python 2 to 3 while the built-in :func:`open` function -is not (in Python 3 it's actually :func:`io.open`). Do not bother with the -outdated practice of using :func:`codecs.open` as that's only necessary for -keeping compatibility with Python 2.5. - -The constructors of both ``str`` and ``bytes`` have different semantics for the -same arguments between Python 2 and 3. Passing an integer to ``bytes`` in Python 2 -will give you the string representation of the integer: ``bytes(3) == '3'``. -But in Python 3, an integer argument to ``bytes`` will give you a bytes object -as long as the integer specified, filled with null bytes: -``bytes(3) == b'\x00\x00\x00'``. A similar worry is necessary when passing a -bytes object to ``str``. In Python 2 you just get the bytes object back: -``str(b'3') == b'3'``. But in Python 3 you get the string representation of the -bytes object: ``str(b'3') == "b'3'"``. - -Finally, the indexing of binary data requires careful handling (slicing does -**not** require any special handling). In Python 2, -``b'123'[1] == b'2'`` while in Python 3 ``b'123'[1] == 50``. Because binary data -is simply a collection of binary numbers, Python 3 returns the integer value for -the byte you index on. But in Python 2 because ``bytes == str``, indexing -returns a one-item slice of bytes. The six_ project has a function -named ``six.indexbytes()`` which will return an integer like in Python 3: -``six.indexbytes(b'123', 1)``. - -To summarize: - -#. Decide which of your APIs take text and which take binary data -#. Make sure that your code that works with text also works with ``unicode`` and - code for binary data works with ``bytes`` in Python 2 (see the table above - for what methods you cannot use for each type) -#. Mark all binary literals with a ``b`` prefix, textual literals with a ``u`` - prefix -#. Decode binary data to text as soon as possible, encode text as binary data as - late as possible -#. Open files using :func:`io.open` and make sure to specify the ``b`` mode when - appropriate -#. Be careful when indexing into binary data - - -Use feature detection instead of version detection -++++++++++++++++++++++++++++++++++++++++++++++++++ - -Inevitably you will have code that has to choose what to do based on what -version of Python is running. The best way to do this is with feature detection -of whether the version of Python you're running under supports what you need. -If for some reason that doesn't work then you should make the version check be -against Python 2 and not Python 3. To help explain this, let's look at an -example. - -Let's pretend that you need access to a feature of :mod:`importlib` that -is available in Python's standard library since Python 3.3 and available for -Python 2 through importlib2_ on PyPI. You might be tempted to write code to -access e.g. the :mod:`importlib.abc` module by doing the following:: - - import sys - - if sys.version_info[0] == 3: - from importlib import abc - else: - from importlib2 import abc - -The problem with this code is what happens when Python 4 comes out? It would -be better to treat Python 2 as the exceptional case instead of Python 3 and -assume that future Python versions will be more compatible with Python 3 than -Python 2:: - - import sys - - if sys.version_info[0] > 2: - from importlib import abc - else: - from importlib2 import abc - -The best solution, though, is to do no version detection at all and instead rely -on feature detection. That avoids any potential issues of getting the version -detection wrong and helps keep you future-compatible:: - - try: - from importlib import abc - except ImportError: - from importlib2 import abc - - -Prevent compatibility regressions ---------------------------------- - -Once you have fully translated your code to be compatible with Python 3, you -will want to make sure your code doesn't regress and stop working under -Python 3. This is especially true if you have a dependency which is blocking you -from actually running under Python 3 at the moment. - -To help with staying compatible, any new modules you create should have -at least the following block of code at the top of it:: - - from __future__ import absolute_import - from __future__ import division - from __future__ import print_function - -You can also run Python 2 with the ``-3`` flag to be warned about various -compatibility issues your code triggers during execution. If you turn warnings -into errors with ``-Werror`` then you can make sure that you don't accidentally -miss a warning. - -You can also use the Pylint_ project and its ``--py3k`` flag to lint your code -to receive warnings when your code begins to deviate from Python 3 -compatibility. This also prevents you from having to run Modernize_ or Futurize_ -over your code regularly to catch compatibility regressions. This does require -you only support Python 2.7 and Python 3.4 or newer as that is Pylint's -minimum Python version support. - - -Check which dependencies block your transition ----------------------------------------------- - -**After** you have made your code compatible with Python 3 you should begin to -care about whether your dependencies have also been ported. The caniusepython3_ -project was created to help you determine which projects --- directly or indirectly -- are blocking you from supporting Python 3. There -is both a command-line tool as well as a web interface at -https://caniusepython3.com. - -The project also provides code which you can integrate into your test suite so -that you will have a failing test when you no longer have dependencies blocking -you from using Python 3. This allows you to avoid having to manually check your -dependencies and to be notified quickly when you can start running on Python 3. - - -Update your ``setup.py`` file to denote Python 3 compatibility --------------------------------------------------------------- - -Once your code works under Python 3, you should update the classifiers in -your ``setup.py`` to contain ``Programming Language :: Python :: 3`` and to not -specify sole Python 2 support. This will tell anyone using your code that you -support Python 2 **and** 3. Ideally you will also want to add classifiers for -each major/minor version of Python you now support. - - -Use continuous integration to stay compatible ---------------------------------------------- - -Once you are able to fully run under Python 3 you will want to make sure your -code always works under both Python 2 and 3. Probably the best tool for running -your tests under multiple Python interpreters is tox_. You can then integrate -tox with your continuous integration system so that you never accidentally break -Python 2 or 3 support. - -You may also want to use the ``-bb`` flag with the Python 3 interpreter to -trigger an exception when you are comparing bytes to strings or bytes to an int -(the latter is available starting in Python 3.5). By default type-differing -comparisons simply return ``False``, but if you made a mistake in your -separation of text/binary data handling or indexing on bytes you wouldn't easily -find the mistake. This flag will raise an exception when these kinds of -comparisons occur, making the mistake much easier to track down. - - -Consider using optional static type checking --------------------------------------------- - -Another way to help port your code is to use a static type checker like -mypy_ or pytype_ on your code. These tools can be used to analyze your code as -if it's being run under Python 2, then you can run the tool a second time as if -your code is running under Python 3. By running a static type checker twice like -this you can discover if you're e.g. misusing binary data type in one version -of Python compared to another. If you add optional type hints to your code you -can also explicitly state whether your APIs use textual or binary data, helping -to make sure everything functions as expected in both versions of Python. - - -.. _caniusepython3: https://pypi.org/project/caniusepython3 -.. _cheat sheet: https://python-future.org/compatible_idioms.html -.. _coverage.py: https://pypi.org/project/coverage -.. _Futurize: https://python-future.org/automatic_conversion.html -.. _importlib2: https://pypi.org/project/importlib2 -.. _Modernize: https://python-modernize.readthedocs.io/ -.. _mypy: https://mypy-lang.org/ -.. _Porting to Python 3: http://python3porting.com/ -.. _Pylint: https://pypi.org/project/pylint - -.. _Python 3 Q & A: https://ncoghlan-devs-python-notes.readthedocs.io/en/latest/python3/questions_and_answers.html - -.. _pytype: https://github.com/google/pytype -.. _python-future: https://python-future.org/ .. _python-porting: https://mail.python.org/pipermail/python-porting/ -.. _six: https://pypi.org/project/six -.. _tox: https://pypi.org/project/tox -.. _trove classifier: https://pypi.org/classifiers - -.. _Why Python 3 exists: https://snarky.ca/why-python-3-exists diff --git a/Doc/howto/regex.rst b/Doc/howto/regex.rst index c19c4830..5e2f9a9d 100644 --- a/Doc/howto/regex.rst +++ b/Doc/howto/regex.rst @@ -245,6 +245,9 @@ You can omit either *m* or *n*; in that case, a reasonable value is assumed for the missing value. Omitting *m* is interpreted as a lower limit of 0, while omitting *n* results in an upper bound of infinity. +The simplest case ``{m}`` matches the preceding item exactly *m* times. +For example, ``a/{2}b`` will only match ``'a//b'``. + Readers of a reductionist bent may notice that the three other quantifiers can all be expressed using this notation. ``{0,}`` is the same as ``*``, ``{1,}`` is equivalent to ``+``, and ``{0,1}`` is the same as ``?``. It's better to use diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 38dd09f0..b98f91e0 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -1,10 +1,9 @@ .. _sortinghowto: -Sorting HOW TO -************** +Sorting Techniques +****************** :Author: Andrew Dalke and Raymond Hettinger -:Release: 0.1 Python lists have a built-in :meth:`list.sort` method that modifies the list @@ -56,7 +55,7 @@ For example, here's a case-insensitive string comparison: .. doctest:: - >>> sorted("This is a test string from Andrew".split(), key=str.lower) + >>> sorted("This is a test string from Andrew".split(), key=str.casefold) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] The value of the *key* parameter should be a function (or other callable) that @@ -97,10 +96,14 @@ The same technique works for objects with named attributes. For example: >>> sorted(student_objects, key=lambda student: student.age) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] -Operator Module Functions -========================= +Objects with named attributes can be made by a regular class as shown +above, or they can be instances of :class:`~dataclasses.dataclass` or +a :term:`named tuple`. -The key-function patterns shown above are very common, so Python provides +Operator Module Functions and Partial Function Evaluation +========================================================= + +The :term:`key function` patterns shown above are very common, so Python provides convenience functions to make accessor functions easier and faster. The :mod:`operator` module has :func:`~operator.itemgetter`, :func:`~operator.attrgetter`, and a :func:`~operator.methodcaller` function. @@ -128,6 +131,24 @@ sort by *grade* then by *age*: >>> sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] +The :mod:`functools` module provides another helpful tool for making +key-functions. The :func:`~functools.partial` function can reduce the +`arity <https://en.wikipedia.org/wiki/Arity>`_ of a multi-argument +function making it suitable for use as a key-function. + +.. doctest:: + + >>> from functools import partial + >>> from unicodedata import normalize + + >>> names = 'Zoë Åbjørn Núñez Élana Zeke Abe Nubia Eloise'.split() + + >>> sorted(names, key=partial(normalize, 'NFD')) + ['Abe', 'Åbjørn', 'Eloise', 'Élana', 'Nubia', 'Núñez', 'Zeke', 'Zoë'] + + >>> sorted(names, key=partial(normalize, 'NFC')) + ['Abe', 'Eloise', 'Nubia', 'Núñez', 'Zeke', 'Zoë', 'Åbjørn', 'Élana'] + Ascending and Descending ======================== @@ -200,6 +221,8 @@ This idiom is called Decorate-Sort-Undecorate after its three steps: For example, to sort the student data by *grade* using the DSU approach: +.. doctest:: + >>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)] >>> decorated.sort() >>> [student for grade, i, student in decorated] # undecorate @@ -282,7 +305,11 @@ Odds and Ends [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] However, note that ``<`` can fall back to using :meth:`~object.__gt__` if - :meth:`~object.__lt__` is not implemented (see :func:`object.__lt__`). + :meth:`~object.__lt__` is not implemented (see :func:`object.__lt__` + for details on the mechanics). To avoid surprises, :pep:`8` + recommends that all six comparison methods be implemented. + The :func:`~functools.total_ordering` decorator is provided to make that + task easier. * Key functions need not depend directly on the objects being sorted. A key function can also access external resources. For instance, if the student grades @@ -295,3 +322,24 @@ Odds and Ends >>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'} >>> sorted(students, key=newgrades.__getitem__) ['jane', 'dave', 'john'] + +Partial Sorts +============= + +Some applications require only some of the data to be ordered. The standard +library provides several tools that do less work than a full sort: + +* :func:`min` and :func:`max` return the smallest and largest values, + respectively. These functions make a single pass over the input data and + require almost no auxiliary memory. + +* :func:`heapq.nsmallest` and :func:`heapq.nlargest` return + the *n* smallest and largest values, respectively. These functions + make a single pass over the data keeping only *n* elements in memory + at a time. For values of *n* that are small relative to the number of + inputs, these functions make far fewer comparisons than a full sort. + +* :func:`heapq.heappush` and :func:`heapq.heappop` create and maintain a + partially sorted arrangement of data that keeps the smallest element + at position ``0``. These functions are suitable for implementing + priority queues which are commonly used for task scheduling. diff --git a/Doc/howto/timerfd.rst b/Doc/howto/timerfd.rst new file mode 100644 index 00000000..b5fc06ae --- /dev/null +++ b/Doc/howto/timerfd.rst @@ -0,0 +1,230 @@ +.. _timerfd-howto: + +***************************** + timer file descriptor HOWTO +***************************** + +:Release: 1.13 + +This HOWTO discusses Python's support for the linux timer file descriptor. + + +Examples +======== + +The following example shows how to use a timer file descriptor +to execute a function twice a second: + +.. code-block:: python + + # Practical scripts should use really use a non-blocking timer, + # we use a blocking timer here for simplicity. + import os, time + + # Create the timer file descriptor + fd = os.timerfd_create(time.CLOCK_REALTIME) + + # Start the timer in 1 second, with an interval of half a second + os.timerfd_settime(fd, initial=1, interval=0.5) + + try: + # Process timer events four times. + for _ in range(4): + # read() will block until the timer expires + _ = os.read(fd, 8) + print("Timer expired") + finally: + # Remember to close the timer file descriptor! + os.close(fd) + +To avoid the precision loss caused by the :class:`float` type, +timer file descriptors allow specifying initial expiration and interval +in integer nanoseconds with ``_ns`` variants of the functions. + +This example shows how :func:`~select.epoll` can be used with timer file +descriptors to wait until the file descriptor is ready for reading: + +.. code-block:: python + + import os, time, select, socket, sys + + # Create an epoll object + ep = select.epoll() + + # In this example, use loopback address to send "stop" command to the server. + # + # $ telnet 127.0.0.1 1234 + # Trying 127.0.0.1... + # Connected to 127.0.0.1. + # Escape character is '^]'. + # stop + # Connection closed by foreign host. + # + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind(("127.0.0.1", 1234)) + sock.setblocking(False) + sock.listen(1) + ep.register(sock, select.EPOLLIN) + + # Create timer file descriptors in non-blocking mode. + num = 3 + fds = [] + for _ in range(num): + fd = os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK) + fds.append(fd) + # Register the timer file descriptor for read events + ep.register(fd, select.EPOLLIN) + + # Start the timer with os.timerfd_settime_ns() in nanoseconds. + # Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc + for i, fd in enumerate(fds, start=1): + one_sec_in_nsec = 10**9 + i = i * one_sec_in_nsec + os.timerfd_settime_ns(fd, initial=i//4, interval=i//4) + + timeout = 3 + try: + conn = None + is_active = True + while is_active: + # Wait for the timer to expire for 3 seconds. + # epoll.poll() returns a list of (fd, event) pairs. + # fd is a file descriptor. + # sock and conn[=returned value of socket.accept()] are socket objects, not file descriptors. + # So use sock.fileno() and conn.fileno() to get the file descriptors. + events = ep.poll(timeout) + + # If more than one timer file descriptors are ready for reading at once, + # epoll.poll() returns a list of (fd, event) pairs. + # + # In this example settings, + # 1st timer fires every 0.25 seconds in 0.25 seconds. (0.25, 0.5, 0.75, 1.0, ...) + # 2nd timer every 0.5 seconds in 0.5 seconds. (0.5, 1.0, 1.5, 2.0, ...) + # 3rd timer every 0.75 seconds in 0.75 seconds. (0.75, 1.5, 2.25, 3.0, ...) + # + # In 0.25 seconds, only 1st timer fires. + # In 0.5 seconds, 1st timer and 2nd timer fires at once. + # In 0.75 seconds, 1st timer and 3rd timer fires at once. + # In 1.5 seconds, 1st timer, 2nd timer and 3rd timer fires at once. + # + # If a timer file descriptor is signaled more than once since + # the last os.read() call, os.read() returns the number of signaled + # as host order of class bytes. + print(f"Signaled events={events}") + for fd, event in events: + if event & select.EPOLLIN: + if fd == sock.fileno(): + # Check if there is a connection request. + print(f"Accepting connection {fd}") + conn, addr = sock.accept() + conn.setblocking(False) + print(f"Accepted connection {conn} from {addr}") + ep.register(conn, select.EPOLLIN) + elif conn and fd == conn.fileno(): + # Check if there is data to read. + print(f"Reading data {fd}") + data = conn.recv(1024) + if data: + # You should catch UnicodeDecodeError exception for safety. + cmd = data.decode() + if cmd.startswith("stop"): + print(f"Stopping server") + is_active = False + else: + print(f"Unknown command: {cmd}") + else: + # No more data, close connection + print(f"Closing connection {fd}") + ep.unregister(conn) + conn.close() + conn = None + elif fd in fds: + print(f"Reading timer {fd}") + count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder) + print(f"Timer {fds.index(fd) + 1} expired {count} times") + else: + print(f"Unknown file descriptor {fd}") + finally: + for fd in fds: + ep.unregister(fd) + os.close(fd) + ep.close() + +This example shows how :func:`~select.select` can be used with timer file +descriptors to wait until the file descriptor is ready for reading: + +.. code-block:: python + + import os, time, select, socket, sys + + # In this example, use loopback address to send "stop" command to the server. + # + # $ telnet 127.0.0.1 1234 + # Trying 127.0.0.1... + # Connected to 127.0.0.1. + # Escape character is '^]'. + # stop + # Connection closed by foreign host. + # + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind(("127.0.0.1", 1234)) + sock.setblocking(False) + sock.listen(1) + + # Create timer file descriptors in non-blocking mode. + num = 3 + fds = [os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK) + for _ in range(num)] + select_fds = fds + [sock] + + # Start the timers with os.timerfd_settime() in seconds. + # Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc + for i, fd in enumerate(fds, start=1): + os.timerfd_settime(fd, initial=i/4, interval=i/4) + + timeout = 3 + try: + conn = None + is_active = True + while is_active: + # Wait for the timer to expire for 3 seconds. + # select.select() returns a list of file descriptors or objects. + rfd, wfd, xfd = select.select(select_fds, select_fds, select_fds, timeout) + for fd in rfd: + if fd == sock: + # Check if there is a connection request. + print(f"Accepting connection {fd}") + conn, addr = sock.accept() + conn.setblocking(False) + print(f"Accepted connection {conn} from {addr}") + select_fds.append(conn) + elif conn and fd == conn: + # Check if there is data to read. + print(f"Reading data {fd}") + data = conn.recv(1024) + if data: + # You should catch UnicodeDecodeError exception for safety. + cmd = data.decode() + if cmd.startswith("stop"): + print(f"Stopping server") + is_active = False + else: + print(f"Unknown command: {cmd}") + else: + # No more data, close connection + print(f"Closing connection {fd}") + select_fds.remove(conn) + conn.close() + conn = None + elif fd in fds: + print(f"Reading timer {fd}") + count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder) + print(f"Timer {fds.index(fd) + 1} expired {count} times") + else: + print(f"Unknown file descriptor {fd}") + finally: + for fd in fds: + os.close(fd) + sock.close() + sock = None + diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 570435d4..33a2a7ea 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -392,16 +392,16 @@ info and geturl =============== The response returned by urlopen (or the :exc:`~urllib.error.HTTPError` instance) has two -useful methods :meth:`info` and :meth:`geturl` and is defined in the module -:mod:`urllib.response`.. +useful methods :meth:`!info` and :meth:`!geturl` and is defined in the module +:mod:`urllib.response`. -**geturl** - this returns the real URL of the page fetched. This is useful -because ``urlopen`` (or the opener object used) may have followed a -redirect. The URL of the page fetched may not be the same as the URL requested. +* **geturl** - this returns the real URL of the page fetched. This is useful + because ``urlopen`` (or the opener object used) may have followed a + redirect. The URL of the page fetched may not be the same as the URL requested. -**info** - this returns a dictionary-like object that describes the page -fetched, particularly the headers sent by the server. It is currently an -:class:`http.client.HTTPMessage` instance. +* **info** - this returns a dictionary-like object that describes the page + fetched, particularly the headers sent by the server. It is currently an + :class:`http.client.HTTPMessage` instance. Typical headers include 'Content-length', 'Content-type', and so on. See the `Quick Reference to HTTP Headers <https://jkorpela.fi/http.html>`_ @@ -507,7 +507,7 @@ than the URL you pass to .add_password() will also match. :: In the above example we only supplied our ``HTTPBasicAuthHandler`` to ``build_opener``. By default openers have the handlers for normal situations - -- ``ProxyHandler`` (if a proxy setting such as an :envvar:`http_proxy` + -- ``ProxyHandler`` (if a proxy setting such as an :envvar:`!http_proxy` environment variable is set), ``UnknownHandler``, ``HTTPHandler``, ``HTTPDefaultErrorHandler``, ``HTTPRedirectHandler``, ``FTPHandler``, ``FileHandler``, ``DataHandler``, ``HTTPErrorProcessor``. @@ -594,5 +594,5 @@ This document was reviewed and revised by John Lee. scripts with a localhost server, I have to prevent urllib from using the proxy. .. [#] urllib opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe - <https://code.activestate.com/recipes/456195/>`_. + <https://code.activestate.com/recipes/456195-urrlib2-opener-for-ssl-proxy-connect-method/>`_. diff --git a/Doc/includes/email-alternative.py b/Doc/includes/email-alternative.py index df7ca6f3..26b302b4 100644 --- a/Doc/includes/email-alternative.py +++ b/Doc/includes/email-alternative.py @@ -8,14 +8,14 @@ from email.utils import make_msgid # Create the base text message. msg = EmailMessage() -msg['Subject'] = "Ayons asperges pour le déjeuner" +msg['Subject'] = "Pourquoi pas des asperges pour ce midi ?" msg['From'] = Address("Pepé Le Pew", "pepe", "example.com") msg['To'] = (Address("Penelope Pussycat", "penelope", "example.com"), Address("Fabrette Pussycat", "fabrette", "example.com")) msg.set_content("""\ Salut! -Cela ressemble à un excellent recipie[1] déjeuner. +Cette recette [1] sera sûrement un très bon repas. [1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718 @@ -31,10 +31,10 @@ msg.add_alternative("""\ <head></head> <body> <p>Salut!</p> - <p>Cela ressemble à un excellent + <p>Cette <a href="http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718"> - recipie - </a> déjeuner. + recette + </a> sera sûrement un très bon repas. </p> <img src="cid:{asparagus_cid}" /> </body> diff --git a/Doc/includes/email-dir.py b/Doc/includes/email-dir.py index 2fc1570e..aa2a5c7c 100644 --- a/Doc/includes/email-dir.py +++ b/Doc/includes/email-dir.py @@ -53,7 +53,7 @@ must be running an SMTP server. # Guess the content type based on the file's extension. Encoding # will be ignored, although we should check for simple things like # gzip'd or compressed files. - ctype, encoding = mimetypes.guess_type(path) + ctype, encoding = mimetypes.guess_file_type(path) if ctype is None or encoding is not None: # No guess could be made, or the file is encoded (compressed), so # use a generic bag-of-bits type. diff --git a/Doc/includes/newtypes/custom.c b/Doc/includes/newtypes/custom.c index 9cfba50a..5253f879 100644 --- a/Doc/includes/newtypes/custom.c +++ b/Doc/includes/newtypes/custom.c @@ -34,9 +34,7 @@ PyInit_custom(void) if (m == NULL) return NULL; - Py_INCREF(&CustomType); - if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { - Py_DECREF(&CustomType); + if (PyModule_AddObjectRef(m, "Custom", (PyObject *) &CustomType) < 0) { Py_DECREF(m); return NULL; } diff --git a/Doc/includes/newtypes/sublist.c b/Doc/includes/newtypes/sublist.c index b36dadf0..d8aba463 100644 --- a/Doc/includes/newtypes/sublist.c +++ b/Doc/includes/newtypes/sublist.c @@ -58,9 +58,7 @@ PyInit_sublist(void) if (m == NULL) return NULL; - Py_INCREF(&SubListType); - if (PyModule_AddObject(m, "SubList", (PyObject *) &SubListType) < 0) { - Py_DECREF(&SubListType); + if (PyModule_AddObjectRef(m, "SubList", (PyObject *) &SubListType) < 0) { Py_DECREF(m); return NULL; } diff --git a/Doc/includes/wasm-mobile-notavail.rst b/Doc/includes/wasm-mobile-notavail.rst new file mode 100644 index 00000000..725b0f7a --- /dev/null +++ b/Doc/includes/wasm-mobile-notavail.rst @@ -0,0 +1,6 @@ +.. include for modules that don't work on WASM or mobile platforms + +.. availability:: not Android, not iOS, not WASI. + + This module is not supported on :ref:`mobile platforms <mobile-availability>` + or :ref:`WebAssembly platforms <wasm-availability>`. diff --git a/Doc/includes/wasm-notavail.rst b/Doc/includes/wasm-notavail.rst index e680e1f9..c1b79d2a 100644 --- a/Doc/includes/wasm-notavail.rst +++ b/Doc/includes/wasm-notavail.rst @@ -1,7 +1,6 @@ .. include for modules that don't work on WASM -.. availability:: not Emscripten, not WASI. +.. availability:: not WASI. - This module does not work or is not available on WebAssembly platforms - ``wasm32-emscripten`` and ``wasm32-wasi``. See + This module does not work or is not available on WebAssembly. See :ref:`wasm-availability` for more information. diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst deleted file mode 100644 index d85ad94e..00000000 --- a/Doc/library/2to3.rst +++ /dev/null @@ -1,489 +0,0 @@ -.. _2to3-reference: - -2to3 --- Automated Python 2 to 3 code translation -================================================= - -.. sectionauthor:: Benjamin Peterson <benjamin@python.org> - -2to3 is a Python program that reads Python 2.x source code and applies a series -of *fixers* to transform it into valid Python 3.x code. The standard library -contains a rich set of fixers that will handle almost all code. 2to3 supporting -library :mod:`lib2to3` is, however, a flexible and generic library, so it is -possible to write your own fixers for 2to3. - -.. deprecated-removed:: 3.11 3.13 - The ``lib2to3`` module was marked pending for deprecation in Python 3.9 - (raising :exc:`PendingDeprecationWarning` on import) and fully deprecated - in Python 3.11 (raising :exc:`DeprecationWarning`). The ``2to3`` tool is - part of that. It will be removed in Python 3.13. - -.. _2to3-using: - -Using 2to3 ----------- - -2to3 will usually be installed with the Python interpreter as a script. It is -also located in the :file:`Tools/scripts` directory of the Python root. - -2to3's basic arguments are a list of files or directories to transform. The -directories are recursively traversed for Python sources. - -Here is a sample Python 2.x source file, :file:`example.py`:: - - def greet(name): - print "Hello, {0}!".format(name) - print "What's your name?" - name = raw_input() - greet(name) - -It can be converted to Python 3.x code via 2to3 on the command line: - -.. code-block:: shell-session - - $ 2to3 example.py - -A diff against the original source file is printed. 2to3 can also write the -needed modifications right back to the source file. (A backup of the original -file is made unless :option:`!-n` is also given.) Writing the changes back is -enabled with the :option:`!-w` flag: - -.. code-block:: shell-session - - $ 2to3 -w example.py - -After transformation, :file:`example.py` looks like this:: - - def greet(name): - print("Hello, {0}!".format(name)) - print("What's your name?") - name = input() - greet(name) - -Comments and exact indentation are preserved throughout the translation process. - -By default, 2to3 runs a set of :ref:`predefined fixers <2to3-fixers>`. The -:option:`!-l` flag lists all available fixers. An explicit set of fixers to run -can be given with :option:`!-f`. Likewise the :option:`!-x` explicitly disables a -fixer. The following example runs only the ``imports`` and ``has_key`` fixers: - -.. code-block:: shell-session - - $ 2to3 -f imports -f has_key example.py - -This command runs every fixer except the ``apply`` fixer: - -.. code-block:: shell-session - - $ 2to3 -x apply example.py - -Some fixers are *explicit*, meaning they aren't run by default and must be -listed on the command line to be run. Here, in addition to the default fixers, -the ``idioms`` fixer is run: - -.. code-block:: shell-session - - $ 2to3 -f all -f idioms example.py - -Notice how passing ``all`` enables all default fixers. - -Sometimes 2to3 will find a place in your source code that needs to be changed, -but 2to3 cannot fix automatically. In this case, 2to3 will print a warning -beneath the diff for a file. You should address the warning in order to have -compliant 3.x code. - -2to3 can also refactor doctests. To enable this mode, use the :option:`!-d` -flag. Note that *only* doctests will be refactored. This also doesn't require -the module to be valid Python. For example, doctest like examples in a reST -document could also be refactored with this option. - -The :option:`!-v` option enables output of more information on the translation -process. - -Since some print statements can be parsed as function calls or statements, 2to3 -cannot always read files containing the print function. When 2to3 detects the -presence of the ``from __future__ import print_function`` compiler directive, it -modifies its internal grammar to interpret :func:`print` as a function. This -change can also be enabled manually with the :option:`!-p` flag. Use -:option:`!-p` to run fixers on code that already has had its print statements -converted. Also :option:`!-e` can be used to make :func:`exec` a function. - -The :option:`!-o` or :option:`!--output-dir` option allows specification of an -alternate directory for processed output files to be written to. The -:option:`!-n` flag is required when using this as backup files do not make sense -when not overwriting the input files. - -.. versionadded:: 3.2.3 - The :option:`!-o` option was added. - -The :option:`!-W` or :option:`!--write-unchanged-files` flag tells 2to3 to always -write output files even if no changes were required to the file. This is most -useful with :option:`!-o` so that an entire Python source tree is copied with -translation from one directory to another. -This option implies the :option:`!-w` flag as it would not make sense otherwise. - -.. versionadded:: 3.2.3 - The :option:`!-W` flag was added. - -The :option:`!--add-suffix` option specifies a string to append to all output -filenames. The :option:`!-n` flag is required when specifying this as backups -are not necessary when writing to different filenames. Example: - -.. code-block:: shell-session - - $ 2to3 -n -W --add-suffix=3 example.py - -Will cause a converted file named ``example.py3`` to be written. - -.. versionadded:: 3.2.3 - The :option:`!--add-suffix` option was added. - -To translate an entire project from one directory tree to another use: - -.. code-block:: shell-session - - $ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode - - -.. _2to3-fixers: - -Fixers ------- - -Each step of transforming code is encapsulated in a fixer. The command ``2to3 --l`` lists them. As :ref:`documented above <2to3-using>`, each can be turned on -and off individually. They are described here in more detail. - - -.. 2to3fixer:: apply - - Removes usage of :func:`apply`. For example ``apply(function, *args, - **kwargs)`` is converted to ``function(*args, **kwargs)``. - -.. 2to3fixer:: asserts - - Replaces deprecated :mod:`unittest` method names with the correct ones. - - ================================ ========================================== - From To - ================================ ========================================== - ``failUnlessEqual(a, b)`` :meth:`assertEqual(a, b) - <unittest.TestCase.assertEqual>` - ``assertEquals(a, b)`` :meth:`assertEqual(a, b) - <unittest.TestCase.assertEqual>` - ``failIfEqual(a, b)`` :meth:`assertNotEqual(a, b) - <unittest.TestCase.assertNotEqual>` - ``assertNotEquals(a, b)`` :meth:`assertNotEqual(a, b) - <unittest.TestCase.assertNotEqual>` - ``failUnless(a)`` :meth:`assertTrue(a) - <unittest.TestCase.assertTrue>` - ``assert_(a)`` :meth:`assertTrue(a) - <unittest.TestCase.assertTrue>` - ``failIf(a)`` :meth:`assertFalse(a) - <unittest.TestCase.assertFalse>` - ``failUnlessRaises(exc, cal)`` :meth:`assertRaises(exc, cal) - <unittest.TestCase.assertRaises>` - ``failUnlessAlmostEqual(a, b)`` :meth:`assertAlmostEqual(a, b) - <unittest.TestCase.assertAlmostEqual>` - ``assertAlmostEquals(a, b)`` :meth:`assertAlmostEqual(a, b) - <unittest.TestCase.assertAlmostEqual>` - ``failIfAlmostEqual(a, b)`` :meth:`assertNotAlmostEqual(a, b) - <unittest.TestCase.assertNotAlmostEqual>` - ``assertNotAlmostEquals(a, b)`` :meth:`assertNotAlmostEqual(a, b) - <unittest.TestCase.assertNotAlmostEqual>` - ================================ ========================================== - -.. 2to3fixer:: basestring - - Converts :class:`basestring` to :class:`str`. - -.. 2to3fixer:: buffer - - Converts :class:`buffer` to :class:`memoryview`. This fixer is optional - because the :class:`memoryview` API is similar but not exactly the same as - that of :class:`buffer`. - -.. 2to3fixer:: dict - - Fixes dictionary iteration methods. :meth:`dict.iteritems` is converted to - :meth:`dict.items`, :meth:`dict.iterkeys` to :meth:`dict.keys`, and - :meth:`dict.itervalues` to :meth:`dict.values`. Similarly, - :meth:`dict.viewitems`, :meth:`dict.viewkeys` and :meth:`dict.viewvalues` are - converted respectively to :meth:`dict.items`, :meth:`dict.keys` and - :meth:`dict.values`. It also wraps existing usages of :meth:`dict.items`, - :meth:`dict.keys`, and :meth:`dict.values` in a call to :class:`list`. - -.. 2to3fixer:: except - - Converts ``except X, T`` to ``except X as T``. - -.. 2to3fixer:: exec - - Converts the ``exec`` statement to the :func:`exec` function. - -.. 2to3fixer:: execfile - - Removes usage of :func:`execfile`. The argument to :func:`execfile` is - wrapped in calls to :func:`open`, :func:`compile`, and :func:`exec`. - -.. 2to3fixer:: exitfunc - - Changes assignment of :attr:`sys.exitfunc` to use of the :mod:`atexit` - module. - -.. 2to3fixer:: filter - - Wraps :func:`filter` usage in a :class:`list` call. - -.. 2to3fixer:: funcattrs - - Fixes function attributes that have been renamed. For example, - ``my_function.func_closure`` is converted to ``my_function.__closure__``. - -.. 2to3fixer:: future - - Removes ``from __future__ import new_feature`` statements. - -.. 2to3fixer:: getcwdu - - Renames :func:`os.getcwdu` to :func:`os.getcwd`. - -.. 2to3fixer:: has_key - - Changes ``dict.has_key(key)`` to ``key in dict``. - -.. 2to3fixer:: idioms - - This optional fixer performs several transformations that make Python code - more idiomatic. Type comparisons like ``type(x) is SomeClass`` and - ``type(x) == SomeClass`` are converted to ``isinstance(x, SomeClass)``. - ``while 1`` becomes ``while True``. This fixer also tries to make use of - :func:`sorted` in appropriate places. For example, this block :: - - L = list(some_iterable) - L.sort() - - is changed to :: - - L = sorted(some_iterable) - -.. 2to3fixer:: import - - Detects sibling imports and converts them to relative imports. - -.. 2to3fixer:: imports - - Handles module renames in the standard library. - -.. 2to3fixer:: imports2 - - Handles other modules renames in the standard library. It is separate from - the :2to3fixer:`imports` fixer only because of technical limitations. - -.. 2to3fixer:: input - - Converts ``input(prompt)`` to ``eval(input(prompt))``. - -.. 2to3fixer:: intern - - Converts :func:`intern` to :func:`sys.intern`. - -.. 2to3fixer:: isinstance - - Fixes duplicate types in the second argument of :func:`isinstance`. For - example, ``isinstance(x, (int, int))`` is converted to ``isinstance(x, - int)`` and ``isinstance(x, (int, float, int))`` is converted to - ``isinstance(x, (int, float))``. - -.. 2to3fixer:: itertools_imports - - Removes imports of :func:`itertools.ifilter`, :func:`itertools.izip`, and - :func:`itertools.imap`. Imports of :func:`itertools.ifilterfalse` are also - changed to :func:`itertools.filterfalse`. - -.. 2to3fixer:: itertools - - Changes usage of :func:`itertools.ifilter`, :func:`itertools.izip`, and - :func:`itertools.imap` to their built-in equivalents. - :func:`itertools.ifilterfalse` is changed to :func:`itertools.filterfalse`. - -.. 2to3fixer:: long - - Renames :class:`long` to :class:`int`. - -.. 2to3fixer:: map - - Wraps :func:`map` in a :class:`list` call. It also changes ``map(None, x)`` - to ``list(x)``. Using ``from future_builtins import map`` disables this - fixer. - -.. 2to3fixer:: metaclass - - Converts the old metaclass syntax (``__metaclass__ = Meta`` in the class - body) to the new (``class X(metaclass=Meta)``). - -.. 2to3fixer:: methodattrs - - Fixes old method attribute names. For example, ``meth.im_func`` is converted - to ``meth.__func__``. - -.. 2to3fixer:: ne - - Converts the old not-equal syntax, ``<>``, to ``!=``. - -.. 2to3fixer:: next - - Converts the use of iterator's :meth:`~iterator.next` methods to the - :func:`next` function. It also renames :meth:`next` methods to - :meth:`~iterator.__next__`. - -.. 2to3fixer:: nonzero - - Renames definitions of methods called :meth:`__nonzero__` - to :meth:`~object.__bool__`. - -.. 2to3fixer:: numliterals - - Converts octal literals into the new syntax. - -.. 2to3fixer:: operator - - Converts calls to various functions in the :mod:`operator` module to other, - but equivalent, function calls. When needed, the appropriate ``import`` - statements are added, e.g. ``import collections.abc``. The following mapping - are made: - - ================================== ============================================= - From To - ================================== ============================================= - ``operator.isCallable(obj)`` ``callable(obj)`` - ``operator.sequenceIncludes(obj)`` ``operator.contains(obj)`` - ``operator.isSequenceType(obj)`` ``isinstance(obj, collections.abc.Sequence)`` - ``operator.isMappingType(obj)`` ``isinstance(obj, collections.abc.Mapping)`` - ``operator.isNumberType(obj)`` ``isinstance(obj, numbers.Number)`` - ``operator.repeat(obj, n)`` ``operator.mul(obj, n)`` - ``operator.irepeat(obj, n)`` ``operator.imul(obj, n)`` - ================================== ============================================= - -.. 2to3fixer:: paren - - Add extra parenthesis where they are required in list comprehensions. For - example, ``[x for x in 1, 2]`` becomes ``[x for x in (1, 2)]``. - -.. 2to3fixer:: print - - Converts the ``print`` statement to the :func:`print` function. - -.. 2to3fixer:: raise - - Converts ``raise E, V`` to ``raise E(V)``, and ``raise E, V, T`` to ``raise - E(V).with_traceback(T)``. If ``E`` is a tuple, the translation will be - incorrect because substituting tuples for exceptions has been removed in 3.0. - -.. 2to3fixer:: raw_input - - Converts :func:`raw_input` to :func:`input`. - -.. 2to3fixer:: reduce - - Handles the move of :func:`reduce` to :func:`functools.reduce`. - -.. 2to3fixer:: reload - - Converts :func:`reload` to :func:`importlib.reload`. - -.. 2to3fixer:: renames - - Changes :data:`sys.maxint` to :data:`sys.maxsize`. - -.. 2to3fixer:: repr - - Replaces backtick repr with the :func:`repr` function. - -.. 2to3fixer:: set_literal - - Replaces use of the :class:`set` constructor with set literals. This fixer - is optional. - -.. 2to3fixer:: standarderror - - Renames :exc:`StandardError` to :exc:`Exception`. - -.. 2to3fixer:: sys_exc - - Changes the deprecated :data:`sys.exc_value`, :data:`sys.exc_type`, - :data:`sys.exc_traceback` to use :func:`sys.exc_info`. - -.. 2to3fixer:: throw - - Fixes the API change in generator's :meth:`throw` method. - -.. 2to3fixer:: tuple_params - - Removes implicit tuple parameter unpacking. This fixer inserts temporary - variables. - -.. 2to3fixer:: types - - Fixes code broken from the removal of some members in the :mod:`types` - module. - -.. 2to3fixer:: unicode - - Renames :class:`unicode` to :class:`str`. - -.. 2to3fixer:: urllib - - Handles the rename of :mod:`urllib` and :mod:`urllib2` to the :mod:`urllib` - package. - -.. 2to3fixer:: ws_comma - - Removes excess whitespace from comma separated items. This fixer is - optional. - -.. 2to3fixer:: xrange - - Renames :func:`xrange` to :func:`range` and wraps existing :func:`range` - calls with :class:`list`. - -.. 2to3fixer:: xreadlines - - Changes ``for x in file.xreadlines()`` to ``for x in file``. - -.. 2to3fixer:: zip - - Wraps :func:`zip` usage in a :class:`list` call. This is disabled when - ``from future_builtins import zip`` appears. - - -:mod:`lib2to3` --- 2to3's library ---------------------------------- - -.. module:: lib2to3 - :synopsis: The 2to3 library - -.. moduleauthor:: Guido van Rossum -.. moduleauthor:: Collin Winter -.. moduleauthor:: Benjamin Peterson <benjamin@python.org> - -**Source code:** :source:`Lib/lib2to3/` - --------------- - -.. deprecated-removed:: 3.11 3.13 - Python 3.9 switched to a PEG parser (see :pep:`617`) while lib2to3 is - using a less flexible LL(1) parser. Python 3.10 includes new language - syntax that is not parsable by lib2to3's LL(1) parser (see :pep:`634`). - The ``lib2to3`` module was marked pending for deprecation in Python 3.9 - (raising :exc:`PendingDeprecationWarning` on import) and fully deprecated - in Python 3.11 (raising :exc:`DeprecationWarning`). - It will be removed from the standard library in Python 3.13. - Consider third-party alternatives such as `LibCST`_ or `parso`_. - -.. note:: - - The :mod:`lib2to3` API should be considered unstable and may change - drastically in the future. - -.. _LibCST: https://libcst.readthedocs.io/ -.. _parso: https://parso.readthedocs.io/ diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 8bd23dae..1ebff440 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -1,5 +1,5 @@ -:mod:`__future__` --- Future statement definitions -================================================== +:mod:`!__future__` --- Future statement definitions +=================================================== .. module:: __future__ :synopsis: Future statement definitions @@ -8,56 +8,30 @@ -------------- -:mod:`__future__` is a real module, and serves three purposes: +Imports of the form ``from __future__ import feature`` are called +:ref:`future statements <future>`. These are special-cased by the Python compiler +to allow the use of new Python features in modules containing the future statement +before the release in which the feature becomes standard. + +While these future statements are given additional special meaning by the +Python compiler, they are still executed like any other import statement and +the :mod:`__future__` exists and is handled by the import system the same way +any other Python module would be. This design serves three purposes: * To avoid confusing existing tools that analyze import statements and expect to find the modules they're importing. -* To ensure that :ref:`future statements <future>` run under releases prior to - 2.1 at least yield runtime exceptions (the import of :mod:`__future__` will - fail, because there was no module of that name prior to 2.1). - * To document when incompatible changes were introduced, and when they will be --- or were --- made mandatory. This is a form of executable documentation, and can be inspected programmatically via importing :mod:`__future__` and examining its contents. -Each statement in :file:`__future__.py` is of the form:: - - FeatureName = _Feature(OptionalRelease, MandatoryRelease, - CompilerFlag) - - -where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are -5-tuples of the same form as :data:`sys.version_info`:: - - (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int - PY_MINOR_VERSION, # the 1; an int - PY_MICRO_VERSION, # the 0; an int - PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string - PY_RELEASE_SERIAL # the 3; an int - ) - -*OptionalRelease* records the first release in which the feature was accepted. - -In the case of a *MandatoryRelease* that has not yet occurred, -*MandatoryRelease* predicts the release in which the feature will become part of -the language. - -Else *MandatoryRelease* records when the feature became part of the language; in -releases at or after that, modules no longer need a future statement to use the -feature in question, but may continue to use such imports. - -*MandatoryRelease* may also be ``None``, meaning that a planned feature got -dropped. - -Instances of class :class:`_Feature` have two corresponding methods, -:meth:`getOptionalRelease` and :meth:`getMandatoryRelease`. +* To ensure that :ref:`future statements <future>` run under releases prior to + Python 2.1 at least yield runtime exceptions (the import of :mod:`__future__` + will fail, because there was no module of that name prior to 2.1). -*CompilerFlag* is the (bitfield) flag that should be passed in the fourth -argument to the built-in function :func:`compile` to enable the feature in -dynamically compiled code. This flag is stored in the :attr:`compiler_flag` -attribute on :class:`_Feature` instances. +Module Contents +--------------- No feature description will ever be deleted from :mod:`__future__`. Since its introduction in Python 2.1 the following features have found their way into the @@ -96,6 +70,49 @@ language using this mechanism: .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. +.. _future-classes: + +.. class:: _Feature + + Each statement in :file:`__future__.py` is of the form:: + + FeatureName = _Feature(OptionalRelease, MandatoryRelease, + CompilerFlag) + + where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are + 5-tuples of the same form as :data:`sys.version_info`:: + + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) + +.. method:: _Feature.getOptionalRelease() + + *OptionalRelease* records the first release in which the feature was accepted. + +.. method:: _Feature.getMandatoryRelease() + + In the case of a *MandatoryRelease* that has not yet occurred, + *MandatoryRelease* predicts the release in which the feature will become part of + the language. + + Else *MandatoryRelease* records when the feature became part of the language; in + releases at or after that, modules no longer need a future statement to use the + feature in question, but may continue to use such imports. + + *MandatoryRelease* may also be ``None``, meaning that a planned feature got + dropped or that it is not yet decided. + +.. attribute:: _Feature.compiler_flag + + *CompilerFlag* is the (bitfield) flag that should be passed in the fourth + argument to the built-in function :func:`compile` to enable the feature in + dynamically compiled code. This flag is stored in the :attr:`_Feature.compiler_flag` + attribute on :class:`_Feature` instances. + .. [1] ``from __future__ import annotations`` was previously scheduled to become mandatory in Python 3.10, but the Python Steering Council @@ -109,3 +126,6 @@ language using this mechanism: :ref:`future` How the compiler treats future imports. + + :pep:`236` - Back to the __future__ + The original proposal for the __future__ mechanism. diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst index d378e40b..647ff9da 100644 --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -1,5 +1,5 @@ -:mod:`__main__` --- Top-level code environment -============================================== +:mod:`!__main__` --- Top-level code environment +=============================================== .. module:: __main__ :synopsis: The environment where top-level code is run. Covers command-line @@ -54,45 +54,45 @@ The top-level code environment can be: * the scope of an interactive prompt:: - >>> __name__ - '__main__' + >>> __name__ + '__main__' * the Python module passed to the Python interpreter as a file argument: - .. code-block:: shell-session + .. code-block:: shell-session - $ python helloworld.py - Hello, world! + $ python helloworld.py + Hello, world! * the Python module or package passed to the Python interpreter with the :option:`-m` argument: - .. code-block:: shell-session + .. code-block:: shell-session - $ python -m tarfile - usage: tarfile.py [-h] [-v] (...) + $ python -m tarfile + usage: tarfile.py [-h] [-v] (...) * Python code read by the Python interpreter from standard input: - .. code-block:: shell-session + .. code-block:: shell-session - $ echo "import this" | python - The Zen of Python, by Tim Peters + $ echo "import this" | python + The Zen of Python, by Tim Peters - Beautiful is better than ugly. - Explicit is better than implicit. - ... + Beautiful is better than ugly. + Explicit is better than implicit. + ... * Python code passed to the Python interpreter with the :option:`-c` argument: - .. code-block:: shell-session + .. code-block:: shell-session - $ python -c "import this" - The Zen of Python, by Tim Peters + $ python -c "import this" + The Zen of Python, by Tim Peters - Beautiful is better than ugly. - Explicit is better than implicit. - ... + Beautiful is better than ugly. + Explicit is better than implicit. + ... In each of these situations, the top-level module's ``__name__`` is set to ``'__main__'``. @@ -102,9 +102,9 @@ top-level environment by checking its own ``__name__``, which allows a common idiom for conditionally executing code when the module is not initialized from an import statement:: - if __name__ == '__main__': - # Execute when the module is not initialized from an import statement. - ... + if __name__ == '__main__': + # Execute when the module is not initialized from an import statement. + ... .. seealso:: @@ -227,7 +227,7 @@ students:: import sys from .student import search_students - student_name = sys.argv[2] if len(sys.argv) >= 2 else '' + student_name = sys.argv[1] if len(sys.argv) >= 2 else '' print(f'Found student: {search_students(student_name)}') Note that ``from .student import search_students`` is an example of a relative @@ -251,9 +251,9 @@ attribute will include the package's path if imported:: >>> asyncio.__main__.__name__ 'asyncio.__main__' -This won't work for ``__main__.py`` files in the root directory of a .zip file -though. Hence, for consistency, minimal ``__main__.py`` like the :mod:`venv` -one mentioned below are preferred. +This won't work for ``__main__.py`` files in the root directory of a +``.zip`` file though. Hence, for consistency, a minimal ``__main__.py`` +without a ``__name__`` check is preferred. .. seealso:: diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 0442c298..6a66fc4c 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -1,5 +1,5 @@ -:mod:`_thread` --- Low-level threading API -========================================== +:mod:`!_thread` --- Low-level threading API +=========================================== .. module:: _thread :synopsis: Low-level threading API. @@ -120,10 +120,13 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD. .. versionadded:: 3.8 + .. versionchanged:: 3.13 + Added support for GNU/kFreeBSD. + .. function:: stack_size([size]) @@ -166,14 +169,14 @@ Lock objects have the following methods: time can acquire a lock --- that's their reason for existence). If the *blocking* argument is present, the action depends on its - value: if it is False, the lock is only acquired if it can be acquired - immediately without waiting, while if it is True, the lock is acquired + value: if it is false, the lock is only acquired if it can be acquired + immediately without waiting, while if it is true, the lock is acquired unconditionally as above. If the floating-point *timeout* argument is present and positive, it specifies the maximum wait time in seconds before returning. A negative *timeout* argument specifies an unbounded wait. You cannot specify - a *timeout* if *blocking* is False. + a *timeout* if *blocking* is false. The return value is ``True`` if the lock is acquired successfully, ``False`` if not. @@ -208,25 +211,22 @@ In addition to these methods, lock objects can also be used via the **Caveats:** - .. index:: pair: module; signal +.. index:: pair: module; signal -* Threads interact strangely with interrupts: the :exc:`KeyboardInterrupt` - exception will be received by an arbitrary thread. (When the :mod:`signal` - module is available, interrupts always go to the main thread.) +* Interrupts always go to the main thread (the :exc:`KeyboardInterrupt` + exception will be received by that thread.) * Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is equivalent to calling :func:`_thread.exit`. -* It is not possible to interrupt the :meth:`~threading.Lock.acquire` method on - a lock --- the :exc:`KeyboardInterrupt` exception will happen after the lock - has been acquired. +* It is platform-dependent whether the :meth:`~threading.Lock.acquire` method + on a lock can be interrupted (so that the :exc:`KeyboardInterrupt` exception + will happen immediately, rather than only after the lock has been acquired or + the operation has timed out). It can be interrupted on POSIX, but not on + Windows. * When the main thread exits, it is system defined whether the other threads survive. On most systems, they are killed without executing :keyword:`try` ... :keyword:`finally` clauses or executing object destructors. -* When the main thread exits, it does not do any of its usual cleanup (except - that :keyword:`try` ... :keyword:`finally` clauses are honored), and the - standard I/O files are not flushed. - diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 274b2d69..38d744e9 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -1,5 +1,5 @@ -:mod:`abc` --- Abstract Base Classes -==================================== +:mod:`!abc` --- Abstract Base Classes +===================================== .. module:: abc :synopsis: Abstract base classes according to :pep:`3119`. @@ -21,7 +21,7 @@ The :mod:`collections` module has some concrete classes that derive from ABCs; these can, of course, be further derived. In addition, the :mod:`collections.abc` submodule has some ABCs that can be used to test whether a class or instance provides a particular interface, for example, if it is -:term:`hashable` or if it is a mapping. +:term:`hashable` or if it is a :term:`mapping`. This module provides the metaclass :class:`ABCMeta` for defining ABCs and @@ -30,7 +30,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: .. class:: ABC A helper class that has :class:`ABCMeta` as its metaclass. With this class, - an abstract base class can be created by simply deriving from :class:`ABC` + an abstract base class can be created by simply deriving from :class:`!ABC` avoiding sometimes confusing metaclass usage, for example:: from abc import ABC @@ -38,11 +38,11 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: class MyABC(ABC): pass - Note that the type of :class:`ABC` is still :class:`ABCMeta`, therefore - inheriting from :class:`ABC` requires the usual precautions regarding + Note that the type of :class:`!ABC` is still :class:`ABCMeta`, therefore + inheriting from :class:`!ABC` requires the usual precautions regarding metaclass usage, as multiple inheritance may lead to metaclass conflicts. One may also define an abstract base class by passing the metaclass - keyword and using :class:`ABCMeta` directly, for example:: + keyword and using :class:`!ABCMeta` directly, for example:: from abc import ABCMeta @@ -65,7 +65,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: implementations defined by the registering ABC be callable (not even via :func:`super`). [#]_ - Classes created with a metaclass of :class:`ABCMeta` have the following method: + Classes created with a metaclass of :class:`!ABCMeta` have the following method: .. method:: register(subclass) @@ -86,7 +86,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: Returns the registered subclass, to allow usage as a class decorator. .. versionchanged:: 3.4 - To detect calls to :meth:`register`, you can use the + To detect calls to :meth:`!register`, you can use the :func:`get_cache_token` function. You can also override this method in an abstract base class: @@ -96,16 +96,16 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: (Must be defined as a class method.) Check whether *subclass* is considered a subclass of this ABC. This means - that you can customize the behavior of ``issubclass`` further without the + that you can customize the behavior of :func:`issubclass` further without the need to call :meth:`register` on every class you want to consider a subclass of the ABC. (This class method is called from the - :meth:`__subclasscheck__` method of the ABC.) + :meth:`~type.__subclasscheck__` method of the ABC.) - This method should return ``True``, ``False`` or ``NotImplemented``. If + This method should return ``True``, ``False`` or :data:`NotImplemented`. If it returns ``True``, the *subclass* is considered a subclass of this ABC. If it returns ``False``, the *subclass* is not considered a subclass of this ABC, even if it would normally be one. If it returns - ``NotImplemented``, the subclass check is continued with the usual + :data:`!NotImplemented`, the subclass check is continued with the usual mechanism. .. XXX explain the "usual mechanism" @@ -142,25 +142,25 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: The ABC ``MyIterable`` defines the standard iterable method, :meth:`~iterator.__iter__`, as an abstract method. The implementation given - here can still be called from subclasses. The :meth:`get_iterator` method + here can still be called from subclasses. The :meth:`!get_iterator` method is also part of the ``MyIterable`` abstract base class, but it does not have to be overridden in non-abstract derived classes. The :meth:`__subclasshook__` class method defined here says that any class that has an :meth:`~iterator.__iter__` method in its :attr:`~object.__dict__` (or in that of one of its base classes, accessed - via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. + via the :attr:`~type.__mro__` list) is considered a ``MyIterable`` too. Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, even though it does not define an :meth:`~iterator.__iter__` method (it uses - the old-style iterable protocol, defined in terms of :meth:`__len__` and - :meth:`__getitem__`). Note that this will not make ``get_iterator`` + the old-style iterable protocol, defined in terms of :meth:`~object.__len__` and + :meth:`~object.__getitem__`). Note that this will not make ``get_iterator`` available as a method of ``Foo``, so it is provided separately. -The :mod:`abc` module also provides the following decorator: +The :mod:`!abc` module also provides the following decorator: .. decorator:: abstractmethod @@ -168,19 +168,19 @@ The :mod:`abc` module also provides the following decorator: Using this decorator requires that the class's metaclass is :class:`ABCMeta` or is derived from it. A class that has a metaclass derived from - :class:`ABCMeta` cannot be instantiated unless all of its abstract methods + :class:`!ABCMeta` cannot be instantiated unless all of its abstract methods and properties are overridden. The abstract methods can be called using any - of the normal 'super' call mechanisms. :func:`abstractmethod` may be used + of the normal 'super' call mechanisms. :func:`!abstractmethod` may be used to declare abstract methods for properties and descriptors. Dynamically adding abstract methods to a class, or attempting to modify the abstraction status of a method or class once it is created, are only supported using the :func:`update_abstractmethods` function. The - :func:`abstractmethod` only affects subclasses derived using regular - inheritance; "virtual subclasses" registered with the ABC's :meth:`register` - method are not affected. + :func:`!abstractmethod` only affects subclasses derived using regular + inheritance; "virtual subclasses" registered with the ABC's + :meth:`~ABCMeta.register` method are not affected. - When :func:`abstractmethod` is applied in combination with other method + When :func:`!abstractmethod` is applied in combination with other method descriptors, it should be applied as the innermost decorator, as shown in the following usage examples:: @@ -216,7 +216,7 @@ The :mod:`abc` module also provides the following decorator: In order to correctly interoperate with the abstract base class machinery, the descriptor must identify itself as abstract using - :attr:`__isabstractmethod__`. In general, this attribute should be ``True`` + :attr:`!__isabstractmethod__`. In general, this attribute should be ``True`` if any of the methods used to compose the descriptor are abstract. For example, Python's built-in :class:`property` does the equivalent of:: @@ -236,7 +236,7 @@ The :mod:`abc` module also provides the following decorator: super-call in a framework that uses cooperative multiple-inheritance. -The :mod:`abc` module also supports the following legacy decorators: +The :mod:`!abc` module also supports the following legacy decorators: .. decorator:: abstractclassmethod @@ -323,7 +323,7 @@ The :mod:`abc` module also supports the following legacy decorators: ... -The :mod:`abc` module also provides the following functions: +The :mod:`!abc` module also provides the following functions: .. function:: get_cache_token() diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index 9f20a301..a756d679 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -1,247 +1,15 @@ -:mod:`aifc` --- Read and write AIFF and AIFC files -================================================== +:mod:`!aifc` --- Read and write AIFF and AIFC files +=================================================== .. module:: aifc - :synopsis: Read and write audio files in AIFF or AIFC format. + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/aifc.py` - -.. index:: - single: Audio Interchange File Format - single: AIFF - single: AIFF-C - - .. deprecated-removed:: 3.11 3.13 - The :mod:`aifc` module is deprecated - (see :pep:`PEP 594 <594#aifc>` for details). - --------------- - -This module provides support for reading and writing AIFF and AIFF-C files. -AIFF is Audio Interchange File Format, a format for storing digital audio -samples in a file. AIFF-C is a newer version of the format that includes the -ability to compress the audio data. - -Audio files have a number of parameters that describe the audio data. The -sampling rate or frame rate is the number of times per second the sound is -sampled. The number of channels indicate if the audio is mono, stereo, or -quadro. Each frame consists of one sample per channel. The sample size is the -size in bytes of each sample. Thus a frame consists of -``nchannels * samplesize`` bytes, and a second's worth of audio consists of -``nchannels * samplesize * framerate`` bytes. - -For example, CD quality audio has a sample size of two bytes (16 bits), uses two -channels (stereo) and has a frame rate of 44,100 frames/second. This gives a -frame size of 4 bytes (2\*2), and a second's worth occupies 2\*2\*44100 bytes -(176,400 bytes). - -Module :mod:`aifc` defines the following function: - - -.. function:: open(file, mode=None) - - Open an AIFF or AIFF-C file and return an object instance with methods that are - described below. The argument *file* is either a string naming a file or a - :term:`file object`. *mode* must be ``'r'`` or ``'rb'`` when the file must be - opened for reading, or ``'w'`` or ``'wb'`` when the file must be opened for writing. - If omitted, ``file.mode`` is used if it exists, otherwise ``'rb'`` is used. When - used for writing, the file object should be seekable, unless you know ahead of - time how many samples you are going to write in total and use - :meth:`writeframesraw` and :meth:`setnframes`. - The :func:`.open` function may be used in a :keyword:`with` statement. When - the :keyword:`!with` block completes, the :meth:`~aifc.close` method is called. - - .. versionchanged:: 3.4 - Support for the :keyword:`with` statement was added. - -Objects returned by :func:`.open` when a file is opened for reading have the -following methods: - - -.. method:: aifc.getnchannels() - - Return the number of audio channels (1 for mono, 2 for stereo). - - -.. method:: aifc.getsampwidth() - - Return the size in bytes of individual samples. - - -.. method:: aifc.getframerate() - - Return the sampling rate (number of audio frames per second). - - -.. method:: aifc.getnframes() - - Return the number of audio frames in the file. - - -.. method:: aifc.getcomptype() - - Return a bytes array of length 4 describing the type of compression - used in the audio file. For AIFF files, the returned value is - ``b'NONE'``. - - -.. method:: aifc.getcompname() - - Return a bytes array convertible to a human-readable description - of the type of compression used in the audio file. For AIFF files, - the returned value is ``b'not compressed'``. - - -.. method:: aifc.getparams() - - Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth, - framerate, nframes, comptype, compname)``, equivalent to output of the - :meth:`get\*` methods. - - -.. method:: aifc.getmarkers() - - Return a list of markers in the audio file. A marker consists of a tuple of - three elements. The first is the mark ID (an integer), the second is the mark - position in frames from the beginning of the data (an integer), the third is the - name of the mark (a string). - - -.. method:: aifc.getmark(id) - - Return the tuple as described in :meth:`getmarkers` for the mark with the given - *id*. - - -.. method:: aifc.readframes(nframes) - - Read and return the next *nframes* frames from the audio file. The returned - data is a string containing for each frame the uncompressed samples of all - channels. - - -.. method:: aifc.rewind() - - Rewind the read pointer. The next :meth:`readframes` will start from the - beginning. - - -.. method:: aifc.setpos(pos) - - Seek to the specified frame number. - - -.. method:: aifc.tell() - - Return the current frame number. - - -.. method:: aifc.close() - - Close the AIFF file. After calling this method, the object can no longer be - used. - -Objects returned by :func:`.open` when a file is opened for writing have all the -above methods, except for :meth:`readframes` and :meth:`setpos`. In addition -the following methods exist. The :meth:`get\*` methods can only be called after -the corresponding :meth:`set\*` methods have been called. Before the first -:meth:`writeframes` or :meth:`writeframesraw`, all parameters except for the -number of frames must be filled in. - - -.. method:: aifc.aiff() - - Create an AIFF file. The default is that an AIFF-C file is created, unless the - name of the file ends in ``'.aiff'`` in which case the default is an AIFF file. - - -.. method:: aifc.aifc() - - Create an AIFF-C file. The default is that an AIFF-C file is created, unless - the name of the file ends in ``'.aiff'`` in which case the default is an AIFF - file. - - -.. method:: aifc.setnchannels(nchannels) - - Specify the number of channels in the audio file. - - -.. method:: aifc.setsampwidth(width) - - Specify the size in bytes of audio samples. - - -.. method:: aifc.setframerate(rate) - - Specify the sampling frequency in frames per second. - - -.. method:: aifc.setnframes(nframes) - - Specify the number of frames that are to be written to the audio file. If this - parameter is not set, or not set correctly, the file needs to support seeking. - - -.. method:: aifc.setcomptype(type, name) - - .. index:: - single: u-LAW - single: A-LAW - single: G.722 - - Specify the compression type. If not specified, the audio data will - not be compressed. In AIFF files, compression is not possible. - The name parameter should be a human-readable description of the - compression type as a bytes array, the type parameter should be a - bytes array of length 4. Currently the following compression types - are supported: ``b'NONE'``, ``b'ULAW'``, ``b'ALAW'``, ``b'G722'``. - - -.. method:: aifc.setparams(nchannels, sampwidth, framerate, comptype, compname) - - Set all the above parameters at once. The argument is a tuple consisting of the - various parameters. This means that it is possible to use the result of a - :meth:`getparams` call as argument to :meth:`setparams`. - - -.. method:: aifc.setmark(id, pos, name) - - Add a mark with the given id (larger than 0), and the given name at the given - position. This method can be called at any time before :meth:`close`. - - -.. method:: aifc.tell() - :noindex: - - Return the current write position in the output file. Useful in combination - with :meth:`setmark`. - - -.. method:: aifc.writeframes(data) - - Write data to the output file. This method can only be called after the audio - file parameters have been set. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: aifc.writeframesraw(data) - - Like :meth:`writeframes`, except that the header of the audio file is not - updated. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: aifc.close() - :noindex: - Close the AIFF file. The header of the file is updated to reflect the actual - size of the audio data. After calling this method, the object can no longer be - used. +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 <whatsnew313-pep594>` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!aifc` module was +`Python 3.12 <https://docs.python.org/3.12/library/aifc.html>`_. diff --git a/Doc/library/allos.rst b/Doc/library/allos.rst index f7105d8a..0223c105 100644 --- a/Doc/library/allos.rst +++ b/Doc/library/allos.rst @@ -16,7 +16,6 @@ but they are available on most other systems as well. Here's an overview: io.rst time.rst argparse.rst - getopt.rst logging.rst logging.config.rst logging.handlers.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index fbffa71d..e0022121 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1,5 +1,5 @@ -:mod:`argparse` --- Parser for command-line options, arguments and sub-commands -=============================================================================== +:mod:`!argparse` --- Parser for command-line options, arguments and subcommands +================================================================================ .. module:: argparse :synopsis: Command-line option and argument parsing library. @@ -19,17 +19,13 @@ introduction to Python command-line parsing, have a look at the :ref:`argparse tutorial <argparse-tutorial>`. -The :mod:`argparse` module makes it easy to write user-friendly command-line -interfaces. The program defines what arguments it requires, and :mod:`argparse` -will figure out how to parse those out of :data:`sys.argv`. The :mod:`argparse` +The :mod:`!argparse` module makes it easy to write user-friendly command-line +interfaces. The program defines what arguments it requires, and :mod:`!argparse` +will figure out how to parse those out of :data:`sys.argv`. The :mod:`!argparse` module also automatically generates help and usage messages. The module will also issue errors when users give the program invalid arguments. - -Core Functionality ------------------- - -The :mod:`argparse` module's support for command-line interfaces is built +The :mod:`!argparse` module's support for command-line interfaces is built around an instance of :class:`argparse.ArgumentParser`. It is a container for argument specifications and has options that apply to the parser as whole:: @@ -53,133 +49,9 @@ the extracted data in a :class:`argparse.Namespace` object:: args = parser.parse_args() print(args.filename, args.count, args.verbose) - -Quick Links for add_argument() ------------------------------- - -============================ =========================================================== ========================================================================================================================== -Name Description Values -============================ =========================================================== ========================================================================================================================== -action_ Specify how an argument should be handled ``'store'``, ``'store_const'``, ``'store_true'``, ``'append'``, ``'append_const'``, ``'count'``, ``'help'``, ``'version'`` -choices_ Limit values to a specific set of choices ``['foo', 'bar']``, ``range(1, 10)``, or :class:`~collections.abc.Container` instance -const_ Store a constant value -default_ Default value used when an argument is not provided Defaults to ``None`` -dest_ Specify the attribute name used in the result namespace -help_ Help message for an argument -metavar_ Alternate display name for the argument as shown in help -nargs_ Number of times the argument can be used :class:`int`, ``'?'``, ``'*'``, or ``'+'`` -required_ Indicate whether an argument is required or optional ``True`` or ``False`` -:ref:`type <argparse-type>` Automatically convert an argument to the given type :class:`int`, :class:`float`, ``argparse.FileType('w')``, or callable function -============================ =========================================================== ========================================================================================================================== - - -Example -------- - -The following code is a Python program that takes a list of integers and -produces either the sum or the max:: - - import argparse - - parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument('integers', metavar='N', type=int, nargs='+', - help='an integer for the accumulator') - parser.add_argument('--sum', dest='accumulate', action='store_const', - const=sum, default=max, - help='sum the integers (default: find the max)') - - args = parser.parse_args() - print(args.accumulate(args.integers)) - -Assuming the above Python code is saved into a file called ``prog.py``, it can -be run at the command line and it provides useful help messages: - -.. code-block:: shell-session - - $ python prog.py -h - usage: prog.py [-h] [--sum] N [N ...] - - Process some integers. - - positional arguments: - N an integer for the accumulator - - options: - -h, --help show this help message and exit - --sum sum the integers (default: find the max) - -When run with the appropriate arguments, it prints either the sum or the max of -the command-line integers: - -.. code-block:: shell-session - - $ python prog.py 1 2 3 4 - 4 - - $ python prog.py 1 2 3 4 --sum - 10 - -If invalid arguments are passed in, an error will be displayed: - -.. code-block:: shell-session - - $ python prog.py a b c - usage: prog.py [-h] [--sum] N [N ...] - prog.py: error: argument N: invalid int value: 'a' - -The following sections walk you through this example. - - -Creating a parser -^^^^^^^^^^^^^^^^^ - -The first step in using the :mod:`argparse` is creating an -:class:`ArgumentParser` object:: - - >>> parser = argparse.ArgumentParser(description='Process some integers.') - -The :class:`ArgumentParser` object will hold all the information necessary to -parse the command line into Python data types. - - -Adding arguments -^^^^^^^^^^^^^^^^ - -Filling an :class:`ArgumentParser` with information about program arguments is -done by making calls to the :meth:`~ArgumentParser.add_argument` method. -Generally, these calls tell the :class:`ArgumentParser` how to take the strings -on the command line and turn them into objects. This information is stored and -used when :meth:`~ArgumentParser.parse_args` is called. For example:: - - >>> parser.add_argument('integers', metavar='N', type=int, nargs='+', - ... help='an integer for the accumulator') - >>> parser.add_argument('--sum', dest='accumulate', action='store_const', - ... const=sum, default=max, - ... help='sum the integers (default: find the max)') - -Later, calling :meth:`~ArgumentParser.parse_args` will return an object with -two attributes, ``integers`` and ``accumulate``. The ``integers`` attribute -will be a list of one or more integers, and the ``accumulate`` attribute will be -either the :func:`sum` function, if ``--sum`` was specified at the command line, -or the :func:`max` function if it was not. - - -Parsing arguments -^^^^^^^^^^^^^^^^^ - -:class:`ArgumentParser` parses arguments through the -:meth:`~ArgumentParser.parse_args` method. This will inspect the command line, -convert each argument to the appropriate type and then invoke the appropriate action. -In most cases, this means a simple :class:`Namespace` object will be built up from -attributes parsed out of the command line:: - - >>> parser.parse_args(['--sum', '7', '-1', '42']) - Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42]) - -In a script, :meth:`~ArgumentParser.parse_args` will typically be called with no -arguments, and the :class:`ArgumentParser` will automatically determine the -command-line arguments from :data:`sys.argv`. - +.. note:: + If you're looking for a guide about how to upgrade :mod:`optparse` code + to :mod:`!argparse`, see :ref:`Upgrading Optparse Code <upgrading-optparse-code>`. ArgumentParser objects ---------------------- @@ -228,7 +100,7 @@ ArgumentParser objects * allow_abbrev_ - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: ``True``) - * exit_on_error_ - Determines whether or not ArgumentParser exits with + * exit_on_error_ - Determines whether or not :class:`!ArgumentParser` exits with error info when an error occurs. (default: ``True``) .. versionchanged:: 3.5 @@ -249,38 +121,21 @@ The following sections describe how each of these are used. prog ^^^^ -By default, :class:`ArgumentParser` objects use ``sys.argv[0]`` to determine -how to display the name of the program in help messages. This default is almost -always desirable because it will make the help messages match how the program was -invoked on the command line. For example, consider a file named -``myprogram.py`` with the following code:: - - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--foo', help='foo help') - args = parser.parse_args() -The help for this program will display ``myprogram.py`` as the program name -(regardless of where the program was invoked from): +By default, :class:`ArgumentParser` calculates the name of the program +to display in help messages depending on the way the Python interpreter was run: -.. code-block:: shell-session +* The :func:`base name <os.path.basename>` of ``sys.argv[0]`` if a file was + passed as argument. +* The Python interpreter name followed by ``sys.argv[0]`` if a directory or + a zipfile was passed as argument. +* The Python interpreter name followed by ``-m`` followed by the + module or package name if the :option:`-m` option was used. - $ python myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] - - options: - -h, --help show this help message and exit - --foo FOO foo help - $ cd .. - $ python subdir/myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] - - options: - -h, --help show this help message and exit - --foo FOO foo help - -To change this default behavior, another value can be supplied using the -``prog=`` argument to :class:`ArgumentParser`:: +This default is almost always desirable because it will make the help messages +match the string that was used to invoke the program on the command line. +However, to change this default behavior, another value can be supplied using +the ``prog=`` argument to :class:`ArgumentParser`:: >>> parser = argparse.ArgumentParser(prog='myprogram') >>> parser.print_help() @@ -309,22 +164,8 @@ usage ^^^^^ By default, :class:`ArgumentParser` calculates the usage message from the -arguments it contains:: - - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('--foo', nargs='?', help='foo help') - >>> parser.add_argument('bar', nargs='+', help='bar help') - >>> parser.print_help() - usage: PROG [-h] [--foo [FOO]] bar [bar ...] - - positional arguments: - bar bar help - - options: - -h, --help show this help message and exit - --foo [FOO] foo help - -The default message can be overridden with the ``usage=`` keyword argument:: +arguments it contains. The default message can be overridden with the +``usage=`` keyword argument:: >>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]') >>> parser.add_argument('--foo', nargs='?', help='foo help') @@ -352,16 +193,7 @@ Most calls to the :class:`ArgumentParser` constructor will use the ``description=`` keyword argument. This argument gives a brief description of what the program does and how it works. In help messages, the description is displayed between the command-line usage string and the help messages for the -various arguments:: - - >>> parser = argparse.ArgumentParser(description='A foo that bars') - >>> parser.print_help() - usage: argparse.py [-h] - - A foo that bars - - options: - -h, --help show this help message and exit +various arguments. By default, the description will be line-wrapped so that it fits within the given space. To change this behavior, see the formatter_class_ argument. @@ -491,7 +323,7 @@ should not be line-wrapped:: -h, --help show this help message and exit :class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text, -including argument descriptions. However, multiple new lines are replaced with +including argument descriptions. However, multiple newlines are replaced with one. If you wish to preserve multiple blank lines, add spaces between the newlines. @@ -540,7 +372,7 @@ Most command-line options will use ``-`` as the prefix, e.g. ``-f/--foo``. Parsers that need to support different or additional prefix characters, e.g. for options like ``+f`` or ``/foo``, may specify them using the ``prefix_chars=`` argument -to the ArgumentParser constructor:: +to the :class:`ArgumentParser` constructor:: >>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+') >>> parser.add_argument('+f') @@ -585,8 +417,8 @@ arguments will never be treated as file references. .. versionchanged:: 3.12 :class:`ArgumentParser` changed encoding and errors to read arguments files - from default (e.g. :func:`locale.getpreferredencoding(False) <locale.getpreferredencoding>` and - ``"strict"``) to :term:`filesystem encoding and error handler`. + from default (e.g. :func:`locale.getpreferredencoding(False) <locale.getpreferredencoding>` + and ``"strict"``) to the :term:`filesystem encoding and error handler`. Arguments file should be encoded in UTF-8 instead of ANSI Codepage on Windows. @@ -671,26 +503,9 @@ string was overridden. add_help ^^^^^^^^ -By default, ArgumentParser objects add an option which simply displays -the parser's help message. For example, consider a file named -``myprogram.py`` containing the following code:: - - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--foo', help='foo help') - args = parser.parse_args() - -If ``-h`` or ``--help`` is supplied at the command line, the ArgumentParser -help will be printed: - -.. code-block:: shell-session - - $ python myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] - - options: - -h, --help show this help message and exit - --foo FOO foo help +By default, :class:`ArgumentParser` objects add an option which simply displays +the parser's help message. If ``-h`` or ``--help`` is supplied at the command +line, the :class:`!ArgumentParser` help will be printed. Occasionally, it may be useful to disable the addition of this help option. This can be achieved by passing ``False`` as the ``add_help=`` argument to @@ -722,7 +537,8 @@ exit_on_error ^^^^^^^^^^^^^ Normally, when you pass an invalid argument list to the :meth:`~ArgumentParser.parse_args` -method of an :class:`ArgumentParser`, it will exit with error info. +method of an :class:`ArgumentParser`, it will print a *message* to :data:`sys.stderr` and exit with a status +code of 2. If the user would like to catch errors manually, the feature can be enabled by setting ``exit_on_error`` to ``False``:: @@ -743,15 +559,15 @@ If the user would like to catch errors manually, the feature can be enabled by s The add_argument() method ------------------------- -.. method:: ArgumentParser.add_argument(name or flags..., [action], [nargs], \ +.. method:: ArgumentParser.add_argument(name or flags..., *, [action], [nargs], \ [const], [default], [type], [choices], [required], \ - [help], [metavar], [dest]) + [help], [metavar], [dest], [deprecated]) Define how a single command-line argument should be parsed. Each parameter has its own more detailed description below, but in short they are: - * `name or flags`_ - Either a name or a list of option strings, e.g. ``foo`` - or ``-f, --foo``. + * `name or flags`_ - Either a name or a list of option strings, e.g. ``'foo'`` + or ``'-f', '--foo'``. * action_ - The basic type of action to be taken when this argument is encountered at the command line. @@ -777,10 +593,12 @@ The add_argument() method * dest_ - The name of the attribute to be added to the object returned by :meth:`parse_args`. + * deprecated_ - Whether or not use of the argument is deprecated. + The following sections describe how each of these are used. -.. _name_or_flags: +.. _`name or flags`: name or flags ^^^^^^^^^^^^^ @@ -827,12 +645,7 @@ them, though most actions simply add an attribute to the object returned by how the command-line arguments should be handled. The supplied actions are: * ``'store'`` - This just stores the argument's value. This is the default - action. For example:: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.parse_args('--foo 1'.split()) - Namespace(foo='1') + action. * ``'store_const'`` - This stores the value specified by the const_ keyword argument; note that the const_ keyword argument defaults to ``None``. The @@ -847,7 +660,7 @@ how the command-line arguments should be handled. The supplied actions are: * ``'store_true'`` and ``'store_false'`` - These are special cases of ``'store_const'`` used for storing the values ``True`` and ``False`` respectively. In addition, they create default values of ``False`` and - ``True`` respectively. For example:: + ``True`` respectively:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') @@ -879,6 +692,21 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args('--str --int'.split()) Namespace(types=[<class 'str'>, <class 'int'>]) +* ``'extend'`` - This stores a list and appends each item from the multi-value + argument list to it. + The ``'extend'`` action is typically used with the nargs_ keyword argument + value ``'+'`` or ``'*'``. + Note that when nargs_ is ``None`` (the default) or ``'?'``, each + character of the argument string will be appended to the list. + Example usage:: + + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) + >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) + Namespace(foo=['f1', 'f2', 'f3', 'f4']) + + .. versionadded:: 3.8 + * ``'count'`` - This counts the number of times a keyword argument occurs. For example, this is useful for increasing verbosity levels:: @@ -904,33 +732,28 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args(['--version']) PROG 2.0 -* ``'extend'`` - This stores a list, and extends each argument value to the - list. - Example usage:: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) - >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) - Namespace(foo=['f1', 'f2', 'f3', 'f4']) +Only actions that consume command-line arguments (e.g. ``'store'``, +``'append'`` or ``'extend'``) can be used with positional arguments. - .. versionadded:: 3.8 +.. class:: BooleanOptionalAction -You may also specify an arbitrary action by passing an Action subclass or -other object that implements the same interface. The ``BooleanOptionalAction`` -is available in ``argparse`` and adds support for boolean actions such as -``--foo`` and ``--no-foo``:: + You may also specify an arbitrary action by passing an :class:`Action` subclass or + other object that implements the same interface. The :class:`!BooleanOptionalAction` + is available in :mod:`!argparse` and adds support for boolean actions such as + ``--foo`` and ``--no-foo``:: - >>> import argparse - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) - >>> parser.parse_args(['--no-foo']) - Namespace(foo=False) + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) + >>> parser.parse_args(['--no-foo']) + Namespace(foo=False) -.. versionadded:: 3.9 + .. versionadded:: 3.9 The recommended way to create a custom action is to extend :class:`Action`, -overriding the ``__call__`` method and optionally the ``__init__`` and -``format_usage`` methods. +overriding the :meth:`!__call__` method and optionally the :meth:`!__init__` and +:meth:`!format_usage` methods. You can also register custom actions using the +:meth:`~ArgumentParser.register` method and reference them by their registered name. An example of a custom action:: @@ -960,7 +783,7 @@ For more details, see :class:`Action`. nargs ^^^^^ -ArgumentParser objects usually associate a single command-line argument with a +:class:`ArgumentParser` objects usually associate a single command-line argument with a single action to be taken. The ``nargs`` keyword argument associates a different number of command-line arguments with a single action. See also :ref:`specifying-ambiguous-arguments`. The supported values are: @@ -1042,6 +865,8 @@ See also :ref:`specifying-ambiguous-arguments`. The supported values are: If the ``nargs`` keyword argument is not provided, the number of arguments consumed is determined by the action_. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced. +Actions that do not consume command-line arguments (e.g. +``'store_const'``) set ``nargs=0``. .. _const: @@ -1092,7 +917,7 @@ was not present at the command line:: Namespace(foo=42) If the target namespace already has an attribute set, the action *default* -will not over write it:: +will not overwrite it:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default=42) @@ -1120,6 +945,9 @@ is used when no command-line argument was present:: >>> parser.parse_args([]) Namespace(foo=42) +For required_ arguments, the ``default`` value is ignored. For example, this +applies to positional arguments with nargs_ values other than ``?`` or ``*``, +or optional arguments marked as ``required=True``. Providing ``default=argparse.SUPPRESS`` causes no attribute to be added if the command-line argument was not present:: @@ -1146,10 +974,11 @@ necessary type-checking and type conversions to be performed. If the type_ keyword is used with the default_ keyword, the type converter is only applied if the default is a string. -The argument to ``type`` can be any callable that accepts a single string. +The argument to ``type`` can be a callable that accepts a single string or +the name of a registered type (see :meth:`~ArgumentParser.register`) If the function raises :exc:`ArgumentTypeError`, :exc:`TypeError`, or :exc:`ValueError`, the exception is caught and a nicely formatted error -message is displayed. No other exception types are handled. +message is displayed. Other exception types are not handled. Common built-in types and functions can be used as type converters: @@ -1163,7 +992,6 @@ Common built-in types and functions can be used as type converters: parser.add_argument('distance', type=float) parser.add_argument('street', type=ascii) parser.add_argument('code_point', type=ord) - parser.add_argument('source_file', type=open) parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1')) parser.add_argument('datapath', type=pathlib.Path) @@ -1194,10 +1022,11 @@ better reporting than can be given by the ``type`` keyword. A :exc:`FileNotFoundError` exception would not be handled at all. Even :class:`~argparse.FileType` has its limitations for use with the ``type`` -keyword. If one argument uses *FileType* and then a subsequent argument fails, -an error is reported but the file is not automatically closed. In this case, it -would be better to wait until after the parser has run and then use the -:keyword:`with`-statement to manage the files. +keyword. If one argument uses :class:`~argparse.FileType` and then a +subsequent argument fails, an error is reported but the file is not +automatically closed. In this case, it would be better to wait until after +the parser has run and then use the :keyword:`with`-statement to manage the +files. For type checkers that simply check against a fixed set of values, consider using the choices_ keyword instead. @@ -1225,15 +1054,7 @@ if the argument was not one of the acceptable values:: Note that inclusion in the *choices* sequence is checked after any type_ conversions have been performed, so the type of the objects in the *choices* -sequence should match the type_ specified:: - - >>> parser = argparse.ArgumentParser(prog='doors.py') - >>> parser.add_argument('door', type=int, choices=range(1, 4)) - >>> print(parser.parse_args(['3'])) - Namespace(door=3) - >>> parser.parse_args(['4']) - usage: doors.py [-h] {1,2,3} - doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3) +sequence should match the type_ specified. Any sequence can be passed as the *choices* value, so :class:`list` objects, :class:`tuple` objects, and custom sequences are all supported. @@ -1252,7 +1073,7 @@ many choices), just specify an explicit metavar_. required ^^^^^^^^ -In general, the :mod:`argparse` module assumes that flags like ``-f`` and ``--bar`` +In general, the :mod:`!argparse` module assumes that flags like ``-f`` and ``--bar`` indicate *optional* arguments, which can always be omitted at the command line. To make an option *required*, ``True`` can be specified for the ``required=`` keyword argument to :meth:`~ArgumentParser.add_argument`:: @@ -1283,22 +1104,7 @@ help The ``help`` value is a string containing a brief description of the argument. When a user requests help (usually by using ``-h`` or ``--help`` at the command line), these ``help`` descriptions will be displayed with each -argument:: - - >>> parser = argparse.ArgumentParser(prog='frobble') - >>> parser.add_argument('--foo', action='store_true', - ... help='foo the bars before frobbling') - >>> parser.add_argument('bar', nargs='+', - ... help='one of the bars to be frobbled') - >>> parser.parse_args(['-h']) - usage: frobble [-h] [--foo] bar [bar ...] - - positional arguments: - bar one of the bars to be frobbled - - options: - -h, --help show this help message and exit - --foo foo the bars before frobbling +argument. The ``help`` strings can include various format specifiers to avoid repetition of things like the program name or the argument default_. The available @@ -1320,7 +1126,7 @@ specifiers include the program name, ``%(prog)s`` and most keyword arguments to As the help string supports %-formatting, if you want a literal ``%`` to appear in the help string, you must escape it as ``%%``. -:mod:`argparse` supports silencing the help entry for certain options, by +:mod:`!argparse` supports silencing the help entry for certain options, by setting the ``help`` value to ``argparse.SUPPRESS``:: >>> parser = argparse.ArgumentParser(prog='frobble') @@ -1338,7 +1144,7 @@ metavar ^^^^^^^ When :class:`ArgumentParser` generates help messages, it needs some way to refer -to each expected argument. By default, ArgumentParser objects use the dest_ +to each expected argument. By default, :class:`!ArgumentParser` objects use the dest_ value as the "name" of each object. By default, for positional argument actions, the dest_ value is used directly, and for optional argument actions, the dest_ value is uppercased. So, a single positional argument with @@ -1439,10 +1245,38 @@ behavior:: >>> parser.parse_args('--foo XXX'.split()) Namespace(bar='XXX') + +.. _deprecated: + +deprecated +^^^^^^^^^^ + +During a project's lifetime, some arguments may need to be removed from the +command line. Before removing them, you should inform +your users that the arguments are deprecated and will be removed. +The ``deprecated`` keyword argument of +:meth:`~ArgumentParser.add_argument`, which defaults to ``False``, +specifies if the argument is deprecated and will be removed +in the future. +For arguments, if ``deprecated`` is ``True``, then a warning will be +printed to :data:`sys.stderr` when the argument is used:: + + >>> import argparse + >>> parser = argparse.ArgumentParser(prog='snake.py') + >>> parser.add_argument('--legs', default=0, type=int, deprecated=True) + >>> parser.parse_args([]) + Namespace(legs=0) + >>> parser.parse_args(['--legs', '4']) # doctest: +SKIP + snake.py: warning: option '--legs' is deprecated + Namespace(legs=4) + +.. versionadded:: 3.13 + + Action classes ^^^^^^^^^^^^^^ -Action classes implement the Action API, a callable which returns a callable +:class:`!Action` classes implement the Action API, a callable which returns a callable which processes arguments from the command-line. Any object which follows this API may be passed as the ``action`` parameter to :meth:`~ArgumentParser.add_argument`. @@ -1451,40 +1285,46 @@ this API may be passed as the ``action`` parameter to type=None, choices=None, required=False, help=None, \ metavar=None) -Action objects are used by an ArgumentParser to represent the information -needed to parse a single argument from one or more strings from the -command line. The Action class must accept the two positional arguments -plus any keyword arguments passed to :meth:`ArgumentParser.add_argument` -except for the ``action`` itself. + :class:`!Action` objects are used by an :class:`ArgumentParser` to represent the information + needed to parse a single argument from one or more strings from the + command line. The :class:`!Action` class must accept the two positional arguments + plus any keyword arguments passed to :meth:`ArgumentParser.add_argument` + except for the ``action`` itself. + + Instances of :class:`!Action` (or return value of any callable to the + ``action`` parameter) should have attributes :attr:`!dest`, + :attr:`!option_strings`, :attr:`!default`, :attr:`!type`, :attr:`!required`, + :attr:`!help`, etc. defined. The easiest way to ensure these attributes + are defined is to call :meth:`!Action.__init__`. + + .. method:: __call__(parser, namespace, values, option_string=None) -Instances of Action (or return value of any callable to the ``action`` -parameter) should have attributes "dest", "option_strings", "default", "type", -"required", "help", etc. defined. The easiest way to ensure these attributes -are defined is to call ``Action.__init__``. + :class:`!Action` instances should be callable, so subclasses must override the + :meth:`!__call__` method, which should accept four parameters: -Action instances should be callable, so subclasses must override the -``__call__`` method, which should accept four parameters: + * *parser* - The :class:`ArgumentParser` object which contains this action. -* ``parser`` - The ArgumentParser object which contains this action. + * *namespace* - The :class:`Namespace` object that will be returned by + :meth:`~ArgumentParser.parse_args`. Most actions add an attribute to this + object using :func:`setattr`. -* ``namespace`` - The :class:`Namespace` object that will be returned by - :meth:`~ArgumentParser.parse_args`. Most actions add an attribute to this - object using :func:`setattr`. + * *values* - The associated command-line arguments, with any type conversions + applied. Type conversions are specified with the type_ keyword argument to + :meth:`~ArgumentParser.add_argument`. -* ``values`` - The associated command-line arguments, with any type conversions - applied. Type conversions are specified with the type_ keyword argument to - :meth:`~ArgumentParser.add_argument`. + * *option_string* - The option string that was used to invoke this action. + The ``option_string`` argument is optional, and will be absent if the action + is associated with a positional argument. -* ``option_string`` - The option string that was used to invoke this action. - The ``option_string`` argument is optional, and will be absent if the action - is associated with a positional argument. + The :meth:`!__call__` method may perform arbitrary actions, but will typically set + attributes on the ``namespace`` based on ``dest`` and ``values``. -The ``__call__`` method may perform arbitrary actions, but will typically set -attributes on the ``namespace`` based on ``dest`` and ``values``. + .. method:: format_usage() + + :class:`!Action` subclasses can define a :meth:`!format_usage` method that takes no argument + and return a string which will be used when printing the usage of the program. + If such method is not provided, a sensible default will be used. -Action subclasses can define a ``format_usage`` method that takes no argument -and return a string which will be used when printing the usage of the program. -If such method is not provided, a sensible default will be used. The parse_args() method ----------------------- @@ -1496,7 +1336,7 @@ The parse_args() method Previous calls to :meth:`add_argument` determine exactly what objects are created and how they are assigned. See the documentation for - :meth:`add_argument` for details. + :meth:`!add_argument` for details. * args_ - List of strings to parse. The default is taken from :data:`sys.argv`. @@ -1652,7 +1492,7 @@ This feature can be disabled by setting :ref:`allow_abbrev` to ``False``. Beyond ``sys.argv`` ^^^^^^^^^^^^^^^^^^^ -Sometimes it may be useful to have an ArgumentParser parse arguments other than those +Sometimes it may be useful to have an :class:`ArgumentParser` parse arguments other than those of :data:`sys.argv`. This can be accomplished by passing a list of strings to :meth:`~ArgumentParser.parse_args`. This is useful for testing at the interactive prompt:: @@ -1679,29 +1519,29 @@ The Namespace object Simple class used by default by :meth:`~ArgumentParser.parse_args` to create an object holding attributes and return it. -This class is deliberately simple, just an :class:`object` subclass with a -readable string representation. If you prefer to have dict-like view of the -attributes, you can use the standard Python idiom, :func:`vars`:: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> args = parser.parse_args(['--foo', 'BAR']) - >>> vars(args) - {'foo': 'BAR'} - -It may also be useful to have an :class:`ArgumentParser` assign attributes to an -already existing object, rather than a new :class:`Namespace` object. This can -be achieved by specifying the ``namespace=`` keyword argument:: + This class is deliberately simple, just an :class:`object` subclass with a + readable string representation. If you prefer to have dict-like view of the + attributes, you can use the standard Python idiom, :func:`vars`:: - >>> class C: - ... pass - ... - >>> c = C() - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) - >>> c.foo - 'BAR' + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> args = parser.parse_args(['--foo', 'BAR']) + >>> vars(args) + {'foo': 'BAR'} + + It may also be useful to have an :class:`ArgumentParser` assign attributes to an + already existing object, rather than a new :class:`Namespace` object. This can + be achieved by specifying the ``namespace=`` keyword argument:: + + >>> class C: + ... pass + ... + >>> c = C() + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) + >>> c.foo + 'BAR' Other utilities @@ -1710,38 +1550,38 @@ Other utilities Sub-commands ^^^^^^^^^^^^ -.. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ +.. method:: ArgumentParser.add_subparsers(*, [title], [description], [prog], \ [parser_class], [action], \ - [option_strings], [dest], [required], \ + [dest], [required], \ [help], [metavar]) - Many programs split up their functionality into a number of sub-commands, - for example, the ``svn`` program can invoke sub-commands like ``svn + Many programs split up their functionality into a number of subcommands, + for example, the ``svn`` program can invoke subcommands like ``svn checkout``, ``svn update``, and ``svn commit``. Splitting up functionality this way can be a particularly good idea when a program performs several different functions which require different kinds of command-line arguments. - :class:`ArgumentParser` supports the creation of such sub-commands with the - :meth:`add_subparsers` method. The :meth:`add_subparsers` method is normally + :class:`ArgumentParser` supports the creation of such subcommands with the + :meth:`!add_subparsers` method. The :meth:`!add_subparsers` method is normally called with no arguments and returns a special action object. This object has a single method, :meth:`~_SubParsersAction.add_parser`, which takes a - command name and any :class:`ArgumentParser` constructor arguments, and - returns an :class:`ArgumentParser` object that can be modified as usual. + command name and any :class:`!ArgumentParser` constructor arguments, and + returns an :class:`!ArgumentParser` object that can be modified as usual. Description of parameters: - * title - title for the sub-parser group in help output; by default + * *title* - title for the sub-parser group in help output; by default "subcommands" if description is provided, otherwise uses title for positional arguments - * description - description for the sub-parser group in help output, by + * *description* - description for the sub-parser group in help output, by default ``None`` - * prog - usage information that will be displayed with sub-command help, + * *prog* - usage information that will be displayed with sub-command help, by default the name of the program and any positional arguments before the subparser argument - * parser_class - class which will be used to create sub-parser instances, by - default the class of the current parser (e.g. ArgumentParser) + * *parser_class* - class which will be used to create sub-parser instances, by + default the class of the current parser (e.g. :class:`ArgumentParser`) * action_ - the basic type of action to be taken when this argument is encountered at the command line @@ -1754,15 +1594,15 @@ Sub-commands * help_ - help for sub-parser group in help output, by default ``None`` - * metavar_ - string presenting available sub-commands in help; by default it - is ``None`` and presents sub-commands in form {cmd1, cmd2, ..} + * metavar_ - string presenting available subcommands in help; by default it + is ``None`` and presents subcommands in form {cmd1, cmd2, ..} Some example usage:: >>> # create the top-level parser >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') - >>> subparsers = parser.add_subparsers(help='sub-command help') + >>> subparsers = parser.add_subparsers(help='subcommand help') >>> >>> # create the parser for the "a" command >>> parser_a = subparsers.add_parser('a', help='a help') @@ -1770,7 +1610,7 @@ Sub-commands >>> >>> # create the parser for the "b" command >>> parser_b = subparsers.add_parser('b', help='b help') - >>> parser_b.add_argument('--baz', choices='XYZ', help='baz help') + >>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help') >>> >>> # parse some argument lists >>> parser.parse_args(['a', '12']) @@ -1797,7 +1637,7 @@ Sub-commands usage: PROG [-h] [--foo] {a,b} ... positional arguments: - {a,b} sub-command help + {a,b} subcommand help a a help b b help @@ -1842,7 +1682,8 @@ Sub-commands {foo,bar} additional help - Furthermore, ``add_parser`` supports an additional ``aliases`` argument, + Furthermore, :meth:`~_SubParsersAction.add_parser` supports an additional + *aliases* argument, which allows multiple strings to refer to the same subparser. This example, like ``svn``, aliases ``co`` as a shorthand for ``checkout``:: @@ -1853,12 +1694,26 @@ Sub-commands >>> parser.parse_args(['co', 'bar']) Namespace(foo='bar') - One particularly effective way of handling sub-commands is to combine the use + :meth:`~_SubParsersAction.add_parser` supports also an additional + *deprecated* argument, which allows to deprecate the subparser. + + >>> import argparse + >>> parser = argparse.ArgumentParser(prog='chicken.py') + >>> subparsers = parser.add_subparsers() + >>> run = subparsers.add_parser('run') + >>> fly = subparsers.add_parser('fly', deprecated=True) + >>> parser.parse_args(['fly']) # doctest: +SKIP + chicken.py: warning: command 'fly' is deprecated + Namespace() + + .. versionadded:: 3.13 + + One particularly effective way of handling subcommands is to combine the use of the :meth:`add_subparsers` method with calls to :meth:`set_defaults` so that each subparser knows which Python function it should execute. For example:: - >>> # sub-command functions + >>> # subcommand functions >>> def foo(args): ... print(args.x * args.y) ... @@ -1907,7 +1762,7 @@ Sub-commands Namespace(subparser_name='2', y='frobble') .. versionchanged:: 3.7 - New *required* keyword argument. + New *required* keyword-only parameter. FileType objects @@ -1936,20 +1791,21 @@ FileType objects >>> parser.parse_args(['-']) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>) - .. versionadded:: 3.4 - The *encodings* and *errors* keyword arguments. + .. versionchanged:: 3.4 + Added the *encodings* and *errors* parameters. Argument groups ^^^^^^^^^^^^^^^ -.. method:: ArgumentParser.add_argument_group(title=None, description=None) +.. method:: ArgumentParser.add_argument_group(title=None, description=None, *, \ + [argument_default], [conflict_handler]) By default, :class:`ArgumentParser` groups command-line arguments into "positional arguments" and "options" when displaying help messages. When there is a better conceptual grouping of arguments than this default one, appropriate groups can be created using the - :meth:`add_argument_group` method:: + :meth:`!add_argument_group` method:: >>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group = parser.add_argument_group('group') @@ -1966,7 +1822,7 @@ Argument groups has an :meth:`~ArgumentParser.add_argument` method just like a regular :class:`ArgumentParser`. When an argument is added to the group, the parser treats it just like a normal argument, but displays the argument in a - separate group for help messages. The :meth:`add_argument_group` method + separate group for help messages. The :meth:`!add_argument_group` method accepts *title* and *description* arguments which can be used to customize this display:: @@ -1988,6 +1844,11 @@ Argument groups --bar BAR bar help + The optional, keyword-only parameters argument_default_ and conflict_handler_ + allow for finer-grained control of the behavior of the argument group. These + parameters have the same meaning as in the :class:`ArgumentParser` constructor, + but apply specifically to the argument group rather than the entire parser. + Note that any arguments not in your user-defined groups will end up back in the usual "positional arguments" and "optional arguments" sections. @@ -2003,7 +1864,7 @@ Mutual exclusion .. method:: ArgumentParser.add_mutually_exclusive_group(required=False) - Create a mutually exclusive group. :mod:`argparse` will make sure that only + Create a mutually exclusive group. :mod:`!argparse` will make sure that only one of the arguments in the mutually exclusive group was present on the command line:: @@ -2140,20 +2001,20 @@ Partial parsing .. method:: ArgumentParser.parse_known_args(args=None, namespace=None) -Sometimes a script may only parse a few of the command-line arguments, passing -the remaining arguments on to another script or program. In these cases, the -:meth:`~ArgumentParser.parse_known_args` method can be useful. It works much like -:meth:`~ArgumentParser.parse_args` except that it does not produce an error when -extra arguments are present. Instead, it returns a two item tuple containing -the populated namespace and the list of remaining argument strings. + Sometimes a script may only parse a few of the command-line arguments, passing + the remaining arguments on to another script or program. In these cases, the + :meth:`~ArgumentParser.parse_known_args` method can be useful. It works much like + :meth:`~ArgumentParser.parse_args` except that it does not produce an error when + extra arguments are present. Instead, it returns a two item tuple containing + the populated namespace and the list of remaining argument strings. -:: + :: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo', action='store_true') - >>> parser.add_argument('bar') - >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) - (Namespace(bar='BAR', foo=True), ['--badger', 'spam']) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action='store_true') + >>> parser.add_argument('bar') + >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) + (Namespace(bar='BAR', foo=True), ['--badger', 'spam']) .. warning:: :ref:`Prefix matching <prefix-matching>` rules apply to @@ -2190,8 +2051,8 @@ Exiting methods .. method:: ArgumentParser.exit(status=0, message=None) This method terminates the program, exiting with the specified *status* - and, if given, it prints a *message* before that. The user can override - this method to handle these steps differently:: + and, if given, it prints a *message* to :data:`sys.stderr` before that. + The user can override this method to handle these steps differently:: class ErrorCatchingArgumentParser(argparse.ArgumentParser): def exit(self, status=0, message=None): @@ -2201,8 +2062,8 @@ Exiting methods .. method:: ArgumentParser.error(message) - This method prints a usage message including the *message* to the - standard error and terminates the program with a status code of 2. + This method prints a usage message, including the *message*, to + :data:`sys.stderr` and terminates the program with a status code of 2. Intermixed parsing @@ -2211,90 +2072,66 @@ Intermixed parsing .. method:: ArgumentParser.parse_intermixed_args(args=None, namespace=None) .. method:: ArgumentParser.parse_known_intermixed_args(args=None, namespace=None) -A number of Unix commands allow the user to intermix optional arguments with -positional arguments. The :meth:`~ArgumentParser.parse_intermixed_args` -and :meth:`~ArgumentParser.parse_known_intermixed_args` methods -support this parsing style. - -These parsers do not support all the argparse features, and will raise -exceptions if unsupported features are used. In particular, subparsers, -and mutually exclusive groups that include both -optionals and positionals are not supported. - -The following example shows the difference between -:meth:`~ArgumentParser.parse_known_args` and -:meth:`~ArgumentParser.parse_intermixed_args`: the former returns ``['2', -'3']`` as unparsed arguments, while the latter collects all the positionals -into ``rest``. :: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.add_argument('cmd') - >>> parser.add_argument('rest', nargs='*', type=int) - >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) - (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) - >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) - Namespace(cmd='doit', foo='bar', rest=[1, 2, 3]) - -:meth:`~ArgumentParser.parse_known_intermixed_args` returns a two item tuple -containing the populated namespace and the list of remaining argument strings. -:meth:`~ArgumentParser.parse_intermixed_args` raises an error if there are any -remaining unparsed argument strings. + A number of Unix commands allow the user to intermix optional arguments with + positional arguments. The :meth:`~ArgumentParser.parse_intermixed_args` + and :meth:`~ArgumentParser.parse_known_intermixed_args` methods + support this parsing style. -.. versionadded:: 3.7 + These parsers do not support all the :mod:`!argparse` features, and will raise + exceptions if unsupported features are used. In particular, subparsers, + and mutually exclusive groups that include both + optionals and positionals are not supported. -.. _upgrading-optparse-code: + The following example shows the difference between + :meth:`~ArgumentParser.parse_known_args` and + :meth:`~ArgumentParser.parse_intermixed_args`: the former returns ``['2', + '3']`` as unparsed arguments, while the latter collects all the positionals + into ``rest``. :: -Upgrading optparse code ------------------------ - -Originally, the :mod:`argparse` module had attempted to maintain compatibility -with :mod:`optparse`. However, :mod:`optparse` was difficult to extend -transparently, particularly with the changes required to support the new -``nargs=`` specifiers and better usage messages. When most everything in -:mod:`optparse` had either been copy-pasted over or monkey-patched, it no -longer seemed practical to try to maintain the backwards compatibility. - -The :mod:`argparse` module improves on the standard library :mod:`optparse` -module in a number of ways including: - -* Handling positional arguments. -* Supporting sub-commands. -* Allowing alternative option prefixes like ``+`` and ``/``. -* Handling zero-or-more and one-or-more style arguments. -* Producing more informative usage messages. -* Providing a much simpler interface for custom ``type`` and ``action``. + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> parser.add_argument('cmd') + >>> parser.add_argument('rest', nargs='*', type=int) + >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) + (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) + >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) + Namespace(cmd='doit', foo='bar', rest=[1, 2, 3]) -A partial upgrade path from :mod:`optparse` to :mod:`argparse`: + :meth:`~ArgumentParser.parse_known_intermixed_args` returns a two item tuple + containing the populated namespace and the list of remaining argument strings. + :meth:`~ArgumentParser.parse_intermixed_args` raises an error if there are any + remaining unparsed argument strings. -* Replace all :meth:`optparse.OptionParser.add_option` calls with - :meth:`ArgumentParser.add_argument` calls. + .. versionadded:: 3.7 -* Replace ``(options, args) = parser.parse_args()`` with ``args = - parser.parse_args()`` and add additional :meth:`ArgumentParser.add_argument` - calls for the positional arguments. Keep in mind that what was previously - called ``options``, now in the :mod:`argparse` context is called ``args``. -* Replace :meth:`optparse.OptionParser.disable_interspersed_args` - by using :meth:`~ArgumentParser.parse_intermixed_args` instead of - :meth:`~ArgumentParser.parse_args`. +Registering custom types or actions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Replace callback actions and the ``callback_*`` keyword arguments with - ``type`` or ``action`` arguments. +.. method:: ArgumentParser.register(registry_name, value, object) -* Replace string names for ``type`` keyword arguments with the corresponding - type objects (e.g. int, float, complex, etc). + Sometimes it's desirable to use a custom string in error messages to provide + more user-friendly output. In these cases, :meth:`!register` can be used to + register custom actions or types with a parser and allow you to reference the + type by their registered name instead of their callable name. -* Replace :class:`optparse.Values` with :class:`Namespace` and - :exc:`optparse.OptionError` and :exc:`optparse.OptionValueError` with - :exc:`ArgumentError`. + The :meth:`!register` method accepts three arguments - a *registry_name*, + specifying the internal registry where the object will be stored (e.g., + ``action``, ``type``), *value*, which is the key under which the object will + be registered, and object, the callable to be registered. -* Replace strings with implicit arguments such as ``%default`` or ``%prog`` with - the standard Python syntax to use dictionaries to format strings, that is, - ``%(default)s`` and ``%(prog)s``. + The following example shows how to register a custom type with a parser:: -* Replace the OptionParser constructor ``version`` argument with a call to - ``parser.add_argument('--version', action='version', version='<the version>')``. + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16)) + >>> parser.add_argument('--foo', type='hexadecimal integer') + _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False) + >>> parser.parse_args(['--foo', '0xFA']) + Namespace(foo=250) + >>> parser.parse_args(['--foo', '1.2']) + usage: PROG [-h] [--foo FOO] + PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2' Exceptions ---------- @@ -2309,3 +2146,12 @@ Exceptions .. exception:: ArgumentTypeError Raised when something goes wrong converting a command line string to a type. + + +.. rubric:: Guides and Tutorials + +.. toctree:: + :maxdepth: 1 + + ../howto/argparse.rst + ../howto/argparse-optparse.rst diff --git a/Doc/library/array.rst b/Doc/library/array.rst index d6cb8c62..e0b1eb89 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -1,5 +1,5 @@ -:mod:`array` --- Efficient arrays of numeric values -=================================================== +:mod:`!array` --- Efficient arrays of numeric values +==================================================== .. module:: array :synopsis: Space efficient arrays of uniformly typed numeric values. @@ -9,7 +9,7 @@ -------------- This module defines an object type which can compactly represent an array of -basic values: characters, integers, floating point numbers. Arrays are sequence +basic values: characters, integers, floating-point numbers. Arrays are sequence types and behave very much like lists, except that the type of objects stored in them is constrained. The type is specified at object creation time by using a :dfn:`type code`, which is a single character. The following type codes are @@ -24,6 +24,8 @@ defined: +-----------+--------------------+-------------------+-----------------------+-------+ | ``'u'`` | wchar_t | Unicode character | 2 | \(1) | +-----------+--------------------+-------------------+-----------------------+-------+ +| ``'w'`` | Py_UCS4 | Unicode character | 4 | | ++-----------+--------------------+-------------------+-----------------------+-------+ | ``'h'`` | signed short | int | 2 | | +-----------+--------------------+-------------------+-----------------------+-------+ | ``'H'`` | unsigned short | int | 2 | | @@ -55,7 +57,8 @@ Notes: ``Py_UNICODE``. This change doesn't affect its behavior because ``Py_UNICODE`` is alias of :c:type:`wchar_t` since Python 3.3. - .. deprecated-removed:: 3.3 4.0 + .. deprecated-removed:: 3.3 3.16 + Please migrate to ``'w'`` typecode. The actual representation of values is determined by the machine architecture @@ -76,14 +79,16 @@ The module defines the following type: .. class:: array(typecode[, initializer]) A new array whose items are restricted by *typecode*, and initialized - from the optional *initializer* value, which must be a list, a - :term:`bytes-like object`, or iterable over elements of the - appropriate type. + from the optional *initializer* value, which must be a :class:`bytes` + or :class:`bytearray` object, a Unicode string, or iterable over elements + of the appropriate type. - If given a list or string, the initializer is passed to the new array's - :meth:`fromlist`, :meth:`frombytes`, or :meth:`fromunicode` method (see below) - to add initial items to the array. Otherwise, the iterable initializer is - passed to the :meth:`extend` method. + If given a :class:`bytes` or :class:`bytearray` object, the initializer + is passed to the new array's :meth:`frombytes` method; + if given a Unicode string, the initializer is passed to the + :meth:`fromunicode` method; + otherwise, the initializer's iterator is passed to the :meth:`extend` method + to add initial items to the array. Array objects support the ordinary sequence operations of indexing, slicing, concatenation, and multiplication. When using slice assignment, the assigned @@ -149,10 +154,11 @@ The module defines the following type: must be the right type to be appended to the array. - .. method:: frombytes(s) + .. method:: frombytes(buffer) - Appends items from the string, interpreting the string as an array of machine - values (as if it had been read from a file using the :meth:`fromfile` method). + Appends items from the :term:`bytes-like object`, interpreting + its content as an array of machine values (as if it had been read + from a file using the :meth:`fromfile` method). .. versionadded:: 3.2 :meth:`!fromstring` is renamed to :meth:`frombytes` for clarity. @@ -174,9 +180,9 @@ The module defines the following type: .. method:: fromunicode(s) - Extends this array with data from the given unicode string. The array must - be a type ``'u'`` array; otherwise a :exc:`ValueError` is raised. Use - ``array.frombytes(unicodestring.encode(enc))`` to append Unicode data to an + Extends this array with data from the given Unicode string. + The array must have type code ``'u'`` or ``'w'``; otherwise a :exc:`ValueError` is raised. + Use ``array.frombytes(unicodestring.encode(enc))`` to append Unicode data to an array of some other type. @@ -209,6 +215,13 @@ The module defines the following type: Remove the first occurrence of *x* from the array. + .. method:: clear() + + Remove all elements from the array. + + .. versionadded:: 3.13 + + .. method:: reverse() Reverse the order of the items in the array. @@ -236,23 +249,27 @@ The module defines the following type: .. method:: tounicode() - Convert the array to a unicode string. The array must be a type ``'u'`` array; + Convert the array to a Unicode string. The array must have a type ``'u'`` or ``'w'``; otherwise a :exc:`ValueError` is raised. Use ``array.tobytes().decode(enc)`` to - obtain a unicode string from an array of some other type. + obtain a Unicode string from an array of some other type. -When an array object is printed or converted to a string, it is represented as -``array(typecode, initializer)``. The *initializer* is omitted if the array is -empty, otherwise it is a string if the *typecode* is ``'u'``, otherwise it is a -list of numbers. The string is guaranteed to be able to be converted back to an +The string representation of array objects has the form +``array(typecode, initializer)``. +The *initializer* is omitted if the array is empty, otherwise it is +a Unicode string if the *typecode* is ``'u'`` or ``'w'``, otherwise it is +a list of numbers. +The string representation is guaranteed to be able to be converted back to an array with the same type and value using :func:`eval`, so long as the :class:`~array.array` class has been imported using ``from array import array``. +Variables ``inf`` and ``nan`` must also be defined if it contains +corresponding floating-point values. Examples:: array('l') - array('u', 'hello \u2641') + array('w', 'hello \u2641') array('l', [1, 2, 3, 4, 5]) - array('d', [1.0, 2.0, 3.14]) + array('d', [1.0, 2.0, 3.14, -inf, nan]) .. seealso:: @@ -260,10 +277,5 @@ Examples:: Module :mod:`struct` Packing and unpacking of heterogeneous binary data. - Module :mod:`xdrlib` - Packing and unpacking of External Data Representation (XDR) data as used in some - remote procedure call systems. - `NumPy <https://numpy.org/>`_ The NumPy package defines another array type. - diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index a7fa8074..bb126b79 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -1,5 +1,5 @@ -:mod:`ast` --- Abstract Syntax Trees -==================================== +:mod:`!ast` --- Abstract Syntax Trees +===================================== .. module:: ast :synopsis: Abstract Syntax Tree classes and manipulation. @@ -45,7 +45,7 @@ Node classes This is the base of all AST node classes. The actual node classes are derived from the :file:`Parser/Python.asdl` file, which is reproduced - :ref:`above <abstract-grammar>`. They are defined in the :mod:`_ast` C + :ref:`above <abstract-grammar>`. They are defined in the :mod:`!_ast` C module and re-exported in :mod:`ast`. There is one class defined for each left-hand side symbol in the abstract @@ -61,7 +61,7 @@ Node classes .. attribute:: _fields - Each concrete class has an attribute :attr:`_fields` which gives the names + Each concrete class has an attribute :attr:`!_fields` which gives the names of all child nodes. Each instance of a concrete class has one attribute for each child node, @@ -74,6 +74,18 @@ Node classes as Python lists. All possible attributes must be present and have valid values when compiling an AST with :func:`compile`. + .. attribute:: _field_types + + The :attr:`!_field_types` attribute on each concrete class is a dictionary + mapping field names (as also listed in :attr:`_fields`) to their types. + + .. doctest:: + + >>> ast.TypeVar._field_types + {'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None} + + .. versionadded:: 3.13 + .. attribute:: lineno col_offset end_lineno @@ -103,20 +115,16 @@ Node classes For example, to create and populate an :class:`ast.UnaryOp` node, you could use :: - node = ast.UnaryOp() - node.op = ast.USub() - node.operand = ast.Constant() - node.operand.value = 5 - node.operand.lineno = 0 - node.operand.col_offset = 0 - node.lineno = 0 - node.col_offset = 0 - - or the more compact :: - node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0), lineno=0, col_offset=0) + If a field that is optional in the grammar is omitted from the constructor, + it defaults to ``None``. If a list field is omitted, it defaults to the empty + list. If a field of type :class:`!ast.expr_context` is omitted, it defaults to + :class:`Load() <ast.Load>`. If any other field is omitted, a :exc:`DeprecationWarning` is raised + and the AST node will not have this field. In Python 3.15, this condition will + raise an error. + .. versionchanged:: 3.8 Class :class:`ast.Constant` is now used for all constants. @@ -128,18 +136,26 @@ Node classes .. deprecated:: 3.8 - Old classes :class:`ast.Num`, :class:`ast.Str`, :class:`ast.Bytes`, - :class:`ast.NameConstant` and :class:`ast.Ellipsis` are still available, + Old classes :class:`!ast.Num`, :class:`!ast.Str`, :class:`!ast.Bytes`, + :class:`!ast.NameConstant` and :class:`!ast.Ellipsis` are still available, but they will be removed in future Python releases. In the meantime, instantiating them will return an instance of a different class. .. deprecated:: 3.9 - Old classes :class:`ast.Index` and :class:`ast.ExtSlice` are still + Old classes :class:`!ast.Index` and :class:`!ast.ExtSlice` are still available, but they will be removed in future Python releases. In the meantime, instantiating them will return an instance of a different class. +.. deprecated-removed:: 3.13 3.15 + + Previous versions of Python allowed the creation of AST nodes that were missing + required fields. Similarly, AST node constructors allowed arbitrary keyword + arguments that were set as attributes of the AST node, even if they did not + match any of the fields of the AST node. This behavior is deprecated and will + be removed in Python 3.15. + .. note:: The descriptions of the specific node classes displayed here were initially adapted from the fantastic `Green Tree @@ -157,9 +173,9 @@ Root nodes A Python module, as with :ref:`file input <file-input>`. Node type generated by :func:`ast.parse` in the default ``"exec"`` *mode*. - *body* is a :class:`list` of the module's :ref:`ast-statements`. + ``body`` is a :class:`list` of the module's :ref:`ast-statements`. - *type_ignores* is a :class:`list` of the module's type ignore comments; + ``type_ignores`` is a :class:`list` of the module's type ignore comments; see :func:`ast.parse` for more details. .. doctest:: @@ -170,8 +186,7 @@ Root nodes Assign( targets=[ Name(id='x', ctx=Store())], - value=Constant(value=1))], - type_ignores=[]) + value=Constant(value=1))]) .. class:: Expression(body) @@ -179,7 +194,7 @@ Root nodes A single Python :ref:`expression input <expression-input>`. Node type generated by :func:`ast.parse` when *mode* is ``"eval"``. - *body* is a single node, + ``body`` is a single node, one of the :ref:`expression types <ast-expressions>`. .. doctest:: @@ -194,7 +209,7 @@ Root nodes A single :ref:`interactive input <interactive>`, like in :ref:`tut-interac`. Node type generated by :func:`ast.parse` when *mode* is ``"single"``. - *body* is a :class:`list` of :ref:`statement nodes <ast-statements>`. + ``body`` is a :class:`list` of :ref:`statement nodes <ast-statements>`. .. doctest:: @@ -223,9 +238,9 @@ Root nodes # type: (int, int) -> int return a + b - *argtypes* is a :class:`list` of :ref:`expression nodes <ast-expressions>`. + ``argtypes`` is a :class:`list` of :ref:`expression nodes <ast-expressions>`. - *returns* is a single :ref:`expression node <ast-expressions>`. + ``returns`` is a single :ref:`expression node <ast-expressions>`. .. doctest:: @@ -299,8 +314,7 @@ Literals value=Call( func=Name(id='sin', ctx=Load()), args=[ - Name(id='a', ctx=Load())], - keywords=[]), + Name(id='a', ctx=Load())]), conversion=-1, format_spec=JoinedStr( values=[ @@ -395,8 +409,7 @@ Variables Module( body=[ Expr( - value=Name(id='a', ctx=Load()))], - type_ignores=[]) + value=Name(id='a', ctx=Load()))]) >>> print(ast.dump(ast.parse('a = 1'), indent=4)) Module( @@ -404,16 +417,14 @@ Variables Assign( targets=[ Name(id='a', ctx=Store())], - value=Constant(value=1))], - type_ignores=[]) + value=Constant(value=1))]) >>> print(ast.dump(ast.parse('del a'), indent=4)) Module( body=[ Delete( targets=[ - Name(id='a', ctx=Del())])], - type_ignores=[]) + Name(id='a', ctx=Del())])]) .. class:: Starred(value, ctx) @@ -436,8 +447,7 @@ Variables value=Name(id='b', ctx=Store()), ctx=Store())], ctx=Store())], - value=Name(id='it', ctx=Load()))], - type_ignores=[]) + value=Name(id='it', ctx=Load()))]) .. _ast-expressions: @@ -460,8 +470,7 @@ Expressions Expr( value=UnaryOp( op=USub(), - operand=Name(id='a', ctx=Load())))], - type_ignores=[]) + operand=Name(id='a', ctx=Load())))]) .. class:: UnaryOp(op, operand) @@ -588,8 +597,7 @@ Expressions * ``keywords`` holds a list of :class:`.keyword` objects representing arguments passed by keyword. - When creating a ``Call`` node, ``args`` and ``keywords`` are required, but - they can be empty lists. + The ``args`` and ``keywords`` arguments are optional and default to empty lists. .. doctest:: @@ -726,7 +734,10 @@ Comprehensions .. doctest:: - >>> print(ast.dump(ast.parse('[x for x in numbers]', mode='eval'), indent=4)) + >>> print(ast.dump( + ... ast.parse('[x for x in numbers]', mode='eval'), + ... indent=4, + ... )) Expression( body=ListComp( elt=Name(id='x', ctx=Load()), @@ -734,9 +745,11 @@ Comprehensions comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), - ifs=[], is_async=0)])) - >>> print(ast.dump(ast.parse('{x: x**2 for x in numbers}', mode='eval'), indent=4)) + >>> print(ast.dump( + ... ast.parse('{x: x**2 for x in numbers}', mode='eval'), + ... indent=4, + ... )) Expression( body=DictComp( key=Name(id='x', ctx=Load()), @@ -748,9 +761,11 @@ Comprehensions comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), - ifs=[], is_async=0)])) - >>> print(ast.dump(ast.parse('{x for x in numbers}', mode='eval'), indent=4)) + >>> print(ast.dump( + ... ast.parse('{x for x in numbers}', mode='eval'), + ... indent=4, + ... )) Expression( body=SetComp( elt=Name(id='x', ctx=Load()), @@ -758,7 +773,6 @@ Comprehensions comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), - ifs=[], is_async=0)])) @@ -781,18 +795,15 @@ Comprehensions elt=Call( func=Name(id='ord', ctx=Load()), args=[ - Name(id='c', ctx=Load())], - keywords=[]), + Name(id='c', ctx=Load())]), generators=[ comprehension( target=Name(id='line', ctx=Store()), iter=Name(id='file', ctx=Load()), - ifs=[], is_async=0), comprehension( target=Name(id='c', ctx=Store()), iter=Name(id='line', ctx=Load()), - ifs=[], is_async=0)])) >>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'), @@ -831,7 +842,6 @@ Comprehensions comprehension( target=Name(id='i', ctx=Store()), iter=Name(id='soc', ctx=Load()), - ifs=[], is_async=1)])) @@ -861,8 +871,7 @@ Statements targets=[ Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], - value=Constant(value=1))], - type_ignores=[]) + value=Constant(value=1))]) >>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking Module( @@ -874,18 +883,21 @@ Statements Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], - value=Name(id='c', ctx=Load()))], - type_ignores=[]) + value=Name(id='c', ctx=Load()))]) .. class:: AnnAssign(target, annotation, value, simple) An assignment with a type annotation. ``target`` is a single node and can - be a :class:`Name`, a :class:`Attribute` or a :class:`Subscript`. + be a :class:`Name`, an :class:`Attribute` or a :class:`Subscript`. ``annotation`` is the annotation, such as a :class:`Constant` or :class:`Name` - node. ``value`` is a single optional node. ``simple`` is a boolean integer - set to True for a :class:`Name` node in ``target`` that do not appear in - between parenthesis and are hence pure names and not expressions. + node. ``value`` is a single optional node. + + ``simple`` is always either 0 (indicating a "complex" target) or 1 + (indicating a "simple" target). A "simple" target consists solely of a + :class:`Name` node that does not appear between parentheses; all other + targets are considered complex. Only simple targets appear in + the :attr:`~object.__annotations__` dictionary of modules and classes. .. doctest:: @@ -895,8 +907,7 @@ Statements AnnAssign( target=Name(id='c', ctx=Store()), annotation=Name(id='int', ctx=Load()), - simple=1)], - type_ignores=[]) + simple=1)]) >>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis Module( @@ -905,8 +916,7 @@ Statements target=Name(id='a', ctx=Store()), annotation=Name(id='int', ctx=Load()), value=Constant(value=1), - simple=0)], - type_ignores=[]) + simple=0)]) >>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation Module( @@ -917,8 +927,7 @@ Statements attr='b', ctx=Store()), annotation=Name(id='int', ctx=Load()), - simple=0)], - type_ignores=[]) + simple=0)]) >>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation Module( @@ -929,8 +938,7 @@ Statements slice=Constant(value=1), ctx=Store()), annotation=Name(id='int', ctx=Load()), - simple=0)], - type_ignores=[]) + simple=0)]) .. class:: AugAssign(target, op, value) @@ -951,8 +959,7 @@ Statements AugAssign( target=Name(id='x', ctx=Store()), op=Add(), - value=Constant(value=2))], - type_ignores=[]) + value=Constant(value=2))]) .. class:: Raise(exc, cause) @@ -968,8 +975,7 @@ Statements body=[ Raise( exc=Name(id='x', ctx=Load()), - cause=Name(id='y', ctx=Load()))], - type_ignores=[]) + cause=Name(id='y', ctx=Load()))]) .. class:: Assert(test, msg) @@ -984,8 +990,7 @@ Statements body=[ Assert( test=Name(id='x', ctx=Load()), - msg=Name(id='y', ctx=Load()))], - type_ignores=[]) + msg=Name(id='y', ctx=Load()))]) .. class:: Delete(targets) @@ -1002,8 +1007,7 @@ Statements targets=[ Name(id='x', ctx=Del()), Name(id='y', ctx=Del()), - Name(id='z', ctx=Del())])], - type_ignores=[]) + Name(id='z', ctx=Del())])]) .. class:: Pass() @@ -1015,8 +1019,7 @@ Statements >>> print(ast.dump(ast.parse('pass'), indent=4)) Module( body=[ - Pass()], - type_ignores=[]) + Pass()]) .. class:: TypeAlias(name, type_params, value) @@ -1033,9 +1036,7 @@ Statements body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), - type_params=[], - value=Name(id='int', ctx=Load()))], - type_ignores=[]) + value=Name(id='int', ctx=Load()))]) .. versionadded:: 3.12 @@ -1058,8 +1059,7 @@ Imports names=[ alias(name='x'), alias(name='y'), - alias(name='z')])], - type_ignores=[]) + alias(name='z')])]) .. class:: ImportFrom(module, names, level) @@ -1080,8 +1080,7 @@ Imports alias(name='x'), alias(name='y'), alias(name='z')], - level=0)], - type_ignores=[]) + level=0)]) .. class:: alias(name, asname) @@ -1099,8 +1098,7 @@ Imports names=[ alias(name='a', asname='b'), alias(name='c')], - level=2)], - type_ignores=[]) + level=2)]) Control flow ^^^^^^^^^^^^ @@ -1143,8 +1141,7 @@ Control flow value=Constant(value=Ellipsis))], orelse=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. class:: For(target, iter, body, orelse, type_comment) @@ -1178,8 +1175,7 @@ Control flow value=Constant(value=Ellipsis))], orelse=[ Expr( - value=Constant(value=Ellipsis))])], - type_ignores=[]) + value=Constant(value=Ellipsis))])]) .. class:: While(test, body, orelse) @@ -1204,8 +1200,7 @@ Control flow value=Constant(value=Ellipsis))], orelse=[ Expr( - value=Constant(value=Ellipsis))])], - type_ignores=[]) + value=Constant(value=Ellipsis))])]) .. class:: Break @@ -1239,9 +1234,7 @@ Control flow body=[ Break()], orelse=[ - Continue()])], - orelse=[])], - type_ignores=[]) + Continue()])])]) .. class:: Try(body, handlers, orelse, finalbody) @@ -1286,8 +1279,7 @@ Control flow value=Constant(value=Ellipsis))], finalbody=[ Expr( - value=Constant(value=Ellipsis))])], - type_ignores=[]) + value=Constant(value=Ellipsis))])]) .. class:: TryStar(body, handlers, orelse, finalbody) @@ -1315,10 +1307,7 @@ Control flow type=Name(id='Exception', ctx=Load()), body=[ Expr( - value=Constant(value=Ellipsis))])], - orelse=[], - finalbody=[])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.11 @@ -1350,10 +1339,7 @@ Control flow ExceptHandler( type=Name(id='TypeError', ctx=Load()), body=[ - Pass()])], - orelse=[], - finalbody=[])], - type_ignores=[]) + Pass()])])]) .. class:: With(items, body, type_comment) @@ -1395,9 +1381,7 @@ Control flow func=Name(id='something', ctx=Load()), args=[ Name(id='b', ctx=Load()), - Name(id='d', ctx=Load())], - keywords=[]))])], - type_ignores=[]) + Name(id='d', ctx=Load())]))])]) Pattern matching @@ -1454,14 +1438,10 @@ Pattern matching value=Constant(value=Ellipsis))]), match_case( pattern=MatchClass( - cls=Name(id='tuple', ctx=Load()), - patterns=[], - kwd_attrs=[], - kwd_patterns=[]), + cls=Name(id='tuple', ctx=Load())), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1489,8 +1469,7 @@ Pattern matching value=Constant(value='Relevant')), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1516,8 +1495,7 @@ Pattern matching pattern=MatchSingleton(value=None), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1549,8 +1527,7 @@ Pattern matching value=Constant(value=2))]), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1591,8 +1568,7 @@ Pattern matching MatchStar()]), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1636,11 +1612,10 @@ Pattern matching Expr( value=Constant(value=Ellipsis))]), match_case( - pattern=MatchMapping(keys=[], patterns=[], rest='rest'), + pattern=MatchMapping(rest='rest'), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1682,16 +1657,13 @@ Pattern matching MatchValue( value=Constant(value=0)), MatchValue( - value=Constant(value=0))], - kwd_attrs=[], - kwd_patterns=[]), + value=Constant(value=0))]), body=[ Expr( value=Constant(value=Ellipsis))]), match_case( pattern=MatchClass( cls=Name(id='Point3D', ctx=Load()), - patterns=[], kwd_attrs=[ 'x', 'y', @@ -1705,8 +1677,7 @@ Pattern matching value=Constant(value=0))]), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1748,8 +1719,7 @@ Pattern matching pattern=MatchAs(), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1782,8 +1752,7 @@ Pattern matching MatchAs(name='y')]), body=[ Expr( - value=Constant(value=Ellipsis))])])], - type_ignores=[]) + value=Constant(value=Ellipsis))])])]) .. versionadded:: 3.10 @@ -1795,15 +1764,17 @@ Type parameters :ref:`Type parameters <type-params>` can exist on classes, functions, and type aliases. -.. class:: TypeVar(name, bound) +.. class:: TypeVar(name, bound, default_value) A :class:`typing.TypeVar`. ``name`` is the name of the type variable. ``bound`` is the bound or constraints, if any. If ``bound`` is a :class:`Tuple`, - it represents constraints; otherwise it represents the bound. + it represents constraints; otherwise it represents the bound. ``default_value`` + is the default value; if the :class:`!TypeVar` has no default, this + attribute will be set to ``None``. .. doctest:: - >>> print(ast.dump(ast.parse("type Alias[T: int] = list[T]"), indent=4)) + >>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4)) Module( body=[ TypeAlias( @@ -1811,28 +1782,39 @@ aliases. type_params=[ TypeVar( name='T', - bound=Name(id='int', ctx=Load()))], + bound=Name(id='int', ctx=Load()), + default_value=Name(id='bool', ctx=Load()))], value=Subscript( value=Name(id='list', ctx=Load()), slice=Name(id='T', ctx=Load()), - ctx=Load()))], - type_ignores=[]) + ctx=Load()))]) .. versionadded:: 3.12 -.. class:: ParamSpec(name) + .. versionchanged:: 3.13 + Added the *default_value* parameter. + +.. class:: ParamSpec(name, default_value) A :class:`typing.ParamSpec`. ``name`` is the name of the parameter specification. + ``default_value`` is the default value; if the :class:`!ParamSpec` has no default, + this attribute will be set to ``None``. .. doctest:: - >>> print(ast.dump(ast.parse("type Alias[**P] = Callable[P, int]"), indent=4)) + >>> print(ast.dump(ast.parse("type Alias[**P = (int, str)] = Callable[P, int]"), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), type_params=[ - ParamSpec(name='P')], + ParamSpec( + name='P', + default_value=Tuple( + elts=[ + Name(id='int', ctx=Load()), + Name(id='str', ctx=Load())], + ctx=Load()))], value=Subscript( value=Name(id='Callable', ctx=Load()), slice=Tuple( @@ -1840,24 +1822,30 @@ aliases. Name(id='P', ctx=Load()), Name(id='int', ctx=Load())], ctx=Load()), - ctx=Load()))], - type_ignores=[]) + ctx=Load()))]) .. versionadded:: 3.12 -.. class:: TypeVarTuple(name) + .. versionchanged:: 3.13 + Added the *default_value* parameter. + +.. class:: TypeVarTuple(name, default_value) A :class:`typing.TypeVarTuple`. ``name`` is the name of the type variable tuple. + ``default_value`` is the default value; if the :class:`!TypeVarTuple` has no + default, this attribute will be set to ``None``. .. doctest:: - >>> print(ast.dump(ast.parse("type Alias[*Ts] = tuple[*Ts]"), indent=4)) + >>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), type_params=[ - TypeVarTuple(name='Ts')], + TypeVarTuple( + name='Ts', + default_value=Tuple(ctx=Load()))], value=Subscript( value=Name(id='tuple', ctx=Load()), slice=Tuple( @@ -1866,11 +1854,13 @@ aliases. value=Name(id='Ts', ctx=Load()), ctx=Load())], ctx=Load()), - ctx=Load()))], - type_ignores=[]) + ctx=Load()))]) .. versionadded:: 3.12 + .. versionchanged:: 3.13 + Added the *default_value* parameter. + Function and class definitions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1907,15 +1897,10 @@ Function and class definitions Expr( value=Lambda( args=arguments( - posonlyargs=[], args=[ arg(arg='x'), - arg(arg='y')], - kwonlyargs=[], - kw_defaults=[], - defaults=[]), - body=Constant(value=Ellipsis)))], - type_ignores=[]) + arg(arg='y')]), + body=Constant(value=Ellipsis)))]) .. class:: arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults) @@ -1935,8 +1920,7 @@ Function and class definitions .. class:: arg(arg, annotation, type_comment) A single argument in a list. ``arg`` is a raw string of the argument - name, ``annotation`` is its annotation, such as a :class:`Str` or - :class:`Name` node. + name; ``annotation`` is its annotation, such as a :class:`Name` node. .. attribute:: type_comment @@ -1955,7 +1939,6 @@ Function and class definitions FunctionDef( name='f', args=arguments( - posonlyargs=[], args=[ arg( arg='a', @@ -1978,9 +1961,7 @@ Function and class definitions decorator_list=[ Name(id='decorator1', ctx=Load()), Name(id='decorator2', ctx=Load())], - returns=Constant(value='return annotation'), - type_params=[])], - type_ignores=[]) + returns=Constant(value='return annotation'))]) .. class:: Return(value) @@ -1993,15 +1974,14 @@ Function and class definitions Module( body=[ Return( - value=Constant(value=4))], - type_ignores=[]) + value=Constant(value=4))]) .. class:: Yield(value) YieldFrom(value) A ``yield`` or ``yield from`` expression. Because these are expressions, they - must be wrapped in a :class:`Expr` node if the value sent back is not used. + must be wrapped in an :class:`Expr` node if the value sent back is not used. .. doctest:: @@ -2010,16 +1990,14 @@ Function and class definitions body=[ Expr( value=Yield( - value=Name(id='x', ctx=Load())))], - type_ignores=[]) + value=Name(id='x', ctx=Load())))]) >>> print(ast.dump(ast.parse('yield from x'), indent=4)) Module( body=[ Expr( value=YieldFrom( - value=Name(id='x', ctx=Load())))], - type_ignores=[]) + value=Name(id='x', ctx=Load())))]) .. class:: Global(names) @@ -2036,8 +2014,7 @@ Function and class definitions names=[ 'x', 'y', - 'z'])], - type_ignores=[]) + 'z'])]) >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) Module( @@ -2046,8 +2023,7 @@ Function and class definitions names=[ 'x', 'y', - 'z'])], - type_ignores=[]) + 'z'])]) .. class:: ClassDef(name, bases, keywords, body, decorator_list, type_params) @@ -2057,8 +2033,7 @@ Function and class definitions * ``name`` is a raw string for the class name * ``bases`` is a list of nodes for explicitly specified base classes. * ``keywords`` is a list of :class:`.keyword` nodes, principally for 'metaclass'. - Other keywords will be passed to the metaclass, as per `PEP-3115 - <https://peps.python.org/pep-3115/>`_. + Other keywords will be passed to the metaclass, as per :pep:`3115`. * ``body`` is a list of nodes representing the code within the class definition. * ``decorator_list`` is a list of nodes, as in :class:`FunctionDef`. @@ -2087,9 +2062,7 @@ Function and class definitions Pass()], decorator_list=[ Name(id='decorator1', ctx=Load()), - Name(id='decorator2', ctx=Load())], - type_params=[])], - type_ignores=[]) + Name(id='decorator2', ctx=Load())])]) .. versionchanged:: 3.12 Added ``type_params``. @@ -2121,22 +2094,12 @@ Async and await body=[ AsyncFunctionDef( name='f', - args=arguments( - posonlyargs=[], - args=[], - kwonlyargs=[], - kw_defaults=[], - defaults=[]), + args=arguments(), body=[ Expr( value=Await( value=Call( - func=Name(id='other_func', ctx=Load()), - args=[], - keywords=[])))], - decorator_list=[], - type_params=[])], - type_ignores=[]) + func=Name(id='other_func', ctx=Load()))))])]) .. class:: AsyncFor(target, iter, body, orelse, type_comment) @@ -2160,15 +2123,17 @@ Async and await Apart from the node classes, the :mod:`ast` module defines these utility functions and classes for traversing abstract syntax trees: -.. function:: parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None) +.. function:: parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1) Parse the source into an AST node. Equivalent to ``compile(source, - filename, mode, ast.PyCF_ONLY_AST)``. + filename, mode, flags=FLAGS_VALUE, optimize=optimize)``, + where ``FLAGS_VALUE`` is ``ast.PyCF_ONLY_AST`` if ``optimize <= 0`` + and ``ast.PyCF_OPTIMIZED_AST`` otherwise. If ``type_comments=True`` is given, the parser is modified to check and return type comments as specified by :pep:`484` and :pep:`526`. This is equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the - flags passed to :func:`compile()`. This will report syntax errors + flags passed to :func:`compile`. This will report syntax errors for misplaced type comments. Without this flag, type comments will be ignored, and the ``type_comment`` field on selected AST nodes will always be ``None``. In addition, the locations of ``# type: @@ -2179,14 +2144,17 @@ and classes for traversing abstract syntax trees: modified to correspond to :pep:`484` "signature type comments", e.g. ``(str, int) -> List[str]``. - Also, setting ``feature_version`` to a tuple ``(major, minor)`` - will attempt to parse using that Python version's grammar. - Currently ``major`` must equal to ``3``. For example, setting - ``feature_version=(3, 4)`` will allow the use of ``async`` and - ``await`` as variable names. The lowest supported version is - ``(3, 4)``; the highest is ``sys.version_info[0:2]``. + Setting ``feature_version`` to a tuple ``(major, minor)`` will result in + a "best-effort" attempt to parse using that Python version's grammar. + For example, setting ``feature_version=(3, 9)`` will attempt to disallow + parsing of :keyword:`match` statements. + Currently ``major`` must equal to ``3``. The lowest supported version is + ``(3, 7)`` (and this may increase in future Python versions); + the highest is ``sys.version_info[0:2]``. "Best-effort" attempt means there + is no guarantee that the parse (or success of the parse) is the same as + when run on the Python version corresponding to ``feature_version``. - If source contains a null character ('\0'), :exc:`ValueError` is raised. + If source contains a null character (``\0``), :exc:`ValueError` is raised. .. warning:: Note that successfully parsing source code into an AST object doesn't @@ -2207,6 +2175,10 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.8 Added ``type_comments``, ``mode='func_type'`` and ``feature_version``. + .. versionchanged:: 3.13 + The minimum supported version for ``feature_version`` is now ``(3, 7)``. + The ``optimize`` argument was added. + .. function:: unparse(ast_obj) @@ -2280,8 +2252,8 @@ and classes for traversing abstract syntax trees: .. function:: get_source_segment(source, node, *, padded=False) Get source code segment of the *source* that generated *node*. - If some location information (:attr:`lineno`, :attr:`end_lineno`, - :attr:`col_offset`, or :attr:`end_col_offset`) is missing, return ``None``. + If some location information (:attr:`~ast.AST.lineno`, :attr:`~ast.AST.end_lineno`, + :attr:`~ast.AST.col_offset`, or :attr:`~ast.AST.end_col_offset`) is missing, return ``None``. If *padded* is ``True``, the first line of a multi-line statement will be padded with spaces to match its original position. @@ -2292,7 +2264,7 @@ and classes for traversing abstract syntax trees: .. function:: fix_missing_locations(node) When you compile a node tree with :func:`compile`, the compiler expects - :attr:`lineno` and :attr:`col_offset` attributes for every node that supports + :attr:`~ast.AST.lineno` and :attr:`~ast.AST.col_offset` attributes for every node that supports them. This is rather tedious to fill in for generated nodes, so this helper adds these attributes recursively where not already set, by setting them to the values of the parent node. It works recursively starting at *node*. @@ -2307,8 +2279,8 @@ and classes for traversing abstract syntax trees: .. function:: copy_location(new_node, old_node) - Copy source location (:attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`, - and :attr:`end_col_offset`) from *old_node* to *new_node* if possible, + Copy source location (:attr:`~ast.AST.lineno`, :attr:`~ast.AST.col_offset`, :attr:`~ast.AST.end_lineno`, + and :attr:`~ast.AST.end_col_offset`) from *old_node* to *new_node* if possible, and return *new_node*. @@ -2354,14 +2326,18 @@ and classes for traversing abstract syntax trees: visited unless the visitor calls :meth:`generic_visit` or visits them itself. + .. method:: visit_Constant(node) + + Handles all constant nodes. + Don't use the :class:`NodeVisitor` if you want to apply changes to nodes during traversal. For this a special visitor exists (:class:`NodeTransformer`) that allows modifications. .. deprecated:: 3.8 - Methods :meth:`visit_Num`, :meth:`visit_Str`, :meth:`visit_Bytes`, - :meth:`visit_NameConstant` and :meth:`visit_Ellipsis` are deprecated + Methods :meth:`!visit_Num`, :meth:`!visit_Str`, :meth:`!visit_Bytes`, + :meth:`!visit_NameConstant` and :meth:`!visit_Ellipsis` are deprecated now and will not be called in future Python versions. Add the :meth:`visit_Constant` method to handle all constant nodes. @@ -2390,7 +2366,7 @@ and classes for traversing abstract syntax trees: ) Keep in mind that if the node you're operating on has child nodes you must - either transform the child nodes yourself or call the :meth:`generic_visit` + either transform the child nodes yourself or call the :meth:`~ast.NodeVisitor.generic_visit` method for the node first. For nodes that were part of a collection of statements (that applies to all @@ -2399,7 +2375,7 @@ and classes for traversing abstract syntax trees: If :class:`NodeTransformer` introduces new nodes (that weren't part of original tree) without giving them location information (such as - :attr:`lineno`), :func:`fix_missing_locations` should be called with + :attr:`~ast.AST.lineno`), :func:`fix_missing_locations` should be called with the new sub-tree to recalculate the location information:: tree = ast.parse('foo', mode='eval') @@ -2410,7 +2386,7 @@ and classes for traversing abstract syntax trees: node = YourTransformer().visit(node) -.. function:: dump(node, annotate_fields=True, include_attributes=False, *, indent=None) +.. function:: dump(node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False) Return a formatted dump of the tree in *node*. This is mainly useful for debugging purposes. If *annotate_fields* is true (by default), @@ -2427,9 +2403,42 @@ and classes for traversing abstract syntax trees: indents that many spaces per level. If *indent* is a string (such as ``"\t"``), that string is used to indent each level. + If *show_empty* is ``False`` (the default), empty lists and fields that are ``None`` + will be omitted from the output. + .. versionchanged:: 3.9 Added the *indent* option. + .. versionchanged:: 3.13 + Added the *show_empty* option. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... async def f(): + ... await other_func() + ... """), indent=4, show_empty=True)) + Module( + body=[ + AsyncFunctionDef( + name='f', + args=arguments( + posonlyargs=[], + args=[], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=[ + Expr( + value=Await( + value=Call( + func=Name(id='other_func', ctx=Load()), + args=[], + keywords=[])))], + decorator_list=[], + type_params=[])], + type_ignores=[]) + .. _ast-compiler-flags: @@ -2451,6 +2460,13 @@ effects on the compilation of a program: Generates and returns an abstract syntax tree instead of returning a compiled code object. +.. data:: PyCF_OPTIMIZED_AST + + The returned AST is optimized according to the *optimize* argument + in :func:`compile` or :func:`ast.parse`. + + .. versionadded:: 3.13 + .. data:: PyCF_TYPE_COMMENTS Enables support for :pep:`484` and :pep:`526` style type comments @@ -2477,26 +2493,26 @@ The following options are accepted: .. program:: ast -.. cmdoption:: -h, --help +.. option:: -h, --help Show the help message and exit. -.. cmdoption:: -m <mode> - --mode <mode> +.. option:: -m <mode> + --mode <mode> Specify what kind of code must be compiled, like the *mode* argument in :func:`parse`. -.. cmdoption:: --no-type-comments +.. option:: --no-type-comments Don't parse type comments. -.. cmdoption:: -a, --include-attributes +.. option:: -a, --include-attributes Include attributes such as line numbers and column offsets. -.. cmdoption:: -i <indent> - --indent <indent> +.. option:: -i <indent> + --indent <indent> Indentation of nodes in AST (number of spaces). @@ -2514,7 +2530,8 @@ to stdout. Otherwise, the content is read from stdin. code that generated them. This is helpful for tools that make source code transformations. - `leoAst.py <https://leoeditor.com/appendices.html#leoast-py>`_ unifies the + `leoAst.py <https://leo-editor.github.io/leo-editor/appendices.html#leoast-py>`_ + unifies the token-based and parse-tree-based views of python programs by inserting two-way links between tokens and ast nodes. @@ -2526,4 +2543,4 @@ to stdout. Otherwise, the content is read from stdin. `Parso <https://parso.readthedocs.io>`_ is a Python parser that supports error recovery and round-trip parsing for different Python versions (in multiple Python versions). Parso is also able to list multiple syntax errors - in your python file. + in your Python file. diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst new file mode 100644 index 00000000..5e5c3a99 --- /dev/null +++ b/Doc/library/asynchat.rst @@ -0,0 +1,17 @@ +:mod:`!asynchat` --- Asynchronous socket command/response handler +================================================================= + +.. module:: asynchat + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 <whatsnew312-removed>` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +Applications should use the :mod:`asyncio` module instead. + +The last version of Python that provided the :mod:`!asynchat` module was +`Python 3.11 <https://docs.python.org/3.11/library/asynchat.html>`_. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 04af53b9..8d7d0377 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -126,7 +126,7 @@ Running and stopping the loop Run the event loop until :meth:`stop` is called. - If :meth:`stop` is called before :meth:`run_forever()` is called, + If :meth:`stop` is called before :meth:`run_forever` is called, the loop will poll the I/O selector once with a timeout of zero, run all callbacks scheduled in response to I/O events (and those that were already scheduled), and then exit. @@ -165,7 +165,7 @@ Running and stopping the loop .. coroutinemethod:: loop.shutdown_asyncgens() Schedule all currently open :term:`asynchronous generator` objects to - close with an :meth:`~agen.aclose()` call. After calling this method, + close with an :meth:`~agen.aclose` call. After calling this method, the event loop will issue a warning if a new asynchronous generator is iterated. This should be used to reliably finalize all scheduled asynchronous generators. @@ -243,9 +243,9 @@ Scheduling callbacks See the :ref:`concurrency and multithreading <asyncio-multithreading>` section of the documentation. -.. versionchanged:: 3.7 - The *context* keyword-only parameter was added. See :pep:`567` - for more details. + .. versionchanged:: 3.7 + The *context* keyword-only parameter was added. See :pep:`567` + for more details. .. _asyncio-pass-keywords: @@ -509,7 +509,7 @@ Opening network connections .. versionchanged:: 3.6 - The socket option :py:const:`~socket.TCP_NODELAY` is set by default + The socket option :ref:`socket.TCP_NODELAY <socket-unix-constants>` is set by default for all TCP connections. .. versionchanged:: 3.7 @@ -581,7 +581,7 @@ Opening network connections * *reuse_port* tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows - and some Unixes. If the :py:const:`~socket.SO_REUSEPORT` constant is not + and some Unixes. If the :ref:`socket.SO_REUSEPORT <socket-unix-constants>` constant is not defined then this capability is unsupported. * *allow_broadcast* tells the kernel to allow this endpoint to send @@ -605,9 +605,13 @@ Opening network connections The *family*, *proto*, *flags*, *reuse_address*, *reuse_port*, *allow_broadcast*, and *sock* parameters were added. + .. versionchanged:: 3.8 + Added support for Windows. + .. versionchanged:: 3.8.1 The *reuse_address* parameter is no longer supported, as using - :py:const:`~sockets.SO_REUSEADDR` poses a significant security concern for + :ref:`socket.SO_REUSEADDR <socket-unix-constants>` + poses a significant security concern for UDP. Explicitly passing ``reuse_address=True`` will raise an exception. When multiple processes with differing UIDs assign sockets to an @@ -616,15 +620,13 @@ Opening network connections For supported platforms, *reuse_port* can be used as a replacement for similar functionality. With *reuse_port*, - :py:const:`~sockets.SO_REUSEPORT` is used instead, which specifically + :ref:`socket.SO_REUSEPORT <socket-unix-constants>` + is used instead, which specifically prevents processes with differing UIDs from assigning sockets to the same socket address. - .. versionchanged:: 3.8 - Added support for Windows. - .. versionchanged:: 3.11 - The *reuse_address* parameter, disabled since Python 3.9.0, 3.8.1, + The *reuse_address* parameter, disabled since Python 3.8.1, 3.7.6 and 3.6.10, has been entirely removed. .. coroutinemethod:: loop.create_unix_connection(protocol_factory, \ @@ -661,12 +663,15 @@ Opening network connections Creating network servers ^^^^^^^^^^^^^^^^^^^^^^^^ +.. _loop_create_server: + .. coroutinemethod:: loop.create_server(protocol_factory, \ host=None, port=None, *, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, \ sock=None, backlog=100, ssl=None, \ reuse_address=None, reuse_port=None, \ + keep_alive=None, \ ssl_handshake_timeout=None, \ ssl_shutdown_timeout=None, \ start_serving=True) @@ -731,6 +736,13 @@ Creating network servers set this flag when being created. This option is not supported on Windows. + * *keep_alive* set to ``True`` keeps connections active by enabling the + periodic transmission of messages. + + .. versionchanged:: 3.13 + + Added the *keep_alive* parameter. + * *ssl_handshake_timeout* is (for a TLS server) the time in seconds to wait for the TLS handshake to complete before aborting the connection. ``60.0`` seconds if ``None`` (default). @@ -756,7 +768,7 @@ Creating network servers .. versionchanged:: 3.6 Added *ssl_handshake_timeout* and *start_serving* parameters. - The socket option :py:const:`~socket.TCP_NODELAY` is set by default + The socket option :ref:`socket.TCP_NODELAY <socket-unix-constants>` is set by default for all TCP connections. .. versionchanged:: 3.11 @@ -774,7 +786,7 @@ Creating network servers *, sock=None, backlog=100, ssl=None, \ ssl_handshake_timeout=None, \ ssl_shutdown_timeout=None, \ - start_serving=True) + start_serving=True, cleanup_socket=True) Similar to :meth:`loop.create_server` but works with the :py:const:`~socket.AF_UNIX` socket family. @@ -784,6 +796,10 @@ Creating network servers :class:`str`, :class:`bytes`, and :class:`~pathlib.Path` paths are supported. + If *cleanup_socket* is true then the Unix socket will automatically + be removed from the filesystem when the server is closed, unless the + socket has been replaced after the server has been created. + See the documentation of the :meth:`loop.create_server` method for information about arguments to this method. @@ -798,6 +814,10 @@ Creating network servers Added the *ssl_shutdown_timeout* parameter. + .. versionchanged:: 3.13 + + Added the *cleanup_socket* parameter. + .. coroutinemethod:: loop.connect_accepted_socket(protocol_factory, \ sock, *, ssl=None, ssl_handshake_timeout=None, \ @@ -1135,6 +1155,14 @@ DNS Asynchronous version of :meth:`socket.getnameinfo`. +.. note:: + Both *getaddrinfo* and *getnameinfo* internally utilize their synchronous + versions through the loop's default thread pool executor. + When this executor is saturated, these methods may experience delays, + which higher-level networking libraries may report as increased timeouts. + To mitigate this, consider using a custom executor for other user tasks, + or setting a default executor with a larger number of workers. + .. versionchanged:: 3.7 Both *getaddrinfo* and *getnameinfo* methods were always documented to return a coroutine, but prior to Python 3.7 they were, in fact, @@ -1191,6 +1219,8 @@ Working with pipes Unix signals ^^^^^^^^^^^^ +.. _loop_add_signal_handler: + .. method:: loop.add_signal_handler(signum, callback, *args) Set *callback* as the handler for the *signum* signal. @@ -1232,6 +1262,9 @@ Executing code in thread or process pools The *executor* argument should be an :class:`concurrent.futures.Executor` instance. The default executor is used if *executor* is ``None``. + The default executor can be set by :meth:`loop.set_default_executor`, + otherwise, a :class:`concurrent.futures.ThreadPoolExecutor` will be + lazy-initialized and used by :func:`run_in_executor` if needed. Example:: @@ -1369,7 +1402,7 @@ Allows customizing how exceptions are handled in the event loop. This method should not be overloaded in subclassed event loops. For custom exception handling, use - the :meth:`set_exception_handler()` method. + the :meth:`set_exception_handler` method. Enabling debug mode ^^^^^^^^^^^^^^^^^^^ @@ -1391,6 +1424,14 @@ Enabling debug mode The new :ref:`Python Development Mode <devmode>` can now also be used to enable the debug mode. +.. attribute:: loop.slow_callback_duration + + This attribute can be used to set the + minimum execution duration in seconds that is considered "slow". + When debug mode is enabled, "slow" callbacks are logged. + + Default value is 100 milliseconds. + .. seealso:: The :ref:`debug mode of asyncio <asyncio-debug-mode>`. @@ -1411,6 +1452,8 @@ async/await code consider using the high-level :ref:`Subprocess Support on Windows <asyncio-windows-subprocess>` for details. +.. _loop_subprocess_exec: + .. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ stderr=subprocess.PIPE, **kwargs) @@ -1442,7 +1485,7 @@ async/await code consider using the high-level * *stdin* can be any of these: * a file-like object - * an existing file descriptor (a positive integer), for example those created with :meth:`os.pipe()` + * an existing file descriptor (a positive integer), for example those created with :meth:`os.pipe` * the :const:`subprocess.PIPE` constant (default) which will create a new pipe and connect it, * the value ``None`` which will make the subprocess inherit the file @@ -1605,8 +1648,34 @@ Do not instantiate the :class:`Server` class directly. The sockets that represent existing incoming client connections are left open. - The server is closed asynchronously, use the :meth:`wait_closed` - coroutine to wait until the server is closed. + The server is closed asynchronously; use the :meth:`wait_closed` + coroutine to wait until the server is closed (and no more + connections are active). + + .. method:: close_clients() + + Close all existing incoming client connections. + + Calls :meth:`~asyncio.BaseTransport.close` on all associated + transports. + + :meth:`close` should be called before :meth:`close_clients` when + closing the server to avoid races with new clients connecting. + + .. versionadded:: 3.13 + + .. method:: abort_clients() + + Close all existing incoming client connections immediately, + without waiting for pending operations to complete. + + Calls :meth:`~asyncio.WriteTransport.abort` on all associated + transports. + + :meth:`close` should be called before :meth:`abort_clients` when + closing the server to avoid races with new clients connecting. + + .. versionadded:: 3.13 .. method:: get_loop() @@ -1664,7 +1733,8 @@ Do not instantiate the :class:`Server` class directly. .. coroutinemethod:: wait_closed() - Wait until the :meth:`close` method completes. + Wait until the :meth:`close` method completes and all active + connections have finished. .. attribute:: sockets @@ -1686,13 +1756,13 @@ Event Loop Implementations asyncio ships with two different event loop implementations: :class:`SelectorEventLoop` and :class:`ProactorEventLoop`. -By default asyncio is configured to use :class:`SelectorEventLoop` -on Unix and :class:`ProactorEventLoop` on Windows. +By default asyncio is configured to use :class:`EventLoop`. .. class:: SelectorEventLoop - An event loop based on the :mod:`selectors` module. + A subclass of :class:`AbstractEventLoop` based on the + :mod:`selectors` module. Uses the most efficient *selector* available for the given platform. It is also possible to manually configure the @@ -1714,15 +1784,23 @@ on Unix and :class:`ProactorEventLoop` on Windows. .. class:: ProactorEventLoop - An event loop for Windows that uses "I/O Completion Ports" (IOCP). + A subclass of :class:`AbstractEventLoop` for Windows that uses "I/O Completion Ports" (IOCP). .. availability:: Windows. .. seealso:: `MSDN documentation on I/O Completion Ports - <https://docs.microsoft.com/en-ca/windows/desktop/FileIO/i-o-completion-ports>`_. + <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports>`_. + +.. class:: EventLoop + + An alias to the most efficient available subclass of :class:`AbstractEventLoop` for the given + platform. + + It is an alias to :class:`SelectorEventLoop` on Unix and :class:`ProactorEventLoop` on Windows. + .. versionadded:: 3.13 .. class:: AbstractEventLoop @@ -1872,7 +1950,7 @@ Set signal handlers for SIGINT and SIGTERM (This ``signals`` example only works on Unix.) -Register handlers for signals :py:data:`SIGINT` and :py:data:`SIGTERM` +Register handlers for signals :const:`~signal.SIGINT` and :const:`~signal.SIGTERM` using the :meth:`loop.add_signal_handler` method:: import asyncio diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index 893ae551..9dce0731 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -120,20 +120,20 @@ Future Object a :exc:`CancelledError` exception. If the Future's result isn't yet available, this method raises - a :exc:`InvalidStateError` exception. + an :exc:`InvalidStateError` exception. .. method:: set_result(result) Mark the Future as *done* and set its result. - Raises a :exc:`InvalidStateError` error if the Future is + Raises an :exc:`InvalidStateError` error if the Future is already *done*. .. method:: set_exception(exception) Mark the Future as *done* and set an exception. - Raises a :exc:`InvalidStateError` error if the Future is + Raises an :exc:`InvalidStateError` error if the Future is already *done*. .. method:: done() diff --git a/Doc/library/asyncio-llapi-index.rst b/Doc/library/asyncio-llapi-index.rst index 9ce48a24..3e21054a 100644 --- a/Doc/library/asyncio-llapi-index.rst +++ b/Doc/library/asyncio-llapi-index.rst @@ -56,10 +56,10 @@ See also the main documentation section about the * - :meth:`loop.close` - Close the event loop. - * - :meth:`loop.is_running()` + * - :meth:`loop.is_running` - Return ``True`` if the event loop is running. - * - :meth:`loop.is_closed()` + * - :meth:`loop.is_closed` - Return ``True`` if the event loop is closed. * - ``await`` :meth:`loop.shutdown_asyncgens` @@ -484,19 +484,19 @@ Protocol classes can implement the following **callback methods**: :widths: 50 50 :class: full-width-table - * - ``callback`` :meth:`pipe_data_received() - <SubprocessProtocol.pipe_data_received>` + * - ``callback`` :meth:`~SubprocessProtocol.pipe_data_received` - Called when the child process writes data into its *stdout* or *stderr* pipe. - * - ``callback`` :meth:`pipe_connection_lost() - <SubprocessProtocol.pipe_connection_lost>` + * - ``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost` - Called when one of the pipes communicating with the child process is closed. * - ``callback`` :meth:`process_exited() <SubprocessProtocol.process_exited>` - - Called when the child process has exited. + - Called when the child process has exited. It can be called before + :meth:`~SubprocessProtocol.pipe_data_received` and + :meth:`~SubprocessProtocol.pipe_connection_lost` methods. Event Loop Policies diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index 0d7821e6..346b740a 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -237,7 +237,7 @@ implementation used by the asyncio event loop: It works reliably even when the asyncio event loop is run in a non-main OS thread. - There is no noticeable overhead when handling a big number of children (*O(1)* each + There is no noticeable overhead when handling a big number of children (*O*\ (1) each time a child terminates), but starting a thread per process requires extra memory. This watcher is used by default. @@ -257,7 +257,7 @@ implementation used by the asyncio event loop: watcher is installed. The solution is safe but it has a significant overhead when - handling a big number of processes (*O(n)* each time a + handling a big number of processes (*O*\ (*n*) each time a :py:data:`SIGCHLD` is received). .. versionadded:: 3.8 @@ -273,7 +273,7 @@ implementation used by the asyncio event loop: The watcher avoids disrupting other code spawning processes by polling every process explicitly on a :py:data:`SIGCHLD` signal. - This solution is as safe as :class:`MultiLoopChildWatcher` and has the same *O(N)* + This solution is as safe as :class:`MultiLoopChildWatcher` and has the same *O*\ (*n*) complexity but requires a running event loop in the main thread to work. .. deprecated:: 3.12 @@ -285,7 +285,7 @@ implementation used by the asyncio event loop: processes and waiting for their termination. There is no noticeable overhead when handling a big number of - children (*O(1)* each time a child terminates). + children (*O*\ (1) each time a child terminates). This solution requires a running event loop in the main thread to work, as :class:`SafeChildWatcher`. diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 7bc906ea..7c08d65f 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -362,6 +362,11 @@ Datagram Transports This method does not block; it buffers the data and arranges for it to be sent out asynchronously. + .. versionchanged:: 3.13 + This method can be called with an empty bytes object to send a + zero-length datagram. The buffer size calculation used for flow + control is also updated to account for the datagram header. + .. method:: DatagramTransport.abort() Close the transport immediately, without waiting for pending @@ -417,8 +422,8 @@ Subprocess Transports Stop the subprocess. - On POSIX systems, this method sends SIGTERM to the subprocess. - On Windows, the Windows API function TerminateProcess() is called to + On POSIX systems, this method sends :py:const:`~signal.SIGTERM` to the subprocess. + On Windows, the Windows API function :c:func:`!TerminateProcess` is called to stop the subprocess. See also :meth:`subprocess.Popen.terminate`. @@ -708,6 +713,9 @@ factories passed to the :meth:`loop.subprocess_exec` and Called when the child process has exited. + It can be called before :meth:`~SubprocessProtocol.pipe_data_received` and + :meth:`~SubprocessProtocol.pipe_connection_lost` methods. + Examples ======== @@ -746,7 +754,7 @@ received data, and close the connection:: loop = asyncio.get_running_loop() server = await loop.create_server( - lambda: EchoServerProtocol(), + EchoServerProtocol, '127.0.0.1', 8888) async with server: @@ -850,7 +858,7 @@ method, sends back received data:: # One protocol instance will be created to serve all # client requests. transport, protocol = await loop.create_datagram_endpoint( - lambda: EchoServerProtocol(), + EchoServerProtocol, local_addr=('127.0.0.1', 9999)) try: @@ -1003,12 +1011,26 @@ The subprocess is created by the :meth:`loop.subprocess_exec` method:: def __init__(self, exit_future): self.exit_future = exit_future self.output = bytearray() + self.pipe_closed = False + self.exited = False + + def pipe_connection_lost(self, fd, exc): + self.pipe_closed = True + self.check_for_exit() def pipe_data_received(self, fd, data): self.output.extend(data) def process_exited(self): - self.exit_future.set_result(True) + self.exited = True + # process_exited() method can be called before + # pipe_connection_lost() method: wait until both methods are + # called. + self.check_for_exit() + + def check_for_exit(self): + if self.pipe_closed and self.exited: + self.exit_future.set_result(True) async def get_date(): # Get a reference to the event loop as we plan to use diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index d86fbc21..61991bf2 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -55,13 +55,16 @@ Queue Return ``True`` if there are :attr:`maxsize` items in the queue. If the queue was initialized with ``maxsize=0`` (the default), - then :meth:`full()` never returns ``True``. + then :meth:`full` never returns ``True``. .. coroutinemethod:: get() Remove and return an item from the queue. If queue is empty, wait until an item is available. + Raises :exc:`QueueShutDown` if the queue has been shut down and + is empty, or if the queue has been shut down immediately. + .. method:: get_nowait() Return an item if one is immediately available, else raise @@ -82,6 +85,8 @@ Queue Put an item into the queue. If the queue is full, wait until a free slot is available before adding the item. + Raises :exc:`QueueShutDown` if the queue has been shut down. + .. method:: put_nowait(item) Put an item into the queue without blocking. @@ -92,6 +97,22 @@ Queue Return the number of items in the queue. + .. method:: shutdown(immediate=False) + + Shut down the queue, making :meth:`~Queue.get` and :meth:`~Queue.put` + raise :exc:`QueueShutDown`. + + By default, :meth:`~Queue.get` on a shut down queue will only + raise once the queue is empty. Set *immediate* to true to make + :meth:`~Queue.get` raise immediately instead. + + All blocked callers of :meth:`~Queue.put` and :meth:`~Queue.get` + will be unblocked. If *immediate* is true, a task will be marked + as done for each remaining item in the queue, which may unblock + callers of :meth:`~Queue.join`. + + .. versionadded:: 3.13 + .. method:: task_done() Indicate that a formerly enqueued task is complete. @@ -105,6 +126,9 @@ Queue call was received for every item that had been :meth:`~Queue.put` into the queue). + ``shutdown(immediate=True)`` calls :meth:`task_done` for each + remaining item in the queue. + Raises :exc:`ValueError` if called more times than there were items placed in the queue. @@ -145,6 +169,14 @@ Exceptions on a queue that has reached its *maxsize*. +.. exception:: QueueShutDown + + Exception raised when :meth:`~Queue.put` or :meth:`~Queue.get` is + called on a queue which has been shut down. + + .. versionadded:: 3.13 + + Examples ======== diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst index b68b2570..8312e551 100644 --- a/Doc/library/asyncio-runner.rst +++ b/Doc/library/asyncio-runner.rst @@ -42,6 +42,8 @@ Running an asyncio Program This function should be used as a main entry point for asyncio programs, and should ideally only be called once. It is recommended to use *loop_factory* to configure the event loop instead of policies. + Passing :class:`asyncio.EventLoop` allows running asyncio without the + policy system. The executor is given a timeout duration of 5 minutes to shutdown. If the executor hasn't finished within that duration, a warning is @@ -89,7 +91,7 @@ Runner context manager current one. By default :func:`asyncio.new_event_loop` is used and set as current event loop with :func:`asyncio.set_event_loop` if *loop_factory* is ``None``. - Basically, :func:`asyncio.run()` example can be rewritten with the runner usage:: + Basically, :func:`asyncio.run` example can be rewritten with the runner usage:: async def main(): await asyncio.sleep(1) diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index bbac1c32..48f2890c 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -77,8 +77,8 @@ and work with streams: .. versionchanged:: 3.7 Added the *ssl_handshake_timeout* parameter. - .. versionadded:: 3.8 - Added *happy_eyeballs_delay* and *interleave* parameters. + .. versionchanged:: 3.8 + Added the *happy_eyeballs_delay* and *interleave* parameters. .. versionchanged:: 3.10 Removed the *loop* parameter. @@ -92,7 +92,8 @@ and work with streams: family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, sock=None, \ backlog=100, ssl=None, reuse_address=None, \ - reuse_port=None, ssl_handshake_timeout=None, \ + reuse_port=None, keep_alive=None, \ + ssl_handshake_timeout=None, \ ssl_shutdown_timeout=None, start_serving=True) Start a socket server. @@ -128,6 +129,9 @@ and work with streams: .. versionchanged:: 3.11 Added the *ssl_shutdown_timeout* parameter. + .. versionchanged:: 3.13 + Added the *keep_alive* parameter. + .. rubric:: Unix Sockets @@ -157,8 +161,8 @@ and work with streams: .. versionchanged:: 3.10 Removed the *loop* parameter. - .. versionchanged:: 3.11 - Added the *ssl_shutdown_timeout* parameter. + .. versionchanged:: 3.11 + Added the *ssl_shutdown_timeout* parameter. .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ @@ -204,6 +208,10 @@ StreamReader directly; use :func:`open_connection` and :func:`start_server` instead. + .. method:: feed_eof() + + Acknowledge the EOF. + .. coroutinemethod:: read(n=-1) Read up to *n* bytes from the stream. @@ -256,8 +264,19 @@ StreamReader buffer is reset. The :attr:`IncompleteReadError.partial` attribute may contain a portion of the separator. + The *separator* may also be a tuple of separators. In this + case the return value will be the shortest possible that has any + separator as the suffix. For the purposes of :exc:`LimitOverrunError`, + the shortest possible separator is considered to be the one that + matched. + .. versionadded:: 3.5.2 + .. versionchanged:: 3.13 + + The *separator* parameter may now be a :class:`tuple` of + separators. + .. method:: at_eof() Return ``True`` if the buffer is empty and :meth:`feed_eof` @@ -343,7 +362,7 @@ StreamWriter be resumed. When there is nothing to wait for, the :meth:`drain` returns immediately. - .. coroutinemethod:: start_tls(sslcontext, \*, server_hostname=None, \ + .. coroutinemethod:: start_tls(sslcontext, *, server_hostname=None, \ ssl_handshake_timeout=None, ssl_shutdown_timeout=None) Upgrade an existing stream-based connection to TLS. diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index bf35b1cb..817a6ff3 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -240,7 +240,7 @@ their completion. .. note:: - On Windows, :py:data:`SIGTERM` is an alias for :meth:`terminate`. + On Windows, :py:const:`~signal.SIGTERM` is an alias for :meth:`terminate`. ``CTRL_C_EVENT`` and ``CTRL_BREAK_EVENT`` can be sent to processes started with a *creationflags* parameter which includes ``CREATE_NEW_PROCESS_GROUP``. @@ -249,10 +249,10 @@ their completion. Stop the child process. - On POSIX systems this method sends :py:const:`signal.SIGTERM` to the + On POSIX systems this method sends :py:const:`~signal.SIGTERM` to the child process. - On Windows the Win32 API function :c:func:`TerminateProcess` is + On Windows the Win32 API function :c:func:`!TerminateProcess` is called to stop the child process. .. method:: kill() diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index 05bdf548..77c2e97d 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -216,8 +216,8 @@ Condition .. method:: notify(n=1) - Wake up at most *n* tasks (1 by default) waiting on this - condition. The method is no-op if no tasks are waiting. + Wake up *n* tasks (1 by default) waiting on this + condition. If fewer than *n* tasks are waiting they are all awakened. The lock must be acquired before this method is called and released shortly after. If called with an *unlocked* lock @@ -257,12 +257,18 @@ Condition Once awakened, the Condition re-acquires its lock and this method returns ``True``. + Note that a task *may* return from this call spuriously, + which is why the caller should always re-check the state + and be prepared to :meth:`~Condition.wait` again. For this reason, you may + prefer to use :meth:`~Condition.wait_for` instead. + .. coroutinemethod:: wait_for(predicate) Wait until a predicate becomes *true*. The predicate must be a callable which result will be - interpreted as a boolean value. The final value is the + interpreted as a boolean value. The method will repeatedly + :meth:`~Condition.wait` until the predicate evaluates to *true*. The final value is the return value. @@ -428,7 +434,7 @@ Barrier .. coroutinemethod:: abort() Put the barrier into a broken state. This causes any active or future - calls to :meth:`wait` to fail with the :class:`BrokenBarrierError`. + calls to :meth:`~Barrier.wait` to fail with the :class:`BrokenBarrierError`. Use this for example if one of the tasks needs to abort, to avoid infinite waiting tasks. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index f488aa73..f27e858c 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -158,7 +158,7 @@ other coroutines:: # Nothing happens if we just call "nested()". # A coroutine object is created but not awaited, # so it *won't run at all*. - nested() + nested() # will raise a "RuntimeWarning". # Let's do it differently now and await it: print(await nested()) # will print "42". @@ -334,6 +334,13 @@ and reliable way to wait for all tasks in the group to finish. Create a task in this task group. The signature matches that of :func:`asyncio.create_task`. + If the task group is inactive (e.g. not yet entered, + already finished, or in the process of shutting down), + we will close the given ``coro``. + + .. versionchanged:: 3.13 + + Close the given coroutine if the task group is not active. Example:: @@ -385,6 +392,74 @@ is also included in the exception group. The same special case is made for :exc:`KeyboardInterrupt` and :exc:`SystemExit` as in the previous paragraph. +Task groups are careful not to mix up the internal cancellation used to +"wake up" their :meth:`~object.__aexit__` with cancellation requests +for the task in which they are running made by other parties. +In particular, when one task group is syntactically nested in another, +and both experience an exception in one of their child tasks simultaneously, +the inner task group will process its exceptions, and then the outer task group +will receive another cancellation and process its own exceptions. + +In the case where a task group is cancelled externally and also must +raise an :exc:`ExceptionGroup`, it will call the parent task's +:meth:`~asyncio.Task.cancel` method. This ensures that a +:exc:`asyncio.CancelledError` will be raised at the next +:keyword:`await`, so the cancellation is not lost. + +Task groups preserve the cancellation count +reported by :meth:`asyncio.Task.cancelling`. + +.. versionchanged:: 3.13 + + Improved handling of simultaneous internal and external cancellations + and correct preservation of cancellation counts. + +Terminating a Task Group +------------------------ + +While terminating a task group is not natively supported by the standard +library, termination can be achieved by adding an exception-raising task +to the task group and ignoring the raised exception: + +.. code-block:: python + + import asyncio + from asyncio import TaskGroup + + class TerminateTaskGroup(Exception): + """Exception raised to terminate a task group.""" + + async def force_terminate_task_group(): + """Used to force termination of a task group.""" + raise TerminateTaskGroup() + + async def job(task_id, sleep_time): + print(f'Task {task_id}: start') + await asyncio.sleep(sleep_time) + print(f'Task {task_id}: done') + + async def main(): + try: + async with TaskGroup() as group: + # spawn some tasks + group.create_task(job(1, 0.5)) + group.create_task(job(2, 1.5)) + # sleep for 1 second + await asyncio.sleep(1) + # add an exception-raising task to force the group to terminate + group.create_task(force_terminate_task_group()) + except* TerminateTaskGroup: + pass + + asyncio.run(main()) + +Expected output: + +.. code-block:: text + + Task 1: start + Task 2: start + Task 1: done Sleeping ======== @@ -426,6 +501,9 @@ Sleeping .. versionchanged:: 3.10 Removed the *loop* parameter. + .. versionchanged:: 3.13 + Raises :exc:`ValueError` if *delay* is :data:`~math.nan`. + Running Tasks Concurrently ========================== @@ -507,7 +585,7 @@ Running Tasks Concurrently # [2, 6, 24] .. note:: - If *return_exceptions* is False, cancelling gather() after it + If *return_exceptions* is false, cancelling gather() after it has been marked done won't cancel any submitted awaitables. For instance, gather can be marked done after propagating an exception to the caller, therefore, calling ``gather.cancel()`` @@ -764,9 +842,6 @@ Timeouts If the wait is cancelled, the future *aw* is also cancelled. - .. versionchanged:: 3.10 - Removed the *loop* parameter. - .. _asyncio_example_waitfor: Example:: @@ -797,6 +872,9 @@ Timeouts .. versionchanged:: 3.10 Removed the *loop* parameter. + .. versionchanged:: 3.11 + Raises :exc:`TimeoutError` instead of :exc:`asyncio.TimeoutError`. + Waiting Primitives ================== @@ -825,23 +903,22 @@ Waiting Primitives *return_when* indicates when this function should return. It must be one of the following constants: - .. tabularcolumns:: |l|L| - - +-----------------------------+----------------------------------------+ - | Constant | Description | - +=============================+========================================+ - | :const:`FIRST_COMPLETED` | The function will return when any | - | | future finishes or is cancelled. | - +-----------------------------+----------------------------------------+ - | :const:`FIRST_EXCEPTION` | The function will return when any | - | | future finishes by raising an | - | | exception. If no future raises an | - | | exception then it is equivalent to | - | | :const:`ALL_COMPLETED`. | - +-----------------------------+----------------------------------------+ - | :const:`ALL_COMPLETED` | The function will return when all | - | | futures finish or are cancelled. | - +-----------------------------+----------------------------------------+ + .. list-table:: + :header-rows: 1 + + * - Constant + - Description + + * - .. data:: FIRST_COMPLETED + - The function will return when any future finishes or is cancelled. + + * - .. data:: FIRST_EXCEPTION + - The function will return when any future finishes by raising an + exception. If no future raises an exception + then it is equivalent to :const:`ALL_COMPLETED`. + + * - .. data:: ALL_COMPLETED + - The function will return when all futures finish or are cancelled. Unlike :func:`~asyncio.wait_for`, ``wait()`` does not cancel the futures when a timeout occurs. @@ -858,19 +935,50 @@ Waiting Primitives .. function:: as_completed(aws, *, timeout=None) - Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws* - iterable concurrently. Return an iterator of coroutines. - Each coroutine returned can be awaited to get the earliest next - result from the iterable of the remaining awaitables. + Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws* iterable + concurrently. The returned object can be iterated to obtain the results + of the awaitables as they finish. - Raises :exc:`TimeoutError` if the timeout occurs before - all Futures are done. + The object returned by ``as_completed()`` can be iterated as an + :term:`asynchronous iterator` or a plain :term:`iterator`. When asynchronous + iteration is used, the originally-supplied awaitables are yielded if they + are tasks or futures. This makes it easy to correlate previously-scheduled + tasks with their results. Example:: - Example:: + ipv4_connect = create_task(open_connection("127.0.0.1", 80)) + ipv6_connect = create_task(open_connection("::1", 80)) + tasks = [ipv4_connect, ipv6_connect] + + async for earliest_connect in as_completed(tasks): + # earliest_connect is done. The result can be obtained by + # awaiting it or calling earliest_connect.result() + reader, writer = await earliest_connect + + if earliest_connect is ipv6_connect: + print("IPv6 connection established.") + else: + print("IPv4 connection established.") + + During asynchronous iteration, implicitly-created tasks will be yielded for + supplied awaitables that aren't tasks or futures. + + When used as a plain iterator, each iteration yields a new coroutine that + returns the result or raises the exception of the next completed awaitable. + This pattern is compatible with Python versions older than 3.13:: - for coro in as_completed(aws): - earliest_result = await coro - # ... + ipv4_connect = create_task(open_connection("127.0.0.1", 80)) + ipv6_connect = create_task(open_connection("::1", 80)) + tasks = [ipv4_connect, ipv6_connect] + + for next_connect in as_completed(tasks): + # next_connect is not one of the original task objects. It must be + # awaited to obtain the result value or raise the exception of the + # awaitable that finishes next. + reader, writer = await next_connect + + A :exc:`TimeoutError` is raised if the timeout occurs before all awaitables + are done. This is raised by the ``async for`` loop during asynchronous + iteration or by the coroutines yielded during plain iteration. .. versionchanged:: 3.10 Removed the *loop* parameter. @@ -882,6 +990,10 @@ Waiting Primitives .. versionchanged:: 3.12 Added support for generators yielding tasks. + .. versionchanged:: 3.13 + The result can now be used as either an :term:`asynchronous iterator` + or as a plain :term:`iterator` (previously it was only a plain iterator). + Running in Threads ================== @@ -1105,7 +1217,7 @@ Task Object a :exc:`CancelledError` exception. If the Task's result isn't yet available, this method raises - a :exc:`InvalidStateError` exception. + an :exc:`InvalidStateError` exception. .. method:: exception() @@ -1321,10 +1433,19 @@ Task Object with :meth:`uncancel`. :class:`TaskGroup` context managers use :func:`uncancel` in a similar fashion. - If end-user code is, for some reason, suppresing cancellation by + If end-user code is, for some reason, suppressing cancellation by catching :exc:`CancelledError`, it needs to call this method to remove the cancellation state. + When this method decrements the cancellation count to zero, + the method checks if a previous :meth:`cancel` call had arranged + for :exc:`CancelledError` to be thrown into the task. + If it hasn't been thrown yet, that arrangement will be + rescinded (by resetting the internal ``_must_cancel`` flag). + + .. versionchanged:: 3.13 + Changed to rescind pending cancellation requests upon reaching zero. + .. method:: cancelling() Return the number of pending cancellation requests to this Task, i.e., diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index c6a046f5..5f83b3a2 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -1,5 +1,5 @@ -:mod:`asyncio` --- Asynchronous I/O -=================================== +:mod:`!asyncio` --- Asynchronous I/O +==================================== .. module:: asyncio :synopsis: Asynchronous I/O. @@ -46,9 +46,9 @@ Additionally, there are **low-level** APIs for *library and framework developers* to: * create and manage :ref:`event loops <asyncio-event-loop>`, which - provide asynchronous APIs for :meth:`networking <loop.create_server>`, - running :meth:`subprocesses <loop.subprocess_exec>`, - handling :meth:`OS signals <loop.add_signal_handler>`, etc; + provide asynchronous APIs for :ref:`networking <loop_create_server>`, + running :ref:`subprocesses <loop_subprocess_exec>`, + handling :ref:`OS signals <loop_add_signal_handler>`, etc; * implement efficient protocols using :ref:`transports <asyncio-transports-protocols>`; @@ -56,7 +56,13 @@ Additionally, there are **low-level** APIs for * :ref:`bridge <asyncio-futures>` callback-based libraries and code with async/await syntax. -You can experiment with an ``asyncio`` concurrent context in the REPL: +.. include:: ../includes/wasm-notavail.rst + +.. _asyncio-cli: + +.. rubric:: asyncio REPL + +You can experiment with an ``asyncio`` concurrent context in the :term:`REPL`: .. code-block:: pycon @@ -68,7 +74,14 @@ You can experiment with an ``asyncio`` concurrent context in the REPL: >>> await asyncio.sleep(10, result='hello') 'hello' -.. include:: ../includes/wasm-notavail.rst +.. audit-event:: cpython.run_stdin "" "" + +.. versionchanged:: 3.12.5 (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) + Emits audit events. + +.. versionchanged:: 3.13 + Uses PyREPL if possible, in which case :envvar:`PYTHONSTARTUP` is + also executed. Emits audit events. .. We use the "rubric" directive here to avoid creating the "Reference" subsection in the TOC. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst new file mode 100644 index 00000000..22c9881c --- /dev/null +++ b/Doc/library/asyncore.rst @@ -0,0 +1,17 @@ +:mod:`!asyncore` --- Asynchronous socket handler +================================================ + +.. module:: asyncore + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 <whatsnew312-removed>` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +Applications should use the :mod:`asyncio` module instead. + +The last version of Python that provided the :mod:`!asyncore` module was +`Python 3.11 <https://docs.python.org/3.11/library/asyncore.html>`_. diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst index 3dbef695..02d2f080 100644 --- a/Doc/library/atexit.rst +++ b/Doc/library/atexit.rst @@ -1,11 +1,11 @@ -:mod:`atexit` --- Exit handlers -=============================== +:mod:`!atexit` --- Exit handlers +================================ .. module:: atexit :synopsis: Register and execute cleanup functions. -.. moduleauthor:: Skip Montanaro <skip@pobox.com> -.. sectionauthor:: Skip Montanaro <skip@pobox.com> +.. moduleauthor:: Skip Montanaro <skip.montanaro@gmail.com> +.. sectionauthor:: Skip Montanaro <skip.montanaro@gmail.com> -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index 1f96575d..3bc580b0 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -1,287 +1,15 @@ -:mod:`audioop` --- Manipulate raw audio data -============================================ +:mod:`!audioop` --- Manipulate raw audio data +============================================= .. module:: audioop - :synopsis: Manipulate raw audio data. + :synopsis: Removed in 3.13. :deprecated: .. deprecated-removed:: 3.11 3.13 - The :mod:`audioop` module is deprecated - (see :pep:`PEP 594 <594#audioop>` for details). --------------- - -The :mod:`audioop` module contains some useful operations on sound fragments. -It operates on sound fragments consisting of signed integer samples 8, 16, 24 -or 32 bits wide, stored in :term:`bytes-like objects <bytes-like object>`. All scalar items are -integers, unless specified otherwise. - -.. versionchanged:: 3.4 - Support for 24-bit samples was added. - All functions now accept any :term:`bytes-like object`. - String input now results in an immediate error. - -.. index:: - single: Intel/DVI ADPCM - single: ADPCM, Intel/DVI - single: a-LAW - single: u-LAW - -This module provides support for a-LAW, u-LAW and Intel/DVI ADPCM encodings. - -.. This para is mostly here to provide an excuse for the index entries... - -A few of the more complicated operations only take 16-bit samples, otherwise the -sample size (in bytes) is always a parameter of the operation. - -The module defines the following variables and functions: - - -.. exception:: error - - This exception is raised on all errors, such as unknown number of bytes per - sample, etc. - - -.. function:: add(fragment1, fragment2, width) - - Return a fragment which is the addition of the two samples passed as parameters. - *width* is the sample width in bytes, either ``1``, ``2``, ``3`` or ``4``. Both - fragments should have the same length. Samples are truncated in case of overflow. - - -.. function:: adpcm2lin(adpcmfragment, width, state) - - Decode an Intel/DVI ADPCM coded fragment to a linear fragment. See the - description of :func:`lin2adpcm` for details on ADPCM coding. Return a tuple - ``(sample, newstate)`` where the sample has the width specified in *width*. - - -.. function:: alaw2lin(fragment, width) - - Convert sound fragments in a-LAW encoding to linearly encoded sound fragments. - a-LAW encoding always uses 8 bits samples, so *width* refers only to the sample - width of the output fragment here. - - -.. function:: avg(fragment, width) - - Return the average over all samples in the fragment. - - -.. function:: avgpp(fragment, width) - - Return the average peak-peak value over all samples in the fragment. No - filtering is done, so the usefulness of this routine is questionable. - - -.. function:: bias(fragment, width, bias) - - Return a fragment that is the original fragment with a bias added to each - sample. Samples wrap around in case of overflow. - - -.. function:: byteswap(fragment, width) - - "Byteswap" all samples in a fragment and returns the modified fragment. - Converts big-endian samples to little-endian and vice versa. - - .. versionadded:: 3.4 - - -.. function:: cross(fragment, width) - - Return the number of zero crossings in the fragment passed as an argument. - - -.. function:: findfactor(fragment, reference) - - Return a factor *F* such that ``rms(add(fragment, mul(reference, -F)))`` is - minimal, i.e., return the factor with which you should multiply *reference* to - make it match as well as possible to *fragment*. The fragments should both - contain 2-byte samples. - - The time taken by this routine is proportional to ``len(fragment)``. - - -.. function:: findfit(fragment, reference) - - Try to match *reference* as well as possible to a portion of *fragment* (which - should be the longer fragment). This is (conceptually) done by taking slices - out of *fragment*, using :func:`findfactor` to compute the best match, and - minimizing the result. The fragments should both contain 2-byte samples. - Return a tuple ``(offset, factor)`` where *offset* is the (integer) offset into - *fragment* where the optimal match started and *factor* is the (floating-point) - factor as per :func:`findfactor`. - - -.. function:: findmax(fragment, length) - - Search *fragment* for a slice of length *length* samples (not bytes!) with - maximum energy, i.e., return *i* for which ``rms(fragment[i*2:(i+length)*2])`` - is maximal. The fragments should both contain 2-byte samples. - - The routine takes time proportional to ``len(fragment)``. - - -.. function:: getsample(fragment, width, index) - - Return the value of sample *index* from the fragment. - - -.. function:: lin2adpcm(fragment, width, state) - - Convert samples to 4 bit Intel/DVI ADPCM encoding. ADPCM coding is an adaptive - coding scheme, whereby each 4 bit number is the difference between one sample - and the next, divided by a (varying) step. The Intel/DVI ADPCM algorithm has - been selected for use by the IMA, so it may well become a standard. - - *state* is a tuple containing the state of the coder. The coder returns a tuple - ``(adpcmfrag, newstate)``, and the *newstate* should be passed to the next call - of :func:`lin2adpcm`. In the initial call, ``None`` can be passed as the state. - *adpcmfrag* is the ADPCM coded fragment packed 2 4-bit values per byte. - - -.. function:: lin2alaw(fragment, width) - - Convert samples in the audio fragment to a-LAW encoding and return this as a - bytes object. a-LAW is an audio encoding format whereby you get a dynamic - range of about 13 bits using only 8 bit samples. It is used by the Sun audio - hardware, among others. - - -.. function:: lin2lin(fragment, width, newwidth) - - Convert samples between 1-, 2-, 3- and 4-byte formats. - - .. note:: - - In some audio formats, such as .WAV files, 16, 24 and 32 bit samples are - signed, but 8 bit samples are unsigned. So when converting to 8 bit wide - samples for these formats, you need to also add 128 to the result:: - - new_frames = audioop.lin2lin(frames, old_width, 1) - new_frames = audioop.bias(new_frames, 1, 128) - - The same, in reverse, has to be applied when converting from 8 to 16, 24 - or 32 bit width samples. - - -.. function:: lin2ulaw(fragment, width) - - Convert samples in the audio fragment to u-LAW encoding and return this as a - bytes object. u-LAW is an audio encoding format whereby you get a dynamic - range of about 14 bits using only 8 bit samples. It is used by the Sun audio - hardware, among others. - - -.. function:: max(fragment, width) - - Return the maximum of the *absolute value* of all samples in a fragment. - - -.. function:: maxpp(fragment, width) - - Return the maximum peak-peak value in the sound fragment. - - -.. function:: minmax(fragment, width) - - Return a tuple consisting of the minimum and maximum values of all samples in - the sound fragment. - - -.. function:: mul(fragment, width, factor) - - Return a fragment that has all samples in the original fragment multiplied by - the floating-point value *factor*. Samples are truncated in case of overflow. - - -.. function:: ratecv(fragment, width, nchannels, inrate, outrate, state[, weightA[, weightB]]) - - Convert the frame rate of the input fragment. - - *state* is a tuple containing the state of the converter. The converter returns - a tuple ``(newfragment, newstate)``, and *newstate* should be passed to the next - call of :func:`ratecv`. The initial call should pass ``None`` as the state. - - The *weightA* and *weightB* arguments are parameters for a simple digital filter - and default to ``1`` and ``0`` respectively. - - -.. function:: reverse(fragment, width) - - Reverse the samples in a fragment and returns the modified fragment. - - -.. function:: rms(fragment, width) - - Return the root-mean-square of the fragment, i.e. ``sqrt(sum(S_i^2)/n)``. - - This is a measure of the power in an audio signal. - - -.. function:: tomono(fragment, width, lfactor, rfactor) - - Convert a stereo fragment to a mono fragment. The left channel is multiplied by - *lfactor* and the right channel by *rfactor* before adding the two channels to - give a mono signal. - - -.. function:: tostereo(fragment, width, lfactor, rfactor) - - Generate a stereo fragment from a mono fragment. Each pair of samples in the - stereo fragment are computed from the mono sample, whereby left channel samples - are multiplied by *lfactor* and right channel samples by *rfactor*. - - -.. function:: ulaw2lin(fragment, width) - - Convert sound fragments in u-LAW encoding to linearly encoded sound fragments. - u-LAW encoding always uses 8 bits samples, so *width* refers only to the sample - width of the output fragment here. - -Note that operations such as :func:`.mul` or :func:`.max` make no distinction -between mono and stereo fragments, i.e. all samples are treated equal. If this -is a problem the stereo fragment should be split into two mono fragments first -and recombined later. Here is an example of how to do that:: - - def mul_stereo(sample, width, lfactor, rfactor): - lsample = audioop.tomono(sample, width, 1, 0) - rsample = audioop.tomono(sample, width, 0, 1) - lsample = audioop.mul(lsample, width, lfactor) - rsample = audioop.mul(rsample, width, rfactor) - lsample = audioop.tostereo(lsample, width, 1, 0) - rsample = audioop.tostereo(rsample, width, 0, 1) - return audioop.add(lsample, rsample, width) - -If you use the ADPCM coder to build network packets and you want your protocol -to be stateless (i.e. to be able to tolerate packet loss) you should not only -transmit the data but also the state. Note that you should send the *initial* -state (the one you passed to :func:`lin2adpcm`) along to the decoder, not the -final state (as returned by the coder). If you want to use -:class:`struct.Struct` to store the state in binary you can code the first -element (the predicted value) in 16 bits and the second (the delta index) in 8. - -The ADPCM coders have never been tried against other ADPCM coders, only against -themselves. It could well be that I misinterpreted the standards in which case -they will not be interoperable with the respective standards. - -The :func:`find\*` routines might look a bit funny at first sight. They are -primarily meant to do echo cancellation. A reasonably fast way to do this is to -pick the most energetic piece of the output sample, locate that in the input -sample and subtract the whole output sample from the input sample:: - - def echocancel(outputdata, inputdata): - pos = audioop.findmax(outputdata, 800) # one tenth second - out_test = outputdata[pos*2:] - in_test = inputdata[pos*2:] - ipos, factor = audioop.findfit(in_test, out_test) - # Optional (for better cancellation): - # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], - # out_test) - prefill = '\0'*(pos+ipos)*2 - postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata)) - outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill - return audioop.add(inputdata, outputdata, 2) +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 <whatsnew313-pep594>` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!audioop` module was +`Python 3.12 <https://docs.python.org/3.12/library/audioop.html>`_. diff --git a/Doc/library/audit_events.rst b/Doc/library/audit_events.rst index 8227a795..a2a90a00 100644 --- a/Doc/library/audit_events.rst +++ b/Doc/library/audit_events.rst @@ -7,7 +7,7 @@ Audit events table This table contains all events raised by :func:`sys.audit` or :c:func:`PySys_Audit` calls throughout the CPython runtime and the -standard library. These calls were added in 3.8.0 or later (see :pep:`578`). +standard library. These calls were added in 3.8 or later (see :pep:`578`). See :func:`sys.addaudithook` and :c:func:`PySys_AddAuditHook` for information on handling these events. diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index d5b6af8c..834ab253 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -1,5 +1,5 @@ -:mod:`base64` --- Base16, Base32, Base64, Base85 Data Encodings -=============================================================== +:mod:`!base64` --- Base16, Base32, Base64, Base85 Data Encodings +================================================================ .. module:: base64 :synopsis: RFC 4648: Base16, Base32, Base64 Data Encodings; @@ -193,7 +193,7 @@ The modern interface provides: *wrapcol* controls whether the output should have newline (``b'\n'``) characters added to it. If this is non-zero, each output line will be - at most this many characters long. + at most this many characters long, excluding the trailing newline. *pad* controls whether the input is padded to a multiple of 4 before encoding. Note that the ``btoa`` implementation always pads. @@ -244,6 +244,24 @@ The modern interface provides: .. versionadded:: 3.4 +.. function:: z85encode(s) + + Encode the :term:`bytes-like object` *s* using Z85 (as used in ZeroMQ) + and return the encoded :class:`bytes`. See `Z85 specification + <https://rfc.zeromq.org/spec/32/>`_ for more information. + + .. versionadded:: 3.13 + + +.. function:: z85decode(s) + + Decode the Z85-encoded :term:`bytes-like object` or ASCII string *s* and + return the decoded :class:`bytes`. See `Z85 specification + <https://rfc.zeromq.org/spec/32/>`_ for more information. + + .. versionadded:: 3.13 + + The legacy interface: .. function:: decode(input, output) diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index d201dc96..85df7914 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -1,5 +1,5 @@ -:mod:`bdb` --- Debugger framework -================================= +:mod:`!bdb` --- Debugger framework +================================== .. module:: bdb :synopsis: Debugger framework. @@ -86,7 +86,7 @@ The :mod:`bdb` module also defines two classes: .. attribute:: temporary - True if a :class:`Breakpoint` at (file, line) is temporary. + ``True`` if a :class:`Breakpoint` at (file, line) is temporary. .. attribute:: cond @@ -99,7 +99,7 @@ The :mod:`bdb` module also defines two classes: .. attribute:: enabled - True if :class:`Breakpoint` is enabled. + ``True`` if :class:`Breakpoint` is enabled. .. attribute:: bpbynumber @@ -132,8 +132,8 @@ The :mod:`bdb` module also defines two classes: frame is considered to originate in a certain module is determined by the ``__name__`` in the frame globals. - .. versionadded:: 3.1 - The *skip* argument. + .. versionchanged:: 3.1 + Added the *skip* parameter. The following methods of :class:`Bdb` normally don't need to be overridden. @@ -148,8 +148,8 @@ The :mod:`bdb` module also defines two classes: .. method:: reset() - Set the :attr:`botframe`, :attr:`stopframe`, :attr:`returnframe` and - :attr:`quitting` attributes with values ready to start debugging. + Set the :attr:`!botframe`, :attr:`!stopframe`, :attr:`!returnframe` and + :attr:`quitting <Bdb.set_quit>` attributes with values ready to start debugging. .. method:: trace_dispatch(frame, event, arg) @@ -182,7 +182,7 @@ The :mod:`bdb` module also defines two classes: If the debugger should stop on the current line, invoke the :meth:`user_line` method (which should be overridden in subclasses). - Raise a :exc:`BdbQuit` exception if the :attr:`Bdb.quitting` flag is set + Raise a :exc:`BdbQuit` exception if the :attr:`quitting <Bdb.set_quit>` flag is set (which can be set from :meth:`user_line`). Return a reference to the :meth:`trace_dispatch` method for further tracing in that scope. @@ -190,7 +190,7 @@ The :mod:`bdb` module also defines two classes: If the debugger should stop on this function call, invoke the :meth:`user_call` method (which should be overridden in subclasses). - Raise a :exc:`BdbQuit` exception if the :attr:`Bdb.quitting` flag is set + Raise a :exc:`BdbQuit` exception if the :attr:`quitting <Bdb.set_quit>` flag is set (which can be set from :meth:`user_call`). Return a reference to the :meth:`trace_dispatch` method for further tracing in that scope. @@ -198,7 +198,7 @@ The :mod:`bdb` module also defines two classes: If the debugger should stop on this function return, invoke the :meth:`user_return` method (which should be overridden in subclasses). - Raise a :exc:`BdbQuit` exception if the :attr:`Bdb.quitting` flag is set + Raise a :exc:`BdbQuit` exception if the :attr:`quitting <Bdb.set_quit>` flag is set (which can be set from :meth:`user_return`). Return a reference to the :meth:`trace_dispatch` method for further tracing in that scope. @@ -206,7 +206,7 @@ The :mod:`bdb` module also defines two classes: If the debugger should stop at this exception, invokes the :meth:`user_exception` method (which should be overridden in subclasses). - Raise a :exc:`BdbQuit` exception if the :attr:`Bdb.quitting` flag is set + Raise a :exc:`BdbQuit` exception if the :attr:`quitting <Bdb.set_quit>` flag is set (which can be set from :meth:`user_exception`). Return a reference to the :meth:`trace_dispatch` method for further tracing in that scope. @@ -215,22 +215,22 @@ The :mod:`bdb` module also defines two classes: .. method:: is_skipped_line(module_name) - Return True if *module_name* matches any skip pattern. + Return ``True`` if *module_name* matches any skip pattern. .. method:: stop_here(frame) - Return True if *frame* is below the starting frame in the stack. + Return ``True`` if *frame* is below the starting frame in the stack. .. method:: break_here(frame) - Return True if there is an effective breakpoint for this line. + Return ``True`` if there is an effective breakpoint for this line. Check whether a line or function breakpoint exists and is in effect. Delete temporary breakpoints based on information from :func:`effective`. .. method:: break_anywhere(frame) - Return True if any breakpoint exists for *frame*'s filename. + Return ``True`` if any breakpoint exists for *frame*'s filename. Derived classes should override these methods to gain control over debugger operation. @@ -240,6 +240,9 @@ The :mod:`bdb` module also defines two classes: Called from :meth:`dispatch_call` if a break might stop inside the called function. + *argument_list* is not used anymore and will always be ``None``. + The argument is kept for backwards compatibility. + .. method:: user_line(frame) Called from :meth:`dispatch_line` when either :meth:`stop_here` or @@ -286,6 +289,10 @@ The :mod:`bdb` module also defines two classes: Start debugging from *frame*. If *frame* is not specified, debugging starts from caller's frame. + .. versionchanged:: 3.13 + :func:`set_trace` will enter the debugger immediately, rather than + on the next line of code to be executed. + .. method:: set_continue() Stop only at breakpoints or when finished. If there are no breakpoints, @@ -293,8 +300,10 @@ The :mod:`bdb` module also defines two classes: .. method:: set_quit() - Set the :attr:`quitting` attribute to ``True``. This raises :exc:`BdbQuit` in - the next call to one of the :meth:`dispatch_\*` methods. + .. index:: single: quitting (bdb.Bdb attribute) + + Set the :attr:`!quitting` attribute to ``True``. This raises :exc:`BdbQuit` in + the next call to one of the :meth:`!dispatch_\*` methods. Derived classes and clients can call the following methods to manipulate @@ -339,7 +348,7 @@ The :mod:`bdb` module also defines two classes: .. method:: get_break(filename, lineno) - Return True if there is a breakpoint for *lineno* in *filename*. + Return ``True`` if there is a breakpoint for *lineno* in *filename*. .. method:: get_breaks(filename, lineno) @@ -383,7 +392,7 @@ The :mod:`bdb` module also defines two classes: .. method:: run(cmd, globals=None, locals=None) Debug a statement executed via the :func:`exec` function. *globals* - defaults to :attr:`__main__.__dict__`, *locals* defaults to *globals*. + defaults to :attr:`!__main__.__dict__`, *locals* defaults to *globals*. .. method:: runeval(expr, globals=None, locals=None) @@ -403,7 +412,7 @@ Finally, the module defines the following functions: .. function:: checkfuncname(b, frame) - Return True if we should break here, depending on the way the + Return ``True`` if we should break here, depending on the way the :class:`Breakpoint` *b* was set. If it was set via line number, it checks if @@ -422,14 +431,14 @@ Finally, the module defines the following functions: :attr:`bplist <bdb.Breakpoint.bplist>` for the (:attr:`file <bdb.Breakpoint.file>`, :attr:`line <bdb.Breakpoint.line>`) (which must exist) that is :attr:`enabled <bdb.Breakpoint.enabled>`, for - which :func:`checkfuncname` is True, and that has neither a False + which :func:`checkfuncname` is true, and that has neither a false :attr:`condition <bdb.Breakpoint.cond>` nor positive :attr:`ignore <bdb.Breakpoint.ignore>` count. The *flag*, meaning that a - temporary breakpoint should be deleted, is False only when the + temporary breakpoint should be deleted, is ``False`` only when the :attr:`cond <bdb.Breakpoint.cond>` cannot be evaluated (in which case, :attr:`ignore <bdb.Breakpoint.ignore>` count is ignored). - If no such entry exists, then (None, None) is returned. + If no such entry exists, then ``(None, None)`` is returned. .. function:: set_trace() diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 21960cb7..1bab7856 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -1,19 +1,18 @@ -:mod:`binascii` --- Convert between binary and ASCII -==================================================== +:mod:`!binascii` --- Convert between binary and ASCII +===================================================== .. module:: binascii :synopsis: Tools for converting between binary and various ASCII-encoded binary representations. .. index:: - pair: module; uu pair: module; base64 -------------- The :mod:`binascii` module contains a number of methods to convert between binary and various ASCII-encoded binary representations. Normally, you will not -use these functions directly but use wrapper modules like :mod:`uu` or +use these functions directly but use wrapper modules like :mod:`base64` instead. The :mod:`binascii` module contains low-level functions written in C for greater speed that are used by the higher-level modules. @@ -58,10 +57,11 @@ The :mod:`binascii` module defines the following functions: data will raise :exc:`binascii.Error`. Valid base64: - * Conforms to :rfc:`3548`. - * Contains only characters from the base64 alphabet. - * Contains no excess data after padding (including excess padding, newlines, etc.). - * Does not start with a padding. + + * Conforms to :rfc:`3548`. + * Contains only characters from the base64 alphabet. + * Contains no excess data after padding (including excess padding, newlines, etc.). + * Does not start with a padding. .. versionchanged:: 3.11 Added the *strict_mode* parameter. @@ -179,8 +179,5 @@ The :mod:`binascii` module defines the following functions: Support for RFC compliant base64-style encoding in base 16, 32, 64, and 85. - Module :mod:`uu` - Support for UU encoding used on Unix. - Module :mod:`quopri` Support for quoted-printable encoding used in MIME email messages. diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 8022c596..78da5633 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -1,5 +1,5 @@ -:mod:`bisect` --- Array bisection algorithm -=========================================== +:mod:`!bisect` --- Array bisection algorithm +============================================ .. module:: bisect :synopsis: Array bisection algorithms for binary searching. @@ -19,9 +19,9 @@ linear searches or frequent resorting. The module is called :mod:`bisect` because it uses a basic bisection algorithm to do its work. Unlike other bisection tools that search for a specific value, the functions in this module are designed to locate an -insertion point. Accordingly, the functions never call an :meth:`__eq__` +insertion point. Accordingly, the functions never call an :meth:`~object.__eq__` method to determine whether a value has been found. Instead, the -functions only call the :meth:`__lt__` method and will return an insertion +functions only call the :meth:`~object.__lt__` method and will return an insertion point between values in an array. .. _bisect functions: @@ -73,13 +73,13 @@ The following functions are provided: Insert *x* in *a* in sorted order. This function first runs :py:func:`~bisect.bisect_left` to locate an insertion point. - Next, it runs the :meth:`insert` method on *a* to insert *x* at the + Next, it runs the :meth:`!insert` method on *a* to insert *x* at the appropriate position to maintain sort order. To support inserting records in a table, the *key* function (if any) is applied to *x* for the search step but not for the insertion step. - Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + Keep in mind that the *O*\ (log *n*) search is dominated by the slow *O*\ (*n*) insertion step. .. versionchanged:: 3.10 @@ -93,13 +93,13 @@ The following functions are provided: entries of *x*. This function first runs :py:func:`~bisect.bisect_right` to locate an insertion point. - Next, it runs the :meth:`insert` method on *a* to insert *x* at the + Next, it runs the :meth:`!insert` method on *a* to insert *x* at the appropriate position to maintain sort order. To support inserting records in a table, the *key* function (if any) is applied to *x* for the search step but not for the insertion step. - Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + Keep in mind that the *O*\ (log *n*) search is dominated by the slow *O*\ (*n*) insertion step. .. versionchanged:: 3.10 @@ -115,7 +115,7 @@ thoughts in mind: * Bisection is effective for searching ranges of values. For locating specific values, dictionaries are more performant. -* The *insort()* functions are ``O(n)`` because the logarithmic search step +* The *insort()* functions are *O*\ (*n*) because the logarithmic search step is dominated by the linear time insertion step. * The search functions are stateless and discard key function results after diff --git a/Doc/library/builtins.rst b/Doc/library/builtins.rst index 7e4f8fe0..c4979db5 100644 --- a/Doc/library/builtins.rst +++ b/Doc/library/builtins.rst @@ -1,5 +1,5 @@ -:mod:`builtins` --- Built-in objects -==================================== +:mod:`!builtins` --- Built-in objects +===================================== .. module:: builtins :synopsis: The module that provides the built-in namespace. @@ -7,10 +7,7 @@ -------------- This module provides direct access to all 'built-in' identifiers of Python; for -example, ``builtins.open`` is the full name for the built-in function -:func:`open`. See :ref:`built-in-funcs` and :ref:`built-in-consts` for -documentation. - +example, ``builtins.open`` is the full name for the built-in function :func:`open`. This module is not normally accessed explicitly by most applications, but can be useful in modules that provide objects with the same name as a built-in value, @@ -40,3 +37,10 @@ available as part of their globals. The value of ``__builtins__`` is normally either this module or the value of this module's :attr:`~object.__dict__` attribute. Since this is an implementation detail, it may not be used by alternate implementations of Python. + +.. seealso:: + + * :ref:`built-in-consts` + * :ref:`bltin-exceptions` + * :ref:`built-in-funcs` + * :ref:`bltin-types` diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index ec4aeaa0..ebe2e43f 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -1,5 +1,5 @@ -:mod:`bz2` --- Support for :program:`bzip2` compression -======================================================= +:mod:`!bz2` --- Support for :program:`bzip2` compression +======================================================== .. module:: bz2 :synopsis: Interfaces for bzip2 compression and decompression. @@ -91,7 +91,7 @@ The :mod:`bz2` module contains: and :meth:`~io.IOBase.truncate`. Iteration and the :keyword:`with` statement are supported. - :class:`BZ2File` also provides the following method: + :class:`BZ2File` also provides the following methods and attributes: .. method:: peek([n]) @@ -106,19 +106,69 @@ The :mod:`bz2` module contains: .. versionadded:: 3.3 + .. method:: fileno() + + Return the file descriptor for the underlying file. + + .. versionadded:: 3.3 + + .. method:: readable() + + Return whether the file was opened for reading. + + .. versionadded:: 3.3 + + .. method:: seekable() + + Return whether the file supports seeking. + + .. versionadded:: 3.3 + + .. method:: writable() + + Return whether the file was opened for writing. + + .. versionadded:: 3.3 + + .. method:: read1(size=-1) + + Read up to *size* uncompressed bytes, while trying to avoid + making multiple reads from the underlying stream. Reads up to a + buffer's worth of data if size is negative. + + Returns ``b''`` if the file is at EOF. + + .. versionadded:: 3.3 + + .. method:: readinto(b) + + Read bytes into *b*. + + Returns the number of bytes read (0 for EOF). + + .. versionadded:: 3.3 + + .. attribute:: mode + + ``'rb'`` for reading and ``'wb'`` for writing. + + .. versionadded:: 3.13 + + .. attribute:: name + + The bzip2 file name. Equivalent to the :attr:`~io.FileIO.name` + attribute of the underlying :term:`file object`. + + .. versionadded:: 3.13 + .. versionchanged:: 3.1 Support for the :keyword:`with` statement was added. - .. versionchanged:: 3.3 - The :meth:`fileno`, :meth:`readable`, :meth:`seekable`, :meth:`writable`, - :meth:`read1` and :meth:`readinto` methods were added. - .. versionchanged:: 3.3 Support was added for *filename* being a :term:`file object` instead of an actual filename. - .. versionchanged:: 3.3 The ``'a'`` (append) mode was added, along with support for reading multi-stream files. diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 157a7537..eafc038d 100644 --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -1,5 +1,5 @@ -:mod:`calendar` --- General calendar-related functions -====================================================== +:mod:`!calendar` --- General calendar-related functions +======================================================= .. module:: calendar :synopsis: Functions for working with calendars, including some emulation @@ -196,6 +196,13 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is output (defaulting to the system default encoding). + .. method:: formatmonthname(theyear, themonth, withyear=True) + + Return a month name as an HTML table row. If *withyear* is true the year + will be included in the row, otherwise just the month name will be + used. + + :class:`!HTMLCalendar` has the following attributes you can override to customize the CSS classes used by the calendar: @@ -289,7 +296,7 @@ interpreted as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is .. note:: - The constructor, :meth:`formatweekday` and :meth:`formatmonthname` methods + The constructor, :meth:`!formatweekday` and :meth:`!formatmonthname` methods of these two classes temporarily change the ``LC_TIME`` locale to the given *locale*. Because the current locale is a process-wide setting, they are not thread-safe. @@ -358,7 +365,7 @@ For simple text calendars this module provides the following functions. .. function:: month(theyear, themonth, w=0, l=0) - Returns a month's calendar in a multi-line string using the :meth:`formatmonth` + Returns a month's calendar in a multi-line string using the :meth:`~TextCalendar.formatmonth` of the :class:`TextCalendar` class. @@ -370,7 +377,7 @@ For simple text calendars this module provides the following functions. .. function:: calendar(year, w=2, l=1, c=6, m=3) Returns a 3-column calendar for an entire year as a multi-line string using - the :meth:`formatyear` of the :class:`TextCalendar` class. + the :meth:`~TextCalendar.formatyear` of the :class:`TextCalendar` class. .. function:: timegm(tuple) @@ -386,13 +393,22 @@ The :mod:`calendar` module exports the following data attributes: .. data:: day_name - An array that represents the days of the week in the current locale. + A sequence that represents the days of the week in the current locale, + where Monday is day number 0. + + >>> import calendar + >>> list(calendar.day_name) + ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] .. data:: day_abbr - An array that represents the abbreviated days of the week in the current locale. + A sequence that represents the abbreviated days of the week in the current locale, + where Mon is day number 0. + >>> import calendar + >>> list(calendar.day_abbr) + ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] .. data:: MONDAY TUESDAY @@ -419,17 +435,24 @@ The :mod:`calendar` module exports the following data attributes: .. data:: month_name - An array that represents the months of the year in the current locale. This + A sequence that represents the months of the year in the current locale. This follows normal convention of January being month number 1, so it has a length of 13 and ``month_name[0]`` is the empty string. + >>> import calendar + >>> list(calendar.month_name) + ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] + .. data:: month_abbr - An array that represents the abbreviated months of the year in the current + A sequence that represents the abbreviated months of the year in the current locale. This follows normal convention of January being month number 1, so it has a length of 13 and ``month_abbr[0]`` is the empty string. + >>> import calendar + >>> list(calendar.month_abbr) + ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] .. data:: JANUARY FEBRUARY @@ -505,7 +528,7 @@ to interactively print a calendar. python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}] [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS] - [year] [month] + [-f FIRST_WEEKDAY] [year] [month] For example, to print a calendar for the year 2000: @@ -579,10 +602,17 @@ The following options are accepted: or as an HTML document. +.. option:: --first-weekday FIRST_WEEKDAY, -f FIRST_WEEKDAY + + The weekday to start each week. + Must be a number between 0 (Monday) and 6 (Sunday). + Defaults to 0. + + .. versionadded:: 3.13 + .. option:: year The year to print the calendar for. - Must be a number between 1 and 9999. Defaults to the current year. diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 295a601a..f9108fa9 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -1,564 +1,19 @@ -:mod:`cgi` --- Common Gateway Interface support -=============================================== +:mod:`!cgi` --- Common Gateway Interface support +================================================ .. module:: cgi - :synopsis: Helpers for running Python scripts via the Common Gateway Interface. + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/cgi.py` - -.. index:: - pair: WWW; server - pair: CGI; protocol - pair: HTTP; protocol - pair: MIME; headers - single: URL - single: Common Gateway Interface - .. deprecated-removed:: 3.11 3.13 - The :mod:`cgi` module is deprecated - (see :pep:`PEP 594 <594#cgi>` for details and alternatives). - - The :class:`FieldStorage` class can typically be replaced with - :func:`urllib.parse.parse_qsl` for ``GET`` and ``HEAD`` requests, - and the :mod:`email.message` module or - `multipart <https://pypi.org/project/multipart/>`_ for ``POST`` and ``PUT``. - Most :ref:`utility functions <functions-in-cgi-module>` have replacements. - --------------- - -Support module for Common Gateway Interface (CGI) scripts. - -This module defines a number of utilities for use by CGI scripts written in -Python. - -The global variable ``maxlen`` can be set to an integer indicating the maximum -size of a POST request. POST requests larger than this size will result in a -:exc:`ValueError` being raised during parsing. The default value of this -variable is ``0``, meaning the request size is unlimited. - -.. include:: ../includes/wasm-notavail.rst - -Introduction ------------- - -.. _cgi-intro: - -A CGI script is invoked by an HTTP server, usually to process user input -submitted through an HTML ``<FORM>`` or ``<ISINDEX>`` element. - -Most often, CGI scripts live in the server's special :file:`cgi-bin` directory. -The HTTP server places all sorts of information about the request (such as the -client's hostname, the requested URL, the query string, and lots of other -goodies) in the script's shell environment, executes the script, and sends the -script's output back to the client. - -The script's input is connected to the client too, and sometimes the form data -is read this way; at other times the form data is passed via the "query string" -part of the URL. This module is intended to take care of the different cases -and provide a simpler interface to the Python script. It also provides a number -of utilities that help in debugging scripts, and the latest addition is support -for file uploads from a form (if your browser supports it). - -The output of a CGI script should consist of two sections, separated by a blank -line. The first section contains a number of headers, telling the client what -kind of data is following. Python code to generate a minimal header section -looks like this:: - - print("Content-Type: text/html") # HTML is following - print() # blank line, end of headers - -The second section is usually HTML, which allows the client software to display -nicely formatted text with header, in-line images, etc. Here's Python code that -prints a simple piece of HTML:: - - print("<TITLE>CGI script output") - print("

This is my first CGI script

") - print("Hello, world!") - - -.. _using-the-cgi-module: - -Using the cgi module --------------------- - -Begin by writing ``import cgi``. - -When you write a new script, consider adding these lines:: - - import cgitb - cgitb.enable() - -This activates a special exception handler that will display detailed reports in -the web browser if any errors occur. If you'd rather not show the guts of your -program to users of your script, you can have the reports saved to files -instead, with code like this:: - - import cgitb - cgitb.enable(display=0, logdir="/path/to/logdir") - -It's very helpful to use this feature during script development. The reports -produced by :mod:`cgitb` provide information that can save you a lot of time in -tracking down bugs. You can always remove the ``cgitb`` line later when you -have tested your script and are confident that it works correctly. - -To get at submitted form data, use the :class:`FieldStorage` class. If the form -contains non-ASCII characters, use the *encoding* keyword parameter set to the -value of the encoding defined for the document. It is usually contained in the -META tag in the HEAD section of the HTML document or by the -:mailheader:`Content-Type` header. This reads the form contents from the -standard input or the environment (depending on the value of various -environment variables set according to the CGI standard). Since it may consume -standard input, it should be instantiated only once. - -The :class:`FieldStorage` instance can be indexed like a Python dictionary. -It allows membership testing with the :keyword:`in` operator, and also supports -the standard dictionary method :meth:`~dict.keys` and the built-in function -:func:`len`. Form fields containing empty strings are ignored and do not appear -in the dictionary; to keep such values, provide a true value for the optional -*keep_blank_values* keyword parameter when creating the :class:`FieldStorage` -instance. - -For instance, the following code (which assumes that the -:mailheader:`Content-Type` header and blank line have already been printed) -checks that the fields ``name`` and ``addr`` are both set to a non-empty -string:: - - form = cgi.FieldStorage() - if "name" not in form or "addr" not in form: - print("

Error

") - print("Please fill in the name and addr fields.") - return - print("

name:", form["name"].value) - print("

addr:", form["addr"].value) - ...further form processing here... - -Here the fields, accessed through ``form[key]``, are themselves instances of -:class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form -encoding). The :attr:`~FieldStorage.value` attribute of the instance yields -the string value of the field. The :meth:`~FieldStorage.getvalue` method -returns this string value directly; it also accepts an optional second argument -as a default to return if the requested key is not present. - -If the submitted form data contains more than one field with the same name, the -object retrieved by ``form[key]`` is not a :class:`FieldStorage` or -:class:`MiniFieldStorage` instance but a list of such instances. Similarly, in -this situation, ``form.getvalue(key)`` would return a list of strings. If you -expect this possibility (when your HTML form contains multiple fields with the -same name), use the :meth:`~FieldStorage.getlist` method, which always returns -a list of values (so that you do not need to special-case the single item -case). For example, this code concatenates any number of username fields, -separated by commas:: - - value = form.getlist("username") - usernames = ",".join(value) - -If a field represents an uploaded file, accessing the value via the -:attr:`~FieldStorage.value` attribute or the :meth:`~FieldStorage.getvalue` -method reads the entire file in memory as bytes. This may not be what you -want. You can test for an uploaded file by testing either the -:attr:`~FieldStorage.filename` attribute or the :attr:`~FieldStorage.file` -attribute. You can then read the data from the :attr:`!file` -attribute before it is automatically closed as part of the garbage collection of -the :class:`FieldStorage` instance -(the :func:`~io.RawIOBase.read` and :func:`~io.IOBase.readline` methods will -return bytes):: - - fileitem = form["userfile"] - if fileitem.file: - # It's an uploaded file; count lines - linecount = 0 - while True: - line = fileitem.file.readline() - if not line: break - linecount = linecount + 1 - -:class:`FieldStorage` objects also support being used in a :keyword:`with` -statement, which will automatically close them when done. - -If an error is encountered when obtaining the contents of an uploaded file -(for example, when the user interrupts the form submission by clicking on -a Back or Cancel button) the :attr:`~FieldStorage.done` attribute of the -object for the field will be set to the value -1. - -The file upload draft standard entertains the possibility of uploading multiple -files from one field (using a recursive :mimetype:`multipart/\*` encoding). -When this occurs, the item will be a dictionary-like :class:`FieldStorage` item. -This can be determined by testing its :attr:`!type` attribute, which should be -:mimetype:`multipart/form-data` (or perhaps another MIME type matching -:mimetype:`multipart/\*`). In this case, it can be iterated over recursively -just like the top-level form object. - -When a form is submitted in the "old" format (as the query string or as a single -data part of type :mimetype:`application/x-www-form-urlencoded`), the items will -actually be instances of the class :class:`MiniFieldStorage`. In this case, the -:attr:`!list`, :attr:`!file`, and :attr:`filename` attributes are always ``None``. - -A form submitted via POST that also has a query string will contain both -:class:`FieldStorage` and :class:`MiniFieldStorage` items. - -.. versionchanged:: 3.4 - The :attr:`~FieldStorage.file` attribute is automatically closed upon the - garbage collection of the creating :class:`FieldStorage` instance. - -.. versionchanged:: 3.5 - Added support for the context management protocol to the - :class:`FieldStorage` class. - - -Higher Level Interface ----------------------- - -The previous section explains how to read CGI form data using the -:class:`FieldStorage` class. This section describes a higher level interface -which was added to this class to allow one to do it in a more readable and -intuitive way. The interface doesn't make the techniques described in previous -sections obsolete --- they are still useful to process file uploads efficiently, -for example. - -.. XXX: Is this true ? - -The interface consists of two simple methods. Using the methods you can process -form data in a generic way, without the need to worry whether only one or more -values were posted under one name. - -In the previous section, you learned to write following code anytime you -expected a user to post more than one value under one name:: - - item = form.getvalue("item") - if isinstance(item, list): - # The user is requesting more than one item. - else: - # The user is requesting only one item. - -This situation is common for example when a form contains a group of multiple -checkboxes with the same name:: - - - - -In most situations, however, there's only one form control with a particular -name in a form and then you expect and need only one value associated with this -name. So you write a script containing for example this code:: - - user = form.getvalue("user").upper() - -The problem with the code is that you should never expect that a client will -provide valid input to your scripts. For example, if a curious user appends -another ``user=foo`` pair to the query string, then the script would crash, -because in this situation the ``getvalue("user")`` method call returns a list -instead of a string. Calling the :meth:`~str.upper` method on a list is not valid -(since lists do not have a method of this name) and results in an -:exc:`AttributeError` exception. - -Therefore, the appropriate way to read form data values was to always use the -code which checks whether the obtained value is a single value or a list of -values. That's annoying and leads to less readable scripts. - -A more convenient approach is to use the methods :meth:`~FieldStorage.getfirst` -and :meth:`~FieldStorage.getlist` provided by this higher level interface. - - -.. method:: FieldStorage.getfirst(name, default=None) - - This method always returns only one value associated with form field *name*. - The method returns only the first value in case that more values were posted - under such name. Please note that the order in which the values are received - may vary from browser to browser and should not be counted on. [#]_ If no such - form field or value exists then the method returns the value specified by the - optional parameter *default*. This parameter defaults to ``None`` if not - specified. - - -.. method:: FieldStorage.getlist(name) - - This method always returns a list of values associated with form field *name*. - The method returns an empty list if no such form field or value exists for - *name*. It returns a list consisting of one item if only one such value exists. - -Using these methods you can write nice compact code:: - - import cgi - form = cgi.FieldStorage() - user = form.getfirst("user", "").upper() # This way it's safe. - for item in form.getlist("item"): - do_something(item) - - -.. _functions-in-cgi-module: - -Functions ---------- - -These are useful if you want more control, or if you want to employ some of the -algorithms implemented in this module in other circumstances. - - -.. function:: parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False, separator="&") - - Parse a query in the environment or from a file (the file defaults to - ``sys.stdin``). The *keep_blank_values*, *strict_parsing* and *separator* parameters are - passed to :func:`urllib.parse.parse_qs` unchanged. - - .. deprecated-removed:: 3.11 3.13 - This function, like the rest of the :mod:`cgi` module, is deprecated. - It can be replaced by calling :func:`urllib.parse.parse_qs` directly - on the desired query string (except for ``multipart/form-data`` input, - which can be handled as described for :func:`parse_multipart`). - - -.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator="&") - - Parse input of type :mimetype:`multipart/form-data` (for file uploads). - Arguments are *fp* for the input file, *pdict* for a dictionary containing - other parameters in the :mailheader:`Content-Type` header, and *encoding*, - the request encoding. - - Returns a dictionary just like :func:`urllib.parse.parse_qs`: keys are the - field names, each value is a list of values for that field. For non-file - fields, the value is a list of strings. - - This is easy to use but not much good if you are expecting megabytes to be - uploaded --- in that case, use the :class:`FieldStorage` class instead - which is much more flexible. - - .. versionchanged:: 3.7 - Added the *encoding* and *errors* parameters. For non-file fields, the - value is now a list of strings, not bytes. - - .. versionchanged:: 3.10 - Added the *separator* parameter. - - .. deprecated-removed:: 3.11 3.13 - This function, like the rest of the :mod:`cgi` module, is deprecated. - It can be replaced with the functionality in the :mod:`email` package - (e.g. :class:`email.message.EmailMessage`/:class:`email.message.Message`) - which implements the same MIME RFCs, or with the - `multipart `__ PyPI project. - - -.. function:: parse_header(string) - - Parse a MIME header (such as :mailheader:`Content-Type`) into a main value and a - dictionary of parameters. - - .. deprecated-removed:: 3.11 3.13 - This function, like the rest of the :mod:`cgi` module, is deprecated. - It can be replaced with the functionality in the :mod:`email` package, - which implements the same MIME RFCs. - - For example, with :class:`email.message.EmailMessage`:: - - from email.message import EmailMessage - msg = EmailMessage() - msg['content-type'] = 'application/json; charset="utf8"' - main, params = msg.get_content_type(), msg['content-type'].params - - -.. function:: test() - - Robust test CGI script, usable as main program. Writes minimal HTTP headers and - formats all information provided to the script in HTML format. - - -.. function:: print_environ() - - Format the shell environment in HTML. - - -.. function:: print_form(form) - - Format a form in HTML. - - -.. function:: print_directory() - - Format the current directory in HTML. - - -.. function:: print_environ_usage() - - Print a list of useful (used by CGI) environment variables in HTML. - - -.. _cgi-security: - -Caring about security ---------------------- - -.. index:: pair: CGI; security - -There's one important rule: if you invoke an external program (via -:func:`os.system`, :func:`os.popen` or other functions with similar -functionality), make very sure you don't pass arbitrary strings received from -the client to the shell. This is a well-known security hole whereby clever -hackers anywhere on the web can exploit a gullible CGI script to invoke -arbitrary shell commands. Even parts of the URL or field names cannot be -trusted, since the request doesn't have to come from your form! - -To be on the safe side, if you must pass a string gotten from a form to a shell -command, you should make sure the string contains only alphanumeric characters, -dashes, underscores, and periods. - - -Installing your CGI script on a Unix system -------------------------------------------- - -Read the documentation for your HTTP server and check with your local system -administrator to find the directory where CGI scripts should be installed; -usually this is in a directory :file:`cgi-bin` in the server tree. - -Make sure that your script is readable and executable by "others"; the Unix file -mode should be ``0o755`` octal (use ``chmod 0755 filename``). Make sure that the -first line of the script contains ``#!`` starting in column 1 followed by the -pathname of the Python interpreter, for instance:: - - #!/usr/local/bin/python - -Make sure the Python interpreter exists and is executable by "others". - -Make sure that any files your script needs to read or write are readable or -writable, respectively, by "others" --- their mode should be ``0o644`` for -readable and ``0o666`` for writable. This is because, for security reasons, the -HTTP server executes your script as user "nobody", without any special -privileges. It can only read (write, execute) files that everybody can read -(write, execute). The current directory at execution time is also different (it -is usually the server's cgi-bin directory) and the set of environment variables -is also different from what you get when you log in. In particular, don't count -on the shell's search path for executables (:envvar:`PATH`) or the Python module -search path (:envvar:`PYTHONPATH`) to be set to anything interesting. - -If you need to load modules from a directory which is not on Python's default -module search path, you can change the path in your script, before importing -other modules. For example:: - - import sys - sys.path.insert(0, "/usr/home/joe/lib/python") - sys.path.insert(0, "/usr/local/lib/python") - -(This way, the directory inserted last will be searched first!) - -Instructions for non-Unix systems will vary; check your HTTP server's -documentation (it will usually have a section on CGI scripts). - - -Testing your CGI script ------------------------ - -Unfortunately, a CGI script will generally not run when you try it from the -command line, and a script that works perfectly from the command line may fail -mysteriously when run from the server. There's one reason why you should still -test your script from the command line: if it contains a syntax error, the -Python interpreter won't execute it at all, and the HTTP server will most likely -send a cryptic error to the client. - -Assuming your script has no syntax errors, yet it does not work, you have no -choice but to read the next section. - - -Debugging CGI scripts ---------------------- - -.. index:: pair: CGI; debugging - -First of all, check for trivial installation errors --- reading the section -above on installing your CGI script carefully can save you a lot of time. If -you wonder whether you have understood the installation procedure correctly, try -installing a copy of this module file (:file:`cgi.py`) as a CGI script. When -invoked as a script, the file will dump its environment and the contents of the -form in HTML format. Give it the right mode etc., and send it a request. If it's -installed in the standard :file:`cgi-bin` directory, it should be possible to -send it a request by entering a URL into your browser of the form: - -.. code-block:: none - - http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home - -If this gives an error of type 404, the server cannot find the script -- perhaps -you need to install it in a different directory. If it gives another error, -there's an installation problem that you should fix before trying to go any -further. If you get a nicely formatted listing of the environment and form -content (in this example, the fields should be listed as "addr" with value "At -Home" and "name" with value "Joe Blow"), the :file:`cgi.py` script has been -installed correctly. If you follow the same procedure for your own script, you -should now be able to debug it. - -The next step could be to call the :mod:`cgi` module's :func:`test` function -from your script: replace its main code with the single statement :: - - cgi.test() - -This should produce the same results as those gotten from installing the -:file:`cgi.py` file itself. - -When an ordinary Python script raises an unhandled exception (for whatever -reason: of a typo in a module name, a file that can't be opened, etc.), the -Python interpreter prints a nice traceback and exits. While the Python -interpreter will still do this when your CGI script raises an exception, most -likely the traceback will end up in one of the HTTP server's log files, or be -discarded altogether. - -Fortunately, once you have managed to get your script to execute *some* code, -you can easily send tracebacks to the web browser using the :mod:`cgitb` module. -If you haven't done so already, just add the lines:: - - import cgitb - cgitb.enable() - -to the top of your script. Then try running it again; when a problem occurs, -you should see a detailed report that will likely make apparent the cause of the -crash. - -If you suspect that there may be a problem in importing the :mod:`cgitb` module, -you can use an even more robust approach (which only uses built-in modules):: - - import sys - sys.stderr = sys.stdout - print("Content-Type: text/plain") - print() - ...your code here... - -This relies on the Python interpreter to print the traceback. The content type -of the output is set to plain text, which disables all HTML processing. If your -script works, the raw HTML will be displayed by your client. If it raises an -exception, most likely after the first two lines have been printed, a traceback -will be displayed. Because no HTML interpretation is going on, the traceback -will be readable. - - -Common problems and solutions ------------------------------ - -* Most HTTP servers buffer the output from CGI scripts until the script is - completed. This means that it is not possible to display a progress report on - the client's display while the script is running. - -* Check the installation instructions above. - -* Check the HTTP server's log files. (``tail -f logfile`` in a separate window - may be useful!) - -* Always check a script for syntax errors first, by doing something like - ``python script.py``. - -* If your script does not have any syntax errors, try adding ``import cgitb; - cgitb.enable()`` to the top of the script. - -* When invoking external programs, make sure they can be found. Usually, this - means using absolute path names --- :envvar:`PATH` is usually not set to a very - useful value in a CGI script. - -* When reading or writing external files, make sure they can be read or written - by the userid under which your CGI script will be running: this is typically the - userid under which the web server is running, or some explicitly specified - userid for a web server's ``suexec`` feature. -* Don't try to give a CGI script a set-uid mode. This doesn't work on most - systems, and is a security liability as well. +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. -.. rubric:: Footnotes +A fork of the module on PyPI can be used instead: :pypi:`legacy-cgi`. +This is a copy of the cgi module, no longer maintained or supported by the core +Python team. -.. [#] Note that some recent versions of the HTML specification do state what - order the field values should be supplied in, but knowing whether a request - was received from a conforming browser, or even from a browser at all, is - tedious and error-prone. +The last version of Python that provided the :mod:`!cgi` module was +`Python 3.12 `_. diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 7f00bcd5..fc646aa4 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -1,89 +1,19 @@ -:mod:`cgitb` --- Traceback manager for CGI scripts -================================================== +:mod:`!cgitb` --- Traceback manager for CGI scripts +=================================================== .. module:: cgitb - :synopsis: Configurable traceback handler for CGI scripts. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Ka-Ping Yee -.. sectionauthor:: Fred L. Drake, Jr. - -**Source code:** :source:`Lib/cgitb.py` - -.. index:: - single: CGI; exceptions - single: CGI; tracebacks - single: exceptions; in CGI scripts - single: tracebacks; in CGI scripts - .. deprecated-removed:: 3.11 3.13 - The :mod:`cgitb` module is deprecated - (see :pep:`PEP 594 <594#cgitb>` for details). - --------------- - -The :mod:`cgitb` module provides a special exception handler for Python scripts. -(Its name is a bit misleading. It was originally designed to display extensive -traceback information in HTML for CGI scripts. It was later generalized to also -display this information in plain text.) After this module is activated, if an -uncaught exception occurs, a detailed, formatted report will be displayed. The -report includes a traceback showing excerpts of the source code for each level, -as well as the values of the arguments and local variables to currently running -functions, to help you debug the problem. Optionally, you can save this -information to a file instead of sending it to the browser. - -To enable this feature, simply add this to the top of your CGI script:: - - import cgitb - cgitb.enable() - -The options to the :func:`enable` function control whether the report is -displayed in the browser and whether the report is logged to a file for later -analysis. - - -.. function:: enable(display=1, logdir=None, context=5, format="html") - - .. index:: single: excepthook() (in module sys) - - This function causes the :mod:`cgitb` module to take over the interpreter's - default handling for exceptions by setting the value of :attr:`sys.excepthook`. - - The optional argument *display* defaults to ``1`` and can be set to ``0`` to - suppress sending the traceback to the browser. If the argument *logdir* is - present, the traceback reports are written to files. The value of *logdir* - should be a directory where these files will be placed. The optional argument - *context* is the number of lines of context to display around the current line - of source code in the traceback; this defaults to ``5``. If the optional - argument *format* is ``"html"``, the output is formatted as HTML. Any other - value forces plain text output. The default value is ``"html"``. - - -.. function:: text(info, context=5) - - This function handles the exception described by *info* (a 3-tuple containing - the result of :func:`sys.exc_info`), formatting its traceback as text and - returning the result as a string. The optional argument *context* is the - number of lines of context to display around the current line of source code - in the traceback; this defaults to ``5``. - - -.. function:: html(info, context=5) - - This function handles the exception described by *info* (a 3-tuple containing - the result of :func:`sys.exc_info`), formatting its traceback as HTML and - returning the result as a string. The optional argument *context* is the - number of lines of context to display around the current line of source code - in the traceback; this defaults to ``5``. - -.. function:: handler(info=None) +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - This function handles an exception using the default settings (that is, show a - report in the browser, but don't log to a file). This can be used when you've - caught an exception and want to report it using :mod:`cgitb`. The optional - *info* argument should be a 3-tuple containing an exception type, exception - value, and traceback object, exactly like the tuple returned by - :func:`sys.exc_info`. If the *info* argument is not supplied, the current - exception is obtained from :func:`sys.exc_info`. +A fork of the module on PyPI can now be used instead: :pypi:`legacy-cgi`. +This is a copy of the cgi module, no longer maintained or supported by the core +Python team. +The last version of Python that provided the :mod:`!cgitb` module was +`Python 3.12 `_. diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 3b88e55b..9950a0ea 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -1,142 +1,15 @@ -:mod:`chunk` --- Read IFF chunked data -====================================== +:mod:`!chunk` --- Read IFF chunked data +======================================= .. module:: chunk - :synopsis: Module to read IFF chunks. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Sjoerd Mullender -.. sectionauthor:: Sjoerd Mullender - -**Source code:** :source:`Lib/chunk.py` - -.. index:: - single: Audio Interchange File Format - single: AIFF - single: AIFF-C - single: Real Media File Format - single: RMFF - .. deprecated-removed:: 3.11 3.13 - The :mod:`chunk` module is deprecated - (see :pep:`PEP 594 <594#chunk>` for details). - --------------- - -This module provides an interface for reading files that use EA IFF 85 chunks. -[#]_ This format is used in at least the Audio Interchange File Format -(AIFF/AIFF-C) and the Real Media File Format (RMFF). The WAVE audio file format -is closely related and can also be read using this module. - -A chunk has the following structure: - -+---------+--------+-------------------------------+ -| Offset | Length | Contents | -+=========+========+===============================+ -| 0 | 4 | Chunk ID | -+---------+--------+-------------------------------+ -| 4 | 4 | Size of chunk in big-endian | -| | | byte order, not including the | -| | | header | -+---------+--------+-------------------------------+ -| 8 | *n* | Data bytes, where *n* is the | -| | | size given in the preceding | -| | | field | -+---------+--------+-------------------------------+ -| 8 + *n* | 0 or 1 | Pad byte needed if *n* is odd | -| | | and chunk alignment is used | -+---------+--------+-------------------------------+ - -The ID is a 4-byte string which identifies the type of chunk. - -The size field (a 32-bit value, encoded using big-endian byte order) gives the -size of the chunk data, not including the 8-byte header. - -Usually an IFF-type file consists of one or more chunks. The proposed usage of -the :class:`Chunk` class defined here is to instantiate an instance at the start -of each chunk and read from the instance until it reaches the end, after which a -new instance can be instantiated. At the end of the file, creating a new -instance will fail with an :exc:`EOFError` exception. - - -.. class:: Chunk(file, align=True, bigendian=True, inclheader=False) - - Class which represents a chunk. The *file* argument is expected to be a - file-like object. An instance of this class is specifically allowed. The - only method that is needed is :meth:`~io.IOBase.read`. If the methods - :meth:`~io.IOBase.seek` and :meth:`~io.IOBase.tell` are present and don't - raise an exception, they are also used. - If these methods are present and raise an exception, they are expected to not - have altered the object. If the optional argument *align* is true, chunks - are assumed to be aligned on 2-byte boundaries. If *align* is false, no - alignment is assumed. The default value is true. If the optional argument - *bigendian* is false, the chunk size is assumed to be in little-endian order. - This is needed for WAVE audio files. The default value is true. If the - optional argument *inclheader* is true, the size given in the chunk header - includes the size of the header. The default value is false. - - A :class:`Chunk` object supports the following methods: - - - .. method:: getname() - - Returns the name (ID) of the chunk. This is the first 4 bytes of the - chunk. - - - .. method:: getsize() - - Returns the size of the chunk. - - - .. method:: close() - - Close and skip to the end of the chunk. This does not close the - underlying file. - - The remaining methods will raise :exc:`OSError` if called after the - :meth:`close` method has been called. Before Python 3.3, they used to - raise :exc:`IOError`, now an alias of :exc:`OSError`. - - - .. method:: isatty() - - Returns ``False``. - - - .. method:: seek(pos, whence=0) - - Set the chunk's current position. The *whence* argument is optional and - defaults to ``0`` (absolute file positioning); other values are ``1`` - (seek relative to the current position) and ``2`` (seek relative to the - file's end). There is no return value. If the underlying file does not - allow seek, only forward seeks are allowed. - - - .. method:: tell() - - Return the current position into the chunk. - - - .. method:: read(size=-1) - - Read at most *size* bytes from the chunk (less if the read hits the end of - the chunk before obtaining *size* bytes). If the *size* argument is - negative or omitted, read all data until the end of the chunk. An empty - bytes object is returned when the end of the chunk is encountered - immediately. - - - .. method:: skip() - - Skip to the end of the chunk. All further calls to :meth:`read` for the - chunk will return ``b''``. If you are not interested in the contents of - the chunk, this method should be called so that the file points to the - start of the next chunk. - - -.. rubric:: Footnotes -.. [#] "EA IFF 85" Standard for Interchange Format Files, Jerry Morrison, Electronic - Arts, January 1985. +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!chunk` module was +`Python 3.12 `_. diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst index fdac51d9..f122e364 100644 --- a/Doc/library/cmath.rst +++ b/Doc/library/cmath.rst @@ -1,5 +1,5 @@ -:mod:`cmath` --- Mathematical functions for complex numbers -=========================================================== +:mod:`!cmath` --- Mathematical functions for complex numbers +============================================================ .. module:: cmath :synopsis: Mathematical functions for complex numbers. @@ -43,10 +43,7 @@ Conversions to and from polar coordinates A Python complex number ``z`` is stored internally using *rectangular* or *Cartesian* coordinates. It is completely determined by its *real -part* ``z.real`` and its *imaginary part* ``z.imag``. In other -words:: - - z == z.real + z.imag*1j +part* ``z.real`` and its *imaginary part* ``z.imag``. *Polar coordinates* give an alternative way to represent a complex number. In polar coordinates, a complex number *z* is defined by the @@ -90,7 +87,7 @@ rectangular coordinates to polar coordinates and back. .. function:: rect(r, phi) Return the complex number *x* with polar coordinates *r* and *phi*. - Equivalent to ``r * (math.cos(phi) + math.sin(phi)*1j)``. + Equivalent to ``complex(r * math.cos(phi), r * math.sin(phi))``. Power and logarithmic functions @@ -224,19 +221,21 @@ Classification functions ``False`` otherwise. Whether or not two values are considered close is determined according to - given absolute and relative tolerances. + given absolute and relative tolerances. If no errors occur, the result will + be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. *rel_tol* is the relative tolerance -- it is the maximum allowed difference between *a* and *b*, relative to the larger absolute value of *a* or *b*. For example, to set a tolerance of 5%, pass ``rel_tol=0.05``. The default tolerance is ``1e-09``, which assures that the two values are the same - within about 9 decimal digits. *rel_tol* must be greater than zero. - - *abs_tol* is the minimum absolute tolerance -- useful for comparisons near - zero. *abs_tol* must be at least zero. - - If no errors occur, the result will be: - ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. + within about 9 decimal digits. *rel_tol* must be nonnegative and less + than ``1.0``. + + *abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be + nonnegative. When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed + as ``abs(x) <= rel_tol * abs(x)``, which is ``False`` for any ``x`` and + rel_tol less than ``1.0``. So add an appropriate positive abs_tol argument + to the call. The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be handled according to IEEE rules. Specifically, ``NaN`` is not considered diff --git a/Doc/library/cmd.rst b/Doc/library/cmd.rst index fd5df96d..66544f82 100644 --- a/Doc/library/cmd.rst +++ b/Doc/library/cmd.rst @@ -1,5 +1,5 @@ -:mod:`cmd` --- Support for line-oriented command interpreters -============================================================= +:mod:`!cmd` --- Support for line-oriented command interpreters +============================================================== .. module:: cmd :synopsis: Build line-oriented command interpreters. @@ -26,6 +26,13 @@ interface. key; it defaults to :kbd:`Tab`. If *completekey* is not :const:`None` and :mod:`readline` is available, command completion is done automatically. + The default, ``'tab'``, is treated specially, so that it refers to the + :kbd:`Tab` key on every :data:`readline.backend`. + Specifically, if :data:`readline.backend` is ``editline``, + ``Cmd`` will use ``'^I'`` instead of ``'tab'``. + Note that other values are not treated this way, and might only work + with a specific backend. + The optional arguments *stdin* and *stdout* specify the input and output file objects that the Cmd instance or subclass instance will use for input and output. If not specified, they will default to :data:`sys.stdin` and @@ -35,6 +42,9 @@ interface. :attr:`use_rawinput` attribute to ``False``, otherwise *stdin* will be ignored. + .. versionchanged:: 3.13 + ``completekey='tab'`` is replaced by ``'^I'`` for ``editline``. + .. _cmd-objects: @@ -66,29 +76,32 @@ A :class:`Cmd` instance has the following methods: single: ! (exclamation); in a command interpreter An interpreter instance will recognize a command name ``foo`` if and only if it - has a method :meth:`do_foo`. As a special case, a line beginning with the + has a method :meth:`!do_foo`. As a special case, a line beginning with the character ``'?'`` is dispatched to the method :meth:`do_help`. As another special case, a line beginning with the character ``'!'`` is dispatched to the - method :meth:`do_shell` (if such a method is defined). + method :meth:`!do_shell` (if such a method is defined). This method will return when the :meth:`postcmd` method returns a true value. The *stop* argument to :meth:`postcmd` is the return value from the command's - corresponding :meth:`do_\*` method. + corresponding :meth:`!do_\*` method. If completion is enabled, completing commands will be done automatically, and - completing of commands args is done by calling :meth:`complete_foo` with + completing of commands args is done by calling :meth:`!complete_foo` with arguments *text*, *line*, *begidx*, and *endidx*. *text* is the string prefix we are attempting to match: all returned matches must begin with it. *line* is the current input line with leading whitespace removed, *begidx* and *endidx* are the beginning and ending indexes of the prefix text, which could be used to provide different completion depending upon which position the argument is in. - All subclasses of :class:`Cmd` inherit a predefined :meth:`do_help`. This + +.. method:: Cmd.do_help(arg) + + All subclasses of :class:`Cmd` inherit a predefined :meth:`!do_help`. This method, called with an argument ``'bar'``, invokes the corresponding method - :meth:`help_bar`, and if that is not present, prints the docstring of - :meth:`do_bar`, if available. With no argument, :meth:`do_help` lists all + :meth:`!help_bar`, and if that is not present, prints the docstring of + :meth:`!do_bar`, if available. With no argument, :meth:`!do_help` lists all available help topics (that is, all commands with corresponding - :meth:`help_\*` methods or commands that have docstrings), and also lists any + :meth:`!help_\*` methods or commands that have docstrings), and also lists any undocumented commands. @@ -98,7 +111,7 @@ A :class:`Cmd` instance has the following methods: This may be overridden, but should not normally need to be; see the :meth:`precmd` and :meth:`postcmd` methods for useful execution hooks. The return value is a flag indicating whether interpretation of commands by the - interpreter should stop. If there is a :meth:`do_\*` method for the command + interpreter should stop. If there is a :meth:`!do_\*` method for the command *str*, the return value of that method is returned, otherwise the return value from the :meth:`default` method is returned. @@ -118,7 +131,7 @@ A :class:`Cmd` instance has the following methods: .. method:: Cmd.completedefault(text, line, begidx, endidx) Method called to complete an input line when no command-specific - :meth:`complete_\*` method is available. By default, it returns an empty list. + :meth:`!complete_\*` method is available. By default, it returns an empty list. .. method:: Cmd.columnize(list, displaywidth=80) @@ -199,14 +212,14 @@ Instances of :class:`Cmd` subclasses have some public instance variables: .. attribute:: Cmd.misc_header The header to issue if the help output has a section for miscellaneous help - topics (that is, there are :meth:`help_\*` methods without corresponding - :meth:`do_\*` methods). + topics (that is, there are :meth:`!help_\*` methods without corresponding + :meth:`!do_\*` methods). .. attribute:: Cmd.undoc_header The header to issue if the help output has a section for undocumented commands - (that is, there are :meth:`do_\*` methods without corresponding :meth:`help_\*` + (that is, there are :meth:`!do_\*` methods without corresponding :meth:`!help_\*` methods). @@ -219,8 +232,8 @@ Instances of :class:`Cmd` subclasses have some public instance variables: .. attribute:: Cmd.use_rawinput A flag, defaulting to true. If true, :meth:`cmdloop` uses :func:`input` to - display a prompt and read the next command; if false, :meth:`sys.stdout.write` - and :meth:`sys.stdin.readline` are used. (This means that by importing + display a prompt and read the next command; if false, :data:`sys.stdout.write() ` + and :data:`sys.stdin.readline() ` are used. (This means that by importing :mod:`readline`, on systems that support it, the interpreter will automatically support :program:`Emacs`\ -like line editing and command-history keystrokes.) @@ -239,14 +252,14 @@ This section presents a simple example of how to build a shell around a few of the commands in the :mod:`turtle` module. Basic turtle commands such as :meth:`~turtle.forward` are added to a -:class:`Cmd` subclass with method named :meth:`do_forward`. The argument is +:class:`Cmd` subclass with method named :meth:`!do_forward`. The argument is converted to a number and dispatched to the turtle module. The docstring is used in the help utility provided by the shell. The example also includes a basic record and playback facility implemented with the :meth:`~Cmd.precmd` method which is responsible for converting the input to -lowercase and writing the commands to a file. The :meth:`do_playback` method -reads the file and adds the recorded commands to the :attr:`cmdqueue` for +lowercase and writing the commands to a file. The :meth:`!do_playback` method +reads the file and adds the recorded commands to the :attr:`~Cmd.cmdqueue` for immediate playback:: import cmd, sys diff --git a/Doc/library/cmdline.rst b/Doc/library/cmdline.rst new file mode 100644 index 00000000..487fd775 --- /dev/null +++ b/Doc/library/cmdline.rst @@ -0,0 +1,59 @@ +++++++++++++++++++++++++++++++++++++ +Modules command-line interface (CLI) +++++++++++++++++++++++++++++++++++++ + +The following modules have a command-line interface. + +* :ref:`ast ` +* :ref:`asyncio ` +* :mod:`base64` +* :ref:`calendar ` +* :mod:`code` +* :ref:`compileall ` +* :mod:`cProfile`: see :ref:`profile ` +* :ref:`difflib ` +* :ref:`dis ` +* :mod:`doctest` +* :mod:`!encodings.rot_13` +* :mod:`ensurepip` +* :mod:`filecmp` +* :mod:`fileinput` +* :mod:`ftplib` +* :ref:`gzip ` +* :ref:`http.server ` +* :mod:`!idlelib` +* :ref:`inspect ` +* :ref:`json.tool ` +* :mod:`mimetypes` +* :mod:`pdb` +* :mod:`pickle` +* :ref:`pickletools ` +* :mod:`platform` +* :mod:`poplib` +* :ref:`profile ` +* :mod:`pstats` +* :ref:`py_compile ` +* :mod:`pyclbr` +* :mod:`pydoc` +* :mod:`quopri` +* :ref:`random ` +* :mod:`runpy` +* :ref:`site ` +* :ref:`sqlite3 ` +* :ref:`symtable ` +* :ref:`sysconfig ` +* :mod:`tabnanny` +* :ref:`tarfile ` +* :mod:`!this` +* :ref:`timeit ` +* :ref:`tokenize ` +* :ref:`trace ` +* :mod:`turtledemo` +* :ref:`unittest ` +* :ref:`uuid ` +* :mod:`venv` +* :mod:`webbrowser` +* :ref:`zipapp ` +* :ref:`zipfile ` + +See also the :ref:`Python command-line interface `. diff --git a/Doc/library/code.rst b/Doc/library/code.rst index 3d7f43c8..8f7692df 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -1,5 +1,5 @@ -:mod:`code` --- Interpreter base classes -======================================== +:mod:`!code` --- Interpreter base classes +========================================= .. module:: code :synopsis: Facilities to implement read-eval-print loops. @@ -18,25 +18,30 @@ build applications which provide an interactive interpreter prompt. This class deals with parsing and interpreter state (the user's namespace); it does not deal with input buffering or prompting or input file naming (the filename is always passed in explicitly). The optional *locals* argument - specifies the dictionary in which code will be executed; it defaults to a newly - created dictionary with key ``'__name__'`` set to ``'__console__'`` and key - ``'__doc__'`` set to ``None``. + specifies a mapping to use as the namespace in which code will be executed; + it defaults to a newly created dictionary with key ``'__name__'`` set to + ``'__console__'`` and key ``'__doc__'`` set to ``None``. -.. class:: InteractiveConsole(locals=None, filename="") +.. class:: InteractiveConsole(locals=None, filename="", local_exit=False) Closely emulate the behavior of the interactive Python interpreter. This class builds on :class:`InteractiveInterpreter` and adds prompting using the familiar - ``sys.ps1`` and ``sys.ps2``, and input buffering. + ``sys.ps1`` and ``sys.ps2``, and input buffering. If *local_exit* is true, + ``exit()`` and ``quit()`` in the console will not raise :exc:`SystemExit`, but + instead return to the calling code. + .. versionchanged:: 3.13 + Added *local_exit* parameter. -.. function:: interact(banner=None, readfunc=None, local=None, exitmsg=None) +.. function:: interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False) Convenience function to run a read-eval-print loop. This creates a new instance of :class:`InteractiveConsole` and sets *readfunc* to be used as the :meth:`InteractiveConsole.raw_input` method, if provided. If *local* is provided, it is passed to the :class:`InteractiveConsole` constructor for - use as the default namespace for the interpreter loop. The :meth:`interact` + use as the default namespace for the interpreter loop. If *local_exit* is provided, + it is passed to the :class:`InteractiveConsole` constructor. The :meth:`~InteractiveConsole.interact` method of the instance is then run with *banner* and *exitmsg* passed as the banner and exit message to use, if provided. The console object is discarded after use. @@ -44,6 +49,8 @@ build applications which provide an interactive interpreter prompt. .. versionchanged:: 3.6 Added *exitmsg* parameter. + .. versionchanged:: 3.13 + Added *local_exit* parameter. .. function:: compile_command(source, filename="", symbol="single") diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 2db4a67d..2cfd8a1e 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1,5 +1,5 @@ -:mod:`codecs` --- Codec registry and base classes -================================================= +:mod:`!codecs` --- Codec registry and base classes +================================================== .. module:: codecs :synopsis: Encode and decode data and streams. @@ -520,44 +520,46 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input, errors='strict') +.. class:: Codec - Encodes the object *input* and returns a tuple (output object, length consumed). - For instance, :term:`text encoding` converts - a string object to a bytes object using a particular - character set encoding (e.g., ``cp1252`` or ``iso-8859-1``). + .. method:: encode(input, errors='strict') - The *errors* argument defines the error handling to apply. - It defaults to ``'strict'`` handling. + Encodes the object *input* and returns a tuple (output object, length consumed). + For instance, :term:`text encoding` converts + a string object to a bytes object using a particular + character set encoding (e.g., ``cp1252`` or ``iso-8859-1``). - The method may not store state in the :class:`Codec` instance. Use - :class:`StreamWriter` for codecs which have to keep state in order to make - encoding efficient. + The *errors* argument defines the error handling to apply. + It defaults to ``'strict'`` handling. - The encoder must be able to handle zero length input and return an empty object - of the output object type in this situation. + The method may not store state in the :class:`Codec` instance. Use + :class:`StreamWriter` for codecs which have to keep state in order to make + encoding efficient. + The encoder must be able to handle zero length input and return an empty object + of the output object type in this situation. -.. method:: Codec.decode(input, errors='strict') - Decodes the object *input* and returns a tuple (output object, length - consumed). For instance, for a :term:`text encoding`, decoding converts - a bytes object encoded using a particular - character set encoding to a string object. + .. method:: decode(input, errors='strict') - For text encodings and bytes-to-bytes codecs, - *input* must be a bytes object or one which provides the read-only - buffer interface -- for example, buffer objects and memory mapped files. + Decodes the object *input* and returns a tuple (output object, length + consumed). For instance, for a :term:`text encoding`, decoding converts + a bytes object encoded using a particular + character set encoding to a string object. - The *errors* argument defines the error handling to apply. - It defaults to ``'strict'`` handling. + For text encodings and bytes-to-bytes codecs, + *input* must be a bytes object or one which provides the read-only + buffer interface -- for example, buffer objects and memory mapped files. - The method may not store state in the :class:`Codec` instance. Use - :class:`StreamReader` for codecs which have to keep state in order to make - decoding efficient. + The *errors* argument defines the error handling to apply. + It defaults to ``'strict'`` handling. - The decoder must be able to handle zero length input and return an empty object - of the output object type in this situation. + The method may not store state in the :class:`Codec` instance. Use + :class:`StreamReader` for codecs which have to keep state in order to make + decoding efficient. + + The decoder must be able to handle zero length input and return an empty object + of the output object type in this situation. Incremental Encoding and Decoding @@ -705,7 +707,7 @@ Stream Encoding and Decoding The :class:`StreamWriter` and :class:`StreamReader` classes provide generic working interfaces which can be used to implement new encoding submodules very -easily. See :mod:`encodings.utf_8` for an example of how this is done. +easily. See :mod:`!encodings.utf_8` for an example of how this is done. .. _stream-writer-objects: @@ -895,9 +897,10 @@ The design is such that one can use the factory functions returned by the .. class:: StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict') Creates a :class:`StreamRecoder` instance which implements a two-way conversion: - *encode* and *decode* work on the frontend — the data visible to - code calling :meth:`read` and :meth:`write`, while *Reader* and *Writer* - work on the backend — the data in *stream*. + *encode* and *decode* work on the frontend — the data visible to + code calling :meth:`~StreamReader.read` and :meth:`~StreamWriter.write`, + while *Reader* and *Writer* + work on the backend — the data in *stream*. You can use these objects to do transparent transcodings, e.g., from Latin-1 to UTF-8 and back. @@ -1129,7 +1132,8 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | cp875 | | Greek | +-----------------+--------------------------------+--------------------------------+ -| cp932 | 932, ms932, mskanji, ms-kanji | Japanese | +| cp932 | 932, ms932, mskanji, ms-kanji, | Japanese | +| | windows-31j | | +-----------------+--------------------------------+--------------------------------+ | cp949 | 949, ms949, uhc | Korean | +-----------------+--------------------------------+--------------------------------+ @@ -1417,8 +1421,8 @@ to :class:`bytes` mappings. They are not supported by :meth:`bytes.decode` | | quotedprintable, | quoted printable. | ``quotetabs=True`` / | | | quoted_printable | | :meth:`quopri.decode` | +----------------------+------------------+------------------------------+------------------------------+ -| uu_codec | uu | Convert the operand using | :meth:`uu.encode` / | -| | | uuencode. | :meth:`uu.decode` | +| uu_codec | uu | Convert the operand using | | +| | | uuencode. | | +----------------------+------------------+------------------------------+------------------------------+ | zlib_codec | zip, zlib | Compress the operand using | :meth:`zlib.compress` / | | | | gzip. | :meth:`zlib.decompress` | @@ -1474,7 +1478,7 @@ Internationalized Domain Names (IDN)). It builds upon the ``punycode`` encoding and :mod:`stringprep`. If you need the IDNA 2008 standard from :rfc:`5891` and :rfc:`5895`, use the -third-party `idna module `_. +third-party :pypi:`idna` module. These RFCs together define a protocol to support non-ASCII characters in domain names. A domain name containing non-ASCII characters (such as @@ -1537,13 +1541,13 @@ This module implements the ANSI codepage (CP_ACP). .. availability:: Windows. -.. versionchanged:: 3.3 - Support any error handler. - .. versionchanged:: 3.2 Before 3.2, the *errors* argument was ignored; ``'replace'`` was always used to encode, and ``'ignore'`` to decode. +.. versionchanged:: 3.3 + Support any error handler. + :mod:`encodings.utf_8_sig` --- UTF-8 codec with BOM signature ------------------------------------------------------------- diff --git a/Doc/library/codeop.rst b/Doc/library/codeop.rst index 55606e1c..16f674ad 100644 --- a/Doc/library/codeop.rst +++ b/Doc/library/codeop.rst @@ -1,5 +1,5 @@ -:mod:`codeop` --- Compile Python code -===================================== +:mod:`!codeop` --- Compile Python code +====================================== .. module:: codeop :synopsis: Compile (possibly incomplete) Python code. diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index 43a3286b..0adbd305 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -1,5 +1,5 @@ -:mod:`collections.abc` --- Abstract Base Classes for Containers -=============================================================== +:mod:`!collections.abc` --- Abstract Base Classes for Containers +================================================================ .. module:: collections.abc :synopsis: Abstract base classes for containers @@ -22,7 +22,7 @@ This module provides :term:`abstract base classes ` that can be used to test whether a class provides a particular interface; for -example, whether it is :term:`hashable` or whether it is a mapping. +example, whether it is :term:`hashable` or whether it is a :term:`mapping`. An :func:`issubclass` or :func:`isinstance` test for an interface works in one of three ways. @@ -73,7 +73,7 @@ of the API: >>> isinstance(D(), Sequence) True -In this example, class :class:`D` does not need to define +In this example, class :class:`!D` does not need to define ``__contains__``, ``__iter__``, and ``__reversed__`` because the :ref:`in-operator `, the :term:`iteration ` logic, and the :func:`reversed` function automatically fall back to @@ -87,7 +87,7 @@ the required methods (unless those methods have been set to class E: def __iter__(self): ... - def __next__(next): ... + def __next__(self): ... .. doctest:: @@ -136,8 +136,8 @@ ABC Inherits from Abstract Methods Mi :class:`Collection` ``__len__`` ``index``, and ``count`` :class:`MutableSequence` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods and - ``__setitem__``, ``append``, ``reverse``, ``extend``, ``pop``, - ``__delitem__``, ``remove``, and ``__iadd__`` + ``__setitem__``, ``append``, ``clear``, ``reverse``, ``extend``, + ``__delitem__``, ``pop``, ``remove``, and ``__iadd__`` ``__len__``, ``insert`` @@ -183,16 +183,16 @@ ABC Inherits from Abstract Methods Mi .. rubric:: Footnotes -.. [1] These ABCs override :meth:`object.__subclasshook__` to support +.. [1] These ABCs override :meth:`~abc.ABCMeta.__subclasshook__` to support testing an interface by verifying the required methods are present and have not been set to :const:`None`. This only works for simple interfaces. More complex interfaces require registration or direct subclassing. .. [2] Checking ``isinstance(obj, Iterable)`` detects classes that are - registered as :class:`Iterable` or that have an :meth:`__iter__` + registered as :class:`Iterable` or that have an :meth:`~container.__iter__` method, but it does not detect classes that iterate with the - :meth:`__getitem__` method. The only reliable way to determine + :meth:`~object.__getitem__` method. The only reliable way to determine whether an object is :term:`iterable` is to call ``iter(obj)``. @@ -202,27 +202,31 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: Container - ABC for classes that provide the :meth:`__contains__` method. + ABC for classes that provide the :meth:`~object.__contains__` method. .. class:: Hashable - ABC for classes that provide the :meth:`__hash__` method. + ABC for classes that provide the :meth:`~object.__hash__` method. .. class:: Sized - ABC for classes that provide the :meth:`__len__` method. + ABC for classes that provide the :meth:`~object.__len__` method. .. class:: Callable - ABC for classes that provide the :meth:`__call__` method. + ABC for classes that provide the :meth:`~object.__call__` method. + + See :ref:`annotating-callables` for details on how to use + :class:`!Callable` in type annotations. .. class:: Iterable - ABC for classes that provide the :meth:`__iter__` method. + ABC for classes that provide the :meth:`~container.__iter__` method. Checking ``isinstance(obj, Iterable)`` detects classes that are registered - as :class:`Iterable` or that have an :meth:`__iter__` method, but it does - not detect classes that iterate with the :meth:`__getitem__` method. + as :class:`Iterable` or that have an :meth:`~container.__iter__` method, + but it does + not detect classes that iterate with the :meth:`~object.__getitem__` method. The only reliable way to determine whether an object is :term:`iterable` is to call ``iter(obj)``. @@ -240,17 +244,20 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: Reversible - ABC for iterable classes that also provide the :meth:`__reversed__` + ABC for iterable classes that also provide the :meth:`~object.__reversed__` method. .. versionadded:: 3.6 .. class:: Generator - ABC for generator classes that implement the protocol defined in - :pep:`342` that extends iterators with the :meth:`~generator.send`, + ABC for :term:`generator` classes that implement the protocol defined in + :pep:`342` that extends :term:`iterators ` with the + :meth:`~generator.send`, :meth:`~generator.throw` and :meth:`~generator.close` methods. - See also the definition of :term:`generator`. + + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!Generator` in type annotations. .. versionadded:: 3.5 @@ -261,9 +268,9 @@ Collections Abstract Base Classes -- Detailed Descriptions ABCs for read-only and mutable :term:`sequences `. Implementation note: Some of the mixin methods, such as - :meth:`__iter__`, :meth:`__reversed__` and :meth:`index`, make - repeated calls to the underlying :meth:`__getitem__` method. - Consequently, if :meth:`__getitem__` is implemented with constant + :meth:`~container.__iter__`, :meth:`~object.__reversed__` and :meth:`index`, make + repeated calls to the underlying :meth:`~object.__getitem__` method. + Consequently, if :meth:`~object.__getitem__` is implemented with constant access speed, the mixin methods will have linear performance; however, if the underlying method is linear (as it would be with a linked list), the mixins will have quadratic performance and will @@ -282,7 +289,7 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: Set MutableSet - ABCs for read-only and mutable sets. + ABCs for read-only and mutable :ref:`sets `. .. class:: Mapping MutableMapping @@ -299,16 +306,16 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: Awaitable ABC for :term:`awaitable` objects, which can be used in :keyword:`await` - expressions. Custom implementations must provide the :meth:`__await__` - method. + expressions. Custom implementations must provide the + :meth:`~object.__await__` method. :term:`Coroutine ` objects and instances of the :class:`~collections.abc.Coroutine` ABC are all instances of this ABC. .. note:: - In CPython, generator-based coroutines (generators decorated with - :func:`types.coroutine`) are - *awaitables*, even though they do not have an :meth:`__await__` method. + In CPython, generator-based coroutines (:term:`generators ` + decorated with :func:`@types.coroutine `) are + *awaitables*, even though they do not have an :meth:`~object.__await__` method. Using ``isinstance(gencoro, Awaitable)`` for them will return ``False``. Use :func:`inspect.isawaitable` to detect them. @@ -316,25 +323,30 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: Coroutine - ABC for coroutine compatible classes. These implement the + ABC for :term:`coroutine` compatible classes. These implement the following methods, defined in :ref:`coroutine-objects`: :meth:`~coroutine.send`, :meth:`~coroutine.throw`, and :meth:`~coroutine.close`. Custom implementations must also implement - :meth:`__await__`. All :class:`Coroutine` instances are also instances of - :class:`Awaitable`. See also the definition of :term:`coroutine`. + :meth:`~object.__await__`. All :class:`Coroutine` instances are also + instances of :class:`Awaitable`. .. note:: - In CPython, generator-based coroutines (generators decorated with - :func:`types.coroutine`) are - *awaitables*, even though they do not have an :meth:`__await__` method. + In CPython, generator-based coroutines (:term:`generators ` + decorated with :func:`@types.coroutine `) are + *awaitables*, even though they do not have an :meth:`~object.__await__` method. Using ``isinstance(gencoro, Coroutine)`` for them will return ``False``. Use :func:`inspect.isawaitable` to detect them. + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!Coroutine` in type annotations. + The variance and order of type parameters correspond to those of + :class:`Generator`. + .. versionadded:: 3.5 .. class:: AsyncIterable - ABC for classes that provide ``__aiter__`` method. See also the + ABC for classes that provide an ``__aiter__`` method. See also the definition of :term:`asynchronous iterable`. .. versionadded:: 3.5 @@ -348,9 +360,12 @@ Collections Abstract Base Classes -- Detailed Descriptions .. class:: AsyncGenerator - ABC for asynchronous generator classes that implement the protocol + ABC for :term:`asynchronous generator` classes that implement the protocol defined in :pep:`525` and :pep:`492`. + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!AsyncGenerator` in type annotations. + .. versionadded:: 3.6 .. class:: Buffer @@ -373,9 +388,9 @@ particular functionality, for example:: Several of the ABCs are also useful as mixins that make it easier to develop classes supporting container APIs. For example, to write a class supporting the full :class:`Set` API, it is only necessary to supply the three underlying -abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`. -The ABC supplies the remaining methods such as :meth:`__and__` and -:meth:`isdisjoint`:: +abstract methods: :meth:`~object.__contains__`, :meth:`~container.__iter__`, and +:meth:`~object.__len__`. The ABC supplies the remaining methods such as +:meth:`!__and__` and :meth:`~frozenset.isdisjoint`:: class ListBasedSet(collections.abc.Set): ''' Alternate set implementation favoring space over speed @@ -403,23 +418,24 @@ Notes on using :class:`Set` and :class:`MutableSet` as a mixin: (1) Since some set operations create new sets, the default mixin methods need - a way to create new instances from an iterable. The class constructor is + a way to create new instances from an :term:`iterable`. The class constructor is assumed to have a signature in the form ``ClassName(iterable)``. - That assumption is factored-out to an internal classmethod called - :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set. + That assumption is factored-out to an internal :class:`classmethod` called + :meth:`!_from_iterable` which calls ``cls(iterable)`` to produce a new set. If the :class:`Set` mixin is being used in a class with a different - constructor signature, you will need to override :meth:`_from_iterable` + constructor signature, you will need to override :meth:`!_from_iterable` with a classmethod or regular method that can construct new instances from an iterable argument. (2) To override the comparisons (presumably for speed, as the - semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`, + semantics are fixed), redefine :meth:`~object.__le__` and + :meth:`~object.__ge__`, then the other operations will automatically follow suit. (3) - The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value - for the set; however, :meth:`__hash__` is not defined because not all sets + The :class:`Set` mixin provides a :meth:`!_hash` method to compute a hash value + for the set; however, :meth:`~object.__hash__` is not defined because not all sets are :term:`hashable` or immutable. To add set hashability using mixins, inherit from both :meth:`Set` and :meth:`Hashable`, then define ``__hash__ = Set._hash``. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index bb46782c..5b4e4457 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1,5 +1,5 @@ -:mod:`collections` --- Container datatypes -========================================== +:mod:`!collections` --- Container datatypes +=========================================== .. module:: collections :synopsis: Container datatypes @@ -99,7 +99,7 @@ The class can be used to simulate nested scopes and is useful in templating. :func:`super` function. A reference to ``d.parents`` is equivalent to: ``ChainMap(*d.maps[1:])``. - Note, the iteration order of a :class:`ChainMap()` is determined by + Note, the iteration order of a :class:`ChainMap` is determined by scanning the mappings last to first:: >>> baseline = {'music': 'bach', 'art': 'rembrandt'} @@ -120,26 +120,26 @@ The class can be used to simulate nested scopes and is useful in templating. .. seealso:: - * The `MultiContext class - `_ - in the Enthought `CodeTools package - `_ has options to support - writing to any mapping in the chain. + * The `MultiContext class + `_ + in the Enthought `CodeTools package + `_ has options to support + writing to any mapping in the chain. - * Django's `Context class - `_ - for templating is a read-only chain of mappings. It also features - pushing and popping of contexts similar to the - :meth:`~collections.ChainMap.new_child` method and the - :attr:`~collections.ChainMap.parents` property. + * Django's `Context class + `_ + for templating is a read-only chain of mappings. It also features + pushing and popping of contexts similar to the + :meth:`~collections.ChainMap.new_child` method and the + :attr:`~collections.ChainMap.parents` property. - * The `Nested Contexts recipe - `_ has options to control - whether writes and other mutations apply only to the first mapping or to - any mapping in the chain. + * The `Nested Contexts recipe + `_ has options to control + whether writes and other mutations apply only to the first mapping or to + any mapping in the chain. - * A `greatly simplified read-only version of Chainmap - `_. + * A `greatly simplified read-only version of Chainmap + `_. :class:`ChainMap` Examples and Recipes @@ -343,7 +343,7 @@ superset relationships: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``. All of those tests treat missing elements as having zero counts so that ``Counter(a=1) == Counter(a=1, b=0)`` returns true. -.. versionadded:: 3.10 +.. versionchanged:: 3.10 Rich comparison operations were added. .. versionchanged:: 3.10 @@ -358,7 +358,7 @@ Common patterns for working with :class:`Counter` objects:: list(c) # list unique elements set(c) # convert to a set dict(c) # convert to a regular dictionary - c.items() # convert to a list of (elem, cnt) pairs + c.items() # access the (elem, cnt) pairs Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs c.most_common()[:-n-1:-1] # n least common elements +c # remove zero and negative counts @@ -429,22 +429,22 @@ or subtracting from an empty counter. .. seealso:: - * `Bag class `_ - in Smalltalk. + * `Bag class `_ + in Smalltalk. - * Wikipedia entry for `Multisets `_. + * Wikipedia entry for `Multisets `_. - * `C++ multisets `_ - tutorial with examples. + * `C++ multisets `_ + tutorial with examples. - * For mathematical operations on multisets and their use cases, see - *Knuth, Donald. The Art of Computer Programming Volume II, - Section 4.6.3, Exercise 19*. + * For mathematical operations on multisets and their use cases, see + *Knuth, Donald. The Art of Computer Programming Volume II, + Section 4.6.3, Exercise 19*. - * To enumerate all distinct multisets of a given size over a given set of - elements, see :func:`itertools.combinations_with_replacement`:: + * To enumerate all distinct multisets of a given size over a given set of + elements, see :func:`itertools.combinations_with_replacement`:: - map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC + map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC :class:`deque` objects @@ -458,10 +458,10 @@ or subtracting from an empty counter. Deques are a generalization of stacks and queues (the name is pronounced "deck" and is short for "double-ended queue"). Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the - same O(1) performance in either direction. + same *O*\ (1) performance in either direction. Though :class:`list` objects support similar operations, they are optimized for - fast fixed-length operations and incur O(n) memory movement costs for + fast fixed-length operations and incur *O*\ (*n*) memory movement costs for ``pop(0)`` and ``insert(0, v)`` operations which change both the size and position of the underlying data representation. @@ -585,7 +585,7 @@ or subtracting from an empty counter. In addition to the above, deques support iteration, pickling, ``len(d)``, ``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with the :keyword:`in` operator, and subscript references such as ``d[0]`` to access -the first element. Indexed access is O(1) at both ends but slows to O(n) in +the first element. Indexed access is *O*\ (1) at both ends but slows to *O*\ (*n*) in the middle. For fast random access, use lists instead. Starting in version 3.5, deques support ``__add__()``, ``__mul__()``, @@ -743,12 +743,12 @@ stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, If calling :attr:`default_factory` raises an exception this exception is propagated unchanged. - This method is called by the :meth:`__getitem__` method of the + This method is called by the :meth:`~object.__getitem__` method of the :class:`dict` class when the requested key is not found; whatever it - returns or raises is then returned or raised by :meth:`__getitem__`. + returns or raises is then returned or raised by :meth:`~object.__getitem__`. Note that :meth:`__missing__` is *not* called for any operations besides - :meth:`__getitem__`. This means that :meth:`get` will, like normal + :meth:`~object.__getitem__`. This means that :meth:`get` will, like normal dictionaries, return ``None`` as a default rather than using :attr:`default_factory`. @@ -783,10 +783,10 @@ sequence of key-value pairs into a dictionary of lists: When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the :attr:`~defaultdict.default_factory` -function which returns an empty :class:`list`. The :meth:`list.append` +function which returns an empty :class:`list`. The :meth:`!list.append` operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the -:meth:`list.append` operation adds another value to the list. This technique is +:meth:`!list.append` operation adds another value to the list. This technique is simpler and faster than an equivalent technique using :meth:`dict.setdefault`: >>> d = {} @@ -874,8 +874,8 @@ they add the ability to access fields by name instead of position index. ``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to ``1``, and ``z`` will default to ``2``. - If *module* is defined, the ``__module__`` attribute of the named tuple is - set to that value. + If *module* is defined, the :attr:`~type.__module__` attribute of the + named tuple is set to that value. Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples. @@ -979,6 +979,12 @@ field names, the method and attribute names start with an underscore. >>> for partnum, record in inventory.items(): ... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now()) + Named tuples are also supported by generic function :func:`copy.replace`. + + .. versionchanged:: 3.13 + Raise :exc:`TypeError` instead of :exc:`ValueError` for invalid + keyword arguments. + .. attribute:: somenamedtuple._fields Tuple of strings listing the field names. Useful for introspection @@ -1060,20 +1066,20 @@ fields: .. seealso:: - * See :class:`typing.NamedTuple` for a way to add type hints for named - tuples. It also provides an elegant notation using the :keyword:`class` - keyword:: + * See :class:`typing.NamedTuple` for a way to add type hints for named + tuples. It also provides an elegant notation using the :keyword:`class` + keyword:: - class Component(NamedTuple): - part_number: int - weight: float - description: Optional[str] = None + class Component(NamedTuple): + part_number: int + weight: float + description: Optional[str] = None - * See :meth:`types.SimpleNamespace` for a mutable namespace based on an - underlying dictionary instead of a tuple. + * See :meth:`types.SimpleNamespace` for a mutable namespace based on an + underlying dictionary instead of a tuple. - * The :mod:`dataclasses` module provides a decorator and functions for - automatically adding generated special methods to user-defined classes. + * The :mod:`dataclasses` module provides a decorator and functions for + automatically adding generated special methods to user-defined classes. :class:`OrderedDict` objects @@ -1163,8 +1169,11 @@ Some differences from :class:`dict` still remain: In addition to the usual mapping methods, ordered dictionaries also support reverse iteration using :func:`reversed`. +.. _collections_OrderedDict__eq__: + Equality tests between :class:`OrderedDict` objects are order-sensitive -and are implemented as ``list(od1.items())==list(od2.items())``. +and are roughly equivalent to ``list(od1.items())==list(od2.items())``. + Equality tests between :class:`OrderedDict` objects and other :class:`~collections.abc.Mapping` objects are order-insensitive like regular dictionaries. This allows :class:`OrderedDict` objects to be substituted @@ -1180,7 +1189,7 @@ anywhere a regular dictionary is used. method. .. versionchanged:: 3.9 - Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. + Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. :class:`OrderedDict` Examples and Recipes @@ -1224,7 +1233,7 @@ variants of :func:`functools.lru_cache`: result = self.func(*args) self.cache[args] = time(), result if len(self.cache) > self.maxsize: - self.cache.popitem(0) + self.cache.popitem(last=False) return result @@ -1256,12 +1265,12 @@ variants of :func:`functools.lru_cache`: if self.requests[args] <= self.cache_after: self.requests.move_to_end(args) if len(self.requests) > self.maxrequests: - self.requests.popitem(0) + self.requests.popitem(last=False) else: self.requests.pop(args, None) self.cache[args] = result if len(self.cache) > self.maxsize: - self.cache.popitem(0) + self.cache.popitem(last=False) return result .. doctest:: diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst index b672a05b..ffebf4e4 100644 --- a/Doc/library/colorsys.rst +++ b/Doc/library/colorsys.rst @@ -1,5 +1,5 @@ -:mod:`colorsys` --- Conversions between color systems -===================================================== +:mod:`!colorsys` --- Conversions between color systems +====================================================== .. module:: colorsys :synopsis: Conversion functions between RGB and other color systems. @@ -14,7 +14,7 @@ The :mod:`colorsys` module defines bidirectional conversions of color values between colors expressed in the RGB (Red Green Blue) color space used in computer monitors and three other coordinate systems: YIQ, HLS (Hue Lightness Saturation) and HSV (Hue Saturation Value). Coordinates in all of these color -spaces are floating point values. In the YIQ space, the Y coordinate is between +spaces are floating-point values. In the YIQ space, the Y coordinate is between 0 and 1, but the I and Q coordinates can be positive or negative. In all other spaces, the coordinates are all between 0 and 1. diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 75b97d6f..c4228841 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -1,5 +1,5 @@ -:mod:`compileall` --- Byte-compile Python libraries -=================================================== +:mod:`!compileall` --- Byte-compile Python libraries +==================================================== .. module:: compileall :synopsis: Tools for byte-compiling all Python source files in a directory tree. @@ -16,6 +16,8 @@ have write permission to the library directories. .. include:: ../includes/wasm-notavail.rst +.. _compileall-cli: + Command-line use ---------------- @@ -24,28 +26,28 @@ compile Python sources. .. program:: compileall -.. cmdoption:: directory ... - file ... +.. option:: directory ... + file ... Positional arguments are files to compile or directories that contain source files, traversed recursively. If no argument is given, behave as if the command line was :samp:`-l {}`. -.. cmdoption:: -l +.. option:: -l Do not recurse into subdirectories, only compile source code files directly contained in the named or implied directories. -.. cmdoption:: -f +.. option:: -f Force rebuild even if timestamps are up-to-date. -.. cmdoption:: -q +.. option:: -q Do not print the list of files compiled. If passed once, error messages will still be printed. If passed twice (``-qq``), all output is suppressed. -.. cmdoption:: -d destdir +.. option:: -d destdir Directory prepended to the path to each file being compiled. This will appear in compilation time tracebacks, and is also compiled in to the @@ -53,45 +55,45 @@ compile Python sources. cases where the source file does not exist at the time the byte-code file is executed. -.. cmdoption:: -s strip_prefix -.. cmdoption:: -p prepend_prefix +.. option:: -s strip_prefix +.. option:: -p prepend_prefix Remove (``-s``) or append (``-p``) the given prefix of paths recorded in the ``.pyc`` files. Cannot be combined with ``-d``. -.. cmdoption:: -x regex +.. option:: -x regex regex is used to search the full path to each file considered for compilation, and if the regex produces a match, the file is skipped. -.. cmdoption:: -i list +.. option:: -i list Read the file ``list`` and add each line that it contains to the list of files and directories to compile. If ``list`` is ``-``, read lines from ``stdin``. -.. cmdoption:: -b +.. option:: -b Write the byte-code files to their legacy locations and names, which may overwrite byte-code files created by another version of Python. The default is to write files to their :pep:`3147` locations and names, which allows byte-code files from multiple versions of Python to coexist. -.. cmdoption:: -r +.. option:: -r Control the maximum recursion level for subdirectories. If this is given, then ``-l`` option will not be taken into account. :program:`python -m compileall -r 0` is equivalent to :program:`python -m compileall -l`. -.. cmdoption:: -j N +.. option:: -j N Use *N* workers to compile the files within the given directory. - If ``0`` is used, then the result of :func:`os.cpu_count()` + If ``0`` is used, then the result of :func:`os.process_cpu_count` will be used. -.. cmdoption:: --invalidation-mode [timestamp|checked-hash|unchecked-hash] +.. option:: --invalidation-mode [timestamp|checked-hash|unchecked-hash] Control how the generated byte-code files are invalidated at runtime. The ``timestamp`` value, means that ``.pyc`` files with the source timestamp @@ -104,17 +106,17 @@ compile Python sources. variable is not set, and ``checked-hash`` if the ``SOURCE_DATE_EPOCH`` environment variable is set. -.. cmdoption:: -o level +.. option:: -o level Compile with the given optimization level. May be used multiple times to compile for multiple levels at a time (for example, ``compileall -o 1 -o 2``). -.. cmdoption:: -e dir +.. option:: -e dir Ignore symlinks pointing outside the given directory. -.. cmdoption:: --hardlink-dupes +.. option:: --hardlink-dupes If two ``.pyc`` files with different optimization level have the same content, use hard links to consolidate duplicate files. @@ -224,7 +226,7 @@ Public functions The *invalidation_mode* parameter was added. .. versionchanged:: 3.7.2 - The *invalidation_mode* parameter's default value is updated to None. + The *invalidation_mode* parameter's default value is updated to ``None``. .. versionchanged:: 3.8 Setting *workers* to 0 now chooses the optimal number of cores. @@ -287,7 +289,7 @@ Public functions The *invalidation_mode* parameter was added. .. versionchanged:: 3.7.2 - The *invalidation_mode* parameter's default value is updated to None. + The *invalidation_mode* parameter's default value is updated to ``None``. .. versionchanged:: 3.9 Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. @@ -316,7 +318,7 @@ Public functions The *invalidation_mode* parameter was added. .. versionchanged:: 3.7.2 - The *invalidation_mode* parameter's default value is updated to None. + The *invalidation_mode* parameter's default value is updated to ``None``. To force a recompile of all the :file:`.py` files in the :file:`Lib/` subdirectory and all its subdirectories:: diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 6503d1fc..4e7db8fc 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -1,5 +1,5 @@ -:mod:`concurrent.futures` --- Launching parallel tasks -====================================================== +:mod:`!concurrent.futures` --- Launching parallel tasks +======================================================= .. module:: concurrent.futures :synopsis: Execute computations concurrently using threads or processes. @@ -29,83 +29,83 @@ Executor Objects An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses. - .. method:: submit(fn, /, *args, **kwargs) + .. method:: submit(fn, /, *args, **kwargs) - Schedules the callable, *fn*, to be executed as ``fn(*args, **kwargs)`` - and returns a :class:`Future` object representing the execution of the - callable. :: + Schedules the callable, *fn*, to be executed as ``fn(*args, **kwargs)`` + and returns a :class:`Future` object representing the execution of the + callable. :: - with ThreadPoolExecutor(max_workers=1) as executor: - future = executor.submit(pow, 323, 1235) - print(future.result()) + with ThreadPoolExecutor(max_workers=1) as executor: + future = executor.submit(pow, 323, 1235) + print(future.result()) - .. method:: map(func, *iterables, timeout=None, chunksize=1) + .. method:: map(fn, *iterables, timeout=None, chunksize=1) - Similar to :func:`map(func, *iterables) ` except: + Similar to :func:`map(fn, *iterables) ` except: - * the *iterables* are collected immediately rather than lazily; + * the *iterables* are collected immediately rather than lazily; - * *func* is executed asynchronously and several calls to - *func* may be made concurrently. + * *fn* is executed asynchronously and several calls to + *fn* may be made concurrently. - The returned iterator raises a :exc:`TimeoutError` - if :meth:`~iterator.__next__` is called and the result isn't available - after *timeout* seconds from the original call to :meth:`Executor.map`. - *timeout* can be an int or a float. If *timeout* is not specified or - ``None``, there is no limit to the wait time. + The returned iterator raises a :exc:`TimeoutError` + if :meth:`~iterator.__next__` is called and the result isn't available + after *timeout* seconds from the original call to :meth:`Executor.map`. + *timeout* can be an int or a float. If *timeout* is not specified or + ``None``, there is no limit to the wait time. - If a *func* call raises an exception, then that exception will be - raised when its value is retrieved from the iterator. + If a *fn* call raises an exception, then that exception will be + raised when its value is retrieved from the iterator. - When using :class:`ProcessPoolExecutor`, this method chops *iterables* - into a number of chunks which it submits to the pool as separate - tasks. The (approximate) size of these chunks can be specified by - setting *chunksize* to a positive integer. For very long iterables, - using a large value for *chunksize* can significantly improve - performance compared to the default size of 1. With - :class:`ThreadPoolExecutor`, *chunksize* has no effect. + When using :class:`ProcessPoolExecutor`, this method chops *iterables* + into a number of chunks which it submits to the pool as separate + tasks. The (approximate) size of these chunks can be specified by + setting *chunksize* to a positive integer. For very long iterables, + using a large value for *chunksize* can significantly improve + performance compared to the default size of 1. With + :class:`ThreadPoolExecutor`, *chunksize* has no effect. - .. versionchanged:: 3.5 - Added the *chunksize* argument. + .. versionchanged:: 3.5 + Added the *chunksize* argument. - .. method:: shutdown(wait=True, *, cancel_futures=False) + .. method:: shutdown(wait=True, *, cancel_futures=False) - Signal the executor that it should free any resources that it is using - when the currently pending futures are done executing. Calls to - :meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will - raise :exc:`RuntimeError`. + Signal the executor that it should free any resources that it is using + when the currently pending futures are done executing. Calls to + :meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will + raise :exc:`RuntimeError`. - If *wait* is ``True`` then this method will not return until all the - pending futures are done executing and the resources associated with the - executor have been freed. If *wait* is ``False`` then this method will - return immediately and the resources associated with the executor will be - freed when all pending futures are done executing. Regardless of the - value of *wait*, the entire Python program will not exit until all - pending futures are done executing. + If *wait* is ``True`` then this method will not return until all the + pending futures are done executing and the resources associated with the + executor have been freed. If *wait* is ``False`` then this method will + return immediately and the resources associated with the executor will be + freed when all pending futures are done executing. Regardless of the + value of *wait*, the entire Python program will not exit until all + pending futures are done executing. - If *cancel_futures* is ``True``, this method will cancel all pending - futures that the executor has not started running. Any futures that - are completed or running won't be cancelled, regardless of the value - of *cancel_futures*. + If *cancel_futures* is ``True``, this method will cancel all pending + futures that the executor has not started running. Any futures that + are completed or running won't be cancelled, regardless of the value + of *cancel_futures*. - If both *cancel_futures* and *wait* are ``True``, all futures that the - executor has started running will be completed prior to this method - returning. The remaining futures are cancelled. + If both *cancel_futures* and *wait* are ``True``, all futures that the + executor has started running will be completed prior to this method + returning. The remaining futures are cancelled. - You can avoid having to call this method explicitly if you use the - :keyword:`with` statement, which will shutdown the :class:`Executor` - (waiting as if :meth:`Executor.shutdown` were called with *wait* set to - ``True``):: + You can avoid having to call this method explicitly if you use the + :keyword:`with` statement, which will shutdown the :class:`Executor` + (waiting as if :meth:`Executor.shutdown` were called with *wait* set to + ``True``):: - import shutil - with ThreadPoolExecutor(max_workers=4) as e: - e.submit(shutil.copy, 'src1.txt', 'dest1.txt') - e.submit(shutil.copy, 'src2.txt', 'dest2.txt') - e.submit(shutil.copy, 'src3.txt', 'dest3.txt') - e.submit(shutil.copy, 'src4.txt', 'dest4.txt') + import shutil + with ThreadPoolExecutor(max_workers=4) as e: + e.submit(shutil.copy, 'src1.txt', 'dest1.txt') + e.submit(shutil.copy, 'src2.txt', 'dest2.txt') + e.submit(shutil.copy, 'src3.txt', 'dest3.txt') + e.submit(shutil.copy, 'src4.txt', 'dest4.txt') - .. versionchanged:: 3.9 - Added *cancel_futures*. + .. versionchanged:: 3.9 + Added *cancel_futures*. ThreadPoolExecutor @@ -171,8 +171,8 @@ And:: should be higher than the number of workers for :class:`ProcessPoolExecutor`. - .. versionadded:: 3.6 - The *thread_name_prefix* argument was added to allow users to + .. versionchanged:: 3.6 + Added the *thread_name_prefix* parameter to allow users to control the :class:`threading.Thread` names for worker threads created by the pool for easier debugging. @@ -188,6 +188,10 @@ And:: ThreadPoolExecutor now reuses idle worker threads before starting *max_workers* worker threads too. + .. versionchanged:: 3.13 + Default value of *max_workers* is changed to + ``min(32, (os.process_cpu_count() or 1) + 4)``. + .. _threadpoolexecutor-example: @@ -202,7 +206,7 @@ ThreadPoolExecutor Example 'http://www.cnn.com/', 'http://europe.wsj.com/', 'http://www.bbc.co.uk/', - 'http://nonexistant-subdomain.python.org/'] + 'http://nonexistent-subdomain.python.org/'] # Retrieve a single page and report the URL and contents def load_url(url, timeout): @@ -243,7 +247,7 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. An :class:`Executor` subclass that executes calls asynchronously using a pool of at most *max_workers* processes. If *max_workers* is ``None`` or not - given, it will default to the number of processors on the machine. + given, it will default to :func:`os.process_cpu_count`. If *max_workers* is less than or equal to ``0``, then a :exc:`ValueError` will be raised. On Windows, *max_workers* must be less than or equal to ``61``. If it is not @@ -271,7 +275,8 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. .. versionchanged:: 3.3 When one of the worker processes terminates abruptly, a - :exc:`BrokenProcessPool` error is now raised. Previously, behaviour + :exc:`~concurrent.futures.process.BrokenProcessPool` error is now raised. + Previously, behaviour was undefined but operations on the executor or its futures would often freeze or deadlock. @@ -301,6 +306,10 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. different start method. See the :func:`os.fork` documentation for further explanation. + .. versionchanged:: 3.13 + *max_workers* uses :func:`os.process_cpu_count` by default, instead of + :func:`os.cpu_count`. + .. _processpoolexecutor-example: ProcessPoolExecutor Example @@ -353,117 +362,117 @@ The :class:`Future` class encapsulates the asynchronous execution of a callable. instances are created by :meth:`Executor.submit` and should not be created directly except for testing. - .. method:: cancel() + .. method:: cancel() - Attempt to cancel the call. If the call is currently being executed or - finished running and cannot be cancelled then the method will return - ``False``, otherwise the call will be cancelled and the method will - return ``True``. + Attempt to cancel the call. If the call is currently being executed or + finished running and cannot be cancelled then the method will return + ``False``, otherwise the call will be cancelled and the method will + return ``True``. - .. method:: cancelled() + .. method:: cancelled() - Return ``True`` if the call was successfully cancelled. + Return ``True`` if the call was successfully cancelled. - .. method:: running() + .. method:: running() - Return ``True`` if the call is currently being executed and cannot be - cancelled. + Return ``True`` if the call is currently being executed and cannot be + cancelled. - .. method:: done() + .. method:: done() - Return ``True`` if the call was successfully cancelled or finished - running. + Return ``True`` if the call was successfully cancelled or finished + running. - .. method:: result(timeout=None) + .. method:: result(timeout=None) - Return the value returned by the call. If the call hasn't yet completed - then this method will wait up to *timeout* seconds. If the call hasn't - completed in *timeout* seconds, then a - :exc:`TimeoutError` will be raised. *timeout* can be - an int or float. If *timeout* is not specified or ``None``, there is no - limit to the wait time. + Return the value returned by the call. If the call hasn't yet completed + then this method will wait up to *timeout* seconds. If the call hasn't + completed in *timeout* seconds, then a + :exc:`TimeoutError` will be raised. *timeout* can be + an int or float. If *timeout* is not specified or ``None``, there is no + limit to the wait time. - If the future is cancelled before completing then :exc:`.CancelledError` - will be raised. + If the future is cancelled before completing then :exc:`.CancelledError` + will be raised. - If the call raised an exception, this method will raise the same exception. + If the call raised an exception, this method will raise the same exception. - .. method:: exception(timeout=None) + .. method:: exception(timeout=None) - Return the exception raised by the call. If the call hasn't yet - completed then this method will wait up to *timeout* seconds. If the - call hasn't completed in *timeout* seconds, then a - :exc:`TimeoutError` will be raised. *timeout* can be - an int or float. If *timeout* is not specified or ``None``, there is no - limit to the wait time. + Return the exception raised by the call. If the call hasn't yet + completed then this method will wait up to *timeout* seconds. If the + call hasn't completed in *timeout* seconds, then a + :exc:`TimeoutError` will be raised. *timeout* can be + an int or float. If *timeout* is not specified or ``None``, there is no + limit to the wait time. - If the future is cancelled before completing then :exc:`.CancelledError` - will be raised. + If the future is cancelled before completing then :exc:`.CancelledError` + will be raised. - If the call completed without raising, ``None`` is returned. + If the call completed without raising, ``None`` is returned. - .. method:: add_done_callback(fn) + .. method:: add_done_callback(fn) - Attaches the callable *fn* to the future. *fn* will be called, with the - future as its only argument, when the future is cancelled or finishes - running. + Attaches the callable *fn* to the future. *fn* will be called, with the + future as its only argument, when the future is cancelled or finishes + running. - Added callables are called in the order that they were added and are - always called in a thread belonging to the process that added them. If - the callable raises an :exc:`Exception` subclass, it will be logged and - ignored. If the callable raises a :exc:`BaseException` subclass, the - behavior is undefined. + Added callables are called in the order that they were added and are + always called in a thread belonging to the process that added them. If + the callable raises an :exc:`Exception` subclass, it will be logged and + ignored. If the callable raises a :exc:`BaseException` subclass, the + behavior is undefined. - If the future has already completed or been cancelled, *fn* will be - called immediately. + If the future has already completed or been cancelled, *fn* will be + called immediately. The following :class:`Future` methods are meant for use in unit tests and :class:`Executor` implementations. - .. method:: set_running_or_notify_cancel() + .. method:: set_running_or_notify_cancel() - This method should only be called by :class:`Executor` implementations - before executing the work associated with the :class:`Future` and by unit - tests. + This method should only be called by :class:`Executor` implementations + before executing the work associated with the :class:`Future` and by unit + tests. - If the method returns ``False`` then the :class:`Future` was cancelled, - i.e. :meth:`Future.cancel` was called and returned ``True``. Any threads - waiting on the :class:`Future` completing (i.e. through - :func:`as_completed` or :func:`wait`) will be woken up. + If the method returns ``False`` then the :class:`Future` was cancelled, + i.e. :meth:`Future.cancel` was called and returned ``True``. Any threads + waiting on the :class:`Future` completing (i.e. through + :func:`as_completed` or :func:`wait`) will be woken up. - If the method returns ``True`` then the :class:`Future` was not cancelled - and has been put in the running state, i.e. calls to - :meth:`Future.running` will return ``True``. + If the method returns ``True`` then the :class:`Future` was not cancelled + and has been put in the running state, i.e. calls to + :meth:`Future.running` will return ``True``. - This method can only be called once and cannot be called after - :meth:`Future.set_result` or :meth:`Future.set_exception` have been - called. + This method can only be called once and cannot be called after + :meth:`Future.set_result` or :meth:`Future.set_exception` have been + called. - .. method:: set_result(result) + .. method:: set_result(result) - Sets the result of the work associated with the :class:`Future` to - *result*. + Sets the result of the work associated with the :class:`Future` to + *result*. - This method should only be used by :class:`Executor` implementations and - unit tests. + This method should only be used by :class:`Executor` implementations and + unit tests. - .. versionchanged:: 3.8 - This method raises - :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is - already done. + .. versionchanged:: 3.8 + This method raises + :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is + already done. - .. method:: set_exception(exception) + .. method:: set_exception(exception) - Sets the result of the work associated with the :class:`Future` to the - :class:`Exception` *exception*. + Sets the result of the work associated with the :class:`Future` to the + :class:`Exception` *exception*. - This method should only be used by :class:`Executor` implementations and - unit tests. + This method should only be used by :class:`Executor` implementations and + unit tests. - .. versionchanged:: 3.8 - This method raises - :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is - already done. + .. versionchanged:: 3.8 + This method raises + :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is + already done. Module Functions ---------------- @@ -485,23 +494,22 @@ Module Functions *return_when* indicates when this function should return. It must be one of the following constants: - .. tabularcolumns:: |l|L| - - +-----------------------------+----------------------------------------+ - | Constant | Description | - +=============================+========================================+ - | :const:`FIRST_COMPLETED` | The function will return when any | - | | future finishes or is cancelled. | - +-----------------------------+----------------------------------------+ - | :const:`FIRST_EXCEPTION` | The function will return when any | - | | future finishes by raising an | - | | exception. If no future raises an | - | | exception then it is equivalent to | - | | :const:`ALL_COMPLETED`. | - +-----------------------------+----------------------------------------+ - | :const:`ALL_COMPLETED` | The function will return when all | - | | futures finish or are cancelled. | - +-----------------------------+----------------------------------------+ + .. list-table:: + :header-rows: 1 + + * - Constant + - Description + + * - .. data:: FIRST_COMPLETED + - The function will return when any future finishes or is cancelled. + + * - .. data:: FIRST_EXCEPTION + - The function will return when any future finishes by raising an + exception. If no future raises an exception + then it is equivalent to :const:`ALL_COMPLETED`. + + * - .. data:: ALL_COMPLETED + - The function will return when all futures finish or are cancelled. .. function:: as_completed(fs, timeout=None) @@ -562,7 +570,8 @@ Exception classes .. exception:: BrokenThreadPool Derived from :exc:`~concurrent.futures.BrokenExecutor`, this exception - class is raised when one of the workers of a :class:`ThreadPoolExecutor` + class is raised when one of the workers + of a :class:`~concurrent.futures.ThreadPoolExecutor` has failed initializing. .. versionadded:: 3.7 @@ -573,7 +582,8 @@ Exception classes Derived from :exc:`~concurrent.futures.BrokenExecutor` (formerly :exc:`RuntimeError`), this exception class is raised when one of the - workers of a :class:`ProcessPoolExecutor` has terminated in a non-clean + workers of a :class:`~concurrent.futures.ProcessPoolExecutor` + has terminated in a non-clean fashion (for example, if it was killed from the outside). .. versionadded:: 3.3 diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index bb282428..47477bc0 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -1,5 +1,5 @@ -:mod:`configparser` --- Configuration file parser -================================================= +:mod:`!configparser` --- Configuration file parser +================================================== .. module:: configparser :synopsis: Configuration file parser. @@ -54,6 +54,7 @@ can be customized by end users easily. import os os.remove("example.ini") + os.remove("override.ini") Quick Start @@ -147,23 +148,28 @@ case-insensitive and stored in lowercase [1]_. It is possible to read several configurations into a single :class:`ConfigParser`, where the most recently added configuration has the highest priority. Any conflicting keys are taken from the more recent -configuration while the previously existing keys are retained. +configuration while the previously existing keys are retained. The example +below reads in an ``override.ini`` file, which will override any conflicting +keys from the ``example.ini`` file. + +.. code-block:: ini + + [DEFAULT] + ServerAliveInterval = -1 .. doctest:: - >>> another_config = configparser.ConfigParser() - >>> another_config.read('example.ini') - ['example.ini'] - >>> another_config['topsecret.server.example']['Port'] - '50022' - >>> another_config.read_string("[topsecret.server.example]\nPort=48484") - >>> another_config['topsecret.server.example']['Port'] - '48484' - >>> another_config.read_dict({"topsecret.server.example": {"Port": 21212}}) - >>> another_config['topsecret.server.example']['Port'] - '21212' - >>> another_config['topsecret.server.example']['ForwardX11'] - 'no' + >>> config_override = configparser.ConfigParser() + >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} + >>> with open('override.ini', 'w') as configfile: + ... config_override.write(configfile) + ... + >>> config_override = configparser.ConfigParser() + >>> config_override.read(['example.ini', 'override.ini']) + ['example.ini', 'override.ini'] + >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) + -1 + This behaviour is equivalent to a :meth:`ConfigParser.read` call with several files passed to the *filenames* parameter. @@ -208,7 +214,7 @@ converters and customize the provided ones. [1]_ Fallback Values --------------- -As with a dictionary, you can use a section's :meth:`get` method to +As with a dictionary, you can use a section's :meth:`~ConfigParser.get` method to provide fallback values: .. doctest:: @@ -232,7 +238,7 @@ even if we specify a fallback: >>> topsecret.get('CompressionLevel', '3') '9' -One more thing to be aware of is that the parser-level :meth:`get` method +One more thing to be aware of is that the parser-level :meth:`~ConfigParser.get` method provides a custom, more complex interface, maintained for backwards compatibility. When using this method, a fallback value can be provided via the ``fallback`` keyword-only argument: @@ -271,9 +277,14 @@ out. Values can also span multiple lines, as long as they are indented deeper than the first line of the value. Depending on the parser's mode, blank lines may be treated as parts of multiline values or ignored. -By default, a valid section name can be any string that does not contain '\\n' or ']'. +By default, a valid section name can be any string that does not contain '\\n'. To change this, see :attr:`ConfigParser.SECTCRE`. +The first section name may be omitted if the parser is configured to allow an +unnamed top level section with ``allow_unnamed_section=True``. In this case, +the keys/values may be retrieved by :const:`UNNAMED_SECTION` as in +``config[UNNAMED_SECTION]``. + Configuration files may include comments, prefixed by specific characters (``#`` and ``;`` by default [1]_). Comments may appear on their own on an otherwise empty line, possibly indented. [1]_ @@ -325,6 +336,27 @@ For example: # Did I mention we can indent comments, too? +.. _unnamed-sections: + +Unnamed Sections +---------------- + +The name of the first section (or unique) may be omitted and values +retrieved by the :const:`UNNAMED_SECTION` attribute. + +.. doctest:: + + >>> config = """ + ... option = value + ... + ... [ Section 2 ] + ... another = val + ... """ + >>> unnamed = configparser.ConfigParser(allow_unnamed_section=True) + >>> unnamed.read_string(config) + >>> unnamed.get(configparser.UNNAMED_SECTION, 'option') + 'value' + Interpolation of values ----------------------- @@ -481,7 +513,7 @@ historical background and it's very likely that you will want to customize some of the features. The most common way to change the way a specific config parser works is to use -the :meth:`__init__` options: +the :meth:`!__init__` options: * *defaults*, default value: ``None`` @@ -491,7 +523,7 @@ the :meth:`__init__` options: the documented default. Hint: if you want to specify default values for a specific section, use - :meth:`read_dict` before you read the actual file. + :meth:`~ConfigParser.read_dict` before you read the actual file. * *dict_type*, default value: :class:`dict` @@ -635,8 +667,8 @@ the :meth:`__init__` options: * *strict*, default value: ``True`` When set to ``True``, the parser will not allow for any section or option - duplicates while reading from a single source (using :meth:`read_file`, - :meth:`read_string` or :meth:`read_dict`). It is recommended to use strict + duplicates while reading from a single source (using :meth:`~ConfigParser.read_file`, + :meth:`~ConfigParser.read_string` or :meth:`~ConfigParser.read_dict`). It is recommended to use strict parsers in new applications. .. versionchanged:: 3.2 @@ -697,7 +729,7 @@ the :meth:`__init__` options: desirable, users may define them in a subclass or pass a dictionary where each key is a name of the converter and each value is a callable implementing said conversion. For instance, passing ``{'decimal': decimal.Decimal}`` would add - :meth:`getdecimal` on both the parser object and all section proxies. In + :meth:`!getdecimal` on both the parser object and all section proxies. In other words, it will be possible to write both ``parser_instance.getdecimal('section', 'key', fallback=0)`` and ``parser_instance['section'].getdecimal('key', 0)``. @@ -910,7 +942,13 @@ interpolation if an option used is not defined elsewhere. :: ConfigParser Objects -------------------- -.. class:: ConfigParser(defaults=None, dict_type=dict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={}) +.. class:: ConfigParser(defaults=None, dict_type=dict, allow_no_value=False, *, \ + delimiters=('=', ':'), comment_prefixes=('#', ';'), \ + inline_comment_prefixes=None, strict=True, \ + empty_lines_in_values=True, \ + default_section=configparser.DEFAULTSECT, \ + interpolation=BasicInterpolation(), converters={}, \ + allow_unnamed_section=False) The main configuration parser. When *defaults* is given, it is initialized into the dictionary of intrinsic defaults. When *dict_type* is given, it @@ -955,9 +993,38 @@ ConfigParser Objects When *converters* is given, it should be a dictionary where each key represents the name of a type converter and each value is a callable implementing the conversion from string to the desired datatype. Every - converter gets its own corresponding :meth:`get*()` method on the parser + converter gets its own corresponding :meth:`!get*` method on the parser object and section proxies. + When *allow_unnamed_section* is ``True`` (default: ``False``), + the first section name can be omitted. See the + `"Unnamed Sections" section <#unnamed-sections>`_. + + It is possible to read several configurations into a single + :class:`ConfigParser`, where the most recently added configuration has the + highest priority. Any conflicting keys are taken from the more recent + configuration while the previously existing keys are retained. The example + below reads in an ``override.ini`` file, which will override any conflicting + keys from the ``example.ini`` file. + + .. code-block:: ini + + [DEFAULT] + ServerAliveInterval = -1 + + .. doctest:: + + >>> config_override = configparser.ConfigParser() + >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} + >>> with open('override.ini', 'w') as configfile: + ... config_override.write(configfile) + ... + >>> config_override = configparser.ConfigParser() + >>> config_override.read(['example.ini', 'override.ini']) + ['example.ini', 'override.ini'] + >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) + -1 + .. versionchanged:: 3.1 The default *dict_type* is :class:`collections.OrderedDict`. @@ -970,7 +1037,7 @@ ConfigParser Objects The *converters* argument was added. .. versionchanged:: 3.7 - The *defaults* argument is read with :meth:`read_dict()`, + The *defaults* argument is read with :meth:`read_dict`, providing consistent behavior across the parser: non-string keys and values are implicitly converted to strings. @@ -978,6 +1045,13 @@ ConfigParser Objects The default *dict_type* is :class:`dict`, since it now preserves insertion order. + .. versionchanged:: 3.13 + Raise a :exc:`MultilineContinuationError` when *allow_no_value* is + ``True``, and a key without a value is continued with an indented line. + + .. versionchanged:: 3.13 + The *allow_unnamed_section* argument was added. + .. method:: defaults() Return a dictionary containing the instance-wide defaults. @@ -1045,14 +1119,14 @@ ConfigParser Objects config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')], encoding='cp1250') - .. versionadded:: 3.2 - The *encoding* parameter. Previously, all files were read using the - default encoding for :func:`open`. + .. versionchanged:: 3.2 + Added the *encoding* parameter. + Previously, all files were read using the default encoding for :func:`open`. - .. versionadded:: 3.6.1 + .. versionchanged:: 3.6.1 The *filenames* parameter accepts a :term:`path-like object`. - .. versionadded:: 3.7 + .. versionchanged:: 3.7 The *filenames* parameter accepts a :class:`bytes` object. @@ -1062,11 +1136,11 @@ ConfigParser Objects yielding Unicode strings (for example files opened in text mode). Optional argument *source* specifies the name of the file being read. If - not given and *f* has a :attr:`name` attribute, that is used for + not given and *f* has a :attr:`!name` attribute, that is used for *source*; the default is ``''``. .. versionadded:: 3.2 - Replaces :meth:`readfp`. + Replaces :meth:`!readfp`. .. method:: read_string(string, source='') @@ -1123,7 +1197,7 @@ ConfigParser Objects .. method:: getfloat(section, option, *, raw=False, vars=None[, fallback]) A convenience method which coerces the *option* in the specified *section* - to a floating point number. See :meth:`get` for explanation of *raw*, + to a floating-point number. See :meth:`get` for explanation of *raw*, *vars* and *fallback*. @@ -1212,9 +1286,14 @@ ConfigParser Objects names is stripped before :meth:`optionxform` is called. +.. data:: UNNAMED_SECTION + + A special object representing a section name used to reference the unnamed section (see :ref:`unnamed-sections`). + + .. data:: MAX_INTERPOLATION_DEPTH - The maximum depth for recursive interpolation for :meth:`get` when the *raw* + The maximum depth for recursive interpolation for :meth:`~configparser.ConfigParser.get` when the *raw* parameter is false. This is relevant only when the default *interpolation* is used. @@ -1229,18 +1308,30 @@ RawConfigParser Objects comment_prefixes=('#', ';'), \ inline_comment_prefixes=None, strict=True, \ empty_lines_in_values=True, \ - default_section=configparser.DEFAULTSECT[, \ - interpolation]) + default_section=configparser.DEFAULTSECT, \ + interpolation=BasicInterpolation(), converters={}, \ + allow_unnamed_section=False) Legacy variant of the :class:`ConfigParser`. It has interpolation disabled by default and allows for non-string section names, option names, and values via its unsafe ``add_section`` and ``set`` methods, as well as the legacy ``defaults=`` keyword argument handling. + .. versionchanged:: 3.2 + *allow_no_value*, *delimiters*, *comment_prefixes*, *strict*, + *empty_lines_in_values*, *default_section* and *interpolation* were + added. + + .. versionchanged:: 3.5 + The *converters* argument was added. + .. versionchanged:: 3.8 The default *dict_type* is :class:`dict`, since it now preserves insertion order. + .. versionchanged:: 3.13 + The *allow_unnamed_section* argument was added. + .. note:: Consider using :class:`ConfigParser` instead which checks types of the values to be stored internally. If you don't want interpolation, you @@ -1287,13 +1378,13 @@ Exceptions .. exception:: DuplicateSectionError - Exception raised if :meth:`add_section` is called with the name of a section + Exception raised if :meth:`~ConfigParser.add_section` is called with the name of a section that is already present or in strict parsers when a section if found more than once in a single input file, string or dictionary. - .. versionadded:: 3.2 - Optional ``source`` and ``lineno`` attributes and arguments to - :meth:`__init__` were added. + .. versionchanged:: 3.2 + Added the optional *source* and *lineno* attributes and parameters to + :meth:`!__init__`. .. exception:: DuplicateOptionError @@ -1345,9 +1436,16 @@ Exceptions Exception raised when errors occur attempting to parse a file. -.. versionchanged:: 3.12 - The ``filename`` attribute and :meth:`__init__` constructor argument were - removed. They have been available using the name ``source`` since 3.2. + .. versionchanged:: 3.12 + The ``filename`` attribute and :meth:`!__init__` constructor argument were + removed. They have been available using the name ``source`` since 3.2. + +.. exception:: MultilineContinuationError + + Exception raised when a key without a corresponding value is continued with + an indented line. + + .. versionadded:: 3.13 .. rubric:: Footnotes diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index 401dc9a3..3eceecc4 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -33,27 +33,27 @@ A small number of constants live in the built-in namespace. They are: the other type; may be returned by the in-place binary special methods (e.g. :meth:`~object.__imul__`, :meth:`~object.__iand__`, etc.) for the same purpose. It should not be evaluated in a boolean context. - ``NotImplemented`` is the sole instance of the :data:`types.NotImplementedType` type. + :data:`!NotImplemented` is the sole instance of the :data:`types.NotImplementedType` type. .. note:: - When a binary (or in-place) method returns ``NotImplemented`` the + When a binary (or in-place) method returns :data:`!NotImplemented` the interpreter will try the reflected operation on the other type (or some other fallback, depending on the operator). If all attempts return - ``NotImplemented``, the interpreter will raise an appropriate exception. - Incorrectly returning ``NotImplemented`` will result in a misleading - error message or the ``NotImplemented`` value being returned to Python code. + :data:`!NotImplemented`, the interpreter will raise an appropriate exception. + Incorrectly returning :data:`!NotImplemented` will result in a misleading + error message or the :data:`!NotImplemented` value being returned to Python code. See :ref:`implementing-the-arithmetic-operations` for examples. .. note:: - ``NotImplementedError`` and ``NotImplemented`` are not interchangeable, + ``NotImplementedError`` and :data:`!NotImplemented` are not interchangeable, even though they have similar names and purposes. See :exc:`NotImplementedError` for details on when to use it. .. versionchanged:: 3.9 - Evaluating ``NotImplemented`` in a boolean context is deprecated. While + Evaluating :data:`!NotImplemented` in a boolean context is deprecated. While it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. It will raise a :exc:`TypeError` in a future version of Python. @@ -79,6 +79,8 @@ A small number of constants live in the built-in namespace. They are: :exc:`SyntaxError`), so they can be considered "true" constants. +.. _site-consts: + Constants added by the :mod:`site` module ----------------------------------------- @@ -94,6 +96,13 @@ should not be used in programs. (i.e. EOF) to exit", and when called, raise :exc:`SystemExit` with the specified exit code. +.. data:: help + :noindex: + + Object that when printed, prints the message "Type help() for interactive + help, or help(object) for help about object.", and when called, + acts as described :func:`elsewhere `. + .. data:: copyright credits diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 7cd081d1..e8f264f9 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -45,7 +45,7 @@ Functions and classes provided: This function is a :term:`decorator` that can be used to define a factory function for :keyword:`with` statement context managers, without needing to - create a class or separate :meth:`__enter__` and :meth:`__exit__` methods. + create a class or separate :meth:`~object.__enter__` and :meth:`~object.__exit__` methods. While many objects natively support use in with statements, sometimes a resource needs to be managed that isn't a context manager in its own right, @@ -106,8 +106,8 @@ Functions and classes provided: This function is a :term:`decorator` that can be used to define a factory function for :keyword:`async with` statement asynchronous context managers, - without needing to create a class or separate :meth:`__aenter__` and - :meth:`__aexit__` methods. It must be applied to an :term:`asynchronous + without needing to create a class or separate :meth:`~object.__aenter__` and + :meth:`~object.__aexit__` methods. It must be applied to an :term:`asynchronous generator` function. A simple example:: @@ -151,9 +151,9 @@ Functions and classes provided: created by :func:`asynccontextmanager` to meet the requirement that context managers support multiple invocations in order to be used as decorators. - .. versionchanged:: 3.10 - Async context managers created with :func:`asynccontextmanager` can - be used as decorators. + .. versionchanged:: 3.10 + Async context managers created with :func:`asynccontextmanager` can + be used as decorators. .. function:: closing(thing) @@ -182,6 +182,14 @@ Functions and classes provided: without needing to explicitly close ``page``. Even if an error occurs, ``page.close()`` will be called when the :keyword:`with` block is exited. + .. note:: + + Most types managing resources support the :term:`context manager` protocol, + which closes *thing* on leaving the :keyword:`with` statement. + As such, :func:`!closing` is most useful for third party types that don't + support context managers. + This example is purely for illustration purposes, + as :func:`~urllib.request.urlopen` would normally be used in a context manager. .. function:: aclosing(thing) @@ -304,15 +312,17 @@ Functions and classes provided: This context manager is :ref:`reentrant `. - If the code within the :keyword:`!with` block raises an - :exc:`ExceptionGroup`, suppressed exceptions are removed from the - group. If any exceptions in the group are not suppressed, a group containing them is re-raised. + If the code within the :keyword:`!with` block raises a + :exc:`BaseExceptionGroup`, suppressed exceptions are removed from the + group. Any exceptions of the group which are not suppressed are re-raised in + a new group which is created using the original group's :meth:`~BaseExceptionGroup.derive` + method. .. versionadded:: 3.4 .. versionchanged:: 3.12 ``suppress`` now supports suppressing exceptions raised as - part of an :exc:`ExceptionGroup`. + part of a :exc:`BaseExceptionGroup`. .. function:: redirect_stdout(new_target) @@ -515,7 +525,7 @@ Functions and classes provided: # the with statement, even if attempts to open files later # in the list raise an exception - The :meth:`__enter__` method returns the :class:`ExitStack` instance, and + The :meth:`~object.__enter__` method returns the :class:`ExitStack` instance, and performs no additional operations. Each instance maintains a stack of registered callbacks that are called in @@ -543,9 +553,9 @@ Functions and classes provided: .. method:: enter_context(cm) - Enters a new context manager and adds its :meth:`__exit__` method to + Enters a new context manager and adds its :meth:`~object.__exit__` method to the callback stack. The return value is the result of the context - manager's own :meth:`__enter__` method. + manager's own :meth:`~object.__enter__` method. These context managers may suppress exceptions just as they normally would if used directly as part of a :keyword:`with` statement. @@ -556,18 +566,18 @@ Functions and classes provided: .. method:: push(exit) - Adds a context manager's :meth:`__exit__` method to the callback stack. + Adds a context manager's :meth:`~object.__exit__` method to the callback stack. As ``__enter__`` is *not* invoked, this method can be used to cover - part of an :meth:`__enter__` implementation with a context manager's own - :meth:`__exit__` method. + part of an :meth:`~object.__enter__` implementation with a context manager's own + :meth:`~object.__exit__` method. If passed an object that is not a context manager, this method assumes it is a callback with the same signature as a context manager's - :meth:`__exit__` method and adds it directly to the callback stack. + :meth:`~object.__exit__` method and adds it directly to the callback stack. By returning true values, these callbacks can suppress exceptions the - same way context manager :meth:`__exit__` methods can. + same way context manager :meth:`~object.__exit__` methods can. The passed in object is returned from the function, allowing this method to be used as a function decorator. @@ -616,12 +626,12 @@ Functions and classes provided: asynchronous context managers, as well as having coroutines for cleanup logic. - The :meth:`close` method is not implemented, :meth:`aclose` must be used + The :meth:`~ExitStack.close` method is not implemented; :meth:`aclose` must be used instead. .. coroutinemethod:: enter_async_context(cm) - Similar to :meth:`enter_context` but expects an asynchronous context + Similar to :meth:`ExitStack.enter_context` but expects an asynchronous context manager. .. versionchanged:: 3.11 @@ -630,16 +640,16 @@ Functions and classes provided: .. method:: push_async_exit(exit) - Similar to :meth:`push` but expects either an asynchronous context manager + Similar to :meth:`ExitStack.push` but expects either an asynchronous context manager or a coroutine function. .. method:: push_async_callback(callback, /, *args, **kwds) - Similar to :meth:`callback` but expects a coroutine function. + Similar to :meth:`ExitStack.callback` but expects a coroutine function. .. coroutinemethod:: aclose() - Similar to :meth:`close` but properly handles awaitables. + Similar to :meth:`ExitStack.close` but properly handles awaitables. Continuing the example for :func:`asynccontextmanager`:: @@ -714,7 +724,7 @@ Cleaning up in an ``__enter__`` implementation As noted in the documentation of :meth:`ExitStack.push`, this method can be useful in cleaning up an already allocated resource if later -steps in the :meth:`__enter__` implementation fail. +steps in the :meth:`~object.__enter__` implementation fail. Here's an example of doing this for a context manager that accepts resource acquisition and release functions, along with an optional validation function, @@ -788,7 +798,7 @@ executing that callback:: if result: stack.pop_all() -This allows the intended cleanup up behaviour to be made explicit up front, +This allows the intended cleanup behaviour to be made explicit up front, rather than requiring a separate flag variable. If a particular application uses this pattern a lot, it can be simplified @@ -871,7 +881,7 @@ And also as a function decorator:: Note that there is one additional limitation when using context managers as function decorators: there's no way to access the return value of -:meth:`__enter__`. If that value is needed, then it is still necessary to use +:meth:`~object.__enter__`. If that value is needed, then it is still necessary to use an explicit ``with`` statement. .. seealso:: diff --git a/Doc/library/contextvars.rst b/Doc/library/contextvars.rst index 0ac2f3d8..2b1fb9fd 100644 --- a/Doc/library/contextvars.rst +++ b/Doc/library/contextvars.rst @@ -1,5 +1,5 @@ -:mod:`contextvars` --- Context Variables -======================================== +:mod:`!contextvars` --- Context Variables +========================================= .. module:: contextvars :synopsis: Context Variables @@ -15,7 +15,7 @@ function and the :class:`~contextvars.Context` class should be used to manage the current context in asynchronous frameworks. Context managers that have state should use Context Variables -instead of :func:`threading.local()` to prevent their state from +instead of :func:`threading.local` to prevent their state from bleeding to other code unexpectedly, when used in concurrent code. See also :pep:`567` for additional details. @@ -131,7 +131,7 @@ Manual Context Management ctx: Context = copy_context() print(list(ctx.items())) - The function has an O(1) complexity, i.e. works equally fast for + The function has an *O*\ (1) complexity, i.e. works equally fast for contexts with a few context variables and for contexts that have a lot of them. @@ -144,51 +144,89 @@ Manual Context Management To get a copy of the current context use the :func:`~contextvars.copy_context` function. - Every thread will have a different top-level :class:`~contextvars.Context` - object. This means that a :class:`ContextVar` object behaves in a similar - fashion to :func:`threading.local()` when values are assigned in different - threads. + Each thread has its own effective stack of :class:`!Context` objects. The + :term:`current context` is the :class:`!Context` object at the top of the + current thread's stack. All :class:`!Context` objects in the stacks are + considered to be *entered*. + + *Entering* a context, which can be done by calling its :meth:`~Context.run` + method, makes the context the current context by pushing it onto the top of + the current thread's context stack. + + *Exiting* from the current context, which can be done by returning from the + callback passed to the :meth:`~Context.run` method, restores the current + context to what it was before the context was entered by popping the context + off the top of the context stack. + + Since each thread has its own context stack, :class:`ContextVar` objects + behave in a similar fashion to :func:`threading.local` when values are + assigned in different threads. + + Attempting to enter an already entered context, including contexts entered in + other threads, raises a :exc:`RuntimeError`. + + After exiting a context, it can later be re-entered (from any thread). + + Any changes to :class:`ContextVar` values via the :meth:`ContextVar.set` + method are recorded in the current context. The :meth:`ContextVar.get` + method returns the value associated with the current context. Exiting a + context effectively reverts any changes made to context variables while the + context was entered (if needed, the values can be restored by re-entering the + context). Context implements the :class:`collections.abc.Mapping` interface. .. method:: run(callable, *args, **kwargs) - Execute ``callable(*args, **kwargs)`` code in the context object - the *run* method is called on. Return the result of the execution - or propagate an exception if one occurred. + Enters the Context, executes ``callable(*args, **kwargs)``, then exits the + Context. Returns *callable*'s return value, or propagates an exception if + one occurred. + + Example: + + .. testcode:: + + import contextvars - Any changes to any context variables that *callable* makes will - be contained in the context object:: + var = contextvars.ContextVar('var') + var.set('spam') + print(var.get()) # 'spam' - var = ContextVar('var') - var.set('spam') + ctx = contextvars.copy_context() - def main(): - # 'var' was set to 'spam' before - # calling 'copy_context()' and 'ctx.run(main)', so: - # var.get() == ctx[var] == 'spam' + def main(): + # 'var' was set to 'spam' before + # calling 'copy_context()' and 'ctx.run(main)', so: + print(var.get()) # 'spam' + print(ctx[var]) # 'spam' - var.set('ham') + var.set('ham') - # Now, after setting 'var' to 'ham': - # var.get() == ctx[var] == 'ham' + # Now, after setting 'var' to 'ham': + print(var.get()) # 'ham' + print(ctx[var]) # 'ham' - ctx = copy_context() + # Any changes that the 'main' function makes to 'var' + # will be contained in 'ctx'. + ctx.run(main) - # Any changes that the 'main' function makes to 'var' - # will be contained in 'ctx'. - ctx.run(main) + # The 'main()' function was run in the 'ctx' context, + # so changes to 'var' are contained in it: + print(ctx[var]) # 'ham' - # The 'main()' function was run in the 'ctx' context, - # so changes to 'var' are contained in it: - # ctx[var] == 'ham' + # However, outside of 'ctx', 'var' is still set to 'spam': + print(var.get()) # 'spam' - # However, outside of 'ctx', 'var' is still set to 'spam': - # var.get() == 'spam' + .. testoutput:: + :hide: - The method raises a :exc:`RuntimeError` when called on the same - context object from more than one OS thread, or when called - recursively. + spam + spam + spam + ham + ham + ham + spam .. method:: copy() @@ -254,7 +292,7 @@ client:: # without passing it explicitly to this function. client_addr = client_addr_var.get() - return f'Good bye, client @ {client_addr}\n'.encode() + return f'Good bye, client @ {client_addr}\r\n'.encode() async def handle_request(reader, writer): addr = writer.transport.get_extra_info('socket').getpeername() @@ -268,9 +306,10 @@ client:: print(line) if not line.strip(): break - writer.write(line) - writer.write(render_goodbye()) + writer.write(b'HTTP/1.1 200 OK\r\n') # status line + writer.write(b'\r\n') # headers + writer.write(render_goodbye()) # body writer.close() async def main(): @@ -282,5 +321,6 @@ client:: asyncio.run(main()) - # To test it you can use telnet: + # To test it you can use telnet or curl: # telnet 127.0.0.1 8081 + # curl 127.0.0.1:8081 diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index 8f32477e..95b41f98 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -1,5 +1,5 @@ -:mod:`copy` --- Shallow and deep copy operations -================================================ +:mod:`!copy` --- Shallow and deep copy operations +================================================= .. module:: copy :synopsis: Shallow and deep copy operations. @@ -17,14 +17,22 @@ operations (explained below). Interface summary: -.. function:: copy(x) +.. function:: copy(obj) - Return a shallow copy of *x*. + Return a shallow copy of *obj*. -.. function:: deepcopy(x[, memo]) +.. function:: deepcopy(obj[, memo]) - Return a deep copy of *x*. + Return a deep copy of *obj*. + + +.. function:: replace(obj, /, **changes) + + Creates a new object of the same type as *obj*, replacing fields with values + from *changes*. + + .. versionadded:: 3.13 .. exception:: Error @@ -79,14 +87,40 @@ pickle functions from the :mod:`copyreg` module. single: __copy__() (copy protocol) single: __deepcopy__() (copy protocol) +.. currentmodule:: None + In order for a class to define its own copy implementation, it can define -special methods :meth:`__copy__` and :meth:`__deepcopy__`. The former is called -to implement the shallow copy operation; no additional arguments are passed. -The latter is called to implement the deep copy operation; it is passed one -argument, the ``memo`` dictionary. If the :meth:`__deepcopy__` implementation needs -to make a deep copy of a component, it should call the :func:`deepcopy` function -with the component as first argument and the memo dictionary as second argument. -The memo dictionary should be treated as an opaque object. +special methods :meth:`~object.__copy__` and :meth:`~object.__deepcopy__`. + +.. method:: object.__copy__(self) + :noindexentry: + + Called to implement the shallow copy operation; + no additional arguments are passed. + +.. method:: object.__deepcopy__(self, memo) + :noindexentry: + + Called to implement the deep copy operation; it is passed one + argument, the *memo* dictionary. If the ``__deepcopy__`` implementation needs + to make a deep copy of a component, it should call the :func:`~copy.deepcopy` function + with the component as first argument and the *memo* dictionary as second argument. + The *memo* dictionary should be treated as an opaque object. + + +.. index:: + single: __replace__() (replace protocol) + +Function :func:`!copy.replace` is more limited +than :func:`~copy.copy` and :func:`~copy.deepcopy`, +and only supports named tuples created by :func:`~collections.namedtuple`, +:mod:`dataclasses`, and other classes which define method :meth:`~object.__replace__`. + +.. method:: object.__replace__(self, /, **changes) + :noindexentry: + + This method should create a new object of the same type, + replacing fields with values from *changes*. .. seealso:: diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst index 2a28c043..6e314482 100644 --- a/Doc/library/copyreg.rst +++ b/Doc/library/copyreg.rst @@ -1,5 +1,5 @@ -:mod:`copyreg` --- Register :mod:`pickle` support functions -=========================================================== +:mod:`!copyreg` --- Register :mod:`!pickle` support functions +============================================================= .. module:: copyreg :synopsis: Register pickle support functions. diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 51f91463..9ff37196 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -1,183 +1,20 @@ -:mod:`crypt` --- Function to check Unix passwords -================================================= +:mod:`!crypt` --- Function to check Unix passwords +================================================== .. module:: crypt - :platform: Unix - :synopsis: The crypt() function used to check Unix passwords. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Steven D. Majewski -.. sectionauthor:: Steven D. Majewski -.. sectionauthor:: Peter Funk - -**Source code:** :source:`Lib/crypt.py` - -.. index:: - single: crypt(3) - pair: cipher; DES - .. deprecated-removed:: 3.11 3.13 - The :mod:`crypt` module is deprecated - (see :pep:`PEP 594 <594#crypt>` for details and alternatives). - The :mod:`hashlib` module is a potential replacement for certain use cases. - The `passlib `_ package can replace all use cases of this module. - --------------- - -This module implements an interface to the :manpage:`crypt(3)` routine, which is -a one-way hash function based upon a modified DES algorithm; see the Unix man -page for further details. Possible uses include storing hashed passwords -so you can check passwords without storing the actual password, or attempting -to crack Unix passwords with a dictionary. - -.. index:: single: crypt(3) - -Notice that the behavior of this module depends on the actual implementation of -the :manpage:`crypt(3)` routine in the running system. Therefore, any -extensions available on the current implementation will also be available on -this module. - -.. availability:: Unix, not VxWorks. - -.. include:: ../includes/wasm-notavail.rst - -Hashing Methods ---------------- - -.. versionadded:: 3.3 - -The :mod:`crypt` module defines the list of hashing methods (not all methods -are available on all platforms): - -.. data:: METHOD_SHA512 - - A Modular Crypt Format method with 16 character salt and 86 character - hash based on the SHA-512 hash function. This is the strongest method. - -.. data:: METHOD_SHA256 - - Another Modular Crypt Format method with 16 character salt and 43 - character hash based on the SHA-256 hash function. - -.. data:: METHOD_BLOWFISH - - Another Modular Crypt Format method with 22 character salt and 31 - character hash based on the Blowfish cipher. - - .. versionadded:: 3.7 - -.. data:: METHOD_MD5 - - Another Modular Crypt Format method with 8 character salt and 22 - character hash based on the MD5 hash function. - -.. data:: METHOD_CRYPT - - The traditional method with a 2 character salt and 13 characters of - hash. This is the weakest method. - - -Module Attributes ------------------ - -.. versionadded:: 3.3 - -.. attribute:: methods - - A list of available password hashing algorithms, as - ``crypt.METHOD_*`` objects. This list is sorted from strongest to - weakest. - - -Module Functions ----------------- - -The :mod:`crypt` module defines the following functions: - -.. function:: crypt(word, salt=None) - - *word* will usually be a user's password as typed at a prompt or in a graphical - interface. The optional *salt* is either a string as returned from - :func:`mksalt`, one of the ``crypt.METHOD_*`` values (though not all - may be available on all platforms), or a full encrypted password - including salt, as returned by this function. If *salt* is not - provided, the strongest method available in :attr:`methods` will be used. - - Checking a password is usually done by passing the plain-text password - as *word* and the full results of a previous :func:`crypt` call, - which should be the same as the results of this call. - - *salt* (either a random 2 or 16 character string, possibly prefixed with - ``$digit$`` to indicate the method) which will be used to perturb the - encryption algorithm. The characters in *salt* must be in the set - ``[./a-zA-Z0-9]``, with the exception of Modular Crypt Format which - prefixes a ``$digit$``. - - Returns the hashed password as a string, which will be composed of - characters from the same alphabet as the salt. - - .. index:: single: crypt(3) - - Since a few :manpage:`crypt(3)` extensions allow different values, with - different sizes in the *salt*, it is recommended to use the full crypted - password as salt when checking for a password. - - .. versionchanged:: 3.3 - Accept ``crypt.METHOD_*`` values in addition to strings for *salt*. - - -.. function:: mksalt(method=None, *, rounds=None) - - Return a randomly generated salt of the specified method. If no - *method* is given, the strongest method available in :attr:`methods` is - used. - - The return value is a string suitable for passing as the *salt* argument - to :func:`crypt`. - - *rounds* specifies the number of rounds for ``METHOD_SHA256``, - ``METHOD_SHA512`` and ``METHOD_BLOWFISH``. - For ``METHOD_SHA256`` and ``METHOD_SHA512`` it must be an integer between - ``1000`` and ``999_999_999``, the default is ``5000``. For - ``METHOD_BLOWFISH`` it must be a power of two between ``16`` (2\ :sup:`4`) - and ``2_147_483_648`` (2\ :sup:`31`), the default is ``4096`` - (2\ :sup:`12`). - - .. versionadded:: 3.3 - - .. versionchanged:: 3.7 - Added the *rounds* parameter. - - -Examples --------- - -A simple example illustrating typical use (a constant-time comparison -operation is needed to limit exposure to timing attacks. -:func:`hmac.compare_digest` is suitable for this purpose):: - - import pwd - import crypt - import getpass - from hmac import compare_digest as compare_hash - - def login(): - username = input('Python login: ') - cryptedpasswd = pwd.getpwnam(username)[1] - if cryptedpasswd: - if cryptedpasswd == 'x' or cryptedpasswd == '*': - raise ValueError('no support for shadow passwords') - cleartext = getpass.getpass() - return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd) - else: - return True -To generate a hash of a password using the strongest available method and -check it against the original:: +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - import crypt - from hmac import compare_digest as compare_hash +Applications can use the :mod:`hashlib` module from the standard library. +Other possible replacements are third-party libraries from PyPI: +:pypi:`legacycrypt`, :pypi:`bcrypt`, :pypi:`argon2-cffi`, or :pypi:`passlib`. +These are not supported or maintained by the Python core team. - hashed = crypt.crypt(plaintext) - if not compare_hash(hashed, crypt.crypt(plaintext, hashed)): - raise ValueError("hashed version doesn't validate against original") +The last version of Python that provided the :mod:`!crypt` module was +`Python 3.12 `_. diff --git a/Doc/library/crypto.rst b/Doc/library/crypto.rst index ae45549a..5a3b7a80 100644 --- a/Doc/library/crypto.rst +++ b/Doc/library/crypto.rst @@ -8,7 +8,6 @@ Cryptographic Services The modules described in this chapter implement various algorithms of a cryptographic nature. They are available at the discretion of the installation. -On Unix systems, the :mod:`crypt` module may also be available. Here's an overview: diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 64baa69b..533cdf13 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -1,10 +1,10 @@ -:mod:`csv` --- CSV File Reading and Writing -=========================================== +:mod:`!csv` --- CSV File Reading and Writing +============================================ .. module:: csv :synopsis: Write and read tabular data to and from delimited files. -.. sectionauthor:: Skip Montanaro +.. sectionauthor:: Skip Montanaro **Source code:** :source:`Lib/csv.py` @@ -55,10 +55,11 @@ The :mod:`csv` module defines the following functions: .. function:: reader(csvfile, dialect='excel', **fmtparams) - Return a reader object which will iterate over lines in the given *csvfile*. - *csvfile* can be any object which supports the :term:`iterator` protocol and returns a - string each time its :meth:`!__next__` method is called --- :term:`file objects - ` and list objects are both suitable. If *csvfile* is a file object, + Return a :ref:`reader object ` that will process + lines from the given *csvfile*. A csvfile must be an iterable of + strings, each in the reader's defined csv format. + A csvfile is most commonly a file-like object or list. + If *csvfile* is a file object, it should be opened with ``newline=''``. [1]_ An optional *dialect* parameter can be given which is used to define a set of parameters specific to a particular CSV dialect. It may be an instance of a subclass of @@ -87,7 +88,7 @@ The :mod:`csv` module defines the following functions: Return a writer object responsible for converting the user's data into delimited strings on the given file-like object. *csvfile* can be any object with a - :func:`write` method. If *csvfile* is a file object, it should be opened with + :meth:`~io.TextIOBase.write` method. If *csvfile* is a file object, it should be opened with ``newline=''`` [1]_. An optional *dialect* parameter can be given which is used to define a set of parameters specific to a particular CSV dialect. It may be an instance of a subclass of the @@ -155,8 +156,10 @@ The :mod:`csv` module defines the following classes: The *fieldnames* parameter is a :term:`sequence`. If *fieldnames* is omitted, the values in the first row of file *f* will be used as the - fieldnames. Regardless of how the fieldnames are determined, the - dictionary preserves their original ordering. + fieldnames and will be omitted from the results. If + *fieldnames* is provided, they will be used and the first row will be + included in the results. Regardless of how the fieldnames are determined, + the dictionary preserves their original ordering. If a row has more fields than fieldnames, the remaining data is put in a list and stored with the fieldname specified by *restkey* (which defaults @@ -196,10 +199,10 @@ The :mod:`csv` module defines the following classes: Create an object which operates like a regular writer but maps dictionaries onto output rows. The *fieldnames* parameter is a :mod:`sequence ` of keys that identify the order in which values in the - dictionary passed to the :meth:`writerow` method are written to file + dictionary passed to the :meth:`~csvwriter.writerow` method are written to file *f*. The optional *restval* parameter specifies the value to be written if the dictionary is missing a key in *fieldnames*. If the - dictionary passed to the :meth:`writerow` method contains a key not found in + dictionary passed to the :meth:`~csvwriter.writerow` method contains a key not found in *fieldnames*, the optional *extrasaction* parameter indicates what action to take. If it is set to ``'raise'``, the default value, a :exc:`ValueError` @@ -243,7 +246,6 @@ The :mod:`csv` module defines the following classes: with open('students.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile, dialect='unix') - ^^^^^^^^^^^^^^ .. class:: excel() @@ -288,9 +290,9 @@ The :mod:`csv` module defines the following classes: Inspecting each column, one of two key criteria will be considered to estimate if the sample contains a header: - - the second through n-th rows contain numeric values - - the second through n-th rows contain strings where at least one value's - length differs from that of the putative header of that column. + - the second through n-th rows contain numeric values + - the second through n-th rows contain strings where at least one value's + length differs from that of the putative header of that column. Twenty rows after the first row are sampled; if more than half of columns + rows meet the criteria, :const:`True` is returned. @@ -309,6 +311,8 @@ An example for :class:`Sniffer` use:: # ... process CSV file contents here ... +.. _csv-constants: + The :mod:`csv` module defines the following constants: .. data:: QUOTE_ALL @@ -345,8 +349,10 @@ The :mod:`csv` module defines the following constants: ``None``. This is similar to :data:`QUOTE_ALL`, except that if a field value is ``None`` an empty (unquoted) string is written. - Instructs :class:`reader` objects to interpret an empty (unquoted) field as None and - to otherwise behave as :data:`QUOTE_ALL`. + Instructs :class:`reader` objects to interpret an empty (unquoted) field + as ``None`` and to otherwise behave as :data:`QUOTE_ALL`. + + .. versionadded:: 3.12 .. data:: QUOTE_STRINGS @@ -357,6 +363,8 @@ The :mod:`csv` module defines the following constants: Instructs :class:`reader` objects to interpret an empty (unquoted) string as ``None`` and to otherwise behave as :data:`QUOTE_NONNUMERIC`. + .. versionadded:: 3.12 + The :mod:`csv` module defines the following exception: @@ -371,8 +379,8 @@ Dialects and Formatting Parameters To make it easier to specify the format of input and output records, specific formatting parameters are grouped together into dialects. A dialect is a -subclass of the :class:`Dialect` class having a set of specific methods and a -single :meth:`validate` method. When creating :class:`reader` or +subclass of the :class:`Dialect` class containing various attributes +describing the format of the CSV file. When creating :class:`reader` or :class:`writer` objects, the programmer can specify a string or a subclass of the :class:`Dialect` class as the dialect parameter. In addition to, or instead of, the *dialect* parameter, the programmer can also specify individual @@ -432,8 +440,8 @@ Dialects support the following attributes: .. attribute:: Dialect.quoting Controls when quotes should be generated by the writer and recognised by the - reader. It can take on any of the :const:`QUOTE_\*` constants (see section - :ref:`csv-contents`) and defaults to :const:`QUOTE_MINIMAL`. + reader. It can take on any of the :ref:`QUOTE_\* constants ` + and defaults to :const:`QUOTE_MINIMAL`. .. attribute:: Dialect.skipinitialspace @@ -447,6 +455,8 @@ Dialects support the following attributes: When ``True``, raise exception :exc:`Error` on bad CSV input. The default is ``False``. +.. _reader-objects: + Reader Objects -------------- @@ -487,9 +497,9 @@ DictReader objects have the following public attribute: Writer Objects -------------- -:class:`Writer` objects (:class:`DictWriter` instances and objects returned by +:class:`writer` objects (:class:`DictWriter` instances and objects returned by the :func:`writer` function) have the following public methods. A *row* must be -an iterable of strings or numbers for :class:`Writer` objects and a dictionary +an iterable of strings or numbers for :class:`writer` objects and a dictionary mapping fieldnames to strings or numbers (by passing them through :func:`str` first) for :class:`DictWriter` objects. Note that complex numbers are written out surrounded by parens. This may cause some problems for other programs which diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 19cee107..f96cfeb5 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1,5 +1,5 @@ -:mod:`ctypes` --- A foreign function library for Python -======================================================= +:mod:`!ctypes` --- A foreign function library for Python +======================================================== .. module:: ctypes :synopsis: A foreign function library for Python. @@ -51,7 +51,7 @@ function call fails. Here are some examples for Windows. Note that ``msvcrt`` is the MS standard C -library containing most standard C functions, and uses the cdecl calling +library containing most standard C functions, and uses the ``cdecl`` calling convention:: >>> from ctypes import * @@ -93,7 +93,6 @@ Accessing functions from loaded dlls Functions are accessed as attributes of dll objects:: - >>> from ctypes import * >>> libc.printf <_FuncPtr object at 0x...> >>> print(windll.kernel32.GetModuleHandleA) # doctest: +WINDOWS @@ -108,7 +107,7 @@ Functions are accessed as attributes of dll objects:: Note that win32 system dlls like ``kernel32`` and ``user32`` often export ANSI as well as UNICODE versions of a function. The UNICODE version is exported with -an ``W`` appended to the name, while the ANSI version is exported with an ``A`` +a ``W`` appended to the name, while the ANSI version is exported with an ``A`` appended to the name. The win32 ``GetModuleHandle`` function, which returns a *module handle* for a given module name, has the following C prototype, and a macro is used to expose one of them as ``GetModuleHandle`` depending on whether @@ -200,7 +199,7 @@ calls). Python objects that can directly be used as parameters in these function calls. ``None`` is passed as a C ``NULL`` pointer, bytes objects and strings are passed as pointer to the memory block that contains their data (:c:expr:`char *` or -:c:expr:`wchar_t *`). Python integers are passed as the platforms default C +:c:expr:`wchar_t *`). Python integers are passed as the platform's default C :c:expr:`int` type, their value is masked to fit into the C type. Before we move on calling functions with other parameter types, we have to learn @@ -362,7 +361,7 @@ from within *IDLE* or *PythonWin*:: >>> printf(b"%f bottles of beer\n", 42.5) Traceback (most recent call last): File "", line 1, in - ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2 + ctypes.ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2 >>> As has been mentioned before, all Python types except integers, strings, and @@ -384,7 +383,7 @@ as calling functions with a fixed number of parameters. On some platforms, and i particular ARM64 for Apple Platforms, the calling convention for variadic functions is different than that for regular functions. -On those platforms it is required to specify the :attr:`~_FuncPtr.argtypes` +On those platforms it is required to specify the :attr:`~_CFuncPtr.argtypes` attribute for the regular, non-variadic, function arguments: .. code-block:: python3 @@ -392,7 +391,7 @@ attribute for the regular, non-variadic, function arguments: libc.printf.argtypes = [ctypes.c_char_p] Because specifying the attribute does not inhibit portability it is advised to always -specify :attr:`~_FuncPtr.argtypes` for all variadic functions. +specify :attr:`~_CFuncPtr.argtypes` for all variadic functions. .. _ctypes-calling-functions-with-own-custom-data-types: @@ -427,9 +426,9 @@ Specifying the required argument types (function prototypes) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to specify the required argument types of functions exported from -DLLs by setting the :attr:`~_FuncPtr.argtypes` attribute. +DLLs by setting the :attr:`~_CFuncPtr.argtypes` attribute. -:attr:`~_FuncPtr.argtypes` must be a sequence of C data types (the :func:`!printf` function is +:attr:`~_CFuncPtr.argtypes` must be a sequence of C data types (the :func:`!printf` function is probably not a good example here, because it takes a variable number and different types of parameters depending on the format string, on the other hand this is quite handy to experiment with this feature):: @@ -446,7 +445,7 @@ prototype for a C function), and tries to convert the arguments to valid types:: >>> printf(b"%d %d %d", 1, 2, 3) Traceback (most recent call last): File "", line 1, in - ArgumentError: argument 2: TypeError: wrong type + ctypes.ArgumentError: argument 2: TypeError: 'int' object cannot be interpreted as ctypes.c_char_p >>> printf(b"%s %d %f\n", b"X", 2, 3) X 2 3.000000 13 @@ -454,7 +453,7 @@ prototype for a C function), and tries to convert the arguments to valid types:: If you have defined your own classes which you pass to function calls, you have to implement a :meth:`~_CData.from_param` class method for them to be able to use them -in the :attr:`~_FuncPtr.argtypes` sequence. The :meth:`~_CData.from_param` class method receives +in the :attr:`~_CFuncPtr.argtypes` sequence. The :meth:`~_CData.from_param` class method receives the Python object passed to the function call, it should do a typecheck or whatever is needed to make sure this object is acceptable, and then return the object itself, its :attr:`!_as_parameter_` attribute, or whatever you want to @@ -477,7 +476,7 @@ Return types By default functions are assumed to return the C :c:expr:`int` type. Other -return types can be specified by setting the :attr:`~_FuncPtr.restype` attribute of the +return types can be specified by setting the :attr:`~_CFuncPtr.restype` attribute of the function object. The C prototype of :c:func:`time` is ``time_t time(time_t *)``. Because :c:type:`time_t` @@ -486,7 +485,7 @@ specify the :attr:`!restype` attribute:: >>> libc.time.restype = c_time_t -The argument types can be specified using :attr:`~_FuncPtr.argtypes`:: +The argument types can be specified using :attr:`~_CFuncPtr.argtypes`:: >>> libc.time.argtypes = (POINTER(c_time_t),) @@ -509,7 +508,7 @@ a string pointer and a char, and returns a pointer to a string:: >>> If you want to avoid the :func:`ord("x") ` calls above, you can set the -:attr:`~_FuncPtr.argtypes` attribute, and the second argument will be converted from a +:attr:`~_CFuncPtr.argtypes` attribute, and the second argument will be converted from a single character Python bytes object into a C char: .. doctest:: @@ -528,7 +527,7 @@ single character Python bytes object into a C char: >>> You can also use a callable Python object (a function or a class for example) as -the :attr:`~_FuncPtr.restype` attribute, if the foreign function returns an integer. The +the :attr:`~_CFuncPtr.restype` attribute, if the foreign function returns an integer. The callable will be called with the *integer* the C function returns, and the result of this call will be used as the result of your function call. This is useful to check for error return values and automatically raise an exception:: @@ -556,7 +555,7 @@ get the string representation of an error code, and *returns* an exception. :func:`GetLastError` to retrieve it. Please note that a much more powerful error checking mechanism is available -through the :attr:`~_FuncPtr.errcheck` attribute; +through the :attr:`~_CFuncPtr.errcheck` attribute; see the reference manual for details. @@ -670,6 +669,10 @@ compiler does it. It is possible to override this behavior by specifying a :attr:`~Structure._pack_` class attribute in the subclass definition. This must be set to a positive integer and specifies the maximum alignment for the fields. This is what ``#pragma pack(n)`` also does in MSVC. +It is also possible to set a minimum alignment for how the subclass itself is packed in the +same way ``#pragma align(n)`` works in MSVC. +This can be achieved by specifying a ::attr:`~Structure._align_` class attribute +in the subclass definition. :mod:`ctypes` uses the native byte order for Structures and Unions. To build structures with non-native byte order, you can use one of the @@ -856,7 +859,7 @@ Type conversions ^^^^^^^^^^^^^^^^ Usually, ctypes does strict type checking. This means, if you have -``POINTER(c_int)`` in the :attr:`~_FuncPtr.argtypes` list of a function or as the type of +``POINTER(c_int)`` in the :attr:`~_CFuncPtr.argtypes` list of a function or as the type of a member field in a structure definition, only instances of exactly the same type are accepted. There are some exceptions to this rule, where ctypes accepts other objects. For example, you can pass compatible array instances instead of @@ -877,7 +880,7 @@ pointer types. So, for ``POINTER(c_int)``, ctypes accepts an array of c_int:: >>> In addition, if a function argument is explicitly declared to be a pointer type -(such as ``POINTER(c_int)``) in :attr:`~_FuncPtr.argtypes`, an object of the pointed +(such as ``POINTER(c_int)``) in :attr:`~_CFuncPtr.argtypes`, an object of the pointed type (``c_int`` in this case) can be passed to the function. ctypes will apply the required :func:`byref` conversion in this case automatically. @@ -1113,10 +1116,6 @@ api:: >>> print(hex(version.value)) 0x30c00a0 -If the interpreter would have been started with :option:`-O`, the sample would -have printed ``c_long(1)``, or ``c_long(2)`` if :option:`-OO` would have been -specified. - An extended example which also demonstrates the use of pointers accesses the :c:data:`PyImport_FrozenModules` pointer exported by Python. @@ -1335,8 +1334,9 @@ Here are some examples:: 'libbz2.so.1.0' >>> -On macOS, :func:`~ctypes.util.find_library` tries several predefined naming schemes and paths -to locate the library, and returns a full pathname if successful:: +On macOS and Android, :func:`~ctypes.util.find_library` uses the system's +standard naming schemes and paths to locate the library, and returns a full +pathname if successful:: >>> from ctypes.util import find_library >>> find_library("c") @@ -1395,15 +1395,18 @@ way is to instantiate one of the following classes: .. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) - Windows only: Instances of this class represent loaded shared libraries, + Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are assumed to return the windows specific :class:`HRESULT` code. :class:`HRESULT` values contain information specifying whether the function call failed or succeeded, together with additional error code. If the return value signals a failure, an :class:`OSError` is automatically raised. + .. availability:: Windows + .. versionchanged:: 3.3 - :exc:`WindowsError` used to be raised. + :exc:`WindowsError` used to be raised, + which is now an alias of :exc:`OSError`. .. versionchanged:: 3.12 @@ -1412,14 +1415,17 @@ way is to instantiate one of the following classes: .. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) - Windows only: Instances of this class represent loaded shared libraries, + Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:expr:`int` by default. + .. availability:: Windows + .. versionchanged:: 3.12 The *name* parameter can now be a :term:`path-like object`. + The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1440,7 +1446,7 @@ function exported by these libraries, and reacquired afterwards. All these classes can be instantiated by calling them with at least one argument, the pathname of the shared library. If you have an existing handle to an already loaded shared library, it can be passed as the ``handle`` named -parameter, otherwise the underlying platforms :c:func:`!dlopen` or +parameter, otherwise the underlying platform's :c:func:`!dlopen` or :c:func:`!LoadLibrary` function is used to load the library into the process, and to get a handle to it. @@ -1451,7 +1457,7 @@ configurable. The *use_errno* parameter, when set to true, enables a ctypes mechanism that allows accessing the system :data:`errno` error number in a safe way. -:mod:`ctypes` maintains a thread-local copy of the systems :data:`errno` +:mod:`ctypes` maintains a thread-local copy of the system's :data:`errno` variable; if you call foreign functions created with ``use_errno=True`` then the :data:`errno` value before the function call is swapped with the ctypes private copy, the same happens immediately after the function call. @@ -1555,13 +1561,17 @@ These prefabricated library loaders are available: .. data:: windll :noindex: - Windows only: Creates :class:`WinDLL` instances. + Creates :class:`WinDLL` instances. + + .. availability:: Windows .. data:: oledll :noindex: - Windows only: Creates :class:`OleDLL` instances. + Creates :class:`OleDLL` instances. + + .. availability:: Windows .. data:: pydll @@ -1608,10 +1618,20 @@ As explained in the previous section, foreign functions can be accessed as attributes of loaded shared libraries. The function objects created in this way by default accept any number of arguments, accept any ctypes data instances as arguments, and return the default result type specified by the library loader. -They are instances of a private class: +They are instances of a private local class :class:`!_FuncPtr` (not exposed +in :mod:`!ctypes`) which inherits from the private :class:`_CFuncPtr` class: + +.. doctest:: + + >>> import ctypes + >>> lib = ctypes.CDLL(None) + >>> issubclass(lib._FuncPtr, ctypes._CFuncPtr) + True + >>> lib._FuncPtr is ctypes._CFuncPtr + False -.. class:: _FuncPtr +.. class:: _CFuncPtr Base class for C callable foreign functions. @@ -1723,11 +1743,13 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) - Windows only: The returned function prototype creates functions that use the + The returned function prototype creates functions that use the ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. + .. availability:: Windows + .. function:: PYFUNCTYPE(restype, *argtypes) @@ -1737,70 +1759,70 @@ See :ref:`ctypes-callback-functions` for examples. Function prototypes created by these factory functions can be instantiated in different ways, depending on the type and number of the parameters in the call: +.. function:: prototype(address) + :noindex: + :module: - .. function:: prototype(address) - :noindex: - :module: + Returns a foreign function at the specified address which must be an integer. - Returns a foreign function at the specified address which must be an integer. +.. function:: prototype(callable) + :noindex: + :module: - .. function:: prototype(callable) - :noindex: - :module: + Create a C callable function (a callback function) from a Python *callable*. - Create a C callable function (a callback function) from a Python *callable*. +.. function:: prototype(func_spec[, paramflags]) + :noindex: + :module: - .. function:: prototype(func_spec[, paramflags]) - :noindex: - :module: + Returns a foreign function exported by a shared library. *func_spec* must + be a 2-tuple ``(name_or_ordinal, library)``. The first item is the name of + the exported function as string, or the ordinal of the exported function + as small integer. The second item is the shared library instance. - Returns a foreign function exported by a shared library. *func_spec* must - be a 2-tuple ``(name_or_ordinal, library)``. The first item is the name of - the exported function as string, or the ordinal of the exported function - as small integer. The second item is the shared library instance. +.. function:: prototype(vtbl_index, name[, paramflags[, iid]]) + :noindex: + :module: - .. function:: prototype(vtbl_index, name[, paramflags[, iid]]) - :noindex: - :module: + Returns a foreign function that will call a COM method. *vtbl_index* is + the index into the virtual function table, a small non-negative + integer. *name* is name of the COM method. *iid* is an optional pointer to + the interface identifier which is used in extended error reporting. - Returns a foreign function that will call a COM method. *vtbl_index* is - the index into the virtual function table, a small non-negative - integer. *name* is name of the COM method. *iid* is an optional pointer to - the interface identifier which is used in extended error reporting. + COM methods use a special calling convention: They require a pointer to + the COM interface as first argument, in addition to those parameters that + are specified in the :attr:`!argtypes` tuple. - COM methods use a special calling convention: They require a pointer to - the COM interface as first argument, in addition to those parameters that - are specified in the :attr:`!argtypes` tuple. +The optional *paramflags* parameter creates foreign function wrappers with much +more functionality than the features described above. - The optional *paramflags* parameter creates foreign function wrappers with much - more functionality than the features described above. +*paramflags* must be a tuple of the same length as :attr:`~_CFuncPtr.argtypes`. - *paramflags* must be a tuple of the same length as :attr:`~_FuncPtr.argtypes`. +Each item in this tuple contains further information about a parameter, it must +be a tuple containing one, two, or three items. - Each item in this tuple contains further information about a parameter, it must - be a tuple containing one, two, or three items. +The first item is an integer containing a combination of direction +flags for the parameter: - The first item is an integer containing a combination of direction - flags for the parameter: + 1 + Specifies an input parameter to the function. - 1 - Specifies an input parameter to the function. + 2 + Output parameter. The foreign function fills in a value. - 2 - Output parameter. The foreign function fills in a value. + 4 + Input parameter which defaults to the integer zero. - 4 - Input parameter which defaults to the integer zero. +The optional second item is the parameter name as string. If this is specified, +the foreign function can be called with named parameters. - The optional second item is the parameter name as string. If this is specified, - the foreign function can be called with named parameters. +The optional third item is the default value for this parameter. - The optional third item is the default value for this parameter. -This example demonstrates how to wrap the Windows ``MessageBoxW`` function so +The following example demonstrates how to wrap the Windows ``MessageBoxW`` function so that it supports default parameters and named arguments. The C declaration from the windows header file is this:: @@ -1848,7 +1870,7 @@ value if there is a single one, or a tuple containing the output parameter values when there are more than one, so the GetWindowRect function now returns a RECT instance, when called. -Output parameters can be combined with the :attr:`~_FuncPtr.errcheck` protocol to do +Output parameters can be combined with the :attr:`~_CFuncPtr.errcheck` protocol to do further output processing and error checking. The win32 ``GetWindowRect`` api function returns a ``BOOL`` to signal success or failure, so this function could do the error checking, and raises an exception when the api call failed:: @@ -1861,7 +1883,7 @@ do the error checking, and raises an exception when the api call failed:: >>> GetWindowRect.errcheck = errcheck >>> -If the :attr:`~_FuncPtr.errcheck` function returns the argument tuple it receives +If the :attr:`~_CFuncPtr.errcheck` function returns the argument tuple it receives unchanged, :mod:`ctypes` continues the normal processing it does on the output parameters. If you want to return a tuple of window coordinates instead of a ``RECT`` instance, you can retrieve the fields in the function and return them @@ -1953,17 +1975,21 @@ Utility functions .. function:: DllCanUnloadNow() - Windows only: This function is a hook which allows implementing in-process + This function is a hook which allows implementing in-process COM servers with ctypes. It is called from the DllCanUnloadNow function that the _ctypes extension dll exports. + .. availability:: Windows + .. function:: DllGetClassObject() - Windows only: This function is a hook which allows implementing in-process + This function is a hook which allows implementing in-process COM servers with ctypes. It is called from the DllGetClassObject function that the ``_ctypes`` extension dll exports. + .. availability:: Windows + .. function:: find_library(name) :module: ctypes.util @@ -1979,7 +2005,7 @@ Utility functions .. function:: find_msvcrt() :module: ctypes.util - Windows only: return the filename of the VC runtime library used by Python, + Returns the filename of the VC runtime library used by Python, and by the extension modules. If the name of the library cannot be determined, ``None`` is returned. @@ -1987,20 +2013,27 @@ Utility functions with a call to the ``free(void *)``, it is important that you use the function in the same library that allocated the memory. + .. availability:: Windows + .. function:: FormatError([code]) - Windows only: Returns a textual description of the error code *code*. If no + Returns a textual description of the error code *code*. If no error code is specified, the last error code is used by calling the Windows api function GetLastError. + .. availability:: Windows + .. function:: GetLastError() - Windows only: Returns the last error code set by Windows in the calling thread. + Returns the last error code set by Windows in the calling thread. This function calls the Windows ``GetLastError()`` function directly, it does not return the ctypes-private copy of the error code. + .. availability:: Windows + + .. function:: get_errno() Returns the current value of the ctypes-private copy of the system @@ -2010,11 +2043,14 @@ Utility functions .. function:: get_last_error() - Windows only: returns the current value of the ctypes-private copy of the system + Returns the current value of the ctypes-private copy of the system :data:`!LastError` variable in the calling thread. + .. availability:: Windows + .. audit-event:: ctypes.get_last_error "" ctypes.get_last_error + .. function:: memmove(dst, src, count) Same as the standard C memmove library function: copies *count* bytes from @@ -2063,10 +2099,12 @@ Utility functions .. function:: set_last_error(value) - Windows only: set the current value of the ctypes-private copy of the system + Sets the current value of the ctypes-private copy of the system :data:`!LastError` variable in the calling thread to *value* and return the previous value. + .. availability:: Windows + .. audit-event:: ctypes.set_last_error error ctypes.set_last_error @@ -2076,35 +2114,38 @@ Utility functions Does the same as the C ``sizeof`` operator. -.. function:: string_at(address, size=-1) +.. function:: string_at(ptr, size=-1) - This function returns the C string starting at memory address *address* as a bytes - object. If size is specified, it is used as size, otherwise the string is assumed + Return the byte string at *void \*ptr*. + If *size* is specified, it is used as size, otherwise the string is assumed to be zero-terminated. - .. audit-event:: ctypes.string_at address,size ctypes.string_at + .. audit-event:: ctypes.string_at ptr,size ctypes.string_at .. function:: WinError(code=None, descr=None) - Windows only: this function is probably the worst-named thing in ctypes. It - creates an instance of OSError. If *code* is not specified, + This function is probably the worst-named thing in ctypes. It + creates an instance of :exc:`OSError`. If *code* is not specified, ``GetLastError`` is called to determine the error code. If *descr* is not specified, :func:`FormatError` is called to get a textual description of the error. + .. availability:: Windows + .. versionchanged:: 3.3 - An instance of :exc:`WindowsError` used to be created. + An instance of :exc:`WindowsError` used to be created, which is now an + alias of :exc:`OSError`. -.. function:: wstring_at(address, size=-1) +.. function:: wstring_at(ptr, size=-1) - This function returns the wide character string starting at memory address - *address* as a string. If *size* is specified, it is used as the number of + Return the wide-character string at *void \*ptr*. + If *size* is specified, it is used as the number of characters of the string, otherwise the string is assumed to be zero-terminated. - .. audit-event:: ctypes.wstring_at address,size ctypes.wstring_at + .. audit-event:: ctypes.wstring_at ptr,size ctypes.wstring_at .. _ctypes-data-types: @@ -2160,7 +2201,7 @@ Data types This method adapts *obj* to a ctypes type. It is called with the actual object used in a foreign function call when the type is present in the - foreign function's :attr:`~_FuncPtr.argtypes` tuple; + foreign function's :attr:`~_CFuncPtr.argtypes` tuple; it must return an object that can be used as a function call parameter. All ctypes data types have a default implementation of this classmethod @@ -2226,7 +2267,7 @@ Fundamental data types Fundamental data types, when returned as foreign function call results, or, for example, by retrieving structure field members or array items, are transparently converted to native Python types. In other words, if a foreign function has a -:attr:`~_FuncPtr.restype` of :class:`c_char_p`, you will always receive a Python bytes +:attr:`~_CFuncPtr.restype` of :class:`c_char_p`, you will always receive a Python bytes object, *not* a :class:`c_char_p` instance. .. XXX above is false, it actually returns a Unicode string @@ -2431,9 +2472,11 @@ These are the fundamental ctypes data types: .. class:: HRESULT - Windows only: Represents a :c:type:`!HRESULT` value, which contains success or + Represents a :c:type:`!HRESULT` value, which contains success or error information for a function or method call. + .. availability:: Windows + .. class:: py_object @@ -2532,6 +2575,14 @@ fields, or any other data types containing pointer type fields. Setting this attribute to 0 is the same as not setting it at all. + .. attribute:: _align_ + + An optional small integer that allows overriding the alignment of + the structure when being packed or unpacked to/from memory. + Setting this attribute to 0 is the same as not setting it at all. + + .. versionadded:: 3.13 + .. attribute:: _anonymous_ An optional sequence that lists the names of unnamed (anonymous) fields. @@ -2613,6 +2664,15 @@ Arrays and pointers Array subclass constructors accept positional arguments, used to initialize the elements in order. +.. function:: ARRAY(type, length) + + Create an array. + Equivalent to ``type * length``, where *type* is a + :mod:`ctypes` data type and *length* an integer. + + This function is :term:`soft deprecated` in favor of multiplication. + There are no plans to remove it. + .. class:: _Pointer diff --git a/Doc/library/curses.ascii.rst b/Doc/library/curses.ascii.rst index 410b76e7..cb895664 100644 --- a/Doc/library/curses.ascii.rst +++ b/Doc/library/curses.ascii.rst @@ -1,5 +1,5 @@ -:mod:`curses.ascii` --- Utilities for ASCII characters -====================================================== +:mod:`!curses.ascii` --- Utilities for ASCII characters +======================================================= .. module:: curses.ascii :synopsis: Constants and set-membership functions for ASCII characters. diff --git a/Doc/library/curses.panel.rst b/Doc/library/curses.panel.rst index d770c03c..11fd841d 100644 --- a/Doc/library/curses.panel.rst +++ b/Doc/library/curses.panel.rst @@ -1,5 +1,5 @@ -:mod:`curses.panel` --- A panel stack extension for curses -========================================================== +:mod:`!curses.panel` --- A panel stack extension for curses +=========================================================== .. module:: curses.panel :synopsis: A panel stack extension that adds depth to curses windows. diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index 9ab67c21..6c7fc721 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -1,5 +1,5 @@ -:mod:`curses` --- Terminal handling for character-cell displays -=============================================================== +:mod:`!curses` --- Terminal handling for character-cell displays +================================================================ .. module:: curses :synopsis: An interface to the curses library, providing portable @@ -21,6 +21,8 @@ for Windows, DOS, and possibly other systems as well. This extension module is designed to match the API of ncurses, an open-source curses library hosted on Linux and the BSD variants of Unix. +.. include:: ../includes/wasm-mobile-notavail.rst + .. note:: Whenever the documentation mentions a *character* it can be specified @@ -922,7 +924,7 @@ the following methods and attributes: .. method:: window.getbegyx() - Return a tuple ``(y, x)`` of co-ordinates of upper-left corner. + Return a tuple ``(y, x)`` of coordinates of upper-left corner. .. method:: window.getbkgd() @@ -1771,9 +1773,9 @@ The following table lists mouse button constants used by :meth:`getmouse`: | .. data:: BUTTON_ALT | Control was down during button state change | +----------------------------------+---------------------------------------------+ - .. versionchanged:: 3.10 - The ``BUTTON5_*`` constants are now exposed if they are provided by the - underlying curses library. +.. versionchanged:: 3.10 + The ``BUTTON5_*`` constants are now exposed if they are provided by the + underlying curses library. The following table lists the predefined colors: diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index d6874876..cfca11af 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -1,5 +1,5 @@ -:mod:`dataclasses` --- Data Classes -=================================== +:mod:`!dataclasses` --- Data Classes +==================================== .. module:: dataclasses :synopsis: Generate special methods on user-defined classes. @@ -12,7 +12,7 @@ -------------- This module provides a decorator and functions for automatically -adding generated :term:`special method`\s such as :meth:`~object.__init__` and +adding generated :term:`special methods ` such as :meth:`~object.__init__` and :meth:`~object.__repr__` to user-defined classes. It was originally described in :pep:`557`. @@ -31,7 +31,7 @@ using :pep:`526` type annotations. For example, this code:: def total_cost(self) -> float: return self.unit_price * self.quantity_on_hand -will add, among other things, a :meth:`~object.__init__` that looks like:: +will add, among other things, a :meth:`!__init__` that looks like:: def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0): self.name = name @@ -39,7 +39,7 @@ will add, among other things, a :meth:`~object.__init__` that looks like:: self.quantity_on_hand = quantity_on_hand Note that this method is automatically added to the class: it is not -directly specified in the ``InventoryItem`` definition shown above. +directly specified in the :class:`!InventoryItem` definition shown above. .. versionadded:: 3.7 @@ -49,26 +49,26 @@ Module contents .. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) This function is a :term:`decorator` that is used to add generated - :term:`special method`\s to classes, as described below. + :term:`special methods ` to classes, as described below. - The :func:`dataclass` decorator examines the class to find + The ``@dataclass`` decorator examines the class to find ``field``\s. A ``field`` is defined as a class variable that has a :term:`type annotation `. With two - exceptions described below, nothing in :func:`dataclass` + exceptions described below, nothing in ``@dataclass`` examines the type specified in the variable annotation. The order of the fields in all of the generated methods is the order in which they appear in the class definition. - The :func:`dataclass` decorator will add various "dunder" methods to + The ``@dataclass`` decorator will add various "dunder" methods to the class, described below. If any of the added methods already exist in the class, the behavior depends on the parameter, as documented below. The decorator returns the same class that it is called on; no new class is created. - If :func:`dataclass` is used just as a simple decorator with no parameters, + If ``@dataclass`` is used just as a simple decorator with no parameters, it acts as if it has the default values documented in this - signature. That is, these three uses of :func:`dataclass` are + signature. That is, these three uses of ``@dataclass`` are equivalent:: @dataclass @@ -84,124 +84,139 @@ Module contents class C: ... - The parameters to :func:`dataclass` are: + The parameters to ``@dataclass`` are: - - ``init``: If true (the default), a :meth:`~object.__init__` method will be + - *init*: If true (the default), a :meth:`~object.__init__` method will be generated. - If the class already defines :meth:`~object.__init__`, this parameter is + If the class already defines :meth:`!__init__`, this parameter is ignored. - - ``repr``: If true (the default), a :meth:`~object.__repr__` method will be + - *repr*: If true (the default), a :meth:`~object.__repr__` method will be generated. The generated repr string will have the class name and the name and repr of each field, in the order they are defined in the class. Fields that are marked as being excluded from the repr are not included. For example: ``InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)``. - If the class already defines :meth:`~object.__repr__`, this parameter is + If the class already defines :meth:`!__repr__`, this parameter is ignored. - - ``eq``: If true (the default), an :meth:`~object.__eq__` method will be + - *eq*: If true (the default), an :meth:`~object.__eq__` method will be generated. This method compares the class as if it were a tuple of its fields, in order. Both instances in the comparison must be of the identical type. - If the class already defines :meth:`~object.__eq__`, this parameter is + If the class already defines :meth:`!__eq__`, this parameter is ignored. - - ``order``: If true (the default is ``False``), :meth:`~object.__lt__`, + - *order*: If true (the default is ``False``), :meth:`~object.__lt__`, :meth:`~object.__le__`, :meth:`~object.__gt__`, and :meth:`~object.__ge__` methods will be generated. These compare the class as if it were a tuple of its fields, in order. Both instances in the comparison must be of the - identical type. If ``order`` is true and ``eq`` is false, a + identical type. If *order* is true and *eq* is false, a :exc:`ValueError` is raised. - If the class already defines any of :meth:`~object.__lt__`, - :meth:`~object.__le__`, :meth:`~object.__gt__`, or :meth:`~object.__ge__`, then + If the class already defines any of :meth:`!__lt__`, + :meth:`!__le__`, :meth:`!__gt__`, or :meth:`!__ge__`, then :exc:`TypeError` is raised. - - ``unsafe_hash``: If ``False`` (the default), a :meth:`~object.__hash__` method - is generated according to how ``eq`` and ``frozen`` are set. + - *unsafe_hash*: If ``False`` (the default), a :meth:`~object.__hash__` method + is generated according to how *eq* and *frozen* are set. - :meth:`~object.__hash__` is used by built-in :meth:`hash()`, and when objects are + :meth:`!__hash__` is used by built-in :meth:`hash`, and when objects are added to hashed collections such as dictionaries and sets. Having a - :meth:`~object.__hash__` implies that instances of the class are immutable. + :meth:`!__hash__` implies that instances of the class are immutable. Mutability is a complicated property that depends on the programmer's - intent, the existence and behavior of :meth:`~object.__eq__`, and the values of - the ``eq`` and ``frozen`` flags in the :func:`dataclass` decorator. + intent, the existence and behavior of :meth:`!__eq__`, and the values of + the *eq* and *frozen* flags in the ``@dataclass`` decorator. - By default, :func:`dataclass` will not implicitly add a :meth:`~object.__hash__` + By default, ``@dataclass`` will not implicitly add a :meth:`~object.__hash__` method unless it is safe to do so. Neither will it add or change an - existing explicitly defined :meth:`~object.__hash__` method. Setting the class + existing explicitly defined :meth:`!__hash__` method. Setting the class attribute ``__hash__ = None`` has a specific meaning to Python, as - described in the :meth:`~object.__hash__` documentation. + described in the :meth:`!__hash__` documentation. - If :meth:`~object.__hash__` is not explicitly defined, or if it is set to ``None``, - then :func:`dataclass` *may* add an implicit :meth:`~object.__hash__` method. - Although not recommended, you can force :func:`dataclass` to create a - :meth:`~object.__hash__` method with ``unsafe_hash=True``. This might be the case - if your class is logically immutable but can nonetheless be mutated. + If :meth:`!__hash__` is not explicitly defined, or if it is set to ``None``, + then ``@dataclass`` *may* add an implicit :meth:`!__hash__` method. + Although not recommended, you can force ``@dataclass`` to create a + :meth:`!__hash__` method with ``unsafe_hash=True``. This might be the case + if your class is logically immutable but can still be mutated. This is a specialized use case and should be considered carefully. - Here are the rules governing implicit creation of a :meth:`~object.__hash__` - method. Note that you cannot both have an explicit :meth:`~object.__hash__` + Here are the rules governing implicit creation of a :meth:`!__hash__` + method. Note that you cannot both have an explicit :meth:`!__hash__` method in your dataclass and set ``unsafe_hash=True``; this will result in a :exc:`TypeError`. - If ``eq`` and ``frozen`` are both true, by default :func:`dataclass` will - generate a :meth:`~object.__hash__` method for you. If ``eq`` is true and - ``frozen`` is false, :meth:`~object.__hash__` will be set to ``None``, marking it - unhashable (which it is, since it is mutable). If ``eq`` is false, - :meth:`~object.__hash__` will be left untouched meaning the :meth:`~object.__hash__` + If *eq* and *frozen* are both true, by default ``@dataclass`` will + generate a :meth:`!__hash__` method for you. If *eq* is true and + *frozen* is false, :meth:`!__hash__` will be set to ``None``, marking it + unhashable (which it is, since it is mutable). If *eq* is false, + :meth:`!__hash__` will be left untouched meaning the :meth:`!__hash__` method of the superclass will be used (if the superclass is :class:`object`, this means it will fall back to id-based hashing). - - ``frozen``: If true (the default is ``False``), assigning to fields will + - *frozen*: If true (the default is ``False``), assigning to fields will generate an exception. This emulates read-only frozen instances. If :meth:`~object.__setattr__` or :meth:`~object.__delattr__` is defined in the class, then :exc:`TypeError` is raised. See the discussion below. - - ``match_args``: If true (the default is ``True``), the - ``__match_args__`` tuple will be created from the list of + - *match_args*: If true (the default is ``True``), the + :attr:`~object.__match_args__` tuple will be created from the list of parameters to the generated :meth:`~object.__init__` method (even if - :meth:`~object.__init__` is not generated, see above). If false, or if - ``__match_args__`` is already defined in the class, then - ``__match_args__`` will not be generated. + :meth:`!__init__` is not generated, see above). If false, or if + :attr:`!__match_args__` is already defined in the class, then + :attr:`!__match_args__` will not be generated. .. versionadded:: 3.10 - - ``kw_only``: If true (the default value is ``False``), then all + - *kw_only*: If true (the default value is ``False``), then all fields will be marked as keyword-only. If a field is marked as keyword-only, then the only effect is that the :meth:`~object.__init__` parameter generated from a keyword-only field must be specified - with a keyword when :meth:`~object.__init__` is called. There is no + with a keyword when :meth:`!__init__` is called. There is no effect on any other aspect of dataclasses. See the :term:`parameter` glossary entry for details. Also see the :const:`KW_ONLY` section. .. versionadded:: 3.10 - - ``slots``: If true (the default is ``False``), :attr:`~object.__slots__` attribute + - *slots*: If true (the default is ``False``), :attr:`~object.__slots__` attribute will be generated and new class will be returned instead of the original one. - If :attr:`~object.__slots__` is already defined in the class, then :exc:`TypeError` + If :attr:`!__slots__` is already defined in the class, then :exc:`TypeError` is raised. + .. warning:: + Calling no-arg :func:`super` in dataclasses using ``slots=True`` + will result in the following exception being raised: + ``TypeError: super(type, obj): obj must be an instance or subtype of type``. + The two-arg :func:`super` is a valid workaround. + See :gh:`90562` for full details. + + .. warning:: + Passing parameters to a base class :meth:`~object.__init_subclass__` + when using ``slots=True`` will result in a :exc:`TypeError`. + Either use ``__init_subclass__`` with no parameters + or use default values as a workaround. + See :gh:`91126` for full details. + .. versionadded:: 3.10 .. versionchanged:: 3.11 - If a field name is already included in the ``__slots__`` - of a base class, it will not be included in the generated ``__slots__`` + If a field name is already included in the :attr:`!__slots__` + of a base class, it will not be included in the generated :attr:`!__slots__` to prevent :ref:`overriding them `. - Therefore, do not use ``__slots__`` to retrieve the field names of a + Therefore, do not use :attr:`!__slots__` to retrieve the field names of a dataclass. Use :func:`fields` instead. To be able to determine inherited slots, - base class ``__slots__`` may be any iterable, but *not* an iterator. + base class :attr:`!__slots__` may be any iterable, but *not* an iterator. - - ``weakref_slot``: If true (the default is ``False``), add a slot + - *weakref_slot*: If true (the default is ``False``), add a slot named "__weakref__", which is required to make an instance - weakref-able. It is an error to specify ``weakref_slot=True`` + :func:`weakref-able `. + It is an error to specify ``weakref_slot=True`` without also specifying ``slots=True``. .. versionadded:: 3.11 @@ -214,7 +229,7 @@ Module contents a: int # 'a' has no default value b: int = 0 # assign a default value for 'b' - In this example, both ``a`` and ``b`` will be included in the added + In this example, both :attr:`!a` and :attr:`!b` will be included in the added :meth:`~object.__init__` method, which will be defined as:: def __init__(self, a: int, b: int = 0): @@ -229,7 +244,7 @@ Module contents required. There are, however, some dataclass features that require additional per-field information. To satisfy this need for additional information, you can replace the default field value - with a call to the provided :func:`field` function. For example:: + with a call to the provided :func:`!field` function. For example:: @dataclass class C: @@ -243,27 +258,27 @@ Module contents used because ``None`` is a valid value for some parameters with a distinct meaning. No code should directly use the :const:`MISSING` value. - The parameters to :func:`field` are: + The parameters to :func:`!field` are: - - ``default``: If provided, this will be the default value for this - field. This is needed because the :meth:`field` call itself + - *default*: If provided, this will be the default value for this + field. This is needed because the :func:`!field` call itself replaces the normal position of the default value. - - ``default_factory``: If provided, it must be a zero-argument + - *default_factory*: If provided, it must be a zero-argument callable that will be called when a default value is needed for this field. Among other purposes, this can be used to specify fields with mutable default values, as discussed below. It is an - error to specify both ``default`` and ``default_factory``. + error to specify both *default* and *default_factory*. - - ``init``: If true (the default), this field is included as a + - *init*: If true (the default), this field is included as a parameter to the generated :meth:`~object.__init__` method. - - ``repr``: If true (the default), this field is included in the + - *repr*: If true (the default), this field is included in the string returned by the generated :meth:`~object.__repr__` method. - - ``hash``: This can be a bool or ``None``. If true, this field is + - *hash*: This can be a bool or ``None``. If true, this field is included in the generated :meth:`~object.__hash__` method. If ``None`` (the - default), use the value of ``compare``: this would normally be + default), use the value of *compare*: this would normally be the expected behavior. A field should be considered in the hash if it's used for comparisons. Setting this value to anything other than ``None`` is discouraged. @@ -274,11 +289,11 @@ Module contents fields that contribute to the type's hash value. Even if a field is excluded from the hash, it will still be used for comparisons. - - ``compare``: If true (the default), this field is included in the + - *compare*: If true (the default), this field is included in the generated equality and comparison methods (:meth:`~object.__eq__`, :meth:`~object.__gt__`, et al.). - - ``metadata``: This can be a mapping or None. None is treated as + - *metadata*: This can be a mapping or ``None``. ``None`` is treated as an empty dict. This value is wrapped in :func:`~types.MappingProxyType` to make it read-only, and exposed on the :class:`Field` object. It is not used at all by Data @@ -286,17 +301,17 @@ Module contents Multiple third-parties can each have their own key, to use as a namespace in the metadata. - - ``kw_only``: If true, this field will be marked as keyword-only. + - *kw_only*: If true, this field will be marked as keyword-only. This is used when the generated :meth:`~object.__init__` method's parameters are computed. .. versionadded:: 3.10 If the default value of a field is specified by a call to - :func:`field()`, then the class attribute for this field will be - replaced by the specified ``default`` value. If no ``default`` is + :func:`!field`, then the class attribute for this field will be + replaced by the specified *default* value. If *default* is not provided, then the class attribute will be deleted. The intent is - that after the :func:`dataclass` decorator runs, the class + that after the :func:`@dataclass ` decorator runs, the class attributes will all contain the default values for the fields, just as if the default value itself were specified. For example, after:: @@ -308,24 +323,22 @@ Module contents z: int = field(repr=False, default=10) t: int = 20 - The class attribute ``C.z`` will be ``10``, the class attribute - ``C.t`` will be ``20``, and the class attributes ``C.x`` and - ``C.y`` will not be set. + The class attribute :attr:`!C.z` will be ``10``, the class attribute + :attr:`!C.t` will be ``20``, and the class attributes :attr:`!C.x` and + :attr:`!C.y` will not be set. .. class:: Field - :class:`Field` objects describe each defined field. These objects + :class:`!Field` objects describe each defined field. These objects are created internally, and are returned by the :func:`fields` module-level method (see below). Users should never instantiate a - :class:`Field` object directly. Its documented attributes are: - - - ``name``: The name of the field. - - - ``type``: The type of the field. + :class:`!Field` object directly. Its documented attributes are: - - ``default``, ``default_factory``, ``init``, ``repr``, ``hash``, - ``compare``, ``metadata``, and ``kw_only`` have the identical - meaning and values as they do in the :func:`field` function. + - :attr:`!name`: The name of the field. + - :attr:`!type`: The type of the field. + - :attr:`!default`, :attr:`!default_factory`, :attr:`!init`, :attr:`!repr`, :attr:`!hash`, + :attr:`!compare`, :attr:`!metadata`, and :attr:`!kw_only` have the identical + meaning and values as they do in the :func:`field` function. Other attributes may exist, but they are private and must not be inspected or relied on. @@ -339,13 +352,13 @@ Module contents .. function:: asdict(obj, *, dict_factory=dict) - Converts the dataclass ``obj`` to a dict (by using the - factory function ``dict_factory``). Each dataclass is converted + Converts the dataclass *obj* to a dict (by using the + factory function *dict_factory*). Each dataclass is converted to a dict of its fields, as ``name: value`` pairs. dataclasses, dicts, lists, and tuples are recursed into. Other objects are copied with :func:`copy.deepcopy`. - Example of using :func:`asdict` on nested dataclasses:: + Example of using :func:`!asdict` on nested dataclasses:: @dataclass class Point: @@ -364,15 +377,15 @@ Module contents To create a shallow copy, the following workaround may be used:: - dict((field.name, getattr(obj, field.name)) for field in fields(obj)) + {field.name: getattr(obj, field.name) for field in fields(obj)} - :func:`asdict` raises :exc:`TypeError` if ``obj`` is not a dataclass + :func:`!asdict` raises :exc:`TypeError` if *obj* is not a dataclass instance. .. function:: astuple(obj, *, tuple_factory=tuple) - Converts the dataclass ``obj`` to a tuple (by using the - factory function ``tuple_factory``). Each dataclass is converted + Converts the dataclass *obj* to a tuple (by using the + factory function *tuple_factory*). Each dataclass is converted to a tuple of its field values. dataclasses, dicts, lists, and tuples are recursed into. Other objects are copied with :func:`copy.deepcopy`. @@ -386,28 +399,28 @@ Module contents tuple(getattr(obj, field.name) for field in dataclasses.fields(obj)) - :func:`astuple` raises :exc:`TypeError` if ``obj`` is not a dataclass + :func:`!astuple` raises :exc:`TypeError` if *obj* is not a dataclass instance. .. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None) - Creates a new dataclass with name ``cls_name``, fields as defined - in ``fields``, base classes as given in ``bases``, and initialized - with a namespace as given in ``namespace``. ``fields`` is an + Creates a new dataclass with name *cls_name*, fields as defined + in *fields*, base classes as given in *bases*, and initialized + with a namespace as given in *namespace*. *fields* is an iterable whose elements are each either ``name``, ``(name, type)``, or ``(name, type, Field)``. If just ``name`` is supplied, - ``typing.Any`` is used for ``type``. The values of ``init``, - ``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``, - ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` have - the same meaning as they do in :func:`dataclass`. + :data:`typing.Any` is used for ``type``. The values of *init*, + *repr*, *eq*, *order*, *unsafe_hash*, *frozen*, + *match_args*, *kw_only*, *slots*, and *weakref_slot* have + the same meaning as they do in :func:`@dataclass `. - If ``module`` is defined, the ``__module__`` attribute + If *module* is defined, the :attr:`!__module__` attribute of the dataclass is set to that value. By default, it is set to the module name of the caller. This function is not strictly required, because any Python - mechanism for creating a new class with ``__annotations__`` can - then apply the :func:`dataclass` function to convert that class to + mechanism for creating a new class with :attr:`!__annotations__` can + then apply the :func:`@dataclass ` function to convert that class to a dataclass. This function is provided as a convenience. For example:: @@ -430,36 +443,38 @@ Module contents .. function:: replace(obj, /, **changes) - Creates a new object of the same type as ``obj``, replacing - fields with values from ``changes``. If ``obj`` is not a Data - Class, raises :exc:`TypeError`. If values in ``changes`` do not - specify fields, raises :exc:`TypeError`. + Creates a new object of the same type as *obj*, replacing + fields with values from *changes*. If *obj* is not a Data + Class, raises :exc:`TypeError`. If keys in *changes* are not + field names of the given dataclass, raises :exc:`TypeError`. The newly returned object is created by calling the :meth:`~object.__init__` method of the dataclass. This ensures that :meth:`__post_init__`, if present, is also called. Init-only variables without default values, if any exist, must be - specified on the call to :func:`replace` so that they can be passed to - :meth:`~object.__init__` and :meth:`__post_init__`. + specified on the call to :func:`!replace` so that they can be passed to + :meth:`!__init__` and :meth:`__post_init__`. - It is an error for ``changes`` to contain any fields that are + It is an error for *changes* to contain any fields that are defined as having ``init=False``. A :exc:`ValueError` will be raised in this case. Be forewarned about how ``init=False`` fields work during a call to - :func:`replace`. They are not copied from the source object, but + :func:`!replace`. They are not copied from the source object, but rather are initialized in :meth:`__post_init__`, if they're initialized at all. It is expected that ``init=False`` fields will be rarely and judiciously used. If they are used, it might be wise to have alternate class constructors, or perhaps a custom - ``replace()`` (or similarly named) method which handles instance + :func:`!replace` (or similarly named) method which handles instance copying. + Dataclass instances are also supported by generic function :func:`copy.replace`. + .. function:: is_dataclass(obj) - Return ``True`` if its parameter is a dataclass or an instance of one, - otherwise return ``False``. + Return ``True`` if its parameter is a dataclass (including subclasses of a + dataclass) or an instance of one, otherwise return ``False``. If you need to know if a class is an instance of a dataclass (and not a dataclass itself), then add a further check for ``not @@ -475,11 +490,11 @@ Module contents .. data:: KW_ONLY A sentinel value used as a type annotation. Any fields after a - pseudo-field with the type of :const:`KW_ONLY` are marked as + pseudo-field with the type of :const:`!KW_ONLY` are marked as keyword-only fields. Note that a pseudo-field of type - :const:`KW_ONLY` is otherwise completely ignored. This includes the + :const:`!KW_ONLY` is otherwise completely ignored. This includes the name of such a field. By convention, a name of ``_`` is used for a - :const:`KW_ONLY` field. Keyword-only fields signify + :const:`!KW_ONLY` field. Keyword-only fields signify :meth:`~object.__init__` parameters that must be specified as keywords when the class is instantiated. @@ -495,7 +510,7 @@ Module contents p = Point(0, y=1.5, z=2.0) In a single dataclass, it is an error to specify more than one - field whose type is :const:`KW_ONLY`. + field whose type is :const:`!KW_ONLY`. .. versionadded:: 3.10 @@ -513,11 +528,11 @@ Post-init processing .. function:: __post_init__() When defined on the class, it will be called by the generated - :meth:`~object.__init__`, normally as ``self.__post_init__()``. + :meth:`~object.__init__`, normally as :meth:`!self.__post_init__`. However, if any ``InitVar`` fields are defined, they will also be - passed to :meth:`__post_init__` in the order they were defined in the - class. If no :meth:`~object.__init__` method is generated, then - :meth:`__post_init__` will not automatically be called. + passed to :meth:`!__post_init__` in the order they were defined in the + class. If no :meth:`!__init__` method is generated, then + :meth:`!__post_init__` will not automatically be called. Among other uses, this allows for initializing field values that depend on one or more other fields. For example:: @@ -531,15 +546,15 @@ Post-init processing def __post_init__(self): self.c = self.a + self.b -The :meth:`~object.__init__` method generated by :func:`dataclass` does not call base -class :meth:`~object.__init__` methods. If the base class has an :meth:`~object.__init__` method +The :meth:`~object.__init__` method generated by :func:`@dataclass ` does not call base +class :meth:`!__init__` methods. If the base class has an :meth:`!__init__` method that has to be called, it is common to call this method in a :meth:`__post_init__` method:: - @dataclass class Rectangle: - height: float - width: float + def __init__(self, height, width): + self.height = height + self.width = width @dataclass class Square(Rectangle): @@ -548,29 +563,33 @@ that has to be called, it is common to call this method in a def __post_init__(self): super().__init__(self.side, self.side) -Note, however, that in general the dataclass-generated :meth:`~object.__init__` methods +Note, however, that in general the dataclass-generated :meth:`!__init__` methods don't need to be called, since the derived dataclass will take care of initializing all fields of any base class that is a dataclass itself. See the section below on init-only variables for ways to pass -parameters to :meth:`__post_init__`. Also see the warning about how +parameters to :meth:`!__post_init__`. Also see the warning about how :func:`replace` handles ``init=False`` fields. +.. _dataclasses-class-variables: + Class variables --------------- -One of the few places where :func:`dataclass` actually inspects the type +One of the few places where :func:`@dataclass ` actually inspects the type of a field is to determine if a field is a class variable as defined in :pep:`526`. It does this by checking if the type of the field is -``typing.ClassVar``. If a field is a ``ClassVar``, it is excluded +:data:`typing.ClassVar`. If a field is a ``ClassVar``, it is excluded from consideration as a field and is ignored by the dataclass mechanisms. Such ``ClassVar`` pseudo-fields are not returned by the module-level :func:`fields` function. +.. _dataclasses-init-only-variables: + Init-only variables ------------------- -Another place where :func:`dataclass` inspects a type annotation is to +Another place where :func:`@dataclass ` inspects a type annotation is to determine if a field is an init-only variable. It does this by seeing if the type of a field is of type ``dataclasses.InitVar``. If a field is an ``InitVar``, it is considered a pseudo-field called an init-only @@ -595,14 +614,16 @@ value is not provided when creating the class:: c = C(10, database=my_database) -In this case, :func:`fields` will return :class:`Field` objects for ``i`` and -``j``, but not for ``database``. +In this case, :func:`fields` will return :class:`Field` objects for :attr:`!i` and +:attr:`!j`, but not for :attr:`!database`. + +.. _dataclasses-frozen: Frozen instances ---------------- It is not possible to create truly immutable Python objects. However, -by passing ``frozen=True`` to the :meth:`dataclass` decorator you can +by passing ``frozen=True`` to the :func:`@dataclass ` decorator you can emulate immutability. In that case, dataclasses will add :meth:`~object.__setattr__` and :meth:`~object.__delattr__` methods to the class. These methods will raise a :exc:`FrozenInstanceError` when invoked. @@ -611,10 +632,14 @@ There is a tiny performance penalty when using ``frozen=True``: :meth:`~object.__init__` cannot use simple assignment to initialize fields, and must use :meth:`!object.__setattr__`. +.. Make sure to not remove "object" from "object.__setattr__" in the above markup! + +.. _dataclasses-inheritance: + Inheritance ----------- -When the dataclass is being created by the :meth:`dataclass` decorator, +When the dataclass is being created by the :func:`@dataclass ` decorator, it looks through all of the class's base classes in reverse MRO (that is, starting at :class:`object`) and, for each dataclass that it finds, adds the fields from that base class to an ordered mapping of fields. @@ -634,15 +659,15 @@ example:: z: int = 10 x: int = 15 -The final list of fields is, in order, ``x``, ``y``, ``z``. The final -type of ``x`` is ``int``, as specified in class ``C``. +The final list of fields is, in order, :attr:`!x`, :attr:`!y`, :attr:`!z`. The final +type of :attr:`!x` is :class:`int`, as specified in class :class:`!C`. -The generated :meth:`~object.__init__` method for ``C`` will look like:: +The generated :meth:`~object.__init__` method for :class:`!C` will look like:: def __init__(self, x: int = 15, y: int = 0, z: int = 10): -Re-ordering of keyword-only parameters in :meth:`~object.__init__` ------------------------------------------------------------------- +Re-ordering of keyword-only parameters in :meth:`!__init__` +----------------------------------------------------------- After the parameters needed for :meth:`~object.__init__` are computed, any keyword-only parameters are moved to come after all regular @@ -650,8 +675,8 @@ keyword-only parameters are moved to come after all regular keyword-only parameters are implemented in Python: they must come after non-keyword-only parameters. -In this example, ``Base.y``, ``Base.w``, and ``D.t`` are keyword-only -fields, and ``Base.x`` and ``D.z`` are regular fields:: +In this example, :attr:`!Base.y`, :attr:`!Base.w`, and :attr:`!D.t` are keyword-only +fields, and :attr:`!Base.x` and :attr:`!D.z` are regular fields:: @dataclass class Base: @@ -665,7 +690,7 @@ fields, and ``Base.x`` and ``D.z`` are regular fields:: z: int = 10 t: int = field(kw_only=True, default=0) -The generated :meth:`~object.__init__` method for ``D`` will look like:: +The generated :meth:`!__init__` method for :class:`!D` will look like:: def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0): @@ -674,22 +699,22 @@ the list of fields: parameters derived from regular fields are followed by parameters derived from keyword-only fields. The relative ordering of keyword-only parameters is maintained in the -re-ordered :meth:`~object.__init__` parameter list. +re-ordered :meth:`!__init__` parameter list. Default factory functions ------------------------- -If a :func:`field` specifies a ``default_factory``, it is called with +If a :func:`field` specifies a *default_factory*, it is called with zero arguments when a default value for the field is needed. For example, to create a new instance of a list, use:: mylist: list = field(default_factory=list) If a field is excluded from :meth:`~object.__init__` (using ``init=False``) -and the field also specifies ``default_factory``, then the default +and the field also specifies *default_factory*, then the default factory function will always be called from the generated -:meth:`~object.__init__` function. This happens because there is no other +:meth:`!__init__` function. This happens because there is no other way to give the field an initial value. Mutable default values @@ -710,8 +735,8 @@ Consider this example, not using dataclasses:: assert o1.x == [1, 2] assert o1.x is o2.x -Note that the two instances of class ``C`` share the same class -variable ``x``, as expected. +Note that the two instances of class :class:`!C` share the same class +variable :attr:`!x`, as expected. Using dataclasses, *if* this code was valid:: @@ -719,7 +744,7 @@ Using dataclasses, *if* this code was valid:: class D: x: list = [] # This code raises ValueError def add(self, element): - self.x += element + self.x.append(element) it would generate code similar to:: @@ -728,17 +753,17 @@ it would generate code similar to:: def __init__(self, x=x): self.x = x def add(self, element): - self.x += element + self.x.append(element) assert D().x is D().x -This has the same issue as the original example using class ``C``. -That is, two instances of class ``D`` that do not specify a value -for ``x`` when creating a class instance will share the same copy -of ``x``. Because dataclasses just use normal Python class +This has the same issue as the original example using class :class:`!C`. +That is, two instances of class :class:`!D` that do not specify a value +for :attr:`!x` when creating a class instance will share the same copy +of :attr:`!x`. Because dataclasses just use normal Python class creation they also share this behavior. There is no general way for Data Classes to detect this condition. Instead, the -:func:`dataclass` decorator will raise a :exc:`ValueError` if it +:func:`@dataclass ` decorator will raise a :exc:`ValueError` if it detects an unhashable default parameter. The assumption is that if a value is unhashable, it is mutable. This is a partial solution, but it does protect against many common errors. @@ -753,8 +778,8 @@ mutable types as default values for fields:: assert D().x is not D().x .. versionchanged:: 3.11 - Instead of looking for and disallowing objects of type ``list``, - ``dict``, or ``set``, unhashable objects are now not allowed as + Instead of looking for and disallowing objects of type :class:`list`, + :class:`dict`, or :class:`set`, unhashable objects are now not allowed as default values. Unhashability is used to approximate mutability. @@ -764,15 +789,17 @@ Descriptor-typed fields Fields that are assigned :ref:`descriptor objects ` as their default value have the following special behaviors: -* The value for the field passed to the dataclass's ``__init__`` method is - passed to the descriptor's ``__set__`` method rather than overwriting the +* The value for the field passed to the dataclass's :meth:`~object.__init__` method is + passed to the descriptor's :meth:`~object.__set__` method rather than overwriting the descriptor object. + * Similarly, when getting or setting the field, the descriptor's - ``__get__`` or ``__set__`` method is called rather than returning or + :meth:`~object.__get__` or :meth:`!__set__` method is called rather than returning or overwriting the descriptor object. -* To determine whether a field contains a default value, ``dataclasses`` - will call the descriptor's ``__get__`` method using its class access - form (i.e. ``descriptor.__get__(obj=None, type=cls)``. If the + +* To determine whether a field contains a default value, :func:`@dataclass ` + will call the descriptor's :meth:`!__get__` method using its class access + form: ``descriptor.__get__(obj=None, type=cls)``. If the descriptor returns a value in this case, it will be used as the field's default. On the other hand, if the descriptor raises :exc:`AttributeError` in this situation, no default value will be diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 04cc7556..211e625c 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1,5 +1,5 @@ -:mod:`datetime` --- Basic date and time types -============================================= +:mod:`!datetime` --- Basic date and time types +============================================== .. module:: datetime :synopsis: Basic date and time types. @@ -14,7 +14,7 @@ .. XXX what order should the types be discussed in? -The :mod:`datetime` module supplies classes for manipulating dates and times. +The :mod:`!datetime` module supplies classes for manipulating dates and times. While date and time arithmetic is supported, the focus of the implementation is on efficient attribute extraction for output formatting and manipulation. @@ -37,8 +37,9 @@ on efficient attribute extraction for output formatting and manipulation. Package `dateutil `_ Third-party library with expanded time zone and parsing support. - Package `DateType `_ - Third-party library that introduces distinct static types to e.g. allow static type checkers + Package :pypi:`DateType` + Third-party library that introduces distinct static types to e.g. allow + :term:`static type checkers ` to differentiate between naive and aware datetimes. .. _datetime-naive-aware: @@ -47,7 +48,7 @@ Aware and Naive Objects ----------------------- Date and time objects may be categorized as "aware" or "naive" depending on -whether or not they include timezone information. +whether or not they include time zone information. With sufficient knowledge of applicable algorithmic and political time adjustments, such as time zone and daylight saving time information, @@ -57,7 +58,7 @@ interpretation. [#]_ A **naive** object does not contain enough information to unambiguously locate itself relative to other date/time objects. Whether a naive object represents -Coordinated Universal Time (UTC), local time, or time in some other timezone is +Coordinated Universal Time (UTC), local time, or time in some other time zone is purely up to the program, just like it is up to the program whether a particular number represents metres, miles, or mass. Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. @@ -69,9 +70,9 @@ These :class:`tzinfo` objects capture information about the offset from UTC time, the time zone name, and whether daylight saving time is in effect. Only one concrete :class:`tzinfo` class, the :class:`timezone` class, is -supplied by the :mod:`datetime` module. The :class:`timezone` class can -represent simple timezones with fixed offsets from UTC, such as UTC itself or -North American EST and EDT timezones. Supporting timezones at deeper levels of +supplied by the :mod:`!datetime` module. The :class:`!timezone` class can +represent simple time zones with fixed offsets from UTC, such as UTC itself or +North American EST and EDT time zones. Supporting time zones at deeper levels of detail is up to the application. The rules for time adjustment across the world are more political than rational, change frequently, and there is no standard suitable for every application aside from UTC. @@ -79,22 +80,22 @@ standard suitable for every application aside from UTC. Constants --------- -The :mod:`datetime` module exports the following constants: +The :mod:`!datetime` module exports the following constants: .. data:: MINYEAR The smallest year number allowed in a :class:`date` or :class:`.datetime` object. - :const:`MINYEAR` is ``1``. + :const:`MINYEAR` is 1. .. data:: MAXYEAR The largest year number allowed in a :class:`date` or :class:`.datetime` object. - :const:`MAXYEAR` is ``9999``. + :const:`MAXYEAR` is 9999. .. attribute:: UTC - Alias for the UTC timezone singleton :attr:`datetime.timezone.utc`. + Alias for the UTC time zone singleton :attr:`datetime.timezone.utc`. .. versionadded:: 3.11 @@ -129,8 +130,8 @@ Available Types .. class:: timedelta :noindex: - A duration expressing the difference between two :class:`date`, :class:`.time`, - or :class:`.datetime` instances to microsecond resolution. + A duration expressing the difference between two :class:`.datetime` + or :class:`date` instances to microsecond resolution. .. class:: tzinfo @@ -179,19 +180,19 @@ Objects of the :class:`date` type are always naive. An object of type :class:`.time` or :class:`.datetime` may be aware or naive. -A :class:`.datetime` object *d* is aware if both of the following hold: +A :class:`.datetime` object ``d`` is aware if both of the following hold: 1. ``d.tzinfo`` is not ``None`` 2. ``d.tzinfo.utcoffset(d)`` does not return ``None`` -Otherwise, *d* is naive. +Otherwise, ``d`` is naive. -A :class:`.time` object *t* is aware if both of the following hold: +A :class:`.time` object ``t`` is aware if both of the following hold: 1. ``t.tzinfo`` is not ``None`` 2. ``t.tzinfo.utcoffset(None)`` does not return ``None``. -Otherwise, *t* is naive. +Otherwise, ``t`` is naive. The distinction between aware and naive doesn't apply to :class:`timedelta` objects. @@ -202,11 +203,11 @@ objects. -------------------------- A :class:`timedelta` object represents a duration, the difference between two -dates or times. +:class:`.datetime` or :class:`date` instances. .. class:: timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) - All arguments are optional and default to ``0``. Arguments may be integers + All arguments are optional and default to 0. Arguments may be integers or floats, and may be positive or negative. Only *days*, *seconds* and *microseconds* are stored internally. @@ -279,20 +280,40 @@ Class attributes: The smallest possible difference between non-equal :class:`timedelta` objects, ``timedelta(microseconds=1)``. -Note that, because of normalization, ``timedelta.max`` > ``-timedelta.min``. +Note that, because of normalization, ``timedelta.max`` is greater than ``-timedelta.min``. ``-timedelta.max`` is not representable as a :class:`timedelta` object. + Instance attributes (read-only): -+------------------+--------------------------------------------+ -| Attribute | Value | -+==================+============================================+ -| ``days`` | Between -999999999 and 999999999 inclusive | -+------------------+--------------------------------------------+ -| ``seconds`` | Between 0 and 86399 inclusive | -+------------------+--------------------------------------------+ -| ``microseconds`` | Between 0 and 999999 inclusive | -+------------------+--------------------------------------------+ +.. attribute:: timedelta.days + + Between -999,999,999 and 999,999,999 inclusive. + + +.. attribute:: timedelta.seconds + + Between 0 and 86,399 inclusive. + + .. caution:: + + It is a somewhat common bug for code to unintentionally use this attribute + when it is actually intended to get a :meth:`~timedelta.total_seconds` + value instead: + + .. doctest:: + + >>> from datetime import timedelta + >>> duration = timedelta(seconds=11235813) + >>> duration.days, duration.seconds + (130, 3813) + >>> duration.total_seconds() + 11235813.0 + +.. attribute:: timedelta.microseconds + + Between 0 and 999,999 inclusive. + Supported operations: @@ -301,26 +322,27 @@ Supported operations: +--------------------------------+-----------------------------------------------+ | Operation | Result | +================================+===============================================+ -| ``t1 = t2 + t3`` | Sum of *t2* and *t3*. Afterwards *t1*-*t2* == | -| | *t3* and *t1*-*t3* == *t2* are true. (1) | +| ``t1 = t2 + t3`` | Sum of ``t2`` and ``t3``. | +| | Afterwards ``t1 - t2 == t3`` and | +| | ``t1 - t3 == t2`` are true. (1) | +--------------------------------+-----------------------------------------------+ -| ``t1 = t2 - t3`` | Difference of *t2* and *t3*. Afterwards *t1* | -| | == *t2* - *t3* and *t2* == *t1* + *t3* are | +| ``t1 = t2 - t3`` | Difference of ``t2`` and ``t3``. Afterwards | +| | ``t1 == t2 - t3`` and ``t2 == t1 + t3`` are | | | true. (1)(6) | +--------------------------------+-----------------------------------------------+ | ``t1 = t2 * i or t1 = i * t2`` | Delta multiplied by an integer. | -| | Afterwards *t1* // i == *t2* is true, | +| | Afterwards ``t1 // i == t2`` is true, | | | provided ``i != 0``. | +--------------------------------+-----------------------------------------------+ -| | In general, *t1* \* i == *t1* \* (i-1) + *t1* | +| | In general, ``t1 * i == t1 * (i-1) + t1`` | | | is true. (1) | +--------------------------------+-----------------------------------------------+ | ``t1 = t2 * f or t1 = f * t2`` | Delta multiplied by a float. The result is | | | rounded to the nearest multiple of | | | timedelta.resolution using round-half-to-even.| +--------------------------------+-----------------------------------------------+ -| ``f = t2 / t3`` | Division (3) of overall duration *t2* by | -| | interval unit *t3*. Returns a :class:`float` | +| ``f = t2 / t3`` | Division (3) of overall duration ``t2`` by | +| | interval unit ``t3``. Returns a :class:`float`| | | object. | +--------------------------------+-----------------------------------------------+ | ``t1 = t2 / f or t1 = t2 / i`` | Delta divided by a float or an int. The result| @@ -336,19 +358,18 @@ Supported operations: +--------------------------------+-----------------------------------------------+ | ``q, r = divmod(t1, t2)`` | Computes the quotient and the remainder: | | | ``q = t1 // t2`` (3) and ``r = t1 % t2``. | -| | q is an integer and r is a :class:`timedelta` | -| | object. | +| | ``q`` is an integer and ``r`` is a | +| | :class:`timedelta` object. | +--------------------------------+-----------------------------------------------+ | ``+t1`` | Returns a :class:`timedelta` object with the | | | same value. (2) | +--------------------------------+-----------------------------------------------+ -| ``-t1`` | equivalent to | -| | :class:`timedelta`\ (-*t1.days*, | -| | -*t1.seconds*, -*t1.microseconds*), | -| | and to *t1*\* -1. (1)(4) | +| ``-t1`` | Equivalent to ``timedelta(-t1.days, | +| | -t1.seconds, -t1.microseconds)``, | +| | and to ``t1 * -1``. (1)(4) | +--------------------------------+-----------------------------------------------+ -| ``abs(t)`` | equivalent to +\ *t* when ``t.days >= 0``, | -| | and to -*t* when ``t.days < 0``. (2) | +| ``abs(t)`` | Equivalent to ``+t`` when ``t.days >= 0``, | +| | and to ``-t`` when ``t.days < 0``. (2) | +--------------------------------+-----------------------------------------------+ | ``str(t)`` | Returns a string in the form | | | ``[D day[s], ][H]H:MM:SS[.UUUUUU]``, where D | @@ -369,10 +390,10 @@ Notes: This is exact and cannot overflow. (3) - Division by 0 raises :exc:`ZeroDivisionError`. + Division by zero raises :exc:`ZeroDivisionError`. (4) - -*timedelta.max* is not representable as a :class:`timedelta` object. + ``-timedelta.max`` is not representable as a :class:`timedelta` object. (5) String representations of :class:`timedelta` objects are normalized @@ -399,30 +420,7 @@ objects (see below). the :func:`divmod` function. True division and multiplication of a :class:`timedelta` object by a :class:`float` object are now supported. - -Comparisons of :class:`timedelta` objects are supported, with some caveats. - -The comparisons ``==`` or ``!=`` *always* return a :class:`bool`, no matter -the type of the compared object:: - - >>> from datetime import timedelta - >>> delta1 = timedelta(seconds=57) - >>> delta2 = timedelta(hours=25, seconds=2) - >>> delta2 != delta1 - True - >>> delta2 == 5 - False - -For all other comparisons (such as ``<`` and ``>``), when a :class:`timedelta` -object is compared to an object of a different type, :exc:`TypeError` -is raised:: - - >>> delta2 > delta1 - True - >>> delta2 > 5 - Traceback (most recent call last): - File "", line 1, in - TypeError: '>' not supported between instances of 'datetime.timedelta' and 'int' +:class:`timedelta` objects support equality and order comparisons. In Boolean contexts, a :class:`timedelta` object is considered to be true if and only if it isn't equal to ``timedelta(0)``. @@ -528,14 +526,22 @@ Other constructors, all class methods: January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= - date.max.toordinal()``. For any date *d*, + date.max.toordinal()``. For any date ``d``, ``date.fromordinal(d.toordinal()) == d``. .. classmethod:: date.fromisoformat(date_string) Return a :class:`date` corresponding to a *date_string* given in any valid - ISO 8601 format, except ordinal dates (e.g. ``YYYY-DDD``):: + ISO 8601 format, with the following exceptions: + + 1. Reduced precision dates are not currently supported (``YYYY-MM``, + ``YYYY``). + 2. Extended date representations are not currently supported + (``±YYYYYY-MM-DD``). + 3. Ordinal dates are not currently supported (``YYYY-OOO``). + + Examples:: >>> from datetime import date >>> date.fromisoformat('2019-12-04') @@ -597,16 +603,21 @@ Supported operations: +-------------------------------+----------------------------------------------+ | Operation | Result | +===============================+==============================================+ -| ``date2 = date1 + timedelta`` | *date2* will be ``timedelta.days`` days | -| | after *date1*. (1) | +| ``date2 = date1 + timedelta`` | ``date2`` will be ``timedelta.days`` days | +| | after ``date1``. (1) | +-------------------------------+----------------------------------------------+ -| ``date2 = date1 - timedelta`` | Computes *date2* such that ``date2 + | +| ``date2 = date1 - timedelta`` | Computes ``date2`` such that ``date2 + | | | timedelta == date1``. (2) | +-------------------------------+----------------------------------------------+ | ``timedelta = date1 - date2`` | \(3) | +-------------------------------+----------------------------------------------+ -| ``date1 < date2`` | *date1* is considered less than *date2* when | -| | *date1* precedes *date2* in time. (4) | +| | ``date1 == date2`` | Equality comparison. (4) | +| | ``date1 != date2`` | | ++-------------------------------+----------------------------------------------+ +| | ``date1 < date2`` | Order comparison. (5) | +| | ``date1 > date2`` | | +| | ``date1 <= date2`` | | +| | ``date1 >= date2`` | | +-------------------------------+----------------------------------------------+ Notes: @@ -622,19 +633,32 @@ Notes: ``timedelta.seconds`` and ``timedelta.microseconds`` are ignored. (3) - This is exact, and cannot overflow. timedelta.seconds and - timedelta.microseconds are 0, and date2 + timedelta == date1 after. + This is exact, and cannot overflow. ``timedelta.seconds`` and + ``timedelta.microseconds`` are 0, and ``date2 + timedelta == date1`` after. (4) + :class:`date` objects are equal if they represent the same date. + + :class:`!date` objects that are not also :class:`.datetime` instances + are never equal to :class:`!datetime` objects, even if they represent + the same date. + +(5) + *date1* is considered less than *date2* when *date1* precedes *date2* in time. In other words, ``date1 < date2`` if and only if ``date1.toordinal() < - date2.toordinal()``. Date comparison raises :exc:`TypeError` if - the other comparand isn't also a :class:`date` object. However, - ``NotImplemented`` is returned instead if the other comparand has a - :meth:`timetuple` attribute. This hook gives other kinds of date objects a - chance at implementing mixed-type comparison. If not, when a :class:`date` - object is compared to an object of a different type, :exc:`TypeError` is raised - unless the comparison is ``==`` or ``!=``. The latter cases return - :const:`False` or :const:`True`, respectively. + date2.toordinal()``. + + Order comparison between a :class:`!date` object that is not also a + :class:`.datetime` instance and a :class:`!datetime` object raises + :exc:`TypeError`. + +.. versionchanged:: 3.13 + Comparison between :class:`.datetime` object and an instance of + the :class:`date` subclass that is not a :class:`!datetime` subclass + no longer converts the latter to :class:`!date`, ignoring the time part + and the time zone. + The default behavior can be changed by overriding the special comparison + methods in subclasses. In Boolean contexts, all :class:`date` objects are considered to be true. @@ -652,6 +676,9 @@ Instance methods: >>> d.replace(day=26) datetime.date(2002, 12, 26) + :class:`date` objects are also supported by generic function + :func:`copy.replace`. + .. method:: date.timetuple() @@ -664,13 +691,13 @@ Instance methods: time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1)) where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` - is the day number within the current year starting with ``1`` for January 1st. + is the day number within the current year starting with 1 for January 1st. .. method:: date.toordinal() Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 - has ordinal 1. For any :class:`date` object *d*, + has ordinal 1. For any :class:`date` object ``d``, ``date.fromordinal(d.toordinal()) == d``. @@ -722,7 +749,7 @@ Instance methods: .. method:: date.__str__() - For a date *d*, ``str(d)`` is equivalent to ``d.isoformat()``. + For a date ``d``, ``str(d)`` is equivalent to ``d.isoformat()``. .. method:: date.ctime() @@ -855,14 +882,14 @@ Constructor: If an argument outside those ranges is given, :exc:`ValueError` is raised. - .. versionadded:: 3.6 - Added the ``fold`` argument. + .. versionchanged:: 3.6 + Added the *fold* parameter. Other constructors, all class methods: .. classmethod:: datetime.today() - Return the current local datetime, with :attr:`.tzinfo` ``None``. + Return the current local date and time, with :attr:`.tzinfo` ``None``. Equivalent to:: @@ -888,6 +915,10 @@ Other constructors, all class methods: This function is preferred over :meth:`today` and :meth:`utcnow`. + .. note:: + + Subsequent calls to :meth:`!datetime.now` may return the same + instant depending on the precision of the underlying clock. .. classmethod:: datetime.utcnow() @@ -984,8 +1015,8 @@ Other constructors, all class methods: .. classmethod:: datetime.fromordinal(ordinal) Return the :class:`.datetime` corresponding to the proleptic Gregorian ordinal, - where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 - <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and + where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless + ``1 <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and microsecond of the result are all 0, and :attr:`.tzinfo` is ``None``. @@ -999,7 +1030,7 @@ Other constructors, all class methods: is used. If the *date* argument is a :class:`.datetime` object, its time components and :attr:`.tzinfo` attributes are ignored. - For any :class:`.datetime` object *d*, + For any :class:`.datetime` object ``d``, ``d == datetime.combine(d.date(), d.time(), d.tzinfo)``. .. versionchanged:: 3.6 @@ -1013,8 +1044,12 @@ Other constructors, all class methods: 1. Time zone offsets may have fractional seconds. 2. The ``T`` separator may be replaced by any single unicode character. - 3. Ordinal dates are not currently supported. - 4. Fractional hours and minutes are not supported. + 3. Fractional hours and minutes are not supported. + 4. Reduced precision dates are not currently supported (``YYYY-MM``, + ``YYYY``). + 5. Extended date representations are not currently supported + (``±YYYYYY-MM-DD``). + 6. Ordinal dates are not currently supported (``YYYY-OOO``). Examples:: @@ -1042,7 +1077,7 @@ Other constructors, all class methods: .. versionadded:: 3.7 .. versionchanged:: 3.11 Previously, this method only supported formats that could be emitted by - :meth:`date.isoformat()` or :meth:`datetime.isoformat()`. + :meth:`date.isoformat` or :meth:`datetime.isoformat`. .. classmethod:: datetime.fromisocalendar(year, week, day) @@ -1059,7 +1094,7 @@ Other constructors, all class methods: Return a :class:`.datetime` corresponding to *date_string*, parsed according to *format*. - If *format* does not contain microseconds or timezone information, this is equivalent to:: + If *format* does not contain microseconds or time zone information, this is equivalent to:: datetime(*(time.strptime(date_string, format)[0:6])) @@ -1068,6 +1103,24 @@ Other constructors, all class methods: time tuple. See also :ref:`strftime-strptime-behavior` and :meth:`datetime.fromisoformat`. + .. versionchanged:: 3.13 + + If *format* specifies a day of month without a year a + :exc:`DeprecationWarning` is now emitted. This is to avoid a quadrennial + leap year bug in code seeking to parse only a month and day as the + default year used in absence of one in the format is not a leap year. + Such *format* values may raise an error as of Python 3.15. The + workaround is to always include a year in your *format*. If parsing + *date_string* values that do not have a year, explicitly add a year that + is a leap year before parsing: + + .. doctest:: + + >>> from datetime import datetime + >>> date_string = "02/29" + >>> when = datetime.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug. + >>> when.strftime("%B %d") # doctest: +SKIP + 'February 29' Class attributes: @@ -1138,8 +1191,8 @@ Instance attributes (read-only): In ``[0, 1]``. Used to disambiguate wall times during a repeated interval. (A repeated interval occurs when clocks are rolled back at the end of daylight saving time or when the UTC offset for the current zone is decreased for political reasons.) - The value 0 (1) represents the earlier (later) of the two moments with the same wall - time representation. + The values 0 and 1 represent, respectively, the earlier and later of the two + moments with the same wall time representation. .. versionadded:: 3.6 @@ -1154,21 +1207,26 @@ Supported operations: +---------------------------------------+--------------------------------+ | ``timedelta = datetime1 - datetime2`` | \(3) | +---------------------------------------+--------------------------------+ -| ``datetime1 < datetime2`` | Compares :class:`.datetime` to | -| | :class:`.datetime`. (4) | +| | ``datetime1 == datetime2`` | Equality comparison. (4) | +| | ``datetime1 != datetime2`` | | ++---------------------------------------+--------------------------------+ +| | ``datetime1 < datetime2`` | Order comparison. (5) | +| | ``datetime1 > datetime2`` | | +| | ``datetime1 <= datetime2`` | | +| | ``datetime1 >= datetime2`` | | +---------------------------------------+--------------------------------+ (1) - datetime2 is a duration of timedelta removed from datetime1, moving forward in - time if ``timedelta.days`` > 0, or backward if ``timedelta.days`` < 0. The + ``datetime2`` is a duration of ``timedelta`` removed from ``datetime1``, moving forward in + time if ``timedelta.days > 0``, or backward if ``timedelta.days < 0``. The result has the same :attr:`~.datetime.tzinfo` attribute as the input datetime, and - datetime2 - datetime1 == timedelta after. :exc:`OverflowError` is raised if - datetime2.year would be smaller than :const:`MINYEAR` or larger than + ``datetime2 - datetime1 == timedelta`` after. :exc:`OverflowError` is raised if + ``datetime2.year`` would be smaller than :const:`MINYEAR` or larger than :const:`MAXYEAR`. Note that no time zone adjustments are done even if the input is an aware object. (2) - Computes the datetime2 such that datetime2 + timedelta == datetime1. As for + Computes the ``datetime2`` such that ``datetime2 + timedelta == datetime1``. As for addition, the result has the same :attr:`~.datetime.tzinfo` attribute as the input datetime, and no time zone adjustments are done even if the input is aware. @@ -1179,43 +1237,54 @@ Supported operations: If both are naive, or both are aware and have the same :attr:`~.datetime.tzinfo` attribute, the :attr:`~.datetime.tzinfo` attributes are ignored, and the result is a :class:`timedelta` - object *t* such that ``datetime2 + t == datetime1``. No time zone adjustments + object ``t`` such that ``datetime2 + t == datetime1``. No time zone adjustments are done in this case. If both are aware and have different :attr:`~.datetime.tzinfo` attributes, ``a-b`` acts - as if *a* and *b* were first converted to naive UTC datetimes first. The + as if ``a`` and ``b`` were first converted to naive UTC datetimes. The result is ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`` except that the implementation never overflows. (4) - *datetime1* is considered less than *datetime2* when *datetime1* precedes - *datetime2* in time. + :class:`.datetime` objects are equal if they represent the same date + and time, taking into account the time zone. - If one comparand is naive and the other is aware, :exc:`TypeError` - is raised if an order comparison is attempted. For equality - comparisons, naive instances are never equal to aware instances. + Naive and aware :class:`!datetime` objects are never equal. - If both comparands are aware, and have the same :attr:`~.datetime.tzinfo` attribute, the - common :attr:`~.datetime.tzinfo` attribute is ignored and the base datetimes are - compared. If both comparands are aware and have different :attr:`~.datetime.tzinfo` - attributes, the comparands are first adjusted by subtracting their UTC - offsets (obtained from ``self.utcoffset()``). + If both comparands are aware, and have the same :attr:`!tzinfo` attribute, + the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and + the base datetimes are compared. + If both comparands are aware and have different :attr:`~.datetime.tzinfo` + attributes, the comparison acts as comparands were first converted to UTC + datetimes except that the implementation never overflows. + :class:`!datetime` instances in a repeated interval are never equal to + :class:`!datetime` instances in other time zone. - .. versionchanged:: 3.3 - Equality comparisons between aware and naive :class:`.datetime` - instances don't raise :exc:`TypeError`. +(5) + *datetime1* is considered less than *datetime2* when *datetime1* precedes + *datetime2* in time, taking into account the time zone. - .. note:: + Order comparison between naive and aware :class:`.datetime` objects + raises :exc:`TypeError`. + + If both comparands are aware, and have the same :attr:`!tzinfo` attribute, + the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and + the base datetimes are compared. + If both comparands are aware and have different :attr:`~.datetime.tzinfo` + attributes, the comparison acts as comparands were first converted to UTC + datetimes except that the implementation never overflows. - In order to stop comparison from falling back to the default scheme of comparing - object addresses, datetime comparison normally raises :exc:`TypeError` if the - other comparand isn't also a :class:`.datetime` object. However, - ``NotImplemented`` is returned instead if the other comparand has a - :meth:`timetuple` attribute. This hook gives other kinds of date objects a - chance at implementing mixed-type comparison. If not, when a :class:`.datetime` - object is compared to an object of a different type, :exc:`TypeError` is raised - unless the comparison is ``==`` or ``!=``. The latter cases return - :const:`False` or :const:`True`, respectively. +.. versionchanged:: 3.3 + Equality comparisons between aware and naive :class:`.datetime` + instances don't raise :exc:`TypeError`. + +.. versionchanged:: 3.13 + Comparison between :class:`.datetime` object and an instance of + the :class:`date` subclass that is not a :class:`!datetime` subclass + no longer converts the latter to :class:`!date`, ignoring the time part + and the time zone. + The default behavior can be changed by overriding the special comparison + methods in subclasses. Instance methods: @@ -1251,8 +1320,11 @@ Instance methods: ``tzinfo=None`` can be specified to create a naive datetime from an aware datetime with no conversion of date and time data. - .. versionadded:: 3.6 - Added the ``fold`` argument. + :class:`.datetime` objects are also supported by generic function + :func:`copy.replace`. + + .. versionchanged:: 3.6 + Added the *fold* parameter. .. method:: datetime.astimezone(tz=None) @@ -1263,22 +1335,22 @@ Instance methods: If provided, *tz* must be an instance of a :class:`tzinfo` subclass, and its :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. If *self* - is naive, it is presumed to represent time in the system timezone. + is naive, it is presumed to represent time in the system time zone. If called without arguments (or with ``tz=None``) the system local - timezone is assumed for the target timezone. The ``.tzinfo`` attribute of the converted + time zone is assumed for the target time zone. The ``.tzinfo`` attribute of the converted datetime instance will be set to an instance of :class:`timezone` with the zone name and offset obtained from the OS. If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no adjustment of date or time data is performed. Else the result is local - time in the timezone *tz*, representing the same UTC time as *self*: after + time in the time zone *tz*, representing the same UTC time as *self*: after ``astz = dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will have the same date and time data as ``dt - dt.utcoffset()``. - If you merely want to attach a time zone object *tz* to a datetime *dt* without + If you merely want to attach a :class:`timezone` object *tz* to a datetime *dt* without adjustment of date and time data, use ``dt.replace(tzinfo=tz)``. If you - merely want to remove the time zone object from an aware datetime *dt* without + merely want to remove the :class:`!timezone` object from an aware datetime *dt* without conversion of date and time data, use ``dt.replace(tzinfo=None)``. Note that the default :meth:`tzinfo.fromutc` method can be overridden in a @@ -1288,7 +1360,7 @@ Instance methods: def astimezone(self, tz): if self.tzinfo is tz: return self - # Convert self to UTC, and attach the new time zone object. + # Convert self to UTC, and attach the new timezone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc) @@ -1339,24 +1411,24 @@ Instance methods: d.weekday(), yday, dst)) where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` - is the day number within the current year starting with ``1`` for January - 1st. The :attr:`tm_isdst` flag of the result is set according to the + is the day number within the current year starting with 1 for January + 1st. The :attr:`~time.struct_time.tm_isdst` flag of the result is set according to the :meth:`dst` method: :attr:`.tzinfo` is ``None`` or :meth:`dst` returns - ``None``, :attr:`tm_isdst` is set to ``-1``; else if :meth:`dst` returns a - non-zero value, :attr:`tm_isdst` is set to ``1``; else :attr:`tm_isdst` is - set to ``0``. + ``None``, :attr:`!tm_isdst` is set to ``-1``; else if :meth:`dst` returns a + non-zero value, :attr:`!tm_isdst` is set to 1; else :attr:`!tm_isdst` is + set to 0. .. method:: datetime.utctimetuple() - If :class:`.datetime` instance *d* is naive, this is the same as - ``d.timetuple()`` except that :attr:`tm_isdst` is forced to 0 regardless of what + If :class:`.datetime` instance ``d`` is naive, this is the same as + ``d.timetuple()`` except that :attr:`~.time.struct_time.tm_isdst` is forced to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a UTC time. - If *d* is aware, *d* is normalized to UTC time, by subtracting + If ``d`` is aware, ``d`` is normalized to UTC time, by subtracting ``d.utcoffset()``, and a :class:`time.struct_time` for the - normalized time is returned. :attr:`tm_isdst` is forced to 0. Note - that an :exc:`OverflowError` may be raised if *d*.year was + normalized time is returned. :attr:`!tm_isdst` is forced to 0. Note + that an :exc:`OverflowError` may be raised if ``d.year`` was ``MINYEAR`` or ``MAXYEAR`` and UTC adjustment spills over a year boundary. @@ -1402,7 +1474,7 @@ Instance methods: There is no method to obtain the POSIX timestamp directly from a naive :class:`.datetime` instance representing UTC time. If your - application uses this convention and your system timezone is not + application uses this convention and your system time zone is not set to UTC, you can obtain the POSIX timestamp by supplying ``tzinfo=timezone.utc``:: @@ -1495,13 +1567,13 @@ Instance methods: >>> dt.isoformat(timespec='microseconds') '2015-01-01T12:30:59.000000' - .. versionadded:: 3.6 - Added the *timespec* argument. + .. versionchanged:: 3.6 + Added the *timespec* parameter. .. method:: datetime.__str__() - For a :class:`.datetime` instance *d*, ``str(d)`` is equivalent to + For a :class:`.datetime` instance ``d``, ``str(d)`` is equivalent to ``d.isoformat(' ')``. @@ -1543,7 +1615,7 @@ Instance methods: Examples of Usage: :class:`.datetime` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Examples of working with :class:`~datetime.datetime` objects: +Examples of working with :class:`.datetime` objects: .. doctest:: @@ -1671,7 +1743,7 @@ Usage of ``KabulTz`` from above:: :class:`.time` Objects ---------------------- -A :class:`time` object represents a (local) time of day, independent of any particular +A :class:`.time` object represents a (local) time of day, independent of any particular day, and subject to adjustment via a :class:`tzinfo` object. .. class:: time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) @@ -1687,7 +1759,7 @@ day, and subject to adjustment via a :class:`tzinfo` object. * ``fold in [0, 1]``. If an argument outside those ranges is given, :exc:`ValueError` is raised. All - default to ``0`` except *tzinfo*, which defaults to :const:`None`. + default to 0 except *tzinfo*, which defaults to ``None``. Class attributes: @@ -1742,29 +1814,26 @@ Instance attributes (read-only): In ``[0, 1]``. Used to disambiguate wall times during a repeated interval. (A repeated interval occurs when clocks are rolled back at the end of daylight saving time or when the UTC offset for the current zone is decreased for political reasons.) - The value 0 (1) represents the earlier (later) of the two moments with the same wall - time representation. + The values 0 and 1 represent, respectively, the earlier and later of the two + moments with the same wall time representation. .. versionadded:: 3.6 -:class:`.time` objects support comparison of :class:`.time` to :class:`.time`, -where *a* is considered less -than *b* when *a* precedes *b* in time. If one comparand is naive and the other -is aware, :exc:`TypeError` is raised if an order comparison is attempted. For equality -comparisons, naive instances are never equal to aware instances. +:class:`.time` objects support equality and order comparisons, +where ``a`` is considered less than ``b`` when ``a`` precedes ``b`` in time. + +Naive and aware :class:`!time` objects are never equal. +Order comparison between naive and aware :class:`!time` objects raises +:exc:`TypeError`. -If both comparands are aware, and have -the same :attr:`~time.tzinfo` attribute, the common :attr:`~time.tzinfo` attribute is +If both comparands are aware, and have the same :attr:`~.time.tzinfo` +attribute, the :attr:`!tzinfo` and :attr:`!fold` attributes are ignored and the base times are compared. If both comparands are aware and -have different :attr:`~time.tzinfo` attributes, the comparands are first adjusted by -subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order -to stop mixed-type comparisons from falling back to the default comparison by -object address, when a :class:`.time` object is compared to an object of a -different type, :exc:`TypeError` is raised unless the comparison is ``==`` or -``!=``. The latter cases return :const:`False` or :const:`True`, respectively. +have different :attr:`!tzinfo` attributes, the comparands are first adjusted by +subtracting their UTC offsets (obtained from ``self.utcoffset()``). .. versionchanged:: 3.3 - Equality comparisons between aware and naive :class:`~datetime.time` instances + Equality comparisons between aware and naive :class:`.time` instances don't raise :exc:`TypeError`. In Boolean contexts, a :class:`.time` object is always considered to be true. @@ -1790,7 +1859,9 @@ Other constructor: be truncated). 4. Fractional hours and minutes are not supported. - Examples:: + Examples: + + .. doctest:: >>> from datetime import time >>> time.fromisoformat('04:23:01') @@ -1801,7 +1872,7 @@ Other constructor: datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) - >>> time.fromisoformat('04:23:01,000') + >>> time.fromisoformat('04:23:01,000384') datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) @@ -1814,7 +1885,7 @@ Other constructor: .. versionadded:: 3.7 .. versionchanged:: 3.11 Previously, this method only supported formats that could be emitted by - :meth:`time.isoformat()`. + :meth:`time.isoformat`. Instance methods: @@ -1827,8 +1898,11 @@ Instance methods: ``tzinfo=None`` can be specified to create a naive :class:`.time` from an aware :class:`.time`, without conversion of the time data. - .. versionadded:: 3.6 - Added the ``fold`` argument. + :class:`.time` objects are also supported by generic function + :func:`copy.replace`. + + .. versionchanged:: 3.6 + Added the *fold* parameter. .. method:: time.isoformat(timespec='auto') @@ -1871,13 +1945,13 @@ Instance methods: >>> dt.isoformat(timespec='auto') '12:34:56' - .. versionadded:: 3.6 - Added the *timespec* argument. + .. versionchanged:: 3.6 + Added the *timespec* parameter. .. method:: time.__str__() - For a time *t*, ``str(t)`` is equivalent to ``t.isoformat()``. + For a time ``t``, ``str(t)`` is equivalent to ``t.isoformat()``. .. method:: time.strftime(format) @@ -1969,19 +2043,20 @@ Examples of working with a :class:`.time` object:: You need to derive a concrete subclass, and (at least) supply implementations of the standard :class:`tzinfo` methods needed by the - :class:`.datetime` methods you use. The :mod:`datetime` module provides + :class:`.datetime` methods you use. The :mod:`!datetime` module provides :class:`timezone`, a simple concrete subclass of :class:`tzinfo` which can - represent timezones with fixed offset from UTC such as UTC itself or North + represent time zones with fixed offset from UTC such as UTC itself or North American EST and EDT. Special requirement for pickling: A :class:`tzinfo` subclass must have an - :meth:`__init__` method that can be called with no arguments, otherwise it can be + :meth:`~object.__init__` method that can be called with no arguments, + otherwise it can be pickled but possibly not unpickled again. This is a technical requirement that may be relaxed in the future. A concrete subclass of :class:`tzinfo` may need to implement the following methods. Exactly which methods are needed depends on the uses made of aware - :mod:`datetime` objects. If in doubt, simply implement all of them. + :mod:`!datetime` objects. If in doubt, simply implement all of them. .. method:: tzinfo.utcoffset(dt) @@ -2022,7 +2097,7 @@ Examples of working with a :class:`.time` object:: already been added to the UTC offset returned by :meth:`utcoffset`, so there's no need to consult :meth:`dst` unless you're interested in obtaining DST info separately. For example, :meth:`datetime.timetuple` calls its :attr:`~.datetime.tzinfo` - attribute's :meth:`dst` method to determine how the :attr:`tm_isdst` flag + attribute's :meth:`dst` method to determine how the :attr:`~time.struct_time.tm_isdst` flag should be set, and :meth:`tzinfo.fromutc` calls :meth:`dst` to account for DST changes when crossing time zones. @@ -2032,13 +2107,13 @@ Examples of working with a :class:`.time` object:: ``tz.utcoffset(dt) - tz.dst(dt)`` must return the same result for every :class:`.datetime` *dt* with ``dt.tzinfo == - tz`` For sane :class:`tzinfo` subclasses, this expression yields the time + tz``. For sane :class:`tzinfo` subclasses, this expression yields the time zone's "standard offset", which should not depend on the date or the time, but only on geographic location. The implementation of :meth:`datetime.astimezone` relies on this, but cannot detect violations; it's the programmer's responsibility to ensure it. If a :class:`tzinfo` subclass cannot guarantee this, it may be able to override the default implementation of - :meth:`tzinfo.fromutc` to work correctly with :meth:`astimezone` regardless. + :meth:`tzinfo.fromutc` to work correctly with :meth:`~.datetime.astimezone` regardless. Most implementations of :meth:`dst` will probably look like one of these two:: @@ -2067,9 +2142,9 @@ Examples of working with a :class:`.time` object:: .. method:: tzinfo.tzname(dt) Return the time zone name corresponding to the :class:`.datetime` object *dt*, as - a string. Nothing about string names is defined by the :mod:`datetime` module, + a string. Nothing about string names is defined by the :mod:`!datetime` module, and there's no requirement that it mean anything in particular. For example, - "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all + ``"GMT"``, ``"UTC"``, ``"-500"``, ``"-5:00"``, ``"EDT"``, ``"US/Eastern"``, ``"America/New York"`` are all valid replies. Return ``None`` if a string name isn't known. Note that this is a method rather than a fixed string primarily because some :class:`tzinfo` subclasses will wish to return different names depending on the specific value @@ -2095,14 +2170,14 @@ When a :class:`.datetime` object is passed in response to a :class:`.datetime` method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can rely on this, unless user code calls :class:`tzinfo` methods directly. The intent is that the :class:`tzinfo` methods interpret *dt* as being in local -time, and not need worry about objects in other timezones. +time, and not need worry about objects in other time zones. There is one more :class:`tzinfo` method that a subclass may wish to override: .. method:: tzinfo.fromutc(dt) - This is called from the default :class:`datetime.astimezone()` + This is called from the default :meth:`datetime.astimezone` implementation. When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time data are to be viewed as expressing a UTC time. The purpose of :meth:`fromutc` is to adjust the date and time data, returning an @@ -2115,7 +2190,7 @@ There is one more :class:`tzinfo` method that a subclass may wish to override: different years. An example of a time zone the default :meth:`fromutc` implementation may not handle correctly in all cases is one where the standard offset (from UTC) depends on the specific date and time passed, which can happen - for political reasons. The default implementations of :meth:`astimezone` and + for political reasons. The default implementations of :meth:`~.datetime.astimezone` and :meth:`fromutc` may not produce the result you want if the result is one of the hours straddling the moment the standard offset changes. @@ -2181,10 +2256,10 @@ hour that can't be spelled unambiguously in local wall time: the last hour of daylight time. In Eastern, that's times of the form 5:MM UTC on the day daylight time ends. The local wall clock leaps from 1:59 (daylight time) back to 1:00 (standard time) again. Local times of the form 1:MM are ambiguous. -:meth:`astimezone` mimics the local clock's behavior by mapping two adjacent UTC +:meth:`~.datetime.astimezone` mimics the local clock's behavior by mapping two adjacent UTC hours into the same local hour then. In the Eastern example, UTC times of the form 5:MM and 6:MM both map to 1:MM when converted to Eastern, but earlier times -have the :attr:`~datetime.fold` attribute set to 0 and the later times have it set to 1. +have the :attr:`~.datetime.fold` attribute set to 0 and the later times have it set to 1. For example, at the Fall back transition of 2016, we get:: >>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc) @@ -2199,10 +2274,10 @@ For example, at the Fall back transition of 2016, we get:: 07:00:00 UTC = 02:00:00 EST 0 Note that the :class:`.datetime` instances that differ only by the value of the -:attr:`~datetime.fold` attribute are considered equal in comparisons. +:attr:`~.datetime.fold` attribute are considered equal in comparisons. Applications that can't bear wall-time ambiguities should explicitly check the -value of the :attr:`~datetime.fold` attribute or avoid using hybrid +value of the :attr:`~.datetime.fold` attribute or avoid using hybrid :class:`tzinfo` subclasses; there are no ambiguities when using :class:`timezone`, or any other fixed-offset :class:`tzinfo` subclass (such as a class representing only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). @@ -2210,14 +2285,14 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). .. seealso:: :mod:`zoneinfo` - The :mod:`datetime` module has a basic :class:`timezone` class (for + The :mod:`!datetime` module has a basic :class:`timezone` class (for handling arbitrary fixed offsets from UTC) and its :attr:`timezone.utc` - attribute (a UTC timezone instance). + attribute (a UTC :class:`!timezone` instance). - ``zoneinfo`` brings the *IANA timezone database* (also known as the Olson + ``zoneinfo`` brings the *IANA time zone database* (also known as the Olson database) to Python, and its usage is recommended. - `IANA timezone database `_ + `IANA time zone database `_ The Time Zone Database (often called tz, tzdata or zoneinfo) contains code and data that represent the history of local time for many representative locations around the globe. It is updated periodically to reflect changes @@ -2228,13 +2303,13 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). .. _datetime-timezone: :class:`timezone` Objects --------------------------- +------------------------- The :class:`timezone` class is a subclass of :class:`tzinfo`, each -instance of which represents a timezone defined by a fixed offset from +instance of which represents a time zone defined by a fixed offset from UTC. -Objects of this class cannot be used to represent timezone information in the +Objects of this class cannot be used to represent time zone information in the locations where different offsets are used in different days of the year or where historical changes have been made to civil time. @@ -2295,7 +2370,7 @@ Class attributes: .. attribute:: timezone.utc - The UTC timezone, ``timezone(timedelta(0))``. + The UTC time zone, ``timezone(timedelta(0))``. .. index:: @@ -2303,8 +2378,8 @@ Class attributes: .. _strftime-strptime-behavior: -:meth:`strftime` and :meth:`strptime` Behavior ----------------------------------------------- +:meth:`~.datetime.strftime` and :meth:`~.datetime.strptime` Behavior +-------------------------------------------------------------------- :class:`date`, :class:`.datetime`, and :class:`.time` objects all support a ``strftime(format)`` method, to create a string representing the time under the @@ -2314,8 +2389,8 @@ Conversely, the :meth:`datetime.strptime` class method creates a :class:`.datetime` object from a string representing a date and time and a corresponding format string. -The table below provides a high-level comparison of :meth:`strftime` -versus :meth:`strptime`: +The table below provides a high-level comparison of :meth:`~.datetime.strftime` +versus :meth:`~.datetime.strptime`: +----------------+--------------------------------------------------------+------------------------------------------------------------------------------+ | | ``strftime`` | ``strptime`` | @@ -2332,8 +2407,8 @@ versus :meth:`strptime`: .. _format-codes: -:meth:`strftime` and :meth:`strptime` Format Codes -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:meth:`~.datetime.strftime` and :meth:`~.datetime.strptime` Format Codes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ These methods accept format codes that can be used to parse and format dates:: @@ -2472,13 +2547,13 @@ convenience. These parameters all correspond to ISO 8601 date values. | | naive). | -03:07:12.345216 | | +-----------+--------------------------------+------------------------+-------+ -These may not be available on all platforms when used with the :meth:`strftime` +These may not be available on all platforms when used with the :meth:`~.datetime.strftime` method. The ISO 8601 year and ISO 8601 week directives are not interchangeable -with the year and week number directives above. Calling :meth:`strptime` with +with the year and week number directives above. Calling :meth:`~.datetime.strptime` with incomplete or ambiguous ISO 8601 directives will raise a :exc:`ValueError`. The full set of format codes supported varies across platforms, because Python -calls the platform C library's :func:`strftime` function, and platform +calls the platform C library's :c:func:`strftime` function, and platform variations are common. To see the full set of format codes supported on your platform, consult the :manpage:`strftime(3)` documentation. There are also differences between platforms in handling of unsupported format specifiers. @@ -2494,9 +2569,9 @@ Technical Detail Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` although not all objects support a -:meth:`timetuple` method. +:meth:`~date.timetuple` method. -For the :meth:`datetime.strptime` class method, the default value is +For the :meth:`.datetime.strptime` class method, the default value is ``1900-01-01T00:00:00.000``: any components not specified in the format string will be pulled from the default value. [#]_ @@ -2504,17 +2579,17 @@ Using ``datetime.strptime(date_string, format)`` is equivalent to:: datetime(*(time.strptime(date_string, format)[0:6])) -except when the format includes sub-second components or timezone offset +except when the format includes sub-second components or time zone offset information, which are supported in ``datetime.strptime`` but are discarded by ``time.strptime``. For :class:`.time` objects, the format codes for year, month, and day should not -be used, as :class:`time` objects have no such values. If they're used anyway, -``1900`` is substituted for the year, and ``1`` for the month and day. +be used, as :class:`!time` objects have no such values. If they're used anyway, +1900 is substituted for the year, and 1 for the month and day. For :class:`date` objects, the format codes for hours, minutes, seconds, and microseconds should not be used, as :class:`date` objects have no such -values. If they're used anyway, ``0`` is substituted for them. +values. If they're used anyway, 0 is substituted for them. For the same reason, handling of format strings containing Unicode code points that can't be represented in the charset of the current locale is also @@ -2531,27 +2606,27 @@ Notes: contain non-ASCII characters. (2) - The :meth:`strptime` method can parse years in the full [1, 9999] range, but + The :meth:`~.datetime.strptime` method can parse years in the full [1, 9999] range, but years < 1000 must be zero-filled to 4-digit width. .. versionchanged:: 3.2 - In previous versions, :meth:`strftime` method was restricted to + In previous versions, :meth:`~.datetime.strftime` method was restricted to years >= 1900. .. versionchanged:: 3.3 - In version 3.2, :meth:`strftime` method was restricted to + In version 3.2, :meth:`~.datetime.strftime` method was restricted to years >= 1000. (3) - When used with the :meth:`strptime` method, the ``%p`` directive only affects + When used with the :meth:`~.datetime.strptime` method, the ``%p`` directive only affects the output hour field if the ``%I`` directive is used to parse the hour. (4) - Unlike the :mod:`time` module, the :mod:`datetime` module does not support + Unlike the :mod:`time` module, the :mod:`!datetime` module does not support leap seconds. (5) - When used with the :meth:`strptime` method, the ``%f`` directive + When used with the :meth:`~.datetime.strptime` method, the ``%f`` directive accepts from one to six digits and zero pads on the right. ``%f`` is an extension to the set of format characters in the C standard (but implemented separately in datetime objects, and therefore always @@ -2564,7 +2639,7 @@ Notes: For an aware object: ``%z`` - :meth:`utcoffset` is transformed into a string of the form + :meth:`~.datetime.utcoffset` is transformed into a string of the form ``±HHMM[SS[.ffffff]]``, where ``HH`` is a 2-digit string giving the number of UTC offset hours, ``MM`` is a 2-digit string giving the number of UTC offset minutes, ``SS`` is a 2-digit string giving the number of UTC offset @@ -2572,14 +2647,14 @@ Notes: offset microseconds. The ``ffffff`` part is omitted when the offset is a whole number of seconds and both the ``ffffff`` and the ``SS`` part is omitted when the offset is a whole number of minutes. For example, if - :meth:`utcoffset` returns ``timedelta(hours=-3, minutes=-30)``, ``%z`` is + :meth:`~.datetime.utcoffset` returns ``timedelta(hours=-3, minutes=-30)``, ``%z`` is replaced with the string ``'-0330'``. .. versionchanged:: 3.7 The UTC offset is not restricted to a whole number of minutes. .. versionchanged:: 3.7 - When the ``%z`` directive is provided to the :meth:`strptime` method, + When the ``%z`` directive is provided to the :meth:`~.datetime.strptime` method, the UTC offsets can have a colon as a separator between hours, minutes and seconds. For example, ``'+01:00:00'`` will be parsed as an offset of one hour. @@ -2590,11 +2665,11 @@ Notes: hours, minutes and seconds. ``%Z`` - In :meth:`strftime`, ``%Z`` is replaced by an empty string if - :meth:`tzname` returns ``None``; otherwise ``%Z`` is replaced by the + In :meth:`~.datetime.strftime`, ``%Z`` is replaced by an empty string if + :meth:`~.datetime.tzname` returns ``None``; otherwise ``%Z`` is replaced by the returned value, which must be a string. - :meth:`strptime` only accepts certain values for ``%Z``: + :meth:`~.datetime.strptime` only accepts certain values for ``%Z``: 1. any value in ``time.tzname`` for your machine's locale 2. the hard-coded values ``UTC`` and ``GMT`` @@ -2604,26 +2679,45 @@ Notes: invalid values. .. versionchanged:: 3.2 - When the ``%z`` directive is provided to the :meth:`strptime` method, an + When the ``%z`` directive is provided to the :meth:`~.datetime.strptime` method, an aware :class:`.datetime` object will be produced. The ``tzinfo`` of the result will be set to a :class:`timezone` instance. (7) - When used with the :meth:`strptime` method, ``%U`` and ``%W`` are only used + When used with the :meth:`~.datetime.strptime` method, ``%U`` and ``%W`` are only used in calculations when the day of the week and the calendar year (``%Y``) are specified. (8) Similar to ``%U`` and ``%W``, ``%V`` is only used in calculations when the day of the week and the ISO year (``%G``) are specified in a - :meth:`strptime` format string. Also note that ``%G`` and ``%Y`` are not + :meth:`~.datetime.strptime` format string. Also note that ``%G`` and ``%Y`` are not interchangeable. (9) - When used with the :meth:`strptime` method, the leading zero is optional + When used with the :meth:`~.datetime.strptime` method, the leading zero is optional for formats ``%d``, ``%m``, ``%H``, ``%I``, ``%M``, ``%S``, ``%j``, ``%U``, ``%W``, and ``%V``. Format ``%y`` does require a leading zero. +(10) + When parsing a month and day using :meth:`~.datetime.strptime`, always + include a year in the format. If the value you need to parse lacks a year, + append an explicit dummy leap year. Otherwise your code will raise an + exception when it encounters leap day because the default year used by the + parser is not a leap year. Users run into this bug every four years... + + .. doctest:: + + >>> month_day = "02/29" + >>> datetime.strptime(f"{month_day};1984", "%m/%d;%Y") # No leap year bug. + datetime.datetime(1984, 2, 29, 0, 0) + + .. deprecated-removed:: 3.13 3.15 + :meth:`~.datetime.strptime` calls using a format string containing + a day of month without a year now emit a + :exc:`DeprecationWarning`. In 3.15 or later we may change this into + an error or change the default year to a leap year. See :gh:`70647`. + .. rubric:: Footnotes .. [#] If, that is, we ignore the effects of Relativity @@ -2638,4 +2732,4 @@ Notes: `_ for a good explanation. -.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since ``1900`` is not a leap year. +.. [#] Passing ``datetime.strptime('Feb 29', '%b %d')`` will fail since 1900 is not a leap year. diff --git a/Doc/library/dbm.rst b/Doc/library/dbm.rst index 2be49933..6c659ea5 100644 --- a/Doc/library/dbm.rst +++ b/Doc/library/dbm.rst @@ -1,5 +1,5 @@ -:mod:`dbm` --- Interfaces to Unix "databases" -============================================= +:mod:`!dbm` --- Interfaces to Unix "databases" +============================================== .. module:: dbm :synopsis: Interfaces to various Unix "database" formats. @@ -8,13 +8,17 @@ -------------- -:mod:`dbm` is a generic interface to variants of the DBM database --- -:mod:`dbm.gnu` or :mod:`dbm.ndbm`. If none of these modules is installed, the +:mod:`dbm` is a generic interface to variants of the DBM database: + +* :mod:`dbm.sqlite3` +* :mod:`dbm.gnu` +* :mod:`dbm.ndbm` + +If none of these modules are installed, the slow-but-simple implementation in module :mod:`dbm.dumb` will be used. There is a `third party interface `_ to the Oracle Berkeley DB. - .. exception:: error A tuple containing the exceptions that can be raised by each of the supported @@ -25,73 +29,84 @@ the Oracle Berkeley DB. .. function:: whichdb(filename) This function attempts to guess which of the several simple database modules - available --- :mod:`dbm.gnu`, :mod:`dbm.ndbm` or :mod:`dbm.dumb` --- should - be used to open a given file. + available --- :mod:`dbm.sqlite3`, :mod:`dbm.gnu`, :mod:`dbm.ndbm`, + or :mod:`dbm.dumb` --- should be used to open a given file. - Returns one of the following values: ``None`` if the file can't be opened - because it's unreadable or doesn't exist; the empty string (``''``) if the - file's format can't be guessed; or a string containing the required module - name, such as ``'dbm.ndbm'`` or ``'dbm.gnu'``. + Return one of the following values: -.. versionchanged:: 3.11 - Accepts :term:`path-like object` for filename. + * ``None`` if the file can't be opened because it's unreadable or doesn't exist + * the empty string (``''``) if the file's format can't be guessed + * a string containing the required module name, such as ``'dbm.ndbm'`` or ``'dbm.gnu'`` -.. function:: open(file, flag='r', mode=0o666) + .. versionchanged:: 3.11 + *filename* accepts a :term:`path-like object`. - Open the database file *file* and return a corresponding object. +.. Substitutions for the open() flag param docs; + all submodules use the same text. - If the database file already exists, the :func:`whichdb` function is used to - determine its type and the appropriate module is used; if it does not exist, - the first module listed above that can be imported is used. +.. |flag_r| replace:: + Open existing database for reading only. - The optional *flag* argument can be: +.. |flag_w| replace:: + Open existing database for reading and writing. - +---------+-------------------------------------------+ - | Value | Meaning | - +=========+===========================================+ - | ``'r'`` | Open existing database for reading only | - | | (default) | - +---------+-------------------------------------------+ - | ``'w'`` | Open existing database for reading and | - | | writing | - +---------+-------------------------------------------+ - | ``'c'`` | Open database for reading and writing, | - | | creating it if it doesn't exist | - +---------+-------------------------------------------+ - | ``'n'`` | Always create a new, empty database, open | - | | for reading and writing | - +---------+-------------------------------------------+ +.. |flag_c| replace:: + Open database for reading and writing, creating it if it doesn't exist. - The optional *mode* argument is the Unix mode of the file, used only when the - database has to be created. It defaults to octal ``0o666`` (and will be - modified by the prevailing umask). +.. |flag_n| replace:: + Always create a new, empty database, open for reading and writing. +.. |mode_param_doc| replace:: + The Unix file access mode of the file (default: octal ``0o666``), + used only when the database has to be created. -The object returned by :func:`.open` supports the same basic functionality as -dictionaries; keys and their corresponding values can be stored, retrieved, and -deleted, and the :keyword:`in` operator and the :meth:`keys` method are -available, as well as :meth:`get` and :meth:`setdefault`. +.. function:: open(file, flag='r', mode=0o666) -.. versionchanged:: 3.2 - :meth:`get` and :meth:`setdefault` are now available in all database modules. + Open a database and return the corresponding database object. -.. versionchanged:: 3.8 - Deleting a key from a read-only database raises database module specific error - instead of :exc:`KeyError`. + :param file: + The database file to open. + + If the database file already exists, the :func:`whichdb` function is used to + determine its type and the appropriate module is used; if it does not exist, + the first submodule listed above that can be imported is used. + :type file: :term:`path-like object` + + :param str flag: + * ``'r'`` (default): |flag_r| + * ``'w'``: |flag_w| + * ``'c'``: |flag_c| + * ``'n'``: |flag_n| + + :param int mode: + |mode_param_doc| -.. versionchanged:: 3.11 - Accepts :term:`path-like object` for file. + .. versionchanged:: 3.11 + *file* accepts a :term:`path-like object`. + +The object returned by :func:`~dbm.open` supports the same basic functionality as a +:class:`dict`; keys and their corresponding values can be stored, retrieved, and +deleted, and the :keyword:`in` operator and the :meth:`!keys` method are +available, as well as :meth:`!get` and :meth:`!setdefault` methods. -Key and values are always stored as bytes. This means that when +Key and values are always stored as :class:`bytes`. This means that when strings are used they are implicitly converted to the default encoding before being stored. These objects also support being used in a :keyword:`with` statement, which will automatically close them when done. +.. versionchanged:: 3.2 + :meth:`!get` and :meth:`!setdefault` methods are now available for all + :mod:`dbm` backends. + .. versionchanged:: 3.4 Added native support for the context management protocol to the objects - returned by :func:`.open`. + returned by :func:`~dbm.open`. + +.. versionchanged:: 3.8 + Deleting a key from a read-only database raises a database module specific exception + instead of :exc:`KeyError`. The following example records some hostnames and a corresponding title, and then prints out the contents of the database:: @@ -129,28 +144,70 @@ then prints out the contents of the database:: The individual submodules are described in the following sections. +:mod:`dbm.sqlite3` --- SQLite backend for dbm +--------------------------------------------- + +.. module:: dbm.sqlite3 + :platform: All + :synopsis: SQLite backend for dbm + +.. versionadded:: 3.13 + +**Source code:** :source:`Lib/dbm/sqlite3.py` + +-------------- + +This module uses the standard library :mod:`sqlite3` module to provide an +SQLite backend for the :mod:`dbm` module. +The files created by :mod:`dbm.sqlite3` can thus be opened by :mod:`sqlite3`, +or any other SQLite browser, including the SQLite CLI. + +.. include:: ../includes/wasm-notavail.rst + +.. function:: open(filename, /, flag="r", mode=0o666) + + Open an SQLite database. + The returned object behaves like a :term:`mapping`, + implements a :meth:`!close` method, + and supports a "closing" context manager via the :keyword:`with` keyword. + + :param filename: + The path to the database to be opened. + :type filename: :term:`path-like object` + + :param str flag: + + * ``'r'`` (default): |flag_r| + * ``'w'``: |flag_w| + * ``'c'``: |flag_c| + * ``'n'``: |flag_n| + + :param mode: + The Unix file access mode of the file (default: octal ``0o666``), + used only when the database has to be created. -:mod:`dbm.gnu` --- GNU's reinterpretation of dbm ------------------------------------------------- + +:mod:`dbm.gnu` --- GNU database manager +--------------------------------------- .. module:: dbm.gnu :platform: Unix - :synopsis: GNU's reinterpretation of dbm. + :synopsis: GNU database manager **Source code:** :source:`Lib/dbm/gnu.py` -------------- -This module is quite similar to the :mod:`dbm` module, but uses the GNU library -``gdbm`` instead to provide some additional functionality. Please note that the -file formats created by :mod:`dbm.gnu` and :mod:`dbm.ndbm` are incompatible. +The :mod:`dbm.gnu` module provides an interface to the :abbr:`GDBM (GNU dbm)` +library, similar to the :mod:`dbm.ndbm` module, but with additional +functionality like crash tolerance. + +.. note:: + + The file formats created by :mod:`dbm.gnu` and :mod:`dbm.ndbm` are incompatible + and can not be used interchangeably. -The :mod:`dbm.gnu` module provides an interface to the GNU DBM library. -``dbm.gnu.gdbm`` objects behave like mappings (dictionaries), except that keys and -values are always converted to bytes before storing. Printing a ``gdbm`` -object doesn't print the -keys and values, and the :meth:`items` and :meth:`values` methods are not -supported. +.. include:: ../includes/wasm-mobile-notavail.rst .. exception:: error @@ -158,62 +215,53 @@ supported. raised for general mapping errors like specifying an incorrect key. -.. function:: open(filename[, flag[, mode]]) - - Open a ``gdbm`` database and return a :class:`gdbm` object. The *filename* - argument is the name of the database file. - - The optional *flag* argument can be: - - +---------+-------------------------------------------+ - | Value | Meaning | - +=========+===========================================+ - | ``'r'`` | Open existing database for reading only | - | | (default) | - +---------+-------------------------------------------+ - | ``'w'`` | Open existing database for reading and | - | | writing | - +---------+-------------------------------------------+ - | ``'c'`` | Open database for reading and writing, | - | | creating it if it doesn't exist | - +---------+-------------------------------------------+ - | ``'n'`` | Always create a new, empty database, open | - | | for reading and writing | - +---------+-------------------------------------------+ - - The following additional characters may be appended to the flag to control - how the database is opened: - - +---------+--------------------------------------------+ - | Value | Meaning | - +=========+============================================+ - | ``'f'`` | Open the database in fast mode. Writes | - | | to the database will not be synchronized. | - +---------+--------------------------------------------+ - | ``'s'`` | Synchronized mode. This will cause changes | - | | to the database to be immediately written | - | | to the file. | - +---------+--------------------------------------------+ - | ``'u'`` | Do not lock database. | - +---------+--------------------------------------------+ - - Not all flags are valid for all versions of ``gdbm``. The module constant - :const:`open_flags` is a string of supported flag characters. The exception - :exc:`error` is raised if an invalid flag is specified. - - The optional *mode* argument is the Unix mode of the file, used only when the - database has to be created. It defaults to octal ``0o666``. - - In addition to the dictionary-like methods, ``gdbm`` objects have the - following methods: +.. function:: open(filename, flag="r", mode=0o666, /) + + Open a GDBM database and return a :class:`!gdbm` object. + + :param filename: + The database file to open. + :type filename: :term:`path-like object` + + :param str flag: + * ``'r'`` (default): |flag_r| + * ``'w'``: |flag_w| + * ``'c'``: |flag_c| + * ``'n'``: |flag_n| + + The following additional characters may be appended + to control how the database is opened: + + * ``'f'``: Open the database in fast mode. + Writes to the database will not be synchronized. + * ``'s'``: Synchronized mode. + Changes to the database will be written immediately to the file. + * ``'u'``: Do not lock database. + + Not all flags are valid for all versions of GDBM. + See the :data:`open_flags` member for a list of supported flag characters. + + :param int mode: + |mode_param_doc| + + :raises error: + If an invalid *flag* argument is passed. .. versionchanged:: 3.11 - Accepts :term:`path-like object` for filename. + *filename* accepts a :term:`path-like object`. + + .. data:: open_flags + + A string of characters the *flag* parameter of :meth:`~dbm.gnu.open` supports. + + :class:`!gdbm` objects behave similar to :term:`mappings `, + but :meth:`!items` and :meth:`!values` methods are not supported. + The following methods are also provided: .. method:: gdbm.firstkey() It's possible to loop over every key in the database using this method and the - :meth:`nextkey` method. The traversal is ordered by ``gdbm``'s internal + :meth:`nextkey` method. The traversal is ordered by GDBM's internal hash values, and won't be sorted by the key values. This method returns the starting key. @@ -231,7 +279,7 @@ supported. .. method:: gdbm.reorganize() If you have carried out a lot of deletions and would like to shrink the space - used by the ``gdbm`` file, this routine will reorganize the database. ``gdbm`` + used by the GDBM file, this routine will reorganize the database. :class:`!gdbm` objects will not shorten the length of a database file except by using this reorganization; otherwise, deleted file space will be kept and reused as new (key, value) pairs are added. @@ -243,27 +291,44 @@ supported. .. method:: gdbm.close() - Close the ``gdbm`` database. + Close the GDBM database. -:mod:`dbm.ndbm` --- Interface based on ndbm -------------------------------------------- + .. method:: gdbm.clear() + + Remove all items from the GDBM database. + + .. versionadded:: 3.13 + + +:mod:`dbm.ndbm` --- New Database Manager +---------------------------------------- .. module:: dbm.ndbm :platform: Unix - :synopsis: The standard "database" interface, based on ndbm. + :synopsis: The New Database Manager **Source code:** :source:`Lib/dbm/ndbm.py` -------------- -The :mod:`dbm.ndbm` module provides an interface to the Unix "(n)dbm" library. -Dbm objects behave like mappings (dictionaries), except that keys and values are -always stored as bytes. Printing a ``dbm`` object doesn't print the keys and -values, and the :meth:`items` and :meth:`values` methods are not supported. +The :mod:`dbm.ndbm` module provides an interface to the +:abbr:`NDBM (New Database Manager)` library. +This module can be used with the "classic" NDBM interface or the +:abbr:`GDBM (GNU dbm)` compatibility interface. + +.. note:: + + The file formats created by :mod:`dbm.gnu` and :mod:`dbm.ndbm` are incompatible + and can not be used interchangeably. + +.. warning:: -This module can be used with the "classic" ndbm interface or the GNU GDBM -compatibility interface. On Unix, the :program:`configure` script will attempt -to locate the appropriate header file to simplify building this module. + The NDBM library shipped as part of macOS has an undocumented limitation on the + size of values, which can result in corrupted database files + when storing values larger than this limit. Reading such corrupted files can + result in a hard crash (segmentation fault). + +.. include:: ../includes/wasm-mobile-notavail.rst .. exception:: error @@ -273,45 +338,43 @@ to locate the appropriate header file to simplify building this module. .. data:: library - Name of the ``ndbm`` implementation library used. + Name of the NDBM implementation library used. -.. function:: open(filename[, flag[, mode]]) +.. function:: open(filename, flag="r", mode=0o666, /) - Open a dbm database and return a ``ndbm`` object. The *filename* argument is the - name of the database file (without the :file:`.dir` or :file:`.pag` extensions). + Open an NDBM database and return an :class:`!ndbm` object. - The optional *flag* argument must be one of these values: + :param filename: + The basename of the database file + (without the :file:`.dir` or :file:`.pag` extensions). + :type filename: :term:`path-like object` - +---------+-------------------------------------------+ - | Value | Meaning | - +=========+===========================================+ - | ``'r'`` | Open existing database for reading only | - | | (default) | - +---------+-------------------------------------------+ - | ``'w'`` | Open existing database for reading and | - | | writing | - +---------+-------------------------------------------+ - | ``'c'`` | Open database for reading and writing, | - | | creating it if it doesn't exist | - +---------+-------------------------------------------+ - | ``'n'`` | Always create a new, empty database, open | - | | for reading and writing | - +---------+-------------------------------------------+ + :param str flag: + * ``'r'`` (default): |flag_r| + * ``'w'``: |flag_w| + * ``'c'``: |flag_c| + * ``'n'``: |flag_n| - The optional *mode* argument is the Unix mode of the file, used only when the - database has to be created. It defaults to octal ``0o666`` (and will be - modified by the prevailing umask). + :param int mode: + |mode_param_doc| - In addition to the dictionary-like methods, ``ndbm`` objects - provide the following method: + :class:`!ndbm` objects behave similar to :term:`mappings `, + but :meth:`!items` and :meth:`!values` methods are not supported. + The following methods are also provided: .. versionchanged:: 3.11 Accepts :term:`path-like object` for filename. .. method:: ndbm.close() - Close the ``ndbm`` database. + Close the NDBM database. + + .. method:: ndbm.clear() + + Remove all items from the NDBM database. + + .. versionadded:: 3.13 :mod:`dbm.dumb` --- Portable DBM implementation @@ -333,13 +396,12 @@ to locate the appropriate header file to simplify building this module. -------------- -The :mod:`dbm.dumb` module provides a persistent dictionary-like interface which -is written entirely in Python. Unlike other modules such as :mod:`dbm.gnu` no -external library is required. As with other persistent mappings, the keys and -values are always stored as bytes. - -The module defines the following: +The :mod:`dbm.dumb` module provides a persistent :class:`dict`-like +interface which is written entirely in Python. +Unlike other :mod:`dbm` backends, such as :mod:`dbm.gnu`, no +external library is required. +The :mod:`!dbm.dumb` module defines the following: .. exception:: error @@ -347,34 +409,29 @@ The module defines the following: raised for general mapping errors like specifying an incorrect key. -.. function:: open(filename[, flag[, mode]]) +.. function:: open(filename, flag="c", mode=0o666) + + Open a :mod:`!dbm.dumb` database. + The returned database object behaves similar to a :term:`mapping`, + in addition to providing :meth:`~dumbdbm.sync` and :meth:`~dumbdbm.close` + methods. - Open a ``dumbdbm`` database and return a dumbdbm object. The *filename* argument is - the basename of the database file (without any specific extensions). When a - dumbdbm database is created, files with :file:`.dat` and :file:`.dir` extensions - are created. + :param filename: + The basename of the database file (without extensions). + A new database creates the following files: - The optional *flag* argument can be: + - :file:`{filename}.dat` + - :file:`{filename}.dir` + :type database: :term:`path-like object` - +---------+-------------------------------------------+ - | Value | Meaning | - +=========+===========================================+ - | ``'r'`` | Open existing database for reading only | - | | (default) | - +---------+-------------------------------------------+ - | ``'w'`` | Open existing database for reading and | - | | writing | - +---------+-------------------------------------------+ - | ``'c'`` | Open database for reading and writing, | - | | creating it if it doesn't exist | - +---------+-------------------------------------------+ - | ``'n'`` | Always create a new, empty database, open | - | | for reading and writing | - +---------+-------------------------------------------+ + :param str flag: + * ``'r'``: |flag_r| + * ``'w'``: |flag_w| + * ``'c'`` (default): |flag_c| + * ``'n'``: |flag_n| - The optional *mode* argument is the Unix mode of the file, used only when the - database has to be created. It defaults to octal ``0o666`` (and will be modified - by the prevailing umask). + :param int mode: + |mode_param_doc| .. warning:: It is possible to crash the Python interpreter when loading a database @@ -382,20 +439,18 @@ The module defines the following: Python's AST compiler. .. versionchanged:: 3.5 - :func:`.open` always creates a new database when the flag has the value - ``'n'``. + :func:`~dbm.dumb.open` always creates a new database when *flag* is ``'n'``. .. versionchanged:: 3.8 - A database opened with flags ``'r'`` is now read-only. Opening with - flags ``'r'`` and ``'w'`` no longer creates a database if it does not - exist. + A database opened read-only if *flag* is ``'r'``. + A database is not created if it does not exist if *flag* is ``'r'`` or ``'w'``. .. versionchanged:: 3.11 - Accepts :term:`path-like object` for filename. + *filename* accepts a :term:`path-like object`. In addition to the methods provided by the - :class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects - provide the following methods: + :class:`collections.abc.MutableMapping` class, + the following methods are provided: .. method:: dumbdbm.sync() @@ -404,5 +459,4 @@ The module defines the following: .. method:: dumbdbm.close() - Close the ``dumbdbm`` database. - + Close the database. diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 018ec1ab..916f17ca 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -1,5 +1,5 @@ -:mod:`decimal` --- Decimal fixed point and floating point arithmetic -==================================================================== +:mod:`!decimal` --- Decimal fixed-point and floating-point arithmetic +===================================================================== .. module:: decimal :synopsis: Implementation of the General Decimal Arithmetic Specification. @@ -31,7 +31,7 @@ -------------- The :mod:`decimal` module provides support for fast correctly rounded -decimal floating point arithmetic. It offers several advantages over the +decimal floating-point arithmetic. It offers several advantages over the :class:`float` datatype: * Decimal "is based on a floating-point model which was designed with people @@ -207,7 +207,7 @@ a decimal raises :class:`InvalidOperation`:: .. versionchanged:: 3.3 Decimals interact well with much of the rest of Python. Here is a small decimal -floating point flying circus: +floating-point flying circus: .. doctest:: :options: +NORMALIZE_WHITESPACE @@ -373,7 +373,7 @@ Decimal objects digits, and an integer exponent. For example, ``Decimal((0, (1, 4, 1, 4), -3))`` returns ``Decimal('1.414')``. - If *value* is a :class:`float`, the binary floating point value is losslessly + If *value* is a :class:`float`, the binary floating-point value is losslessly converted to its exact decimal equivalent. This conversion can often require 53 or more digits of precision. For example, ``Decimal(float('1.1'))`` converts to @@ -403,7 +403,7 @@ Decimal objects Underscores are allowed for grouping, as with integral and floating-point literals in code. - Decimal floating point objects share many properties with the other built-in + Decimal floating-point objects share many properties with the other built-in numeric types such as :class:`float` and :class:`int`. All of the usual math operations and special methods apply. Likewise, decimal objects can be copied, pickled, printed, used as dictionary keys, used as set elements, @@ -445,7 +445,7 @@ Decimal objects Mixed-type comparisons between :class:`Decimal` instances and other numeric types are now fully supported. - In addition to the standard numeric properties, decimal floating point + In addition to the standard numeric properties, decimal floating-point objects also have a number of specialized methods: @@ -897,6 +897,48 @@ Decimal objects :const:`Rounded`. If given, applies *rounding*; otherwise, uses the rounding method in either the supplied *context* or the current context. + Decimal numbers can be rounded using the :func:`.round` function: + + .. describe:: round(number) + .. describe:: round(number, ndigits) + + If *ndigits* is not given or ``None``, + returns the nearest :class:`int` to *number*, + rounding ties to even, and ignoring the rounding mode of the + :class:`Decimal` context. Raises :exc:`OverflowError` if *number* is an + infinity or :exc:`ValueError` if it is a (quiet or signaling) NaN. + + If *ndigits* is an :class:`int`, the context's rounding mode is respected + and a :class:`Decimal` representing *number* rounded to the nearest + multiple of ``Decimal('1E-ndigits')`` is returned; in this case, + ``round(number, ndigits)`` is equivalent to + ``self.quantize(Decimal('1E-ndigits'))``. Returns ``Decimal('NaN')`` if + *number* is a quiet NaN. Raises :class:`InvalidOperation` if *number* + is an infinity, a signaling NaN, or if the length of the coefficient after + the quantize operation would be greater than the current context's + precision. In other words, for the non-corner cases: + + * if *ndigits* is positive, return *number* rounded to *ndigits* decimal + places; + * if *ndigits* is zero, return *number* rounded to the nearest integer; + * if *ndigits* is negative, return *number* rounded to the nearest + multiple of ``10**abs(ndigits)``. + + For example:: + + >>> from decimal import Decimal, getcontext, ROUND_DOWN + >>> getcontext().rounding = ROUND_DOWN + >>> round(Decimal('3.75')) # context rounding ignored + 4 + >>> round(Decimal('3.5')) # round-ties-to-even + 4 + >>> round(Decimal('3.75'), 0) # uses the context rounding + Decimal('3') + >>> round(Decimal('3.75'), 1) + Decimal('3.7') + >>> round(Decimal('3.75'), -1) + Decimal('0E+1') + .. _logical_operands_label: @@ -1396,10 +1438,10 @@ In addition to the three supplied contexts, new contexts can be created with the With three arguments, compute ``(x**y) % modulo``. For the three argument form, the following restrictions on the arguments hold: - - all three arguments must be integral - - ``y`` must be nonnegative - - at least one of ``x`` or ``y`` must be nonzero - - ``modulo`` must be nonzero and have at most 'precision' digits + - all three arguments must be integral + - ``y`` must be nonnegative + - at least one of ``x`` or ``y`` must be nonzero + - ``modulo`` must be nonzero and have at most 'precision' digits The value resulting from ``Context.power(x, y, modulo)`` is equal to the value that would be obtained by computing ``(x**y) @@ -1508,7 +1550,7 @@ are also included in the pure Python version for compatibility. The value is ``True``. Deprecated, because Python now always has threads. -.. deprecated:: 3.9 + .. deprecated:: 3.9 .. data:: HAVE_CONTEXTVAR @@ -1517,7 +1559,7 @@ are also included in the pure Python version for compatibility. the C version uses a thread-local rather than a coroutine-local context and the value is ``False``. This is slightly faster in some nested context scenarios. -.. versionadded:: 3.9 backported to 3.7 and 3.8. + .. versionadded:: 3.8.3 Rounding modes @@ -1699,7 +1741,7 @@ The following table summarizes the hierarchy of signals:: .. _decimal-notes: -Floating Point Notes +Floating-Point Notes -------------------- @@ -1712,7 +1754,7 @@ can still incur round-off error when non-zero digits exceed the fixed precision. The effects of round-off error can be amplified by the addition or subtraction of nearly offsetting quantities resulting in loss of significance. Knuth -provides two instructive examples where rounded floating point arithmetic with +provides two instructive examples where rounded floating-point arithmetic with insufficient precision causes the breakdown of the associative and distributive properties of addition: @@ -1802,7 +1844,7 @@ treated as equal and their sign is informational. In addition to the two signed zeros which are distinct yet equal, there are various representations of zero with differing precisions yet equivalent in value. This takes a bit of getting used to. For an eye accustomed to -normalized floating point representations, it is not immediately obvious that +normalized floating-point representations, it is not immediately obvious that the following calculation returns a value equal to zero: >>> 1 / Decimal('Infinity') @@ -2129,7 +2171,7 @@ value unchanged: Q. Is there a way to convert a regular float to a :class:`Decimal`? -A. Yes, any binary floating point number can be exactly expressed as a +A. Yes, any binary floating-point number can be exactly expressed as a Decimal though an exact conversion may take more precision than intuition would suggest: @@ -2183,7 +2225,7 @@ Q. Is the CPython implementation fast for large numbers? A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the decimal module integrate the high speed `libmpdec `_ library for -arbitrary precision correctly rounded decimal floating point arithmetic [#]_. +arbitrary precision correctly rounded decimal floating-point arithmetic [#]_. ``libmpdec`` uses `Karatsuba multiplication `_ for medium-sized numbers and the `Number Theoretic Transform diff --git a/Doc/library/development.rst b/Doc/library/development.rst index 9edce758..b1979b92 100644 --- a/Doc/library/development.rst +++ b/Doc/library/development.rst @@ -8,8 +8,7 @@ The modules described in this chapter help you write software. For example, the :mod:`pydoc` module takes a module and generates documentation based on the module's contents. The :mod:`doctest` and :mod:`unittest` modules contains frameworks for writing unit tests that automatically exercise code and verify -that the expected output is produced. :program:`2to3` can translate Python 2.x -source code into valid Python 3.x code. +that the expected output is produced. The list of modules described in this chapter is: @@ -23,5 +22,4 @@ The list of modules described in this chapter is: unittest.rst unittest.mock.rst unittest.mock-examples.rst - 2to3.rst test.rst diff --git a/Doc/library/dialog.rst b/Doc/library/dialog.rst index 53f98c10..191e0da1 100644 --- a/Doc/library/dialog.rst +++ b/Doc/library/dialog.rst @@ -27,15 +27,15 @@ functions for creating simple modal dialogs to get a value from the user. The base class for custom dialogs. - .. method:: body(master) + .. method:: body(master) - Override to construct the dialog's interface and return the widget that - should have initial focus. + Override to construct the dialog's interface and return the widget that + should have initial focus. - .. method:: buttonbox() + .. method:: buttonbox() - Default behaviour adds OK and Cancel buttons. Override for custom button - layouts. + Default behaviour adds OK and Cancel buttons. Override for custom button + layouts. diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index c5536114..ce948a68 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -1,5 +1,5 @@ -:mod:`difflib` --- Helpers for computing deltas -=============================================== +:mod:`!difflib` --- Helpers for computing deltas +================================================ .. module:: difflib :synopsis: Helpers for computing differences between objects. @@ -52,8 +52,8 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. the purpose of sequence matching. This heuristic can be turned off by setting the ``autojunk`` argument to ``False`` when creating the :class:`SequenceMatcher`. - .. versionadded:: 3.2 - The *autojunk* parameter. + .. versionchanged:: 3.2 + Added the *autojunk* parameter. .. class:: Differ @@ -171,9 +171,12 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. expressed in the ISO 8601 format. If not specified, the strings default to blanks. + >>> import sys + >>> from difflib import * >>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] >>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] - >>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py', tofile='after.py')) + >>> sys.stdout.writelines(context_diff(s1, s2, fromfile='before.py', + ... tofile='after.py')) *** before.py --- after.py *************** @@ -294,13 +297,12 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. For inputs that do not have trailing newlines, set the *lineterm* argument to ``""`` so that the output will be uniformly newline free. - The context diff format normally has a header for filenames and modification + The unified diff format normally has a header for filenames and modification times. Any or all of these may be specified using strings for *fromfile*, *tofile*, *fromfiledate*, and *tofiledate*. The modification times are normally expressed in the ISO 8601 format. If not specified, the strings default to blanks. - >>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n'] >>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n'] >>> sys.stdout.writelines(unified_diff(s1, s2, fromfile='before.py', tofile='after.py')) @@ -381,8 +383,8 @@ The :class:`SequenceMatcher` class has this constructor: The optional argument *autojunk* can be used to disable the automatic junk heuristic. - .. versionadded:: 3.2 - The *autojunk* parameter. + .. versionchanged:: 3.2 + Added the *autojunk* parameter. SequenceMatcher objects get three data attributes: *bjunk* is the set of elements of *b* for which *isjunk* is ``True``; *bpopular* is the set of @@ -629,7 +631,7 @@ If you want to know how to change the first sequence into the second, use work. * `Simple version control recipe - `_ for a small application + `_ for a small application built with :class:`SequenceMatcher`. diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index b559b085..cbf43676 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1,5 +1,5 @@ -:mod:`dis` --- Disassembler for Python bytecode -=============================================== +:mod:`!dis` --- Disassembler for Python bytecode +================================================ .. module:: dis :synopsis: Disassembler for Python bytecode. @@ -42,6 +42,19 @@ interpreter. bytecode to specialize it for different runtime conditions. The adaptive bytecode can be shown by passing ``adaptive=True``. + .. versionchanged:: 3.12 + The argument of a jump is the offset of the target instruction relative + to the instruction that appears immediately after the jump instruction's + :opcode:`CACHE` entries. + + As a consequence, the presence of the :opcode:`CACHE` instructions is + transparent for forward jumps but needs to be taken into account when + reasoning about backward jumps. + + .. versionchanged:: 3.13 + The output shows logical labels rather than instruction offsets + for jump targets and exception handlers. The ``-O`` command line + option and the ``show_offsets`` argument were added. Example: Given the function :func:`!myfunc`:: @@ -54,15 +67,45 @@ the following command can be used to display the disassembly of .. doctest:: >>> dis.dis(myfunc) - 2 0 RESUME 0 + 2 RESUME 0 - 3 2 LOAD_GLOBAL 1 (NULL + len) - 12 LOAD_FAST 0 (alist) - 14 CALL 1 - 22 RETURN_VALUE + 3 LOAD_GLOBAL 1 (len + NULL) + LOAD_FAST 0 (alist) + CALL 1 + RETURN_VALUE (The "2" is a line number). +.. _dis-cli: + +Command-line interface +---------------------- + +The :mod:`dis` module can be invoked as a script from the command line: + +.. code-block:: sh + + python -m dis [-h] [-C] [-O] [infile] + +The following options are accepted: + +.. program:: dis + +.. cmdoption:: -h, --help + + Display usage and exit. + +.. cmdoption:: -C, --show-caches + + Show inline caches. + +.. cmdoption:: -O, --show-offsets + + Show offsets of instructions. + +If :file:`infile` is specified, its disassembled code will be written to stdout. +Otherwise, disassembly is performed on compiled source code received from stdin. + Bytecode analysis ----------------- @@ -73,7 +116,7 @@ The bytecode analysis API allows pieces of Python code to be wrapped in a code. .. class:: Bytecode(x, *, first_line=None, current_offset=None,\ - show_caches=False, adaptive=False) + show_caches=False, adaptive=False, show_offsets=False) Analyse the bytecode corresponding to a function, generator, asynchronous generator, coroutine, method, string of source code, or a code object (as @@ -98,6 +141,9 @@ code. If *adaptive* is ``True``, :meth:`.dis` will display specialized bytecode that may be different from the original bytecode. + If *show_offsets* is ``True``, :meth:`.dis` will include instruction + offsets in the output. + .. classmethod:: from_traceback(tb, *, show_caches=False) Construct a :class:`Bytecode` instance from the given traceback, setting @@ -220,7 +266,8 @@ operation is being performed, so the intermediate analysis object isn't useful: Added the *show_caches* and *adaptive* parameters. -.. function:: distb(tb=None, *, file=None, show_caches=False, adaptive=False) +.. function:: distb(tb=None, *, file=None, show_caches=False, adaptive=False, + show_offset=False) Disassemble the top-of-stack function of a traceback, using the last traceback if none was passed. The instruction causing the exception is @@ -235,9 +282,12 @@ operation is being performed, so the intermediate analysis object isn't useful: .. versionchanged:: 3.11 Added the *show_caches* and *adaptive* parameters. + .. versionchanged:: 3.13 + Added the *show_offsets* parameter. .. function:: disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False) - disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False) + disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, + show_offsets=False) Disassemble a code object, indicating the last instruction if *lasti* was provided. The output is divided in the following columns: @@ -262,6 +312,8 @@ operation is being performed, so the intermediate analysis object isn't useful: .. versionchanged:: 3.11 Added the *show_caches* and *adaptive* parameters. + .. versionchanged:: 3.13 + Added the *show_offsets* parameter. .. function:: get_instructions(x, *, first_line=None, show_caches=False, adaptive=False) @@ -276,26 +328,36 @@ operation is being performed, so the intermediate analysis object isn't useful: source line information (if any) is taken directly from the disassembled code object. - The *show_caches* and *adaptive* parameters work as they do in :func:`dis`. + The *adaptive* parameter works as it does in :func:`dis`. .. versionadded:: 3.4 .. versionchanged:: 3.11 Added the *show_caches* and *adaptive* parameters. + .. versionchanged:: 3.13 + The *show_caches* parameter is deprecated and has no effect. The iterator + generates the :class:`Instruction` instances with the *cache_info* + field populated (regardless of the value of *show_caches*) and it no longer + generates separate items for the cache entries. .. function:: findlinestarts(code) - This generator function uses the ``co_lines`` method - of the code object *code* to find the offsets which are starts of + This generator function uses the :meth:`~codeobject.co_lines` method + of the :ref:`code object ` *code* to find the offsets which + are starts of lines in the source code. They are generated as ``(offset, lineno)`` pairs. .. versionchanged:: 3.6 Line numbers can be decreasing. Before, they were always increasing. .. versionchanged:: 3.10 - The :pep:`626` ``co_lines`` method is used instead of the ``co_firstlineno`` - and ``co_lnotab`` attributes of the code object. + The :pep:`626` :meth:`~codeobject.co_lines` method is used instead of the + :attr:`~codeobject.co_firstlineno` and :attr:`~codeobject.co_lnotab` + attributes of the :ref:`code object `. + + .. versionchanged:: 3.13 + Line numbers can be ``None`` for bytecode that does not map to source lines. .. function:: findlabels(code) @@ -318,6 +380,12 @@ operation is being performed, so the intermediate analysis object isn't useful: .. versionchanged:: 3.8 Added *jump* parameter. + .. versionchanged:: 3.13 + If ``oparg`` is omitted (or ``None``), the stack effect is now returned + for ``oparg=0``. Previously this was an error for opcodes that use their + arg. It is also no longer an error to pass an integer ``oparg`` when + the ``opcode`` does not use it; the ``oparg`` in this case is ignored. + .. _bytecodes: @@ -342,10 +410,25 @@ details of bytecode instructions as :class:`Instruction` instances: human readable name for operation + .. data:: baseopcode + + numeric code for the base operation if operation is specialized; + otherwise equal to :data:`opcode` + + + .. data:: baseopname + + human readable name for the base operation if operation is specialized; + otherwise equal to :data:`opname` + + .. data:: arg numeric argument to operation (if any), otherwise ``None`` + .. data:: oparg + + alias for :data:`arg` .. data:: argval @@ -363,9 +446,30 @@ details of bytecode instructions as :class:`Instruction` instances: start index of operation within bytecode sequence + .. data:: start_offset + + start index of operation within bytecode sequence, including prefixed + ``EXTENDED_ARG`` operations if present; otherwise equal to :data:`offset` + + + .. data:: cache_offset + + start index of the cache entries following the operation + + + .. data:: end_offset + + end index of the cache entries following the operation + + .. data:: starts_line - line started by this opcode (if any), otherwise ``None`` + ``True`` if this opcode starts a source line, otherwise ``False`` + + + .. data:: line_number + + source line number associated with this opcode (if any), otherwise ``None`` .. data:: is_jump_target @@ -373,17 +477,39 @@ details of bytecode instructions as :class:`Instruction` instances: ``True`` if other code jumps to here, otherwise ``False`` + .. data:: jump_target + + bytecode index of the jump target if this is a jump operation, + otherwise ``None`` + + .. data:: positions :class:`dis.Positions` object holding the start and end locations that are covered by this instruction. + .. data::cache_info + + Information about the cache entries of this instruction, as + triplets of the form ``(name, size, data)``, where the ``name`` + and ``size`` describe the cache format and data is the contents + of the cache. ``cache_info`` is ``None`` if the instruction does not have + caches. + .. versionadded:: 3.4 .. versionchanged:: 3.11 Field ``positions`` is added. + .. versionchanged:: 3.13 + + Changed field ``starts_line``. + + Added fields ``start_offset``, ``cache_offset``, ``end_offset``, + ``baseopname``, ``baseopcode``, ``jump_target``, ``oparg``, + ``line_number`` and ``cache_info``. + .. class:: Positions @@ -421,13 +547,21 @@ operations on it as if it was a Python list. The top of the stack corresponds to .. opcode:: END_FOR - Removes the top two values from the stack. - Equivalent to ``POP_TOP``; ``POP_TOP``. + Removes the top-of-stack item. + Equivalent to ``POP_TOP``. Used to clean up at the end of loops, hence the name. .. versionadded:: 3.12 +.. opcode:: END_SEND + + Implements ``del STACK[-2]``. + Used to clean up when a generator exits. + + .. versionadded:: 3.12 + + .. opcode:: COPY (i) Push the i-th item to the top of the stack without removing it from its original @@ -443,7 +577,7 @@ operations on it as if it was a Python list. The top of the stack corresponds to Swap the top of the stack with the i-th element:: - STACK[-i], STACK[-1] = stack[-1], STACK[-i] + STACK[-i], STACK[-1] = STACK[-1], STACK[-i] .. versionadded:: 3.11 @@ -481,6 +615,9 @@ result back on the stack. Implements ``STACK[-1] = not STACK[-1]``. + .. versionchanged:: 3.13 + This instruction now requires an exact :class:`bool` operand. + .. opcode:: UNARY_INVERT @@ -500,6 +637,13 @@ result back on the stack. .. versionadded:: 3.5 +.. opcode:: TO_BOOL + + Implements ``STACK[-1] = bool(STACK[-1])``. + + .. versionadded:: 3.13 + + **Binary and in-place operations** Binary operations remove the top two items from the stack (``STACK[-1]`` and @@ -712,6 +856,9 @@ iterations of the loop. .. versionchanged:: 3.12 oparg set to be the exception block depth, for efficient closing of generators. + .. versionchanged:: 3.13 + oparg is ``1`` if this instruction is part of a yield-from or await, and ``0`` + otherwise. .. opcode:: SETUP_ANNOTATIONS @@ -733,8 +880,8 @@ iterations of the loop. .. opcode:: RERAISE Re-raises the exception currently on top of the stack. If oparg is non-zero, - pops an additional value from the stack which is used to set ``f_lasti`` - of the current frame. + pops an additional value from the stack which is used to set + :attr:`~frame.f_lasti` of the current frame. .. versionadded:: 3.9 @@ -810,7 +957,8 @@ iterations of the loop. .. opcode:: GET_LEN - Perform ``STACK.append(len(STACK[-1]))``. + Perform ``STACK.append(len(STACK[-1]))``. Used in :keyword:`match` statements where + comparison with structure of pattern is needed. .. versionadded:: 3.10 @@ -851,13 +999,13 @@ iterations of the loop. .. opcode:: STORE_NAME (namei) Implements ``name = STACK.pop()``. *namei* is the index of *name* in the attribute - :attr:`!co_names` of the :ref:`code object `. + :attr:`~codeobject.co_names` of the :ref:`code object `. The compiler tries to use :opcode:`STORE_FAST` or :opcode:`STORE_GLOBAL` if possible. .. opcode:: DELETE_NAME (namei) - Implements ``del name``, where *namei* is the index into :attr:`!co_names` + Implements ``del name``, where *namei* is the index into :attr:`~codeobject.co_names` attribute of the :ref:`code object `. @@ -897,7 +1045,7 @@ iterations of the loop. value = STACK.pop() obj.name = value - where *namei* is the index of name in :attr:`!co_names` of the + where *namei* is the index of name in :attr:`~codeobject.co_names` of the :ref:`code object `. .. opcode:: DELETE_ATTR (namei) @@ -907,7 +1055,7 @@ iterations of the loop. obj = STACK.pop() del obj.name - where *namei* is the index of name into :attr:`!co_names` of the + where *namei* is the index of name into :attr:`~codeobject.co_names` of the :ref:`code object `. @@ -955,11 +1103,15 @@ iterations of the loop. .. opcode:: BUILD_TUPLE (count) Creates a tuple consuming *count* items from the stack, and pushes the - resulting tuple onto the stack.:: + resulting tuple onto the stack:: + + if count == 0: + value = () + else: + value = tuple(STACK[-count:]) + STACK = STACK[:-count] - assert count > 0 - STACK, values = STACK[:-count], STACK[-count:] - STACK.append(tuple(values)) + STACK.append(value) .. opcode:: BUILD_LIST (count) @@ -1053,7 +1205,8 @@ iterations of the loop. This bytecode distinguishes two cases: if ``STACK[-1]`` has a method with the correct name, the bytecode pushes the unbound method and ``STACK[-1]``. ``STACK[-1]`` will be used as the first argument (``self``) by :opcode:`CALL` - when calling the unbound method. Otherwise, ``NULL`` and the object returned by + or :opcode:`CALL_KW` when calling the unbound method. + Otherwise, ``NULL`` and the object returned by the attribute lookup are pushed. .. versionchanged:: 3.12 @@ -1063,15 +1216,22 @@ iterations of the loop. .. opcode:: LOAD_SUPER_ATTR (namei) - This opcode implements :func:`super` (e.g. ``super().method()`` and - ``super().attr``). It works the same as :opcode:`LOAD_ATTR`, except that - ``namei`` is shifted left by 2 bits instead of 1, and instead of expecting a - single receiver on the stack, it expects three objects (from top of stack - down): ``self`` (the first argument to the current method), ``cls`` (the - class within which the current method was defined), and the global ``super``. + This opcode implements :func:`super`, both in its zero-argument and + two-argument forms (e.g. ``super().method()``, ``super().attr`` and + ``super(cls, self).method()``, ``super(cls, self).attr``). + + It pops three values from the stack (from top of stack down): + + * ``self``: the first argument to the current method + * ``cls``: the class within which the current method was defined + * the global ``super`` + + With respect to its argument, it works similarly to :opcode:`LOAD_ATTR`, + except that ``namei`` is shifted left by 2 bits instead of 1. The low bit of ``namei`` signals to attempt a method load, as with - :opcode:`LOAD_ATTR`. + :opcode:`LOAD_ATTR`, which results in pushing ``NULL`` and the loaded method. + When it is unset a single value is pushed to the stack. The second-low bit of ``namei``, if set, means that this was a two-argument call to :func:`super` (unset means zero-argument). @@ -1082,7 +1242,12 @@ iterations of the loop. .. opcode:: COMPARE_OP (opname) Performs a Boolean operation. The operation name can be found in - ``cmp_op[opname]``. + ``cmp_op[opname >> 5]``. If the fifth-lowest bit of ``opname`` is set + (``opname & 16``), the result should be coerced to ``bool``. + + .. versionchanged:: 3.13 + The fifth-lowest bit of the oparg now indicates a forced conversion to + :class:`bool`. .. opcode:: IS_OP (invert) @@ -1146,6 +1311,9 @@ iterations of the loop. .. versionchanged:: 3.12 This is no longer a pseudo-instruction. + .. versionchanged:: 3.13 + This instruction now requires an exact :class:`bool` operand. + .. opcode:: POP_JUMP_IF_FALSE (delta) If ``STACK[-1]`` is false, increments the bytecode counter by *delta*. @@ -1159,6 +1327,9 @@ iterations of the loop. .. versionchanged:: 3.12 This is no longer a pseudo-instruction. + .. versionchanged:: 3.13 + This instruction now requires an exact :class:`bool` operand. + .. opcode:: POP_JUMP_IF_NOT_NONE (delta) If ``STACK[-1]`` is not ``None``, increments the bytecode counter by *delta*. @@ -1212,6 +1383,13 @@ iterations of the loop. This opcode is now only used in situations where the local variable is guaranteed to be initialized. It cannot raise :exc:`UnboundLocalError`. +.. opcode:: LOAD_FAST_LOAD_FAST (var_nums) + + Pushes references to ``co_varnames[var_nums >> 4]`` and + ``co_varnames[var_nums & 15]`` onto the stack. + + .. versionadded:: 3.13 + .. opcode:: LOAD_FAST_CHECK (var_num) Pushes a reference to the local ``co_varnames[var_num]`` onto the stack, @@ -1232,6 +1410,20 @@ iterations of the loop. Stores ``STACK.pop()`` into the local ``co_varnames[var_num]``. +.. opcode:: STORE_FAST_STORE_FAST (var_nums) + + Stores ``STACK[-1]`` into ``co_varnames[var_nums >> 4]`` + and ``STACK[-2]`` into ``co_varnames[var_nums & 15]``. + + .. versionadded:: 3.13 + +.. opcode:: STORE_FAST_LOAD_FAST (var_nums) + + Stores ``STACK.pop()`` into the local ``co_varnames[var_nums >> 4]`` + and pushes a reference to the local ``co_varnames[var_nums & 15]`` + onto the stack. + + .. versionadded:: 3.13 .. opcode:: DELETE_FAST (var_num) @@ -1246,25 +1438,13 @@ iterations of the loop. .. versionadded:: 3.11 -.. opcode:: LOAD_CLOSURE (i) - - Pushes a reference to the cell contained in slot ``i`` of the "fast locals" - storage. The name of the variable is ``co_fastlocalnames[i]``. - - Note that ``LOAD_CLOSURE`` is effectively an alias for ``LOAD_FAST``. - It exists to keep bytecode a little more readable. - - .. versionchanged:: 3.11 - ``i`` is no longer offset by the length of ``co_varnames``. - - .. opcode:: LOAD_DEREF (i) Loads the cell contained in slot ``i`` of the "fast locals" storage. Pushes a reference to the object the cell contains on the stack. .. versionchanged:: 3.11 - ``i`` is no longer offset by the length of ``co_varnames``. + ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`. .. opcode:: LOAD_FROM_DICT_OR_DEREF (i) @@ -1273,7 +1453,7 @@ iterations of the loop. slot ``i`` of the "fast locals" storage in this mapping. If the name is not found there, loads it from the cell contained in slot ``i``, similar to :opcode:`LOAD_DEREF`. This is used for loading - free variables in class bodies (which previously used + :term:`closure variables ` in class bodies (which previously used :opcode:`!LOAD_CLASSDEREF`) and in :ref:`annotation scopes ` within class bodies. @@ -1286,7 +1466,7 @@ iterations of the loop. storage. .. versionchanged:: 3.11 - ``i`` is no longer offset by the length of ``co_varnames``. + ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`. .. opcode:: DELETE_DEREF (i) @@ -1297,13 +1477,13 @@ iterations of the loop. .. versionadded:: 3.2 .. versionchanged:: 3.11 - ``i`` is no longer offset by the length of ``co_varnames``. + ``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`. .. opcode:: COPY_FREE_VARS (n) - Copies the ``n`` free variables from the closure into the frame. - Removes the need for special code on the caller's side when calling + Copies the ``n`` :term:`free (closure) variables ` from the closure + into the frame. Removes the need for special code on the caller's side when calling closures. .. versionadded:: 3.11 @@ -1322,25 +1502,14 @@ iterations of the loop. .. opcode:: CALL (argc) - Calls a callable object with the number of arguments specified by ``argc``, - including the named arguments specified by the preceding - :opcode:`KW_NAMES`, if any. - On the stack are (in ascending order), either: - - * NULL - * The callable - * The positional arguments - * The named arguments - - or: + Calls a callable object with the number of arguments specified by ``argc``. + On the stack are (in ascending order): * The callable - * ``self`` + * ``self`` or ``NULL`` * The remaining positional arguments - * The named arguments - ``argc`` is the total of the positional and named arguments, excluding - ``self`` when a ``NULL`` is not present. + ``argc`` is the total of the positional arguments, excluding ``self``. ``CALL`` pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value @@ -1348,6 +1517,33 @@ iterations of the loop. .. versionadded:: 3.11 + .. versionchanged:: 3.13 + The callable now always appears at the same position on the stack. + + .. versionchanged:: 3.13 + Calls with keyword arguments are now handled by :opcode:`CALL_KW`. + + +.. opcode:: CALL_KW (argc) + + Calls a callable object with the number of arguments specified by ``argc``, + including one or more named arguments. On the stack are (in ascending order): + + * The callable + * ``self`` or ``NULL`` + * The remaining positional arguments + * The named arguments + * A :class:`tuple` of keyword argument names + + ``argc`` is the total of the positional and named arguments, excluding ``self``. + The length of the tuple of keyword argument names is the number of named arguments. + + ``CALL_KW`` pops all arguments, the keyword names, and the callable object + off the stack, calls the callable object with those arguments, and pushes the + return value returned by the callable object. + + .. versionadded:: 3.13 + .. opcode:: CALL_FUNCTION_EX (flags) @@ -1373,32 +1569,34 @@ iterations of the loop. .. versionadded:: 3.11 -.. opcode:: KW_NAMES (consti) +.. opcode:: MAKE_FUNCTION - Prefixes :opcode:`CALL`. - Stores a reference to ``co_consts[consti]`` into an internal variable - for use by :opcode:`CALL`. ``co_consts[consti]`` must be a tuple of strings. + Pushes a new function object on the stack built from the code object at ``STACK[-1]``. - .. versionadded:: 3.11 + .. versionchanged:: 3.10 + Flag value ``0x04`` is a tuple of strings instead of dictionary + + .. versionchanged:: 3.11 + Qualified name at ``STACK[-1]`` was removed. + + .. versionchanged:: 3.13 + Extra function attributes on the stack, signaled by oparg flags, were + removed. They now use :opcode:`SET_FUNCTION_ATTRIBUTE`. -.. opcode:: MAKE_FUNCTION (flags) +.. opcode:: SET_FUNCTION_ATTRIBUTE (flag) - Pushes a new function object on the stack. From bottom to top, the consumed - stack must consist of values if the argument carries a specified flag value + Sets an attribute on a function object. Expects the function at ``STACK[-1]`` + and the attribute value to set at ``STACK[-2]``; consumes both and leaves the + function at ``STACK[-1]``. The flag determines which attribute to set: * ``0x01`` a tuple of default values for positional-only and positional-or-keyword parameters in positional order * ``0x02`` a dictionary of keyword-only parameters' default values * ``0x04`` a tuple of strings containing parameters' annotations * ``0x08`` a tuple containing cells for free variables, making a closure - * the code associated with the function (at ``STACK[-1]``) - - .. versionchanged:: 3.10 - Flag value ``0x04`` is a tuple of strings instead of dictionary - .. versionchanged:: 3.11 - Qualified name at ``STACK[-1]`` was removed. + .. versionadded:: 3.13 .. opcode:: BUILD_SLICE (argc) @@ -1409,7 +1607,7 @@ iterations of the loop. end = STACK.pop() start = STACK.pop() - STACK.append(slice(start, stop)) + STACK.append(slice(start, end)) if it is 3, implements:: @@ -1429,26 +1627,47 @@ iterations of the loop. an argument from two-byte to four-byte. -.. opcode:: FORMAT_VALUE (flags) +.. opcode:: CONVERT_VALUE (oparg) - Used for implementing formatted literal strings (f-strings). Pops - an optional *fmt_spec* from the stack, then a required *value*. - *flags* is interpreted as follows: + Convert value to a string, depending on ``oparg``:: - * ``(flags & 0x03) == 0x00``: *value* is formatted as-is. - * ``(flags & 0x03) == 0x01``: call :func:`str` on *value* before - formatting it. - * ``(flags & 0x03) == 0x02``: call :func:`repr` on *value* before - formatting it. - * ``(flags & 0x03) == 0x03``: call :func:`ascii` on *value* before - formatting it. - * ``(flags & 0x04) == 0x04``: pop *fmt_spec* from the stack and use - it, else use an empty *fmt_spec*. + value = STACK.pop() + result = func(value) + STACK.append(result) - Formatting is performed using :c:func:`PyObject_Format`. The - result is pushed on the stack. + * ``oparg == 1``: call :func:`str` on *value* + * ``oparg == 2``: call :func:`repr` on *value* + * ``oparg == 3``: call :func:`ascii` on *value* - .. versionadded:: 3.6 + Used for implementing formatted literal strings (f-strings). + + .. versionadded:: 3.13 + + +.. opcode:: FORMAT_SIMPLE + + Formats the value on top of stack:: + + value = STACK.pop() + result = value.__format__("") + STACK.append(result) + + Used for implementing formatted literal strings (f-strings). + + .. versionadded:: 3.13 + +.. opcode:: FORMAT_WITH_SPEC + + Formats the given value with the given format spec:: + + spec = STACK.pop() + value = STACK.pop() + result = value.__format__(spec) + STACK.append(result) + + Used for implementing formatted literal strings (f-strings). + + .. versionadded:: 3.13 .. opcode:: MATCH_CLASS (count) @@ -1469,11 +1688,12 @@ iterations of the loop. success (``True``) or failure (``False``). -.. opcode:: RESUME (where) +.. opcode:: RESUME (context) A no-op. Performs internal tracing, debugging and optimization checks. - The ``where`` operand marks where the ``RESUME`` occurs: + The ``context`` oparand consists of two parts. The lowest two bits + indicate where the ``RESUME`` occurs: * ``0`` The start of a function, which is neither a generator, coroutine nor an async generator @@ -1481,8 +1701,14 @@ iterations of the loop. * ``2`` After a ``yield from`` expression * ``3`` After an ``await`` expression + The next bit is ``1`` if the RESUME is at except-depth ``1``, and ``0`` + otherwise. + .. versionadded:: 3.11 + .. versionchanged:: 3.13 + The oparg value changed to include information about except-depth + .. opcode:: RETURN_GENERATOR @@ -1498,9 +1724,9 @@ iterations of the loop. Equivalent to ``STACK[-1] = STACK[-2].send(STACK[-1])``. Used in ``yield from`` and ``await`` statements. - If the call raises :exc:`StopIteration`, pop both items, push the - exception's ``value`` attribute, and increment the bytecode counter by - *delta*. + If the call raises :exc:`StopIteration`, pop the top value from the stack, + push the exception's ``value`` attribute, and increment the bytecode counter + by *delta*. .. versionadded:: 3.11 @@ -1511,8 +1737,8 @@ iterations of the loop. opcodes in the range [0,255] which don't use their argument and those that do (``< HAVE_ARGUMENT`` and ``>= HAVE_ARGUMENT``, respectively). - If your application uses pseudo instructions, use the :data:`hasarg` - collection instead. + If your application uses pseudo instructions or specialized instructions, + use the :data:`hasarg` collection instead. .. versionchanged:: 3.6 Now every instruction has an argument, but opcodes ``< HAVE_ARGUMENT`` @@ -1523,12 +1749,14 @@ iterations of the loop. it is not true that comparison with ``HAVE_ARGUMENT`` indicates whether they use their arg. + .. deprecated:: 3.13 + Use :data:`hasarg` instead. .. opcode:: CALL_INTRINSIC_1 Calls an intrinsic function with one argument. Passes ``STACK[-1]`` as the argument and sets ``STACK[-1]`` to the result. Used to implement - functionality that is necessary but not performance critical. + functionality that is not performance critical. The operand determines which intrinsic function is called: @@ -1546,7 +1774,7 @@ iterations of the loop. | ``INTRINSIC_STOPITERATION_ERROR`` | Extracts the return value from a | | | ``StopIteration`` exception. | +-----------------------------------+-----------------------------------+ - | ``INTRINSIC_ASYNC_GEN_WRAP`` | Wraps an aync generator value | + | ``INTRINSIC_ASYNC_GEN_WRAP`` | Wraps an async generator value | +-----------------------------------+-----------------------------------+ | ``INTRINSIC_UNARY_POSITIVE`` | Performs the unary ``+`` | | | operation | @@ -1576,9 +1804,13 @@ iterations of the loop. .. opcode:: CALL_INTRINSIC_2 - Calls an intrinsic function with two arguments. Passes ``STACK[-2]``, ``STACK[-1]`` as the - arguments and sets ``STACK[-1]`` to the result. Used to implement functionality that is - necessary but not performance critical. + Calls an intrinsic function with two arguments. Used to implement functionality + that is not performance critical:: + + arg2 = STACK.pop() + arg1 = STACK.pop() + result = intrinsic2(arg1, arg2) + STACK.append(result) The operand determines which intrinsic function is called: @@ -1648,6 +1880,17 @@ but are replaced by real opcodes or removed before bytecode is generated. Undirected relative jump instructions which are replaced by their directed (forward/backward) counterparts by the assembler. +.. opcode:: LOAD_CLOSURE (i) + + Pushes a reference to the cell contained in slot ``i`` of the "fast locals" + storage. + + Note that ``LOAD_CLOSURE`` is replaced with ``LOAD_FAST`` in the assembler. + + .. versionchanged:: 3.13 + This opcode is now a pseudo-instruction. + + .. opcode:: LOAD_METHOD Optimized unbound method lookup. Emitted as a ``LOAD_ATTR`` opcode @@ -1663,8 +1906,9 @@ These collections are provided for automatic introspection of bytecode instructions: .. versionchanged:: 3.12 - The collections now contain pseudo instructions as well. These are - opcodes with values ``>= MIN_PSEUDO_OPCODE``. + The collections now contain pseudo instructions and instrumented + instructions as well. These are opcodes with values ``>= MIN_PSEUDO_OPCODE`` + and ``>= MIN_INSTRUMENTED_OPCODE``. .. data:: opname @@ -1695,10 +1939,10 @@ instructions: .. data:: hasfree - Sequence of bytecodes that access a free variable. 'free' in this - context refers to names in the current scope that are referenced by inner - scopes or names in outer scopes that are referenced from this scope. It does - *not* include references to global or builtin scopes. + Sequence of bytecodes that access a :term:`free (closure) variable `. + 'free' in this context refers to names in the current scope that are + referenced by inner scopes or names in outer scopes that are referenced + from this scope. It does *not* include references to global or builtin scopes. .. data:: hasname @@ -1706,15 +1950,12 @@ instructions: Sequence of bytecodes that access an attribute by name. -.. data:: hasjrel +.. data:: hasjump - Sequence of bytecodes that have a relative jump target. - - -.. data:: hasjabs - - Sequence of bytecodes that have an absolute jump target. + Sequence of bytecodes that have a jump target. All jumps + are relative. + .. versionadded:: 3.13 .. data:: haslocal @@ -1730,3 +1971,20 @@ instructions: Sequence of bytecodes that set an exception handler. .. versionadded:: 3.12 + + +.. data:: hasjrel + + Sequence of bytecodes that have a relative jump target. + + .. deprecated:: 3.13 + All jumps are now relative. Use :data:`hasjump`. + + +.. data:: hasjabs + + Sequence of bytecodes that have an absolute jump target. + + .. deprecated:: 3.13 + All jumps are now relative. This list is empty. + diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst new file mode 100644 index 00000000..af63e035 --- /dev/null +++ b/Doc/library/distutils.rst @@ -0,0 +1,17 @@ +:mod:`!distutils` --- Building and installing Python modules +============================================================ + +.. module:: distutils + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.10 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.10. The removal was decided in :pep:`632`, +which has `migration advice +`_. + +The last version of Python that provided the :mod:`!distutils` module was +`Python 3.11 `_. diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index d6e4dca0..6b0282ee 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -1,5 +1,5 @@ -:mod:`doctest` --- Test interactive Python examples -=================================================== +:mod:`!doctest` --- Test interactive Python examples +==================================================== .. module:: doctest :synopsis: Test pieces of code within docstrings. @@ -123,10 +123,10 @@ And so on, eventually ending with: OverflowError: n too large ok 2 items passed all tests: - 1 tests in __main__ - 8 tests in __main__.factorial - 9 tests in 2 items. - 9 passed and 0 failed. + 1 test in __main__ + 6 tests in __main__.factorial + 7 tests in 2 items. + 7 passed. Test passed. $ @@ -134,7 +134,7 @@ That's all you need to know to start making productive use of :mod:`doctest`! Jump in. The following sections provide full details. Note that there are many examples of doctests in the standard Python test suite and libraries. Especially useful examples can be found in the standard test file -:file:`Lib/test/test_doctest.py`. +:file:`Lib/test/test_doctest/test_doctest.py`. .. _doctest-simple-testmod: @@ -143,13 +143,13 @@ Simple Usage: Checking Examples in Docstrings --------------------------------------------- The simplest way to start using doctest (but not necessarily the way you'll -continue to do it) is to end each module :mod:`M` with:: +continue to do it) is to end each module :mod:`!M` with:: if __name__ == "__main__": import doctest doctest.testmod() -:mod:`doctest` then examines docstrings in module :mod:`M`. +:mod:`!doctest` then examines docstrings in module :mod:`!M`. Running the module as a script causes the examples in the docstrings to get executed and verified:: @@ -277,13 +277,34 @@ Which Docstrings Are Examined? The module docstring, and all function, class and method docstrings are searched. Objects imported into the module are not searched. -In addition, if ``M.__test__`` exists and "is true", it must be a dict, and each +In addition, there are cases when you want tests to be part of a module but not part +of the help text, which requires that the tests not be included in the docstring. +Doctest looks for a module-level variable called ``__test__`` and uses it to locate other +tests. If ``M.__test__`` exists, it must be a dict, and each entry maps a (string) name to a function object, class object, or string. Function and class object docstrings found from ``M.__test__`` are searched, and strings are treated as if they were docstrings. In output, a key ``K`` in -``M.__test__`` appears with name :: +``M.__test__`` appears with name ``M.__test__.K``. - .__test__.K +For example, place this block of code at the top of :file:`example.py`: + +.. code-block:: python + + __test__ = { + 'numbers': """ + >>> factorial(6) + 720 + + >>> [factorial(n) for n in range(6)] + [1, 1, 2, 6, 24, 120] + """ + } + +The value of ``example.__test__["numbers"]`` will be treated as a +docstring and all the tests inside it will be run. It is +important to note that the value can be mapped to a function, +class object, or module; if so, :mod:`!doctest` +searches them recursively for docstrings, which are then scanned for tests. Any classes found are recursively searched similarly, to test docstrings in their contained methods and nested classes. @@ -382,10 +403,10 @@ What's the Execution Context? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, each time :mod:`doctest` finds a docstring to test, it uses a -*shallow copy* of :mod:`M`'s globals, so that running tests doesn't change the -module's real globals, and so that one test in :mod:`M` can't leave behind +*shallow copy* of :mod:`!M`'s globals, so that running tests doesn't change the +module's real globals, and so that one test in :mod:`!M` can't leave behind crumbs that accidentally allow another test to work. This means examples can -freely use any names defined at top-level in :mod:`M`, and names defined earlier +freely use any names defined at top-level in :mod:`!M`, and names defined earlier in the docstring being run. Examples cannot see names defined in other docstrings. @@ -779,18 +800,18 @@ guarantee about output. For example, when printing a set, Python doesn't guarantee that the element is printed in any particular order, so a test like :: >>> foo() - {"Hermione", "Harry"} + {"spam", "eggs"} is vulnerable! One workaround is to do :: - >>> foo() == {"Hermione", "Harry"} + >>> foo() == {"spam", "eggs"} True instead. Another is to do :: >>> d = sorted(foo()) >>> d - ['Harry', 'Hermione'] + ['eggs', 'spam'] There are others, but you get the idea. @@ -923,8 +944,8 @@ and :ref:`doctest-simple-testfile`. (or module :mod:`__main__` if *m* is not supplied or is ``None``), starting with ``m.__doc__``. - Also test examples reachable from dict ``m.__test__``, if it exists and is not - ``None``. ``m.__test__`` maps names (strings) to functions, classes and + Also test examples reachable from dict ``m.__test__``, if it exists. + ``m.__test__`` maps names (strings) to functions, classes and strings; function and class docstrings are searched for examples; strings are searched directly, as if they were docstrings. @@ -937,7 +958,8 @@ and :ref:`doctest-simple-testfile`. Optional argument *exclude_empty* defaults to false. If true, objects for which no doctests are found are excluded from consideration. The default is a backward - compatibility hack, so that code still using :meth:`doctest.master.summarize` in + compatibility hack, so that code still using + :meth:`doctest.master.summarize ` in conjunction with :func:`testmod` continues to get output for objects with no tests. The *exclude_empty* argument to the newer :class:`DocTestFinder` constructor defaults to true. @@ -976,7 +998,7 @@ As your collection of doctest'ed modules grows, you'll want a way to run all their doctests systematically. :mod:`doctest` provides two functions that can be used to create :mod:`unittest` test suites from modules and text files containing doctests. To integrate with :mod:`unittest` test discovery, include -a :func:`load_tests` function in your test module:: +a :ref:`load_tests ` function in your test module:: import unittest import doctest @@ -999,7 +1021,8 @@ from text files and modules with doctests: and runs the interactive examples in each file. If an example in any file fails, then the synthesized unit test fails, and a :exc:`failureException` exception is raised showing the name of the file containing the test and a - (sometimes approximate) line number. + (sometimes approximate) line number. If all the examples in a file are + skipped, then the synthesized unit test is also marked as skipped. Pass one or more paths (as strings) to text files to be examined. @@ -1065,7 +1088,8 @@ from text files and modules with doctests: and runs each doctest in the module. If any of the doctests fail, then the synthesized unit test fails, and a :exc:`failureException` exception is raised showing the name of the file containing the test and a (sometimes approximate) - line number. + line number. If all the examples in a docstring are skipped, then the + synthesized unit test is also marked as skipped. Optional argument *module* provides the module to be tested. It can be a module object or a (possibly dotted) module name. If not specified, the module calling @@ -1090,19 +1114,24 @@ from text files and modules with doctests: :func:`DocTestSuite` returns an empty :class:`unittest.TestSuite` if *module* contains no docstrings instead of raising :exc:`ValueError`. +.. exception:: failureException + + When doctests which have been converted to unit tests by :func:`DocFileSuite` + or :func:`DocTestSuite` fail, this exception is raised showing the name of + the file containing the test and a (sometimes approximate) line number. Under the covers, :func:`DocTestSuite` creates a :class:`unittest.TestSuite` out -of :class:`doctest.DocTestCase` instances, and :class:`DocTestCase` is a -subclass of :class:`unittest.TestCase`. :class:`DocTestCase` isn't documented +of :class:`!doctest.DocTestCase` instances, and :class:`!DocTestCase` is a +subclass of :class:`unittest.TestCase`. :class:`!DocTestCase` isn't documented here (it's an internal detail), but studying its code can answer questions about the exact details of :mod:`unittest` integration. Similarly, :func:`DocFileSuite` creates a :class:`unittest.TestSuite` out of -:class:`doctest.DocFileCase` instances, and :class:`DocFileCase` is a subclass -of :class:`DocTestCase`. +:class:`!doctest.DocFileCase` instances, and :class:`!DocFileCase` is a subclass +of :class:`!DocTestCase`. So both ways of creating a :class:`unittest.TestSuite` run instances of -:class:`DocTestCase`. This is important for a subtle reason: when you run +:class:`!DocTestCase`. This is important for a subtle reason: when you run :mod:`doctest` functions yourself, you can control the :mod:`doctest` options in use directly, by passing option flags to :mod:`doctest` functions. However, if you're writing a :mod:`unittest` framework, :mod:`unittest` ultimately controls @@ -1123,14 +1152,14 @@ reporting flags specific to :mod:`unittest` support, via this function: section :ref:`doctest-options`. Only "reporting flags" can be used. This is a module-global setting, and affects all future doctests run by module - :mod:`unittest`: the :meth:`runTest` method of :class:`DocTestCase` looks at - the option flags specified for the test case when the :class:`DocTestCase` + :mod:`unittest`: the :meth:`!runTest` method of :class:`!DocTestCase` looks at + the option flags specified for the test case when the :class:`!DocTestCase` instance was constructed. If no reporting flags were specified (which is the - typical and expected case), :mod:`doctest`'s :mod:`unittest` reporting flags are + typical and expected case), :mod:`!doctest`'s :mod:`unittest` reporting flags are :ref:`bitwise ORed ` into the option flags, and the option flags so augmented are passed to the :class:`DocTestRunner` instance created to run the doctest. If any reporting flags were specified when the - :class:`DocTestCase` instance was constructed, :mod:`doctest`'s + :class:`!DocTestCase` instance was constructed, :mod:`!doctest`'s :mod:`unittest` reporting flags are ignored. The value of the :mod:`unittest` reporting flags in effect before the function @@ -1300,7 +1329,8 @@ Example Objects A dictionary mapping from option flags to ``True`` or ``False``, which is used to override default options for this example. Any option flags not contained in this dictionary are left at their default value (as specified by the - :class:`DocTestRunner`'s :attr:`optionflags`). By default, no options are set. + :class:`DocTestRunner`'s :ref:`optionflags `). + By default, no options are set. .. _doctest-doctestfinder: @@ -1409,6 +1439,27 @@ DocTestParser objects identifying this string, and is only used for error messages. +TestResults objects +^^^^^^^^^^^^^^^^^^^ + + +.. class:: TestResults(failed, attempted) + + .. attribute:: failed + + Number of failed tests. + + .. attribute:: attempted + + Number of attempted tests. + + .. attribute:: skipped + + Number of skipped tests. + + .. versionadded:: 3.13 + + .. _doctest-doctestrunner: DocTestRunner objects @@ -1427,7 +1478,7 @@ DocTestRunner objects passing a subclass of :class:`OutputChecker` to the constructor. The test runner's display output can be controlled in two ways. First, an output - function can be passed to :meth:`TestRunner.run`; this function will be called + function can be passed to :meth:`run`; this function will be called with strings that should be displayed. It defaults to ``sys.stdout.write``. If capturing the output is not sufficient, then the display output can be also customized by subclassing DocTestRunner, and overriding the methods @@ -1448,8 +1499,12 @@ DocTestRunner objects runner compares expected output to actual output, and how it displays failures. For more information, see section :ref:`doctest-options`. + The test runner accumulates statistics. The aggregated number of attempted, + failed and skipped examples is also available via the :attr:`tries`, + :attr:`failures` and :attr:`skips` attributes. The :meth:`run` and + :meth:`summarize` methods return a :class:`TestResults` instance. - :class:`DocTestParser` defines the following methods: + :class:`DocTestRunner` defines the following methods: .. method:: report_start(out, test, example) @@ -1500,7 +1555,8 @@ DocTestRunner objects .. method:: run(test, compileflags=None, out=None, clear_globs=True) Run the examples in *test* (a :class:`DocTest` object), and display the - results using the writer function *out*. + results using the writer function *out*. Return a :class:`TestResults` + instance. The examples are run in the namespace ``test.globs``. If *clear_globs* is true (the default), then this namespace will be cleared after the test runs, @@ -1513,18 +1569,35 @@ DocTestRunner objects The output of each example is checked using the :class:`DocTestRunner`'s output checker, and the results are formatted by the - :meth:`DocTestRunner.report_\*` methods. + :meth:`!DocTestRunner.report_\*` methods. .. method:: summarize(verbose=None) Print a summary of all the test cases that have been run by this DocTestRunner, - and return a :term:`named tuple` ``TestResults(failed, attempted)``. + and return a :class:`TestResults` instance. The optional *verbose* argument controls how detailed the summary is. If the verbosity is not specified, then the :class:`DocTestRunner`'s verbosity is used. + :class:`DocTestParser` has the following attributes: + + .. attribute:: tries + + Number of attempted examples. + + .. attribute:: failures + + Number of failed examples. + + .. attribute:: skips + + Number of skipped examples. + + .. versionadded:: 3.13 + + .. _doctest-outputchecker: OutputChecker objects @@ -1671,12 +1744,12 @@ code under the debugger: module) of the object with the doctests of interest. The result is a string, containing the object's docstring converted to a Python script, as described for :func:`script_from_examples` above. For example, if module :file:`a.py` - contains a top-level function :func:`f`, then :: + contains a top-level function :func:`!f`, then :: import a, doctest print(doctest.testsource(a, "a.f")) - prints a script version of function :func:`f`'s docstring, with doctests + prints a script version of function :func:`!f`'s docstring, with doctests converted to code, and the rest placed in comments. @@ -1862,7 +1935,7 @@ such a test runner:: optionflags=flags) else: fail, total = doctest.testmod(optionflags=flags) - print("{} failures out of {} tests".format(fail, total)) + print(f"{fail} failures out of {total} tests") .. rubric:: Footnotes diff --git a/Doc/library/email.charset.rst b/Doc/library/email.charset.rst index aa013441..6875af2b 100644 --- a/Doc/library/email.charset.rst +++ b/Doc/library/email.charset.rst @@ -1,5 +1,5 @@ -:mod:`email.charset`: Representing character sets -------------------------------------------------- +:mod:`!email.charset`: Representing character sets +-------------------------------------------------- .. module:: email.charset :synopsis: Character Sets diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index 5bef155a..4285c436 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -7,6 +7,7 @@ :synopsis: The base class representing email messages in a fashion backward compatible with Python 3.2 :noindex: + :no-index: The :class:`Message` class is very similar to the @@ -104,7 +105,7 @@ Here are the methods of the :class:`Message` class: .. method:: __str__() - Equivalent to :meth:`.as_string()`. Allows ``str(msg)`` to produce a + Equivalent to :meth:`.as_string`. Allows ``str(msg)`` to produce a string containing the formatted message. @@ -142,7 +143,7 @@ Here are the methods of the :class:`Message` class: .. method:: __bytes__() - Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a + Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes object containing the formatted message. .. versionadded:: 3.4 @@ -367,7 +368,7 @@ Here are the methods of the :class:`Message` class: .. method:: get(name, failobj=None) Return the value of the named header field. This is identical to - :meth:`__getitem__` except that optional *failobj* is returned if the + :meth:`~object.__getitem__` except that optional *failobj* is returned if the named header is missing (defaults to ``None``). Here are some additional useful methods: diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index 918fc556..a86e2274 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -1,5 +1,5 @@ -:mod:`email.contentmanager`: Managing MIME Content --------------------------------------------------- +:mod:`!email.contentmanager`: Managing MIME Content +--------------------------------------------------- .. module:: email.contentmanager :synopsis: Storing and Retrieving Content from MIME Parts @@ -32,9 +32,9 @@ To find the handler, look for the following keys in the registry, stopping with the first one found: - * the string representing the full MIME type (``maintype/subtype``) - * the string representing the ``maintype`` - * the empty string + * the string representing the full MIME type (``maintype/subtype``) + * the string representing the ``maintype`` + * the empty string If none of these keys produce a handler, raise a :exc:`KeyError` for the full MIME type. @@ -55,14 +55,15 @@ look for the following keys in the registry, stopping with the first one found: - * the type itself (``typ``) - * the type's fully qualified name (``typ.__module__ + '.' + - typ.__qualname__``). - * the type's qualname (``typ.__qualname__``) - * the type's name (``typ.__name__``). + * the type itself (``typ``) + * the type's fully qualified name (``typ.__module__ + '.' + + typ.__qualname__``). + * the type's :attr:`qualname ` (``typ.__qualname__``) + * the type's :attr:`name ` (``typ.__name__``). If none of the above match, repeat all of the checks above for each of - the types in the :term:`MRO` (``typ.__mro__``). Finally, if no other key + the types in the :term:`MRO` (:attr:`typ.__mro__ `). + Finally, if no other key yields a handler, check for a handler for the key ``None``. If there is no handler for ``None``, raise a :exc:`KeyError` for the fully qualified name of the type. @@ -132,15 +133,15 @@ Currently the email package provides only one concrete content manager, Add a :mailheader:`Content-Type` header with a ``maintype/subtype`` value. - * For ``str``, set the MIME ``maintype`` to ``text``, and set the - subtype to *subtype* if it is specified, or ``plain`` if it is not. - * For ``bytes``, use the specified *maintype* and *subtype*, or - raise a :exc:`TypeError` if they are not specified. - * For :class:`~email.message.EmailMessage` objects, set the maintype - to ``message``, and set the subtype to *subtype* if it is - specified or ``rfc822`` if it is not. If *subtype* is - ``partial``, raise an error (``bytes`` objects must be used to - construct ``message/partial`` parts). + * For ``str``, set the MIME ``maintype`` to ``text``, and set the + subtype to *subtype* if it is specified, or ``plain`` if it is not. + * For ``bytes``, use the specified *maintype* and *subtype*, or + raise a :exc:`TypeError` if they are not specified. + * For :class:`~email.message.EmailMessage` objects, set the maintype + to ``message``, and set the subtype to *subtype* if it is + specified or ``rfc822`` if it is not. If *subtype* is + ``partial``, raise an error (``bytes`` objects must be used to + construct ``message/partial`` parts). If *charset* is provided (which is valid only for ``str``), encode the string to bytes using the specified character set. The default is @@ -155,14 +156,14 @@ Currently the email package provides only one concrete content manager, ``7bit`` for an input that contains non-ASCII values), raise a :exc:`ValueError`. - * For ``str`` objects, if *cte* is not set use heuristics to - determine the most compact encoding. - * For :class:`~email.message.EmailMessage`, per :rfc:`2046`, raise - an error if a *cte* of ``quoted-printable`` or ``base64`` is - requested for *subtype* ``rfc822``, and for any *cte* other than - ``7bit`` for *subtype* ``external-body``. For - ``message/rfc822``, use ``8bit`` if *cte* is not specified. For - all other values of *subtype*, use ``7bit``. + * For ``str`` objects, if *cte* is not set use heuristics to + determine the most compact encoding. + * For :class:`~email.message.EmailMessage`, per :rfc:`2046`, raise + an error if a *cte* of ``quoted-printable`` or ``base64`` is + requested for *subtype* ``rfc822``, and for any *cte* other than + ``7bit`` for *subtype* ``external-body``. For + ``message/rfc822``, use ``8bit`` if *cte* is not specified. For + all other values of *subtype*, use ``7bit``. .. note:: A *cte* of ``binary`` does not actually work correctly yet. The ``EmailMessage`` object as modified by ``set_content`` is diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index 3bd377e3..9c8c8c92 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -1,5 +1,5 @@ -:mod:`email.encoders`: Encoders -------------------------------- +:mod:`!email.encoders`: Encoders +-------------------------------- .. module:: email.encoders :synopsis: Encoders for email message payloads. diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst index 194a9869..f8f43d82 100644 --- a/Doc/library/email.errors.rst +++ b/Doc/library/email.errors.rst @@ -1,5 +1,5 @@ -:mod:`email.errors`: Exception and Defect classes -------------------------------------------------- +:mod:`!email.errors`: Exception and Defect classes +-------------------------------------------------- .. module:: email.errors :synopsis: The exception classes used by the email package. @@ -59,6 +59,22 @@ The following exception classes are defined in the :mod:`email.errors` module: :class:`~email.mime.image.MIMEImage`). +.. exception:: HeaderWriteError() + + Raised when an error occurs when the :mod:`~email.generator` outputs + headers. + + +.. exception:: MessageDefect() + + This is the base class for all defects found when parsing email messages. + It is derived from :exc:`ValueError`. + +.. exception:: HeaderDefect() + + This is the base class for all defects found when parsing email headers. + It is derived from :exc:`MessageDefect`. + Here is the list of the defects that the :class:`~email.parser.FeedParser` can find while parsing messages. Note that the defects are added to the message where the problem was found, so for example, if a message nested inside a diff --git a/Doc/library/email.examples.rst b/Doc/library/email.examples.rst index fc964622..492a8354 100644 --- a/Doc/library/email.examples.rst +++ b/Doc/library/email.examples.rst @@ -55,11 +55,11 @@ Up to the prompt, the output from the above is: To: Penelope Pussycat , Fabrette Pussycat From: Pepé Le Pew - Subject: Ayons asperges pour le déjeuner + Subject: Pourquoi pas des asperges pour ce midi ? Salut! - Cela ressemble à un excellent recipie[1] déjeuner. + Cette recette [1] sera sûrement un très bon repas. .. rubric:: Footnotes diff --git a/Doc/library/email.generator.rst b/Doc/library/email.generator.rst index 91d9d69a..a3132d02 100644 --- a/Doc/library/email.generator.rst +++ b/Doc/library/email.generator.rst @@ -1,5 +1,5 @@ -:mod:`email.generator`: Generating MIME documents -------------------------------------------------- +:mod:`!email.generator`: Generating MIME documents +-------------------------------------------------- .. module:: email.generator :synopsis: Generate flat text email messages from a message structure. @@ -10,8 +10,8 @@ One of the most common tasks is to generate the flat (serialized) version of the email message represented by a message object structure. You will need to -do this if you want to send your message via :meth:`smtplib.SMTP.sendmail` or -the :mod:`nntplib` module, or print the message on the console. Taking a +do this if you want to send your message via :meth:`smtplib.SMTP.sendmail`, +or print the message on the console. Taking a message object structure and producing a serialized representation is the job of the generator classes. diff --git a/Doc/library/email.header.rst b/Doc/library/email.header.rst index e093f138..219fad0d 100644 --- a/Doc/library/email.header.rst +++ b/Doc/library/email.header.rst @@ -1,5 +1,5 @@ -:mod:`email.header`: Internationalized headers ----------------------------------------------- +:mod:`!email.header`: Internationalized headers +----------------------------------------------- .. module:: email.header :synopsis: Representing non-ASCII headers @@ -77,7 +77,7 @@ Here is the :class:`Header` class description: The maximum line length can be specified explicitly via *maxlinelen*. For splitting the first line to a shorter value (to account for the field header which isn't included in *s*, e.g. :mailheader:`Subject`) pass in the name of the - field in *header_name*. The default *maxlinelen* is 76, and the default value + field in *header_name*. The default *maxlinelen* is 78, and the default value for *header_name* is ``None``, meaning it is not taken into account for the first line of a long, split header. diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 00a954e0..7f804493 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -1,5 +1,5 @@ -:mod:`email.headerregistry`: Custom Header Objects --------------------------------------------------- +:mod:`!email.headerregistry`: Custom Header Objects +--------------------------------------------------- .. module:: email.headerregistry :synopsis: Automatic Parsing of headers based on the field name @@ -317,7 +317,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1. class. When *use_default_map* is ``True`` (the default), the standard mapping of header names to classes is copied in to the registry during initialization. *base_class* is always the last class in the generated - class's ``__bases__`` list. + class's :class:`~type.__bases__` list. The default mappings are: diff --git a/Doc/library/email.iterators.rst b/Doc/library/email.iterators.rst index d53ab33b..090981d8 100644 --- a/Doc/library/email.iterators.rst +++ b/Doc/library/email.iterators.rst @@ -1,5 +1,5 @@ -:mod:`email.iterators`: Iterators ---------------------------------- +:mod:`!email.iterators`: Iterators +---------------------------------- .. module:: email.iterators :synopsis: Iterate over a message object tree. diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst index 225f4987..71d6e321 100644 --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -1,5 +1,5 @@ -:mod:`email.message`: Representing an email message ---------------------------------------------------- +:mod:`!email.message`: Representing an email message +---------------------------------------------------- .. module:: email.message :synopsis: The base class representing email messages. @@ -40,9 +40,9 @@ over the object tree. The :class:`EmailMessage` dictionary-like interface is indexed by the header names, which must be ASCII values. The values of the dictionary are strings with some extra methods. Headers are stored and returned in case-preserving -form, but field names are matched case-insensitively. Unlike a real dict, -there is an ordering to the keys, and there can be duplicate keys. Additional -methods are provided for working with headers that have duplicate keys. +form, but field names are matched case-insensitively. The keys are ordered, +but unlike a real dict, there can be duplicates. Additional methods are +provided for working with headers that have duplicate keys. The *payload* is either a string or bytes object, in the case of simple message objects, or a list of :class:`EmailMessage` objects, for MIME container @@ -124,7 +124,7 @@ message objects. .. method:: __bytes__() - Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a + Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes object containing the serialized message. @@ -247,7 +247,7 @@ message objects. .. method:: get(name, failobj=None) Return the value of the named header field. This is identical to - :meth:`__getitem__` except that optional *failobj* is returned if the + :meth:`~object.__getitem__` except that optional *failobj* is returned if the named header is missing (*failobj* defaults to ``None``). diff --git a/Doc/library/email.mime.rst b/Doc/library/email.mime.rst index d7c0d203..b85673a4 100644 --- a/Doc/library/email.mime.rst +++ b/Doc/library/email.mime.rst @@ -1,5 +1,5 @@ -:mod:`email.mime`: Creating email and MIME objects from scratch ---------------------------------------------------------------- +:mod:`!email.mime`: Creating email and MIME objects from scratch +---------------------------------------------------------------- .. module:: email.mime :synopsis: Build MIME messages. @@ -28,7 +28,7 @@ make things easier. Here are the classes: -.. currentmodule:: email.mime.base +.. module:: email.mime.base .. class:: MIMEBase(_maintype, _subtype, *, policy=compat32, **_params) @@ -58,7 +58,7 @@ Here are the classes: Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.nonmultipart +.. module:: email.mime.nonmultipart .. class:: MIMENonMultipart() @@ -72,7 +72,7 @@ Here are the classes: is called, a :exc:`~email.errors.MultipartConversionError` exception is raised. -.. currentmodule:: email.mime.multipart +.. module:: email.mime.multipart .. class:: MIMEMultipart(_subtype='mixed', boundary=None, _subparts=None, \ *, policy=compat32, **_params) @@ -104,7 +104,7 @@ Here are the classes: .. versionchanged:: 3.6 Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.application +.. module:: email.mime.application .. class:: MIMEApplication(_data, _subtype='octet-stream', \ _encoder=email.encoders.encode_base64, \ @@ -135,7 +135,7 @@ Here are the classes: .. versionchanged:: 3.6 Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.audio +.. module:: email.mime.audio .. class:: MIMEAudio(_audiodata, _subtype=None, \ _encoder=email.encoders.encode_base64, \ @@ -169,7 +169,7 @@ Here are the classes: .. versionchanged:: 3.6 Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.image +.. module:: email.mime.image .. class:: MIMEImage(_imagedata, _subtype=None, \ _encoder=email.encoders.encode_base64, \ @@ -205,7 +205,7 @@ Here are the classes: .. versionchanged:: 3.6 Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.message +.. module:: email.mime.message .. class:: MIMEMessage(_msg, _subtype='rfc822', *, policy=compat32) @@ -225,7 +225,7 @@ Here are the classes: .. versionchanged:: 3.6 Added *policy* keyword-only parameter. -.. currentmodule:: email.mime.text +.. module:: email.mime.text .. class:: MIMEText(_text, _subtype='plain', _charset=None, *, policy=compat32) diff --git a/Doc/library/email.parser.rst b/Doc/library/email.parser.rst index dda0466a..439b5c8f 100644 --- a/Doc/library/email.parser.rst +++ b/Doc/library/email.parser.rst @@ -1,5 +1,5 @@ -:mod:`email.parser`: Parsing email messages -------------------------------------------- +:mod:`!email.parser`: Parsing email messages +-------------------------------------------- .. module:: email.parser :synopsis: Parse flat text email messages to produce a message object structure. diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst index 2439dee6..314767d0 100644 --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -1,5 +1,5 @@ -:mod:`email.policy`: Policy Objects ------------------------------------ +:mod:`!email.policy`: Policy Objects +------------------------------------ .. module:: email.policy :synopsis: Controlling the parsing and generating of messages @@ -219,7 +219,6 @@ added matters. To illustrate:: Default: :const:`False`. .. versionadded:: 3.5 - The *mangle_from_* parameter. .. attribute:: message_factory @@ -230,6 +229,24 @@ added matters. To illustrate:: .. versionadded:: 3.6 + + .. attribute:: verify_generated_headers + + If ``True`` (the default), the generator will raise + :exc:`~email.errors.HeaderWriteError` instead of writing a header + that is improperly folded or delimited, such that it would + be parsed as multiple headers or joined with adjacent data. + Such headers can be generated by custom header classes or bugs + in the ``email`` module. + + As it's a security feature, this defaults to ``True`` even in the + :class:`~email.policy.Compat32` policy. + For backwards compatible, but unsafe, behavior, it must be set to + ``False`` explicitly. + + .. versionadded:: 3.13 + + The following :class:`Policy` method is intended to be called by code using the email library to create policy instances with custom settings: @@ -557,17 +574,17 @@ more closely to the RFCs relevant to their domains. With all of these :class:`EmailPolicies <.EmailPolicy>`, the effective API of the email package is changed from the Python 3.2 API in the following ways: - * Setting a header on a :class:`~email.message.Message` results in that - header being parsed and a header object created. +* Setting a header on a :class:`~email.message.Message` results in that + header being parsed and a header object created. - * Fetching a header value from a :class:`~email.message.Message` results - in that header being parsed and a header object created and - returned. +* Fetching a header value from a :class:`~email.message.Message` results + in that header being parsed and a header object created and + returned. - * Any header object, or any header that is refolded due to the - policy settings, is folded using an algorithm that fully implements the - RFC folding algorithms, including knowing where encoded words are required - and allowed. +* Any header object, or any header that is refolded due to the + policy settings, is folded using an algorithm that fully implements the + RFC folding algorithms, including knowing where encoded words are required + and allowed. From the application view, this means that any header obtained through the :class:`~email.message.EmailMessage` is a header object with extra diff --git a/Doc/library/email.rst b/Doc/library/email.rst index 816fae99..66c42e4a 100644 --- a/Doc/library/email.rst +++ b/Doc/library/email.rst @@ -1,5 +1,5 @@ -:mod:`email` --- An email and MIME handling package -=================================================== +:mod:`!email` --- An email and MIME handling package +==================================================== .. module:: email :synopsis: Package supporting the parsing, manipulating, and generating @@ -15,7 +15,7 @@ The :mod:`email` package is a library for managing email messages. It is specifically *not* designed to do any sending of email messages to SMTP (:rfc:`2821`), NNTP, or other servers; those are functions of modules such as -:mod:`smtplib` and :mod:`nntplib`. The :mod:`email` package attempts to be as +:mod:`smtplib`. The :mod:`email` package attempts to be as RFC-compliant as possible, supporting :rfc:`5322` and :rfc:`6532`, as well as such MIME-related RFCs as :rfc:`2045`, :rfc:`2046`, :rfc:`2047`, :rfc:`2183`, and :rfc:`2231`. @@ -141,9 +141,6 @@ Legacy API: Module :mod:`imaplib` IMAP (Internet Message Access Protocol) client - Module :mod:`nntplib` - NNTP (Net News Transport Protocol) client - Module :mod:`mailbox` Tools for creating, reading, and managing collections of messages on disk using a variety standard formats. diff --git a/Doc/library/email.utils.rst b/Doc/library/email.utils.rst index 345b6400..6bd45200 100644 --- a/Doc/library/email.utils.rst +++ b/Doc/library/email.utils.rst @@ -1,5 +1,5 @@ -:mod:`email.utils`: Miscellaneous utilities -------------------------------------------- +:mod:`!email.utils`: Miscellaneous utilities +-------------------------------------------- .. module:: email.utils :synopsis: Miscellaneous email package utilities. @@ -58,13 +58,18 @@ of the new API. begins with angle brackets, they are stripped off. -.. function:: parseaddr(address) +.. function:: parseaddr(address, *, strict=True) Parse address -- which should be the value of some address-containing field such as :mailheader:`To` or :mailheader:`Cc` -- into its constituent *realname* and *email address* parts. Returns a tuple of that information, unless the parse fails, in which case a 2-tuple of ``('', '')`` is returned. + If *strict* is true, use a strict parser which rejects malformed inputs. + + .. versionchanged:: 3.13 + Add *strict* optional parameter and reject malformed inputs by default. + .. function:: formataddr(pair, charset='utf-8') @@ -82,12 +87,15 @@ of the new API. Added the *charset* option. -.. function:: getaddresses(fieldvalues) +.. function:: getaddresses(fieldvalues, *, strict=True) This method returns a list of 2-tuples of the form returned by ``parseaddr()``. *fieldvalues* is a sequence of header field values as might be returned by - :meth:`Message.get_all `. Here's a simple - example that gets all the recipients of a message:: + :meth:`Message.get_all `. + + If *strict* is true, use a strict parser which rejects malformed inputs. + + Here's a simple example that gets all the recipients of a message:: from email.utils import getaddresses @@ -97,6 +105,9 @@ of the new API. resent_ccs = msg.get_all('resent-cc', []) all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs) + .. versionchanged:: 3.13 + Add *strict* optional parameter and reject malformed inputs by default. + .. function:: parsedate(date) @@ -148,7 +159,7 @@ of the new API. Fri, 09 Nov 2001 01:08:47 -0000 - Optional *timeval* if given is a floating point time value as accepted by + Optional *timeval* if given is a floating-point time value as accepted by :func:`time.gmtime` and :func:`time.localtime`, otherwise the current time is used. diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index de3b93f5..8dfb7ad9 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -1,5 +1,5 @@ -:mod:`ensurepip` --- Bootstrapping the ``pip`` installer -======================================================== +:mod:`!ensurepip` --- Bootstrapping the ``pip`` installer +========================================================= .. module:: ensurepip :synopsis: Bootstrapping the "pip" installer into an existing Python @@ -38,7 +38,7 @@ when creating a virtual environment) or after explicitly uninstalling :pep:`453`: Explicit bootstrapping of pip in Python installations The original rationale and specification for this module. -.. include:: ../includes/wasm-notavail.rst +.. include:: ../includes/wasm-mobile-notavail.rst Command line interface ---------------------- diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 7653865f..2df9096c 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -1,5 +1,5 @@ -:mod:`enum` --- Support for enumerations -======================================== +:mod:`!enum` --- Support for enumerations +========================================= .. module:: enum :synopsis: Implementation of an enumeration class. @@ -44,7 +44,7 @@ using function-call syntax:: ... BLUE = 3 >>> # functional syntax - >>> Color = Enum('Color', ['RED', 'GREEN', 'BLUE']) + >>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)]) Even though we can use :keyword:`class` syntax to create Enums, Enums are not normal Python classes. See @@ -165,12 +165,12 @@ Data Types to subclass *EnumType* -- see :ref:`Subclassing EnumType ` for details. - *EnumType* is responsible for setting the correct :meth:`!__repr__`, + ``EnumType`` is responsible for setting the correct :meth:`!__repr__`, :meth:`!__str__`, :meth:`!__format__`, and :meth:`!__reduce__` methods on the final *enum*, as well as creating the enum members, properly handling duplicates, providing iteration over the enum class, etc. - .. method:: EnumType.__call__(cls, value, names=None, \*, module=None, qualname=None, type=None, start=1, boundary=None) + .. method:: EnumType.__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None) This method is called in two different ways: @@ -198,11 +198,12 @@ Data Types >>> some_var = Color.RED >>> some_var in Color True + >>> Color.RED.value in Color + True - .. note:: + .. versionchanged:: 3.12 - In Python 3.12 it will be possible to check for member values and not - just members; until then, a ``TypeError`` will be raised if a + Before Python 3.12, a ``TypeError`` is raised if a non-Enum-member is used in a containment check. .. method:: EnumType.__dir__(cls) @@ -234,6 +235,10 @@ Data Types >>> len(Color) 3 + .. attribute:: EnumType.__members__ + + Returns a mapping of every enum name to its member, including aliases + .. method:: EnumType.__reversed__(cls) Returns each member in *cls* in reverse definition order:: @@ -241,9 +246,19 @@ Data Types >>> list(reversed(Color)) [, , ] + .. method:: EnumType._add_alias_ + + Adds a new name as an alias to an existing member. Raises a + :exc:`NameError` if the name is already assigned to a different member. + + .. method:: EnumType._add_value_alias_ + + Adds a new value as an alias to an existing member. Raises a + :exc:`ValueError` if the value is already linked with a different member. + .. versionadded:: 3.11 - Before 3.11 ``enum`` used ``EnumMeta`` type, which is kept as an alias. + Before 3.11 ``EnumType`` was called ``EnumMeta``, which is still available as an alias. .. class:: Enum @@ -264,6 +279,8 @@ Data Types >>> Color.RED.value 1 + Value of the member, can be set in :meth:`~Enum.__new__`. + .. note:: Enum member values Member values can be anything: :class:`int`, :class:`str`, etc. If @@ -271,6 +288,24 @@ Data Types appropriate value will be chosen for you. See :class:`auto` for the details. + While mutable/unhashable values, such as :class:`dict`, :class:`list` or + a mutable :class:`~dataclasses.dataclass`, can be used, they will have a + quadratic performance impact during creation relative to the + total number of mutable/unhashable values in the enum. + + .. attribute:: Enum._name_ + + Name of the member. + + .. attribute:: Enum._value_ + + Value of the member, can be set in :meth:`~Enum.__new__`. + + .. attribute:: Enum._order_ + + No longer used, kept for backward compatibility. + (class attribute, removed during class creation). + .. attribute:: Enum._ignore_ ``_ignore_`` is only used during creation and is removed from the @@ -322,7 +357,18 @@ Data Types >>> PowersOfThree.SECOND.value 9 - .. method:: Enum.__init_subclass__(cls, \**kwds) + .. method:: Enum.__init__(self, *args, **kwds) + + By default, does nothing. If multiple values are given in the member + assignment, those values become separate arguments to ``__init__``; e.g. + + >>> from enum import Enum + >>> class Weekday(Enum): + ... MONDAY = 1, 'Mon' + + ``Weekday.__init__()`` would be called as ``Weekday.__init__(self, 1, 'Mon')`` + + .. method:: Enum.__init_subclass__(cls, **kwds) A *classmethod* that is used to further configure subsequent subclasses. By default, does nothing. @@ -349,6 +395,23 @@ Data Types >>> Build('deBUG') + .. method:: Enum.__new__(cls, *args, **kwds) + + By default, doesn't exist. If specified, either in the enum class + definition or in a mixin class (such as ``int``), all values given + in the member assignment will be passed; e.g. + + >>> from enum import Enum + >>> class MyIntEnum(int, Enum): + ... TWENTYSIX = '1a', 16 + + results in the call ``int('1a', 16)`` and a value of ``26`` for the member. + + .. note:: + + When writing a custom ``__new__``, do not use ``super().__new__`` -- + call the appropriate ``__new__`` instead. + .. method:: Enum.__repr__(self) Returns the string used for *repr()* calls. By default, returns the @@ -405,7 +468,7 @@ Data Types .. class:: IntEnum - *IntEnum* is the same as *Enum*, but its members are also integers and can be + *IntEnum* is the same as :class:`Enum`, but its members are also integers and can be used anywhere that an integer can be used. If any integer operation is performed with an *IntEnum* member, the resulting value loses its enumeration status. @@ -436,7 +499,7 @@ Data Types .. class:: StrEnum - *StrEnum* is the same as *Enum*, but its members are also strings and can be used + ``StrEnum`` is the same as :class:`Enum`, but its members are also strings and can be used in most of the same places that a string can be used. The result of any string operation performed on or with a *StrEnum* member is not part of the enumeration. @@ -462,9 +525,9 @@ Data Types .. class:: Flag - *Flag* members support the bitwise operators ``&`` (*AND*), ``|`` (*OR*), - ``^`` (*XOR*), and ``~`` (*INVERT*); the results of those operators are members - of the enumeration. + ``Flag`` is the same as :class:`Enum`, but its members support the bitwise + operators ``&`` (*AND*), ``|`` (*OR*), ``^`` (*XOR*), and ``~`` (*INVERT*); + the results of those operations are (aliases of) members of the enumeration. .. method:: __contains__(self, value) @@ -496,9 +559,7 @@ Data Types >>> list(purple) [, ] - .. versionchanged:: 3.11 - - Aliases are no longer returned during iteration. + .. versionadded:: 3.11 .. method:: __len__(self): @@ -509,6 +570,8 @@ Data Types >>> len(white) 3 + .. versionadded:: 3.11 + .. method:: __bool__(self): Returns *True* if any members in flag, *False* otherwise:: @@ -548,7 +611,7 @@ Data Types .. method:: __invert__(self): - Returns all the flags in *type(self)* that are not in self:: + Returns all the flags in *type(self)* that are not in *self*:: >>> ~white @@ -575,7 +638,7 @@ Data Types .. class:: IntFlag - *IntFlag* is the same as *Flag*, but its members are also integers and can be + ``IntFlag`` is the same as :class:`Flag`, but its members are also integers and can be used anywhere that an integer can be used. >>> from enum import IntFlag, auto @@ -595,12 +658,12 @@ Data Types >>> Color.RED + 2 3 - If a *Flag* operation is performed with an *IntFlag* member and: + If a :class:`Flag` operation is performed with an *IntFlag* member and: - * the result is a valid *IntFlag*: an *IntFlag* is returned - * the result is not a valid *IntFlag*: the result depends on the *FlagBoundary* setting + * the result is a valid *IntFlag*: an *IntFlag* is returned + * the result is not a valid *IntFlag*: the result depends on the :class:`FlagBoundary` setting - The *repr()* of unnamed zero-valued flags has changed. It is now: + The :func:`repr` of unnamed zero-valued flags has changed. It is now: >>> Color(0) @@ -625,8 +688,8 @@ Data Types :class:`!ReprEnum` uses the :meth:`repr() ` of :class:`Enum`, but the :class:`str() ` of the mixed-in data type: - * :meth:`!int.__str__` for :class:`IntEnum` and :class:`IntFlag` - * :meth:`!str.__str__` for :class:`StrEnum` + * :meth:`!int.__str__` for :class:`IntEnum` and :class:`IntFlag` + * :meth:`!str.__str__` for :class:`StrEnum` Inherit from :class:`!ReprEnum` to keep the :class:`str() ` / :func:`format` of the mixed-in data type instead of using the @@ -696,7 +759,7 @@ Data Types .. class:: FlagBoundary - *FlagBoundary* controls how out-of-range values are handled in *Flag* and its + ``FlagBoundary`` controls how out-of-range values are handled in :class:`Flag` and its subclasses. .. attribute:: STRICT @@ -719,7 +782,7 @@ Data Types .. attribute:: CONFORM - Out-of-range values have invalid values removed, leaving a valid *Flag* + Out-of-range values have invalid values removed, leaving a valid :class:`Flag` value:: >>> from enum import Flag, CONFORM, auto @@ -733,7 +796,7 @@ Data Types .. attribute:: EJECT - Out-of-range values lose their *Flag* membership and revert to :class:`int`. + Out-of-range values lose their :class:`Flag` membership and revert to :class:`int`. >>> from enum import Flag, EJECT, auto >>> class EjectFlag(Flag, boundary=EJECT): @@ -746,7 +809,7 @@ Data Types .. attribute:: KEEP - Out-of-range values are kept, and the *Flag* membership is kept. + Out-of-range values are kept, and the :class:`Flag` membership is kept. This is the default for :class:`IntFlag`:: >>> from enum import Flag, KEEP, auto @@ -768,37 +831,47 @@ Supported ``__dunder__`` names :attr:`~EnumType.__members__` is a read-only ordered mapping of ``member_name``:``member`` items. It is only available on the class. -:meth:`~object.__new__`, if specified, must create and return the enum members; it is -also a very good idea to set the member's :attr:`!_value_` appropriately. Once -all the members are created it is no longer used. +:meth:`~Enum.__new__`, if specified, must create and return the enum members; +it is also a very good idea to set the member's :attr:`!_value_` appropriately. +Once all the members are created it is no longer used. Supported ``_sunder_`` names """""""""""""""""""""""""""" -- ``_name_`` -- name of the member -- ``_value_`` -- value of the member; can be set / modified in ``__new__`` +- :meth:`~EnumType._add_alias_` -- adds a new name as an alias to an existing + member. +- :meth:`~EnumType._add_value_alias_` -- adds a new value as an alias to an + existing member. +- :attr:`~Enum._name_` -- name of the member +- :attr:`~Enum._value_` -- value of the member; can be set in ``__new__`` +- :meth:`~Enum._missing_` -- a lookup function used when a value is not found; + may be overridden +- :attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a + :class:`str`, that will not be transformed into members, and will be removed + from the final class +- :attr:`~Enum._order_` -- no longer used, kept for backward + compatibility (class attribute, removed during class creation) +- :meth:`~Enum._generate_next_value_` -- used to get an appropriate value for + an enum member; may be overridden -- ``_missing_`` -- a lookup function used when a value is not found; may be - overridden -- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`, - that will not be transformed into members, and will be removed from the final - class -- ``_order_`` -- used in Python 2/3 code to ensure member order is consistent - (class attribute, removed during class creation) -- ``_generate_next_value_`` -- used to get an appropriate value for an enum - member; may be overridden + .. note:: - .. note:: + For standard :class:`Enum` classes the next value chosen is the highest + value seen incremented by one. + + For :class:`Flag` classes the next value chosen will be the next highest + power-of-two. - For standard :class:`Enum` classes the next value chosen is the last value seen - incremented by one. +- While ``_sunder_`` names are generally reserved for the further development + of the :class:`Enum` class and can not be used, some are explicitly allowed: - For :class:`Flag` classes the next value chosen will be the next highest - power-of-two, regardless of the last value seen. + - ``_repr_*`` (e.g. ``_repr_html_``), as used in `IPython's rich display`_ .. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_`` .. versionadded:: 3.7 ``_ignore_`` +.. versionadded:: 3.13 ``_add_alias_``, ``_add_value_alias_``, ``_repr_*`` +.. _`IPython's rich display`: https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display --------------- @@ -808,20 +881,20 @@ Utilities and Decorators .. class:: auto *auto* can be used in place of a value. If used, the *Enum* machinery will - call an *Enum*'s :meth:`~Enum._generate_next_value_` to get an appropriate value. - For *Enum* and *IntEnum* that appropriate value will be the last value plus - one; for *Flag* and *IntFlag* it will be the first power-of-two greater - than the highest value; for *StrEnum* it will be the lower-cased version of + call an :class:`Enum`'s :meth:`~Enum._generate_next_value_` to get an appropriate value. + For :class:`Enum` and :class:`IntEnum` that appropriate value will be the last value plus + one; for :class:`Flag` and :class:`IntFlag` it will be the first power-of-two greater + than the highest value; for :class:`StrEnum` it will be the lower-cased version of the member's name. Care must be taken if mixing *auto()* with manually specified values. *auto* instances are only resolved when at the top level of an assignment: - * ``FIRST = auto()`` will work (auto() is replaced with ``1``); - * ``SECOND = auto(), -2`` will work (auto is replaced with ``2``, so ``2, -2`` is - used to create the ``SECOND`` enum member; - * ``THREE = [auto(), -3]`` will *not* work (``, -3`` is used to - create the ``THREE`` enum member) + * ``FIRST = auto()`` will work (auto() is replaced with ``1``); + * ``SECOND = auto(), -2`` will work (auto is replaced with ``2``, so ``2, -2`` is + used to create the ``SECOND`` enum member; + * ``THREE = [auto(), -3]`` will *not* work (``, -3`` is used to + create the ``THREE`` enum member) .. versionchanged:: 3.11.1 diff --git a/Doc/library/errno.rst b/Doc/library/errno.rst index 283e8b01..4983b896 100644 --- a/Doc/library/errno.rst +++ b/Doc/library/errno.rst @@ -1,5 +1,5 @@ -:mod:`errno` --- Standard errno system symbols -============================================== +:mod:`!errno` --- Standard errno system symbols +=============================================== .. module:: errno :synopsis: Standard errno system symbols. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index d210f82f..b5ba86f1 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -16,7 +16,7 @@ equivalent, even if they have the same name. .. index:: pair: statement; raise -The built-in exceptions listed below can be generated by the interpreter or +The built-in exceptions listed in this chapter can be generated by the interpreter or built-in functions. Except where mentioned, they have an "associated value" indicating the detailed cause of the error. This may be a string or a tuple of several items of information (e.g., an error code and a string explaining the @@ -38,36 +38,48 @@ information on defining exceptions is available in the Python Tutorial under Exception context ----------------- -When raising a new exception while another exception -is already being handled, the new exception's -:attr:`__context__` attribute is automatically set to the handled -exception. An exception may be handled when an :keyword:`except` or -:keyword:`finally` clause, or a :keyword:`with` statement, is used. +.. index:: pair: exception; chaining + __cause__ (exception attribute) + __context__ (exception attribute) + __suppress_context__ (exception attribute) -This implicit exception context can be -supplemented with an explicit cause by using :keyword:`!from` with -:keyword:`raise`:: +Three attributes on exception objects provide information about the context in +which the exception was raised: - raise new_exc from original_exc +.. attribute:: BaseException.__context__ + BaseException.__cause__ + BaseException.__suppress_context__ -The expression following :keyword:`from` must be an exception or ``None``. It -will be set as :attr:`__cause__` on the raised exception. Setting -:attr:`__cause__` also implicitly sets the :attr:`__suppress_context__` -attribute to ``True``, so that using ``raise new_exc from None`` -effectively replaces the old exception with the new one for display -purposes (e.g. converting :exc:`KeyError` to :exc:`AttributeError`), while -leaving the old exception available in :attr:`__context__` for introspection -when debugging. + When raising a new exception while another exception + is already being handled, the new exception's + :attr:`!__context__` attribute is automatically set to the handled + exception. An exception may be handled when an :keyword:`except` or + :keyword:`finally` clause, or a :keyword:`with` statement, is used. -The default traceback display code shows these chained exceptions in -addition to the traceback for the exception itself. An explicitly chained -exception in :attr:`__cause__` is always shown when present. An implicitly -chained exception in :attr:`__context__` is shown only if :attr:`__cause__` -is :const:`None` and :attr:`__suppress_context__` is false. + This implicit exception context can be + supplemented with an explicit cause by using :keyword:`!from` with + :keyword:`raise`:: -In either case, the exception itself is always shown after any chained -exceptions so that the final line of the traceback always shows the last -exception that was raised. + raise new_exc from original_exc + + The expression following :keyword:`from` must be an exception or ``None``. It + will be set as :attr:`!__cause__` on the raised exception. Setting + :attr:`!__cause__` also implicitly sets the :attr:`!__suppress_context__` + attribute to ``True``, so that using ``raise new_exc from None`` + effectively replaces the old exception with the new one for display + purposes (e.g. converting :exc:`KeyError` to :exc:`AttributeError`), while + leaving the old exception available in :attr:`!__context__` for introspection + when debugging. + + The default traceback display code shows these chained exceptions in + addition to the traceback for the exception itself. An explicitly chained + exception in :attr:`!__cause__` is always shown when present. An implicitly + chained exception in :attr:`!__context__` is shown only if :attr:`!__cause__` + is :const:`None` and :attr:`!__suppress_context__` is false. + + In either case, the exception itself is always shown after any chained + exceptions so that the final line of the traceback always shows the last + exception that was raised. Inheriting from built-in exceptions @@ -126,6 +138,12 @@ The following exceptions are used mostly as base classes for other exceptions. tb = sys.exception().__traceback__ raise OtherException(...).with_traceback(tb) + .. attribute:: __traceback__ + + A writable field that holds the + :ref:`traceback object ` associated with this + exception. See also: :ref:`raise`. + .. method:: add_note(note) Add the string ``note`` to the exception's notes which appear in the standard @@ -317,9 +335,9 @@ The following exceptions are the exceptions that are usually raised. .. note:: - ``NotImplementedError`` and ``NotImplemented`` are not interchangeable, + ``NotImplementedError`` and :data:`NotImplemented` are not interchangeable, even though they have similar names and purposes. See - :data:`NotImplemented` for details on when to use it. + :data:`!NotImplemented` for details on when to use it. .. exception:: OSError([arg]) OSError(errno, strerror[, filename[, winerror[, filename2]]]) @@ -394,8 +412,26 @@ The following exceptions are the exceptions that are usually raised. represented. This cannot occur for integers (which would rather raise :exc:`MemoryError` than give up). However, for historical reasons, OverflowError is sometimes raised for integers that are outside a required - range. Because of the lack of standardization of floating point exception - handling in C, most floating point operations are not checked. + range. Because of the lack of standardization of floating-point exception + handling in C, most floating-point operations are not checked. + + +.. exception:: PythonFinalizationError + + This exception is derived from :exc:`RuntimeError`. It is raised when + an operation is blocked during interpreter shutdown also known as + :term:`Python finalization `. + + Examples of operations which can be blocked with a + :exc:`PythonFinalizationError` during the Python finalization: + + * Creating a new Python thread. + * :func:`os.fork`. + + See also the :func:`sys.is_finalizing` function. + + .. versionadded:: 3.13 + Previously, a plain :exc:`RuntimeError` was raised. .. exception:: RecursionError @@ -429,9 +465,11 @@ The following exceptions are the exceptions that are usually raised. :meth:`~iterator.__next__` method to signal that there are no further items produced by the iterator. - The exception object has a single attribute :attr:`value`, which is - given as an argument when constructing the exception, and defaults - to :const:`None`. + .. attribute:: StopIteration.value + + The exception object has a single attribute :attr:`!value`, which is + given as an argument when constructing the exception, and defaults + to :const:`None`. When a :term:`generator` or :term:`coroutine` function returns, a new :exc:`StopIteration` instance is @@ -920,20 +958,26 @@ their subgroups based on the types of the contained exceptions. Returns an exception group that contains only the exceptions from the current group that match *condition*, or ``None`` if the result is empty. - The condition can be either a function that accepts an exception and returns - true for those that should be in the subgroup, or it can be an exception type - or a tuple of exception types, which is used to check for a match using the - same check that is used in an ``except`` clause. + The condition can be an exception type or tuple of exception types, in which + case each exception is checked for a match using the same check that is used + in an ``except`` clause. The condition can also be a callable (other than + a type object) that accepts an exception as its single argument and returns + true for the exceptions that should be in the subgroup. The nesting structure of the current exception is preserved in the result, - as are the values of its :attr:`message`, :attr:`__traceback__`, - :attr:`__cause__`, :attr:`__context__` and :attr:`__notes__` fields. + as are the values of its :attr:`message`, + :attr:`~BaseException.__traceback__`, :attr:`~BaseException.__cause__`, + :attr:`~BaseException.__context__` and + :attr:`~BaseException.__notes__` fields. Empty nested groups are omitted from the result. The condition is checked for all exceptions in the nested exception group, including the top-level and any nested exception groups. If the condition is true for such an exception group, it is included in the result in full. + .. versionadded:: 3.13 + ``condition`` can be any callable which is not a type object. + .. method:: split(condition) Like :meth:`subgroup`, but returns the pair ``(match, rest)`` where ``match`` @@ -945,15 +989,20 @@ their subgroups based on the types of the contained exceptions. Returns an exception group with the same :attr:`message`, but which wraps the exceptions in ``excs``. - This method is used by :meth:`subgroup` and :meth:`split`. A + This method is used by :meth:`subgroup` and :meth:`split`, which + are used in various contexts to break up an exception group. A subclass needs to override it in order to make :meth:`subgroup` and :meth:`split` return instances of the subclass rather than :exc:`ExceptionGroup`. - :meth:`subgroup` and :meth:`split` copy the :attr:`__traceback__`, - :attr:`__cause__`, :attr:`__context__` and :attr:`__notes__` fields from + :meth:`subgroup` and :meth:`split` copy the + :attr:`~BaseException.__traceback__`, + :attr:`~BaseException.__cause__`, :attr:`~BaseException.__context__` and + :attr:`~BaseException.__notes__` fields from the original exception group to the one returned by :meth:`derive`, so - these fields do not need to be updated by :meth:`derive`. :: + these fields do not need to be updated by :meth:`derive`. + + .. doctest:: >>> class MyGroup(ExceptionGroup): ... def derive(self, excs): @@ -979,9 +1028,9 @@ their subgroups based on the types of the contained exceptions. True - Note that :exc:`BaseExceptionGroup` defines :meth:`__new__`, so + Note that :exc:`BaseExceptionGroup` defines :meth:`~object.__new__`, so subclasses that need a different constructor signature need to - override that rather than :meth:`__init__`. For example, the following + override that rather than :meth:`~object.__init__`. For example, the following defines an exception group subclass which accepts an exit_code and and constructs the group's message from it. :: diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index f64dfeb5..4067d791 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -1,5 +1,5 @@ -:mod:`faulthandler` --- Dump the Python traceback -================================================= +:mod:`!faulthandler` --- Dump the Python traceback +================================================== .. module:: faulthandler :synopsis: Dump the Python traceback. @@ -10,14 +10,15 @@ This module contains functions to dump Python tracebacks explicitly, on a fault, after a timeout, or on a user signal. Call :func:`faulthandler.enable` to -install fault handlers for the :const:`SIGSEGV`, :const:`SIGFPE`, -:const:`SIGABRT`, :const:`SIGBUS`, and :const:`SIGILL` signals. You can also +install fault handlers for the :const:`~signal.SIGSEGV`, +:const:`~signal.SIGFPE`, :const:`~signal.SIGABRT`, :const:`~signal.SIGBUS`, and +:const:`~signal.SIGILL` signals. You can also enable them at startup by setting the :envvar:`PYTHONFAULTHANDLER` environment variable or by using the :option:`-X` ``faulthandler`` command line option. The fault handler is compatible with system fault handlers like Apport or the Windows fault handler. The module uses an alternative stack for signal handlers -if the :c:func:`sigaltstack` function is available. This allows it to dump the +if the :c:func:`!sigaltstack` function is available. This allows it to dump the traceback even on a stack overflow. The fault handler is called on catastrophic cases and therefore can only use @@ -70,8 +71,9 @@ Fault handler state .. function:: enable(file=sys.stderr, all_threads=True) - Enable the fault handler: install handlers for the :const:`SIGSEGV`, - :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL` + Enable the fault handler: install handlers for the :const:`~signal.SIGSEGV`, + :const:`~signal.SIGFPE`, :const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` + and :const:`~signal.SIGILL` signals to dump the Python traceback. If *all_threads* is ``True``, produce tracebacks for every running thread. Otherwise, dump only the current thread. @@ -106,8 +108,8 @@ Dumping the tracebacks after a timeout Dump the tracebacks of all threads, after a timeout of *timeout* seconds, or every *timeout* seconds if *repeat* is ``True``. If *exit* is ``True``, call - :c:func:`_exit` with status=1 after dumping the tracebacks. (Note - :c:func:`_exit` exits the process immediately, which means it doesn't do any + :c:func:`!_exit` with status=1 after dumping the tracebacks. (Note + :c:func:`!_exit` exits the process immediately, which means it doesn't do any cleanup like flushing file buffers.) If the function is called twice, the new call replaces previous parameters and resets the timeout. The timer has a sub-second resolution. @@ -118,12 +120,12 @@ Dumping the tracebacks after a timeout This function is implemented using a watchdog thread. - .. versionchanged:: 3.7 - This function is now always available. - .. versionchanged:: 3.5 Added support for passing file descriptor to this function. + .. versionchanged:: 3.7 + This function is now always available. + .. function:: cancel_dump_traceback_later() Cancel the last call to :func:`dump_traceback_later`. diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 969a79fa..7bd64e43 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -1,5 +1,5 @@ -:mod:`fcntl` --- The ``fcntl`` and ``ioctl`` system calls -========================================================= +:mod:`!fcntl` --- The ``fcntl`` and ``ioctl`` system calls +========================================================== .. module:: fcntl :platform: Unix @@ -13,12 +13,12 @@ ---------------- -This module performs file control and I/O control on file descriptors. It is an -interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines. For a -complete description of these calls, see :manpage:`fcntl(2)` and -:manpage:`ioctl(2)` Unix manual pages. +This module performs file and I/O control on file descriptors. It is an +interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines. +See the :manpage:`fcntl(2)` and :manpage:`ioctl(2)` Unix manual pages +for full details. -.. include:: ../includes/wasm-notavail.rst +.. availability:: Unix, not WASI. All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by @@ -31,26 +31,26 @@ descriptor. raise an :exc:`OSError`. .. versionchanged:: 3.8 - The fcntl module now contains ``F_ADD_SEALS``, ``F_GET_SEALS``, and + The :mod:`!fcntl` module now contains ``F_ADD_SEALS``, ``F_GET_SEALS``, and ``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file descriptors. .. versionchanged:: 3.9 - On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains - the path of a file from a file descriptor. - On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` - and ``F_OFD_SETLKW`` constants, which are used when working with open file - description locks. + On macOS, the :mod:`!fcntl` module exposes the ``F_GETPATH`` constant, + which obtains the path of a file from a file descriptor. + On Linux(>=3.15), the :mod:`!fcntl` module exposes the ``F_OFD_GETLK``, + ``F_OFD_SETLK`` and ``F_OFD_SETLKW`` constants, which are used when working + with open file description locks. .. versionchanged:: 3.10 - On Linux >= 2.6.11, the fcntl module exposes the ``F_GETPIPE_SZ`` and + On Linux >= 2.6.11, the :mod:`!fcntl` module exposes the ``F_GETPIPE_SZ`` and ``F_SETPIPE_SZ`` constants, which allow to check and modify a pipe's size respectively. .. versionchanged:: 3.11 - On FreeBSD, the fcntl module exposes the ``F_DUP2FD`` and ``F_DUP2FD_CLOEXEC`` - constants, which allow to duplicate a file descriptor, the latter setting - ``FD_CLOEXEC`` flag in addition. + On FreeBSD, the :mod:`!fcntl` module exposes the ``F_DUP2FD`` and + ``F_DUP2FD_CLOEXEC`` constants, which allow to duplicate a file descriptor, + the latter setting ``FD_CLOEXEC`` flag in addition. .. versionchanged:: 3.12 On Linux >= 4.5, the :mod:`fcntl` module exposes the ``FICLONE`` and @@ -58,6 +58,27 @@ descriptor. another file by reflinking on some filesystems (e.g., btrfs, OCFS2, and XFS). This behavior is commonly referred to as "copy-on-write". +.. versionchanged:: 3.13 + On Linux >= 2.6.32, the :mod:`!fcntl` module exposes the + ``F_GETOWN_EX``, ``F_SETOWN_EX``, ``F_OWNER_TID``, ``F_OWNER_PID``, ``F_OWNER_PGRP`` constants, which allow to direct I/O availability signals + to a specific thread, process, or process group. + On Linux >= 4.13, the :mod:`!fcntl` module exposes the + ``F_GET_RW_HINT``, ``F_SET_RW_HINT``, ``F_GET_FILE_RW_HINT``, + ``F_SET_FILE_RW_HINT``, and ``RWH_WRITE_LIFE_*`` constants, which allow + to inform the kernel about the relative expected lifetime of writes on + a given inode or via a particular open file description. + On Linux >= 5.1 and NetBSD, the :mod:`!fcntl` module exposes the + ``F_SEAL_FUTURE_WRITE`` constant for use with ``F_ADD_SEALS`` and + ``F_GET_SEALS`` operations. + On FreeBSD, the :mod:`!fcntl` module exposes the ``F_READAHEAD``, ``F_ISUNIONSTACK``, and ``F_KINFO`` constants. + On macOS and FreeBSD, the :mod:`!fcntl` module exposes the ``F_RDAHEAD`` + constant. + On NetBSD and AIX, the :mod:`!fcntl` module exposes the ``F_CLOSEM`` + constant. + On NetBSD, the :mod:`!fcntl` module exposes the ``F_MAXFD`` constant. + On macOS and NetBSD, the :mod:`!fcntl` module exposes the ``F_GETNOSIGPIPE`` + and ``F_SETNOSIGPIPE`` constant. + The module defines the following functions: @@ -80,7 +101,7 @@ The module defines the following functions: most likely to result in a segmentation violation or a more subtle data corruption. - If the :c:func:`fcntl` fails, an :exc:`OSError` is raised. + If the :c:func:`fcntl` call fails, an :exc:`OSError` is raised. .. audit-event:: fcntl.fcntl fd,cmd,arg fcntl.fcntl @@ -118,7 +139,7 @@ The module defines the following functions: buffer 1024 bytes long which is then passed to :func:`ioctl` and copied back into the supplied buffer. - If the :c:func:`ioctl` fails, an :exc:`OSError` exception is raised. + If the :c:func:`ioctl` call fails, an :exc:`OSError` exception is raised. An example:: @@ -143,7 +164,7 @@ The module defines the following functions: :manpage:`flock(2)` for details. (On some systems, this function is emulated using :c:func:`fcntl`.) - If the :c:func:`flock` fails, an :exc:`OSError` exception is raised. + If the :c:func:`flock` call fails, an :exc:`OSError` exception is raised. .. audit-event:: fcntl.flock fd,operation fcntl.flock @@ -155,17 +176,28 @@ The module defines the following functions: method are accepted as well) of the file to lock or unlock, and *cmd* is one of the following values: - * :const:`LOCK_UN` -- unlock - * :const:`LOCK_SH` -- acquire a shared lock - * :const:`LOCK_EX` -- acquire an exclusive lock + .. data:: LOCK_UN + + Release an existing lock. + + .. data:: LOCK_SH + + Acquire a shared lock. + + .. data:: LOCK_EX + + Acquire an exclusive lock. + + .. data:: LOCK_NB + + Bitwise OR with any of the other three ``LOCK_*`` constants to make + the request non-blocking. - When *cmd* is :const:`LOCK_SH` or :const:`LOCK_EX`, it can also be - bitwise ORed with :const:`LOCK_NB` to avoid blocking on lock acquisition. - If :const:`LOCK_NB` is used and the lock cannot be acquired, an + If :const:`!LOCK_NB` is used and the lock cannot be acquired, an :exc:`OSError` will be raised and the exception will have an *errno* - attribute set to :const:`EACCES` or :const:`EAGAIN` (depending on the + attribute set to :const:`~errno.EACCES` or :const:`~errno.EAGAIN` (depending on the operating system; for portability, check for both values). On at least some - systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a + systems, :const:`!LOCK_EX` can only be used if the file descriptor refers to a file opened for writing. *len* is the number of bytes to lock, *start* is the byte offset at diff --git a/Doc/library/filecmp.rst b/Doc/library/filecmp.rst index dfe4b7c5..282d0e0d 100644 --- a/Doc/library/filecmp.rst +++ b/Doc/library/filecmp.rst @@ -1,5 +1,5 @@ -:mod:`filecmp` --- File and Directory Comparisons -================================================= +:mod:`!filecmp` --- File and Directory Comparisons +================================================== .. module:: filecmp :synopsis: Compare files efficiently. @@ -70,7 +70,7 @@ The :mod:`filecmp` module defines the following functions: The :class:`dircmp` class ------------------------- -.. class:: dircmp(a, b, ignore=None, hide=None) +.. class:: dircmp(a, b, ignore=None, hide=None, *, shallow=True) Construct a new directory comparison object, to compare the directories *a* and *b*. *ignore* is a list of names to ignore, and defaults to @@ -78,7 +78,12 @@ The :class:`dircmp` class defaults to ``[os.curdir, os.pardir]``. The :class:`dircmp` class compares files by doing *shallow* comparisons - as described for :func:`filecmp.cmp`. + as described for :func:`filecmp.cmp` by default using the *shallow* + parameter. + + .. versionchanged:: 3.13 + + Added the *shallow* parameter. The :class:`dircmp` class provides the following methods: diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index f93e9a58..8f32b11e 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -1,5 +1,5 @@ -:mod:`fileinput` --- Iterate over lines from multiple input streams -=================================================================== +:mod:`!fileinput` --- Iterate over lines from multiple input streams +==================================================================== .. module:: fileinput :synopsis: Loop over standard input or a list of files. @@ -47,7 +47,7 @@ Lines are returned with any newlines intact, which means that the last line in a file may not have one. You can control how files are opened by providing an opening hook via the -*openhook* parameter to :func:`fileinput.input` or :class:`FileInput()`. The +*openhook* parameter to :func:`fileinput.input` or :func:`FileInput`. The hook must be a function that takes two arguments, *filename* and *mode*, and returns an accordingly opened file-like object. If *encoding* and/or *errors* are specified, they will be passed to the hook as additional keyword arguments. diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index aed8991d..fda44923 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -1,5 +1,5 @@ -:mod:`fnmatch` --- Unix filename pattern matching -================================================= +:mod:`!fnmatch` --- Unix filename pattern matching +================================================== .. module:: fnmatch :synopsis: Unix shell style filename pattern matching. @@ -50,10 +50,10 @@ Also note that :func:`functools.lru_cache` with the *maxsize* of 32768 is used t cache the compiled regex patterns in the following functions: :func:`fnmatch`, :func:`fnmatchcase`, :func:`.filter`. -.. function:: fnmatch(filename, pattern) +.. function:: fnmatch(name, pat) - Test whether the *filename* string matches the *pattern* string, returning - :const:`True` or :const:`False`. Both parameters are case-normalized + Test whether the filename string *name* matches the pattern string *pat*, + returning ``True`` or ``False``. Both parameters are case-normalized using :func:`os.path.normcase`. :func:`fnmatchcase` can be used to perform a case-sensitive comparison, regardless of whether that's standard for the operating system. @@ -69,22 +69,24 @@ cache the compiled regex patterns in the following functions: :func:`fnmatch`, print(file) -.. function:: fnmatchcase(filename, pattern) +.. function:: fnmatchcase(name, pat) - Test whether *filename* matches *pattern*, returning :const:`True` or - :const:`False`; the comparison is case-sensitive and does not apply - :func:`os.path.normcase`. + Test whether the filename string *name* matches the pattern string *pat*, + returning ``True`` or ``False``; + the comparison is case-sensitive and does not apply :func:`os.path.normcase`. -.. function:: filter(names, pattern) +.. function:: filter(names, pat) - Construct a list from those elements of the iterable *names* that match *pattern*. It is the same as - ``[n for n in names if fnmatch(n, pattern)]``, but implemented more efficiently. + Construct a list from those elements of the :term:`iterable` *names* + that match pattern *pat*. + It is the same as ``[n for n in names if fnmatch(n, pat)]``, + but implemented more efficiently. -.. function:: translate(pattern) +.. function:: translate(pat) - Return the shell-style *pattern* converted to a regular expression for + Return the shell-style pattern *pat* converted to a regular expression for using with :func:`re.match`. Example: diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 509c6368..7e615ed2 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -1,5 +1,5 @@ -:mod:`fractions` --- Rational numbers -===================================== +:mod:`!fractions` --- Rational numbers +====================================== .. module:: fractions :synopsis: Rational numbers. @@ -31,7 +31,7 @@ another rational number, or from a string. :class:`Fraction` instance with the same value. The next two versions accept either a :class:`float` or a :class:`decimal.Decimal` instance, and return a :class:`Fraction` instance with exactly the same value. Note that due to the - usual issues with binary floating-point (see :ref:`tut-fp-issues`), the + usual issues with binary floating point (see :ref:`tut-fp-issues`), the argument to ``Fraction(1.1)`` is not exactly equal to 11/10, and so ``Fraction(1.1)`` does *not* return ``Fraction(11, 10)`` as one might expect. (But see the documentation for the :meth:`limit_denominator` method below.) @@ -87,7 +87,7 @@ another rational number, or from a string. .. versionchanged:: 3.9 The :func:`math.gcd` function is now used to normalize the *numerator* - and *denominator*. :func:`math.gcd` always return a :class:`int` type. + and *denominator*. :func:`math.gcd` always returns an :class:`int` type. Previously, the GCD type depended on *numerator* and *denominator*. .. versionchanged:: 3.11 @@ -106,6 +106,10 @@ another rational number, or from a string. presentation types ``"e"``, ``"E"``, ``"f"``, ``"F"``, ``"g"``, ``"G"`` and ``"%""``. + .. versionchanged:: 3.13 + Formatting of :class:`Fraction` instances without a presentation type + now supports fill, alignment, sign handling, minimum width and grouping. + .. attribute:: numerator Numerator of the Fraction in lowest term. @@ -201,17 +205,36 @@ another rational number, or from a string. .. method:: __format__(format_spec, /) - Provides support for float-style formatting of :class:`Fraction` - instances via the :meth:`str.format` method, the :func:`format` built-in - function, or :ref:`Formatted string literals `. The - presentation types ``"e"``, ``"E"``, ``"f"``, ``"F"``, ``"g"``, ``"G"`` - and ``"%"`` are supported. For these presentation types, formatting for a - :class:`Fraction` object ``x`` follows the rules outlined for - the :class:`float` type in the :ref:`formatspec` section. + Provides support for formatting of :class:`Fraction` instances via the + :meth:`str.format` method, the :func:`format` built-in function, or + :ref:`Formatted string literals `. + + If the ``format_spec`` format specification string does not end with one + of the presentation types ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, + ``'G'`` or ``'%'`` then formatting follows the general rules for fill, + alignment, sign handling, minimum width, and grouping as described in the + :ref:`format specification mini-language `. The "alternate + form" flag ``'#'`` is supported: if present, it forces the output string + to always include an explicit denominator, even when the value being + formatted is an exact integer. The zero-fill flag ``'0'`` is not + supported. + + If the ``format_spec`` format specification string ends with one of + the presentation types ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, + ``'G'`` or ``'%'`` then formatting follows the rules outlined for the + :class:`float` type in the :ref:`formatspec` section. Here are some examples:: >>> from fractions import Fraction + >>> format(Fraction(103993, 33102), '_') + '103_993/33_102' + >>> format(Fraction(1, 7), '.^+10') + '...+1/7...' + >>> format(Fraction(3, 1), '') + '3' + >>> format(Fraction(3, 1), '#') + '3/1' >>> format(Fraction(1, 7), '.40g') '0.1428571428571428571428571428571428571429' >>> format(Fraction('1234567.855'), '_.2f') diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index d1fe6414..bb153220 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -1,5 +1,5 @@ -:mod:`ftplib` --- FTP protocol client -===================================== +:mod:`!ftplib` --- FTP protocol client +====================================== .. module:: ftplib :synopsis: FTP protocol client (requires sockets). @@ -45,19 +45,73 @@ Here's a sample session using the :mod:`ftplib` module:: '221 Goodbye.' -The module defines the following items: +.. _ftplib-reference: -.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None, *, encoding='utf-8') +Reference +--------- - Return a new instance of the :class:`FTP` class. When *host* is given, the - method call ``connect(host)`` is made. When *user* is given, additionally - the method call ``login(user, passwd, acct)`` is made (where *passwd* and - *acct* default to the empty string when not given). The optional *timeout* - parameter specifies a timeout in seconds for blocking operations like the - connection attempt (if is not specified, the global default timeout setting - will be used). *source_address* is a 2-tuple ``(host, port)`` for the socket - to bind to as its source address before connecting. The *encoding* parameter - specifies the encoding for directories and filenames. +.. _ftp-objects: + +FTP objects +^^^^^^^^^^^ + +.. Use substitutions for some param docs so we don't need to repeat them + in multiple places. + +.. |param_doc_user| replace:: + The username to log in with (default: ``'anonymous'``). + +.. |param_doc_passwd| replace:: + The password to use when logging in. + If not given, and if *passwd* is the empty string or ``"-"``, + a password will be automatically generated. + +.. Ideally, we'd like to use the :rfc: directive, but Sphinx will not allow it. + +.. |param_doc_acct| replace:: + Account information to be used for the ``ACCT`` FTP command. + Few systems implement this. + See `RFC-959 `__ + for more details. + +.. |param_doc_source_address| replace:: + A 2-tuple ``(host, port)`` for the socket to bind to as its + source address before connecting. + +.. |param_doc_encoding| replace:: + The encoding for directories and filenames (default: ``'utf-8'``). + +.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, \ + source_address=None, *, encoding='utf-8') + + Return a new instance of the :class:`FTP` class. + + :param str host: + The hostname to connect to. + If given, :code:`connect(host)` is implicitly called by the constructor. + + :param str user: + |param_doc_user| + If given, :code:`login(host, passwd, acct)` is implicitly called + by the constructor. + + :param str passwd: + |param_doc_passwd| + + :param str acct: + |param_doc_acct| + + :param timeout: + A timeout in seconds for blocking operations like :meth:`connect` + (default: the global default timeout setting). + :type timeout: float | None + + :param source_address: + |param_doc_source_address| + :type source_address: tuple | None + + :param str encoding: + |param_doc_encoding| The :class:`FTP` class supports the :keyword:`with` statement, e.g.: @@ -85,376 +139,460 @@ The module defines the following items: The *encoding* parameter was added, and the default was changed from Latin-1 to UTF-8 to follow :rfc:`2640`. -.. class:: FTP_TLS(host='', user='', passwd='', acct='', *, context=None, - timeout=None, source_address=None, encoding='utf-8') + Several :class:`!FTP` methods are available in two flavors: + one for handling text files and another for binary files. + The methods are named for the command which is used followed by + ``lines`` for the text version or ``binary`` for the binary version. - A :class:`FTP` subclass which adds TLS support to FTP as described in - :rfc:`4217`. - Connect as usual to port 21 implicitly securing the FTP control connection - before authenticating. Securing the data connection requires the user to - explicitly ask for it by calling the :meth:`prot_p` method. *context* - is a :class:`ssl.SSLContext` object which allows bundling SSL configuration - options, certificates and private keys into a single (potentially - long-lived) structure. Please read :ref:`ssl-security` for best practices. + :class:`FTP` instances have the following methods: - .. versionadded:: 3.2 + .. method:: FTP.set_debuglevel(level) - .. versionchanged:: 3.3 - *source_address* parameter was added. + Set the instance's debugging level as an :class:`int`. + This controls the amount of debugging output printed. + The debug levels are: - .. versionchanged:: 3.4 - The class now supports hostname check with - :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see - :const:`ssl.HAS_SNI`). + * ``0`` (default): No debug output. + * ``1``: Produce a moderate amount of debug output, + generally a single line per request. + * ``2`` or higher: Produce the maximum amount of debugging output, + logging each line sent and received on the control connection. - .. versionchanged:: 3.9 - If the *timeout* parameter is set to be zero, it will raise a - :class:`ValueError` to prevent the creation of a non-blocking socket. - The *encoding* parameter was added, and the default was changed from - Latin-1 to UTF-8 to follow :rfc:`2640`. + .. method:: FTP.connect(host='', port=0, timeout=None, source_address=None) - .. versionchanged:: 3.12 - The deprecated *keyfile* and *certfile* parameters have been removed. + Connect to the given host and port. + This function should be called only once for each instance; + it should not be called if a *host* argument was given + when the :class:`FTP` instance was created. + All other :class:`!FTP` methods can only be called + after a connection has successfully been made. - Here's a sample session using the :class:`FTP_TLS` class:: + :param str host: + The host to connect to. - >>> ftps = FTP_TLS('ftp.pureftpd.org') - >>> ftps.login() - '230 Anonymous user logged in' - >>> ftps.prot_p() - '200 Data protection level set to "private"' - >>> ftps.nlst() - ['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp'] + :param int port: + The TCP port to connect to (default: ``21``, + as specified by the FTP protocol specification). + It is rarely needed to specify a different port number. + :param timeout: + A timeout in seconds for the connection attempt + (default: the global default timeout setting). + :type timeout: float | None -.. exception:: error_reply + :param source_address: + |param_doc_source_address| + :type source_address: tuple | None - Exception raised when an unexpected reply is received from the server. + .. audit-event:: ftplib.connect self,host,port ftplib.FTP.connect + .. versionchanged:: 3.3 + *source_address* parameter was added. -.. exception:: error_temp - Exception raised when an error code signifying a temporary error (response - codes in the range 400--499) is received. + .. method:: FTP.getwelcome() + Return the welcome message sent by the server in reply to the initial + connection. (This message sometimes contains disclaimers or help information + that may be relevant to the user.) -.. exception:: error_perm - Exception raised when an error code signifying a permanent error (response - codes in the range 500--599) is received. + .. method:: FTP.login(user='anonymous', passwd='', acct='') + Log on to the connected FTP server. + This function should be called only once for each instance, + after a connection has been established; + it should not be called if the *host* and *user* arguments were given + when the :class:`FTP` instance was created. + Most FTP commands are only allowed after the client has logged in. -.. exception:: error_proto + :param str user: + |param_doc_user| - Exception raised when a reply is received from the server that does not fit - the response specifications of the File Transfer Protocol, i.e. begin with a - digit in the range 1--5. + :param str passwd: + |param_doc_passwd| + :param str acct: + |param_doc_acct| -.. data:: all_errors - The set of all exceptions (as a tuple) that methods of :class:`FTP` - instances may raise as a result of problems with the FTP connection (as - opposed to programming errors made by the caller). This set includes the - four exceptions listed above as well as :exc:`OSError` and :exc:`EOFError`. + .. method:: FTP.abort() + Abort a file transfer that is in progress. Using this does not always work, but + it's worth a try. -.. seealso:: - Module :mod:`netrc` - Parser for the :file:`.netrc` file format. The file :file:`.netrc` is - typically used by FTP clients to load user authentication information - before prompting the user. + .. method:: FTP.sendcmd(cmd) + Send a simple command string to the server and return the response string. -.. _ftp-objects: + .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.sendcmd -FTP Objects ------------ -Several methods are available in two flavors: one for handling text files and -another for binary files. These are named for the command which is used -followed by ``lines`` for the text version or ``binary`` for the binary version. + .. method:: FTP.voidcmd(cmd) -:class:`FTP` instances have the following methods: + Send a simple command string to the server and handle the response. Return + the response string if the response code corresponds to success (codes in + the range 200--299). Raise :exc:`error_reply` otherwise. + .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.voidcmd -.. method:: FTP.set_debuglevel(level) - Set the instance's debugging level. This controls the amount of debugging - output printed. The default, ``0``, produces no debugging output. A value of - ``1`` produces a moderate amount of debugging output, generally a single line - per request. A value of ``2`` or higher produces the maximum amount of - debugging output, logging each line sent and received on the control connection. + .. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None) + Retrieve a file in binary transfer mode. -.. method:: FTP.connect(host='', port=0, timeout=None, source_address=None) + :param str cmd: + An appropriate ``RETR`` command: :samp:`"RETR {filename}"`. - Connect to the given host and port. The default port number is ``21``, as - specified by the FTP protocol specification. It is rarely needed to specify a - different port number. This function should be called only once for each - instance; it should not be called at all if a host was given when the instance - was created. All other methods can only be used after a connection has been - made. - The optional *timeout* parameter specifies a timeout in seconds for the - connection attempt. If no *timeout* is passed, the global default timeout - setting will be used. - *source_address* is a 2-tuple ``(host, port)`` for the socket to bind to as - its source address before connecting. + :param callback: + A single parameter callable that is called + for each block of data received, + with its single argument being the data as :class:`bytes`. + :type callback: :term:`callable` - .. audit-event:: ftplib.connect self,host,port ftplib.FTP.connect + :param int blocksize: + The maximum chunk size to read on the low-level + :class:`~socket.socket` object created to do the actual transfer. + This also corresponds to the largest size of data + that will be passed to *callback*. + Defaults to ``8192``. - .. versionchanged:: 3.3 - *source_address* parameter was added. + :param int rest: + A ``REST`` command to be sent to the server. + See the documentation for the *rest* parameter of the :meth:`transfercmd` method. -.. method:: FTP.getwelcome() + .. method:: FTP.retrlines(cmd, callback=None) - Return the welcome message sent by the server in reply to the initial - connection. (This message sometimes contains disclaimers or help information - that may be relevant to the user.) + Retrieve a file or directory listing in the encoding specified by the + *encoding* parameter at initialization. + *cmd* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or + a command such as ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). + ``LIST`` retrieves a list of files and information about those files. + ``NLST`` retrieves a list of file names. + The *callback* function is called for each line with a string argument + containing the line with the trailing CRLF stripped. The default *callback* + prints the line to :data:`sys.stdout`. -.. method:: FTP.login(user='anonymous', passwd='', acct='') + .. method:: FTP.set_pasv(val) - Log in as the given *user*. The *passwd* and *acct* parameters are optional and - default to the empty string. If no *user* is specified, it defaults to - ``'anonymous'``. If *user* is ``'anonymous'``, the default *passwd* is - ``'anonymous@'``. This function should be called only once for each instance, - after a connection has been established; it should not be called at all if a - host and user were given when the instance was created. Most FTP commands are - only allowed after the client has logged in. The *acct* parameter supplies - "accounting information"; few systems implement this. + Enable "passive" mode if *val* is true, otherwise disable passive mode. + Passive mode is on by default. -.. method:: FTP.abort() + .. method:: FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None) - Abort a file transfer that is in progress. Using this does not always work, but - it's worth a try. + Store a file in binary transfer mode. + :param str cmd: + An appropriate ``STOR`` command: :samp:`"STOR {filename}"`. -.. method:: FTP.sendcmd(cmd) + :param fp: + A file object (opened in binary mode) which is read until EOF, + using its :meth:`~io.RawIOBase.read` method in blocks of size *blocksize* + to provide the data to be stored. + :type fp: :term:`file object` - Send a simple command string to the server and return the response string. + :param int blocksize: + The read block size. + Defaults to ``8192``. - .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.sendcmd + :param callback: + A single parameter callable that is called + for each block of data sent, + with its single argument being the data as :class:`bytes`. + :type callback: :term:`callable` + :param int rest: + A ``REST`` command to be sent to the server. + See the documentation for the *rest* parameter of the :meth:`transfercmd` method. -.. method:: FTP.voidcmd(cmd) + .. versionchanged:: 3.2 + The *rest* parameter was added. - Send a simple command string to the server and handle the response. Return - nothing if a response code corresponding to success (codes in the range - 200--299) is received. Raise :exc:`error_reply` otherwise. - .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.voidcmd + .. method:: FTP.storlines(cmd, fp, callback=None) + Store a file in line mode. *cmd* should be an appropriate + ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the + :term:`file object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline` + method to provide the data to be stored. *callback* is an optional single + parameter callable that is called on each line after it is sent. -.. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None) - Retrieve a file in binary transfer mode. *cmd* should be an appropriate - ``RETR`` command: ``'RETR filename'``. The *callback* function is called for - each block of data received, with a single bytes argument giving the data - block. The optional *blocksize* argument specifies the maximum chunk size to - read on the low-level socket object created to do the actual transfer (which - will also be the largest size of the data blocks passed to *callback*). A - reasonable default is chosen. *rest* means the same thing as in the - :meth:`transfercmd` method. + .. method:: FTP.transfercmd(cmd, rest=None) + Initiate a transfer over the data connection. If the transfer is active, send an + ``EPRT`` or ``PORT`` command and the transfer command specified by *cmd*, and + accept the connection. If the server is passive, send an ``EPSV`` or ``PASV`` + command, connect to it, and start the transfer command. Either way, return the + socket for the connection. -.. method:: FTP.retrlines(cmd, callback=None) + If optional *rest* is given, a ``REST`` command is sent to the server, passing + *rest* as an argument. *rest* is usually a byte offset into the requested file, + telling the server to restart sending the file's bytes at the requested offset, + skipping over the initial bytes. Note however that the :meth:`transfercmd` + method converts *rest* to a string with the *encoding* parameter specified + at initialization, but no check is performed on the string's contents. If the + server does not recognize the ``REST`` command, an :exc:`error_reply` exception + will be raised. If this happens, simply call :meth:`transfercmd` without a + *rest* argument. - Retrieve a file or directory listing in the encoding specified by the - *encoding* parameter at initialization. - *cmd* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or - a command such as ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). - ``LIST`` retrieves a list of files and information about those files. - ``NLST`` retrieves a list of file names. - The *callback* function is called for each line with a string argument - containing the line with the trailing CRLF stripped. The default *callback* - prints the line to ``sys.stdout``. + .. method:: FTP.ntransfercmd(cmd, rest=None) -.. method:: FTP.set_pasv(val) + Like :meth:`transfercmd`, but returns a tuple of the data connection and the + expected size of the data. If the expected size could not be computed, ``None`` + will be returned as the expected size. *cmd* and *rest* means the same thing as + in :meth:`transfercmd`. - Enable "passive" mode if *val* is true, otherwise disable passive mode. - Passive mode is on by default. + .. method:: FTP.mlsd(path="", facts=[]) -.. method:: FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None) + List a directory in a standardized format by using ``MLSD`` command + (:rfc:`3659`). If *path* is omitted the current directory is assumed. + *facts* is a list of strings representing the type of information desired + (e.g. ``["type", "size", "perm"]``). Return a generator object yielding a + tuple of two elements for every file found in path. First element is the + file name, the second one is a dictionary containing facts about the file + name. Content of this dictionary might be limited by the *facts* argument + but server is not guaranteed to return all requested facts. - Store a file in binary transfer mode. *cmd* should be an appropriate - ``STOR`` command: ``"STOR filename"``. *fp* is a :term:`file object` - (opened in binary mode) which is read until EOF using its :meth:`~io.IOBase.read` - method in blocks of size *blocksize* to provide the data to be stored. - The *blocksize* argument defaults to 8192. *callback* is an optional single - parameter callable that is called on each block of data after it is sent. - *rest* means the same thing as in the :meth:`transfercmd` method. + .. versionadded:: 3.3 - .. versionchanged:: 3.2 - *rest* parameter added. + .. method:: FTP.nlst(argument[, ...]) + + Return a list of file names as returned by the ``NLST`` command. The + optional *argument* is a directory to list (default is the current server + directory). Multiple arguments can be used to pass non-standard options to + the ``NLST`` command. -.. method:: FTP.storlines(cmd, fp, callback=None) + .. note:: If your server supports the command, :meth:`mlsd` offers a better API. - Store a file in line mode. *cmd* should be an appropriate - ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the - :term:`file object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline` - method to provide the data to be stored. *callback* is an optional single - parameter callable that is called on each line after it is sent. + .. method:: FTP.dir(argument[, ...]) -.. method:: FTP.transfercmd(cmd, rest=None) + Produce a directory listing as returned by the ``LIST`` command, printing it to + standard output. The optional *argument* is a directory to list (default is the + current server directory). Multiple arguments can be used to pass non-standard + options to the ``LIST`` command. If the last argument is a function, it is used + as a *callback* function as for :meth:`retrlines`; the default prints to + :data:`sys.stdout`. This method returns ``None``. - Initiate a transfer over the data connection. If the transfer is active, send an - ``EPRT`` or ``PORT`` command and the transfer command specified by *cmd*, and - accept the connection. If the server is passive, send an ``EPSV`` or ``PASV`` - command, connect to it, and start the transfer command. Either way, return the - socket for the connection. + .. note:: If your server supports the command, :meth:`mlsd` offers a better API. - If optional *rest* is given, a ``REST`` command is sent to the server, passing - *rest* as an argument. *rest* is usually a byte offset into the requested file, - telling the server to restart sending the file's bytes at the requested offset, - skipping over the initial bytes. Note however that the :meth:`transfercmd` - method converts *rest* to a string with the *encoding* parameter specified - at initialization, but no check is performed on the string's contents. If the - server does not recognize the ``REST`` command, an :exc:`error_reply` exception - will be raised. If this happens, simply call :meth:`transfercmd` without a - *rest* argument. + .. method:: FTP.rename(fromname, toname) -.. method:: FTP.ntransfercmd(cmd, rest=None) + Rename file *fromname* on the server to *toname*. - Like :meth:`transfercmd`, but returns a tuple of the data connection and the - expected size of the data. If the expected size could not be computed, ``None`` - will be returned as the expected size. *cmd* and *rest* means the same thing as - in :meth:`transfercmd`. + .. method:: FTP.delete(filename) -.. method:: FTP.mlsd(path="", facts=[]) + Remove the file named *filename* from the server. If successful, returns the + text of the response, otherwise raises :exc:`error_perm` on permission errors or + :exc:`error_reply` on other errors. - List a directory in a standardized format by using ``MLSD`` command - (:rfc:`3659`). If *path* is omitted the current directory is assumed. - *facts* is a list of strings representing the type of information desired - (e.g. ``["type", "size", "perm"]``). Return a generator object yielding a - tuple of two elements for every file found in path. First element is the - file name, the second one is a dictionary containing facts about the file - name. Content of this dictionary might be limited by the *facts* argument - but server is not guaranteed to return all requested facts. - .. versionadded:: 3.3 + .. method:: FTP.cwd(pathname) + Set the current directory on the server. -.. method:: FTP.nlst(argument[, ...]) - Return a list of file names as returned by the ``NLST`` command. The - optional *argument* is a directory to list (default is the current server - directory). Multiple arguments can be used to pass non-standard options to - the ``NLST`` command. + .. method:: FTP.mkd(pathname) - .. note:: If your server supports the command, :meth:`mlsd` offers a better API. + Create a new directory on the server. -.. method:: FTP.dir(argument[, ...]) + .. method:: FTP.pwd() - Produce a directory listing as returned by the ``LIST`` command, printing it to - standard output. The optional *argument* is a directory to list (default is the - current server directory). Multiple arguments can be used to pass non-standard - options to the ``LIST`` command. If the last argument is a function, it is used - as a *callback* function as for :meth:`retrlines`; the default prints to - ``sys.stdout``. This method returns ``None``. + Return the pathname of the current directory on the server. - .. note:: If your server supports the command, :meth:`mlsd` offers a better API. + .. method:: FTP.rmd(dirname) -.. method:: FTP.rename(fromname, toname) + Remove the directory named *dirname* on the server. - Rename file *fromname* on the server to *toname*. + .. method:: FTP.size(filename) -.. method:: FTP.delete(filename) + Request the size of the file named *filename* on the server. On success, the + size of the file is returned as an integer, otherwise ``None`` is returned. + Note that the ``SIZE`` command is not standardized, but is supported by many + common server implementations. - Remove the file named *filename* from the server. If successful, returns the - text of the response, otherwise raises :exc:`error_perm` on permission errors or - :exc:`error_reply` on other errors. + .. method:: FTP.quit() -.. method:: FTP.cwd(pathname) + Send a ``QUIT`` command to the server and close the connection. This is the + "polite" way to close a connection, but it may raise an exception if the server + responds with an error to the ``QUIT`` command. This implies a call to the + :meth:`close` method which renders the :class:`FTP` instance useless for + subsequent calls (see below). - Set the current directory on the server. + .. method:: FTP.close() -.. method:: FTP.mkd(pathname) + Close the connection unilaterally. This should not be applied to an already + closed connection such as after a successful call to :meth:`~FTP.quit`. + After this call the :class:`FTP` instance should not be used any more (after + a call to :meth:`close` or :meth:`~FTP.quit` you cannot reopen the + connection by issuing another :meth:`login` method). - Create a new directory on the server. +FTP_TLS objects +^^^^^^^^^^^^^^^ -.. method:: FTP.pwd() +.. class:: FTP_TLS(host='', user='', passwd='', acct='', *, context=None, \ + timeout=None, source_address=None, encoding='utf-8') - Return the pathname of the current directory on the server. + An :class:`FTP` subclass which adds TLS support to FTP as described in + :rfc:`4217`. + Connect to port 21 implicitly securing the FTP control connection + before authenticating. + .. note:: + The user must explicitly secure the data connection + by calling the :meth:`prot_p` method. -.. method:: FTP.rmd(dirname) + :param str host: + The hostname to connect to. + If given, :code:`connect(host)` is implicitly called by the constructor. - Remove the directory named *dirname* on the server. + :param str user: + |param_doc_user| + If given, :code:`login(host, passwd, acct)` is implicitly called + by the constructor. + :param str passwd: + |param_doc_passwd| -.. method:: FTP.size(filename) + :param str acct: + |param_doc_acct| - Request the size of the file named *filename* on the server. On success, the - size of the file is returned as an integer, otherwise ``None`` is returned. - Note that the ``SIZE`` command is not standardized, but is supported by many - common server implementations. + :param context: + An SSL context object which allows bundling SSL configuration options, + certificates and private keys into a single, potentially long-lived, + structure. + Please read :ref:`ssl-security` for best practices. + :type context: :class:`ssl.SSLContext` + :param timeout: + A timeout in seconds for blocking operations like :meth:`~FTP.connect` + (default: the global default timeout setting). + :type timeout: float | None -.. method:: FTP.quit() + :param source_address: + |param_doc_source_address| + :type source_address: tuple | None - Send a ``QUIT`` command to the server and close the connection. This is the - "polite" way to close a connection, but it may raise an exception if the server - responds with an error to the ``QUIT`` command. This implies a call to the - :meth:`close` method which renders the :class:`FTP` instance useless for - subsequent calls (see below). + :param str encoding: + |param_doc_encoding| + .. versionadded:: 3.2 -.. method:: FTP.close() + .. versionchanged:: 3.3 + Added the *source_address* parameter. - Close the connection unilaterally. This should not be applied to an already - closed connection such as after a successful call to :meth:`~FTP.quit`. - After this call the :class:`FTP` instance should not be used any more (after - a call to :meth:`close` or :meth:`~FTP.quit` you cannot reopen the - connection by issuing another :meth:`login` method). + .. versionchanged:: 3.4 + The class now supports hostname check with + :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see + :const:`ssl.HAS_SNI`). + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + The *encoding* parameter was added, and the default was changed from + Latin-1 to UTF-8 to follow :rfc:`2640`. -FTP_TLS Objects ---------------- + .. versionchanged:: 3.12 + The deprecated *keyfile* and *certfile* parameters have been removed. -:class:`FTP_TLS` class inherits from :class:`FTP`, defining these additional objects: + Here's a sample session using the :class:`FTP_TLS` class:: -.. attribute:: FTP_TLS.ssl_version + >>> ftps = FTP_TLS('ftp.pureftpd.org') + >>> ftps.login() + '230 Anonymous user logged in' + >>> ftps.prot_p() + '200 Data protection level set to "private"' + >>> ftps.nlst() + ['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp'] - The SSL version to use (defaults to :data:`ssl.PROTOCOL_SSLv23`). + :class:`!FTP_TLS` class inherits from :class:`FTP`, + defining these additional methods and attributes: -.. method:: FTP_TLS.auth() + .. attribute:: FTP_TLS.ssl_version - Set up a secure control connection by using TLS or SSL, depending on what - is specified in the :attr:`ssl_version` attribute. + The SSL version to use (defaults to :data:`ssl.PROTOCOL_SSLv23`). - .. versionchanged:: 3.4 - The method now supports hostname check with - :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see - :const:`ssl.HAS_SNI`). + .. method:: FTP_TLS.auth() + + Set up a secure control connection by using TLS or SSL, depending on what + is specified in the :attr:`ssl_version` attribute. -.. method:: FTP_TLS.ccc() + .. versionchanged:: 3.4 + The method now supports hostname check with + :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see + :const:`ssl.HAS_SNI`). - Revert control channel back to plaintext. This can be useful to take - advantage of firewalls that know how to handle NAT with non-secure FTP - without opening fixed ports. + .. method:: FTP_TLS.ccc() - .. versionadded:: 3.3 + Revert control channel back to plaintext. This can be useful to take + advantage of firewalls that know how to handle NAT with non-secure FTP + without opening fixed ports. -.. method:: FTP_TLS.prot_p() + .. versionadded:: 3.3 - Set up secure data connection. + .. method:: FTP_TLS.prot_p() -.. method:: FTP_TLS.prot_c() + Set up secure data connection. + + .. method:: FTP_TLS.prot_c() + + Set up clear text data connection. + + +Module variables +^^^^^^^^^^^^^^^^ + +.. exception:: error_reply + + Exception raised when an unexpected reply is received from the server. - Set up clear text data connection. + +.. exception:: error_temp + + Exception raised when an error code signifying a temporary error (response + codes in the range 400--499) is received. + + +.. exception:: error_perm + + Exception raised when an error code signifying a permanent error (response + codes in the range 500--599) is received. + + +.. exception:: error_proto + + Exception raised when a reply is received from the server that does not fit + the response specifications of the File Transfer Protocol, i.e. begin with a + digit in the range 1--5. + + +.. data:: all_errors + + The set of all exceptions (as a tuple) that methods of :class:`FTP` + instances may raise as a result of problems with the FTP connection (as + opposed to programming errors made by the caller). This set includes the + four exceptions listed above as well as :exc:`OSError` and :exc:`EOFError`. + + +.. seealso:: + + Module :mod:`netrc` + Parser for the :file:`.netrc` file format. The file :file:`.netrc` is + typically used by FTP clients to load user authentication information + before prompting the user. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 3cb70b7f..7247bb93 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -57,7 +57,8 @@ are always available. They are listed here in alphabetical order. .. function:: abs(x) Return the absolute value of a number. The argument may be an - integer, a floating point number, or an object implementing :meth:`__abs__`. + integer, a floating-point number, or an object implementing + :meth:`~object.__abs__`. If the argument is a complex number, its magnitude is returned. @@ -140,10 +141,11 @@ are always available. They are listed here in alphabetical order. See also :func:`format` for more information. -.. class:: bool(x=False) +.. class:: bool(object=False, /) - Return a Boolean value, i.e. one of ``True`` or ``False``. *x* is converted - using the standard :ref:`truth testing procedure `. If *x* is false + Return a Boolean value, i.e. one of ``True`` or ``False``. The argument + is converted using the standard :ref:`truth testing procedure `. + If the argument is false or omitted, this returns ``False``; otherwise, it returns ``True``. The :class:`bool` class is a subclass of :class:`int` (see :ref:`typesnumeric`). It cannot be subclassed further. Its only instances are ``False`` and @@ -152,14 +154,14 @@ are always available. They are listed here in alphabetical order. .. index:: pair: Boolean; type .. versionchanged:: 3.7 - *x* is now a positional-only parameter. + The parameter is now positional-only. .. function:: breakpoint(*args, **kws) This function drops you into the debugger at the call site. Specifically, it calls :func:`sys.breakpointhook`, passing ``args`` and ``kws`` straight through. By default, ``sys.breakpointhook()`` calls - :func:`pdb.set_trace()` expecting no arguments. In this case, it is + :func:`pdb.set_trace` expecting no arguments. In this case, it is purely a convenience function so you don't have to explicitly import :mod:`pdb` or type as much code to enter the debugger. However, :func:`sys.breakpointhook` can be set to some other function and @@ -235,7 +237,7 @@ are always available. They are listed here in alphabetical order. :const:`False` if not. If this returns ``True``, it is still possible that a call fails, but if it is ``False``, calling *object* will never succeed. Note that classes are callable (calling a class returns a new instance); - instances are callable if their class has a :meth:`__call__` method. + instances are callable if their class has a :meth:`~object.__call__` method. .. versionadded:: 3.2 This function was first removed in Python 3.0 and then brought back @@ -281,11 +283,13 @@ are always available. They are listed here in alphabetical order. :func:`property`. .. versionchanged:: 3.10 - Class methods now inherit the method attributes (``__module__``, - ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and - have a new ``__wrapped__`` attribute. + Class methods now inherit the method attributes + (:attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__doc__` and + :attr:`~function.__annotations__`) and have a new ``__wrapped__`` + attribute. - .. versionchanged:: 3.11 + .. deprecated-removed:: 3.11 3.13 Class methods can no longer wrap other :term:`descriptors ` such as :func:`property`. @@ -370,29 +374,73 @@ are always available. They are listed here in alphabetical order. support for top-level ``await``, ``async for``, and ``async with``. -.. class:: complex(real=0, imag=0) - complex(string) +.. class:: complex(number=0, /) + complex(string, /) + complex(real=0, imag=0) + + Convert a single string or number to a complex number, or create a + complex number from real and imaginary parts. + + Examples: + + .. doctest:: + + >>> complex('+1.23') + (1.23+0j) + >>> complex('-4.5j') + -4.5j + >>> complex('-1.23+4.5j') + (-1.23+4.5j) + >>> complex('\t( -1.23+4.5J )\n') + (-1.23+4.5j) + >>> complex('-Infinity+NaNj') + (-inf+nanj) + >>> complex(1.23) + (1.23+0j) + >>> complex(imag=-4.5) + -4.5j + >>> complex(-1.23, 4.5) + (-1.23+4.5j) + + If the argument is a string, it must contain either a real part (in the + same format as for :func:`float`) or an imaginary part (in the same + format but with a ``'j'`` or ``'J'`` suffix), or both real and imaginary + parts (the sign of the imaginary part is mandatory in this case). + The string can optionally be surrounded by whitespaces and the round + parentheses ``'('`` and ``')'``, which are ignored. + The string must not contain whitespace between ``'+'``, ``'-'``, the + ``'j'`` or ``'J'`` suffix, and the decimal number. + For example, ``complex('1+2j')`` is fine, but ``complex('1 + 2j')`` raises + :exc:`ValueError`. + More precisely, the input must conform to the :token:`~float:complexvalue` + production rule in the following grammar, after parentheses and leading and + trailing whitespace characters are removed: - Return a complex number with the value *real* + *imag*\*1j or convert a string - or number to a complex number. If the first parameter is a string, it will - be interpreted as a complex number and the function must be called without a - second parameter. The second parameter can never be a string. Each argument - may be any numeric type (including complex). If *imag* is omitted, it - defaults to zero and the constructor serves as a numeric conversion like - :class:`int` and :class:`float`. If both arguments are omitted, returns - ``0j``. + .. productionlist:: float + complexvalue: `floatvalue` | + : `floatvalue` ("j" | "J") | + : `floatvalue` `sign` `absfloatvalue` ("j" | "J") + If the argument is a number, the constructor serves as a numeric + conversion like :class:`int` and :class:`float`. For a general Python object ``x``, ``complex(x)`` delegates to - ``x.__complex__()``. If :meth:`~object.__complex__` is not defined then it falls back - to :meth:`~object.__float__`. If :meth:`!__float__` is not defined then it falls back + ``x.__complex__()``. + If :meth:`~object.__complex__` is not defined then it falls back + to :meth:`~object.__float__`. + If :meth:`!__float__` is not defined then it falls back to :meth:`~object.__index__`. - .. note:: + If two arguments are provided or keyword arguments are used, each argument + may be any numeric type (including complex). + If both arguments are real numbers, return a complex number with the real + component *real* and the imaginary component *imag*. + If both arguments are complex numbers, return a complex number with the real + component ``real.real-imag.imag`` and the imaginary component + ``real.imag+imag.real``. + If one of arguments is a real number, only its real component is used in + the above expressions. - When converting from a string, the string must not contain whitespace - around the central ``+`` or ``-`` operator. For example, - ``complex('1+2j')`` is fine, but ``complex('1 + 2j')`` raises - :exc:`ValueError`. + If all arguments are omitted, returns ``0j``. The complex type is described in :ref:`typesnumeric`. @@ -432,15 +480,18 @@ are always available. They are listed here in alphabetical order. Without arguments, return the list of names in the current local scope. With an argument, attempt to return a list of valid attributes for that object. - If the object has a method named :meth:`__dir__`, this method will be called and + If the object has a method named :meth:`~object.__dir__`, + this method will be called and must return the list of attributes. This allows objects that implement a custom - :func:`__getattr__` or :func:`__getattribute__` function to customize the way + :func:`~object.__getattr__` or :func:`~object.__getattribute__` function + to customize the way :func:`dir` reports their attributes. - If the object does not provide :meth:`__dir__`, the function tries its best to - gather information from the object's :attr:`~object.__dict__` attribute, if defined, and + If the object does not provide :meth:`~object.__dir__`, + the function tries its best to gather information from the object's + :attr:`~object.__dict__` attribute, if defined, and from its type object. The resulting list is not necessarily complete and may - be inaccurate when the object has a custom :func:`__getattr__`. + be inaccurate when the object has a custom :func:`~object.__getattr__`. The default :func:`dir` mechanism behaves differently with different types of objects, as it attempts to produce the most relevant, rather than complete, @@ -489,7 +540,7 @@ are always available. They are listed here in alphabetical order. Take two (non-complex) numbers as arguments and return a pair of numbers consisting of their quotient and remainder when using integer division. With mixed operand types, the rules for binary arithmetic operators apply. For - integers, the result is the same as ``(a // b, a % b)``. For floating point + integers, the result is the same as ``(a // b, a % b)``. For floating-point numbers the result is ``(q, a % b)``, where *q* is usually ``math.floor(a / b)`` but may be 1 less than that. In any case ``q * b + a % b`` is very close to *a*, if ``a % b`` is non-zero it has the same sign as *b*, and ``0 @@ -520,29 +571,45 @@ are always available. They are listed here in alphabetical order. .. _func-eval: -.. function:: eval(expression, globals=None, locals=None) +.. function:: eval(source, /, globals=None, locals=None) + + :param source: + A Python expression. + :type source: :class:`str` | :ref:`code object ` + + :param globals: + The global namespace (default: ``None``). + :type globals: :class:`dict` | ``None`` + + :param locals: + The local namespace (default: ``None``). + :type locals: :term:`mapping` | ``None`` - The arguments are a string and optional globals and locals. If provided, - *globals* must be a dictionary. If provided, *locals* can be any mapping - object. + :returns: The result of the evaluated expression. + :raises: Syntax errors are reported as exceptions. + + .. warning:: + + This function executes arbitrary code. Calling it with + user-supplied input may lead to security vulnerabilities. The *expression* argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the *globals* and *locals* - dictionaries as global and local namespace. If the *globals* dictionary is + mappings as global and local namespace. If the *globals* dictionary is present and does not contain a value for the key ``__builtins__``, a reference to the dictionary of the built-in module :mod:`builtins` is inserted under that key before *expression* is parsed. That way you can control what builtins are available to the executed code by inserting your own ``__builtins__`` dictionary into *globals* before passing it to - :func:`eval`. If the *locals* dictionary is omitted it defaults to the - *globals* dictionary. If both dictionaries are omitted, the expression is + :func:`eval`. If the *locals* mapping is omitted it defaults to the + *globals* dictionary. If both mappings are omitted, the expression is executed with the *globals* and *locals* in the environment where - :func:`eval` is called. Note, *eval()* does not have access to the + :func:`eval` is called. Note, *eval()* will only have access to the :term:`nested scopes ` (non-locals) in the enclosing - environment. + environment if they are already referenced in the scope that is calling + :func:`eval` (e.g. via a :keyword:`nonlocal` statement). - The return value is the result of - the evaluated expression. Syntax errors are reported as exceptions. Example: + Example: >>> x = 1 >>> eval('x+1') @@ -569,11 +636,25 @@ are always available. They are listed here in alphabetical order. Raises an :ref:`auditing event ` ``exec`` with the code object as the argument. Code compilation events may also be raised. + .. versionchanged:: 3.13 + + The *globals* and *locals* arguments can now be passed as keywords. + + .. versionchanged:: 3.13 + + The semantics of the default *locals* namespace have been adjusted as + described for the :func:`locals` builtin. + .. index:: pair: built-in function; exec -.. function:: exec(object, globals=None, locals=None, /, *, closure=None) +.. function:: exec(source, /, globals=None, locals=None, *, closure=None) + + .. warning:: + + This function executes arbitrary code. Calling it with + user-supplied input may lead to security vulnerabilities. - This function supports dynamic execution of Python code. *object* must be + This function supports dynamic execution of Python code. *source* must be either a string or a code object. If it is a string, the string is parsed as a suite of Python statements which is then executed (unless a syntax error occurs). [#]_ If it is a code object, it is simply executed. In all cases, @@ -590,9 +671,15 @@ are always available. They are listed here in alphabetical order. will be used for both the global and the local variables. If *globals* and *locals* are given, they are used for the global and local variables, respectively. If provided, *locals* can be any mapping object. Remember - that at the module level, globals and locals are the same dictionary. If exec - gets two separate objects as *globals* and *locals*, the code will be - executed as if it were embedded in a class definition. + that at the module level, globals and locals are the same dictionary. + + .. note:: + + When ``exec`` gets two separate objects as *globals* and *locals*, the + code will be executed as if it were embedded in a class definition. This + means functions and classes defined in the executed code will not be able + to access variables assigned at the top level (as the "top level" + variables are treated as class variables in a class definition). If the *globals* dictionary does not contain a value for the key ``__builtins__``, a reference to the dictionary of the built-in module @@ -601,9 +688,10 @@ are always available. They are listed here in alphabetical order. ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`. The *closure* argument specifies a closure--a tuple of cellvars. - It's only valid when the *object* is a code object containing free variables. - The length of the tuple must exactly match the number of free variables - referenced by the code object. + It's only valid when the *object* is a code object containing + :term:`free (closure) variables `. + The length of the tuple must exactly match the length of the code object's + :attr:`~codeobject.co_freevars` attribute. .. audit-event:: exec code_object exec @@ -613,19 +701,27 @@ are always available. They are listed here in alphabetical order. .. note:: The built-in functions :func:`globals` and :func:`locals` return the current - global and local dictionary, respectively, which may be useful to pass around + global and local namespace, respectively, which may be useful to pass around for use as the second and third argument to :func:`exec`. .. note:: - The default *locals* act as described for function :func:`locals` below: - modifications to the default *locals* dictionary should not be attempted. + The default *locals* act as described for function :func:`locals` below. Pass an explicit *locals* dictionary if you need to see effects of the code on *locals* after function :func:`exec` returns. .. versionchanged:: 3.11 Added the *closure* parameter. + .. versionchanged:: 3.13 + + The *globals* and *locals* arguments can now be passed as keywords. + + .. versionchanged:: 3.13 + + The semantics of the default *locals* namespace have been adjusted as + described for the :func:`locals` builtin. + .. function:: filter(function, iterable) @@ -644,39 +740,56 @@ are always available. They are listed here in alphabetical order. elements of *iterable* for which *function* is false. -.. class:: float(x=0.0) +.. class:: float(number=0.0, /) + float(string, /) .. index:: single: NaN single: Infinity - Return a floating point number constructed from a number or string *x*. + Return a floating-point number constructed from a number or a string. + + Examples: + + .. doctest:: + + >>> float('+1.23') + 1.23 + >>> float(' -12345\n') + -12345.0 + >>> float('1e-003') + 0.001 + >>> float('+1E6') + 1000000.0 + >>> float('-Infinity') + -inf If the argument is a string, it should contain a decimal number, optionally preceded by a sign, and optionally embedded in whitespace. The optional sign may be ``'+'`` or ``'-'``; a ``'+'`` sign has no effect on the value produced. The argument may also be a string representing a NaN - (not-a-number), or positive or negative infinity. More precisely, the - input must conform to the ``floatvalue`` production rule in the following - grammar, after leading and trailing whitespace characters are removed: + (not-a-number), or positive or negative infinity. + More precisely, the input must conform to the :token:`~float:floatvalue` + production rule in the following grammar, after leading and trailing + whitespace characters are removed: .. productionlist:: float sign: "+" | "-" infinity: "Infinity" | "inf" nan: "nan" + digit: digitpart: `digit` (["_"] `digit`)* number: [`digitpart`] "." `digitpart` | `digitpart` ["."] - exponent: ("e" | "E") ["+" | "-"] `digitpart` - floatnumber: number [`exponent`] - floatvalue: [`sign`] (`floatnumber` | `infinity` | `nan`) + exponent: ("e" | "E") [`sign`] `digitpart` + floatnumber: `number` [`exponent`] + absfloatvalue: `floatnumber` | `infinity` | `nan` + floatvalue: [`sign`] `absfloatvalue` - Here ``digit`` is a Unicode decimal digit (character in the Unicode general - category ``Nd``). Case is not significant, so, for example, "inf", "Inf", - "INFINITY", and "iNfINity" are all acceptable spellings for positive - infinity. + Case is not significant, so, for example, "inf", "Inf", "INFINITY", and + "iNfINity" are all acceptable spellings for positive infinity. - Otherwise, if the argument is an integer or a floating point number, a - floating point number with the same value (within Python's floating point + Otherwise, if the argument is an integer or a floating-point number, a + floating-point number with the same value (within Python's floating-point precision) is returned. If the argument is outside the range of a Python float, an :exc:`OverflowError` will be raised. @@ -686,26 +799,13 @@ are always available. They are listed here in alphabetical order. If no argument is given, ``0.0`` is returned. - Examples:: - - >>> float('+1.23') - 1.23 - >>> float(' -12345\n') - -12345.0 - >>> float('1e-003') - 0.001 - >>> float('+1E6') - 1000000.0 - >>> float('-Infinity') - -inf - The float type is described in :ref:`typesnumeric`. .. versionchanged:: 3.6 Grouping digits with underscores as in code literals is allowed. .. versionchanged:: 3.7 - *x* is now a positional-only parameter. + The parameter is now positional-only. .. versionchanged:: 3.8 Falls back to :meth:`~object.__index__` if :meth:`~object.__float__` is not defined. @@ -727,8 +827,8 @@ are always available. They are listed here in alphabetical order. A call to ``format(value, format_spec)`` is translated to ``type(value).__format__(value, format_spec)`` which bypasses the instance - dictionary when searching for the value's :meth:`__format__` method. A - :exc:`TypeError` exception is raised if the method search reaches + dictionary when searching for the value's :meth:`~object.__format__` method. + A :exc:`TypeError` exception is raised if the method search reaches :mod:`object` and the *format_spec* is non-empty, or if either the *format_spec* or the return value are not strings. @@ -792,9 +892,9 @@ are always available. They are listed here in alphabetical order. .. note:: - For objects with custom :meth:`__hash__` methods, note that :func:`hash` + For objects with custom :meth:`~object.__hash__` methods, + note that :func:`hash` truncates the return value based on the bit width of the host machine. - See :meth:`__hash__ ` for details. .. function:: help() help(request) @@ -889,17 +989,36 @@ are always available. They are listed here in alphabetical order. with the result after successfully reading input. -.. class:: int(x=0) - int(x, base=10) +.. class:: int(number=0, /) + int(string, /, base=10) + + Return an integer object constructed from a number or a string, or return + ``0`` if no arguments are given. - Return an integer object constructed from a number or string *x*, or return - ``0`` if no arguments are given. If *x* defines :meth:`~object.__int__`, - ``int(x)`` returns ``x.__int__()``. If *x* defines :meth:`~object.__index__`, - it returns ``x.__index__()``. If *x* defines :meth:`~object.__trunc__`, + Examples: + + .. doctest:: + + >>> int(123.45) + 123 + >>> int('123') + 123 + >>> int(' -12_345\n') + -12345 + >>> int('FACE', 16) + 64206 + >>> int('0xface', 0) + 64206 + >>> int('01110011', base=2) + 115 + + If the argument defines :meth:`~object.__int__`, + ``int(x)`` returns ``x.__int__()``. If the argument defines :meth:`~object.__index__`, + it returns ``x.__index__()``. If the argument defines :meth:`~object.__trunc__`, it returns ``x.__trunc__()``. - For floating point numbers, this truncates towards zero. + For floating-point numbers, this truncates towards zero. - If *x* is not a number or if *base* is given, then *x* must be a string, + If the argument is not a number or if *base* is given, then it must be a string, :class:`bytes`, or :class:`bytearray` instance representing an integer in radix *base*. Optionally, the string can be preceded by ``+`` or ``-`` (with no space in between), have leading zeros, be surrounded by whitespace, @@ -929,7 +1048,7 @@ are always available. They are listed here in alphabetical order. Grouping digits with underscores as in code literals is allowed. .. versionchanged:: 3.7 - *x* is now a positional-only parameter. + The first parameter is now positional-only. .. versionchanged:: 3.8 Falls back to :meth:`~object.__index__` if :meth:`~object.__int__` is not defined. @@ -940,7 +1059,7 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.11 :class:`int` string inputs and string representations can be limited to help avoid denial of service attacks. A :exc:`ValueError` is raised when - the limit is exceeded while converting a string *x* to an :class:`int` or + the limit is exceeded while converting a string to an :class:`int` or when converting an :class:`int` into a string would exceed the limit. See the :ref:`integer string conversion length limitation ` documentation. @@ -982,8 +1101,9 @@ are always available. They are listed here in alphabetical order. Return an :term:`iterator` object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, *object* must be a collection object which supports the - :term:`iterable` protocol (the :meth:`__iter__` method), or it must support - the sequence protocol (the :meth:`__getitem__` method with integer arguments + :term:`iterable` protocol (the :meth:`~object.__iter__` method), + or it must support + the sequence protocol (the :meth:`~object.__getitem__` method with integer arguments starting at ``0``). If it does not support either of those protocols, :exc:`TypeError` is raised. If the second argument, *sentinel*, is given, then *object* must be a callable object. The iterator created in this case @@ -1027,14 +1147,56 @@ are always available. They are listed here in alphabetical order. .. function:: locals() - Update and return a dictionary representing the current local symbol table. - Free variables are returned by :func:`locals` when it is called in function - blocks, but not in class blocks. Note that at the module level, :func:`locals` - and :func:`globals` are the same dictionary. + Return a mapping object representing the current local symbol table, with + variable names as the keys, and their currently bound references as the + values. + + At module scope, as well as when using :func:`exec` or :func:`eval` with + a single namespace, this function returns the same namespace as + :func:`globals`. + + At class scope, it returns the namespace that will be passed to the + metaclass constructor. + + When using ``exec()`` or ``eval()`` with separate local and global + arguments, it returns the local namespace passed in to the function call. + + In all of the above cases, each call to ``locals()`` in a given frame of + execution will return the *same* mapping object. Changes made through + the mapping object returned from ``locals()`` will be visible as assigned, + reassigned, or deleted local variables, and assigning, reassigning, or + deleting local variables will immediately affect the contents of the + returned mapping object. + + In an :term:`optimized scope` (including functions, generators, and + coroutines), each call to ``locals()`` instead returns a fresh dictionary + containing the current bindings of the function's local variables and any + nonlocal cell references. In this case, name binding changes made via the + returned dict are *not* written back to the corresponding local variables + or nonlocal cell references, and assigning, reassigning, or deleting local + variables and nonlocal cell references does *not* affect the contents + of previously returned dictionaries. + + Calling ``locals()`` as part of a comprehension in a function, generator, or + coroutine is equivalent to calling it in the containing scope, except that + the comprehension's initialised iteration variables will be included. In + other scopes, it behaves as if the comprehension were running as a nested + function. + + Calling ``locals()`` as part of a generator expression is equivalent to + calling it in a nested generator function. + + .. versionchanged:: 3.12 + The behaviour of ``locals()`` in a comprehension has been updated as + described in :pep:`709`. + + .. versionchanged:: 3.13 + As part of :pep:`667`, the semantics of mutating the mapping objects + returned from this function are now defined. The behavior in + :term:`optimized scopes ` is now as described above. + Aside from being defined, the behaviour in other scopes remains + unchanged from previous versions. - .. note:: - The contents of this dictionary should not be modified; changes may not - affect the values of local and free variables used by the interpreter. .. function:: map(function, iterable, *iterables) @@ -1069,8 +1231,8 @@ are always available. They are listed here in alphabetical order. such as ``sorted(iterable, key=keyfunc, reverse=True)[0]`` and ``heapq.nlargest(1, iterable, key=keyfunc)``. - .. versionadded:: 3.4 - The *default* keyword-only argument. + .. versionchanged:: 3.4 + Added the *default* keyword-only parameter. .. versionchanged:: 3.8 The *key* can be ``None``. @@ -1107,8 +1269,8 @@ are always available. They are listed here in alphabetical order. such as ``sorted(iterable, key=keyfunc)[0]`` and ``heapq.nsmallest(1, iterable, key=keyfunc)``. - .. versionadded:: 3.4 - The *default* keyword-only argument. + .. versionchanged:: 3.4 + Added the *default* keyword-only parameter. .. versionchanged:: 3.8 The *key* can be ``None``. @@ -1124,14 +1286,16 @@ are always available. They are listed here in alphabetical order. .. class:: object() - Return a new featureless object. :class:`object` is a base for all classes. - It has methods that are common to all instances of Python classes. This - function does not accept any arguments. + This is the ultimate base class of all other classes. It has methods + that are common to all instances of Python classes. When the constructor + is called, it returns a new featureless object. The constructor does not + accept any arguments. .. note:: - :class:`object` does *not* have a :attr:`~object.__dict__`, so you can't - assign arbitrary attributes to an instance of the :class:`object` class. + :class:`object` instances do *not* have :attr:`~object.__dict__` + attributes, so you can't assign arbitrary attributes to an instance of + :class:`object`. .. function:: oct(x) @@ -1158,8 +1322,8 @@ are always available. They are listed here in alphabetical order. See also :func:`format` for more information. - .. index:: - single: file object; open() built-in function +.. index:: + single: file object; open() built-in function .. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) @@ -1180,7 +1344,7 @@ are always available. They are listed here in alphabetical order. (which on *some* Unix systems, means that *all* writes append to the end of the file regardless of the current seek position). In text mode, if *encoding* is not specified the encoding used is platform-dependent: - :func:`locale.getencoding()` is called to get the current locale encoding. + :func:`locale.getencoding` is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave *encoding* unspecified.) The available modes are: @@ -1221,7 +1385,7 @@ are always available. They are listed here in alphabetical order. *buffering* is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line - buffering (only usable in text mode), and an integer > 1 to indicate the size + buffering (only usable when writing in text mode), and an integer > 1 to indicate the size in bytes of a fixed-size chunk buffer. Note that specifying a buffer size this way applies for binary buffered I/O, but ``TextIOWrapper`` (i.e., files opened with ``mode='r+'``) would have another buffering. To disable buffering in @@ -1353,35 +1517,35 @@ are always available. They are listed here in alphabetical order. (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, and :mod:`shutil`. - .. audit-event:: open file,mode,flags open + .. audit-event:: open path,mode,flags open The ``mode`` and ``flags`` arguments may have been modified or inferred from the original call. .. versionchanged:: 3.3 - * The *opener* parameter was added. - * The ``'x'`` mode was added. - * :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. - * :exc:`FileExistsError` is now raised if the file opened in exclusive - creation mode (``'x'``) already exists. + * The *opener* parameter was added. + * The ``'x'`` mode was added. + * :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. + * :exc:`FileExistsError` is now raised if the file opened in exclusive + creation mode (``'x'``) already exists. .. versionchanged:: 3.4 - * The file is now non-inheritable. + * The file is now non-inheritable. .. versionchanged:: 3.5 - * If the system call is interrupted and the signal handler does not raise an - exception, the function now retries the system call instead of raising an - :exc:`InterruptedError` exception (see :pep:`475` for the rationale). - * The ``'namereplace'`` error handler was added. + * If the system call is interrupted and the signal handler does not raise an + exception, the function now retries the system call instead of raising an + :exc:`InterruptedError` exception (see :pep:`475` for the rationale). + * The ``'namereplace'`` error handler was added. .. versionchanged:: 3.6 - * Support added to accept objects implementing :class:`os.PathLike`. - * On Windows, opening a console buffer may return a subclass of - :class:`io.RawIOBase` other than :class:`io.FileIO`. + * Support added to accept objects implementing :class:`os.PathLike`. + * On Windows, opening a console buffer may return a subclass of + :class:`io.RawIOBase` other than :class:`io.FileIO`. .. versionchanged:: 3.11 The ``'U'`` mode has been removed. @@ -1409,7 +1573,9 @@ are always available. They are listed here in alphabetical order. returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For a negative base of type :class:`int` or :class:`float` and a non-integral exponent, a complex result is delivered. For example, ``pow(-9, 0.5)`` returns a value close - to ``3j``. + to ``3j``. Whereas, for a negative base of type :class:`int` or :class:`float` + with an integral exponent, a float result is delivered. For example, + ``pow(-9, 2.0)`` returns ``81.0``. For :class:`int` operands *base* and *exp*, if *mod* is present, *mod* must also be of integer type and *mod* must be nonzero. If *mod* is present and @@ -1500,42 +1666,55 @@ are always available. They are listed here in alphabetical order. """Get the current voltage.""" return self._voltage - The ``@property`` decorator turns the :meth:`voltage` method into a "getter" + The ``@property`` decorator turns the :meth:`!voltage` method into a "getter" for a read-only attribute with the same name, and it sets the docstring for *voltage* to "Get the current voltage." - A property object has :attr:`~property.getter`, :attr:`~property.setter`, - and :attr:`~property.deleter` methods usable as decorators that create a - copy of the property with the corresponding accessor function set to the - decorated function. This is best explained with an example:: + .. decorator:: property.getter + .. decorator:: property.setter + .. decorator:: property.deleter - class C: - def __init__(self): - self._x = None + A property object has ``getter``, ``setter``, + and ``deleter`` methods usable as decorators that create a + copy of the property with the corresponding accessor function set to the + decorated function. This is best explained with an example: - @property - def x(self): - """I'm the 'x' property.""" - return self._x + .. testcode:: - @x.setter - def x(self, value): - self._x = value + class C: + def __init__(self): + self._x = None - @x.deleter - def x(self): - del self._x + @property + def x(self): + """I'm the 'x' property.""" + return self._x - This code is exactly equivalent to the first example. Be sure to give the - additional functions the same name as the original property (``x`` in this - case.) + @x.setter + def x(self, value): + self._x = value - The returned property object also has the attributes ``fget``, ``fset``, and - ``fdel`` corresponding to the constructor arguments. + @x.deleter + def x(self): + del self._x + + This code is exactly equivalent to the first example. Be sure to give the + additional functions the same name as the original property (``x`` in this + case.) + + The returned property object also has the attributes ``fget``, ``fset``, and + ``fdel`` corresponding to the constructor arguments. .. versionchanged:: 3.5 The docstrings of property objects are now writeable. + .. attribute:: __name__ + + Attribute holding the name of the property. The name of the property + can be changed at runtime. + + .. versionadded:: 3.13 + .. _func-range: .. class:: range(stop) @@ -1554,17 +1733,28 @@ are always available. They are listed here in alphabetical order. representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this - function returns for its instances by defining a :meth:`__repr__` method. + function returns for its instances + by defining a :meth:`~object.__repr__` method. If :func:`sys.displayhook` is not accessible, this function will raise :exc:`RuntimeError`. + This class has a custom representation that can be evaluated:: + + class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def __repr__(self): + return f"Person('{self.name}', {self.age})" + .. function:: reversed(seq) Return a reverse :term:`iterator`. *seq* must be an object which has - a :meth:`__reversed__` method or supports the sequence protocol (the - :meth:`__len__` method and the :meth:`__getitem__` method with integer - arguments starting at ``0``). + a :meth:`~object.__reversed__` method or supports the sequence protocol (the + :meth:`~object.__len__` method and the :meth:`~object.__getitem__` method + with integer arguments starting at ``0``). .. function:: round(number, ndigits=None) @@ -1635,13 +1825,21 @@ are always available. They are listed here in alphabetical order. Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to - ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, - :attr:`~slice.stop`, and :attr:`~slice.step` which merely return the argument - values (or their default). They have no other explicit functionality; - however, they are used by NumPy and other third-party packages. + ``None``. + + .. attribute:: slice.start + .. attribute:: slice.stop + .. attribute:: slice.step + + Slice objects have read-only data attributes :attr:`!start`, + :attr:`!stop`, and :attr:`!step` which merely return the argument + values (or their default). They have no other explicit functionality; + however, they are used by NumPy and other third-party packages. + Slice objects are also generated when extended indexing syntax is used. For example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See - :func:`itertools.islice` for an alternate version that returns an iterator. + :func:`itertools.islice` for an alternate version that returns an + :term:`iterator`. .. versionchanged:: 3.12 Slice objects are now :term:`hashable` (provided :attr:`~slice.start`, @@ -1694,8 +1892,9 @@ are always available. They are listed here in alphabetical order. :ref:`function` for details. A static method can be called either on the class (such as ``C.f()``) or on - an instance (such as ``C().f()``). Moreover, they can be called as regular - functions (such as ``f()``). + an instance (such as ``C().f()``). + Moreover, the static method :term:`descriptor` is also callable, so it can + be used in the class definition (such as ``f()``). Static methods in Python are similar to those found in Java or C++. Also, see :func:`classmethod` for a variant that is useful for creating alternate class @@ -1716,10 +1915,11 @@ are always available. They are listed here in alphabetical order. For more information on static methods, see :ref:`types`. .. versionchanged:: 3.10 - Static methods now inherit the method attributes (``__module__``, - ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``), - have a new ``__wrapped__`` attribute, and are now callable as regular - functions. + Static methods now inherit the method attributes + (:attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__doc__` and + :attr:`~function.__annotations__`), have a new ``__wrapped__`` attribute, + and are now callable as regular functions. .. index:: @@ -1744,7 +1944,7 @@ are always available. They are listed here in alphabetical order. For some use cases, there are good alternatives to :func:`sum`. The preferred, fast way to concatenate a sequence of strings is by calling - ``''.join(sequence)``. To add floating point values with extended precision, + ``''.join(sequence)``. To add floating-point values with extended precision, see :func:`math.fsum`\. To concatenate a series of iterables, consider using :func:`itertools.chain`. @@ -1752,7 +1952,7 @@ are always available. They are listed here in alphabetical order. The *start* parameter can be specified as a keyword argument. .. versionchanged:: 3.12 Summation of floats switched to an algorithm - that gives higher accuracy on most builds. + that gives higher accuracy and better commutativity on most builds. .. class:: super() @@ -1766,20 +1966,27 @@ are always available. They are listed here in alphabetical order. to be searched. The search starts from the class right after the *type*. - For example, if :attr:`~class.__mro__` of *object_or_type* is + For example, if :attr:`~type.__mro__` of *object_or_type* is ``D -> B -> C -> A -> object`` and the value of *type* is ``B``, then :func:`super` searches ``C -> A -> object``. - The :attr:`~class.__mro__` attribute of the *object_or_type* lists the method - resolution search order used by both :func:`getattr` and :func:`super`. The - attribute is dynamic and can change whenever the inheritance hierarchy is - updated. + The :attr:`~type.__mro__` attribute of the class corresponding to + *object_or_type* lists the method resolution search order used by both + :func:`getattr` and :func:`super`. The attribute is dynamic and can change + whenever the inheritance hierarchy is updated. If the second argument is omitted, the super object returned is unbound. If the second argument is an object, ``isinstance(obj, type)`` must be true. If the second argument is a type, ``issubclass(type2, type)`` must be true (this is useful for classmethods). + When called directly within an ordinary method of a class, both arguments may + be omitted ("zero-argument :func:`!super`"). In this case, *type* will be the + enclosing class, and *obj* will be the first argument of the immediately + enclosing function (typically ``self``). (This means that zero-argument + :func:`!super` will not work as expected within nested functions, including + generator expressions, which implicitly create nested functions.) + There are two typical use cases for *super*. In a class hierarchy with single inheritance, *super* can be used to refer to parent classes without naming them explicitly, thus making the code more maintainable. This use @@ -1808,7 +2015,8 @@ are always available. They are listed here in alphabetical order. Note that :func:`super` is implemented as part of the binding process for explicit dotted attribute lookups such as ``super().__getitem__(name)``. - It does so by implementing its own :meth:`__getattribute__` method for searching + It does so by implementing its own :meth:`~object.__getattribute__` method + for searching classes in a predictable order that supports cooperative multiple inheritance. Accordingly, :func:`super` is undefined for implicit lookups using statements or operators such as ``super()[name]``. @@ -1841,28 +2049,30 @@ are always available. They are listed here in alphabetical order. With one argument, return the type of an *object*. The return value is a type object and generally the same object as returned by - :attr:`object.__class__ `. + :attr:`object.__class__`. The :func:`isinstance` built-in function is recommended for testing the type of an object, because it takes subclasses into account. - With three arguments, return a new type object. This is essentially a dynamic form of the :keyword:`class` statement. The *name* string is - the class name and becomes the :attr:`~definition.__name__` attribute. + the class name and becomes the :attr:`~type.__name__` attribute. The *bases* tuple contains the base classes and becomes the - :attr:`~class.__bases__` attribute; if empty, :class:`object`, the + :attr:`~type.__bases__` attribute; if empty, :class:`object`, the ultimate base of all classes, is added. The *dict* dictionary contains attribute and method definitions for the class body; it may be copied - or wrapped before becoming the :attr:`~object.__dict__` attribute. - The following two statements create identical :class:`type` objects: + or wrapped before becoming the :attr:`~type.__dict__` attribute. + The following two statements create identical :class:`!type` objects: >>> class X: ... a = 1 ... >>> X = type('X', (), dict(a=1)) - See also :ref:`bltin-type-objects`. + See also: + + * :ref:`Documentation on attributes and methods on classes `. + * :ref:`bltin-type-objects` Keyword arguments provided to the three argument form are passed to the appropriate metaclass machinery (usually :meth:`~object.__init_subclass__`) @@ -1872,28 +2082,32 @@ are always available. They are listed here in alphabetical order. See also :ref:`class-customization`. .. versionchanged:: 3.6 - Subclasses of :class:`type` which don't override ``type.__new__`` may no + Subclasses of :class:`!type` which don't override ``type.__new__`` may no longer use the one-argument form to get the type of an object. .. function:: vars() vars(object) Return the :attr:`~object.__dict__` attribute for a module, class, instance, - or any other object with a :attr:`~object.__dict__` attribute. + or any other object with a :attr:`!__dict__` attribute. Objects such as modules and instances have an updateable :attr:`~object.__dict__` attribute; however, other objects may have write restrictions on their - :attr:`~object.__dict__` attributes (for example, classes use a + :attr:`!__dict__` attributes (for example, classes use a :class:`types.MappingProxyType` to prevent direct dictionary updates). - Without an argument, :func:`vars` acts like :func:`locals`. Note, the - locals dictionary is only useful for reads since updates to the locals - dictionary are ignored. + Without an argument, :func:`vars` acts like :func:`locals`. A :exc:`TypeError` exception is raised if an object is specified but it doesn't have a :attr:`~object.__dict__` attribute (for example, if its class defines the :attr:`~object.__slots__` attribute). + .. versionchanged:: 3.13 + + The result of calling this function without an argument has been + updated as described for the :func:`locals` builtin. + + .. function:: zip(*iterables, strict=False) Iterate over several iterables in parallel, producing tuples with an item diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index f736eb0a..3540a1e8 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -1,5 +1,5 @@ -:mod:`functools` --- Higher-order functions and operations on callable objects -============================================================================== +:mod:`!functools` --- Higher-order functions and operations on callable objects +=============================================================================== .. module:: functools :synopsis: Higher-order functions and operations on callable objects. @@ -34,7 +34,7 @@ The :mod:`functools` module defines the following functions: Returns the same as ``lru_cache(maxsize=None)``, creating a thin wrapper around a dictionary lookup for the function arguments. Because it never needs to evict old values, this is smaller and faster than - :func:`lru_cache()` with a size limit. + :func:`lru_cache` with a size limit. For example:: @@ -194,7 +194,7 @@ The :mod:`functools` module defines the following functions: In contrast, the tuple arguments ``('answer', Decimal(42))`` and ``('answer', Fraction(42))`` are treated as equivalent. - The wrapped function is instrumented with a :func:`cache_parameters` + The wrapped function is instrumented with a :func:`!cache_parameters` function that returns a new :class:`dict` showing the values for *maxsize* and *typed*. This is for information purposes only. Mutating the values has no effect. @@ -218,7 +218,7 @@ The :mod:`functools` module defines the following functions: cache. See :ref:`faq-cache-method-calls` An `LRU (least recently used) cache - `_ + `_ works best when the most recent calls are the best predictors of upcoming calls (for example, the most popular articles on a news server tend to change each day). The cache's size limit assures that the cache does not @@ -275,8 +275,8 @@ The :mod:`functools` module defines the following functions: .. versionchanged:: 3.8 Added the *user_function* option. - .. versionadded:: 3.9 - Added the function :func:`cache_parameters` + .. versionchanged:: 3.9 + Added the function :func:`!cache_parameters` .. decorator:: total_ordering @@ -325,7 +325,7 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.2 .. versionchanged:: 3.4 - Returning NotImplemented from the underlying comparison function for + Returning ``NotImplemented`` from the underlying comparison function for unrecognised types is now supported. .. function:: partial(func, /, *args, **keywords) @@ -403,25 +403,27 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.4 -.. function:: reduce(function, iterable[, initializer]) +.. function:: reduce(function, iterable[, initial], /) Apply *function* of two arguments cumulatively to the items of *iterable*, from left to right, so as to reduce the iterable to a single value. For example, ``reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`` calculates ``((((1+2)+3)+4)+5)``. The left argument, *x*, is the accumulated value and the right argument, *y*, is - the update value from the *iterable*. If the optional *initializer* is present, + the update value from the *iterable*. If the optional *initial* is present, it is placed before the items of the iterable in the calculation, and serves as - a default when the iterable is empty. If *initializer* is not given and + a default when the iterable is empty. If *initial* is not given and *iterable* contains only one item, the first item is returned. Roughly equivalent to:: - def reduce(function, iterable, initializer=None): + initial_missing = object() + + def reduce(function, iterable, initial=initial_missing, /): it = iter(iterable) - if initializer is None: + if initial is initial_missing: value = next(it) else: - value = initializer + value = initial for element in it: value = function(value, element) return value @@ -490,6 +492,25 @@ The :mod:`functools` module defines the following functions: ... print(arg.real, arg.imag) ... + For code that dispatches on a collections type (e.g., ``list``), but wants + to typehint the items of the collection (e.g., ``list[int]``), the + dispatch type should be passed explicitly to the decorator itself with the + typehint going into the function definition:: + + >>> @fun.register(list) + ... def _(arg: list[int], verbose=False): + ... if verbose: + ... print("Enumerate this:") + ... for i, elem in enumerate(arg): + ... print(i, elem) + + .. note:: + + At runtime the function will dispatch on an instance of a list regardless + of the type contained within the list i.e. ``[1,2,3]`` will be + dispatched the same as ``["foo", "bar", "baz"]``. The annotation + provided in this example is for static type checkers only and has no + runtime impact. To enable registering :term:`lambdas` and pre-existing functions, the :func:`register` attribute can also be used in a functional form:: @@ -644,9 +665,11 @@ The :mod:`functools` module defines the following functions: attributes of the wrapper function are updated with the corresponding attributes from the original function. The default values for these arguments are the module level constants ``WRAPPER_ASSIGNMENTS`` (which assigns to the wrapper - function's ``__module__``, ``__name__``, ``__qualname__``, ``__annotations__`` - and ``__doc__``, the documentation string) and ``WRAPPER_UPDATES`` (which - updates the wrapper function's ``__dict__``, i.e. the instance dictionary). + function's :attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__annotations__`, + :attr:`~function.__type_params__`, and :attr:`~function.__doc__`, the + documentation string) and ``WRAPPER_UPDATES`` (which updates the wrapper + function's :attr:`~function.__dict__`, i.e. the instance dictionary). To allow access to the original function for introspection and other purposes (e.g. bypassing a caching decorator such as :func:`lru_cache`), this function @@ -665,13 +688,9 @@ The :mod:`functools` module defines the following functions: on the wrapper function). :exc:`AttributeError` is still raised if the wrapper function itself is missing any attributes named in *updated*. - .. versionadded:: 3.2 - Automatic addition of the ``__wrapped__`` attribute. - - .. versionadded:: 3.2 - Copying of the ``__annotations__`` attribute by default. - .. versionchanged:: 3.2 + The ``__wrapped__`` attribute is now automatically added. + The :attr:`~function.__annotations__` attribute is now copied by default. Missing attributes no longer trigger an :exc:`AttributeError`. .. versionchanged:: 3.4 @@ -679,6 +698,9 @@ The :mod:`functools` module defines the following functions: function, even if that function defined a ``__wrapped__`` attribute. (see :issue:`17482`) + .. versionchanged:: 3.12 + The :attr:`~function.__type_params__` attribute is now copied by default. + .. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) @@ -739,9 +761,10 @@ have three read-only attributes: The keyword arguments that will be supplied when the :class:`partial` object is called. -:class:`partial` objects are like :class:`function` objects in that they are -callable, weak referencable, and can have attributes. There are some important -differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes +:class:`partial` objects are like :ref:`function objects ` +in that they are callable, weak referenceable, and can have attributes. +There are some important differences. For instance, the +:attr:`~function.__name__` and :attr:`function.__doc__` attributes are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up. diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 331c071c..8ce850ba 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -1,5 +1,5 @@ -:mod:`gc` --- Garbage Collector interface -========================================= +:mod:`!gc` --- Garbage Collector interface +========================================== .. module:: gc :synopsis: Interface to the cycle-detecting garbage collector. @@ -42,8 +42,8 @@ The :mod:`gc` module provides the following functions: With no arguments, run a full collection. The optional argument *generation* may be an integer specifying which generation to collect (from 0 to 2). A - :exc:`ValueError` is raised if the generation number is invalid. The number of - unreachable objects found is returned. + :exc:`ValueError` is raised if the generation number is invalid. The sum of + collected objects and uncollectable objects is returned. The free lists maintained for a number of built-in types are cleared whenever a full collection or collection of the highest generation (2) @@ -69,7 +69,7 @@ The :mod:`gc` module provides the following functions: .. function:: get_objects(generation=None) Returns a list of all objects tracked by the collector, excluding the list - returned. If *generation* is not None, return only the objects tracked by + returned. If *generation* is not ``None``, return only the objects tracked by the collector that are in that generation. .. versionchanged:: 3.8 @@ -96,7 +96,7 @@ The :mod:`gc` module provides the following functions: .. versionadded:: 3.4 -.. function:: set_threshold(threshold0[, threshold1[, threshold2]]) +.. function:: set_threshold(threshold0, [threshold1, [threshold2]]) Set the garbage collection thresholds (the collection frequency). Setting *threshold0* to zero disables collection. diff --git a/Doc/library/getopt.rst b/Doc/library/getopt.rst index 336deab2..3ab44b9f 100644 --- a/Doc/library/getopt.rst +++ b/Doc/library/getopt.rst @@ -1,5 +1,5 @@ -:mod:`getopt` --- C-style parser for command line options -========================================================= +:mod:`!getopt` --- C-style parser for command line options +========================================================== .. module:: getopt :synopsis: Portable parser for command line options; support both short and @@ -7,18 +7,23 @@ **Source code:** :source:`Lib/getopt.py` +.. deprecated:: 3.13 + The :mod:`getopt` module is :term:`soft deprecated` and will not be + developed further; development will continue with the :mod:`argparse` + module. + .. note:: The :mod:`getopt` module is a parser for command line options whose API is - designed to be familiar to users of the C :c:func:`getopt` function. Users who - are unfamiliar with the C :c:func:`getopt` function or who would like to write + designed to be familiar to users of the C :c:func:`!getopt` function. Users who + are unfamiliar with the C :c:func:`!getopt` function or who would like to write less code and get better help and error messages should consider using the :mod:`argparse` module instead. -------------- This module helps scripts to parse the command line arguments in ``sys.argv``. -It supports the same conventions as the Unix :c:func:`getopt` function (including +It supports the same conventions as the Unix :c:func:`!getopt` function (including the special meanings of arguments of the form '``-``' and '``--``'). Long options similar to those supported by GNU software may be used as well via an optional third argument. @@ -33,11 +38,11 @@ exception: be parsed, without the leading reference to the running program. Typically, this means ``sys.argv[1:]``. *shortopts* is the string of option letters that the script wants to recognize, with options that require an argument followed by a - colon (``':'``; i.e., the same format that Unix :c:func:`getopt` uses). + colon (``':'``; i.e., the same format that Unix :c:func:`!getopt` uses). .. note:: - Unlike GNU :c:func:`getopt`, after a non-option argument, all further + Unlike GNU :c:func:`!getopt`, after a non-option argument, all further arguments are considered also non-options. This is similar to the way non-GNU Unix systems work. @@ -71,7 +76,7 @@ exception: non-option argument is encountered. If the first character of the option string is ``'+'``, or if the environment - variable :envvar:`POSIXLY_CORRECT` is set, then option processing stops as + variable :envvar:`!POSIXLY_CORRECT` is set, then option processing stops as soon as a non-option argument is encountered. @@ -81,9 +86,9 @@ exception: an option requiring an argument is given none. The argument to the exception is a string indicating the cause of the error. For long options, an argument given to an option which does not require one will also cause this exception to be - raised. The attributes :attr:`msg` and :attr:`opt` give the error message and + raised. The attributes :attr:`!msg` and :attr:`!opt` give the error message and related option; if there is no specific option to which the exception relates, - :attr:`opt` is an empty string. + :attr:`!opt` is an empty string. .. XXX deprecated? .. exception:: error @@ -92,6 +97,8 @@ exception: An example using only Unix style options: +.. doctest:: + >>> import getopt >>> args = '-a -b -cfoo -d bar a1 a2'.split() >>> args @@ -104,6 +111,8 @@ An example using only Unix style options: Using long option names is equally easy: +.. doctest:: + >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2' >>> args = s.split() >>> args @@ -115,7 +124,9 @@ Using long option names is equally easy: >>> args ['a1', 'a2'] -In a script, typical usage is something like this:: +In a script, typical usage is something like this: + +.. testcode:: import getopt, sys @@ -145,7 +156,9 @@ In a script, typical usage is something like this:: main() Note that an equivalent command line interface could be produced with less code -and more informative help and error messages by using the :mod:`argparse` module:: +and more informative help and error messages by using the :mod:`argparse` module: + +.. testcode:: import argparse diff --git a/Doc/library/getpass.rst b/Doc/library/getpass.rst index d5bbe67f..3b5296f9 100644 --- a/Doc/library/getpass.rst +++ b/Doc/library/getpass.rst @@ -1,5 +1,5 @@ -:mod:`getpass` --- Portable password input -========================================== +:mod:`!getpass` --- Portable password input +=========================================== .. module:: getpass :synopsis: Portable reading of passwords and retrieval of the userid. @@ -43,10 +43,13 @@ The :mod:`getpass` module provides two functions: Return the "login name" of the user. This function checks the environment variables :envvar:`LOGNAME`, - :envvar:`USER`, :envvar:`LNAME` and :envvar:`USERNAME`, in order, and + :envvar:`USER`, :envvar:`!LNAME` and :envvar:`USERNAME`, in order, and returns the value of the first one which is set to a non-empty string. If none are set, the login name from the password database is returned on - systems which support the :mod:`pwd` module, otherwise, an exception is - raised. + systems which support the :mod:`pwd` module, otherwise, an :exc:`OSError` + is raised. - In general, this function should be preferred over :func:`os.getlogin()`. + In general, this function should be preferred over :func:`os.getlogin`. + + .. versionchanged:: 3.13 + Previously, various exceptions beyond just :exc:`OSError` were raised. diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst index 7ebe91b3..d0de8390 100644 --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -1,5 +1,5 @@ -:mod:`gettext` --- Multilingual internationalization services -============================================================= +:mod:`!gettext` --- Multilingual internationalization services +============================================================== .. module:: gettext :synopsis: Multilingual internationalization services. @@ -167,7 +167,7 @@ install themselves in the built-in namespace as the function :func:`!_`. :class:`NullTranslations` instance if *fallback* is true. .. versionchanged:: 3.3 - :exc:`IOError` used to be raised instead of :exc:`OSError`. + :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. .. versionchanged:: 3.11 *codeset* parameter is removed. @@ -257,7 +257,7 @@ are the methods of :class:`!NullTranslations`: .. method:: info() - Return the "protected" :attr:`_info` variable, a dictionary containing + Return a dictionary containing the metadata found in the message catalog file. @@ -296,9 +296,9 @@ are the methods of :class:`!NullTranslations`: The :class:`GNUTranslations` class ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The :mod:`gettext` module provides one additional class derived from +The :mod:`!gettext` module provides one additional class derived from :class:`NullTranslations`: :class:`GNUTranslations`. This class overrides -:meth:`_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files +:meth:`!_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files in both big-endian and little-endian format. :class:`GNUTranslations` parses optional metadata out of the translation @@ -306,7 +306,7 @@ catalog. It is convention with GNU :program:`gettext` to include metadata as the translation for the empty string. This metadata is in :rfc:`822`\ -style ``key: value`` pairs, and should contain the ``Project-Id-Version`` key. If the key ``Content-Type`` is found, then the ``charset`` property is used to -initialize the "protected" :attr:`_charset` instance variable, defaulting to +initialize the "protected" :attr:`!_charset` instance variable, defaulting to ``None`` if not found. If the charset encoding is specified, then all message ids and message strings read from the catalog are converted to Unicode using this encoding, else ASCII is assumed. @@ -315,7 +315,7 @@ Since message ids are read as Unicode strings too, all ``*gettext()`` methods will assume message ids as Unicode strings, not byte strings. The entire set of key/value pairs are placed into a dictionary and set as the -"protected" :attr:`_info` instance variable. +"protected" :attr:`!_info` instance variable. If the :file:`.mo` file's magic number is invalid, the major version number is unexpected, or if other problems occur while reading the file, instantiating a @@ -636,9 +636,9 @@ implementations, and valuable experience to the creation of this module: .. rubric:: Footnotes -.. [#] The default locale directory is system dependent; for example, on RedHat Linux +.. [#] The default locale directory is system dependent; for example, on Red Hat Linux it is :file:`/usr/share/locale`, but on Solaris it is :file:`/usr/lib/locale`. - The :mod:`gettext` module does not try to support these system dependent + The :mod:`!gettext` module does not try to support these system dependent defaults; instead its default is :file:`{sys.base_prefix}/share/locale` (see :data:`sys.base_prefix`). For this reason, it is always best to call :func:`bindtextdomain` with an explicit absolute path at the start of your diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 0e4cfe7e..684466d3 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -1,5 +1,5 @@ -:mod:`glob` --- Unix style pathname pattern expansion -===================================================== +:mod:`!glob` --- Unix style pathname pattern expansion +====================================================== .. module:: glob :synopsis: Unix shell style pathname pattern expansion. @@ -34,9 +34,7 @@ unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. For a literal match, wrap the meta-characters in brackets. For example, ``'[?]'`` matches the character ``'?'``. - -.. seealso:: - The :mod:`pathlib` module offers high-level path objects. +The :mod:`glob` module defines the following functions: .. function:: glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, \ @@ -77,6 +75,10 @@ For example, ``'[?]'`` matches the character ``'?'``. Using the "``**``" pattern in large directory trees may consume an inordinate amount of time. + .. note:: + This function may return duplicate path names if *pathname* + contains multiple "``**``" patterns and *recursive* is true. + .. versionchanged:: 3.5 Support for recursive globs using "``**``". @@ -96,6 +98,10 @@ For example, ``'[?]'`` matches the character ``'?'``. .. audit-event:: glob.glob pathname,recursive glob.iglob .. audit-event:: glob.glob/2 pathname,recursive,root_dir,dir_fd glob.iglob + .. note:: + This function may return duplicate path names if *pathname* + contains multiple "``**``" patterns and *recursive* is true. + .. versionchanged:: 3.5 Support for recursive globs using "``**``". @@ -117,7 +123,48 @@ For example, ``'[?]'`` matches the character ``'?'``. .. versionadded:: 3.4 -For example, consider a directory containing the following files: +.. function:: translate(pathname, *, recursive=False, include_hidden=False, seps=None) + + Convert the given path specification to a regular expression for use with + :func:`re.match`. The path specification can contain shell-style wildcards. + + For example: + + >>> import glob, re + >>> + >>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True) + >>> regex + '(?s:(?:.+/)?[^/]*\\.txt)\\Z' + >>> reobj = re.compile(regex) + >>> reobj.match('foo/bar/baz.txt') + + + Path separators and segments are meaningful to this function, unlike + :func:`fnmatch.translate`. By default wildcards do not match path + separators, and ``*`` pattern segments match precisely one path segment. + + If *recursive* is true, the pattern segment "``**``" will match any number + of path segments. + + If *include_hidden* is true, wildcards can match path segments that start + with a dot (``.``). + + A sequence of path separators may be supplied to the *seps* argument. If + not given, :data:`os.sep` and :data:`~os.altsep` (if available) are used. + + .. seealso:: + + :meth:`pathlib.PurePath.full_match` and :meth:`pathlib.Path.glob` + methods, which call this function to implement pattern matching and + globbing. + + .. versionadded:: 3.13 + + +Examples +-------- + +Consider a directory containing the following files: :file:`1.gif`, :file:`2.txt`, :file:`card.gif` and a subdirectory :file:`sub` which contains only the file :file:`3.txt`. :func:`glob` will produce the following results. Notice how any leading components of the path are @@ -146,6 +193,7 @@ default. For example, consider a directory containing :file:`card.gif` and ['.card.gif'] .. seealso:: + The :mod:`fnmatch` module offers shell-style filename (not path) expansion. - Module :mod:`fnmatch` - Shell-style filename (not path) expansion +.. seealso:: + The :mod:`pathlib` module offers high-level path objects. diff --git a/Doc/library/graphlib.rst b/Doc/library/graphlib.rst index fdd8f39e..a0b16576 100644 --- a/Doc/library/graphlib.rst +++ b/Doc/library/graphlib.rst @@ -1,5 +1,5 @@ -:mod:`graphlib` --- Functionality to operate with graph-like structures -========================================================================= +:mod:`!graphlib` --- Functionality to operate with graph-like structures +======================================================================== .. module:: graphlib :synopsis: Functionality to operate with graph-like structures @@ -37,14 +37,14 @@ In the general case, the steps required to perform the sorting of a given graph are as follows: - * Create an instance of the :class:`TopologicalSorter` with an optional - initial graph. - * Add additional nodes to the graph. - * Call :meth:`~TopologicalSorter.prepare` on the graph. - * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over - the nodes returned by :meth:`~TopologicalSorter.get_ready` and - process them. Call :meth:`~TopologicalSorter.done` on each node as it - finishes processing. + * Create an instance of the :class:`TopologicalSorter` with an optional + initial graph. + * Add additional nodes to the graph. + * Call :meth:`~TopologicalSorter.prepare` on the graph. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over + the nodes returned by :meth:`~TopologicalSorter.get_ready` and + process them. Call :meth:`~TopologicalSorter.done` on each node as it + finishes processing. In case just an immediate sorting of the nodes in the graph is required and no parallelism is involved, the convenience method diff --git a/Doc/library/grp.rst b/Doc/library/grp.rst index 14af744e..d1c7f22a 100644 --- a/Doc/library/grp.rst +++ b/Doc/library/grp.rst @@ -1,5 +1,5 @@ -:mod:`grp` --- The group database -================================= +:mod:`!grp` --- The group database +================================== .. module:: grp :platform: Unix @@ -10,7 +10,7 @@ This module provides access to the Unix group database. It is available on all Unix versions. -.. include:: ../includes/wasm-notavail.rst +.. availability:: Unix, not WASI, not Android, not iOS. Group database entries are reported as a tuple-like object, whose attributes correspond to the members of the ``group`` structure (Attribute field below, see @@ -63,7 +63,3 @@ It defines the following items: Module :mod:`pwd` An interface to the user database, similar to this. - - Module :mod:`spwd` - An interface to the shadow password database, similar to this. - diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 60236a11..6b6e158f 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -1,5 +1,5 @@ -:mod:`gzip` --- Support for :program:`gzip` files -================================================= +:mod:`!gzip` --- Support for :program:`gzip` files +================================================== .. module:: gzip :synopsis: Interfaces for gzip compression and decompression using file objects. @@ -61,7 +61,7 @@ The module defines the following items: .. exception:: BadGzipFile - An exception raised for invalid gzip files. It inherits :exc:`OSError`. + An exception raised for invalid gzip files. It inherits from :exc:`OSError`. :exc:`EOFError` and :exc:`zlib.error` can also be raised for invalid gzip files. @@ -100,12 +100,14 @@ The module defines the following items: compression, and ``9`` is slowest and produces the most compression. ``0`` is no compression. The default is ``9``. - The *mtime* argument is an optional numeric timestamp to be written to - the last modification time field in the stream when compressing. It - should only be provided in compression mode. If omitted or ``None``, the - current time is used. See the :attr:`mtime` attribute for more details. + The optional *mtime* argument is the timestamp requested by gzip. The time + is in Unix format, i.e., seconds since 00:00:00 UTC, January 1, 1970. + If *mtime* is omitted or ``None``, the current time is used. Use *mtime* = 0 + to generate a compressed stream that does not depend on creation time. - Calling a :class:`GzipFile` object's :meth:`close` method does not close + See below for the :attr:`mtime` attribute that is set when decompressing. + + Calling a :class:`GzipFile` object's :meth:`!close` method does not close *fileobj*, since you might wish to append more material after the compressed data. This also allows you to pass an :class:`io.BytesIO` object opened for writing as *fileobj*, and retrieve the resulting memory buffer using the @@ -131,17 +133,19 @@ The module defines the following items: .. versionadded:: 3.2 - .. attribute:: mtime + .. attribute:: mode + + ``'rb'`` for reading and ``'wb'`` for writing. + + .. versionchanged:: 3.13 + In previous versions it was an integer ``1`` or ``2``. - When decompressing, the value of the last modification time field in - the most recently read header may be read from this attribute, as an - integer. The initial value before reading any headers is ``None``. + .. attribute:: mtime - All :program:`gzip` compressed streams are required to contain this - timestamp field. Some programs, such as :program:`gunzip`\ , make use - of the timestamp. The format is the same as the return value of - :func:`time.time` and the :attr:`~os.stat_result.st_mtime` attribute of - the object returned by :func:`os.stat`. + When decompressing, this attribute is set to the last timestamp in the most + recently read header. It is an integer, holding the number of seconds + since the Unix epoch (00:00:00 UTC, January 1, 1970). + The initial value before reading any headers is ``None``. .. attribute:: name @@ -171,22 +175,20 @@ The module defines the following items: .. versionchanged:: 3.6 Accepts a :term:`path-like object`. - .. versionchanged:: 3.12 - Remove the ``filename`` attribute, use the :attr:`~GzipFile.name` - attribute instead. - .. deprecated:: 3.9 Opening :class:`GzipFile` for writing without specifying the *mode* argument is deprecated. + .. versionchanged:: 3.12 + Remove the ``filename`` attribute, use the :attr:`~GzipFile.name` + attribute instead. + .. function:: compress(data, compresslevel=9, *, mtime=None) Compress the *data*, returning a :class:`bytes` object containing the compressed data. *compresslevel* and *mtime* have the same meaning as in - the :class:`GzipFile` constructor above. When *mtime* is set to ``0``, this - function is equivalent to :func:`zlib.compress` with *wbits* set to ``31``. - The zlib function is faster. + the :class:`GzipFile` constructor above. .. versionadded:: 3.2 .. versionchanged:: 3.8 @@ -194,7 +196,13 @@ The module defines the following items: .. versionchanged:: 3.11 Speed is improved by compressing all data at once instead of in a streamed fashion. Calls with *mtime* set to ``0`` are delegated to - :func:`zlib.compress` for better speed. + :func:`zlib.compress` for better speed. In this situation the + output may contain a gzip header "OS" byte value other than 255 + "unknown" as supplied by the underlying zlib implementation. + + .. versionchanged:: 3.13 + The gzip header OS byte is guaranteed to be set to 255 when this function + is used as was the case in 3.10 and earlier. .. function:: decompress(data) @@ -250,6 +258,8 @@ Example of how to GZIP compress a binary string:: .. program:: gzip +.. _gzip-cli: + Command Line Interface ---------------------- @@ -266,23 +276,22 @@ Once executed the :mod:`gzip` module keeps the input file(s). Command line options ^^^^^^^^^^^^^^^^^^^^ -.. cmdoption:: file +.. option:: file If *file* is not specified, read from :data:`sys.stdin`. -.. cmdoption:: --fast +.. option:: --fast Indicates the fastest compression method (less compression). -.. cmdoption:: --best +.. option:: --best Indicates the slowest compression method (best compression). -.. cmdoption:: -d, --decompress +.. option:: -d, --decompress Decompress the given file. -.. cmdoption:: -h, --help +.. option:: -h, --help Show the help message. - diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index eb650c18..dffb167c 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -1,5 +1,5 @@ -:mod:`hashlib` --- Secure hashes and message digests -==================================================== +:mod:`!hashlib` --- Secure hashes and message digests +===================================================== .. module:: hashlib :synopsis: Secure hash and message digest algorithms. @@ -77,8 +77,6 @@ accessible by name via :func:`new`. See :data:`algorithms_available`. SHA3 (Keccak) and SHAKE constructors :func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256` were added. - -.. versionadded:: 3.6 :func:`blake2b` and :func:`blake2s` were added. .. _hashlib-usedforsecurity: @@ -121,7 +119,7 @@ More condensed: Constructors ------------ -.. function:: new(name[, data], \*, usedforsecurity=True) +.. function:: new(name[, data], *, usedforsecurity=True) Is a generic constructor that takes the string *name* of the desired algorithm as its first parameter. It also exists to allow access to the @@ -330,7 +328,7 @@ include a `salt `_. your application, read *Appendix A.2.2* of NIST-SP-800-132_. The answers on the `stackexchange pbkdf2 iterations question`_ explain in detail. - *dklen* is the length of the derived key. If *dklen* is ``None`` then the + *dklen* is the length of the derived key in bytes. If *dklen* is ``None`` then the digest size of the hash algorithm *hash_name* is used, e.g. 64 for SHA-512. >>> from hashlib import pbkdf2_hmac @@ -359,11 +357,13 @@ include a `salt `_. *n* is the CPU/Memory cost factor, *r* the block size, *p* parallelization factor and *maxmem* limits memory (OpenSSL 1.1.0 defaults to 32 MiB). - *dklen* is the length of the derived key. + *dklen* is the length of the derived key in bytes. .. versionadded:: 3.6 +.. _hashlib-blake2: + BLAKE2 ------ @@ -655,7 +655,7 @@ on the hash function used in digital signatures. by the signer. (`NIST SP-800-106 "Randomized Hashing for Digital Signatures" - `_) + `_) In BLAKE2 the salt is processed as a one-time input to the hash function during initialization, rather than as an input to each compression function. @@ -809,8 +809,8 @@ Domain Dedication 1.0 Universal: .. _NIST-SP-800-132: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf .. _stackexchange pbkdf2 iterations question: https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pbkdf2-sha256/ .. _Attacks on cryptographic hash algorithms: https://en.wikipedia.org/wiki/Cryptographic_hash_function#Attacks_on_cryptographic_hash_algorithms -.. _the FIPS 180-4 standard: https://csrc.nist.gov/publications/detail/fips/180/4/final -.. _the FIPS 202 standard: https://csrc.nist.gov/publications/detail/fips/202/final +.. _the FIPS 180-4 standard: https://csrc.nist.gov/pubs/fips/180-4/upd1/final +.. _the FIPS 202 standard: https://csrc.nist.gov/pubs/fips/202/final .. _HACL\* project: https://github.com/hacl-star/hacl-star @@ -827,7 +827,7 @@ Domain Dedication 1.0 Universal: https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf The FIPS 180-4 publication on Secure Hash Algorithms. - https://csrc.nist.gov/publications/detail/fips/202/final + https://csrc.nist.gov/pubs/fips/202/final The FIPS 202 publication on the SHA-3 Standard. https://www.blake2.net/ diff --git a/Doc/library/heapq.rst b/Doc/library/heapq.rst index 8b00f7b2..d3c4b920 100644 --- a/Doc/library/heapq.rst +++ b/Doc/library/heapq.rst @@ -1,5 +1,5 @@ -:mod:`heapq` --- Heap queue algorithm -===================================== +:mod:`!heapq` --- Heap queue algorithm +====================================== .. module:: heapq :synopsis: Heap queue algorithm (a.k.a. priority queue). @@ -17,7 +17,9 @@ This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a value less than or -equal to any of its children. This implementation uses arrays for which +equal to any of its children. We refer to this condition as the heap invariant. + +This implementation uses arrays for which ``heap[k] <= heap[2*k+1]`` and ``heap[k] <= heap[2*k+2]`` for all *k*, counting elements from zero. For the sake of comparison, non-existing elements are considered to be infinite. The interesting property of a heap is that its @@ -270,7 +272,7 @@ winner. The simplest algorithmic way to remove it and find the "next" winner is to move some loser (let's say cell 30 in the diagram above) into the 0 position, and then percolate this new 0 down the tree, exchanging values, until the invariant is re-established. This is clearly logarithmic on the total number of -items in the tree. By iterating over all items, you get an O(n log n) sort. +items in the tree. By iterating over all items, you get an *O*\ (*n* log *n*) sort. A nice feature of this sort is that you can efficiently insert new items while the sort is going on, provided that the inserted items are not "better" than the @@ -319,4 +321,3 @@ applications, and I think it is good to keep a 'heap' module around. :-) backwards, and this was also used to avoid the rewinding time. Believe me, real good tape sorts were quite spectacular to watch! From all times, sorting has always been a Great Art! :-) - diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index b2ca0455..d6692033 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -1,5 +1,5 @@ -:mod:`hmac` --- Keyed-Hashing for Message Authentication -======================================================== +:mod:`!hmac` --- Keyed-Hashing for Message Authentication +========================================================= .. module:: hmac :synopsis: Keyed-Hashing for Message Authentication (HMAC) implementation @@ -14,7 +14,7 @@ This module implements the HMAC algorithm as described by :rfc:`2104`. -.. function:: new(key, msg=None, digestmod='') +.. function:: new(key, msg=None, digestmod) Return a new hmac object. *key* is a bytes or bytearray object giving the secret key. If *msg* is present, the method call ``update(msg)`` is made. @@ -27,10 +27,9 @@ This module implements the HMAC algorithm as described by :rfc:`2104`. Parameter *msg* can be of any type supported by :mod:`hashlib`. Parameter *digestmod* can be the name of a hash algorithm. - .. deprecated-removed:: 3.4 3.8 - MD5 as implicit default digest for *digestmod* is deprecated. - The digestmod parameter is now required. Pass it as a keyword - argument to avoid awkwardness when you do not have an initial msg. + .. versionchanged:: 3.8 + The *digestmod* argument is now required. Pass it as a keyword + argument to avoid awkwardness when you do not have an initial *msg*. .. function:: digest(key, msg, digest) @@ -114,11 +113,9 @@ A hash object has the following attributes: .. versionadded:: 3.4 -.. deprecated:: 3.9 - - The undocumented attributes ``HMAC.digest_cons``, ``HMAC.inner``, and - ``HMAC.outer`` are internal implementation details and will be removed in - Python 3.10. +.. versionchanged:: 3.10 + Removed the undocumented attributes ``HMAC.digest_cons``, ``HMAC.inner``, + and ``HMAC.outer``. This module also provides the following helper function: diff --git a/Doc/library/html.entities.rst b/Doc/library/html.entities.rst index 10529561..add18e4c 100644 --- a/Doc/library/html.entities.rst +++ b/Doc/library/html.entities.rst @@ -1,5 +1,5 @@ -:mod:`html.entities` --- Definitions of HTML general entities -============================================================= +:mod:`!html.entities` --- Definitions of HTML general entities +============================================================== .. module:: html.entities :synopsis: Definitions of HTML general entities. diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst index d3509011..6d433b5a 100644 --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -1,5 +1,5 @@ -:mod:`html.parser` --- Simple HTML and XHTML parser -=================================================== +:mod:`!html.parser` --- Simple HTML and XHTML parser +==================================================== .. module:: html.parser :synopsis: A simple parser that can handle HTML and XHTML. diff --git a/Doc/library/html.rst b/Doc/library/html.rst index c2b01e14..9aa39ba9 100644 --- a/Doc/library/html.rst +++ b/Doc/library/html.rst @@ -1,5 +1,5 @@ -:mod:`html` --- HyperText Markup Language support -================================================= +:mod:`!html` --- HyperText Markup Language support +================================================== .. module:: html :synopsis: Helpers for manipulating HTML. diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index c46314fc..2835c8d0 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -1,5 +1,5 @@ -:mod:`http.client` --- HTTP protocol client -=========================================== +:mod:`!http.client` --- HTTP protocol client +============================================ .. module:: http.client :synopsis: HTTP and HTTPS protocol client (requires sockets). @@ -92,7 +92,7 @@ The module provides the following classes: .. versionchanged:: 3.4.3 This class now performs all the necessary certificate and hostname checks by default. To revert to the previous, unverified, behavior - :func:`ssl._create_unverified_context` can be passed to the *context* + :func:`!ssl._create_unverified_context` can be passed to the *context* parameter. .. versionchanged:: 3.8 @@ -103,7 +103,7 @@ The module provides the following classes: .. versionchanged:: 3.10 This class now sends an ALPN extension with protocol indicator ``http/1.1`` when no *context* is given. Custom *context* should set - ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocols`. .. versionchanged:: 3.12 The deprecated *key_file*, *cert_file* and *check_hostname* parameters @@ -124,7 +124,7 @@ This module provides the following function: .. function:: parse_headers(fp) Parse the headers from a file pointer *fp* representing a HTTP - request/response. The file has to be a :class:`BufferedIOBase` reader + request/response. The file has to be a :class:`~io.BufferedIOBase` reader (i.e. not text) and must provide a valid :rfc:`2822` style header. This function returns an instance of :class:`http.client.HTTPMessage` @@ -311,7 +311,7 @@ HTTPConnection Objects :class:`str` or bytes-like object that is not also a file as the body representation. - .. versionadded:: 3.2 + .. versionchanged:: 3.2 *body* can now be an iterable. .. versionchanged:: 3.6 @@ -416,7 +416,7 @@ HTTPConnection Objects .. versionadded:: 3.7 -As an alternative to using the :meth:`request` method described above, you can +As an alternative to using the :meth:`~HTTPConnection.request` method described above, you can also send your request step by step, by using the four functions below. @@ -461,9 +461,8 @@ also send your request step by step, by using the four functions below. This is to avoid premature termination of the read of the request by the target server due to malformed encoding. - .. versionadded:: 3.6 - Chunked encoding support. The *encode_chunked* parameter was - added. + .. versionchanged:: 3.6 + Added chunked encoding support and the *encode_chunked* parameter. .. method:: HTTPConnection.send(data) @@ -648,6 +647,8 @@ method attribute. Here is an example session that uses the ``PUT`` method:: HTTPMessage Objects ------------------- +.. class:: HTTPMessage(email.message.Message) + An :class:`http.client.HTTPMessage` instance holds the headers from an HTTP response. It is implemented using the :class:`email.message.Message` class. diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index 87ef156a..23ddecf8 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -1,5 +1,5 @@ -:mod:`http.cookiejar` --- Cookie handling for HTTP clients -========================================================== +:mod:`!http.cookiejar` --- Cookie handling for HTTP clients +=========================================================== .. module:: http.cookiejar :synopsis: Classes for automatic handling of HTTP cookies. @@ -44,8 +44,8 @@ The module defines the following exception: cookies from a file. :exc:`LoadError` is a subclass of :exc:`OSError`. .. versionchanged:: 3.3 - LoadError was made a subclass of :exc:`OSError` instead of - :exc:`IOError`. + :exc:`LoadError` used to be a subtype of :exc:`IOError`, which is now an + alias of :exc:`OSError`. The following classes are provided: @@ -137,7 +137,7 @@ The following classes are provided: The Netscape protocol with the bugs fixed. Uses :mailheader:`Set-Cookie2` in place of :mailheader:`Set-Cookie`. Not widely used. - http://kristol.org/cookie/errata.html + https://kristol.org/cookie/errata.html Unfinished errata to :rfc:`2965`. :rfc:`2964` - Use of HTTP State Management @@ -649,6 +649,11 @@ internal consistency, so you should know what you're doing if you do that. :const:`None`. +.. attribute:: Cookie.domain + + Cookie domain (a string). + + .. attribute:: Cookie.path Cookie path (a string, eg. ``'/acme/rocket_launchers'``). diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst index a2c1eb00..4ce2e3c4 100644 --- a/Doc/library/http.cookies.rst +++ b/Doc/library/http.cookies.rst @@ -1,5 +1,5 @@ -:mod:`http.cookies` --- HTTP state management -============================================= +:mod:`!http.cookies` --- HTTP state management +============================================== .. module:: http.cookies :synopsis: Support for HTTP state management (cookies). @@ -18,16 +18,17 @@ cookie value. The module formerly strictly applied the parsing rules described in the :rfc:`2109` and :rfc:`2068` specifications. It has since been discovered that -MSIE 3.0x doesn't follow the character rules outlined in those specs and also -many current day browsers and servers have relaxed parsing rules when comes to -Cookie handling. As a result, the parsing rules used are a bit less strict. +MSIE 3.0x didn't follow the character rules outlined in those specs; many +current-day browsers and servers have also relaxed parsing rules when it comes +to cookie handling. As a result, this module now uses parsing rules that are a +bit less strict than they once were. The character set, :data:`string.ascii_letters`, :data:`string.digits` and ``!#$%&'*+-.^_`|~:`` denote the set of valid characters allowed by this module -in Cookie name (as :attr:`~Morsel.key`). +in a cookie name (as :attr:`~Morsel.key`). .. versionchanged:: 3.3 - Allowed ':' as a valid Cookie name character. + Allowed ':' as a valid cookie name character. .. note:: @@ -54,9 +55,10 @@ in Cookie name (as :attr:`~Morsel.key`). .. class:: SimpleCookie([input]) - This class derives from :class:`BaseCookie` and overrides :meth:`value_decode` - and :meth:`value_encode`. SimpleCookie supports strings as cookie values. - When setting the value, SimpleCookie calls the builtin :func:`str()` to convert + This class derives from :class:`BaseCookie` and overrides :meth:`~BaseCookie.value_decode` + and :meth:`~BaseCookie.value_encode`. :class:`!SimpleCookie` supports + strings as cookie values. When setting the value, :class:`!SimpleCookie` + calls the builtin :func:`str` to convert the value to a string. Values received from HTTP are kept as strings. .. seealso:: @@ -129,17 +131,17 @@ Morsel Objects Abstract a key/value pair, which has some :rfc:`2109` attributes. Morsels are dictionary-like objects, whose set of keys is constant --- the valid - :rfc:`2109` attributes, which are - - * ``expires`` - * ``path`` - * ``comment`` - * ``domain`` - * ``max-age`` - * ``secure`` - * ``version`` - * ``httponly`` - * ``samesite`` + :rfc:`2109` attributes, which are: + + .. attribute:: expires + path + comment + domain + max-age + secure + version + httponly + samesite The attribute :attr:`httponly` specifies that the cookie is only transferred in HTTP requests, and is not accessible through JavaScript. This is intended @@ -152,7 +154,7 @@ Morsel Objects The keys are case-insensitive and their default value is ``''``. .. versionchanged:: 3.5 - :meth:`~Morsel.__eq__` now takes :attr:`~Morsel.key` and :attr:`~Morsel.value` + :meth:`!__eq__` now takes :attr:`~Morsel.key` and :attr:`~Morsel.value` into account. .. versionchanged:: 3.7 diff --git a/Doc/library/http.rst b/Doc/library/http.rst index 5e191271..ce3fb9f8 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -1,5 +1,5 @@ -:mod:`http` --- HTTP modules -============================ +:mod:`!http` --- HTTP modules +============================= .. module:: http :synopsis: HTTP status codes and messages @@ -59,63 +59,63 @@ available in :class:`http.HTTPStatus` are: ======= =================================== ================================================================== Code Enum Name Details ======= =================================== ================================================================== -``100`` ``CONTINUE`` HTTP/1.1 :rfc:`7231`, Section 6.2.1 -``101`` ``SWITCHING_PROTOCOLS`` HTTP/1.1 :rfc:`7231`, Section 6.2.2 +``100`` ``CONTINUE`` HTTP Semantics :rfc:`9110`, Section 15.2.1 +``101`` ``SWITCHING_PROTOCOLS`` HTTP Semantics :rfc:`9110`, Section 15.2.2 ``102`` ``PROCESSING`` WebDAV :rfc:`2518`, Section 10.1 ``103`` ``EARLY_HINTS`` An HTTP Status Code for Indicating Hints :rfc:`8297` -``200`` ``OK`` HTTP/1.1 :rfc:`7231`, Section 6.3.1 -``201`` ``CREATED`` HTTP/1.1 :rfc:`7231`, Section 6.3.2 -``202`` ``ACCEPTED`` HTTP/1.1 :rfc:`7231`, Section 6.3.3 -``203`` ``NON_AUTHORITATIVE_INFORMATION`` HTTP/1.1 :rfc:`7231`, Section 6.3.4 -``204`` ``NO_CONTENT`` HTTP/1.1 :rfc:`7231`, Section 6.3.5 -``205`` ``RESET_CONTENT`` HTTP/1.1 :rfc:`7231`, Section 6.3.6 -``206`` ``PARTIAL_CONTENT`` HTTP/1.1 :rfc:`7233`, Section 4.1 +``200`` ``OK`` HTTP Semantics :rfc:`9110`, Section 15.3.1 +``201`` ``CREATED`` HTTP Semantics :rfc:`9110`, Section 15.3.2 +``202`` ``ACCEPTED`` HTTP Semantics :rfc:`9110`, Section 15.3.3 +``203`` ``NON_AUTHORITATIVE_INFORMATION`` HTTP Semantics :rfc:`9110`, Section 15.3.4 +``204`` ``NO_CONTENT`` HTTP Semantics :rfc:`9110`, Section 15.3.5 +``205`` ``RESET_CONTENT`` HTTP Semantics :rfc:`9110`, Section 15.3.6 +``206`` ``PARTIAL_CONTENT`` HTTP Semantics :rfc:`9110`, Section 15.3.7 ``207`` ``MULTI_STATUS`` WebDAV :rfc:`4918`, Section 11.1 ``208`` ``ALREADY_REPORTED`` WebDAV Binding Extensions :rfc:`5842`, Section 7.1 (Experimental) ``226`` ``IM_USED`` Delta Encoding in HTTP :rfc:`3229`, Section 10.4.1 -``300`` ``MULTIPLE_CHOICES`` HTTP/1.1 :rfc:`7231`, Section 6.4.1 -``301`` ``MOVED_PERMANENTLY`` HTTP/1.1 :rfc:`7231`, Section 6.4.2 -``302`` ``FOUND`` HTTP/1.1 :rfc:`7231`, Section 6.4.3 -``303`` ``SEE_OTHER`` HTTP/1.1 :rfc:`7231`, Section 6.4.4 -``304`` ``NOT_MODIFIED`` HTTP/1.1 :rfc:`7232`, Section 4.1 -``305`` ``USE_PROXY`` HTTP/1.1 :rfc:`7231`, Section 6.4.5 -``307`` ``TEMPORARY_REDIRECT`` HTTP/1.1 :rfc:`7231`, Section 6.4.7 -``308`` ``PERMANENT_REDIRECT`` Permanent Redirect :rfc:`7238`, Section 3 (Experimental) -``400`` ``BAD_REQUEST`` HTTP/1.1 :rfc:`7231`, Section 6.5.1 -``401`` ``UNAUTHORIZED`` HTTP/1.1 Authentication :rfc:`7235`, Section 3.1 -``402`` ``PAYMENT_REQUIRED`` HTTP/1.1 :rfc:`7231`, Section 6.5.2 -``403`` ``FORBIDDEN`` HTTP/1.1 :rfc:`7231`, Section 6.5.3 -``404`` ``NOT_FOUND`` HTTP/1.1 :rfc:`7231`, Section 6.5.4 -``405`` ``METHOD_NOT_ALLOWED`` HTTP/1.1 :rfc:`7231`, Section 6.5.5 -``406`` ``NOT_ACCEPTABLE`` HTTP/1.1 :rfc:`7231`, Section 6.5.6 -``407`` ``PROXY_AUTHENTICATION_REQUIRED`` HTTP/1.1 Authentication :rfc:`7235`, Section 3.2 -``408`` ``REQUEST_TIMEOUT`` HTTP/1.1 :rfc:`7231`, Section 6.5.7 -``409`` ``CONFLICT`` HTTP/1.1 :rfc:`7231`, Section 6.5.8 -``410`` ``GONE`` HTTP/1.1 :rfc:`7231`, Section 6.5.9 -``411`` ``LENGTH_REQUIRED`` HTTP/1.1 :rfc:`7231`, Section 6.5.10 -``412`` ``PRECONDITION_FAILED`` HTTP/1.1 :rfc:`7232`, Section 4.2 -``413`` ``REQUEST_ENTITY_TOO_LARGE`` HTTP/1.1 :rfc:`7231`, Section 6.5.11 -``414`` ``REQUEST_URI_TOO_LONG`` HTTP/1.1 :rfc:`7231`, Section 6.5.12 -``415`` ``UNSUPPORTED_MEDIA_TYPE`` HTTP/1.1 :rfc:`7231`, Section 6.5.13 -``416`` ``REQUESTED_RANGE_NOT_SATISFIABLE`` HTTP/1.1 Range Requests :rfc:`7233`, Section 4.4 -``417`` ``EXPECTATION_FAILED`` HTTP/1.1 :rfc:`7231`, Section 6.5.14 +``300`` ``MULTIPLE_CHOICES`` HTTP Semantics :rfc:`9110`, Section 15.4.1 +``301`` ``MOVED_PERMANENTLY`` HTTP Semantics :rfc:`9110`, Section 15.4.2 +``302`` ``FOUND`` HTTP Semantics :rfc:`9110`, Section 15.4.3 +``303`` ``SEE_OTHER`` HTTP Semantics :rfc:`9110`, Section 15.4.4 +``304`` ``NOT_MODIFIED`` HTTP Semantics :rfc:`9110`, Section 15.4.5 +``305`` ``USE_PROXY`` HTTP Semantics :rfc:`9110`, Section 15.4.6 +``307`` ``TEMPORARY_REDIRECT`` HTTP Semantics :rfc:`9110`, Section 15.4.8 +``308`` ``PERMANENT_REDIRECT`` HTTP Semantics :rfc:`9110`, Section 15.4.9 +``400`` ``BAD_REQUEST`` HTTP Semantics :rfc:`9110`, Section 15.5.1 +``401`` ``UNAUTHORIZED`` HTTP Semantics :rfc:`9110`, Section 15.5.2 +``402`` ``PAYMENT_REQUIRED`` HTTP Semantics :rfc:`9110`, Section 15.5.3 +``403`` ``FORBIDDEN`` HTTP Semantics :rfc:`9110`, Section 15.5.4 +``404`` ``NOT_FOUND`` HTTP Semantics :rfc:`9110`, Section 15.5.5 +``405`` ``METHOD_NOT_ALLOWED`` HTTP Semantics :rfc:`9110`, Section 15.5.6 +``406`` ``NOT_ACCEPTABLE`` HTTP Semantics :rfc:`9110`, Section 15.5.7 +``407`` ``PROXY_AUTHENTICATION_REQUIRED`` HTTP Semantics :rfc:`9110`, Section 15.5.8 +``408`` ``REQUEST_TIMEOUT`` HTTP Semantics :rfc:`9110`, Section 15.5.9 +``409`` ``CONFLICT`` HTTP Semantics :rfc:`9110`, Section 15.5.10 +``410`` ``GONE`` HTTP Semantics :rfc:`9110`, Section 15.5.11 +``411`` ``LENGTH_REQUIRED`` HTTP Semantics :rfc:`9110`, Section 15.5.12 +``412`` ``PRECONDITION_FAILED`` HTTP Semantics :rfc:`9110`, Section 15.5.13 +``413`` ``CONTENT_TOO_LARGE`` HTTP Semantics :rfc:`9110`, Section 15.5.14 +``414`` ``URI_TOO_LONG`` HTTP Semantics :rfc:`9110`, Section 15.5.15 +``415`` ``UNSUPPORTED_MEDIA_TYPE`` HTTP Semantics :rfc:`9110`, Section 15.5.16 +``416`` ``RANGE_NOT_SATISFIABLE`` HTTP Semantics :rfc:`9110`, Section 15.5.17 +``417`` ``EXPECTATION_FAILED`` HTTP Semantics :rfc:`9110`, Section 15.5.18 ``418`` ``IM_A_TEAPOT`` HTCPCP/1.0 :rfc:`2324`, Section 2.3.2 -``421`` ``MISDIRECTED_REQUEST`` HTTP/2 :rfc:`7540`, Section 9.1.2 -``422`` ``UNPROCESSABLE_ENTITY`` WebDAV :rfc:`4918`, Section 11.2 +``421`` ``MISDIRECTED_REQUEST`` HTTP Semantics :rfc:`9110`, Section 15.5.20 +``422`` ``UNPROCESSABLE_CONTENT`` HTTP Semantics :rfc:`9110`, Section 15.5.21 ``423`` ``LOCKED`` WebDAV :rfc:`4918`, Section 11.3 ``424`` ``FAILED_DEPENDENCY`` WebDAV :rfc:`4918`, Section 11.4 ``425`` ``TOO_EARLY`` Using Early Data in HTTP :rfc:`8470` -``426`` ``UPGRADE_REQUIRED`` HTTP/1.1 :rfc:`7231`, Section 6.5.15 +``426`` ``UPGRADE_REQUIRED`` HTTP Semantics :rfc:`9110`, Section 15.5.22 ``428`` ``PRECONDITION_REQUIRED`` Additional HTTP Status Codes :rfc:`6585` ``429`` ``TOO_MANY_REQUESTS`` Additional HTTP Status Codes :rfc:`6585` ``431`` ``REQUEST_HEADER_FIELDS_TOO_LARGE`` Additional HTTP Status Codes :rfc:`6585` ``451`` ``UNAVAILABLE_FOR_LEGAL_REASONS`` An HTTP Status Code to Report Legal Obstacles :rfc:`7725` -``500`` ``INTERNAL_SERVER_ERROR`` HTTP/1.1 :rfc:`7231`, Section 6.6.1 -``501`` ``NOT_IMPLEMENTED`` HTTP/1.1 :rfc:`7231`, Section 6.6.2 -``502`` ``BAD_GATEWAY`` HTTP/1.1 :rfc:`7231`, Section 6.6.3 -``503`` ``SERVICE_UNAVAILABLE`` HTTP/1.1 :rfc:`7231`, Section 6.6.4 -``504`` ``GATEWAY_TIMEOUT`` HTTP/1.1 :rfc:`7231`, Section 6.6.5 -``505`` ``HTTP_VERSION_NOT_SUPPORTED`` HTTP/1.1 :rfc:`7231`, Section 6.6.6 +``500`` ``INTERNAL_SERVER_ERROR`` HTTP Semantics :rfc:`9110`, Section 15.6.1 +``501`` ``NOT_IMPLEMENTED`` HTTP Semantics :rfc:`9110`, Section 15.6.2 +``502`` ``BAD_GATEWAY`` HTTP Semantics :rfc:`9110`, Section 15.6.3 +``503`` ``SERVICE_UNAVAILABLE`` HTTP Semantics :rfc:`9110`, Section 15.6.4 +``504`` ``GATEWAY_TIMEOUT`` HTTP Semantics :rfc:`9110`, Section 15.6.5 +``505`` ``HTTP_VERSION_NOT_SUPPORTED`` HTTP Semantics :rfc:`9110`, Section 15.6.6 ``506`` ``VARIANT_ALSO_NEGOTIATES`` Transparent Content Negotiation in HTTP :rfc:`2295`, Section 8.1 (Experimental) ``507`` ``INSUFFICIENT_STORAGE`` WebDAV :rfc:`4918`, Section 11.5 ``508`` ``LOOP_DETECTED`` WebDAV Binding Extensions :rfc:`5842`, Section 7.2 (Experimental) @@ -137,6 +137,10 @@ equal to the constant name (i.e. ``http.HTTPStatus.OK`` is also available as .. versionadded:: 3.9 Added ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` status codes. +.. versionchanged:: 3.13 + Implemented RFC9110 naming for status constants. Old constant names are preserved for + backwards compatibility. + HTTP status category -------------------- @@ -144,15 +148,15 @@ HTTP status category The enum values have several properties to indicate the HTTP status category: -==================== ======================== =============================== +==================== ======================== ====================================== Property Indicates that Details -==================== ======================== =============================== -``is_informational`` ``100 <= status <= 199`` HTTP/1.1 :rfc:`7231`, Section 6 -``is_success`` ``200 <= status <= 299`` HTTP/1.1 :rfc:`7231`, Section 6 -``is_redirection`` ``300 <= status <= 399`` HTTP/1.1 :rfc:`7231`, Section 6 -``is_client_error`` ``400 <= status <= 499`` HTTP/1.1 :rfc:`7231`, Section 6 -``is_server_error`` ``500 <= status <= 599`` HTTP/1.1 :rfc:`7231`, Section 6 -==================== ======================== =============================== +==================== ======================== ====================================== +``is_informational`` ``100 <= status <= 199`` HTTP Semantics :rfc:`9110`, Section 15 +``is_success`` ``200 <= status <= 299`` HTTP Semantics :rfc:`9110`, Section 15 +``is_redirection`` ``300 <= status <= 399`` HTTP Semantics :rfc:`9110`, Section 15 +``is_client_error`` ``400 <= status <= 499`` HTTP Semantics :rfc:`9110`, Section 15 +``is_server_error`` ``500 <= status <= 599`` HTTP Semantics :rfc:`9110`, Section 15 +==================== ======================== ====================================== Usage:: @@ -203,13 +207,13 @@ available in :class:`http.HTTPMethod` are: =========== =================================== ================================================================== Method Enum Name Details =========== =================================== ================================================================== -``GET`` ``GET`` HTTP/1.1 :rfc:`7231`, Section 4.3.1 -``HEAD`` ``HEAD`` HTTP/1.1 :rfc:`7231`, Section 4.3.2 -``POST`` ``POST`` HTTP/1.1 :rfc:`7231`, Section 4.3.3 -``PUT`` ``PUT`` HTTP/1.1 :rfc:`7231`, Section 4.3.4 -``DELETE`` ``DELETE`` HTTP/1.1 :rfc:`7231`, Section 4.3.5 -``CONNECT`` ``CONNECT`` HTTP/1.1 :rfc:`7231`, Section 4.3.6 -``OPTIONS`` ``OPTIONS`` HTTP/1.1 :rfc:`7231`, Section 4.3.7 -``TRACE`` ``TRACE`` HTTP/1.1 :rfc:`7231`, Section 4.3.8 +``GET`` ``GET`` HTTP Semantics :rfc:`9110`, Section 9.3.1 +``HEAD`` ``HEAD`` HTTP Semantics :rfc:`9110`, Section 9.3.2 +``POST`` ``POST`` HTTP Semantics :rfc:`9110`, Section 9.3.3 +``PUT`` ``PUT`` HTTP Semantics :rfc:`9110`, Section 9.3.4 +``DELETE`` ``DELETE`` HTTP Semantics :rfc:`9110`, Section 9.3.5 +``CONNECT`` ``CONNECT`` HTTP Semantics :rfc:`9110`, Section 9.3.6 +``OPTIONS`` ``OPTIONS`` HTTP Semantics :rfc:`9110`, Section 9.3.7 +``TRACE`` ``TRACE`` HTTP Semantics :rfc:`9110`, Section 9.3.8 ``PATCH`` ``PATCH`` HTTP/1.1 :rfc:`5789` =========== =================================== ================================================================== diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index f9b9425b..1197b575 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -1,5 +1,5 @@ -:mod:`http.server` --- HTTP servers -=================================== +:mod:`!http.server` --- HTTP servers +==================================== .. module:: http.server :synopsis: HTTP server and request handlers. @@ -65,10 +65,10 @@ provides three different variants: The handler will parse the request and the headers, then call a method specific to the request type. The method name is constructed from the - request. For example, for the request method ``SPAM``, the :meth:`do_SPAM` + request. For example, for the request method ``SPAM``, the :meth:`!do_SPAM` method will be called with no arguments. All of the relevant information is stored in instance variables of the handler. Subclasses should not need to - override or extend the :meth:`__init__` method. + override or extend the :meth:`!__init__` method. :class:`BaseHTTPRequestHandler` has the following instance variables: @@ -187,13 +187,13 @@ provides three different variants: Calls :meth:`handle_one_request` once (or, if persistent connections are enabled, multiple times) to handle incoming HTTP requests. You should - never need to override it; instead, implement appropriate :meth:`do_\*` + never need to override it; instead, implement appropriate :meth:`!do_\*` methods. .. method:: handle_one_request() This method will parse and dispatch the request to the appropriate - :meth:`do_\*` method. You should never need to override it. + :meth:`!do_\*` method. You should never need to override it. .. method:: handle_expect_100() @@ -263,7 +263,7 @@ provides three different variants: Adds a blank line (indicating the end of the HTTP headers in the response) - to the headers buffer and calls :meth:`flush_headers()`. + to the headers buffer and calls :meth:`flush_headers`. .. versionchanged:: 3.2 The buffered headers are written to the output stream. @@ -328,8 +328,8 @@ provides three different variants: or the current directory if *directory* is not provided, directly mapping the directory structure to HTTP requests. - .. versionadded:: 3.7 - The *directory* parameter. + .. versionchanged:: 3.7 + Added the *directory* parameter. .. versionchanged:: 3.9 The *directory* parameter accepts a :term:`path-like object`. @@ -378,7 +378,7 @@ provides three different variants: If the request was mapped to a file, it is opened. Any :exc:`OSError` exception in opening the requested file is mapped to a ``404``, - ``'File not found'`` error. If there was a ``'If-Modified-Since'`` + ``'File not found'`` error. If there was an ``'If-Modified-Since'`` header in the request, and the file was not modified after this time, a ``304``, ``'Not Modified'`` response is sent. Otherwise, the content type is guessed by calling the :meth:`guess_type` method, which in turn @@ -438,11 +438,11 @@ to bind to localhost only:: python -m http.server --bind 127.0.0.1 -.. versionadded:: 3.4 - ``--bind`` argument was introduced. +.. versionchanged:: 3.4 + Added the ``--bind`` option. -.. versionadded:: 3.8 - ``--bind`` argument enhanced to support IPv6 +.. versionchanged:: 3.8 + Support IPv6 in the ``--bind`` option. By default, the server uses the current directory. The option ``-d/--directory`` specifies a directory to which it should serve the files. For example, @@ -450,8 +450,8 @@ the following command uses a specific directory:: python -m http.server --directory /tmp/ -.. versionadded:: 3.7 - ``--directory`` argument was introduced. +.. versionchanged:: 3.7 + Added the ``--directory`` option. By default, the server is conformant to HTTP/1.0. The option ``-p/--protocol`` specifies the HTTP version to which the server is conformant. For example, the @@ -459,8 +459,8 @@ following command runs an HTTP/1.1 conformant server:: python -m http.server --protocol HTTP/1.1 -.. versionadded:: 3.11 - ``--protocol`` argument was introduced. +.. versionchanged:: 3.11 + Added the ``--protocol`` option. .. class:: CGIHTTPRequestHandler(request, client_address, server) @@ -502,11 +502,30 @@ following command runs an HTTP/1.1 conformant server:: Note that CGI scripts will be run with UID of user nobody, for security reasons. Problems with the CGI script will be translated to error 403. + .. deprecated-removed:: 3.13 3.15 + + :class:`CGIHTTPRequestHandler` is being removed in 3.15. CGI has not + been considered a good way to do things for well over a decade. This code + has been unmaintained for a while now and sees very little practical use. + Retaining it could lead to further :ref:`security considerations + `. + :class:`CGIHTTPRequestHandler` can be enabled in the command line by passing the ``--cgi`` option:: python -m http.server --cgi +.. deprecated-removed:: 3.13 3.15 + + :mod:`http.server` command line ``--cgi`` support is being removed + because :class:`CGIHTTPRequestHandler` is being removed. + +.. warning:: + + :class:`CGIHTTPRequestHandler` and the ``--cgi`` command line option + are not intended for use by untrusted clients and may be vulnerable + to exploitation. Always use within a secure environment. + .. _http.server-security: Security Considerations @@ -524,5 +543,5 @@ default :class:`BaseHTTPRequestHandler` ``.log_message`` implementation. This could allow remote clients connecting to your server to send nefarious control codes to your terminal. -.. versionadded:: 3.12 +.. versionchanged:: 3.12 Control characters are scrubbed in stderr logs. diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 3211da50..59b181aa 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -18,8 +18,6 @@ IDLE is Python's Integrated Development and Learning Environment. IDLE has the following features: -* coded in 100% pure Python, using the :mod:`tkinter` GUI toolkit - * cross-platform: works mostly the same on Windows, Unix, and macOS * Python shell window (interactive interpreter) with colorizing @@ -422,41 +420,34 @@ and that other files do not. Run Python code with the Run menu. Key bindings ^^^^^^^^^^^^ -In this section, 'C' refers to the :kbd:`Control` key on Windows and Unix and -the :kbd:`Command` key on macOS. - -* :kbd:`Backspace` deletes to the left; :kbd:`Del` deletes to the right - -* :kbd:`C-Backspace` delete word left; :kbd:`C-Del` delete word to the right - -* Arrow keys and :kbd:`Page Up`/:kbd:`Page Down` to move around - -* :kbd:`C-LeftArrow` and :kbd:`C-RightArrow` moves by words +The IDLE insertion cursor is a thin vertical bar between character +positions. When characters are entered, the insertion cursor and +everything to its right moves right one character and +the new character is entered in the new space. -* :kbd:`Home`/:kbd:`End` go to begin/end of line +Several non-character keys move the cursor and possibly +delete characters. Deletion does not puts text on the clipboard, +but IDLE has an undo list. Wherever this doc discusses keys, +'C' refers to the :kbd:`Control` key on Windows and +Unix and the :kbd:`Command` key on macOS. (And all such discussions +assume that the keys have not been re-bound to something else.) -* :kbd:`C-Home`/:kbd:`C-End` go to begin/end of file +* Arrow keys move the cursor one character or line. -* Some useful Emacs bindings are inherited from Tcl/Tk: +* :kbd:`C-LeftArrow` and :kbd:`C-RightArrow` moves left or right one word. - * :kbd:`C-a` beginning of line +* :kbd:`Home` and :kbd:`End` go to the beginning or end of the line. - * :kbd:`C-e` end of line +* :kbd:`Page Up` and :kbd:`Page Down` go up or down one screen. - * :kbd:`C-k` kill line (but doesn't put it in clipboard) +* :kbd:`C-Home` and :kbd:`C-End` go to beginning or end of the file. - * :kbd:`C-l` center window around the insertion point +* :kbd:`Backspace` and :kbd:`Del` (or :kbd:`C-d`) delete the previous + or next character. - * :kbd:`C-b` go backward one character without deleting (usually you can - also use the cursor key for this) +* :kbd:`C-Backspace` and :kbd:`C-Del` delete one word left or right. - * :kbd:`C-f` go forward one character without deleting (usually you can - also use the cursor key for this) - - * :kbd:`C-p` go up one line (usually you can also use the cursor key for - this) - - * :kbd:`C-d` delete next character +* :kbd:`C-k` deletes ('kills') everything to the right. Standard keybindings (like :kbd:`C-c` to copy and :kbd:`C-v` to paste) may work. Keybindings are selected in the Configure IDLE dialog. @@ -611,23 +602,18 @@ when one requests a restart on the Shell menu, or when one runs code in an editor window. The editing features described in previous subsections work when entering -code interactively. IDLE's Shell window also responds to the following keys. - -* :kbd:`C-c` interrupts executing command - -* :kbd:`C-d` sends end-of-file; closes window if typed at a ``>>>`` prompt - -* :kbd:`Alt-/` (Expand word) is also useful to reduce typing +code interactively. IDLE's Shell window also responds to the following: - Command history +* :kbd:`C-c` attempts to interrupt statement execution (but may fail). - * :kbd:`Alt-p` retrieves previous command matching what you have typed. On - macOS use :kbd:`C-p`. +* :kbd:`C-d` closes Shell if typed at a ``>>>`` prompt. - * :kbd:`Alt-n` retrieves next. On macOS use :kbd:`C-n`. +* :kbd:`Alt-p` and :kbd:`Alt-n` (:kbd:`C-p` and :kbd:`C-n` on macOS) + retrieve to the current prompt the previous or next previously + entered statement that matches anything already typed. - * :kbd:`Return` while the cursor is on any previous command - retrieves that command +* :kbd:`Return` while the cursor is on any previous statement + appends the latter to anything already typed at the prompt. Text colors ^^^^^^^^^^^ diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index 1f774e64..a2dad58b 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -1,5 +1,5 @@ -:mod:`imaplib` --- IMAP4 protocol client -======================================== +:mod:`!imaplib` --- IMAP4 protocol client +========================================= .. module:: imaplib :synopsis: IMAP4 protocol client (requires sockets). @@ -39,7 +39,7 @@ base class: initialized. If *host* is not specified, ``''`` (the local host) is used. If *port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout* parameter specifies a timeout in seconds for the connection attempt. - If timeout is not given or is None, the global default socket timeout is used. + If timeout is not given or is ``None``, the global default socket timeout is used. The :class:`IMAP4` class supports the :keyword:`with` statement. When used like this, the IMAP4 ``LOGOUT`` command is issued automatically when the @@ -97,7 +97,7 @@ There's also a subclass for secure connections: best practices. The optional *timeout* parameter specifies a timeout in seconds for the - connection attempt. If timeout is not given or is None, the global default + connection attempt. If timeout is not given or is ``None``, the global default socket timeout is used. .. versionchanged:: 3.3 @@ -360,7 +360,7 @@ An :class:`IMAP4` instance has the following methods: Opens socket to *port* at *host*. The optional *timeout* parameter specifies a timeout in seconds for the connection attempt. - If timeout is not given or is None, the global default socket timeout + If timeout is not given or is ``None``, the global default socket timeout is used. Also note that if the *timeout* parameter is set to be zero, it will raise a :class:`ValueError` to reject creating a non-blocking socket. This method is implicitly called by the :class:`IMAP4` constructor. @@ -531,7 +531,7 @@ An :class:`IMAP4` instance has the following methods: allowed creation of such tags, and popular IMAP servers, such as Gmail, accept and produce such flags. There are non-Python programs which also create such tags. Although it is an RFC violation and IMAP clients and - servers are supposed to be strict, imaplib nonetheless continues to allow + servers are supposed to be strict, imaplib still continues to allow such tags to be created for backward compatibility reasons, and as of Python 3.6, handles them if they are sent from the server, since this improves real-world compatibility. @@ -622,7 +622,7 @@ retrieves and prints all messages:: import getpass, imaplib - M = imaplib.IMAP4() + M = imaplib.IMAP4(host='example.org') M.login(getpass.getuser(), getpass.getpass()) M.select() typ, data = M.search(None, 'ALL') diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index 630fd701..56f26355 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -1,86 +1,19 @@ -:mod:`imghdr` --- Determine the type of an image -================================================ +:mod:`!imghdr` --- Determine the type of an image +================================================= .. module:: imghdr - :synopsis: Determine the type of image contained in a file or byte stream. + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/imghdr.py` - .. deprecated-removed:: 3.11 3.13 - The :mod:`imghdr` module is deprecated - (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). - --------------- - -The :mod:`imghdr` module determines the type of image contained in a file or -byte stream. - -The :mod:`imghdr` module defines the following function: - - -.. function:: what(file, h=None) - - Test the image data contained in the file named *file* and return a - string describing the image type. If *h* is provided, the *file* - argument is ignored and *h* is assumed to contain the byte stream to test. - - .. versionchanged:: 3.6 - Accepts a :term:`path-like object`. - -The following image types are recognized, as listed below with the return value -from :func:`what`: - -+------------+-----------------------------------+ -| Value | Image format | -+============+===================================+ -| ``'rgb'`` | SGI ImgLib Files | -+------------+-----------------------------------+ -| ``'gif'`` | GIF 87a and 89a Files | -+------------+-----------------------------------+ -| ``'pbm'`` | Portable Bitmap Files | -+------------+-----------------------------------+ -| ``'pgm'`` | Portable Graymap Files | -+------------+-----------------------------------+ -| ``'ppm'`` | Portable Pixmap Files | -+------------+-----------------------------------+ -| ``'tiff'`` | TIFF Files | -+------------+-----------------------------------+ -| ``'rast'`` | Sun Raster Files | -+------------+-----------------------------------+ -| ``'xbm'`` | X Bitmap Files | -+------------+-----------------------------------+ -| ``'jpeg'`` | JPEG data in JFIF or Exif formats | -+------------+-----------------------------------+ -| ``'bmp'`` | BMP files | -+------------+-----------------------------------+ -| ``'png'`` | Portable Network Graphics | -+------------+-----------------------------------+ -| ``'webp'`` | WebP files | -+------------+-----------------------------------+ -| ``'exr'`` | OpenEXR Files | -+------------+-----------------------------------+ - -.. versionadded:: 3.5 - The *exr* and *webp* formats were added. - - -You can extend the list of file types :mod:`imghdr` can recognize by appending -to this variable: - - -.. data:: tests - - A list of functions performing the individual tests. Each function takes two - arguments: the byte-stream and an open file-like object. When :func:`what` is - called with a byte-stream, the file-like object will be ``None``. - - The test function should return a string describing the image type if the test - succeeded, or ``None`` if it failed. -Example:: +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - >>> import imghdr - >>> imghdr.what('bass.gif') - 'gif' +Possible replacements are third-party libraries from PyPI: +:pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic`. +These are not supported or maintained by the Python core team. +The last version of Python that provided the :mod:`!imghdr` module was +`Python 3.12 `_. diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst new file mode 100644 index 00000000..3dc4c568 --- /dev/null +++ b/Doc/library/imp.rst @@ -0,0 +1,18 @@ +:mod:`!imp` --- Access the import internals +=========================================== + +.. module:: imp + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.4 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.4. + +The :ref:`removal notice ` includes guidance for +migrating code from :mod:`!imp` to :mod:`importlib`. + +The last version of Python that provided the :mod:`!imp` module was +`Python 3.11 `_. diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index d2cc769e..c38da0bd 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -26,7 +26,7 @@ this package can eliminate the need to use the older and less efficient ``importlib.metadata`` operates on third-party *distribution packages* installed into Python's ``site-packages`` directory via tools such as -`pip `_. +:pypi:`pip`. Specifically, it works with distributions with discoverable ``dist-info`` or ``egg-info`` directories, and metadata defined by the `Core metadata specifications `_. @@ -41,7 +41,7 @@ and metadata defined by the `Core metadata specifications ` + You can use :ref:`packages_distributions() ` to get a mapping between them. By default, distribution metadata can live on the file system @@ -100,6 +100,13 @@ You can also get a :ref:`distribution's version number `, list its :ref:`requirements`. +.. exception:: PackageNotFoundError + + Subclass of :class:`ModuleNotFoundError` raised by several functions in this + module when queried for a distribution package which is not installed in the + current Python environment. + + Functional API ============== @@ -111,31 +118,53 @@ This package provides the following functionality via its public API. Entry points ------------ -The ``entry_points()`` function returns a collection of entry points. -Entry points are represented by ``EntryPoint`` instances; -each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and -a ``.load()`` method to resolve the value. There are also ``.module``, -``.attr``, and ``.extras`` attributes for getting the components of the -``.value`` attribute. +.. function:: entry_points(**select_params) + + Returns a :class:`EntryPoints` instance describing entry points for the + current environment. Any given keyword parameters are passed to the + :meth:`!select` method for comparison to the attributes of + the individual entry point definitions. + + Note: it is not currently possible to query for entry points based on + their :attr:`!EntryPoint.dist` attribute (as different :class:`!Distribution` + instances do not currently compare equal, even if they have the same attributes) + +.. class:: EntryPoints + + Details of a collection of installed entry points. + + Also provides a ``.groups`` attribute that reports all identified entry + point groups, and a ``.names`` attribute that reports all identified entry + point names. + +.. class:: EntryPoint + + Details of an installed entry point. + + Each :class:`!EntryPoint` instance has ``.name``, ``.group``, and ``.value`` + attributes and a ``.load()`` method to resolve the value. There are also + ``.module``, ``.attr``, and ``.extras`` attributes for getting the + components of the ``.value`` attribute, and ``.dist`` for obtaining + information regarding the distribution package that provides the entry point. Query all entry points:: >>> eps = entry_points() # doctest: +SKIP -The ``entry_points()`` function returns an ``EntryPoints`` object, -a collection of all ``EntryPoint`` objects with ``names`` and ``groups`` +The :func:`!entry_points` function returns a :class:`!EntryPoints` object, +a collection of all :class:`!EntryPoint` objects with ``names`` and ``groups`` attributes for convenience:: >>> sorted(eps.groups) # doctest: +SKIP ['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation'] -``EntryPoints`` has a ``select`` method to select entry points +:class:`!EntryPoints` has a :meth:`!select` method to select entry points matching specific properties. Select entry points in the ``console_scripts`` group:: >>> scripts = eps.select(group='console_scripts') # doctest: +SKIP -Equivalently, since ``entry_points`` passes keyword arguments +Equivalently, since :func:`!entry_points` passes keyword arguments through to select:: >>> scripts = entry_points(group='console_scripts') # doctest: +SKIP @@ -171,53 +200,64 @@ group. Read `the setuptools docs `_ for more information on entry points, their definition, and usage. -*Compatibility Note* - -The "selectable" entry points were introduced in ``importlib_metadata`` -3.6 and Python 3.10. Prior to those changes, ``entry_points`` accepted -no parameters and always returned a dictionary of entry points, keyed -by group. With ``importlib_metadata`` 5.0 and Python 3.12, -``entry_points`` always returns an ``EntryPoints`` object. See -`backports.entry_points_selectable `_ -for compatibility options. +.. versionchanged:: 3.12 + The "selectable" entry points were introduced in ``importlib_metadata`` + 3.6 and Python 3.10. Prior to those changes, ``entry_points`` accepted + no parameters and always returned a dictionary of entry points, keyed + by group. With ``importlib_metadata`` 5.0 and Python 3.12, + ``entry_points`` always returns an ``EntryPoints`` object. See + :pypi:`backports.entry_points_selectable` + for compatibility options. +.. versionchanged:: 3.13 + ``EntryPoint`` objects no longer present a tuple-like interface + (:meth:`~object.__getitem__`). .. _metadata: Distribution metadata --------------------- -Every `Distribution Package `_ includes some metadata, -which you can extract using the -``metadata()`` function:: +.. function:: metadata(distribution_name) + + Return the distribution metadata corresponding to the named + distribution package as a :class:`PackageMetadata` instance. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +.. class:: PackageMetadata + + A concrete implementation of the + `PackageMetadata protocol `_. + + In addition to providing the defined protocol methods and attributes, subscripting + the instance is equivalent to calling the :meth:`!get` method. + +Every `Distribution Package `_ +includes some metadata, which you can extract using the :func:`!metadata` function:: >>> wheel_metadata = metadata('wheel') # doctest: +SKIP -The keys of the returned data structure, a ``PackageMetadata``, -name the metadata keywords, and +The keys of the returned data structure name the metadata keywords, and the values are returned unparsed from the distribution metadata:: >>> wheel_metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' -``PackageMetadata`` also presents a ``json`` attribute that returns +:class:`PackageMetadata` also presents a :attr:`!json` attribute that returns all the metadata in a JSON-compatible form per :PEP:`566`:: >>> wheel_metadata.json['requires_python'] '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' -.. note:: - - The actual type of the object returned by ``metadata()`` is an - implementation detail and should be accessed only through the interface - described by the - `PackageMetadata protocol `_. +The full set of available metadata is not described here. +See the PyPA `Core metadata specification `_ for additional details. .. versionchanged:: 3.10 The ``Description`` is now included in the metadata when presented through the payload. Line continuation characters have been removed. -.. versionadded:: 3.10 The ``json`` attribute was added. @@ -226,7 +266,15 @@ all the metadata in a JSON-compatible form per :PEP:`566`:: Distribution versions --------------------- -The ``version()`` function is the quickest way to get a +.. function:: version(distribution_name) + + Return the installed distribution package version for the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +The :func:`!version` function is the quickest way to get a `Distribution Package `_'s version number, as a string:: @@ -239,12 +287,28 @@ number, as a string:: Distribution files ------------------ -You can also get the full set of files contained within a distribution. The -``files()`` function takes a `Distribution Package `_ name -and returns all of the -files installed by this distribution. Each file object returned is a -``PackagePath``, a :class:`pathlib.PurePath` derived object with additional ``dist``, -``size``, and ``hash`` properties as indicated by the metadata. For example:: +.. function:: files(distribution_name) + + Return the full set of files contained within the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + + Returns :const:`None` if the distribution is found but the installation + database records reporting the files associated with the distribuion package + are missing. + +.. class:: PackagePath + + A :class:`pathlib.PurePath` derived object with additional ``dist``, + ``size``, and ``hash`` properties corresponding to the distribution + package's installation metadata for that file. + +The :func:`!files` function takes a +`Distribution Package `_ +name and returns all of the files installed by this distribution. Each file is reported +as a :class:`PackagePath` instance. For example:: >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP >>> util # doctest: +SKIP @@ -267,16 +331,16 @@ Once you have the file, you can also read its contents:: return s.encode('utf-8') return s -You can also use the ``locate`` method to get a the absolute path to the -file:: +You can also use the :meth:`!locate` method to get the absolute +path to the file:: >>> util.locate() # doctest: +SKIP PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py') In the case where the metadata file listing files -(RECORD or SOURCES.txt) is missing, ``files()`` will -return ``None``. The caller may wish to wrap calls to -``files()`` in `always_iterable +(``RECORD`` or ``SOURCES.txt``) is missing, :func:`!files` will +return :const:`None`. The caller may wish to wrap calls to +:func:`!files` in `always_iterable `_ or otherwise guard against this condition if the target distribution is not known to have the metadata present. @@ -286,8 +350,16 @@ distribution is not known to have the metadata present. Distribution requirements ------------------------- +.. function:: requires(distribution_name) + + Return the declared dependency specifiers for the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + To get the full set of requirements for a `Distribution Package `_, -use the ``requires()`` +use the :func:`!requires` function:: >>> requires('wheel') # doctest: +SKIP @@ -300,6 +372,16 @@ function:: Mapping import to distribution packages --------------------------------------- +.. function:: packages_distributions() + + Return a mapping from the top level module and import package + names found via :attr:`sys.meta_path` to the names of the distribution + packages (if any) that provide the corresponding files. + + To allow for namespace packages (which may have members provided by + multiple distribution packages), each top level import name maps to a + list of distribution names rather than mapping directly to a single name. + A convenience method to resolve the `Distribution Package `_ name (or names, in the case of a namespace package) that provide each importable top-level @@ -319,32 +401,59 @@ function is not reliable with such installs. Distributions ============= -While the above API is the most common and convenient usage, you can get all -of that information from the ``Distribution`` class. A ``Distribution`` is an -abstract object that represents the metadata for -a Python `Distribution Package `_. You can -get the ``Distribution`` instance:: +.. function:: distribution(distribution_name) + + Return a :class:`Distribution` instance describing the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +.. class:: Distribution + + Details of an installed distribution package. + + Note: different :class:`!Distribution` instances do not currently compare + equal, even if they relate to the same installed distribution and + accordingly have the same attributes. + +While the module level API described above is the most common and convenient usage, +you can get all of that information from the :class:`!Distribution` class. +:class:`!Distribution` is an abstract object that represents the metadata for +a Python `Distribution Package `_. +You can get the concreate :class:`!Distribution` subclass instance for an installed +distribution package by calling the :func:`distribution` function:: >>> from importlib.metadata import distribution # doctest: +SKIP >>> dist = distribution('wheel') # doctest: +SKIP + >>> type(dist) # doctest: +SKIP + Thus, an alternative way to get the version number is through the -``Distribution`` instance:: +:class:`!Distribution` instance:: >>> dist.version # doctest: +SKIP '0.32.3' -There are all kinds of additional metadata available on the ``Distribution`` -instance:: +There are all kinds of additional metadata available on :class:`!Distribution` +instances:: >>> dist.metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' >>> dist.metadata['License'] # doctest: +SKIP 'MIT' +For editable packages, an ``origin`` property may present :pep:`610` +metadata:: + + >>> dist.origin.url + 'file:///path/to/wheel-0.32.3.editable-py3-none-any.whl' + The full set of available metadata is not described here. -See the `Core metadata specifications `_ for additional details. +See the PyPA `Core metadata specification `_ for additional details. +.. versionadded:: 3.13 + The ``.origin`` property was added. Distribution Discovery ====================== @@ -397,6 +506,84 @@ metadata in locations other than the file system, subclass a custom finder, return instances of this derived ``Distribution`` in the ``find_distributions()`` method. +Example +------- + +Consider for example a custom finder that loads Python +modules from a database:: + + class DatabaseImporter(importlib.abc.MetaPathFinder): + def __init__(self, db): + self.db = db + + def find_spec(self, fullname, target=None) -> ModuleSpec: + return self.db.spec_from_name(fullname) + + sys.meta_path.append(DatabaseImporter(connect_db(...))) + +That importer now presumably provides importable modules from a +database, but it provides no metadata or entry points. For this +custom importer to provide metadata, it would also need to implement +``DistributionFinder``:: + + from importlib.metadata import DistributionFinder + + class DatabaseImporter(DistributionFinder): + ... + + def find_distributions(self, context=DistributionFinder.Context()): + query = dict(name=context.name) if context.name else {} + for dist_record in self.db.query_distributions(query): + yield DatabaseDistribution(dist_record) + +In this way, ``query_distributions`` would return records for +each distribution served by the database matching the query. For +example, if ``requests-1.0`` is in the database, ``find_distributions`` +would yield a ``DatabaseDistribution`` for ``Context(name='requests')`` +or ``Context(name=None)``. + +For the sake of simplicity, this example ignores ``context.path``\. The +``path`` attribute defaults to ``sys.path`` and is the set of import paths to +be considered in the search. A ``DatabaseImporter`` could potentially function +without any concern for a search path. Assuming the importer does no +partitioning, the "path" would be irrelevant. In order to illustrate the +purpose of ``path``, the example would need to illustrate a more complex +``DatabaseImporter`` whose behavior varied depending on +``sys.path``/``PYTHONPATH``. In that case, the ``find_distributions`` should +honor the ``context.path`` and only yield ``Distribution``\ s pertinent to that +path. + +``DatabaseDistribution``, then, would look something like:: + + class DatabaseDistribution(importlib.metadata.Distribution): + def __init__(self, record): + self.record = record + + def read_text(self, filename): + """ + Read a file like "METADATA" for the current distribution. + """ + if filename == "METADATA": + return f"""Name: {self.record.name} + Version: {self.record.version} + """ + if filename == "entry_points.txt": + return "\n".join( + f"""[{ep.group}]\n{ep.name}={ep.value}""" + for ep in self.record.entry_points) + + def locate_file(self, path): + raise RuntimeError("This distribution has no file system") + +This basic implementation should provide metadata and entry points for +packages served by the ``DatabaseImporter``, assuming that the +``record`` supplies suitable ``.name``, ``.version``, and +``.entry_points`` attributes. + +The ``DatabaseDistribution`` may also provide other metadata files, like +``RECORD`` (required for ``Distribution.files``) or override the +implementation of ``Distribution.files``. See the source for more inspiration. + .. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points .. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api diff --git a/Doc/library/importlib.resources.abc.rst b/Doc/library/importlib.resources.abc.rst index c508b6ba..54995ddb 100644 --- a/Doc/library/importlib.resources.abc.rst +++ b/Doc/library/importlib.resources.abc.rst @@ -1,5 +1,5 @@ -:mod:`importlib.resources.abc` -- Abstract base classes for resources ---------------------------------------------------------------------- +:mod:`!importlib.resources.abc` -- Abstract base classes for resources +---------------------------------------------------------------------- .. module:: importlib.resources.abc :synopsis: Abstract base classes for resources @@ -22,7 +22,7 @@ something like a data file that lives next to the ``__init__.py`` file of the package. The purpose of this class is to help abstract out the accessing of such data files so that it does not matter if - the package and its data file(s) are stored in a e.g. zip file + the package and its data file(s) are stored e.g. in a zip file versus on the file system. For any of methods of this class, a *resource* argument is @@ -103,19 +103,41 @@ .. abstractmethod:: is_dir() - Return True if self is a directory. + Return ``True`` if self is a directory. .. abstractmethod:: is_file() - Return True if self is a file. + Return ``True`` if self is a file. - .. abstractmethod:: joinpath(child) + .. abstractmethod:: joinpath(*pathsegments) - Return Traversable child in self. + Traverse directories according to *pathsegments* and return + the result as :class:`!Traversable`. + + Each *pathsegments* argument may contain multiple names separated by + forward slashes (``/``, ``posixpath.sep`` ). + For example, the following are equivalent:: + + files.joinpath('subdir', 'subsuddir', 'file.txt') + files.joinpath('subdir/subsuddir/file.txt') + + Note that some :class:`!Traversable` implementations + might not be updated to the latest version of the protocol. + For compatibility with such implementations, provide a single argument + without path separators to each call to ``joinpath``. For example:: + + files.joinpath('subdir').joinpath('subsubdir').joinpath('file.txt') + + .. versionchanged:: 3.11 + + ``joinpath`` accepts multiple *pathsegments*, and these segments + may contain forward slashes as path separators. + Previously, only a single *child* argument was accepted. .. abstractmethod:: __truediv__(child) Return Traversable child in self. + Equivalent to ``joinpath(child)``. .. abstractmethod:: open(mode='r', *args, **kwargs) diff --git a/Doc/library/importlib.resources.rst b/Doc/library/importlib.resources.rst index fecb7ef2..e0021988 100644 --- a/Doc/library/importlib.resources.rst +++ b/Doc/library/importlib.resources.rst @@ -1,5 +1,5 @@ -:mod:`importlib.resources` -- Package resource reading, opening and access --------------------------------------------------------------------------- +:mod:`!importlib.resources` -- Package resource reading, opening and access +--------------------------------------------------------------------------- .. module:: importlib.resources :synopsis: Package resource reading, opening, and access @@ -50,7 +50,7 @@ for example, a package and its resources can be imported from a zip file using ``get_resource_reader(fullname)`` method as specified by :class:`importlib.resources.abc.ResourceReader`. -.. data:: Anchor +.. class:: Anchor Represents an anchor for resources, either a :class:`module object ` or a module name as a string. Defined as @@ -63,7 +63,7 @@ for example, a package and its resources can be imported from a zip file using (think files). A Traversable may contain other containers (think subdirectories). - *anchor* is an optional :data:`Anchor`. If the anchor is a + *anchor* is an optional :class:`Anchor`. If the anchor is a package, resources are resolved from that package. If a module, resources are resolved adjacent to that module (in the same package or the package root). If the anchor is omitted, the caller's module @@ -72,10 +72,10 @@ for example, a package and its resources can be imported from a zip file using .. versionadded:: 3.9 .. versionchanged:: 3.12 - "package" parameter was renamed to "anchor". "anchor" can now + *package* parameter was renamed to *anchor*. *anchor* can now be a non-package module and if omitted will default to the caller's - module. "package" is still accepted for compatibility but will raise - a DeprecationWarning. Consider passing the anchor positionally or + module. *package* is still accepted for compatibility but will raise + a :exc:`DeprecationWarning`. Consider passing the anchor positionally or using ``importlib_resources >= 5.10`` for a compatible interface on older Pythons. @@ -96,160 +96,182 @@ for example, a package and its resources can be imported from a zip file using .. versionadded:: 3.9 .. versionchanged:: 3.12 - Added support for ``traversable`` representing a directory. + Added support for *traversable* representing a directory. -Deprecated functions -^^^^^^^^^^^^^^^^^^^^ +.. _importlib_resources_functional: -An older, deprecated set of functions is still available, but is -scheduled for removal in a future version of Python. -The main drawback of these functions is that they do not support -directories: they assume all resources are located directly within a *package*. +Functional API +^^^^^^^^^^^^^^ -.. data:: Package +A set of simplified, backwards-compatible helpers is available. +These allow common operations in a single function call. - Whenever a function accepts a ``Package`` argument, you can pass in - either a :class:`module object ` or a module name - as a string. You can only pass module objects whose - ``__spec__.submodule_search_locations`` is not ``None``. +For all the following functions: - The ``Package`` type is defined as ``Union[str, ModuleType]``. +- *anchor* is an :class:`~importlib.resources.Anchor`, + as in :func:`~importlib.resources.files`. + Unlike in ``files``, it may not be omitted. - .. deprecated:: 3.12 +- *path_names* are components of a resource's path name, relative to + the anchor. + For example, to get the text of resource named ``info.txt``, use:: + importlib.resources.read_text(my_module, "info.txt") -.. data:: Resource + Like :meth:`Traversable.joinpath `, + The individual components should use forward slashes (``/``) + as path separators. + For example, the following are equivalent:: - For *resource* arguments of the functions below, you can pass in - the name of a resource as a string or - a :class:`path-like object `. + importlib.resources.read_binary(my_module, "pics/painting.png") + importlib.resources.read_binary(my_module, "pics", "painting.png") - The ``Resource`` type is defined as ``Union[str, os.PathLike]``. + For backward compatibility reasons, functions that read text require + an explicit *encoding* argument if multiple *path_names* are given. + For example, to get the text of ``info/chapter1.txt``, use:: + importlib.resources.read_text(my_module, "info", "chapter1.txt", + encoding='utf-8') -.. function:: open_binary(package, resource) +.. function:: open_binary(anchor, *path_names) - Open for binary reading the *resource* within *package*. + Open the named resource for binary reading. - *package* is either a name or a module object which conforms to the - ``Package`` requirements. *resource* is the name of the resource to open - within *package*; it may not contain path separators and it may not have - sub-resources (i.e. it cannot be a directory). This function returns a - ``typing.BinaryIO`` instance, a binary I/O stream open for reading. + See :ref:`the introduction ` for + details on *anchor* and *path_names*. - .. deprecated:: 3.11 + This function returns a :class:`~typing.BinaryIO` object, + that is, a binary stream open for reading. - Calls to this function can be replaced by:: + This function is roughly equivalent to:: - files(package).joinpath(resource).open('rb') + files(anchor).joinpath(*path_names).open('rb') + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. -.. function:: open_text(package, resource, encoding='utf-8', errors='strict') - Open for text reading the *resource* within *package*. By default, the - resource is opened for reading as UTF-8. +.. function:: open_text(anchor, *path_names, encoding='utf-8', errors='strict') - *package* is either a name or a module object which conforms to the - ``Package`` requirements. *resource* is the name of the resource to open - within *package*; it may not contain path separators and it may not have - sub-resources (i.e. it cannot be a directory). *encoding* and *errors* - have the same meaning as with built-in :func:`open`. + Open the named resource for text reading. + By default, the contents are read as strict UTF-8. - This function returns a ``typing.TextIO`` instance, a text I/O stream open - for reading. + See :ref:`the introduction ` for + details on *anchor* and *path_names*. + *encoding* and *errors* have the same meaning as in built-in :func:`open`. - .. deprecated:: 3.11 + For backward compatibility reasons, the *encoding* argument must be given + explicitly if there are multiple *path_names*. + This limitation is scheduled to be removed in Python 3.15. - Calls to this function can be replaced by:: + This function returns a :class:`~typing.TextIO` object, + that is, a text stream open for reading. - files(package).joinpath(resource).open('r', encoding=encoding) + This function is roughly equivalent to:: + files(anchor).joinpath(*path_names).open('r', encoding=encoding) -.. function:: read_binary(package, resource) + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. + *encoding* and *errors* must be given as keyword arguments. - Read and return the contents of the *resource* within *package* as - ``bytes``. - *package* is either a name or a module object which conforms to the - ``Package`` requirements. *resource* is the name of the resource to open - within *package*; it may not contain path separators and it may not have - sub-resources (i.e. it cannot be a directory). This function returns the - contents of the resource as :class:`bytes`. +.. function:: read_binary(anchor, *path_names) - .. deprecated:: 3.11 + Read and return the contents of the named resource as :class:`bytes`. - Calls to this function can be replaced by:: + See :ref:`the introduction ` for + details on *anchor* and *path_names*. - files(package).joinpath(resource).read_bytes() + This function is roughly equivalent to:: + files(anchor).joinpath(*path_names).read_bytes() -.. function:: read_text(package, resource, encoding='utf-8', errors='strict') + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. - Read and return the contents of *resource* within *package* as a ``str``. + +.. function:: read_text(anchor, *path_names, encoding='utf-8', errors='strict') + + Read and return the contents of the named resource as :class:`str`. By default, the contents are read as strict UTF-8. - *package* is either a name or a module object which conforms to the - ``Package`` requirements. *resource* is the name of the resource to open - within *package*; it may not contain path separators and it may not have - sub-resources (i.e. it cannot be a directory). *encoding* and *errors* - have the same meaning as with built-in :func:`open`. This function - returns the contents of the resource as :class:`str`. + See :ref:`the introduction ` for + details on *anchor* and *path_names*. + *encoding* and *errors* have the same meaning as in built-in :func:`open`. - .. deprecated:: 3.11 + For backward compatibility reasons, the *encoding* argument must be given + explicitly if there are multiple *path_names*. + This limitation is scheduled to be removed in Python 3.15. + + This function is roughly equivalent to:: - Calls to this function can be replaced by:: + files(anchor).joinpath(*path_names).read_text(encoding=encoding) - files(package).joinpath(resource).read_text(encoding=encoding) + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. + *encoding* and *errors* must be given as keyword arguments. -.. function:: path(package, resource) +.. function:: path(anchor, *path_names) - Return the path to the *resource* as an actual file system path. This + Provides the path to the *resource* as an actual file system path. This function returns a context manager for use in a :keyword:`with` statement. The context manager provides a :class:`pathlib.Path` object. - Exiting the context manager cleans up any temporary file created when the - resource needs to be extracted from e.g. a zip file. + Exiting the context manager cleans up any temporary files created, e.g. + when the resource needs to be extracted from a zip file. - *package* is either a name or a module object which conforms to the - ``Package`` requirements. *resource* is the name of the resource to open - within *package*; it may not contain path separators and it may not have - sub-resources (i.e. it cannot be a directory). + For example, the :meth:`~pathlib.Path.stat` method requires + an actual file system path; it can be used like this:: - .. deprecated:: 3.11 + with importlib.resources.path(anchor, "resource.txt") as fspath: + result = fspath.stat() + + See :ref:`the introduction ` for + details on *anchor* and *path_names*. - Calls to this function can be replaced using :func:`as_file`:: + This function is roughly equivalent to:: - as_file(files(package).joinpath(resource)) + as_file(files(anchor).joinpath(*path_names)) + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. + *encoding* and *errors* must be given as keyword arguments. -.. function:: is_resource(package, name) - Return ``True`` if there is a resource named *name* in the package, - otherwise ``False``. +.. function:: is_resource(anchor, *path_names) + + Return ``True`` if the named resource exists, otherwise ``False``. This function does not consider directories to be resources. - *package* is either a name or a module object which conforms to the - ``Package`` requirements. - .. deprecated:: 3.11 + See :ref:`the introduction ` for + details on *anchor* and *path_names*. - Calls to this function can be replaced by:: + This function is roughly equivalent to:: - files(package).joinpath(resource).is_file() + files(anchor).joinpath(*path_names).is_file() + .. versionchanged:: 3.13 + Multiple *path_names* are accepted. -.. function:: contents(package) - Return an iterable over the named items within the package. The iterable - returns :class:`str` resources (e.g. files) and non-resources - (e.g. directories). The iterable does not recurse into subdirectories. +.. function:: contents(anchor, *path_names) - *package* is either a name or a module object which conforms to the - ``Package`` requirements. + Return an iterable over the named items within the package or path. + The iterable returns names of resources (e.g. files) and non-resources + (e.g. directories) as :class:`str`. + The iterable does not recurse into subdirectories. - .. deprecated:: 3.11 + See :ref:`the introduction ` for + details on *anchor* and *path_names*. + + This function is roughly equivalent to:: - Calls to this function can be replaced by:: + for resource in files(anchor).joinpath(*path_names).iterdir(): + yield resource.name - (resource.name for resource in files(package).iterdir() if resource.is_file()) + .. deprecated:: 3.11 + Prefer ``iterdir()`` as above, which offers more control over the + results and richer functionality. diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index fc954724..de411042 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -249,7 +249,7 @@ ABC hierarchy:: An abstract method for finding a :term:`spec ` for the specified module. If this is a top-level import, *path* will be ``None``. Otherwise, this is a search for a subpackage or - module and *path* will be the value of :attr:`__path__` from the + module and *path* will be the value of :attr:`~module.__path__` from the parent package. If a spec cannot be found, ``None`` is returned. When passed in, ``target`` is a module object that the finder may use to make a more educated guess about what spec to return. @@ -265,7 +265,7 @@ ABC hierarchy:: when invalidating the caches of all finders on :data:`sys.meta_path`. .. versionchanged:: 3.4 - Returns ``None`` when called instead of ``NotImplemented``. + Returns ``None`` when called instead of :data:`NotImplemented`. .. class:: PathEntryFinder @@ -355,34 +355,12 @@ ABC hierarchy:: (note that some of these attributes can change when a module is reloaded): - - :attr:`__name__` - The module's fully qualified name. - It is ``'__main__'`` for an executed module. - - - :attr:`__file__` - The location the :term:`loader` used to load the module. - For example, for modules loaded from a .py file this is the filename. - It is not set on all modules (e.g. built-in modules). - - - :attr:`__cached__` - The filename of a compiled version of the module's code. - It is not set on all modules (e.g. built-in modules). - - - :attr:`__path__` - The list of locations where the package's submodules will be found. - Most of the time this is a single directory. - The import system passes this attribute to ``__import__()`` and to finders - in the same way as :data:`sys.path` but just for the package. - It is not set on non-package modules so it can be used - as an indicator that the module is a package. - - - :attr:`__package__` - The fully qualified name of the package the module is in (or the - empty string for a top-level module). - If the module is a package then this is the same as :attr:`__name__`. - - - :attr:`__loader__` - The :term:`loader` used to load the module. + - :attr:`module.__name__` + - :attr:`module.__file__` + - :attr:`module.__cached__` *(deprecated)* + - :attr:`module.__path__` + - :attr:`module.__package__` *(deprecated)* + - :attr:`module.__loader__` *(deprecated)* When :meth:`exec_module` is available then backwards-compatible functionality is provided. @@ -418,7 +396,8 @@ ABC hierarchy:: can implement this abstract method to give direct access to the data stored. :exc:`OSError` is to be raised if the *path* cannot be found. The *path* is expected to be constructed using a module's - :attr:`__file__` attribute or an item from a package's :attr:`__path__`. + :attr:`~module.__file__` attribute or an item from a package's + :attr:`~module.__path__`. .. versionchanged:: 3.4 Raises :exc:`OSError` instead of :exc:`NotImplementedError`. @@ -505,9 +484,9 @@ ABC hierarchy:: .. abstractmethod:: get_filename(fullname) - An abstract method that is to return the value of :attr:`__file__` for - the specified module. If no path is available, :exc:`ImportError` is - raised. + An abstract method that is to return the value of + :attr:`~module.__file__` for the specified module. If no path is + available, :exc:`ImportError` is raised. If source code is available, then the method should return the path to the source file, regardless of whether a bytecode was used to load the @@ -657,7 +636,7 @@ ABC hierarchy:: something like a data file that lives next to the ``__init__.py`` file of the package. The purpose of this class is to help abstract out the accessing of such data files so that it does not matter if - the package and its data file(s) are stored in a e.g. zip file + the package and its data file(s) are stored e.g. in a zip file versus on the file system. For any of methods of this class, a *resource* argument is @@ -1145,7 +1124,7 @@ find and load modules. .. versionadded:: 3.4 -.. class:: NamespaceLoader(name, path, path_finder): +.. class:: NamespaceLoader(name, path, path_finder) A concrete implementation of :class:`importlib.abc.InspectLoader` for namespace packages. This is an alias for a private class and is only made @@ -1166,79 +1145,137 @@ find and load modules. .. class:: ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None) A specification for a module's import-system-related state. This is - typically exposed as the module's :attr:`__spec__` attribute. In the - descriptions below, the names in parentheses give the corresponding - attribute available directly on the module object, - e.g. ``module.__spec__.origin == module.__file__``. Note, however, that + typically exposed as the module's :attr:`~module.__spec__` attribute. Many + of these attributes are also available directly on a module: for example, + ``module.__spec__.origin == module.__file__``. Note, however, that while the *values* are usually equivalent, they can differ since there is - no synchronization between the two objects. For example, it is possible to update - the module's :attr:`__file__` at runtime and this will not be automatically - reflected in the module's :attr:`__spec__.origin`, and vice versa. + no synchronization between the two objects. For example, it is possible to + update the module's :attr:`~module.__file__` at runtime and this will not be + automatically reflected in the module's + :attr:`__spec__.origin `, and vice versa. .. versionadded:: 3.4 .. attribute:: name - (:attr:`__name__`) - - The module's fully qualified name. - The :term:`finder` should always set this attribute to a non-empty string. + The module's fully qualified name (see :attr:`module.__name__`). + The :term:`finder` should always set this attribute to a non-empty string. .. attribute:: loader - (:attr:`__loader__`) - - The :term:`loader` used to load the module. - The :term:`finder` should always set this attribute. + The :term:`loader` used to load the module (see :attr:`module.__loader__`). + The :term:`finder` should always set this attribute. .. attribute:: origin - (:attr:`__file__`) - - The location the :term:`loader` should use to load the module. - For example, for modules loaded from a .py file this is the filename. - The :term:`finder` should always set this attribute to a meaningful value - for the :term:`loader` to use. In the uncommon case that there is not one - (like for namespace packages), it should be set to ``None``. + The location the :term:`loader` should use to load the module + (see :attr:`module.__file__`). + For example, for modules loaded from a ``.py`` file this is the filename. + The :term:`finder` should always set this attribute to a meaningful value + for the :term:`loader` to use. In the uncommon case that there is not one + (like for namespace packages), it should be set to ``None``. .. attribute:: submodule_search_locations - (:attr:`__path__`) + A (possibly empty) :term:`sequence` of strings enumerating the locations + in which a package's submodules will be found + (see :attr:`module.__path__`). Most of the time there will only be a + single directory in this list. - The list of locations where the package's submodules will be found. - Most of the time this is a single directory. - The :term:`finder` should set this attribute to a list, even an empty one, to indicate - to the import system that the module is a package. It should be set to ``None`` for - non-package modules. It is set automatically later to a special object for - namespace packages. + The :term:`finder` should set this attribute to a sequence, even an empty + one, to indicate + to the import system that the module is a package. It should be set to ``None`` for + non-package modules. It is set automatically later to a special object for + namespace packages. .. attribute:: loader_state - The :term:`finder` may set this attribute to an object containing additional, - module-specific data to use when loading the module. Otherwise it should be - set to ``None``. + The :term:`finder` may set this attribute to an object containing additional, + module-specific data to use when loading the module. Otherwise it should be + set to ``None``. .. attribute:: cached - (:attr:`__cached__`) - - The filename of a compiled version of the module's code. - The :term:`finder` should always set this attribute but it may be ``None`` - for modules that do not need compiled code stored. + The filename of a compiled version of the module's code + (see :attr:`module.__cached__`). + The :term:`finder` should always set this attribute but it may be ``None`` + for modules that do not need compiled code stored. .. attribute:: parent - (:attr:`__package__`) - - (Read-only) The fully qualified name of the package the module is in (or the - empty string for a top-level module). - If the module is a package then this is the same as :attr:`name`. + (Read-only) The fully qualified name of the package the module is in (or the + empty string for a top-level module). + See :attr:`module.__package__`. + If the module is a package then this is the same as :attr:`name`. .. attribute:: has_location - ``True`` if the spec's :attr:`origin` refers to a loadable location, - ``False`` otherwise. This value impacts how :attr:`origin` is interpreted - and how the module's :attr:`__file__` is populated. + ``True`` if the spec's :attr:`origin` refers to a loadable location, + ``False`` otherwise. This value impacts how :attr:`!origin` is interpreted + and how the module's :attr:`~module.__file__` is populated. + + +.. class:: AppleFrameworkLoader(name, path) + + A specialization of :class:`importlib.machinery.ExtensionFileLoader` that + is able to load extension modules in Framework format. + + For compatibility with the iOS App Store, *all* binary modules in an iOS app + must be dynamic libraries, contained in a framework with appropriate + metadata, stored in the ``Frameworks`` folder of the packaged app. There can + be only a single binary per framework, and there can be no executable binary + material outside the Frameworks folder. + + To accommodate this requirement, when running on iOS, extension module + binaries are *not* packaged as ``.so`` files on ``sys.path``, but as + individual standalone frameworks. To discover those frameworks, this loader + is be registered against the ``.fwork`` file extension, with a ``.fwork`` + file acting as a placeholder in the original location of the binary on + ``sys.path``. The ``.fwork`` file contains the path of the actual binary in + the ``Frameworks`` folder, relative to the app bundle. To allow for + resolving a framework-packaged binary back to the original location, the + framework is expected to contain a ``.origin`` file that contains the + location of the ``.fwork`` file, relative to the app bundle. + + For example, consider the case of an import ``from foo.bar import _whiz``, + where ``_whiz`` is implemented with the binary module + ``sources/foo/bar/_whiz.abi3.so``, with ``sources`` being the location + registered on ``sys.path``, relative to the application bundle. This module + *must* be distributed as + ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz`` (creating the framework + name from the full import path of the module), with an ``Info.plist`` file + in the ``.framework`` directory identifying the binary as a framework. The + ``foo.bar._whiz`` module would be represented in the original location with + a ``sources/foo/bar/_whiz.abi3.fwork`` marker file, containing the path + ``Frameworks/foo.bar._whiz/foo.bar._whiz``. The framework would also contain + ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin``, containing the + path to the ``.fwork`` file. + + When a module is loaded with this loader, the ``__file__`` for the module + will report as the location of the ``.fwork`` file. This allows code to use + the ``__file__`` of a module as an anchor for file system traveral. + However, the spec origin will reference the location of the *actual* binary + in the ``.framework`` folder. + + The Xcode project building the app is responsible for converting any ``.so`` + files from wherever they exist in the ``PYTHONPATH`` into frameworks in the + ``Frameworks`` folder (including stripping extensions from the module file, + the addition of framework metadata, and signing the resulting framework), + and creating the ``.fwork`` and ``.origin`` files. This will usually be done + with a build step in the Xcode project; see the iOS documentation for + details on how to construct this build step. + + .. versionadded:: 3.13 + + .. availability:: iOS. + + .. attribute:: name + + Name of the module the loader supports. + + .. attribute:: path + + Path to the ``.fwork`` file for the extension module. :mod:`importlib.util` -- Utility code for importers @@ -1360,8 +1397,8 @@ an :term:`importer`. .. versionchanged:: 3.7 Raises :exc:`ModuleNotFoundError` instead of :exc:`AttributeError` if - **package** is in fact not a package (i.e. lacks a :attr:`__path__` - attribute). + **package** is in fact not a package (i.e. lacks a + :attr:`~module.__path__` attribute). .. function:: module_from_spec(spec) @@ -1521,20 +1558,34 @@ Note that if ``name`` is a submodule (contains a dot), Importing a source file directly '''''''''''''''''''''''''''''''' -To import a Python source file directly, use the following recipe:: +This recipe should be used with caution: it is an approximation of an import +statement where the file path is specified directly, rather than +:data:`sys.path` being searched. Alternatives should first be considered first, +such as modifying :data:`sys.path` when a proper module is required, or using +:func:`runpy.run_path` when the global namespace resulting from running a Python +file is appropriate. - import importlib.util - import sys +To import a Python source file directly from a path, use the following recipe:: - # For illustrative purposes. - import tokenize - file_path = tokenize.__file__ - module_name = tokenize.__name__ + import importlib.util + import sys + + + def import_from_path(module_name, file_path): + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module - spec = importlib.util.spec_from_file_location(module_name, file_path) - module = importlib.util.module_from_spec(spec) - sys.modules[module_name] = module - spec.loader.exec_module(module) + + # For illustrative purposes only (use of `json` is arbitrary). + import json + file_path = json.__file__ + module_name = json.__name__ + + # Similar outcome as `import json`. + json = import_from_path(module_name, file_path) Implementing lazy imports @@ -1560,7 +1611,6 @@ The example below shows how to implement lazy imports:: False - Setting up an importer '''''''''''''''''''''' diff --git a/Doc/library/index.rst b/Doc/library/index.rst index d064b680..951fbcf1 100644 --- a/Doc/library/index.rst +++ b/Doc/library/index.rst @@ -73,5 +73,7 @@ the `Python Package Index `_. language.rst windows.rst unix.rst + cmdline.rst superseded.rst + removed.rst security_warnings.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 603ac326..7ed39ae2 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -1,5 +1,10 @@ -:mod:`inspect` --- Inspect live objects -======================================= +:mod:`!inspect` --- Inspect live objects +======================================== + +.. testsetup:: * + + import inspect + from inspect import * .. module:: inspect :synopsis: Extract information and source code from live objects. @@ -37,210 +42,233 @@ attributes (see :ref:`import-mod-attrs` for module attributes): .. this function name is too big to fit in the ascii-art table below .. |coroutine-origin-link| replace:: :func:`sys.set_coroutine_origin_tracking_depth` -+-----------+-------------------+---------------------------+ -| Type | Attribute | Description | -+===========+===================+===========================+ -| class | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | class was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this class was defined | -+-----------+-------------------+---------------------------+ -| method | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | method was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __func__ | function object | -| | | containing implementation | -| | | of method | -+-----------+-------------------+---------------------------+ -| | __self__ | instance to which this | -| | | method is bound, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this method was defined | -+-----------+-------------------+---------------------------+ -| function | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | function was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __code__ | code object containing | -| | | compiled function | -| | | :term:`bytecode` | -+-----------+-------------------+---------------------------+ -| | __defaults__ | tuple of any default | -| | | values for positional or | -| | | keyword parameters | -+-----------+-------------------+---------------------------+ -| | __kwdefaults__ | mapping of any default | -| | | values for keyword-only | -| | | parameters | -+-----------+-------------------+---------------------------+ -| | __globals__ | global namespace in which | -| | | this function was defined | -+-----------+-------------------+---------------------------+ -| | __builtins__ | builtins namespace | -+-----------+-------------------+---------------------------+ -| | __annotations__ | mapping of parameters | -| | | names to annotations; | -| | | ``"return"`` key is | -| | | reserved for return | -| | | annotations. | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this function was defined | -+-----------+-------------------+---------------------------+ -| traceback | tb_frame | frame object at this | -| | | level | -+-----------+-------------------+---------------------------+ -| | tb_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-------------------+---------------------------+ -| | tb_lineno | current line number in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | tb_next | next inner traceback | -| | | object (called by this | -| | | level) | -+-----------+-------------------+---------------------------+ -| frame | f_back | next outer frame object | -| | | (this frame's caller) | -+-----------+-------------------+---------------------------+ -| | f_builtins | builtins namespace seen | -| | | by this frame | -+-----------+-------------------+---------------------------+ -| | f_code | code object being | -| | | executed in this frame | -+-----------+-------------------+---------------------------+ -| | f_globals | global namespace seen by | -| | | this frame | -+-----------+-------------------+---------------------------+ -| | f_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-------------------+---------------------------+ -| | f_lineno | current line number in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | f_locals | local namespace seen by | -| | | this frame | -+-----------+-------------------+---------------------------+ -| | f_trace | tracing function for this | -| | | frame, or ``None`` | -+-----------+-------------------+---------------------------+ -| code | co_argcount | number of arguments (not | -| | | including keyword only | -| | | arguments, \* or \*\* | -| | | args) | -+-----------+-------------------+---------------------------+ -| | co_code | string of raw compiled | -| | | bytecode | -+-----------+-------------------+---------------------------+ -| | co_cellvars | tuple of names of cell | -| | | variables (referenced by | -| | | containing scopes) | -+-----------+-------------------+---------------------------+ -| | co_consts | tuple of constants used | -| | | in the bytecode | -+-----------+-------------------+---------------------------+ -| | co_filename | name of file in which | -| | | this code object was | -| | | created | -+-----------+-------------------+---------------------------+ -| | co_firstlineno | number of first line in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | co_flags | bitmap of ``CO_*`` flags, | -| | | read more :ref:`here | -| | | `| -+-----------+-------------------+---------------------------+ -| | co_lnotab | encoded mapping of line | -| | | numbers to bytecode | -| | | indices | -+-----------+-------------------+---------------------------+ -| | co_freevars | tuple of names of free | -| | | variables (referenced via | -| | | a function's closure) | -+-----------+-------------------+---------------------------+ -| | co_posonlyargcount| number of positional only | -| | | arguments | -+-----------+-------------------+---------------------------+ -| | co_kwonlyargcount | number of keyword only | -| | | arguments (not including | -| | | \*\* arg) | -+-----------+-------------------+---------------------------+ -| | co_name | name with which this code | -| | | object was defined | -+-----------+-------------------+---------------------------+ -| | co_qualname | fully qualified name with | -| | | which this code object | -| | | was defined | -+-----------+-------------------+---------------------------+ -| | co_names | tuple of names other | -| | | than arguments and | -| | | function locals | -+-----------+-------------------+---------------------------+ -| | co_nlocals | number of local variables | -+-----------+-------------------+---------------------------+ -| | co_stacksize | virtual machine stack | -| | | space required | -+-----------+-------------------+---------------------------+ -| | co_varnames | tuple of names of | -| | | arguments and local | -| | | variables | -+-----------+-------------------+---------------------------+ -| generator | __name__ | name | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | gi_frame | frame | -+-----------+-------------------+---------------------------+ -| | gi_running | is the generator running? | -+-----------+-------------------+---------------------------+ -| | gi_code | code | -+-----------+-------------------+---------------------------+ -| | gi_yieldfrom | object being iterated by | -| | | ``yield from``, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ -| coroutine | __name__ | name | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | cr_await | object being awaited on, | -| | | or ``None`` | -+-----------+-------------------+---------------------------+ -| | cr_frame | frame | -+-----------+-------------------+---------------------------+ -| | cr_running | is the coroutine running? | -+-----------+-------------------+---------------------------+ -| | cr_code | code | -+-----------+-------------------+---------------------------+ -| | cr_origin | where coroutine was | -| | | created, or ``None``. See | -| | | |coroutine-origin-link| | -+-----------+-------------------+---------------------------+ -| builtin | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | original name of this | -| | | function or method | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __self__ | instance to which a | -| | | method is bound, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ ++-----------------+-------------------+---------------------------+ +| Type | Attribute | Description | ++=================+===================+===========================+ +| class | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | class was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this class was defined | ++-----------------+-------------------+---------------------------+ +| | __type_params__ | A tuple containing the | +| | | :ref:`type parameters | +| | | ` of | +| | | a generic class | ++-----------------+-------------------+---------------------------+ +| method | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | method was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __func__ | function object | +| | | containing implementation | +| | | of method | ++-----------------+-------------------+---------------------------+ +| | __self__ | instance to which this | +| | | method is bound, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this method was defined | ++-----------------+-------------------+---------------------------+ +| function | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | function was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __code__ | code object containing | +| | | compiled function | +| | | :term:`bytecode` | ++-----------------+-------------------+---------------------------+ +| | __defaults__ | tuple of any default | +| | | values for positional or | +| | | keyword parameters | ++-----------------+-------------------+---------------------------+ +| | __kwdefaults__ | mapping of any default | +| | | values for keyword-only | +| | | parameters | ++-----------------+-------------------+---------------------------+ +| | __globals__ | global namespace in which | +| | | this function was defined | ++-----------------+-------------------+---------------------------+ +| | __builtins__ | builtins namespace | ++-----------------+-------------------+---------------------------+ +| | __annotations__ | mapping of parameters | +| | | names to annotations; | +| | | ``"return"`` key is | +| | | reserved for return | +| | | annotations. | ++-----------------+-------------------+---------------------------+ +| | __type_params__ | A tuple containing the | +| | | :ref:`type parameters | +| | | ` of | +| | | a generic function | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this function was defined | ++-----------------+-------------------+---------------------------+ +| traceback | tb_frame | frame object at this | +| | | level | ++-----------------+-------------------+---------------------------+ +| | tb_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------------+-------------------+---------------------------+ +| | tb_lineno | current line number in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | tb_next | next inner traceback | +| | | object (called by this | +| | | level) | ++-----------------+-------------------+---------------------------+ +| frame | f_back | next outer frame object | +| | | (this frame's caller) | ++-----------------+-------------------+---------------------------+ +| | f_builtins | builtins namespace seen | +| | | by this frame | ++-----------------+-------------------+---------------------------+ +| | f_code | code object being | +| | | executed in this frame | ++-----------------+-------------------+---------------------------+ +| | f_globals | global namespace seen by | +| | | this frame | ++-----------------+-------------------+---------------------------+ +| | f_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------------+-------------------+---------------------------+ +| | f_lineno | current line number in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | f_locals | local namespace seen by | +| | | this frame | ++-----------------+-------------------+---------------------------+ +| | f_trace | tracing function for this | +| | | frame, or ``None`` | ++-----------------+-------------------+---------------------------+ +| code | co_argcount | number of arguments (not | +| | | including keyword only | +| | | arguments, \* or \*\* | +| | | args) | ++-----------------+-------------------+---------------------------+ +| | co_code | string of raw compiled | +| | | bytecode | ++-----------------+-------------------+---------------------------+ +| | co_cellvars | tuple of names of cell | +| | | variables (referenced by | +| | | containing scopes) | ++-----------------+-------------------+---------------------------+ +| | co_consts | tuple of constants used | +| | | in the bytecode | ++-----------------+-------------------+---------------------------+ +| | co_filename | name of file in which | +| | | this code object was | +| | | created | ++-----------------+-------------------+---------------------------+ +| | co_firstlineno | number of first line in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | co_flags | bitmap of ``CO_*`` flags, | +| | | read more :ref:`here | +| | | `| ++-----------------+-------------------+---------------------------+ +| | co_lnotab | encoded mapping of line | +| | | numbers to bytecode | +| | | indices | ++-----------------+-------------------+---------------------------+ +| | co_freevars | tuple of names of free | +| | | variables (referenced via | +| | | a function's closure) | ++-----------------+-------------------+---------------------------+ +| | co_posonlyargcount| number of positional only | +| | | arguments | ++-----------------+-------------------+---------------------------+ +| | co_kwonlyargcount | number of keyword only | +| | | arguments (not including | +| | | \*\* arg) | ++-----------------+-------------------+---------------------------+ +| | co_name | name with which this code | +| | | object was defined | ++-----------------+-------------------+---------------------------+ +| | co_qualname | fully qualified name with | +| | | which this code object | +| | | was defined | ++-----------------+-------------------+---------------------------+ +| | co_names | tuple of names other | +| | | than arguments and | +| | | function locals | ++-----------------+-------------------+---------------------------+ +| | co_nlocals | number of local variables | ++-----------------+-------------------+---------------------------+ +| | co_stacksize | virtual machine stack | +| | | space required | ++-----------------+-------------------+---------------------------+ +| | co_varnames | tuple of names of | +| | | arguments and local | +| | | variables | ++-----------------+-------------------+---------------------------+ +| generator | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | gi_frame | frame | ++-----------------+-------------------+---------------------------+ +| | gi_running | is the generator running? | ++-----------------+-------------------+---------------------------+ +| | gi_code | code | ++-----------------+-------------------+---------------------------+ +| | gi_yieldfrom | object being iterated by | +| | | ``yield from``, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ +| async generator | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | ag_await | object being awaited on, | +| | | or ``None`` | ++-----------------+-------------------+---------------------------+ +| | ag_frame | frame | ++-----------------+-------------------+---------------------------+ +| | ag_running | is the generator running? | ++-----------------+-------------------+---------------------------+ +| | ag_code | code | ++-----------------+-------------------+---------------------------+ +| coroutine | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | cr_await | object being awaited on, | +| | | or ``None`` | ++-----------------+-------------------+---------------------------+ +| | cr_frame | frame | ++-----------------+-------------------+---------------------------+ +| | cr_running | is the coroutine running? | ++-----------------+-------------------+---------------------------+ +| | cr_code | code | ++-----------------+-------------------+---------------------------+ +| | cr_origin | where coroutine was | +| | | created, or ``None``. See | +| | | |coroutine-origin-link| | ++-----------------+-------------------+---------------------------+ +| builtin | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | original name of this | +| | | function or method | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __self__ | instance to which a | +| | | method is bound, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ .. versionchanged:: 3.5 @@ -268,7 +296,7 @@ attributes (see :ref:`import-mod-attrs` for module attributes): :func:`getmembers` will only return class attributes defined in the metaclass when the argument is a class and those attributes have been - listed in the metaclass' custom :meth:`__dir__`. + listed in the metaclass' custom :meth:`~object.__dir__`. .. function:: getmembers_static(object[, predicate]) @@ -335,6 +363,9 @@ attributes (see :ref:`import-mod-attrs` for module attributes): Functions wrapped in :func:`functools.partial` now return ``True`` if the wrapped function is a Python generator function. + .. versionchanged:: 3.13 + Functions wrapped in :func:`functools.partialmethod` now return ``True`` + if the wrapped function is a Python generator function. .. function:: isgenerator(object) @@ -358,6 +389,10 @@ attributes (see :ref:`import-mod-attrs` for module attributes): Sync functions marked with :func:`markcoroutinefunction` now return ``True``. + .. versionchanged:: 3.13 + Functions wrapped in :func:`functools.partialmethod` now return ``True`` + if the wrapped function is a :term:`coroutine function`. + .. function:: markcoroutinefunction(func) @@ -387,7 +422,11 @@ attributes (see :ref:`import-mod-attrs` for module attributes): Return ``True`` if the object can be used in :keyword:`await` expression. Can also be used to distinguish generator-based coroutines from regular - generators:: + generators: + + .. testcode:: + + import types def gen(): yield @@ -404,20 +443,25 @@ attributes (see :ref:`import-mod-attrs` for module attributes): .. function:: isasyncgenfunction(object) Return ``True`` if the object is an :term:`asynchronous generator` function, - for example:: + for example: + + .. doctest:: - >>> async def agen(): - ... yield 1 - ... - >>> inspect.isasyncgenfunction(agen) - True + >>> async def agen(): + ... yield 1 + ... + >>> inspect.isasyncgenfunction(agen) + True .. versionadded:: 3.6 .. versionchanged:: 3.8 Functions wrapped in :func:`functools.partial` now return ``True`` if the - wrapped function is a :term:`asynchronous generator` function. + wrapped function is an :term:`asynchronous generator` function. + .. versionchanged:: 3.13 + Functions wrapped in :func:`functools.partialmethod` now return ``True`` + if the wrapped function is a :term:`coroutine function`. .. function:: isasyncgen(object) @@ -473,15 +517,21 @@ attributes (see :ref:`import-mod-attrs` for module attributes): are true. This, for example, is true of ``int.__add__``. An object passing this test - has a :meth:`~object.__get__` method but not a :meth:`~object.__set__` - method, but beyond that the set of attributes varies. A - :attr:`~definition.__name__` attribute is usually - sensible, and :attr:`__doc__` often is. + has a :meth:`~object.__get__` method, but not a :meth:`~object.__set__` + method or a :meth:`~object.__delete__` method. Beyond that, the set of + attributes varies. A :attr:`~definition.__name__` attribute is usually + sensible, and :attr:`~definition.__doc__` often is. Methods implemented via descriptors that also pass one of the other tests return ``False`` from the :func:`ismethoddescriptor` test, simply because the other tests promise more -- you can, e.g., count on having the - :attr:`__func__` attribute (etc) when an object passes :func:`ismethod`. + :attr:`~method.__func__` attribute (etc) when an object passes + :func:`ismethod`. + + .. versionchanged:: 3.13 + This function no longer incorrectly reports objects with :meth:`~object.__get__` + and :meth:`~object.__delete__`, but not :meth:`~object.__set__`, as being method + descriptors (such objects are data descriptors, not method descriptors). .. function:: isdatadescriptor(object) @@ -492,7 +542,7 @@ attributes (see :ref:`import-mod-attrs` for module attributes): Examples are properties (defined in Python), getsets, and members. The latter two are defined in C and there are more specific tests available for those types, which is robust across Python implementations. Typically, data - descriptors will also have :attr:`~definition.__name__` and :attr:`__doc__` attributes + descriptors will also have :attr:`~definition.__name__` and :attr:`!__doc__` attributes (properties, getsets, and members have both of these attributes), but this is not guaranteed. @@ -614,13 +664,16 @@ Introspecting callables with the Signature object .. versionadded:: 3.3 -The Signature object represents the call signature of a callable object and its -return annotation. To retrieve a Signature object, use the :func:`signature` +The :class:`Signature` object represents the call signature of a callable object +and its return annotation. To retrieve a :class:`!Signature` object, +use the :func:`!signature` function. .. function:: signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False) - Return a :class:`Signature` object for the given ``callable``:: + Return a :class:`Signature` object for the given *callable*: + + .. doctest:: >>> from inspect import signature >>> def foo(a, *, b:int, **kwargs): @@ -629,10 +682,10 @@ function. >>> sig = signature(foo) >>> str(sig) - '(a, *, b:int, **kwargs)' + '(a, *, b: int, **kwargs)' >>> str(sig.parameters['b']) - 'b:int' + 'b: int' >>> sig.parameters['b'].annotation @@ -643,29 +696,30 @@ function. For objects defined in modules using stringized annotations (``from __future__ import annotations``), :func:`signature` will attempt to automatically un-stringize the annotations using - :func:`inspect.get_annotations()`. The - ``global``, ``locals``, and ``eval_str`` parameters are passed - into :func:`inspect.get_annotations()` when resolving the - annotations; see the documentation for :func:`inspect.get_annotations()` + :func:`get_annotations`. The + *globals*, *locals*, and *eval_str* parameters are passed + into :func:`get_annotations` when resolving the + annotations; see the documentation for :func:`get_annotations` for instructions on how to use these parameters. Raises :exc:`ValueError` if no signature can be provided, and :exc:`TypeError` if that type of object is not supported. Also, - if the annotations are stringized, and ``eval_str`` is not false, - the ``eval()`` call(s) to un-stringize the annotations could - potentially raise any kind of exception. + if the annotations are stringized, and *eval_str* is not false, + the ``eval()`` call(s) to un-stringize the annotations in :func:`get_annotations` + could potentially raise any kind of exception. A slash(/) in the signature of a function denotes that the parameters prior to it are positional-only. For more info, see :ref:`the FAQ entry on positional-only parameters `. - .. versionadded:: 3.5 - ``follow_wrapped`` parameter. Pass ``False`` to get a signature of - ``callable`` specifically (``callable.__wrapped__`` will not be used to + .. versionchanged:: 3.5 + The *follow_wrapped* parameter was added. + Pass ``False`` to get a signature of + *callable* specifically (``callable.__wrapped__`` will not be used to unwrap decorated callables.) - .. versionadded:: 3.10 - ``globals``, ``locals``, and ``eval_str`` parameters. + .. versionchanged:: 3.10 + The *globals*, *locals*, and *eval_str* parameters were added. .. note:: @@ -673,10 +727,18 @@ function. Python. For example, in CPython, some built-in functions defined in C provide no metadata about their arguments. + .. impl-detail:: + + If the passed object has a :attr:`!__signature__` attribute, + we may use it to create the signature. + The exact semantics are an implementation detail and are subject to + unannounced changes. Consult the source code for current semantics. + .. class:: Signature(parameters=None, *, return_annotation=Signature.empty) - A Signature object represents the call signature of a function and its return + A :class:`!Signature` object represents the call signature of a function + and its return annotation. For each parameter accepted by the function it stores a :class:`Parameter` object in its :attr:`parameters` collection. @@ -686,14 +748,14 @@ function. positional-only first, then positional-or-keyword, and that parameters with defaults follow parameters without defaults. - The optional *return_annotation* argument, can be an arbitrary Python object, - is the "return" annotation of the callable. + The optional *return_annotation* argument can be an arbitrary Python object. + It represents the "return" annotation of the callable. - Signature objects are *immutable*. Use :meth:`Signature.replace` to make a - modified copy. + :class:`!Signature` objects are *immutable*. Use :meth:`Signature.replace` or + :func:`copy.replace` to make a modified copy. .. versionchanged:: 3.5 - Signature objects are picklable and :term:`hashable`. + :class:`!Signature` objects are now picklable and :term:`hashable`. .. attribute:: Signature.empty @@ -730,13 +792,15 @@ function. .. method:: Signature.replace(*[, parameters][, return_annotation]) - Create a new Signature instance based on the instance :meth:`replace` was invoked - on. It is possible to pass different ``parameters`` and/or - ``return_annotation`` to override the corresponding properties of the base - signature. To remove return_annotation from the copied Signature, pass in + Create a new :class:`Signature` instance based on the instance + :meth:`replace` was invoked on. + It is possible to pass different *parameters* and/or + *return_annotation* to override the corresponding properties of the base + signature. To remove ``return_annotation`` from the copied + :class:`!Signature`, pass in :attr:`Signature.empty`. - :: + .. doctest:: >>> def test(a, b): ... pass @@ -746,33 +810,50 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" - .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True, globalns=None, localns=None) + :class:`Signature` objects are also supported by the generic function + :func:`copy.replace`. + + .. method:: format(*, max_width=None) + + Create a string representation of the :class:`Signature` object. + + If *max_width* is passed, the method will attempt to fit + the signature into lines of at most *max_width* characters. + If the signature is longer than *max_width*, + all parameters will be on separate lines. + + .. versionadded:: 3.13 + + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False) Return a :class:`Signature` (or its subclass) object for a given callable - ``obj``. Pass ``follow_wrapped=False`` to get a signature of ``obj`` - without unwrapping its ``__wrapped__`` chain. ``globalns`` and - ``localns`` will be used as the namespaces when resolving annotations. + *obj*. + + This method simplifies subclassing of :class:`Signature`: - This method simplifies subclassing of :class:`Signature`:: + .. testcode:: - class MySignature(Signature): - pass - sig = MySignature.from_callable(min) - assert isinstance(sig, MySignature) + class MySignature(Signature): + pass + sig = MySignature.from_callable(sum) + assert isinstance(sig, MySignature) + + Its behavior is otherwise identical to that of :func:`signature`. .. versionadded:: 3.5 - .. versionadded:: 3.10 - ``globalns`` and ``localns`` parameters. + .. versionchanged:: 3.10 + The *globals*, *locals*, and *eval_str* parameters were added. .. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) - Parameter objects are *immutable*. Instead of modifying a Parameter object, - you can use :meth:`Parameter.replace` to create a modified copy. + :class:`!Parameter` objects are *immutable*. + Instead of modifying a :class:`!Parameter` object, + you can use :meth:`Parameter.replace` or :func:`copy.replace` to create a modified copy. .. versionchanged:: 3.5 - Parameter objects are picklable and :term:`hashable`. + Parameter objects are now picklable and :term:`hashable`. .. attribute:: Parameter.empty @@ -791,7 +872,7 @@ function. expressions. .. versionchanged:: 3.6 - These parameter names are exposed by this module as names like + These parameter names are now exposed by this module as names like ``implicit0``. .. attribute:: Parameter.default @@ -841,7 +922,9 @@ function. | | definition. | +------------------------+----------------------------------------------+ - Example: print all keyword-only arguments without default values:: + Example: print all keyword-only arguments without default values: + + .. doctest:: >>> def foo(a, b, *, c, d=10): ... pass @@ -855,11 +938,13 @@ function. .. attribute:: Parameter.kind.description - Describes a enum value of Parameter.kind. + Describes an enum value of :attr:`Parameter.kind`. .. versionadded:: 3.8 - Example: print all descriptions of arguments:: + Example: print all descriptions of arguments: + + .. doctest:: >>> def foo(a, b, *, c, d=10): ... pass @@ -874,12 +959,12 @@ function. .. method:: Parameter.replace(*[, name][, kind][, default][, annotation]) - Create a new Parameter instance based on the instance replaced was invoked - on. To override a :class:`Parameter` attribute, pass the corresponding + Create a new :class:`Parameter` instance based on the instance replaced was invoked + on. To override a :class:`!Parameter` attribute, pass the corresponding argument. To remove a default value or/and an annotation from a - Parameter, pass :attr:`Parameter.empty`. + :class:`!Parameter`, pass :attr:`Parameter.empty`. - :: + .. doctest:: >>> from inspect import Parameter >>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42) @@ -890,10 +975,13 @@ function. 'foo=42' >>> str(param.replace(default=Parameter.empty, annotation='spam')) - "foo:'spam'" + "foo: 'spam'" + + :class:`Parameter` objects are also supported by the generic function + :func:`copy.replace`. .. versionchanged:: 3.4 - In Python 3.3 Parameter objects were allowed to have ``name`` set + In Python 3.3 :class:`Parameter` objects were allowed to have ``name`` set to ``None`` if their ``kind`` was set to ``POSITIONAL_ONLY``. This is no longer permitted. @@ -930,7 +1018,8 @@ function. .. attribute:: BoundArguments.kwargs A dict of keyword arguments values. Dynamically computed from the - :attr:`arguments` attribute. + :attr:`arguments` attribute. Arguments that can be passed positionally + are included in :attr:`args` instead. .. attribute:: BoundArguments.signature @@ -946,18 +1035,20 @@ function. For variable-keyword arguments (``**kwargs``) the default is an empty dict. - :: + .. doctest:: - >>> def foo(a, b='ham', *args): pass - >>> ba = inspect.signature(foo).bind('spam') - >>> ba.apply_defaults() - >>> ba.arguments - {'a': 'spam', 'b': 'ham', 'args': ()} + >>> def foo(a, b='ham', *args): pass + >>> ba = inspect.signature(foo).bind('spam') + >>> ba.apply_defaults() + >>> ba.arguments + {'a': 'spam', 'b': 'ham', 'args': ()} .. versionadded:: 3.5 The :attr:`args` and :attr:`kwargs` properties can be used to invoke - functions:: + functions: + + .. testcode:: def test(a, *, b): ... @@ -1076,20 +1167,22 @@ Classes and functions ``**`` arguments, if any) to their values from *args* and *kwds*. In case of invoking *func* incorrectly, i.e. whenever ``func(*args, **kwds)`` would raise an exception because of incompatible signature, an exception of the same type - and the same or similar message is raised. For example:: - - >>> from inspect import getcallargs - >>> def f(a, b=1, *pos, **named): - ... pass - ... - >>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)} - True - >>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()} - True - >>> getcallargs(f) - Traceback (most recent call last): - ... - TypeError: f() missing 1 required positional argument: 'a' + and the same or similar message is raised. For example: + + .. doctest:: + + >>> from inspect import getcallargs + >>> def f(a, b=1, *pos, **named): + ... pass + ... + >>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)} + True + >>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()} + True + >>> getcallargs(f) + Traceback (most recent call last): + ... + TypeError: f() missing 1 required positional argument: 'a' .. versionadded:: 3.2 @@ -1144,7 +1237,7 @@ Classes and functions This function handles several details for you: * If ``eval_str`` is true, values of type ``str`` will - be un-stringized using :func:`eval()`. This is intended + be un-stringized using :func:`eval`. This is intended for use with stringized annotations (``from __future__ import annotations``). * If ``obj`` doesn't have an annotations dict, returns an @@ -1158,16 +1251,16 @@ Classes and functions * Always, always, always returns a freshly created dict. ``eval_str`` controls whether or not values of type ``str`` are replaced - with the result of calling :func:`eval()` on those values: + with the result of calling :func:`eval` on those values: - * If eval_str is true, :func:`eval()` is called on values of type ``str``. - (Note that ``get_annotations`` doesn't catch exceptions; if :func:`eval()` + * If eval_str is true, :func:`eval` is called on values of type ``str``. + (Note that ``get_annotations`` doesn't catch exceptions; if :func:`eval` raises an exception, it will unwind the stack past the ``get_annotations`` call.) * If eval_str is false (the default), values of type ``str`` are unchanged. - ``globals`` and ``locals`` are passed in to :func:`eval()`; see the documentation - for :func:`eval()` for more information. If ``globals`` or ``locals`` + ``globals`` and ``locals`` are passed in to :func:`eval`; see the documentation + for :func:`eval` for more information. If ``globals`` or ``locals`` is ``None``, this function may replace that value with a context-specific default, contingent on ``type(obj)``: @@ -1175,9 +1268,10 @@ Classes and functions * If ``obj`` is a class, ``globals`` defaults to ``sys.modules[obj.__module__].__dict__`` and ``locals`` defaults to the ``obj`` class namespace. - * If ``obj`` is a callable, ``globals`` defaults to ``obj.__globals__``, + * If ``obj`` is a callable, ``globals`` defaults to + :attr:`obj.__globals__ `, although if ``obj`` is a wrapped function (using - ``functools.update_wrapper()``) it is first unwrapped. + :func:`functools.update_wrapper`) it is first unwrapped. Calling ``get_annotations`` is best practice for accessing the annotations dict of any object. See :ref:`annotations-howto` for @@ -1391,7 +1485,8 @@ Fetching attributes statically Both :func:`getattr` and :func:`hasattr` can trigger code execution when fetching or checking for the existence of attributes. Descriptors, like -properties, will be invoked and :meth:`__getattr__` and :meth:`__getattribute__` +properties, will be invoked and :meth:`~object.__getattr__` and +:meth:`~object.__getattribute__` may be called. For cases where you want passive introspection, like documentation tools, this @@ -1401,7 +1496,8 @@ but avoids executing code when it fetches attributes. .. function:: getattr_static(obj, attr, default=None) Retrieve attributes without triggering dynamic lookup via the - descriptor protocol, :meth:`__getattr__` or :meth:`__getattribute__`. + descriptor protocol, :meth:`~object.__getattr__` + or :meth:`~object.__getattribute__`. Note: this function may not be able to retrieve all attributes that getattr can fetch (like dynamically created attributes) @@ -1458,10 +1554,11 @@ generator to be determined easily. Get current state of a generator-iterator. Possible states are: - * GEN_CREATED: Waiting to start execution. - * GEN_RUNNING: Currently being executed by the interpreter. - * GEN_SUSPENDED: Currently suspended at a yield expression. - * GEN_CLOSED: Execution has completed. + + * GEN_CREATED: Waiting to start execution. + * GEN_RUNNING: Currently being executed by the interpreter. + * GEN_SUSPENDED: Currently suspended at a yield expression. + * GEN_CLOSED: Execution has completed. .. versionadded:: 3.2 @@ -1473,10 +1570,11 @@ generator to be determined easily. ``cr_frame`` attributes. Possible states are: - * CORO_CREATED: Waiting to start execution. - * CORO_RUNNING: Currently being executed by the interpreter. - * CORO_SUSPENDED: Currently suspended at an await expression. - * CORO_CLOSED: Execution has completed. + + * CORO_CREATED: Waiting to start execution. + * CORO_RUNNING: Currently being executed by the interpreter. + * CORO_SUSPENDED: Currently suspended at an await expression. + * CORO_CLOSED: Execution has completed. .. versionadded:: 3.5 @@ -1489,10 +1587,11 @@ generator to be determined easily. ``ag_running`` and ``ag_frame`` attributes. Possible states are: - * AGEN_CREATED: Waiting to start execution. - * AGEN_RUNNING: Currently being executed by the interpreter. - * AGEN_SUSPENDED: Currently suspended at a yield expression. - * AGEN_CLOSED: Execution has completed. + + * AGEN_CREATED: Waiting to start execution. + * AGEN_RUNNING: Currently being executed by the interpreter. + * AGEN_SUSPENDED: Currently suspended at a yield expression. + * AGEN_CLOSED: Execution has completed. .. versionadded:: 3.12 @@ -1541,8 +1640,8 @@ updated as expected: Code Objects Bit Flags ---------------------- -Python code objects have a ``co_flags`` attribute, which is a bitmap of -the following flags: +Python code objects have a :attr:`~codeobject.co_flags` attribute, +which is a bitmap of the following flags: .. data:: CO_OPTIMIZED @@ -1550,8 +1649,8 @@ the following flags: .. data:: CO_NEWLOCALS - If set, a new dict will be created for the frame's ``f_locals`` when - the code object is executed. + If set, a new dict will be created for the frame's :attr:`~frame.f_locals` + when the code object is executed. .. data:: CO_VARARGS @@ -1650,6 +1749,6 @@ By default, accepts the name of a module and prints the source of that module. A class or function within the module can be printed instead by appended a colon and the qualified name of the target object. -.. cmdoption:: --details +.. option:: --details Print information about the specified object rather than the source code diff --git a/Doc/library/intro.rst b/Doc/library/intro.rst index 5a4c9b8b..8f76044b 100644 --- a/Doc/library/intro.rst +++ b/Doc/library/intro.rst @@ -58,7 +58,7 @@ Notes on availability operating system. * If not separately noted, all functions that claim "Availability: Unix" are - supported on macOS, which builds on a Unix core. + supported on macOS, iOS and Android, all of which build on a Unix core. * If an availability note contains both a minimum Kernel version and a minimum libc version, then both conditions must hold. For example a feature with note @@ -119,3 +119,58 @@ DOM APIs as well as limited networking capabilities with JavaScript's .. _wasmtime: https://wasmtime.dev/ .. _Pyodide: https://pyodide.org/ .. _PyScript: https://pyscript.net/ + +.. _mobile-availability: +.. _iOS-availability: + +Mobile platforms +---------------- + +Android and iOS are, in most respects, POSIX operating systems. File I/O, socket handling, +and threading all behave as they would on any POSIX operating system. However, +there are several major differences: + +* Mobile platforms can only use Python in "embedded" mode. There is no Python + REPL, and no ability to use separate executables such as :program:`python` or + :program:`pip`. To add Python code to your mobile app, you must use + the :ref:`Python embedding API `. For more details, see + :ref:`using-android` and :ref:`using-ios`. + +* Subprocesses: + + * On Android, creating subprocesses is possible but `officially unsupported + `__. + In particular, Android does not support any part of the System V IPC API, + so :mod:`multiprocessing` is not available. + + * An iOS app cannot use any form of subprocessing, multiprocessing, or + inter-process communication. If an iOS app attempts to create a subprocess, + the process creating the subprocess will either lock up, or crash. An iOS app + has no visibility of other applications that are running, nor any ability to + communicate with other running applications, outside of the iOS-specific APIs + that exist for this purpose. + +* Mobile apps have limited access to modify system resources (such as the system + clock). These resources will often be *readable*, but attempts to modify + those resources will usually fail. + +* Console input and output: + + * On Android, the native ``stdout`` and ``stderr`` are not connected to + anything, so Python installs its own streams which redirect messages to the + system log. These can be seen under the tags ``python.stdout`` and + ``python.stderr`` respectively. + + * iOS apps have a limited concept of console output. ``stdout`` and + ``stderr`` *exist*, and content written to ``stdout`` and ``stderr`` will be + visible in logs when running in Xcode, but this content *won't* be recorded + in the system log. If a user who has installed your app provides their app + logs as a diagnostic aid, they will not include any detail written to + ``stdout`` or ``stderr``. + + * Mobile apps have no usable ``stdin`` at all. While apps can display an on-screen + keyboard, this is a software feature, not something that is attached to + ``stdin``. + + As a result, Python modules that involve console manipulation (such as + :mod:`curses` and :mod:`readline`) are not available on mobile platforms. diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 01088879..f793d7a7 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -1,5 +1,5 @@ -:mod:`io` --- Core tools for working with streams -================================================= +:mod:`!io` --- Core tools for working with streams +================================================== .. module:: io :synopsis: Core tools for working with streams. @@ -55,7 +55,7 @@ the backing store is natively made of bytes (such as in the case of a file), encoding and decoding of data is made transparently as well as optional translation of platform-specific newline characters. -The easiest way to create a text stream is with :meth:`open()`, optionally +The easiest way to create a text stream is with :meth:`open`, optionally specifying an encoding:: f = open("myfile.txt", "r", encoding="utf-8") @@ -77,7 +77,7 @@ objects. No encoding, decoding, or newline translation is performed. This category of streams can be used for all kinds of non-text data, and also when manual control over the handling of text data is desired. -The easiest way to create a binary stream is with :meth:`open()` with ``'b'`` in +The easiest way to create a binary stream is with :meth:`open` with ``'b'`` in the mode string:: f = open("myfile.jpg", "rb") @@ -253,12 +253,12 @@ The implementation of I/O streams is organized as a hierarchy of classes. First specify the various categories of streams, then concrete classes providing the standard stream implementations. - .. note:: +.. note:: - The abstract base classes also provide default implementations of some - methods in order to help implementation of concrete stream classes. For - example, :class:`BufferedIOBase` provides unoptimized implementations of - :meth:`!readinto` and :meth:`!readline`. + The abstract base classes also provide default implementations of some + methods in order to help implementation of concrete stream classes. For + example, :class:`BufferedIOBase` provides unoptimized implementations of + :meth:`!readinto` and :meth:`!readline`. At the top of the I/O hierarchy is the abstract base class :class:`IOBase`. It defines the basic interface to a stream. Note, however, that there is no @@ -466,7 +466,7 @@ I/O Base Classes .. class:: RawIOBase - Base class for raw binary streams. It inherits :class:`IOBase`. + Base class for raw binary streams. It inherits from :class:`IOBase`. Raw binary streams typically provide low-level access to an underlying OS device or API, and do not try to encapsulate it in high-level primitives @@ -519,7 +519,7 @@ I/O Base Classes .. class:: BufferedIOBase Base class for binary streams that support some kind of buffering. - It inherits :class:`IOBase`. + It inherits from :class:`IOBase`. The main difference with :class:`RawIOBase` is that methods :meth:`read`, :meth:`readinto` and :meth:`write` will try (respectively) to read as much @@ -633,7 +633,7 @@ Raw File I/O .. class:: FileIO(name, mode='r', closefd=True, opener=None) A raw binary stream representing an OS-level file containing bytes data. It - inherits :class:`RawIOBase`. + inherits from :class:`RawIOBase`. The *name* can be one of two things: @@ -696,7 +696,7 @@ than raw I/O does. .. class:: BytesIO(initial_bytes=b'') - A binary stream using an in-memory bytes buffer. It inherits + A binary stream using an in-memory bytes buffer. It inherits from :class:`BufferedIOBase`. The buffer is discarded when the :meth:`~IOBase.close` method is called. @@ -745,7 +745,7 @@ than raw I/O does. .. class:: BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE) A buffered binary stream providing higher-level access to a readable, non - seekable :class:`RawIOBase` raw binary stream. It inherits + seekable :class:`RawIOBase` raw binary stream. It inherits from :class:`BufferedIOBase`. When reading data from this object, a larger amount of data may be @@ -783,7 +783,7 @@ than raw I/O does. .. class:: BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) A buffered binary stream providing higher-level access to a writeable, non - seekable :class:`RawIOBase` raw binary stream. It inherits + seekable :class:`RawIOBase` raw binary stream. It inherits from :class:`BufferedIOBase`. When writing to this object, data is normally placed into an internal @@ -818,7 +818,7 @@ than raw I/O does. .. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) A buffered binary stream providing higher-level access to a seekable - :class:`RawIOBase` raw binary stream. It inherits :class:`BufferedReader` + :class:`RawIOBase` raw binary stream. It inherits from :class:`BufferedReader` and :class:`BufferedWriter`. The constructor creates a reader and writer for a seekable raw stream, given @@ -834,7 +834,7 @@ than raw I/O does. A buffered binary stream providing higher-level access to two non seekable :class:`RawIOBase` raw binary streams---one readable, the other writeable. - It inherits :class:`BufferedIOBase`. + It inherits from :class:`BufferedIOBase`. *reader* and *writer* are :class:`RawIOBase` objects that are readable and writeable respectively. If the *buffer_size* is omitted it defaults to @@ -857,7 +857,7 @@ Text I/O .. class:: TextIOBase Base class for text streams. This class provides a character and line based - interface to stream I/O. It inherits :class:`IOBase`. + interface to stream I/O. It inherits from :class:`IOBase`. :class:`TextIOBase` provides or overrides these data attributes and methods in addition to those from :class:`IOBase`: @@ -946,11 +946,11 @@ Text I/O line_buffering=False, write_through=False) A buffered text stream providing higher-level access to a - :class:`BufferedIOBase` buffered binary stream. It inherits + :class:`BufferedIOBase` buffered binary stream. It inherits from :class:`TextIOBase`. *encoding* gives the name of the encoding that the stream will be decoded or - encoded with. It defaults to :func:`locale.getencoding()`. + encoded with. It defaults to :func:`locale.getencoding`. ``encoding="locale"`` can be used to specify the current locale's encoding explicitly. See :ref:`io-text-encoding` for more information. @@ -1073,7 +1073,7 @@ Text I/O .. class:: StringIO(initial_value='', newline='\n') - A text stream using an in-memory text buffer. It inherits + A text stream using an in-memory text buffer. It inherits from :class:`TextIOBase`. The text buffer is discarded when the :meth:`~IOBase.close` method is @@ -1124,7 +1124,7 @@ Text I/O .. class:: IncrementalNewlineDecoder A helper codec that decodes newlines for :term:`universal newlines` mode. - It inherits :class:`codecs.IncrementalDecoder`. + It inherits from :class:`codecs.IncrementalDecoder`. Performance @@ -1182,7 +1182,7 @@ re-enter a buffered object which it is already accessing, a :exc:`RuntimeError` is raised. Note this doesn't prohibit a different thread from entering the buffered object. -The above implicitly extends to text files, since the :func:`open()` function +The above implicitly extends to text files, since the :func:`open` function will wrap a buffered object inside a :class:`TextIOWrapper`. This includes -standard streams and therefore affects the built-in :func:`print()` function as +standard streams and therefore affects the built-in :func:`print` function as well. diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 9c2dff55..be579458 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -1,5 +1,5 @@ -:mod:`ipaddress` --- IPv4/IPv6 manipulation library -=================================================== +:mod:`!ipaddress` --- IPv4/IPv6 manipulation library +==================================================== .. module:: ipaddress :synopsis: IPv4/IPv6 manipulation library. @@ -121,22 +121,12 @@ write code that handles both IP versions correctly. Address objects are Leading zeros are tolerated, even in ambiguous cases that look like octal notation. - .. versionchanged:: 3.10 + .. versionchanged:: 3.9.5 Leading zeros are no longer tolerated and are treated as an error. IPv4 address strings are now parsed as strict as glibc :func:`~socket.inet_pton`. - .. versionchanged:: 3.9.5 - - The above change was also included in Python 3.9 starting with - version 3.9.5. - - .. versionchanged:: 3.8.12 - - The above change was also included in Python 3.8 starting with - version 3.8.12. - .. attribute:: version The appropriate version number: ``4`` for IPv4, ``6`` for IPv6. @@ -188,18 +178,53 @@ write code that handles both IP versions correctly. Address objects are .. attribute:: is_private - ``True`` if the address is allocated for private networks. See + ``True`` if the address is defined as not globally reachable by iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ - (for IPv6). + (for IPv6) with the following exceptions: + + * ``is_private`` is ``False`` for the shared address space (``100.64.0.0/10``) + * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + + address.is_private == address.ipv4_mapped.is_private + + ``is_private`` has value opposite to :attr:`is_global`, except for the shared address space + (``100.64.0.0/10`` range) where they are both ``False``. + + .. versionchanged:: 3.13 + + Fixed some false positives and false negatives. + + * ``192.0.0.0/24`` is considered private with the exception of ``192.0.0.9/32`` and + ``192.0.0.10/32`` (previously: only the ``192.0.0.0/29`` sub-range was considered private). + * ``64:ff9b:1::/48`` is considered private. + * ``2002::/16`` is considered private. + * There are exceptions within ``2001::/23`` (otherwise considered private): ``2001:1::1/128``, + ``2001:1::2/128``, ``2001:3::/32``, ``2001:4:112::/48``, ``2001:20::/28``, ``2001:30::/28``. + The exceptions are not considered private. .. attribute:: is_global - ``True`` if the address is allocated for public networks. See + ``True`` if the address is defined as globally reachable by iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ - (for IPv6). + (for IPv6) with the following exception: + + For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + + address.is_global == address.ipv4_mapped.is_global + + ``is_global`` has value opposite to :attr:`is_private`, except for the shared address space + (``100.64.0.0/10`` range) where they are both ``False``. .. versionadded:: 3.4 + .. versionchanged:: 3.13 + + Fixed some false positives and false negatives, see :attr:`is_private` for details. + .. attribute:: is_unspecified ``True`` if the address is unspecified. See :RFC:`5735` (for IPv4) @@ -219,6 +244,13 @@ write code that handles both IP versions correctly. Address objects are ``True`` if the address is reserved for link-local usage. See :RFC:`3927`. + .. attribute:: ipv6_mapped + + :class:`IPv4Address` object representing the IPv4-mapped IPv6 address. See :RFC:`4291`. + + .. versionadded:: 3.13 + + .. _iana-ipv4-special-registry: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml .. _iana-ipv6-special-registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml @@ -302,14 +334,14 @@ write code that handles both IP versions correctly. Address objects are .. attribute:: is_multicast .. attribute:: is_private .. attribute:: is_global + + .. versionadded:: 3.4 + .. attribute:: is_unspecified .. attribute:: is_reserved .. attribute:: is_loopback .. attribute:: is_link_local - .. versionadded:: 3.4 - is_global - .. attribute:: is_site_local ``True`` if the address is reserved for site-local usage. Note that @@ -958,7 +990,7 @@ The module also provides the following module level functions: .. function:: collapse_addresses(addresses) Return an iterator of the collapsed :class:`IPv4Network` or - :class:`IPv6Network` objects. *addresses* is an iterator of + :class:`IPv6Network` objects. *addresses* is an :term:`iterable` of :class:`IPv4Network` or :class:`IPv6Network` objects. A :exc:`TypeError` is raised if *addresses* contains mixed version objects. @@ -978,7 +1010,7 @@ The module also provides the following module level functions: doesn't make sense. There are some times however, where you may wish to have :mod:`ipaddress` sort these anyway. If you need to do this, you can use - this function as the *key* argument to :func:`sorted()`. + this function as the *key* argument to :func:`sorted`. *obj* is either a network or address object. diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 8a1c83aa..79b729e3 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -1,5 +1,5 @@ -:mod:`itertools` --- Functions creating iterators for efficient looping -======================================================================= +:mod:`!itertools` --- Functions creating iterators for efficient looping +======================================================================== .. module:: itertools :synopsis: Functions creating iterators for efficient looping. @@ -41,9 +41,9 @@ operator can be mapped across two vectors to form an efficient dot-product: ================== ================= ================================================= ========================================= Iterator Arguments Results Example ================== ================= ================================================= ========================================= -:func:`count` start, [step] start, start+step, start+2*step, ... ``count(10) --> 10 11 12 13 14 ...`` -:func:`cycle` p p0, p1, ... plast, p0, p1, ... ``cycle('ABCD') --> A B C D A B C D ...`` -:func:`repeat` elem [,n] elem, elem, elem, ... endlessly or up to n times ``repeat(10, 3) --> 10 10 10`` +:func:`count` [start[, step]] start, start+step, start+2*step, ... ``count(10) → 10 11 12 13 14 ...`` +:func:`cycle` p p0, p1, ... plast, p0, p1, ... ``cycle('ABCD') → A B C D A B C D ...`` +:func:`repeat` elem [,n] elem, elem, elem, ... endlessly or up to n times ``repeat(10, 3) → 10 10 10`` ================== ================= ================================================= ========================================= **Iterators terminating on the shortest input sequence:** @@ -51,20 +51,20 @@ Iterator Arguments Results ============================ ============================ ================================================= ============================================================= Iterator Arguments Results Example ============================ ============================ ================================================= ============================================================= -:func:`accumulate` p [,func] p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) --> 1 3 6 10 15`` -:func:`batched` p, n (p0, p1, ..., p_n-1), ... ``batched('ABCDEFG', n=3) --> ABC DEF G`` -:func:`chain` p, q, ... p0, p1, ... plast, q0, q1, ... ``chain('ABC', 'DEF') --> A B C D E F`` -:func:`chain.from_iterable` iterable p0, p1, ... plast, q0, q1, ... ``chain.from_iterable(['ABC', 'DEF']) --> A B C D E F`` -:func:`compress` data, selectors (d[0] if s[0]), (d[1] if s[1]), ... ``compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F`` -:func:`dropwhile` pred, seq seq[n], seq[n+1], starting when pred fails ``dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1`` -:func:`filterfalse` pred, seq elements of seq where pred(elem) is false ``filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8`` -:func:`groupby` iterable[, key] sub-iterators grouped by value of key(v) -:func:`islice` seq, [start,] stop [, step] elements from seq[start:stop:step] ``islice('ABCDEFG', 2, None) --> C D E F G`` -:func:`pairwise` iterable (p[0], p[1]), (p[1], p[2]) ``pairwise('ABCDEFG') --> AB BC CD DE EF FG`` -:func:`starmap` func, seq func(\*seq[0]), func(\*seq[1]), ... ``starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000`` -:func:`takewhile` pred, seq seq[0], seq[1], until pred fails ``takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4`` +:func:`accumulate` p [,func] p0, p0+p1, p0+p1+p2, ... ``accumulate([1,2,3,4,5]) → 1 3 6 10 15`` +:func:`batched` p, n (p0, p1, ..., p_n-1), ... ``batched('ABCDEFG', n=3) → ABC DEF G`` +:func:`chain` p, q, ... p0, p1, ... plast, q0, q1, ... ``chain('ABC', 'DEF') → A B C D E F`` +:func:`chain.from_iterable` iterable p0, p1, ... plast, q0, q1, ... ``chain.from_iterable(['ABC', 'DEF']) → A B C D E F`` +:func:`compress` data, selectors (d[0] if s[0]), (d[1] if s[1]), ... ``compress('ABCDEF', [1,0,1,0,1,1]) → A C E F`` +:func:`dropwhile` predicate, seq seq[n], seq[n+1], starting when predicate fails ``dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8`` +:func:`filterfalse` predicate, seq elements of seq where predicate(elem) fails ``filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8`` +:func:`groupby` iterable[, key] sub-iterators grouped by value of key(v) ``groupby(['A','B','DEF'], len) → (1, A B) (3, DEF)`` +:func:`islice` seq, [start,] stop [, step] elements from seq[start:stop:step] ``islice('ABCDEFG', 2, None) → C D E F G`` +:func:`pairwise` iterable (p[0], p[1]), (p[1], p[2]) ``pairwise('ABCDEFG') → AB BC CD DE EF FG`` +:func:`starmap` func, seq func(\*seq[0]), func(\*seq[1]), ... ``starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000`` +:func:`takewhile` predicate, seq seq[0], seq[1], until predicate fails ``takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4`` :func:`tee` it, n it1, it2, ... itn splits one iterator into n -:func:`zip_longest` p, q, ... (p[0], q[0]), (p[1], q[1]), ... ``zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-`` +:func:`zip_longest` p, q, ... (p[0], q[0]), (p[1], q[1]), ... ``zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D-`` ============================ ============================ ================================================= ============================================================= **Combinatoric iterators:** @@ -84,72 +84,71 @@ Examples Results ``product('ABCD', repeat=2)`` ``AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD`` ``permutations('ABCD', 2)`` ``AB AC AD BA BC BD CA CB CD DA DB DC`` ``combinations('ABCD', 2)`` ``AB AC AD BC BD CD`` -``combinations_with_replacement('ABCD', 2)`` ``AA AB AC AD BB BC BD CC CD DD`` +``combinations_with_replacement('ABCD', 2)`` ``AA AB AC AD BB BC BD CC CD DD`` ============================================== ============================================================= .. _itertools-functions: -Itertool functions +Itertool Functions ------------------ -The following module functions all construct and return iterators. Some provide +The following functions all construct and return iterators. Some provide streams of infinite length, so they should only be accessed by functions or loops that truncate the stream. -.. function:: accumulate(iterable[, func, *, initial=None]) - Make an iterator that returns accumulated sums, or accumulated - results of other binary functions (specified via the optional - *func* argument). +.. function:: accumulate(iterable[, function, *, initial=None]) - If *func* is supplied, it should be a function - of two arguments. Elements of the input *iterable* may be any type - that can be accepted as arguments to *func*. (For example, with - the default operation of addition, elements may be any addable - type including :class:`~decimal.Decimal` or - :class:`~fractions.Fraction`.) + Make an iterator that returns accumulated sums or accumulated + results from other binary functions. - Usually, the number of elements output matches the input iterable. - However, if the keyword argument *initial* is provided, the - accumulation leads off with the *initial* value so that the output - has one more element than the input iterable. + The *function* defaults to addition. The *function* should accept + two arguments, an accumulated total and a value from the *iterable*. + + If an *initial* value is provided, the accumulation will start with + that value and the output will have one more element than the input + iterable. Roughly equivalent to:: - def accumulate(iterable, func=operator.add, *, initial=None): + def accumulate(iterable, function=operator.add, *, initial=None): 'Return running totals' - # accumulate([1,2,3,4,5]) --> 1 3 6 10 15 - # accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115 - # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120 - it = iter(iterable) + # accumulate([1,2,3,4,5]) → 1 3 6 10 15 + # accumulate([1,2,3,4,5], initial=100) → 100 101 103 106 110 115 + # accumulate([1,2,3,4,5], operator.mul) → 1 2 6 24 120 + + iterator = iter(iterable) total = initial if initial is None: try: - total = next(it) + total = next(iterator) except StopIteration: return + yield total - for element in it: - total = func(total, element) + for element in iterator: + total = function(total, element) yield total - There are a number of uses for the *func* argument. It can be set to - :func:`min` for a running minimum, :func:`max` for a running maximum, or - :func:`operator.mul` for a running product. Amortization tables can be - built by accumulating interest and applying payments: + To compute a running minimum, set *function* to :func:`min`. + For a running maximum, set *function* to :func:`max`. + Or for a running product, set *function* to :func:`operator.mul`. + To build an `amortization table + `_, + accumulate the interest and apply payments: .. doctest:: >>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8] - >>> list(accumulate(data, operator.mul)) # running product - [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] >>> list(accumulate(data, max)) # running maximum [3, 4, 6, 6, 6, 9, 9, 9, 9, 9] + >>> list(accumulate(data, operator.mul)) # running product + [3, 12, 72, 144, 144, 1296, 0, 0, 0, 0] # Amortize a 5% loan of 1000 with 10 annual payments of 90 - >>> account_update = lambda bal, pmt: round(bal * 1.05) + pmt - >>> list(accumulate(repeat(-90, 10), account_update, initial=1_000)) + >>> update = lambda balance, payment: round(balance * 1.05) - payment + >>> list(accumulate(repeat(90, 10), update, initial=1_000)) [1000, 960, 918, 874, 828, 779, 728, 674, 618, 559, 497] See :func:`functools.reduce` for a similar function that returns only the @@ -158,17 +157,20 @@ loops that truncate the stream. .. versionadded:: 3.2 .. versionchanged:: 3.3 - Added the optional *func* parameter. + Added the optional *function* parameter. .. versionchanged:: 3.8 Added the optional *initial* parameter. -.. function:: batched(iterable, n) +.. function:: batched(iterable, n, *, strict=False) Batch data from the *iterable* into tuples of length *n*. The last batch may be shorter than *n*. + If *strict* is true, will raise a :exc:`ValueError` if the final + batch is shorter than *n*. + Loops over the input iterable and accumulates data into tuples up to size *n*. The input is consumed lazily, just enough to fill a batch. The result is yielded as soon as the batch is full or when the input @@ -181,38 +183,35 @@ loops that truncate the stream. >>> unflattened [('roses', 'red'), ('violets', 'blue'), ('sugar', 'sweet')] - >>> for batch in batched('ABCDEFG', 3): - ... print(batch) - ... - ('A', 'B', 'C') - ('D', 'E', 'F') - ('G',) - Roughly equivalent to:: - def batched(iterable, n): - # batched('ABCDEFG', 3) --> ABC DEF G + def batched(iterable, n, *, strict=False): + # batched('ABCDEFG', 3) → ABC DEF G if n < 1: raise ValueError('n must be at least one') - it = iter(iterable) - while batch := tuple(islice(it, n)): + iterator = iter(iterable) + while batch := tuple(islice(iterator, n)): + if strict and len(batch) != n: + raise ValueError('batched(): incomplete batch') yield batch .. versionadded:: 3.12 + .. versionchanged:: 3.13 + Added the *strict* option. + .. function:: chain(*iterables) - Make an iterator that returns elements from the first iterable until it is - exhausted, then proceeds to the next iterable, until all of the iterables are - exhausted. Used for treating consecutive sequences as a single sequence. - Roughly equivalent to:: + Make an iterator that returns elements from the first iterable until + it is exhausted, then proceeds to the next iterable, until all of the + iterables are exhausted. This combines multiple data sources into a + single iterator. Roughly equivalent to:: def chain(*iterables): - # chain('ABC', 'DEF') --> A B C D E F - for it in iterables: - for element in it: - yield element + # chain('ABC', 'DEF') → A B C D E F + for iterable in iterables: + yield from iterable .. classmethod:: chain.from_iterable(iterable) @@ -221,34 +220,40 @@ loops that truncate the stream. single iterable argument that is evaluated lazily. Roughly equivalent to:: def from_iterable(iterables): - # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F - for it in iterables: - for element in it: - yield element + # chain.from_iterable(['ABC', 'DEF']) → A B C D E F + for iterable in iterables: + yield from iterable .. function:: combinations(iterable, r) Return *r* length subsequences of elements from the input *iterable*. - The combination tuples are emitted in lexicographic ordering according to - the order of the input *iterable*. So, if the input *iterable* is sorted, + The output is a subsequence of :func:`product` keeping only entries that + are subsequences of the *iterable*. The length of the output is given + by :func:`math.comb` which computes ``n! / r! / (n - r)!`` when ``0 ≤ r + ≤ n`` or zero when ``r > n``. + + The combination tuples are emitted in lexicographic order according to + the order of the input *iterable*. If the input *iterable* is sorted, the output tuples will be produced in sorted order. Elements are treated as unique based on their position, not on their - value. So if the input elements are unique, there will be no repeated - values in each combination. + value. If the input elements are unique, there will be no repeated + values within each combination. Roughly equivalent to:: def combinations(iterable, r): - # combinations('ABCD', 2) --> AB AC AD BC BD CD - # combinations(range(4), 3) --> 012 013 023 123 + # combinations('ABCD', 2) → AB AC AD BC BD CD + # combinations(range(4), 3) → 012 013 023 123 + pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) + yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): @@ -261,42 +266,36 @@ loops that truncate the stream. indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices) - The code for :func:`combinations` can be also expressed as a subsequence - of :func:`permutations` after filtering entries where the elements are not - in sorted order (according to their position in the input pool):: - - def combinations(iterable, r): - pool = tuple(iterable) - n = len(pool) - for indices in permutations(range(n), r): - if sorted(indices) == list(indices): - yield tuple(pool[i] for i in indices) - - The number of items returned is ``n! / r! / (n-r)!`` when ``0 <= r <= n`` - or zero when ``r > n``. .. function:: combinations_with_replacement(iterable, r) Return *r* length subsequences of elements from the input *iterable* allowing individual elements to be repeated more than once. - The combination tuples are emitted in lexicographic ordering according to - the order of the input *iterable*. So, if the input *iterable* is sorted, + The output is a subsequence of :func:`product` that keeps only entries + that are subsequences (with possible repeated elements) of the + *iterable*. The number of subsequence returned is ``(n + r - 1)! / r! / + (n - 1)!`` when ``n > 0``. + + The combination tuples are emitted in lexicographic order according to + the order of the input *iterable*. if the input *iterable* is sorted, the output tuples will be produced in sorted order. Elements are treated as unique based on their position, not on their - value. So if the input elements are unique, the generated combinations + value. If the input elements are unique, the generated combinations will also be unique. Roughly equivalent to:: def combinations_with_replacement(iterable, r): - # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC + # combinations_with_replacement('ABC', 2) → AA AB AC BB BC CC + pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r + yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): @@ -307,104 +306,103 @@ loops that truncate the stream. indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices) - The code for :func:`combinations_with_replacement` can be also expressed as - a subsequence of :func:`product` after filtering entries where the elements - are not in sorted order (according to their position in the input pool):: - - def combinations_with_replacement(iterable, r): - pool = tuple(iterable) - n = len(pool) - for indices in product(range(n), repeat=r): - if sorted(indices) == list(indices): - yield tuple(pool[i] for i in indices) - - The number of items returned is ``(n+r-1)! / r! / (n-1)!`` when ``n > 0``. - .. versionadded:: 3.1 .. function:: compress(data, selectors) - Make an iterator that filters elements from *data* returning only those that - have a corresponding element in *selectors* that evaluates to ``True``. - Stops when either the *data* or *selectors* iterables has been exhausted. - Roughly equivalent to:: + Make an iterator that returns elements from *data* where the + corresponding element in *selectors* is true. Stops when either the + *data* or *selectors* iterables have been exhausted. Roughly + equivalent to:: def compress(data, selectors): - # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F - return (d for d, s in zip(data, selectors) if s) + # compress('ABCDEF', [1,0,1,0,1,1]) → A C E F + return (datum for datum, selector in zip(data, selectors) if selector) .. versionadded:: 3.1 .. function:: count(start=0, step=1) - Make an iterator that returns evenly spaced values starting with number *start*. Often - used as an argument to :func:`map` to generate consecutive data points. - Also, used with :func:`zip` to add sequence numbers. Roughly equivalent to:: + Make an iterator that returns evenly spaced values beginning with + *start*. Can be used with :func:`map` to generate consecutive data + points or with :func:`zip` to add sequence numbers. Roughly + equivalent to:: def count(start=0, step=1): - # count(10) --> 10 11 12 13 14 ... - # count(2.5, 0.5) --> 2.5 3.0 3.5 ... + # count(10) → 10 11 12 13 14 ... + # count(2.5, 0.5) → 2.5 3.0 3.5 ... n = start while True: yield n n += step - When counting with floating point numbers, better accuracy can sometimes be + When counting with floating-point numbers, better accuracy can sometimes be achieved by substituting multiplicative code such as: ``(start + step * i for i in count())``. .. versionchanged:: 3.1 Added *step* argument and allowed non-integer arguments. + .. function:: cycle(iterable) - Make an iterator returning elements from the iterable and saving a copy of each. - When the iterable is exhausted, return elements from the saved copy. Repeats - indefinitely. Roughly equivalent to:: + Make an iterator returning elements from the *iterable* and saving a + copy of each. When the iterable is exhausted, return elements from + the saved copy. Repeats indefinitely. Roughly equivalent to:: def cycle(iterable): - # cycle('ABCD') --> A B C D A B C D A B C D ... + # cycle('ABCD') → A B C D A B C D A B C D ... + saved = [] for element in iterable: yield element saved.append(element) + while saved: for element in saved: - yield element + yield element - Note, this member of the toolkit may require significant auxiliary storage - (depending on the length of the iterable). + This itertool may require significant auxiliary storage (depending on + the length of the iterable). .. function:: dropwhile(predicate, iterable) - Make an iterator that drops elements from the iterable as long as the predicate - is true; afterwards, returns every element. Note, the iterator does not produce - *any* output until the predicate first becomes false, so it may have a lengthy - start-up time. Roughly equivalent to:: + Make an iterator that drops elements from the *iterable* while the + *predicate* is true and afterwards returns every element. Roughly + equivalent to:: def dropwhile(predicate, iterable): - # dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1 - iterable = iter(iterable) - for x in iterable: + # dropwhile(lambda x: x<5, [1,4,6,3,8]) → 6 3 8 + + iterator = iter(iterable) + for x in iterator: if not predicate(x): yield x break - for x in iterable: + + for x in iterator: yield x + Note this does not produce *any* output until the predicate first + becomes false, so this itertool may have a lengthy start-up time. + + .. function:: filterfalse(predicate, iterable) - Make an iterator that filters elements from iterable returning only those for - which the predicate is false. If *predicate* is ``None``, return the items - that are false. Roughly equivalent to:: + Make an iterator that filters elements from the *iterable* returning + only those for which the *predicate* returns a false value. If + *predicate* is ``None``, returns the items that are false. Roughly + equivalent to:: def filterfalse(predicate, iterable): - # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 + # filterfalse(lambda x: x<5, [1,4,6,3,8]) → 6 8 + if predicate is None: predicate = bool + for x in iterable: if not predicate(x): yield x @@ -438,82 +436,81 @@ loops that truncate the stream. :func:`groupby` is roughly equivalent to:: - class groupby: - # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B - # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D - - def __init__(self, iterable, key=None): - if key is None: - key = lambda x: x - self.keyfunc = key - self.it = iter(iterable) - self.tgtkey = self.currkey = self.currvalue = object() - - def __iter__(self): - return self - - def __next__(self): - self.id = object() - while self.currkey == self.tgtkey: - self.currvalue = next(self.it) # Exit on StopIteration - self.currkey = self.keyfunc(self.currvalue) - self.tgtkey = self.currkey - return (self.currkey, self._grouper(self.tgtkey, self.id)) - - def _grouper(self, tgtkey, id): - while self.id is id and self.currkey == tgtkey: - yield self.currvalue - try: - self.currvalue = next(self.it) - except StopIteration: + def groupby(iterable, key=None): + # [k for k, g in groupby('AAAABBBCCDAABBB')] → A B C D A B + # [list(g) for k, g in groupby('AAAABBBCCD')] → AAAA BBB CC D + + keyfunc = (lambda x: x) if key is None else key + iterator = iter(iterable) + exhausted = False + + def _grouper(target_key): + nonlocal curr_value, curr_key, exhausted + yield curr_value + for curr_value in iterator: + curr_key = keyfunc(curr_value) + if curr_key != target_key: return - self.currkey = self.keyfunc(self.currvalue) + yield curr_value + exhausted = True + + try: + curr_value = next(iterator) + except StopIteration: + return + curr_key = keyfunc(curr_value) + + while not exhausted: + target_key = curr_key + curr_group = _grouper(target_key) + yield curr_key, curr_group + if curr_key == target_key: + for _ in curr_group: + pass .. function:: islice(iterable, stop) islice(iterable, start, stop[, step]) - Make an iterator that returns selected elements from the iterable. If *start* is - non-zero, then elements from the iterable are skipped until start is reached. - Afterward, elements are returned consecutively unless *step* is set higher than - one which results in items being skipped. If *stop* is ``None``, then iteration - continues until the iterator is exhausted, if at all; otherwise, it stops at the - specified position. + Make an iterator that returns selected elements from the iterable. + Works like sequence slicing but does not support negative values for + *start*, *stop*, or *step*. + + If *start* is zero or ``None``, iteration starts at zero. Otherwise, + elements from the iterable are skipped until *start* is reached. - If *start* is ``None``, then iteration starts at zero. If *step* is ``None``, - then the step defaults to one. + If *stop* is ``None``, iteration continues until the input is + exhausted, if at all. Otherwise, it stops at the specified position. - Unlike regular slicing, :func:`islice` does not support negative values for - *start*, *stop*, or *step*. Can be used to extract related fields from - data where the internal structure has been flattened (for example, a - multi-line report may list a name field on every third line). + If *step* is ``None``, the step defaults to one. Elements are returned + consecutively unless *step* is set higher than one which results in + items being skipped. Roughly equivalent to:: def islice(iterable, *args): - # islice('ABCDEFG', 2) --> A B - # islice('ABCDEFG', 2, 4) --> C D - # islice('ABCDEFG', 2, None) --> C D E F G - # islice('ABCDEFG', 0, None, 2) --> A C E G + # islice('ABCDEFG', 2) → A B + # islice('ABCDEFG', 2, 4) → C D + # islice('ABCDEFG', 2, None) → C D E F G + # islice('ABCDEFG', 0, None, 2) → A C E G + s = slice(*args) - start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1 - it = iter(range(start, stop, step)) - try: - nexti = next(it) - except StopIteration: - # Consume *iterable* up to the *start* position. - for i, element in zip(range(start), iterable): - pass - return - try: - for i, element in enumerate(iterable): - if i == nexti: - yield element - nexti = next(it) - except StopIteration: - # Consume to *stop*. - for i, element in zip(range(i + 1, stop), iterable): - pass + start = 0 if s.start is None else s.start + stop = s.stop + step = 1 if s.step is None else s.step + if start < 0 or (stop is not None and stop < 0) or step <= 0: + raise ValueError + + indices = count() if stop is None else range(max(start, stop)) + next_i = start + for i, element in zip(indices, iterable): + if i == next_i: + yield element + next_i += step + + If the input is an iterator, then fully consuming the *islice* + advances the input iterator by ``max(start, stop)`` steps regardless + of the *step* value. .. function:: pairwise(iterable) @@ -527,43 +524,56 @@ loops that truncate the stream. Roughly equivalent to:: def pairwise(iterable): - # pairwise('ABCDEFG') --> AB BC CD DE EF FG - a, b = tee(iterable) - next(b, None) - return zip(a, b) + # pairwise('ABCDEFG') → AB BC CD DE EF FG + + iterator = iter(iterable) + a = next(iterator, None) + + for b in iterator: + yield a, b + a = b .. versionadded:: 3.10 .. function:: permutations(iterable, r=None) - Return successive *r* length permutations of elements in the *iterable*. + Return successive *r* length `permutations of elements + `_ from the *iterable*. If *r* is not specified or is ``None``, then *r* defaults to the length of the *iterable* and all possible full-length permutations are generated. + The output is a subsequence of :func:`product` where entries with + repeated elements have been filtered out. The length of the output is + given by :func:`math.perm` which computes ``n! / (n - r)!`` when + ``0 ≤ r ≤ n`` or zero when ``r > n``. + The permutation tuples are emitted in lexicographic order according to - the order of the input *iterable*. So, if the input *iterable* is sorted, + the order of the input *iterable*. If the input *iterable* is sorted, the output tuples will be produced in sorted order. Elements are treated as unique based on their position, not on their - value. So if the input elements are unique, there will be no repeated + value. If the input elements are unique, there will be no repeated values within a permutation. Roughly equivalent to:: def permutations(iterable, r=None): - # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC - # permutations(range(3)) --> 012 021 102 120 201 210 + # permutations('ABCD', 2) → AB AC AD BA BC BD CA CB CD DA DB DC + # permutations(range(3)) → 012 021 102 120 201 210 + pool = tuple(iterable) n = len(pool) r = n if r is None else r if r > n: return + indices = list(range(n)) cycles = list(range(n, n-r, -1)) yield tuple(pool[i] for i in indices[:r]) + while n: for i in reversed(range(r)): cycles[i] -= 1 @@ -578,24 +588,11 @@ loops that truncate the stream. else: return - The code for :func:`permutations` can be also expressed as a subsequence of - :func:`product`, filtered to exclude entries with repeated elements (those - from the same position in the input pool):: - - def permutations(iterable, r=None): - pool = tuple(iterable) - n = len(pool) - r = n if r is None else r - for indices in product(range(n), repeat=r): - if len(set(indices)) == r: - yield tuple(pool[i] for i in indices) - - The number of items returned is ``n! / (n-r)!`` when ``0 <= r <= n`` - or zero when ``r > n``. .. function:: product(*iterables, repeat=1) - Cartesian product of input iterables. + `Cartesian product `_ + of the input iterables. Roughly equivalent to nested for-loops in a generator expression. For example, ``product(A, B)`` returns the same as ``((x,y) for x in A for y in B)``. @@ -612,13 +609,18 @@ loops that truncate the stream. This function is roughly equivalent to the following code, except that the actual implementation does not build up intermediate results in memory:: - def product(*args, repeat=1): - # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy - # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 - pools = [tuple(pool) for pool in args] * repeat + def product(*iterables, repeat=1): + # product('ABCD', 'xy') → Ax Ay Bx By Cx Cy Dx Dy + # product(range(2), repeat=3) → 000 001 010 011 100 101 110 111 + + if repeat < 0: + raise ValueError('repeat argument cannot be negative') + pools = [tuple(pool) for pool in iterables] * repeat + result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] + for prod in result: yield tuple(prod) @@ -626,6 +628,7 @@ loops that truncate the stream. keeping pools of values in memory to generate the products. Accordingly, it is only useful with finite inputs. + .. function:: repeat(object[, times]) Make an iterator that returns *object* over and over again. Runs indefinitely @@ -634,7 +637,7 @@ loops that truncate the stream. Roughly equivalent to:: def repeat(object, times=None): - # repeat(10, 3) --> 10 10 10 + # repeat(10, 3) → 10 10 10 if times is None: while True: yield object @@ -650,63 +653,108 @@ loops that truncate the stream. >>> list(map(pow, range(10), repeat(2))) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + .. function:: starmap(function, iterable) - Make an iterator that computes the function using arguments obtained from - the iterable. Used instead of :func:`map` when argument parameters are already - grouped in tuples from a single iterable (when the data has been - "pre-zipped"). + Make an iterator that computes the *function* using arguments obtained + from the *iterable*. Used instead of :func:`map` when argument + parameters have already been "pre-zipped" into tuples. The difference between :func:`map` and :func:`starmap` parallels the distinction between ``function(a,b)`` and ``function(*c)``. Roughly equivalent to:: def starmap(function, iterable): - # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000 + # starmap(pow, [(2,5), (3,2), (10,3)]) → 32 9 1000 for args in iterable: yield function(*args) .. function:: takewhile(predicate, iterable) - Make an iterator that returns elements from the iterable as long as the - predicate is true. Roughly equivalent to:: + Make an iterator that returns elements from the *iterable* as long as + the *predicate* is true. Roughly equivalent to:: def takewhile(predicate, iterable): - # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4 + # takewhile(lambda x: x<5, [1,4,6,3,8]) → 1 4 for x in iterable: - if predicate(x): - yield x - else: + if not predicate(x): break + yield x + + Note, the element that first fails the predicate condition is + consumed from the input iterator and there is no way to access it. + This could be an issue if an application wants to further consume the + input iterator after *takewhile* has been run to exhaustion. To work + around this problem, consider using `more-iterools before_and_after() + `_ + instead. .. function:: tee(iterable, n=2) Return *n* independent iterators from a single iterable. - The following Python code helps explain what *tee* does (although the actual - implementation is more complex and uses only a single underlying - :abbr:`FIFO (first-in, first-out)` queue):: + Roughly equivalent to:: def tee(iterable, n=2): - it = iter(iterable) - deques = [collections.deque() for i in range(n)] - def gen(mydeque): - while True: - if not mydeque: # when the local deque is empty - try: - newval = next(it) # fetch a new value and - except StopIteration: - return - for d in deques: # load it to all the deques - d.append(newval) - yield mydeque.popleft() - return tuple(gen(d) for d in deques) - - Once a :func:`tee` has been created, the original *iterable* should not be - used anywhere else; otherwise, the *iterable* could get advanced without - the tee objects being informed. + if n < 0: + raise ValueError + if n == 0: + return () + iterator = _tee(iterable) + result = [iterator] + for _ in range(n - 1): + result.append(_tee(iterator)) + return tuple(result) + + class _tee: + + def __init__(self, iterable): + it = iter(iterable) + if isinstance(it, _tee): + self.iterator = it.iterator + self.link = it.link + else: + self.iterator = it + self.link = [None, None] + + def __iter__(self): + return self + + def __next__(self): + link = self.link + if link[1] is None: + link[0] = next(self.iterator) + link[1] = [None, None] + value, self.link = link + return value + + When the input *iterable* is already a tee iterator object, all + members of the return tuple are constructed as if they had been + produced by the upstream :func:`tee` call. This "flattening step" + allows nested :func:`tee` calls to share the same underlying data + chain and to have a single update step rather than a chain of calls. + + The flattening property makes tee iterators efficiently peekable: + + .. testcode:: + + def lookahead(tee_iterator): + "Return the next value without moving the input forward" + [forked_iterator] = tee(tee_iterator, 1) + return next(forked_iterator) + + .. doctest:: + + >>> iterator = iter('abcdef') + >>> [iterator] = tee(iterator, 1) # Make the input peekable + >>> next(iterator) # Move the iterator forward + 'a' + >>> lookahead(iterator) # Check next value + 'b' + >>> next(iterator) # Continue moving forward + 'b' ``tee`` iterators are not threadsafe. A :exc:`RuntimeError` may be raised when simultaneously using iterators returned by the same :func:`tee` @@ -720,21 +768,29 @@ loops that truncate the stream. .. function:: zip_longest(*iterables, fillvalue=None) - Make an iterator that aggregates elements from each of the iterables. If the - iterables are of uneven length, missing values are filled-in with *fillvalue*. - Iteration continues until the longest iterable is exhausted. Roughly equivalent to:: + Make an iterator that aggregates elements from each of the + *iterables*. + + If the iterables are of uneven length, missing values are filled-in + with *fillvalue*. If not specified, *fillvalue* defaults to ``None``. + + Iteration continues until the longest iterable is exhausted. + + Roughly equivalent to:: + + def zip_longest(*iterables, fillvalue=None): + # zip_longest('ABCD', 'xy', fillvalue='-') → Ax By C- D- - def zip_longest(*args, fillvalue=None): - # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- - iterators = [iter(it) for it in args] + iterators = list(map(iter, iterables)) num_active = len(iterators) if not num_active: return + while True: values = [] - for i, it in enumerate(iterators): + for i, iterator in enumerate(iterators): try: - value = next(it) + value = next(iterator) except StopIteration: num_active -= 1 if not num_active: @@ -746,8 +802,7 @@ loops that truncate the stream. If one of the iterables is potentially infinite, then the :func:`zip_longest` function should be wrapped with something that limits the number of calls - (for example :func:`islice` or :func:`takewhile`). If not specified, - *fillvalue* defaults to ``None``. + (for example :func:`islice` or :func:`takewhile`). .. _itertools-recipes: @@ -762,261 +817,192 @@ The primary purpose of the itertools recipes is educational. The recipes show various ways of thinking about individual tools — for example, that ``chain.from_iterable`` is related to the concept of flattening. The recipes also give ideas about ways that the tools can be combined — for example, how -``compress()`` and ``range()`` can work together. The recipes also show patterns +``starmap()`` and ``repeat()`` can work together. The recipes also show patterns for using itertools with the :mod:`operator` and :mod:`collections` modules as well as with the built-in itertools such as ``map()``, ``filter()``, ``reversed()``, and ``enumerate()``. A secondary purpose of the recipes is to serve as an incubator. The ``accumulate()``, ``compress()``, and ``pairwise()`` itertools started out as -recipes. Currently, the ``sliding_window()`` and ``iter_index()`` recipes -are being tested to see whether they prove their worth. +recipes. Currently, the ``sliding_window()``, ``iter_index()``, and ``sieve()`` +recipes are being tested to see whether they prove their worth. Substantially all of these recipes and many, many others can be installed from -the `more-itertools project `_ found +the :pypi:`more-itertools` project found on the Python Package Index:: python -m pip install more-itertools Many of the recipes offer the same high performance as the underlying toolset. -Superior memory performance is kept by processing elements one at a time -rather than bringing the whole iterable into memory all at once. Code volume is -kept small by linking the tools together in a functional style which helps -eliminate temporary variables. High speed is retained by preferring -"vectorized" building blocks over the use of for-loops and :term:`generator`\s -which incur interpreter overhead. +Superior memory performance is kept by processing elements one at a time rather +than bringing the whole iterable into memory all at once. Code volume is kept +small by linking the tools together in a `functional style +`_. High speed +is retained by preferring "vectorized" building blocks over the use of for-loops +and :term:`generators ` which incur interpreter overhead. .. testcode:: import collections + import contextlib import functools import math import operator import random def take(n, iterable): - "Return first n items of the iterable as a list" + "Return first n items of the iterable as a list." return list(islice(iterable, n)) - def prepend(value, iterator): - "Prepend a single value in front of an iterator" - # prepend(1, [2, 3, 4]) --> 1 2 3 4 - return chain([value], iterator) + def prepend(value, iterable): + "Prepend a single value in front of an iterable." + # prepend(1, [2, 3, 4]) → 1 2 3 4 + return chain([value], iterable) def tabulate(function, start=0): "Return function(0), function(1), ..." return map(function, count(start)) def repeatfunc(func, times=None, *args): - """Repeat calls to func with specified arguments. - - Example: repeatfunc(random.random) - """ + "Repeat calls to func with specified arguments." if times is None: return starmap(func, repeat(args)) return starmap(func, repeat(args, times)) def flatten(list_of_lists): - "Flatten one level of nesting" + "Flatten one level of nesting." return chain.from_iterable(list_of_lists) def ncycles(iterable, n): - "Returns the sequence elements n times" + "Returns the sequence elements n times." return chain.from_iterable(repeat(tuple(iterable), n)) def tail(n, iterable): - "Return an iterator over the last n items" - # tail(3, 'ABCDEFG') --> E F G + "Return an iterator over the last n items." + # tail(3, 'ABCDEFG') → E F G return iter(collections.deque(iterable, maxlen=n)) def consume(iterator, n=None): "Advance the iterator n-steps ahead. If n is None, consume entirely." # Use functions that consume iterators at C speed. if n is None: - # feed the entire iterator into a zero-length deque collections.deque(iterator, maxlen=0) else: - # advance to the empty slice starting at position n next(islice(iterator, n, n), None) def nth(iterable, n, default=None): - "Returns the nth item or a default value" + "Returns the nth item or a default value." return next(islice(iterable, n, None), default) - def quantify(iterable, pred=bool): + def quantify(iterable, predicate=bool): "Given a predicate that returns True or False, count the True results." - return sum(map(pred, iterable)) + return sum(map(predicate, iterable)) - def all_equal(iterable): - "Returns True if all the elements are equal to each other" - g = groupby(iterable) - return next(g, True) and not next(g, False) + def first_true(iterable, default=False, predicate=None): + "Returns the first true value or the *default* if there is no true value." + # first_true([a,b,c], x) → a or b or c or x + # first_true([a,b], x, f) → a if f(a) else b if f(b) else x + return next(filter(predicate, iterable), default) - def first_true(iterable, default=False, pred=None): - """Returns the first true value in the iterable. + def all_equal(iterable, key=None): + "Returns True if all the elements are equal to each other." + # all_equal('4٤௪౪໔', key=int) → True + return len(take(2, groupby(iterable, key))) <= 1 - If no true value is found, returns *default* + def unique_justseen(iterable, key=None): + "Yield unique elements, preserving order. Remember only the element just seen." + # unique_justseen('AAAABBBCCDAABBB') → A B C D A B + # unique_justseen('ABBcCAD', str.casefold) → A B c A D + if key is None: + return map(operator.itemgetter(0), groupby(iterable)) + return map(next, map(operator.itemgetter(1), groupby(iterable, key))) - If *pred* is not None, returns the first item - for which pred(item) is true. + def unique_everseen(iterable, key=None): + "Yield unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') → A B C D + # unique_everseen('ABBcCAD', str.casefold) → A B c D + seen = set() + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen.add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen.add(k) + yield element - """ - # first_true([a,b,c], x) --> a or b or c or x - # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x - return next(filter(pred, iterable), default) + def unique(iterable, key=None, reverse=False): + "Yield unique elements in sorted order. Supports unhashable inputs." + # unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4] + return unique_justseen(sorted(iterable, key=key, reverse=reverse), key=key) + + def sliding_window(iterable, n): + "Collect data into overlapping fixed-length chunks or blocks." + # sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG + iterator = iter(iterable) + window = collections.deque(islice(iterator, n - 1), maxlen=n) + for x in iterator: + window.append(x) + yield tuple(window) + + def grouper(iterable, n, *, incomplete='fill', fillvalue=None): + "Collect data into non-overlapping fixed-length chunks or blocks." + # grouper('ABCDEFG', 3, fillvalue='x') → ABC DEF Gxx + # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError + # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF + iterators = [iter(iterable)] * n + match incomplete: + case 'fill': + return zip_longest(*iterators, fillvalue=fillvalue) + case 'strict': + return zip(*iterators, strict=True) + case 'ignore': + return zip(*iterators) + case _: + raise ValueError('Expected fill, strict, or ignore') + + def roundrobin(*iterables): + "Visit input iterables in a cycle until each is exhausted." + # roundrobin('ABC', 'D', 'EF') → A D E B F C + # Algorithm credited to George Sakkis + iterators = map(iter, iterables) + for num_active in range(len(iterables), 0, -1): + iterators = cycle(islice(iterators, num_active)) + yield from map(next, iterators) + + def subslices(seq): + "Return all contiguous non-empty subslices of a sequence." + # subslices('ABCD') → A AB ABC ABCD B BC BCD C CD D + slices = starmap(slice, combinations(range(len(seq) + 1), 2)) + return map(operator.getitem, repeat(seq), slices) def iter_index(iterable, value, start=0, stop=None): "Return indices where a value occurs in a sequence or iterable." - # iter_index('AABCADEAF', 'A') --> 0 1 4 7 + # iter_index('AABCADEAF', 'A') → 0 1 4 7 seq_index = getattr(iterable, 'index', None) if seq_index is None: - # Slow path for general iterables - it = islice(iterable, start, stop) - for i, element in enumerate(it, start): + iterator = islice(iterable, start, stop) + for i, element in enumerate(iterator, start): if element is value or element == value: yield i else: - # Fast path for sequences stop = len(iterable) if stop is None else stop - i = start - 1 - try: + i = start + with contextlib.suppress(ValueError): while True: - yield (i := seq_index(value, i+1, stop)) - except ValueError: - pass + yield (i := seq_index(value, i, stop)) + i += 1 def iter_except(func, exception, first=None): - """ Call a function repeatedly until an exception is raised. - - Converts a call-until-exception interface to an iterator interface. - Like builtins.iter(func, sentinel) but uses an exception instead - of a sentinel to end the loop. - - Examples: - iter_except(functools.partial(heappop, h), IndexError) # priority queue iterator - iter_except(d.popitem, KeyError) # non-blocking dict iterator - iter_except(d.popleft, IndexError) # non-blocking deque iterator - iter_except(q.get_nowait, Queue.Empty) # loop over a producer Queue - iter_except(s.pop, KeyError) # non-blocking set iterator - - """ - try: + "Convert a call-until-exception interface to an iterator interface." + # iter_except(d.popitem, KeyError) → non-blocking dictionary iterator + with contextlib.suppress(exception): if first is not None: - yield first() # For database APIs needing an initial cast to db.first() + yield first() while True: yield func() - except exception: - pass - - def grouper(iterable, n, *, incomplete='fill', fillvalue=None): - "Collect data into non-overlapping fixed-length chunks or blocks" - # grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx - # grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError - # grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF - args = [iter(iterable)] * n - if incomplete == 'fill': - return zip_longest(*args, fillvalue=fillvalue) - if incomplete == 'strict': - return zip(*args, strict=True) - if incomplete == 'ignore': - return zip(*args) - else: - raise ValueError('Expected fill, strict, or ignore') - - def sliding_window(iterable, n): - # sliding_window('ABCDEFG', 4) --> ABCD BCDE CDEF DEFG - it = iter(iterable) - window = collections.deque(islice(it, n-1), maxlen=n) - for x in it: - window.append(x) - yield tuple(window) - - def roundrobin(*iterables): - "roundrobin('ABC', 'D', 'EF') --> A D E B F C" - # Recipe credited to George Sakkis - num_active = len(iterables) - nexts = cycle(iter(it).__next__ for it in iterables) - while num_active: - try: - for next in nexts: - yield next() - except StopIteration: - # Remove the iterator we just exhausted from the cycle. - num_active -= 1 - nexts = cycle(islice(nexts, num_active)) - - def partition(pred, iterable): - """Partition entries into false entries and true entries. - - If *pred* is slow, consider wrapping it with functools.lru_cache(). - """ - # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 - t1, t2 = tee(iterable) - return filterfalse(pred, t1), filter(pred, t2) - - def subslices(seq): - "Return all contiguous non-empty subslices of a sequence" - # subslices('ABCD') --> A AB ABC ABCD B BC BCD C CD D - slices = starmap(slice, combinations(range(len(seq) + 1), 2)) - return map(operator.getitem, repeat(seq), slices) - - def before_and_after(predicate, it): - """ Variant of takewhile() that allows complete - access to the remainder of the iterator. - - >>> it = iter('ABCdEfGhI') - >>> all_upper, remainder = before_and_after(str.isupper, it) - >>> ''.join(all_upper) - 'ABC' - >>> ''.join(remainder) # takewhile() would lose the 'd' - 'dEfGhI' - - Note that the first iterator must be fully - consumed before the second iterator can - generate valid results. - """ - it = iter(it) - transition = [] - def true_iterator(): - for elem in it: - if predicate(elem): - yield elem - else: - transition.append(elem) - return - def remainder_iterator(): - yield from transition - yield from it - return true_iterator(), remainder_iterator() - - def unique_everseen(iterable, key=None): - "List unique elements, preserving order. Remember all elements ever seen." - # unique_everseen('AAAABBBCCDAABBB') --> A B C D - # unique_everseen('ABBcCAD', str.lower) --> A B c D - seen = set() - if key is None: - for element in filterfalse(seen.__contains__, iterable): - seen.add(element) - yield element - # For order preserving deduplication, - # a faster but non-lazy solution is: - # yield from dict.fromkeys(iterable) - else: - for element in iterable: - k = key(element) - if k not in seen: - seen.add(k) - yield element - # For use cases that allow the last matching element to be returned, - # a faster but non-lazy solution is: - # t1, t2 = tee(iterable) - # yield from dict(zip(map(key, t1), t2)).values() - - def unique_justseen(iterable, key=None): - "List unique elements, preserving order. Remember only the element just seen." - # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B - # unique_justseen('ABBcCAD', str.lower) --> A B c A D - return map(next, map(operator.itemgetter(1), groupby(iterable, key))) The following recipes have a more mathematical flavor: @@ -1024,42 +1010,46 @@ The following recipes have a more mathematical flavor: .. testcode:: def powerset(iterable): - "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" + "powerset([1,2,3]) → () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) - def sum_of_squares(it): + def sum_of_squares(iterable): "Add up the squares of the input values." - # sum_of_squares([10, 20, 30]) -> 1400 - return math.sumprod(*tee(it)) + # sum_of_squares([10, 20, 30]) → 1400 + return math.sumprod(*tee(iterable)) + + def reshape(matrix, cols): + "Reshape a 2-D matrix to have a given number of columns." + # reshape([(0, 1), (2, 3), (4, 5)], 3) → (0, 1, 2), (3, 4, 5) + return batched(chain.from_iterable(matrix), cols, strict=True) - def transpose(it): - "Swap the rows and columns of the input." - # transpose([(1, 2, 3), (11, 22, 33)]) --> (1, 11) (2, 22) (3, 33) - return zip(*it, strict=True) + def transpose(matrix): + "Swap the rows and columns of a 2-D matrix." + # transpose([(1, 2, 3), (11, 22, 33)]) → (1, 11) (2, 22) (3, 33) + return zip(*matrix, strict=True) def matmul(m1, m2): "Multiply two matrices." - # matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]) --> (49, 80), (41, 60) + # matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]) → (49, 80), (41, 60) n = len(m2[0]) return batched(starmap(math.sumprod, product(m1, transpose(m2))), n) def convolve(signal, kernel): """Discrete linear convolution of two iterables. + Equivalent to polynomial multiplication. - The kernel is fully consumed before the calculations begin. - The signal is consumed lazily and can be infinite. - - Convolutions are mathematically commutative. - If the signal and kernel are swapped, - the output will be the same. + Convolutions are mathematically commutative; however, the inputs are + evaluated differently. The signal is consumed lazily and can be + infinite. The kernel is fully consumed before the calculations begin. Article: https://betterexplained.com/articles/intuitive-convolution/ Video: https://www.youtube.com/watch?v=KuXjwB4LzSA """ - # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) - # convolve(data, [1/2, 0, -1/2]) --> 1st derivative estimate - # convolve(data, [1, -2, 1]) --> 2nd derivative estimate + # convolve([1, -1, -20], [1, -3]) → 1 -4 -17 60 + # convolve(data, [0.25, 0.25, 0.25, 0.25]) → Moving average (blur) + # convolve(data, [1/2, 0, -1/2]) → 1st derivative estimate + # convolve(data, [1, -2, 1]) → 2nd derivative estimate kernel = tuple(kernel)[::-1] n = len(kernel) padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1)) @@ -1071,7 +1061,7 @@ The following recipes have a more mathematical flavor: (x - 5) (x + 4) (x - 3) expands to: x³ -4x² -17x + 60 """ - # polynomial_from_roots([5, -4, 3]) --> [1, -4, -17, 60] + # polynomial_from_roots([5, -4, 3]) → [1, -4, -17, 60] factors = zip(repeat(1), map(operator.neg, roots)) return list(functools.reduce(convolve, factors, [1])) @@ -1080,8 +1070,8 @@ The following recipes have a more mathematical flavor: Computes with better numeric stability than Horner's method. """ - # Evaluate x³ -4x² -17x + 60 at x = 2.5 - # polynomial_eval([1, -4, -17, 60], x=2.5) --> 8.125 + # Evaluate x³ -4x² -17x + 60 at x = 5 + # polynomial_eval([1, -4, -17, 60], x=5) → 0 n = len(coefficients) if not n: return type(x)(0) @@ -1094,34 +1084,28 @@ The following recipes have a more mathematical flavor: f(x) = x³ -4x² -17x + 60 f'(x) = 3x² -8x -17 """ - # polynomial_derivative([1, -4, -17, 60]) -> [3, -8, -17] + # polynomial_derivative([1, -4, -17, 60]) → [3, -8, -17] n = len(coefficients) powers = reversed(range(1, n)) return list(map(operator.mul, coefficients, powers)) def sieve(n): "Primes less than n." - # sieve(30) --> 2 3 5 7 11 13 17 19 23 29 + # sieve(30) → 2 3 5 7 11 13 17 19 23 29 if n > 2: yield 2 - start = 3 data = bytearray((0, 1)) * (n // 2) - limit = math.isqrt(n) + 1 - for p in iter_index(data, 1, start, limit): - yield from iter_index(data, 1, start, p*p) + for p in iter_index(data, 1, start=3, stop=math.isqrt(n) + 1): data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p))) - start = p*p - yield from iter_index(data, 1, start) + yield from iter_index(data, 1, start=3) def factor(n): "Prime factors of n." - # factor(99) --> 3 3 11 - # factor(1_000_000_000_000_007) --> 47 59 360620266859 - # factor(1_000_000_000_000_403) --> 1000000000000403 + # factor(99) → 3 3 11 + # factor(1_000_000_000_000_007) → 47 59 360620266859 + # factor(1_000_000_000_000_403) → 1000000000000403 for prime in sieve(math.isqrt(n) + 1): - while True: - if n % prime: - break + while not n % prime: yield prime n //= prime if n == 1: @@ -1129,23 +1113,13 @@ The following recipes have a more mathematical flavor: if n > 1: yield n - def nth_combination(iterable, r, index): - "Equivalent to list(combinations(iterable, r))[index]" - pool = tuple(iterable) - n = len(pool) - c = math.comb(n, r) - if index < 0: - index += c - if index < 0 or index >= c: - raise IndexError - result = [] - while r: - c, n, r = c*r//n, n-1, r-1 - while index >= c: - index -= c - c, n = c*(n-r)//n, n-1 - result.append(pool[-1-n]) - return tuple(result) + def totient(n): + "Count of natural numbers up to n that are coprime to n." + # https://mathworld.wolfram.com/TotientFunction.html + # totient(12) → 4 because len([1, 5, 7, 11]) == 4 + for prime in set(factor(n)): + n -= n // prime + return n .. doctest:: @@ -1208,69 +1182,139 @@ The following recipes have a more mathematical flavor: >>> take(10, count()) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + >>> # Verify that the input is consumed lazily + >>> it = iter('abcdef') + >>> take(3, it) + ['a', 'b', 'c'] + >>> list(it) + ['d', 'e', 'f'] + >>> list(prepend(1, [2, 3, 4])) [1, 2, 3, 4] + >>> list(enumerate('abc')) [(0, 'a'), (1, 'b'), (2, 'c')] + >>> list(islice(tabulate(lambda x: 2*x), 4)) [0, 2, 4, 6] + >>> list(tail(3, 'ABCDEFG')) ['E', 'F', 'G'] + >>> # Verify the input is consumed greedily + >>> input_iterator = iter('ABCDEFG') + >>> output_iterator = tail(3, input_iterator) + >>> list(input_iterator) + [] + >>> it = iter(range(10)) >>> consume(it, 3) + >>> # Verify the input is consumed lazily >>> next(it) 3 + >>> # Verify the input is consumed completely >>> consume(it) >>> next(it, 'Done') 'Done' + >>> nth('abcde', 3) 'd' - >>> nth('abcde', 9) is None True + >>> # Verify that the input is consumed lazily + >>> it = iter('abcde') + >>> nth(it, 2) + 'c' + >>> list(it) + ['d', 'e'] + >>> [all_equal(s) for s in ('', 'A', 'AAAA', 'AAAB', 'AAABA')] [True, True, True, False, False] + >>> [all_equal(s, key=str.casefold) for s in ('', 'A', 'AaAa', 'AAAB', 'AAABA')] + [True, True, True, False, False] + >>> # Verify that the input is consumed lazily and that only + >>> # one element of a second equivalence class is used to disprove + >>> # the assertion that all elements are equal. + >>> it = iter('aaabbbccc') + >>> all_equal(it) + False + >>> ''.join(it) + 'bbccc' + >>> quantify(range(99), lambda x: x%2==0) 50 - >>> quantify([True, False, False, True, True]) 3 - - >>> quantify(range(12), pred=lambda x: x%2==1) + >>> quantify(range(12), predicate=lambda x: x%2==1) 6 + >>> a = [[1, 2, 3], [4, 5, 6]] >>> list(flatten(a)) [1, 2, 3, 4, 5, 6] - >>> list(repeatfunc(pow, 5, 2, 3)) - [8, 8, 8, 8, 8] - - >>> take(5, map(int, repeatfunc(random.random))) - [0, 0, 0, 0, 0] >>> list(ncycles('abc', 3)) ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'] + >>> # Verify greedy consumption of input iterator + >>> input_iterator = iter('abc') + >>> output_iterator = ncycles(input_iterator, 3) + >>> list(input_iterator) + [] + >>> sum_of_squares([10, 20, 30]) 1400 + + >>> list(reshape([(0, 1), (2, 3), (4, 5)], 3)) + [(0, 1, 2), (3, 4, 5)] + >>> M = [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)] + >>> list(reshape(M, 1)) + [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,), (10,), (11,)] + >>> list(reshape(M, 2)) + [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)] + >>> list(reshape(M, 3)) + [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)] + >>> list(reshape(M, 4)) + [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)] + >>> list(reshape(M, 5)) + Traceback (most recent call last): + ... + ValueError: batched(): incomplete batch + >>> list(reshape(M, 6)) + [(0, 1, 2, 3, 4, 5), (6, 7, 8, 9, 10, 11)] + >>> list(reshape(M, 12)) + [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)] + + >>> list(transpose([(1, 2, 3), (11, 22, 33)])) [(1, 11), (2, 22), (3, 33)] + >>> # Verify that the inputs are consumed lazily + >>> input1 = iter([1, 2, 3]) + >>> input2 = iter([11, 22, 33]) + >>> output_iterator = transpose([input1, input2]) + >>> next(output_iterator) + (1, 11) + >>> list(zip(input1, input2)) + [(2, 22), (3, 33)] + >>> list(matmul([(7, 5), (3, 5)], [[2, 5], [7, 9]])) [(49, 80), (41, 60)] >>> list(matmul([[2, 5], [7, 9], [3, 4]], [[7, 11, 5, 4, 9], [3, 5, 2, 6, 3]])) [(29, 47, 20, 38, 33), (76, 122, 53, 82, 90), (33, 53, 23, 36, 39)] + + >>> list(convolve([1, -1, -20], [1, -3])) == [1, -4, -17, 60] + True >>> data = [20, 40, 24, 32, 20, 28, 16] >>> list(convolve(data, [0.25, 0.25, 0.25, 0.25])) [5.0, 15.0, 21.0, 29.0, 29.0, 26.0, 24.0, 16.0, 11.0, 4.0] @@ -1278,13 +1322,26 @@ The following recipes have a more mathematical flavor: [20, 20, -16, 8, -12, 8, -12, -16] >>> list(convolve(data, [1, -2, 1])) [20, 0, -36, 24, -20, 20, -20, -4, 16] + >>> # Verify signal is consumed lazily and the kernel greedily + >>> signal_iterator = iter([10, 20, 30, 40, 50]) + >>> kernel_iterator = iter([1, 2, 3]) + >>> output_iterator = convolve(signal_iterator, kernel_iterator) + >>> list(kernel_iterator) + [] + >>> next(output_iterator) + 10 + >>> next(output_iterator) + 40 + >>> list(signal_iterator) + [30, 40, 50] + >>> from fractions import Fraction >>> from decimal import Decimal - >>> polynomial_eval([1, -4, -17, 60], x=2) - 18 - >>> x = 2; x**3 - 4*x**2 -17*x + 60 - 18 + >>> polynomial_eval([1, -4, -17, 60], x=5) + 0 + >>> x = 5; x**3 - 4*x**2 -17*x + 60 + 0 >>> polynomial_eval([1, -4, -17, 60], x=2.5) 8.125 >>> x = 2.5; x**3 - 4*x**2 -17*x + 60 @@ -1310,6 +1367,7 @@ The following recipes have a more mathematical flavor: >>> polynomial_eval([11, 2], 7) == 11 * 7 + 2 True + >>> polynomial_from_roots([5, -4, 3]) [1, -4, -17, 60] >>> factored = lambda x: (x - 5) * (x + 4) * (x - 3) @@ -1317,9 +1375,11 @@ The following recipes have a more mathematical flavor: >>> all(factored(x) == expanded(x) for x in range(-10, 11)) True + >>> polynomial_derivative([1, -4, -17, 60]) [3, -8, -17] + >>> list(iter_index('AABCADEAF', 'A')) [0, 1, 4, 7] >>> list(iter_index('AABCADEAF', 'B')) @@ -1365,6 +1425,35 @@ The following recipes have a more mathematical flavor: >>> # Test list input. Lists do not support None for the stop argument >>> list(iter_index(list('AABCADEAF'), 'A')) [0, 1, 4, 7] + >>> # Verify that input is consumed lazily + >>> input_iterator = iter('AABCADEAF') + >>> output_iterator = iter_index(input_iterator, 'A') + >>> next(output_iterator) + 0 + >>> next(output_iterator) + 1 + >>> next(output_iterator) + 4 + >>> ''.join(input_iterator) + 'DEAF' + + + >>> # Verify that the target value can be a sequence. + >>> seq = [[10, 20], [30, 40], 30, 40, [30, 40], 50] + >>> target = [30, 40] + >>> list(iter_index(seq, target)) + [1, 4] + + + >>> # Verify faithfulness to type specific index() method behaviors. + >>> # For example, bytes and str perform continuous-subsequence searches + >>> # that do not match the general behavior specified + >>> # in collections.abc.Sequence.index(). + >>> seq = 'abracadabra' + >>> target = 'ab' + >>> list(iter_index(seq, target)) + [0, 7] + >>> list(sieve(30)) [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] @@ -1385,6 +1474,7 @@ The following recipes have a more mathematical flavor: >>> set(sieve(10_000)).isdisjoint(carmichael) True + >>> list(factor(99)) # Code example 1 [3, 3, 11] >>> list(factor(1_000_000_000_000_007)) # Code example 2 @@ -1430,9 +1520,35 @@ The following recipes have a more mathematical flavor: >>> all(list(factor(n)) == sorted(factor(n)) for n in range(2_000)) True + + >>> totient(0) # https://www.wolframalpha.com/input?i=totient+0 + 0 + >>> first_totients = [1, 1, 2, 2, 4, 2, 6, 4, 6, 4, 10, 4, 12, 6, 8, 8, 16, 6, + ... 18, 8, 12, 10, 22, 8, 20, 12, 18, 12, 28, 8, 30, 16, 20, 16, 24, 12, 36, 18, + ... 24, 16, 40, 12, 42, 20, 24, 22, 46, 16, 42, 20, 32, 24, 52, 18, 40, 24, 36, + ... 28, 58, 16, 60, 30, 36, 32, 48, 20, 66, 32, 44] # https://oeis.org/A000010 + ... + >>> list(map(totient, range(1, 70))) == first_totients + True + >>> reference_totient = lambda n: sum(math.gcd(t, n) == 1 for t in range(1, n+1)) + >>> all(totient(n) == reference_totient(n) for n in range(1000)) + True + >>> totient(128_884_753_939) == 128_884_753_938 # large prime + True + >>> totient(999953 * 999983) == 999952 * 999982 # large semiprime + True + >>> totient(6 ** 20) == 1 * 2**19 * 2 * 3**19 # repeated primes + True + + >>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')])) ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] + + >>> list(repeatfunc(pow, 5, 2, 3)) + [8, 8, 8, 8, 8] + >>> take(5, map(int, repeatfunc(random.random))) + [0, 0, 0, 0, 0] >>> random.seed(85753098575309) >>> list(repeatfunc(random.random, 3)) [0.16370491282496968, 0.45889608687313455, 0.3747076837820118] @@ -1441,9 +1557,11 @@ The following recipes have a more mathematical flavor: >>> list(repeatfunc(pow, 3, 2, 5)) [32, 32, 32] + >>> list(grouper('abcdefg', 3, fillvalue='x')) [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')] + >>> it = grouper('abcdefg', 3, incomplete='strict') >>> next(it) ('a', 'b', 'c') @@ -1457,6 +1575,7 @@ The following recipes have a more mathematical flavor: >>> list(grouper('abcdefg', n=3, incomplete='ignore')) [('a', 'b', 'c'), ('d', 'e', 'f')] + >>> list(sliding_window('ABCDEFG', 1)) [('A',), ('B',), ('C',), ('D',), ('E',), ('F',), ('G',)] >>> list(sliding_window('ABCDEFG', 2)) @@ -1486,50 +1605,70 @@ The following recipes have a more mathematical flavor: ... 'zero or negative n not supported' + >>> list(roundrobin('abc', 'd', 'ef')) ['a', 'd', 'e', 'b', 'f', 'c'] + >>> ranges = [range(5, 1000), range(4, 3000), range(0), range(3, 2000), range(2, 5000), range(1, 3500)] + >>> collections.Counter(roundrobin(*ranges)) == collections.Counter(chain(*ranges)) + True + >>> # Verify that the inputs are consumed lazily + >>> input_iterators = list(map(iter, ['abcd', 'ef', '', 'ghijk', 'l', 'mnopqr'])) + >>> output_iterator = roundrobin(*input_iterators) + >>> ''.join(islice(output_iterator, 10)) + 'aeglmbfhnc' + >>> ''.join(chain(*input_iterators)) + 'dijkopqr' - >>> def is_odd(x): - ... return x % 2 == 1 - - >>> evens, odds = partition(is_odd, range(10)) - >>> list(evens) - [0, 2, 4, 6, 8] - >>> list(odds) - [1, 3, 5, 7, 9] - - >>> it = iter('ABCdEfGhI') - >>> all_upper, remainder = before_and_after(str.isupper, it) - >>> ''.join(all_upper) - 'ABC' - >>> ''.join(remainder) - 'dEfGhI' >>> list(subslices('ABCD')) ['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', 'CD', 'D'] + >>> list(powerset([1,2,3])) [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] - >>> all(len(list(powerset(range(n)))) == 2**n for n in range(18)) True - >>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len) True + >>> list(unique_everseen('AAAABBBCCDAABBB')) ['A', 'B', 'C', 'D'] - >>> list(unique_everseen('ABBCcAD', str.lower)) + >>> list(unique_everseen('ABBCcAD', str.casefold)) ['A', 'B', 'C', 'D'] - >>> list(unique_everseen('ABBcCAD', str.lower)) + >>> list(unique_everseen('ABBcCAD', str.casefold)) ['A', 'B', 'c', 'D'] + >>> # Verify that the input is consumed lazily + >>> input_iterator = iter('AAAABBBCCDAABBB') + >>> output_iterator = unique_everseen(input_iterator) + >>> next(output_iterator) + 'A' + >>> ''.join(input_iterator) + 'AAABBBCCDAABBB' + >>> list(unique_justseen('AAAABBBCCDAABBB')) ['A', 'B', 'C', 'D', 'A', 'B'] - >>> list(unique_justseen('ABBCcAD', str.lower)) + >>> list(unique_justseen('ABBCcAD', str.casefold)) ['A', 'B', 'C', 'A', 'D'] - >>> list(unique_justseen('ABBcCAD', str.lower)) + >>> list(unique_justseen('ABBcCAD', str.casefold)) ['A', 'B', 'c', 'A', 'D'] + >>> # Verify that the input is consumed lazily + >>> input_iterator = iter('AAAABBBCCDAABBB') + >>> output_iterator = unique_justseen(input_iterator) + >>> next(output_iterator) + 'A' + >>> ''.join(input_iterator) + 'AAABBBCCDAABBB' + + + >>> list(unique([[1, 2], [3, 4], [1, 2]])) + [[1, 2], [3, 4]] + >>> list(unique('ABBcCAD', str.casefold)) + ['A', 'B', 'c', 'D'] + >>> list(unique('ABBcCAD', str.casefold, reverse=True)) + ['D', 'c', 'B', 'A'] + >>> d = dict(a=1, b=2, c=3) >>> it = iter_except(d.popitem, KeyError) @@ -1548,22 +1687,15 @@ The following recipes have a more mathematical flavor: >>> next(it, 'empty') 'empty' + >>> first_true('ABC0DEF1', '9', str.isdigit) '0' - - >>> population = 'ABCDEFGH' - >>> for r in range(len(population) + 1): - ... seq = list(combinations(population, r)) - ... for i in range(len(seq)): - ... assert nth_combination(population, r, i) == seq[i] - ... for i in range(-len(seq), 0): - ... assert nth_combination(population, r, i) == seq[i] - - >>> iterable = 'abcde' - >>> r = 3 - >>> combos = list(combinations(iterable, r)) - >>> all(nth_combination(iterable, r, i) == comb for i, comb in enumerate(combos)) - True + >>> # Verify that inputs are consumed lazily + >>> it = iter('ABC0DEF1') + >>> first_true(it, predicate=str.isdigit) + '0' + >>> ''.join(it) + 'DEF1' .. testcode:: @@ -1587,10 +1719,65 @@ The following recipes have a more mathematical flavor: def triplewise(iterable): "Return overlapping triplets from an iterable" - # triplewise('ABCDEFG') --> ABC BCD CDE DEF EFG + # triplewise('ABCDEFG') → ABC BCD CDE DEF EFG for (a, _), (b, c) in pairwise(pairwise(iterable)): yield a, b, c + def nth_combination(iterable, r, index): + "Equivalent to list(combinations(iterable, r))[index]" + pool = tuple(iterable) + n = len(pool) + c = math.comb(n, r) + if index < 0: + index += c + if index < 0 or index >= c: + raise IndexError + result = [] + while r: + c, n, r = c*r//n, n-1, r-1 + while index >= c: + index -= c + c, n = c*(n-r)//n, n-1 + result.append(pool[-1-n]) + return tuple(result) + + def before_and_after(predicate, it): + """ Variant of takewhile() that allows complete + access to the remainder of the iterator. + + >>> it = iter('ABCdEfGhI') + >>> all_upper, remainder = before_and_after(str.isupper, it) + >>> ''.join(all_upper) + 'ABC' + >>> ''.join(remainder) # takewhile() would lose the 'd' + 'dEfGhI' + + Note that the true iterator must be fully consumed + before the remainder iterator can generate valid results. + """ + it = iter(it) + transition = [] + + def true_iterator(): + for elem in it: + if predicate(elem): + yield elem + else: + transition.append(elem) + return + + return true_iterator(), chain(transition, it) + + def partition(predicate, iterable): + """Partition entries into false entries and true entries. + + If *predicate* is slow, consider wrapping it with functools.lru_cache(). + """ + # partition(is_odd, range(10)) → 0 2 4 6 8 and 1 3 5 7 9 + t1, t2 = tee(iterable) + return filterfalse(predicate, t1), filter(predicate, t2) + + .. doctest:: :hide: @@ -1598,11 +1785,58 @@ The following recipes have a more mathematical flavor: >>> dotproduct([1,2,3], [4,5,6]) 32 + >>> sumprod([1,2,3], [4,5,6]) 32 + >>> list(islice(pad_none('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] + >>> list(triplewise('ABCDEFG')) [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E'), ('D', 'E', 'F'), ('E', 'F', 'G')] + + + >>> population = 'ABCDEFGH' + >>> for r in range(len(population) + 1): + ... seq = list(combinations(population, r)) + ... for i in range(len(seq)): + ... assert nth_combination(population, r, i) == seq[i] + ... for i in range(-len(seq), 0): + ... assert nth_combination(population, r, i) == seq[i] + ... + >>> iterable = 'abcde' + >>> r = 3 + >>> combos = list(combinations(iterable, r)) + >>> all(nth_combination(iterable, r, i) == comb for i, comb in enumerate(combos)) + True + + + >>> it = iter('ABCdEfGhI') + >>> all_upper, remainder = before_and_after(str.isupper, it) + >>> ''.join(all_upper) + 'ABC' + >>> ''.join(remainder) + 'dEfGhI' + + + >>> def is_odd(x): + ... return x % 2 == 1 + ... + >>> evens, odds = partition(is_odd, range(10)) + >>> list(evens) + [0, 2, 4, 6, 8] + >>> list(odds) + [1, 3, 5, 7, 9] + >>> # Verify that the input is consumed lazily + >>> input_iterator = iter(range(10)) + >>> evens, odds = partition(is_odd, input_iterator) + >>> next(odds) + 1 + >>> next(odds) + 3 + >>> next(evens) + 0 + >>> list(input_iterator) + [4, 5, 6, 7, 8, 9] diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 6c305938..bb7b1852 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -1,5 +1,5 @@ -:mod:`json` --- JSON encoder and decoder -======================================== +:mod:`!json` --- JSON encoder and decoder +========================================= .. module:: json :synopsis: Encode and decode the JSON format. @@ -13,7 +13,7 @@ `JSON (JavaScript Object Notation) `_, specified by :rfc:`7159` (which obsoletes :rfc:`4627`) and by -`ECMA-404 `_, +`ECMA-404 `_, is a lightweight data interchange format inspired by `JavaScript `_ object literal syntax (although it is not a strict subset of JavaScript [#rfc-errata]_ ). @@ -54,12 +54,23 @@ Compact encoding:: Pretty printing:: >>> import json - >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)) + >>> print(json.dumps({'6': 7, '4': 5}, sort_keys=True, indent=4)) { "4": 5, "6": 7 } +Specializing JSON object encoding:: + + >>> import json + >>> def custom_json(obj): + ... if isinstance(obj, complex): + ... return {'__complex__': True, 'real': obj.real, 'imag': obj.imag} + ... raise TypeError(f'Cannot serialize object of {type(obj)}') + ... + >>> json.dumps(1 + 2j, default=custom_json) + '{"__complex__": true, "real": 1.0, "imag": 2.0}' + Decoding JSON:: >>> import json @@ -95,7 +106,7 @@ Extending :class:`JSONEncoder`:: ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... # Let the base class default method raise the TypeError - ... return json.JSONEncoder.default(self, obj) + ... return super().default(obj) ... >>> json.dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' @@ -230,28 +241,28 @@ Basic Usage *object_hook* is an optional function that will be called with the result of any object literal decoded (a :class:`dict`). The return value of - *object_hook* will be used instead of the :class:`dict`. This feature can be used - to implement custom decoders (e.g. `JSON-RPC `_ - class hinting). + *object_hook* will be used instead of the :class:`dict`. This feature can + be used to implement custom decoders (e.g. `JSON-RPC + `_ class hinting). *object_pairs_hook* is an optional function that will be called with the result of any object literal decoded with an ordered list of pairs. The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders. - If *object_hook* is also defined, the *object_pairs_hook* takes priority. + :class:`dict`. This feature can be used to implement custom decoders. If + *object_hook* is also defined, the *object_pairs_hook* takes priority. .. versionchanged:: 3.1 Added support for *object_pairs_hook*. - *parse_float*, if specified, will be called with the string of every JSON - float to be decoded. By default, this is equivalent to ``float(num_str)``. - This can be used to use another datatype or parser for JSON floats - (e.g. :class:`decimal.Decimal`). + *parse_float* is an optional function that will be called with the string of + every JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser for + JSON floats (e.g. :class:`decimal.Decimal`). - *parse_int*, if specified, will be called with the string of every JSON int - to be decoded. By default, this is equivalent to ``int(num_str)``. This can - be used to use another datatype or parser for JSON integers - (e.g. :class:`float`). + *parse_int* is an optional function that will be called with the string of + every JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser for + JSON integers (e.g. :class:`float`). .. versionchanged:: 3.11 The default *parse_int* of :func:`int` now limits the maximum length of @@ -259,10 +270,9 @@ Basic Usage conversion length limitation ` to help avoid denial of service attacks. - *parse_constant*, if specified, will be called with one of the following - strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. - This can be used to raise an exception if invalid JSON numbers - are encountered. + *parse_constant* is an optional function that will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This can be + used to raise an exception if invalid JSON numbers are encountered. .. versionchanged:: 3.1 *parse_constant* doesn't get called on 'null', 'true', 'false' anymore. @@ -334,34 +344,33 @@ Encoders and Decoders It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as their corresponding ``float`` values, which is outside the JSON spec. - *object_hook*, if specified, will be called with the result of every JSON - object decoded and its return value will be used in place of the given - :class:`dict`. This can be used to provide custom deserializations (e.g. to - support `JSON-RPC `_ class hinting). + *object_hook* is an optional function that will be called with the result of + every JSON object decoded and its return value will be used in place of the + given :class:`dict`. This can be used to provide custom deserializations + (e.g. to support `JSON-RPC `_ class hinting). - *object_pairs_hook*, if specified will be called with the result of every - JSON object decoded with an ordered list of pairs. The return value of - *object_pairs_hook* will be used instead of the :class:`dict`. This - feature can be used to implement custom decoders. If *object_hook* is also - defined, the *object_pairs_hook* takes priority. + *object_pairs_hook* is an optional function that will be called with the + result of every JSON object decoded with an ordered list of pairs. The + return value of *object_pairs_hook* will be used instead of the + :class:`dict`. This feature can be used to implement custom decoders. If + *object_hook* is also defined, the *object_pairs_hook* takes priority. .. versionchanged:: 3.1 Added support for *object_pairs_hook*. - *parse_float*, if specified, will be called with the string of every JSON - float to be decoded. By default, this is equivalent to ``float(num_str)``. - This can be used to use another datatype or parser for JSON floats - (e.g. :class:`decimal.Decimal`). + *parse_float* is an optional function that will be called with the string of + every JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser for + JSON floats (e.g. :class:`decimal.Decimal`). - *parse_int*, if specified, will be called with the string of every JSON int - to be decoded. By default, this is equivalent to ``int(num_str)``. This can - be used to use another datatype or parser for JSON integers - (e.g. :class:`float`). + *parse_int* is an optional function that will be called with the string of + every JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser for + JSON integers (e.g. :class:`float`). - *parse_constant*, if specified, will be called with one of the following - strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. - This can be used to raise an exception if invalid JSON numbers - are encountered. + *parse_constant* is an optional function that will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This can be + used to raise an exception if invalid JSON numbers are encountered. If *strict* is false (``True`` is the default), then control characters will be allowed inside strings. Control characters in this context are @@ -493,7 +502,7 @@ Encoders and Decoders else: return list(iterable) # Let the base class default method raise the TypeError - return json.JSONEncoder.default(self, o) + return super().default(o) .. method:: encode(o) @@ -548,7 +557,7 @@ Standard Compliance and Interoperability ---------------------------------------- The JSON format is specified by :rfc:`7159` and by -`ECMA-404 `_. +`ECMA-404 `_. This section details this module's level of compliance with the RFC. For simplicity, :class:`JSONEncoder` and :class:`JSONDecoder` subclasses, and parameters other than those explicitly mentioned, are not considered. @@ -703,7 +712,7 @@ specified, :data:`sys.stdin` and :data:`sys.stdout` will be used respectively: Command line options ^^^^^^^^^^^^^^^^^^^^ -.. cmdoption:: infile +.. option:: infile The JSON file to be validated or pretty-printed: @@ -723,36 +732,36 @@ Command line options If *infile* is not specified, read from :data:`sys.stdin`. -.. cmdoption:: outfile +.. option:: outfile Write the output of the *infile* to the given *outfile*. Otherwise, write it to :data:`sys.stdout`. -.. cmdoption:: --sort-keys +.. option:: --sort-keys Sort the output of dictionaries alphabetically by key. .. versionadded:: 3.5 -.. cmdoption:: --no-ensure-ascii +.. option:: --no-ensure-ascii Disable escaping of non-ascii characters, see :func:`json.dumps` for more information. .. versionadded:: 3.9 -.. cmdoption:: --json-lines +.. option:: --json-lines Parse every input line as separate JSON object. .. versionadded:: 3.8 -.. cmdoption:: --indent, --tab, --no-indent, --compact +.. option:: --indent, --tab, --no-indent, --compact Mutually exclusive options for whitespace control. .. versionadded:: 3.9 -.. cmdoption:: -h, --help +.. option:: -h, --help Show the help message. diff --git a/Doc/library/kde_example.png b/Doc/library/kde_example.png index f45048956999741a6889bdfe85c40e1f25e8863b..4c26f26292faa51ba0f724cc50cf9fe7226564c0 100644 GIT binary patch literal 315150 zcmeFZcT|(x)-Fy}ibxYdK#B+`y-1UeTM&>U(u4p)1e6YuCLIDO3aE4m#X^@Zy@L>G z0SkoQ0zrBSz5Z7AIp6(#W5d4pJLj)^$2en;O^xAw*Spr7&wQR|&KJ7cYE%@=6a)kW zRO)yB&?6wAq#+k(f2=WB=v2*RHbko@yCCg3yvOAY*o|Mi(To$&vE z$8@6qdNn0YI`MyfeO4C#?|A)CKfxz*mpcz&1O#G@`2Pv7Ju(?4AW$Mu|3g{di*Rvt zxAcNR>hW>Q71`(C`0^;PQAKG}MAk!FMOP_Dy-W&v*2{vzF;jqy;rzYg2x$s^j$o zEVcfaNU8W|!`uJXd&QCYGBTf6i(-B9^v0RzEZlDY&Z9MHXbh!f?4Y2ja6GJ;BKx-% z+mPtYb9?S5iWJw<1Bw2%55Ix}38!vK-#LHpU%&Vu6LKbwg1AqI|N5W3rh67#^TGs& z%pd>8aj@fl7+7iecI)H6dbiiol`fNkYYqvSrujEkIy(+5mWldM^uM^s`1Nt;0M~r} z{M%dl|N8z<|IY*dA8+jcJm7yJmi^}h|Bv_8e@^hfu&)S7{}ZDB=Q-j(Irv||9{LHFVRhHj2AR*PCMGjTAj;EJJVe8MLXqYXjYp4 z&8|dIt|N1E9l?rU{rRRXpsHc*FSK9}>4m57Z?CXl6fmaY(Rz1bsLUSi76R-1`-cVj zNaR@f{m`T0R3Q3zlL!_NF(OT*zTPL-Tb7y7&H@(rF;za^rGrQ?{cd({56$gVG!X~X70?jJqLQo?tW z#JHc%{mA$=U!SF9Km=}uvao*7&TFM^yZHq@uNAxB{uWiKZO{4pS=y0l?+x4+HBMhk z-FN`XOA;Y>P6m-{LaPV3o^Z6ekDy_MR{WL4{RNBTn|I&c$oW7cYG9J)vs_i=Fj(R; z|10NH4bzpQ@6rAjGIi3}Zh9{J?z#uu1IzS|Pszn=cYS6pEc8>Myw4WAV%%SLV|i5e z)g^Hr@4+;RUw0pNzmu5EuNbovSs`P1$0OBo+!xn9(@`|I?OUL9pCr+_tFYEv?REg$-w+R#C149WY;P5uc;FP*bPEU= zl#D(be@}nwS|ZfP6n_5lyiqkT$C18L&^t1OVt~TxH~XcbGD^o`!>zQ}Kc)1hH|Oj( zg&Rek=3Si}#zeOrx`lgxVTKO4JYJr*5?ZuHM6UNYAVw#jTlSmAFe;YjWas)zTg#)S zy-@JSn->R5TfV*Fx|J;HNHMleiobP}ApEHWXCGUD+RQ}QquOJ5Tk;C)nd61bnE8=( zDvRJ4di{PM-u(GNsY*|(JZyivb&odv!x4*fEv>oFQkk(#B6K7}GeN{}Z$kvEV{e{O zVT4DR405E?eg;)j>+Y8?Mi{jqyHZPkQP`X{icOw5WRexVztW&6xBiW5vW><0^XFR$ zhNm2;Z2q8*4z*u>1v17bOWbq?5;7|KvB6qzSW_Ump8UaTi)BabbFd;z1zc}8|uzud`*2yQLn_fWjSqWkk-q~~_U^e#gD9xa5zr0AwM>Ff^zEih7 z#=`nHU)lHGJDMKj zvu8hg+E_wa#eLuNe zvl68!3)c60CMrdiQPOFI3BT=k>OkI@>^F6$Y6+vFRJWMzNsAt~sB*I&D0eg+QJDN) z@3$W&yIje2H&sq%V`W^i=y+~xsbajX-g9x_-WTV1q$@~8mLQ~CcE$@@9v>Y}g23}0 z>>Sr)rcSUaS_CUb=x(~t$Bz9G6M)nIlo z*NhH%MO=XXOO3O(MYFR9^v}1k%MGX%RMdDZMad05+D;-`R2 z(utJ7jxUea2(ugQedQjmY%6iZ+LgN^R-yZdni)wf9r_L`^ikT|qnHIr*bGW`o}eFGlCijw?sZB;m6SCgahcA{{h<;D&s zI-HRB%nh#^<8j5^b{(sMC|$;;-w77}GGP~9Zt7$$vU85{rumA6wRw%jsuo3IDgkyI zfhH{_FVX5Hi`#0SyPH72@qwDizDIr=LTq84Cgp7IHT^~nywj{vwP^Sl03t;I-i;JJ zc(zaSn`}mYYXB5BEX`OKroi z-_L}zfiqLyF|$psE?zOO-gwYo^wB|O|n0H#v&HRQ>>>ux*Jt_i{>(U=`QVnB$th8ugG=f4TQzg9 zM2*+_>;;luu?`V|y$gj6Z03HOeM*nBMpVI6q2OF}ySk-tXgj(S_r%`iO*<*MMd3xP? z2ft{qkyBbF{mrAaTdxa&dld*|9U)d#beFpbew9mTx8rtJqG z-!8rsu4meQudl062Yr>cnFxcxDrM4*-Sy+UWy=xHgJ_xUfq<=?oJeq29hK{HUTL}C zAf4HtA?htJ+{yQCStjjr`^{gpc~qh3&1Vq86_e_}cam&V$w3^6#KC()-CD5v>)fmz zT3p`fpS7+oBM(-#8;<=D$?!e!q-Y8Y2hdYY;zqyu3q>nRa4%;f>QXn}NLj?V53r#l z+!TqcXoD7HwtSbV_6x3vM;?(uVYpj+Ji$9QsAHD`mytoEy`1SiR5_U(Eb9Jb;%wZF zD0<~t#pB(cwahaGqWXg=ehdrhRhp8@+9&(VO=YIH-c}I zcx3zTgs>lQ=$i`0O|UB4)aTX~7wKhbr?|C*w6^Jx-r{?ycUYls-Cny1@-yubPVrcL znZTY$o-NpbK$ncU6m*BAwEZvMzULa@+Bt1vw9eSBN^P zAiIe7sul`rI!xkvAbgv+-Cwb7kXc-)4617EZJbYzekxNuEJkO{AEO?}s-X5enr}T0 zl~L>Or*+EFop1(E@z`e4`D9LOWS~ti;f&*yavaj{4FI{7*uaE8=f;EHc28lN_$mAL zoZ35HImTQ!)b2!!Xy+8F@vh$0EmwC=qOa1aEZZ@9)^m_`vNqDeJX5VKrLzdjUS0 zRFM{NLmN6{)nZ!82)?fCx z>-du}>NYBL(RaAa-e^L(&xP-7!Y~<>jsqn*QutK{>B}*Vl8K>G&O*NKGKjY=z+N_r z=auf3NThk3ldLISKob6vv@3~=Nn9=4p_6q|{EAQ1r&%&&BJ}=CRSUU-r zbb1AlK}u#vYj>qLh6+g|nF2}{CMhS#Z3Zt~`JKR5jd~!g2ckfs)bdF^#>%At4~Ydx z+Kt2QBE6Mm`NZ^c;yTjdy&aCNDn`oEUHRR*Fk?t$vs>%JL?}@|<-76w z`}eo?IV9?2D*#xN-pcy03@4|zdj18WdxasI+!Y%tzLxQB4bWO2g@Z(+B!bG_7y56H zgMS`(<&tnvnT9W=2bQ9?aR+b{wEWbzAz=>Z#hYEXM_@YVtmv7B>-~I;>z=tEJm8x! zYK690bB$JXGMF2dZ%bq!$uPA^=El>JER{k z+U8@K7+Tl?dh=rAHSpM89%b3)Wx4q2Ex)oVYS#fO$E6na3Nu@GbwG1-bOX_X5D^)k zfLzaVMPVA0iX^3ts?+Jf;e+Ti*2HQOkcI$M7col3(WUWyOGdUy(+AfWA=h^ntlIge7D z^s8q~UK=gNA2~G~ZteI#OW|Mhxk-?+oYp%x>N$RSmbtTtI+1r)_1OcW(UIpd=)`S^ zR5n@n3X>bvc(uEIldUW+0WBjLX~1c7w`*+!VY@#-`*aq@(gNUG>#8s^y2mNErQvY2 zn-s!Tvf%cS7>b9z2GcdFj0zJ4(w zr0mdasQ&tG{i@lQ$M-%%5~;-QZ6+4cab~yi35cr(d+1MhOA)p>D z4P?J3QyHDuMII`7O}*f?ViH==PG5T;&K3c41WeE*fSC>xsA66Ssu)>+J#x3LIAF0D zX(h3+aex__ItT!z1Vytqgqp0K_KtwN(>+&N@;z?M^iUHOp}vr9R0az!s_JXV5)4YX z-{G(4US$|**EBaj%F4wjPQRrsg%TwC3_oJFhdW%7+K;6=q9d7=6OdBsl6WI(9TEq@ ztvbz1NYw~Ke8{JG{PP+c zbY@6dI?+XJc=BMTR^3^6E~H13O&|dREs>%YWh5W9DHQhA&g6HY|Af7{3#z-TqsTO0 zA#qSF$K61g6%cy|d7+l7V6$PD#BIJF-rcjVcZ+HA+a6`yPI4CE2t*v!yucCZ6eJ(W zTi!o~*vXCr^z@MQ(94tDi7tnd$jgUDP`To^G9WQwVM$npLQ`{8f3?^&_JghDDK@NgN!In{Ca`=XqF zsZoo3e`FYqO*yR_*V8*nQkU7Z<698hG6f_X*>4{>eq84>kSmQ`9j5kQ4Kc2&iIwf7 zUFI3sZaT|;<9C=YPm@A?JLPW)ekp;nILrhR>8bn_Q{U%M+ zj?0|j%u-Gx#=U~*iv`MXZ_UfZ1%(iBflJOBcPF}22c@Nw+jac(+RaOf?~MzPa6MdbLAzVx>Mqj#sxXNT$Ke|_ zwikyqURqLnHYmDU?SQR}gh|hGWobkM`OdjJDqm)N*<9`uz+U3Gd?GP8A)oGcr<&r~ zzAkdPq{6{A#8r6rxO~Q*wM-NXx*O1QlE1?umJhU=wPfa4)R+aPPff%TBtwQ@zEGaP z%%B8|6;z6Asm*O9Q6;aVBXO|fdU(f0kcETmx4KJ0$BT^So9$cV(vhq(CFvSZ^fsgI zn)+_k-%Ne&oI_wBaY#qQm8dqJp)x?SOcprfm^LvA_)KAFohz9zxtAR;Ieu*--y`+UjlG(T>ThopYW<|dy`qzz&ukk!g z&i@>-|Mdm^M{Aj75^>j_Ff!NKO1kB|OwnVq^K{Sot(y+GvJnM=?;N68D6?Os z?O}Ql7STSZ8md=r;lz*38L2PWa6@E~SD(Z0q$-V2;{wGQR^s3o64RXY6ekiha&7GB)n-;1Jh|FU+ZCPX9`(s_ z-QTuh*LMcT=`)s+M&9A2gAkqAqc`Vr|UwY3{>UVpIxCJ!yp>ysW$Jbv}YZfOQVIl|gh z^_r>?CggH?V9U(iHu>b4PFHdyIY)zT`)+o?c0JLyH8p+ z(uS^Mq`Ya9w;lhJm+%SS7d?Y7@sS)H2I6=?(F=4$)f!-X^m4kk1~~sJ!tSTxB*eJp zx&bT53t`I}xzBA(%?U(m?!pwZ_?#rqwQnVrE_zlqc@jO-Z{UU)J^8rqVqTe0zuxSY zvB&!r#rjRM*~y!8ZqaRU7M#yta@Fn&@qRTEGUpM*gSs5J!e7O<-nkBRe`raewjHD; z5B=qjqXZ4T4VuW$V?!U8?kDTBqt2Ah#S~d@Nk2jtZph4Pj#Wyd$$uokA~nj}M|f6K z9Z8hEAF=GK+>w`6I}f-zFNl5Q?k!RaK0YZAr*#FGAd8+>S7kjcL}Sd>s^so^Os~&a zS;}gF1Um84xSPM*VwEU2OT5hyuF9<2)>CG<+cYdNz`W1v9QjYcYRWs8ji4+0>FawW z<*Gb}Pp&gy=ec@U8x+u)IzD&}@2{`8#)+3Ai=J)Hzk@#{dqAhsB^ms9=8Sxdd(NkC zMjvch4sG+&Z4%lQcz>xjzNImgVK`g5knqg^_;4Fp=+nbuKlThRQv8ilI7Qw^(m&2` z>{+cU_iescHZ00RwXdNbRU5EiJ8vk@xjqDE;YQ-RzwpJ+mn9vHpMIY9qDx2IbhrBr z^y{(Ahh0>65v8pypP>E`B&n_J8{ffXikUb3@N9tBqkrxyL`t-2PZY9JXs6+@KT27m#C3)g>N0{*t!iHtOqw2(8!K&amzaL!a5UQ5EOIm3VQMgyNbcK zvO^HryQpBc2{SUYPt3X3u@tL%e$v9(srsBK7F?WHWW<`cR2oeYs^-PVUrd$eSU)GA zz+_;3PQo;$8Bka9OTnm4JORZD6sER!_nm}&GyBnM_$nZ~V<8Q( zn)ZIty&OR;a>BVZD`Ryvzk6k($!O>w-K_wUWSd4wYi@UDLO$RD_z0%}5ie;RS=Hg% z8P>oe5Q~FXb(9Ip8p-hDh`v5;Did^$qTx6?TnS)r!D{Uy+ArDU`Mr?2|3aqUJB@oI z#C69&5pXS(|CfD_g>*ZE%b;u4wn|sg18JE50tLwW#6tADzbp}pGfMc_) z(O@~WHkDv_p7Y^>`fL80ZWBe`*J?^Phc!s0MW>}_cCGaCoy&uThaX41e&8|wQr`Cb zBjhczSF6?;oJCf{*EVl1?_jH-29dH0)-3yjkS0g0g=AunmqxeZ81Eg;O$U|Y!L8ld zG$h|weKT;pJSvyUhutdPm=&_6-mglqYqIcNyB#v=G+ZudQdH>e2&k4SLMZE8v^S)) zt=6jE=GFwnp6oy@6@Q(Dv>8NSfyzQ5w~l%l$s!dteza9#2?|ixs1g7DC8KWEc35}y zj9`p^zVWJL-Cdamdbf;12MlvR>!jmW%@4nxsIr`%q>m)eOJ|9c9|r&GLr`ucj0zVF zdIx0Pa6c$0JV}>A@`yr@?cDM;D#uSb3z4K`^>_n`VX;}gueY)R8mKa1K(Q4!jGpHI z$?phv%T7;rtUW?19*N4~y2J-7nEm{LxDjkkrbIhrY3j}SEttV%l9FVPkBa&tF5~73 zK0~i2G#q41$vZC9lZ=rCTl3SiqsMa&g1t ztv1A8;r8VB=|y@dOBpF?fN*?c%V@z*K+?$DZ*8h|jpvO<#RG=|H>%8W2luI?!~Jj| z$Rj6i5H2`iYAyXgn^p)JTBd^dmk1mZ6FkxOb!*=7o1fd@J&b!(dx@S0xpOi8m21x% z=(FKEiSZg}Ice%d>UOP*zN)r`gMALA*B3;jKxRRs0my1=a4%Vr*plmc8z_c$+>$a) zsVqM7JymEYPwQ+)#SuY_23bm|(K^!$@#nv(0!;r?~~LSDFvZN8K0u z?X*3y?yySn?OZC0Xds}TAtV1p$J%8Np9e0b3+%%6J67jnwUZ?U%}sMhoyI)gEtD0Q z)tpiJ3KY-tXQ|m7iXQMSEf1CPKjN>r9~X-zH_kK#v;x#+3&>-48Xz&_FGG1^Q1&tv z8fIK=uP)K2ybXL(a=4*`{RWInQ_$}pZcnEAER%yg6Wuib48b+$SM$!F_gXEe*^As} zI=mEY^O`F9{bowv+ItrFLuOTqm-eeqgERG@eDP(pFgTeNvT;aXma8zs2r8;-Xg0sS?w7)Zg7a9dQpST^;rnmC=ySR3|Iic;W#Bjb zn#@Q>=ef|I|BEkwU7n8*Xn~a+N(lW+Y%*?-LUcXWpLy68=xYjA#C`T9vS*(RqF!@XRnp7IS- zP8^_qMY~#!I&Aao$~VSnnXwDY ze~}Yjk8B1SdC91Rmv-5(ZJM8?3$&A7M~-&ZD1_AahX9d&558$;YMk&u{$VHM!zfsH zJ>Z}p!XQ7?o`)U9Skm*_vF2@;X0}ACmAeV3RTf`feEsuX_woG*{G_Pysik71z_R|_w z=WB86dTDUc(e5~|U>sELjkO)+fIGdRnPE`=(kJ!oGT5@@AR(j97f#LQch`+vPH$es zi-2stt4*tu;p|~}lULZ2pM=9tEo$q*agjz=@`#}4GhCNlG0k|z8dwbm9}Yl-t2nvH zY1m~w1Qcd%t2coy>>Qx7pDqna9J+P;3riaLY%N~OL%}e2?z2E=E8|REva$0A++O>e>%lp?DhM6%i=XeX*!EOW48Jp57JI8D|vynM2KYPDug9)PLLkbUYQ?n2uPH$H$1m=QQ)=rd*i^wbSBOs@LTKt)hFCU z8NTEjW|8%923+$4+n!V^kZAJYh4a=gNh`=l=~Zi(NBLW)4zOV)Dj$GlE22*m4Q!IY zuVv875ce_XPG^}lh+9Ds<(ogqXzt&WV&TBbL<66dxZxGY7xOJl7b&&esCYh&y@kc4 zb1UP3A{qvgWt)u3w^$0)U>mD9K;szJBmfc2y5B6;{~E@D46o`_pTaRr=6?Tr3g%AS zUTvVz0x+}4;C)T4#9zHRJyE1bTTj|yoD1`?li)}xr~#1UN6DcLr<`LWNT6LJe20wk zo`lFKnQPtFkbUuw3E*`~Ha(QA^DR#2wg}gr_}PCW$f}-XwZPD#xh3VMJB5B%Js|h3 zmH24zs*{M?F7qz`pi2*B2W^x!Yk33t#0|IUZ!SQH4Hq;mhclXcanf8x8760ltpF=! z%Ns5=A_lvKj7<vK-x0xr6UH06BDMWcPD$~G%hRkGvACzT8zqET;j z%i_A=A%d^no6rhuD=En@8(yRJr<~@-WBSUH<1!2D)0U6uPdtAYL??f1-z}}?hQiu) zjh(5N!X?fOa=Z_}8a=aRv3Q~VFgzl^e4aGhLv!Yck&xgF`%r2=9>XmzluYNDIH zTRdwd;^f-s=72z_(F!p?S#du8paje(R)GtEU+g-}^$K=%uG=(J4xL)G$KjUfvXSO+AIfNptTP{697G?#2 z1nJ6sKWXQ>VAAAOBIO?7h7@%vRW5hEJd1eZm=8`f-i%o6=I-IpNAg^z%?Q(d;XyM0 z8sed&xx0DPcYF!ubGe=l^KBspSN;~$QPsE^UTn)U%bP}gn$a9-LL>M__(zfK$V#=G~Qg@P>?zw0Co&niQb&du)^+i3=^c5 z+0PloOJf6xnjZDQ%8}eycu#g_o$u~?M4k?Cjmk$O_>y`YL5126Jb`YSxy$xfgitj;sc=L6BmJ&`~ZjpQF?Vw}BO?n-|) zZrT(BY31(8{Kb0RrwsnZLC)Y3!xy}gZ}I)xo}l^_g!%OBAg za0Dh@(Jx7x-xRW*apMv+hJdHMr+)M|jOgRx{%JflQrJi@lx%d3+umaP#CYt_aMNqU7a zvv2zsiBYC}dPYC8-`#al946y}VUXDF9Pu3Y z!&^qHnmz-Q9lZ4=<5|837wt*VWTsfs8nXU-gh2SMYc&+!yJ^6k!(8b&Ts}ha;aGXI@wcB-iE3-Mtl;@MW!&i74 z0Nc^h_>rJ5XtSO?*u_~pzVP1ML|ZTlbh>7!{EmB^BI|jcgtl}ENZFP^z0@k_`2=9E z&_(#nyKn2=-}ivRQu&6f&`Q9-$l}>tMy|@&#bMxrg#HFjz?iC(hw2(H1a<9^FgVCZTM?@*IO!8`{z zpr+`1SV)#myLI)^*01|Iq4z$jl9n5N=H|Q{jN~^eICu6u>vIdWqn8#3SAbQuV8G7k zaKUrT+xGMF9Rj}5)ep@=$j42=q>}|T%XYsK9`e?MLr#HjHy|nS-zrTDW$--*1{VBd z764$%Gi#jI##bsaQN~U0=0D8gt%a)~YQq7>73xZsDr`dc-Iqv~seJtXgKA+_iw-!zh*)>TK1Jux zd!kHpA@uz=i--`sY;(>KlZM6@hj^>h$m_AVb2Rto5?rohI@mn1H-lW9;_tL+g&H)! z0Pd6*eLlG0oVi1&yh_u?EsiREj7p? zf>#L*>LtiH7Dd%4)=RT~&+c|DMJw!GL-pY;$Rofg!_EJpR4yPyq+$$wvm-MM@ViLB z(SZmk-k+k6PU~RkB?+23w)zFvHZwRaiue+$nBx0O^xZx+o0rqFU6oez;wda)pOhfV z*5~TV+tJ8g#XH2HOfMRHK>AbxUSR0&x4CchnXf)q&4BWS(d}q3GtiV;7EjmN&&)oj z3XUC{*HYfViiH}=|6(j}Bj9Jt7Kg^$;TUH98-v2soFNobN$GK~`dp_JU7 z{O|I0(Fo5M@|h$W^=_3pt>jf!S(~mzRjHnmuJ$&fuR9{_E>8;DB=N>VrVBRX zC6USJ{I_eyLuXTcgqCjsJpQ^h zWEvGbGKm*3bDif!{mVtv)^qcDDRB>4xlH>~p}Sq;J@A>%1Z2vOXYBBn6Bc_27R_F7(~Nh$IOBJ8lbtj&v;dZxyVl?x1R2Kc`JSrAp2e!(A-=7w?a}cQ znN}(2*#!|LNVHnF=!uf4(STQpV-@(nq9-pA-JDZ(Zvwzn{tWj|1GyM$G6wmbi4ajQ z)j)n>Cg5Nk@Y4VBPH(X2?a~*l^;(Lgqscj~d#=(w35~3i57>-uebkd^63LyQd)R3Y zKjVF)pG=JIDKL+jLSIUHv3sJ(iQ@EspeXN6X{Q$y>plsIYVc{Uby|WYb3E1Smbj#7 zd6Q^C?lIGMjU~!M7r)9MgxY+nybLjzbiLzScO+M^&o!cmmED7j)q6$y{6Z`M)Mvi+ zg37$MSx5RjLKsp5n#fo~UJq)C8IkK?L-|TOGt&~pto*0DX;Ed?^#lW|E)w#L7I%g2dn z8;Qstk41wX1STvhg@rBPV6Cw@&j3@&kjJWZ`x)QQ1UujX=JV?Tgzt^5!KPwvrLJP3 z3RmAw`L>xYZwbM0nc2rs!ec$;8@_r#bVSCz$}4_PA%-loXz;f#M2TwgeX=#0f=pzR z9`U?iF_9=3jO_ky;@Ii`S3yfxDaihIBf(mk+ow^T6NMRQB~&Mf)JTQTltj)q`DS<( zs}_YdqI3fGei{eG6y`f?EPzVi3s_I`&Id?Z59hm@1^dFE2Y}?*T4?T^D{LtkTuf47 zV$VfzfJ-};GtBz@D1cl-;c(;UB)Z|qoypLeKt{AFg=S6If9)j`NB$#Lb@sV5{gM=5 z6i;8bwReJ?CA$b9c}=b*oe+2LO%S$?>uPhg`5-Si<^f+wJS>z&`zrsc(m3E4s#F6j zGnn^VWDfHz4*7KZ%5q?F(Bst>YNX5KF@;gU+gpNmJp*=&;C|3L5;4n&-gje`s*(dN zUQm&TOk}UEJ@rCDDZ7!|CF~-e5^}EmW*93}W){yaeXtFD!jm9@IR5ah0SSEy!Y{Sj z>1`@7fJ*dE^IlILKj86ilh}kjtfzI$`cZM3Pcq$uXvrQOCw~e>fX*b~6jq7CH{n?m z5XIISK6xDG!WGm2vP>9Ye6K(%T_)YqNZgny8P|?LbA^?}t$OAIKq0)eh(@7bOZ7AH z$8iHk>LoNUqTjeoF*tb8g$c@$*#G`kc$?&db-#0^gc+ZloBQK#v?VR&f&QrCXSUpg zs^vNlqiHT%@J9<4*jWd2(ovAg?QRX(Ev%a*Vc!W_5GsrUx1;B`R5lB@{ zwReSIiU&ysL*X)_nQlB7>(r~-OT!h>Na7wh=1%(8EaEnIcYc42ZeE}1{J0O;7iO~* z?-YIQj1Jx)$F`rwm;smbSuB`|O%3e1h0?mkD!3N#B-WFpT*Cdcgu4V3N`o)+wqn{* zO@N=860MxeOm=fty%VqHFIH}~Z_+LY4Zyd{I^Q$~xL{|!Qy8T+g*PA$e;Vdq{*>D=)8n3N`>#-oj3y0yK4E~Ey%I+XavK>at) zpGA$xHN@1a+GwuKdR?@KKxNRH1$KB^aY6sapp(|x^)xVt%2%VPM}x>PZV zf5g~rA;02G)Y@!X0Gp6`ZK9cgf~`dn$K4e4Z+;*1SXfl?`Tf^UpOFiLJs&s32FGQh zAB4Nd@U-DfIcV=jwHyo=&! zm2yu&Y)T7Y>C(Jsp1B;s>fT#KEr7malc)Ro16V8_s#P!2o)rfB`kb~{Q9*H_5QB_P zFcGXrx;~V32=QZ;u+txWzo{zgc}mz+3hE>x&2XsSkFHL5>$yuUdulD-MoJb=%X$U= z$3#>wqar`KO-6-^BHZD3f{S69AKloeXs`{!feg{6po5U6MXGy6^wLu|`x2i$|H_g# zSS{`gzV8}@D^mXwp`h!{ci`dghU^BV-aE9ZKQA-H-1Q}2n$$e@qMyJda=#bzC5MR# zo5VP0Aj1!@e0`_iViQGI|Iv<{;cmDeBQwuNoTId5OGrG4U0w>;hT6j@SDLHVtX&IV ze8dV}ZSTfai)&-g&AN+K%*DJmm%u1^E<+ailLF$lS{3k3Rd}`=kb837JAqY)|HfDAuzLb#xV(h|AD#391UZM>p2`Ni?K(bKoNSqXskXMwNe&BHZax zK!#M~!yZ>_i=6`-zrFUcNgc>`)jb^7VoMdU!)Zu!^UIZU1Xk>-x;t zr#Ebj=NHx7mfc1zO%XL+_k#B}%(O6jNZUJZS`*dX#g7mhFD^B~%3EZ<56ETPoGUnG zEE0s0=s@a2cd`_3&9jLbma=^woga!+G+7b{W~Xf={Lj)2C}0_}2g zVA%xCgQVqo0#2bb{!B_HD(NExuGTY;OssT9GEZ`3|IkMoC4`mAp74p-wzTM{fL8Ly z=@iAM#o9kLr*t_$lg!9e#s1y9DN$0a#`%CwSz)FofYX}+g?$UKZ502TUdtd~@SeLu z^|>eLsDC1rUJVjJRWp=34AO0_j9Z9&08~;dfol^>{Yi!ApZ`QxAE=D?n8*LNyYn#> z5j;Fc!537NXIkb)s$fiFkM8^i;5-EFce3UFzuwgZyz3M8@l*7-f1rTJ%7iK{$x_be z0S>vw)Cw2_=;kE8j;x)fJPmgJ`LkBQpfFafT|R*o{(1317cUN!+UnqYCZ+xMo;KY9 zmfVZPUrC*J{%f_nFgvaHx69Hk zpcI&>R_?w$A~WKOynN<)smN)>-JkE@apAEA)=lWNj;Via5v5X!r@wnSW*m7MPW&5BiOfa|s3KKo(^Hv3UddpkO7sE~#KY#O=|J&b79|T)PO16sS-x*sr18$%KQD^#h&-ia16#lCI z^LPI@i}M#PKK(!I{NHx$Ul!*t-~MM`{XemOk5#aC^(B|F($i^w28X!x6?tOjFG%nw* z?*}Yb#C~-jiySBVbSawv1sl_XF_sGN4LUL8LWv&4GAY6ygA+kC-JcXcd?3{uo3uKU zU=en83w!}YxLN7hQgI1?gj{|W0P9)o)c~#`JKo0PNoU4c z@1?s-euDb~ODy)F|q83b6umn?p5?XTc1}*%|il3QUrF)K~;>jG__+c`@b#<|2 z5D5SmBZnToU#DQI-3rGy`ALH6qH=Njne!urt5n!1Wpi6e%ER|GBLm zw-SLv8;RZo7376i>%a`PRu?Sg%W0(435hpcyAn{bx=k5?e8dt^vnuuKWIEQ@ZmB(Ng zEicq(;~{SEGt!%YO2h}Jr-AvCL;ir~`cru_GWX^-jHvTkv%=3v!M6pr;CU^l+O@V1 z7-y8!j<10AAOc#&TzQ$s4SpBt?Wd*;z*t%p^mZPwC`>wTq zkse$d*8ZS`&xBUDjsr-^9{= z(7c90wt#ri0>&3XLoI?ojeIQwF1;c!@5qKtYpt6*-aE+V)h^;o92hHwbzTM>#0}}? z+H%kYur9mjq|SE^23ZGf(1$_9XAOU)o$RGiS|SBgi+t|;oItNZ{2Z^h89KZR&4RRs zGl&F*{`4_6f&-yr^*B{`4V(acpX<4aFFW5|3BXzbA3MIsv{rQbW3)m$BQ?Jt?+ZfK;(Q6veb9CkxEy~oz+R}%}JFE z(p-5gwC&XkgXfCCX4*&<#LD6n!7S_Hzyum6=OXtC{u&b~Ag-XgGC~Yco#J5yTjvI0 zJrSain%5=X$^X#Pqy?{Y1ntrO2HJZim{UPa*!dJ!o!WnG#ZzFVdZEAtnEWJ-l{?R{ z3a)>;6@DJ?iN;S6qAFi0e$qI3qFu@4E;x8Ezt>p)^*sEECHUw?T<#|&XyWyge6z-d zXG>A975aF7AUhEfz>{KNAOKz9);JO=ZGK*1~t2WGvn%d#GD@Z-=wC*uL1 zjgu#S{uD5Q<2{TC==S{?aH#Q<{46);`|vY|CL4o@gX#f+!3=x|40tV9#Q$LD&*KFw z!nH!V{!8EzErA7SGDb&%+#=x6UHaL^WBjP83HL3ATWyMuzP%Q)`<3m2>y`=!r^~3W zu9ji&BJ#B;p81_-s^6|#2{m=9%J?9P=gt;KYowOxhi7;3ZDL_=V2|QQ9;${fCU<2i zhnxuo1|+FD;J5J-Wm^D3_3C=D%`qND6*L^}{g!nasT2X?cW*HixhV2(1A*BCvzxxk zygWOLAI63`azP9pfnbM0%-H6aM{nZuOtkQ@byNx%hqNq?ONQAu!^tNzlb!6|I>xvh zRf}PUDqW$7aKt{s8R3byv2El$VqryVB};~aXx>_-W`Q3J*b+`n4GL(18vcVy1((Q4 z)|s0~iKqqD3a8PjvM`(**wCctY%3O-fFobImAP%8GORsocYg_O620D6DOqgsD%@}S z9a5$pvGgnF=Zrzpf&fVB?>b>Aj;@DyutVVBU^Zpy#%9jv?#zIm_wUbph(CL|n2TR5 z@2sa{l@{3mtn>7N%`&WB%I01x4W*$Bn5DL{izl(YWE7>PVs<@SsHDD%inB$DqpcKJ z-sQR0?n0)RQ&^p&+_y>zpx8a2Y+vZ%R6t6Pv6^CK)6!U-Q5hxyVIrzgGH7S)({-7) z-L8Xaxk=b7Xpb#f0KH3h-k0Lb3c~c1s3%cp54rLD;BGOPsIwD;>2&k;Sbd-X+J-8D ztK5;%k;m8%Wkj(Hq4f6(J)Ls_o-8?S4GX`80YbHPcKeoO*p6b8yme>htaLNt{oLcc!;MeZmt3i34fgxLmgjOUC=MFQ&-5(j9Z-B9?l`5Ob{dHauSo zr?R_`f+OSM>V^Dqb*v(7}D(<9vQPgWvQ8cSS0= zSSd2m1Z&)z$S@$p_bh>yz5&?G*?^gVU;e$5OWxsui|5ng1Jd`tOV)G}9H#iZ(~)ZV zD{JgKC~wSK;FDbE{QAg>f#0I%ipg8A$KE;X{$on3^q%bcnc2XG|LLFe3%1&_OXq~~ zzk9VesTT^80f3VfQKl`@?oi{N#kNEf+Zk6Dg?%UyBF%{?c|8C2?z=W3Ch6QuY9;DL z2cZ1)6;GiokcK>3NS{;uwuAZcW4-Fm^>af-0POL2I`CkD983vo+-$odZuLbG`tYQH z=6IIl8%N;oATcYxJ^!55oTQFN0)xxJ7a?pDeG|{B0;&`Vjz_?=Y6n^i2hN+wmaKe4 zy10;SvwS4sCUZNm-f9D+cks(hhf(L#r+<8BfM2)`Kk0nklyQwuuE5nI**Qi@rK7l$({BUvRm7@7l?fKJ3wZ($NO^S&VPK`l1k7I zc?eMZ#b4&3gtu$-^1sx8ZUEpM(MY$qRD!hEkwml{AXCbQ5j|aUPj{!i3WfI`X*~wC zJ|7ImywGe2JU^MnESY?C)ILZ(I3X%0T@$vTFBe!j0G6WpIB(Iwi^|8RjnkAu!d7)+ zAvc?>w&g-$WnN@q zLsY>D&r7n|LGpKi!hve^#{AAJj#GY*^exC!gILTdKg_wNuaB+Qr)=O0K?hTk zGcA+P#5loo*nT_f-lI?PdvZRjBbxxuZ;VGM?dP>Ie-8!wW_z_aFVds{3EEHK7te{} zmH_606M+5)=r^Ep)3*TByeNot33!*?6$iLDZ=|fYL5^a}TDBys^ap zBmv6DMW#;Xc#CNw}ZEA9ZK#3?k(F2m~d?Y`Z=W*n9h~?7GnbEd@evLg8cX04QKZ z0->ZyH;Y)k@*%^;7U%BAb)k@onAkaodcPLw!lr&P_A0unir1ktM>LWX*`40g7NE;K6YKb$O1NMQ~J&o#!kgMXR6Uzno5T%p`?$>DK zSSlN)Yo~%_@HS~Kz)eN5Ec(D&-z6(?FS1QLGH*RU)~`2OP6s|1^PouB<&H4?ut4WF zgn@HgeK)+7HqmGT6+%HGiUn=QAborI^1_!78Cwq3z*4P#W8X=SVU!TsSkxgTi2>4Z;!8%bdv375x%z9ve@B057LF{1{1Wj>zZADQ8Jv+s5{TrojHU zx3bMWtb?|sXGfTnfqL$M%>y6Zbm%Xoh+Zg!ao=qC6?P@eg|UFOt)NmDZ=OXXgTv$M zaMC6*LRsSsYayU?FK{JYSb5F5ULL-K=}Y9*4kz)A>c*iZKlW^vO_OaULd2W0FGVQX z=`Qy12$?KC%8`$P3lbcui;!(VGKog?m;q`fEwy5{%eQDY$`MyQsL>tE$14^*J2Cm0Um;X;9Gm*< z2}`dx2>MNs#39?2a8O=0&+6nm(fK3ap4eMMlHJcR$ikzY`u+i6B6%dHP<96xGW#UApm?=~YoGTC_ispDwca7~X|fkqZ@#}~VSb4l0pILe4CBQv?fSES zJR?Ga@VeE#Ma}vgT(=z9Z`|tpG&Uf=sGxqZb{j*G#dET&(vKLliK4>{;6|_%Ne1CP z6XzgdN0vlmW=CMkgQkWkOVDsV_2homRttVZx0TU6 zbWd0J`mqZ!Q@An)G>z>?9|7qbs<8Nz5KW=iQ>Z8oGaRTnEzvs5?N?roRmyFi>|vd1YceLXqe%qCn zO_=}SH5f?!M>O75Q6ljY9cfhmfARU>ck4Qxl6-hbde{78)jI~0<{EZk8J7#hpkYbi zi+lZf4VKJJLI{&P_OHyI;d{&Tvwh))1S$@o~&%#o%MUt0Kw*ZFlk`BzUv6;#b&6ot;=qY{hU%i6pF9ZqZ ze_HfCV>ch0E%S4VkCg>_HoL;3V|pjtb7sS5c!N(wTDg5P$=RfvgK#9K^4d?2PwW1D z&bsBX-hVhR+f%d0>RpVJLbTeq)1AqqQ5=w_Y_BxE;3kAi$3qB>qiwmum+{O#A;jSv zr8w{ZpV$9&Z(8ACLnV30h_K0j-=|hds1m(ATnH^Rgz8@F=Ehtd3{PYPW2n$K>&Sy#RhFOj z2o#geJZnsIDIO7Iv}wDLNb8=+7vS8VBg3#%t%aQM5_Vwq_}v~WOB_Jh?7i$bCYZ~wU3BNkmc%h5-s51zvIO`er9qqg&b4)vTrA;3m;KlZ0H2wI6=+*l=)zJa>A70txQ$%3dAdzh$ zdzV{oYx(3v^TxHzzRJ0%Dm_Pogko=GBQ)zb?61tpHrjRKTYx@JtZ05td~7H|@Lnm? z?SY~PvrG7tbhVS&;zOA*uhFX@T^SCA-N0ksY=dn#=CO*{v%&o@S4!L+_n7Y;^3EA~ z$UT@f7-1_=49xY$Bf<@gZJBgUE$aP+oUPMN#1r4$HxRaItQ!Z$RiklT_@1nY+sr%q zR-)gU;~t35%TNkQPjBw=QU))j@)5H4z5+CEw$;nQ zqak>i?szD&e&t|Nil3!sm-6@`VvAyN+j!TbteECjf>HXHj9~7Vt)n&*=RbXBnwJ8H&UufEe@cifE%4 zsQZaH4OAX`_T*JV_8a<8ki(~>I`lRKDRjSz2UPY(Lw9mg1EnSddX7e+IfV>BY+!lL z-d}gM(X5pPPwy;o-|QssQ1*dw>UTyOlMRfJLnVr%yY9?Uh<~07yCMRTnw}G%f(YgS z>)DUk&m(2K4Mq8`eCD(Zw-_!CPaV=?*dx9F%%QEoQ8Tqa;bCy;8<#DjArF8!Qm^b6 zd5%N1UT_Aau%9do$`3K0Ye!tghq#ccgD^UjED*WHHblRg>685*52J!&-bhx#fBOz; z@m-n`PgGkYyfU3Kl~?EJ>%3dx5TN>^%{-ZRoO)2MS@~qJi}=rP1{w}>3~y%z;l?0p zxk1M(%FBAb~Dhre4R;^XXMH*Cl<92sM#oX2`e7mT8 z&}<0R!i{ipBo{b#@z+<(f7L4T#Ex18+>sNiNjWim>!|-wKVL(rhr90wDp7+M{zAjL zA)e|KKecW#&d8D(yVcp)v@!ud>I=+ns8}H{fL@ioF`iQyU;jF#J6wirT1y5>9!_EI(;GxeO1*r2Ymgq&VNR|b6`UFa+T&0_5M1Rp8eS(9&3 z4%UD(OXa;rO2EWz7FF)9w&Qi>avrx)Dr@St6u5hnJeC(-{7OjhtnAmKo4rp6|7ang z=3F?P#hU%mU-fcxLIuN#7W%$@zjSYdb0ggxy~5`@hAtgMt0;g?t|+2ed?ubCwkScZ zJI|Uwks5^AxhEePYz_D!*!N?){FXK@jRqqe_zQz3no{@(;1=#?;Tr)FNL0($p>5{c zEfXC7=vHa6j)9_`H?7-)QCdCjwe;V=m=+}T=lH~8g4(3nPS~?mx6i(kQ{!}C%W)AG zKK0vRbpEGZ{&zVBCArj*h}!s16aDYsuwLaKf_^jl7T8g53U^$7TnofWWAI_42Y4ezPY#ML{Ass^+J zW<0pL*$E?a27TLnB`MzZEbHO0w@!W~OFx1~^EBH(aZ?!O2!AF@`Pwlr2ZKM!@$RR@ z4*2Ex2C4Ey;gcHCJvqRqA?vfanrJ7GNTFhQ%;!iFL>)VnlV~&G6UT_&$ZLn&CyILFv0kUU8=(hXJta)^&+1A{vEb?U)(EsTEYE_vi{C?*ZOM4 zpziBQjM0urZA@YQ&d%Y~`oYlcp9x$qUn?%oI*oICCVL>MW_@9vmG;y|E+sUdL*_tl z?_a6-(?b{dVk@@ZqpAqz{$p`6XzeQ=-700Udv}xuQ8l;mwgL4X@$&HOpoQZYp`h=@ zwnjJl`xJ!Uq9fZNSidMgsSK@5t&DgI;8!r?Iqgg_nieEpO7n{UxcdEMXB$Tqb5?IU zwf=f8t-G8dcGn6nV$&qK)OB8!6tyhm*RPCk#6Rkh12%T5Db1$xIq7P^2uw9HAB*yQrL z@Ct1@0C$Kw~R2uWKRNFhd=;-hacP-e#0ZMYn5bVKqf+{cOiYed3)#Bw%zIJcwS zHM9E8+5M^rf*9_G(xG{q>XVN=@Q>lg|$JT9cqpxZ2mRO;f2e`9%5`E>O%Vz6AdD^6wC=WQ< z?-caC`?LY-m5=zgo(R~&^KNX3ER|WYMbMDgbmQ~hbs9#+Nvlqz`jDakXPr-(^>|1j^9=+rG zoSiC{@0gM_w#Z#KUpZu4Ycefe{BE-ZZcAk|mlxZgc6`^r-{~-JfcEwlFhhR_1DtEh zc)9SOyO_*|QRV4y_Z68#JB59&()rY-bQ?xRZyVQ(punp$eda~{b#9jAL7y9w1_VI) zm6>|5xl9*N=rZ>cK}tPu%jIEo?)H8`Qzj5AM^^UG{t(y2=(9Hbz3cC`y@xl@9onQ0 z{ajBRwd~StY>#_c`_!Y8UY0%$8g_i_Oh=ycX-{yRq`z>Fbb)JJ17S`3XKBB+mKm<9)FhYLJ4(LkYMgZG&vh@`D{sQleysc+4Gd zT1Pf-t?Z7X)Fi)j`DInaTes|tr6ajm5WxDh?+iGy1cl1a>1E9}*fpLh=zrb+@Q=~9 z-TY4~S7nwtg(U~SqJ*6w$uvneogDq!}wH@ zR6h6;xqG}t2BHMZ_a{TTC3FJcJigo}5vzbZ}#c9kxD zh_T7@O&>zl{6o0opZPUH-WBvr+5n9!a^)f1yZ%M$^ok?0dBunBl$pe}B%$|G;h9w0 zem}6gLw9DQb1E(_#$CE`zC1dG2orEOv01vRkL^-QuD!i`C4v`3A=kxd&Y=Y^?$SgV8@Okqmf$@1M((K zyF)teRoRkDLmVryrQGA29A7VUZX-VY>AH5zc?x5U+GYu?nD-?(-=wqSz81_qAAJ@H z&X9Sl=Maa*q{F%^dH<-P2BxEY4EzOtM3(Q+XATuXMh)khD&IK0>iTOxqG@*w0cI$t z3QiH5;{k~qz6Hjm zdLX#jmwBpGL0we8lYSMM&`($Y9(w3eo$hhZvCZQ#wmkQ?Ed_5UPSw%_cXeaSKyiMr*UVASBgqB_-vPaaWeskbzYT)hK$wi zt~8jVcduvT6f>jtzW7G`!lc<-j%-$KcQaWj_I3^Jv(xWpws#w~qia+~EXSF`@NY$u z9t)K3GO^feC&of(xFy|omVIIK;Ezqhn324Ofz3zBq6)@YirvN4;)P{agwlDpxbs4p zmm>K#2__yT)Q5gQS@AkD;dSI(4_yOQpBiJcYV>?2Cl-fy1CE`v`1_N&&CNa_3(GuV z!j6ptj#f(FY_GfFCeqB=0|C>AGaLVh5~SIP%|iJ>iY{4;Ae%+8;I1g7tkw$Ujm`Dj zPvlwDbP{8cF{HsK)tMT2SpPqhA{_pI; z87g29(v746I{i1AsL7XV^F$jlT?Y?89=<+vGn!@jhO#KEn!zdR>iIqmb|i@k4T9{v zhP@u6YJZ65{MBbtyswUrZ5277AYi6#00lPrPi50O%_fYY8FTe-;<|&YO;`pk9+^&@ zrP;`p=0k3`#kmY2q0o6?+#?80qWuD%ar$Dgy~exa8_*=FJ`{}nUdS)6&s{LPR9IP* zLJ?-#KR`$Nr)D-+9#cus&%eGH^f_m^rU?>|O4bC_GUV}i1^B8kvd{IhDP{~v+k9NMYu{b-}i__pC6-rQ0Pot=AY zWBwKY`>Hddg)Mw%K|ZH^Wy0=noZ?;wf;VeUE#Ix1>#>>ZEV$nCsOxs${q%P<*VQ9^ zwSmy<^S2QEd#aMbNeWu@;}H*odXOzeXMZHhlK24LfRSiJ`OC+^;B55>_c$+jVgvM; zoNIG#(VKq0rjl!_vA=vq9XY`=?#d2VEu~B3eDn*4toDT>l;AnzFUA$F=5J-z%$9WD zDd*@Ct)EZY>Hg$rnvLged^+EGL{g z7$CZ;-{tr$l+DkMoKJjo@YA>anuwKoAAnjOLNjVGPcB@TgR=?_ndmg9pRr%+0G2u% zW2`t)KzX$@CY~35sZ{4sz~Q%*DMs;tTl2kO`GnVMk25A!&@7UQ(MT-TUGbqlGr3}y&GExO`9=YEu6lFKn!=`l{8KM&IqD*zWaZh`-YM@LWHiY!zStq0_iQC>!yVz0yx}CxSmu68U&#<;s~vs~{K7ViZ`OWX#sGZ_XCa-K zF2m5wy{KXc08VQo-wYMX4we(;e^vq70rlX9pOu`01D3INFW2~N&Zm^owhIP5ONBN= zOV#I}0j?3(x)^cq0MJ=AFeWTkr<}^Sh^DM6OhNOzzsxWvo426{TzVs+&W*_Q%b>OJQHeL zegmRu%9HVLviEP^fd3RU^L%1A*GVNcX~^ckT)?oll?yz8NnCG|waKYDYw@=K5N5l3 z>_{f)T#jT^cZHQDxS)LhdSHe;-bI-m{W$Jq; zg0WXfXyt4v&gm#d``^QrPAKUz|(( zxguom(UoktVsF;%cjEwxD|~YwfIwM0GSBq^CunoJU)w?@gkEO7^clX}1n3^OS%nyi z7yvom49v0AMRA(jtdc?i$Oe`Ez@ycOrlGK&s#r4PTU2`){rFuz$`gLBxnobQ)m67E zr6|R%^oc8>1t=A6VoR2w6VCOze?EZ0>Dbm=2KyhBA2qtgw{Vm5Uf;TFX3YStAN!#s zcPr>tT9y4AQB_PIKz(GjX!$#{?S1GO+~|vB$p`uoWeQxRXr9?n{I9}-6bi8s?i^Yz5!quCw=$&qvZ0X zG)m6M48Vgh!cT&stX0l^$M1F*B1-esPq|V?A#=lZpkn&|(|6h$;&lofNO>RX3=W?l zj-TPt@_>%TJK%OS?-T6LNj_6U#G+k}@s61IH~RF;&^Nr=;-c_BzO5We=S$R|^{ zR~{f&hi)W4jX zw}pI5oWroK_B2W%yg9s&Ln+vqU}Z$v75i70STk@>@}xQji_>ESFk>`SGXx8~@Wi{JX#~Nd-by$#~VM&R-ii z9-fepxaB0p<3Y?@fD&Z}Vn?rP!n=m_9NxCZTfv1ToO|B@i2(0AQlf=^fYO4G&f=cs z`TZ7GnYN*m>Wppxd>!>OT|0!K#i0*b zq^Ui&HWfM#p{n6fTpODzd3*|p*_jbv|MzIVJSOZND6b8`l6e0Tt$+j!Buy<5m1;h~ zp3O8HQT4^N)v&akX#ETyF64k*5myI9St(}j%JQ+d2V(#m$wvS$3KNB!XL}B&9**?E zH88n&&FNt;|WCL8m_Gv2EmxMJHLyYWH5W5Ygp0Q} zNqx_k6zf)Z>=k%#Vs9A(ovQvVjY(O=Hr&cyTu1&htl8fHMhfPZ`k($f+N8&aN1M){HXf#TB!c4fVr zoc)(N#RWa^2izj-PO7<&Wz+63Os`3ED=6#Ay7`R!s?QX%U{XrR?Ie~f)nfu%9-w`*WTKth!)aW{V|gw(pk-hpC?2hC`>MZu+{ZS#7VUsz=wwCZvZB`ozE7q zL~aa%oaG*g_}V*r25@`6OjMsr7pu2!Cu^HDfKne43rdC0^vcA!BZ8Cyti~nPn~V0z zHo0+cCqk?1d8zqz1O|P`d6NP+Rc*bM%KdcFVG7@i_B?@XKtlv6 zU(6WLe>RnGtK5D5NL2uH_`KE^E_5T5dV$MDn6kfNL8iCGWWzZ3Bz|`iMH!@iwENlA zDRw!6@zm2CbvzPkmbWa5P{`;;S%X+;q<@7x0x-N(&`*Gauxy-9y*v8gURlCD9n+sB zOptBB+NK12vnV>qz*HSqoAm4Eopi5NGS%yqq=yx^Uikq#443q(AU$~M;yQb8U@kteffVMV5pY%h0i!;3O0K9RYvQlMtgvgU_5Q_ z*&pAQD^l^rRUsK~3Jbg3xHUP$mVmDMyHSYYSfkYmke}j?nYnEK)hwGMV_<-2h{CI~ zF9X7X=Yuc1eb2Wd!~i2<6J3(?UU`+56FD5)spWoyZHT1K3=VB~>#oN9IfMlgcuMN-{x1z2b^!QvLrm0(KyXI+ z1B77TaNKS2>k>wz6GcF=QR@#h9_rS(oZH`zd*5g$43gmd3G$53B+6*}0Eq%ju5lY; zQDM|PPISeuW3mh19_uq`su@@L;hy4`UmRyM9B%>tE7RI3|22LR1xH~=YfBQZhAo$y z71y2Em|khK7;MUoTKh!T#|NeJjf(dcG{t2iZQ6I)?jany>9X5rty<|Q$9eO}H-W`? zd_x>Ewsq${b^+HM(AW;xJ8(^FBzOx1{LTnJ~X7U_WUZ!7ZlKr8SvTWn7M4wi-$UIFlFSu);wDEJ;5;>RPz3TT&3Goa>+hC^rZDZHunxh4z?$}0L zVxbSi9Iv;8cZaDCNajal@)(PkTsG4<2tC(mWHF(8%>yk4P-Si3TYP-$4~RUfXLQQ{ z_}bWa{PdRlH)f*}l0bV^n)PvYt9S!0b`kfdFGYREg}P)T_jL0zVqN%P!;)InSDJgL zb;I?mpDPs6G{j|aoTgN=c^r{bkhPZPk6%Xr;BS@PAj*MumLiut^I`5yiz2B74&x-e1)dl3XNRr4aUBosjhmJwHtvVI^Yv&3?dF7E&letX zc^;$plqaH|e3tWc4({Q8IVW|fv+IT1*DufcZXWy)A#fyd%8>7t1 zaJe1M(nsfD1h3IsQW#|?atD0?LKcRWdkJZ<>kECCM)oGIzE{pC8eMn8NN~>gi|6V# zGj0xW^(-e+J7W%tqHoK(VT`c`sRWU{Si_oXUR6-<;TX>#1ti)QSU|s8oa7zr@?ITh z%jXz)R$QKjC2gMv90OgO&WbU_yxQr*?men6w@wc^6!{y|L7Q=pZ1vpN#lpU#>hB^% zEEB{DzDa3RS83zlxZzY42(I}JsFbOBaY_9ldQx#dcD0}uBGN+~=55K$KxiF@IzSKo z-6%N<3tw@|!crA#ko#6~^>NIoY4K>I>f~eW{C_%~>yF%oUqNE^iL#@WKexS~pEd&& z`D@(5&>UiRXZa|u5Zy`+`A$ULyb}ntj?%2;X;9`5`&D5Hx9w<`A3p_3hh?3|!$q{{ za=UasGB|pn*ur75U+ocajlBWV2Zf?&{1M%kf->P{4!ujJAUvdSE^1hKz3QvTU4by! z(|DI%#7)<%Wl=!#7-7_{f$I7BY~uYZv2s_L;Vt>a??aO@`8$u2&^i6%uK~u{7vIwU z&r(~N@|E{y1g_||@IY)tZuHfdFE008 zS;O1JkaQoGr6q%FFA*@rjBnvb?dtdXcDlPk9aW{iayJ$YM?LVCF(H#H;{>Sy>~1Z| zS|h=g^yp(ap`Z7Yv29@)!X*G`+OIQea5`_r)J7gRR=S6v9aMU%u3_(RBeDM(OE0L<<=c%KzeCsfuoje%xce(gIL;!cHRr+K(6jnSMO0Q3|Ic#NQ$ z>pXzX`8)vN1vt;v=@Xf~x*nuk-y_;%sBwJ*_7PSrAH9GA9JH=BBGIEW43H1&apWGq zeLu_qtT&oLR~?7f;ncEkMkA|r$D4Rcc`h@zIgt&3tRsaX(bphSr0rH9y-!@T(m?LD zRJ_Mr0ET+Pvq55h^iT7^BEvzTn@$A9K7g#`bK zLe6Whl1u{*@r>N&?W`nj<+Jv9BDH=#khs&x(}T%?3o3T~yjG24H1+O8$#C&>PCwxi zRsd!s>G$FwaOOCSVAsYDql#BRCNiY^O+6>_TL3s96{`l-U4rZZ!gax2;!!(gb+a*- zIdTxQ%gP^aE@<#*9J7ZtSk-m28hjGHU-jC7dRa0`3W1K z6!UYSgX|YOX9phCccL#*95^T0IkzM0mO({`s`ApDPMR<8~^$OCEFd-imG^Ll)$fLf&71+Qn*8Gy0HCS#H+;*rO%- zsFvp$P>W;Q>ssq3c~y|*`xPQ~fdl^1OFf4jtg+H(04x*eO}+(H4*;WgYx?Hlu@#;F z1>*UX*r7DkH14JS_t;vDnhZS~X$UHq0a|PhkIg(H2#3{@kB4`4l^B2N$GBJpe|}?+ zdK>2ksQ|`}`g=gUW_Z=w1`-FV&OA$qS`CjmoIgzI%GN!tk@miAfG9tDSp#5T+z4wi zuC|Bzsj<|p*i?mPpWs{TZ?J$(?NkLwJ*jgDkjl-xr3g*7L=u&17YYXwreC6mR1WAb zS>Puv0If~AJ9`|>PwI7ZPpQthOUC9R_WM$Bs+SDz# z5sv@N%MU<|F7x1g5p!0!#gZ!Lhf{#!`Ps%QP-VWy3w4kuXJDmMZyPl;$9n$)fTRIs zCJwnhGL3kr6kgcfBt_`BXW*Kp8~o?t8j;DE6?Pj`a}_%HNBnZ|)Sq2n`0wJJCq38m zU;PB|!|Qe&>k4oB@_M=99?qwhF|gjObSh2I57+D=brt-~xx6dXHn=rLp;fjqyY)HP zs!#Rr7|A1cA873IN`+rp|CI-eE|7SPK(Ee`9}ra`p`a(j%mwX$c&N2IK;4?*l^Rd!d&Frqa^<5Ihb0ciMN8t)(m2ruWiIdwS)cT^(UN}Kfy zUyMq9nf~i8BxqOmN2}+*eWoIhkz>XrML)KOycZC??mbxg+MS!>R{g zV_0aIEQ8K=^38ze`oXd&8o9~5`mG#KUh_Ci>U16W08~a7AlPqZAeQJq-5a3qXeac` zq-S60!gz4--`S6%6%x9s^6LTF0k^KA>Z!q~VaI?)X~zpJ6zDp?4u}S-@y83XZdBi) z{47=;%iT6gbm36$1}sYzhc>{gTn%t@Td6bZA>5Zd#yL@M=C)h75_xft)3M-FGql~; zhLCtp(0%4w@Hg?%&HDK(IkkW_a|LDL3TsmO#=*_rmN=uvZ7Qa?Ty!Jz2fMyQIQC}- zBR*hogGtuNy%i6D2pbaz5_==yf`vi7fxDigC8h8D^qg`lg~z}8#h^1}4LLeGdY4K& z!68-bFV_!q(VvkHA1=>1*Mi#OLg&9UX7Vmdc4Wu3=Y(6wr5-|_ake@qcbaPLQmlSm ze9QDX>o#PKZ#1XSE2d%RK;QL)R`l1>@7WkUKJ^M(25=kkxjI-5`HriP?$ZRNul0zg z4$m{O_%J2k7c7iEN{_!7M^b9(;u{d}l_x%1`l0_ai~6wJ@zK@fR|&E=d&`fkberMI z#F!S2&XS2b>zO9qHCc2z;|;Tpra7H&y-0HvyIF}xj~FyH-TUWN&m*G;WBA;^{tZ{@ z1A!~!vOkD>?Ody53nPb`FO)p>PWMLhM}SExyPj%IcJnqcO5q@Ei?jODoG!|BFRoCn zNjj2V|YP*mu%iqLLbADE#+qWSPhUnJ1QQrO>@Vi}T$NYV*QF@n9R zXQPu03LVBJ%fIY0Z?PnrLT*4UZc=*7L~5eUw1mvMvgdqSK3{;aV}jJdk=;-OE1i>_ zn1#^=4FG|~Gk<%E(u)qtcC7kEaajG`n0oc@V7dX z4yr#OPXlD&G~77w>`}hGT@;P@6x28v&{NjP)IDW-cldr{GO9ZR`I6rCxhXD?{bi2) zkeDN#%9n=v+L3#`*622%qFgS!W~A8hr9LF%$`;MyPx--eB$bw??864tPVLWp+l2-l0}dq{IyX6pYt3t3Su1ypq?L>7s5xIvHA=sDGz8{M_+o`ozrQ*YnxW z{p{uYRa}zG!?V1Jz5`&1V9J;K)Y$K>DxgonPIFbv#SXtwcd@s8i$a@juWo5aJHYv8+rOEd(K3TQeV+&n}a-q-ou%5$` z_tu*S)mh#%AFPd9;h83Qn#X>`gY%0iHV^c&Z`)c2vHvfuT)EJeC{5=5ESHvlwD7XP zVb51K11+Z+8ay$o)bS1!ksz~}VeuJ0As@9Kz(iQqP`o_b4@}VC&n6Bw@vzevp!89c zxv18{##b+xLj_|9n2B8rhz4|BZK!MCeFaxF$=&?NpMR*F~*Zq8=|O}*N|;WMT? z;suAG75sJ&;-#kWTZwo*1bjF2LZr*HpR|x|yUw}F=$r}3Fji7VvNOQW62Svsb=FX9 zalAs<90QgH^`a?!JXA#L-` ziM;=>-b{&brW8FW8so<*+ZH^9gv`*^z{diBu%;r}F{xPphbYj-a#c2(^ZAU<{PSbT z16up)68;1)qFdT`;16wx;GmC#%FioZ@nr>`+w>%`(8;I6diIF5LTXSGlP6kTF|~8Q zsbb|I>;4Dl2+f?`LZHEY1|RvZkK|tF)fVuUTWf0Iugl%e=$;1OullkGtPm*;p1(ZP zqusgTO>XoZXw{&HQeTSKW#AW!tYA)?BVjesKIAO!XulRgPy9)8qrApH6U$u? zP($4mcD?i0NKaRV6wbnPiv^<@^edF&tp+=iXEJ1i_nXoMv?0AcTU#7&n1aXd64n$Y z41a;(=3F4ZE!BdocBd~fQh4?>c0NmrWG{q-v@XN{OBBl_`WqNI1NgEC)jS!GuS6$?*j z&(GfF*jB$9n?dKb4>ZhlgJsIQigB6}ArVkx*~@$fhmX?G8_!Ign4GC+(MneXK1fc8&K|1ji|D5Ptl1e1+73 z`0tJy4~5ZzkH}AnjB!KsflVH9PQQr`F6wa+Rt98-SnM$Mp{PK)qjcRd2jL226_5{# zCG}#rO=xu&8X}=!HRR$cq6XPPoWIA*RbR@!0p|B&(*?%1?+wdcID8`PYoD!s6gheD z(9|rQUB5qa54oux9VjWVOc;tvUHEoW|M z+JtINwli+_HqY*nyvjd34YAK%TgQ8d92-5S2n zVHDY+nZqq>xW~Vp%HRM6txF$A8W1ino ziJpR<|3C~1BywaQyNKd`!UE9&m2_MJknaF4XqEF;`A&SDLTmo^NKNz6UT(8*j~oXL zfP3uy=sHV~_Pk}lJ=qLU0^3;)8CTeYA1W+)vM(M4!7ho{a_=sBl6QO^kl)c=H;?{5 z+`V;J)LYj+4v5Ma)EFS$2vX9W0wN)j(uhj8l)#V*D5-P}Al)e40s_)VO7}=f3=IRn z{W(4t5Cs{z>xNFQj1FFC$shGr@+-$CBa$bC5qxIE5fzx{=ae0MLsCxPcz-pZm%3DH z^Gz=`exvEZ1mCO+UiO8Eo6nl#WaOiWHT5uQ|_K1J%W&%;3nxXdm24*u;Z(A-g zq>-TYfW(UE6Lq_6pInujU{0@zFv`e;L!_!6>Cbj>9>=PcV#T{Im_x=u2JfEX*Hv%B ze%ocWli^bQ5<_a@XTcxB=5&MUcHG85%(j#1dlxfV0Nex0x0HqX%R)S=F1T+VmX9ns z&#sR4({rqN_20Xx;ZhJPL**HNvN;4?KRED~#)AtE7*$Du{&!f_cLB13z$=?P@-#s5 zO%tv3_b!K7rKKbhd49XmWq5EM{a9$@q3sF5smD(zWpfkLDcQ}Xp$CTPJ*E8C_v_jN zgi6gT2KP#fID1;^rI2(H{GRa8;KiNCkH$}l*>x}~LHES>+C1EtHb#4ojhid|!diBv zuH`wwQ!>jpzspve3uhf*9SDOB9GQ-cI%s-y~{1NRC zI^QqnkWh>iBGyP22x$quP>#TI1I)F!<3HXryAmiDctXGW>Rrc zs)|`lRCRHe5^)?6Tdq(1Oq6`T5$qBPA2B$%pQxrCuvvQPB)#y?O6RV9NC=YW*-&@A z0lM{U?x>)!w=uy{Ghdr%_(p%PIfu5ItwG%h=39=z0erO>DlS?@28mtZ_PD$EC6Ryq znkVu2_`y@q32qYnME~CSr{Pq^H6x`j+TEy$&{(Z8KJwL(Zt>z%PXi%oA}-rM|yMen6~$ePfLwOR>ciYHQU_o zjMu0yaenMx<)UF@A%A)3NxQ;D^lY!`d43U16J^93v<&^K!K->1Q6;*Q z*4m&Qk>vhkt9kkQ1{cA-HrxE7- zhWdxT(x;4lKS>MUS22$L_Qe0>TNGJvz+5ycR!RaS6D76*@eLHv6}w$If*hPE8IWhK zbd6x}66U1%AGq&7-vcU1F@xT7J?}Z1zZK~J`jr$fpx^y?zYI*-4ec<4m@~jH$x>{* z@Rp05cI*`$0(}5FoYV}ZO#0&I7CrtY@w}7cIh4qKswxL2yqMLwKIlsk;^F$0~4hb?r zcX=Gu-tT$WFMog+B=aNQTg89J>wi|~`lx&$MaI~Zw`{q#9`j_^iTnpj!7$?$@iVk| z9!P%+g?^;?2A?8!fviajno+(BX#e02zmswx$FczA`?LF%k%$2hjno3kDNrWwLrWua8rgH49hHra#z5o?eNk; zi{7LxIyBzB*wPB6M^5cD0k{zkM+yI+b^2>%!E?!GD%QlPoYMaNSpW4qDdIRlyJ%Mi z2KQM2!-z6c8sb9tA^lP?l|~Z+$+iffaL$J6c^1HXYzV}Pen&7&v);`K^xA8*QMl-p4JZq1EZF|X z_xhg=Mge3E>#lC)|8cF~HS*VQh5VuB{iC-FI9fj6ZGo$(L&dh;Rx(>2VmLG}bqJKu zw80#ZqIhvH1TQcleIugu*CYC6d;R&pJF>tb#CD=q;WyO(uTx-l-)OyTq!8Fm#Xz#2 z!XBa3{1u=@$%SCvic7<>{w~OqG$CiTrV`Kso;7CVceTk9=%n)h*jM0My_|8I+y*u| z@Oy3R&rboK?0H~*bNQhN{eN2FU3eMV0--i~rghK1;a67KmKa{~QPYCRP1g7?HqfRtB2Z z;);~Lzjc26zh3v(r%E{wHVT`OTke0_D8K#5zh3%3i~l+aJPBi4$@SkUg1^4!e_DV) zenH|gSSH=ZZT0{3DF1Pj{o8wA5e8qOdCGT;2uRrQQ zF&HO0>;JkJjYc84+un^q#Q$|2OQ}=5E6?9i`Q3Bqzkcw)R;jTV4%(pB*s?MICbOt!*=d_mra3$TGtbZgpKPU!b$@YGV^_Z3P+`ieScZ?4}nnaJy?~T?}fwv zaHaV)5V5wJW5$IPpqyU1~A;6^US8#iRo~;Y_W`NyOo(;HG z0biJ$dkRE-7idO+DnK{MbMN~fJt+l17~{ucp|ki2LSDeJ8B+R9yiuDnq6N< z6!z)pDC${2wk6&UKjL&okBJy>2?J-wt-8 z9q~b@;prpHVXqfHtt75BoOF2~lFLJ*9xo+4p_QU&3zE07aq~P;1WYDA2WQTLZx3$7*$JaR=B>s0Ri@%3)qTtpXhlnl5N;s&r)c*I>W) zlpM_H8w`2#DUb)exSJqOQ_kfA;csKgdw7Bo=w*Mb1Km_BtS9=C+b|q2zq{Sjqlw#K zuCV5azKedK5IKL)qV{G2099O8l;dDs@_^?hgZP)HwZx0W!}*z6rbL`_H#VWBq=d0F7h8PtXj*+vFyb0_ix*fc>AvhY-G73BKJ< zkKjh(MQZ)43)!2nn0UvJUclC-PP2E@Rt9Y|aLR>1J zJ~K@|9m!L&EGW|)6%f$p7u@OSUi~Xr{&gF|l>mZ}0k_}p-!hXByM-JGc(enfN%HPp z`v%ghx_Bth0sKo_bN!z$cql#7FGp1XHJK94$;*6!lxwfNoq^vKuaO#r8kv6ehvQLK?(=XQuin@7EULX~<}4lJ{0@ayEkM_uWQ#TFI0BW*kRU2i4QxDT%iJB1 z*{S2X5nZ#bSueK?B{({FS`VzmS0Du?6roi2u2$C~woSTEfh6Rrq6oP)&Gfg{fP(*nbtXti)bXMNXzux(QCnv;e4GBK#OMlvk8`Tm>nsDEe?S$D0>Cse z*z5!S_M+-HD9h7&OQ;V*A(`Zho!t>bty(A}+KgRX-frJ33>TpxJOJ`{zoHqcel5aH zLQI&+A8M;+1#kIW;J@os_T`3da4rs!dfVMME7>@@ltzWmDdiUK;~L|(SRGJXtN~7T zgr%ZAm0oBHI2_7?ZtJKLCIVjUlOSG+_|fcgP#jXPS^N0lrE8b?r&CuTvdV=n*`bUW z10kNd*%B=2r!V}+g7tqFd3oc$4)7)l49F@dRsa16F2kT67)hBE(1Z@6d!WqgSU))h zej*W~tJZgD)0AG?-5Q1ayeoIAz&DDUF`zp0NeJlN@_=5wv>bO2@7VnE```8@$hD+F zq}(ixivIoJF^XbS>K4jV;r{6b-~o#H0a_M!B4+>Ub>pG)Cb0!UaW=|;YjR0VpbOX# z)Mj!Al>Qtzdp%(FM~sVA$4yi@D-vAb z%$abI3XzoPVpW-EqlUVzb~{*$u6=2ikrJErhv!NYh?Z7^VKD&;66D7^9=(Fc`oFC+ zwNH*5ct(SkYL@>o>HZg%&%EZ-aJpM`um2}V{?)c_70Fy%5I;NYrF%0Dl6_yZ1JG|# z;0%T;LdYlk+FYo_!p%Q}^1lT|MjD^3W2&h8+HOk!oe%+AiUc1gFz|u7$d_v9PAuCS zv%JWCPzxs2Yl1lP(y34KVn|+iRm*3Se@Y)xu7V`f+RUx+_Xipb^8jtULk~FW)PZe% z!{snD*~nsmY_vcyH-wI4DGLVbSA?YdD?qP$rGE@u_jMLUb$hvhw|l&m4V)NKTYX7TmsaoJq+4Ksqq4S9xgN1TF`!t*^a-@caiJ!V=H-ji}b1ki~^fPdK z%mu0fe-~}#r$<2O=@$ZBO*3+2UZCvs*?@M_8q~d0lV(4HLcNCYda2qyQAQTeqvfn2 zXo8hN=`275`WOIo36`ut)cP#v3_v&}G{sXr9tMF~HS-(gK?f8;Hp!-Q9FvWyhT@P5-r7zAH<%Y-g9&R&m zG-Jc#JWm@S+BS3)6}u$o@#4#y>({S982Yv2W8)3#6q_!U>p)a1T5(Q~bhSO9 zI-IJg9S!cvOU@zyex_dCw6-!z90yM>4@^zCh%}>p>c{Hz5jv!z}$5wW^^ z2I5H+E=dhWA$L9BZ~DLYvD9d2Ka4oA~Ruz$LqFUWFBV(UI)^# zt0az_ms^X=VT>hIpKtHc9o?<(A!%~Gz}iaL3O{gqupkZUJV6^>-`&!v8UUoxScp4S z_DUt-5<}H*gC`ikd)^a{oS#4lv^bbwUVCmWnIJp-f0j%^vYO|}Bt54QZv$8Pmb(_4}&{z%ApZ-_{aoJfqH z^mui9r}DS+1ziSsIPW*Sl9_ycpZ!DZg<;E>L#<(i7cv3pF~#93r`;^6KbdX z-jv}2X@dPO)Yn^Fa_upGKao^TwSO_V_q^1QOJ?I0rYyoUhNupmNRuA0_x=- zr|uI0-MGGu79y``15F55CPBAVDjOlqm&maWF8>U?WBJj*AM5Gwl`lQ1SK|9lPfiu) zWpoIH)av|Gt|pr>++wbK2}JTV7W1{BcleIomkNBrg>YUe@fE0dQwxl~@X|8;tg`jJ z+W)`;OtiQ@*ZRnpRf<`lIsBu^8@{#;yHE^H4_?!Z2N?8lVfL{|(YUa$>Csi3s@V2b z$hU7sqUwOzECVBD6$C_2hPSz&(X@`>Ib@w;|(zfI0srQP_(atQ*+t#qG26Sp|G@?k5Ml++KxUD zP6YX^0j6hLNleoU~sQ_h%KmtTpC%m)_sw4-^ILWkU#8V%7jmTlEuv zB2FZ9G0rH|7Lsj9mXe^A*JsF&upHs#)U~2pE$}=bYs~#%3+=nq2Gw33F2r3#xEzP) zDwKj0R7*yKk7EA#0f*AUcw11 z{bC;}lbfhr#OaD9l%s@t9!P?;KSs8nMeEwYtk5UhXrjJof8>@3-!0Xma|9xsl$SPw zQFcc7$^#{Blw?a7q495y1HC&9kde&+J|>@s!yXLpN!x%VJ(A=dvO%EjL9i>wdJI{T zB-EE>G6p)Er4u;7lo0YKluu8dPu^&&iM;*9wAJf~!ZXPJbxC~)Mai0EZF7WMf_*UW zBmU4xHxT@_^3Q!IDFLZt@$=QE;%;|0&H!%>OIQ*59%7c{JQu~p7t3{_-}YkEs7%{i zzBK%#6|U^N-MO4}KcxHq=L{T5_zv@F3kh{h>ccWYV~dOr3~VC=nZ{cnqEsxe8o$g^+vEEghAPM2iee2a=PV=U?8k zK@v65AV6AJ7ttOmJ9x{$O&0^WM{ta6;@GwP~VGBX%Om&BChK zXDF{zCOkT#enM6Ie7IC8h`~a5nQ6>5gVogpENXP@L*&wBTk4G}?^qZ#N=JgZ& zt(VC&isQ6*W!i@>n~tHh8jdswDUl#qko1U;Q9DwuLvKGhlS+SObOoClLHT&`Fujdv z$AMi+4tK*%1}Is+xyS_IQ4n!Fd7%Gh@mp&k9Vth)d(jgXZR))ia6u$K;1@2w7%>Ow z_s6h}8OfO9={uILueR`(P?+hqd^x~FE!;Nnv(1=0JrR*fEivSo?HIk^V(zhBI-q=6 z)ebGvh8DK=HJmX~S`Q#KAtXC@fe8DWp|pBnN^*NvgeOG+(5a^e5)qlxHp*aWZ)>zt z94WnIJA`9+dWw`#^JX`l=jE!p57ZLr2I@QPNl<)t`Ed7+c^%yK9XkIl>tiA}BNRi7 z9x-lvG3~ZPG6~X1>Qw2GLCnsr?YXEdgh0Am1OcLx5o=go$x3azeVr>APRrHF&xskf4hI<&XfbS-@4W%T5A;<$|e|Y}Zw}HM34G z8wppyVEK|zN;*%rGUBe-WqI-3zx`py!y~fFEBtmS*_LOxTf*`)>_TXk`K!#;lejzAJ58IN%d$6P3}P{A8jzqFK2e7Gz83 zv67)k`2|S0=j;Lk3#@X6a~_mL(_N(kL`2;+-nnN_;owPb{_0!TmO$#qyRCu98`vPvw8$vry@S%K! zma>(D(0K2OxKrEdJMV@ZHmhq@yTiKD^lE%JcHWsu(^kFHy7nD~W;vC@HAu@?s$JH# zYBgu2X7sh9+`4gm`|TFawE4UEV$%Uw?d_tkhfa&%!ZzJojmK~ujwE$1Zc}sc-E|ss4L5*`HvlCIl=j_Pn}J-msGS#PS@(NFNbQ3S9|g@~z9g^Y z;yVi4JY53(%J)3E{3KukujREsiiV-6Sb=8Hqgo5lHpOf^pk;u z7DkLsP-4LWV-LJ^d|k+yC81oVG=TY&E-kUcPyR#R1-W$TZSp+-#=yWT8Rk1dY$fo| zLlD}fa2`$70WFztGs9JOYCyd{f6T7=>RVKqXdo88s!{xmFLP}Wb?$8x6wYN#6+6w* zq-Rp(vhHO>1X<6hU(m5|n#c|Kw-c#q>2BG@i{q%`Mmw22d}(te7^;sqU!9S;E`cF> zyBALwH`lAw(j58O)puhl$le$4gEcTo6|=iXs590Vk<5PsX%1hrWu;WM4%(ZKsiUu? zrDWW;W14THQHFe$M;);NW$@20=tf`S1y!qQhdfQn$TQjs zS4du2A6yCxW}-E_)=w9z3r6QLT5h}@i6QLntz~Qd560oQ+L>42QSRT$6)oT+Xcu}%CSDg`tW?QKO2gk8Z-yv$?(z=nfuqQ@HueZa9cYSN(OTj6Iz2IB+Vy3cGhG?v z7%6w^>1{)dRVtqZW1ueUVk+@wM5{yE%s07<&&1c|)t3b>q&t87jMX4A7f9!8J4ZFD zbjR}2z0q{pS#nNHO)U&%(SwV+EM_j{v6w=F`!EFrKtSXeuu&9B% z;~ua1P1L6XNL6y+^PK357(7)5)IeA^lawy)Gt|f8-+a-6reNqy@RGUGV59j)qR&3nr3`=9hhUe?{ zfFBroGlbrr+ZUMnvav-G4W-=LBb%hjUA(0a#EKlQ&I_CDfsV(T=RLu0SGSYy5*|kn z`$wLW1H*(K9=up+*P{@OE_?-Mj?Ldjd$1g#xL1Xz<_EBUJP3X}D6F*O*4qC~hY-m? zrRIWjASM=2H2Wd=1HH^>mrH5hZ{4%>fd9B>v~c!DxuE(n+22n>IH+9(;w0!5`)d1| z;BgBv_?tSV@fS+xza70=qD&dY+j}!Y*5)FL`WthQ_x5Uyr`%=}E8~jm?5mrakhDhR z+7waNR-h#=qtor{NrOphF67wcwAnxnQVG~km8OUe z7fu60@cdl6gm5BxK2!FSH1z==(N}l@fk&Gq>bSuTKSAxolKo!gQNr{IW8ke3ay<;T z4|!PB#8z@ipEmxqU}#a}A)u13G_@vj`--%v*Wm@4Jl>*E#yiU< zb6Rj$w4-BTrTwZ`8bA`b_u7!<i;V^LLQqFE*Nmmsn7!{etqD-PgmWGY6=&vF@y&tJoN zu*PBiJP^g_)>hP>M?ak9)z1+M?tJR0P)vfDlsh>%_{M9MfJTz0G#AhCnn52P_$mcj zZV9JFqtMjWN(np^(thobo1Obt@>v&9!nu+RCdL5ZpV)X5Ff z2&(C2X*>?WF!_OChT{8hGDf=4$o~=b@y5B>^eqXJcWionWm~DUt%zirC`FA5x7ICfnlAKNNK+nC<~!7%4D>Um=Vg~kyuh4+SG;&) ziEr(;OjqQ_Im1HlNgXJk<-L8;MUF3r+mfD0H_we(d&64DEW2b1zd#$UcFK zkui-OUJ`o*JYlM#veaka^UJfmNVSAv@||X8oCDz^Vvg2J!>2n}$6nR@(BA_!*|c7H?~CQK9FT9lHuf)JiuP{4r4 zhwi{|*9d{=%pG@@LWSO0Zd3+psR1=DcypFqEKJ}+4_*mTfU|;LfHz@3afCNoKErQL zu|*tL9S_S9n{TiGCebL}jand?lf9QCgZ0Lh>*ndAQ!~Op!p)bLb_$5q5&rGG$#PV) zE=Lkc5_givmno9*`UoZIrqU@0nR(4G9<_mlmSPMW`(^xQo8+Nz(=lKzYU0a;zS-<> zO)c9VNQp#8tDLdI3};`iS=h7AHGUhFt|9(@t>lItI^?=JsmUSfEWIyA#8|vO%rJWC z&RP~?Gz^Q|Hb$gDc{;~kEYx1?$vPxW{?Y7Yf@9s}hQ}S0egE1#PXvEC*FJ6d1Ndp1 zcKGE$BAJ0KLWP(yk#4`br|p7lrqVxdL`^OrYTY{5_)OAOP#VlB|q} zGJM{oo-(i@>&ihQA`G=TwOp}NE9n_(oq!4`qQ>tzc6ez}8pZdTPAnLYPbEKVQ|TmY zq$NJoS!h0(yGi>U+9avz;6W4qQZx@&JvA*QD>m1z30x+5rhVdTq7ufjMo`>=-a?F= zv{S*2tCdr05oaz|?oN%m?2&HP^t@aB2t2UAZQlJQV}hghYO(5-2(F;^-W{T)l9E8` zgP{ZjPm&|P65aEK?S-DZoM-ekF zQlT)|o-WQSSW!m&YRZjIxGi@_prMrU9TR@T6y+k4>EI&>6U6y--RtT9DY9_VRrxx^ zOB*?cdPKn!xX%`!kpB@%RsZF?X27Mwu&89Np_9$XCd-ZWr?CZ*Sv+U z?q^<~ndT|{*Dkuc{i0DzjwhvTBbA99uw_PS(fqR2CGyqs9l_aIO<5*jddOsK+8}y(YCKh!1#BDx?1#bXUPUgz)a!k~qy(IgAob`~r z&-ySi60;C{%Q$AMr~!Lsxjm~zhNj^4+U@ws$!wlI6pTvmKQegQFFd!?1fOUloI7rLo^6u&C!86GiL~gy;b8)Qe(93@g zcEe?jGG)W@Qzo;~*E(&a(!PgfD|K#2MOW8I#}AW+!$qV^FGm}UnTqb)38U0=AMES; z4#6lm2EXm+k6fKx=BYTa@||X3H%Tc(GforiWiatzm-rr&9=F+~zp6zq zlVVikKx+tDz@C?=NL+3+j9|a{wck;4_z0+m5WHNDXYbWx$RD+}zCL%l zopF-XXo-`Ek#OE~0tBswwD*JW)AV(GG_C5TKP&u+YliHOdkKz(qr7?{@orhlUN!j# z7{hSrvcG8n#Ror})|~Q$`Fg5LMe7av(cw#Rrpb@5>X)zP4{oU2QSlJGy(-3N6y+uW z7~QtQrFfHu8<`5syvB|8dTPA9g?=o3MgHcY(>lyt8|UWt#Ajy(*wsra#6$fr0V&1d z=^SHiEa#j68^8J>%MXHErsYXh3Ji0I2h0MqGqr~Jme$^t4LvFAdn3AU8yv507`6?B zk$0BOyRjWr_KCsG@-@1x&*ftXe@cya@`@D|XaI2Wam{wZ8F&iu^9K#$tdv=2^gga| zzJhw4k}*NAI&K)fIPoB39nr~4ZG7@YXtc38=k>L5Ml0>pkY=8fMH(cT- z#V@@c8qWM4u~|L~5f72KodnwWcqVmjZJ*6N_cnSu5011q|CJiykI! zD*Cd*DD(GkG~lMSnZuk=yoVjzHl4M1uFB`k99U#&^-e zBLRs_tg4U8YLH{|u0uF2q{qcuBjrQv!eCr;2f(!=dwL7IFx_FjaUnWZ&hA41;^6FNKWgFSF&n3v>sQOvj_Phe;xERYmSH?6S z=sQMgO_)*YQ;uq$&V7RKs(OVmcIHhlVM`2~;z4Y(hszZiiE8qdRpLI?){7$#??ho1xrYUiVGae9`>*rK(QdXswD@`_cEmri@g%=WwxzJ- zPguOgnf-24YFvq0oMs52EpYtRwAY^E<`@#Sic^&{Pj$9MmC);3mFXNdxo3YoeHE64 z$_(;|t^u{)gfm38H7|enf=*m7K2xHdl=bz_{|U)|#$YTT7@Uwgxfs?@@#|vuU7}BS z06iQr{%$qvprOL1Ngab_@2hawhC$eIOUC6V*gZHkZm@>YGVMINY*9Kp=RCRRauiv_ zha8HYF<4(shJSo)C19VycAOd>HDxG8mvd)S+{Q5xb2QRmBeexlm}*X3*y-^og?)R5 z@`gt})`6yjVoasFd3bU2j@m{dBO!=~JSH7_dqun-_MWi~>jt^C^A>3ixkYY$DKji7 zb1Kk?qk5K*SJjg;PphG=_2JB|R{^io%d^{wE_Hu`gxjWb?+B$)K7`D2uKBK&d!C6t zF~Po?ZFc4k*)?jLJc0_E+PyLuJ(G-J4*#Q;EZf07PtgciPjikRq`1VI;PkyUuX4WP7;I`C{Pugy z$dw!Ig2|SB#j6k9DcY}|hk2s7r%+=1RSw;}Baxt_UVfy+cxW34N!O~r+w<4(oPXaX)-$HQGuh(Jqu@%#7 zw~e=e@n;~tOoJKk<_VP3EdJbsrzy-h@=BRZVwAtllhB`x*kbIo&kh$)g^%4qQ9Z$8 zFvmaETO~B;WPwCJwsu|3SD@@tcIRZ4vpehyByLiA)w)wM{w<5#1u6)F`nzsCX9p-{ zX($5=fuJj3G?CyLak)xH%W$PrkM?j!)#{k1$Qp_D@tD4N82pa1_eb3b-cGfz{If_t ziO6S`{oghUbSt9uj_(qb&DUL(E85!<>!R~i$hLc=AFwOhTZU0t{A$x_AAuYaVE?#L zZ+P_X8Boo*Rn5I&t=1=7whzrZtqPwp71k=7dBW1mxHC>bh!W-D|Cui3#O6P8A@G=@ zbI+kbuREFxg`q{M_GIa`jXB=lAgf9)L#c{rqCHKjC>$mRkC225Pnw&TO+t@#o-K*Q zSgM3}M&T0@T=EzWUEQ&~%@!)ie#D0Vz`pCaLn^ckT|7v|E!T47_)eNCpSqx%IDk=~HM*L*?;`8bPjP@&*E_c_s+ z4X?9WELj$=y>l%vW(JwWqITs?{vqNTHpw*qz-sI{^~A2d;~^5btHRJ%9q;m*ZgWH} z@sLv6R)<#fG?*u+bijw6B-q=Pwx73h7aS1N%PNpD1mNkk;4r>wrsMz6s?pe7aVTmuVaU@q5WGoA&W zYM%r_z-xXP9}xScjO?y01w2vr!ALpPWlWEIqt3p#PnV9jfT!Wl#)aZ_Kt)O_&G3)B zvhgC0>^!z;asX^&yU4du1_`KM-L0F9&h->e+HbjpiLj-r1O>ScpsLiP1a4Cn)Gr=Q z2}i$8xr*Mas2IeuZ~83g0-sygI<^iQ`l7kGzVFmGeMtUM2ig2uko{SreV5)K`Neg| z@PI{2y6`ib_Um9AW}+p`>*MRji61F=y8_9UrEgr$kKwE0&xCU%Vmsbg zKQOwR3a)#@M_;vdJ$?Lzy|&&OMnWEXf;SjN*P`av(%!OL;5fw?yj;fD5U%khec;;< zRr9NWq@)9Aj}3_>3>2K2f9|!pC3;)bM<1JtA3uh_iF<*vZ{@R^k$m`j$`fU?1>vU`M=PrUKHr%HSOC<-k(>; z^twNjs+^1t*UKf`2m6ZvmF0D^SxeX}O_^}jD+bJ^54zAQWbH~I?lQiMz3GJ;^0?+I! z$yBd%CN{ENUWR6W$BGM=*A9{r-cOr~(*L>`+;p7Gr3oFMC%s~O#V4{XEcRJz;12iC z&q0QaTS9Ba&G9TP`n9!;L(SEa3FR#IE_GI{MK`H`=H~az`&TuflQwv;$Ge7J!n_%9 zBUfH{o$Y%~`}@M5Pz~QLBoBjDveWCN&5P%{Xh1>3MDHT`5jY3B2;lI-htcNf>6{Js ze%=uOygcC<)F17z_GH0&fiaNkWai=`q)%|X0u00gExS27Ejs07buzAVpS^d`%U=k0 zED!=lIvs!(5iR{_iPPeyvRVr?ChBH(JI^GhW|c05HT**(akO; z%B>#i-5Pn)=NdCV(Yf^wiRe7p5A!({T3z3e4E2i+USq=-5j~an9{{oQe$PLYM!l^*G% zY08b9+y zEf6_Z;F0zc{;M)$^0bFpsOg3o_uc9&4>^PEnBZr+51 z%jl_b>%)@~1C{DdQN~}-4KAY!2x8kyGGTuUVu=z`*I=ioKn2G!Y4oJ&ChQ2Y=|^RS z(+a-mD1Pd+f8-u0xK>#+j7FwBJXLMb4Js}WNW`+oc?c6>@E)}GW1(>w*>XKR4|aDb zjbIvcJak}xz2mKJ#k?k3v?mq)BsAItK3Vxu=y`l?#X)< zyg6P>gpV()6h42*!w0KI#TLDybYwf;3=p5_k}kCN3*9GIs|s~uEiH<2$B8S$vhj7q zY5CBtFm=unM7&dY6XYx%PGWPe#VwJ{^N6j;c4S$+LeC3z z1Pb02KR4s3$9u1m!t{}jJ%Sk-W_mLQv2zX%_nvGq-daqON;0~i~J^l`MEs>`JMt*&x7OAnvr=bDCtw+-2d zds~+XJTv)`hX<1z2(4r=jDv!lxD~?FQ@AV_&);@&?Z>?%A1=^l%wj+V$^eU?!o&() zFx))|GtsuEEMpXoU0g~|HBl>wL`P-%7h|?L0`V(fsW3m}E?&?aA9-rETE-xfm}1%5 zS64-iUE;s)(A=b;Mcjpe>nLu1oPP8Q1Nv$l1OX$OE1B{0=sgdCeYeVV+11{H*OnvC zC))f%--6@iYhGrl7uuPDE7?|NHsS>+w-H?LW9&J9YsWQ4l4MK0DXrr+hfqI0?+F{* zDle2shZ8!YVj9Fserb={%ZALzqrt2jB4I~G`nFyKmr|EvA1iF~78Pksb)PykOR&jT zO|4a9x=Rv~h_}YwsSQ&p4fEPHTr7yH)Qs|8$?=aK*5~hrVQks%husaxc~V653o(I> z^PXeVYx0rPX24i?y<+M7SsbIu%x17x<53))Lxl5Pa7VYOOb-u zfe-|}8hM|q?=PPfBk1L0a-Coo&(^0;t>IS+&cB8RDO+gF7>`r#SAlR`Zm-Pzah&+6 z5a9EM_2p}XU#n7?iV-6o7?q9_+bL-*sxufaM^`E1ec~fPV%AI(6b4t>5=W}{@(9~_ zeRj#+-%ory!)*k- z;b*i9FjBH*V7g?QYmqBwK>>_T;T!nIcOD!#?|yUOw$=)Q)%r%2fQ z#S5)@gDfu$ZuhEFPIhXJZ3LCSlesJ~N^M%`Chh>}w zIJ^+4fj<-=jr82lV=EktOn>s2WdKm{gb(U5`LP?jl;Z6%|5HC`MST%8GBi8nbyiJ!SufjVX$cK_*K%<6_D zMn!@Td(Qso42Y@H^c=f+P4>kX&ytdL^l7O`; zumN9ITjEI_iMO>`dAwYu&mLo6@!qlMMrhAfQ^DajCq)e~RONJEqs>16y-qrIMA+`O zlV^y@JvtO|top{Um`}h^_cwt1o`YIKw5NggV_6!uBHla% zsm^!*F^gW6j*tEw7T8(}J278boR^j-doO>+iC@s~A3J?FmB;FDCi8#x=+# z#QmlI9rv^2>FLB(Ob_Fon1su+q`JOOt>s@#bo6&}5y0#qr}($I>|<2>4j9itRXGi5 zb^FPW&mOpeM!1_38a*MnwkG36d<`>iV=ASl+_w?mY?sf#h$7KV}bQ{RB)yMhU z+zOp2AIMnNMk@J3{zW9=X#_tOrB&9b%u8@`bZst^hi13O7(qqjcQDkQKSooO4Au`;yiEZs(SO z){+0kt0ST1|%1t$OU&Oj|c0^E6Vq+fcye zdeR>O+??0mnG|R;RIZyGAA`2I37Xnu)RXW_rDf6cHO~190zIP;_Ol2qXea<+O@ps4&(6jgMN1dU$N|xMRAib-_c0`i^9S&4X8;yP83M+8}NAQJ=$S z7HHDbVAY{yls$YO&&Kqa5|eTZLFu}y&#m191Av;9jlXumd>zGc@pKiUmDdOOI(yhp zfxtA`pSEi)aY;^o9m%4U0)4G*Mv@92yh)Z8&{B{$3oPB;y7{Ge#la$lnCOf25gsNfl9 zD7!U|@cH`l4|+Ep;f=txT41L-mhcqF`i3V6BfNh+(J726!`cEvv-4xk)-YPBkNLDQ7-#F*l zrk(;dnM_Y$?L>rmJe6!aJ1RP3fk>($E>!zPu}vTIXL@_~i=*8k41%FG)0z>zt69k} zEe^*<>W4jE=dK@s4(mVg8M^-Xs|w=dVXgYHh=#j$^rBvmUOE6{ODgV3WDwcs2u9O|3tlOhGw}rQ#>EH;enVj-r)3jONzN-_O^b&xc*aK~mVrqi-BSu&1hkH|uV-0Nsfzd`Q4Z{{ zI@kM+vFD826mqdquJWAuleVEzxT^4X_lxsIHHp209nWIlIyMQyNRXgc({bEZsqfmHcpqzDFAP=lYKk%w!hj%#e%#4XLfcDC>NO zD{*;e;+^3#C!LOsiOPse>98vy`5d~Pl;mvj<$QM{mBj8EL}3;yIxxwzz`*XwZAu){5KKfN{#Rr!Oe z!p*j0m!ChjbSPGhR1h6w!dU2MgSa(9kFwIe2vqIvz;4(I*A*jy}@{S=i$!Fq*9k9;66|7DLg6RJF+rRNnBM(?ofySeyT z7SLTh!h4g^M=pgXppWAWKUvVlQEc%jq4y!?#@WQd4(I~mK@xFiRf#2mZpm)cY9cZY zt@;=+Gq8_IjMb@o&N+HBw41UE&FeEUkG(5rhv=`SNRS5uTj${UgG%r_si!4 z;kYCKTi7wvgy8ZY`;`Agz)!!vEXz%q+>JiA_eH{-GMgS(Fc5C_o}Kh6nXz8Shu`V? z7))dQstB>0r_`Qt9KU-apt10T=q&z=IA%bc*C)*XDg4rdaCV zBX{Uh-{CsLPZTBYO77rd!SNqFWbS2p7>Q-mWC5ex)g6AY*lY|+%I%#crw}{o?v~qs z3OPTj9r8$)le5BVTDXjRiaZus9i#B)6W3b=Kcj3qEy48n(+pT4V=M{E|2#Za;egZ7 z^ejO9B=z{66GkA4#}U)M1^;BzISqTs!*k$y}weVfb?lBEN4it^~~rht7bZ@V{qUw|9^Ne|Ooa@Ze+C>0EYudJ1myL{K0 zq9UeODdy+zSP-}$%ho14#pED{8tqwiq^xMOOs3iw={Yvja|lt$*fwVKypO!_YWsDa z^90I)l3_3&iEvs7K8AXcxWizVGdIiyz2KL+PFmBPNL{8UcO5Z3Drabgo^^j`$f9W} zKEXtEC;|=dEHqxjo18`|o=k{nc^Ij6Ub*eZKeQ^>+QL5N+-Gb~9DwEkh{WXWL50s)CFTt;J)x+gIvhzS3qh*^xmE(!6hvDW%+%-g zv*JkU19m@P46-ptNvCs{>Ez8^JhXk*agt|fQ7p}Ov-5ZEy6xa)9M}~5xDwP8Pq^~z z&OS4esTs-bF=H}U@ZRu_7EgacHlM=2zVA9NsKon(%;C68XUkoRVZ@{TkFR`fG!(IN z3ot=i;ugie9E%o+H`3EFb8lFht3Ebb=nhN&mk!rc@_UDO=U{T|oH2!S&`q}8+L7xq!#5tP6!j3AE-;drq%-%D z_7?EI9-P(f|E%&}#Q>>DQdbeQDFLH~S*qvuJxaK3d*WpXq_LpT`TKZDJw^Pv_0JQl z2j0ak5ZfFva>J#xMJ%%Xi{G;sUMCh7uYRK(Y;#oX0J)J(9&#kli%3?16UC@;W^q5s z>T|0utqXhW&4Z*#5+vI8!0yf<5ijTKCFJ}tad*~MAND;zQoiGj)lE_ISMSmta!pQ@E-ln^k1rSRPz!cUcWYhm zvB<~q5*QsfQB-#7gtHtZVDE~(qWuEO)WR4Ym zH|xrPTtDIXrRm`<N*1n zOg_g+DoD6qu(uFwvY3o@y0oM_0(r)iX=QOkTUf^_CEw$XBIuxMCJm#07P{Z$ik4v1 z79fTa3ceSl&lg`Ay$Dc>Xz@3Ru-h%doO`1_ZNToq}sMQ{n z%Q=mUT1Vd$Fm9r-5tqNXL^^heEcoc?fno*ry`KxMg<**^yYn1Ht&*yPvF2ddE0>Pe znz&4STT~rE=vY}+%mdT6yCVv~H8v{mCK$Z$g?z5aoGmeuolb*)Eia6s@)gf-^29nF zjRQR+U1qeUscDErw_Vqb;Tc!vuE30`W4dw}bI^o!R@GUu@cb&R04( z#bxdHsf}B22=7;m^WNI3Z`avvhK|~5IyL2kkzi*ZiC`GvFsQB$R_0!tno_(Ld!-_| zCRV_dOEb>$)>VpfOX|9`!6&(*Y;+Hp3n)^|uosc2VR@vIzF(2NI7fi29lfXVSaKR5 zU05Dv@w|xm0m^Q99w4SyhACHkck+0*yJx}YA1r{@6RJE-HR{371L2G}#|zamw%R34 zgQ++ZcdMI^^bk7RcMs08gCabbF4nx_EdG(fJ-5{tOD76PtM5YZzZt+>B&kv!kGH5% z9tYWr8~OPwM=rS6#;$VXdc=14jWI`8H(iE&w&E!wNl$u4;yvnRQ%jw@I?liNIEg%r zjA~(Ve=*KhX0Y0Fg9=86*T%8RKNEth&09J!P+d+vR)V z(RS*ABeYNaLGRrS9vo@nQOekF5iN;5QF|t`I>^mMfuujbD=O%{EF~E+i*0-db0T9E zX4xB*)rW%?>tQM#Nyo3HPbh*ey;qns#NsXJTNac0yjN2w_U6Pdvr^mh1^1PM#^yS( zIIin1V_oA(XT^o*pRtgAbnN4|*6WxyTgM6PFmaN&NoKeyv8t^=o z4eAiOFw}54k{IY&34+mPh8t0>*0v^|qHu=2aaGVmd|P2tUbOm!OWK3q<_?k!=UKoX zRqlzhtZA(<Wzu4#L#16>im90LviNQ1gt7g9;xVC z#JbFVn(u(TzVJN(IviYFb}jgR^WIN_qwVBs#ZFqG;Kc67Iv+c#8}tj?DuTQh&=ygH zzBRk-m1^ffCZJc14fC?mbTGnJ$E+}tXF6&;USY_*k(ysNg}0+$Er)=j#}K}$bG=wc z_@v&j0?PQl$ttXUT3{p+l$3Yk-c3}G&1VG8H!VIx$lZ{`O)lzlhzV$T$*weD^i)`O*-pVWQINO)Bg=W6XWx;h zFIqv0*NDBbJl&J$%0BLx$Iv_bQa?INeQLUULGYB`2AN#=mqQ!x(H&`DRVXn{JiCW{ zL~rMvPZr+=`0i{jfT-@5ed@%hgO!bgoY%kS=?ETuU+ zDTqI(T=8V@RY>>_dHdDw(db#O{XD^dTtWKrseE2Tiw);NLG+RK>c`yirf=;~i{J43 ztpUavR;d<(-%3BfLArmM{<`97`@D|=qORQIUDbiw3n%7xxz=>DBVy=H-LCfeNnAac zB_`~w)o9}3A!_NNprj^2oL3?|Y&^2s?ZiDO_ zNqBF05z^5BJ?wwr_0GZem&p~rb{7}V*DGi=#djm@4FtbClXg>*;02V&wwb#8qqg&j z@S&w>Mx=+n6Lxw^>$-Rx&BCEJ*0x|gVbS2`JMYH9<2jS=?c&n)J+-&QohstGSyObG zG}h=@NUxyhqe2n_L=f2x-f2BSksVib8uPkS%n-P4b0J8q&XBfJEp$O!y>{eaN8&Zy zbV~iGlV+^@aB*^$gu7%RWFoYU|yGX{O({+EO{vjE%0yb(SB3>)Ue_{d!`T zSx$x@KQ_RxDgQWSODMHQef)Y4HFEH~w*hJeJjp2L$qtSZ?N@ z-cIX0kjaW}jf>H7*^$pEn7=yC=x8{QXIKzquyiysTIXcy99AoG`1-O&(j)p@sfeg% zrHD>*&Nyiq)t1%mxHmMs2g!s@hUG5>|Klr;79P(3ry&LW)kGs^%m3}K{ygh9Uim}A z-?OiO_>hAdf8^_TN%^BUey7GC-uRswe|Y0}YW(4i->LD3H-4waAKv(#8vj3eqf+yR z>(?`!c_;1-GA4bXE!UXc!BNldn_%PQ&Vb$Ls)_g_ciS$|+N%z5N9)<0ne1g4X;Y3P z<1hgDz#e#=0lPS!@rkHB10j5lD8Lc7189&UOU3t6@a2dA%yc=e4&+=+3*oqS=YW=U zePXp?Sx6{t&QbUTJy#jc`&NZd*e>@qwsL<4Y^$~bm&?u9$$>&1Qh zUZInPtU%ikkqsumZkNE{I(i?#v5ymzJev*yz)Bk4gMX!f89L|0YM;|Bp8B#+y;~0(*r&0sVZCTk1rkDK2C*T*>+1%_U zYBj{<_`Tp8TKhWM`wi)cnnW@!f=4pWzS>in*tD7gvc<=`vC3Z{z;EYCp zPkD=~kSm(y0O+?K6xMoYuc?3j%y8L94FoCV7yv!=hV`ssS&YbWr57VWpw)UYEtun^ ztAb+$&%IXxAn#x?JSJJxw=b9|4O_gR&K}7FE%85OkN}`QVXTs8i48E@_yGob(})0| zOd34$=J`Hf1zD3&Bxqh%GKoOLafR{vk7g5Q=g<`lxN(>7Ya#Q8E0Sqjr=QsT)wpHn z4mR20JM`pi9e}~R%7z`fft?N{Y1XsL{vH5IGL{WOKLJV=jaZOFhL%&SqfTV>fYtPWtH!pdW^*JC|t~6E0W$#u;oG%1caMDDJQd$j)@5 zgH*k8J?M*`_GnP3eFm^BU3>kR91_4mNdd|Cy=%E2bkH`9>2iKyzBc%-54$LW(Po45 z6YmNd9ORjq$AMAWdH~)JVMCH&GJwF9&rIZFn;645U(ChpGK(fTJ^P%)Fy7ZHa z0H?3(ZfL%)A89 z9G~A_75q>Tj8!l%0g(%y83>nGLFg6q?~PQmxoOwS9-Oyh>jh9pb+w`Z5Vu&+6Z4j5 zs4(VX?XHo4UP_7wyPOM}(~1|%08Wz1wE_1+1?QeCW=v2gFe!BD>3(+$EFDs&InZ<` z3R0F=V1GZ$`(Dr?(}8<5D!+_|cEO-;f^|r~^yi613W|lFSbPz(`7m2eeXlEJqqGQ0 z_Ih_%)&o4*<}3ULtNd_<@csP+cif?jBqIZz#i0XAr54*maXQy6*bx5grp<)YA}Y=Y z?UTJt1)uJabcvxaZ`A+oVDSfnlQSHS)SOsGUYUwYHr#HZD?ta{&u%$p%cUoh-~aJr zGB}&gg4f|)K4`^-stx>Gg$;;<#LfKn9c;8pP!9+)W&`=AOJ#ZmvN_DBoRYkEw&5_R za^QSkI|_*FQljGWnS!jtKLO%8b|dqERw=;1lI;w=vU_U%0|F3}wJ>yo^uE@>FMO)c z&PpIYc1^PRj=esX-FMkGaUa3i=CO?KCP06h5DOJKb^LoK_fkvpS>^}Cy@s3^gNtfBHsQegKZZAw%l$|E_y?5Omm0R|FcyQ3#fy-;E zz#L9}siX^66%OqRo1Egu6WX((^#E!ek`lBudL#LYm=5uoab3E8;=1x0!Ify3ejF71 zg>N+P{Ox+d(JFa)XQc%eLOzAuDr3tX{o^Ds3!XH$Mr4LOSOSOeV`s?4*=P+!upRyI zSyA_@ga!Teoc{}_UVHZuT-Sw-IGtrLMdD&e{(SRg^nNHM0f5D4E$*6|lg9Ldo>=G< zpd6^V=PH%_vgqulfZn+rpX?zQ`10cA@ARxZwV~8@kH5m&tL&6hJ7x(o*wY4&=& zdVrj5-b;@B#EJuD23$SpUbGYkj>NDx&{+ZJZ~L;F6kocIy4Da10j0{cSab?8c{}Ms$gY-a|(&uLdnxA;a?=^xenpD-iGqS{r&X8%vIzDajta+zcGJs=Js>P z&`^CUFmrNjPvFk#0kHP)<-T{gLg&4~1o{HS12oT-tR7&q;RG5-V3r&CQGf9v^f3Q4 zIH~^6q6)x3J(Hwq?gu^qjDY!;xq`@>pAO!Z`>le9M?ikFw?W!^%V+UvQTdj97qAG!hrj0n(=ZXtCYuDY+sr=HiU({$^r#uK zy%oym#!<7+A3~Pq0lvC2VvLEVv!}skjI$s~bH(E>T_4hhq{hWPzV0RhR85()V&1K4 zmR1Gc6!>}gZ8ZaO$3JotzGWmR=PN0jNY_HgGky8~I^%ntwd}&sQ`hJV^?c(P1?WFU zL&j8+wK;}M!J!9Pe|2L12HBgds$Oe+aeZC4u9_Uh#rf~q>v*H!!0Z4h@yO}{dTP>N z1>SZ@AAl5(Ur2c-;L`o#u}exlt*c(X!eXn+`FfZDQrS57zjB z`CWB`OSdi&w!WDpyl7#fE=*2e>v8P(HvNcfIqlz3iQvOEIcmjePT^u#ktL&ViT&%E zLbzw5+$ST>1I{bKZV!1OBlXuP#eLpV&?4`-dH~>>x7mligrxl4cfMom*NT>ps|W72 z&jngqla_4s{^bF+pQwyD=k(GA#a3+ZA6K%CuHW`+DFDOb0~mUFdZ8+$o85FB3(Rj0 zebf-?XnMYY-LPzVLl$}%w{NyYbQ+WCl>~QKNi()5-sY_uhu6%;EmLD3j-5aQn00fu z3M9R)(gNUCL@;9}4NC7h^TVJ^RmKolSiC2&FJ4_p7K6mJ%37cKlf^CuXNu!Z1;yLr z*i*Gb8D$|1J=l_wI#^VC;qdhSO=a!DBi9fMqMQnnQ%@Y{;;IU{{tx;7;T!H@ZqTpG z|BQ`3D0d7PI#t!}_pl&1@@soYxdUc%GVnpPNg{|soUKrgCoi8BGXXAK1!l5`z-yP?LJMIu#=(O`eHBLtki17Yd&ruHX@`SSXv8We;ZK$0^pd`AH(M z=5j!7be9q{!|;}|-)F#%1tlS?rn+B_k(E`B<0ml7*HWspa(v>?j!#?_(kHlRtygt1#7W&o`V!xIP$M%o1ru5UfD2;`s$;UF7K%_nbpeT{<` zZZ5O7>n{5BPv0BZQzwiBEMQ`Jek%$`Mdv+@8po;pumAW0mZ2 zAwNLEdbU3X`jjo%>?zic1aktGMr#*=+VAPd+}m-z1TZD;M3xDP0Q_6hiKbm=Phdl8 zjC*e1fWeAq?D=j#%lT$k_IfG73kLW4 z-JykMxZ#7i#VRSC%SL|cgL)g(ZQq#~i`zllcmF;>woJ^A90H;peN=F1S=7@0@R-O~ zeLDh>=6s%QJ|#K^=Bm2~Al3a-^D{*~_Q=HxtYoHL(qc2`%W>Yz#c&{y9~)k~FEiE3 z0z0K-O4s$|>#cO%+=sa|&0?>f;-u<}-tL*H#J^IMnv9|L_gZ z27!(%GXEHF&YSpek35nFPH3!=cmMSNiTE!LNFK8=&U?hk1^>$<|6Ca7E&RE#-`VGn zgmI{kKN9x4g8ritIrRM>8}_@b{IOx2w)>CM@tX(u$LaXvbo{O?eq#;bef)7cIB4_7 z>G7eV*PibF>qLlN~Tz&F3 zP7G|`s(MFY!)?{@ZRakf%NjpD{p~~A;o{RKLmGL5?G8QN?uiFjN~9qr?NNsx%r?(~ z1NxIy@GIX8grN^lb?2QrzvGbJhl9=g4nBN+j!V*g?^H*%&2&jJsb`@pS*)SNd{s%2 zjE-m1R0BPwz9H~N;Hfn*oqd<2K#nov)$(~!4ng}pf%MC8SqFopu>5zS@x1>||NqIt zwX&0^nQ#7Y8CUZcAbGlRw%T9jziNX2I3QbVdV@dnKD>NT?|=O1zt6hk4af>}A@an- z|Cb+fzWA|ZknTnzeighHq`OOx!QRz!K+^r^50`!N=gK(l=FgRJ`Uo5T zUy!oOS8JCn#KXHa!X*B|0^qpR4FWfJzn>nt=R4WAI5IAgIhp4&_td<-XUkbbeuMGo zF;~I|EmPU?cVZdmmc2cP=BjMmEqN@^69BND=lofYx#ZgWtiJK}gYqyL2}_-4;ihCkrnSQKN|6VMGfs10@OIcTE1$M zgVw8p>$jYH*{|zAoK5Ym&ls@CJM6|gt8%ogt<{P>c|$!em`V$rsJO~Hd_Uif-x z^#+cgpz~KyjNZY@)R-lP@F<^N^xL+!HqJ`;KQH?C1r}`vdc9+H&wkEdRkrcI?)zE6 zY+;b&a+4nh_czyX?>R?re;7<%U$O8((*4%Ql}PIr zvH`rOr2J?2viI!T03J2X_*U-AoKsX#(o)$XD#zb&jo^_Tm~^MY8{r{Ygjbay6>7<$ zGUjL8UF6%OLaJC}#E~)QD3qVIKK%!_XO|Crz$B4baWAg~gXFQCerkjXR_|JP3hSV$t2wh%>b{sYo}aa`I=g z?{Kx?ubWOpb?)FNlpT%wUwBIx+%#MS z9x8jf(S&pm3ro($qjO*`hVW4-RK}M9wd@P@;r@-}1tcl0GY@f^o*m`c5@z zZ`1ofuy;c=u*O=S5@I=dpy6KSN0ZQ&yXudjyu_wzZ@GlMSeTH2oKH$7%&~s=fYN~l z{m^RiO|nzRR6f~*CPwl;;@)K5*#AcXBb9j}tz z6wqwCxv#wdrqs9f-k7K#)3HoT-^Hm7jZcYcp?W3NyheGHsWrk+eyMh>f~gD0Pw9vt z$8!NI5DK*ly8nm!|F_)5pIj|1fZd&*$@#0wwhi>eT!{y|)Ui)$fgiStH@(Cu`SJD+ zqp~pOS$Td_Gs^ZY=p4fY=|Qwm#4u+eOWQbqeZs2Hbj8L0Fjyp93aL zx}5NUlOHUeSC*#=4M;EvxmBd_pFh9#zRW!D@l_?%KLaw%ItWuFe7R_L5dod6hZD(u zQ&;o`-$I*HiYL@tg;+zB-0J+?q?~!T-y1@gu>k13Fxene9F})~Ij5K%`dQ_(xmH4( zVJfO_0`XQ0buA%+)`@bbKBie&z~xjxn9y(1)QJJ zd)4*G@tgn*oVfUQ;c<5u+&NI|)})R|1p~-%NSVDg z;98g0(W_ti(ij(a_vl5)>Kg~d*OCxZtz!uo?P*HUj+cZQ&jLq1&nvhefeu;i#@RRZ z8i59@)@90E|t#KU`D0+NtMn$RfkSN z`F^A`7wyv({G7c}HLYzk7Ht?$0>0M~Rg+fkjUyJOF&(lJbGzDg)r48oW}B;Yne;63 zAfrr>!C2O7$SIlDrr=KUZGJ2pwy{XA)MX9yQs<)#YQEl7T%GtiPyHY?xmdVcp8=WE zxAkOc*-ydHhK#JaF;Sw1@jxONNFTrvG$PoY26?V`DylRKJu+Yb(HROK)UQEF4fYba#dVv2aWjqdiF}#l+U6 zWm}-$Tx1x4L-w@4&CbzjQBI(2+|sc-Yq=Wuok89R2}tJnT;9)V&dv58*(I)H#>?N) zXui2~_>#+1Tu6SV6}%qtLuWychWANl67v>|{3Y7Re!Z=_3$hE}3bbIo89H$|(-hUl zXzcj#p+?lnDpbJOF}g3(wR}y$GE2z$wuiaG50eZyz0*~}S=)REG(!gsD*|K;03~?K zhF3Xz_liEqc0xH=BxGn6x&-zVI4%{S(bYeuB7NP)!-_~vcFjG?HY72*V z4YK?PB7DbawXcwFUQ1;ei!GhA#>MSJm0pi&S8(HFifv;#m&Z^is*u!(lX>1J4e1jn z(S{{!rGCF;4z_1Y#HkGeG?0$^{qssuUOFyUA}o%eB{b;0yCX2UHMVe@zpQKaSSI!& z+%IxWnL7#vA&uk0lKMM)=P0!xDKU@#z8ffE0SCt?LSFr8f z5KQ!8J}FcRVvGhF|K!Y^-k=mX^;?p|#gtrptka^u?6A0~csPN%5MbNNB<)ESyCwTkmzhA;G?knXO5q_a}C*WaDP#GcF@CIeb^!qH|}yHy>JGv z+%a*G>obx;ntBvf>U8p*Rqw9J(~?C`d2&i@>LCg8@QRs@iG!|m`Y@Fuk@Nt$F#FPX zFngmyLM&5%;V~+&4MEaTUI=&swIqxc)rcu0W4eus7GXMzH)N)qK^Ru@7GJ-jx`9HD z-KNF{F~m8&2ypa=)1r~n=2M*-JQ|c16OIdKM(LKS^p*_H*L)=~Kc`TaVB%3PpX5D!{-X?C%<{sv6&6Dh zGILUZ$GbFZx{?J8hFVE7EK$o{4dB!x&dOIQmKfAD zw}i|Ew=4NW#L_tIZ=%O%c{?qcZ6EX_5`L#>z>oejl?1n=RO{sNjZu5 z4Vy(RoBwv3I0FLZJc+imVwASE$99nl;7BwVWgWv9^tZ^)`53v6mjyy;wPMtAIz zYOOP_QxG|w+aoqz>NBTo>8;jd+7o-Cs$w=+bI^60^ln%4eBW1k(#M0^K`C`%jDR^uR|MZ_^)epWu~y=oA( z1`{5Vqy81bS80l^SAAU5T7bP`I2f*=S(y8P#cc7ZJ&7~x6#&C#=98x%P;H~&50JA? zx?848UF|;lJWEj!AvTS6WfioVnq_&`6__%N%SJrs>24q_Wti?UC|u!q!BA7{W?9;h zcoHXVEnZeC%BMWQ>UvAgiyNxTdlO%@Hz%~L-YOTXyoF@ zZpG&;5$TWu*~ZI4cN*txDkdXSsEvls;XclmTO85|B7V|GtC}yiWn;qQoDu!x`#B*?Ld@72N~$-D5Oa@-y+LoTO}c zQYlovXj)p#qMzQ?f9A2WWvZ}s_Bsm+;tDOzziBmExWyUU-!FzU?fnU^xX6KUnL8QO zkNC(@L6cGgQq!=u4cp^zQc>g1V~!5T-rA$Jj%(z$*TJjF<_c5Q+V+EJ79*ubM|H)F zQ_*(dMY`TYPwe6_Th<2LK?~nh2chyQk3K!g3lI4`%G>tXi8s&GDHCQ{RDefo9ca^I z)c5y){4m{ESRkZY=KbXd6~=7G4W0EF9hPRz-eA)KgF*7^I z^{rWL2Bh1l49tPp8q$ZQ3Qt4)s5dt8tEOa7W2UsT&(K9sox&B=VEsIQKT`GXf!T(} z7p~$Ro#?k_v{-z4grSr^w&t2UJ;Y}Jfc;jXlAF8MqkhhhLB=@7M zu~S9b#Twzd>0i?^CzG$X?Du(&H=_+x#*+L3bA%Y{LTd(Kfuj-Bsrrlq8J^1=NsimJ ze#tH$wyKU}I6pSvo);?<(CsCNkmMh=V&hJ}#T59bj2(L8kC{`-*_rR}XHV}wTUZqd zmrj*kZ)J?*>Na{ntzfhk?l~0*eLWa{qH6T&cnU(LV8{xLn7(T@Oc4unW%gYc)#^n- z;2Z{E+4**`^)FZ&ALhEvWgHqfV{U2Af*?X$XmEUj|ef4jRVNVzg0EK|jp z&}uq+wd|GRkFhTcaI2IvJx0)gCwrLKFniYDf)*Z9c|O$<=asn5#0=!?Y$-25!jhR! zimDx7PxHvq=CI8ia=$8g?fy%2{iNmoq1os$=wzI|e4A$2 zs!3Ob2UN?SHFi#VruPkQWaMTkfIT4t6r9@rFQJ2YjAsPYvOLfa40I~on&{lZUS8vM z%ZkZcH#rF>qmWd1GnA@3htJz7ES%W%xHO?=G8NIRUZksW#z3fGe&JcJ6btQK{d6nY^h#ed}4=()weq|ePm=2pxbHUCAz&7V^>$L`ltK#guN>`#Bv!s z;3t4XrAia=VsUaOiHk*(n2MaPFyc1KTHWfE=8-LY3gj6I^xBLAJbPhFeaU&Yv^o(D zE&5niZjDd{wVDd{yo!GL@dc`HVM7$5@}Kv70glChF>2`w9t;OYK>QoJTn?S0 zLy_LlO`9TiWUWR$$n%Prv8$gAaAEQ%aZ?u+GN0d1mLNxw?Di80}zV zvx?4-c-!*?{#4J`@u_O^u7e@80VfuDJvk!RtEwqkbI?|TX71cmtlW)btWT~pSSeO> z(E&n`IGv2)oT!XH`zw6-G{{g;vw+MM3ZH1~kiU1?(*g2TSqK_oIQLPRbhX0Yz0`I* z%)DS?#%wY<{w5QN9ETFZkx9<1&>ht!f`xU;l^f6~AjB9tsPd5b@;OfzDFd z@nOJRz8)D&)a!5L_wn+o0yDohU+(iM962K3TE2KANe5B9Mb6;(K*)Oj8a6nyd7jPb zR02__^OpkCbP3;^v3}s|w{r6zEQlA1uw87gz1-%F=!8vH5 zCZfQ*+Bd-L{8%befL*v>#{tg2voA zX(2cW7mF}?C!k!VZ%sUi5K%p2W@aY0vhSD4-R=6e#5U7_0;+We;oAI{o(HIId7$S$e~OHbRsvvqiM>z&MS zk#1AY;>{!&Ic4W4#O!Wpi{?#v)7@60YxE=@ZPb%EGz?Q$XLWX(i)!AISz1~;;Iwj> z=*-q?I1x|IN%14{TotsT#5^Z#S7xA_^6i8ih?$d#Awv3PTdTK6WVP?cI& zgd^1XDxu|O`DJ7oKs#}#Q_0_OU}}<|jOevw2UO+G*uQ`$*IFn|Zy8th8mNM44)0WtGt}Rh(rBj582DQp@F4kFtFVGvVH9x&uqLre@<3fp%DWlk&?-IsIHw^afBji{tW2U^mJ5DiH~89B)+#- z9DvujzEer+9xntd8dP1tptzb_-?3Cb7L(yVJJMVPM(FqEUbIlnF@b~SnGtP~Y}^vx z$%bxfcMipU4DXgTB{)Y9^2oi;_HL^UyVJ5~tq$;3Prrg|6^FGwh}$78D1X>gH-)OR zZvA>GGn^21&*Il_C7Y12y$QO$`o+mjWJ!5)<*G?_Aa=R zD}ow#fIWi#t)xYCw31vF`aXq3{QOC!R;_XEe81Z?*GlZrIlLpZz|myyF??Iw_LC=1 zDrjhQ$J<(4O9F+~?r2`W1U3>ivC+JQvs5b3MG+hK1`K9l#iV~U%7(U9pvE+_QsOe4 znqy5Z%byB(`8lqndbx8lj*VB0mZbO)yE&z?PncK9R6_jCI~|MiAgi=ng$0g3l_KQt zg=u!<20CqTd0L z8}8rR+uJwD7*5~@(9E$y--QtL_TT}%O*u}kCRtfRS)0)jeA}}4qYSJ@Ix%E5-6MWu z92Dg|+3iYw&`B8BQg&386Y9_NklVMmP~$frac^Q@PEO9q$Vkx;JmaxD zhS1k%-C%NC&61um1ru9vhU^H}xKQcsW3o_gR5A9xHTMVFX~fOzQBq=(_ea~)o4ntJ zVT0z}v=+ujzZI|H6hzLDM3vq9&^TL&m*y}>4VjhiOeJ!x@`N??Co@fXQdI5}%QLh6 z=svm#ANs7}I|n6#OvPJJELS;(@9I*QJ!ZkT2R2DTZ%@~pzPjB9Uq1B1nCNqP>Z-qd zG_f_eOEp^uuUw?tUAuH3F|=grL33mbncX2%#wwDx!h7EO(72l8036b`Dmd{pFq${~ zjHjYGNDg`iy2rj`bEOlrK#}cue=$TjZVZ#%nG4NVi+AZ7NMLtjJmzRWW?Q5ZiziN%wWVdvdG%6vMN~6#t6ue|MpGhh$wUF8XXDjecP{D! z=@RT$PeomM?>C*5wfiQvcK-tPh~m6*;ImHXPDGGknu^YE)5Jr6ur$AI$G;-E~~ zHfeYT(`+g%*(bMduWJHAd4m>CL_RdMB|a}NuLkQ}3p1&hm6K*hEZ#7dUXt16tGz=g ziys}quX;a1D0*(8RQtY=Yf_S$<-q!C-YRUlhlT+PHPSIMA+!=bML@F!Ul3BYXEIsC zdn~=g{vUC|t8wk!yEj_Za|(|c8Bbg?OgB_fW2a(+vvyFYq{~28Nd~*FVw1D&uxx0k zae=>8M@CL;O}c-#$Af~-3WT2Ftc>s@;|v3Xk3FX!1GNq`srv z>(;G15RfrAi@ozt;<1v*yNTbBv9WU$8$(yDCi0H`U9Wn!_6Gshm16)HZHz7_JSpKO zzvuGbN$8wQeGShuzyH{7aBU}>tgRbF)fI)2GtRE1-hpHCGIC?4LYs2#UKFt%bIg2c zAs?w3HZfT;4c#VPvJ_Ua6SK%9KHm0SHupf_{6v?U`#{zHHB}jgsK^=ErZjb?*2mgh`7d}@cV|Ru!};kJgMfwJ)LKEWIqg^T5k(%^urT=O#{BxH)WV3 z*r*!nIT$`aFJFCZY5MJI8|33#48lXrzYe|e_=}1P-5*i^#ENdpT%*`WL((~CzMKE8 z5h~j@UX+#an)7_VEZKzr$z{lTuRAXx@w|>2`{l*xR2B(iiull)>!LS@Z^t7?o}}d= zzC;MhWS2}ncT7%BZfmLZoTWMwV_tz1HGr~1-HkZ!^ ztv;P8IxNS3(A(izc+g~OSu=u(*`pPB)1%M4_D9kCiR9|BFNt9g&r1o4QHHhE*iQqA z{&U|i&Cb)%JsY>IPn`p|(^I&ul!wQ^NIdhKn=edRYrP#ac9705m;w~MOz{xn;m zS7rMP7reb)paz2yw|CoD8K+uoF%5IDtK2qV0QI=Q{1+$3Y|uEJSuiR1 z7<`n%Uuvha@z4>aEA;w~YNY;Q_$bUAmS^Ztfq1lW8pB^vODQ=N~@j z)^%P1G#c88*>U#CU;4G^b>$+3l(F_f3#_h-9j9AQaa(ByYDJ<%QWD+^AI?t6NXgG8 zmOG$+yl!+yP76&xT$n17?Zz4P590yAV8@0{q!L|^p>u<7>8sqAgls@eqPmDeyGW-X zL0pyxAi`>30z^#Ct%|_K8Hd#aQv*m%WWSh*&FsBTorw3Yj!Qo@pUbEaF5^0n%_d2I z{<0WC6e|YaW7uT|%aqrE)&8@-)2=d`0XEakMSx38LZcd}2fI{b7z(3RC78sC$B z3h$`tHFAlqC(oQcD`Kev@7^}vk&9~i>6YchYGq{E(rVI9zb~3$rILK2*Y6;~ZBI70 z(8~5`m6mMaH@sV4i`%hXn!iGEUGcQ6skoe}RZgUI1U586=X8a9ASK(^9gF$)VP$uK zU1f`)n&JgHtVaW;5-PPmY`cw=X&n5b72kTZ59tv)-k+L*1@nAs)*Zx1^{M{ilk0fV zTag99c-XPCDo;#ljku|vlD%smLg6L1Cd0mj@*AoEJUqq|)1&1(pi4p?It*&MZ*5@$ zYtxNUv9wAz?BaCo)8LL*h`=}QP9WHHf4PC5f1Z9SZ^n&M!F`G1B85s-g88#TPTGpFb-LQ88vZM{)bWkN}8JI@WoVDdwYAZuu41cMq@&a z-(tr?`9hg5fcvr`lp`W;&q(QzA9i9q?PaVi-q8cL<6`Hu$zRK|Y*@`3K}=Fr_c>y8 zh9)BMa0=vOo-)l+5zaRIiR6Qyzv%hY9K+&l-<1W7jrlcPu^W4XZ`WehP^1Q$X{NQq z-f8OTXVjK8VspHpTMt{ZY0_?MI6gi?;L3*}ibT2fRj+6R|GPbLa7W$Pmr?SMTMIot zwd_q;8J*Txe6dm#SX9+;j>;yR3n>KB#Vk6p8!Aj>HXCpTP_-Srmzz(S_Yo*?vD--LVth1n*Z$0*||CWtm&?Nd&uNO zSAL$)bZ-qpyVPCF3gRi3qN%+tb+SIp&4;pd`fI?qdmUjve~zE_^>s|^Yi`1Y=}a~& z{~Z44)SCQA1|pW4j0X8e()F9A&AIUbUd~#~o|aIX#;_clwPP{fU)om6ELxa>9NT!^ z^uTh;m`bFG^rz{?)v!SV&pcSD3|vqYD$q4K8QlFpWHgqZ;xnAUHsX(%=P7=uo zZA@G}Q|3BX4U*vxWkvjL=05DX?z|E_l-nAfkA!0j1E!p`s7%_};5gSmW|Fx3y90v^mg76L^eb5R-%~Z$_u44!+XK ze7uwv^APZ$7zvAtBG$*%A{Kf&%nOP%`T(L}_($FukT-d&AE#B}I$o^y1G8s7#YOr~ zli*82bEL9DZ?7QSw#96B`Ox*o&9;+03caR~t3}WDH(`c)H}1`&^(}(lD&8ys><&}i zznv}4L;s3zf}Qq&U{*iglJkvnLMuPEg|_hK9U8j2*?$r=?ZzNCWbC3PzDX+V>*p<0Mt@Lhx&=X z=KJ?cAVl9&TvD>PEep3dN^2{>F8$}wSWVmf^QIQWgszGJizGyNU>VS)(hFsM2z`a@ zioEHR6N~o>M6M95ICF1=brAW)~glx za_7^jylnG(MV&DfA;Tr5H=Abm5(j6BlwQor4yk9K2z>IIi^I%uo|;e6jr>$cwNf9m zmh%eT3b+EIW~;mQ$aHs(op`Cv4Jp5*ERfJW=7>qbg)!>vlF82(T*Csw+HSa}$%a0x zr%C%UpMU;hb`<7)u}+CK5s4erWpruUv~*8p4%0V#rh)Qfo9q6$%<;IT_STleRS`!5 z9MK#lr)Atzw3=N)za7`NgG0QnUDl@bdhgjRI+@GoX<(HpJp1ncDdXB=NDirRm^nDz zD*#GTg?(lcDYGR!{Gh5SByK6h?_#+{Y;tjJdnw7tcu=7QZIqoxam;SU7|Acq&PP>E zg^&hk7jL}KURb#uA{iVhSFp66vm1iW1F{g$)%^Y42DsS#yb;Zdh@}ldvq0MK3Km|? zwD-ZcoA=x@$>YtNtl4o>-lz%{L=Xc-oUlxh#_6MGZ%LU}zYgRQm{0iCy#Tsrr>?Ek zW!P5?D!(wZAR&(WXYiuHNZAol&>TKz+;LB5{6w{Pfs*Z8QlU+S|7rWck&KR7V4&wZ zjLZ7Df0Pt^S{izJ$1u(JRkQ@6+bCCZ+kf~Kn5veKD5@##0CD!=&7#t#HH9nQQWIBN z#i5cWpMe<;V{^=UGj|Z_q3Zuf*_X#dxxW8*q#}h#l(mG)mNv@zNvFkHlyy*)eV26% z%_$_|l(HL1$WFGg&B&UB$};w`gcyu%Fk}1OkLrA8&g*;Te188`dU>Aby07bfy|4Fm z-S<7R3*Msn=|y$IXq9tjo>i$fCaBEF7F1YzQ=3a-C3VTm*! z)>q^^8MYwb{PMmjBF!C_P7`nvVO)wK;N1LP%|h)=c4gPr41#-Z9PA<@Hv(1?a)qK0s5>p1_D|Nh-}!PsE*;eyyK1)CrI*RpIxSuy zRiFrZxm_L&@4kawgQ1d@cw2U~4+uCTva-6=5hv1d?l>6Z4N_yyRe?X@~=6}&!M{9m1#-AvL zwNAm+7fmuGxFbJ0pUCP`uW6aEUh z!brU2WmwymICny8x!B;m{4(9i44@H%U0HiS` zj3M{jNLbE!vNsdlL@oI;&gfPC?ztZItc&reJc{NhQCJy4j%zHckY1JyYY0gc!@3>y zTdeQytDzmKrCERnRcH5sj4k>}iuT%u1(DfqX<~TPz*IuCQh>bp;bt3LcA&DZg^482 z&3J&D)F5ce8;2vk5h&hq^kn9($88Id*xa?X6k_rXweb!k6Z~s!r_HOrbH+gvy7tphi6W# zyIkup&*_}^e17dCUMpu5QR-BHXIn;vfEg>UG`JO+f4r3LND3@TWx}a8$9d=9w&*mi1DIXf^LuNR3vUK;HNmCjsXH9d| z)a9t;i)=vzYIQkml6eG<>%<=aWXNi#SCil_`z1p=16R0CX(+C*>DBLOepCE_@#~4& zL~mbR&^8)f%=03zsEt+rHu1tfyaYq7RV$nJCzHKada4N>OJ_22A_-7c*VDgG zy{so$5+{~3xy-lVNU=4^=Z)8PsY+-rZEN+ z+VPkT^zU$v9Ve|OZ?f8q{l~qiPZs0~Fw1<)-k?%0ybv3}Se!)+ZnlGO0ks%;^#dzJ zsQiL}A2y9Nk;d|GJw6>qXYQ%Wm-)rUPJ4{h9aEYZ5IQN#a9p8c^LqeKYf|%m^rwai zj?t0(rmR+}3xyp}&KgDB@LwA$%J(+Wp1f0D$M{uf0`~sbSpX+$1>yFp3eLFs3B2aS zs`Z~YTQl)@KzP2pS300jyxXNdpN2uw77NkRkVig0OMBxEkjmV0QNhV+yR4L*&d0}G z>FCheLg~K{>d$r$yWMYYJ@#Kp>a`e&717;BmT!DH>78LVA=}1h#WnoYjt;p!DF}f< zlC2hvA)>jF11vSrCh@bL=h23H?e$vQ-fq$UuN(Tx6(RzCW#*GUVUFj)w!+O1<(&=M z1K1N~WorIUpJO8=bQGoiXy)&2RUfde8qqH!TAT$g-L}Eye^*~x*XBgQm61`zxT`eXF>g1ZA1H`D6{XoYk0kH+8X}!`S^G3N zCH-uBbb+AEmxA+-zY?T%`(+`PLO^595Uu>6#lcm2Q&2C_wi2y~(9OnVx>kC}16-f3 z^3G(B(&VRuhp-}m2)8)F5$x1)F=i|jaBLUYF#bo>=mY2T_hTI2_zYwKJo2~MlvQ3U z_Hwp6el(WS!?b^ky^R$qe(C656Mi{g68&i2^F>j{GysK6g7M_Sv|z%M%AnPMF@e4$ zkWe}vfiujh-UBiLl%c&Uup|++|1@1roAf@>`Gdo?)Q@v^^0NxUhVt!^h>V97#IdrlX{L9PEJuMWfElD4kwE*g*|(d9K9wwD62)fXc+M z_(RcXjkEFHCmtDM()AEJm0ycp4Xu2~*5igznoS>1%ZZ-U95l+k*a!Bhg54hMX)n=q zhls~6f^;mkznS*z{{_*{IORh%!oRzsIhGt?&gYQBwu!!JQ1RgAzt+z?JkZ>fr4%1J zWw*mt|F9HbrngG<*8SSNiy~K}2+bqXegx;W+r)n(hX41MCNd>hz0A)r2naHIXln&`WmBHu{$1G@6?&JG z1*wCEmVK+(0f6Z|XGHU_gBNyJ%u-_H{4AY^SzWti6K<(uIu?9ePj~1VJ4!FvkcM{6 z7(Khv!x{auiewP5624h|qPD>2`~^A!#iwHcK7_+B)0h-(%8&*Rvbb$+f8u+b(;Gff zt)fZqOutc|Lv4Jx{*HYn3DbIlElNvKfd3uFj1TJoVB*%pH@?Bo)ju?j6E}!b#oDBT4BFuvldgg>S6MP^*ijw>cY`m0d5FlqF zgNR5Wy7p*(^I2Fe+C6uMpWb|&z7T+`9oB(=Rol=Xs@8TdlEUj}uRe?X^uAFqstGx$ zH=RA%>>?iJe%Vw1%9~qv9T;{I z{NEd@`Te~Ti$3WDhq*vRSCdGi9THdw^o1xHJ_EO8}$*#AZ% zw*qWWm(>A%DNsdW3;lh^d%7xe_ER(v;Nw+pH&IY%J5_Co3EPbu>KiR!xBq`Nxo%>J zzn>hKBRaR7M~ATqorEIGP+;6g?=lD>E?jq2truj8NoY70}R zqrW`<9^~;mBXejy9?KwI;U^lFcrYG))mx;~)%jGBUaM|)pK`)@cBzrw$eD03$wnEH zoKrbJ6|>sQiN1&|+&wqu-VZXTIoI$Rr;VKpXEX2)WOy@T9@AISO^gFusQP!cjtkH& zuq{PE_=}4s(Bg~{6IjkLWKw>2fJE-Mz}VkDfsIv{KeSEO=>K7@A&y*BL@ZjJ1NE&H zP}YI?#R*Pa`jN614<0%gqD-E7=0$EE_!oge1QayV*WPUZWtuGx0b@a?c_ust+cKmv zH#3Fqm0D#grJJ@beP7QsABn9SJ;=uy&55+b>~?X%0dYwRg&4j0W*dgC$?ZYfuu6Wz zM)ROg3@Z=OZ zP6DTnw<`5*1X;~X1|NYx&!Ox)G9^+@_`jC=7bg+|%wUzaLp>PC{(YJ^IB6)K^1zwQ zN~n$+UD9j#Z?L~g3$5~Hf)(y|DZ5I7XQK46gmzN^Ld7trFhb=?j&imo!vHznZaUQL z{|5F0e<7=Hy6bhw$&3LdT9*D5?`n$njAOq;pKGgv_A#xDXdlSX4xtEc2Hbj_`Lu;5 z?a|`-Bv?&?$xWL70ftC@H#^!~78eIEsi677Bm~n|(@`ZEqdqfcJ<1rjEh_BO#q=qz ziYxnK{KFY?4kWNUX7VjBac8m%zT53$Nw55}2E?zg=Q0b;!oq}+1DIz#hXl&kGMo43 zWZCq-!^nfJK~D=WW&x}2hJ86vd;UAhNdf>EI0?e#%W_kzKxou}LXC!1 ze}k_dGLTn=|FG+5-rcj`fT$t-alJ`4ezH{ZSIkzKh<{Y%=Zuy`8UmQE^w}_VQ`~y^ z$GM4tA+PBw@>MvUxu$JMNTJTY+fHlSSSE$lkLhx*wu8fe-eui3Uj7y}PDxp6cIh|a z2dLmk8dCSRNj$yvOfap1UAS+WJt_}8xB>4yadS$sFA7f2f7sDifiirAgH~)oM=~JR zlVuci)Ra?0^i^NF%eHT6JwT7n=t5h%^lR8Mj%h;L`~ZJRT|KC=Op@0SdP?h;(_G;v z3RhC4CwuukrxtH7n)2A3S*3SN(JL^9ht~R?HnMYqtE{jU%3zzEyi2z0pYMF*jWUrR zZ)PrCD=JI@9E(u-px7$!)b7NZ4LI%6mNMXcI}D zU$#MVdggIm!t}H1_;U<6BcUBZ_~qH@d_>zTVDY3i=3;a1ZAh27#-pZj@Ac0sCyuc_S+Bb zUaM128=h@M28&15JRcotH~K4g|6GX4JHpN;j9({l(2*VBOt#Tl(!z2Kq|+0;6MKwF zHa9k#5YzdaH#6H^P+fG)Kd1*C6vc%vv!Xt^r^@|+*TRPYIUif0%a=pGjf{@*8k4j^ z)ep(?=mJHZ2W^)JeRhK#6S|Du<;j^V0^sLy@let42lm`~E1c{*aHXaA-_TS81i!Y< z))eetV1u+1nXPlGC#0WMJCvGh%wanMqL_zZTV3#sNdM6ya&~iS)>4x zioo*T;<`Ja_&H3+2au@`w&iQnGU}Z4Dp^xGfnDJwZCC-HSA4Tc;bh|ES%+V&^`)5u zqa!17QPOX|pLYaoD%a}MVl5w!%k<0aSb_j4f7EAUrAT<%WfA5+tU$N=`-k=CxSGi( z2nMD`Qk+M=W#3!~g_KoC7-)AZ={W1nybF4dgZhVC@Gj)b3$h7zfUrOU zc+%5i!+)>` zn9oxI#+)PoLtgzEb@^HFFSWN8WaEfQhgfrpL7z-AToM=8P$TRxH}(Z7*DwBid<>l& zR8j`imh6okUVb!4po(m(tdTi+#^auTR^W*R2|$;M@2Pr%lXwmu&$1DAPG$zDUc`2l zx!9~byi~0!ZFuPis0P^KyJ%#VLDee`U^+mEi7jEjr9UW>$p+tZl8m6z+BZv{xM(|%Lko0z!CsFT zI35cg&Pk#+zRK-ux6N%2e`>~;#R-eZrbe2d?~Lk5p|tBM6TcIg@Eeo2h{Vf%=Jv2GXP0Lxe6G?L;Dv9=`HXMFoS8QN>O53n%5oy) zcu2^5G9?Q?)t5b+91&Fw7YvoIMB!;n{I}0ffIfdY(wJszut08AZTrROIBdttYx1M| zb{#!^jprKq`AS7~e%-mbibZ03tjf_Bmesy879B%%r-qcdq$T*>Yxy zCis?_7=Leq?aE+8-0|vvMgo=FoXl5+1}-@jr%)FkgDxx;HxTqs@#`k5YftTdSYB?C`B0^4cP;-9P?9)^@p#j^q9$&nu3@;DWmXZoK`KcM z#0``}>+$h*I~}>w{`zmswY-a=MKnkBXO;XF51PV>d*ZQS*>&?qVkpYJaVMpcl1Q)8 z&YWSUGs(a$SK!jD0j+|@cesbmtDVc(zW!kjml4HB<`C8$?~VJfPjAI!5uL2SWX}NJ zA#PB!_!70bvVy9JN+_me7yY)3yY(5@Zq?}@y}U#!49Kx>=#2KA5c)jH;KDsTq}ZR7 zthkJ9G0BN_7UX;wa;=Uz<@H8SX!ptU1%JM#n;DT%FwBY?AECyAPSxAr+G0+guk2d+ zO1|`=OGl!i?8(svBZRH``n!cFR2N7Ko((8g21#jl&Y{i8@a3Si@M&~G0pswPc*8wu(i(yJ(X+(A#Q=49bnS;gp|02d8TG$t9T`MZVi0rdU>MR^qc z4@ZL!-@CEXSb+A!2Rm?As=J>x&hrQA$9`5TPmL@jK?V=YK0MPiDU^4Ead_PO2MqaH zUCTt&hfL?gvec7D2?QL-q8^8}lv=1igXX)DnnJ+gIV&0?sg*)xgXHWGIc|v3Os@rfLDa>yPD2RP*`v#cjNB&&&J*A}IJLJwp;Ws6TSQjS}pa774Om?)V42!Y`3>vydDuSnK9 zF`j#^(uZ6jv`#UvF5i!mmhR^s%?@4Gl1Y6{#IM^Qtw8ux@MP2W18BZC?>!^nWO=gf zuGA?zZ{QavOL&8qOEQ0F4i@5C8d!)`>FHdNeYr)Matzs`?4E}=n(VoUrIqtf-?uDx zz=gfIlz5;Z(p4rk%SqAlL~p>#)Q2}Fk0YM_vp3v+xEo}GS58^?s4?=kBBLpM)kx0Y zoibqNlfu~Wq&VBq-u9Xre|}?F7Ml%WtFIoFn87#yy*NpgN5XfOwlN13;iU5PtAM;=w}Gf zZym~ZX}B^Lm${9{qvj^nO*mX`+W3K*(r4)>&&fp5huuFR*j=v+YDt;?=_jco#~<6YPO zhy?$|`jpw3n7RF<^nwiu1=}mxHXWK^GX;?2eilGZ<>LJD-((`^arYv`8y{u`)KT6Q z+gE^mFUxo6`*B`Pe&k+B=pDMcxhU|Ss7^zV@NYYwY-IodI}{S2ka7r@uTr&*AO4wp z<^9u3q-{969dA6D_y`@@cvFO@f%3cqk$<-KlG-k0^Rd~YG>;&Q8icyK^nh^P z>gz637qgC?O$}o?crT|j@uhM_2h+3ZJU9s||Gt;thN-`P){F6SPV=M2n7VpyanaKU znnJ&Hq_j)R`%eU$+;R5wbk91#zzZ9k#SA##e=B?6vjh7kVkR6t0~;ouQpF%jUH5X6 z{PgQBYgXFV4qafPnHiy8WN;~p2ne|BMaLMLLjhv-UZF~(wQqkiYw+f7vNKVij7q?g z`v#n?Us+`<*6r(ZW^h@a#;$z4?KSy*DWxc7RXDpa`XsE=^yzVeF;P~roTnvJLvs2g zYM36=F)~$QaB0E@9H4HiAW2+aB+@hIrQw@Qx2^@>YRh~Q4wB9K54QW5`2{OOoFP>A z^9=OzU+7VH3PRbw>^}Fy?jwX_`??-6$OLcT{T%$g#=62%I?`5;8fK-y zpbrm^`RH+2N&b`#_we0s|LpQz+aPjP6=%&%jRT$cDaZkEz1`P^f24+M)pY6ZYP;MZbLlR!~FjNyh;emRUyYY+0TpAwOAhNSE%t{>~KuI z6+vro`CL%AesGMKGUfRhVsd)rvU+y87qgekp+Z~1zfG$4mewTo@1$PP-xwrC0l?J_ zoNS{WfLA%qyf*wW-+7c`Kl0*9@DpHgE%~@}OR$Wsq@v{VN_lFEC~;Ywv#XuK3~uWw zcdoDG?w>PpN1x9m-juSFu7A_zi^#$MFXT#v1^VzI*;bm~3Y5?zepy^!11!q5SSCXXZnhgkIa?4I6PoBAt1ilQ|7}?bExCu+ysu>7>u8yVhI#u0r|nDbm8^$Yv63gi=n3-s9z9NQqoF1 zEc!XE=S0`XB3MTlLq-ksHC&&%&;8`Ls_?RlPM*dPonkt(8zPo9+o6)C|4ix9edUx4 zP~PT9oU6M#E?DVuyaH~i@cVgsA@>#vImCzt%}gml@}x{D&)AsLSuJ6aL#aLH=R0ye zAp1uI6$kY9UeG5bB~+zCDihn()b4e~X?22hqp;(H<6BZszC}iEqFCyI>WPpDAa$wS zqT%&4Fjt5IkMD%Hexe!eB1p|n5`>5BBQF`q>%1cxS-yO}FC;%7^LiSp?RV|+d7}7& znf)z`?{s?qP?s}aC*4c=05Q`XKE*}&IH_yA5pRN>`ya#|qniNcLNG3=)Z^_)(*Bj{ z(z)4*TG+j>P7aQBwRHxiI?v5*n@9wr4T}lCv1;GFj{iJRDXkhpR1ST=?(}^o!#_sM zANyuCqwB1ouDx-3JgNN51x`nemfZa*wEZ*cWTNt_5#$(IGVfg?$z^MOSDu6zlYn?^T8$F9( z_s?H@OeVZz9*baKn9j#!N%9g$$Cm>iZdW8*;~1G+6o}wR!kD);HPS&6~U8h+H zutY)2aYsqbl%q+`-eKh8(T`_gZ$NGHa{=tWAAPh9d5nr^spwqXP*boAK2As^g_IC@ zvHW|XBJru#rbdU|_L(A=&c!_>vs+stf#?V6e8#cnY9Cs)(Oy_CixV@AJ?vx*$*<&{o5qo178il; zv(&$tHWbKEC~U&-22#6;^=_oDKl)((M~{QeVqEnx2b%J8qTlckhW8P4jREyZRLoB< zj(PjgH-yDrQF?aLpWirSw5UY^XbsZJK-^;761Uh5IJ%yTuxzRBi&n+> z!`GJeG8)D91GyOhGAJ-bmAHplYg3eO|4E?-$Y)*xKS=eF*9fFuo@R;bpDw~iVESs8 zBy3je3*a?L?+4g94}+lUE3bMswQ+EZ>2t~6nA4L2nds}8dD6rM`OTHkrlEw>Bga4f zGtvDg6xxZ@Hxp#G0>_zpo@mz2lQ5GJIXE^l><&sxl3xP9aZL&43_I)I#r?@Inb{4J zRWvYyU0)!kPh31!E=w#NKsb%}>Xqe$%gYq8Ynh<|_j;LCNL@D5O3krX0T^>u9!#a) z?}W7ETA5wDg!XgWn3+gn9BkK-NTYPLko-2sJ{0H4s{0nM&f4DYVa}46EovpQHUzHD zFme%_%`dtb0#z|IGPji^5AY`*BNs!r)QUBL9*zY^I#9h7(sEyPG;9wLS7)YpDmsHl zIrlCg%n{dmw^+z{guns<#wnC%i3F{W8l)nBl5h#LOO0Zb`kEyFnJwB2kr2)ZmXw-w zngf|>qrh4U#9cGVFM2QazsG8UxXTS-(N9z7^y3vZe$HND&S0)~F>9GXuwm&>FrHTG zdyt_rxWPCqHPFhB;bNWs=va8)DHSfYH)c}*1h>UUbAn8pTgcE1n@kIuIIOQHGs4PZiXi=i@-)J*71NLB4OsL8-}$b(ah z`JuSxJBdcQ`UZ-*@woxB%0gv6!5L$lOJGd9?;)fscLQl>WYsZfso1AsxKf|bsc6aE z_XKWLQ$zAm8@J=Xv>N}x0PJ4V({@AE9TTf@YPX)dWJ%lD^_Gd$KDq+ZDVw%Xd3H5- zSl{lT<#wks@XU(wkC3S5L#Dv65oz@h|Dhjw%n;}e#hI(ofZhS5uAug#FTtht{0|qd zJ#={uY3YeTRY~eMNh*R`%kTqEq6o*I;{C zWe~H&95Y*jRe-36gU!?X#FTvt%yj_fU|Hf&wS_X?Vl9isH^9X7j1z&1?3i+IP=xp~MO&TeQvGezza&~&T zr*Ly?s>ESAk$pb_uheg=r{iYV^*mGDD7g|`+( zq91*M5e8MXC!9|(vwL|#Jrsm|`9**2)vvF}aMvQZ zJT=s@IsJB-TBQ7&@x83UhYKD`K~g9GJeRG43+?Ql>eKKgBSr5hM<)lHdJm8;FY1qX zvUBo+G^gN$9E?Q~LkFxT6drcuCvmF)=%-QJyI)uIfV?6mBx@9;{jgSFa&&jo!reoDYpi*qlsR zA6jun$hLP-Y{XOskvoPR@p#0YV+siS)vpG}ld!hmI(qacWPjvW?`5{5H%Yp5Hf_xs zfOS_sU@1+LVLLg{3D13r_j+yx2Z9nS+kp_t&Upy3xDq58-}&iinBhv(3c;Ed(Q7-qpEgHHqx0AD;h7>w=c<2Mo*3=8MnEAZFZ&t5Urk|Pm9Ge&-!-arQF1Rtkyzmr_RcUah>H;WlOt1J#(^Pqu z`_ax07c^S-KVN?mj06bF{TxC$HV2mS68D^R z^Cd`b_YnVkX6-bDMmey*nbM#^v#9e#TZ{zK%Y~G1b%E3Dcud~w>Cy3B)$ft0wPQIT z&@_I!+&ZrN#(YW=#Av_-$5=wHHm;l8-~?kO#vjzaK~FL#NL-&cdF_sR7DY2;fOO|V z^G9r)c48{6}3(12jK^!?ztMdska0Sz2bU4@47z1eJB3#6{Ux6>gwsr9@}Mvy>$HxQgbMLzTH61?GF8VDk~ZAX!qJ> znuZxDts#W9kR9iZV0L4Ekg{NMJU9<3XIIVef?;gSFIm%`Z$mZ+gK}!1q(FRexlp?D z_J*IyG$wrdmJAmOl5V|$jRZ||h}?nB66iBc!Oq0Y+Yv?GRjkuZZV zoyG3zj~hckhV0ZItb^3*U6YM#b*n{Q;gJx9IuEJji+$$BHRQWI3DN5GSNkYv&Ls?1 zN>B&F&*F_m-|FJAYiq_RJB$M)L2tE&+PHkmdpbW~WBQFD+-OU&wtgjc-{XaE@Z0F? zFg;MfGLIA5+&wnt8k>gt|D}ewoxrGukuTIbJ@=0KtA+A%AaG@}s7v^d?yy;`VSfCi zzC7s6d0XpyexG(U%MJovPXWN+nAggs_XMPcJDB+ty_hm1^<)<1ewCha^`lg4mb2@h zPp9!=>ThIH5C!}>oVlloI_h6_@3^d#z#MTpuj+RXPrEydhK0!*b)te}dad%^M)PzzF+=#8T^ zNC+WUWFErLQ}eqs$yK`&H6G>1ErjZdi|#vDoD(l$5P3B^bopD7!yR04%kWh&?2}cn zrJQ|M(f&SljI48`yWo`pcM}+hN%ci2N^N|u&Q-2J9ii8s5GYV-^b8PK*i*qr;|f{j zTZ2hv=vxWf49?Z~>fFXuqJ*Mz)o{|v%IvI`*Pei2i&ej^9=W&)k+;);ylG}l1#Nqx zYpSl1uPtG zpU0y0dbg0ZU(@3C>xbKrW1MoQx_AQ%7&pU~rbH!Ie?tye8b1vNlaYm=0GSEeW4hU# zHdLeSm`dON#~}Ng!;k;X{^{Xj)m^o)k@opUzx^9Mv>33C<3F6 zISewT{-NgYvSaSe6rma0`IlSgNJ-9}1{qNx4+Z?*_m1@Jy{ zed!SO|FJelKGU|U{`Se-;<@v+cV;ylPl5x|WjdpZ?v4D4z5Np!4^%jJSFE(pIIpQB zzs|e+>ns4`*H0f&+v`@#K^>t^_ypuL|J5&ED`aAQwe?&OkB%Tchr9yjqgI~f9eP1c zIkSbG%O$Qk7ftAsf`Nz+RQyNinsjItxVFYJ_`WkI@N=1+Ix&F12imhnjzGXitm-j= zwmc{&3&4bm#y_W6WW(X>bN#Ox=DwQJ=7Ub-tx^K?c@nGRc= zGEa*^rV(83y(hpb%mI7);eBa*x=n>qcBKqOD}8`SsRdUntO4l5KXak3$!Xl3-Rm3V zgXi2%XUY@R58W*rcswcMGWv&fbjyzhSV}2W|;Mg8L zG`zUw{oGqkgYSFR75P0yBznPe%8+t^+~pqJBdsdjtodw1t5`7#-W_}t&2r<8m@JgxJ;{hGuIz5&J4^hdG&>G3~d zH>udoIo4WjOnr2?H2QXYj|IXIs3pr-45XH*KLfs8_&}vkW({f^DEZ&-P3Vs7AMrG5 zO8kwyltG}Ne{wsI!#S=x|6ECUJ%-%wNNN&I9i_$~W4J|dG)qssmjlVR$f2LZ{1mk6 zog84*v5TKjCo4+eHp6xB3NN#$B5n(g|6r7G#BXqmp-%ygbh~AEAgAn52!O(LkYKq&4Mj39UK#C@l6cQqtFo|i3A>(kkm z?C8(>65s+Bz-Pf5WXdmkl;}fx2{es7Jc~>0=Tw5{IoY5lHna*_sH9;_sDR~-*^^v1 zt~)vM&;4nk+3S!M_FsNT{g$uXfAlNicTP!2S;jo5yIb`#GGB)S1m2H@&k+;IIRoAL z7^^oJ;$L_g3ro6Q*ZPS@N?*%Nip8-E{@I91CQ6dZRf%1zX{4(GN*iG zYH^QZB~VQm2>+vMGRqEqJ>w-+ny&6E0< z|J?x&K@L#g@%C>HP#~;($JcgargW5JdB*XRt)AM3IHa7+e=g3mGq&1NPOK%7=!li7 zuof_roquL-4T0@h5dP(Qaf+D-j941&{~7Zn0lh~D3`powcj~Ji?v4*(u8knQsd!Rb z`4#u}NhnBiKd6p;BD9Q$NO#{s+W+4WaF0 zn`6{yd#1cLbTHT{z zfOJy%-~Os8653?x$~9H0`;U>sT2=Y_X>Z5-e1<`JWunghN^5%gxUR;$CbO^Sl^j?E z<=%)Q-24hp*OwyK3gB)=YC;<-Ri0)%yIc8sF=vRw1a4EJd0z)}IM??7luvB0)gJ#ur!O-&1mr3|xv6 z5DM=2zT0@nw)f$2dY%q-BX@mii=wuO;~<*8w(Hn`B|Z(HjPMpP$f z3=c$XJ{c{CzreMx)+GdaF1mLi&@da-4k;)^g9FL2&=4LD`HtIXZbYcf5p8k{zKQC}aYSZQw5 zny#B>YY`eAj-xb?_Uzr;(dqX6bJ7(I3Ld+7VTT|zcfz{($g}lnP$}6swBVSMs-E~b zeB1&mm>WUCT|2`Y=LMH8 z;nrNi@#4f9Hvg5H*>e24)Tid=mpS83n@dhLr&|>`G2n+m77byFi=-^?cbe?cm6byf zg zDG*NZnb9=2U>CmH>H?V^o7!&#yJGm<>=vl$lyJG(lA_@UcIgdVWyr;D_^gy;SIeEj z%|fGZhSn(Nr(6`w{~+f2uM?cXT@$lr8%_S{(|hzx$n&E{!?STtn1hZ372PMp zUtF!|#F26S>o}wNS#aM1Z~e9P1%fvryQI1!Q@_TaqP>}3EIe0Zr0tWfcR>&uw*e&* zzm?rR8~|*=lw9KiudsRQN{0Tk7Y>HO4z-*sJ+?#r$S$6 z=YcT3^E$nAo*o|O;^jT1U|7G($fvv!-pb$r`PuNzmGC>g#STU2U54I$({iF~8!HXU zIn6_+5dk5&{GNPaghny81`?l=uN-jo05l4Uq^F^wXS2kXx-keiba1@O2Tk3u(!uTW z7ix+J!cJaL!maokP8+_{f&bnMfr`TFf0*dZm{is51HSIe7fPc&r*g@W<}UHXec)J| zzw-NYQ>8a|#6J6~YAA(W@q0SuW9cgSAn_~X+VnZ+WO_{-6eai~w8jqxM#-%ssrR^GP z$Ru!GK-$uwR;5*Ya3|K=N-bC`xJ94_{8w04*^aoKG@#i4m4pfu&Wr*h3? zTRgb0ub&77X_VM^mzLwh6AO4A`7g-ng<7hb6~34^|S`kezeO-N{;&k>us z?TaNC3cRh89+s-zwbSR~75I|S)z(LasYMEQ<{C0!gSYHVqpn5K(c%5WbP5+|e+EoB z+~3iMrqe6JC}kQ4G}?ei&9GCZ6GzNXnHg%R&5IY`8{KNeP~_Eubh{}G;BE&daHYc# zxYVYo4nioCa*u%G;^L2W(_Q(=krnSiJyQ-I_d!w4} zam##>742VIT$GS)xZArX*R(H>)o3PO1*EQBc8*5y|20Fsf z>Mow1%dQ4|X$LtR(^69paXcRJnO}gRoQGaVtMGa1V(^c?SAUi?QGoVH^?{~-!FZL) zm2Niv{RC*k^3IPq+=$-_tv$i2muGLRZPdD8Gf7g7b0@HYG zO7Jm%?&7B?gG3+XcpZhrO&r;n{aIRM64gw6TV6EVNy>2jP>%~3hr^}0QBL>fCTXlm z>nCc!v{CQg(x}G-7FfkOPDr`)T+#@}-fGHJn+ze{bLjTUtvJIMws-kf=v%+-Onpua zF5q4e)z>aEE}oUvPZl0C*OF@oGra4fvyF+q$Lm;YJ>UE{U|$`Bx9m?8tc%XD((n!T z#dk@sk|<6}dj)-67g`u$bX>VFqAG#t)2}N_d#d8+sb8)PkF%6XmnP+iO{bV|@GTr4 zVFex_eq94CDY{cX+gE+*{bTG`msO9BT@t@5pxk5*U&s+l6=gh^H|puNqLJ1AXKr zX~yO}8EwfvUs_WNi8>nyI35$7qCuMIspR?(oYl z+Dv{@jwkIOFF>PtfbZY<6-X&h-aQ&xoVscPZQXs><@3o&`4F3!c4#1&)1j+e!!PB86_qMn`}0gBH@(`7%x>)$WD zZmYSkJu=q1K3!5%wUnJyfKZP%zRLClb}8Ss$Ti2VMyeJJb26@p_(?;#O1YY&Bw_u<|CB5p3Fy|dtQT0hl(eE!W zemx zEF!2Z@!VX;Ny9qWKX8l_6_U%v8L&VIRxT{)Bz?nvAsy?~jVC;Ou>d5Mh=}leCEuh4 z_6{XK3v-@~pvW?2qQq_PWEQ2Nhf4>D_1`YaxjRbiA+-ihS8gO{ABp%ef#7ApK+e^# zy*s?(DfNpEgTiLsKkcz{w1B@#|F086(PqdsyyT4M)8+wfhB?&@#+B$2 z%bMVI{-Jc$1euRNKSp6EQg3Co)#COn#}Ci0+P-^5zHU3inBS?+I^Uio^O@@+aVrBW8&T7p+Z9s2PZgGo%af@n4W z+{gZGzR~`P@MD~3KwBNM#b*wNxn1ayO;N7!mF)yjgxLjq#~uCovv`KN)$4QqDfj!Z zKyFzr5uZMY^^VRj_oWVuOF!ObYErb#xTl*ub(-wf<7wp;e zA2K6$^yAc#&W7YJWpOs*^j_6fj{rq@>}hXTn_)kH9tLnzQKrbAw0tR(vYX{kgVDDd zhKJ1`EAwz}h7i1J{l(c>Sp$=jl6qtxXHfd>5Nnrp{XD-#f9Bx4rypzVq8KG@mNR{% zLMIW8ij#Gc5^H%w0;0-hQqH(34y&^Uaqu_`hB-BYF{>{Vw?AccV0QHxdA4bpU{)xu zr2M2c?wxD=m3*_TCU6Fd)tFO2CZ};tXUjBb35W5F{%l?eysPT!>YB$t^zrc#=*5c* z%%9rx^R}X_0+lu78(+|Gq!`s*knU~zSxkjr6&lk6RrE<15bDM}^@%HcFEQ78=D+>< zD?5)}UxQ!Duc*KC2+T`1?f}Y)o6UIZyKm(u;xf82DE9ICriWM?f>sOsx8K^E;g`(B zr{Hzc9`9%6iHlZo1>(U;Sy_E@jTFQ{6a6SQkAq9*pj)pcz0m~)3(pF&mYf#QsFjBo zCJdTq!icx1;;fmaw0yiY^1TVW#Wk7L!E#FF4csd@@XqBqm+=~cl zecADm40fVJld|&*Ks7>QX8#{&ZypHs`u&05R5wyllCrkp+Noq;N+o-dCEJK3>sZ2! zW!$-C%T|f8MH^!5vM=LWLkQW|A%qzFU@X7qJ#riOe(Ur5{rmgPK8|u~ zN>A-1;I;w!@f{RiXYu*87(VY4+(LPj$A`r?jv+nLjo08p#MfgSng`_5>n zJ4ZgkmaG0-L+V*CHf(F!i-ISjMxe$XLAK&~o1gEg*|D7c8nW> z3<(*?DF;&>yjmB-Rjh#wMvXOzJOsh$y&4caAlgPUacA4m5!Ah9dJ*dpFMyxEeALT!g#F@Cl-}VdtM5!1HgP8!m-tD4B{y>s9%OoFc$lw? zt1qC#wcu~rsiGr(D+UA8W&jT2o4S5FpgntlQ3{_w&wyH~hxu&I zdu?dg67k2GLONYRAp9ydb@sdy&yCdI zam*6Av;d<0gU%wBptr)^0r3xDa%cqzD-{$KYvv+qLO9Y>$9fB#>L*v4Lr}L2ngWDM z^NV96sMjG3bs)4WRc5p2^XFR;(a{F#AJzP89Ri0AyYg<}>Adt*R2%cEIv4aaH^8XIL*Oc&XdEem!8)zxIRI zYND5ZVeINBb!T)cU?pH;yBI(b`~i+N{Ai!tyC)!1<5^diS^DinSV$^Nqe;NW2_%^= zkWM`Y<#%Qp+pfh9A9(9}$$OWzKXz-|ao0ZmMP-h3Iau%K@A4f+5xw2SR1(*`V0jZQ z3FrAX;dnxpAgz_j=cKtGDm$PdYT|Hj*;$_j+nUEyg8acwT_ zY5Gk@LN8C-G@x1r(~Y}11cMqM!BF<=(?&i4*QzXZGE0)Tl2eU_5eJ%Hbb>B9ynH{` zn`qTCR}aqvlzJrN(sxjWHVCWaj|<9iRo1R`%amoW+PJ+^tI$)PwhAHQ!7%5`K)!+l7}jFziWlIs(Ppc8EVYW7G#E%;456t? zf*oFha94l@ew&-Fu38GKb2y}}gmX9qR0AC}p0eC)Eo4)~u)s0?j*OJ+bjnmdYbeI- zoATss%R|uxQ&4X>;ZF?x5>9763LRzVt+KfBs$gmN;lt^A9FudNPE#PR^0o*eP{UTl zet4NXlP6o&@WyF?r0u!Nxb=TqCPn`yxgn2eHUh5I#MvkMASJo!FXN4Jd4Urdr;P7t z(Y$@s8)3*2iUJ_=Jlfxu`0OqVgZuDw`K(?NOtn7<$6occouT81D+}t$qV(gHoYe>s zUk?)t-Ol!&!`EuYcp1D@I*?;;oL!x^pl>MkixAy$;dUCgda967DR_NF5hYCr&<{Cp z)W@qx?ZcFORkk&sO%m)#$0Z6paIQ4c(|R+1kIAn#kEei$a{U@)mhxPBO+1LB+Kqk8 z!(b%Gc)2&t-Xq`DvaqUhU}&D4#iwohC#RbvEcuj^Pl{43cD~S_{|kJurh)i_0(a8x zw69bacHU6!wx%|I^@IW{p-+LvG`muiUDKWHb$)B1Y6Zc)b*5UXAo&|_UIx6MFYbCRTSiW{FjZ# zcy`c0cgRG>2|!uJVu2ZuxFt-qe!Ilz?i@H1ARCzld?A5%Wr zgetvM_6Pu+MbnZa0x5_qMN$jSdD;+h<w#GTD>dqqcnv#d z7*22a)J9jOQN`99WsvQ4$&Tl$$AlgE3&Yorc)DtCMmIISzoc)< z`r99Y;9j*+DP|e@(cOgzc@}h-g%~BgH4iA`TTO`gwx)qAK7w*``E@b>U1+a&Sc6aH zKMwgMXQOC)KhH>L5aIK^9$E`;s9npezP?xKMFJdC&|rEZC%KHcnK5_Kg?~}Vefo={ zajFbQG%k%;Btq`o2-*bAUj*d|lxrjVVdQVnYC?d7-s-jIH;TXTsc!qYi(F?7EpKYm zR6~{gVHlr^%ymz`pk%1n*7_KN3|Q}8v{0Tc(Awf5zSV8)=pa?Kg8Tv~IQS($taAY@ zU2I+Pw;wOFiz=00*wL0twUJ*(=v17lE}OHf%Bz9)Z?F)DjvLU8X7~BQLw@IF$-C*n z!*zfOCcMSUA%p#6zw}5irh>3tjnr-+PGNsoF1-xr!)O%O!)o^GoNY}lT-r|H0KR)p z0MtY}MH?_v%3Y0*A82A7DE-VSo4m2%2wzB`@~CXDPJI z`>e7}qJ|eWM=Y)@|B>ktV>9dAAp6YM#=&G1S)r&%0p@CORS|Lz^X1TIKq`A55IU)D z6?WOJH^3x3C6}0R%i;cK*6v~swEp!a18Iu&r}EoRx7-3<3G?%ee6-FPIp8UdyNVs~ zzv&UcXw%M?1*c`C=9yW>Jd+;sVbV)2IVG<9ju_BX-^v6j?>7#V95ads?4hB-rIBx^hZGfwX_YINj8s-F7Kh? zl;vKY+?v|T2vftTyUFB2;gs+zF_(W~G@_xBmV2IKsTAEZ(BXjn27}Q8ohHWB7=O3m zeU@R1VX}U!#A1ClOE*+z(bMr+jUKE3n2_(CffgR*2sk&$)wE>akH2K5s%@yWPG;sf zqT&zd{2Y+K=nZZ7>_vm`2ohPlu_&DciSgRDar>eOR$YE3rWYC?>+`m{F>PJ%*iH;# z7`otemrhRGZA=LfXyZ0N=EgTaZpzHE(8?4H2h}EaE34ngm2@nT``<7){i-2m1`o(x z!0Yn*UQ=j-`{wBE+jBjYw>I$rx4C}sen)wu1ahwg%EZ9QZk zClbNu`Y!Jnlr3&M?n>rX1AQXv2fD5w` zMf?Pzn_*Di}3U)a?vM-G8-gs6Tar z3DgKHPmF=9zlmqURKOd9<(@4b-$9)R@BKr|gNzR-(Ozdew_}p}mp#B?1NmE86;Vzl zhk{Sl^~s%ju;!(?`Q7-k{@7}V=ioO0bC>L{uE`Iyd^K;1H`Uy#WQzi>8jjeE5ML>3 z{$Iqf=xfmCBe4P$Z-@>$DLgl>8WDBd5XrN0r6BAKi-FU6=`3i5W&e`9(&!T4d($IW zzn9TDC1$@Fs@JZ1OJ*UeNyA{cQfIzLUT*Ws2x6d-A4BL*yMtsP_wbgU$wvN`Lh*E9 zUC!D|ag{QLx&@4QyzVXGPwN-rBCK~|mfDW^5#o#VAcf-xU`ua8vG8%=sIE5(SB>?& z2#?2p=ODV8naZwhKpcN=rk@rzn6v^CVE+Ypj`ubo47L<>GKCnBGtKcyMVL(ea(nH+ zj6i9+RB<}@x3AWDq?x`JD{A`X&90)nlO@3<;hBR6{ycGj`p-&pzg^URzbW!CD>yO%J*<7~qS-EBwc~*Q$#Wwv*oME2VrxbX@>MGi~SUR}Oxmju)E*`VJ&Gb0j z$}eGdX_)1@8OA$2k!kTv)<4V5nCK?+|aL zftZW$VhJ{}I!$Tqg%!W@L1K>1t%h~M_Bcs7X2AnSg1MFD^AIy>RjHAsuW{92=|3uT~w*1WLVUIWlP|&z^@$*X)Rq+FZ~3l`wyo zR%Q$F`ynN^PJk&j9d+sk19(Tfl(IC?fR32kpOHIme5-$KBDlWrK`qjgSC^DXjHMRh zIDY;A^J8hKG-TW_uqNw#h{=url4luKbt%?9MhuvlROWOqEsd{JPvv8@KqD=Cr@cD2 zhzU)o*Fqi$;%X8DhKNlHuWhlJGWU?QBeJlv)1|YqfypwCKc6fk3H6_=@v7vaI2DTH zj!Jb5g?df#|Htf$qt`DK(LUi;0aPKC}uLYhNu2>HYEZ zWU2ak0TQw$|0v2KNo+j!qFluzwN6Nh#{5&K>~sP@r!&KQMyEgZ^od$C?Sh_tg33sH zXyy$OzMs(7Wy~nkm)=raPcrFqxUJif$L3^dbDC9JmbLLvaQq)XA1xtY1GtFOogwX& z6iWZ=QFLOg3^PD>Y+G~BJ+;#}a~9TWF*Gs|HQr2!{nT>?o&WZM>Yrt)49lJFa5~~t zzCdMLb9zr5`RSP7YbUh|y5&lUR}d>@^1s~k6ll-a@2f#k5LgprcFo>z=M$^~vRC?_*zD$kScrCrJPgp-g~YufX)`a+o5iqGr0tbMBicva(eWYZFpq zZZz?vBd`8p#V|hSje^c8^=m)XEp8nGaXyAIzQ2AAL7z@EGOb-NdWg1X{$P zuX1K!)5X4Zb~EUtC)?c^VLDmouG1x3f#FIB3R~Bktckk$-%9LI135`$O4f z(E85!{>@=Zch3a9H?6udS6WF>sK&|MA3iVXJfRzu_x*b7x>IN^tjaCY1fIh`}x8Tkh%A#zHjCB11UC_Qvj$_B`*&_3bX>P&V-ogdV~Ko ziyv=IQHiKO6ZLG&)RW@4#Vu}e$(zhlORxPcRW2jdu4a4#NyksHhIDz9zVW~`Xls9( zHD$WUVqcBs^Pi6remM-_2-jXktIHH`_~2RD)7CS0?%(x5VGm$xooLRsi@leb{koKq zhHopUil$H~7T~nu;?F4GbT2n{58M-zk4gq!HdijFP--C;Q`M zH)mep(e4-3jpdQJsCtJJp$X4`j48D7R>E0XfJQs_bHyU54rw&cw_I0#K=$(7G=@QZ z7VT&AjG~8a_~6F0{QHw&qD#3AeXsJ0u+;WI`=P5i>2*)_XXbFH7;E?Cx5)4t4H*X4 zM--OwBy?|f(Q;RW7~`J2{>9J|Hck+2y^&Q9r6?nK8M-IdZRx)F0}sUNb4|ydh3=#` z(p`vTmvb})X%zb03Fz~T^V+@q}@nY6PtfgS6XYaM2Rx*4& z4pbZ4{LQHEDRJ_dyx_9`vT*%4^9dX(z9EvU`?(40BujTJ;(>c-E6y(ACKLpj+}swm zZX$LrR)_0AM-E2BQU~c-1nZT_BN&EVk$(QmrJn&yH+Ep6$bKtz+nqdXom{ zS#@?!rFJmafM$RlD}sz?MmF45FS~GELw}_N3(yE|hMs6s<_V1#90!?v1TkkI?epV4 z?YLq5NU&U$jWZW0zm?P;v{JoaA38ke81q1(yeEYn9CZKIL0h*AQUP(yIKF2H!}deQ z)C=R{1NaD`&OnzL4Y+)a&-AySS+*CK5)c37nt`X3e@6CN=nv;z{$=adao^%hRqLs{ zQeYX>_P45%gR^ZLVm;dJGCX9@(6bhiT~q-2L^0>|M(Td`~y zcD>bI;}M4Lz}sJ05k=suPWy#4pQX56UoW7~Br2AF`mnsFb3&a4&Uq~be&2nldFqbF zW?`1E8PJdX`sn=qv+Y5BcRUFbwbm)MXJTDuvvV|P8xM7_|L$8;VXf$!ayh1X=jb=e z?N@<;_@HI;Km*00pbs70w%SeKjJPV}(M5$ik0JssKnuJw%_E5Ahpvy@UEbr?ZlEr` zE>3KNL~9NS+9nc8o$zJ&S4Yi%UI3{#2f`uDn&OTk&&dgZw$q17`i$l$1fdp}0hdg4Vern9RIwB_V#XSK%n`)Wu0b;$YP=YbA7SU~2^VzTsbo{aZgsjjPGdwkc} zVv^xhT)+G2wZRNLwBeauF8K02d+l^OD%V_WPepo>2)9520DQPa~8Yj|3Zk z&>L*L7K4hCO%hkCUu5uDA$01~(}aVQ?z#=+`crCtWpq0TLVB?DiSCAlEd{+&W^q|C zFsG}vGDJiaal^T7uiSGuXc)qP0anq1F0`|m>!P<`TPVW^0Us|r|WaP*`w*8F^1t|1#otc<0&uBGy`fW?Eh93_OM4D;bAkE0MW z&##2`l|v}zThtWRS_=`7&b8&vBF+vDmBpnKVv;VL((CICc+kj3@0pGugiV2;KXZ0K zeY+O`h5FjwjVD0(xoLKIvHVouwF_cC>`Sdp!_AJoqw7lxM4y9`-Fz;_9I24;R=GyL zbX|EDQ<4m{OH_}gMQaCIKE@^uxXxTg*bQ{qFO}={-TwvnqXL0H&z2($DRH;@tAm}9 zPlct=iHP=r*25yTw#kZ~Je+^$)EH!%R=xKYos>!f)tY5POz-S0@bh#7C)o2XhQCyW z6C3ml+R4G-1kzKxRI^WGbHX>VqEu|3)}x<$O(wM6n2DuP?Av%zk{Op(?mY(q4SM_ivHe{tu=clNg26ohAuJ`_OHj}!~ zZeO8GfxGB%~5h}Aikw= zXe+h-^6b7H0+&HU{p~dE(UGHLN3@pwYeWs}swaLmcjg#`G+$kx z%?E9n{xL4$q2FD`Vv*TAm#g@K-x!q~HKYq=zKz4gFtMhP!o0hOePfUf-_JJXZqUc{ z$76TAGc3ywa#%f$2iQqX08HskAM057HYq3ixmxjKuQEQFgMfZ!$c7@L>feoke-?&oqv_Nha-G z_^o54_(EBVHB&#xmFJTa&~T}*ch-Vig)BPTYWID280{`NgU!)v0pY=6+ydEG6;p3` zqq-(Q2!gx_W&xn&eUpVeiydslV@ia7=|}vZBL6~g=5w}U#jD|p*2LRfrE2gO$oP+i zrP@Z60inDFH8^xvn<*Ns?nqZ@S8tuW83;!)h5zrh{1M2)RMvbsO=)2sY+rRJ%^9j) z(&W&)giH!F1@BQYEOp|3_+fekjufb#cYFWO+I$umO2R+V^vx=HBKO zvs%P*CO6QYUc^@SU-u_yXvM; z5a57*RiAy;`sY9gKUB*eF#5*+6veCY>;9wHW!DS$I$n*~nJ()pUHo8hE$7sZjPpNcoctjG>d0og@xYLBoTezK}<2Jh)*aC0ww{F^VdUPJV9 zynmCNhXrD=KPWU*l~{RU1bVQur;M39Uvfu3j6Z-09vyNdU?bj=C<58Q&z&l zZ4o&gV%eD8=W6DDLaQTBW;(vv-~MZ-y}0`w{$HN^|GDJ>Wq%J>+_BHsi_cQE;S;&1 zY>KtUR!Asm&>z`cAzTU4yBYq}`2geT$E2DXWfPKZq$=kaI5 zj$8=k^7I@b<=v||`WL10K8nU|;K%LPzTI~+)$hB)@~ln2*7l&ShHS3Pw`rKJSd=8B z)MzP`c6d6qIeyCI&_}8@qQ+u zATf=L8p_|X+Z@NMezi`JR_3=rE6Um{=DRAA>W_{v3644%R-gSyj(For?9Z*uEdDwk zxdj%>)K-IsoQ>_n*At}jntiARMHP3}lwspE!bWf+%j)xI@9b3%Zr3EK7<3OT-9pEcV9PIo5rz(Yv$bH%UOcd4CWsXOd z+XE8IK@*1r4GGQ-_4F5#bqt>qthgDvC%^@t&bM{`YCNTgi&2UE4L!m`uWRbH_Nvr= zGxlKUZzD2!#UbHSv%pP!4%|dm*8#5)8$N$=?_X(|fIss-1dN2*Ly5QT&ERK2=daG- zwJ_yv5k}$MFB-T$9hIsOr|Wlh@62*&usH*nsIn~jPVLlf=_?3_&6TYfYUeVy7gr_#@RY0aoe zW+_1O2-6$=8Kth;?9fy-w7C#HPA}8k%+=Y;CcV+PUttWA_BKe+(sWJ*!&o!-J6!&S z1$zkAS~bIy|2yScgSO2`lUJ!4#O--yOT0)^Iq%yJdXbErocXYCnwmJRCnnK0$1aH( zKF9TH1d8@?D?>>$6&?G2<#-Q<1BkqIgab{xElyxVOeAQ&r~SASW1iJ3|LL)}KFc;? z`1L>{doQz#&21?yIw&in7Y<#mifOB`rJO#a(0QThxQPq)vve_bl*^{^-BoDcFrQO}p53;VXamV0lpPRBH+%~$1m4On-?5$GNqS&~YB?8Imm zoG67v@f#j5l*X`ADlCfKg{-ESA$aORZWk(wr&6o#-;VVbS)Ki@khiqlLAJHWd8|9b zp^q0!H|7Hw>pvi@7>4-LI5X(U!fjATvWyfq%&jpNNeGN)wM{PVgWm-y0%_T!jmF1S z4*xVI^BdX#OeR_mZrq{;&73jyM@+;xAw`Fu7pQ~8AvkHt0tO0Oo?*Bh;hopO zS#s7#x~ru=xLxI(YItW6-&On`xH>P702Ko7%jZfV7>SPG?0;B4d|bP|YBUV~x} z*VO2gKL~%1I0W)e4msQwljvSpb?NPhm9k?T`eOD|d)a#q*vq`Yet!x(t*5?~=9QF{ z_N-H*u|VE3dgfpgvS_}Y^bezg2Ggel!QDy^yD6$TS_G%a-W%|2eR*ErB0VdbMLBocP;@R+siB*Vq4=$e)95{_;v&FR)7kLg44HqZ|UyOP5Xsob=K z&;?6MDGmV_%(C+wS6fqV`f5-RjAj6_ad)|yh3Q^E`*!`~zit@#q5M;j#8G1}QSAOn zVWXE}?%~|gBO}N4F)tKYg?_nYOC zTx^8QG&hT7gN@d^C}6E$R^w?CzJOWOjI@w4Nt=_=~=XXfr^XF--^E5{!$ z9|Prt(WUn z5)-T8uVEc^jHkHDx}Y@-zSzEF=CH~?a2X@=P+-=^TVF0D9egTV?U*rtk?F)2^-_LbRG{}H0kBUoyexLuGNxj~n zRoK^PM^A$Tt%s~k=JsS4OORvyK8K!(PbJ+U2y)D~XOxd#*J0Zw)H14fcR_Lpk{^Gq zezIpIzXu@KI!7G#Xa5{z=)J!Sj)A|=n57VMz4mPt(;K6zlNib!F#<+Py_)))WJhOk zF|8IFCj&N~jrv~8M0~MK?0I&K^SC}R-z!_;m&Dc1pGTZ_(AZ)Y z^>2IrSvuL@-%3Xz&R>eX-p=amsnQJB04NI1ZgJ58u%>`)8$*KDZh|H<%?R_Xt-0;9=rPF0bQfPz_?m|A7K&- zzoz8kLf-wtlHGwGdOQ_PvE?V}xtO9phSp6yYjk`koeL!j0GyO0wXpPHWNZ5Rj38vV z$@s=hX-`F6*icNvH7{yYflh312cJ?|LYx#wF% z65KPCu|edY;gU4~)Y)i|d6j2C+Q-(j<4TGqJ3xINzb1CVr(;K4fs-E!*Zy5)Dk zpD9J>`%vHyCP-RVsq;sCurQ^8{DxdNbFG@!FhfqKtFeCVpEbxR>h;bT2$3Ku`uirAS@L=*h{8s!AlXmYhQmIgZ`hEM^4?IdItA-N46V~uV#&% zAm<`wjGW()$AF>t(s#CXu(;S5vFM~*>3Qc%D?T0mm;zhmDZh<4B98D7uY_HdvsK|!RmXlj6a_lb8X0JJ;F17_sdBRM zC?gQhjF(gn-b5j3M+?MEsgJhb{MkXo=p3r=0iBRp&-&0bDLsaEU-DT~N}P`JF+fXP zgLL}MtZE8i-sCoI@%v2=@$)xQ*>7__6Ue9w4Y8#wB6SGNyz>E(*KcS;lWJ|h$?17> zO$QKYx6nZ9L640oVf zTca`WDsU1H4^2dnao>Cgs#)10=iw+2h_!uDs(Xu{lLbC8fToS?0J0GhsQyR+M2nHM zZA>@GF2?`qFQHi=XXW>o%oP0NT~zx*4*3RPvf9pAs0c>$-B!MUtu89Ux$;KZrmcg) zCE#L7flT*q*GHsjE4^8nzUcX<^(0jPMXds$O+ZFJKdNNstTRf(ZGQ#;;sey$W|U6x zx4mh`C6b<*wS`}@43l`8`FEHOXNfmZ9}K(aWsQJDQM5W#4Z#{(&xxaR`Nafqm51*m z2V8Kkp8C&J-^9`nylZOB-+83}z;-4Dw20Q?-c4FzuOGH+&oRTnB#RIqF^vOan}w@| z=fnN)@o+&*A;iGco%(7~o))q#wtHFjn75YL%0ZyzD6pvba=Xsm32A6te}FijKw1-v zl{4xcIhMqiZ~lgbg;wCbA)`;CKJeH#beh%vUjaZW668pbdR`% zNuf|89t!Y3FRF=3t#b!PM7 zdaw>1h?S^Az|;u=)J+(Lxm^SwQZRk@_9KH~pQ#9W5btA8jBQ@+{DBjO%b zfP|=O7$+S5psq6OmRwKiS0cctE2eEH?@h*&2Nm1>DQ^ut(}P%g3{A!CT9r((vr=YS znrsL>FAktrzxz}h^sW88iMt*(bmFh>AD|S)_gj=S&~VBUtHN*nxM4B?g#~G+{QU{! z3u{*@U%Y8o;;E)LP-HdtrAlVCuyQaPHaXyWI2Z0+MI&IsT zCx%y$&9w90(kwXF30gLDM|&izP*!nzO+;b-@#qfSbwO<`Jw!QOZl2to+4hTt>p}}> zjN8%NADFG}(>{5TG3#VJ*-wC5>n%E7YBZsTjweFRN={W z3tKRNIL4KtWc$~vzol0+pxjetTVHg2A(^)oCd5J+wms*uNlWBxYKc7gnWbt=;Os+*G}o z7NDf`!Q8;P7YF&N*H5Mm--4=P4NlSPo-DPl@1A+6y&FHb99Apz>^YGzS6)Z*YW0*` zg5Za>v^po?IzSL&a4BwXbJEVuQe}^096)py{9WP~VytO`b zY_h*-J~yLeRg;|Y+wqE@Xuy$4;k7R8qu4sTf-)6SlSZjttbipyt|g%}VKtdRb~f@- z>lJU3kqU!9fG@wXcE;7GB2mzrpzB`}1Upbmm_kYzyCY+oxZ&2Abi)GXrBcU>9$#V) z-kIMg_T421h?c?N;u{5g2+otgc&63q4&uRSRaL`-y2E>q8BeZp3C0Fo7faFiC{YiT-rHvUF0@m9_rnIoZ$UTgNp4h^Gn zJ6&-3ZbRO9(-BhVz}B@3Pbz!=2;|L$Wl^H4w_t_-u;L{5;>O0$(~NN?9l5oI&6#|6 z242zL+3b0Uhppq$pGw@!m&@GSb!n=4DijDs>-z7h{(Xl`L?F`i$GBi?$dmj2r+}Zq zDlN$>Xk2%spsq5*b*b8o_h|~iz5zJpna(jB{?Y5G;Bx?fp8+)TUN=%yyUeQ1YR=aY zPp{mu%O~O{M{K9&KE?abT+7KaRXy8Zd`FFpmxG@V_bwYpXU^o5)Kr`oiaGF5VOWc% z!XXTAcvAMEMYpN_iBP&Hm|<~|+*JmwkS>%uE!D3Q!aMaP2PL?jx4_M9=#Ry_hs@37E`El`I9!t~+Wu zSz%=Te=M$yd%#N(v66$%a2?QFuL>hB9@mzojf&l6Zc{V>u{CAZC(A8ln{~a^bI7v% zvSN>Ei@oY`)aXiRs!(%a2+T6|oX3=id#Z4gKW4q56`_{K}m`0?k zmM7!i#`B%aST(_A*thCoNC0L zjFKU-)Bq0Xc?f*^Q{G~KWhGv2eHxt1nEHFveEpR*Dhm(x(WV;j7&i$!DW!bp$Hf9+ zX70zF;tTWn+UhE68Ur7Bk!to;czLW&&1?{RkHsS1(2zxfvajF z8E4&I7T4ZGam+L#{#XY-hHB>B0Y0w>Vy7m{SDmo|C!tI|MBxRcFW)r0iiKFEFB+y^ z_OP3Krm1*$EMtXLcj}f;_{4_4i&-6+MM~u6nVCMDM>sd^R=`xur^mumRf`vwMDZOc zJNIRdjc{%Mu~i2s!L)rj$RF$iAtYqj>K29e3J0AnwXMW8P6i7F%rkvJB4q`WVD80X zZKdn%ZnAIuppXh3eKrGxR9( zHJRv8%AW`_$a$H&Pwp9@cbAOtpuQtKB;<vj^oE%XBdJ^J~Li>yFC-95IdV z|0PM-J^qu?557M;lwy^ilK$~}QLQRMQT4`Zi`s^p3844~RNkC*0t6!(g+f;-)XxLusxjmC7^@##=ECy#ZA)SI8-sj0<~>(__sy z7n|sO2^-5c`O*&YVfWnyW-rQ;TILD&)P&?<%D**E&P`rlbau!TXlJtJc`DvWg0yr7 zF)SOOCs)L0lU^!q^>0C=?mYnEKMGwE6domD>{Mtwc76gZi~4WN&%{eqV?!=C6KZR6 zefxUa8!YyaGrRV*5CjEb`iIy!4#8IXXN4tQMpnnAQTJgoE!|6 zKiA}rZb4V_Ce5@l?8j+g$)yo1Z4(6&nlfVPhDq!;SF@%9L$7C^|2>CgI6FH~qp3A= zH8G-7Ea>UP94bk$Dn7Tk^nQSUrP;8qK9+v-YYut_D~FTum>qL{8~dNs6q*IfNcl7~ zQ(z$=y-BVD34*nsrGV5 z!)qH2;@S}M(*%YhIND9LI}k0FQecN*Bx`JwOd3efZ7el!>A8d`zsUEN^^cP#x@Bd~ zXjQ3Z@^B4cX6H``Ee4T33$=xfy|dO>H#O)_=Y=JWdaai0E%&A47>AN8af>IghsWOj zJMbzihs-HL>kMUtAGjy28q>Q{KTvEq_USYG+)$h$3$hV|+vd zP$8_W;$D?*$B^Fd0E&yQ5~9})+FYo~^Lbd~GogDbt%!i3xhCp=wc}naI3@0;An$o5 zAsFq=Emahtb}}u6v~NI?wUiVJrfLi+e_&#Zbx9pRahz{5HnR0Ersb1zu)^TtG-)HN z`nU$9s*O<3oUEv=gXoZ0^5(%=_{Oq{ILhV1+Nw~0*#Cj)>d`}iVflS>ST4D%{QRzz{yZZY*=&hLpu z;_m{HC^^x1$oP=%P;v#2gjk$avIGC)#z?b&xU-F0ymSd zj>}D67Yj7!;a)Dfouvhd(;xp!l_p#_8IhWZhssZX-26v*>W2FjM)p@0sJJ0xIvU~) zw?djQekehIGUNT87T!vL&nT>W*Svk@$VVVTgcDB)j~g%HE)S5Ci95ZO+W?dYaT#Ie zjXn$==xY~Z4EL<%OiSzOo*Of9>#r&--Ux?zlBillt2_(a3$0Z;;^f|F8EP3Y7rkog zTn?LIk`rg!SRs_?Pie$A|2JDg&@bCxNr?LN8^ycxE25W&mKM)2RUix{_-tpr;V$B- zF{Yzg8fLeK`=A02!s44A!_G>evQ0$xLp-s*E*4{y?a9DkqexXrW#S6r?`#>VxlYHw zkOoE47tS@WhK&ITJCl_Rm!#4|G>@6MIHXkZT)RnxpPbZ4QyStDk7aI3TvJto$Y=|9 zY+_&>p+L)nnVW5FOk*t4+TbykCEF@MsRPuT?Z*)p44|0615j92x*&IIr-dY3hgP*S z+6yl#%QKc{430e!+4#hG72*Ub3q4G<;!@e7iv;)R_=;lJzv?_A*H>yDhA1*i44$BJ z!Y-!x%iQgo>^1M^B0nv}`~e`^SR_bv{=ExJukja&+!4brtjyKRk!wvoXKtocfvLRm z%3>K`9CEgRak6f;OHf>fsTGyG+|}JGZYgKrVWrW*PHMBwEV2CfS!YS*n5bE`cXWuh z+{2COj{f~#GpQBk8vjWpqLH)+S{e8`wjW|fuQyHQu!x5Otaf<6nh;{_ua=`Mpqz}o z7%E7ph$?`leFDimmL#w5o$szjiW{nX`*JSdgX`l=OvKXK{qI%DC#=?^mai%gWkJ9F zvSRPX+(;|lbz|WMD3r_Bm&uE;QBD?^49KwdnCZ=9?iD$S4ET?Bh)3Cc{ zRx|DvW@+5exr4oDNGDgcP50HT#V0hr9#6!rxGZD5><3qca&muPVA^p}AQ`fQK!MS- z6hYZ8s*XLza+0j3j_rX4D@PF3gDII`^DIb(8K}Mqe)*@+lES0@)b_)4bC0?~=Rep- z?XgbcF5g`I%#zyXXaFlzeHb6-tf^_6oZeH@xsYh1vEEv06Gw1h=AN40Q0sV7Q|UMn zJ*w9s8<#6?+&i&)%k~W>{Si>Kx0c6nL@Pg-{eRn$^!r23@#_T2QssL6!Jsz^9o+O7 zA(vL#ffeO=)YPnw4$1NB%Au{ESau~4LYJ0mT`{4pbE)ajnXuK+4$R1BS3y#zSV(=1@>pHESar3) z6n9A4rqq(<<4CxHq*ot8yXQ*Si}mWvS2OM!IL6Y|-r33Ys|WwH+sDw_+3&3>(ly{s zE)QBQzRq0~6f6CpCgj{&>Q~|tQDclv**|V>--VMbEy6*U-prse9`e27d7;QY-j{H| zSHoz(JMl%d8|p1hSQA<_O?65u!=ZU(r%6AV3C z5=;ID6PS*~LZ4-<_Il>|GkChqwd;I$NEoksJzwz~9hkp+dsr z#TQ}^jg>aRsK!d5O08*Iz=YNRPWasuo>f+4>@ChkS0(3cU_5|IJ8&q(wejI~&-5v=mlj%*HRIp{6PL(dH79V!3Xq1?P~Y9aPIesnO(1 zfYiA$ZN;+R!<%=E2+PeC`+F~6_=OpN34iJ=Q8-`ngWm@Apg`-M--4qn#6r(T;bxiz@ZjDk zs9uCf$$!d^QG3ko&hvFA=!=QInv<1-I0-@Fpc2`kZLK31glmV%EX}fV>S8_5%(=~F zFQRYa#;V@&6R9X!Wx4vwF%4d^7rfPPEp!4?12jaEN(8w$suLsfLmZH}g7%diuZ(d zcl*LQ@x7usV#Rl-$EWwlt=xrm0vgrX`+%N=4nEvjkRt|oz)bBr#MSojXXus#KQb4P z&oAd;yPdfJDT0|7aWOQw`H_eCFv!S+EtDns1j-HE_3e1^cCFx@;KlX8qdgPdtuJ{5 zgCd7OgxTN<3&yODEjlHsh*-vrKC4z*bl~V2)t9Rm&%Axa;mUt>oYP@FQOrq^9U>^q zW4}1jHaTFHh{;#Gt~PaW(baY;301Ogg{2cilDpO&Ip)V#@3lH?Q1Q2!!W~dZ8hYMe zN#S7ABOQ4ocjXJolbE3%68dj2mj)jID#^us8d%!-@5o@tG@(5GL0{i%6}ra957jgV z`%WmnNfMB8Pq0c*29jq*4p~0ugo(@|67rA6Es1vIX6YMqqawLcNn;AG>2xgZsp`!g zOW;5IK~WOEizAk1U-H;jXPiHmk%BCWf2^kCnl+PYT;bBn=fqAQhcul<9)I!JMW8th zNMBrbEEUqr5F;+pT^s`Yx3#DIn=%aO2+=PsB8|he1-%g!TkBQKeYBz0*RV?;x~;$i z{WdXquxR?*L4bx)g#?@9mSh@|RjHL}l#^tpCnq%Bt*i;d(<{17AW78)peTjtZ31Wn zMxGD3yuyoIHVl_$jl1oj(iB_!CJCoSvJp{RH^W`1Ruvf!96A5K&(l^zw=>(*Xt`@b zV)+w^K;0uoeD78%w3L#v@tBk#z%`irEFL?*IhZq#CvJY5%GmsHBmamlEV$!2OqahV zvju@Pki7Jmr)N|v&U6@QRsHlzOvb+v26QAqwVK|(*^wTNEPD!=%r|nV+5!#wXnRjc zy=Tcr%~ma~MloiLo(m*5d(c~>5>Xn@j{8ar*M=!48F}Zc?ormNi)BnrMzH1;E=%X~ z#)*qDH^PdgPY~c_cUf2iUHt`LXmNv8O6H9zGB?7to4qF3VB@2TnYMFYsu3eQ>BHy@ zaP|#AercsA$FVAfrXuvA`Z^ow?Nq4t+-yz1yF1^jWhoF_p$L<3Z;&n2od2BjR?s0X z&63wDD=kf+x-qBJuJ=K3vcN?He{uAGXfw{>xF>IsnO589{qox2*YT(A=@}*MpBGGt z`eoAly8?!mQIdyjA^neTWQ-v4Rz7{LdXzWBDXln_wNw>tTzZK85FUURkFvM}Lz)M(E{ z*gB)xME9tc9FnJF6aEMhl`N1J)2n=Xqy9`PLrvRra@0W~&%hF%M2jo!*b9?m=ys{W zwY_kxX}CJlgI%BaI*%D{u!w!o;o>^-lpH~SLQ~~n>Br`6+^U~9g%yq|F>{Bc){**) z>0?RJ*^sWT7(HmcE!g*u-cQXUEr2#-!xgD_KU>qJpO;A-y6-%7UM9PR@k>+MEet`+ zT?D1u@p$IzdUVBrmxo2?P0!o+v^(ndsxUWd#9_3~&H55;s5uZ#tM>7Q32G*)cgCM*ZYBp`=DeqI_y|afBRn$pgZFzs`=o-r~G~Gq=tk>&S9Rok(QbH>7dWOtFzF1tE z^yWO?Q>r5mb>cP2mWd#8N4$8||-fU`(1Dv1Lx2Hn+8kwuCK^ z>4?N!=ktr7$j}1YX?u{#cW#O(EF9``5CCyoXYv3_@qcFd2L-Tb}pkOq&9}{L}IS3?edKOFGut)5wNd=K4J8 zJ||LRE^4wtZf&H;7mCU9#|!;6zMeH?KI2bNKW zm-3?2j7+Vg?kejA)l@ZIbehmzQW~!ItU$sIdKlT=O;nb1;(Ges!mHl)RlTo@8yjkJ zj$6M1o0K5MmCovPZZ1{Ts;I^~JE_>lDwnggpye`lYW6~HrGd0uBY;0R2)1F ztJ2ZDkgaLc)H5f7U3Hc*!s}w+;`1l$Rhfgmj?H6)h8I1DJoECvSl|{=JsXE2AR;2( zaWRfDjzuqv&Vu(fC}&S>A+XY~^4xgr$f|n;>M9eA z-IZ<}wytHQyrFb-#9@Ws(yg>|10sLv$#j6g^C(DUt5|%`C*vXGvO$8e(~SKtq+#`? z=}9lQ3}zx$E;BU^mIAj5FcZtsUL+E_=r_9HIJvcJVKdzzp=a$qP!%K1n#hnBrhUX= z?e$l=RjHy1xs^8ea-aUCLfKmG#)4i`gWE7&%xZjQ-LPX|XFvN`%hxN`@tP;MdjTxB z(yA6`-mV4DyS3{X%-M^BGO9`>{LZM zBp@I)AiablM-dPyic$qc1f=&+Lr{7RND0075=sam5R%^;(0lQm`>pl;lcfZbckeyr znP+CtNEjVtpIRRQWyOahj%iN^_e*Ui+UOdp+5r0NbYlO)Df>mnGoO9t$7O07Mk*Yv z?@o)R$%ei&f2u*L2@3=+JrPxke@p=h-n658SQpS75sxi=f)78X5akBh4Q`>Xxub$p zg?3iiW+v#!_1IeyLLim=#9-g8B+C5m-7p&97JM!EGM6w;HE>lj!=-xC#7we};Z`|1Dh(*u_zYU+SK z8u2YrdGl8=PiluAQX1q8?*bXzZ5O!HqTn7cA`Q%YxeXoelfz}UO%DBZy4Y4I8;YA2 znaf&-PCeW!UbA+N|V-h4(p`tjOg)>bp@J*+zl}*fQT-eHSr1oxP zWT~fpnytt&PrwYUhLPGat4Pvnl!}&1AO5&tn_CTZ)lWmB)r6nM-CqEA)C0{iDRom;yRnoqYfIIyl*D@8 z1#0;ru_#msg_qjf%#Xhsm{E!VREh_x_H21%Vl}{va*|e2VXq`6n`_qk zHRLTWKFDZEycBc|-qVxj;{sLn9+>U#DG?{CCk`_E5G>&SrPlUo&^2Wx5x#9v0GX1f zg7L57d%SYbMRq~ARo>eNX`+#Q;%qy_vFW`8&prF&A1>|PwfK$wDZ(eMTRk{`lJs2l zfLHNz6JAZR2!n%DA+RKwDDFk@`v#x=dT#O8Z9UBqds%PYDk_%Y za1MA0TH2ZtUuW@9m{lo{dFqQMqKrQq6imI;L!z;+?hZv zd!SYOIN%fa7ApM&AcxquzsIs1IA!`v&o_Y1TpUfO1G|FJ zH@$}G`?|%uhlb1?HIem6n-Cp-( zMyjtr|MK8LZDG#s3o_mPX{c)_bXlXe#p>XT0Ya*;fa2&IUemA!Z0A48Z@-fO3>Zq{ z%(9{wykGH5-gT;Md=^2ucVnX1Y70oz1_8}8eqFq_t`pp^GPcZCBx(Q`*p%E}VZ{1D z!yi%MfIiAo^l@zlx9kYir>hjx!19_y&-d`e&L3pSc$Z>xFK~9?hmUOgh zSnJA(QD#ydh-eH{H;42z*YHWYfaQ1UFHcDS{hqHp$|WD7$2z$npL{m1Cs9)7`~+Rk zT1(MCYeYU5(iD_1#>+h_JeX>&_M)lUSnBKz#(Cgcz?Eu?5;ZLY`wre?&%qy}dh{89 zA~T6QQ}N@;S~q%%v%RW5G>GJ>FukF40=W+KEC6nfJg4MBI%23q_%teQnyvd)&Syy5fmS&V)0gIX7X`N9^&j6Q2a zCYxwzPfi#ay5x<^(h78f?BoCcY<@=)fIDS2UWy4GbX$nMczSiN7AK7A>QEI1Yr?vK z`pQgDiQEtZYNT1@N%?Kv*HjhTo;9YNBNs3O<*vY72<)XR+lKU4BM`uKx2V5?`m_FP zwZ|GLg=+D<&#jGbdg1NcUnf?HoqeW4aRS71r}!2Yo@ItDyG%YY#SM?JlSq>?HMv?K zTESVZfJ=|cRFyAQ749MrHP8AkJsD^(7Q)$_FEsKctoN*jtRx;qlG{pJl!0cKzeMTR zvYf-KGfu_^ryt}gjc?IR4@~IIaZz6qA~3=k=u3Gt^?E7PqIrh z0mEHcLpeblM~)oHAcyL_!Y!f$NF>s8@-9ArUB>kl;5vl2n3|m+rO%UGLftXI5aQx? zZ?utH+u{(bF!;DV0;lc1vs_|;l>$b01x|`BmCdYKFD-aAp%`G|JDFUsZok_fom@?crJaI&g@<{ zDhknvZ?FI+zb78m`HAIP#`2|F+|@%f$&7AW4@Juo@$$u&DA}iMW;|AtPo3`T<%yO_ zU}pN(K-~Bgp>z8(hA5S=I`dcuUzS4B8}uJvTb&?bDNRFu+}kumGIQ7cD|@R9bbeiX zPd=)8V5|Muu5@_1#Ufv{wYcy?fu1)GE#P{1Xy!JQ(!5SxXR!l99r>o3w7XN2NNh@c zr33L61E!a2W%j9(!(@0)lRG(gAGweD(f**!N5)j`V6+|A6kCN8c3L1LNB8NEI_FWl zDZ<|AE*J>mBji|x+e*UP(4|Y4_NI%EZq-Zt7_SMa`N*%Mk8PS|n(gZ8VIBddK?hI< z43B%Sz#zJX&)O7K8qQKbV+w>^ClG7gUYA}Zjd;)Un6_A`ddTjQ*>in2rz~1c2d9hZ z)*6J~`nRzW-4gci(xubYel#QRhZdQ_$sbT5H`8@FONjl~HElU0`ki|7uQ2d_>&J@( zZL!LiUoku%ca)6MIq9FYQP)cp4NAP_b0Hw!#%OppUWlK~X*B8k>N02iM}<$e|HyPI z1OO$@m^_AV=L6_P_w0VWU|pADWiYI~F8ev%`}OvoEdeg)w12BC1&nw6O3`WeunST@ zAHt#K1EroTz{Ib!Y6-IEe6SL}qF!@KoUtPBN~}Irk}5`b?f4x$&rOt>FGs>gqxodB_b!ieAXipUrCI56^bPWaQe7|`7cCGO7UFR@iX#9 zjLW%gzK(*h9Zfa`8nb1_?X`W1W^x}-o2}7FlsVOY0-TWbZKwY$UrZ67YZb012CW5& zC8jJWi)eEs?D)n2d*zf^S-34oty8n&MKC^__{}d&OYeuh%|>jVRnWM|H=)!X56{8d zF6|UIVp|E-+Gi zQ1aKMbAMNdu=bVML)>R#EcE$tsb+(vH&$|tfSJLOzoT4a*#iK_;B`O;IhM=r)+*~f*OJ^*ySnh{$`rS^YHdr zieAZx5DMe2c3RTK=cd<+efz7#Dmh7lsjAUWOU?D?F(1yGP%LHcfC2vks6ddood#T> zH)S0hqW&_B@^RO6uhyFd@DT4wjjhX|1e5?2`T zIGjIn$Bk^~zWSZECRWTwA1CsClOIBO7??=|sdUfR!cTINC1uweFPSuivUBrXK)ET; z%Db8?1w)Q=?({Y2&xV@T*G}j9;4-rpTT$#f^i_*F*G#U+;5(D=88p>cw12WP zY6t3SPjUJZ*H+6=-Z>v-FN96XHZ(LCOx8I7!|&dUXDs8;5c?~SMx9V{+T3n^=V9t_ zrH7OIdJ}KWE`D@0BUndTT)g*Tc}V7AWJES*h%!8}rU67+3vXvfaiVr>qm<#0Fd zbxM?Wxpo}reZHpk;D^IbM}RyNhxbP3^VxVe_;$V7q~r`4H4-n^;4mDNKt3fyM}2E) zOzlnFw~t@%Km2f2uh&`+o|`oY-MOoxetR@3CUB>NLDasB{P!h{DRLt|C}^&1*gJQ4 zIMRUsO3Md9%!hCOOb;A*H@zW8UpV>rOZx*8A*pCiD>JXQ9lb8pPR0oZkxLjQ76g1?9Vbzmy3o9CENDlloxPj0%4p`t_pA<@Z37Yfe^J)x-V#&{r~7 zFOQXMQR_{x7Wi_Vf2CmIledKiV-t13U+$E+x{v#_nyri=9_z>IAO9kU&(SNq3*eK> zi@n)}^Nxgd^L)fE&&zXaUie|RpS``2tv)2eti{mg_m{L?@N60+=5xar1k>Ox*gbFs zQ2TUBc9$m8zjk2IQBN;Mm37(5!_4fm6pEUPUXXFczf_*5?oQCo-DcHh+u=ks`?~t< zH`x2cINg3jZ1pmW!Cr8qyqwyc!nB&mq(W!`tZN~CG=dC^na7)yWJ{4efn&3+ zI%B`g@v(4b$a-na-ngaa?C%}>wRe7otYZ&ca>z&eeGl$uw40wVA?tx%@o|67gnLlI zjXZ59F^+uO-1$2ho~nJN72&KGy>O&!p4yzhyGgtiJFtXC7r)JsM_rn>X@=#{ zDyv%z^}fPS=@pd#$y>DXxytdzs;a(C-N-zjxL$W+eMa=ed;2$#a~y^W!GR1*V16<^>nM=wE)#0S zYiJ~?DO*+`nnal41$nXrSKLC@V`R`uS+ zvX+l)le1KsL1VVay8`@0ZdvuGy{FppySLRBj~zdGvbissK(|zzXHs)Sukcw&{E5)w z60qP!*I?&jMm#Wi^*iy~Sar3+0G$8YwJ$#>*HqvLt1cdgK`T4ENCx>Wg&YVn;qmP( z#A)B{`LuOlFewk-2nHD`Fb`&8Wkr>83fwlXq5&kP>W&oyAThe&eOt9MDRbis=j);s zxh3ua367*v&MudmzBvws4~O-;u-EHqu9X_UB+2EOD#gg+EsL}G`0tN~l3`sQJ3A%) zNzp=GvLJL$L?EQJUpUdb$2|G%zqciTvMu8fj*8Gfw&fC|@5qAuO&n+ScASgTu=#lg zLD6NgCsFsaE|=rAOU|X9(zW(WN=h71#|5f_uRqC<9(Q6JEJ=Bm|%mLBhUdysvPYdSYZ}=cCR^Qi<=5ga=^8 zQVI)26Ve)-rW#N6m%G?_CHOMx+WL9S`|G+%FL0PgNlk{e7d7>_$elOYJKM&`exgyH zQ=?%e58aT2jwmumZF|57`qk4|5V};)e`35&MrvJ!d96jgrx}7M*P~l+6K*AiE(>j8 zlSVC`2r!{t&#VOn!PcAl#R&n)CCj~MFa5UQziqifC>^zY?5E^=KkWW|56kr&VSfL} z>ly7aOU|#UQ2B-LnGXzgv;^{>(gk+49yLpO0Z}k~^5imsP?(6+pEJ<7z6)W%YbsnA zfDb-nie}j^_aMQGqb67(UKE|14)Y}@TdFq<46cT-NldMfFe_#NSXztTRLMdJ+xX?f z3B3mPO@%1=xSxfN-SUk0jJc^>)A@7Rvm)ZMl^oX<@!dQ{_ZtzjTUgAE3eBWwq`O066WrtTEKB3z2N6|l)V0xlEK$gZiyu-%%=uN3)w4V-p#M{lD3~&CfmCYZ72>| z`K*X|kb=?~rpkbh?Ef&}ho~KuUT_3DP2y|87Y}SPpk$v!=WirP=7D#$lF{`YU3UpaxgJ5d6<+x8uy%sb}~1@YOMeXMZVB2VGpjG z0yHZU2w5~UGBPGAlKp?g!p48llzCvERq{R!few{EA_1dv^}!y~%zVPaC^K}^E#vRh zm`v8E!)z;HrbN7{YwmDq3~9_c^HbS}tGaNhUpu8ZhRv;*su5kjk-lO=#EW>!p)RN1 zJKY>FXcq}u>o`vk2Kfd~m=x~2_&qS0u+w_JT(c9SLU!oRnL&d~6J7E8I_n1_C#T9vT%7Fq;hJuaqjj)u>oGtS-3-&2kis1eMAU?H#fawn!<&#U$+975hk186!iaI>)$=uS_sf>SiS20$h92$ueD zqDMsy3BkAElR~h|iK%*C2nmJE#RB*S-mr&YjGL&d>@S3)sxTkm37y?GaLhZz>k9ng zkTR?*3YrsNGO4$|$R9kNed)ydMAiAGu7}#MubgTWLXVRAW&wZ-qRRu-*pcTsl<`@7p z+J)K~1p5y|@f#bB6)RQz5U(}=w{PFp(!VWUb>G=s{vvl0g7h)68!l(IzegVqgfG*a zq;bx#>FEzbFGyWvW@g6l6xw+@cQc*2a)jIm{p4Ure_=pRK*z3OYUrb1`r*!}9AwgD z196&EsXQSh+7&T_+xniaZFN13L?32>C#-NB=>lY?+L1}p7pmcdO*>ikQ&QGt-YvI( z^Tlp7DA$AJ{UaxHQp4vW2Y*uprz}_qwIuLvZiXjVnkI zIoYw&i=vp3aitNkjEk6;gZ?0 z+G%W27(-9YYs}^Yi&^JeGqPf;qDKV+U$CIc5yuwgGLn;(h63c1PPn zsK5W*Lx%dIqkY40mLrRB3x06#gs~f$2(@v*0%XorfT2`@Yk`5)%HcoBZuXfz*4MvA z%fRu$9=WScp*=@aN79Nrw&psM*Pc%9?%Zug%Xl5nq}NP}lr8mL*im z3+v5&A6%l{G!`hux8#vDsp3OUk~LDN9qjEM>PD)?g|H{D_v^4fW@mdhAlAi6a_Wk? zySKa5tR3W%m=^LW!lLMZ;os^QU}-_6CJ*WDI@O!0p8XEd{G{ks-RdrUzkkn|gL=S| z$IMJ%!|Y~fDfWf4S{$}_P(zC=e?n`Gs#dC4=?0bZWer{3=%4g?ES=VeR&4RtmZ5!u z8$C}AmQ~&1z(NeaL466+QEMEpmq|U{-Hpn^h|9ptZKmPWljXU94n(|ueFT_EuRcN0 zf0eoTNybfWVPRn^DS*S#O~NLv$4dyK2jg1Ojja}~Q2v@?VOUl5ZmzDWVzyRi)s&Ro zp6FIGA*8GVu_?2GOI&kdCOkehS#w>8bx-US={Jt6HS0*+oA$K%;@&s<8I0Zij%1iy z*RX|`3Q6Gq=7lr2m}n||vbQ@#^iI0kFEW?A(Ghz3ocM~BFP5NS-Ifajl~lw%5cqIL z7ee2U6rVNM@<^!MZMBa3z8{_W>CtQ%Jk`E<`aioz!~FS$dxA%1M#fCponPYpm*2K7!>tAD8)?{7ml{r&D_d1U#k>+znU|m6MIPN?Y~}+U(8Zi^|9-i0L&xN2PZ~ z!^kN9XIIXqt-<5RPunMBMh_1@HGo~WLFX_Fb_?>i5Q+Gb?7Eg1TLYMC??~|S=fRxp z>=6431j6V%8`~s;dvX2CmoM&Xt4T@$6J4(CGQHj%&?;=ZjN@c|h`a8fMu3=2@BLf1 zTuJyhEYBCiPG;)lvWOY$`cQqGF?T1WHm2O|THG9Ndd}dtDL=(gT;5^Lo1`~LmAS$+fyqXicIWtK@mCRpJ$6%9>xI)kzjL(ee$Q$UKH zB;oQfWVBTR0Q}z2lqWja#7Vwqt!Bjv-rnAoFM2U%0I2YKOmCBXL~yK!q5e1nLxbi9 zqF{5X0Bzs9Rt?jv}e)KL4f&en$YtdY-?*%Wi{?0+5Z)^vp`$C*WAmnxIeHH>=^ph9L%~~MX)tr=A;Y)3i{-m1#d@4YSTIdP@)R7Zybs&SFr=guZzvTr8y z33`{v*@s!i=F^W zFe}IgRU>WLN~%4qw;2YL?XOJKtB;JRC@d4=F<3BNuVdDHBL0ld-+6WA4ykfxi$-bB zum|DfrMrX%C9)#XC%gY+*6DdVMntc%+HESsatShK@WrBGdcdl$X{byliO0M9Bs9L0 zOIaTnxzQxrg&92;TOTe*HKYE-WBc91vQFvC$Q>uA?NGw3!kpX6>|Eu^!YQ@rTs}#M zBxU%`+9}=uw$$En$UexqNWF!8bM)+weK5!sp8ppa^iD*}>2O!sV~<6|?hnuY0S$4qcH=$c2Q^=hdyav1y46{q&h%#He?m5)1 zPDerNVT;AVZYv{##l^+0;*xPKNZh0_3aQp4F%;F>z)J| zUev$e8oo839{PWG$}-1rRU9<4xhWBY=Ip{Z*080^(S4nUc!!~9Lay%io$=yB+%_to?I9L(6>7E~99a`OA2 zOX2ZU+s80Q6|N5e8FZvo|0K!HtDf+os;bJYRn4&U`K|U(QkM`2#G1yfTYgJJWttfq zJ0B3^8}nW3ix9FtX~v#(m$Ye579UAn9@o)S8th%Z3*7-&&o$^^ZWbN1qN++>?|AlL z$5Trqdt+k-ihGfhpR1n;*QPu+oFcj>UY2=NQ>k`N*jA@ba2_c^MWVHaA^8fE4UR!}~;#7FY7l zw>#~eK3hpcWlp?h>I`xl;ZJmQcxPi2jMHg~#P7qntNNt{c&l7IY4IyMq)K1p`t0yw zr>HBb5eUYW^AQVTckIL|*yJxNEZ4rl*a!-}G@4k7wir$Y<%*EEIhhL`*yCKAA7ZCd zcE#2wMsCb6EOlH}3Oza%!;mWvhlX76DSAvIhG0wlFvx^UB&l)K&g?tTigam9>&EKb zt0CKSZ}5thN%b3lxBfP_zib8YUp>C??I|ICw|DW1fAFO&VB?=mx64tonif=p>JMBa zQH;6Qgx^mnrdiy#5aT)3=;{a9h!!BD#49K$*rYfxK0fZAzsj5Fby~Q-=f_jQ#`x&y z`z#DLNthO4q<{h3_JK?-z>v9*=jNEw3aYryih;GYBZq*(f|AMfa;P8+sfLqueG(4w zoWHWibFuHJKX~wL38Nu? zsH%kzc=h5V!cA6a`{5#A)vz~Kvd-~t6EuX(sWyxAQ&FIytGnJC;<-1=#AS=BR1&YMS*?wFH9ucuAs zAl`)gi;twrOjWq@Zc}+)vk|V{am|Xqww1pl;__y&tlRuNZr^Sf1C~X)pWb0Ky6x#+ z-sd_4)ja@n*oTTW4Igv*?vjfffcrvA@--4T3(KT8X`vFGo8$K~r|zkvgIP|CPNlw> zf29i^f$;m{wx96{93>7fldX3>$V2&9pM>?f8*CC?cEYt~=?&oj1dzWrHjhX%=jTo! zhe|0PG%L|}#?*H5j>qQehFsX-{^qT5K88tmEW5{3hSdIy_a7pXwyy2&bBc4 zZq>MVW&;4Mjump>*VlKT%KF`Mgt|OmZq>GR z<_1h|OmC{)4)9kWRO7_!VC?d47{lj-HoaLvtO6)FRL~H}=6+u4%U4p1mu6n^)(w6Q zU1@+H)pxs1|JKIFW_oqJ#u1=(tt>4WhdGZ>7d%pcam%l}e;k@W8z}>=(X5yots#1} ztz-1;4rvTHl$Qlrd2*|1?qMp~a0M9Zn_+1uuXL!F@B|n&Y*ScaF40h*>?oG=QqMx! zTO|QjsW0C9L9K2}!h&X9l{uf~<>(DxRw4$~mX7x#6IW+(-*&NAKA5^xnr|rDn*5u5 zi>Dgrb?-0BU1I)&b;{$SQf0q%WGl6HID}meP{UJX?mX06&@iK1B zN(^#L!edYyn~0p89CwD=d|j2^93%b#<>z{OdX-02^{Da(m7aVQ+E?s-Sb2$ASuANl4z}3HdP;2fVRi$XVDWqLi!Ek;YwFiTW;pO zv`Wjm2>}m4E(v3@MSSrp{sf5<8f*SH)BX1{rhaDolsUt=aK=QZABkwEmau;8(@3nH zyRD*Kto@GFO-|bZ1rg5-8K;95fnt!&`~dz=Z&lft^>@&?=bEi(CQ!1&v|o|}K4XN+ z%X|!HcX4fAN-jaQ59ji`r=Lo@(GryiA-BfwcJ3Uj zS!e7}T=kaWH*>d5CYIpsVv(m>OPKnczK1R+ZDY^lO-YqTXq1?Tg%GZBJC=no>Qmm< z_CJX60tGH%`b|Hh{cP25&lIUL29dXUZ;*QLtJH}{49b+Wrjb^D?HfL>gb2|lJz?Wu z|6*Q<;Ex^$o;%efzkXNZmI~H2o^}|HJOOp98r&%PE=v{6od+QLdmN$=ImoORt`b5! zgWAF8ox|Ah;VWuA0kPPrXPIQ|KLYGQo&e1N?C$iB5cy7r=HgzCY~So&8xI~4qfsPg zP+TlQ*LAD&8Uf%XI~AY4p1u-pLH8q33^`ho2obKkGqd)2hu<{~m$ysMP;pZ90Au>L z_Of#Akma5$|HD1p0T>vIPT`kEw|=jf0)OjRO9y1H?$%7sGYl{1+?Hc3Zb_~m@w7+g zf#KpG?wFqe8Z%L_9GIpk?Yqv&?j|6rPRZk1gS_zZivi`r#)gp-Sf5r*I-9x*V8Shg z@qNeZ_k_@i={K;}SA9mz~|$16_eb2z=$5GeWkw;;Cl@3DKB{ z$3WJeih`aQI89PaAzYFIGX2WvFUSoFA*FgRyYaT(=|R+QqphLROu=t#at0G-=8Xrh zw@{)c5Tf#tPhQDuyr8CZ%jW37o2UKALPha;ihNefaW1_>Ik)#+FdBu{)VnOz@?wS~ z&ajqG#ZL;_?Xji@g8@J=YJsy7UK4)NcF-YJ|2*d9m}3+xbMG;SZ8?L~OW2GowW=Nm zZmheOEkpUT_WQ*5?Z@|R>7E#}tUS6w(wZ*6g*@Ash`vAuv$}*~oz5(F(&zuUPT4M} zGnOmoKGI8U-)^u1R@ICEFXDRROXA+V32=nQJ?lR+h;H=tu!*ZI&Aq!(!+X5NKmpX} z`5U66c0bt6$*!r>g6_@kMo&9UJ}U<}mUi&MyZTU*-<%aicz(-Ur0xrDv^<{qfIe{eyLaP!{jzhnV@N<`Odn9y5X7vhV0&zz))h#2(MyBy{H(UQY$$_x zL|GDk#o`fO6583Os?tTjc2i6fIC+KC|61CtdUTIX5iGmsGl*0DZQu^tJucG$tNBR# zDk}QvPhPht8nU)f?P^IB(;Lt})V+awsYD{2mPQjl)s``tIXM=m15xeN%P#2mCx8Fb zv;yOxDaTYLWpMlV3Mm>Tz}PVoP&|7HtD4ctFg9xi8uc+j*g~(yrS)1K+1n1kvSWKm zjSWRv35f!Vkky@*^h{OtamsptQHz$~wfml`=@l~+rD9tC_e}Y6|J~D2ON$yx+A$G? zlrQGhk85z(qql`XcxYX99-35PziFUY$rrG*yG{>*qxc9Mg{Ql-q8^4f1B`NKDjm3abwFw2?Mw1!=Xx`Xq>==m6L~vrd1^cn`^y(7t**o= zX2BMQCnscb>u!lBTxI&gI#GI@OcAI;x+47B<`RjWI}P72s+9btnOlshgmb*<&)zPx z8xnwF@~u54V?6m9OIRJ^s@<;~og1YM*nH9))+QBR8Mf%RGaCZRl}ggQYnoIVXCLY7 zkP-zB?0K~pPX4*aK(PhA&#@({eR2QwY*p1_nhLU?X=*Wt)!g*m_%=S@j4&!*jM;<( zEi^r{xFU)h_l+NriA?q64wcgtuJ!aS#7p|BA6^Sn35&I8)A=a6XGmVr6j^R1k~*%g zB-*MXD;HpA$O8)~o5G}Ma#g(@crwVG+1!7^dZ2HbY?nTl|2dUxx8_^4lkl=p!mJ}L5p`^5SF`uwh(iN47ov@F^>rS_HP zy>coKF(B17zh0?D1vYs8Di>U3KlF`MQ-GcGT2{zj8Z2}5|8@vXd5zbnCu!F9iByTalLF-1$XthYuap-=WU z8K81!;~r)gkj(^;0uf*qvhRF?v050WB=`E@`@;{ z$_5$iJC5J0V%%EJ=PB!vzF9o|jW#K1_f2z;du>6~Cc1gs+7ky%3*5`i=oB$kT(#YB;aw0A0c_+Jmy_*O z=x+>r7y%_dL#VFkljqeBh+A03#@pQQApYB9RWNRCPO_I%d*MxaUNdFUA?Jsj2%&Tx{Z9=c`%0YY8c-l{fz2?SEX%Xzm&`P1R1%egd+gLyF*b^747n`zo zxWSj7LlBIMRZ@8PRF1U(lN+{e{ar?VUg0To0a>~rutdaaZ#;(t6=#K+-7HjCRhF%o}mp%|^w zvzm)^3Mqr?84afDMOq{rMF2HfBc48ToQ_5EZzrkv5R8LPccV(XdYi)tv+?aaA{9Aj zkP>_|N_XYfzo&~=eE5~m`=uBZ+$vB2;MU;d?Y|SLdvatvPg9hfTSS}G{<3w9W1Hat z^nLx|mW*De2U(JdwAkLDz0Xn5K5EuY@6avRi5$H%ba;|>VJb9^ZG}uUO(r%mo!--L zexor@Y`7uNf)c->&sIKCE`o?G$G&0xU&7-i^mFYpNpGIAj*7EM*lSD`C{1esddrhj zmF4Bp7`u;F2L)u$-|1ckPJ#7UY}?+p{(4bxJ!)uw?t|a>TG@)q9CteW%UX4Tpi4?Y zd66+@(B#Dar?BW6_ksgmc9Imi$UdwN3~yJe;%rjmWbRE#_}ab~My?o*B_~r{C>M-| zqROPT2$|DF1=DZW`w)=>HFR}~Xxlcl`%}F;dP%YcDTd@m+}J((X)!XZu`30nGPgFLcb;- z2<93;HUE}faaQN*GptKiOR{5S>1Mt6rem1b^NcpA-~TugYRZuuic$UJNH&i;Z-zC^ z4L8NOHNrkiITaLk>*aER!UC`-Pwe}={ws`2{(b4p4>8%CP8gRp3ft>y4zRtvs!?&A z33d^MQJ%I(C~UHE-O&p&qgHg64Z3n;Hl-KAqGB`cnU8^h2BdB(4QTUH<7Cfzy(sQ+ zxV;1mYK)WmC-wTec9ZE~Z{zqqeoYu%uL^mi$!r9bZ{SSv;Xrr?Kl#6X_{C!y3YGUe zZ1*9>uahcJ8Y`d2*;H?Cr&LVIm%bgS`*tB@r=^t$cM;(e77Vlwk=%Ef%0j@JB%i!u zc|(KowgSlbS3o&MZ-T_AT>mwQ&!~;)Ubx-@9-E61CoEg2I=WqSek2yK60qyROjkE# zla={xt+wDzkAHzh%Xz>BE7Q@V7i53LN7FWSEQ<6!=xQod>|4N~#m#84KJyT1@GbB}jS%79C8mc6s-|1UPNLO&#LXV5tX zm7#U{E%%(C!FwRV(qwS2cWwD)i!ss671S^Ln?Zq2-}$ed6d1?;sRt5T!5k_ zjtdFlHZzBjA?!8(sYN(wyYl{0FJe6#{Rg_@f>HaxfXdmJ+&ikU=O9!?slA2&6CI{D zr_7rHd;X@HNGG5rTpNMMGzFv$PPL|B2y$Hddk#-ytWPI?CKeq_VyR_OFTYcL-f0%+ zt|$_+<8i+0763->0kzZ;DyJ-ORSoOPzVu~`*7^+pqU&m_E0{k)>^3A z#m#1hhH5uH%Di-3xaiCIRqqc3ND(7rKkBPoU@qO*KWd_u&Xk&Z-Z+0gK5#^YJZ|Cq zY~i%M+-@^^UH6vt$zQC4S&~8?P~N4!G7>4i!m?{w6^}<3w%E$PLxXM#>BPOB^VjtT z!Y|`~x=*AW1Nq$orTY4|Iuw|9I2i}T?lZ5SZpJRaQ@Q}xovCYd6$a0G2h@lAuwak2 z0-4ww1ISE8u$Y|gpwqRo_b`&VqmT5gdBF*pakzOZjCSRrLCJh}+&`h>A!?R8fZ@7h z^6b)q6XFU#LDlw)WU64`ccE2c0EzZH0M)1ntr@G#QD>gE@R$3C@|2z$#@!pAhZnC< zB30J!#>LOPTE8j52=aUl4*d8U_`b;8YTOKWnO7zVcm5k%jl7*s?G!|lliq}DE0D!b z&5CJm5qjUbd_j90p~l=Z=JVv{sF2}Po$-bx6IO)}A4IVGKDZKaef0LNEdPz109&t2 z&4asDvC|*fdEs|2fWPE6#)gM=B+y|%ytH{fL-}hrIabHbD0Tl#0pm=&;NOSjT&UzM zY*?g#!s`e|gY!Umo=2qq?Ky7DbHpM}F6=Pk5rOppe&S{7DosoiVgDo^CJPp{m(>)e zA-KNO;YFIr1q0>jPWNe0cfpp?uU2S;~eeu+YnD2-lJjj;~>64?7Jmt{?ym zIH9P+vY2NByk9-EN1a%A853Wg=0nRvn~`?yS7uoB%PUg;WtghHk68-W25@G-ACA*W z%UMYb29hNSsPUDTo%s*Sy2L5)eB$5moQncvkMf5c#8C?HW1lLz`Hj3y$7wgq3rUAj zDh$;IE3?8`5!om5RnRhNMB>{XKclU67SZsOEd@P0y;Fkg6Logzb= zCruQ_ZqaPW4wNJ-`VduWx@paqJ*Fuuvg?}}i0|+K%?LTABDbn^7JJ^=_d$jF`$*iLdso*V7nm|hA_3pwq9<4 zmXZJ0nsm7+j{RulvxBybtAaWwE|-zxEJxx9A9;Lc<9&Miw`odkbv|_Q>0_||SV`@k zsQpDH#T{->*B%OpI}H9IZDf(SlVC7q8rF*H^Z>Cmi%CtM!B54b;-+i;h4zD~Mm;|p zRV7Elrh;{n*_`Lu^2mip0TW3$F&)4ZdoKIz8Y67K@ljZ~)=UNHoqSmvd9#hx)Sf0M zp=HDPmNJ>akr?cDFh4*5u$^f+_|z27=&k`Qhx17|?%*3-ywp5xHLV|JWB5eyqrTpCF?ce!s*RVezjGTcXoO8X!XE;r+=7_i%RfM*QwSe6V^hqcPCJ=u* zQ?6N*>-s2_CwO`I5qBsDR3)c>0jE#WacW#6%L&d8Ye= zP+0S^+IjyzS~HG4jsEY8AAwSInZ^r7HbSHx{tW~(L)Io}^^EVcg!{a5q)H_SYy@~!)Ib)*rn%_@sa6i>;P^vhE| z6t2Bi0|a$aJfG#hky|X<9Nm7D<@GNnop}SfH0&X#7B|aL7~=1^d?SK9G^w?Isf#TO z$lC!k1gP}Cflu*&IInsC(*+{-W`qZ*L42m(Wq|kzIlvF(00)0@%?I7f^)SG0qb~9M z5+X`43HTFNI+cZ&_wX_0I~q5NTI_Nv3@4M!QxUHhPV))2yA}Q_UgWZ%DN>l5PP3kr zGhktnB>MyW6p$!P$fSy$oYgxAVE&x|Kq!7*zx$Wp5M!yMg#u~AB@KvRQhl%g@EsjT zEpk6QUsx7v?{lr0&KwmfR*+Or_#7~Eohz@JN=72G>3cw136nd1^_;}wjP(~F5*~a3 zi15prGmhC-;o!h*hP|ScgMu~lsG2ZJ_OSh!dJql(G~=n#ksDVJr=GP^Q<~$h5)XIR z<+Qf()(Wb<%5}1nagR=Ed~|5Jb3H@}=co|;YH4ir(ym7v)>L!|r0ICZV-Y{QOp|QzV1177mt6kAEHg*?5DA|6GWrg@k7qj>|TKTh# zx+;g3z1`9EJ%A;>j?g2ItRzN}*2{=cW4PmV`{z&PeR2r7KOdR0Dq}DJE)!Vqp8q2W zVaqJ(mabF2UH>yUX6fV(gE-U+o?kM8g6Q%Zustozu5;YiAjgNsnno({?uM_WjRgDK zD;$>e1CLJ%e3)!lq62(H*iifj3SFy@{oJ;9L(nY##ik^2t>0D3CPya%uOeplP2ne| z7(7dyPKut{@qnM8_#uzVyCd$YV7m2T`fsXcZ>xXMS$1xZursgOU%O9WtCnL|n$52; zbbACatHUmU2>imD)Bgi&&S+H=63HIWsQNz-D~oa8y#`X;tL=Z>>)dY3xXJ0geepPI z`K}`qxHUsED%?<9V%eTcg5jIC0E~6p&M>VFH9P9uRD#~wkDs^}sf*CS)r3y&h=`dl z)8Gc;ViKmTVu<6xRTh06ERZ?Uek$LQ-{$q)!BjOJ3eY0KLX_ygFHah0;7)WJ0445D z1DaBAW-+GJ8 z{SV)o4jEl2Y5MJ31;QT**V-k8$!U|T&bbKpcuAmD!qkT%0N)b{h@Y*^UX~^6)YhCz z9B~q$;AdDl7`jLp697rcB2Dg_A^z^vI2?kiDsM`u4<07CItI{)1 z2q!j%X;YakjEib2>L1z1qrEBxO$UW+PpABjQ?6h!zPY(CPy2_|sCo#gl-I}+x-{<3 z;ka;vl6}zKk25!$Pv6*MXMtN{=YTjfV2QPsfLDbH_f&o}4B_pq=)7?mVmSX1aH`OF zifL`6^V>{#RQ5a>;(UQq5iRYezB}FS(ym&FuKEz&-e;2*GX(gb0EsB&TUEZNR1Jdv zqN3kBnhhBDrn;)H{D$YM(^5i(L*d9=-`624wp7-qi~qiy>A^U54F9h~NvpOG6Kl%u zO)}&Dskl5X--Uhba;H;KOub_N=mg4MY$|5So#@q;#>=0gMBGlSsi{dG)byb3{*X-m}d?Ern1dub^Nzy>J6)2auGgjpZ9Ek})_H6z|LG2uI;c+ucKSE{@^8b$6 zWJ`fShr#YX{Q)K63Qsu@WO4#M{b;viI0B4>J4dc*YE4VTTWL=11D$YwDgq%><&eS0 zrG9;RM9XG^%R05y3fzwQ+s zG*V-S0L$$2m#p@mVLwZBH|<+YjTe60)Dk^x=vKCui8#@7<+1*!m1m-qOQygB6)^Wz zAQU-9o(R#TMoUUbMyy4H?9c3$0(Y7eFtrF6z}}Zoa+lJc4ZoPOM>Hb@fV!M#a5MWk znt=!{TM@HuZEL%kx@eixCNU|&Akml$9+4bATsbJzbyOgqBDtf@nznSq5ijL@BM#YL zEHVVLD>>Ga&txTKxzVvl0Ka_6oMlhV|NG*%bL#m>+bC)wYd@Uddt8bE+t(FAY)`7w z`Jn(3=FRyqU3gW-?WatP75XZBxc~uEzsgFj|D)@x!=hfFw-wAuuCtnu)NO_9{io}`;XUN?xH+9^UU0H z&pq=2L&6)5%M;D>AJAQe=!#-|9Sp6kY&% zRU#UW%F3l>{2_KkhrJ3; zrf`}M3?}k3L!~7~H+>n5*=%eNWklc3o?fzA{+ap2yn5dDx|ln<;n6VP`PH?>%GAsY z2ZAniYe!w;8Ne9CIyz(5E}o6E7ft1X-N?K99+{tWhHASJviOiOAh?9<)auxgq#I?f@7?@0IAd5a zDG_6(5|u0hkGa&$qTg&Tr)pJs8GDmyh``m3JL)+}A_;Zis0^Y#$cPwwQ!MAS-VJ>E-_y>kgDMJan+g#doh$W``TcTV07VnJ*bQ^4cqzfpmeDbVF{x&> zn15&t4{Dr@!a4)}aIaH#aH9#vJ0DZ@nLjFSb_dY2%nm+1O_q$=F>sPTkoC2Az7YRS z+Gu)u?`anRnX9W>MNOt#M^#J}^-{36bNCIm!}(>m2ja-x1j+{+vz zfq7*t-4_hx_>G?9FuP?fQjXakofg14r}1a+k4J#~|FOsR3)pQ@)Hsr$-}`tfO}BRk z5VS+4((m1;SFV9v^F-hDHKZLE&Ll*>sqJN?d|n%s`l{kMyj#02RWLd;bY>O0ZK7$` z@RaE}=}8oMa5-980lrib=RPP{j$AMxiL%tr^Biqw%0G+aGOy1|wU(3#hT-~^fV%l& z+$P@RdGvXc_;b^Vqx`9Yfp%WSF_{c$Fw4Qu?H#T%eRO_OZa!{<(>_?$SZ}B74*7#J zXN~{3 z4#~lz%j75zVPwjX^izo^qI-!s)on<((b-+7^T3Gpc3|Zv$FjHsv+Ks=d6noi{zz>8 zR6|LTd4AMpp-t?~{M@Y(FX53k;hw3CTok%Nf4Vjh8r>#I#68lOdXWvux%9>-LO`?XKNZJOJ6d5z&AV@ zy=DUq<5;yTJl|Bt1*5$1saX&-NJyBLyW&MW=GLghnD_kRTs|QsDVv|~F>on%usk~q+UF?y?@>o( zZ}4;S3ha;k8WkL|a#?v5Bt+FrG(*r=ZMhnrU|L-eyFKVQ12!oH5K{kIq>b84=~_p; z^D^v4#7N{MZseG|>d2NEVc&3kolyu{xXMs$@!HAgy*3yYHvzYFJP=k@63#F}2_)NXS1rT){D2K|(W^k2;`qR7#Y6 zdz`Gok3vdJl>es4R&#*fK(&+Y!o&H!p6Z7?Yno!dDYgUPJH$>nlnvfc@M(rrb#ak)QR`p!b^prH}G^8CqlCXt5(JiLu8+#v*XU z{R&E|XKK9ZmEmDC@4DsbC6_Hd&{~iqYI?U+)CxoP>k2ffJfZ;`LEy8AE9w_>qKsjM znuX&)kvzkiYi1TtH)tlUJDoCwv{oYNGt5}SuGab(QGdE%XJ-mV+5ES?{O#Ek3r=e<%A0eIkkLY{-yV%m&v zc$>?V1uSnx$!g*6|DRUTf)tRvf6-C>fwAp~oHs_^Y4)6XI6W>C{90w5${lfOdT!;? z4+gS=!}I6{s21@9&F+qS&T|ne#){k0G|R}GH)3g(H9J!o%g3?WU27K?s~=qfb2&8o zr~Y|2bY>pThTi!IzwTy4i_WnYnVlOb4R^VYpy!7bRr`MC#eRSFg=zl^=-fTI7CIHU zN|KmT%o5azs8j8m(G&~VDm(1Ll@J_t|4yJeCRq^F{vF~wU~wY7@OFx3&it6_kznwA zF9Q?Wtuc;8c&53i+6Rwj5_xUbZaleQxJXghR@Z~JK zukyLI$+5@zX&Jr6?SBWDbH4YZSQH*pUY?!!3ux%n89(mRwBVEw*<}ub*^Jk!Mx;TX z?jYct1l6bT1kVD1cjn@&KO#d3J~BQN%h|E4Wr5c~UL?6zVD08v$r7iaxaz=BS0>qHFAhv13Wi=~SWHp-|%F)xJ4cTXR ze*)L@STY$|w{G(BnSWy`fSS|gKM3MkS+Lcvc-Q}>m%ReYBUnTu)1UgyY5zl-r#Nk$ zFk-C|g>ltZ1T>FiiSkh!o?GTL&)=RKKpH4|TdwIQv6l^5@`VF^JSg*I5s67;J!|7) zTBPpTR!2y$8y|q#n2vV0#&ms2n}XqIx5Bp9Jf&96(j>#?-|MhfbQ?Stk=rnO0!nEI&1vVnK(_7R-L;=l=0h* zUB!2j`?p*MrO6;BV#MDBasoI2z5@G-)T*_2;cxb7&hem~xD#mAzqx&KsPSgGS@OSF z(bE9Xow@qr-@}1ygg(rzy_`(0j7$p?TO^EvQnwBz1x=Y_pnQ9Cr1Maw=zNxz%3v1> zssgHHwTsBYzn1ny;!W6P55oj#H-aL(afR5>?$tpGa|o~wdk)%-{=+@ip?-!Aa~tB* z?TA5aQB(b{BrQDeq6Lg43E}Wu!^@xKT#LA7^}#(ICt39LXRo4SyS270`Ibm;hcX2~|74W3P~x5a z<{mJ%SM~tA-6J2rp2NSnGjT2udOyCtkiJcIH=1&`sqbYR=%Bik)Cl2m$wOom513xp zT)UmPJ$Tf<`1v+ah$VnZ$&4bZyI1VW|3`@94(cQ?rq+{b7lI@L3e4yLvbBvLPM3EH z-?! z>?5IuxqZE_)=8Y#4Ak`gWRDS--(}6hzIG(wvnm0vNlATMGR4{W`2snBb$uOSh{EmdRpp#YzprhFMc7FXJ9S!} zX_CG?wvPLc>>F8!2gWXxEmP+WJAF)kA#;45qUr_WH~YLW+Z*|x0vLV>q_GelUPm1! zKKpmLu?GOU#pwGm#cnyOi6sNRMjx&>@~T~y@FRKsTCEvJlfvOUckjmC1luGypSBv1 zgr``k`;Cnon?*O2#ncuFHADoiPBw)M-}1fvAfQ*9D$_UkpILr+T#?CFYu$YAHgQOl z+^>yTgU9R^`pDVx9t+q+7g3oN$PPxqhJXJjNySltd^`Az^CVnt)C}O&l9Y6H6YxaI zk?edd$c%MISmlIx?9@gbhwxc$+`NrG!t4v|q9=OL-NERWc9sWjo+)mGivwEsV}A*j zxEeSg7zutt8(Q-PRX)?RMlT?OgxTl9iP4^q%y?rfhU?`#%2lS?^L0piTRKt#e<2v1fQC&AU|t`!b<h_l<>LIA16@_ zu%5LJCR~J*BA81_F31H@7U3F@?8UZ*D%uU_WV6YR>feC#`0Iif>C0pmpbD74Jqft7 zt$EkFc$!xZugj|tn_?VDrD{wT65S#e#msC4^3MOFFTl|#CV^*hvxBQ0sUo39#CKnI zZm>|UX}>BV3!TRc&+Mr{r^?9Dgp@9`sD!E9seQ5 z6UqHouy`oOM;n!$Ng~=})~@qS-ZtW>`aauwRRc`dfq`RXhJkVmadl$vN-ulwG=2O> z1$&jZ93l;q1UCB^Y2qXO_OuF;u1k>t*>p`a>5WbEAUdg@6urN{!O8aZKG2N{v+zb+ zwL()H`S{0-@?8v7M0%s^6DJq}0;K9Bp*K7R5B|Mvkt?dHlF0Xch(;>>~ql;p@A@WW5=;2^Q z%$I*d0)uB$VA<9Tz%;eLIqna&AC=J?pD%B2 zJc7vr{YxUEo&sT5CdkCW=ls7^2_~SsGAncfl%EPny0kTIP$A?No-VDs&UkG{VNP1n zITp8`wh*pic;!>w_VM`sS*GPvcpe^E(?Fv#)0xt|uDy$K_%(`bSgfpu7DHQXhE>J{ zU0$G)pM0X8boRJ%mRsTgG0be5JW0!C_yn^kRak6TFP~`m&{wo_3){C7w>WB$vcpW| zrVjuHq_Wgk^}!*nngMeL^ig)S+ z8jq|1L!AkDle}OGCzg4ciNC76o+Tz*l%O_`{9N$dKPtS3SE+!==Ig7v>Z;1(Zce)H zck8}jr;AlwVVS5_UgsG}1LvQkzP>OU zD4&bm5x3x9bLQMP0rb3Rsud2-fn^AB-ATrfbO2MOD0}E+Iz$$ML~_NxVj5xXVg$a_C`$vwGe$c;K9>ft!?{!;4?AaZvIiv=-2qp4L^o>t9U;kwEeIO@B^ z9%y+#+wZOzJ7FuUT0a;)u`_@R$^fx87Z_1W_Q=!?{nt7NuWHVb0}~PK<%``raoU)u znx7fBZq}#}&d3-fal#E}vvoiuSS@T0`JGemLr{4g(%NhhHil87P(Q>5vSZ~E?hf$} z@=VH*F$)yf_MAiiIZ=%Wrkxp^p~hz9_2ql5!ML!5q&TyvK2X`* zI4e*3XWTYn16+P3xgUZ~@B{#Afk23Z316y2m?D4Nb`y7gt=S^Xpl4w^)K~Y&th%-tQt2D#qw|OCaRTLcwRFHn0AJF zd178<8!jWe@7ZvCtZwd^Xg3kT z`xE1Gbrx!cn)gkqu4<~VJd|ga_01InNPTwtGerMzzJJLgX%h{DiS(PT%`FN4hyY8H zEv7660REOlyBC3L8e-G~G}}y0xRL?{iO0+ij!%u{u?RjPpv;s5hZ?b$4j%53usGCx zo`edy9{?w0)K%?!@kIMSV3_i76ih^@XbpMhJHd^lSTwx3eBmv@<9PNXBCG~Ta7KK4 ztSy)Hv?QmgFO;p7%l;Z=Jm69pQ%gCjWk#^2u3@A@0t4kq`P|3_Y@$En-{{=TD>78%aAUS-4EL| zlNXBEDDiYjj~ch!0P0I`flbq^&pEO_T_0;LMXzX(y{RxjD>)rpskWcr0i{X{_Q@iZ zNuu+}B+IWBr<9?Bv9$U~R7KnEst z@2AuF3FA#eAzBT==fm6yYO&A%={!@Xa&Z7^Iq0j^%E@YRi3dmX${1bV)5><7!~^Pc>H4$N2{lFaH_IHot{2_t zuWBE8o(F%437Ho!_npkdk;TG*EWUucY@n7w7MJDk8~J!FJk*`v*U=EYLF+lf4%UZm z7R@)fjOrWj%cNP3+g*+N`-Djjv6?bqye@4ZW=&2otGWz$==F(I%ymtY7B8ka*L2@1 z)lPSl2R{?8guI*X!Q{Fet``B*}UR&pZv{68n`agb%dod*@VPCY9AO#&Pg+QT z-OmR3jzrxk#Q}Zqgf|@YznS3picIZAI?+=n`dCa21cPtSbjz54XIUpy5Itj0r(=`p$ zGmrF*EhxA_@}C4d1ZbjTRrB}1PsN(Ahq_%sAj_Fy?4<}jq%nt0YmViVIJ~K_r*=XC z`SlV^o1YmBZxG$np=y~ent6M*oe||+zNTrtotXy3nXF`;+_t z&i1M@OYR{5CPN(cb_oo)^8{s(~z_GArxyV z{r4^9uNWl5==beQ*s0rCGhB8(i!C{zBd|S(%-x9|JN;(x15|1LDVdmyZ00ttNkw*V z)10I&U59u|z5{-$s!w$v$4_PKy!e(qJEY9b=7c}143YWa)iC=`^O*o?*@NqfZd?0Uv#QzFxbs-GM%A%%^lXB<9UMHt;YQE|lo%=BW0a zt1M*KawrNu&`g~y1`2?&<`(a?1f1xh;MxuwwbT_s>>T)QD{0b2C7OM3{tx|h1>N+A zE?7X-i4Ws&gSWuIO}K>IfAsQgh-{NwT3qpkA~?)xGFeK_aeV5PV}7=MA4c^INPIE@ zo6wuvTh1lU1`Kp#!A_&{0rPzu<>TcLTI&tgk|o zA2`(NR5`N21~p&W#PRk_ki=~TaaAJ`MiWz6u#JH^7o{OULvPU0^(}p@Q;a@zJLIM3 zy);je6yBB&eP(nViQsSvO!*GDCngL8c1Fg$UiNG4!f440$qh*C7M!rU)ljrW>I<3D zLeRVTW4AlT)Vdb9%Tz#}^y7r$&xDiM+Y_qp+4daPIxP+99d{-n6TAQ;7;0ZH`NGUR zqZQ^nEo^@2=--$%9^a(ZZcf(MR(@cGt*u{2p;b@>i({TcgHX&;(eS*R^LnTxrcZ1; zF*P;X%+kxodKS1K1P?_IW5r0TGHb0y!yHPj{cGLGA#tT(e z3-C>BU;1qHfIBg7|i=*N$gtm~u_!tOzSHq+&M{pwdEdIGwoyHWLFRH#9@S0*jZ56VI zVGPCa8-i}08;7*(Oen}&hNJsaYzF}mT2LcsA+(%Y)pgA*K1vdHroAj-;FEQT7000T zh(d}-=xYCn%jzeo3j>TMjW(|Vvld4Z(57nch;GXgm@_R5>nx)$S>eQvpp4}UU-gcE zPAaRpTI-Nhdjg#um`e+oYuMXR?Al3lslETi!nQXXV6-TdNEl+rVN^j&(~^Ega~v!# zK5|5=keYDdh;0b2TTvl`QS4{MvL39oDtmrsryeRbjIg$!$}mzN3kHvLweXnI=q|PZ zPvC$ny@y$ANDF@?L8r^JOS6vK4W+cu^sMz6M!d2b&dKCY7E0l*@bfB?^mMb`bm90~ z%LmS-9+7~D~9QI zG&!~%u+?<p7({UjPl;1?3avW2B9E6@AC4OufSu}BZY6_^dlLN`+Z}4VS{vb=p}juz>{%4! zW`{j4jfD@pmydJ_O6BkWc=f*wr&qJbx0xiZaq&PEco;qa{{^i9_-)3tWSd5F|K@us zR&-iwSlc6Hk=GOZkKb~p5FwVb3iOAzrn(EE*g*=jklPLEig}32qKQYxc0a#iELhqt z)$SAE7#$E~CA{d?+*Dlknada8z1_2wE12|3?_3s4>go2fxT2pL!zpmPIt?lC*og9P zxh8?QJcg{uZnkX#LxSA?5Tns^Yv`&gJL4J_Ye)||@eaXDZO>vFeiGGU2<1Ozx%Dpv zn4fUGgWTq*jdMvKE3xY*-f>iT-@{5ma>2{^!6Jjvcv`AHUBzNi&!hBy%`j7mwBzGb z$(jURezV-p!}aN#(DKr0JJUDFBy3x%RcnPzBV8gzwQ0;4wp0tdY~_{_hl_9e|GFc~ z?AYn{ZED*(WB8f`<(eDkJ#|DWoUovBuJ4-1ayw0vXvixZ@><4Aq#<{N_x-%98|nK^ zY-HQFC=+TWDkRQ6$9qxHTA*l|u$|!qfI9HW>m49VcL-h|Ihh7(iVm~177GQvD*F0$ zDCi{#Q1lSKoe6msVw-!s|MQg|M1gg8^EqNVExAZwUcXH^uW>&S#X&pY6}V70!uQxG zv*S%3*J=l!Xv-^N8nl$YARL}i=JKbDvr}aX4FQUTz>@Wzy-66Z2GeOd2+|?ej)u@LyA5L5*+zHD7 z@^#>aCD0Kc)g8FM6ub7cj?uZ*?{AR648WWL=#G_tPz)vB=6I{#B!2k8R}Uc7QYIbQ z){llVnwu&v?<6uRORpmaHcHDy>=s-Sb8hT!V~ZaPO*TnD@K57Iwa3H8IA-2GrynRm zwwJ}u!|MeC)@5|7{HCK7BkA6c- zV{X+qnNn!z-U-fWy_Q|n&->#MPM~0R!jq)$D2t6gb7IpiQwe^Gh?1D)5N3*Tv#o1l z^kEgAkE(eW-G;pA(HHU*hVMF@dlxC>*U+N8#$n&B{&z1cvrI0ihWL*8K24S^EO7O%)j-=Ct*kq$?+0%`?R=m8{Xf-L5+zf>4Gv@Ni|39JG2j)3 z$sXUisJQPR1zD74>iyx&xZXCKYg^&$=P_%QKDJ>~{_!Z-pXE-1+{B(6a6-@w6z4gv zs`XcI+cl|}7OVaG>n3Q(aFbjNYpSjszLG;{<5uzyh-$5O$K%IRqEeTvF9~igPdBAR z>3x_>t*|o_M`vmnW}9_9EGTvJx*r`KXAfn=#S3>_27BeZRZ@C&&%LMm;#LI+7=>1u zena|$gz3WZt6t`~N8bIxOPceB08Pz*q z$vKORpFf!b$>bminkW%1mOlKnSng4DkNq6SejCZinO4>eG`$0w!KkvpQt=`kGCIoE z=T382@@W01DKpJZG{houC_T4xR5bE-a%boKyav9Gu zk+Qu1NXnsnZn9dcvD#>Bt~v(evRI7EQ+Wka`6#)nhd|~2e;C(Bsng`aPAK7-;Nx?E z6E$8A&|(jG?^eS~+G?@NNIF}X77<6&p1bq0V)f|};ZBX%Z)Uh*P z=entgIz3#=Bvln(ZxLscJ_7Se$3^p!P28m@Anlxq&4lN@COO#!^YERT^q8ndhW1Q4PQigA%G2E#q!fH*UwZ6w37s-FJvMdxm zCjtQAC1j)7bYS?N^a``dz5!a@($6O&$ZGIHSh&(q-DxY;42!|vi1c@G;N}EYitTNw zYd=ZjRpRry0vc~wclRcS)O@VqMw#6G!f2JK-Q;Tn%TGdru-w{Ee@rLEgpk1|Gv_ zWGTh~l3u+PuoUpy_Z&{Ea+hOff3C)k4PWuHGZYk4YOFTy#7~Q_?PW_=p=9kA5H#dp zJHzPKtiZt+LAV7vt9f_{Hq|JNyYv8jS$0R~bBZy%7vv~q zhO#Vep*L|jYsJ*eW(W+JWBV+jrwhcwHpC~5?<`IbPJa2WDdr?yceS?fKQ)LN&I7gh zI0#RApdHcc`148M=G-1|1(=0#!QDT%);jlon3Tm@QFgK(dU4I$OPw!jF1QeFcc=VS z=Avc3>F`S`AoVe&Q!1(OI${CDT7AU^7uKKq+ld9MV}34rZ)1aOI01X|6yL}@$Iy4j zGi&`~9Lf2GvZ>Udo@{Gl-{jJ`Fl(Q+g0J5+>_#=1t+VbFy}%tS4&q{-XJe$#9x}PR zB8AQ&z>Zk~KWs>}Lo4a$R60#}tLSU~F-8HRLjW5~jn*pL+TFa5CoIOz7m$fAQF8LS zmPC0yh|1OwU&HU3mK1&6$?}s<_Q*U4G zmb*&bGj8d2pwH7lSz>4BIA;0>7%I$xznI_;R{S;77;iUUDtW`V+P;J9CsDFKoV>s% z1Jfv|ew$(FKDAE`B!>bQ#@F#bRIeoJG=H?9Txp$7=|BqK=GsE&!Lw86YhPs!ZLCMc zk>JN8E*(>_zca5GI{-=Hu=jKqe+LYJoUU{Zzj=!d=-T=b;?++*W?ET$oO3g*Z~ykf zn*ox7k-9)7@Df6zHZN}}Ds@__i(gO!uAp;+&P~dB_W^}$zo>%lJ z+@H*S3a#X^?M81}^_11A>eltmr2M(Kzl3L@4Ru0Dcu$-fje6`z^+$1Kaqh+v+E-7O z!DtvT8i*Wa4{ggRsXsBg)FxpkLU>StB%(4cbmfKf?A>I+=lqUAoij=Qn$HRiTh4?~B%cDbIr(*z% z5fbXDK0b!;jwXs{3CprZSYFGZPTK14zvMAv5>)B-I!78EuWOuw$5#dC?WlB7d#TV+ ze>!Q6?VL&p^xdvF&02?L*nIkm^T5~DW0pq#Hm*GW#Py!>yfWongCA2rE`kV3tvgqk zwSlztaB_9)@Tya3VT&ZN01#|d%+JmpBo`Gx@cwDDD?8gmE4&Wc9-d=3~l zRc*~0;s#zm!CY&T&wrS8ck?rW zB46j9YbWl{!NtF$11iN&n8Ccc6Y*mD8>oN{HQ%b*T&ejfy@nq2*}%#_Fm8ZT&n?o1 zoH@6+UlxC zA(1b0Zqh*%Oz}V@osW2}spwrf=)Z%-9ULFSwomSO>g179YU+>=FL&2I zE9H#7L8=1}^I8&mb5%X{20#c0Fr+4*R97b|QljMB+rj&F0}a+FvfUxPunr*$Oe0c^ zOY<&xqOCjX8Ql$))i)iro_54I*!M7v2{4kn-{67s9|?ook=9({uGjXe?l}6qOvt ztK~-?F=vrcuc7#zL75|+RO(BxgEo2+P99>*?}YDYIKDw5K0WiCKFTpjuwg0H5?h`k z=c_^+1fBq7K5J=aC~Ie+!@Dza6Wr29serG|rd_O)w;Zrr-|Gyi7t@TFKGhWVR8R2G zp8*u~!03P3+H?ZE{X13Z5kbi(0d4>t>ED7s*36~WS^x=ca(J2yV+Xx^jWQv42``Q! zg4Jo&E4u{>eJvl|eg-PATwtRLG{s82G>piy28^Z~DpwL#t$NXWIKHQkjt=kI@`uYV zn1Pb^mR#Q-!BXmlkPad*qhIC8viv0@_cjV!=S5}g1Bbm3G-asbYeS*HiKgTHeQ*5Q zY~yMh+ZbGavkj-*_nb5kWOo@aRxOcmEmqj{X%r<=$v=Va4jd%1JbI_~m>yD6=%M#cy*M@Hc-89rZKnP&j0HqOV-zJp%s@_K_BjT>Cp z4lyV$G7B$o(C;W5s`#kPfK|zUe1#w6Q6OG8k&(R0GrfQ5P27F#VUP@|^fS4~n@EBO z+K~U^aNMg%VqClGpR7ipX!`w5q#W4bz}ZFU2nt-L>&FFd*`EcjBWeE%$2-TlnEQ9N z6R^!r==Z`88!OzNQuqtrpIRUw5C0&dHtap|tkOi@Lh5Op=6S&s?&+i&1fz2!7oo&I zWghL@kz&h-Z2BG!5f$5h#?iC!$OpKJl(JJZn4)f*V!s}p!-gGm25^WwW2Ey}T%jRd zWMBIBxZr<~!yN-$Fu>yFV@?Kx1c<&PWQQ;r-*o?b%0AQ6j8lMZmZ5*qit@}b{0*vN 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


kc^6?N!}r77vs{>ADwqO2Em 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%0Ay#+lIRQ1xEjmt*3mSLXjI|+ZTzd58J4Jlr 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

YyuYkROn6X4-;%ZJ+lFl|^ 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

8n%mVi2eOhS-hCgq(LM(4 z{=(b6U%Q52dZR5J;g=*&M9!)<0i^qNClzp;jZfl=bcQZv9;P<)v;^upT|5gkFsFZf@qDdRH#VkcD!YQlz2}GB1$~h1Czxr!4mW4Ue=ovFuPOj zmm3|G_t^yeac9-RJW>kYJt*bATSl!$n%Xo}uSOQ6!CxJZnX(On2()M@Ta6@8neThTMdlv3sM-qXmAy~-Lz zcE)}TWB7&aV~y-Ch-l6W@Lc>4J+uuKcKe=ScI2sAmcpznGZjmsNScpfM1_+hEFMiF zjUQIc?@y+AnydM&z*uxa6F#xUqB_|7R%OE*%zJj`r8<_ZT~NuUm|{dYF}xFYVSKqi zD~qYf3l?YGJLt?d+D7wnTjT*`B*Y{0pAanm(45$i!|3Cbrk(JKe=6jDl^X138*%hzK_GA+*Q0At@D}4aamn6cO#th~|%rqv>29^{@r;x@Zt@%U3X? z)ID83oZrJgYUhaRHelMeD<(y0tCZkRC=eA6I%G>Wn*BjmmTWMM;pIQvmk1lG?<4H z3Y?vfJ1L(7Ef8iLp_7ep+l)lxkp3sqotqJ>e<*oV@Ng-~gDZ7@iG2_AN0cHlFn?u4 z*)Y68?jVbdQsMqE;8&Tq=2a*X-H8yuUzXV@v%p+^#;^S`*PCZsyONGF^1^1x2)t=E zvpt60kn>JuwDSmBt`E5;lfwLv{6V(1G!NCD^8hnOydnSO;M5n#Y*6G{5z2IG-AHEf zR_g4s&grYhCHGn>g_%?`CGBC|bptGGatYdvIMkw< zW{H~b9gyZK(XG+D5Fbj{Xu1j%HXKU0Rr^N2a!jg-@aiwNQ-PxI^l6@uLf7HbxXdz4 zyi(1OQOHd9>SRf+rrf$R-WgDO$h6pd5z1^UWzVx6ZQiySx1Bv%u1Yae{*)@hUzrSa z^x4=To24 zexoYX`1cgpvx#fu+&T0+o_MAB2*HKhYjQ%po{-3wIY+aoa4U;cg0k>2P`THIF z@jbqW?XGD3Pnuy@#cl+~m=aP8KfwYTTLsyCIcP72-wA;_no)sqc~P&^={z>^CL2nd zp(+FC9H{4n8BRC$ilgfzN@wdkg%mRKdsvmoU2fT40uxj5VOLLgna5;F_a<5GVHoaH zPwHO)4H$ESM#qUTRx3Rp|Jji?*gLR#2is@E!8QU`t>4#+ESf0*=nXeO4$9%k;o1

=5qOU_mY@D;PZz zYe`JrPJ&9c?F5eXh4({J-IPHOPeTy2{9E5x$*s=~r-AA_vg#&ois;=m z^+Me~Kh18`;T|PX&KVUh2xjs|yq!1Q;0e15i`=rP*bddIBjfe&I{CessIfcoX)*SR z9o5&EAi_%!?>3Q?CXi=hE*ORl`(v8ObG{Ku`zWWfIO~K5NW7weAGkg#pt-;jGrF5< z!{*ipdf5hP-Ka%=SfdmXltkyUoxOQMytA#C(op{qY!fsktA6G`RzA}_vRAdyH4VLN z{2frLg0;)t0F|MK!OyC|+jj`3oF4jXb(B(h1vtf!s%);+|Dc|E598r-;=@<#%U@1# z8zkO9>wDpBaIxDV4vs91+RX7dOIpv?WRb>2kn$U@$N82k>YG)d5tPtRvwrxGT%S}S ztbYSQN9!82CF8FTo^IU#0k6MJd$VfY?fgU431S}=1QR6&=KOn8Oz+*yR5fGN(@2WA z4k?XuIQ;-E57L}xLW9#5^boY(3WW?dHT3A+t?3JN#Q`_#tZKTXaX9dmsnh6?eD_2%#0TT(E$zunqmvd6OiNZqwWja6H6? zC_L1P@_hIt@n2`vV7c;c86axV$j74cWfH+5`Obbgk5{CMD}-;UU4d_jlwx&x1&?4TLMiD-+lmY@ARbF?s#Sj%|LrMez`$ zw-MB}Y1-~YdNMf~ZT)#?JLH+I?`&;$0mt`ll zS0^_wj^?@%>&4zD_8Uomn*|}9;Xq&TI|$D0Vci8$1N>-(P0;X5 z${F086Q~y=Puwv)hs!qNBg#i!71T=AKW9xi!fC+s4>_%!9bc~SIf3p)NC2d z2x(>RikEsLx3XW zPlGG7pniaOKU;=>F|y7TJ@U~QNZ>r;y%SBV>MPVv`iw3FAvO*4`rnIvi(3~UnF>KL z_Ts_P`yEOWHxZZR3n}V9 zxI?uj)wuQbP6bL8TAYWxS^F4wvo>OCZ&55FMgg%?ut_$nXXhj+SXG#BsO6z7p9lfe zOxf(56?0woV@IAh?hBd+i9`dx8wdFXSZZqOb7ys6yPoC0##=_h``)v{2{*8c3#EX( z7pOG)Ij}^|&vaQn;w;yv9M?vci0F52jkfM_P}-LY4d!U5b>69c68L_A?G}8wpScM3*%oMFp&I~Z!P8WH zANXSm<-0&wn{(#FTE#@R!gWYxPHF5r_Zg0vHL%>`t)!tJfj3s;l=}V9zpGxM2dd2b#Ib*TjZxkd+21W&ran!?g zMl^prNx8)N%o9l~UF&D?YK*djno5WOoV8htL?U9#7-E~T=#W-S&m2yy#Sy)tsut#^ zU1aLyeTUI)E1A#Rrv}#c8BERrN}3lZ%26$GC$E#n(!h2HF61eHA{qDbUc zQ5XcwZs0aFyDCt3VDC+vqDAUO>iG=cSFC+By5`$Bs^;nw7tTEng03w?c3G=sJ1B)E zv-?H;2evF(Qx?0-K};ZhX&OKcWh#&?6>JU?#wQlhFbqqzu~b_)_2P9|f@5LLl>qq< zg^pt#vCci10_nTO!0bMAajdc&`T{_@xg*{VQL^g?gSn|mL#UpSk(x1l;)GSJ!LSFw zJvC_s-aI%2tX;gnPBr@VIVTHNgW zEW5G0<~WMoV*E3{GZ@r9wg%4))){>2r&}^N3J!TT;9t9DU5DnJu@E$_Evbuo=}`ek zujd$TZaUQ$p~iQMBlA|DQ%UA^5XlmeS*Q`^Ktcm2HNa`N#FspiMoX@HFl`?=<=skR*kOXG^ z47`ge%JJ{2o~V7o2LrUJd#}uUVDSuNhC`GO_N=XtFK1QG9bBX6tPdrh9KT&TJ?>>#9%rY(m;yl}G#D zAW&kNnP}qI@eHfm7juk|V|aUT&drAb8WXV)W~AP=rC{`QKp_ZR;}q91AdluA zef(!X(4eddo#kAp->nLz1^1ljCX%W8gN{NC<%RhG9bA8y++19w|9ni*+IlDtSfXht zXw82%TDe>DAAc$g2=RF&=aGt0e%jE@CjA6V*0X zpb(J80^xm4b+!ER3c{5-=2#aKB|Z!Q#zG{&&-bUqYAzjzz&5If)A+?J1zF9Gflg`c zK4`=R6*(T=y7TiW4)-^`&8E>S$$1J&&`i?Rf zo-2&RdW`w{Pr=Gu-m2rpLyCXZQq`V)b(S*F2kFcFk-sh#^y;&z00i5TNi_wrGK{DP zLloD}n{SX^U(a7LW_6TXm9V}@v)CfA{=2DA_2IUM1c~#Rj}j)W4TZ}sR0lpoReWWD zE64lphy(rxs31y6cF6TyZICS zFK(AvUvIX>uOLa9t=JL-YzD_q*4d(p*hMl53xPP}&UwWIA-V%XdTuKL(r=-;cC?Ol%<4MnaJ* z80(SHBO!<&2(jWfL1lqI;kC7lgBVm1#mIB8a2Wv zA5Soe>%J0uFMjTZ!rE&r0Z=A94&SxL3j}Q#5ks+Up0&@!LhFc9UZMRFFK@71g$8#j zv|=!L>=xWmT&8^DU8@u>3;RM)=*&VYLxgym`srG?+gJ~9DMB7t)L^3{N+}Y}C8#Z5 z==k(*=T9KqCn(fo3-gWa%*a%Z7ruiWDLiv)*6pLe_7&;%gRF{)H%O?wLoV?{PQXPZ zcs|Okjjwbd93E%@X!i{ErDWi@lh3nx)gF#fEv=PuB!{^KdAkcpPhC7T@&ckmPZrEn z3G{X2iup8z0gPn`zV z+MUazML8+r_<=C}8O={fl|ub6x)5Usu5YFDN&eNR;2da?h1ll#At6SwZ_1gDFuOMW zq;6n{v+g>SHoKGPY78*AQJqnAld6ww z_vhIYWji9SBF#y>j)rpDYVdh4xZ$2dGI7XmwvgJx>q}=T9dWE*Dl~HDK5b(KHJcQf z0#?1BAh@ngY_r4{nP(nPU6lQSes`xCCWNof)(t1!8tFxhxjy7wPgHry;{yRAKlrJ^@%c_w1mlWM zuiDnFQgTHq9UW}XNnjCeJghWr{{);d!6;{E69N{!O)46uaH{Q_$gLz~gJXt+=)TV2 zdDu9y*lbkdRS!RB-h>^SFP;m2-S&MR`#0^+1Z%MvLjXoc^k$|S`Q z2$ks%y64I7lV^Q1B1dpH{p@eJvq!);eeYh(LO?!i6QAvsWo!u2as>=|LUbo~|0E0S${ z2(NNkQ4q=T$k#ce@ZD_NMP(Gs?=ApTa~4arbPp%n5unm?g!62JM5=P_hdb%8@gg%8 z;uI)^h4z>WLUe7PhqA_>hNeN(2_7G70GDa+rC7@Od-*=qRv44tn~0nBbd zRBBfRrKHEESM(01;aI7AfUG2f=zZy2CzOvlt4Rwui|w*>|9Xyy1~B3*zKx{YPtJV1 z7_iO!2WlFo+!pUwU?${eejr2XJO#17yimmw;q~AFY?-{2Oz+FW&F~^S@F!ssw8V9{XO$PXef+Gi=v zHaoA4kHE324QMeqDB&UN^XOt??es&pp36L5vYgo<)n@?@MJ5oQ$4KJ(8OKS3Pr3Y*>Z02_`cy_VXOCGqSJU!+D+$h z-A>=u^8xAdS!mrF1(?Rm;c^X3dDKjl4LceCmXXbrj8c=QJrXUh8n zV+-+sx_7a^ElCkMn`BRcf`#d2D&COxvTqKU5eatxy%>T@qIyChi3P$w9YUzo6 z%hvt$6oeYveln&dt7<%HQ>i-NCw$b6<*k`#-j}C89g+Y{PbMswa%{siy{gWfz&DfM z_^L0mWd5+-nkPDG0@-GVT~6d(3;rxd78&?x#FctTYwWv znen*ym`!aKnJsTSAlY|tbl#aUR*@q%VFBVe;?K;v);C$-4C?!5jTFw>;K&w3pUL^# zL=N5QKy6I0d)9dkdFYt_W!Y~K2RXYsw2;G~5-naGvmza-e^k3)iY5gEOF((D0;WL; z@Y)$ob^BefDB+@Y-5{WoJye`B^+tCTY|-6xvoQ~m`vU?QKvXtGn&QL#1#pK!{4Q#rh z#g($?PTzy;6f6bf;e{Oz3VqYYw7o56>2$@qR`>!Z;}sMI5qd`AvlHnKdPh z<7gJWmGtR`P(iMuM6zU$>}sJ}7xaMp;^yN9_ql{o_ph;$+D~=HZ|pfy5125syR@qu zA?EF~cTNQ5#6JuuwWfj0(ttZy8XGQZb@>On5A8J3rA~alzqS zTcO4g(#4?S<<;8g?Rxia!1n0WzEC*yNJ)q=k^rl~4?Ycuy<)?X0-(;;fLj-4K$JQ4 zk+oPiz!RWtvq{E@x5^vUJbjV_o(3piR4?mWu%0$w!cWEK`Gdf&O-!Nv#0o2AL<)b) z)Vx6^Vvs9?H5SHCl+TXX>E4)kWj=29M7liD<8-c+hOj#()@mPjKE-N3rN&#;pNtvn zI#B08ePQc+@J`b8et+L;DYAK?Lfnu9*|admzSpdXJM8@^8LYp|ECbcfwnCV)wIy-k zlj~DHS=}Q_h_<>q_d4~Cc@KDJpwrSt_^{Fdk)P&q=VaaGrcP*66$aJT@wsHCM>Zus zFxHj))JmkSit8dy^^EOKnPClSi3?NFw<1V>j%fk?GXj5I_{89*(#EIiHjYkJWC19<=WA3;~QY~CK_%lQMbrZ%-kb$)rD z%IzCK6!9oWe2w<3c8^S-lDZp2jI)AY)PDP0YeJfR?3=f9?l3i6{SUwYl=HxAD37ST zg#X{3@ysspjQa~wYoglUetWnHX!*DLsWX22Tg+z<9{=HC@Qi02%-1GZYku{Y=iw~? zaM8E(cUS&FjDGWXTd#s=eDn>o|CfvW-*5f69hi%_IXqP0@S`x-ps_B@Ys zOakz~ozC@EP+(5&{cCBB^8Dt#whJFW3!ZV`O-kth{yM+Bd*xdo#23mp&8&?$e)+96 zA9?)|c*Zl;?cBc?zg4I6N6}W_;2%X}HcWpMjrly(|0vojGxW!!t#T%RJQ}l?`Qy=; z&tqNC|I4A{x4=gM!>gi@@R&+KJ!%dpF-*bE!iaZ(f+z-{jq)Ir%WXjZ#9yxr6&l`w zGR`zWn#O_l&zrr_M$39Aods+fim6im0CxcuCJsYP={|sCr~%~bhS<3RbPOojmyd!) zLv2YM0N6MUjigV^se)Fkof4>MAL}G(n%3^gpOHgISb2krgeXp&prb|`E3%YD1L7BL zCA5W=FQ|#sgB8T}fL!Mq)K-dATUl_c-f>~8W8eJVIQ;Lz%*GH9=lLJ*+Q<|Q`KPh& z)D8eG#RiWKb3==O*|ur0Awr)@166$^kVB%MZJ#*a1+bGQP}$>|Fsx_i3f+q_-WLOi zKjI)*$VxF)VPFU#v<+|5mu3&$_>P)`fN!_kkOssMwdETM-=Ca8y0~_@LFL_&frotc z0DpnOjxQRslryH(R_fe9S82w~y3q2L1q5A|MYATBcFA^_>1ittzp=A`7B2ZUWtBV4 z(V@QK7>%`v62JhxP<>heASkd!52`S|5p(nsl*a|Kgi>?sN~VZ5_X$g8bE1pg={Ia! z0%^=4#h0uMaKaA* zj$K$MINbVEn*{XH?NkLqgB7L_4Cu!KvRe;Kjr9y2+O-u3hH|eNyrOWQcnE-m#cv?a z{Wl360LCRPg$97&w0ED%bZ?Yo-R{e%nvRg`HHwdL>+_1h+b|vdude_uj${gQ9qc*B zD5mheR$KTK0lt(07lV+vr{AWgR6=48x-PV7P{_gg9%d8DSaK2L?T~mi04?bGDQ;j7 znD6Wqq;Nl}G~{VuF83Nj1r)i6fS~UfpeU<+KhTd@naQ{fpdpY-XO|B9uXJ@_PdXC& znz&7ctSvHCmjU=r+aKDy8V9F3uV{gZS3MD&xIu8fg9;kz;zMP*+h9Ae9w{bw0TNV$ zB<)<2wSyD?$+dDNHXrTWEn*wVd=f7am4L-bAMkpp?GWq*yR7RWrjwuZZZVFu9HqWK zM}W9tUstg-lGTANH5-j!rmT_nEEQVnw4Q4I5HM*1`Vr*b3l?vbMwg zEO5E*6+SAU;czG>f->n+cC6(4GdF1b^3+I4Bw>m9@tJ-6?o=S8H@n4a&oce|4EM!v zbD(?u_8tlvDqBP|W-DU#ziAPB7dKZlS)a&EO5E-&HlChVKLOAbibJk%+@=6!o+t*4 zW^HM>B%0i6e8d}=4oNUZalRAuCPiZVz+?rWB5J6n)lBbSKS3%x2B8yoC09ZdlLRLs z5PO6S8d_)<|30u>8`dWTsK1F7%W(|dz`1-x45)O$Ye}<(%D+pLd3k~umN)O1owrY7 ze(US&Svdfg6lArYvtHCI@dT7EIaR42IXE*$CZYN;H1lK^3z@Af_EJz2><+i41DTCE z3Tmzs*BUa!Ccq$jdy(%HSbt_5D`{x~8V73nV5jPI0}-$*Ww&REbK&1oH<-OmF*M(! zK-GBb3qEDEld|Ii|J9!+dGQTVAts*c1G4}OmD%A@U|IMG@5Kf0Z?tmqLH{-5hyRg7 z_3J^<6xHT-YbJAZ-JezWfgHCz7r%gk_Y5As0xJQK)Oyfv(Ek7^(L4{e0exTS7u%)G zg@g2*ozuqD7J|-k3u^Zl8k%CxIm*y|przus@O z2fB6?Z2i7ua6^%BkyjxmjuP9y08q5b%>kBCHEVh`zlc!K4YrvTp6VMB>T0VlqMC(m zo9Hbi*pfJr4b@@-9>h48h31gZ~^p4(7+ zVL^2t0otj_HF1IdS_S=6FsOD*9yoicQQB47$Zu+G*9pL}^v=zd>|v6k%Kcmyb7y<~ zCL}V2lVaJSK@_J;S3FOSMZuS?7J(HKxpv7L%s*w=XP)ln=sH;>-LtfX9?(&iFf`T% zC$()opMjjdnP7-^r6n<0MCN#@^7IymiZ24+R9CsaFP8maTuKs>y0dM4kc$Qe<~=gB z8;<+jS13L@4tlY-ftDneU8yS#b}i~#k%XUn@^Z|b`w{S^op%1X*@Q&x+kK5U0A@Pz z{TS(lbU?C??EMPqWW%Z!+!XGXg|t94k@;bmpEEqa(sISaCCTQ-=&JkD+yJ#-roWuw zjKL+!8A<~Rt=kH-t$Gb9e&Y(1Jq6;kO)_^9pNu^_1YbOKPMWPtWM&!AlFbMV0ib~) z79evB_6=gUXj5;KW1S-PXO3|i`ezjY132DlRq}BI*nglO^~A|a5Q{`f%MD2 z2-kX+unYbFBk;gX8BHth>xHJr`2jTKuWj$Zl+NA4JzK{Mz8;MZ{ov7HH2tH)`km(K z3Wz_h0@wJX)blpc^LTN``2^TVLHKVYFo!Tuk0K0O$T3fw8tq~M;0{e6Kz-N{A{1y8 zVFQIupcy6sJS$aw=<;<>)zkTGbZs8tUZ9Qj09?~rRH3iee|Op49)rmUO8%Ylhj9;?znQ*R~0xT~OJ-nEtK$d2Z!-z&$lV<1iS0Y=wGzs(Et zDot?$3IL(4VRm1GAALOvl#2k+^Oe=_1Vo$wjRn2~9F8;H?kr`UPB0}1xK#p-N!HZ7*;Iq%Pmcre zZ2IfJH>y}6P3Ib*m>i0`mr|R^z;ahC1E-g;aE$QC7^ci+S!glSHJ=%n{hPvUxP>rd zcL8We>oc$?m%fJgZDxH$wnY$ybg7(ASgNV4cGAB}su3&8*!E#S_iMJnl03wqL-_!Z z(2~b@DG&<>XrVjnuP4s6a*-T2KH|Ekb+=HUSIel-I7e=M7of(;(&Q1=<}E4LBw^`u z@J0Lk0Mu=D@r7?;P!}{0wpXv}8@&sll8jF}cIm$}^Rs}+ev(MC(d%4Kx8WvT=ji?q z>S#EE*RRj?iwTGBRGRDJjpSv55&O)Ye4d4d3f87TbNl5i^_34ri<~9bnbfmCYu|C9 zQv=5y2j7%)_;x&#-Pznn{zJcKgAMMueN_R3#_R+mN?BiA@6~0Z64hPvb)8S6akE{7 zoIcU5-PxqXJeeXrNjV|>9;P9CU79E)Xm&_9PLbL}3yb*CESbJ1pVl?4u_caOgua z3ynjp69sOSklumOup>UVIw8ES8Ax!5zyL`=Qz_hHs1B{W-jE~kEL&`dSt9GSn-@A5 z8|U3T*9p=gik5+wlU!Xa;Qy-}6Z^y^4%T%;(;Ir)3Tba%yP{)DYvzG)z60|G`Y;E) z_`pznQ`R1trm{I;|1VKTWFL;wNce%puKDsM(?@tKvrUhr5sj9A2Z~$we_4i|TQO^0 zh7Af6@;UyciMfvK-{r0oi&WEyMJB|Fz`rpil`mNq=W~{0aqmeLsoOB+j;<=}2Yq@e zix<9=)ZR8xNsf{KI^~7XE#Et8I@Y6DA5o*+ei9XgYhMS-jMycty@3#XoV-`KX%=hF zRC?Hp*aRv1*tBnCjkLd<)DyM=6 z0qC#@o#7-P9QoP7r1l*c{n?YF%V2nPl%1F#CdI&?An(_gliKWs&1r$ERYO1D999?5 zvr~ASY#>Sg8-(`d&=Yugma}HU=Lj=%!sMQRo1yE#m~gEh?0!BzA;!=3FAblWD;K8ql0!qH&~*=qx}cDauq%i9HJsEvLiQNFZ2dW|Eo6lDLy6V%$ z&Jc&zTfpR?cB-?$zC)Y!5wwd4IXw;rNKRxby0-g(-gg6(TLaA~x8q{l58>u+gZFiC za=TjARJ_v@Vv9viDbIX4(^du;YMix@+DVcKz`J8-;nD94${>;#_+5i7!%7a%y*b64 z<1-!o(Txy0ST0X^5R=h4FZM*EGP4Ro0ch>5gXYMv({d_U3*b0GM%*SjJ3-S`5gf zuzNom+aw!A3_y`D1l%bBxkx>*^9ochh4uS$p_UT5PkC#N^Bn-JJ zBXrWtgcMW%X;>~jz5_z_*jYf6K?*-!-q#?_emW4PPxT#&kQ2c)l<8&`+go(bOWheK zXTJ!rG<0pE1!r4&4?K9B>!EtNhD>aT)9IRDH2d4e{L?|@egoY!9-80@Ri-k&kxP*N zaQQffBJ#kt#r7W3r*#aVR>YwJE_$J_w)|Wlg9f)WD9))^fNDcf;p!4aWO50-O>5ZE zZ&V;ECQV?R!0s5jY+9oY4^B__fgN3L^K>*}b7 zFX=Ec!E}v6^7`K4c65bK4H4k?(Fuk~#f;k)kjj*R|EJWXkLEXux5ecnFeWT@P@U+f zmqtrhuvnvG1gq?laKWi zIAW}?n}6unCypUKOZ&MNJ2)UvGtze)@R1+i5jwutPbGz0{Mz%M(^wE08Ns=aZn$C5 z|MRm$vtoMpFkF`JEp8>xs0igKpfOc06+USWYm0ixQCuC zv{rifzz8dNne-mSQ31C}1>3I`Ui!@~y}Yb`xA=0+s#;#ZxXAIu+(~&YdX^&EwQEzY z#()2axq9YCv217L$?t z$8Y#mH19(Q7BL%@|Jz?#LFkZ&O1LL~$0bbn@n2tWs~GsRw@LpnoAW!{75)ljalGR) zXVzk%e)oFE--17T>DK-`*Rb|Uk3R&bZ&lo~_3yxK?XUdPPe8Q#=hA+ap+A?lT4Dca z+OP5fpizG`ZIvDWV;-5^!2e%;TK|BI+uvLOt3>1%qw>eUt@8eVf|6BH*q@+emG=C< z5R@#yM|*sp2$BPY7W&NOH}aaXZhpeLnWf*hetTxiy|d=Anipcv3cb5kr!nf$-UY}% zqmemU3ZyGp57iS++`UnM_4 z!>8Pr#7QvK@&4!E|J#4OK!L2lof!Uq%nCMv5)!%pGOXdhJ1h$T!@tUS9+%tTIj+PlSrNEjJ4Fx`aMwOg@=?u} z(wluxrK9b1X*$^xVYkEl?CNaSZkYQe_q*=28Blpe%zr<|++wPHzd`r#_~EMRiol5oR|2L+uQ7ei*27=bIjBKP z{qBOB-+}QEX6M*=SDj-UW3uLeD`xYysPM=dBk>*n>v=xe4k{nSUG-0vm*tP*fiZrh zrGCBIdepp?Yoa*7czJr0)1z5?Us%EK<}}u`#6fMX+Y7qgJDE@LMP#M%tAYJe%130( zcs8O6)3(IjuO$w(#*HLeHFqDtZQ)l`<>g#)fiDxeHVxLcZ5f(aS+4b_q^H>iuVo|u zCBF}90Ep0q6Mp-gR=uX#BX#y|@Tmd0L3D~5e_fbCklxFpr^7iL;RG!cL&I&{arV=$ zM=mD)RTrT?^~q?|dq{s-r-EUYZK0~RLbL4N) zvut&C4h9WfzFVivUuNUO^T&?L_@lzePh3z9L4$67s;DhHd4|r13QzHE+BAq*9-!W< z?))Rk1U_OkC}l#;D1bZpAVP25viYUL-LOj;6cihlp9I{|fp zKR58+#FTWk(cN( z2~WS~$p=^;#L~Y9c`pp#cO4peFy%E);PvV$lZh()UmgJP;92g!6Sr!aOAGhKEDpvB zU1{+1&9;Gor`C2w{9kf5`eeXfjqno}v#2rllo2=h$Ysk#Wr5vwwg!U&e%du^D|GTr zYWkt6BGp1wr_wyMFE@ErqQQKnjn9B&AN`OJyXwcmm2V6}T7ngxn6eX_sy&(#4&W_$ zwjblsF^F4odn6z6xnMX~UhoK3Wp*TQA*5p7VR<$xJ0hyWM(e0)ceI$}@4xi5I{9dm zqur{AzkfgL3Nfy*R)|4F$$R_f?kIL-b-BE+`;s2{CBOlQp(u$mmvEOb7EAS3_8NP& zh!{65Cml!I$oklO)n^W*PAzWos!?0$u^F6-i@YY5wDT7m^&gS@_lq8H0i`Ty2|H$> zk+92C7Nz;*Q26pDd`*WSf#3!esQxpQwg}hL-PG&jR9#e^PD6 zkc>z`3?ZzgTTWg-`}}f*`P58S-JmnQd#RXSi*2=ECE?6BbbaH7Y<1=PFVa`>I`ABr zL|{wAR~95KqEte}1_t;sTG1K(jw_fKVFi4N;j@vzcwmbZl4iH92^`^Ly{g zj3U7>_+nblRAZsl&@A@1b-&|Q&`q4T-Onrz$5n!oX+WasaEnKhy9Nf%(C>3ae}Cf0 zF{?e(xN;S1jSa~}y|5#+5wX(?%3gMthmfXU5gLW#s(ToNTO{kOB>6M1$^TyW_OoIn zZ)U$@K8m}Q=h(X$KT;M3&p222eoQk6fxSJMcBgMN$DdOVY(l;)yC~o1r-B9w6Q}fx6fzO=Io?G>)%nGKd2MVwWE)W044*jd@7!{CZ#3PH|mg`(l;h$npEtvKxNFU$h=2#$EkWpyo zmyq8nCoi)X0e3M}&Yv|}Ce^jqjmgcWS@1DCtyNmlvg=0@N&e%ivS*MjyYl3Z-h~YK z!fEB@)(`R?QsC~(v}nUlM1>}=lwG5^4}BPl#T`o@?1;)6>`guazOW1nmE9Gzf8Tn< z|8naRpx$kpw}*Kmi#1*JN!3UA(wFgXusgz`nxhM`XUZ1+k(pqe;LFKPu9P|3CeJY< zg}B(@I2PIBKQ@BTKr1@$jV>I?Pb+*a=~029-C7p1^i~iQzvfiPe7dWS;kXKTg5i=q ztH?!;8C@r1^`<6UHd##!>{m{@kdf=4Xe;|YvN;g>WW1y{Ha%0NafqtQQ&4I>j;AT3 zw0;y#nT;(q^S5DTEW40nnK?f$_iT#dtObC>%Tq!OH$#3Espq~9zm*5GyTA@_xPF9b zigG;*P(Mb1y_a$kec^jd2<&>H)8MYxIU8;D0#*|2GzCq2GNe2leNZFaB`4>L2pO)K zg-)eku=)5Z66*!$HfTLO{d$Ei8*n+~i z7Rn`^!zNVx4nMq*!1irdB<@t_NNd{{C#1b$Vl8P&*#?CsWGvbFc|^KtDK?p6wN=sM zEoGVM|9Kc#L}X-53;J)X(Eh(#1s82_JFuNcR!J+5=ww}AH+PhBz+vre;o&;Z?_)h$ zV*koNayaq+`?fCqxC%G((yozj80rZBqNh3=~7 z=tfdbl=0{(^hDpWvu1^`-!($6vx8?j;^MygT(~a|4A3e{!2rEvH+x_r#P++nW_kj=7~dO~2z#ljK>mknG=ur0QTk$F)4{ z+Ny8A%91lVIi>4e>{RPkc{0QeX3o)+K4)i%x@wuJ!_c#2rQF{d?3eq$m@9a##_^fGsia4ZKStB9 z!}&D^26p-4)_)r*Q`m0Wq1IL`qvPYyvw*R0YxVH-tbYB#d@6R^<-yp3Fsp&GsS11l zvFXJ;?^9m>jKz;rhLZe`=@*)+CojV8DeEi>wzw{q`O`5=-H4@;S_6Wcd4UQpnid+s zzC*2i)=2qUH#LEK%gxTg6#qkh%;&O7u@ZoXQ)Op10Knry$rq=Z$Kg2v!MB{XB>OaB zhc4ZP0!-V3TQHpdkegO-9QlZOMpjnpj%@m(A1W-W43KBKUbsqlfl+{8kbbq?o)}jP zpMSi~r*=VZ-Z^R$yjV>eu_xYt!gfXGWIzn6ZSM;XH?4vSQ~T-Hj(7}`zs|T;k(^<7}<;AHW#xkyFYB_R9>Kcz5uH#aG?d4Y;)9omg zHqEv;@>>gOyyg3OcdzP@2@CFuc^o6P>zY!)23A^pNS<{vjcubc?*F;!j~eZ?y%p^GAZvB#)$lof92Agy2$ z1D11KSBL-&1T3Ysc4*?z_(A7CLvt^F4Ryo>!`>3%Bs+I{R!q9X8tPS~42YAL=$ z;9PkV<&G(kH9khritjqx5(k@JuiW>_3H3XPb_ieYk#vl3R&^EL7;>S`Mq|Ere5FOj zkT%lQtm!dk>(GV7r*vsh$5p)*S9%P+&gyhL{8nabJ5s=G`IsGP@yLeeiKW%!N8F#qe^b+s$UXFO{Y4_@Ezh0%wc*~h^~y0%jY~`+*ZwEAKO#X79DwYB`o=e_0MeuIGG)&l-X` z=Br4AmU+y7URb_gI#|=OM7{G{bu@&S&kX2GD#}bR(imI`Um=Zq2a=~Q-e}7&+;uC* zUgyEslAB*oakpXl6+6j7P#YP7FD4e%*o3W{lD$ld*yK}JYEAcJKjvKKbafelD3w-S z?4{fsSVn!u_m#=vDp09$qHpcRH{3N%8|xb3Z+WTf z$G(FxT;wHpuR3RupUE09tJ3yj4bW&uH}g#7F)3pI;J=DW*mfcMUmtCBV$bBIZKu3h z=Tf2)rES$!kda_#iFA(a^fq^1PPN1;^afI#as`xBQqa!Km;<4zlmsJ2!J!gQdn zjq3>mzpv$YZW#J6-IuGzV__agClbAkAB0d--96o_AIgReA{a$pwG}IpgrN^Y<54X( z=W7u;Oa7ln{kx{WkJ)97WnyLK+vT)t;C@@MF*pDUHf?2goXlQW zdf$_4f>?&1-~O?>k<(Sf`#r|=3Jhq?{2u$hbz6+eS@iM2$=HagXujC9Cd2b?y`fuO z-MPUcF6_2E)aKE^sezun`N{Y&&K;sfNWJ9SwYGC<^K-bm`MRJ3HiL3%g{tF5eR1NW zOro~Rb(wLqBpcS~`CeoehvR2hEPcO6cn=qF+1w81JJs$UVRyG+uM2MeYR=^`g-zW~ zn)zxWA#%=UzMUZ<)S>hM!yWD`)qWlSx@CbPN&Dc?271nrVj`wcM!3MHNcof^x-f}^l%+4HUuKvki*z|2%Iy6f^Rani-4(+lO8T%+Y|lz$j(QJ>|Snv$@;IZ%eW zgzxZ8@x)*2u$a@}`VJP5;^yA(oNDh89inoMhw^yN6&)K}by7@fT^Vx>TxnXx4g3YB zUz6US3+v1Do+?=Rp{Am|;|fkXL*0%eN4pIOx}Bb%hriurQ#c#efgELJ zo{t|R$VaegemYq@7;^!9gVI9SeX;YiNdo(|@!eaONUjk9rE_+UpBVh5SWyr`qxe*guL#oxzi$QN~Bpxp1cEcDc#|pRA1ZUM8kW zDVm(s((96ORtPq66i39_OTJf$kf=3#JTTDMY@B^|xo>$iVrm5^4hol3R-q0FTSgia zj+MMAK(~{qBS}8~PLd-{TOS&0{QfJnXv4|+kMYMQoK1T8=67XnM;oictM+@P2e^Gc zUsB$b*AAhKWWR_J+F(xmwusQI@x9iH&jjz1vmBYU;2L9KF+PwVXFQviEoH}G@^U^w( zLwCE117#}{_UaMz3o_Afjj?Y;n@2ttK# z6Ar!wRurXpl2fdRr><}5Ymhf_HoBzaw@!!q(3NG8rqzRb`Wxo>1s~~&M%LU568Ng% zpS?N7v$ns?L+XUHN4UrHl?iwDl=NIX9}q0k+c3%^1yK>_J0=HSsLh=3F7%fdT&X`W z^~vx67<%LeaDXRpA4J-AzPQ-nisC}=JeJ3DvEJ}zA2uMZ z9VT?l_}#%kN>QLVG>;48i4)U(v@k)hs^#V7KXUCaRo>L$-o&Clm15D|$=>^YH})Ma zdw4ljgrjaSM5?&IR=!|CK&m?*`GeQ15vHjh8wu3<>kBXI3p2Z^UfdHypXobvxX(lh zsR;s#qHu_aW~2P?8l0d_3J|3vKN#~Uy@ALk7yFNI zW1iKr9w{|xNx6nI_h0_{LM^voPq2Wb7}+28!^_=WM$m6G?^~gx>2j^}@_8#_f9C1x zJ}}fe2>5ZL~3fJrOqjewMH@%Z7>m34#F z&GWTa@_gOJ&vrNNH0-;CH20qVTub}mP)5r;f9XJ}nSaB?pxJ!RZ}^4oRuZ9*p`>Ep zJafnpcUCy(3k^(#R~s@Y@Q8B1`Q1Ui3DwSv+9RhwkU{o*#Ln;G-0mz6p~EOy{S<}W z5+=KVxF2j#%IndINm2t(Y9zs_5XqAS|TCpIjTJgN-@7 zIx4gJNeX(|ippS*9d4xH$ab?tCC9jPj^9ngoN+7X!s4p^dZ~I-uQ&sRACBk}$u=?JM3 z)dwLE>47&G0OmVI+{F<{inj^%^VaEh`F|*T@35w}rhV9h1r!Ao5tXWlNC)YiV?#ke zL23vfsPx`Th*1#`0Trbem8OI$odDrbMM?yuNbjMB5+Ky@Td_P3@q16+@BQyw9Ix!X z*P6NKo_l7^sy>1}Ouf^Sy=_RkN+aYgKAGi1oU5yA%^iMjy)PJ9!Kd~0MHxYiX$MAQ zO|~DzotFQaern3_G|%P$(_>o68vT0Ds1ld4I|A~H_XJLQ%E+ovpDw_+%svyNbr7Pe z={k;$A03UI7tNII^Vtdz-Dz4q`%wO9r#&>;3$V*6={BW1QF=acl$djr4b{g&P3MA2o4%*dbN6P4jGM8SQZwz+l^u~EyuJ$E={uYq>Mj`i zGK)Lcef#O!ipl!DKCfQ&kRkg+{i&HnMN*0ztznWq6-#fj^TAEcNl782;XImkU>HXX zGt1yycP`iJ?03d$KyIJzr#(@_qqrD!%~P5UE0}4zrG{Qs3t3n&+3qlrm~Q85A|0CU z1GoEzFon9<^(*>6(*7(1YhLX%@GNtwb}TFN-E`xXYr_P8eKDa;GNs z+DR#pIE`!FB8^_kb)W0$`_|1N?T+K(Ne|P?(#Cr*eKWh3v1y49`)@I zwYy6Vc`}r$pCT3@H^Vj|os-CDya(U?3}<_bvI`zLAxG8auVV_p z1PN*9vCnJJMpX+mIz&wjYS?|zS@5|;919$@W!=6bzXgr1PP~9 znzM=e8^e<(e!xPy3Sfj@_r&KsCNd{fG!BmsQ>;u*Bm=o5&ezVK{9f`0T0dY}SEvWkfXXB5MGZU9p(YRJWIkqrA^eFb(!UDDVTf*u{zpwy% ziTI8EoVk9v`u=ODkPLeFD764INg!6yf5+Kqj`)#fefso08m-i(=m0t}5)vAQe;@~lWkNyV zw$d{j8|QV0?cDCrwN2OYzKAQzADLfRa8!h~6FRV^U~RvfSD#{lx zcY#hNm|;=Bz9zky&HQq!sBVU`QTiz*UO)L)mqx>TAbA?B$G0sGsEp=f!)mhjrt$Q! zk);lQh;&h;;=0SMe+iTglsrvUy&mAOu}>F1dKlN?hTo`1-x zL}-6ti6v^8HA|J}_?zju!((sax8o~rqT03&-CWr;%aK9|DpP91%1~XG|na)BRzj&kx19tPHaf1x*T|5Y#QF)3F;d?>gaY zK&|Ze$hd%!9$yS)t3A}9sl-+v%7i>8RRk_Y;{rodqBS9#)2ih%mc4wIE}+=XdpNEL ze~>{53|3tP*R(3pf9yxk!{&oYw=f+&nuq{incNYeHvF~o8`w(g3v?|Y-@j2%QqgUKGV@y&oDMzitB`2t=_yT` z%2eADF9#VXjo&HT?4J+K&$jQ_3KbDCj)|o>`k~`p+ZY>>~UA((7)_s160~b>e{A=91@o&qx&L7u2K|-`mJd z2%2FIVUu9%@Q7-`Z^oXK_q&s>E~WtbM&yAQr|;7INWY>u&2Wz5pwIiDIxkFUUX*h~PwbZoN6t+jN8h_z5Es)bJSGRE3vACvdSPU`WD)iw%c>T74Q1_mbcB{jFyc!rpq{u zTp9M11_*C>*>AmE&1~l#sk$|LpjVh>O|HOo1(=sH?Kb!Cw!fD{O#V-^oXTIh4x$}y*TQaV?UvJNC2^f zac;vPx1vV`&i+zDEBDhR!+G1?odAq8V?8=8;gt%(SN8ryMG2g>^MVA>7B-r7wtaJ;x72*9?D!W2f(hMsl!t>am{1x< z8coR511jQ%YUs9pwh-izA;0xm&-t8vWWIPv!WcJqZHbIV@N~^T;Ak>5%N&joa z)o->tcXFyEN5`YcVUV4gjy2G^xZq}Fn6{%VOb}X{fAo@&l3uBOze~9rOr@+4E$7a5 za)(xi?e@MJh}FnQj+lRZ@E)i2?J-*2K`&W{qBl0dqlkZ6*G4>6Yr7X3ipNW7@s=Jz z(U!t2X@n_iE3tRhbU)XLb6Z9P_Wifg!OZods%Flw&P^15`ajcC9f?$ojmP45PQD=r zSJRe5^2?*`i-t!kb zJq1W6cHGQNFzJ%XT;NkT{u-Vh*DfwD({eCm%PK2{0c=T>b+c}>uJ|0G`Th4S0NN7* zQR13eu|crXdS{W6{y3|Z5!TZhXU3;p-sojCxNOz*cpbs6^77v9p!Y zoUQqmtDlOO;8+`R^I1&p?jz4@9g}Mk@bBULb0(PTwsZ!_EHUcZe1@c_K|Km ztp1WN{=H2bS0R!gD0Jm`xluuu$odVI6Y=;R;nW>EU##3u!6uQH?O{>4Xy&ZCQO8B|3!KblHX}5k$$(9F` z2OU!2_uD05K+K-%?Fha3*T{0P#_zahDoZt$$c*_b3(T=Zzs@85W@XdCvNEhPtF&V7 z**OE`ku;tAGmla_AeMT1#%~G@@L`HBYJGX@F_Qw1a^~oZ>L#EH5nTd z>{nagC@(L6NmN?!Cl>LAlz@4e_~G-0hL8PsgYNOY|@Tz-O7)1 z+G9KToPVR4CD#kTQ;|DnS}64Ajt3te{Gyu5YC~fU;hB4!HuTcBGTvVu{Z+Y$daAs^ z7P)6pd`R{3IjGu6F{dbai43Dl^y8o5zj$Ncmchuh4>loc4?>M+ftr3cFwI0k(oMPe zG`oG|dS>T%{q?z$?Cxx1QKg7w_e3%IxT=$+iTtNY69JPuKu4JF>h`xZMJAxe1|9EI zNZh%W0Y$mDeGv?x=LiLYTG52lXF=*IjM5u<`Ww)GAeO1*z5!|RTNw;;@}h2D zE8X7=nNJ8&U%`JaEtRimBb0;<9{1=sdZL@wec-@>kzkW8Gmu#;S!Pnj>6)(Bnrzj2 z4sH&3{JkUZdg%LrYrFbO-Pq<{WOl`AUdLX0A27|?9Fw4si31a26-YDxWYMg2ZAuo= z3CQg1Y&SV@OQ+qwM97hp$Dtz%MrcO|fvE(VCAwx*mOi3*%|euaeli0uu33;OPA~`< z?-^NZ8nOhmVYs_sXW1a-G})K@QLQo(0)Z^DG1ifT44Fl2sM?KT#jJGA9#T3Vq*o;B zGXm!pE#O-|i-aBGVDR92{9q927F$ti=_m`U*?^}{M@Tn$jQR|28Yjc6MD6A1undol*7H>5d&Q9S`~+|XfwX&uesoE9TY7a- zpR-zqe(u>wBgsuy6QBv(_G=z8O0z)vWMLEGiU~W5;Z936YhqzcNILqJ3|?JMp+_AZ z1U+wy%m$=HW@yY~XFL2_uafM^?6L%1C5m0A#q#@0g)zO(e_TUoI%WMiS*(KUoM zxTUq>uR+{D+pVJBscu~HNontWEKOWPZ$7!KBI^_U#xB^@`lyzj?bX11^JUlPtS}+E z!xbmY&CQ+0KEJ&7&=Xv0>eTPnRWRWLu1*;R11E!tM4~Rl&`QdVOo1FU<2L}f(S6}z}D~%+4SI{=Rx@J~Ly3qb8r$(20>QqU^Mn|?}!i>Vam*z~# zD~Na2Qu>#W1xLctNUit|yPFy4A6~`v!POYhyF%n*Cy^}e0S`=>TvshsM9wmKx+JK2CqC)s-Fq1tClAd{-f3xoW%s2h# zai=(9_htieFuV@X00}w{MPFTz7x$hoD3H7Ht_K6IZ+N-tMT&;*c>b}t^Xq+BMP`6mGTEli zsNhtrH}K*v&#dF28esh#U^9@#IR`ju&P8x?E*LS8C@_GjnXXOI>+wu02ZaLMFxMNk zG!H2vQLDZT5ntQ2=H@bdOBCC{4KcGEI8yRa;$ANc&uD{QXx)ZHd9JS$<_emNY>EDm zup<%5E>rQ1LmGWlf28625iVJZMj0o2Wn>wEOi|mRU0Jjxag>t{UEper;}EPn!feu9 zI)Q8FsNluv!*NU=D%Y-^{(E4tBv$XjgzDd;_-)m{ho)CUJ<7OnV8(bcxH|#@wW@F} z&v$m{NyE##1B$R1jqyD%=`g_B-@gLyk}mLY*VsCFX3!+YCOw<=j(z{VxCNAEy$i;MJAWHRMJGVY`@+Mo6&jR)POdrZ1Zs;Va3rVS;` zP|wfjk~Trj-p_)uR~m@<=Z{WDveiH|UVTd}dKB5%UqVm5W{yXxuz4GfU;IN|S86Tm z%c2776Lzkupib23t1QB^wIAk3*{nQU&&6%njC@mDmUHGDNX@{|r1Iiv#>G4{*+2sz5fQibbs*dOra*{=|52g(O^ zLywLy@*gy*R1a}WzVR&kf#tFb2by=lz42MGO}oYEzdGN&d-wV8LF>R(FxS`9ch;N( z^$@8pGL}o7C&;J{`AL1t;@0kT}<^>Oe3*fLZLo> zOEKMh_S%)VdARp7v)>Ot3Qge-gxEFzHGa#| zD>RNpeWf`D^rY2+uH$Dpw&J>YD7dA9%duA|F19LXj;eB8O`RZ3{aE{<7Z~&#G6W6= zxD#};8tOkv?nej*2rB7$r{Ftm>mbaWhXQp@eJ^+M9-MQjRpIMMY-5F)30^1R}g@MEK; zGbwQkn^M`&O}uwjoT}6P8M)WlCL*T2th4=ewbY@|^h_&FB!g7d?8m`B`vZ0hi9;8` zk;aO{#*ZN6ULDQkIr;H%uFc?7kBG&LYR6j(iE}ZBW_p}`a5gxl^#KXeq12F$07#dk zqrt&shDA&nzQ?oiDR*l}w27%xa7uOE5j{-1MM_TuP=`YPd9(UH71aC7Ha3E!o!_6b z#JEvfxqSoYK&X;BIB=g#-7{U?#}1#e1bwp)wy1c=4CrW!XkigHOPL)7DHR}5eYU+R zWzw$S?{1KLD0gn@#H4^$P2xu7O0HM?t00!<`HMw&Fxox^g7JF2({)la70aJlNN2&E z{VAPtMM&v@(;w>N9!_NN7Ig$c)V?e#EpDjf2A#|kx?|K8@!;lx_R(P^6ff5-I90ZxF=L%>H@^60)M01R6!Z%P^;!Q;^2jXX zmmv?SgR6A>+9#n=WYXk=%R?d6X`?ljj@#clax5e`V^q{T5;kJCk$O#G+~xgM)!*&t z=Gysc98mWSGW0JxjAS9_%Qw7kyy=K(!`?M}KXJRHP@4S|TdbP~GFWV)8b7|I^ux26#wv}2u zGjV_XWhgdK+0cKjouljwuHydGl|5y+ay=y}()$c&s0epSh82}NT}<#Dw`7$Ob=567 zKxPJitWBgUuobNvs9zUD{7M9yN-M8sD;gaMo{-Z3+fky4q$e1_q-mQQU=|iCzH2xg zC;XA%^Ef3mwoi-hFKnT;y0xaA8|j~N@K5**wU#f=uAZH=r)(XdV+ws^LFhkX&yR_DKT5|7gg%1s#y##XO14H(f(Sbw&AQz1 z%PZ~JJr=mk1DCXYe$-Q%x7Vhtp{*}_@nx$n8l2_Tny{e_&{^M51GYf818-yi+aaZ$ zdXR6v>pngs^}V6v#uR(lBkzC>c;$>bNd~x0Pb)8LvOR}xY9to4*^C;xAzDh6EuoMY z&H`-3L`Ck#LhAjHDOl_#)r=mYuE)j)bRACBpXEuyt@Ds{ao{}<;T>BzK-VL(v!Sx|<61T2`%c9N#c|f7@pXNKa=N!5s zdR<^HXi%3Ci0ZOh86I=-w*}!-)82s5!+tW>^Zhh7)jNS7k4^G5w&N$f32i@A6ISjh z9lBg(AS2h+LkU>|g<;;S{xgr_-2VOwTF@ZY7+CXmuLJai zO$0`1)6j4tU)h{#Lao|FX|kB}LdF58X>K;aQL)@YI&l!oGyfr3%ZPAt=(Uzo7hMmHYmKab0{h zQ(ldU*;`vF7?mVm5|CR5#}M1A7suyuL0G(nbk}!^>u?pUgF%gi1lc+?Ra6$1^Ne;k zyu+hzLD%xK1e+szTufZhek)b_g~dEt-QV2D59aHhNzmJHy3voyDjdh$IL`}rcZLi^ z+Qhmk4Y$6M`I@r|9Qk!>c-H!G`hMhSX%w#3f^x9bQZdo z6FTs&7&mY_j__s`P0X7Ciep6bp$$j)0kh z>?qJjwb*NKaDqRgDR%2-hlt~fJluHc!;e?c3Ek8@QqPalH1wB7Q7Qs8k+^WiQVe-1 z<$)S!rsCF;4Ud^+@pY?I5eu0NgCicD{Z~*i-;CP{C7QN@C`mzN?2TTgb1!ty5SOVP z0#ObIvN8h3MBfxF=yEOue$s5g`$i+(E_CymP9TeT#cwT>EJ*weB~2CJEoNCzBbAVN}|JlTDbyoON=pQ@5YpZ^N{#aL4ueIKzX1 zG=81S@gFn$5?e4HHlcYN3+s=dGH&x_FfZFOKX7E=?ntNZHmeRs`|igwQ6bU2xSQ(5Hpe~bYf7tA#^ws0L=T|{p9 z`O_v7wm;Gval|?pUtGU|Onf};wStcXyw9u7*$3avS97YKf=if6f;K`6?XEs@^Bkq( zRW3v7!;0OJPi3@k%OporcNC2GfY^oJ?!2G-V0}xzjmURQAMo|g%;^v>g%pm&F^r1) zhlI4%X{-oXfh8~x<$r&A;XYOLU$L2LQITX!hNg*h5C&a1f9Lu5*9V7;CPrO@mYigT z1H{_BdZtM{xN-CSHt7JFTi0sppD{6_#6T3Az4F$a@puu2XxanUNjxNgkm3X-|*Q?0_wN6Cdq zZO+U~Tg0NQ=QFwjQF}fohWBYHXwJ27H;LC9_)CvciVaOqfdklnhzTeA{0CRx?tHs- zm@Y)42})na{xHQh|mcA6c#wcXbt;sn+Ci9oB6$l923{LF(k zccw#tIl#! zb(%UfL1ss7Y|q4c*vV|$Pzc)lE@-r8N8WQL!s>6^^%XcwS_C!T*YOW{C2c96vXQ3`hqH-aAG~ix++({1%b*ex@}XoJ;EH zh_J38%no-KV((F21IJdd2F&V~RDVXsfCM0Ab4d3SkEOi5pY*{y;qT{z52uQ%g6eC+0O;%TA(oOdO{S8>az z&{2)U?m?WokB~HvP}d(!_6OtZ%!vH z_$zFWpNeCQ;>qblF@$NhJk_qHt8wD7rzUq~vMdP^aE24HcK1Teud>#!{~2-9)YVt= zCgyl_wZSKc(MOr*j$=iwQgRhmB(OxJQva!n;_N|Ob;ET7-diQKPBIr2^u`Of)LI{EwgbD;1M}@o?V=^@td`5k_bYp|_Xv9B12KqJ(d2?@#kBHo->+4}w*JQ5USEk0g9rT%--f4q^}1xIH~aU+)agx-$@XFoa*q~M=4cN=s>^k|#pZD}e= zGbG3rdkwti+c&)r*W+Kj?6fmVpk5L)cgYu0e~@gg$dri6y)@T3{r1RTCfjsVt9_wmKD==i z(td<7uZt7?M?H90)1ssc&9=JG`P{QTo$>Eq@57NEzSYx+s>;)p^vDt7*{+LT^0q~K z(wXDmtGL8L1DW3(`(?6Z5B(LSa{_@GUw!CGmg`h5(Uz?Q@DKOB2`ZtDWE5${<`(fC z6$`u37zTDz9M@63_wHb5#qpGLju@&CXkd|2rBKb{v&Coug-HB~mp!qVY-k{M>cju^ zz+dmu7XY5SsVw${j4VXx{&L;#uXvq4;hcHT6lbBc%4O_b;1-i}(=<-Z2God6ra%lP zRIvXY+GD%#__|AU7gFfB`Sb{1&)g*={|^*qY`oP0=9H-#L?(YA?jK!qKyL}KZn}=) zY<}2M=m%>x@S%4qJT0|PcDK0^3i26>RS*tJC_(vLWPZ4tcT1Z*a2~8(ZbFexh_KnU zI*Y1Bv8216_hc!fM!o5NyeO<;dJDnqCT)$#VEIVNmCD>ZP?}#G4W+4SHU58r7Y9hR}8mea>SpY zVWf6cmCTgMVDm33LE7t__R*@GWF{$4@Y{X6cy0^jKlFFE&zzJK>1HWh_IO&)w{fEM zxgwPg)uPNsumkR}iJw_}JWe+uQ~o>v4{`I7a%qmlm?I8ssAG!3^Uuin;#KW9^%Kjk(RmJM-m@!)sG4yq73mZN?33 zLQwP|`Dw**hLh~kbd1_k5VcQbiTfoOMSQ@tgc}L&92Fc_%%}H_;Fpsk-Je<{8ksVW zI3IHa>ONm6*aN=8!04EgQ-1EtM$)Sd*Pq=Y>q;cEbs7f!I{?VvU!fvf9#fhBx_!#@ zG2X_PZlby6@8@SsdXBl<%?M$J;wmp6)nA1M2J7tL##RoeeN zy02@<{IT*CZP|9KqqLH|j7R*EQ06$k8}gEYbtx*pr#oRob<|ivo?&%vQth@X6}|df zXXX*#)#aNJy=oYX60cUgSzo4E1$?c!WC5k!b>av!1&C4RJanCNm3-2HGKA*&^Oh$c zr(!z}R*f_1a+{EXWbCLU!Q<&bRwx6b0^7cbOG8=Ez|pHqSix*8#%&g3-e%S~*X+b) zE(W&sHj06Vi<``X$v^KAU?R+8t>k;(c*b$8Uu}4~b`d44qw)HAxmS6XU_siN*80dh z^}D8Ode0ph^p7FFKm+mnhRYJN&#iXVe#_q(jdefMa;k$2pUERg`u=kadMHb>o@vDW z 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

38N0i! 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. .. data:: ERA_D_T_FMT @@ -277,8 +313,9 @@ The :mod:`locale` module defines the following exception and functions: .. data:: ALT_DIGITS - Get a representation of up to 100 values used to represent the values - 0 to 99. + Get a string consisting of up to 100 semicolon-separated symbols used + to represent the values 0 to 99 in a locale-specific way. + In most locales this is an empty string. .. function:: getdefaultlocale([envvars]) @@ -303,13 +340,13 @@ The :mod:`locale` module defines the following exception and functions: *language code* and *encoding* may be ``None`` if their values cannot be determined. - .. deprecated-removed:: 3.11 3.13 + .. deprecated-removed:: 3.11 3.15 .. function:: getlocale(category=LC_CTYPE) Returns the current setting for the given locale category as sequence containing - *language code*, *encoding*. *category* may be one of the :const:`LC_\*` values + *language code*, *encoding*. *category* may be one of the :const:`!LC_\*` values except :const:`LC_ALL`. It defaults to :const:`LC_CTYPE`. Except for the code ``'C'``, the language code corresponds to :rfc:`1766`. @@ -370,16 +407,6 @@ The :mod:`locale` module defines the following exception and functions: encoding for the locale code just like :func:`setlocale`. -.. function:: resetlocale(category=LC_ALL) - - Sets the locale for *category* to the default setting. - - The default setting is determined by calling :func:`getdefaultlocale`. - *category* defaults to :const:`LC_ALL`. - - .. deprecated-removed:: 3.11 3.13 - - .. function:: strcoll(string1, string2) Compares two strings according to the current :const:`LC_COLLATE` setting. As @@ -400,7 +427,7 @@ The :mod:`locale` module defines the following exception and functions: .. function:: format_string(format, val, grouping=False, monetary=False) Formats a number *val* according to the current :const:`LC_NUMERIC` setting. - The format follows the conventions of the ``%`` operator. For floating point + The format follows the conventions of the ``%`` operator. For floating-point values, the decimal point is modified if appropriate. If *grouping* is ``True``, also takes the grouping into account. @@ -431,7 +458,7 @@ The :mod:`locale` module defines the following exception and functions: .. function:: str(float) - Formats a floating point number using the same format as the built-in function + Formats a floating-point number using the same format as the built-in function ``str(float)``, but takes the decimal point into account. @@ -464,11 +491,16 @@ The :mod:`locale` module defines the following exception and functions: .. data:: LC_CTYPE - .. index:: pair: module; string + Locale category for the character type functions. Most importantly, this + category defines the text encoding, i.e. how bytes are interpreted as + Unicode codepoints. See :pep:`538` and :pep:`540` for how this variable + might be automatically coerced to ``C.UTF-8`` to avoid issues created by + invalid settings in containers or incompatible settings passed over remote + SSH connections. - Locale category for the character type functions. Depending on the settings of - this category, the functions of module :mod:`string` dealing with case change - their behaviour. + Python doesn't internally use locale-dependent character transformation functions + from ``ctype.h``. Instead, an internal ``pyctype.h`` provides locale-independent + equivalents like :c:macro:`!Py_TOLOWER`. .. data:: LC_COLLATE @@ -586,9 +618,9 @@ the locale is ``C``). When Python code uses the :mod:`locale` module to change the locale, this also affects the embedding application. If the embedding application doesn't want -this to happen, it should remove the :mod:`_locale` extension module (which does +this to happen, it should remove the :mod:`!_locale` extension module (which does all the work) from the table of built-in modules in the :file:`config.c` file, -and make sure that the :mod:`_locale` module is not accessible as a shared +and make sure that the :mod:`!_locale` module is not accessible as a shared library. @@ -602,17 +634,18 @@ Access to message catalogs .. function:: dcgettext(domain, msg, category) .. function:: textdomain(domain) .. function:: bindtextdomain(domain, dir) +.. function:: bind_textdomain_codeset(domain, codeset) The locale module exposes the C library's gettext interface on systems that -provide this interface. It consists of the functions :func:`!gettext`, -:func:`!dgettext`, :func:`!dcgettext`, :func:`!textdomain`, :func:`!bindtextdomain`, -and :func:`!bind_textdomain_codeset`. These are similar to the same functions in +provide this interface. It consists of the functions :func:`gettext`, +:func:`dgettext`, :func:`dcgettext`, :func:`textdomain`, :func:`bindtextdomain`, +and :func:`bind_textdomain_codeset`. These are similar to the same functions in the :mod:`gettext` module, but use the C library's binary format for message catalogs, and the C library's search algorithms for locating message catalogs. Python applications should normally find no need to invoke these functions, and should use :mod:`gettext` instead. A known exception to this rule are applications that link with additional C libraries which internally invoke -:c:func:`gettext` or :c:func:`dcgettext`. For these applications, it may be +C functions ``gettext`` or ``dcgettext``. For these applications, it may be necessary to bind the text domain, so that the libraries can properly locate their message catalogs. diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 448978f4..0e9dc33a 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -1,5 +1,5 @@ -:mod:`logging.config` --- Logging configuration -=============================================== +:mod:`!logging.config` --- Logging configuration +================================================ .. module:: logging.config :synopsis: Configuration of the logging module. @@ -69,7 +69,7 @@ in :mod:`logging` itself) and defining handlers which are declared either in dictConfigClass(config).configure() For example, a subclass of :class:`DictConfigurator` could call - ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then + ``DictConfigurator.__init__()`` in its own :meth:`__init__`, then set up custom prefixes which would be usable in the subsequent :meth:`configure` call. :attr:`dictConfigClass` would be bound to this new subclass, and then :func:`dictConfig` could be called exactly as @@ -93,8 +93,8 @@ in :mod:`logging` itself) and defining handlers which are declared either in :param fname: A filename, or a file-like object, or an instance derived from :class:`~configparser.RawConfigParser`. If a - ``RawConfigParser``-derived instance is passed, it is used as - is. Otherwise, a :class:`~configparser.Configparser` is + :class:`!RawConfigParser`-derived instance is passed, it is used as + is. Otherwise, a :class:`~configparser.ConfigParser` is instantiated, and the configuration read by it from the object passed in ``fname``. If that has a :meth:`readline` method, it is assumed to be a file-like object and read using @@ -103,7 +103,7 @@ in :mod:`logging` itself) and defining handlers which are declared either in :meth:`~configparser.ConfigParser.read`. - :param defaults: Defaults to be passed to the ConfigParser can be specified + :param defaults: Defaults to be passed to the :class:`!ConfigParser` can be specified in this argument. :param disable_existing_loggers: If specified as ``False``, loggers which @@ -127,8 +127,8 @@ in :mod:`logging` itself) and defining handlers which are declared either in application (e.g. based on command-line parameters or other aspects of the runtime environment) before being passed to ``fileConfig``. - .. versionadded:: 3.10 - The *encoding* parameter is added. + .. versionchanged:: 3.10 + Added the *encoding* parameter. .. versionchanged:: 3.12 An exception will be thrown if the provided file @@ -257,11 +257,11 @@ otherwise, the context is used to determine what to instantiate. which correspond to the arguments passed to create a :class:`~logging.Formatter` object: - * ``format`` - * ``datefmt`` - * ``style`` - * ``validate`` (since version >=3.8) - * ``defaults`` (since version >=3.12) + * ``format`` + * ``datefmt`` + * ``style`` + * ``validate`` (since version >=3.8) + * ``defaults`` (since version >=3.12) An optional ``class`` key indicates the name of the formatter's class (as a dotted module and class name). The instantiation @@ -544,9 +544,9 @@ valid keyword parameter name, and so will not clash with the names of the keyword arguments used in the call. The ``'()'`` also serves as a mnemonic that the corresponding value is a callable. - .. versionchanged:: 3.11 - The ``filters`` member of ``handlers`` and ``loggers`` can take - filter instances in addition to ids. +.. versionchanged:: 3.11 + The ``filters`` member of ``handlers`` and ``loggers`` can take + filter instances in addition to ids. You can also specify a special key ``'.'`` whose value is a dictionary is a mapping of attribute names to values. If found, the specified attributes will @@ -685,7 +685,8 @@ resolve to ``'dev_team@domain.tld'`` and the string ``'support_team@domain.tld'``. The ``subject`` value could be accessed using either ``'cfg://handlers.email.subject'`` or, equivalently, ``'cfg://handlers.email[subject]'``. The latter form only needs to be -used if the key contains spaces or non-alphanumeric characters. If an +used if the key contains spaces or non-alphanumeric characters. Please note +that the characters ``[`` and ``]`` are not allowed in the keys. If an index value consists only of decimal digits, access will be attempted using the corresponding integer value, falling back to the string value if needed. @@ -752,13 +753,17 @@ The ``queue`` and ``listener`` keys are optional. If the ``queue`` key is present, the corresponding value can be one of the following: -* An actual instance of :class:`queue.Queue` or a subclass thereof. This is of course - only possible if you are constructing or modifying the configuration dictionary in - code. +* An object implementing the :meth:`Queue.put_nowait ` + and :meth:`Queue.get ` public API. For instance, this may be + an actual instance of :class:`queue.Queue` or a subclass thereof, or a proxy + obtained by :meth:`multiprocessing.managers.SyncManager.Queue`. + + This is of course only possible if you are constructing or modifying + the configuration dictionary in code. * A string that resolves to a callable which, when called with no arguments, returns - the :class:`queue.Queue` instance to use. That callable could be a - :class:`queue.Queue` subclass or a function which returns a suitable queue instance, + the queue instance to use. That callable could be a :class:`queue.Queue` subclass + or a function which returns a suitable queue instance, such as ``my.module.queue_factory()``. * A dict with a ``'()'`` key which is constructed in the usual way as discussed in diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index 2a825db5..5a081f9e 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -1,5 +1,5 @@ -:mod:`logging.handlers` --- Logging handlers -============================================ +:mod:`!logging.handlers` --- Logging handlers +============================================= .. module:: logging.handlers :synopsis: Handlers for the logging module. @@ -66,7 +66,7 @@ and :meth:`flush` methods). :param stream: The stream that the handler should use. - :return: the old stream, if the stream was changed, or *None* if it wasn't. + :return: the old stream, if the stream was changed, or ``None`` if it wasn't. .. versionadded:: 3.7 @@ -656,9 +656,7 @@ supports sending logging messages to a remote or local Unix syslog. to the other end. This method is called during handler initialization, but it's not regarded as an error if the other end isn't listening at this point - the method will be called again when emitting an event, if - but it's not regarded as an error if the other end isn't listening yet - --- the method will be called again when emitting an event, - if there is no socket at that point. + there is no socket at that point. .. versionadded:: 3.11 @@ -873,8 +871,8 @@ supports sending logging messages to an email address via SMTP. A timeout can be specified for communication with the SMTP server using the *timeout* argument. - .. versionadded:: 3.3 - The *timeout* argument was added. + .. versionchanged:: 3.3 + Added the *timeout* parameter. .. method:: emit(record) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 6d1f048d..8ab107d2 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1,5 +1,5 @@ -:mod:`logging` --- Logging facility for Python -============================================== +:mod:`!logging` --- Logging facility for Python +=============================================== .. module:: logging :synopsis: Flexible event logging system for applications. @@ -30,20 +30,61 @@ is that all Python modules can participate in logging, so your application log can include your own messages integrated with messages from third-party modules. -The simplest example: +Here's a simple example of idiomatic usage: :: + + # myapp.py + import logging + import mylib + logger = logging.getLogger(__name__) + + def main(): + logging.basicConfig(filename='myapp.log', level=logging.INFO) + logger.info('Started') + mylib.do_something() + logger.info('Finished') + + if __name__ == '__main__': + main() + +:: + + # mylib.py + import logging + logger = logging.getLogger(__name__) + + def do_something(): + logger.info('Doing something') + +If you run *myapp.py*, you should see this in *myapp.log*: .. code-block:: none - >>> import logging - >>> logging.warning('Watch out!') - WARNING:root:Watch out! + INFO:__main__:Started + INFO:mylib:Doing something + INFO:__main__:Finished + +The key feature of this idiomatic usage is that the majority of code is simply +creating a module level logger with ``getLogger(__name__)``, and using that +logger to do any needed logging. This is concise, while allowing downstream +code fine-grained control if needed. Logged messages to the module-level logger +get forwarded to handlers of loggers in higher-level modules, all the way up to +the highest-level logger known as the root logger; this approach is known as +hierarchical logging. + +For logging to be useful, it needs to be configured: setting the levels and +destinations for each logger, potentially changing how specific modules log, +often based on command-line arguments or application configuration. In most +cases, like the one above, only the root logger needs to be so configured, since +all the lower level loggers at module level eventually forward their messages to +its handlers. :func:`~logging.basicConfig` provides a quick way to configure +the root logger that handles many use cases. The module provides a lot of functionality and flexibility. If you are unfamiliar with logging, the best way to get to grips with it is to view the tutorials (**see the links above and on the right**). -The basic classes defined by the module, together with their functions, are -listed below. +The basic classes defined by the module, together with their attributes and +methods, are listed in the sections below. * Loggers expose the interface that application code directly uses. * Handlers send the log records (created by loggers) to the appropriate @@ -68,15 +109,36 @@ The ``name`` is potentially a period-separated hierarchical value, like Loggers that are further down in the hierarchical list are children of loggers higher up in the list. For example, given a logger with a name of ``foo``, loggers with names of ``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all -descendants of ``foo``. The logger name hierarchy is analogous to the Python -package hierarchy, and identical to it if you organise your loggers on a -per-module basis using the recommended construction -``logging.getLogger(__name__)``. That's because in a module, ``__name__`` -is the module's name in the Python package namespace. +descendants of ``foo``. In addition, all loggers are descendants of the root +logger. The logger name hierarchy is analogous to the Python package hierarchy, +and identical to it if you organise your loggers on a per-module basis using +the recommended construction ``logging.getLogger(__name__)``. That's because +in a module, ``__name__`` is the module's name in the Python package namespace. .. class:: Logger + .. attribute:: Logger.name + + This is the logger's name, and is the value that was passed to :func:`getLogger` + to obtain the logger. + + .. note:: This attribute should be treated as read-only. + + .. attribute:: Logger.level + + The threshold of this logger, as set by the :meth:`setLevel` method. + + .. note:: Do not set this attribute directly - always use :meth:`setLevel`, + which has checks for the level passed to it. + + .. attribute:: Logger.parent + + The parent logger of this logger. It may change based on later instantiation + of loggers which are higher up in the namespace hierarchy. + + .. note:: This value should be treated as read-only. + .. attribute:: Logger.propagate If this attribute evaluates to true, events logged to this logger will be @@ -108,6 +170,21 @@ is the module's name in the Python package namespace. scenario is to attach handlers only to the root logger, and to let propagation take care of the rest. + .. attribute:: Logger.handlers + + The list of handlers directly attached to this logger instance. + + .. note:: This attribute should be treated as read-only; it is normally changed via + the :meth:`addHandler` and :meth:`removeHandler` methods, which use locks to ensure + thread-safe operation. + + .. attribute:: Logger.disabled + + This attribute disables handling of any events. It is set to ``False`` in the + initializer, and only changed by logging configuration code. + + .. note:: This attribute should be treated as read-only. + .. method:: Logger.setLevel(level) Sets the threshold for this logger to *level*. Logging messages which are less @@ -227,7 +304,8 @@ is the module's name in the Python package namespace. parameter mirrors the equivalent one in the :mod:`warnings` module. The fourth keyword argument is *extra* which can be used to pass a - dictionary which is used to populate the __dict__ of the :class:`LogRecord` + dictionary which is used to populate the :attr:`~object.__dict__` of the + :class:`LogRecord` created for the logging event with user-defined attributes. These custom attributes can then be used as you like. For example, they could be incorporated into logged messages. For example:: @@ -531,12 +609,12 @@ subclasses. However, the :meth:`!__init__` method in subclasses needs to call This method should be called from handlers when an exception is encountered during an :meth:`emit` call. If the module-level attribute - ``raiseExceptions`` is ``False``, exceptions get silently ignored. This is + :data:`raiseExceptions` is ``False``, exceptions get silently ignored. This is what is mostly wanted for a logging system - most users will not care about errors in the logging system, they are more interested in application errors. You could, however, replace this with a custom handler if you wish. The specified record is the one which was being processed when the exception - occurred. (The default value of ``raiseExceptions`` is ``True``, as that is + occurred. (The default value of :data:`raiseExceptions` is ``True``, as that is more useful during development). @@ -615,14 +693,14 @@ Formatter Objects ``logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})`` :type defaults: dict[str, Any] - .. versionadded:: 3.2 - The *style* parameter. + .. versionchanged:: 3.2 + Added the *style* parameter. - .. versionadded:: 3.8 - The *validate* parameter. + .. versionchanged:: 3.8 + Added the *validate* parameter. - .. versionadded:: 3.10 - The *defaults* parameter. + .. versionchanged:: 3.10 + Added the *defaults* parameter. .. method:: format(record) @@ -926,7 +1004,7 @@ the options available to you. | | | portion of the time). | +----------------+-------------------------+-----------------------------------------------+ | created | ``%(created)f`` | Time when the :class:`LogRecord` was created | -| | | (as returned by :func:`time.time`). | +| | | (as returned by :func:`time.time_ns` / 1e9). | +----------------+-------------------------+-----------------------------------------------+ | exc_info | You shouldn't need to | Exception tuple (à la ``sys.exc_info``) or, | | | format this yourself. | if no exception has occurred, ``None``. | @@ -1002,10 +1080,14 @@ LoggerAdapter Objects information into logging calls. For a usage example, see the section on :ref:`adding contextual information to your logging output `. -.. class:: LoggerAdapter(logger, extra) +.. class:: LoggerAdapter(logger, extra, merge_extra=False) Returns an instance of :class:`LoggerAdapter` initialized with an - underlying :class:`Logger` instance and a dict-like object. + underlying :class:`Logger` instance, a dict-like object (*extra*), and a + boolean (*merge_extra*) indicating whether or not the *extra* argument of + individual log calls should be merged with the :class:`LoggerAdapter` extra. + The default behavior is to ignore the *extra* argument of individual log + calls and only use the one of the :class:`LoggerAdapter` instance .. method:: process(msg, kwargs) @@ -1017,11 +1099,11 @@ information into logging calls. For a usage example, see the section on .. attribute:: manager - Delegates to the underlying :attr:`!manager`` on *logger*. + Delegates to the underlying :attr:`!manager` on *logger*. .. attribute:: _log - Delegates to the underlying :meth:`!_log`` method on *logger*. + Delegates to the underlying :meth:`!_log` method on *logger*. In addition to the above, :class:`LoggerAdapter` supports the following methods of :class:`Logger`: :meth:`~Logger.debug`, :meth:`~Logger.info`, @@ -1043,6 +1125,10 @@ information into logging calls. For a usage example, see the section on Attribute :attr:`!manager` and method :meth:`!_log` were added, which delegate to the underlying logger and allow adapters to be nested. + .. versionchanged:: 3.13 + + The *merge_extra* argument was added. + Thread Safety ------------- @@ -1067,10 +1153,12 @@ functions. .. function:: getLogger(name=None) - Return a logger with the specified name or, if name is ``None``, return a - logger which is the root logger of the hierarchy. If specified, the name is - typically a dot-separated hierarchical name like *'a'*, *'a.b'* or *'a.b.c.d'*. - Choice of these names is entirely up to the developer who is using logging. + Return a logger with the specified name or, if name is ``None``, return the + root logger of the hierarchy. If specified, the name is typically a + dot-separated hierarchical name like *'a'*, *'a.b'* or *'a.b.c.d'*. Choice + of these names is entirely up to the developer who is using logging, though + it is recommended that ``__name__`` be used unless you have a specific + reason for not doing that, as mentioned in :ref:`logger`. All calls to this function with a given name return the same logger instance. This means that logger instances never need to be passed between different parts @@ -1102,89 +1190,31 @@ functions. .. function:: debug(msg, *args, **kwargs) - Logs a message with level :const:`DEBUG` on the root logger. The *msg* is the - message format string, and the *args* are the arguments which are merged into - *msg* using the string formatting operator. (Note that this means that you can - use keywords in the format string, together with a single dictionary argument.) - - There are three keyword arguments in *kwargs* which are inspected: *exc_info* - which, if it does not evaluate as false, causes exception information to be - added to the logging message. If an exception tuple (in the format returned by - :func:`sys.exc_info`) or an exception instance is provided, it is used; - otherwise, :func:`sys.exc_info` is called to get the exception information. - - The second optional keyword argument is *stack_info*, which defaults to - ``False``. If true, stack information is added to the logging - message, including the actual logging call. Note that this is not the same - stack information as that displayed through specifying *exc_info*: The - former is stack frames from the bottom of the stack up to the logging call - in the current thread, whereas the latter is information about stack frames - which have been unwound, following an exception, while searching for - exception handlers. - - You can specify *stack_info* independently of *exc_info*, e.g. to just show - how you got to a certain point in your code, even when no exceptions were - raised. The stack frames are printed following a header line which says: - - .. code-block:: none - - Stack (most recent call last): - - This mimics the ``Traceback (most recent call last):`` which is used when - displaying exception frames. - - The third optional keyword argument is *extra* which can be used to pass a - dictionary which is used to populate the __dict__ of the LogRecord created for - the logging event with user-defined attributes. These custom attributes can then - be used as you like. For example, they could be incorporated into logged - messages. For example:: - - FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' - logging.basicConfig(format=FORMAT) - d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} - logging.warning('Protocol problem: %s', 'connection reset', extra=d) + This is a convenience function that calls :meth:`Logger.debug`, on the root + logger. The handling of the arguments is in every way identical + to what is described in that method. - would print something like: + The only difference is that if the root logger has no handlers, then + :func:`basicConfig` is called, prior to calling ``debug`` on the root logger. - .. code-block:: none + For very short scripts or quick demonstrations of ``logging`` facilities, + ``debug`` and the other module-level functions may be convenient. However, + most programs will want to carefully and explicitly control the logging + configuration, and should therefore prefer creating a module-level logger and + calling :meth:`Logger.debug` (or other level-specific methods) on it, as + described at the beginnning of this documentation. - 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset - - The keys in the dictionary passed in *extra* should not clash with the keys used - by the logging system. (See the :class:`Formatter` documentation for more - information on which keys are used by the logging system.) - - If you choose to use these attributes in logged messages, you need to exercise - some care. In the above example, for instance, the :class:`Formatter` has been - set up with a format string which expects 'clientip' and 'user' in the attribute - dictionary of the LogRecord. If these are missing, the message will not be - logged because a string formatting exception will occur. So in this case, you - always need to pass the *extra* dictionary with these keys. - - While this might be annoying, this feature is intended for use in specialized - circumstances, such as multi-threaded servers where the same code executes in - many contexts, and interesting conditions which arise are dependent on this - context (such as remote client IP address and authenticated user name, in the - above example). In such circumstances, it is likely that specialized - :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. - - This function (as well as :func:`info`, :func:`warning`, :func:`error` and - :func:`critical`) will call :func:`basicConfig` if the root logger doesn't - have any handler attached. - - .. versionchanged:: 3.2 - The *stack_info* parameter was added. .. function:: info(msg, *args, **kwargs) - Logs a message with level :const:`INFO` on the root logger. The arguments are - interpreted as for :func:`debug`. + Logs a message with level :const:`INFO` on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. .. function:: warning(msg, *args, **kwargs) - Logs a message with level :const:`WARNING` on the root logger. The arguments - are interpreted as for :func:`debug`. + Logs a message with level :const:`WARNING` on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. .. note:: There is an obsolete function ``warn`` which is functionally identical to ``warning``. As ``warn`` is deprecated, please do not use @@ -1193,26 +1223,26 @@ functions. .. function:: error(msg, *args, **kwargs) - Logs a message with level :const:`ERROR` on the root logger. The arguments are - interpreted as for :func:`debug`. + Logs a message with level :const:`ERROR` on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. .. function:: critical(msg, *args, **kwargs) - Logs a message with level :const:`CRITICAL` on the root logger. The arguments - are interpreted as for :func:`debug`. + Logs a message with level :const:`CRITICAL` on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. .. function:: exception(msg, *args, **kwargs) - Logs a message with level :const:`ERROR` on the root logger. The arguments are - interpreted as for :func:`debug`. Exception info is added to the logging + Logs a message with level :const:`ERROR` on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. Exception info is added to the logging message. This function should only be called from an exception handler. .. function:: log(level, msg, *args, **kwargs) - Logs a message with level *level* on the root logger. The other arguments are - interpreted as for :func:`debug`. + Logs a message with level *level* on the root logger. The arguments and behavior + are otherwise the same as for :func:`debug`. .. function:: disable(level=CRITICAL) @@ -1477,6 +1507,18 @@ Module-Level Attributes .. versionadded:: 3.2 +.. attribute:: raiseExceptions + + Used to see if exceptions during handling should be propagated. + + Default: ``True``. + + If :data:`raiseExceptions` is ``False``, + exceptions get silently ignored. This is what is mostly wanted + for a logging system - most users will not care about errors in + the logging system, they are more interested in application errors. + + Integration with the warnings module ------------------------------------ diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 434e7ac9..69f7cb8d 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -1,5 +1,5 @@ -:mod:`lzma` --- Compression using the LZMA algorithm -==================================================== +:mod:`!lzma` --- Compression using the LZMA algorithm +===================================================== .. module:: lzma :synopsis: A Python wrapper for the liblzma compression library. @@ -104,7 +104,7 @@ Reading and writing compressed files and :meth:`~io.IOBase.truncate`. Iteration and the :keyword:`with` statement are supported. - The following method is also provided: + The following method and attributes are also provided: .. method:: peek(size=-1) @@ -117,6 +117,20 @@ Reading and writing compressed files file object (e.g. if the :class:`LZMAFile` was constructed by passing a file object for *filename*). + .. attribute:: mode + + ``'rb'`` for reading and ``'wb'`` for writing. + + .. versionadded:: 3.13 + + .. attribute:: name + + The lzma file name. Equivalent to the :attr:`~io.FileIO.name` + attribute of the underlying :term:`file object`. + + .. versionadded:: 3.13 + + .. versionchanged:: 3.4 Added support for the ``"x"`` and ``"xb"`` modes. @@ -333,19 +347,22 @@ the key ``"id"``, and may contain additional keys to specify filter-dependent options. Valid filter IDs are as follows: * Compression filters: - * :const:`FILTER_LZMA1` (for use with :const:`FORMAT_ALONE`) - * :const:`FILTER_LZMA2` (for use with :const:`FORMAT_XZ` and :const:`FORMAT_RAW`) + + * :const:`FILTER_LZMA1` (for use with :const:`FORMAT_ALONE`) + * :const:`FILTER_LZMA2` (for use with :const:`FORMAT_XZ` and :const:`FORMAT_RAW`) * Delta filter: - * :const:`FILTER_DELTA` + + * :const:`FILTER_DELTA` * Branch-Call-Jump (BCJ) filters: - * :const:`FILTER_X86` - * :const:`FILTER_IA64` - * :const:`FILTER_ARM` - * :const:`FILTER_ARMTHUMB` - * :const:`FILTER_POWERPC` - * :const:`FILTER_SPARC` + + * :const:`FILTER_X86` + * :const:`FILTER_IA64` + * :const:`FILTER_ARM` + * :const:`FILTER_ARMTHUMB` + * :const:`FILTER_POWERPC` + * :const:`FILTER_SPARC` A filter chain can consist of up to 4 filters, and cannot be empty. The last filter in the chain must be a compression filter, and any other filters must be @@ -354,21 +371,21 @@ delta or BCJ filters. Compression filters support the following options (specified as additional entries in the dictionary representing the filter): - * ``preset``: A compression preset to use as a source of default values for - options that are not specified explicitly. - * ``dict_size``: Dictionary size in bytes. This should be between 4 KiB and - 1.5 GiB (inclusive). - * ``lc``: Number of literal context bits. - * ``lp``: Number of literal position bits. The sum ``lc + lp`` must be at - most 4. - * ``pb``: Number of position bits; must be at most 4. - * ``mode``: :const:`MODE_FAST` or :const:`MODE_NORMAL`. - * ``nice_len``: What should be considered a "nice length" for a match. - This should be 273 or less. - * ``mf``: What match finder to use -- :const:`MF_HC3`, :const:`MF_HC4`, - :const:`MF_BT2`, :const:`MF_BT3`, or :const:`MF_BT4`. - * ``depth``: Maximum search depth used by match finder. 0 (default) means to - select automatically based on other filter options. +* ``preset``: A compression preset to use as a source of default values for + options that are not specified explicitly. +* ``dict_size``: Dictionary size in bytes. This should be between 4 KiB and + 1.5 GiB (inclusive). +* ``lc``: Number of literal context bits. +* ``lp``: Number of literal position bits. The sum ``lc + lp`` must be at + most 4. +* ``pb``: Number of position bits; must be at most 4. +* ``mode``: :const:`MODE_FAST` or :const:`MODE_NORMAL`. +* ``nice_len``: What should be considered a "nice length" for a match. + This should be 273 or less. +* ``mf``: What match finder to use -- :const:`MF_HC3`, :const:`MF_HC4`, + :const:`MF_BT2`, :const:`MF_BT3`, or :const:`MF_BT4`. +* ``depth``: Maximum search depth used by match finder. 0 (default) means to + select automatically based on other filter options. The delta filter stores the differences between bytes, producing more repetitive input for the compressor in certain circumstances. It supports one option, diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst index 91df07d9..abb32f9b 100644 --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -1,5 +1,5 @@ -:mod:`mailbox` --- Manipulate mailboxes in various formats -========================================================== +:mod:`!mailbox` --- Manipulate mailboxes in various formats +=========================================================== .. module:: mailbox :synopsis: Manipulate mailboxes in various formats @@ -13,8 +13,8 @@ This module defines two classes, :class:`Mailbox` and :class:`Message`, for accessing and manipulating on-disk mailboxes and the messages they contain. -:class:`Mailbox` offers a dictionary-like mapping from keys to messages. -:class:`Message` extends the :mod:`email.message` module's +:class:`!Mailbox` offers a dictionary-like mapping from keys to messages. +:class:`!Message` extends the :mod:`email.message` module's :class:`~email.message.Message` class with format-specific state and behavior. Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. @@ -27,37 +27,38 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-objects: -:class:`Mailbox` objects ------------------------- +:class:`!Mailbox` objects +------------------------- .. class:: Mailbox A mailbox, which may be inspected and modified. - The :class:`Mailbox` class defines an interface and is not intended to be + The :class:`!Mailbox` class defines an interface and is not intended to be instantiated. Instead, format-specific subclasses should inherit from - :class:`Mailbox` and your code should instantiate a particular subclass. + :class:`!Mailbox` and your code should instantiate a particular subclass. - The :class:`Mailbox` interface is dictionary-like, with small keys - corresponding to messages. Keys are issued by the :class:`Mailbox` instance - with which they will be used and are only meaningful to that :class:`Mailbox` + The :class:`!Mailbox` interface is dictionary-like, with small keys + corresponding to messages. Keys are issued by the :class:`!Mailbox` instance + with which they will be used and are only meaningful to that :class:`!Mailbox` instance. A key continues to identify a message even if the corresponding message is modified, such as by replacing it with another message. - Messages may be added to a :class:`Mailbox` instance using the set-like + Messages may be added to a :class:`!Mailbox` instance using the set-like method :meth:`add` and removed using a ``del`` statement or the set-like methods :meth:`remove` and :meth:`discard`. - :class:`Mailbox` interface semantics differ from dictionary semantics in some + :class:`!Mailbox` interface semantics differ from dictionary semantics in some noteworthy ways. Each time a message is requested, a new representation (typically a :class:`Message` instance) is generated based upon the current state of the mailbox. Similarly, when a message is added to a - :class:`Mailbox` instance, the provided message representation's contents are + :class:`!Mailbox` instance, the provided message representation's contents are copied. In neither case is a reference to the message representation kept by - the :class:`Mailbox` instance. + the :class:`!Mailbox` instance. - The default :class:`Mailbox` iterator iterates over message representations, - not keys as the default dictionary iterator does. Moreover, modification of a + The default :class:`!Mailbox` :term:`iterator` iterates over message + representations, not keys as the default :class:`dictionary ` + iterator does. Moreover, modification of a mailbox during iteration is safe and well-defined. Messages added to the mailbox after an iterator is created will not be seen by the iterator. Messages removed from the mailbox before the iterator yields them @@ -69,14 +70,15 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. Be very cautious when modifying mailboxes that might be simultaneously changed by some other process. The safest mailbox format to use for such - tasks is Maildir; try to avoid using single-file formats such as mbox for + tasks is :class:`Maildir`; try to avoid using single-file formats such as + :class:`mbox` for concurrent writing. If you're modifying a mailbox, you *must* lock it by calling the :meth:`lock` and :meth:`unlock` methods *before* reading any messages in the file or making any changes by adding or deleting a message. Failing to lock the mailbox runs the risk of losing messages or corrupting the entire mailbox. - :class:`Mailbox` instances have the following methods: + :class:`!Mailbox` instances have the following methods: .. method:: add(message) @@ -127,21 +129,23 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: iterkeys() - keys() - Return an iterator over all keys if called as :meth:`iterkeys` or return a - list of keys if called as :meth:`keys`. + Return an :term:`iterator` over all keys + + + .. method:: keys() + + The same as :meth:`iterkeys`, except that a :class:`list` is returned + rather than an :term:`iterator` .. method:: itervalues() __iter__() - values() - Return an iterator over representations of all messages if called as - :meth:`itervalues` or :meth:`__iter__` or return a list of such - representations if called as :meth:`values`. The messages are represented + Return an :term:`iterator` over representations of all messages. + The messages are represented as instances of the appropriate format-specific :class:`Message` subclass - unless a custom message factory was specified when the :class:`Mailbox` + unless a custom message factory was specified when the :class:`!Mailbox` instance was initialized. .. note:: @@ -150,15 +154,25 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. iterate over keys. + .. method:: values() + + The same as :meth:`itervalues`, except that a :class:`list` is returned + rather than an :term:`iterator` + + .. method:: iteritems() - items() - Return an iterator over (*key*, *message*) pairs, where *key* is a key and - *message* is a message representation, if called as :meth:`iteritems` or - return a list of such pairs if called as :meth:`items`. The messages are + Return an :term:`iterator` over (*key*, *message*) pairs, where *key* is + a key and *message* is a message representation. The messages are represented as instances of the appropriate format-specific :class:`Message` subclass unless a custom message factory was specified - when the :class:`Mailbox` instance was initialized. + when the :class:`!Mailbox` instance was initialized. + + + .. method:: items() + + The same as :meth:`iteritems`, except that a :class:`list` of pairs is + returned rather than an :term:`iterator` of pairs. .. method:: get(key, default=None) @@ -167,9 +181,9 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. Return a representation of the message corresponding to *key*. If no such message exists, *default* is returned if the method was called as :meth:`get` and a :exc:`KeyError` exception is raised if the method was - called as :meth:`__getitem__`. The message is represented as an instance + called as :meth:`!__getitem__`. The message is represented as an instance of the appropriate format-specific :class:`Message` subclass unless a - custom message factory was specified when the :class:`Mailbox` instance + custom message factory was specified when the :class:`!Mailbox` instance was initialized. @@ -198,21 +212,23 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: get_file(key) - Return a file-like representation of the message corresponding to *key*, + Return a :term:`file-like ` representation of the + message corresponding to *key*, or raise a :exc:`KeyError` exception if no such message exists. The file-like object behaves as if open in binary mode. This file should be closed once it is no longer needed. .. versionchanged:: 3.2 - The file object really is a binary file; previously it was incorrectly - returned in text mode. Also, the file-like object now supports the - context management protocol: you can use a :keyword:`with` statement to - automatically close it. + The file object really is a :term:`binary file`; previously it was + incorrectly returned in text mode. Also, the :term:`file-like object` + now supports the :term:`context manager` protocol: you can use a + :keyword:`with` statement to automatically close it. .. note:: - Unlike other representations of messages, file-like representations are - not necessarily independent of the :class:`Mailbox` instance that + Unlike other representations of messages, + :term:`file-like ` representations are not + necessarily independent of the :class:`!Mailbox` instance that created them or of the underlying mailbox. More specific documentation is provided by each subclass. @@ -238,7 +254,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. the message. If no such message exists, return *default*. The message is represented as an instance of the appropriate format-specific :class:`Message` subclass unless a custom message factory was specified - when the :class:`Mailbox` instance was initialized. + when the :class:`!Mailbox` instance was initialized. .. method:: popitem() @@ -248,7 +264,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. message. If the mailbox is empty, raise a :exc:`KeyError` exception. The message is represented as an instance of the appropriate format-specific :class:`Message` subclass unless a custom message factory was specified - when the :class:`Mailbox` instance was initialized. + when the :class:`!Mailbox` instance was initialized. .. method:: update(arg) @@ -259,7 +275,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. *message* as if by using :meth:`__setitem__`. As with :meth:`__setitem__`, each *key* must already correspond to a message in the mailbox or else a :exc:`KeyError` exception will be raised, so in general it is incorrect - for *arg* to be a :class:`Mailbox` instance. + for *arg* to be a :class:`!Mailbox` instance. .. note:: @@ -269,7 +285,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: flush() Write any pending changes to the filesystem. For some :class:`Mailbox` - subclasses, changes are always written immediately and :meth:`flush` does + subclasses, changes are always written immediately and :meth:`!flush` does nothing, but you should still make a habit of calling this method. @@ -290,13 +306,13 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: close() Flush the mailbox, unlock it if necessary, and close any open files. For - some :class:`Mailbox` subclasses, this method does nothing. + some :class:`!Mailbox` subclasses, this method does nothing. .. _mailbox-maildir: -:class:`Maildir` -^^^^^^^^^^^^^^^^ +:class:`!Maildir` objects +^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: Maildir(dirname, factory=None, create=True) @@ -330,11 +346,11 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. Folders of the style introduced by the Courier mail transfer agent are also supported. Any subdirectory of the main mailbox is considered a folder if ``'.'`` is the first character in its name. Folder names are represented by - :class:`Maildir` without the leading ``'.'``. Each folder is itself a Maildir + :class:`!Maildir` without the leading ``'.'``. Each folder is itself a Maildir mailbox but should not contain other folders. Instead, a logical nesting is indicated using ``'.'`` to delimit levels, e.g., "Archived.2005.07". - .. note:: + .. attribute:: Maildir.colon The Maildir specification requires the use of a colon (``':'``) in certain message file names. However, some operating systems do not permit this @@ -346,9 +362,12 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. import mailbox mailbox.Maildir.colon = '!' - The :attr:`colon` attribute may also be set on a per-instance basis. + The :attr:`!colon` attribute may also be set on a per-instance basis. - :class:`Maildir` instances have all of the methods of :class:`Mailbox` in + .. versionchanged:: 3.13 + :class:`Maildir` now ignores files with a leading dot. + + :class:`!Maildir` instances have all of the methods of :class:`Mailbox` in addition to the following: @@ -359,14 +378,14 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: get_folder(folder) - Return a :class:`Maildir` instance representing the folder whose name is + Return a :class:`!Maildir` instance representing the folder whose name is *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder does not exist. .. method:: add_folder(folder) - Create a folder whose name is *folder* and return a :class:`Maildir` + Create a folder whose name is *folder* and return a :class:`!Maildir` instance representing it. @@ -383,7 +402,109 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. last 36 hours. The Maildir specification says that mail-reading programs should do this occasionally. - Some :class:`Mailbox` methods implemented by :class:`Maildir` deserve special + + .. method:: get_flags(key) + + Return as a string the flags that are set on the message + corresponding to *key*. + This is the same as ``get_message(key).get_flags()`` but much + faster, because it does not open the message file. + Use this method when iterating over the keys to determine which + messages are interesting to get. + + If you do have a :class:`MaildirMessage` object, use + its :meth:`~MaildirMessage.get_flags` method instead, because + changes made by the message's :meth:`~MaildirMessage.set_flags`, + :meth:`~MaildirMessage.add_flag` and :meth:`~MaildirMessage.remove_flag` + methods are not reflected here until the mailbox's + :meth:`__setitem__` method is called. + + .. versionadded:: 3.13 + + + .. method:: set_flags(key, flags) + + On the message corresponding to *key*, set the flags specified + by *flags* and unset all others. + Calling ``some_mailbox.set_flags(key, flags)`` is similar to :: + + one_message = some_mailbox.get_message(key) + one_message.set_flags(flags) + some_mailbox[key] = one_message + + but faster, because it does not open the message file. + + If you do have a :class:`MaildirMessage` object, use + its :meth:`~MaildirMessage.set_flags` method instead, because + changes made with this mailbox method will not be visible to the + message object's method, :meth:`~MaildirMessage.get_flags`. + + .. versionadded:: 3.13 + + + .. method:: add_flag(key, flag) + + On the message corresponding to *key*, set the flags specified + by *flag* without changing other flags. To add more than one + flag at a time, *flag* may be a string of more than one character. + + Considerations for using this method versus the message object's + :meth:`~MaildirMessage.add_flag` method are similar to + those for :meth:`set_flags`; see the discussion there. + + .. versionadded:: 3.13 + + + .. method:: remove_flag(key, flag) + + On the message corresponding to *key*, unset the flags specified + by *flag* without changing other flags. To remove more than one + flag at a time, *flag* may be a string of more than one character. + + Considerations for using this method versus the message object's + :meth:`~MaildirMessage.remove_flag` method are similar to + those for :meth:`set_flags`; see the discussion there. + + .. versionadded:: 3.13 + + + .. method:: get_info(key) + + Return a string containing the info for the message + corresponding to *key*. + This is the same as ``get_message(key).get_info()`` but much + faster, because it does not open the message file. + Use this method when iterating over the keys to determine which + messages are interesting to get. + + If you do have a :class:`MaildirMessage` object, use + its :meth:`~MaildirMessage.get_info` method instead, because + changes made by the message's :meth:`~MaildirMessage.set_info` method + are not reflected here until the mailbox's :meth:`__setitem__` method + is called. + + .. versionadded:: 3.13 + + + .. method:: set_info(key, info) + + Set the info of the message corresponding to *key* to *info*. + Calling ``some_mailbox.set_info(key, flags)`` is similar to :: + + one_message = some_mailbox.get_message(key) + one_message.set_info(info) + some_mailbox[key] = one_message + + but faster, because it does not open the message file. + + If you do have a :class:`MaildirMessage` object, use + its :meth:`~MaildirMessage.set_info` method instead, because + changes made with this mailbox method will not be visible to the + message object's method, :meth:`~MaildirMessage.get_info`. + + .. versionadded:: 3.13 + + Some :class:`Mailbox` methods implemented by :class:`!Maildir` deserve special remarks: @@ -414,7 +535,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: close() - :class:`Maildir` instances do not keep any open files and the underlying + :class:`!Maildir` instances do not keep any open files and the underlying mailboxes do not support locking, so this method does nothing. @@ -437,8 +558,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-mbox: -:class:`mbox` -^^^^^^^^^^^^^ +:class:`!mbox` objects +^^^^^^^^^^^^^^^^^^^^^^ .. class:: mbox(path, factory=None, create=True) @@ -455,22 +576,22 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. each message indicated by a line whose first five characters are "From ". Several variations of the mbox format exist to address perceived shortcomings in - the original. In the interest of compatibility, :class:`mbox` implements the + the original. In the interest of compatibility, :class:`!mbox` implements the original format, which is sometimes referred to as :dfn:`mboxo`. This means that the :mailheader:`Content-Length` header, if present, is ignored and that any occurrences of "From " at the beginning of a line in a message body are transformed to ">From " when storing the message, although occurrences of ">From " are not transformed to "From " when reading the message. - Some :class:`Mailbox` methods implemented by :class:`mbox` deserve special + Some :class:`Mailbox` methods implemented by :class:`!mbox` deserve special remarks: .. method:: get_file(key) - Using the file after calling :meth:`flush` or :meth:`close` on the - :class:`mbox` instance may yield unpredictable results or raise an - exception. + Using the file after calling :meth:`~Mailbox.flush` or + :meth:`~Mailbox.close` on the :class:`!mbox` instance may yield + unpredictable results or raise an exception. .. method:: lock() @@ -494,8 +615,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-mh: -:class:`MH` -^^^^^^^^^^^ +:class:`!MH` objects +^^^^^^^^^^^^^^^^^^^^ .. class:: MH(path, factory=None, create=True) @@ -515,14 +636,18 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. messages without moving them to sub-folders. Sequences are defined in a file called :file:`.mh_sequences` in each folder. - The :class:`MH` class manipulates MH mailboxes, but it does not attempt to + The :class:`!MH` class manipulates MH mailboxes, but it does not attempt to emulate all of :program:`mh`'s behaviors. In particular, it does not modify and is not affected by the :file:`context` or :file:`.mh_profile` files that are used by :program:`mh` to store its state and configuration. - :class:`MH` instances have all of the methods of :class:`Mailbox` in addition + :class:`!MH` instances have all of the methods of :class:`Mailbox` in addition to the following: + .. versionchanged:: 3.13 + + Supported folders that don't contain a :file:`.mh_sequences` file. + .. method:: list_folders() @@ -531,14 +656,14 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: get_folder(folder) - Return an :class:`MH` instance representing the folder whose name is + Return an :class:`!MH` instance representing the folder whose name is *folder*. A :exc:`NoSuchMailboxError` exception is raised if the folder does not exist. .. method:: add_folder(folder) - Create a folder whose name is *folder* and return an :class:`MH` instance + Create a folder whose name is *folder* and return an :class:`!MH` instance representing it. @@ -572,7 +697,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. Already-issued keys are invalidated by this operation and should not be subsequently used. - Some :class:`Mailbox` methods implemented by :class:`MH` deserve special + Some :class:`Mailbox` methods implemented by :class:`!MH` deserve special remarks: @@ -608,7 +733,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. method:: close() - :class:`MH` instances do not keep any open files, so this method is + :class:`!MH` instances do not keep any open files, so this method is equivalent to :meth:`unlock`. @@ -624,8 +749,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-babyl: -:class:`Babyl` -^^^^^^^^^^^^^^ +:class:`!Babyl` objects +^^^^^^^^^^^^^^^^^^^^^^^ .. class:: Babyl(path, factory=None, create=True) @@ -652,7 +777,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. message, and a list of all user-defined labels found in the mailbox is kept in the Babyl options section. - :class:`Babyl` instances have all of the methods of :class:`Mailbox` in + :class:`!Babyl` instances have all of the methods of :class:`Mailbox` in addition to the following: @@ -667,7 +792,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. options section, but the Babyl section is updated whenever the mailbox is modified. - Some :class:`Mailbox` methods implemented by :class:`Babyl` deserve special + Some :class:`Mailbox` methods implemented by :class:`!Babyl` deserve special remarks: @@ -700,8 +825,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-mmdf: -:class:`MMDF` -^^^^^^^^^^^^^ +:class:`!MMDF` objects +^^^^^^^^^^^^^^^^^^^^^^ .. class:: MMDF(path, factory=None, create=True) @@ -722,15 +847,15 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. ">From " when storing messages because the extra message separator lines prevent mistaking such occurrences for the starts of subsequent messages. - Some :class:`Mailbox` methods implemented by :class:`MMDF` deserve special + Some :class:`Mailbox` methods implemented by :class:`!MMDF` deserve special remarks: .. method:: get_file(key) - Using the file after calling :meth:`flush` or :meth:`close` on the - :class:`MMDF` instance may yield unpredictable results or raise an - exception. + Using the file after calling :meth:`~Mailbox.flush` or + :meth:`~Mailbox.close` on the :class:`!MMDF` instance may yield + unpredictable results or raise an exception. .. method:: lock() @@ -752,20 +877,20 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. _mailbox-message-objects: -:class:`Message` objects ------------------------- +:class:`!Message` objects +------------------------- .. class:: Message(message=None) A subclass of the :mod:`email.message` module's - :class:`~email.message.Message`. Subclasses of :class:`mailbox.Message` add + :class:`~email.message.Message`. Subclasses of :class:`!mailbox.Message` add mailbox-format-specific state and behavior. If *message* is omitted, the new instance is created in a default, empty state. If *message* is an :class:`email.message.Message` instance, its contents are copied; furthermore, any format-specific information is converted insofar as - possible if *message* is a :class:`Message` instance. If *message* is a string, + possible if *message* is a :class:`!Message` instance. If *message* is a string, a byte string, or a file, it should contain an :rfc:`2822`\ -compliant message, which is read and parsed. Files should be open in binary mode, but text mode files @@ -780,18 +905,18 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. such as whether a message has been read by the user or marked as important is retained, because it applies to the message itself. - There is no requirement that :class:`Message` instances be used to represent + There is no requirement that :class:`!Message` instances be used to represent messages retrieved using :class:`Mailbox` instances. In some situations, the - time and memory required to generate :class:`Message` representations might - not be acceptable. For such situations, :class:`Mailbox` instances also + time and memory required to generate :class:`!Message` representations might + not be acceptable. For such situations, :class:`!Mailbox` instances also offer string and file-like representations, and a custom message factory may - be specified when a :class:`Mailbox` instance is initialized. + be specified when a :class:`!Mailbox` instance is initialized. .. _mailbox-maildirmessage: -:class:`MaildirMessage` -^^^^^^^^^^^^^^^^^^^^^^^ +:class:`!MaildirMessage` objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: MaildirMessage(message=None) @@ -826,7 +951,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. | T | Trashed | Marked for subsequent deletion | +------+---------+--------------------------------+ - :class:`MaildirMessage` instances offer the following methods: + :class:`!MaildirMessage` instances offer the following methods: .. method:: get_subdir() @@ -838,7 +963,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. note:: A message is typically moved from :file:`new` to :file:`cur` after its - mailbox has been accessed, whether or not the message is has been + mailbox has been accessed, whether or not the message has been read. A message ``msg`` has been read if ``"S" in msg.get_flags()`` is ``True``. @@ -903,7 +1028,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. Set "info" to *info*, which should be a string. -When a :class:`MaildirMessage` instance is created based upon an +When a :class:`!MaildirMessage` instance is created based upon an :class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` and :mailheader:`X-Status` headers are omitted and the following conversions take place: @@ -923,7 +1048,7 @@ take place: | T flag | D flag | +--------------------+----------------------------------------------+ -When a :class:`MaildirMessage` instance is created based upon an +When a :class:`!MaildirMessage` instance is created based upon an :class:`MHMessage` instance, the following conversions take place: +-------------------------------+--------------------------+ @@ -938,7 +1063,7 @@ When a :class:`MaildirMessage` instance is created based upon an | R flag | "replied" sequence | +-------------------------------+--------------------------+ -When a :class:`MaildirMessage` instance is created based upon a +When a :class:`!MaildirMessage` instance is created based upon a :class:`BabylMessage` instance, the following conversions take place: +-------------------------------+-------------------------------+ @@ -958,8 +1083,8 @@ When a :class:`MaildirMessage` instance is created based upon a .. _mailbox-mboxmessage: -:class:`mboxMessage` -^^^^^^^^^^^^^^^^^^^^ +:class:`!mboxMessage` objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: mboxMessage(message=None) @@ -995,7 +1120,7 @@ When a :class:`MaildirMessage` instance is created based upon a "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The flags and headers typically appear in the order mentioned. - :class:`mboxMessage` instances offer the following methods: + :class:`!mboxMessage` instances offer the following methods: .. method:: get_from() @@ -1011,8 +1136,8 @@ When a :class:`MaildirMessage` instance is created based upon a leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If *time_* is specified, it should be a :class:`time.struct_time` instance, a - tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use - :meth:`time.gmtime`). + tuple suitable for passing to :func:`time.strftime`, or ``True`` (to use + :func:`time.gmtime`). .. method:: get_flags() @@ -1043,7 +1168,7 @@ When a :class:`MaildirMessage` instance is created based upon a remove more than one flag at a time, *flag* maybe a string of more than one character. -When an :class:`mboxMessage` instance is created based upon a +When an :class:`!mboxMessage` instance is created based upon a :class:`MaildirMessage` instance, a "From " line is generated based upon the :class:`MaildirMessage` instance's delivery date, and the following conversions take place: @@ -1062,7 +1187,7 @@ take place: | A flag | R flag | +-----------------+-------------------------------+ -When an :class:`mboxMessage` instance is created based upon an +When an :class:`!mboxMessage` instance is created based upon an :class:`MHMessage` instance, the following conversions take place: +-------------------+--------------------------+ @@ -1077,7 +1202,7 @@ When an :class:`mboxMessage` instance is created based upon an | A flag | "replied" sequence | +-------------------+--------------------------+ -When an :class:`mboxMessage` instance is created based upon a +When an :class:`!mboxMessage` instance is created based upon a :class:`BabylMessage` instance, the following conversions take place: +-------------------+-----------------------------+ @@ -1092,7 +1217,8 @@ When an :class:`mboxMessage` instance is created based upon a | A flag | "answered" label | +-------------------+-----------------------------+ -When a :class:`Message` instance is created based upon an :class:`MMDFMessage` +When a :class:`!mboxMessage` instance is created based upon an +:class:`MMDFMessage` instance, the "From " line is copied and all flags directly correspond: +-----------------+----------------------------+ @@ -1112,8 +1238,8 @@ instance, the "From " line is copied and all flags directly correspond: .. _mailbox-mhmessage: -:class:`MHMessage` -^^^^^^^^^^^^^^^^^^ +:class:`!MHMessage` objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: MHMessage(message=None) @@ -1137,7 +1263,7 @@ instance, the "From " line is copied and all flags directly correspond: | flagged | Marked as important | +----------+------------------------------------------+ - :class:`MHMessage` instances offer the following methods: + :class:`!MHMessage` instances offer the following methods: .. method:: get_sequences() @@ -1159,7 +1285,7 @@ instance, the "From " line is copied and all flags directly correspond: Remove *sequence* from the list of sequences that include this message. -When an :class:`MHMessage` instance is created based upon a +When an :class:`!MHMessage` instance is created based upon a :class:`MaildirMessage` instance, the following conversions take place: +--------------------+-------------------------------+ @@ -1172,7 +1298,7 @@ When an :class:`MHMessage` instance is created based upon a | "flagged" sequence | F flag | +--------------------+-------------------------------+ -When an :class:`MHMessage` instance is created based upon an +When an :class:`!MHMessage` instance is created based upon an :class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` and :mailheader:`X-Status` headers are omitted and the following conversions take place: @@ -1188,7 +1314,7 @@ take place: | "flagged" sequence | F flag | +--------------------+----------------------------------------------+ -When an :class:`MHMessage` instance is created based upon a +When an :class:`!MHMessage` instance is created based upon a :class:`BabylMessage` instance, the following conversions take place: +--------------------+-----------------------------+ @@ -1202,8 +1328,8 @@ When an :class:`MHMessage` instance is created based upon a .. _mailbox-babylmessage: -:class:`BabylMessage` -^^^^^^^^^^^^^^^^^^^^^ +:class:`!BabylMessage` objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: BabylMessage(message=None) @@ -1232,11 +1358,11 @@ When an :class:`MHMessage` instance is created based upon a | resent | Resent | +-----------+------------------------------------------+ - By default, Rmail displays only visible headers. The :class:`BabylMessage` + By default, Rmail displays only visible headers. The :class:`!BabylMessage` class, though, uses the original headers because they are more complete. Visible headers may be accessed explicitly if desired. - :class:`BabylMessage` instances offer the following methods: + :class:`!BabylMessage` instances offer the following methods: .. method:: get_labels() @@ -1261,7 +1387,7 @@ When an :class:`MHMessage` instance is created based upon a .. method:: get_visible() - Return an :class:`Message` instance whose headers are the message's + Return a :class:`Message` instance whose headers are the message's visible headers and whose body is empty. @@ -1275,7 +1401,7 @@ When an :class:`MHMessage` instance is created based upon a .. method:: update_visible() - When a :class:`BabylMessage` instance's original headers are modified, the + When a :class:`!BabylMessage` instance's original headers are modified, the visible headers are not automatically modified to correspond. This method updates the visible headers as follows: each visible header with a corresponding original header is set to the value of the original header, @@ -1285,7 +1411,7 @@ When an :class:`MHMessage` instance is created based upon a present in the original headers but not the visible headers are added to the visible headers. -When a :class:`BabylMessage` instance is created based upon a +When a :class:`!BabylMessage` instance is created based upon a :class:`MaildirMessage` instance, the following conversions take place: +-------------------+-------------------------------+ @@ -1300,7 +1426,7 @@ When a :class:`BabylMessage` instance is created based upon a | "forwarded" label | P flag | +-------------------+-------------------------------+ -When a :class:`BabylMessage` instance is created based upon an +When a :class:`!BabylMessage` instance is created based upon an :class:`mboxMessage` or :class:`MMDFMessage` instance, the :mailheader:`Status` and :mailheader:`X-Status` headers are omitted and the following conversions take place: @@ -1316,7 +1442,7 @@ take place: | "answered" label | A flag | +------------------+----------------------------------------------+ -When a :class:`BabylMessage` instance is created based upon an +When a :class:`!BabylMessage` instance is created based upon an :class:`MHMessage` instance, the following conversions take place: +------------------+--------------------------+ @@ -1330,8 +1456,8 @@ When a :class:`BabylMessage` instance is created based upon an .. _mailbox-mmdfmessage: -:class:`MMDFMessage` -^^^^^^^^^^^^^^^^^^^^ +:class:`!MMDFMessage` objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: MMDFMessage(message=None) @@ -1365,7 +1491,7 @@ When a :class:`BabylMessage` instance is created based upon an "D", "F", and "A" flags are stored in the :mailheader:`X-Status` header. The flags and headers typically appear in the order mentioned. - :class:`MMDFMessage` instances offer the following methods, which are + :class:`!MMDFMessage` instances offer the following methods, which are identical to those offered by :class:`mboxMessage`: @@ -1382,8 +1508,8 @@ When a :class:`BabylMessage` instance is created based upon an leading "From " or trailing newline. For convenience, *time_* may be specified and will be formatted appropriately and appended to *from_*. If *time_* is specified, it should be a :class:`time.struct_time` instance, a - tuple suitable for passing to :meth:`time.strftime`, or ``True`` (to use - :meth:`time.gmtime`). + tuple suitable for passing to :func:`time.strftime`, or ``True`` (to use + :func:`time.gmtime`). .. method:: get_flags() @@ -1414,7 +1540,7 @@ When a :class:`BabylMessage` instance is created based upon an remove more than one flag at a time, *flag* maybe a string of more than one character. -When an :class:`MMDFMessage` instance is created based upon a +When an :class:`!MMDFMessage` instance is created based upon a :class:`MaildirMessage` instance, a "From " line is generated based upon the :class:`MaildirMessage` instance's delivery date, and the following conversions take place: @@ -1433,7 +1559,7 @@ take place: | A flag | R flag | +-----------------+-------------------------------+ -When an :class:`MMDFMessage` instance is created based upon an +When an :class:`!MMDFMessage` instance is created based upon an :class:`MHMessage` instance, the following conversions take place: +-------------------+--------------------------+ @@ -1448,7 +1574,7 @@ When an :class:`MMDFMessage` instance is created based upon an | A flag | "replied" sequence | +-------------------+--------------------------+ -When an :class:`MMDFMessage` instance is created based upon a +When an :class:`!MMDFMessage` instance is created based upon a :class:`BabylMessage` instance, the following conversions take place: +-------------------+-----------------------------+ @@ -1463,7 +1589,7 @@ When an :class:`MMDFMessage` instance is created based upon a | A flag | "answered" label | +-------------------+-----------------------------+ -When an :class:`MMDFMessage` instance is created based upon an +When an :class:`!MMDFMessage` instance is created based upon an :class:`mboxMessage` instance, the "From " line is copied and all flags directly correspond: @@ -1485,7 +1611,7 @@ correspond: Exceptions ---------- -The following exception classes are defined in the :mod:`mailbox` module: +The following exception classes are defined in the :mod:`!mailbox` module: .. exception:: Error() diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index bfaedb46..4467da14 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -1,94 +1,15 @@ -:mod:`mailcap` --- Mailcap file handling -======================================== +:mod:`!mailcap` --- Mailcap file handling +========================================= .. module:: mailcap - :synopsis: Mailcap file handling. + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/mailcap.py` - .. deprecated-removed:: 3.11 3.13 - The :mod:`mailcap` module is deprecated - (see :pep:`PEP 594 <594#mailcap>` for details). - The :mod:`mimetypes` module provides an alternative. - --------------- - -Mailcap files are used to configure how MIME-aware applications such as mail -readers and web browsers react to files with different MIME types. (The name -"mailcap" is derived from the phrase "mail capability".) For example, a mailcap -file might contain a line like ``video/mpeg; xmpeg %s``. Then, if the user -encounters an email message or web document with the MIME type -:mimetype:`video/mpeg`, ``%s`` will be replaced by a filename (usually one -belonging to a temporary file) and the :program:`xmpeg` program can be -automatically started to view the file. - -The mailcap format is documented in :rfc:`1524`, "A User Agent Configuration -Mechanism For Multimedia Mail Format Information", but is not an internet -standard. However, mailcap files are supported on most Unix systems. - - -.. function:: findmatch(caps, MIMEtype, key='view', filename='/dev/null', plist=[]) - - Return a 2-tuple; the first element is a string containing the command line to - be executed (which can be passed to :func:`os.system`), and the second element - is the mailcap entry for a given MIME type. If no matching MIME type can be - found, ``(None, None)`` is returned. - - *key* is the name of the field desired, which represents the type of activity to - be performed; the default value is 'view', since in the most common case you - simply want to view the body of the MIME-typed data. Other possible values - might be 'compose' and 'edit', if you wanted to create a new body of the given - MIME type or alter the existing body data. See :rfc:`1524` for a complete list - of these fields. - - *filename* is the filename to be substituted for ``%s`` in the command line; the - default value is ``'/dev/null'`` which is almost certainly not what you want, so - usually you'll override it by specifying a filename. - - *plist* can be a list containing named parameters; the default value is simply - an empty list. Each entry in the list must be a string containing the parameter - name, an equals sign (``'='``), and the parameter's value. Mailcap entries can - contain named parameters like ``%{foo}``, which will be replaced by the value - of the parameter named 'foo'. For example, if the command line ``showpartial - %{id} %{number} %{total}`` was in a mailcap file, and *plist* was set to - ``['id=1', 'number=2', 'total=3']``, the resulting command line would be - ``'showpartial 1 2 3'``. - - In a mailcap file, the "test" field can optionally be specified to test some - external condition (such as the machine architecture, or the window system in - use) to determine whether or not the mailcap line applies. :func:`findmatch` - will automatically check such conditions and skip the entry if the check fails. - - .. versionchanged:: 3.11 - - To prevent security issues with shell metacharacters (symbols that have - special effects in a shell command line), ``findmatch`` will refuse - to inject ASCII characters other than alphanumerics and ``@+=:,./-_`` - into the returned command line. - - If a disallowed character appears in *filename*, ``findmatch`` will always - return ``(None, None)`` as if no entry was found. - If such a character appears elsewhere (a value in *plist* or in *MIMEtype*), - ``findmatch`` will ignore all mailcap entries which use that value. - A :mod:`warning ` will be raised in either case. - -.. function:: getcaps() - - Returns a dictionary mapping MIME types to a list of mailcap file entries. This - dictionary must be passed to the :func:`findmatch` function. An entry is stored - as a list of dictionaries, but it shouldn't be necessary to know the details of - this representation. - - The information is derived from all of the mailcap files found on the system. - Settings in the user's mailcap file :file:`$HOME/.mailcap` will override - settings in the system mailcap files :file:`/etc/mailcap`, - :file:`/usr/etc/mailcap`, and :file:`/usr/local/etc/mailcap`. - -An example usage:: - >>> import mailcap - >>> d = mailcap.getcaps() - >>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223') - ('xmpeg tmp1223', {'view': 'xmpeg %s'}) +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!mailcap` module was +`Python 3.12 `_. diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst index 0556f196..9e4606df 100644 --- a/Doc/library/marshal.rst +++ b/Doc/library/marshal.rst @@ -1,5 +1,5 @@ -:mod:`marshal` --- Internal Python object serialization -======================================================= +:mod:`!marshal` --- Internal Python object serialization +======================================================== .. module:: marshal :synopsis: Convert Python objects to streams of bytes and back (with different @@ -10,7 +10,7 @@ This module contains functions that can read and write Python values in a binary format. The format is specific to Python, but independent of machine architecture issues (e.g., you can write a Python value to a file on a PC, -transport the file to a Sun, and read it back there). Details of the format are +transport the file to a Mac, and read it back there). Details of the format are undocumented on purpose; it may change between Python versions (although it rarely does). [#]_ @@ -23,7 +23,11 @@ transfer of Python objects through RPC calls, see the modules :mod:`pickle` and :mod:`shelve`. The :mod:`marshal` module exists mainly to support reading and writing the "pseudo-compiled" code for Python modules of :file:`.pyc` files. Therefore, the Python maintainers reserve the right to modify the marshal format -in backward incompatible ways should the need arise. If you're serializing and +in backward incompatible ways should the need arise. +The format of code objects is not compatible between Python versions, +even if the version of the format is the same. +De-serializing a code object in the incorrect Python version has undefined behavior. +If you're serializing and de-serializing Python objects, use the :mod:`pickle` module instead -- the performance is comparable, version independence is guaranteed, and pickle supports a substantially wider range of objects than marshal. @@ -38,9 +42,10 @@ supports a substantially wider range of objects than marshal. Not all Python object types are supported; in general, only objects whose value is independent from a particular invocation of Python can be written and read by -this module. The following types are supported: booleans, integers, floating -point numbers, complex numbers, strings, bytes, bytearrays, tuples, lists, sets, -frozensets, dictionaries, and code objects, where it should be understood that +this module. The following types are supported: booleans, integers, floating-point +numbers, complex numbers, strings, bytes, bytearrays, tuples, lists, sets, +frozensets, dictionaries, and code objects (if *allow_code* is true), +where it should be understood that tuples, lists, sets, frozensets and dictionaries are only supported as long as the values contained therein are themselves supported. The singletons :const:`None`, :const:`Ellipsis` and :exc:`StopIteration` can also be @@ -54,7 +59,7 @@ bytes-like objects. The module defines these functions: -.. function:: dump(value, file[, version]) +.. function:: dump(value, file, version=version, /, *, allow_code=True) Write the value on the open file. The value must be a supported type. The file must be a writeable :term:`binary file`. @@ -62,19 +67,24 @@ The module defines these functions: If the value has (or contains an object that has) an unsupported type, a :exc:`ValueError` exception is raised --- but garbage data will also be written to the file. The object will not be properly read back by :func:`load`. + :ref:`Code objects ` are only supported if *allow_code* is true. The *version* argument indicates the data format that ``dump`` should use (see below). .. audit-event:: marshal.dumps value,version marshal.dump + .. versionchanged:: 3.13 + Added the *allow_code* parameter. -.. function:: load(file) + +.. function:: load(file, /, *, allow_code=True) Read one value from the open file and return it. If no valid value is read (e.g. because the data has a different Python version's incompatible marshal - format), raise :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. The - file must be a readable :term:`binary file`. + format), raise :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. + :ref:`Code objects ` are only supported if *allow_code* is true. + The file must be a readable :term:`binary file`. .. audit-event:: marshal.load "" marshal.load @@ -88,24 +98,32 @@ The module defines these functions: This call used to raise a ``code.__new__`` audit event for each code object. Now it raises a single ``marshal.load`` event for the entire load operation. + .. versionchanged:: 3.13 + Added the *allow_code* parameter. + -.. function:: dumps(value[, version]) +.. function:: dumps(value, version=version, /, *, allow_code=True) Return the bytes object that would be written to a file by ``dump(value, file)``. The value must be a supported type. Raise a :exc:`ValueError` exception if value has (or contains an object that has) an unsupported type. + :ref:`Code objects ` are only supported if *allow_code* is true. The *version* argument indicates the data format that ``dumps`` should use (see below). .. audit-event:: marshal.dumps value,version marshal.dump + .. versionchanged:: 3.13 + Added the *allow_code* parameter. -.. function:: loads(bytes) + +.. function:: loads(bytes, /, *, allow_code=True) Convert the :term:`bytes-like object` to a value. If no valid value is found, raise - :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. Extra bytes in the - input are ignored. + :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. + :ref:`Code objects ` are only supported if *allow_code* is true. + Extra bytes in the input are ignored. .. audit-event:: marshal.loads bytes marshal.load @@ -114,6 +132,9 @@ The module defines these functions: This call used to raise a ``code.__new__`` audit event for each code object. Now it raises a single ``marshal.loads`` event for the entire load operation. + .. versionchanged:: 3.13 + Added the *allow_code* parameter. + In addition, the following constants are defined: @@ -121,7 +142,7 @@ In addition, the following constants are defined: Indicates the format that the module uses. Version 0 is the historical format, version 1 shares interned strings and version 2 uses a binary format - for floating point numbers. + for floating-point numbers. Version 3 adds support for object instancing and recursion. The current version is 4. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 9e58b552..68878806 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -1,5 +1,5 @@ -:mod:`math` --- Mathematical functions -====================================== +:mod:`!math` --- Mathematical functions +======================================= .. module:: math :synopsis: Mathematical functions (sin() etc.). @@ -26,15 +26,103 @@ The following functions are provided by this module. Except when explicitly noted otherwise, all return values are floats. -Number-theoretic and representation functions ---------------------------------------------- - -.. function:: ceil(x) - - Return the ceiling of *x*, the smallest integer greater than or equal to *x*. - If *x* is not a float, delegates to :meth:`x.__ceil__ `, - which should return an :class:`~numbers.Integral` value. - +==================================================== ============================================ +**Number-theoretic functions** +-------------------------------------------------------------------------------------------------- +:func:`comb(n, k) ` Number of ways to choose *k* items from *n* items without repetition and without order +:func:`factorial(n) ` *n* factorial +:func:`gcd(*integers) ` Greatest common divisor of the integer arguments +:func:`isqrt(n) ` Integer square root of a nonnegative integer *n* +:func:`lcm(*integers) ` Least common multiple of the integer arguments +:func:`perm(n, k) ` Number of ways to choose *k* items from *n* items without repetition and with order + +**Floating point arithmetic** +-------------------------------------------------------------------------------------------------- +:func:`ceil(x) ` Ceiling of *x*, the smallest integer greater than or equal to *x* +:func:`fabs(x) ` Absolute value of *x* +:func:`floor(x) ` Floor of *x*, the largest integer less than or equal to *x* +:func:`fma(x, y, z) ` Fused multiply-add operation: ``(x * y) + z`` +:func:`fmod(x, y) ` Remainder of division ``x / y`` +:func:`modf(x) ` Fractional and integer parts of *x* +:func:`remainder(x, y) ` Remainder of *x* with respect to *y* +:func:`trunc(x) ` Integer part of *x* + +**Floating point manipulation functions** +-------------------------------------------------------------------------------------------------- +:func:`copysign(x, y) ` Magnitude (absolute value) of *x* with the sign of *y* +:func:`frexp(x) ` Mantissa and exponent of *x* +:func:`isclose(a, b, rel_tol, abs_tol) ` Check if the values *a* and *b* are close to each other +:func:`isfinite(x) ` Check if *x* is neither an infinity nor a NaN +:func:`isinf(x) ` Check if *x* is a positive or negative infinity +:func:`isnan(x) ` Check if *x* is a NaN (not a number) +:func:`ldexp(x, i) ` ``x * (2**i)``, inverse of function :func:`frexp` +:func:`nextafter(x, y, steps) ` Floating-point value *steps* steps after *x* towards *y* +:func:`ulp(x) ` Value of the least significant bit of *x* + +**Power, exponential and logarithmic functions** +-------------------------------------------------------------------------------------------------- +:func:`cbrt(x) ` Cube root of *x* +:func:`exp(x) ` *e* raised to the power *x* +:func:`exp2(x) ` *2* raised to the power *x* +:func:`expm1(x) ` *e* raised to the power *x*, minus 1 +:func:`log(x, base) ` Logarithm of *x* to the given base (*e* by default) +:func:`log1p(x) ` Natural logarithm of *1+x* (base *e*) +:func:`log2(x) ` Base-2 logarithm of *x* +:func:`log10(x) ` Base-10 logarithm of *x* +:func:`pow(x, y) ` *x* raised to the power *y* +:func:`sqrt(x) ` Square root of *x* + +**Summation and product functions** +-------------------------------------------------------------------------------------------------- +:func:`dist(p, q) ` Euclidean distance between two points *p* and *q* given as an iterable of coordinates +:func:`fsum(iterable) ` Sum of values in the input *iterable* +:func:`hypot(*coordinates) ` Euclidean norm of an iterable of coordinates +:func:`prod(iterable, start) ` Product of elements in the input *iterable* with a *start* value +:func:`sumprod(p, q) ` Sum of products from two iterables *p* and *q* + +**Angular conversion** +-------------------------------------------------------------------------------------------------- +:func:`degrees(x) ` Convert angle *x* from radians to degrees +:func:`radians(x) ` Convert angle *x* from degrees to radians + +**Trigonometric functions** +-------------------------------------------------------------------------------------------------- +:func:`acos(x) ` Arc cosine of *x* +:func:`asin(x) ` Arc sine of *x* +:func:`atan(x) ` Arc tangent of *x* +:func:`atan2(y, x) ` ``atan(y / x)`` +:func:`cos(x) ` Cosine of *x* +:func:`sin(x) ` Sine of *x* +:func:`tan(x) ` Tangent of *x* + +**Hyperbolic functions** +-------------------------------------------------------------------------------------------------- +:func:`acosh(x) ` Inverse hyperbolic cosine of *x* +:func:`asinh(x) ` Inverse hyperbolic sine of *x* +:func:`atanh(x) ` Inverse hyperbolic tangent of *x* +:func:`cosh(x) ` Hyperbolic cosine of *x* +:func:`sinh(x) ` Hyperbolic sine of *x* +:func:`tanh(x) ` Hyperbolic tangent of *x* + +**Special functions** +-------------------------------------------------------------------------------------------------- +:func:`erf(x) ` `Error function `_ at *x* +:func:`erfc(x) ` `Complementary error function `_ at *x* +:func:`gamma(x) ` `Gamma function `_ at *x* +:func:`lgamma(x) ` Natural logarithm of the absolute value of the `Gamma function `_ at *x* + +**Constants** +-------------------------------------------------------------------------------------------------- +:data:`pi` *π* = 3.141592... +:data:`e` *e* = 2.718281... +:data:`tau` *τ* = 2\ *π* = 6.283185... +:data:`inf` Positive infinity +:data:`nan` "Not a number" (NaN) +==================================================== ============================================ + + +Number-theoretic functions +-------------------------- .. function:: comb(n, k) @@ -54,25 +142,85 @@ Number-theoretic and representation functions .. versionadded:: 3.8 -.. function:: copysign(x, y) +.. function:: factorial(n) - Return a float with the magnitude (absolute value) of *x* but the sign of - *y*. On platforms that support signed zeros, ``copysign(1.0, -0.0)`` - returns *-1.0*. + Return *n* factorial as an integer. Raises :exc:`ValueError` if *n* is not integral or + is negative. + .. versionchanged:: 3.10 + Floats with integral values (like ``5.0``) are no longer accepted. -.. function:: fabs(x) - Return the absolute value of *x*. +.. function:: gcd(*integers) + Return the greatest common divisor of the specified integer arguments. + If any of the arguments is nonzero, then the returned value is the largest + positive integer that is a divisor of all arguments. If all arguments + are zero, then the returned value is ``0``. ``gcd()`` without arguments + returns ``0``. -.. function:: factorial(n) + .. versionadded:: 3.5 - Return *n* factorial as an integer. Raises :exc:`ValueError` if *n* is not integral or - is negative. + .. versionchanged:: 3.9 + Added support for an arbitrary number of arguments. Formerly, only two + arguments were supported. - .. deprecated:: 3.9 - Accepting floats with integral values (like ``5.0``) is deprecated. + +.. function:: isqrt(n) + + Return the integer square root of the nonnegative integer *n*. This is the + floor of the exact square root of *n*, or equivalently the greatest integer + *a* such that *a*\ ² |nbsp| ≤ |nbsp| *n*. + + For some applications, it may be more convenient to have the least integer + *a* such that *n* |nbsp| ≤ |nbsp| *a*\ ², or in other words the ceiling of + the exact square root of *n*. For positive *n*, this can be computed using + ``a = 1 + isqrt(n - 1)``. + + .. versionadded:: 3.8 + + +.. function:: lcm(*integers) + + Return the least common multiple of the specified integer arguments. + If all arguments are nonzero, then the returned value is the smallest + positive integer that is a multiple of all arguments. If any of the arguments + is zero, then the returned value is ``0``. ``lcm()`` without arguments + returns ``1``. + + .. versionadded:: 3.9 + + +.. function:: perm(n, k=None) + + Return the number of ways to choose *k* items from *n* items + without repetition and with order. + + Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates + to zero when ``k > n``. + + If *k* is not specified or is ``None``, then *k* defaults to *n* + and the function returns ``n!``. + + Raises :exc:`TypeError` if either of the arguments are not integers. + Raises :exc:`ValueError` if either of the arguments are negative. + + .. versionadded:: 3.8 + + +Floating point arithmetic +------------------------- + +.. function:: ceil(x) + + Return the ceiling of *x*, the smallest integer greater than or equal to *x*. + If *x* is not a float, delegates to :meth:`x.__ceil__ `, + which should return an :class:`~numbers.Integral` value. + + +.. function:: fabs(x) + + Return the absolute value of *x*. .. function:: floor(x) @@ -82,6 +230,22 @@ Number-theoretic and representation functions should return an :class:`~numbers.Integral` value. +.. function:: fma(x, y, z) + + Fused multiply-add operation. Return ``(x * y) + z``, computed as though with + infinite precision and range followed by a single round to the ``float`` + format. This operation often provides better accuracy than the direct + expression ``(x * y) + z``. + + This function follows the specification of the fusedMultiplyAdd operation + described in the IEEE 754 standard. The standard leaves one case + implementation-defined, namely the result of ``fma(0, inf, nan)`` + and ``fma(inf, 0, nan)``. In these cases, ``math.fma`` returns a NaN, + and does not raise any exception. + + .. versionadded:: 3.13 + + .. function:: fmod(x, y) Return ``fmod(x, y)``, as defined by the platform C library. Note that the @@ -97,64 +261,97 @@ Number-theoretic and representation functions floats, while Python's ``x % y`` is preferred when working with integers. -.. function:: frexp(x) +.. function:: modf(x) - Return the mantissa and exponent of *x* as the pair ``(m, e)``. *m* is a float - and *e* is an integer such that ``x == m * 2**e`` exactly. If *x* is zero, - returns ``(0.0, 0)``, otherwise ``0.5 <= abs(m) < 1``. This is used to "pick - apart" the internal representation of a float in a portable way. + Return the fractional and integer parts of *x*. Both results carry the sign + of *x* and are floats. + Note that :func:`modf` has a different call/return pattern + than its C equivalents: it takes a single argument and return a pair of + values, rather than returning its second return value through an 'output + parameter' (there is no such thing in Python). -.. function:: fsum(iterable) - Return an accurate floating point sum of values in the iterable. Avoids - loss of precision by tracking multiple intermediate partial sums. +.. function:: remainder(x, y) - The algorithm's accuracy depends on IEEE-754 arithmetic guarantees and the - typical case where the rounding mode is half-even. On some non-Windows - builds, the underlying C library uses extended precision addition and may - occasionally double-round an intermediate sum causing it to be off in its - least significant bit. + Return the IEEE 754-style remainder of *x* with respect to *y*. For + finite *x* and finite nonzero *y*, this is the difference ``x - n*y``, + where ``n`` is the closest integer to the exact value of the quotient ``x / + y``. If ``x / y`` is exactly halfway between two consecutive integers, the + nearest *even* integer is used for ``n``. The remainder ``r = remainder(x, + y)`` thus always satisfies ``abs(r) <= 0.5 * abs(y)``. - For further discussion and two alternative approaches, see the `ASPN cookbook - recipes for accurate floating point summation - `_\. + Special cases follow IEEE 754: in particular, ``remainder(x, math.inf)`` is + *x* for any finite *x*, and ``remainder(x, 0)`` and + ``remainder(math.inf, x)`` raise :exc:`ValueError` for any non-NaN *x*. + If the result of the remainder operation is zero, that zero will have + the same sign as *x*. + On platforms using IEEE 754 binary floating point, the result of this + operation is always exactly representable: no rounding error is introduced. -.. function:: gcd(*integers) + .. versionadded:: 3.7 - Return the greatest common divisor of the specified integer arguments. - If any of the arguments is nonzero, then the returned value is the largest - positive integer that is a divisor of all arguments. If all arguments - are zero, then the returned value is ``0``. ``gcd()`` without arguments - returns ``0``. - .. versionadded:: 3.5 +.. function:: trunc(x) - .. versionchanged:: 3.9 - Added support for an arbitrary number of arguments. Formerly, only two - arguments were supported. + Return *x* with the fractional part + removed, leaving the integer part. This rounds toward 0: ``trunc()`` is + equivalent to :func:`floor` for positive *x*, and equivalent to :func:`ceil` + for negative *x*. If *x* is not a float, delegates to :meth:`x.__trunc__ + `, which should return an :class:`~numbers.Integral` value. + + +For the :func:`ceil`, :func:`floor`, and :func:`modf` functions, note that *all* +floating-point numbers of sufficiently large magnitude are exact integers. +Python floats typically carry no more than 53 bits of precision (the same as the +platform C double type), in which case any float *x* with ``abs(x) >= 2**52`` +necessarily has no fractional bits. + + +Floating point manipulation functions +------------------------------------- + +.. function:: copysign(x, y) + + Return a float with the magnitude (absolute value) of *x* but the sign of + *y*. On platforms that support signed zeros, ``copysign(1.0, -0.0)`` + returns *-1.0*. +.. function:: frexp(x) + + Return the mantissa and exponent of *x* as the pair ``(m, e)``. *m* is a float + and *e* is an integer such that ``x == m * 2**e`` exactly. If *x* is zero, + returns ``(0.0, 0)``, otherwise ``0.5 <= abs(m) < 1``. This is used to "pick + apart" the internal representation of a float in a portable way. + + Note that :func:`frexp` has a different call/return pattern + than its C equivalents: it takes a single argument and return a pair of + values, rather than returning its second return value through an 'output + parameter' (there is no such thing in Python). + .. function:: isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) Return ``True`` if the values *a* and *b* are close to each other and ``False`` otherwise. Whether or not two values are considered close is determined according to - given absolute and relative tolerances. + given absolute and relative tolerances. If no errors occur, the result will + be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. *rel_tol* is the relative tolerance -- it is the maximum allowed difference between *a* and *b*, relative to the larger absolute value of *a* or *b*. For example, to set a tolerance of 5%, pass ``rel_tol=0.05``. The default tolerance is ``1e-09``, which assures that the two values are the same - within about 9 decimal digits. *rel_tol* must be greater than zero. - - *abs_tol* is the minimum absolute tolerance -- useful for comparisons near - zero. *abs_tol* must be at least zero. + within about 9 decimal digits. *rel_tol* must be nonnegative and less + than ``1.0``. - If no errors occur, the result will be: - ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. + *abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be + nonnegative. When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed + as ``abs(x) <= rel_tol * abs(x)``, which is ``False`` for any ``x`` and + rel_tol less than ``1.0``. So add an appropriate positive abs_tol argument + to the call. The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be handled according to IEEE rules. Specifically, ``NaN`` is not considered @@ -187,43 +384,12 @@ Number-theoretic and representation functions Return ``True`` if *x* is a NaN (not a number), and ``False`` otherwise. -.. function:: isqrt(n) - - Return the integer square root of the nonnegative integer *n*. This is the - floor of the exact square root of *n*, or equivalently the greatest integer - *a* such that *a*\ ² |nbsp| ≤ |nbsp| *n*. - - For some applications, it may be more convenient to have the least integer - *a* such that *n* |nbsp| ≤ |nbsp| *a*\ ², or in other words the ceiling of - the exact square root of *n*. For positive *n*, this can be computed using - ``a = 1 + isqrt(n - 1)``. - - .. versionadded:: 3.8 - - -.. function:: lcm(*integers) - - Return the least common multiple of the specified integer arguments. - If all arguments are nonzero, then the returned value is the smallest - positive integer that is a multiple of all arguments. If any of the arguments - is zero, then the returned value is ``0``. ``lcm()`` without arguments - returns ``1``. - - .. versionadded:: 3.9 - - .. function:: ldexp(x, i) Return ``x * (2**i)``. This is essentially the inverse of function :func:`frexp`. -.. function:: modf(x) - - Return the fractional and integer parts of *x*. Both results carry the sign - of *x* and are floats. - - .. function:: nextafter(x, y, steps=1) Return the floating-point value *steps* steps after *x* towards *y*. @@ -239,84 +405,11 @@ Number-theoretic and representation functions See also :func:`math.ulp`. - .. versionchanged:: 3.12 - Added the *steps* argument. - .. versionadded:: 3.9 -.. function:: perm(n, k=None) - - Return the number of ways to choose *k* items from *n* items - without repetition and with order. - - Evaluates to ``n! / (n - k)!`` when ``k <= n`` and evaluates - to zero when ``k > n``. - - If *k* is not specified or is None, then *k* defaults to *n* - and the function returns ``n!``. - - Raises :exc:`TypeError` if either of the arguments are not integers. - Raises :exc:`ValueError` if either of the arguments are negative. - - .. versionadded:: 3.8 - - -.. function:: prod(iterable, *, start=1) - - Calculate the product of all the elements in the input *iterable*. - The default *start* value for the product is ``1``. - - When the iterable is empty, return the start value. This function is - intended specifically for use with numeric values and may reject - non-numeric types. - - .. versionadded:: 3.8 - - -.. function:: remainder(x, y) - - Return the IEEE 754-style remainder of *x* with respect to *y*. For - finite *x* and finite nonzero *y*, this is the difference ``x - n*y``, - where ``n`` is the closest integer to the exact value of the quotient ``x / - y``. If ``x / y`` is exactly halfway between two consecutive integers, the - nearest *even* integer is used for ``n``. The remainder ``r = remainder(x, - y)`` thus always satisfies ``abs(r) <= 0.5 * abs(y)``. - - Special cases follow IEEE 754: in particular, ``remainder(x, math.inf)`` is - *x* for any finite *x*, and ``remainder(x, 0)`` and - ``remainder(math.inf, x)`` raise :exc:`ValueError` for any non-NaN *x*. - If the result of the remainder operation is zero, that zero will have - the same sign as *x*. - - On platforms using IEEE 754 binary floating-point, the result of this - operation is always exactly representable: no rounding error is introduced. - - .. versionadded:: 3.7 - - -.. function:: sumprod(p, q) - - Return the sum of products of values from two iterables *p* and *q*. - - Raises :exc:`ValueError` if the inputs do not have the same length. - - Roughly equivalent to:: - - sum(itertools.starmap(operator.mul, zip(p, q, strict=True))) - - For float and mixed int/float inputs, the intermediate products - and sums are computed with extended precision. - - .. versionadded:: 3.12 - + .. versionchanged:: 3.12 + Added the *steps* argument. -.. function:: trunc(x) - - Return *x* with the fractional part - removed, leaving the integer part. This rounds toward 0: ``trunc()`` is - equivalent to :func:`floor` for positive *x*, and equivalent to :func:`ceil` - for negative *x*. If *x* is not a float, delegates to :meth:`x.__trunc__ - `, which should return an :class:`~numbers.Integral` value. .. function:: ulp(x) @@ -343,20 +436,8 @@ Number-theoretic and representation functions .. versionadded:: 3.9 -Note that :func:`frexp` and :func:`modf` have a different call/return pattern -than their C equivalents: they take a single argument and return a pair of -values, rather than returning their second return value through an 'output -parameter' (there is no such thing in Python). - -For the :func:`ceil`, :func:`floor`, and :func:`modf` functions, note that *all* -floating-point numbers of sufficiently large magnitude are exact integers. -Python floats typically carry no more than 53 bits of precision (the same as the -platform C double type), in which case any float *x* with ``abs(x) >= 2**52`` -necessarily has no fractional bits. - - -Power and logarithmic functions -------------------------------- +Power, exponential and logarithmic functions +-------------------------------------------- .. function:: cbrt(x) @@ -431,11 +512,11 @@ Power and logarithmic functions .. function:: pow(x, y) - Return ``x`` raised to the power ``y``. Exceptional cases follow + Return *x* raised to the power *y*. Exceptional cases follow the IEEE 754 standard as far as possible. In particular, ``pow(1.0, x)`` and ``pow(x, 0.0)`` always return ``1.0``, even - when ``x`` is a zero or a NaN. If both ``x`` and ``y`` are finite, - ``x`` is negative, and ``y`` is not an integer then ``pow(x, y)`` + when *x* is a zero or a NaN. If both *x* and *y* are finite, + *x* is negative, and *y* is not an integer then ``pow(x, y)`` is undefined, and raises :exc:`ValueError`. Unlike the built-in ``**`` operator, :func:`math.pow` converts both @@ -453,41 +534,8 @@ Power and logarithmic functions Return the square root of *x*. -Trigonometric functions ------------------------ - -.. function:: acos(x) - - Return the arc cosine of *x*, in radians. The result is between ``0`` and - ``pi``. - - -.. function:: asin(x) - - Return the arc sine of *x*, in radians. The result is between ``-pi/2`` and - ``pi/2``. - - -.. function:: atan(x) - - Return the arc tangent of *x*, in radians. The result is between ``-pi/2`` and - ``pi/2``. - - -.. function:: atan2(y, x) - - Return ``atan(y / x)``, in radians. The result is between ``-pi`` and ``pi``. - The vector in the plane from the origin to point ``(x, y)`` makes this angle - with the positive X axis. The point of :func:`atan2` is that the signs of both - inputs are known to it, so it can compute the correct quadrant for the angle. - For example, ``atan(1)`` and ``atan2(1, 1)`` are both ``pi/4``, but ``atan2(-1, - -1)`` is ``-3*pi/4``. - - -.. function:: cos(x) - - Return the cosine of *x* radians. - +Summation and product functions +------------------------------- .. function:: dist(p, q) @@ -502,6 +550,22 @@ Trigonometric functions .. versionadded:: 3.8 +.. function:: fsum(iterable) + + Return an accurate floating-point sum of values in the iterable. Avoids + loss of precision by tracking multiple intermediate partial sums. + + The algorithm's accuracy depends on IEEE-754 arithmetic guarantees and the + typical case where the rounding mode is half-even. On some non-Windows + builds, the underlying C library uses extended precision addition and may + occasionally double-round an intermediate sum causing it to be off in its + least significant bit. + + For further discussion and two alternative approaches, see the `ASPN cookbook + recipes for accurate floating-point summation + `_\. + + .. function:: hypot(*coordinates) Return the Euclidean norm, ``sqrt(sum(x**2 for x in coordinates))``. @@ -522,14 +586,32 @@ Trigonometric functions is almost always correctly rounded to within 1/2 ulp. -.. function:: sin(x) +.. function:: prod(iterable, *, start=1) - Return the sine of *x* radians. + Calculate the product of all the elements in the input *iterable*. + The default *start* value for the product is ``1``. + When the iterable is empty, return the start value. This function is + intended specifically for use with numeric values and may reject + non-numeric types. -.. function:: tan(x) + .. versionadded:: 3.8 - Return the tangent of *x* radians. + +.. function:: sumprod(p, q) + + Return the sum of products of values from two iterables *p* and *q*. + + Raises :exc:`ValueError` if the inputs do not have the same length. + + Roughly equivalent to:: + + sum(itertools.starmap(operator.mul, zip(p, q, strict=True))) + + For float and mixed int/float inputs, the intermediate products + and sums are computed with extended precision. + + .. versionadded:: 3.12 Angular conversion @@ -545,6 +627,52 @@ Angular conversion Convert angle *x* from degrees to radians. +Trigonometric functions +----------------------- + +.. function:: acos(x) + + Return the arc cosine of *x*, in radians. The result is between ``0`` and + ``pi``. + + +.. function:: asin(x) + + Return the arc sine of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. + + +.. function:: atan(x) + + Return the arc tangent of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. + + +.. function:: atan2(y, x) + + Return ``atan(y / x)``, in radians. The result is between ``-pi`` and ``pi``. + The vector in the plane from the origin to point ``(x, y)`` makes this angle + with the positive X axis. The point of :func:`atan2` is that the signs of both + inputs are known to it, so it can compute the correct quadrant for the angle. + For example, ``atan(1)`` and ``atan2(1, 1)`` are both ``pi/4``, but ``atan2(-1, + -1)`` is ``-3*pi/4``. + + +.. function:: cos(x) + + Return the cosine of *x* radians. + + +.. function:: sin(x) + + Return the sine of *x* radians. + + +.. function:: tan(x) + + Return the tangent of *x* radians. + + Hyperbolic functions -------------------- @@ -592,7 +720,7 @@ Special functions The :func:`erf` function can be used to compute traditional statistical functions such as the `cumulative standard normal distribution - `_:: + `_:: def phi(x): 'Cumulative distribution function for the standard normal distribution' @@ -680,11 +808,11 @@ Constants >>> math.isnan(float('nan')) True + .. versionadded:: 3.5 + .. versionchanged:: 3.11 It is now always available. - .. versionadded:: 3.5 - .. impl-detail:: diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst index f610032a..8ad48505 100644 --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -1,5 +1,5 @@ -:mod:`mimetypes` --- Map filenames to MIME types -================================================ +:mod:`!mimetypes` --- Map filenames to MIME types +================================================= .. module:: mimetypes :synopsis: Mapping of filename extensions to MIME types. @@ -52,7 +52,22 @@ the information :func:`init` sets up. are also recognized. .. versionchanged:: 3.8 - Added support for url being a :term:`path-like object`. + Added support for *url* being a :term:`path-like object`. + + .. deprecated:: 3.13 + Passing a file path instead of URL is :term:`soft deprecated`. + Use :func:`guess_file_type` for this. + + +.. function:: guess_file_type(path, *, strict=True) + + .. index:: pair: MIME; headers + + Guess the type of a file based on its path, given by *path*. + Similar to the :func:`guess_type` function, but accepts a path instead of URL. + Path can be a string, a bytes object or a :term:`path-like object`. + + .. versionadded:: 3.13 .. function:: guess_all_extensions(type, strict=True) @@ -61,7 +76,7 @@ the information :func:`init` sets up. return value is a list of strings giving all possible filename extensions, including the leading dot (``'.'``). The extensions are not guaranteed to have been associated with any particular data stream, but would be mapped to the MIME - type *type* by :func:`guess_type`. + type *type* by :func:`guess_type` and :func:`guess_file_type`. The optional *strict* argument has the same meaning as with the :func:`guess_type` function. @@ -72,8 +87,8 @@ the information :func:`init` sets up. return value is a string giving a filename extension, including the leading dot (``'.'``). The extension is not guaranteed to have been associated with any particular data stream, but would be mapped to the MIME type *type* by - :func:`guess_type`. If no extension can be guessed for *type*, ``None`` is - returned. + :func:`guess_type` and :func:`guess_file_type`. + If no extension can be guessed for *type*, ``None`` is returned. The optional *strict* argument has the same meaning as with the :func:`guess_type` function. @@ -238,6 +253,14 @@ than one MIME-type database; it provides an interface similar to the one of the the object. + .. method:: MimeTypes.guess_file_type(path, *, strict=True) + + Similar to the :func:`guess_file_type` function, using the tables stored + as part of the object. + + .. versionadded:: 3.13 + + .. method:: MimeTypes.guess_all_extensions(type, strict=True) Similar to the :func:`guess_all_extensions` function, using the tables stored @@ -272,3 +295,13 @@ than one MIME-type database; it provides an interface similar to the one of the types, else to the list of non-standard types. .. versionadded:: 3.2 + + + .. method:: MimeTypes.add_type(type, ext, strict=True) + + Add a mapping from the MIME type *type* to the extension *ext*. When the + extension is already known, the new type will replace the old one. When the type + is already known the extension will be added to the list of known extensions. + + When *strict* is ``True`` (the default), the mapping will be added to the + official MIME types, otherwise to the non-standard ones. diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 69afadff..4e20c073 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -1,5 +1,5 @@ -:mod:`mmap` --- Memory-mapped file support -========================================== +:mod:`!mmap` --- Memory-mapped file support +=========================================== .. module:: mmap :synopsis: Interface to memory-mapped files for Unix and Windows. @@ -19,7 +19,7 @@ the current file position, and :meth:`seek` through the file to different positi A memory-mapped file is created by the :class:`~mmap.mmap` constructor, which is different on Unix and on Windows. In either case you must provide a file descriptor for a file opened for update. If you wish to map an existing Python -file object, use its :meth:`fileno` method to obtain the correct value for the +file object, use its :meth:`~io.IOBase.fileno` method to obtain the correct value for the *fileno* parameter. Otherwise, you can open the file using the :func:`os.open` function, which returns a file descriptor directly (the file still needs to be closed when done). @@ -48,7 +48,7 @@ update the underlying file. To map anonymous memory, -1 should be passed as the fileno along with the length. -.. class:: mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset]) +.. class:: mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT, offset=0) **(Windows version)** Maps *length* bytes from the file specified by the file handle *fileno*, and creates a mmap object. If *length* is larger @@ -62,8 +62,8 @@ To map anonymous memory, -1 should be passed as the fileno along with the length the same file. If you specify the name of an existing tag, that tag is opened, otherwise a new tag of this name is created. If this parameter is omitted or ``None``, the mapping is created without a name. Avoiding the - use of the tag parameter will assist in keeping your code portable between - Unix and Windows. + use of the *tagname* parameter will assist in keeping your code portable + between Unix and Windows. *offset* may be specified as a non-negative integer offset. mmap references will be relative to the offset from the beginning of the file. *offset* @@ -71,7 +71,8 @@ To map anonymous memory, -1 should be passed as the fileno along with the length .. audit-event:: mmap.__new__ fileno,length,access,offset mmap.mmap -.. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset]) +.. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, \ + access=ACCESS_DEFAULT, offset=0, *, trackfd=True) :noindex: **(Unix version)** Maps *length* bytes from the file specified by the file @@ -102,10 +103,20 @@ To map anonymous memory, -1 should be passed as the fileno along with the length defaults to 0. *offset* must be a multiple of :const:`ALLOCATIONGRANULARITY` which is equal to :const:`PAGESIZE` on Unix systems. + If *trackfd* is ``False``, the file descriptor specified by *fileno* will + not be duplicated, and the resulting :class:`!mmap` object will not + be associated with the map's underlying file. + This means that the :meth:`~mmap.mmap.size` and :meth:`~mmap.mmap.resize` + methods will fail. + This mode is useful to limit the number of open file descriptors. + To ensure validity of the created memory mapping the file specified by the descriptor *fileno* is internally automatically synchronized with the physical backing store on macOS. + .. versionchanged:: 3.13 + The *trackfd* parameter was added. + This example shows a simple way of using :class:`~mmap.mmap`:: import mmap @@ -254,9 +265,12 @@ To map anonymous memory, -1 should be passed as the fileno along with the length .. method:: resize(newsize) - Resizes the map and the underlying file, if any. If the mmap was created - with :const:`ACCESS_READ` or :const:`ACCESS_COPY`, resizing the map will - raise a :exc:`TypeError` exception. + Resizes the map and the underlying file, if any. + + Resizing a map created with *access* of :const:`ACCESS_READ` or + :const:`ACCESS_COPY`, will raise a :exc:`TypeError` exception. + Resizing a map created with with *trackfd* set to ``False``, + will raise a :exc:`ValueError` exception. **On Windows**: Resizing the map will raise an :exc:`OSError` if there are other maps against the same named file. Resizing an anonymous map (ie against the @@ -285,6 +299,14 @@ To map anonymous memory, -1 should be passed as the fileno along with the length values are ``os.SEEK_CUR`` or ``1`` (seek relative to the current position) and ``os.SEEK_END`` or ``2`` (seek relative to the file's end). + .. versionchanged:: 3.13 + Return the new absolute position instead of ``None``. + + .. method:: seekable() + + Return whether the file supports seeking, and the return value is always ``True``. + + .. versionadded:: 3.13 .. method:: size() @@ -364,14 +386,25 @@ MAP_* Constants .. data:: MAP_SHARED MAP_PRIVATE - MAP_DENYWRITE - MAP_EXECUTABLE + MAP_32BIT + MAP_ALIGNED_SUPER MAP_ANON MAP_ANONYMOUS + MAP_CONCEAL + MAP_DENYWRITE + MAP_EXECUTABLE + MAP_HASSEMAPHORE + MAP_JIT + MAP_NOCACHE + MAP_NOEXTEND + MAP_NORESERVE MAP_POPULATE + MAP_RESILIENT_CODESIGN + MAP_RESILIENT_MEDIA MAP_STACK - MAP_ALIGNED_SUPER - MAP_CONCEAL + MAP_TPRO + MAP_TRANSLATED_ALLOW_EXECUTE + MAP_UNIX03 These are the various flags that can be passed to :meth:`mmap.mmap`. :data:`MAP_ALIGNED_SUPER` is only available at FreeBSD and :data:`MAP_CONCEAL` is only available at OpenBSD. Note @@ -384,5 +417,12 @@ MAP_* Constants Added :data:`MAP_STACK` constant. .. versionadded:: 3.12 - Added :data:`MAP_ALIGNED_SUPER` constant. - Added :data:`MAP_CONCEAL` constant. + Added :data:`MAP_ALIGNED_SUPER` and :data:`MAP_CONCEAL` constants. + + .. versionadded:: 3.13 + Added :data:`MAP_32BIT`, :data:`MAP_HASSEMAPHORE`, :data:`MAP_JIT`, + :data:`MAP_NOCACHE`, :data:`MAP_NOEXTEND`, :data:`MAP_NORESERVE`, + :data:`MAP_RESILIENT_CODESIGN`, :data:`MAP_RESILIENT_MEDIA`, + :data:`MAP_TPRO`, :data:`MAP_TRANSLATED_ALLOW_EXECUTE`, and + :data:`MAP_UNIX03` constants. + diff --git a/Doc/library/modulefinder.rst b/Doc/library/modulefinder.rst index 526f0ff8..823d853f 100644 --- a/Doc/library/modulefinder.rst +++ b/Doc/library/modulefinder.rst @@ -1,5 +1,5 @@ -:mod:`modulefinder` --- Find modules used by a script -===================================================== +:mod:`!modulefinder` --- Find modules used by a script +====================================================== .. module:: modulefinder :synopsis: Find modules used by a script. diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index fbe55db9..eb1ac551 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -1,565 +1,15 @@ -:mod:`msilib` --- Read and write Microsoft Installer files -========================================================== +:mod:`!msilib` --- Read and write Microsoft Installer files +=========================================================== .. module:: msilib - :platform: Windows - :synopsis: Creation of Microsoft Installer files, and CAB files. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Martin v. Löwis -.. sectionauthor:: Martin v. Löwis - -**Source code:** :source:`Lib/msilib/__init__.py` - -.. index:: single: msi - .. deprecated-removed:: 3.11 3.13 - The :mod:`msilib` module is deprecated - (see :pep:`PEP 594 <594#msilib>` for details). - --------------- - -The :mod:`msilib` supports the creation of Microsoft Installer (``.msi``) files. -Because these files often contain an embedded "cabinet" file (``.cab``), it also -exposes an API to create CAB files. Support for reading ``.cab`` files is -currently not implemented; read support for the ``.msi`` database is possible. - -This package aims to provide complete access to all tables in an ``.msi`` file, -therefore, it is a fairly low-level API. One primary application of this -package is the creation of Python installer package itself (although that currently -uses a different version of ``msilib``). - -The package contents can be roughly split into four parts: low-level CAB -routines, low-level MSI routines, higher-level MSI routines, and standard table -structures. - - -.. function:: FCICreate(cabname, files) - - Create a new CAB file named *cabname*. *files* must be a list of tuples, each - containing the name of the file on disk, and the name of the file inside the CAB - file. - - The files are added to the CAB file in the order they appear in the list. All - files are added into a single CAB file, using the MSZIP compression algorithm. - - Callbacks to Python for the various steps of MSI creation are currently not - exposed. - - -.. function:: UuidCreate() - - Return the string representation of a new unique identifier. This wraps the - Windows API functions :c:func:`UuidCreate` and :c:func:`UuidToString`. - - -.. function:: OpenDatabase(path, persist) - - Return a new database object by calling MsiOpenDatabase. *path* is the file - name of the MSI file; *persist* can be one of the constants - ``MSIDBOPEN_CREATEDIRECT``, ``MSIDBOPEN_CREATE``, ``MSIDBOPEN_DIRECT``, - ``MSIDBOPEN_READONLY``, or ``MSIDBOPEN_TRANSACT``, and may include the flag - ``MSIDBOPEN_PATCHFILE``. See the Microsoft documentation for the meaning of - these flags; depending on the flags, an existing database is opened, or a new - one created. - - -.. function:: CreateRecord(count) - - Return a new record object by calling :c:func:`MSICreateRecord`. *count* is the - number of fields of the record. - - -.. function:: init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer) - - Create and return a new database *name*, initialize it with *schema*, and set - the properties *ProductName*, *ProductCode*, *ProductVersion*, and - *Manufacturer*. - - *schema* must be a module object containing ``tables`` and - ``_Validation_records`` attributes; typically, :mod:`msilib.schema` should be - used. - - The database will contain just the schema and the validation records when this - function returns. - - -.. function:: add_data(database, table, records) - - Add all *records* to the table named *table* in *database*. - - The *table* argument must be one of the predefined tables in the MSI schema, - e.g. ``'Feature'``, ``'File'``, ``'Component'``, ``'Dialog'``, ``'Control'``, - etc. - - *records* should be a list of tuples, each one containing all fields of a - record according to the schema of the table. For optional fields, - ``None`` can be passed. - - Field values can be ints, strings, or instances of the Binary class. - - -.. class:: Binary(filename) - - Represents entries in the Binary table; inserting such an object using - :func:`add_data` reads the file named *filename* into the table. - - -.. function:: add_tables(database, module) - - Add all table content from *module* to *database*. *module* must contain an - attribute *tables* listing all tables for which content should be added, and one - attribute per table that has the actual content. - - This is typically used to install the sequence tables. - - -.. function:: add_stream(database, name, path) - - Add the file *path* into the ``_Stream`` table of *database*, with the stream - name *name*. - - -.. function:: gen_uuid() - - Return a new UUID, in the format that MSI typically requires (i.e. in curly - braces, and with all hexdigits in uppercase). - - -.. seealso:: - - `FCICreate `_ - `UuidCreate `_ - `UuidToString `_ - -.. _database-objects: - -Database Objects ----------------- - - -.. method:: Database.OpenView(sql) - - Return a view object, by calling :c:func:`MSIDatabaseOpenView`. *sql* is the SQL - statement to execute. - - -.. method:: Database.Commit() - - Commit the changes pending in the current transaction, by calling - :c:func:`MSIDatabaseCommit`. - - -.. method:: Database.GetSummaryInformation(count) - - Return a new summary information object, by calling - :c:func:`MsiGetSummaryInformation`. *count* is the maximum number of updated - values. - -.. method:: Database.Close() - - Close the database object, through :c:func:`MsiCloseHandle`. - - .. versionadded:: 3.7 - -.. seealso:: - - `MSIDatabaseOpenView `_ - `MSIDatabaseCommit `_ - `MSIGetSummaryInformation `_ - `MsiCloseHandle `_ - -.. _view-objects: - -View Objects ------------- - - -.. method:: View.Execute(params) - - Execute the SQL query of the view, through :c:func:`MSIViewExecute`. If - *params* is not ``None``, it is a record describing actual values of the - parameter tokens in the query. - - -.. method:: View.GetColumnInfo(kind) - - Return a record describing the columns of the view, through calling - :c:func:`MsiViewGetColumnInfo`. *kind* can be either ``MSICOLINFO_NAMES`` or - ``MSICOLINFO_TYPES``. - - -.. method:: View.Fetch() - - Return a result record of the query, through calling :c:func:`MsiViewFetch`. - - -.. method:: View.Modify(kind, data) - - Modify the view, by calling :c:func:`MsiViewModify`. *kind* can be one of - ``MSIMODIFY_SEEK``, ``MSIMODIFY_REFRESH``, ``MSIMODIFY_INSERT``, - ``MSIMODIFY_UPDATE``, ``MSIMODIFY_ASSIGN``, ``MSIMODIFY_REPLACE``, - ``MSIMODIFY_MERGE``, ``MSIMODIFY_DELETE``, ``MSIMODIFY_INSERT_TEMPORARY``, - ``MSIMODIFY_VALIDATE``, ``MSIMODIFY_VALIDATE_NEW``, - ``MSIMODIFY_VALIDATE_FIELD``, or ``MSIMODIFY_VALIDATE_DELETE``. - - *data* must be a record describing the new data. - - -.. method:: View.Close() - - Close the view, through :c:func:`MsiViewClose`. - - -.. seealso:: - - `MsiViewExecute `_ - `MSIViewGetColumnInfo `_ - `MsiViewFetch `_ - `MsiViewModify `_ - `MsiViewClose `_ - -.. _summary-objects: - -Summary Information Objects ---------------------------- - - -.. method:: SummaryInformation.GetProperty(field) - - Return a property of the summary, through :c:func:`MsiSummaryInfoGetProperty`. - *field* is the name of the property, and can be one of the constants - ``PID_CODEPAGE``, ``PID_TITLE``, ``PID_SUBJECT``, ``PID_AUTHOR``, - ``PID_KEYWORDS``, ``PID_COMMENTS``, ``PID_TEMPLATE``, ``PID_LASTAUTHOR``, - ``PID_REVNUMBER``, ``PID_LASTPRINTED``, ``PID_CREATE_DTM``, - ``PID_LASTSAVE_DTM``, ``PID_PAGECOUNT``, ``PID_WORDCOUNT``, ``PID_CHARCOUNT``, - ``PID_APPNAME``, or ``PID_SECURITY``. - - -.. method:: SummaryInformation.GetPropertyCount() - - Return the number of summary properties, through - :c:func:`MsiSummaryInfoGetPropertyCount`. - - -.. method:: SummaryInformation.SetProperty(field, value) - - Set a property through :c:func:`MsiSummaryInfoSetProperty`. *field* can have the - same values as in :meth:`GetProperty`, *value* is the new value of the property. - Possible value types are integer and string. - - -.. method:: SummaryInformation.Persist() - - Write the modified properties to the summary information stream, using - :c:func:`MsiSummaryInfoPersist`. - - -.. seealso:: - - `MsiSummaryInfoGetProperty `_ - `MsiSummaryInfoGetPropertyCount `_ - `MsiSummaryInfoSetProperty `_ - `MsiSummaryInfoPersist `_ - -.. _record-objects: - -Record Objects --------------- - - -.. method:: Record.GetFieldCount() - - Return the number of fields of the record, through - :c:func:`MsiRecordGetFieldCount`. - - -.. method:: Record.GetInteger(field) - - Return the value of *field* as an integer where possible. *field* must - be an integer. - - -.. method:: Record.GetString(field) - - Return the value of *field* as a string where possible. *field* must - be an integer. - - -.. method:: Record.SetString(field, value) - - Set *field* to *value* through :c:func:`MsiRecordSetString`. *field* must be an - integer; *value* a string. - - -.. method:: Record.SetStream(field, value) - - Set *field* to the contents of the file named *value*, through - :c:func:`MsiRecordSetStream`. *field* must be an integer; *value* a string. - - -.. method:: Record.SetInteger(field, value) - - Set *field* to *value* through :c:func:`MsiRecordSetInteger`. Both *field* and - *value* must be an integer. - - -.. method:: Record.ClearData() - - Set all fields of the record to 0, through :c:func:`MsiRecordClearData`. - - -.. seealso:: - - `MsiRecordGetFieldCount `_ - `MsiRecordSetString `_ - `MsiRecordSetStream `_ - `MsiRecordSetInteger `_ - `MsiRecordClearData `_ - -.. _msi-errors: - -Errors ------- - -All wrappers around MSI functions raise :exc:`MSIError`; the string inside the -exception will contain more detail. - - -.. _cab: - -CAB Objects ------------ - - -.. class:: CAB(name) - - The class :class:`CAB` represents a CAB file. During MSI construction, files - will be added simultaneously to the ``Files`` table, and to a CAB file. Then, - when all files have been added, the CAB file can be written, then added to the - MSI file. - - *name* is the name of the CAB file in the MSI file. - - - .. method:: append(full, file, logical) - - Add the file with the pathname *full* to the CAB file, under the name - *logical*. If there is already a file named *logical*, a new file name is - created. - - Return the index of the file in the CAB file, and the new name of the file - inside the CAB file. - - - .. method:: commit(database) - - Generate a CAB file, add it as a stream to the MSI file, put it into the - ``Media`` table, and remove the generated file from the disk. - - -.. _msi-directory: - -Directory Objects ------------------ - - -.. class:: Directory(database, cab, basedir, physical, logical, default, [componentflags]) - - Create a new directory in the Directory table. There is a current component at - each point in time for the directory, which is either explicitly created through - :meth:`start_component`, or implicitly when files are added for the first time. - Files are added into the current component, and into the cab file. To create a - directory, a base directory object needs to be specified (can be ``None``), the - path to the physical directory, and a logical directory name. *default* - specifies the DefaultDir slot in the directory table. *componentflags* specifies - the default flags that new components get. - - - .. method:: start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None) - - Add an entry to the Component table, and make this component the current - component for this directory. If no component name is given, the directory - name is used. If no *feature* is given, the current feature is used. If no - *flags* are given, the directory's default flags are used. If no *keyfile* - is given, the KeyPath is left null in the Component table. - - - .. method:: add_file(file, src=None, version=None, language=None) - - Add a file to the current component of the directory, starting a new one - if there is no current component. By default, the file name in the source - and the file table will be identical. If the *src* file is specified, it - is interpreted relative to the current directory. Optionally, a *version* - and a *language* can be specified for the entry in the File table. - - - .. method:: glob(pattern, exclude=None) - - Add a list of files to the current component as specified in the glob - pattern. Individual files can be excluded in the *exclude* list. - - - .. method:: remove_pyc() - - Remove ``.pyc`` files on uninstall. - - -.. seealso:: - - `Directory Table `_ - `File Table `_ - `Component Table `_ - `FeatureComponents Table `_ - -.. _features: - -Features --------- - - -.. class:: Feature(db, id, title, desc, display, level=1, parent=None, directory=None, attributes=0) - - Add a new record to the ``Feature`` table, using the values *id*, *parent.id*, - *title*, *desc*, *display*, *level*, *directory*, and *attributes*. The - resulting feature object can be passed to the :meth:`start_component` method of - :class:`Directory`. - - - .. method:: set_current() - - Make this feature the current feature of :mod:`msilib`. New components are - automatically added to the default feature, unless a feature is explicitly - specified. - - -.. seealso:: - - `Feature Table `_ - -.. _msi-gui: - -GUI classes ------------ - -:mod:`msilib` provides several classes that wrap the GUI tables in an MSI -database. However, no standard user interface is provided. - - -.. class:: Control(dlg, name) - - Base class of the dialog controls. *dlg* is the dialog object the control - belongs to, and *name* is the control's name. - - - .. method:: event(event, argument, condition=1, ordering=None) - - Make an entry into the ``ControlEvent`` table for this control. - - - .. method:: mapping(event, attribute) - - Make an entry into the ``EventMapping`` table for this control. - - - .. method:: condition(action, condition) - - Make an entry into the ``ControlCondition`` table for this control. - - -.. class:: RadioButtonGroup(dlg, name, property) - - Create a radio button control named *name*. *property* is the installer property - that gets set when a radio button is selected. - - - .. method:: add(name, x, y, width, height, text, value=None) - - Add a radio button named *name* to the group, at the coordinates *x*, *y*, - *width*, *height*, and with the label *text*. If *value* is ``None``, it - defaults to *name*. - - -.. class:: Dialog(db, name, x, y, w, h, attr, title, first, default, cancel) - - Return a new :class:`Dialog` object. An entry in the ``Dialog`` table is made, - with the specified coordinates, dialog attributes, title, name of the first, - default, and cancel controls. - - - .. method:: control(name, type, x, y, width, height, attributes, property, text, control_next, help) - - Return a new :class:`Control` object. An entry in the ``Control`` table is - made with the specified parameters. - - This is a generic method; for specific types, specialized methods are - provided. - - - .. method:: text(name, x, y, width, height, attributes, text) - - Add and return a ``Text`` control. - - - .. method:: bitmap(name, x, y, width, height, text) - - Add and return a ``Bitmap`` control. - - - .. method:: line(name, x, y, width, height) - - Add and return a ``Line`` control. - - - .. method:: pushbutton(name, x, y, width, height, attributes, text, next_control) - - Add and return a ``PushButton`` control. - - - .. method:: radiogroup(name, x, y, width, height, attributes, property, text, next_control) - - Add and return a ``RadioButtonGroup`` control. - - - .. method:: checkbox(name, x, y, width, height, attributes, property, text, next_control) - - Add and return a ``CheckBox`` control. - - -.. seealso:: - - `Dialog Table `_ - `Control Table `_ - `Control Types `_ - `ControlCondition Table `_ - `ControlEvent Table `_ - `EventMapping Table `_ - `RadioButton Table `_ - -.. _msi-tables: - -Precomputed tables ------------------- - -:mod:`msilib` provides a few subpackages that contain only schema and table -definitions. Currently, these definitions are based on MSI version 2.0. - - -.. data:: schema - - This is the standard MSI schema for MSI 2.0, with the *tables* variable - providing a list of table definitions, and *_Validation_records* providing the - data for MSI validation. - - -.. data:: sequence - - This module contains table contents for the standard sequence tables: - *AdminExecuteSequence*, *AdminUISequence*, *AdvtExecuteSequence*, - *InstallExecuteSequence*, and *InstallUISequence*. - -.. data:: text +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - This module contains definitions for the UIText and ActionText tables, for the - standard installer actions. +The last version of Python that provided the :mod:`!msilib` module was +`Python 3.12 `_. diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index 32693e3d..327cc360 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -1,5 +1,5 @@ -:mod:`msvcrt` --- Useful routines from the MS VC++ runtime -========================================================== +:mod:`!msvcrt` --- Useful routines from the MS VC++ runtime +=========================================================== .. module:: msvcrt :platform: Windows @@ -10,8 +10,8 @@ -------------- These functions provide access to some useful capabilities on Windows platforms. -Some higher-level modules use these functions to build the Windows -implementations of their services. For example, the :mod:`getpass` module uses +Some higher-level modules use these functions to build the Windows +implementations of their services. For example, the :mod:`getpass` module uses this in the implementation of the :func:`getpass` function. Further documentation on these functions can be found in the Platform API @@ -35,11 +35,11 @@ File Operations .. function:: locking(fd, mode, nbytes) - Lock part of a file based on file descriptor *fd* from the C runtime. Raises - :exc:`OSError` on failure. The locked region of the file extends from the + Lock part of a file based on file descriptor *fd* from the C runtime. Raises + :exc:`OSError` on failure. The locked region of the file extends from the current file position for *nbytes* bytes, and may continue beyond the end of the - file. *mode* must be one of the :const:`!LK_\*` constants listed below. Multiple - regions in a file may be locked at the same time, but may not overlap. Adjacent + file. *mode* must be one of the :const:`!LK_\*` constants listed below. Multiple + regions in a file may be locked at the same time, but may not overlap. Adjacent regions are not merged; they must be unlocked individually. .. audit-event:: msvcrt.locking fd,mode,nbytes msvcrt.locking @@ -49,7 +49,7 @@ File Operations LK_RLCK Locks the specified bytes. If the bytes cannot be locked, the program - immediately tries again after 1 second. If, after 10 attempts, the bytes cannot + immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, :exc:`OSError` is raised. @@ -74,17 +74,21 @@ File Operations .. function:: open_osfhandle(handle, flags) - Create a C runtime file descriptor from the file handle *handle*. The *flags* - parameter should be a bitwise OR of :const:`os.O_APPEND`, :const:`os.O_RDONLY`, - and :const:`os.O_TEXT`. The returned file descriptor may be used as a parameter + Create a C runtime file descriptor from the file handle *handle*. The *flags* + parameter should be a bitwise OR of :const:`os.O_APPEND`, + :const:`os.O_RDONLY`, :const:`os.O_TEXT` and :const:`os.O_NOINHERIT`. + The returned file descriptor may be used as a parameter to :func:`os.fdopen` to create a file object. + The file descriptor is inheritable by default. Pass :const:`os.O_NOINHERIT` + flag to make it non inheritable. + .. audit-event:: msvcrt.open_osfhandle handle,flags msvcrt.open_osfhandle .. function:: get_osfhandle(fd) - Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if + Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if *fd* is not recognized. .. audit-event:: msvcrt.get_osfhandle fd msvcrt.get_osfhandle @@ -98,13 +102,14 @@ Console I/O .. function:: kbhit() - Return ``True`` if a keypress is waiting to be read. + Returns a nonzero value if a keypress is waiting to be read. Otherwise, + return 0. .. function:: getch() Read a keypress and return the resulting character as a byte string. - Nothing is echoed to the console. This call will block if a keypress + Nothing is echoed to the console. This call will block if a keypress is not already available, but will not wait for :kbd:`Enter` to be pressed. If the pressed key was a special function key, this will return ``'\000'`` or ``'\xe0'``; the next call will return the keycode. @@ -118,7 +123,7 @@ Console I/O .. function:: getche() - Similar to :func:`getch`, but the keypress will be echoed if it represents a + Similar to :func:`getch`, but the keypress will be echoed if it represents a printable character. @@ -157,4 +162,108 @@ Other Functions .. function:: heapmin() Force the :c:func:`malloc` heap to clean itself up and return unused blocks to - the operating system. On failure, this raises :exc:`OSError`. + the operating system. On failure, this raises :exc:`OSError`. + + +.. function:: set_error_mode(mode) + + Changes the location where the C runtime writes an error message for an error + that might end the program. *mode* must be one of the :const:`!OUT_\*` + constants listed below or :const:`REPORT_ERRMODE`. Returns the old setting + or -1 if an error occurs. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_DEFAULT + + Error sink is determined by the app's type. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_STDERR + + Error sink is a standard error. Only available in + :ref:`debug build of Python `. + + +.. data:: OUT_TO_MSGBOX + + Error sink is a message box. Only available in + :ref:`debug build of Python `. + + +.. data:: REPORT_ERRMODE + + Report the current error mode value. Only available in + :ref:`debug build of Python `. + + +.. function:: CrtSetReportMode(type, mode) + + Specifies the destination or destinations for a specific report type + generated by :c:func:`!_CrtDbgReport` in the MS VC++ runtime. *type* must be + one of the :const:`!CRT_\*` constants listed below. *mode* must be one of the + :const:`!CRTDBG_\*` constants listed below. Only available in + :ref:`debug build of Python `. + + +.. function:: CrtSetReportFile(type, file) + + After you use :func:`CrtSetReportMode` to specify :const:`CRTDBG_MODE_FILE`, + you can specify the file handle to receive the message text. *type* must be + one of the :const:`!CRT_\*` constants listed below. *file* should be the file + handle your want specified. Only available in + :ref:`debug build of Python `. + + +.. data:: CRT_WARN + + Warnings, messages, and information that doesn't need immediate attention. + + +.. data:: CRT_ERROR + + Errors, unrecoverable problems, and issues that require immediate attention. + + +.. data:: CRT_ASSERT + + Assertion failures. + + +.. data:: CRTDBG_MODE_DEBUG + + Writes the message to the debugger's output window. + + +.. data:: CRTDBG_MODE_FILE + + Writes the message to a user-supplied file handle. :func:`CrtSetReportFile` + should be called to define the specific file or stream to use as + the destination. + + +.. data:: CRTDBG_MODE_WNDW + + Creates a message box to display the message along with the ``Abort``, + ``Retry``, and ``Ignore`` buttons. + + +.. data:: CRTDBG_REPORT_MODE + + Returns current *mode* for the specified *type*. + + +.. data:: CRT_ASSEMBLY_VERSION + + The CRT Assembly version, from the :file:`crtassem.h` header file. + + +.. data:: VC_ASSEMBLY_PUBLICKEYTOKEN + + The VC Assembly public key token, from the :file:`crtassem.h` header file. + + +.. data:: LIBRARIES_ASSEMBLY_NAME_PREFIX + + The Libraries Assembly name prefix, from the :file:`crtassem.h` header file. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 2f0f1f80..38104bb7 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1,5 +1,5 @@ -:mod:`multiprocessing` --- Process-based parallelism -==================================================== +:mod:`!multiprocessing` --- Process-based parallelism +===================================================== .. module:: multiprocessing :synopsis: Process-based parallelism. @@ -8,7 +8,7 @@ -------------- -.. include:: ../includes/wasm-notavail.rst +.. include:: ../includes/wasm-mobile-notavail.rst Introduction ------------ @@ -56,7 +56,7 @@ will print to standard output :: The :class:`Process` class -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ In :mod:`multiprocessing`, processes are spawned by creating a :class:`Process` object and then calling its :meth:`~Process.start` method. :class:`Process` @@ -102,7 +102,7 @@ necessary, see :ref:`multiprocessing-programming`. .. _multiprocessing-start-methods: Contexts and start methods -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ Depending on the platform, :mod:`multiprocessing` supports three ways to start a process. These *start methods* are @@ -150,18 +150,18 @@ to start a process. These *start methods* are over Unix pipes such as Linux. -.. versionchanged:: 3.8 - - On macOS, the *spawn* start method is now the default. The *fork* start - method should be considered unsafe as it can lead to crashes of the - subprocess as macOS system libraries may start threads. See :issue:`33725`. - .. versionchanged:: 3.4 *spawn* added on all POSIX platforms, and *forkserver* added for some POSIX platforms. Child processes no longer inherit all of the parents inheritable handles on Windows. +.. versionchanged:: 3.8 + + On macOS, the *spawn* start method is now the default. The *fork* start + method should be considered unsafe as it can lead to crashes of the + subprocess as macOS system libraries may start threads. See :issue:`33725`. + On POSIX using the *spawn* or *forkserver* start methods will also start a *resource tracker* process which tracks the unlinked named system resources (such as named semaphores or @@ -231,7 +231,7 @@ library user. Exchanging objects between processes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :mod:`multiprocessing` supports two types of communication channel between processes: @@ -254,6 +254,7 @@ processes: p.join() Queues are thread and process safe. + Any object put into a :mod:`~multiprocessing` queue will be serialized. **Pipes** @@ -281,9 +282,11 @@ processes: of corruption from processes using different ends of the pipe at the same time. + The :meth:`~Connection.send` method serializes the object and + :meth:`~Connection.recv` re-creates the object. Synchronization between processes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :mod:`multiprocessing` contains equivalents of all the synchronization primitives from :mod:`threading`. For instance one can use a lock to ensure @@ -309,7 +312,7 @@ mixed up. Sharing state between processes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As mentioned above, when doing concurrent programming it is usually best to avoid using shared state as far as possible. This is particularly true when @@ -399,7 +402,7 @@ However, if you really do need to use some shared data then Using a pool of workers -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ The :class:`~multiprocessing.pool.Pool` class represents a pool of worker processes. It has methods which allows tasks to be offloaded to the worker @@ -490,7 +493,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the :class:`Process` and exceptions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. class:: Process(group=None, target=None, name=None, args=(), kwargs={}, \ *, daemon=None) @@ -502,7 +505,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the The constructor should always be called with keyword arguments. *group* should always be ``None``; it exists solely for compatibility with :class:`threading.Thread`. *target* is the callable object to be invoked by - the :meth:`run()` method. It defaults to ``None``, meaning nothing is + the :meth:`run` method. It defaults to ``None``, meaning nothing is called. *name* is the process name (see :attr:`name` for more details). *args* is the argument tuple for the target invocation. *kwargs* is a dictionary of keyword arguments for the target invocation. If provided, @@ -519,7 +522,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the to the process. .. versionchanged:: 3.3 - Added the *daemon* argument. + Added the *daemon* parameter. .. method:: run() @@ -639,7 +642,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the You can use this value if you want to wait on several events at once using :func:`multiprocessing.connection.wait`. Otherwise - calling :meth:`join()` is simpler. + calling :meth:`join` is simpler. On Windows, this is an OS handle usable with the ``WaitForSingleObject`` and ``WaitForMultipleObjects`` family of API calls. On POSIX, this is @@ -649,8 +652,8 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. method:: terminate() - Terminate the process. On POSIX this is done using the ``SIGTERM`` signal; - on Windows :c:func:`TerminateProcess` is used. Note that exit handlers and + Terminate the process. On POSIX this is done using the :py:const:`~signal.SIGTERM` signal; + on Windows :c:func:`!TerminateProcess` is used. Note that exit handlers and finally clauses, etc., will not be executed. Note that descendant processes of the process will *not* be terminated -- @@ -666,7 +669,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. method:: kill() - Same as :meth:`terminate()` but using the ``SIGKILL`` signal on POSIX. + Same as :meth:`terminate` but using the ``SIGKILL`` signal on POSIX. .. versionadded:: 3.7 @@ -709,7 +712,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. exception:: BufferTooShort - Exception raised by :meth:`Connection.recv_bytes_into()` when the supplied + Exception raised by :meth:`Connection.recv_bytes_into` when the supplied buffer object is too small for the message read. If ``e`` is an instance of :exc:`BufferTooShort` then ``e.args[0]`` will give @@ -724,7 +727,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the Raised by methods with a timeout when the timeout expires. Pipes and Queues -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ When using multiple processes, one generally uses message passing for communication between processes and avoids having to use any synchronization @@ -745,6 +748,11 @@ If you use :class:`JoinableQueue` then you **must** call semaphore used to count the number of unfinished tasks may eventually overflow, raising an exception. +One difference from other Python queue implementations, is that :mod:`multiprocessing` +queues serializes all objects that are put into them using :mod:`pickle`. +The object return by the get method is a re-created object that does not share memory +with the original object. + Note that one can also create a shared queue by using a manager object -- see :ref:`multiprocessing-managers`. @@ -811,6 +819,8 @@ For an example of the usage of queues for interprocess communication see used for receiving messages and ``conn2`` can only be used for sending messages. + The :meth:`~multiprocessing.Connection.send` method serializes the object using + :mod:`pickle` and the :meth:`~multiprocessing.Connection.recv` re-creates the object. .. class:: Queue([maxsize]) @@ -837,6 +847,8 @@ For an example of the usage of queues for interprocess communication see Return ``True`` if the queue is empty, ``False`` otherwise. Because of multithreading/multiprocessing semantics, this is not reliable. + May raise an :exc:`OSError` on closed queues. (not guaranteed) + .. method:: full() Return ``True`` if the queue is full, ``False`` otherwise. Because of @@ -940,6 +952,8 @@ For an example of the usage of queues for interprocess communication see Return ``True`` if the queue is empty, ``False`` otherwise. + Always raises an :exc:`OSError` if the SimpleQueue is closed. + .. method:: get() Remove and return an item from the queue. @@ -981,7 +995,7 @@ For an example of the usage of queues for interprocess communication see Miscellaneous -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ .. function:: active_children() @@ -996,13 +1010,20 @@ Miscellaneous This number is not equivalent to the number of CPUs the current process can use. The number of usable CPUs can be obtained with - ``len(os.sched_getaffinity(0))`` + :func:`os.process_cpu_count` (or ``len(os.sched_getaffinity(0))``). When the number of CPUs cannot be determined a :exc:`NotImplementedError` is raised. .. seealso:: :func:`os.cpu_count` + :func:`os.process_cpu_count` + + .. versionchanged:: 3.13 + + The return value can also be overridden using the + :option:`-X cpu_count <-X>` flag or :envvar:`PYTHON_CPU_COUNT` as this is + merely a wrapper around the :mod:`os` cpu count APIs. .. function:: current_process() @@ -1077,13 +1098,13 @@ Miscellaneous The return value can be ``'fork'``, ``'spawn'``, ``'forkserver'`` or ``None``. See :ref:`multiprocessing-start-methods`. -.. versionchanged:: 3.8 + .. versionadded:: 3.4 - On macOS, the *spawn* start method is now the default. The *fork* start - method should be considered unsafe as it can lead to crashes of the - subprocess. See :issue:`33725`. + .. versionchanged:: 3.8 - .. versionadded:: 3.4 + On macOS, the *spawn* start method is now the default. The *fork* start + method should be considered unsafe as it can lead to crashes of the + subprocess. See :issue:`33725`. .. function:: set_executable(executable) @@ -1143,7 +1164,7 @@ Miscellaneous Connection Objects -~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^ .. currentmodule:: multiprocessing.connection @@ -1238,8 +1259,7 @@ Connection objects are usually created using Connection objects themselves can now be transferred between processes using :meth:`Connection.send` and :meth:`Connection.recv`. - .. versionadded:: 3.3 - Connection objects now support the context management protocol -- see + Connection objects also now support the context management protocol -- see :ref:`typecontextmanager`. :meth:`~contextmanager.__enter__` returns the connection object, and :meth:`~contextmanager.__exit__` calls :meth:`close`. @@ -1285,7 +1305,7 @@ For example: Synchronization primitives -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ .. currentmodule:: multiprocessing @@ -1453,17 +1473,6 @@ object -- see :ref:`multiprocessing-managers`. On macOS, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with a timeout will emulate that function's behavior using a sleeping loop. -.. note:: - - If the SIGINT signal generated by :kbd:`Ctrl-C` arrives while the main thread is - blocked by a call to :meth:`BoundedSemaphore.acquire`, :meth:`Lock.acquire`, - :meth:`RLock.acquire`, :meth:`Semaphore.acquire`, :meth:`Condition.acquire` - or :meth:`Condition.wait` then the call will be immediately interrupted and - :exc:`KeyboardInterrupt` will be raised. - - This differs from the behaviour of :mod:`threading` where SIGINT will be - ignored while the equivalent blocking calls are in progress. - .. note:: Some of this package's functionality requires a functioning shared semaphore @@ -1474,7 +1483,7 @@ object -- see :ref:`multiprocessing-managers`. Shared :mod:`ctypes` Objects -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to create shared objects using shared memory which can be inherited by child processes. @@ -1536,7 +1545,7 @@ inherited by child processes. The :mod:`multiprocessing.sharedctypes` module ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +"""""""""""""""""""""""""""""""""""""""""""""" .. module:: multiprocessing.sharedctypes :synopsis: Allocate ctypes objects from shared memory. @@ -1702,7 +1711,7 @@ The results printed are :: .. _multiprocessing-managers: Managers -~~~~~~~~ +^^^^^^^^ Managers provide a way to create data which can be shared between different processes, including sharing over a network between processes running on @@ -1947,7 +1956,7 @@ their parent process exits. The manager classes are defined in the Customized managers ->>>>>>>>>>>>>>>>>>> +""""""""""""""""""" To create one's own manager, one creates a subclass of :class:`BaseManager` and uses the :meth:`~BaseManager.register` classmethod to register new types or @@ -1974,7 +1983,7 @@ callables with the manager class. For example:: Using a remote manager ->>>>>>>>>>>>>>>>>>>>>> +"""""""""""""""""""""" It is possible to run a manager server on one machine and have clients use it from other machines (assuming that the firewalls involved allow it). @@ -2037,7 +2046,7 @@ client to access it remotely:: .. _multiprocessing-proxy_objects: Proxy Objects -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ A proxy is an object which *refers* to a shared object which lives (presumably) in a different process. The shared object is said to be the *referent* of the @@ -2189,7 +2198,7 @@ demonstrates a level of control over the synchronization. Cleanup ->>>>>>> +""""""" A proxy object uses a weakref callback so that when it gets garbage collected it deregisters itself from the manager which owns its referent. @@ -2199,7 +2208,7 @@ any proxies referring to it. Process Pools -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ .. module:: multiprocessing.pool :synopsis: Create pools of processes. @@ -2214,7 +2223,7 @@ with the :class:`Pool` class. callbacks and has a parallel map implementation. *processes* is the number of worker processes to use. If *processes* is - ``None`` then the number returned by :func:`os.cpu_count` is used. + ``None`` then the number returned by :func:`os.process_cpu_count` is used. If *initializer* is not ``None`` then each worker process will call ``initializer(*initargs)`` when it starts. @@ -2243,11 +2252,15 @@ with the :class:`Pool` class. as CPython does not assure that the finalizer of the pool will be called (see :meth:`object.__del__` for more information). - .. versionadded:: 3.2 - *maxtasksperchild* + .. versionchanged:: 3.2 + Added the *maxtasksperchild* parameter. - .. versionadded:: 3.4 - *context* + .. versionchanged:: 3.4 + Added the *context* parameter. + + .. versionchanged:: 3.13 + *processes* uses :func:`os.process_cpu_count` by default, instead of + :func:`os.cpu_count`. .. note:: @@ -2369,7 +2382,7 @@ with the :class:`Pool` class. Wait for the worker processes to exit. One must call :meth:`close` or :meth:`terminate` before using :meth:`join`. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Pool objects now support the context management protocol -- see :ref:`typecontextmanager`. :meth:`~contextmanager.__enter__` returns the pool object, and :meth:`~contextmanager.__exit__` calls :meth:`terminate`. @@ -2431,7 +2444,7 @@ The following example demonstrates the use of a pool:: .. _multiprocessing-listeners-clients: Listeners and Clients -~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^ .. module:: multiprocessing.connection :synopsis: API for dealing with sockets. @@ -2473,9 +2486,9 @@ multiple connections at the same time. generally be omitted since it can usually be inferred from the format of *address*. (See :ref:`multiprocessing-address-formats`) - If *authkey* is given and not None, it should be a byte string and will be + If *authkey* is given and not ``None``, it should be a byte string and will be used as the secret key for an HMAC-based authentication challenge. No - authentication is done if *authkey* is None. + authentication is done if *authkey* is ``None``. :exc:`~multiprocessing.AuthenticationError` is raised if authentication fails. See :ref:`multiprocessing-auth-keys`. @@ -2508,9 +2521,9 @@ multiple connections at the same time. to the :meth:`~socket.socket.listen` method of the socket once it has been bound. - If *authkey* is given and not None, it should be a byte string and will be + If *authkey* is given and not ``None``, it should be a byte string and will be used as the secret key for an HMAC-based authentication challenge. No - authentication is done if *authkey* is None. + authentication is done if *authkey* is ``None``. :exc:`~multiprocessing.AuthenticationError` is raised if authentication fails. See :ref:`multiprocessing-auth-keys`. @@ -2538,7 +2551,7 @@ multiple connections at the same time. The address from which the last accepted connection came. If this is unavailable then it is ``None``. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Listener objects now support the context management protocol -- see :ref:`typecontextmanager`. :meth:`~contextmanager.__enter__` returns the listener object, and :meth:`~contextmanager.__exit__` calls :meth:`close`. @@ -2571,7 +2584,7 @@ multiple connections at the same time. **Windows**: An item in *object_list* must either be an integer handle which is waitable (according to the definition used by the documentation of the Win32 function ``WaitForMultipleObjects()``) - or it can be an object with a :meth:`fileno` method which returns a + or it can be an object with a :meth:`~io.IOBase.fileno` method which returns a socket handle or pipe handle. (Note that pipe handles and socket handles are **not** waitable handles.) @@ -2619,7 +2632,6 @@ server:: The following code uses :func:`~multiprocessing.connection.wait` to wait for messages from multiple processes at once:: - import time, random from multiprocessing import Process, Pipe, current_process from multiprocessing.connection import wait @@ -2655,7 +2667,7 @@ wait for messages from multiple processes at once:: .. _multiprocessing-address-formats: Address Formats ->>>>>>>>>>>>>>> +""""""""""""""" * An ``'AF_INET'`` address is a tuple of the form ``(hostname, port)`` where *hostname* is a string and *port* is an integer. @@ -2675,7 +2687,7 @@ an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address. .. _multiprocessing-auth-keys: Authentication keys -~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^ When one uses :meth:`Connection.recv `, the data received is automatically @@ -2701,7 +2713,7 @@ Suitable authentication keys can also be generated by using :func:`os.urandom`. Logging -~~~~~~~ +^^^^^^^ Some support for logging is available. Note, however, that the :mod:`logging` package does not use process shared locks so it is possible (depending on the @@ -2749,7 +2761,7 @@ For a full table of logging levels, see the :mod:`logging` module. The :mod:`multiprocessing.dummy` module -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. module:: multiprocessing.dummy :synopsis: Dumb wrapper around threading. @@ -2775,27 +2787,27 @@ worker threads rather than worker processes. :meth:`~multiprocessing.pool.Pool.terminate` manually. *processes* is the number of worker threads to use. If *processes* is - ``None`` then the number returned by :func:`os.cpu_count` is used. + ``None`` then the number returned by :func:`os.process_cpu_count` is used. If *initializer* is not ``None`` then each worker process will call ``initializer(*initargs)`` when it starts. Unlike :class:`Pool`, *maxtasksperchild* and *context* cannot be provided. - .. note:: + .. note:: - A :class:`ThreadPool` shares the same interface as :class:`Pool`, which - is designed around a pool of processes and predates the introduction of - the :class:`concurrent.futures` module. As such, it inherits some - operations that don't make sense for a pool backed by threads, and it - has its own type for representing the status of asynchronous jobs, - :class:`AsyncResult`, that is not understood by any other libraries. + A :class:`ThreadPool` shares the same interface as :class:`Pool`, which + is designed around a pool of processes and predates the introduction of + the :class:`concurrent.futures` module. As such, it inherits some + operations that don't make sense for a pool backed by threads, and it + has its own type for representing the status of asynchronous jobs, + :class:`AsyncResult`, that is not understood by any other libraries. - Users should generally prefer to use - :class:`concurrent.futures.ThreadPoolExecutor`, which has a simpler - interface that was designed around threads from the start, and which - returns :class:`concurrent.futures.Future` instances that are - compatible with many other libraries, including :mod:`asyncio`. + Users should generally prefer to use + :class:`concurrent.futures.ThreadPoolExecutor`, which has a simpler + interface that was designed around threads from the start, and which + returns :class:`concurrent.futures.Future` instances that are + compatible with many other libraries, including :mod:`asyncio`. .. _multiprocessing-programming: @@ -2808,7 +2820,7 @@ There are certain guidelines and idioms which should be adhered to when using All start methods -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ The following applies to all start methods. @@ -2949,7 +2961,7 @@ Beware of replacing :data:`sys.stdin` with a "file like object" resulting in a bad file descriptor error, but introduces a potential danger to applications which replace :func:`sys.stdin` with a "file-like object" with output buffering. This danger is that if multiple processes call - :meth:`~io.IOBase.close()` on this file-like object, it could result in the same + :meth:`~io.IOBase.close` on this file-like object, it could result in the same data being flushed to the object multiple times, resulting in corruption. If you write a file-like object and implement your own caching, you can @@ -2967,9 +2979,9 @@ Beware of replacing :data:`sys.stdin` with a "file like object" For more information, see :issue:`5155`, :issue:`5313` and :issue:`5331` The *spawn* and *forkserver* start methods -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -There are a few extra restriction which don't apply to the *fork* +There are a few extra restrictions which don't apply to the *fork* start method. More picklability diff --git a/Doc/library/multiprocessing.shared_memory.rst b/Doc/library/multiprocessing.shared_memory.rst index f453e640..e8f04a6a 100644 --- a/Doc/library/multiprocessing.shared_memory.rst +++ b/Doc/library/multiprocessing.shared_memory.rst @@ -1,5 +1,5 @@ -:mod:`multiprocessing.shared_memory` --- Shared memory for direct access across processes -========================================================================================= +:mod:`!multiprocessing.shared_memory` --- Shared memory for direct access across processes +========================================================================================== .. module:: multiprocessing.shared_memory :synopsis: Provides shared memory for direct access across processes. @@ -20,10 +20,10 @@ and management of shared memory to be accessed by one or more processes on a multicore or symmetric multiprocessor (SMP) machine. To assist with the life-cycle management of shared memory especially across distinct processes, a :class:`~multiprocessing.managers.BaseManager` subclass, -:class:`SharedMemoryManager`, is also provided in the -``multiprocessing.managers`` module. +:class:`~multiprocessing.managers.SharedMemoryManager`, is also provided in the +:mod:`multiprocessing.managers` module. -In this module, shared memory refers to "System V style" shared memory blocks +In this module, shared memory refers to "POSIX style" shared memory blocks (though is not necessarily implemented explicitly as such) and does not refer to "distributed shared memory". This style of shared memory permits distinct processes to potentially read and write to a common (or shared) region of @@ -36,9 +36,10 @@ or other communications requiring the serialization/deserialization and copying of data. -.. class:: SharedMemory(name=None, create=False, size=0) +.. class:: SharedMemory(name=None, create=False, size=0, *, track=True) - Creates a new shared memory block or attaches to an existing shared + Create an instance of the :class:`!SharedMemory` class for either + creating a new shared memory block or attaching to an existing shared memory block. Each shared memory block is assigned a unique name. In this way, one process can create a shared memory block with a particular name and a different process can attach to that same shared @@ -47,43 +48,69 @@ copying of data. As a resource for sharing data across processes, shared memory blocks may outlive the original process that created them. When one process no longer needs access to a shared memory block that might still be - needed by other processes, the :meth:`close()` method should be called. + needed by other processes, the :meth:`close` method should be called. When a shared memory block is no longer needed by any process, the - :meth:`unlink()` method should be called to ensure proper cleanup. - - *name* is the unique name for the requested shared memory, specified as - a string. When creating a new shared memory block, if ``None`` (the - default) is supplied for the name, a novel name will be generated. - - *create* controls whether a new shared memory block is created (``True``) - or an existing shared memory block is attached (``False``). - - *size* specifies the requested number of bytes when creating a new shared - memory block. Because some platforms choose to allocate chunks of memory - based upon that platform's memory page size, the exact size of the shared - memory block may be larger or equal to the size requested. When attaching - to an existing shared memory block, the ``size`` parameter is ignored. + :meth:`unlink` method should be called to ensure proper cleanup. + + :param name: + The unique name for the requested shared memory, specified as a string. + When creating a new shared memory block, if ``None`` (the default) + is supplied for the name, a novel name will be generated. + :type name: str | None + + :param bool create: + Control whether a new shared memory block is created (``True``) + or an existing shared memory block is attached (``False``). + + :param int size: + The requested number of bytes when creating a new shared memory block. + Because some platforms choose to allocate chunks of memory + based upon that platform's memory page size, the exact size of the shared + memory block may be larger or equal to the size requested. + When attaching to an existing shared memory block, + the *size* parameter is ignored. + + :param bool track: + When ``True``, register the shared memory block with a resource + tracker process on platforms where the OS does not do this automatically. + The resource tracker ensures proper cleanup of the shared memory even + if all other processes with access to the memory exit without doing so. + Python processes created from a common ancestor using :mod:`multiprocessing` + facilities share a single resource tracker process, and the lifetime of + shared memory segments is handled automatically among these processes. + Python processes created in any other way will receive their own + resource tracker when accessing shared memory with *track* enabled. + This will cause the shared memory to be deleted by the resource tracker + of the first process that terminates. + To avoid this issue, users of :mod:`subprocess` or standalone Python + processes should set *track* to ``False`` when there is already another + process in place that does the bookkeeping. + *track* is ignored on Windows, which has its own tracking and + automatically deletes shared memory when all handles to it have been closed. + + .. versionchanged:: 3.13 + Added the *track* parameter. .. method:: close() - Closes access to the shared memory from this instance. In order to - ensure proper cleanup of resources, all instances should call - ``close()`` once the instance is no longer needed. Note that calling - ``close()`` does not cause the shared memory block itself to be - destroyed. + Close the file descriptor/handle to the shared memory from this + instance. :meth:`close` should be called once access to the shared + memory block from this instance is no longer needed. Depending + on operating system, the underlying memory may or may not be freed + even if all handles to it have been closed. To ensure proper cleanup, + use the :meth:`unlink` method. .. method:: unlink() - Requests that the underlying shared memory block be destroyed. In - order to ensure proper cleanup of resources, ``unlink()`` should be - called once (and only once) across all processes which have need - for the shared memory block. After requesting its destruction, a - shared memory block may or may not be immediately destroyed and - this behavior may differ across platforms. Attempts to access data - inside the shared memory block after ``unlink()`` has been called may - result in memory access errors. Note: the last process relinquishing - its hold on a shared memory block may call ``unlink()`` and - :meth:`close()` in either order. + Delete the underlying shared memory block. This should be called only + once per shared memory block regardless of the number of handles to it, + even in other processes. + :meth:`unlink` and :meth:`close` can be called in any order, but + trying to access data inside a shared memory block after :meth:`unlink` + may result in memory access errors, depending on platform. + + This method has no effect on Windows, where the only way to delete a + shared memory block is to close all handles. .. attribute:: buf @@ -126,7 +153,7 @@ instances:: The following example demonstrates a practical use of the :class:`SharedMemory` class with `NumPy arrays `_, accessing the -same ``numpy.ndarray`` from two distinct Python shells: +same :class:`!numpy.ndarray` from two distinct Python shells: .. doctest:: :options: +SKIP @@ -178,43 +205,43 @@ same ``numpy.ndarray`` from two distinct Python shells: .. class:: SharedMemoryManager([address[, authkey]]) :module: multiprocessing.managers - A subclass of :class:`~multiprocessing.managers.BaseManager` which can be + A subclass of :class:`multiprocessing.managers.BaseManager` which can be used for the management of shared memory blocks across processes. A call to :meth:`~multiprocessing.managers.BaseManager.start` on a - :class:`SharedMemoryManager` instance causes a new process to be started. + :class:`!SharedMemoryManager` instance causes a new process to be started. This new process's sole purpose is to manage the life cycle of all shared memory blocks created through it. To trigger the release of all shared memory blocks managed by that process, call - :meth:`~multiprocessing.managers.BaseManager.shutdown()` on the instance. - This triggers a :meth:`SharedMemory.unlink()` call on all of the - :class:`SharedMemory` objects managed by that process and then - stops the process itself. By creating ``SharedMemory`` instances - through a ``SharedMemoryManager``, we avoid the need to manually track + :meth:`~multiprocessing.managers.BaseManager.shutdown` on the instance. + This triggers a :meth:`~multiprocessing.shared_memory.SharedMemory.unlink` call + on all of the :class:`SharedMemory` objects managed by that process and then + stops the process itself. By creating :class:`!SharedMemory` instances + through a :class:`!SharedMemoryManager`, we avoid the need to manually track and trigger the freeing of shared memory resources. This class provides methods for creating and returning :class:`SharedMemory` instances and for creating a list-like object (:class:`ShareableList`) backed by shared memory. - Refer to :class:`multiprocessing.managers.BaseManager` for a description + Refer to :class:`~multiprocessing.managers.BaseManager` for a description of the inherited *address* and *authkey* optional input arguments and how - they may be used to connect to an existing ``SharedMemoryManager`` service + they may be used to connect to an existing :class:`!SharedMemoryManager` service from other processes. .. method:: SharedMemory(size) Create and return a new :class:`SharedMemory` object with the - specified ``size`` in bytes. + specified *size* in bytes. .. method:: ShareableList(sequence) Create and return a new :class:`ShareableList` object, initialized - by the values from the input ``sequence``. + by the values from the input *sequence*. The following example demonstrates the basic mechanisms of a -:class:`SharedMemoryManager`: +:class:`~multiprocessing.managers.SharedMemoryManager`: .. doctest:: :options: +SKIP @@ -232,9 +259,9 @@ The following example demonstrates the basic mechanisms of a >>> smm.shutdown() # Calls unlink() on sl, raw_shm, and another_sl The following example depicts a potentially more convenient pattern for using -:class:`SharedMemoryManager` objects via the :keyword:`with` statement to -ensure that all shared memory blocks are released after they are no longer -needed: +:class:`~multiprocessing.managers.SharedMemoryManager` objects via the +:keyword:`with` statement to ensure that all shared memory blocks are released +after they are no longer needed: .. doctest:: :options: +SKIP @@ -250,38 +277,46 @@ needed: ... p2.join() # Wait for all work to complete in both processes ... total_result = sum(sl) # Consolidate the partial results now in sl -When using a :class:`SharedMemoryManager` in a :keyword:`with` statement, the -shared memory blocks created using that manager are all released when the -:keyword:`with` statement's code block finishes execution. +When using a :class:`~multiprocessing.managers.SharedMemoryManager` +in a :keyword:`with` statement, the shared memory blocks created using that +manager are all released when the :keyword:`!with` statement's code block +finishes execution. + + +.. class:: ShareableList(sequence=None, *, name=None) + Provide a mutable list-like object where all values stored within are + stored in a shared memory block. + This constrains storable values to the following built-in data types: -.. class:: ShareableList(sequence=None, \*, name=None) + * :class:`int` (signed 64-bit) + * :class:`float` + * :class:`bool` + * :class:`str` (less than 10M bytes each when encoded as UTF-8) + * :class:`bytes` (less than 10M bytes each) + * ``None`` - Provides a mutable list-like object where all values stored within are - stored in a shared memory block. This constrains storable values to - only the ``int`` (signed 64-bit), ``float``, ``bool``, ``str`` (less - than 10M bytes each when encoded as utf-8), ``bytes`` (less than 10M - bytes each), and ``None`` built-in data types. It also notably - differs from the built-in ``list`` type in that these lists can not - change their overall length (i.e. no append, insert, etc.) and do not - support the dynamic creation of new :class:`ShareableList` instances + It also notably differs from the built-in :class:`list` type + in that these lists can not change their overall length + (i.e. no :meth:`!append`, :meth:`!insert`, etc.) and do not + support the dynamic creation of new :class:`!ShareableList` instances via slicing. - *sequence* is used in populating a new ``ShareableList`` full of values. + *sequence* is used in populating a new :class:`!ShareableList` full of values. Set to ``None`` to instead attach to an already existing - ``ShareableList`` by its unique shared memory name. + :class:`!ShareableList` by its unique shared memory name. *name* is the unique name for the requested shared memory, as described in the definition for :class:`SharedMemory`. When attaching to an - existing ``ShareableList``, specify its shared memory block's unique - name while leaving ``sequence`` set to ``None``. + existing :class:`!ShareableList`, specify its shared memory block's unique + name while leaving *sequence* set to ``None``. .. note:: A known issue exists for :class:`bytes` and :class:`str` values. If they end with ``\x00`` nul bytes or characters, those may be *silently stripped* when fetching them by index from the - :class:`ShareableList`. This ``.rstrip(b'\x00')`` behavior is + :class:`!ShareableList`. This ``.rstrip(b'\x00')`` behavior is considered a bug and may go away in the future. See :gh:`106939`. For applications where rstripping of trailing nulls is a problem, @@ -307,12 +342,12 @@ shared memory blocks created using that manager are all released when the .. method:: count(value) - Returns the number of occurrences of ``value``. + Return the number of occurrences of *value*. .. method:: index(value) - Returns first index position of ``value``. Raises :exc:`ValueError` if - ``value`` is not present. + Return first index position of *value*. + Raise :exc:`ValueError` if *value* is not present. .. attribute:: format @@ -372,8 +407,8 @@ behind it: >>> c.shm.close() >>> c.shm.unlink() -The following examples demonstrates that ``ShareableList`` -(and underlying ``SharedMemory``) objects +The following examples demonstrates that :class:`ShareableList` +(and underlying :class:`SharedMemory`) objects can be pickled and unpickled if needed. Note, that it will still be the same shared object. This happens, because the deserialized object has diff --git a/Doc/library/netrc.rst b/Doc/library/netrc.rst index c36e5cfe..f6260383 100644 --- a/Doc/library/netrc.rst +++ b/Doc/library/netrc.rst @@ -1,6 +1,5 @@ - -:mod:`netrc` --- netrc file processing -====================================== +:mod:`!netrc` --- netrc file processing +======================================= .. module:: netrc :synopsis: Loading of .netrc files. diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index 3fa7916c..dcc36dd4 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -1,72 +1,15 @@ - -:mod:`nis` --- Interface to Sun's NIS (Yellow Pages) -==================================================== +:mod:`!nis` --- Interface to Sun’s NIS (Yellow Pages) +===================================================== .. module:: nis - :platform: Unix - :synopsis: Interface to Sun's NIS (Yellow Pages) library. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Fred Gansevles -.. sectionauthor:: Moshe Zadka - .. deprecated-removed:: 3.11 3.13 - The :mod:`nis` module is deprecated - (see :pep:`PEP 594 <594#nis>` for details). - --------------- - -The :mod:`nis` module gives a thin wrapper around the NIS library, useful for -central administration of several hosts. - -Because NIS exists only on Unix systems, this module is only available for Unix. - -.. include:: ../includes/wasm-notavail.rst - -The :mod:`nis` module defines the following functions: - - -.. function:: match(key, mapname, domain=default_domain) - - Return the match for *key* in map *mapname*, or raise an error - (:exc:`nis.error`) if there is none. Both should be strings, *key* is 8-bit - clean. Return value is an arbitrary array of bytes (may contain ``NULL`` and - other joys). - - Note that *mapname* is first checked if it is an alias to another name. - - The *domain* argument allows overriding the NIS domain used for the lookup. If - unspecified, lookup is in the default NIS domain. - - -.. function:: cat(mapname, domain=default_domain) - - Return a dictionary mapping *key* to *value* such that ``match(key, - mapname)==value``. Note that both keys and values of the dictionary are - arbitrary arrays of bytes. - - Note that *mapname* is first checked if it is an alias to another name. - - The *domain* argument allows overriding the NIS domain used for the lookup. If - unspecified, lookup is in the default NIS domain. - - -.. function:: maps(domain=default_domain) - - Return a list of all valid maps. - - The *domain* argument allows overriding the NIS domain used for the lookup. If - unspecified, lookup is in the default NIS domain. - - -.. function:: get_default_domain() - - Return the system default NIS domain. - - -The :mod:`nis` module defines the following exception: - -.. exception:: error - An error raised when a NIS function returns an error code. +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!nis` module was +`Python 3.12 `_. diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 143e4e0c..8053fe8c 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -1,586 +1,15 @@ -:mod:`nntplib` --- NNTP protocol client -======================================= +:mod:`!nntplib` --- NNTP protocol client +======================================== .. module:: nntplib - :synopsis: NNTP protocol client (requires sockets). + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/nntplib.py` +.. deprecated-removed:: 3.11 3.13 -.. index:: - pair: NNTP; protocol - single: Network News Transfer Protocol +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. -.. deprecated:: 3.11 - The :mod:`nntplib` module is deprecated (see :pep:`594` for details). - -.. testsetup:: - - import warnings - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import nntplib - -.. testcleanup:: - - try: - s.quit() - except NameError: - pass - import sys - # Force a warning if any other file imports nntplib - sys.modules.pop('nntplib') - --------------- - -This module defines the class :class:`NNTP` which implements the client side of -the Network News Transfer Protocol. It can be used to implement a news reader -or poster, or automated news processors. It is compatible with :rfc:`3977` -as well as the older :rfc:`977` and :rfc:`2980`. - -.. include:: ../includes/wasm-notavail.rst - -Here are two small examples of how it can be used. To list some statistics -about a newsgroup and print the subjects of the last 10 articles:: - - >>> s = nntplib.NNTP('news.gmane.io') - >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') - >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) - Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 - >>> resp, overviews = s.over((last - 9, last)) - >>> for id, over in overviews: - ... print(id, nntplib.decode_header(over['subject'])) - ... - 1087 Re: Commit privileges for Łukasz Langa - 1088 Re: 3.2 alpha 2 freeze - 1089 Re: 3.2 alpha 2 freeze - 1090 Re: Commit privileges for Łukasz Langa - 1091 Re: Commit privileges for Łukasz Langa - 1092 Updated ssh key - 1093 Re: Updated ssh key - 1094 Re: Updated ssh key - 1095 Hello fellow committers! - 1096 Re: Hello fellow committers! - >>> s.quit() - '205 Bye!' - -To post an article from a binary file (this assumes that the article has valid -headers, and that you have right to post on the particular newsgroup):: - - >>> s = nntplib.NNTP('news.gmane.io') - >>> f = open('article.txt', 'rb') - >>> s.post(f) - '240 Article posted successfully.' - >>> s.quit() - '205 Bye!' - -The module itself defines the following classes: - - -.. class:: NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False, [timeout]) - - Return a new :class:`NNTP` object, representing a connection - to the NNTP server running on host *host*, listening at port *port*. - An optional *timeout* can be specified for the socket connection. - If the optional *user* and *password* are provided, or if suitable - credentials are present in :file:`/.netrc` and the optional flag *usenetrc* - is true, the ``AUTHINFO USER`` and ``AUTHINFO PASS`` commands are used - to identify and authenticate the user to the server. If the optional - flag *readermode* is true, then a ``mode reader`` command is sent before - authentication is performed. Reader mode is sometimes necessary if you are - connecting to an NNTP server on the local machine and intend to call - reader-specific commands, such as ``group``. If you get unexpected - :exc:`NNTPPermanentError`\ s, you might need to set *readermode*. - The :class:`NNTP` class supports the :keyword:`with` statement to - unconditionally consume :exc:`OSError` exceptions and to close the NNTP - connection when done, e.g.: - - >>> from nntplib import NNTP - >>> with NNTP('news.gmane.io') as n: - ... n.group('gmane.comp.python.committers') - ... # doctest: +SKIP - ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') - >>> - - .. audit-event:: nntplib.connect self,host,port nntplib.NNTP - - .. audit-event:: nntplib.putline self,line nntplib.NNTP - - All commands will raise an :ref:`auditing event ` - ``nntplib.putline`` with arguments ``self`` and ``line``, - where ``line`` is the bytes about to be sent to the remote host. - - .. versionchanged:: 3.2 - *usenetrc* is now ``False`` by default. - - .. versionchanged:: 3.3 - Support for the :keyword:`with` statement was added. - - .. versionchanged:: 3.9 - If the *timeout* parameter is set to be zero, it will raise a - :class:`ValueError` to prevent the creation of a non-blocking socket. - -.. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout]) - - Return a new :class:`NNTP_SSL` object, representing an encrypted - connection to the NNTP server running on host *host*, listening at - port *port*. :class:`NNTP_SSL` objects have the same methods as - :class:`NNTP` objects. If *port* is omitted, port 563 (NNTPS) is used. - *ssl_context* is also optional, and is a :class:`~ssl.SSLContext` object. - Please read :ref:`ssl-security` for best practices. - All other parameters behave the same as for :class:`NNTP`. - - Note that SSL-on-563 is discouraged per :rfc:`4642`, in favor of - STARTTLS as described below. However, some servers only support the - former. - - .. audit-event:: nntplib.connect self,host,port nntplib.NNTP_SSL - - .. audit-event:: nntplib.putline self,line nntplib.NNTP_SSL - - All commands will raise an :ref:`auditing event ` - ``nntplib.putline`` with arguments ``self`` and ``line``, - where ``line`` is the bytes about to be sent to the remote host. - - .. versionadded:: 3.2 - - .. versionchanged:: 3.4 - The class now supports hostname check with - :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see - :data:`ssl.HAS_SNI`). - - .. versionchanged:: 3.9 - If the *timeout* parameter is set to be zero, it will raise a - :class:`ValueError` to prevent the creation of a non-blocking socket. - -.. exception:: NNTPError - - Derived from the standard exception :exc:`Exception`, this is the base - class for all exceptions raised by the :mod:`nntplib` module. Instances - of this class have the following attribute: - - .. attribute:: response - - The response of the server if available, as a :class:`str` object. - - -.. exception:: NNTPReplyError - - Exception raised when an unexpected reply is received from the server. - - -.. exception:: NNTPTemporaryError - - Exception raised when a response code in the range 400--499 is received. - - -.. exception:: NNTPPermanentError - - Exception raised when a response code in the range 500--599 is received. - - -.. exception:: NNTPProtocolError - - Exception raised when a reply is received from the server that does not begin - with a digit in the range 1--5. - - -.. exception:: NNTPDataError - - Exception raised when there is some error in the response data. - - -.. _nntp-objects: - -NNTP Objects ------------- - -When connected, :class:`NNTP` and :class:`NNTP_SSL` objects support the -following methods and attributes. - -Attributes -^^^^^^^^^^ - -.. attribute:: NNTP.nntp_version - - An integer representing the version of the NNTP protocol supported by the - server. In practice, this should be ``2`` for servers advertising - :rfc:`3977` compliance and ``1`` for others. - - .. versionadded:: 3.2 - -.. attribute:: NNTP.nntp_implementation - - A string describing the software name and version of the NNTP server, - or :const:`None` if not advertised by the server. - - .. versionadded:: 3.2 - -Methods -^^^^^^^ - -The *response* that is returned as the first item in the return tuple of almost -all methods is the server's response: a string beginning with a three-digit -code. If the server's response indicates an error, the method raises one of -the above exceptions. - -Many of the following methods take an optional keyword-only argument *file*. -When the *file* argument is supplied, it must be either a :term:`file object` -opened for binary writing, or the name of an on-disk file to be written to. -The method will then write any data returned by the server (except for the -response line and the terminating dot) to the file; any list of lines, -tuples or objects that the method normally returns will be empty. - -.. versionchanged:: 3.2 - Many of the following methods have been reworked and fixed, which makes - them incompatible with their 3.1 counterparts. - - -.. method:: NNTP.quit() - - Send a ``QUIT`` command and close the connection. Once this method has been - called, no other methods of the NNTP object should be called. - - -.. method:: NNTP.getwelcome() - - Return the welcome message sent by the server in reply to the initial - connection. (This message sometimes contains disclaimers or help information - that may be relevant to the user.) - - -.. method:: NNTP.getcapabilities() - - Return the :rfc:`3977` capabilities advertised by the server, as a - :class:`dict` instance mapping capability names to (possibly empty) lists - of values. On legacy servers which don't understand the ``CAPABILITIES`` - command, an empty dictionary is returned instead. - - >>> s = NNTP('news.gmane.io') - >>> 'POST' in s.getcapabilities() - True - - .. versionadded:: 3.2 - - -.. method:: NNTP.login(user=None, password=None, usenetrc=True) - - Send ``AUTHINFO`` commands with the user name and password. If *user* - and *password* are ``None`` and *usenetrc* is true, credentials from - ``~/.netrc`` will be used if possible. - - Unless intentionally delayed, login is normally performed during the - :class:`NNTP` object initialization and separately calling this function - is unnecessary. To force authentication to be delayed, you must not set - *user* or *password* when creating the object, and must set *usenetrc* to - False. - - .. versionadded:: 3.2 - - -.. method:: NNTP.starttls(context=None) - - Send a ``STARTTLS`` command. This will enable encryption on the NNTP - connection. The *context* argument is optional and should be a - :class:`ssl.SSLContext` object. Please read :ref:`ssl-security` for best - practices. - - Note that this may not be done after authentication information has - been transmitted, and authentication occurs by default if possible during a - :class:`NNTP` object initialization. See :meth:`NNTP.login` for information - on suppressing this behavior. - - .. versionadded:: 3.2 - - .. versionchanged:: 3.4 - The method now supports hostname check with - :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see - :data:`ssl.HAS_SNI`). - -.. method:: NNTP.newgroups(date, *, file=None) - - Send a ``NEWGROUPS`` command. The *date* argument should be a - :class:`datetime.date` or :class:`datetime.datetime` object. - Return a pair ``(response, groups)`` where *groups* is a list representing - the groups that are new since the given *date*. If *file* is supplied, - though, then *groups* will be empty. - - >>> from datetime import date, timedelta - >>> resp, groups = s.newgroups(date.today() - timedelta(days=3)) - >>> len(groups) # doctest: +SKIP - 85 - >>> groups[0] # doctest: +SKIP - GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m') - - -.. method:: NNTP.newnews(group, date, *, file=None) - - Send a ``NEWNEWS`` command. Here, *group* is a group name or ``'*'``, and - *date* has the same meaning as for :meth:`newgroups`. Return a pair - ``(response, articles)`` where *articles* is a list of message ids. - - This command is frequently disabled by NNTP server administrators. - - -.. method:: NNTP.list(group_pattern=None, *, file=None) - - Send a ``LIST`` or ``LIST ACTIVE`` command. Return a pair - ``(response, list)`` where *list* is a list of tuples representing all - the groups available from this NNTP server, optionally matching the - pattern string *group_pattern*. Each tuple has the form - ``(group, last, first, flag)``, where *group* is a group name, *last* - and *first* are the last and first article numbers, and *flag* usually - takes one of these values: - - * ``y``: Local postings and articles from peers are allowed. - * ``m``: The group is moderated and all postings must be approved. - * ``n``: No local postings are allowed, only articles from peers. - * ``j``: Articles from peers are filed in the junk group instead. - * ``x``: No local postings, and articles from peers are ignored. - * ``=foo.bar``: Articles are filed in the ``foo.bar`` group instead. - - If *flag* has another value, then the status of the newsgroup should be - considered unknown. - - This command can return very large results, especially if *group_pattern* - is not specified. It is best to cache the results offline unless you - really need to refresh them. - - .. versionchanged:: 3.2 - *group_pattern* was added. - - -.. method:: NNTP.descriptions(grouppattern) - - Send a ``LIST NEWSGROUPS`` command, where *grouppattern* is a wildmat string as - specified in :rfc:`3977` (it's essentially the same as DOS or UNIX shell wildcard - strings). Return a pair ``(response, descriptions)``, where *descriptions* - is a dictionary mapping group names to textual descriptions. - - >>> resp, descs = s.descriptions('gmane.comp.python.*') - >>> len(descs) # doctest: +SKIP - 295 - >>> descs.popitem() # doctest: +SKIP - ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)') - - -.. method:: NNTP.description(group) - - Get a description for a single group *group*. If more than one group matches - (if 'group' is a real wildmat string), return the first match. If no group - matches, return an empty string. - - This elides the response code from the server. If the response code is needed, - use :meth:`descriptions`. - - -.. method:: NNTP.group(name) - - Send a ``GROUP`` command, where *name* is the group name. The group is - selected as the current group, if it exists. Return a tuple - ``(response, count, first, last, name)`` where *count* is the (estimated) - number of articles in the group, *first* is the first article number in - the group, *last* is the last article number in the group, and *name* - is the group name. - - -.. method:: NNTP.over(message_spec, *, file=None) - - Send an ``OVER`` command, or an ``XOVER`` command on legacy servers. - *message_spec* can be either a string representing a message id, or - a ``(first, last)`` tuple of numbers indicating a range of articles in - the current group, or a ``(first, None)`` tuple indicating a range of - articles starting from *first* to the last article in the current group, - or :const:`None` to select the current article in the current group. - - Return a pair ``(response, overviews)``. *overviews* is a list of - ``(article_number, overview)`` tuples, one for each article selected - by *message_spec*. Each *overview* is a dictionary with the same number - of items, but this number depends on the server. These items are either - message headers (the key is then the lower-cased header name) or metadata - items (the key is then the metadata name prepended with ``":"``). The - following items are guaranteed to be present by the NNTP specification: - - * the ``subject``, ``from``, ``date``, ``message-id`` and ``references`` - headers - * the ``:bytes`` metadata: the number of bytes in the entire raw article - (including headers and body) - * the ``:lines`` metadata: the number of lines in the article body - - The value of each item is either a string, or :const:`None` if not present. - - It is advisable to use the :func:`decode_header` function on header - values when they may contain non-ASCII characters:: - - >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') - >>> resp, overviews = s.over((last, last)) - >>> art_num, over = overviews[0] - >>> art_num - 117216 - >>> list(over.keys()) - ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject'] - >>> over['from'] - '=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= ' - >>> nntplib.decode_header(over['from']) - '"Martin v. Löwis" ' - - .. versionadded:: 3.2 - - -.. method:: NNTP.help(*, file=None) - - Send a ``HELP`` command. Return a pair ``(response, list)`` where *list* is a - list of help strings. - - -.. method:: NNTP.stat(message_spec=None) - - Send a ``STAT`` command, where *message_spec* is either a message id - (enclosed in ``'<'`` and ``'>'``) or an article number in the current group. - If *message_spec* is omitted or :const:`None`, the current article in the - current group is considered. Return a triple ``(response, number, id)`` - where *number* is the article number and *id* is the message id. - - >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') - >>> resp, number, message_id = s.stat(first) - >>> number, message_id - (9099, '<20030112190404.GE29873@epoch.metaslash.com>') - - -.. method:: NNTP.next() - - Send a ``NEXT`` command. Return as for :meth:`.stat`. - - -.. method:: NNTP.last() - - Send a ``LAST`` command. Return as for :meth:`.stat`. - - -.. method:: NNTP.article(message_spec=None, *, file=None) - - Send an ``ARTICLE`` command, where *message_spec* has the same meaning as - for :meth:`.stat`. Return a tuple ``(response, info)`` where *info* - is a :class:`~collections.namedtuple` with three attributes *number*, - *message_id* and *lines* (in that order). *number* is the article number - in the group (or 0 if the information is not available), *message_id* the - message id as a string, and *lines* a list of lines (without terminating - newlines) comprising the raw message including headers and body. - - >>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>') - >>> info.number - 0 - >>> info.message_id - '<20030112190404.GE29873@epoch.metaslash.com>' - >>> len(info.lines) - 65 - >>> info.lines[0] - b'Path: main.gmane.org!not-for-mail' - >>> info.lines[1] - b'From: Neal Norwitz ' - >>> info.lines[-3:] - [b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal'] - - -.. method:: NNTP.head(message_spec=None, *, file=None) - - Same as :meth:`article()`, but sends a ``HEAD`` command. The *lines* - returned (or written to *file*) will only contain the message headers, not - the body. - - -.. method:: NNTP.body(message_spec=None, *, file=None) - - Same as :meth:`article()`, but sends a ``BODY`` command. The *lines* - returned (or written to *file*) will only contain the message body, not the - headers. - - -.. method:: NNTP.post(data) - - Post an article using the ``POST`` command. The *data* argument is either - a :term:`file object` opened for binary reading, or any iterable of bytes - objects (representing raw lines of the article to be posted). It should - represent a well-formed news article, including the required headers. The - :meth:`post` method automatically escapes lines beginning with ``.`` and - appends the termination line. - - If the method succeeds, the server's response is returned. If the server - refuses posting, a :class:`NNTPReplyError` is raised. - - -.. method:: NNTP.ihave(message_id, data) - - Send an ``IHAVE`` command. *message_id* is the id of the message to send - to the server (enclosed in ``'<'`` and ``'>'``). The *data* parameter - and the return value are the same as for :meth:`post()`. - - -.. method:: NNTP.date() - - Return a pair ``(response, date)``. *date* is a :class:`~datetime.datetime` - object containing the current date and time of the server. - - -.. method:: NNTP.slave() - - Send a ``SLAVE`` command. Return the server's *response*. - - -.. method:: NNTP.set_debuglevel(level) - - Set the instance's debugging level. This controls the amount of debugging - output printed. The default, ``0``, produces no debugging output. A value of - ``1`` produces a moderate amount of debugging output, generally a single line - per request or response. A value of ``2`` or higher produces the maximum amount - of debugging output, logging each line sent and received on the connection - (including message text). - - -The following are optional NNTP extensions defined in :rfc:`2980`. Some of -them have been superseded by newer commands in :rfc:`3977`. - - -.. method:: NNTP.xhdr(hdr, str, *, file=None) - - Send an ``XHDR`` command. The *hdr* argument is a header keyword, e.g. - ``'subject'``. The *str* argument should have the form ``'first-last'`` - where *first* and *last* are the first and last article numbers to search. - Return a pair ``(response, list)``, where *list* is a list of pairs ``(id, - text)``, where *id* is an article number (as a string) and *text* is the text of - the requested header for that article. If the *file* parameter is supplied, then - the output of the ``XHDR`` command is stored in a file. If *file* is a string, - then the method will open a file with that name, write to it then close it. - If *file* is a :term:`file object`, then it will start calling :meth:`write` on - it to store the lines of the command output. If *file* is supplied, then the - returned *list* is an empty list. - - -.. method:: NNTP.xover(start, end, *, file=None) - - Send an ``XOVER`` command. *start* and *end* are article numbers - delimiting the range of articles to select. The return value is the - same of for :meth:`over()`. It is recommended to use :meth:`over()` - instead, since it will automatically use the newer ``OVER`` command - if available. - - -Utility functions ------------------ - -The module also defines the following utility function: - - -.. function:: decode_header(header_str) - - Decode a header value, un-escaping any escaped non-ASCII characters. - *header_str* must be a :class:`str` object. The unescaped value is - returned. Using this function is recommended to display some headers - in a human readable form:: - - >>> decode_header("Some subject") - 'Some subject' - >>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=") - 'Débuter en Python' - >>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=") - 'Re: problème de matrice' +The last version of Python that provided the :mod:`!nntplib` module was +`Python 3.12 `_. diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index b3dce151..d0ae79c7 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -1,5 +1,5 @@ -:mod:`numbers` --- Numeric abstract base classes -================================================ +:mod:`!numbers` --- Numeric abstract base classes +================================================= .. module:: numbers :synopsis: Numeric abstract base classes (Complex, Real, Integral, etc.). @@ -8,7 +8,7 @@ -------------- -The :mod:`numbers` module (:pep:`3141`) defines a hierarchy of numeric +The :mod:`!numbers` module (:pep:`3141`) defines a hierarchy of numeric :term:`abstract base classes ` which progressively define more operations. None of the types defined in this module are intended to be instantiated. @@ -45,7 +45,7 @@ The numeric tower .. class:: Real - To :class:`Complex`, :class:`Real` adds the operations that work on real + To :class:`Complex`, :class:`!Real` adds the operations that work on real numbers. In short, those are: a conversion to :class:`float`, :func:`math.trunc`, @@ -84,10 +84,10 @@ The numeric tower ``~``. -Notes for type implementors +Notes for type implementers --------------------------- -Implementors should be careful to make equal numbers equal and hash +Implementers should be careful to make equal numbers equal and hash them to the same values. This may be subtle if there are two different extensions of the real numbers. For example, :class:`fractions.Fraction` implements :func:`hash` as follows:: @@ -126,7 +126,8 @@ We want to implement the arithmetic operations so that mixed-mode operations either call an implementation whose author knew about the types of both arguments, or convert both to the nearest built in type and do the operation there. For subtypes of :class:`Integral`, this -means that :meth:`__add__` and :meth:`__radd__` should be defined as:: +means that :meth:`~object.__add__` and :meth:`~object.__radd__` should be +defined as:: class MyIntegral(Integral): @@ -160,27 +161,27 @@ refer to ``MyIntegral`` and ``OtherTypeIKnowAbout`` as of :class:`Complex` (``a : A <: Complex``), and ``b : B <: Complex``. I'll consider ``a + b``: - 1. If ``A`` defines an :meth:`__add__` which accepts ``b``, all is - well. - 2. If ``A`` falls back to the boilerplate code, and it were to - return a value from :meth:`__add__`, we'd miss the possibility - that ``B`` defines a more intelligent :meth:`__radd__`, so the - boilerplate should return :const:`NotImplemented` from - :meth:`__add__`. (Or ``A`` may not implement :meth:`__add__` at - all.) - 3. Then ``B``'s :meth:`__radd__` gets a chance. If it accepts - ``a``, all is well. - 4. If it falls back to the boilerplate, there are no more possible - methods to try, so this is where the default implementation - should live. - 5. If ``B <: A``, Python tries ``B.__radd__`` before - ``A.__add__``. This is ok, because it was implemented with - knowledge of ``A``, so it can handle those instances before - delegating to :class:`Complex`. +1. If ``A`` defines an :meth:`~object.__add__` which accepts ``b``, all is + well. +2. If ``A`` falls back to the boilerplate code, and it were to + return a value from :meth:`~object.__add__`, we'd miss the possibility + that ``B`` defines a more intelligent :meth:`~object.__radd__`, so the + boilerplate should return :data:`NotImplemented` from + :meth:`!__add__`. (Or ``A`` may not implement :meth:`!__add__` at + all.) +3. Then ``B``'s :meth:`~object.__radd__` gets a chance. If it accepts + ``a``, all is well. +4. If it falls back to the boilerplate, there are no more possible + methods to try, so this is where the default implementation + should live. +5. If ``B <: A``, Python tries ``B.__radd__`` before + ``A.__add__``. This is ok, because it was implemented with + knowledge of ``A``, so it can handle those instances before + delegating to :class:`Complex`. If ``A <: Complex`` and ``B <: Real`` without sharing any other knowledge, then the appropriate shared operation is the one involving the built -in :class:`complex`, and both :meth:`__radd__` s land there, so ``a+b +in :class:`complex`, and both :meth:`~object.__radd__` s land there, so ``a+b == b+a``. Because most of the operations on any given type will be very similar, diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst index 57c67bcf..a9a6026a 100644 --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -1,5 +1,5 @@ -:mod:`operator` --- Standard operators as functions -=================================================== +:mod:`!operator` --- Standard operators as functions +==================================================== .. module:: operator :synopsis: Functions corresponding to the standard operators. @@ -306,7 +306,7 @@ expect a function argument. itemgetter(*items) Return a callable object that fetches *item* from its operand using the - operand's :meth:`__getitem__` method. If multiple items are specified, + operand's :meth:`~object.__getitem__` method. If multiple items are specified, returns a tuple of lookup values. For example: * After ``f = itemgetter(2)``, the call ``f(r)`` returns ``r[2]``. @@ -326,7 +326,7 @@ expect a function argument. return tuple(obj[item] for item in items) return g - The items can be any type accepted by the operand's :meth:`__getitem__` + The items can be any type accepted by the operand's :meth:`~object.__getitem__` method. Dictionaries accept any :term:`hashable` value. Lists, tuples, and strings accept an index or a slice: diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index 846b8e03..74a49a8f 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -1,5 +1,5 @@ -:mod:`optparse` --- Parser for command line options -=================================================== +:mod:`!optparse` --- Parser for command line options +==================================================== .. module:: optparse :synopsis: Command-line option parsing library. @@ -11,8 +11,9 @@ **Source code:** :source:`Lib/optparse.py` .. deprecated:: 3.2 - The :mod:`optparse` module is deprecated and will not be developed further; - development will continue with the :mod:`argparse` module. + The :mod:`optparse` module is :term:`soft deprecated` and will not be + developed further; development will continue with the :mod:`argparse` + module. -------------- @@ -1351,7 +1352,7 @@ The whole point of creating and populating an OptionParser is to call its the list of arguments to process (default: ``sys.argv[1:]``) ``values`` - an :class:`Values` object to store option arguments in (default: a + a :class:`Values` object to store option arguments in (default: a new instance of :class:`Values`) -- if you give an existing object, the option defaults will not be initialized on it @@ -1738,7 +1739,7 @@ seen, but blow up if it comes after ``-b`` in the command-line. :: Callback example 3: check option order (generalized) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you want to re-use this callback for several similar options (set a flag, but +If you want to reuse this callback for several similar options (set a flag, but blow up if ``-b`` has already been seen), it needs a bit of work: the error message and the flag that it sets must be generalized. :: diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 6f9e0853..ecbbc1d7 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -1,10 +1,10 @@ -:mod:`os.path` --- Common pathname manipulations -================================================ +:mod:`!os.path` --- Common pathname manipulations +================================================= .. module:: os.path :synopsis: Operations on pathnames. -**Source code:** :source:`Lib/posixpath.py` (for POSIX) and +**Source code:** :source:`Lib/genericpath.py`, :source:`Lib/posixpath.py` (for POSIX) and :source:`Lib/ntpath.py` (for Windows). .. index:: single: path; operations @@ -79,19 +79,20 @@ the :mod:`glob` module.) .. function:: commonpath(paths) - Return the longest common sub-path of each pathname in the sequence + Return the longest common sub-path of each pathname in the iterable *paths*. Raise :exc:`ValueError` if *paths* contain both absolute - and relative pathnames, the *paths* are on the different drives or + and relative pathnames, if *paths* are on different drives, or if *paths* is empty. Unlike :func:`commonprefix`, this returns a valid path. - .. availability:: Unix, Windows. - .. versionadded:: 3.5 .. versionchanged:: 3.6 Accepts a sequence of :term:`path-like objects `. + .. versionchanged:: 3.13 + Any iterable can now be passed, rather than just sequences. + .. function:: commonprefix(list) @@ -144,7 +145,7 @@ the :mod:`glob` module.) .. function:: lexists(path) - Return ``True`` if *path* refers to an existing path. Returns ``True`` for + Return ``True`` if *path* refers to an existing path, including broken symbolic links. Equivalent to :func:`exists` on platforms lacking :func:`os.lstat`. @@ -200,14 +201,14 @@ the :mod:`glob` module.) .. function:: getatime(path) - Return the time of last access of *path*. The return value is a floating point number giving + Return the time of last access of *path*. The return value is a floating-point number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. .. function:: getmtime(path) - Return the time of last modification of *path*. The return value is a floating point number + Return the time of last modification of *path*. The return value is a floating-point number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. @@ -239,12 +240,16 @@ the :mod:`glob` module.) .. function:: isabs(path) Return ``True`` if *path* is an absolute pathname. On Unix, that means it - begins with a slash, on Windows that it begins with a (back)slash after chopping - off a potential drive letter. + begins with a slash, on Windows that it begins with two (back)slashes, or a + drive letter, colon, and (back)slash together. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.13 + On Windows, returns ``False`` if the given path starts with exactly one + (back)slash. + .. function:: isfile(path) @@ -297,8 +302,8 @@ the :mod:`glob` module.) always mount points, and for any other path ``GetVolumePathName`` is called to see if it is different from the input path. - .. versionadded:: 3.4 - Support for detecting non-root mount points on Windows. + .. versionchanged:: 3.4 + Added support for detecting non-root mount points on Windows. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -317,9 +322,32 @@ the :mod:`glob` module.) Dev Drives. See `the Windows documentation `_ for information on enabling and creating Dev Drives. + .. versionadded:: 3.12 + + .. versionchanged:: 3.13 + The function is now available on all platforms, and will always return ``False`` on those that have no support for Dev Drives + + +.. function:: isreserved(path) + + Return ``True`` if *path* is a reserved pathname on the current system. + + On Windows, reserved filenames include those that end with a space or dot; + those that contain colons (i.e. file streams such as "name:stream"), + wildcard characters (i.e. ``'*?"<>'``), pipe, or ASCII control characters; + as well as DOS device names such as "NUL", "CON", "CONIN$", "CONOUT$", + "AUX", "PRN", "COM1", and "LPT1". + + .. note:: + + This function approximates rules for reserved paths on most Windows + systems. These rules change over time in various Windows releases. + This function may be updated in future Python releases as changes to + the rules become broadly available. + .. availability:: Windows. - .. versionadded:: 3.12 + .. versionadded:: 3.13 .. function:: join(path, *paths) @@ -361,7 +389,7 @@ the :mod:`glob` module.) that contains symbolic links. On Windows, it converts forward slashes to backward slashes. To normalize case, use :func:`normcase`. - .. note:: + .. note:: On POSIX systems, in accordance with `IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution `_, if a pathname begins with exactly two slashes, the first component @@ -377,12 +405,12 @@ the :mod:`glob` module.) Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path (if they are supported by the operating - system). + system). On Windows, this function will also resolve MS-DOS (also called 8.3) + style names such as ``C:\\PROGRA~1`` to ``C:\\Program Files``. If a path doesn't exist or a symlink loop is encountered, and *strict* is - ``True``, :exc:`OSError` is raised. If *strict* is ``False``, the path is - resolved as far as possible and any remainder is appended without checking - whether it exists. + ``True``, :exc:`OSError` is raised. If *strict* is ``False`` these errors + are ignored, and so the result might be missing or otherwise inaccessible. .. note:: This function emulates the operating system's procedure for making a path @@ -412,8 +440,6 @@ the :mod:`glob` module.) *start* defaults to :data:`os.curdir`. - .. availability:: Unix, Windows. - .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -424,8 +450,6 @@ the :mod:`glob` module.) This is determined by the device number and i-node number and raises an exception if an :func:`os.stat` call on either pathname fails. - .. availability:: Unix, Windows. - .. versionchanged:: 3.2 Added Windows support. @@ -440,8 +464,6 @@ the :mod:`glob` module.) Return ``True`` if the file descriptors *fp1* and *fp2* refer to the same file. - .. availability:: Unix, Windows. - .. versionchanged:: 3.2 Added Windows support. @@ -456,8 +478,6 @@ the :mod:`glob` module.) :func:`os.lstat`, or :func:`os.stat`. This function implements the underlying comparison used by :func:`samefile` and :func:`sameopenfile`. - .. availability:: Unix, Windows. - .. versionchanged:: 3.4 Added Windows support. diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4ffd520f..454e6d76 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1,5 +1,5 @@ -:mod:`os` --- Miscellaneous operating system interfaces -======================================================= +:mod:`!os` --- Miscellaneous operating system interfaces +======================================================== .. module:: os :synopsis: Miscellaneous operating system interfaces. @@ -34,12 +34,12 @@ Notes on the availability of these functions: * On VxWorks, os.popen, os.fork, os.execv and os.spawn*p* are not supported. -* On WebAssembly platforms ``wasm32-emscripten`` and ``wasm32-wasi``, large - parts of the :mod:`os` module are not available or behave differently. API - related to processes (e.g. :func:`~os.fork`, :func:`~os.execve`), signals - (e.g. :func:`~os.kill`, :func:`~os.wait`), and resources - (e.g. :func:`~os.nice`) are not available. Others like :func:`~os.getuid` - and :func:`~os.getpid` are emulated or stubs. +* On WebAssembly platforms, Android and iOS, large parts of the :mod:`os` module are + not available or behave differently. APIs related to processes (e.g. + :func:`~os.fork`, :func:`~os.execve`) and resources (e.g. :func:`~os.nice`) + are not available. Others like :func:`~os.getuid` and :func:`~os.getpid` are + emulated or stubs. WebAssembly platforms also lack support for signals (e.g. + :func:`~os.kill`, :func:`~os.wait`). .. note:: @@ -113,8 +113,8 @@ of the UTF-8 encoding: * Use UTF-8 as the :term:`filesystem encoding `. -* :func:`sys.getfilesystemencoding()` returns ``'utf-8'``. -* :func:`locale.getpreferredencoding()` returns ``'utf-8'`` (the *do_setlocale* +* :func:`sys.getfilesystemencoding` returns ``'utf-8'``. +* :func:`locale.getpreferredencoding` returns ``'utf-8'`` (the *do_setlocale* argument has no effect). * :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use UTF-8 as their text encoding, with the ``surrogateescape`` @@ -133,8 +133,8 @@ level APIs also exhibit different default behaviours: * Command line arguments, environment variables and filenames are decoded to text using the UTF-8 encoding. -* :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. -* :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 +* :func:`os.fsdecode` and :func:`os.fsencode` use the UTF-8 encoding. +* :func:`open`, :func:`io.open`, and :func:`codecs.open` use the UTF-8 encoding by default. However, they still use the strict error handler by default so that attempting to open a binary file in text mode is likely to raise an exception rather than producing nonsense data. @@ -178,7 +178,7 @@ process and user. Return the filename corresponding to the controlling terminal of the process. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: environ @@ -355,7 +355,7 @@ process and user. Return the effective group id of the current process. This corresponds to the "set id" bit on the file being executed in the current process. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: geteuid() @@ -364,7 +364,7 @@ process and user. Return the current process's effective user id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: getgid() @@ -375,8 +375,8 @@ process and user. .. availability:: Unix. - The function is a stub on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is a stub on WASI, see :ref:`wasm-availability` for more + information. .. function:: getgrouplist(user, group, /) @@ -386,7 +386,7 @@ process and user. field from the password record for *user*, because that group ID will otherwise be potentially omitted. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -395,7 +395,7 @@ process and user. Return list of supplemental group ids associated with the current process. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. note:: @@ -423,7 +423,7 @@ process and user. falls back to ``pwd.getpwuid(os.getuid())[0]`` to get the login name of the current real user id. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. .. function:: getpgid(pid) @@ -431,7 +431,7 @@ process and user. Return the process group id of the process with process id *pid*. If *pid* is 0, the process group id of the current process is returned. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: getpgrp() @@ -439,7 +439,7 @@ process and user. Return the id of the current process group. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: getpid() @@ -448,8 +448,8 @@ process and user. Return the current process id. - The function is a stub on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is a stub on WASI, see :ref:`wasm-availability` for more + information. .. function:: getppid() @@ -459,7 +459,7 @@ process and user. the id returned is the one of the init process (1), on Windows it is still the same id, which may be already reused by another process. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. .. versionchanged:: 3.2 Added support for Windows. @@ -477,7 +477,7 @@ process and user. (respectively) the calling process, the process group of the calling process, or the real user ID of the calling process. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -488,7 +488,7 @@ process and user. Parameters for the :func:`getpriority` and :func:`setpriority` functions. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -509,7 +509,7 @@ process and user. Return a tuple (ruid, euid, suid) denoting the current process's real, effective, and saved user ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.2 @@ -519,7 +519,7 @@ process and user. Return a tuple (rgid, egid, sgid) denoting the current process's real, effective, and saved group ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.2 @@ -532,8 +532,8 @@ process and user. .. availability:: Unix. - The function is a stub on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is a stub on WASI, see :ref:`wasm-availability` for more + information. .. function:: initgroups(username, gid, /) @@ -542,7 +542,7 @@ process and user. the groups of which the specified username is a member, plus the specified group id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. versionadded:: 3.2 @@ -576,21 +576,21 @@ process and user. Set the current process's effective group id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. function:: seteuid(euid, /) Set the current process's effective user id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. function:: setgid(gid, /) Set the current process' group id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. function:: setgroups(groups, /) @@ -599,7 +599,7 @@ process and user. *groups*. *groups* must be a sequence, and each element must be an integer identifying a group. This operation is typically available only to the superuser. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. note:: On macOS, the length of *groups* may not exceed the system-defined maximum number of effective group ids, typically 16. @@ -649,7 +649,7 @@ process and user. Call the system call :c:func:`!setpgrp` or ``setpgrp(0, 0)`` depending on which version is implemented (if any). See the Unix manual for the semantics. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: setpgid(pid, pgrp, /) @@ -658,7 +658,7 @@ process and user. process with id *pid* to the process group with id *pgrp*. See the Unix manual for the semantics. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: setpriority(which, who, priority) @@ -675,7 +675,7 @@ process and user. *priority* is a value in the range -20 to 19. The default priority is 0; lower priorities cause more favorable scheduling. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -684,14 +684,14 @@ process and user. Set the current process's real and effective group ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. function:: setresgid(rgid, egid, sgid, /) Set the current process's real, effective, and saved group ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. versionadded:: 3.2 @@ -700,7 +700,7 @@ process and user. Set the current process's real, effective, and saved user ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. versionadded:: 3.2 @@ -709,21 +709,21 @@ process and user. Set the current process's real and effective user ids. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. function:: getsid(pid, /) Call the system call :c:func:`!getsid`. See the Unix manual for the semantics. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: setsid() Call the system call :c:func:`!setsid`. See the Unix manual for the semantics. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: setuid(uid, /) @@ -732,7 +732,7 @@ process and user. Set the current process's user id. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. placed in this section since it relates to errno.... a little weak @@ -755,8 +755,8 @@ process and user. Set the current numeric umask and return the previous umask. - The function is a stub on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is a stub on WASI, see :ref:`wasm-availability` for more + information. .. function:: uname() @@ -784,6 +784,11 @@ process and user. :func:`socket.gethostname` or even ``socket.gethostbyaddr(socket.gethostname())``. + On macOS, iOS and Android, this returns the *kernel* name and version (i.e., + ``'Darwin'`` on macOS and iOS; ``'Linux'`` on Android). :func:`platform.uname` + can be used to get the user-facing operating system name and version on iOS and + Android. + .. availability:: Unix. .. versionchanged:: 3.3 @@ -918,10 +923,10 @@ as internal buffering of data. Copy *count* bytes from file descriptor *src*, starting from offset *offset_src*, to file descriptor *dst*, starting from offset *offset_dst*. - If *offset_src* is None, then *src* is read from the current position; + If *offset_src* is ``None``, then *src* is read from the current position; respectively for *offset_dst*. - In Linux kernel older than 5.3, the files pointed by *src* and *dst* + In Linux kernel older than 5.3, the files pointed to by *src* and *dst* must reside in the same filesystem, otherwise an :exc:`OSError` is raised with :attr:`~OSError.errno` set to :const:`errno.EXDEV`. @@ -1001,10 +1006,13 @@ as internal buffering of data. .. audit-event:: os.chmod path,mode,dir_fd os.fchmod - .. availability:: Unix. + .. availability:: Unix, Windows. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. + + .. versionchanged:: 3.13 + Added support on Windows. .. function:: fchown(fd, uid, gid) @@ -1018,8 +1026,8 @@ as internal buffering of data. .. availability:: Unix. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. .. function:: fdatasync(fd) @@ -1109,8 +1117,8 @@ as internal buffering of data. .. availability:: Unix, Windows. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. On Windows, this function is limited to pipes. @@ -1119,6 +1127,20 @@ as internal buffering of data. .. versionchanged:: 3.12 Added support for pipes on Windows. + +.. function:: grantpt(fd, /) + + Grant access to the slave pseudo-terminal device associated with the + master pseudo-terminal device to which the file descriptor *fd* refers. + The file descriptor *fd* is not closed upon failure. + + Calls the C standard library function :c:func:`grantpt`. + + .. availability:: Unix, not WASI. + + .. versionadded:: 3.13 + + .. function:: isatty(fd, /) Return ``True`` if the file descriptor *fd* is open and connected to a @@ -1158,7 +1180,7 @@ as internal buffering of data. Make the calling process a session leader; make the tty the controlling tty, the stdin, the stdout, and the stderr of the calling process; close fd. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.11 @@ -1251,8 +1273,8 @@ as internal buffering of data. :meth:`~file.read` and :meth:`~file.write` methods (and many more). To wrap a file descriptor in a file object, use :func:`fdopen`. - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.5 If the system call is interrupted and the signal handler does not raise an @@ -1342,7 +1364,7 @@ or `the MSDN `_ on Windo descriptors are :ref:`non-inheritable `. For a (slightly) more portable approach, use the :mod:`pty` module. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionchanged:: 3.4 The new file descriptors are now non-inheritable. @@ -1368,7 +1390,7 @@ or `the MSDN `_ on Windo Return a pair of file descriptors ``(r, w)`` usable for reading and writing, respectively. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -1378,7 +1400,7 @@ or `the MSDN `_ on Windo Ensures that enough disk space is allocated for the file specified by *fd* starting from *offset* and continuing for *len* bytes. - .. availability:: Unix, not Emscripten. + .. availability:: Unix. .. versionadded:: 3.3 @@ -1426,6 +1448,23 @@ or `the MSDN `_ on Windo .. versionadded:: 3.3 +.. function:: posix_openpt(oflag, /) + + Open and return a file descriptor for a master pseudo-terminal device. + + Calls the C standard library function :c:func:`posix_openpt`. The *oflag* + argument is used to set file status flags and file access modes as + specified in the manual page of :c:func:`posix_openpt` of your system. + + The returned file descriptor is :ref:`non-inheritable `. + If the value :data:`O_CLOEXEC` is available on the system, it is added to + *oflag*. + + .. availability:: Unix, not WASI. + + .. versionadded:: 3.13 + + .. function:: preadv(fd, buffers, offset, flags=0, /) Read from a file descriptor *fd* at a position of *offset* into mutable @@ -1483,6 +1522,21 @@ or `the MSDN `_ on Windo .. versionadded:: 3.7 +.. function:: ptsname(fd, /) + + Return the name of the slave pseudo-terminal device associated with the + master pseudo-terminal device to which the file descriptor *fd* refers. + The file descriptor *fd* is not closed upon failure. + + Calls the reentrant C standard library function :c:func:`ptsname_r` if + it is available; otherwise, the C standard library function + :c:func:`ptsname`, which is not guaranteed to be thread-safe, is called. + + .. availability:: Unix, not WASI. + + .. versionadded:: 3.13 + + .. function:: pwrite(fd, str, offset, /) Write the bytestring in *str* to file descriptor *fd* at position of @@ -1497,7 +1551,7 @@ or `the MSDN `_ on Windo .. function:: pwritev(fd, buffers, offset, flags=0, /) - Write the *buffers* contents to file descriptor *fd* at a offset *offset*, + Write the *buffers* contents to file descriptor *fd* at an offset *offset*, leaving the file offset unchanged. *buffers* must be a sequence of :term:`bytes-like objects `. Buffers are processed in array order. Entire contents of the first buffer is written before @@ -1605,7 +1659,7 @@ or `the MSDN `_ on Windo Cross-platform applications should not use *headers*, *trailers* and *flags* arguments. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. note:: @@ -1625,7 +1679,7 @@ or `the MSDN `_ on Windo Parameters to the :func:`sendfile` function, if the implementation supports them. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.3 @@ -1634,7 +1688,7 @@ or `the MSDN `_ on Windo Parameter to the :func:`sendfile` function, if the implementation supports it. The data won't be cached in the virtual memory and will be freed afterwards. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionadded:: 3.11 @@ -1648,8 +1702,8 @@ or `the MSDN `_ on Windo .. availability:: Unix, Windows. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. On Windows, this function is limited to pipes. @@ -1664,9 +1718,9 @@ or `the MSDN `_ on Windo Transfer *count* bytes from file descriptor *src*, starting from offset *offset_src*, to file descriptor *dst*, starting from offset *offset_dst*. At least one of the file descriptors must refer to a pipe. If *offset_src* - is None, then *src* is read from the current position; respectively for + is ``None``, then *src* is read from the current position; respectively for *offset_dst*. The offset associated to the file descriptor that refers to a - pipe must be ``None``. The files pointed by *src* and *dst* must reside in + pipe must be ``None``. The files pointed to by *src* and *dst* must reside in the same filesystem, otherwise an :exc:`OSError` is raised with :attr:`~OSError.errno` set to :const:`errno.EXDEV`. @@ -1735,6 +1789,19 @@ or `the MSDN `_ on Windo .. availability:: Unix. +.. function:: unlockpt(fd, /) + + Unlock the slave pseudo-terminal device associated with the master + pseudo-terminal device to which the file descriptor *fd* refers. + The file descriptor *fd* is not closed upon failure. + + Calls the C standard library function :c:func:`unlockpt`. + + .. availability:: Unix, not WASI. + + .. versionadded:: 3.13 + + .. function:: write(fd, str, /) Write the bytestring in *str* to file descriptor *fd*. @@ -1831,8 +1898,7 @@ Using the :mod:`subprocess` module, all file descriptors except standard streams are closed, and inheritable handles are only inherited if the *close_fds* parameter is ``False``. -On WebAssembly platforms ``wasm32-emscripten`` and ``wasm32-wasi``, the file -descriptor cannot be modified. +On WebAssembly platforms, the file descriptor cannot be modified. .. function:: get_inheritable(fd, /) @@ -1988,7 +2054,7 @@ features: .. audit-event:: os.chdir path os.chdir - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as a file descriptor on some platforms. @@ -2018,10 +2084,10 @@ features: .. audit-event:: os.chflags path,flags os.chflags - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. - .. versionadded:: 3.3 - The *follow_symlinks* argument. + .. versionchanged:: 3.3 + Added the *follow_symlinks* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2062,19 +2128,24 @@ features: Although Windows supports :func:`chmod`, you can only set the file's read-only flag with it (via the ``stat.S_IWRITE`` and ``stat.S_IREAD`` constants or a corresponding integer value). All other bits are ignored. + The default value of *follow_symlinks* is ``False`` on Windows. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. .. audit-event:: os.chmod path,mode,dir_fd os.chmod - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor, and the *dir_fd* and *follow_symlinks* arguments. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.13 + Added support for a file descriptor and the *follow_symlinks* argument + on Windows. + .. function:: chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) @@ -2092,10 +2163,10 @@ features: .. availability:: Unix. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor, and the *dir_fd* and *follow_symlinks* arguments. @@ -2107,7 +2178,7 @@ features: Change the root directory of the current process to *path*. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2147,7 +2218,7 @@ features: .. audit-event:: os.chflags path,flags os.lchflags - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2160,13 +2231,19 @@ features: for possible values of *mode*. As of Python 3.3, this is equivalent to ``os.chmod(path, mode, follow_symlinks=False)``. + ``lchmod()`` is not part of POSIX, but Unix implementations may have it if + changing the mode of symbolic links is supported. + .. audit-event:: os.chmod path,mode,dir_fd os.lchmod - .. availability:: Unix. + .. availability:: Unix, Windows, not Linux, FreeBSD >= 1.3, NetBSD >= 1.3, not OpenBSD .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.13 + Added support on Windows. + .. function:: lchown(path, uid, gid) Change the owner and group id of *path* to the numeric *uid* and *gid*. This @@ -2191,13 +2268,13 @@ features: .. audit-event:: os.link src,dst,src_dir_fd,dst_dir_fd os.link - .. availability:: Unix, Windows, not Emscripten. + .. availability:: Unix, Windows. .. versionchanged:: 3.2 Added Windows support. - .. versionadded:: 3.3 - Added the *src_dir_fd*, *dst_dir_fd*, and *follow_symlinks* arguments. + .. versionchanged:: 3.3 + Added the *src_dir_fd*, *dst_dir_fd*, and *follow_symlinks* parameters. .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *src* and *dst*. @@ -2233,7 +2310,7 @@ features: .. versionchanged:: 3.2 The *path* parameter became optional. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor. .. versionchanged:: 3.6 @@ -2353,6 +2430,10 @@ features: platform-dependent. On some platforms, they are ignored and you should call :func:`chmod` explicitly to set them. + On Windows, a *mode* of ``0o700`` is specifically handled to apply access + control to the new directory such that only the current user and + administrators have access. Other values of *mode* are ignored. + This function can also support :ref:`paths relative to directory descriptors `. @@ -2361,12 +2442,15 @@ features: .. audit-event:: os.mkdir path,mode,dir_fd os.mkdir - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.13 + Windows now handles a *mode* of ``0o700``. + .. function:: makedirs(name, mode=0o777, exist_ok=False) @@ -2395,8 +2479,8 @@ features: .. audit-event:: os.mkdir path,mode,dir_fd os.makedirs - .. versionadded:: 3.2 - The *exist_ok* parameter. + .. versionchanged:: 3.2 + Added the *exist_ok* parameter. .. versionchanged:: 3.4.1 @@ -2427,10 +2511,10 @@ features: FIFO for reading, and the client opens it for writing. Note that :func:`mkfifo` doesn't open the FIFO --- it just creates the rendezvous point. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2449,10 +2533,10 @@ features: This function can also support :ref:`paths relative to directory descriptors `. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2532,8 +2616,8 @@ features: .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object` on Unix. @@ -2541,7 +2625,6 @@ features: .. versionchanged:: 3.8 Accepts a :term:`path-like object` and a bytes object on Windows. - .. versionchanged:: 3.8 Added support for directory junctions, and changed to return the substitution path (which typically includes ``\\?\`` prefix) rather than the optional "print name" field that was previously returned. @@ -2563,8 +2646,8 @@ features: .. audit-event:: os.remove path,dir_fd os.remove - .. versionadded:: 3.3 - The *dir_fd* argument. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2614,8 +2697,8 @@ features: .. audit-event:: os.rename src,dst,src_dir_fd,dst_dir_fd os.rename - .. versionadded:: 3.3 - The *src_dir_fd* and *dst_dir_fd* arguments. + .. versionchanged:: 3.3 + Added the *src_dir_fd* and *dst_dir_fd* parameters. .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *src* and *dst*. @@ -2670,8 +2753,8 @@ features: .. audit-event:: os.rmdir path,dir_fd os.rmdir - .. versionadded:: 3.3 - The *dir_fd* parameter. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2745,9 +2828,9 @@ features: .. versionadded:: 3.5 - .. versionadded:: 3.6 + .. versionchanged:: 3.6 Added support for the :term:`context manager` protocol and the - :func:`~scandir.close()` method. If a :func:`scandir` iterator is neither + :func:`~scandir.close` method. If a :func:`scandir` iterator is neither exhausted nor explicitly closed a :exc:`ResourceWarning` will be emitted in its destructor. @@ -2959,9 +3042,9 @@ features: :func:`fstat` and :func:`lstat` functions. - .. versionadded:: 3.3 - Added the *dir_fd* and *follow_symlinks* arguments, specifying a file - descriptor instead of a path. + .. versionchanged:: 3.3 + Added the *dir_fd* and *follow_symlinks* parameters, + specifying a file descriptor instead of a path. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -3042,16 +3125,22 @@ features: Time of most recent access expressed in nanoseconds as an integer. + .. versionadded:: 3.3 + .. attribute:: st_mtime_ns Time of most recent content modification expressed in nanoseconds as an integer. + .. versionadded:: 3.3 + .. attribute:: st_ctime_ns Time of most recent metadata change expressed in nanoseconds as an integer. + .. versionadded:: 3.3 + .. versionchanged:: 3.12 ``st_ctime_ns`` is deprecated on Windows. Use ``st_birthtime_ns`` for the file creation time. In the future, ``st_ctime`` will contain @@ -3152,6 +3241,8 @@ features: See the :const:`!FILE_ATTRIBUTE_* ` constants in the :mod:`stat` module. + .. versionadded:: 3.5 + .. attribute:: st_reparse_tag When :attr:`st_file_attributes` has the :const:`~stat.FILE_ATTRIBUTE_REPARSE_POINT` @@ -3172,21 +3263,14 @@ features: some implementations. For compatibility with older Python versions, accessing :class:`stat_result` as a tuple always returns integers. - .. versionadded:: 3.3 - Added the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and - :attr:`st_ctime_ns` members. - - .. versionadded:: 3.5 - Added the :attr:`st_file_attributes` member on Windows. - .. versionchanged:: 3.5 Windows now returns the file index as :attr:`st_ino` when available. - .. versionadded:: 3.7 + .. versionchanged:: 3.7 Added the :attr:`st_fstype` member to Solaris/derivatives. - .. versionadded:: 3.8 + .. versionchanged:: 3.8 Added the :attr:`st_reparse_tag` member on Windows. .. versionchanged:: 3.8 @@ -3200,16 +3284,13 @@ features: platforms, but for now still contains creation time. Use :attr:`st_birthtime` for the creation time. - .. versionchanged:: 3.12 On Windows, :attr:`st_ino` may now be up to 128 bits, depending on the file system. Previously it would not be above 64 bits, and larger file identifiers would be arbitrarily packed. - .. versionchanged:: 3.12 On Windows, :attr:`st_rdev` no longer returns a value. Previously it would contain the same as :attr:`st_dev`, which was incorrect. - .. versionadded:: 3.12 Added the :attr:`st_birthtime` member on Windows. @@ -3243,7 +3324,7 @@ features: .. versionchanged:: 3.2 The :const:`ST_RDONLY` and :const:`ST_NOSUID` constants were added. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor. .. versionchanged:: 3.4 @@ -3255,8 +3336,8 @@ features: .. versionchanged:: 3.6 Accepts a :term:`path-like object`. - .. versionadded:: 3.7 - Added :attr:`f_fsid`. + .. versionchanged:: 3.7 + Added the :attr:`f_fsid` attribute. .. data:: supports_dir_fd @@ -3374,14 +3455,14 @@ features: .. availability:: Unix, Windows. - The function is limited on Emscripten and WASI, see - :ref:`wasm-availability` for more information. + The function is limited on WASI, see :ref:`wasm-availability` for more + information. .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. - .. versionadded:: 3.3 - Added the *dir_fd* argument, and now allow *target_is_directory* + .. versionchanged:: 3.3 + Added the *dir_fd* parameter, and now allow *target_is_directory* on non-Windows platforms. .. versionchanged:: 3.6 @@ -3429,8 +3510,8 @@ features: .. audit-event:: os.remove path,dir_fd os.unlink - .. versionadded:: 3.3 - The *dir_fd* parameter. + .. versionchanged:: 3.3 + Added the *dir_fd* parameter. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -3468,7 +3549,7 @@ features: .. audit-event:: os.utime path,times,ns,dir_fd os.utime - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor, and the *dir_fd*, *follow_symlinks*, and *ns* parameters. @@ -3564,6 +3645,7 @@ features: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) + os.rmdir(top) .. audit-event:: os.walk top,topdown,onerror,followlinks os.walk @@ -3694,7 +3776,7 @@ features: new file descriptor is :ref:`non-inheritable `. *initval* is the initial value of the event counter. The initial value - must be an 32 bit unsigned integer. Please note that the initial value is + must be a 32 bit unsigned integer. Please note that the initial value is limited to a 32 bit unsigned int although the event counter is an unsigned 64 bit integer with a maximum value of 2\ :sup:`64`\ -\ 2. @@ -3773,7 +3855,7 @@ features: .. data:: EFD_SEMAPHORE - Provide semaphore-like semantics for reads from a :func:`eventfd` file + Provide semaphore-like semantics for reads from an :func:`eventfd` file descriptor. On read the internal counter is decremented by one. .. availability:: Linux >= 2.6.30 @@ -3781,6 +3863,219 @@ features: .. versionadded:: 3.10 +.. _os-timerfd: + +Timer File Descriptors +~~~~~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 3.13 + +These functions provide support for Linux's *timer file descriptor* API. +Naturally, they are all only available on Linux. + +.. function:: timerfd_create(clockid, /, *, flags=0) + + Create and return a timer file descriptor (*timerfd*). + + The file descriptor returned by :func:`timerfd_create` supports: + + - :func:`read` + - :func:`~select.select` + - :func:`~select.poll` + + The file descriptor's :func:`read` method can be called with a buffer size + of 8. If the timer has already expired one or more times, :func:`read` + returns the number of expirations with the host's endianness, which may be + converted to an :class:`int` by ``int.from_bytes(x, byteorder=sys.byteorder)``. + + :func:`~select.select` and :func:`~select.poll` can be used to wait until + timer expires and the file descriptor is readable. + + *clockid* must be a valid :ref:`clock ID `, + as defined in the :py:mod:`time` module: + + - :const:`time.CLOCK_REALTIME` + - :const:`time.CLOCK_MONOTONIC` + - :const:`time.CLOCK_BOOTTIME` (Since Linux 3.15 for timerfd_create) + + If *clockid* is :const:`time.CLOCK_REALTIME`, a settable system-wide + real-time clock is used. If system clock is changed, timer setting need + to be updated. To cancel timer when system clock is changed, see + :const:`TFD_TIMER_CANCEL_ON_SET`. + + If *clockid* is :const:`time.CLOCK_MONOTONIC`, a non-settable monotonically + increasing clock is used. Even if the system clock is changed, the timer + setting will not be affected. + + If *clockid* is :const:`time.CLOCK_BOOTTIME`, same as :const:`time.CLOCK_MONOTONIC` + except it includes any time that the system is suspended. + + The file descriptor's behaviour can be modified by specifying a *flags* value. + Any of the following variables may used, combined using bitwise OR + (the ``|`` operator): + + - :const:`TFD_NONBLOCK` + - :const:`TFD_CLOEXEC` + + If :const:`TFD_NONBLOCK` is not set as a flag, :func:`read` blocks until + the timer expires. If it is set as a flag, :func:`read` doesn't block, but + If there hasn't been an expiration since the last call to read, + :func:`read` raises :class:`OSError` with ``errno`` is set to + :const:`errno.EAGAIN`. + + :const:`TFD_CLOEXEC` is always set by Python automatically. + + The file descriptor must be closed with :func:`os.close` when it is no + longer needed, or else the file descriptor will be leaked. + + .. seealso:: The :manpage:`timerfd_create(2)` man page. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + + +.. function:: timerfd_settime(fd, /, *, flags=flags, initial=0.0, interval=0.0) + + Alter a timer file descriptor's internal timer. + This function operates the same interval timer as :func:`timerfd_settime_ns`. + + *fd* must be a valid timer file descriptor. + + The timer's behaviour can be modified by specifying a *flags* value. + Any of the following variables may used, combined using bitwise OR + (the ``|`` operator): + + - :const:`TFD_TIMER_ABSTIME` + - :const:`TFD_TIMER_CANCEL_ON_SET` + + The timer is disabled by setting *initial* to zero (``0``). + If *initial* is equal to or greater than zero, the timer is enabled. + If *initial* is less than zero, it raises an :class:`OSError` exception + with ``errno`` set to :const:`errno.EINVAL` + + By default the timer will fire when *initial* seconds have elapsed. + (If *initial* is zero, timer will fire immediately.) + + However, if the :const:`TFD_TIMER_ABSTIME` flag is set, + the timer will fire when the timer's clock + (set by *clockid* in :func:`timerfd_create`) reaches *initial* seconds. + + The timer's interval is set by the *interval* :py:class:`float`. + If *interval* is zero, the timer only fires once, on the initial expiration. + If *interval* is greater than zero, the timer fires every time *interval* + seconds have elapsed since the previous expiration. + If *interval* is less than zero, it raises :class:`OSError` with ``errno`` + set to :const:`errno.EINVAL` + + If the :const:`TFD_TIMER_CANCEL_ON_SET` flag is set along with + :const:`TFD_TIMER_ABSTIME` and the clock for this timer is + :const:`time.CLOCK_REALTIME`, the timer is marked as cancelable if the + real-time clock is changed discontinuously. Reading the descriptor is + aborted with the error ECANCELED. + + Linux manages system clock as UTC. A daylight-savings time transition is + done by changing time offset only and doesn't cause discontinuous system + clock change. + + Discontinuous system clock change will be caused by the following events: + + - ``settimeofday`` + - ``clock_settime`` + - set the system date and time by ``date`` command + + Return a two-item tuple of (``next_expiration``, ``interval``) from + the previous timer state, before this function executed. + + .. seealso:: + + :manpage:`timerfd_create(2)`, :manpage:`timerfd_settime(2)`, + :manpage:`settimeofday(2)`, :manpage:`clock_settime(2)`, + and :manpage:`date(1)`. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + + +.. function:: timerfd_settime_ns(fd, /, *, flags=0, initial=0, interval=0) + + Similar to :func:`timerfd_settime`, but use time as nanoseconds. + This function operates the same interval timer as :func:`timerfd_settime`. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + + +.. function:: timerfd_gettime(fd, /) + + Return a two-item tuple of floats (``next_expiration``, ``interval``). + + ``next_expiration`` denotes the relative time until next the timer next fires, + regardless of if the :const:`TFD_TIMER_ABSTIME` flag is set. + + ``interval`` denotes the timer's interval. + If zero, the timer will only fire once, after ``next_expiration`` seconds + have elapsed. + + .. seealso:: :manpage:`timerfd_gettime(2)` + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + + +.. function:: timerfd_gettime_ns(fd, /) + + Similar to :func:`timerfd_gettime`, but return time as nanoseconds. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + +.. data:: TFD_NONBLOCK + + A flag for the :func:`timerfd_create` function, + which sets the :const:`O_NONBLOCK` status flag for the new timer file + descriptor. If :const:`TFD_NONBLOCK` is not set as a flag, :func:`read` blocks. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + +.. data:: TFD_CLOEXEC + + A flag for the :func:`timerfd_create` function, + If :const:`TFD_CLOEXEC` is set as a flag, set close-on-exec flag for new file + descriptor. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + +.. data:: TFD_TIMER_ABSTIME + + A flag for the :func:`timerfd_settime` and :func:`timerfd_settime_ns` functions. + If this flag is set, *initial* is interpreted as an absolute value on the + timer's clock (in UTC seconds or nanoseconds since the Unix Epoch). + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + +.. data:: TFD_TIMER_CANCEL_ON_SET + + A flag for the :func:`timerfd_settime` and :func:`timerfd_settime_ns` + functions along with :const:`TFD_TIMER_ABSTIME`. + The timer is cancelled when the time of the underlying clock changes + discontinuously. + + .. availability:: Linux >= 2.6.27 with glibc >= 2.8 + + .. versionadded:: 3.13 + + Linux extended attributes ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3959,7 +4254,7 @@ to be ignored. The "l" and "v" variants of the :func:`exec\* ` functions differ in how command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the - individual parameters simply become additional parameters to the :func:`execl\*` + individual parameters simply become additional parameters to the :func:`!execl\*` functions. The "v" variants are good when the number of parameters is variable, with the arguments being passed in a list or tuple as the *args* parameter. In either case, the arguments to the child process should start with @@ -3990,9 +4285,9 @@ to be ignored. .. audit-event:: os.exec path,args,env os.execl - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not Android, not iOS. - .. versionadded:: 3.3 + .. versionchanged:: 3.3 Added support for specifying *path* as an open file descriptor for :func:`execve`. @@ -4033,49 +4328,49 @@ written in Python, such as a mail server's external command delivery program. Exit code that means the command was used incorrectly, such as when the wrong number of arguments are given. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_DATAERR Exit code that means the input data was incorrect. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_NOINPUT Exit code that means an input file did not exist or was not readable. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_NOUSER Exit code that means a specified user did not exist. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_NOHOST Exit code that means a specified host did not exist. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_UNAVAILABLE Exit code that means that a required service is unavailable. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_SOFTWARE Exit code that means an internal software error was detected. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_OSERR @@ -4083,7 +4378,7 @@ written in Python, such as a mail server's external command delivery program. Exit code that means an operating system error was detected, such as the inability to fork or create a pipe. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_OSFILE @@ -4091,21 +4386,21 @@ written in Python, such as a mail server's external command delivery program. Exit code that means some system file did not exist, could not be opened, or had some other kind of error. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_CANTCREAT Exit code that means a user specified output file could not be created. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_IOERR Exit code that means that an error occurred while doing I/O on some file. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_TEMPFAIL @@ -4114,7 +4409,7 @@ written in Python, such as a mail server's external command delivery program. that may not really be an error, such as a network connection that couldn't be made during a retryable operation. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_PROTOCOL @@ -4122,7 +4417,7 @@ written in Python, such as a mail server's external command delivery program. Exit code that means that a protocol exchange was illegal, invalid, or not understood. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_NOPERM @@ -4130,21 +4425,21 @@ written in Python, such as a mail server's external command delivery program. Exit code that means that there were insufficient permissions to perform the operation (but not intended for file system problems). - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_CONFIG Exit code that means that some kind of configuration error occurred. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. data:: EX_NOTFOUND Exit code that means something like "an entry was not found". - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: fork() @@ -4162,6 +4457,11 @@ written in Python, such as a mail server's external command delivery program. If you use TLS sockets in an application calling ``fork()``, see the warning in the :mod:`ssl` documentation. + .. warning:: + + On macOS the use of this function is unsafe when mixed with using + higher-level system APIs, and that includes using :mod:`urllib.request`. + .. versionchanged:: 3.8 Calling ``fork()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). @@ -4188,7 +4488,7 @@ written in Python, such as a mail server's external command delivery program. for technical details of why we're surfacing this longstanding platform compatibility problem to developers. - .. availability:: POSIX, not Emscripten, not WASI. + .. availability:: POSIX, not WASI, not Android, not iOS. .. function:: forkpty() @@ -4201,16 +4501,21 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.forkpty "" os.forkpty - .. versionchanged:: 3.12 - If Python is able to detect that your process has multiple - threads, this now raises a :exc:`DeprecationWarning`. See the - longer explanation on :func:`os.fork`. + .. warning:: + + On macOS the use of this function is unsafe when mixed with using + higher-level system APIs, and that includes using :mod:`urllib.request`. .. versionchanged:: 3.8 Calling ``forkpty()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). - .. availability:: Unix, not Emscripten, not WASI. + .. versionchanged:: 3.12 + If Python is able to detect that your process has multiple + threads, this now raises a :exc:`DeprecationWarning`. See the + longer explanation on :func:`os.fork`. + + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: kill(pid, sig, /) @@ -4227,17 +4532,16 @@ written in Python, such as a mail server's external command delivery program. only be sent to console processes which share a common console window, e.g., some subprocesses. Any other value for *sig* will cause the process to be unconditionally killed by the TerminateProcess API, and the exit code - will be set to *sig*. The Windows version of :func:`kill` additionally takes - process handles to be killed. + will be set to *sig*. See also :func:`signal.pthread_kill`. .. audit-event:: os.kill pid,sig os.kill - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not iOS. - .. versionadded:: 3.2 - Windows support. + .. versionchanged:: 3.2 + Added Windows support. .. function:: killpg(pgid, sig, /) @@ -4250,14 +4554,14 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.killpg pgid,sig os.killpg - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not iOS. .. function:: nice(increment, /) Add *increment* to the process's "niceness". Return the new niceness. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. .. function:: pidfd_open(pid, flags=0) @@ -4268,7 +4572,7 @@ written in Python, such as a mail server's external command delivery program. See the :manpage:`pidfd_open(2)` man page for more details. - .. availability:: Linux >= 5.3 + .. availability:: Linux >= 5.3, Android >= :func:`build-time ` API level 31 .. versionadded:: 3.9 .. data:: PIDFD_NONBLOCK @@ -4287,7 +4591,7 @@ written in Python, such as a mail server's external command delivery program. Lock program segments into memory. The value of *op* (defined in ````) determines which segments are locked. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not iOS. .. function:: popen(cmd, mode='r', buffering=-1) @@ -4319,7 +4623,7 @@ written in Python, such as a mail server's external command delivery program. documentation for more powerful ways to manage and communicate with subprocesses. - .. availability:: not Emscripten, not WASI. + .. availability:: not WASI, not Android, not iOS. .. note:: The :ref:`Python UTF-8 Mode ` affects encodings used @@ -4339,7 +4643,8 @@ written in Python, such as a mail server's external command delivery program. Most users should use :func:`subprocess.run` instead of :func:`posix_spawn`. The positional-only arguments *path*, *args*, and *env* are similar to - :func:`execve`. + :func:`execve`. *env* is allowed to be ``None``, in which case current + process' environment is used. The *path* parameter is the path to the executable file. The *path* should contain a directory. Use :func:`posix_spawnp` to pass an executable file @@ -4369,10 +4674,17 @@ written in Python, such as a mail server's external command delivery program. Performs ``os.dup2(fd, new_fd)``. + .. data:: POSIX_SPAWN_CLOSEFROM + + (``os.POSIX_SPAWN_CLOSEFROM``, *fd*) + + Performs ``os.closerange(fd, INF)``. + These tuples correspond to the C library :c:func:`!posix_spawn_file_actions_addopen`, - :c:func:`!posix_spawn_file_actions_addclose`, and - :c:func:`!posix_spawn_file_actions_adddup2` API calls used to prepare + :c:func:`!posix_spawn_file_actions_addclose`, + :c:func:`!posix_spawn_file_actions_adddup2`, and + :c:func:`!posix_spawn_file_actions_addclosefrom_np` API calls used to prepare for the :c:func:`!posix_spawn` call itself. The *setpgroup* argument will set the process group of the child to the value @@ -4414,7 +4726,12 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.8 - .. availability:: Unix, not Emscripten, not WASI. + .. versionchanged:: 3.13 + *env* parameter accepts ``None``. + ``os.POSIX_SPAWN_CLOSEFROM`` is available on platforms where + :c:func:`!posix_spawn_file_actions_addclosefrom_np` exists. + + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: posix_spawnp(path, argv, env, *, file_actions=None, \ setpgroup=None, resetids=False, setsid=False, setsigmask=(), \ @@ -4430,7 +4747,7 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.8 - .. availability:: POSIX, not Emscripten, not WASI. + .. availability:: POSIX, not WASI, not Android, not iOS. See :func:`posix_spawn` documentation. @@ -4463,7 +4780,7 @@ written in Python, such as a mail server's external command delivery program. There is no way to unregister a function. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. versionadded:: 3.7 @@ -4497,7 +4814,7 @@ written in Python, such as a mail server's external command delivery program. command-line arguments are passed. The "l" variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the - :func:`spawnl\*` functions. The "v" variants are good when the number of + :func:`!spawnl\*` functions. The "v" variants are good when the number of parameters is variable, with the arguments being passed in a list or tuple as the *args* parameter. In either case, the arguments to the child process must start with the name of the command being run. @@ -4532,7 +4849,7 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.spawn mode,path,args,env os.spawnl - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not Android, not iOS. :func:`spawnlp`, :func:`spawnlpe`, :func:`spawnvp` and :func:`spawnvpe` are not available on Windows. :func:`spawnle` and @@ -4547,7 +4864,7 @@ written in Python, such as a mail server's external command delivery program. P_NOWAITO Possible values for the *mode* parameter to the :func:`spawn\* ` family of - functions. If either of these values is given, the :func:`spawn\*` functions + functions. If either of these values is given, the :func:`spawn\* ` functions will return as soon as the new process has been created, with the process id as the return value. @@ -4557,7 +4874,7 @@ written in Python, such as a mail server's external command delivery program. .. data:: P_WAIT Possible value for the *mode* parameter to the :func:`spawn\* ` family of - functions. If this is given as *mode*, the :func:`spawn\*` functions will not + functions. If this is given as *mode*, the :func:`spawn\* ` functions will not return until the new process has run to completion and will return the exit code of the process the run is successful, or ``-signal`` if a signal kills the process. @@ -4656,7 +4973,7 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.system command os.system - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not Android, not iOS. .. function:: times() @@ -4700,7 +5017,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitstatus_to_exitcode` can be used to convert the exit status into an exit code. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. seealso:: @@ -4734,10 +5051,13 @@ written in Python, such as a mail server's external command delivery program. Otherwise, if there are no matching children that could be waited for, :exc:`ChildProcessError` is raised. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. versionadded:: 3.3 + .. versionchanged:: 3.13 + This function is now available on macOS as well. + .. function:: waitpid(pid, options, /) @@ -4772,7 +5092,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitstatus_to_exitcode` can be used to convert the exit status into an exit code. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not Android, not iOS. .. versionchanged:: 3.5 If the system call is interrupted and the signal handler does not raise an @@ -4792,7 +5112,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitstatus_to_exitcode` can be used to convert the exit status into an exitcode. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: wait4(pid, options) @@ -4806,7 +5126,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitstatus_to_exitcode` can be used to convert the exit status into an exitcode. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. data:: P_PID @@ -4823,7 +5143,7 @@ written in Python, such as a mail server's external command delivery program. * :data:`!P_PIDFD` - wait for the child identified by the file descriptor *id* (a process file descriptor created with :func:`pidfd_open`). - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. note:: :data:`!P_PIDFD` is only available on Linux >= 5.4. @@ -4838,7 +5158,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitid` causes child processes to be reported if they have been continued from a job control stop since they were last reported. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. data:: WEXITED @@ -4849,7 +5169,7 @@ written in Python, such as a mail server's external command delivery program. The other ``wait*`` functions always report children that have terminated, so this option is not available for them. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. versionadded:: 3.3 @@ -4861,7 +5181,7 @@ written in Python, such as a mail server's external command delivery program. This option is not available for the other ``wait*`` functions. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. versionadded:: 3.3 @@ -4874,7 +5194,7 @@ written in Python, such as a mail server's external command delivery program. This option is not available for :func:`waitid`. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. data:: WNOHANG @@ -4883,7 +5203,7 @@ written in Python, such as a mail server's external command delivery program. :func:`waitid` to return right away if no child process status is available immediately. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. data:: WNOWAIT @@ -4893,7 +5213,7 @@ written in Python, such as a mail server's external command delivery program. This option is not available for the other ``wait*`` functions. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. data:: CLD_EXITED @@ -4906,7 +5226,7 @@ written in Python, such as a mail server's external command delivery program. These are the possible values for :attr:`!si_code` in the result returned by :func:`waitid`. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. versionadded:: 3.3 @@ -4941,7 +5261,7 @@ written in Python, such as a mail server's external command delivery program. :func:`WIFEXITED`, :func:`WEXITSTATUS`, :func:`WIFSIGNALED`, :func:`WTERMSIG`, :func:`WIFSTOPPED`, :func:`WSTOPSIG` functions. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI, not Android, not iOS. .. versionadded:: 3.9 @@ -4957,7 +5277,7 @@ used to determine the disposition of a process. This function should be employed only if :func:`WIFSIGNALED` is true. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WIFCONTINUED(status) @@ -4968,7 +5288,7 @@ used to determine the disposition of a process. See :data:`WCONTINUED` option. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WIFSTOPPED(status) @@ -4980,14 +5300,14 @@ used to determine the disposition of a process. done using :data:`WUNTRACED` option or when the process is being traced (see :manpage:`ptrace(2)`). - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WIFSIGNALED(status) Return ``True`` if the process was terminated by a signal, otherwise return ``False``. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WIFEXITED(status) @@ -4996,7 +5316,7 @@ used to determine the disposition of a process. by calling ``exit()`` or ``_exit()``, or by returning from ``main()``; otherwise return ``False``. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WEXITSTATUS(status) @@ -5005,7 +5325,7 @@ used to determine the disposition of a process. This function should be employed only if :func:`WIFEXITED` is true. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WSTOPSIG(status) @@ -5014,7 +5334,7 @@ used to determine the disposition of a process. This function should be employed only if :func:`WIFSTOPPED` is true. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. .. function:: WTERMSIG(status) @@ -5023,7 +5343,7 @@ used to determine the disposition of a process. This function should be employed only if :func:`WIFSIGNALED` is true. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI, not Android, not iOS. Interface to the scheduler @@ -5141,8 +5461,12 @@ operating system. .. function:: sched_getaffinity(pid, /) - Return the set of CPUs the process with PID *pid* (or the current process - if zero) is restricted to. + Return the set of CPUs the process with PID *pid* is restricted to. + + If *pid* is zero, return the set of CPUs the calling thread of the current + process is restricted to. + + See also the :func:`process_cpu_count` function. .. _os-path: @@ -5183,15 +5507,18 @@ Miscellaneous System Information .. function:: cpu_count() - Return the number of CPUs in the system. Returns ``None`` if undetermined. - - This number is not equivalent to the number of CPUs the current process can - use. The number of usable CPUs can be obtained with - ``len(os.sched_getaffinity(0))`` + Return the number of logical CPUs in the **system**. Returns ``None`` if + undetermined. + The :func:`process_cpu_count` function can be used to get the number of + logical CPUs usable by the calling thread of the **current process**. .. versionadded:: 3.4 + .. versionchanged:: 3.13 + If :option:`-X cpu_count <-X>` is given or :envvar:`PYTHON_CPU_COUNT` is set, + :func:`cpu_count` returns the overridden value *n*. + .. function:: getloadavg() @@ -5202,6 +5529,23 @@ Miscellaneous System Information .. availability:: Unix. +.. function:: process_cpu_count() + + Get the number of logical CPUs usable by the calling thread of the **current + process**. Returns ``None`` if undetermined. It can be less than + :func:`cpu_count` depending on the CPU affinity. + + The :func:`cpu_count` function can be used to get the number of logical CPUs + in the **system**. + + If :option:`-X cpu_count <-X>` is given or :envvar:`PYTHON_CPU_COUNT` is set, + :func:`process_cpu_count` returns the overridden value *n*. + + See also the :func:`sched_getaffinity` function. + + .. versionadded:: 3.13 + + .. function:: sysconf(name, /) Return integer-valued system configuration values. If the configuration value @@ -5371,20 +5715,20 @@ Random numbers easy-to-use interface to the random number generator provided by your platform, please see :class:`random.SystemRandom`. - .. versionchanged:: 3.6.0 - On Linux, ``getrandom()`` is now used in blocking mode to increase the - security. - - .. versionchanged:: 3.5.2 - On Linux, if the ``getrandom()`` syscall blocks (the urandom entropy pool - is not initialized yet), fall back on reading ``/dev/urandom``. - .. versionchanged:: 3.5 On Linux 3.17 and newer, the ``getrandom()`` syscall is now used when available. On OpenBSD 5.6 and newer, the C ``getentropy()`` function is now used. These functions avoid the usage of an internal file descriptor. + .. versionchanged:: 3.5.2 + On Linux, if the ``getrandom()`` syscall blocks (the urandom entropy pool + is not initialized yet), fall back on reading ``/dev/urandom``. + + .. versionchanged:: 3.6 + On Linux, ``getrandom()`` is now used in blocking mode to increase the + security. + .. versionchanged:: 3.11 On Windows, ``BCryptGenRandom()`` is used instead of ``CryptGenRandom()`` which is deprecated. diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index e14c1bf8..320adbef 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -1,453 +1,15 @@ -:mod:`ossaudiodev` --- Access to OSS-compatible audio devices -============================================================= +:mod:`!ossaudiodev` --- Access to OSS-compatible audio devices +============================================================== .. module:: ossaudiodev - :platform: Linux, FreeBSD - :synopsis: Access to OSS-compatible audio devices. + :synopsis: Removed in 3.13. :deprecated: .. deprecated-removed:: 3.11 3.13 - The :mod:`ossaudiodev` module is deprecated - (see :pep:`PEP 594 <594#ossaudiodev>` for details). --------------- +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. -This module allows you to access the OSS (Open Sound System) audio interface. -OSS is available for a wide range of open-source and commercial Unices, and is -the standard audio interface for Linux and recent versions of FreeBSD. - -.. Things will get more complicated for future Linux versions, since - ALSA is in the standard kernel as of 2.5.x. Presumably if you - use ALSA, you'll have to make sure its OSS compatibility layer - is active to use ossaudiodev, but you're going to need it for the vast - majority of Linux audio apps anyway. - - Sounds like things are also complicated for other BSDs. In response - to my python-dev query, Thomas Wouters said: - - > Likewise, googling shows OpenBSD also uses OSS/Free -- the commercial - > OSS installation manual tells you to remove references to OSS/Free from the - > kernel :) - - but Aleksander Piotrowsk actually has an OpenBSD box, and he quotes - from its : - > * WARNING! WARNING! - > * This is an OSS (Linux) audio emulator. - > * Use the Native NetBSD API for developing new code, and this - > * only for compiling Linux programs. - - There's also an ossaudio manpage on OpenBSD that explains things - further. Presumably NetBSD and OpenBSD have a different standard - audio interface. That's the great thing about standards, there are so - many to choose from ... ;-) - - This probably all warrants a footnote or two, but I don't understand - things well enough right now to write it! --GPW - -.. versionchanged:: 3.3 - Operations in this module now raise :exc:`OSError` where :exc:`IOError` - was raised. - - -.. seealso:: - - `Open Sound System Programmer's Guide `_ - the official documentation for the OSS C API - - The module defines a large number of constants supplied by the OSS device - driver; see ```` on either Linux or FreeBSD for a listing. - -:mod:`ossaudiodev` defines the following variables and functions: - - -.. exception:: OSSAudioError - - This exception is raised on certain errors. The argument is a string describing - what went wrong. - - (If :mod:`ossaudiodev` receives an error from a system call such as - :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`OSError`. - Errors detected directly by :mod:`ossaudiodev` result in :exc:`OSSAudioError`.) - - (For backwards compatibility, the exception class is also available as - ``ossaudiodev.error``.) - - -.. function:: open(mode) - open(device, mode) - - Open an audio device and return an OSS audio device object. This object - supports many file-like methods, such as :meth:`read`, :meth:`write`, and - :meth:`fileno` (although there are subtle differences between conventional Unix - read/write semantics and those of OSS audio devices). It also supports a number - of audio-specific methods; see below for the complete list of methods. - - *device* is the audio device filename to use. If it is not specified, this - module first looks in the environment variable :envvar:`AUDIODEV` for a device - to use. If not found, it falls back to :file:`/dev/dsp`. - - *mode* is one of ``'r'`` for read-only (record) access, ``'w'`` for - write-only (playback) access and ``'rw'`` for both. Since many sound cards - only allow one process to have the recorder or player open at a time, it is a - good idea to open the device only for the activity needed. Further, some - sound cards are half-duplex: they can be opened for reading or writing, but - not both at once. - - Note the unusual calling syntax: the *first* argument is optional, and the - second is required. This is a historical artifact for compatibility with the - older :mod:`linuxaudiodev` module which :mod:`ossaudiodev` supersedes. - - .. XXX it might also be motivated - by my unfounded-but-still-possibly-true belief that the default - audio device varies unpredictably across operating systems. -GW - - -.. function:: openmixer([device]) - - Open a mixer device and return an OSS mixer device object. *device* is the - mixer device filename to use. If it is not specified, this module first looks - in the environment variable :envvar:`MIXERDEV` for a device to use. If not - found, it falls back to :file:`/dev/mixer`. - - -.. _ossaudio-device-objects: - -Audio Device Objects --------------------- - -Before you can write to or read from an audio device, you must call three -methods in the correct order: - -#. :meth:`setfmt` to set the output format - -#. :meth:`channels` to set the number of channels - -#. :meth:`speed` to set the sample rate - -Alternately, you can use the :meth:`setparameters` method to set all three audio -parameters at once. This is more convenient, but may not be as flexible in all -cases. - -The audio device objects returned by :func:`.open` define the following methods -and (read-only) attributes: - - -.. method:: oss_audio_device.close() - - Explicitly close the audio device. When you are done writing to or reading from - an audio device, you should explicitly close it. A closed device cannot be used - again. - - -.. method:: oss_audio_device.fileno() - - Return the file descriptor associated with the device. - - -.. method:: oss_audio_device.read(size) - - Read *size* bytes from the audio input and return them as a Python string. - Unlike most Unix device drivers, OSS audio devices in blocking mode (the - default) will block :func:`read` until the entire requested amount of data is - available. - - -.. method:: oss_audio_device.write(data) - - Write a :term:`bytes-like object` *data* to the audio device and return the - number of bytes written. If the audio device is in blocking mode (the - default), the entire data is always written (again, this is different from - usual Unix device semantics). If the device is in non-blocking mode, some - data may not be written---see :meth:`writeall`. - - .. versionchanged:: 3.5 - Writable :term:`bytes-like object` is now accepted. - - -.. method:: oss_audio_device.writeall(data) - - Write a :term:`bytes-like object` *data* to the audio device: waits until - the audio device is able to accept data, writes as much data as it will - accept, and repeats until *data* has been completely written. If the device - is in blocking mode (the default), this has the same effect as - :meth:`write`; :meth:`writeall` is only useful in non-blocking mode. Has - no return value, since the amount of data written is always equal to the - amount of data supplied. - - .. versionchanged:: 3.5 - Writable :term:`bytes-like object` is now accepted. - - -.. versionchanged:: 3.2 - Audio device objects also support the context management protocol, i.e. they can - be used in a :keyword:`with` statement. - - -The following methods each map to exactly one :c:func:`ioctl` system call. The -correspondence is obvious: for example, :meth:`setfmt` corresponds to the -``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can -be useful when consulting the OSS documentation). If the underlying -:c:func:`ioctl` fails, they all raise :exc:`OSError`. - - -.. method:: oss_audio_device.nonblock() - - Put the device into non-blocking mode. Once in non-blocking mode, there is no - way to return it to blocking mode. - - -.. method:: oss_audio_device.getfmts() - - Return a bitmask of the audio output formats supported by the soundcard. Some - of the formats supported by OSS are: - - +-------------------------+---------------------------------------------+ - | Format | Description | - +=========================+=============================================+ - | :const:`AFMT_MU_LAW` | a logarithmic encoding (used by Sun ``.au`` | - | | files and :file:`/dev/audio`) | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_A_LAW` | a logarithmic encoding | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_IMA_ADPCM` | a 4:1 compressed format defined by the | - | | Interactive Multimedia Association | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_U8` | Unsigned, 8-bit audio | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_S16_LE` | Signed, 16-bit audio, little-endian byte | - | | order (as used by Intel processors) | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_S16_BE` | Signed, 16-bit audio, big-endian byte order | - | | (as used by 68k, PowerPC, Sparc) | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_S8` | Signed, 8 bit audio | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_U16_LE` | Unsigned, 16-bit little-endian audio | - +-------------------------+---------------------------------------------+ - | :const:`AFMT_U16_BE` | Unsigned, 16-bit big-endian audio | - +-------------------------+---------------------------------------------+ - - Consult the OSS documentation for a full list of audio formats, and note that - most devices support only a subset of these formats. Some older devices only - support :const:`AFMT_U8`; the most common format used today is - :const:`AFMT_S16_LE`. - - -.. method:: oss_audio_device.setfmt(format) - - Try to set the current audio format to *format*---see :meth:`getfmts` for a - list. Returns the audio format that the device was set to, which may not be the - requested format. May also be used to return the current audio format---do this - by passing an "audio format" of :const:`AFMT_QUERY`. - - -.. method:: oss_audio_device.channels(nchannels) - - Set the number of output channels to *nchannels*. A value of 1 indicates - monophonic sound, 2 stereophonic. Some devices may have more than 2 channels, - and some high-end devices may not support mono. Returns the number of channels - the device was set to. - - -.. method:: oss_audio_device.speed(samplerate) - - Try to set the audio sampling rate to *samplerate* samples per second. Returns - the rate actually set. Most sound devices don't support arbitrary sampling - rates. Common rates are: - - +-------+-------------------------------------------+ - | Rate | Description | - +=======+===========================================+ - | 8000 | default rate for :file:`/dev/audio` | - +-------+-------------------------------------------+ - | 11025 | speech recording | - +-------+-------------------------------------------+ - | 22050 | | - +-------+-------------------------------------------+ - | 44100 | CD quality audio (at 16 bits/sample and 2 | - | | channels) | - +-------+-------------------------------------------+ - | 96000 | DVD quality audio (at 24 bits/sample) | - +-------+-------------------------------------------+ - - -.. method:: oss_audio_device.sync() - - Wait until the sound device has played every byte in its buffer. (This happens - implicitly when the device is closed.) The OSS documentation recommends closing - and re-opening the device rather than using :meth:`sync`. - - -.. method:: oss_audio_device.reset() - - Immediately stop playing or recording and return the device to a state where it - can accept commands. The OSS documentation recommends closing and re-opening - the device after calling :meth:`reset`. - - -.. method:: oss_audio_device.post() - - Tell the driver that there is likely to be a pause in the output, making it - possible for the device to handle the pause more intelligently. You might use - this after playing a spot sound effect, before waiting for user input, or before - doing disk I/O. - -The following convenience methods combine several ioctls, or one ioctl and some -simple calculations. - - -.. method:: oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False]) - - Set the key audio sampling parameters---sample format, number of channels, and - sampling rate---in one method call. *format*, *nchannels*, and *samplerate* - should be as specified in the :meth:`setfmt`, :meth:`channels`, and - :meth:`speed` methods. If *strict* is true, :meth:`setparameters` checks to - see if each parameter was actually set to the requested value, and raises - :exc:`OSSAudioError` if not. Returns a tuple (*format*, *nchannels*, - *samplerate*) indicating the parameter values that were actually set by the - device driver (i.e., the same as the return values of :meth:`setfmt`, - :meth:`channels`, and :meth:`speed`). - - For example, :: - - (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate) - - is equivalent to :: - - fmt = dsp.setfmt(fmt) - channels = dsp.channels(channels) - rate = dsp.rate(rate) - - -.. method:: oss_audio_device.bufsize() - - Returns the size of the hardware buffer, in samples. - - -.. method:: oss_audio_device.obufcount() - - Returns the number of samples that are in the hardware buffer yet to be played. - - -.. method:: oss_audio_device.obuffree() - - Returns the number of samples that could be queued into the hardware buffer to - be played without blocking. - -Audio device objects also support several read-only attributes: - - -.. attribute:: oss_audio_device.closed - - Boolean indicating whether the device has been closed. - - -.. attribute:: oss_audio_device.name - - String containing the name of the device file. - - -.. attribute:: oss_audio_device.mode - - The I/O mode for the file, either ``"r"``, ``"rw"``, or ``"w"``. - - -.. _mixer-device-objects: - -Mixer Device Objects --------------------- - -The mixer object provides two file-like methods: - - -.. method:: oss_mixer_device.close() - - This method closes the open mixer device file. Any further attempts to use the - mixer after this file is closed will raise an :exc:`OSError`. - - -.. method:: oss_mixer_device.fileno() - - Returns the file handle number of the open mixer device file. - -.. versionchanged:: 3.2 - Mixer objects also support the context management protocol. - - -The remaining methods are specific to audio mixing: - - -.. method:: oss_mixer_device.controls() - - This method returns a bitmask specifying the available mixer controls ("Control" - being a specific mixable "channel", such as :const:`SOUND_MIXER_PCM` or - :const:`SOUND_MIXER_SYNTH`). This bitmask indicates a subset of all available - mixer controls---the :const:`SOUND_MIXER_\*` constants defined at module level. - To determine if, for example, the current mixer object supports a PCM mixer, use - the following Python code:: - - mixer=ossaudiodev.openmixer() - if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): - # PCM is supported - ... code ... - - For most purposes, the :const:`SOUND_MIXER_VOLUME` (master volume) and - :const:`SOUND_MIXER_PCM` controls should suffice---but code that uses the mixer - should be flexible when it comes to choosing mixer controls. On the Gravis - Ultrasound, for example, :const:`SOUND_MIXER_VOLUME` does not exist. - - -.. method:: oss_mixer_device.stereocontrols() - - Returns a bitmask indicating stereo mixer controls. If a bit is set, the - corresponding control is stereo; if it is unset, the control is either - monophonic or not supported by the mixer (use in combination with - :meth:`controls` to determine which). - - See the code example for the :meth:`controls` function for an example of getting - data from a bitmask. - - -.. method:: oss_mixer_device.reccontrols() - - Returns a bitmask specifying the mixer controls that may be used to record. See - the code example for :meth:`controls` for an example of reading from a bitmask. - - -.. method:: oss_mixer_device.get(control) - - Returns the volume of a given mixer control. The returned volume is a 2-tuple - ``(left_volume,right_volume)``. Volumes are specified as numbers from 0 - (silent) to 100 (full volume). If the control is monophonic, a 2-tuple is still - returned, but both volumes are the same. - - Raises :exc:`OSSAudioError` if an invalid control is specified, or - :exc:`OSError` if an unsupported control is specified. - - -.. method:: oss_mixer_device.set(control, (left, right)) - - Sets the volume for a given mixer control to ``(left,right)``. ``left`` and - ``right`` must be ints and between 0 (silent) and 100 (full volume). On - success, the new volume is returned as a 2-tuple. Note that this may not be - exactly the same as the volume specified, because of the limited resolution of - some soundcard's mixers. - - Raises :exc:`OSSAudioError` if an invalid mixer control was specified, or if the - specified volumes were out-of-range. - - -.. method:: oss_mixer_device.get_recsrc() - - This method returns a bitmask indicating which control(s) are currently being - used as a recording source. - - -.. method:: oss_mixer_device.set_recsrc(bitmask) - - Call this function to specify a recording source. Returns a bitmask indicating - the new recording source (or sources) if successful; raises :exc:`OSError` if an - invalid source was specified. To set the current recording source to the - microphone input:: - - mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC) +The last version of Python that provided the :mod:`!ossaudiodev` module was +`Python 3.12 `_. diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 2fb4dc42..ee8a9086 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1,13 +1,12 @@ - -:mod:`pathlib` --- Object-oriented filesystem paths -=================================================== +:mod:`!pathlib` --- Object-oriented filesystem paths +==================================================== .. module:: pathlib :synopsis: Object-oriented filesystem paths .. versionadded:: 3.4 -**Source code:** :source:`Lib/pathlib.py` +**Source code:** :source:`Lib/pathlib/` .. index:: single: path; operations @@ -22,6 +21,12 @@ inherit from pure paths but also provide I/O operations. .. image:: pathlib-inheritance.png :align: center :class: invert-in-dark-mode + :alt: Inheritance diagram showing the classes available in pathlib. The + most basic class is PurePath, which has three direct subclasses: + PurePosixPath, PureWindowsPath, and Path. Further to these four + classes, there are two classes that use multiple inheritance: + PosixPath subclasses PurePosixPath and Path, and WindowsPath + subclasses PureWindowsPath and Path. If you've never used this module before or just aren't sure which class is right for your task, :class:`Path` is most likely what you need. It instantiates @@ -88,6 +93,17 @@ Opening a file:: '#!/bin/bash\n' +Exceptions +---------- + +.. exception:: UnsupportedOperation + + An exception inheriting :exc:`NotImplementedError` that is raised when an + unsupported operation is called on a path object. + + .. versionadded:: 3.13 + + .. _pure-paths: Pure paths @@ -162,8 +178,8 @@ we also call *flavours*: A subclass of :class:`PurePath`, this path flavour represents non-Windows filesystem paths:: - >>> PurePosixPath('/etc') - PurePosixPath('/etc') + >>> PurePosixPath('/etc/hosts') + PurePosixPath('/etc/hosts') *pathsegments* is specified similarly to :class:`PurePath`. @@ -172,8 +188,8 @@ we also call *flavours*: A subclass of :class:`PurePath`, this path flavour represents Windows filesystem paths, including `UNC paths`_:: - >>> PureWindowsPath('c:/Program Files/') - PureWindowsPath('c:/Program Files') + >>> PureWindowsPath('c:/', 'Users', 'Ximénez') + PureWindowsPath('c:/Users/Ximénez') >>> PureWindowsPath('//server/share/file') PureWindowsPath('//server/share/file') @@ -292,6 +308,13 @@ Methods and properties Pure paths provide the following methods and properties: +.. attribute:: PurePath.parser + + The implementation of the :mod:`os.path` module used for low-level path + parsing and joining: either :mod:`posixpath` or :mod:`ntpath`. + + .. versionadded:: 3.13 + .. attribute:: PurePath.drive A string representing the drive letter or name, if any:: @@ -421,7 +444,7 @@ Pure paths provide the following methods and properties: .. attribute:: PurePath.suffix - The file extension of the final component, if any:: + The last dot-separated portion of the final component, if any:: >>> PurePosixPath('my/library/setup.py').suffix '.py' @@ -430,10 +453,11 @@ Pure paths provide the following methods and properties: >>> PurePosixPath('my/library').suffix '' + This is commonly called the file extension. .. attribute:: PurePath.suffixes - A list of the path's file extensions:: + A list of the path's suffixes, often called file extensions:: >>> PurePosixPath('my/library.tar.gar').suffixes ['.tar', '.gar'] @@ -466,19 +490,6 @@ Pure paths provide the following methods and properties: 'c:/windows' -.. method:: PurePath.as_uri() - - Represent the path as a ``file`` URI. :exc:`ValueError` is raised if - the path isn't absolute. - - >>> p = PurePosixPath('/etc/passwd') - >>> p.as_uri() - 'file:///etc/passwd' - >>> p = PureWindowsPath('c:/Windows') - >>> p.as_uri() - 'file:///c:/Windows' - - .. method:: PurePath.is_absolute() Return whether the path is absolute or not. A path is considered absolute @@ -509,6 +520,13 @@ Pure paths provide the following methods and properties: >>> p.is_relative_to('/usr') False + This method is string-based; it neither accesses the filesystem nor treats + "``..``" segments specially. The following code is equivalent: + + >>> u = PurePath('/usr') + >>> u == p or u in p.parents + False + .. versionadded:: 3.9 .. deprecated-removed:: 3.12 3.14 @@ -522,14 +540,13 @@ Pure paths provide the following methods and properties: reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`, ``False`` is always returned. - >>> PureWindowsPath('nul').is_reserved() - True - >>> PurePosixPath('nul').is_reserved() - False - - File system calls on reserved paths can fail mysteriously or have - unintended effects. + .. versionchanged:: 3.13 + Windows path names that contain a colon, or end with a dot or a space, + are considered reserved. UNC paths may be reserved. + .. deprecated-removed:: 3.13 3.15 + This method is deprecated; use :func:`os.path.isreserved` to detect + reserved paths on Windows. .. method:: PurePath.joinpath(*pathsegments) @@ -546,45 +563,55 @@ Pure paths provide the following methods and properties: PureWindowsPath('c:/Program Files') -.. method:: PurePath.match(pattern, *, case_sensitive=None) +.. method:: PurePath.full_match(pattern, *, case_sensitive=None) Match this path against the provided glob-style pattern. Return ``True`` - if matching is successful, ``False`` otherwise. + if matching is successful, ``False`` otherwise. For example:: - If *pattern* is relative, the path can be either relative or absolute, - and matching is done from the right:: - - >>> PurePath('a/b.py').match('*.py') - True - >>> PurePath('/a/b/c.py').match('b/*.py') + >>> PurePath('a/b.py').full_match('a/*.py') True - >>> PurePath('/a/b/c.py').match('a/*.py') + >>> PurePath('a/b.py').full_match('*.py') False - - If *pattern* is absolute, the path must be absolute, and the whole path - must match:: - - >>> PurePath('/a.py').match('/*.py') + >>> PurePath('/a/b/c.py').full_match('/a/**') True - >>> PurePath('a/b.py').match('/*.py') - False - - The *pattern* may be another path object; this speeds up matching the same - pattern against multiple files:: - - >>> pattern = PurePath('*.py') - >>> PurePath('a/b.py').match(pattern) + >>> PurePath('/a/b/c.py').full_match('**/*.py') True + .. seealso:: + :ref:`pathlib-pattern-language` documentation. + As with other methods, case-sensitivity follows platform defaults:: - >>> PurePosixPath('b.py').match('*.PY') + >>> PurePosixPath('b.py').full_match('*.PY') False - >>> PureWindowsPath('b.py').match('*.PY') + >>> PureWindowsPath('b.py').full_match('*.PY') True Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. + .. versionadded:: 3.13 + + +.. method:: PurePath.match(pattern, *, case_sensitive=None) + + Match this path against the provided non-recursive glob-style pattern. + Return ``True`` if matching is successful, ``False`` otherwise. + + This method is similar to :meth:`~PurePath.full_match`, but empty patterns + aren't allowed (:exc:`ValueError` is raised), the recursive wildcard + "``**``" isn't supported (it acts like non-recursive "``*``"), and if a + relative pattern is provided, then matching is done from the right:: + + >>> PurePath('a/b.py').match('*.py') + True + >>> PurePath('/a/b/c.py').match('b/*.py') + True + >>> PurePath('/a/b/c.py').match('a/*.py') + False + + .. versionchanged:: 3.12 + The *pattern* parameter accepts a :term:`path-like object`. + .. versionchanged:: 3.12 The *case_sensitive* parameter was added. @@ -606,8 +633,8 @@ Pure paths provide the following methods and properties: raise ValueError(error_message.format(str(self), str(formatted))) ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute. - When *walk_up* is False (the default), the path must start with *other*. - When the argument is True, ``..`` entries may be added to form the + When *walk_up* is false (the default), the path must start with *other*. + When the argument is true, ``..`` entries may be added to form the relative path. In all other cases, such as the paths referencing different drives, :exc:`ValueError` is raised.:: @@ -743,21 +770,31 @@ calls on path objects. There are three ways to instantiate concrete paths: A subclass of :class:`Path` and :class:`PurePosixPath`, this class represents concrete non-Windows filesystem paths:: - >>> PosixPath('/etc') - PosixPath('/etc') + >>> PosixPath('/etc/hosts') + PosixPath('/etc/hosts') *pathsegments* is specified similarly to :class:`PurePath`. + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` on Windows. In previous versions, + :exc:`NotImplementedError` was raised instead. + + .. class:: WindowsPath(*pathsegments) A subclass of :class:`Path` and :class:`PureWindowsPath`, this class represents concrete Windows filesystem paths:: - >>> WindowsPath('c:/Program Files/') - WindowsPath('c:/Program Files') + >>> WindowsPath('c:/', 'Users', 'Ximénez') + WindowsPath('c:/Users/Ximénez') *pathsegments* is specified similarly to :class:`PurePath`. + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` on non-Windows platforms. In previous + versions, :exc:`NotImplementedError` was raised instead. + + You can only instantiate the class flavour that corresponds to your system (allowing system calls on non-compatible path flavours could lead to bugs or failures in your application):: @@ -774,35 +811,76 @@ bugs or failures in your application):: File "", line 1, in File "pathlib.py", line 798, in __new__ % (cls.__name__,)) - NotImplementedError: cannot instantiate 'WindowsPath' on your system + UnsupportedOperation: cannot instantiate 'WindowsPath' on your system +Some concrete path methods can raise an :exc:`OSError` if a system call fails +(for example because the path doesn't exist). -Methods -^^^^^^^ -Concrete paths provide the following methods in addition to pure paths -methods. Many of these methods can raise an :exc:`OSError` if a system -call fails (for example because the path doesn't exist). +Parsing and generating URIs +^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. versionchanged:: 3.8 +Concrete path objects can be created from, and represented as, 'file' URIs +conforming to :rfc:`8089`. - :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`, - :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`, - :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`, - :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False`` - instead of raising an exception for paths that contain characters - unrepresentable at the OS level. +.. note:: + File URIs are not portable across machines with different + :ref:`filesystem encodings `. -.. classmethod:: Path.cwd() +.. classmethod:: Path.from_uri(uri) - Return a new path object representing the current directory (as returned - by :func:`os.getcwd`):: + Return a new path object from parsing a 'file' URI. For example:: - >>> Path.cwd() - PosixPath('/home/antoine/pathlib') + >>> p = Path.from_uri('file:///etc/hosts') + PosixPath('/etc/hosts') + + On Windows, DOS device and UNC paths may be parsed from URIs:: + + >>> p = Path.from_uri('file:///c:/windows') + WindowsPath('c:/windows') + >>> p = Path.from_uri('file://server/share') + WindowsPath('//server/share') + + Several variant forms are supported:: + + >>> p = Path.from_uri('file:////server/share') + WindowsPath('//server/share') + >>> p = Path.from_uri('file://///server/share') + WindowsPath('//server/share') + >>> p = Path.from_uri('file:c:/windows') + WindowsPath('c:/windows') + >>> p = Path.from_uri('file:/c|/windows') + WindowsPath('c:/windows') + + :exc:`ValueError` is raised if the URI does not start with ``file:``, or + the parsed path isn't absolute. + + .. versionadded:: 3.13 + + +.. method:: Path.as_uri() + + Represent the path as a 'file' URI. :exc:`ValueError` is raised if + the path isn't absolute. + + .. code-block:: pycon + + >>> p = PosixPath('/etc/passwd') + >>> p.as_uri() + 'file:///etc/passwd' + >>> p = WindowsPath('c:/Windows') + >>> p.as_uri() + 'file:///c:/Windows' + + For historical reasons, this method is also available from + :class:`PurePath` objects. However, its use of :func:`os.fsencode` makes + it strictly impure. +Expanding and resolving paths +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + .. classmethod:: Path.home() Return a new path object representing the user's home directory (as @@ -817,9 +895,106 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 +.. method:: Path.expanduser() + + Return a new path with expanded ``~`` and ``~user`` constructs, + as returned by :meth:`os.path.expanduser`. If a home directory can't be + resolved, :exc:`RuntimeError` is raised. + + :: + + >>> p = PosixPath('~/films/Monty Python') + >>> p.expanduser() + PosixPath('/home/eric/films/Monty Python') + + .. versionadded:: 3.5 + + +.. classmethod:: Path.cwd() + + Return a new path object representing the current directory (as returned + by :func:`os.getcwd`):: + + >>> Path.cwd() + PosixPath('/home/antoine/pathlib') + + +.. method:: Path.absolute() + + Make the path absolute, without normalization or resolving symlinks. + Returns a new path object:: + + >>> p = Path('tests') + >>> p + PosixPath('tests') + >>> p.absolute() + PosixPath('/home/antoine/pathlib/tests') + + +.. method:: Path.resolve(strict=False) + + Make the path absolute, resolving any symlinks. A new path object is + returned:: + + >>> p = Path() + >>> p + PosixPath('.') + >>> p.resolve() + PosixPath('/home/antoine/pathlib') + + "``..``" components are also eliminated (this is the only method to do so):: + + >>> p = Path('docs/../setup.py') + >>> p.resolve() + PosixPath('/home/antoine/pathlib/setup.py') + + If a path doesn't exist or a symlink loop is encountered, and *strict* is + ``True``, :exc:`OSError` is raised. If *strict* is ``False``, the path is + resolved as far as possible and any remainder is appended without checking + whether it exists. + + .. versionchanged:: 3.6 + The *strict* parameter was added (pre-3.6 behavior is strict). + + .. versionchanged:: 3.13 + Symlink loops are treated like other errors: :exc:`OSError` is raised in + strict mode, and no exception is raised in non-strict mode. In previous + versions, :exc:`RuntimeError` is raised no matter the value of *strict*. + + +.. method:: Path.readlink() + + Return the path to which the symbolic link points (as returned by + :func:`os.readlink`):: + + >>> p = Path('mylink') + >>> p.symlink_to('setup.py') + >>> p.readlink() + PosixPath('setup.py') + + .. versionadded:: 3.9 + + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` if :func:`os.readlink` is not + available. In previous versions, :exc:`NotImplementedError` was raised. + + +Querying file type and status +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. versionchanged:: 3.8 + + :meth:`~Path.exists`, :meth:`~Path.is_dir`, :meth:`~Path.is_file`, + :meth:`~Path.is_mount`, :meth:`~Path.is_symlink`, + :meth:`~Path.is_block_device`, :meth:`~Path.is_char_device`, + :meth:`~Path.is_fifo`, :meth:`~Path.is_socket` now return ``False`` + instead of raising an exception for paths that contain characters + unrepresentable at the OS level. + + .. method:: Path.stat(*, follow_symlinks=True) - Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. + Return an :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. The result is looked up at each call to this method. This method normally follows symlinks; to stat a symlink add the argument @@ -836,25 +1011,12 @@ call fails (for example because the path doesn't exist). .. versionchanged:: 3.10 The *follow_symlinks* parameter was added. -.. method:: Path.chmod(mode, *, follow_symlinks=True) - - Change the file mode and permissions, like :func:`os.chmod`. - - This method normally follows symlinks. Some Unix flavours support changing - permissions on the symlink itself; on these platforms you may add the - argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. - :: +.. method:: Path.lstat() - >>> p = Path('setup.py') - >>> p.stat().st_mode - 33277 - >>> p.chmod(0o444) - >>> p.stat().st_mode - 33060 + Like :meth:`Path.stat` but, if the path points to a symbolic link, return + the symbolic link's information rather than its target's. - .. versionchanged:: 3.10 - The *follow_symlinks* parameter was added. .. method:: Path.exists(*, follow_symlinks=True) @@ -877,83 +1039,43 @@ call fails (for example because the path doesn't exist). .. versionchanged:: 3.12 The *follow_symlinks* parameter was added. -.. method:: Path.expanduser() - - Return a new path with expanded ``~`` and ``~user`` constructs, - as returned by :meth:`os.path.expanduser`. If a home directory can't be - resolved, :exc:`RuntimeError` is raised. - - :: - - >>> p = PosixPath('~/films/Monty Python') - >>> p.expanduser() - PosixPath('/home/eric/films/Monty Python') - - .. versionadded:: 3.5 - - -.. method:: Path.glob(pattern, *, case_sensitive=None) - - Glob the given relative *pattern* in the directory represented by this path, - yielding all matching files (of any kind):: - - >>> sorted(Path('.').glob('*.py')) - [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')] - >>> sorted(Path('.').glob('*/*.py')) - [PosixPath('docs/conf.py')] - - Patterns are the same as for :mod:`fnmatch`, with the addition of "``**``" - which means "this directory and all subdirectories, recursively". In other - words, it enables recursive globbing:: - - >>> sorted(Path('.').glob('**/*.py')) - [PosixPath('build/lib/pathlib.py'), - PosixPath('docs/conf.py'), - PosixPath('pathlib.py'), - PosixPath('setup.py'), - PosixPath('test_pathlib.py')] - - By default, or when the *case_sensitive* keyword-only argument is set to - ``None``, this method matches paths using platform-specific casing rules: - typically, case-sensitive on POSIX, and case-insensitive on Windows. - Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. - - .. note:: - Using the "``**``" pattern in large directory trees may consume - an inordinate amount of time. - - .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). +.. method:: Path.is_file(*, follow_symlinks=True) - .. versionchanged:: 3.12 - The *case_sensitive* parameter was added. + Return ``True`` if the path points to a regular file, ``False`` if it + points to another kind of file. + ``False`` is also returned if the path doesn't exist or is a broken symlink; + other errors (such as permission errors) are propagated. -.. method:: Path.group() + This method normally follows symlinks; to exclude symlinks, add the + argument ``follow_symlinks=False``. - Return the name of the group owning the file. :exc:`KeyError` is raised - if the file's gid isn't found in the system database. + .. versionchanged:: 3.13 + The *follow_symlinks* parameter was added. -.. method:: Path.is_dir() +.. method:: Path.is_dir(*, follow_symlinks=True) - Return ``True`` if the path points to a directory (or a symbolic link - pointing to a directory), ``False`` if it points to another kind of file. + Return ``True`` if the path points to a directory, ``False`` if it points + to another kind of file. ``False`` is also returned if the path doesn't exist or is a broken symlink; other errors (such as permission errors) are propagated. + This method normally follows symlinks; to exclude symlinks to directories, + add the argument ``follow_symlinks=False``. -.. method:: Path.is_file() + .. versionchanged:: 3.13 + The *follow_symlinks* parameter was added. - Return ``True`` if the path points to a regular file (or a symbolic link - pointing to a regular file), ``False`` if it points to another kind of file. - ``False`` is also returned if the path doesn't exist or is a broken symlink; - other errors (such as permission errors) are propagated. +.. method:: Path.is_symlink() + + Return ``True`` if the path points to a symbolic link, ``False`` otherwise. + + ``False`` is also returned if the path doesn't exist; other errors (such + as permission errors) are propagated. .. method:: Path.is_junction() @@ -981,14 +1103,6 @@ call fails (for example because the path doesn't exist). Windows support was added. -.. method:: Path.is_symlink() - - Return ``True`` if the path points to a symbolic link, ``False`` otherwise. - - ``False`` is also returned if the path doesn't exist; other errors (such - as permission errors) are propagated. - - .. method:: Path.is_socket() Return ``True`` if the path points to a Unix socket (or a symbolic link @@ -1025,14 +1139,122 @@ call fails (for example because the path doesn't exist). other errors (such as permission errors) are propagated. -.. method:: Path.iterdir() +.. method:: Path.samefile(other_path) - When the path points to a directory, yield path objects of the directory - contents:: + Return whether this path points to the same file as *other_path*, which + can be either a Path object, or a string. The semantics are similar + to :func:`os.path.samefile` and :func:`os.path.samestat`. - >>> p = Path('docs') - >>> for child in p.iterdir(): child - ... + An :exc:`OSError` can be raised if either file cannot be accessed for some + reason. + + :: + + >>> p = Path('spam') + >>> q = Path('eggs') + >>> p.samefile(q) + False + >>> p.samefile('spam') + True + + .. versionadded:: 3.5 + + +Reading and writing files +^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) + + Open the file pointed to by the path, like the built-in :func:`open` + function does:: + + >>> p = Path('setup.py') + >>> with p.open() as f: + ... f.readline() + ... + '#!/usr/bin/env python3\n' + + +.. method:: Path.read_text(encoding=None, errors=None, newline=None) + + Return the decoded contents of the pointed-to file as a string:: + + >>> p = Path('my_text_file') + >>> p.write_text('Text file contents') + 18 + >>> p.read_text() + 'Text file contents' + + The file is opened and then closed. The optional parameters have the same + meaning as in :func:`open`. + + .. versionadded:: 3.5 + + .. versionchanged:: 3.13 + The *newline* parameter was added. + + +.. method:: Path.read_bytes() + + Return the binary contents of the pointed-to file as a bytes object:: + + >>> p = Path('my_binary_file') + >>> p.write_bytes(b'Binary file contents') + 20 + >>> p.read_bytes() + b'Binary file contents' + + .. versionadded:: 3.5 + + +.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) + + Open the file pointed to in text mode, write *data* to it, and close the + file:: + + >>> p = Path('my_text_file') + >>> p.write_text('Text file contents') + 18 + >>> p.read_text() + 'Text file contents' + + An existing file of the same name is overwritten. The optional parameters + have the same meaning as in :func:`open`. + + .. versionadded:: 3.5 + + .. versionchanged:: 3.10 + The *newline* parameter was added. + + +.. method:: Path.write_bytes(data) + + Open the file pointed to in bytes mode, write *data* to it, and close the + file:: + + >>> p = Path('my_binary_file') + >>> p.write_bytes(b'Binary file contents') + 20 + >>> p.read_bytes() + b'Binary file contents' + + An existing file of the same name is overwritten. + + .. versionadded:: 3.5 + + +Reading directories +^^^^^^^^^^^^^^^^^^^ + +.. method:: Path.iterdir() + + When the path points to a directory, yield path objects of the directory + contents:: + + >>> p = Path('docs') + >>> for child in p.iterdir(): child + ... PosixPath('docs/conf.py') PosixPath('docs/_templates') PosixPath('docs/make.bat') @@ -1043,8 +1265,76 @@ call fails (for example because the path doesn't exist). The children are yielded in arbitrary order, and the special entries ``'.'`` and ``'..'`` are not included. If a file is removed from or added - to the directory after creating the iterator, whether a path object for - that file be included is unspecified. + to the directory after creating the iterator, it is unspecified whether + a path object for that file is included. + + If the path is not a directory or otherwise inaccessible, :exc:`OSError` is + raised. + +.. method:: Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False) + + Glob the given relative *pattern* in the directory represented by this path, + yielding all matching files (of any kind):: + + >>> sorted(Path('.').glob('*.py')) + [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')] + >>> sorted(Path('.').glob('*/*.py')) + [PosixPath('docs/conf.py')] + >>> sorted(Path('.').glob('**/*.py')) + [PosixPath('build/lib/pathlib.py'), + PosixPath('docs/conf.py'), + PosixPath('pathlib.py'), + PosixPath('setup.py'), + PosixPath('test_pathlib.py')] + + .. seealso:: + :ref:`pathlib-pattern-language` documentation. + + By default, or when the *case_sensitive* keyword-only argument is set to + ``None``, this method matches paths using platform-specific casing rules: + typically, case-sensitive on POSIX, and case-insensitive on Windows. + Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. + + By default, or when the *recurse_symlinks* keyword-only argument is set to + ``False``, this method follows symlinks except when expanding "``**``" + wildcards. Set *recurse_symlinks* to ``True`` to always follow symlinks. + + .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob + + .. versionchanged:: 3.12 + The *case_sensitive* parameter was added. + + .. versionchanged:: 3.13 + The *recurse_symlinks* parameter was added. + + .. versionchanged:: 3.13 + The *pattern* parameter accepts a :term:`path-like object`. + + .. versionchanged:: 3.13 + Any :exc:`OSError` exceptions raised from scanning the filesystem are + suppressed. In previous versions, such exceptions are suppressed in many + cases, but not all. + + +.. method:: Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False) + + Glob the given relative *pattern* recursively. This is like calling + :func:`Path.glob` with "``**/``" added in front of the *pattern*. + + .. seealso:: + :ref:`pathlib-pattern-language` and :meth:`Path.glob` documentation. + + .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + + .. versionchanged:: 3.12 + The *case_sensitive* parameter was added. + + .. versionchanged:: 3.13 + The *recurse_symlinks* parameter was added. + + .. versionchanged:: 3.13 + The *pattern* parameter accepts a :term:`path-like object`. + .. method:: Path.walk(top_down=True, on_error=None, follow_symlinks=False) @@ -1077,7 +1367,7 @@ call fails (for example because the path doesn't exist). This can be used to prune the search, or to impose a specific order of visiting, or even to inform :meth:`Path.walk` about directories the caller creates or renames before it resumes :meth:`Path.walk` again. Modifying *dirnames* when - *top_down* is false has no effect on the behavior of :meth:`Path.walk()` since the + *top_down* is false has no effect on the behavior of :meth:`Path.walk` since the directories in *dirnames* have already been generated by the time *dirnames* is yielded to the caller. @@ -1141,22 +1431,27 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.12 -.. method:: Path.lchmod(mode) - Like :meth:`Path.chmod` but, if the path points to a symbolic link, the - symbolic link's mode is changed rather than its target's. +Creating files and directories +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. method:: Path.touch(mode=0o666, exist_ok=True) -.. method:: Path.lstat() + Create a file at this given path. If *mode* is given, it is combined + with the process's ``umask`` value to determine the file mode and access + flags. If the file already exists, the function succeeds when *exist_ok* + is true (and its modification time is updated to the current time), + otherwise :exc:`FileExistsError` is raised. - Like :meth:`Path.stat` but, if the path points to a symbolic link, return - the symbolic link's information rather than its target's. + .. seealso:: + The :meth:`~Path.open`, :meth:`~Path.write_text` and + :meth:`~Path.write_bytes` methods are often used to create files. .. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False) Create a new directory at this given path. If *mode* is given, it is - combined with the process' ``umask`` value to determine the file mode + combined with the process's ``umask`` value to determine the file mode and access flags. If the path already exists, :exc:`FileExistsError` is raised. @@ -1170,79 +1465,67 @@ call fails (for example because the path doesn't exist). If *exist_ok* is false (the default), :exc:`FileExistsError` is raised if the target directory already exists. - If *exist_ok* is true, :exc:`FileExistsError` exceptions will be - ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the - last path component is not an existing non-directory file. + If *exist_ok* is true, :exc:`FileExistsError` will not be raised unless the given + path already exists in the file system and is not a directory (same + behavior as the POSIX ``mkdir -p`` command). .. versionchanged:: 3.5 The *exist_ok* parameter was added. -.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) - - Open the file pointed to by the path, like the built-in :func:`open` - function does:: - - >>> p = Path('setup.py') - >>> with p.open() as f: - ... f.readline() - ... - '#!/usr/bin/env python3\n' - - -.. method:: Path.owner() - - Return the name of the user owning the file. :exc:`KeyError` is raised - if the file's uid isn't found in the system database. - +.. method:: Path.symlink_to(target, target_is_directory=False) -.. method:: Path.read_bytes() + Make this path a symbolic link pointing to *target*. - Return the binary contents of the pointed-to file as a bytes object:: - - >>> p = Path('my_binary_file') - >>> p.write_bytes(b'Binary file contents') - 20 - >>> p.read_bytes() - b'Binary file contents' - - .. versionadded:: 3.5 + On Windows, a symlink represents either a file or a directory, and does not + morph to the target dynamically. If the target is present, the type of the + symlink will be created to match. Otherwise, the symlink will be created + as a directory if *target_is_directory* is true or a file symlink (the + default) otherwise. On non-Windows platforms, *target_is_directory* is ignored. + :: -.. method:: Path.read_text(encoding=None, errors=None) + >>> p = Path('mylink') + >>> p.symlink_to('setup.py') + >>> p.resolve() + PosixPath('/home/antoine/pathlib/setup.py') + >>> p.stat().st_size + 956 + >>> p.lstat().st_size + 8 - Return the decoded contents of the pointed-to file as a string:: + .. note:: + The order of arguments (link, target) is the reverse + of :func:`os.symlink`'s. - >>> p = Path('my_text_file') - >>> p.write_text('Text file contents') - 18 - >>> p.read_text() - 'Text file contents' + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` if :func:`os.symlink` is not + available. In previous versions, :exc:`NotImplementedError` was raised. - The file is opened and then closed. The optional parameters have the same - meaning as in :func:`open`. - .. versionadded:: 3.5 +.. method:: Path.hardlink_to(target) + Make this path a hard link to the same file as *target*. -.. method:: Path.readlink() + .. note:: + The order of arguments (link, target) is the reverse + of :func:`os.link`'s. - Return the path to which the symbolic link points (as returned by - :func:`os.readlink`):: + .. versionadded:: 3.10 - >>> p = Path('mylink') - >>> p.symlink_to('setup.py') - >>> p.readlink() - PosixPath('setup.py') + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` if :func:`os.link` is not + available. In previous versions, :exc:`NotImplementedError` was raised. - .. versionadded:: 3.9 +Renaming and deleting +^^^^^^^^^^^^^^^^^^^^^ .. method:: Path.rename(target) - Rename this file or directory to the given *target*, and return a new Path - instance pointing to *target*. On Unix, if *target* exists and is a file, - it will be replaced silently if the user has permission. + Rename this file or directory to the given *target*, and return a new + :class:`!Path` instance pointing to *target*. On Unix, if *target* exists + and is a file, it will be replaced silently if the user has permission. On Windows, if *target* exists, :exc:`FileExistsError` will be raised. *target* can be either a string or another path object:: @@ -1256,93 +1539,42 @@ call fails (for example because the path doesn't exist). 'some text' The target path may be absolute or relative. Relative paths are interpreted - relative to the current working directory, *not* the directory of the Path - object. + relative to the current working directory, *not* the directory of the + :class:`!Path` object. It is implemented in terms of :func:`os.rename` and gives the same guarantees. .. versionchanged:: 3.8 - Added return value, return the new Path instance. + Added return value, return the new :class:`!Path` instance. .. method:: Path.replace(target) - Rename this file or directory to the given *target*, and return a new Path - instance pointing to *target*. If *target* points to an existing file or - empty directory, it will be unconditionally replaced. + Rename this file or directory to the given *target*, and return a new + :class:`!Path` instance pointing to *target*. If *target* points to an + existing file or empty directory, it will be unconditionally replaced. The target path may be absolute or relative. Relative paths are interpreted - relative to the current working directory, *not* the directory of the Path - object. + relative to the current working directory, *not* the directory of the + :class:`!Path` object. .. versionchanged:: 3.8 - Added return value, return the new Path instance. - - -.. method:: Path.absolute() - - Make the path absolute, without normalization or resolving symlinks. - Returns a new path object:: - - >>> p = Path('tests') - >>> p - PosixPath('tests') - >>> p.absolute() - PosixPath('/home/antoine/pathlib/tests') - - -.. method:: Path.resolve(strict=False) - - Make the path absolute, resolving any symlinks. A new path object is - returned:: + Added return value, return the new :class:`!Path` instance. - >>> p = Path() - >>> p - PosixPath('.') - >>> p.resolve() - PosixPath('/home/antoine/pathlib') - - "``..``" components are also eliminated (this is the only method to do so):: - - >>> p = Path('docs/../setup.py') - >>> p.resolve() - PosixPath('/home/antoine/pathlib/setup.py') - - If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError` - is raised. If *strict* is ``False``, the path is resolved as far as possible - and any remainder is appended without checking whether it exists. If an - infinite loop is encountered along the resolution path, :exc:`RuntimeError` - is raised. - - .. versionchanged:: 3.6 - The *strict* parameter was added (pre-3.6 behavior is strict). - -.. method:: Path.rglob(pattern, *, case_sensitive=None) - - Glob the given relative *pattern* recursively. This is like calling - :func:`Path.glob` with "``**/``" added in front of the *pattern*, where - *patterns* are the same as for :mod:`fnmatch`:: - >>> sorted(Path().rglob("*.py")) - [PosixPath('build/lib/pathlib.py'), - PosixPath('docs/conf.py'), - PosixPath('pathlib.py'), - PosixPath('setup.py'), - PosixPath('test_pathlib.py')] +.. method:: Path.unlink(missing_ok=False) - By default, or when the *case_sensitive* keyword-only argument is set to - ``None``, this method matches paths using platform-specific casing rules: - typically, case-sensitive on POSIX, and case-insensitive on Windows. - Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. + Remove this file or symbolic link. If the path points to a directory, + use :func:`Path.rmdir` instead. - .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + If *missing_ok* is false (the default), :exc:`FileNotFoundError` is + raised if the path does not exist. - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). + If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be + ignored (same behavior as the POSIX ``rm -f`` command). - .. versionchanged:: 3.12 - The *case_sensitive* parameter was added. + .. versionchanged:: 3.8 + The *missing_ok* parameter was added. .. method:: Path.rmdir() @@ -1350,169 +1582,237 @@ call fails (for example because the path doesn't exist). Remove this directory. The directory must be empty. -.. method:: Path.samefile(other_path) - - Return whether this path points to the same file as *other_path*, which - can be either a Path object, or a string. The semantics are similar - to :func:`os.path.samefile` and :func:`os.path.samestat`. - - An :exc:`OSError` can be raised if either file cannot be accessed for some - reason. - - :: - - >>> p = Path('spam') - >>> q = Path('eggs') - >>> p.samefile(q) - False - >>> p.samefile('spam') - True - - .. versionadded:: 3.5 - - -.. method:: Path.symlink_to(target, target_is_directory=False) +Permissions and ownership +^^^^^^^^^^^^^^^^^^^^^^^^^ - Make this path a symbolic link to *target*. Under Windows, - *target_is_directory* must be true (default ``False``) if the link's target - is a directory. Under POSIX, *target_is_directory*'s value is ignored. +.. method:: Path.owner(*, follow_symlinks=True) - :: + Return the name of the user owning the file. :exc:`KeyError` is raised + if the file's user identifier (UID) isn't found in the system database. - >>> p = Path('mylink') - >>> p.symlink_to('setup.py') - >>> p.resolve() - PosixPath('/home/antoine/pathlib/setup.py') - >>> p.stat().st_size - 956 - >>> p.lstat().st_size - 8 - - .. note:: - The order of arguments (link, target) is the reverse - of :func:`os.symlink`'s. + This method normally follows symlinks; to get the owner of the symlink, add + the argument ``follow_symlinks=False``. -.. method:: Path.hardlink_to(target) + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` if the :mod:`pwd` module is not + available. In earlier versions, :exc:`NotImplementedError` was raised. - Make this path a hard link to the same file as *target*. + .. versionchanged:: 3.13 + The *follow_symlinks* parameter was added. - .. note:: - The order of arguments (link, target) is the reverse - of :func:`os.link`'s. - .. versionadded:: 3.10 +.. method:: Path.group(*, follow_symlinks=True) + Return the name of the group owning the file. :exc:`KeyError` is raised + if the file's group identifier (GID) isn't found in the system database. -.. method:: Path.touch(mode=0o666, exist_ok=True) + This method normally follows symlinks; to get the group of the symlink, add + the argument ``follow_symlinks=False``. - Create a file at this given path. If *mode* is given, it is combined - with the process' ``umask`` value to determine the file mode and access - flags. If the file already exists, the function succeeds if *exist_ok* - is true (and its modification time is updated to the current time), - otherwise :exc:`FileExistsError` is raised. + .. versionchanged:: 3.13 + Raises :exc:`UnsupportedOperation` if the :mod:`grp` module is not + available. In earlier versions, :exc:`NotImplementedError` was raised. + .. versionchanged:: 3.13 + The *follow_symlinks* parameter was added. -.. method:: Path.unlink(missing_ok=False) - Remove this file or symbolic link. If the path points to a directory, - use :func:`Path.rmdir` instead. +.. method:: Path.chmod(mode, *, follow_symlinks=True) - If *missing_ok* is false (the default), :exc:`FileNotFoundError` is - raised if the path does not exist. + Change the file mode and permissions, like :func:`os.chmod`. - If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be - ignored (same behavior as the POSIX ``rm -f`` command). + This method normally follows symlinks. Some Unix flavours support changing + permissions on the symlink itself; on these platforms you may add the + argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. - .. versionchanged:: 3.8 - The *missing_ok* parameter was added. + :: + >>> p = Path('setup.py') + >>> p.stat().st_mode + 33277 + >>> p.chmod(0o444) + >>> p.stat().st_mode + 33060 -.. method:: Path.write_bytes(data) + .. versionchanged:: 3.10 + The *follow_symlinks* parameter was added. - Open the file pointed to in bytes mode, write *data* to it, and close the - file:: - >>> p = Path('my_binary_file') - >>> p.write_bytes(b'Binary file contents') - 20 - >>> p.read_bytes() - b'Binary file contents' +.. method:: Path.lchmod(mode) - An existing file of the same name is overwritten. + Like :meth:`Path.chmod` but, if the path points to a symbolic link, the + symbolic link's mode is changed rather than its target's. - .. versionadded:: 3.5 +.. _pathlib-pattern-language: -.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) +Pattern language +---------------- - Open the file pointed to in text mode, write *data* to it, and close the - file:: +The following wildcards are supported in patterns for +:meth:`~PurePath.full_match`, :meth:`~Path.glob` and :meth:`~Path.rglob`: - >>> p = Path('my_text_file') - >>> p.write_text('Text file contents') - 18 - >>> p.read_text() - 'Text file contents' +``**`` (entire segment) + Matches any number of file or directory segments, including zero. +``*`` (entire segment) + Matches one file or directory segment. +``*`` (part of a segment) + Matches any number of non-separator characters, including zero. +``?`` + Matches one non-separator character. +``[seq]`` + Matches one character in *seq*. +``[!seq]`` + Matches one character not in *seq*. - An existing file of the same name is overwritten. The optional parameters - have the same meaning as in :func:`open`. +For a literal match, wrap the meta-characters in brackets. +For example, ``"[?]"`` matches the character ``"?"``. - .. versionadded:: 3.5 +The "``**``" wildcard enables recursive globbing. A few examples: - .. versionchanged:: 3.10 - The *newline* parameter was added. +========================= =========================================== +Pattern Meaning +========================= =========================================== +"``**/*``" Any path with at least one segment. +"``**/*.py``" Any path with a final segment ending "``.py``". +"``assets/**``" Any path starting with "``assets/``". +"``assets/**/*``" Any path starting with "``assets/``", excluding "``assets/``" itself. +========================= =========================================== -Correspondence to tools in the :mod:`os` module ------------------------------------------------ +.. note:: + Globbing with the "``**``" wildcard visits every directory in the tree. + Large directory trees may take a long time to search. + +.. versionchanged:: 3.13 + Globbing with a pattern that ends with "``**``" returns both files and + directories. In previous versions, only directories were returned. + +In :meth:`Path.glob` and :meth:`~Path.rglob`, a trailing slash may be added to +the pattern to match only directories. + +.. versionchanged:: 3.11 + Globbing with a pattern that ends with a pathname components separator + (:data:`~os.sep` or :data:`~os.altsep`) returns only directories. + + +Comparison to the :mod:`glob` module +------------------------------------ + +The patterns accepted and results generated by :meth:`Path.glob` and +:meth:`Path.rglob` differ slightly from those by the :mod:`glob` module: + +1. Files beginning with a dot are not special in pathlib. This is + like passing ``include_hidden=True`` to :func:`glob.glob`. +2. "``**``" pattern components are always recursive in pathlib. This is like + passing ``recursive=True`` to :func:`glob.glob`. +3. "``**``" pattern components do not follow symlinks by default in pathlib. + This behaviour has no equivalent in :func:`glob.glob`, but you can pass + ``recurse_symlinks=True`` to :meth:`Path.glob` for compatible behaviour. +4. Like all :class:`PurePath` and :class:`Path` objects, the values returned + from :meth:`Path.glob` and :meth:`Path.rglob` don't include trailing + slashes. +5. The values returned from pathlib's ``path.glob()`` and ``path.rglob()`` + include the *path* as a prefix, unlike the results of + ``glob.glob(root_dir=path)``. +6. The values returned from pathlib's ``path.glob()`` and ``path.rglob()`` + may include *path* itself, for example when globbing "``**``", whereas the + results of ``glob.glob(root_dir=path)`` never include an empty string that + would correspond to *path*. + + +Comparison to the :mod:`os` and :mod:`os.path` modules +------------------------------------------------------ + +pathlib implements path operations using :class:`PurePath` and :class:`Path` +objects, and so it's said to be *object-oriented*. On the other hand, the +:mod:`os` and :mod:`os.path` modules supply functions that work with low-level +``str`` and ``bytes`` objects, which is a more *procedural* approach. Some +users consider the object-oriented style to be more readable. + +Many functions in :mod:`os` and :mod:`os.path` support ``bytes`` paths and +:ref:`paths relative to directory descriptors `. These features aren't +available in pathlib. + +Python's ``str`` and ``bytes`` types, and portions of the :mod:`os` and +:mod:`os.path` modules, are written in C and are very speedy. pathlib is +written in pure Python and is often slower, but rarely slow enough to matter. + +pathlib's path normalization is slightly more opinionated and consistent than +:mod:`os.path`. For example, whereas :func:`os.path.abspath` eliminates +"``..``" segments from a path, which may change its meaning if symlinks are +involved, :meth:`Path.absolute` preserves these segments for greater safety. + +pathlib's path normalization may render it unsuitable for some applications: + +1. pathlib normalizes ``Path("my_folder/")`` to ``Path("my_folder")``, which + changes a path's meaning when supplied to various operating system APIs and + command-line utilities. Specifically, the absence of a trailing separator + may allow the path to be resolved as either a file or directory, rather + than a directory only. +2. pathlib normalizes ``Path("./my_program")`` to ``Path("my_program")``, + which changes a path's meaning when used as an executable search path, such + as in a shell or when spawning a child process. Specifically, the absence + of a separator in the path may force it to be looked up in :envvar:`PATH` + rather than the current directory. + +As a consequence of these differences, pathlib is not a drop-in replacement +for :mod:`os.path`. + + +Corresponding tools +^^^^^^^^^^^^^^^^^^^ Below is a table mapping various :mod:`os` functions to their corresponding :class:`PurePath`/:class:`Path` equivalent. -.. note:: - - Not all pairs of functions/methods below are equivalent. Some of them, - despite having some overlapping use-cases, have different semantics. They - include :func:`os.path.abspath` and :meth:`Path.absolute`, - :func:`os.path.relpath` and :meth:`PurePath.relative_to`. - -==================================== ============================== -:mod:`os` and :mod:`os.path` :mod:`pathlib` -==================================== ============================== -:func:`os.path.abspath` :meth:`Path.absolute` [#]_ -:func:`os.path.realpath` :meth:`Path.resolve` -:func:`os.chmod` :meth:`Path.chmod` -:func:`os.mkdir` :meth:`Path.mkdir` -:func:`os.makedirs` :meth:`Path.mkdir` -:func:`os.rename` :meth:`Path.rename` -:func:`os.replace` :meth:`Path.replace` -:func:`os.rmdir` :meth:`Path.rmdir` -:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink` -:func:`os.getcwd` :func:`Path.cwd` -:func:`os.path.exists` :meth:`Path.exists` -:func:`os.path.expanduser` :meth:`Path.expanduser` and - :meth:`Path.home` -:func:`os.listdir` :meth:`Path.iterdir` -:func:`os.walk` :meth:`Path.walk` -:func:`os.path.isdir` :meth:`Path.is_dir` -:func:`os.path.isfile` :meth:`Path.is_file` -:func:`os.path.islink` :meth:`Path.is_symlink` -:func:`os.link` :meth:`Path.hardlink_to` -:func:`os.symlink` :meth:`Path.symlink_to` -:func:`os.readlink` :meth:`Path.readlink` -:func:`os.path.relpath` :meth:`PurePath.relative_to` [#]_ -:func:`os.stat` :meth:`Path.stat`, - :meth:`Path.owner`, - :meth:`Path.group` -:func:`os.path.isabs` :meth:`PurePath.is_absolute` -:func:`os.path.join` :func:`PurePath.joinpath` -:func:`os.path.basename` :attr:`PurePath.name` -:func:`os.path.dirname` :attr:`PurePath.parent` -:func:`os.path.samefile` :meth:`Path.samefile` -:func:`os.path.splitext` :attr:`PurePath.stem` and - :attr:`PurePath.suffix` -==================================== ============================== +===================================== ============================================== +:mod:`os` and :mod:`os.path` :mod:`pathlib` +===================================== ============================================== +:func:`os.path.dirname` :attr:`PurePath.parent` +:func:`os.path.basename` :attr:`PurePath.name` +:func:`os.path.splitext` :attr:`PurePath.stem`, :attr:`PurePath.suffix` +:func:`os.path.join` :meth:`PurePath.joinpath` +:func:`os.path.isabs` :meth:`PurePath.is_absolute` +:func:`os.path.relpath` :meth:`PurePath.relative_to` [1]_ +:func:`os.path.expanduser` :meth:`Path.expanduser` [2]_ +:func:`os.path.realpath` :meth:`Path.resolve` +:func:`os.path.abspath` :meth:`Path.absolute` [3]_ +:func:`os.path.exists` :meth:`Path.exists` +:func:`os.path.isfile` :meth:`Path.is_file` +:func:`os.path.isdir` :meth:`Path.is_dir` +:func:`os.path.islink` :meth:`Path.is_symlink` +:func:`os.path.isjunction` :meth:`Path.is_junction` +:func:`os.path.ismount` :meth:`Path.is_mount` +:func:`os.path.samefile` :meth:`Path.samefile` +:func:`os.getcwd` :meth:`Path.cwd` +:func:`os.stat` :meth:`Path.stat` +:func:`os.lstat` :meth:`Path.lstat` +:func:`os.listdir` :meth:`Path.iterdir` +:func:`os.walk` :meth:`Path.walk` [4]_ +:func:`os.mkdir`, :func:`os.makedirs` :meth:`Path.mkdir` +:func:`os.link` :meth:`Path.hardlink_to` +:func:`os.symlink` :meth:`Path.symlink_to` +:func:`os.readlink` :meth:`Path.readlink` +:func:`os.rename` :meth:`Path.rename` +:func:`os.replace` :meth:`Path.replace` +:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink` +:func:`os.rmdir` :meth:`Path.rmdir` +:func:`os.chmod` :meth:`Path.chmod` +:func:`os.lchmod` :meth:`Path.lchmod` +===================================== ============================================== .. rubric:: Footnotes -.. [#] :func:`os.path.abspath` normalizes the resulting path, which may change its meaning in the presence of symlinks, while :meth:`Path.absolute` does not. -.. [#] :meth:`PurePath.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not. +.. [1] :func:`os.path.relpath` calls :func:`~os.path.abspath` to make paths + absolute and remove "``..``" parts, whereas :meth:`PurePath.relative_to` + is a lexical operation that raises :exc:`ValueError` when its inputs' + anchors differ (e.g. if one path is absolute and the other relative.) +.. [2] :func:`os.path.expanduser` returns the path unchanged if the home + directory can't be resolved, whereas :meth:`Path.expanduser` raises + :exc:`RuntimeError`. +.. [3] :func:`os.path.abspath` removes "``..``" components without resolving + symlinks, which may change the meaning of the path, whereas + :meth:`Path.absolute` leaves any "``..``" components in the path. +.. [4] :func:`os.walk` always follows symlinks when categorizing paths into + *dirnames* and *filenames*, whereas :meth:`Path.walk` categorizes all + symlinks into *filenames* when *follow_symlinks* is false (the default.) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ef52370b..9478d7b7 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -48,8 +48,8 @@ at the location you want to break into the debugger, and then run the program. You can then step through the code following this statement, and continue running without the debugger using the :pdbcmd:`continue` command. -.. versionadded:: 3.7 - The built-in :func:`breakpoint()`, when called with defaults, can be used +.. versionchanged:: 3.7 + The built-in :func:`breakpoint`, when called with defaults, can be used instead of ``import pdb; pdb.set_trace()``. :: @@ -62,8 +62,8 @@ running without the debugger using the :pdbcmd:`continue` command. The debugger's prompt is ``(Pdb)``, which is the indicator that you are in debug mode:: - > ...(3)double() - -> return x * 2 + > ...(2)double() + -> breakpoint() (Pdb) p x 3 (Pdb) continue @@ -86,12 +86,12 @@ after normal exit of the program), pdb will restart the program. Automatic restarting preserves pdb's state (such as breakpoints) and in most cases is more useful than quitting the debugger upon program's exit. -.. versionadded:: 3.2 - ``-c`` option is introduced to execute commands as if given - in a :file:`.pdbrc` file, see :ref:`debugger-commands`. +.. versionchanged:: 3.2 + Added the ``-c`` option to execute commands as if given + in a :file:`.pdbrc` file; see :ref:`debugger-commands`. -.. versionadded:: 3.7 - ``-m`` option is introduced to execute modules similar to the way +.. versionchanged:: 3.7 + Added the ``-m`` option to execute modules similar to the way ``python -m`` does. As with a script, the debugger will pause execution just before the first line of the module. @@ -123,6 +123,11 @@ The typical usage to inspect a crashed program is:: 0 (Pdb) +.. versionchanged:: 3.13 + The implementation of :pep:`667` means that name assignments made via ``pdb`` + will immediately affect the active scope, even when running inside an + :term:`optimized scope`. + The module defines the following functions; each enters the debugger in a slightly different way: @@ -164,6 +169,9 @@ slightly different way: .. versionchanged:: 3.7 The keyword-only argument *header*. + .. versionchanged:: 3.13 + :func:`set_trace` will enter the debugger immediately, rather than + on the next line of code to be executed. .. function:: post_mortem(traceback=None) @@ -175,8 +183,8 @@ slightly different way: .. function:: pm() - Enter post-mortem debugging of the traceback found in - :data:`sys.last_traceback`. + Enter post-mortem debugging of the exception found in + :data:`sys.last_exc`. The ``run*`` functions and :func:`set_trace` are aliases for instantiating the @@ -209,12 +217,12 @@ access further features, you have to do this yourself: .. audit-event:: pdb.Pdb "" pdb.Pdb - .. versionadded:: 3.1 - The *skip* argument. + .. versionchanged:: 3.1 + Added the *skip* parameter. - .. versionadded:: 3.2 - The *nosigint* argument. Previously, a SIGINT handler was never set by - Pdb. + .. versionchanged:: 3.2 + Added the *nosigint* parameter. + Previously, a SIGINT handler was never set by Pdb. .. versionchanged:: 3.6 The *readrc* argument. @@ -252,6 +260,10 @@ change a variable or call a function. When an exception occurs in such a statement, the exception name is printed but the debugger's state is not changed. +.. versionchanged:: 3.13 + Expressions/Statements whose prefix is a pdb command are now correctly + identified and executed. + The debugger supports :ref:`aliases `. Aliases can have parameters which allows one a certain level of adaptability to the context under examination. @@ -278,25 +290,28 @@ There are three preset *convenience variables*: .. versionadded:: 3.12 + Added the *convenience variable* feature. + .. index:: pair: .pdbrc; file triple: debugger; configuration; file If a file :file:`.pdbrc` exists in the user's home directory or in the current directory, it is read with ``'utf-8'`` encoding and executed as if it had been -typed at the debugger prompt. This is particularly useful for aliases. If both +typed at the debugger prompt, with the exception that empty lines and lines +starting with ``#`` are ignored. This is particularly useful for aliases. If both files exist, the one in the home directory is read first and aliases defined there can be overridden by the local file. -.. versionchanged:: 3.11 - :file:`.pdbrc` is now read with ``'utf-8'`` encoding. Previously, it was read - with the system locale encoding. - .. versionchanged:: 3.2 :file:`.pdbrc` can now contain commands that continue debugging, such as :pdbcmd:`continue` or :pdbcmd:`next`. Previously, these commands had no effect. +.. versionchanged:: 3.11 + :file:`.pdbrc` is now read with ``'utf-8'`` encoding. Previously, it was read + with the system locale encoding. + .. pdbcommand:: h(elp) [command] @@ -323,12 +338,16 @@ can be overridden by the local file. .. pdbcommand:: b(reak) [([filename:]lineno | function) [, condition]] - With a *lineno* argument, set a break there in the current file. With a - *function* argument, set a break at the first executable statement within - that function. The line number may be prefixed with a filename and a colon, - to specify a breakpoint in another file (probably one that hasn't been loaded - yet). The file is searched on :data:`sys.path`. Note that each breakpoint - is assigned a number to which all the other breakpoint commands refer. + With a *lineno* argument, set a break at line *lineno* in the current file. + The line number may be prefixed with a *filename* and a colon, + to specify a breakpoint in another file (possibly one that hasn't been loaded + yet). The file is searched on :data:`sys.path`. Accepatable forms of *filename* + are ``/abspath/to/file.py``, ``relpath/file.py``, ``module`` and + ``package.module``. + + With a *function* argument, set a break at the first executable statement within + that function. *function* can be any expression that evaluates to a function + in the current namespace. If a second argument is present, it is an expression which must evaluate to true before the breakpoint is honored. @@ -337,6 +356,9 @@ can be overridden by the local file. of times that breakpoint has been hit, the current ignore count, and the associated condition if any. + Each breakpoint is assigned a number to which all the other + breakpoint commands refer. + .. pdbcommand:: tbreak [([filename:]lineno | function) [, condition]] Temporary breakpoint, which is removed automatically when it is first hit. @@ -463,8 +485,8 @@ can be overridden by the local file. raised or propagated is indicated by ``>>``, if it differs from the current line. - .. versionadded:: 3.2 - The ``>>`` marker. + .. versionchanged:: 3.2 + Added the ``>>`` marker. .. pdbcommand:: ll | longlist @@ -564,19 +586,35 @@ can be overridden by the local file. .. pdbcommand:: interact - Start an interactive interpreter (using the :mod:`code` module) whose global - namespace contains all the (global and local) names found in the current - scope. + Start an interactive interpreter (using the :mod:`code` module) in a new + global namespace initialised from the local and global namespaces for the + current scope. Use ``exit()`` or ``quit()`` to exit the interpreter and + return to the debugger. + + .. note:: + + As ``interact`` creates a new dedicated namespace for code execution, + assignments to variables will not affect the original namespaces. + However, modifications to any referenced mutable objects will be reflected + in the original namespaces as usual. .. versionadded:: 3.2 + .. versionchanged:: 3.13 + ``exit()`` and ``quit()`` can be used to exit the :pdbcmd:`interact` + command. + + .. versionchanged:: 3.13 + :pdbcmd:`interact` directs its output to the debugger's + output channel rather than :data:`sys.stderr`. + .. _debugger-aliases: .. pdbcommand:: alias [name [command]] Create an alias called *name* that executes *command*. The *command* must *not* be enclosed in quotes. Replaceable parameters can be indicated by - ``%1``, ``%2``, and so on, while ``%*`` is replaced by all the parameters. + ``%1``, ``%2``, ... and ``%9``, while ``%*`` is replaced by all the parameters. If *command* is omitted, the current alias for *name* is shown. If no arguments are given, all aliases are listed. @@ -639,6 +677,55 @@ can be overridden by the local file. Print the return value for the last return of the current function. +.. pdbcommand:: exceptions [excnumber] + + List or jump between chained exceptions. + + When using ``pdb.pm()`` or ``Pdb.post_mortem(...)`` with a chained exception + instead of a traceback, it allows the user to move between the + chained exceptions using ``exceptions`` command to list exceptions, and + ``exception `` to switch to that exception. + + + Example:: + + def out(): + try: + middle() + except Exception as e: + raise ValueError("reraise middle() error") from e + + def middle(): + try: + return inner(0) + except Exception as e: + raise ValueError("Middle fail") + + def inner(x): + 1 / x + + out() + + calling ``pdb.pm()`` will allow to move between exceptions:: + + > example.py(5)out() + -> raise ValueError("reraise middle() error") from e + + (Pdb) exceptions + 0 ZeroDivisionError('division by zero') + 1 ValueError('Middle fail') + > 2 ValueError('reraise middle() error') + + (Pdb) exceptions 0 + > example.py(16)inner() + -> 1 / x + + (Pdb) up + > example.py(10)middle() + -> return inner(0) + + .. versionadded:: 3.13 + .. rubric:: Footnotes .. [1] Whether a frame is considered to originate in a certain module diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index d6be4ba3..57fbe5b6 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -1,5 +1,5 @@ -:mod:`pickle` --- Python object serialization -============================================= +:mod:`!pickle` --- Python object serialization +============================================== .. module:: pickle :synopsis: Convert Python objects to streams of bytes and back. @@ -125,7 +125,7 @@ Data stream format The data format used by :mod:`pickle` is Python-specific. This has the advantage that there are no restrictions imposed by external standards such as -JSON or XDR (which can't represent pointer sharing); however it means that +JSON (which can't represent pointer sharing); however it means that non-Python programs may not be able to reconstruct pickled Python objects. By default, the :mod:`pickle` data format uses a relatively compact binary @@ -272,13 +272,13 @@ The :mod:`pickle` module defines three exceptions: .. exception:: PickleError - Common base class for the other pickling exceptions. It inherits + Common base class for the other pickling exceptions. It inherits from :exc:`Exception`. .. exception:: PicklingError Error raised when an unpicklable object is encountered by :class:`Pickler`. - It inherits :exc:`PickleError`. + It inherits from :exc:`PickleError`. Refer to :ref:`pickle-picklable` to learn what kinds of objects can be pickled. @@ -286,7 +286,7 @@ The :mod:`pickle` module defines three exceptions: .. exception:: UnpicklingError Error raised when there is a problem unpickling an object, such as a data - corruption or a security violation. It inherits :exc:`PickleError`. + corruption or a security violation. It inherits from :exc:`PickleError`. Note that other exceptions may also be raised during unpickling, including (but not necessarily limited to) AttributeError, EOFError, ImportError, and @@ -314,16 +314,16 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, map the new Python 3 names to the old module names used in Python 2, so that the pickle data stream is readable with Python 2. - If *buffer_callback* is None (the default), buffer views are + If *buffer_callback* is ``None`` (the default), buffer views are serialized into *file* as part of the pickle stream. - If *buffer_callback* is not None, then it can be called any number + If *buffer_callback* is not ``None``, then it can be called any number of times with a buffer view. If the callback returns a false value - (such as None), the given buffer is :ref:`out-of-band `; + (such as ``None``), the given buffer is :ref:`out-of-band `; otherwise the buffer is serialized in-band, i.e. inside the pickle stream. - It is an error if *buffer_callback* is not None and *protocol* is - None or smaller than 5. + It is an error if *buffer_callback* is not ``None`` and *protocol* is + ``None`` or smaller than 5. .. versionchanged:: 3.8 The *buffer_callback* argument was added. @@ -345,6 +345,10 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, See :ref:`pickle-persistent` for details and examples of uses. + .. versionchanged:: 3.13 + Add the default implementation of this method in the C implementation + of :class:`!Pickler`. + .. attribute:: dispatch_table A pickler object's dispatch table is a registry of *reduction @@ -352,7 +356,7 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, :func:`copyreg.pickle`. It is a mapping whose keys are classes and whose values are reduction functions. A reduction function takes a single argument of the associated class and should - conform to the same interface as a :meth:`__reduce__` + conform to the same interface as a :meth:`~object.__reduce__` method. By default, a pickler object will not have a @@ -372,8 +376,8 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, Special reducer that can be defined in :class:`Pickler` subclasses. This method has priority over any reducer in the :attr:`dispatch_table`. It - should conform to the same interface as a :meth:`__reduce__` method, and - can optionally return ``NotImplemented`` to fallback on + should conform to the same interface as a :meth:`~object.__reduce__` method, and + can optionally return :data:`NotImplemented` to fallback on :attr:`dispatch_table`-registered reducers to pickle ``obj``. For a detailed example, see :ref:`reducer_override`. @@ -416,12 +420,12 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, instances of :class:`~datetime.datetime`, :class:`~datetime.date` and :class:`~datetime.time` pickled by Python 2. - If *buffers* is None (the default), then all data necessary for + If *buffers* is ``None`` (the default), then all data necessary for deserialization must be contained in the pickle stream. This means - that the *buffer_callback* argument was None when a :class:`Pickler` + that the *buffer_callback* argument was ``None`` when a :class:`Pickler` was instantiated (or when :func:`dump` or :func:`dumps` was called). - If *buffers* is not None, it should be an iterable of buffer-enabled + If *buffers* is not ``None``, it should be an iterable of buffer-enabled objects that is consumed each time the pickle stream references an :ref:`out-of-band ` buffer view. Such buffers have been given in order to the *buffer_callback* of a Pickler object. @@ -446,6 +450,10 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, See :ref:`pickle-persistent` for details and examples of uses. + .. versionchanged:: 3.13 + Add the default implementation of this method in the C implementation + of :class:`!Unpickler`. + .. method:: find_class(module, name) Import *module* if necessary and return the object called *name* from it, @@ -495,7 +503,7 @@ What can be pickled and unpickled? The following types can be pickled: * built-in constants (``None``, ``True``, ``False``, ``Ellipsis``, and - ``NotImplemented``); + :data:`NotImplemented`); * integers, floating-point numbers, complex numbers; @@ -508,7 +516,7 @@ The following types can be pickled: * classes accessible from the top level of a module; -* instances of such classes whose the result of calling :meth:`__getstate__` +* instances of such classes whose the result of calling :meth:`~object.__getstate__` is picklable (see section :ref:`pickle-inst` for details). Attempts to pickle unpicklable objects will raise the :exc:`PicklingError` @@ -544,7 +552,7 @@ purpose, so you can fix bugs in a class or add methods to the class and still load objects that were created with an earlier version of the class. If you plan to have long-lived objects that will see many versions of a class, it may be worthwhile to put a version number in the objects so that suitable -conversions can be made by the class's :meth:`__setstate__` method. +conversions can be made by the class's :meth:`~object.__setstate__` method. .. _pickle-inst: @@ -559,7 +567,7 @@ customize, and control how class instances are pickled and unpickled. In most cases, no additional code is needed to make instances picklable. By default, pickle will retrieve the class and the attributes of an instance via -introspection. When a class instance is unpickled, its :meth:`__init__` method +introspection. When a class instance is unpickled, its :meth:`~object.__init__` method is usually *not* invoked. The default behaviour first creates an uninitialized instance and then restores the saved attributes. The following code shows an implementation of this behaviour:: @@ -645,35 +653,35 @@ methods: .. note:: - If :meth:`__getstate__` returns a false value, the :meth:`__setstate__` - method will not be called upon unpickling. + If :meth:`__reduce__` returns a state with value ``None`` at pickling, + the :meth:`__setstate__` method will not be called upon unpickling. Refer to the section :ref:`pickle-state` for more information about how to use -the methods :meth:`__getstate__` and :meth:`__setstate__`. +the methods :meth:`~object.__getstate__` and :meth:`~object.__setstate__`. .. note:: - At unpickling time, some methods like :meth:`__getattr__`, - :meth:`__getattribute__`, or :meth:`__setattr__` may be called upon the + At unpickling time, some methods like :meth:`~object.__getattr__`, + :meth:`~object.__getattribute__`, or :meth:`~object.__setattr__` may be called upon the instance. In case those methods rely on some internal invariant being - true, the type should implement :meth:`__new__` to establish such an - invariant, as :meth:`__init__` is not called when unpickling an + true, the type should implement :meth:`~object.__new__` to establish such an + invariant, as :meth:`~object.__init__` is not called when unpickling an instance. .. index:: pair: copy; protocol As we shall see, pickle does not use directly the methods described above. In fact, these methods are part of the copy protocol which implements the -:meth:`__reduce__` special method. The copy protocol provides a unified +:meth:`~object.__reduce__` special method. The copy protocol provides a unified interface for retrieving the data necessary for pickling and copying objects. [#]_ -Although powerful, implementing :meth:`__reduce__` directly in your classes is +Although powerful, implementing :meth:`~object.__reduce__` directly in your classes is error prone. For this reason, class designers should use the high-level -interface (i.e., :meth:`__getnewargs_ex__`, :meth:`__getstate__` and -:meth:`__setstate__`) whenever possible. We will show, however, cases where -using :meth:`__reduce__` is the only option or leads to more efficient pickling +interface (i.e., :meth:`~object.__getnewargs_ex__`, :meth:`~object.__getstate__` and +:meth:`~object.__setstate__`) whenever possible. We will show, however, cases where +using :meth:`!__reduce__` is the only option or leads to more efficient pickling or both. .. method:: object.__reduce__() @@ -708,8 +716,9 @@ or both. These items will be appended to the object either using ``obj.append(item)`` or, in batch, using ``obj.extend(list_of_items)``. This is primarily used for list subclasses, but may be used by other - classes as long as they have :meth:`append` and :meth:`extend` methods with - the appropriate signature. (Whether :meth:`append` or :meth:`extend` is + classes as long as they have + :ref:`append and extend methods ` with + the appropriate signature. (Whether :meth:`!append` or :meth:`!extend` is used depends on which pickle protocol version is used as well as the number of items to append, so both must be supported.) @@ -785,8 +794,8 @@ any other code which depends on pickling, then one can create a pickler with a private dispatch table. The global dispatch table managed by the :mod:`copyreg` module is -available as :data:`copyreg.dispatch_table`. Therefore, one may -choose to use a modified copy of :data:`copyreg.dispatch_table` as a +available as :data:`!copyreg.dispatch_table`. Therefore, one may +choose to use a modified copy of :data:`!copyreg.dispatch_table` as a private dispatch table. For example :: @@ -825,12 +834,12 @@ Handling Stateful Objects single: __setstate__() (copy protocol) Here's an example that shows how to modify pickling behavior for a class. -The :class:`TextReader` class opens a text file, and returns the line number and +The :class:`!TextReader` class below opens a text file, and returns the line number and line contents each time its :meth:`!readline` method is called. If a -:class:`TextReader` instance is pickled, all attributes *except* the file object +:class:`!TextReader` instance is pickled, all attributes *except* the file object member are saved. When the instance is unpickled, the file is reopened, and -reading resumes from the last location. The :meth:`__setstate__` and -:meth:`__getstate__` methods are used to implement this behavior. :: +reading resumes from the last location. The :meth:`!__setstate__` and +:meth:`!__getstate__` methods are used to implement this behavior. :: class TextReader: """Print and number lines in a text file.""" @@ -895,8 +904,8 @@ functions and classes. For those cases, it is possible to subclass from the :class:`Pickler` class and implement a :meth:`~Pickler.reducer_override` method. This method can return an -arbitrary reduction tuple (see :meth:`__reduce__`). It can alternatively return -``NotImplemented`` to fallback to the traditional behavior. +arbitrary reduction tuple (see :meth:`~object.__reduce__`). It can alternatively return +:data:`NotImplemented` to fallback to the traditional behavior. If both the :attr:`~Pickler.dispatch_table` and :meth:`~Pickler.reducer_override` are defined, then @@ -963,7 +972,7 @@ provided by pickle protocol 5 and higher. Provider API ^^^^^^^^^^^^ -The large data objects to be pickled must implement a :meth:`__reduce_ex__` +The large data objects to be pickled must implement a :meth:`~object.__reduce_ex__` method specialized for protocol 5 and higher, which returns a :class:`PickleBuffer` instance (instead of e.g. a :class:`bytes` object) for any large data. diff --git a/Doc/library/pickletools.rst b/Doc/library/pickletools.rst index 480f4a6d..e0726059 100644 --- a/Doc/library/pickletools.rst +++ b/Doc/library/pickletools.rst @@ -1,5 +1,5 @@ -:mod:`pickletools` --- Tools for pickle developers -================================================== +:mod:`!pickletools` --- Tools for pickle developers +=================================================== .. module:: pickletools :synopsis: Contains extensive comments about the pickle protocols and @@ -17,6 +17,8 @@ are useful for Python core developers who are working on the :mod:`pickle`; ordinary users of the :mod:`pickle` module probably won't find the :mod:`pickletools` module relevant. +.. _pickletools-cli: + Command line usage ------------------ @@ -51,24 +53,24 @@ Command line options .. program:: pickletools -.. cmdoption:: -a, --annotate +.. option:: -a, --annotate Annotate each line with a short opcode description. -.. cmdoption:: -o, --output= +.. option:: -o, --output= Name of a file where the output should be written. -.. cmdoption:: -l, --indentlevel= +.. option:: -l, --indentlevel= The number of blanks by which to indent a new MARK level. -.. cmdoption:: -m, --memo +.. option:: -m, --memo When multiple objects are disassembled, preserve memo between disassemblies. -.. cmdoption:: -p, --preamble= +.. option:: -p, --preamble= When more than one pickle file are specified, print given preamble before each disassembly. @@ -92,8 +94,8 @@ Programmatic Interface a short description. The value of *annotate* is used as a hint for the column where annotation should start. - .. versionadded:: 3.2 - The *annotate* argument. + .. versionchanged:: 3.2 + Added the *annotate* parameter. .. function:: genops(pickle) diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 471ae0db..d9bcc3a5 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -1,103 +1,17 @@ -:mod:`pipes` --- Interface to shell pipelines -============================================= +:mod:`!pipes` --- Interface to shell pipelines +============================================== .. module:: pipes - :platform: Unix - :synopsis: A Python interface to Unix shell pipelines. + :synopsis: Removed in 3.13. :deprecated: -.. sectionauthor:: Moshe Zadka - -**Source code:** :source:`Lib/pipes.py` - .. deprecated-removed:: 3.11 3.13 - The :mod:`pipes` module is deprecated - (see :pep:`PEP 594 <594#pipes>` for details). - Please use the :mod:`subprocess` module instead. - --------------- - -The :mod:`pipes` module defines a class to abstract the concept of a *pipeline* ---- a sequence of converters from one file to another. - -Because the module uses :program:`/bin/sh` command lines, a POSIX or compatible -shell for :func:`os.system` and :func:`os.popen` is required. - -.. availability:: Unix, not VxWorks. - -The :mod:`pipes` module defines the following class: - - -.. class:: Template() - - An abstraction of a pipeline. - -Example:: - - >>> import pipes - >>> t = pipes.Template() - >>> t.append('tr a-z A-Z', '--') - >>> f = t.open('pipefile', 'w') - >>> f.write('hello world') - >>> f.close() - >>> open('pipefile').read() - 'HELLO WORLD' - - -.. _template-objects: - -Template Objects ----------------- - -Template objects following methods: - - -.. method:: Template.reset() - - Restore a pipeline template to its initial state. - - -.. method:: Template.clone() - - Return a new, equivalent, pipeline template. - - -.. method:: Template.debug(flag) - - If *flag* is true, turn debugging on. Otherwise, turn debugging off. When - debugging is on, commands to be executed are printed, and the shell is given - ``set -x`` command to be more verbose. - - -.. method:: Template.append(cmd, kind) - - Append a new action at the end. The *cmd* variable must be a valid bourne shell - command. The *kind* variable consists of two letters. - - The first letter can be either of ``'-'`` (which means the command reads its - standard input), ``'f'`` (which means the commands reads a given file on the - command line) or ``'.'`` (which means the commands reads no input, and hence - must be first.) - - Similarly, the second letter can be either of ``'-'`` (which means the command - writes to standard output), ``'f'`` (which means the command writes a file on - the command line) or ``'.'`` (which means the command does not write anything, - and hence must be last.) - - -.. method:: Template.prepend(cmd, kind) - - Add a new action at the beginning. See :meth:`append` for explanations of the - arguments. - - -.. method:: Template.open(file, mode) - - Return a file-like object, open to *file*, but read from or written to by the - pipeline. Note that only one of ``'r'``, ``'w'`` may be given. - -.. method:: Template.copy(infile, outfile) +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - Copy *infile* to *outfile* through the pipe. +Applications should use the :mod:`subprocess` module instead. +The last version of Python that provided the :mod:`!pipes` module was +`Python 3.12 `_. diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 891a867d..4a39d53a 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -1,5 +1,5 @@ -:mod:`pkgutil` --- Package extension utility -============================================ +:mod:`!pkgutil` --- Package extension utility +============================================= .. module:: pkgutil :synopsis: Utilities for the import system. @@ -26,7 +26,8 @@ support. __path__ = extend_path(__path__, __name__) For each directory on :data:`sys.path` that has a subdirectory that matches the - package name, add the subdirectory to the package's :attr:`__path__`. This is useful + package name, add the subdirectory to the package's + :attr:`~module.__path__`. This is useful if one wants to distribute different parts of a single logical package as multiple directories. @@ -34,9 +35,9 @@ support. *name* argument. This feature is similar to :file:`\*.pth` files (see the :mod:`site` module for more information), except that it doesn't special-case lines starting with ``import``. A :file:`\*.pkg` file is trusted at face - value: apart from checking for duplicates, all entries found in a - :file:`\*.pkg` file are added to the path, regardless of whether they exist - on the filesystem. (This is a feature.) + value: apart from skipping blank lines and ignoring comments, all entries + found in a :file:`\*.pkg` file are added to the path, regardless of whether + they exist on the filesystem (this is a feature). If the input path is not a list (as is the case for frozen packages) it is returned unchanged. The input path is not modified; an extended copy is diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index ec2a7ebd..1beb3b9e 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -1,5 +1,5 @@ -:mod:`platform` --- Access to underlying platform's identifying data -===================================================================== +:mod:`!platform` --- Access to underlying platform's identifying data +====================================================================== .. module:: platform :synopsis: Retrieves as much platform identifying data as possible. @@ -148,6 +148,9 @@ Cross Platform Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``, ``'Windows'``. An empty string is returned if the value cannot be determined. + On iOS and Android, this returns the user-facing OS name (i.e, ``'iOS``, + ``'iPadOS'`` or ``'Android'``). To obtain the kernel name (``'Darwin'`` or + ``'Linux'``), use :func:`os.uname`. .. function:: system_alias(system, release, version) @@ -161,6 +164,8 @@ Cross Platform Returns the system's release version, e.g. ``'#3 on degas'``. An empty string is returned if the value cannot be determined. + On iOS and Android, this is the user-facing OS version. To obtain the + Darwin or Linux kernel version, use :func:`os.uname`. .. function:: uname() @@ -196,6 +201,10 @@ Java Platform ``(os_name, os_version, os_arch)``. Values which cannot be determined are set to the defaults given as parameters (which all default to ``''``). + .. deprecated-removed:: 3.13 3.15 + It was largely untested, had a confusing API, + and was only useful for Jython support. + Windows Platform ---------------- @@ -210,8 +219,8 @@ Windows Platform default to an empty string). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines - and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers - to the OS version being free of debugging code. It could also state *'Checked'* + and ``'Multiprocessor Free'`` on multi processor machines. The ``'Free'`` refers + to the OS version being free of debugging code. It could also state ``'Checked'`` which means the OS version uses debugging code, i.e. code that checks arguments, ranges, etc. @@ -234,7 +243,6 @@ Windows Platform macOS Platform -------------- - .. function:: mac_ver(release='', versioninfo=('','',''), machine='') Get macOS version information and return it as tuple ``(release, versioninfo, @@ -244,6 +252,24 @@ macOS Platform Entries which cannot be determined are set to ``''``. All tuple entries are strings. +iOS Platform +------------ + +.. function:: ios_ver(system='', release='', model='', is_simulator=False) + + Get iOS version information and return it as a + :func:`~collections.namedtuple` with the following attributes: + + * ``system`` is the OS name; either ``'iOS'`` or ``'iPadOS'``. + * ``release`` is the iOS version number as a string (e.g., ``'17.2'``). + * ``model`` is the device model identifier; this will be a string like + ``'iPhone13,2'`` for a physical device, or ``'iPhone'`` on a simulator. + * ``is_simulator`` is a boolean describing if the app is running on a + simulator or a physical device. + + Entries which cannot be determined are set to the defaults given as + parameters. + Unix Platforms -------------- @@ -297,3 +323,39 @@ Linux Platforms return ids .. versionadded:: 3.10 + + +Android Platform +---------------- + +.. function:: android_ver(release="", api_level=0, manufacturer="", \ + model="", device="", is_emulator=False) + + Get Android device information. Returns a :func:`~collections.namedtuple` + with the following attributes. Values which cannot be determined are set to + the defaults given as parameters. + + * ``release`` - Android version, as a string (e.g. ``"14"``). + + * ``api_level`` - API level of the running device, as an integer (e.g. ``34`` + for Android 14). To get the API level which Python was built against, see + :func:`sys.getandroidapilevel`. + + * ``manufacturer`` - `Manufacturer name + `__. + + * ``model`` - `Model name + `__ – + typically the marketing name or model number. + + * ``device`` - `Device name + `__ – + typically the model number or a codename. + + * ``is_emulator`` - ``True`` if the device is an emulator; ``False`` if it's + a physical device. + + Google maintains a `list of known model and device names + `__. + + .. versionadded:: 3.13 diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 732ef353..2906ebe7 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -1,5 +1,5 @@ -:mod:`plistlib` --- Generate and parse Apple ``.plist`` files -============================================================= +:mod:`!plistlib` --- Generate and parse Apple ``.plist`` files +============================================================== .. module:: plistlib :synopsis: Generate and parse Apple plist files. @@ -27,7 +27,7 @@ top level object is a dictionary. To write out and to parse a plist file, use the :func:`dump` and :func:`load` functions. -To work with plist data in bytes objects, use :func:`dumps` +To work with plist data in bytes or string objects, use :func:`dumps` and :func:`loads`. Values can be strings, integers, floats, booleans, tuples, lists, dictionaries @@ -52,7 +52,7 @@ or :class:`datetime.datetime` objects. This module defines the following functions: -.. function:: load(fp, *, fmt=None, dict_type=dict) +.. function:: load(fp, *, fmt=None, dict_type=dict, aware_datetime=False) Read a plist file. *fp* should be a readable and binary file object. Return the unpacked root object (which usually is a @@ -69,6 +69,10 @@ This module defines the following functions: The *dict_type* is the type used for dictionaries that are read from the plist file. + When *aware_datetime* is true, fields with type ``datetime.datetime`` will + be created as :ref:`aware object `, with + :attr:`!tzinfo` as :attr:`datetime.UTC`. + XML data for the :data:`FMT_XML` format is parsed using the Expat parser from :mod:`xml.parsers.expat` -- see its documentation for possible exceptions on ill-formed XML. Unknown elements will simply be ignored @@ -79,16 +83,21 @@ This module defines the following functions: .. versionadded:: 3.4 + .. versionchanged:: 3.13 + The keyword-only parameter *aware_datetime* has been added. + -.. function:: loads(data, *, fmt=None, dict_type=dict) +.. function:: loads(data, *, fmt=None, dict_type=dict, aware_datetime=False) - Load a plist from a bytes object. See :func:`load` for an explanation of - the keyword arguments. + Load a plist from a bytes or string object. See :func:`load` for an + explanation of the keyword arguments. .. versionadded:: 3.4 + .. versionchanged:: 3.13 + *data* can be a string when *fmt* equals :data:`FMT_XML`. -.. function:: dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False) Write *value* to a plist file. *Fp* should be a writable, binary file object. @@ -107,6 +116,10 @@ This module defines the following functions: When *skipkeys* is false (the default) the function raises :exc:`TypeError` when a key of a dictionary is not a string, otherwise such keys are skipped. + When *aware_datetime* is true and any field with type ``datetime.datetime`` + is set as an :ref:`aware object `, it will convert to + UTC timezone before writing it. + A :exc:`TypeError` will be raised if the object is of an unsupported type or a container that contains objects of unsupported types. @@ -115,8 +128,11 @@ This module defines the following functions: .. versionadded:: 3.4 + .. versionchanged:: 3.13 + The keyword-only parameter *aware_datetime* has been added. + -.. function:: dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False) Return *value* as a plist-formatted bytes object. See the documentation for :func:`dump` for an explanation of the keyword diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 943eb21f..23f20b00 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -1,5 +1,5 @@ -:mod:`poplib` --- POP3 protocol client -====================================== +:mod:`!poplib` --- POP3 protocol client +======================================= .. module:: poplib :synopsis: POP3 protocol client (requires sockets). diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst index 0413f9d0..14ab3e91 100644 --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -1,5 +1,5 @@ -:mod:`posix` --- The most common POSIX system calls -=================================================== +:mod:`!posix` --- The most common POSIX system calls +==================================================== .. module:: posix :platform: Unix @@ -11,6 +11,8 @@ This module provides access to operating system functionality that is standardized by the C Standard and the POSIX standard (a thinly disguised Unix interface). +.. availability:: Unix. + .. index:: pair: module; os **Do not import this module directly.** Instead, import the module :mod:`os`, diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index e883acd6..2985f31b 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -1,5 +1,5 @@ -:mod:`pprint` --- Data pretty printer -===================================== +:mod:`!pprint` --- Data pretty printer +====================================== .. module:: pprint :synopsis: Data pretty printer. @@ -19,9 +19,8 @@ such as files, sockets or classes are included, as well as many other objects which are not representable as Python literals. The formatted representation keeps objects on a single line if it can, and -breaks them onto multiple lines if they don't fit within the allowed width. -Construct :class:`PrettyPrinter` objects explicitly if you need to adjust the -width constraint. +breaks them onto multiple lines if they don't fit within the allowed width, +adjustable by the *width* parameter defaulting to 80 characters. Dictionaries are sorted by key before the display is computed. @@ -31,86 +30,82 @@ Dictionaries are sorted by key before the display is computed. .. versionchanged:: 3.10 Added support for pretty-printing :class:`dataclasses.dataclass`. -The :mod:`pprint` module defines one class: +.. _pprint-functions: + +Functions +--------- + +.. function:: pp(object, stream=None, indent=1, width=80, depth=None, *, \ + compact=False, sort_dicts=False, underscore_numbers=False) + + Prints the formatted representation of *object*, followed by a newline. + This function may be used in the interactive interpreter + instead of the :func:`print` function for inspecting values. + Tip: you can reassign ``print = pprint.pp`` for use within a scope. + + :param object: + The object to be printed. + + :param stream: + A file-like object to which the output will be written + by calling its :meth:`!write` method. + If ``None`` (the default), :data:`sys.stdout` is used. + :type stream: :term:`file-like object` | None + + :param int indent: + The amount of indentation added for each nesting level. + + :param int width: + The desired maximum number of characters per line in the output. + If a structure cannot be formatted within the width constraint, + a best effort will be made. + + :param depth: + The number of nesting levels which may be printed. + If the data structure being printed is too deep, + the next contained level is replaced by ``...``. + If ``None`` (the default), there is no constraint + on the depth of the objects being formatted. + :type depth: int | None + + :param bool compact: + Control the way long :term:`sequences ` are formatted. + If ``False`` (the default), + each item of a sequence will be formatted on a separate line, + otherwise as many items as will fit within the *width* + will be formatted on each output line. + + :param bool sort_dicts: + If ``True``, dictionaries will be formatted with + their keys sorted, otherwise + they will be displayed in insertion order (the default). + + :param bool underscore_numbers: + If ``True``, + integers will be formatted with the ``_`` character for a thousands separator, + otherwise underscores are not displayed (the default). -.. First the implementation class: - - -.. index:: single: ...; placeholder - -.. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ - compact=False, sort_dicts=True, underscore_numbers=False) - - Construct a :class:`PrettyPrinter` instance. This constructor understands - several keyword parameters. - - *stream* (default ``sys.stdout``) is a :term:`file-like object` to - which the output will be written by calling its :meth:`!write` method. - If both *stream* and ``sys.stdout`` are ``None``, then - :meth:`~PrettyPrinter.pprint` silently returns. - - Other values configure the manner in which nesting of complex data - structures is displayed. - - *indent* (default 1) specifies the amount of indentation added for - each nesting level. - - *depth* controls the number of nesting levels which may be printed; if - the data structure being printed is too deep, the next contained level - is replaced by ``...``. By default, there is no constraint on the - depth of the objects being formatted. - - *width* (default 80) specifies the desired maximum number of characters per - line in the output. If a structure cannot be formatted within the width - constraint, a best effort will be made. - - *compact* impacts the way that long sequences (lists, tuples, sets, etc) - are formatted. If *compact* is false (the default) then each item of a - sequence will be formatted on a separate line. If *compact* is true, as - many items as will fit within the *width* will be formatted on each output - line. - - If *sort_dicts* is true (the default), dictionaries will be formatted with - their keys sorted, otherwise they will display in insertion order. + >>> import pprint + >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] + >>> stuff.insert(0, stuff) + >>> pprint.pp(stuff) + [, + 'spam', + 'eggs', + 'lumberjack', + 'knights', + 'ni'] - If *underscore_numbers* is true, integers will be formatted with the - ``_`` character for a thousands separator, otherwise underscores are not - displayed (the default). + .. versionadded:: 3.8 - .. versionchanged:: 3.4 - Added the *compact* parameter. - .. versionchanged:: 3.8 - Added the *sort_dicts* parameter. +.. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ + compact=False, sort_dicts=True, underscore_numbers=False) - .. versionchanged:: 3.10 - Added the *underscore_numbers* parameter. + Alias for :func:`~pprint.pp` with *sort_dicts* set to ``True`` by default, + which would automatically sort the dictionaries' keys, + you might want to use :func:`~pprint.pp` instead where it is ``False`` by default. - .. versionchanged:: 3.11 - No longer attempts to write to ``sys.stdout`` if it is ``None``. - - >>> import pprint - >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] - >>> stuff.insert(0, stuff[:]) - >>> pp = pprint.PrettyPrinter(indent=4) - >>> pp.pprint(stuff) - [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], - 'spam', - 'eggs', - 'lumberjack', - 'knights', - 'ni'] - >>> pp = pprint.PrettyPrinter(width=41, compact=True) - >>> pp.pprint(stuff) - [['spam', 'eggs', 'lumberjack', - 'knights', 'ni'], - 'spam', 'eggs', 'lumberjack', 'knights', - 'ni'] - >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', - ... ('parrot', ('fresh fruit',)))))))) - >>> pp = pprint.PrettyPrinter(depth=6) - >>> pp.pprint(tup) - ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...))))))) .. function:: pformat(object, indent=1, width=80, depth=None, *, \ compact=False, sort_dicts=True, underscore_numbers=False) @@ -118,44 +113,8 @@ The :mod:`pprint` module defines one class: Return the formatted representation of *object* as a string. *indent*, *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* are passed to the :class:`PrettyPrinter` constructor as formatting parameters - and their meanings are as described in its documentation above. - + and their meanings are as described in the documentation above. -.. function:: pp(object, *args, sort_dicts=False, **kwargs) - - Prints the formatted representation of *object* followed by a newline. - If *sort_dicts* is false (the default), dictionaries will be displayed with - their keys in insertion order, otherwise the dict keys will be sorted. - *args* and *kwargs* will be passed to :func:`pprint` as formatting - parameters. - - .. versionadded:: 3.8 - - -.. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ - compact=False, sort_dicts=True, underscore_numbers=False) - - Prints the formatted representation of *object* on *stream*, followed by a - newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used - in the interactive interpreter instead of the :func:`print` function for - inspecting values (you can even reassign ``print = pprint.pprint`` for use - within a scope). - - The configuration parameters *stream*, *indent*, *width*, *depth*, - *compact*, *sort_dicts* and *underscore_numbers* are passed to the - :class:`PrettyPrinter` constructor and their meanings are as - described in its documentation above. - - >>> import pprint - >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] - >>> stuff.insert(0, stuff) - >>> pprint.pprint(stuff) - [, - 'spam', - 'eggs', - 'lumberjack', - 'knights', - 'ni'] .. function:: isreadable(object) @@ -176,8 +135,6 @@ The :mod:`pprint` module defines one class: :exc:`RecursionError` if it fails to detect a recursive object. -One more support function is also defined: - .. function:: saferepr(object) Return a string representation of *object*, protected against recursion in @@ -190,12 +147,58 @@ One more support function is also defined: >>> pprint.saferepr(stuff) "[, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']" - .. _prettyprinter-objects: PrettyPrinter Objects --------------------- +.. index:: single: ...; placeholder + +.. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ + compact=False, sort_dicts=True, underscore_numbers=False) + + Construct a :class:`PrettyPrinter` instance. + + Arguments have the same meaning as for :func:`~pprint.pp`. + Note that they are in a different order, and that *sort_dicts* defaults to ``True``. + + >>> import pprint + >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] + >>> stuff.insert(0, stuff[:]) + >>> pp = pprint.PrettyPrinter(indent=4) + >>> pp.pprint(stuff) + [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], + 'spam', + 'eggs', + 'lumberjack', + 'knights', + 'ni'] + >>> pp = pprint.PrettyPrinter(width=41, compact=True) + >>> pp.pprint(stuff) + [['spam', 'eggs', 'lumberjack', + 'knights', 'ni'], + 'spam', 'eggs', 'lumberjack', 'knights', + 'ni'] + >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', + ... ('parrot', ('fresh fruit',)))))))) + >>> pp = pprint.PrettyPrinter(depth=6) + >>> pp.pprint(tup) + ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...))))))) + + + .. versionchanged:: 3.4 + Added the *compact* parameter. + + .. versionchanged:: 3.8 + Added the *sort_dicts* parameter. + + .. versionchanged:: 3.10 + Added the *underscore_numbers* parameter. + + .. versionchanged:: 3.11 + No longer attempts to write to :data:`!sys.stdout` if it is ``None``. + + :class:`PrettyPrinter` instances have the following methods: @@ -258,18 +261,18 @@ are converted to strings. The default implementation uses the internals of the Example ------- -To demonstrate several uses of the :func:`pprint` function and its parameters, +To demonstrate several uses of the :func:`~pprint.pp` function and its parameters, let's fetch information about a project from `PyPI `_:: >>> import json >>> import pprint >>> from urllib.request import urlopen - >>> with urlopen('https://pypi.org/pypi/sampleproject/json') as resp: + >>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp: ... project_info = json.load(resp)['info'] -In its basic form, :func:`pprint` shows the whole object:: +In its basic form, :func:`~pprint.pp` shows the whole object:: - >>> pprint.pprint(project_info) + >>> pprint.pp(project_info) {'author': 'The Python Packaging Authority', 'author_email': 'pypa-dev@googlegroups.com', 'bugtrack_url': None, @@ -326,7 +329,7 @@ In its basic form, :func:`pprint` shows the whole object:: The result can be limited to a certain *depth* (ellipsis is used for deeper contents):: - >>> pprint.pprint(project_info, depth=1) + >>> pprint.pp(project_info, depth=1) {'author': 'The Python Packaging Authority', 'author_email': 'pypa-dev@googlegroups.com', 'bugtrack_url': None, @@ -372,7 +375,7 @@ contents):: Additionally, maximum character *width* can be suggested. If a long object cannot be split, the specified width will be exceeded:: - >>> pprint.pprint(project_info, depth=1, width=60) + >>> pprint.pp(project_info, depth=1, width=60) {'author': 'The Python Packaging Authority', 'author_email': 'pypa-dev@googlegroups.com', 'bugtrack_url': None, diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 723f9271..3334833e 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -82,8 +82,8 @@ the following:: The first line indicates that 214 calls were monitored. Of those calls, 207 were :dfn:`primitive`, meaning that the call was not induced via recursion. The -next line: ``Ordered by: cumulative time``, indicates that the text string in the -far right column was used to sort the output. The column headings include: +next line: ``Ordered by: cumulative time`` indicates the output is sorted +by the ``cumtime`` values. The column headings include: ncalls for the number of calls. @@ -121,6 +121,8 @@ results to a file by specifying a filename to the :func:`run` function:: The :class:`pstats.Stats` class reads profile results from a file and formats them in various ways. +.. _profile-cli: + The files :mod:`cProfile` and :mod:`profile` can also be invoked as a script to profile another script. For example:: @@ -133,11 +135,11 @@ the output by. This only applies when ``-o`` is not supplied. ``-m`` specifies that a module is being profiled instead of a script. - .. versionadded:: 3.7 - Added the ``-m`` option to :mod:`cProfile`. +.. versionadded:: 3.7 + Added the ``-m`` option to :mod:`cProfile`. - .. versionadded:: 3.8 - Added the ``-m`` option to :mod:`profile`. +.. versionadded:: 3.8 + Added the ``-m`` option to :mod:`profile`. The :mod:`pstats` module's :class:`~pstats.Stats` class has a variety of methods for manipulating and printing the data saved into a profile results file:: @@ -232,7 +234,7 @@ functions: .. function:: runctx(command, globals, locals, filename=None, sort=-1) This function is similar to :func:`run`, with added arguments to supply the - globals and locals dictionaries for the *command* string. This routine + globals and locals mappings for the *command* string. This routine executes:: exec(command, globals, locals) @@ -297,6 +299,13 @@ functions: Create a :class:`~pstats.Stats` object based on the current profile and print the results to stdout. + The *sort* parameter specifies the sorting order of the displayed + statistics. It accepts a single key or a tuple of keys to enable + multi-level sorting, as in :func:`Stats.sort_stats `. + + .. versionadded:: 3.13 + :meth:`~Profile.print_stats` now accepts a tuple of keys. + .. method:: dump_stats(filename) Write the results of the current profile to *filename*. @@ -673,7 +682,7 @@ you are using :class:`profile.Profile` or :class:`cProfile.Profile`, that you choose (see :ref:`profile-calibration`). For most machines, a timer that returns a lone integer value will provide the best results in terms of low overhead during profiling. (:func:`os.times` is *pretty* bad, as it - returns a tuple of floating point values). If you want to substitute a + returns a tuple of floating-point values). If you want to substitute a better timer in the cleanest fashion, derive a class and hardwire a replacement dispatch method that best handles your timer call, along with the appropriate calibration constant. @@ -690,7 +699,7 @@ you are using :class:`profile.Profile` or :class:`cProfile.Profile`, As the :class:`cProfile.Profile` class cannot be calibrated, custom timer functions should be used with care and should be as fast as possible. For the best results with a custom timer, it might be necessary to hard-code it - in the C source of the internal :mod:`_lsprof` module. + in the C source of the internal :mod:`!_lsprof` module. Python 3.3 adds several new functions in :mod:`time` that can be used to make precise measurements of process or wall-clock time. For example, see diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index ad4981c9..1a44bb13 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -1,5 +1,5 @@ -:mod:`pty` --- Pseudo-terminal utilities -======================================== +:mod:`!pty` --- Pseudo-terminal utilities +========================================= .. module:: pty :platform: Unix @@ -16,6 +16,8 @@ The :mod:`pty` module defines operations for handling the pseudo-terminal concept: starting another process and being able to write to and read from its controlling terminal programmatically. +.. availability:: Unix. + Pseudo-terminal handling is highly platform dependent. This code is mainly tested on Linux, FreeBSD, and macOS (it is supposed to work on other POSIX platforms but it's not been thoroughly tested). @@ -31,6 +33,9 @@ The :mod:`pty` module defines the following functions: file descriptor connected to the child's controlling terminal (and also to the child's standard input and output). + .. warning:: On macOS the use of this function is unsafe when mixed with using + higher-level system APIs, and that includes using :mod:`urllib.request`. + .. function:: openpty() diff --git a/Doc/library/pwd.rst b/Doc/library/pwd.rst index 7cafc66f..e1ff3291 100644 --- a/Doc/library/pwd.rst +++ b/Doc/library/pwd.rst @@ -1,5 +1,5 @@ -:mod:`pwd` --- The password database -==================================== +:mod:`!pwd` --- The password database +===================================== .. module:: pwd :platform: Unix @@ -10,7 +10,7 @@ This module provides access to the Unix user account and password database. It is available on all Unix versions. -.. include:: ../includes/wasm-notavail.rst +.. availability:: Unix, not WASI, not iOS. Password database entries are reported as a tuple-like object, whose attributes correspond to the members of the ``passwd`` structure (Attribute field below, @@ -39,16 +39,13 @@ raised if the entry asked for cannot be found. .. note:: - .. index:: pair: module; crypt - In traditional Unix the field ``pw_passwd`` usually contains a password - encrypted with a DES derived algorithm (see module :mod:`crypt`). However most + encrypted with a DES derived algorithm. However most modern unices use a so-called *shadow password* system. On those unices the *pw_passwd* field only contains an asterisk (``'*'``) or the letter ``'x'`` where the encrypted password is stored in a file :file:`/etc/shadow` which is not world readable. Whether the *pw_passwd* field contains anything useful is - system-dependent. If available, the :mod:`spwd` module should be used where - access to the encrypted password is required. + system-dependent. It defines the following items: @@ -72,7 +69,3 @@ It defines the following items: Module :mod:`grp` An interface to the group database, similar to this. - - Module :mod:`spwd` - An interface to the shadow password database, similar to this. - diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index 69b93a3b..75aa739d 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -1,5 +1,5 @@ -:mod:`py_compile` --- Compile Python source files -================================================= +:mod:`!py_compile` --- Compile Python source files +================================================== .. module:: py_compile :synopsis: Generate byte-code files from Python source files. @@ -96,7 +96,7 @@ byte-code cache files in the directory containing the source code. .. class:: PycInvalidationMode - A enumeration of possible methods the interpreter can use to determine + An enumeration of possible methods the interpreter can use to determine whether a bytecode file is up to date with a source file. The ``.pyc`` file indicates the desired invalidation mode in its header. See :ref:`pyc-invalidation` for more information on how Python invalidates @@ -125,6 +125,7 @@ byte-code cache files in the directory containing the source code. This option is useful when the ``.pycs`` are kept up to date by some system external to Python like a build system. +.. _py_compile-cli: Command-Line Interface ---------------------- @@ -138,13 +139,13 @@ not be compiled. .. program:: python -m py_compile -.. cmdoption:: ... - - +.. option:: ... + - Positional arguments are files to compile. If ``-`` is the only parameter, the list of files is taken from standard input. -.. cmdoption:: -q, --quiet +.. option:: -q, --quiet Suppress errors output. diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index 1c40ba48..5efb11d8 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -1,5 +1,5 @@ -:mod:`pyclbr` --- Python module browser support -=============================================== +:mod:`!pyclbr` --- Python module browser support +================================================ .. module:: pyclbr :synopsis: Supports information extraction for a Python module browser. @@ -58,106 +58,115 @@ of these classes. Function Objects ---------------- -Class :class:`Function` instances describe functions defined by def -statements. They have the following attributes: +.. class:: Function -.. attribute:: Function.file + Class :class:`!Function` instances describe functions defined by def + statements. They have the following attributes: - Name of the file in which the function is defined. + .. attribute:: file -.. attribute:: Function.module + Name of the file in which the function is defined. - The name of the module defining the function described. + .. attribute:: module -.. attribute:: Function.name + The name of the module defining the function described. - The name of the function. + .. attribute:: name -.. attribute:: Function.lineno + The name of the function. - The line number in the file where the definition starts. + .. attribute:: lineno -.. attribute:: Function.parent + The line number in the file where the definition starts. - For top-level functions, None. For nested functions, the parent. - .. versionadded:: 3.7 + .. attribute:: parent + For top-level functions, ``None``. For nested functions, the parent. -.. attribute:: Function.children + .. versionadded:: 3.7 - A dictionary mapping names to descriptors for nested functions and - classes. - .. versionadded:: 3.7 + .. attribute:: children + A :class:`dictionary ` mapping names to descriptors for nested functions and + classes. -.. attribute:: Function.is_async + .. versionadded:: 3.7 - ``True`` for functions that are defined with the ``async`` prefix, ``False`` otherwise. - .. versionadded:: 3.10 + .. attribute:: is_async + + ``True`` for functions that are defined with the + :keyword:`async ` prefix, ``False`` otherwise. + + .. versionadded:: 3.10 .. _pyclbr-class-objects: Class Objects ------------- -Class :class:`Class` instances describe classes defined by class -statements. They have the same attributes as Functions and two more. + +.. class:: Class + + Class :class:`!Class` instances describe classes defined by class + statements. They have the same attributes as :class:`Functions ` + and two more. -.. attribute:: Class.file + .. attribute:: file - Name of the file in which the class is defined. + Name of the file in which the class is defined. -.. attribute:: Class.module + .. attribute:: module - The name of the module defining the class described. + The name of the module defining the class described. -.. attribute:: Class.name + .. attribute:: name - The name of the class. + The name of the class. -.. attribute:: Class.lineno + .. attribute:: lineno - The line number in the file where the definition starts. + The line number in the file where the definition starts. -.. attribute:: Class.parent + .. attribute:: parent - For top-level classes, None. For nested classes, the parent. + For top-level classes, ``None``. For nested classes, the parent. - .. versionadded:: 3.7 + .. versionadded:: 3.7 -.. attribute:: Class.children + .. attribute:: children - A dictionary mapping names to descriptors for nested functions and - classes. + A dictionary mapping names to descriptors for nested functions and + classes. - .. versionadded:: 3.7 + .. versionadded:: 3.7 -.. attribute:: Class.super + .. attribute:: super - A list of :class:`Class` objects which describe the immediate base - classes of the class being described. Classes which are named as - superclasses but which are not discoverable by :func:`readmodule_ex` - are listed as a string with the class name instead of as - :class:`Class` objects. + A list of :class:`!Class` objects which describe the immediate base + classes of the class being described. Classes which are named as + superclasses but which are not discoverable by :func:`readmodule_ex` + are listed as a string with the class name instead of as + :class:`!Class` objects. -.. attribute:: Class.methods + .. attribute:: methods - A dictionary mapping method names to line numbers. This can be - derived from the newer children dictionary, but remains for - back-compatibility. + A :class:`dictionary ` mapping method names to line numbers. + This can be derived from the newer :attr:`children` dictionary, + but remains for + back-compatibility. diff --git a/Doc/library/pydoc.rst b/Doc/library/pydoc.rst index 03e0915b..e8f153ee 100644 --- a/Doc/library/pydoc.rst +++ b/Doc/library/pydoc.rst @@ -1,5 +1,5 @@ -:mod:`pydoc` --- Documentation generator and online help system -=============================================================== +:mod:`!pydoc` --- Documentation generator and online help system +================================================================ .. module:: pydoc :synopsis: Documentation generator and online help system. @@ -16,19 +16,19 @@ -------------- -The :mod:`pydoc` module automatically generates documentation from Python +The :mod:`!pydoc` module automatically generates documentation from Python modules. The documentation can be presented as pages of text on the console, served to a web browser, or saved to HTML files. For modules, classes, functions and methods, the displayed documentation is -derived from the docstring (i.e. the :attr:`__doc__` attribute) of the object, +derived from the docstring (i.e. the :attr:`~definition.__doc__` attribute) of the object, and recursively of its documentable members. If there is no docstring, -:mod:`pydoc` tries to obtain a description from the block of comment lines just +:mod:`!pydoc` tries to obtain a description from the block of comment lines just above the definition of the class, function or method in the source file, or at the top of the module (see :func:`inspect.getcomments`). The built-in function :func:`help` invokes the online help system in the -interactive interpreter, which uses :mod:`pydoc` to generate its documentation +interactive interpreter, which uses :mod:`!pydoc` to generate its documentation as text on the console. The same text documentation can also be viewed from outside the Python interpreter by running :program:`pydoc` as a script at the operating system's command prompt. For example, running :: @@ -46,14 +46,15 @@ produced for that file. .. note:: - In order to find objects and their documentation, :mod:`pydoc` imports the + In order to find objects and their documentation, :mod:`!pydoc` imports the module(s) to be documented. Therefore, any code on module level will be executed on that occasion. Use an ``if __name__ == '__main__':`` guard to only execute code when a file is invoked as a script and not just imported. When printing output to the console, :program:`pydoc` attempts to paginate the -output for easier reading. If the :envvar:`PAGER` environment variable is set, -:program:`pydoc` will use its value as a pagination program. +output for easier reading. If either the :envvar:`MANPAGER` or the +:envvar:`PAGER` environment variable is set, :program:`pydoc` will use its +value as a pagination program. When both are set, :envvar:`MANPAGER` is used. Specifying a ``-w`` flag before the argument will cause HTML documentation to be written out to a file in the current directory, instead of displaying text @@ -90,7 +91,7 @@ Python interpreter and typed ``import spam``. Module docs for core modules are assumed to reside in ``https://docs.python.org/X.Y/library/`` where ``X`` and ``Y`` are the major and minor version numbers of the Python interpreter. This can -be overridden by setting the :envvar:`PYTHONDOCS` environment variable +be overridden by setting the :envvar:`!PYTHONDOCS` environment variable to a different URL or to a local directory containing the Library Reference Manual pages. @@ -101,7 +102,7 @@ Reference Manual pages. The ``-g`` command line option was removed. .. versionchanged:: 3.4 - :mod:`pydoc` now uses :func:`inspect.signature` rather than + :mod:`!pydoc` now uses :func:`inspect.signature` rather than :func:`inspect.getfullargspec` to extract signature information from callables. diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 935e8724..c0e9999f 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -1,5 +1,5 @@ -:mod:`xml.parsers.expat` --- Fast XML parsing using Expat -========================================================= +:mod:`!xml.parsers.expat` --- Fast XML parsing using Expat +========================================================== .. module:: xml.parsers.expat :synopsis: An interface to the Expat non-validating XML parser. @@ -196,6 +196,42 @@ XMLParser Objects :exc:`ExpatError` to be raised with the :attr:`code` attribute set to ``errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]``. +.. method:: xmlparser.SetReparseDeferralEnabled(enabled) + + .. warning:: + + Calling ``SetReparseDeferralEnabled(False)`` has security implications, + as detailed below; please make sure to understand these consequences + prior to using the ``SetReparseDeferralEnabled`` method. + + Expat 2.6.0 introduced a security mechanism called "reparse deferral" + where instead of causing denial of service through quadratic runtime + from reparsing large tokens, reparsing of unfinished tokens is now delayed + by default until a sufficient amount of input is reached. + Due to this delay, registered handlers may — depending of the sizing of + input chunks pushed to Expat — no longer be called right after pushing new + input to the parser. Where immediate feedback and taking over responsibility + of protecting against denial of service from large tokens are both wanted, + calling ``SetReparseDeferralEnabled(False)`` disables reparse deferral + for the current Expat parser instance, temporarily or altogether. + Calling ``SetReparseDeferralEnabled(True)`` allows re-enabling reparse + deferral. + + Note that :meth:`SetReparseDeferralEnabled` has been backported to some + prior releases of CPython as a security fix. Check for availability of + :meth:`SetReparseDeferralEnabled` using :func:`hasattr` if used in code + running across a variety of Python versions. + + .. versionadded:: 3.13 + +.. method:: xmlparser.GetReparseDeferralEnabled() + + Returns whether reparse deferral is currently enabled for the given + Expat parser instance. + + .. versionadded:: 3.13 + + :class:`xmlparser` objects have the following attributes: @@ -214,7 +250,8 @@ XMLParser Objects :meth:`CharacterDataHandler` callback whenever possible. This can improve performance substantially since Expat normally breaks character data into chunks at every line ending. This attribute is false by default, and may be changed at - any time. + any time. Note that when it is false, data that does not contain newlines + may be chunked too. .. attribute:: xmlparser.buffer_used @@ -372,7 +409,10 @@ otherwise stated. marked content, and ignorable whitespace. Applications which must distinguish these cases can use the :attr:`StartCdataSectionHandler`, :attr:`EndCdataSectionHandler`, and :attr:`ElementDeclHandler` callbacks to - collect the required information. + collect the required information. Note that the character data may be + chunked even if it is short and so you may receive more than one call to + :meth:`CharacterDataHandler`. Set the :attr:`buffer_text` instance attribute + to ``True`` to avoid that. .. method:: xmlparser.UnparsedEntityDeclHandler(entityName, base, systemId, publicId, notationName) diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index b2b787c5..fbbebcf4 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -1,5 +1,5 @@ -:mod:`queue` --- A synchronized queue class -=========================================== +:mod:`!queue` --- A synchronized queue class +============================================ .. module:: queue :synopsis: A synchronized queue class. @@ -93,6 +93,14 @@ The :mod:`queue` module defines the following classes and exceptions: on a :class:`Queue` object which is full. +.. exception:: ShutDown + + Exception raised when :meth:`~Queue.put` or :meth:`~Queue.get` is called on + a :class:`Queue` object which has been shut down. + + .. versionadded:: 3.13 + + .. _queueobjects: Queue Objects @@ -135,6 +143,8 @@ provide the public methods described below. immediately available, else raise the :exc:`Full` exception (*timeout* is ignored in that case). + Raises :exc:`ShutDown` if the queue has been shut down. + .. method:: Queue.put_nowait(item) @@ -155,6 +165,9 @@ provide the public methods described below. an uninterruptible wait on an underlying lock. This means that no exceptions can occur, and in particular a SIGINT will not trigger a :exc:`KeyboardInterrupt`. + Raises :exc:`ShutDown` if the queue has been shut down and is empty, or if + the queue has been shut down immediately. + .. method:: Queue.get_nowait() @@ -174,6 +187,9 @@ fully processed by daemon consumer threads. processed (meaning that a :meth:`task_done` call was received for every item that had been :meth:`put` into the queue). + ``shutdown(immediate=True)`` calls :meth:`task_done` for each remaining item + in the queue. + Raises a :exc:`ValueError` if called more times than there were items placed in the queue. @@ -214,6 +230,29 @@ Example of how to wait for enqueued tasks to be completed:: print('All work completed') +Terminating queues +^^^^^^^^^^^^^^^^^^ + +:class:`Queue` objects can be made to prevent further interaction by shutting +them down. + +.. method:: Queue.shutdown(immediate=False) + + Shut down the queue, making :meth:`~Queue.get` and :meth:`~Queue.put` raise + :exc:`ShutDown`. + + By default, :meth:`~Queue.get` on a shut down queue will only raise once the + queue is empty. Set *immediate* to true to make :meth:`~Queue.get` raise + immediately instead. + + All blocked callers of :meth:`~Queue.put` and :meth:`~Queue.get` will be + unblocked. If *immediate* is true, a task will be marked as done for each + remaining item in the queue, which may unblock callers of + :meth:`~Queue.join`. + + .. versionadded:: 3.13 + + SimpleQueue Objects ------------------- diff --git a/Doc/library/quopri.rst b/Doc/library/quopri.rst index 86717c00..977cb08d 100644 --- a/Doc/library/quopri.rst +++ b/Doc/library/quopri.rst @@ -1,5 +1,5 @@ -:mod:`quopri` --- Encode and decode MIME quoted-printable data -============================================================== +:mod:`!quopri` --- Encode and decode MIME quoted-printable data +=============================================================== .. module:: quopri :synopsis: Encode and decode files using the MIME quoted-printable encoding. diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 76ae97a8..ef0cfb0e 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -1,5 +1,5 @@ -:mod:`random` --- Generate pseudo-random numbers -================================================ +:mod:`!random` --- Generate pseudo-random numbers +================================================= .. module:: random :synopsis: Generate pseudo-random numbers with various common distributions. @@ -34,10 +34,8 @@ instance of the :class:`random.Random` class. You can instantiate your own instances of :class:`Random` to get generators that don't share state. Class :class:`Random` can also be subclassed if you want to use a different -basic generator of your own devising: in that case, override the :meth:`~Random.random`, -:meth:`~Random.seed`, :meth:`~Random.getstate`, and :meth:`~Random.setstate` methods. -Optionally, a new generator can supply a :meth:`~Random.getrandbits` method --- this -allows :meth:`randrange` to produce selections over an arbitrarily large range. +basic generator of your own devising: see the documentation on that class for +more details. The :mod:`random` module also provides the :class:`SystemRandom` class which uses the system function :func:`os.urandom` to generate random numbers @@ -57,10 +55,16 @@ from sources provided by the operating system. `Complementary-Multiply-with-Carry recipe - `_ for a compatible alternative + `_ for a compatible alternative random number generator with a long period and comparatively simple update operations. +.. note:: + The global random number generator and instances of :class:`Random` are thread-safe. + However, in the free-threaded build, concurrent calls to the global generator or + to the same instance of :class:`Random` may encounter contention and poor performance. + Consider using separate instances of :class:`Random` per thread instead. + Bookkeeping functions --------------------- @@ -88,7 +92,7 @@ Bookkeeping functions .. versionchanged:: 3.11 The *seed* must be one of the following types: - *NoneType*, :class:`int`, :class:`float`, :class:`str`, + ``None``, :class:`int`, :class:`float`, :class:`str`, :class:`bytes`, or :class:`bytearray`. .. function:: getstate() @@ -196,8 +200,8 @@ Functions for sequences For a given seed, the :func:`choices` function with equal weighting typically produces a different sequence than repeated calls to - :func:`choice`. The algorithm used by :func:`choices` uses floating - point arithmetic for internal consistency and speed. The algorithm used + :func:`choice`. The algorithm used by :func:`choices` uses floating-point + arithmetic for internal consistency and speed. The algorithm used by :func:`choice` defaults to integer arithmetic with repeated selections to avoid small biases from round-off error. @@ -220,8 +224,8 @@ Functions for sequences generated. For example, a sequence of length 2080 is the largest that can fit within the period of the Mersenne Twister random number generator. - .. deprecated-removed:: 3.9 3.11 - The optional parameter *random*. + .. versionchanged:: 3.11 + Removed the optional parameter *random*. .. function:: sample(population, k, *, counts=None) @@ -294,21 +298,22 @@ be found in any statistics text. .. function:: random() - Return the next random floating point number in the range ``0.0 <= X < 1.0`` + Return the next random floating-point number in the range ``0.0 <= X < 1.0`` .. function:: uniform(a, b) - Return a random floating point number *N* such that ``a <= N <= b`` for + Return a random floating-point number *N* such that ``a <= N <= b`` for ``a <= b`` and ``b <= N <= a`` for ``b < a``. The end-point value ``b`` may or may not be included in the range - depending on floating-point rounding in the equation ``a + (b-a) * random()``. + depending on floating-point rounding in the expression + ``a + (b-a) * random()``. .. function:: triangular(low, high, mode) - Return a random floating point number *N* such that ``low <= N <= high`` and + Return a random floating-point number *N* such that ``low <= N <= high`` and with the specified *mode* between those bounds. The *low* and *high* bounds default to zero and one. The *mode* argument defaults to the midpoint between the bounds, giving a symmetric distribution. @@ -407,11 +412,42 @@ Alternative Generator Class that implements the default pseudo-random number generator used by the :mod:`random` module. - .. deprecated-removed:: 3.9 3.11 + .. versionchanged:: 3.11 Formerly the *seed* could be any hashable object. Now it is limited to: - :class:`NoneType`, :class:`int`, :class:`float`, :class:`str`, + ``None``, :class:`int`, :class:`float`, :class:`str`, :class:`bytes`, or :class:`bytearray`. + Subclasses of :class:`!Random` should override the following methods if they + wish to make use of a different basic generator: + + .. method:: Random.seed(a=None, version=2) + + Override this method in subclasses to customise the :meth:`~random.seed` + behaviour of :class:`!Random` instances. + + .. method:: Random.getstate() + + Override this method in subclasses to customise the :meth:`~random.getstate` + behaviour of :class:`!Random` instances. + + .. method:: Random.setstate(state) + + Override this method in subclasses to customise the :meth:`~random.setstate` + behaviour of :class:`!Random` instances. + + .. method:: Random.random() + + Override this method in subclasses to customise the :meth:`~random.random` + behaviour of :class:`!Random` instances. + + Optionally, a custom generator subclass can also supply the following method: + + .. method:: Random.getrandbits(k) + + Override this method in subclasses to customise the + :meth:`~random.getrandbits` behaviour of :class:`!Random` instances. + + .. class:: SystemRandom([seed]) Class that uses the :func:`os.urandom` function for generating random numbers @@ -445,30 +481,30 @@ Examples Basic examples:: - >>> random() # Random float: 0.0 <= x < 1.0 + >>> random() # Random float: 0.0 <= x < 1.0 0.37444887175646646 - >>> uniform(2.5, 10.0) # Random float: 2.5 <= x <= 10.0 + >>> uniform(2.5, 10.0) # Random float: 2.5 <= x <= 10.0 3.1800146073117523 - >>> expovariate(1 / 5) # Interval between arrivals averaging 5 seconds + >>> expovariate(1 / 5) # Interval between arrivals averaging 5 seconds 5.148957571865031 - >>> randrange(10) # Integer from 0 to 9 inclusive + >>> randrange(10) # Integer from 0 to 9 inclusive 7 - >>> randrange(0, 101, 2) # Even integer from 0 to 100 inclusive + >>> randrange(0, 101, 2) # Even integer from 0 to 100 inclusive 26 - >>> choice(['win', 'lose', 'draw']) # Single random element from a sequence + >>> choice(['win', 'lose', 'draw']) # Single random element from a sequence 'draw' >>> deck = 'ace two three four'.split() - >>> shuffle(deck) # Shuffle a list + >>> shuffle(deck) # Shuffle a list >>> deck ['four', 'two', 'ace', 'three'] - >>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement + >>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement [40, 10, 50, 30] Simulations:: @@ -572,14 +608,14 @@ Simulation of arrival times and service deliveries for a multiserver queue:: including simulation, sampling, shuffling, and cross-validation. `Economics Simulation - `_ + `_ a simulation of a marketplace by `Peter Norvig `_ that shows effective use of many of the tools and distributions provided by this module (gauss, uniform, sample, betavariate, choice, triangular, and randrange). `A Concrete Introduction to Probability (using Python) - `_ + `_ a tutorial by `Peter Norvig `_ covering the basics of probability theory, how to write simulations, and how to perform data analysis using Python. @@ -670,3 +706,83 @@ positive unnormalized float and is equal to ``math.ulp(0.0)``.) `_ a paper by Allen B. Downey describing ways to generate more fine-grained floats than normally generated by :func:`.random`. + +.. _random-cli: + +Command-line usage +------------------ + +.. versionadded:: 3.13 + +The :mod:`!random` module can be executed from the command line. + +.. code-block:: sh + + python -m random [-h] [-c CHOICE [CHOICE ...] | -i N | -f N] [input ...] + +The following options are accepted: + +.. program:: random + +.. option:: -h, --help + + Show the help message and exit. + +.. option:: -c CHOICE [CHOICE ...] + --choice CHOICE [CHOICE ...] + + Print a random choice, using :meth:`choice`. + +.. option:: -i + --integer + + Print a random integer between 1 and N inclusive, using :meth:`randint`. + +.. option:: -f + --float + + Print a random floating-point number between 0 and N inclusive, + using :meth:`uniform`. + +If no options are given, the output depends on the input: + +* String or multiple: same as :option:`--choice`. +* Integer: same as :option:`--integer`. +* Float: same as :option:`--float`. + +.. _random-cli-example: + +Command-line example +-------------------- + +Here are some examples of the :mod:`!random` command-line interface: + +.. code-block:: console + + $ # Choose one at random + $ python -m random egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce" + Lobster Thermidor aux crevettes with a Mornay sauce + + $ # Random integer + $ python -m random 6 + 6 + + $ # Random floating-point number + $ python -m random 1.8 + 1.7080016272295635 + + $ # With explicit arguments + $ python -m random --choice egg bacon sausage spam "Lobster Thermidor aux crevettes with a Mornay sauce" + egg + + $ python -m random --integer 6 + 3 + + $ python -m random --float 1.8 + 1.5666339105010318 + + $ python -m random --integer 6 + 5 + + $ python -m random --float 6 + 3.1942323316565915 diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 92aae100..9db6f1da 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1,5 +1,5 @@ -:mod:`re` --- Regular expression operations -=========================================== +:mod:`!re` --- Regular expression operations +============================================ .. module:: re :synopsis: Regular expression operations. @@ -17,7 +17,7 @@ those found in Perl. Both patterns and strings to be searched can be Unicode strings (:class:`str`) as well as 8-bit strings (:class:`bytes`). However, Unicode strings and 8-bit strings cannot be mixed: -that is, you cannot match a Unicode string with a byte pattern or +that is, you cannot match a Unicode string with a bytes pattern or vice-versa; similarly, when asking for a substitution, the replacement string must be of the same type as both the pattern and the search string. @@ -48,7 +48,7 @@ fine-tuning parameters. .. seealso:: - The third-party `regex `_ module, + The third-party :pypi:`regex` module, which has an API compatible with the standard library :mod:`re` module, but offers additional functionality and a more thorough Unicode support. @@ -101,7 +101,7 @@ The special characters are: ``.`` (Dot.) In the default mode, this matches any character except a newline. If the :const:`DOTALL` flag has been specified, this matches any character - including a newline. + including a newline. ``(?s:.)`` matches any character regardless of flags. .. index:: single: ^ (caret); in regular expressions @@ -176,7 +176,7 @@ The special characters are: ``x*+``, ``x++`` and ``x?+`` are equivalent to ``(?>x*)``, ``(?>x+)`` and ``(?>x?)`` correspondingly. - .. versionadded:: 3.11 + .. versionadded:: 3.11 .. index:: single: {} (curly brackets); in regular expressions @@ -257,8 +257,7 @@ The special characters are: .. index:: single: \ (backslash); in regular expressions * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted - inside a set, although the characters they match depends on whether - :const:`ASCII` or :const:`LOCALE` mode is in force. + inside a set, although the characters they match depend on the flags_ used. .. index:: single: ^ (caret); in regular expressions @@ -326,18 +325,24 @@ The special characters are: currently supported extensions. ``(?aiLmsux)`` - (One or more letters from the set ``'a'``, ``'i'``, ``'L'``, ``'m'``, - ``'s'``, ``'u'``, ``'x'``.) The group matches the empty string; the - letters set the corresponding flags: :const:`re.A` (ASCII-only matching), - :const:`re.I` (ignore case), :const:`re.L` (locale dependent), - :const:`re.M` (multi-line), :const:`re.S` (dot matches all), - :const:`re.U` (Unicode matching), and :const:`re.X` (verbose), - for the entire regular expression. + (One or more letters from the set + ``'a'``, ``'i'``, ``'L'``, ``'m'``, ``'s'``, ``'u'``, ``'x'``.) + The group matches the empty string; + the letters set the corresponding flags for the entire regular expression: + + * :const:`re.A` (ASCII-only matching) + * :const:`re.I` (ignore case) + * :const:`re.L` (locale dependent) + * :const:`re.M` (multi-line) + * :const:`re.S` (dot matches all) + * :const:`re.U` (Unicode matching) + * :const:`re.X` (verbose) + (The flags are described in :ref:`contents-of-module-re`.) This is useful if you wish to include the flags as part of the regular expression, instead of passing a *flag* argument to the - :func:`re.compile` function. Flags should be used first in the - expression string. + :func:`re.compile` function. + Flags should be used first in the expression string. .. versionchanged:: 3.11 This construction can only be used at the start of the expression. @@ -351,14 +356,20 @@ The special characters are: pattern. ``(?aiLmsux-imsx:...)`` - (Zero or more letters from the set ``'a'``, ``'i'``, ``'L'``, ``'m'``, - ``'s'``, ``'u'``, ``'x'``, optionally followed by ``'-'`` followed by + (Zero or more letters from the set + ``'a'``, ``'i'``, ``'L'``, ``'m'``, ``'s'``, ``'u'``, ``'x'``, + optionally followed by ``'-'`` followed by one or more letters from the ``'i'``, ``'m'``, ``'s'``, ``'x'``.) - The letters set or remove the corresponding flags: - :const:`re.A` (ASCII-only matching), :const:`re.I` (ignore case), - :const:`re.L` (locale dependent), :const:`re.M` (multi-line), - :const:`re.S` (dot matches all), :const:`re.U` (Unicode matching), - and :const:`re.X` (verbose), for the part of the expression. + The letters set or remove the corresponding flags for the part of the expression: + + * :const:`re.A` (ASCII-only matching) + * :const:`re.I` (ignore case) + * :const:`re.L` (locale dependent) + * :const:`re.M` (multi-line) + * :const:`re.S` (dot matches all) + * :const:`re.U` (Unicode matching) + * :const:`re.X` (verbose) + (The flags are described in :ref:`contents-of-module-re`.) The letters ``'a'``, ``'L'`` and ``'u'`` are mutually exclusive when used @@ -366,7 +377,7 @@ The special characters are: when one of them appears in an inline group, it overrides the matching mode in the enclosing group. In Unicode patterns ``(?a:...)`` switches to ASCII-only matching, and ``(?u:...)`` switches to Unicode matching - (default). In byte pattern ``(?L:...)`` switches to locale depending + (default). In bytes patterns ``(?L:...)`` switches to locale dependent matching, and ``(?a:...)`` switches to ASCII-only matching (default). This override is only in effect for the narrow inline group, and the original matching mode is restored outside of the group. @@ -529,57 +540,77 @@ character ``'$'``. ``\b`` Matches the empty string, but only at the beginning or end of a word. - A word is defined as a sequence of word characters. Note that formally, - ``\b`` is defined as the boundary between a ``\w`` and a ``\W`` character - (or vice versa), or between ``\w`` and the beginning/end of the string. - This means that ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, - ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. - - By default Unicode alphanumerics are the ones used in Unicode patterns, but - this can be changed by using the :const:`ASCII` flag. Word boundaries are - determined by the current locale if the :const:`LOCALE` flag is used. - Inside a character range, ``\b`` represents the backspace character, for - compatibility with Python's string literals. + A word is defined as a sequence of word characters. + Note that formally, ``\b`` is defined as the boundary + between a ``\w`` and a ``\W`` character (or vice versa), + or between ``\w`` and the beginning or end of the string. + This means that ``r'\bat\b'`` matches ``'at'``, ``'at.'``, ``'(at)'``, + and ``'as at ay'`` but not ``'attempt'`` or ``'atlas'``. + + The default word characters in Unicode (str) patterns + are Unicode alphanumerics and the underscore, + but this can be changed by using the :py:const:`~re.ASCII` flag. + Word boundaries are determined by the current locale + if the :py:const:`~re.LOCALE` flag is used. + + .. note:: + + Inside a character range, ``\b`` represents the backspace character, + for compatibility with Python's string literals. .. index:: single: \B; in regular expressions ``\B`` - Matches the empty string, but only when it is *not* at the beginning or end - of a word. This means that ``r'py\B'`` matches ``'python'``, ``'py3'``, - ``'py2'``, but not ``'py'``, ``'py.'``, or ``'py!'``. - ``\B`` is just the opposite of ``\b``, so word characters in Unicode - patterns are Unicode alphanumerics or the underscore, although this can - be changed by using the :const:`ASCII` flag. Word boundaries are - determined by the current locale if the :const:`LOCALE` flag is used. + Matches the empty string, + but only when it is *not* at the beginning or end of a word. + This means that ``r'at\B'`` matches ``'athens'``, ``'atom'``, + ``'attorney'``, but not ``'at'``, ``'at.'``, or ``'at!'``. + ``\B`` is the opposite of ``\b``, + so word characters in Unicode (str) patterns + are Unicode alphanumerics or the underscore, + although this can be changed by using the :py:const:`~re.ASCII` flag. + Word boundaries are determined by the current locale + if the :py:const:`~re.LOCALE` flag is used. + + .. note:: + + Note that ``\B`` does not match an empty string, which differs from + RE implementations in other programming languages such as Perl. + This behavior is kept for compatibility reasons. .. index:: single: \d; in regular expressions ``\d`` For Unicode (str) patterns: - Matches any Unicode decimal digit (that is, any character in - Unicode character category [Nd]). This includes ``[0-9]``, and - also many other digit characters. If the :const:`ASCII` flag is - used only ``[0-9]`` is matched. + Matches any Unicode decimal digit + (that is, any character in Unicode character category `[Nd]`__). + This includes ``[0-9]``, and also many other digit characters. + + Matches ``[0-9]`` if the :py:const:`~re.ASCII` flag is used. + + __ https://www.unicode.org/versions/Unicode15.0.0/ch04.pdf#G134153 For 8-bit (bytes) patterns: - Matches any decimal digit; this is equivalent to ``[0-9]``. + Matches any decimal digit in the ASCII character set; + this is equivalent to ``[0-9]``. .. index:: single: \D; in regular expressions ``\D`` - Matches any character which is not a decimal digit. This is - the opposite of ``\d``. If the :const:`ASCII` flag is used this - becomes the equivalent of ``[^0-9]``. + Matches any character which is not a decimal digit. + This is the opposite of ``\d``. + + Matches ``[^0-9]`` if the :py:const:`~re.ASCII` flag is used. .. index:: single: \s; in regular expressions ``\s`` For Unicode (str) patterns: - Matches Unicode whitespace characters (which includes - ``[ \t\n\r\f\v]``, and also many other characters, for example the - non-breaking spaces mandated by typography rules in many - languages). If the :const:`ASCII` flag is used, only - ``[ \t\n\r\f\v]`` is matched. + Matches Unicode whitespace characters (as defined by :py:meth:`str.isspace`). + This includes ``[ \t\n\r\f\v]``, and also many other characters, for example the + non-breaking spaces mandated by typography rules in many languages. + + Matches ``[ \t\n\r\f\v]`` if the :py:const:`~re.ASCII` flag is used. For 8-bit (bytes) patterns: Matches characters considered whitespace in the ASCII character set; @@ -589,30 +620,39 @@ character ``'$'``. ``\S`` Matches any character which is not a whitespace character. This is - the opposite of ``\s``. If the :const:`ASCII` flag is used this - becomes the equivalent of ``[^ \t\n\r\f\v]``. + the opposite of ``\s``. + + Matches ``[^ \t\n\r\f\v]`` if the :py:const:`~re.ASCII` flag is used. .. index:: single: \w; in regular expressions ``\w`` For Unicode (str) patterns: - Matches Unicode word characters; this includes alphanumeric characters (as defined by :meth:`str.isalnum`) + Matches Unicode word characters; + this includes all Unicode alphanumeric characters + (as defined by :py:meth:`str.isalnum`), as well as the underscore (``_``). - If the :const:`ASCII` flag is used, only ``[a-zA-Z0-9_]`` is matched. + + Matches ``[a-zA-Z0-9_]`` if the :py:const:`~re.ASCII` flag is used. For 8-bit (bytes) patterns: Matches characters considered alphanumeric in the ASCII character set; - this is equivalent to ``[a-zA-Z0-9_]``. If the :const:`LOCALE` flag is - used, matches characters considered alphanumeric in the current locale - and the underscore. + this is equivalent to ``[a-zA-Z0-9_]``. + If the :py:const:`~re.LOCALE` flag is used, + matches characters considered alphanumeric in the current locale and the underscore. .. index:: single: \W; in regular expressions ``\W`` - Matches any character which is not a word character. This is - the opposite of ``\w``. If the :const:`ASCII` flag is used this - becomes the equivalent of ``[^a-zA-Z0-9_]``. If the :const:`LOCALE` flag is - used, matches characters which are neither alphanumeric in the current locale + Matches any character which is not a word character. + This is the opposite of ``\w``. + By default, matches non-underscore (``_``) characters + for which :py:meth:`str.isalnum` returns ``False``. + + Matches ``[^a-zA-Z0-9_]`` if the :py:const:`~re.ASCII` flag is used. + + If the :py:const:`~re.LOCALE` flag is used, + matches characters which are neither alphanumeric in the current locale nor the underscore. .. index:: single: \Z; in regular expressions @@ -644,9 +684,11 @@ string literals are also accepted by the regular expression parser:: (Note that ``\b`` is used to represent word boundaries, and means "backspace" only inside character classes.) -``'\u'``, ``'\U'``, and ``'\N'`` escape sequences are only recognized in Unicode -patterns. In bytes patterns they are errors. Unknown escapes of ASCII -letters are reserved for future use and treated as errors. +``'\u'``, ``'\U'``, and ``'\N'`` escape sequences are +only recognized in Unicode (str) patterns. +In bytes patterns they are errors. +Unknown escapes of ASCII letters are reserved +for future use and treated as errors. Octal escapes are included in a limited form. If the first digit is a 0, or if there are three octal digits, it is considered an octal escape. Otherwise, it is @@ -694,30 +736,37 @@ Flags Make ``\w``, ``\W``, ``\b``, ``\B``, ``\d``, ``\D``, ``\s`` and ``\S`` perform ASCII-only matching instead of full Unicode matching. This is only - meaningful for Unicode patterns, and is ignored for byte patterns. + meaningful for Unicode (str) patterns, and is ignored for bytes patterns. + Corresponds to the inline flag ``(?a)``. - Note that for backward compatibility, the :const:`re.U` flag still - exists (as well as its synonym :const:`re.UNICODE` and its embedded - counterpart ``(?u)``), but these are redundant in Python 3 since - matches are Unicode by default for strings (and Unicode matching - isn't allowed for bytes). + .. note:: + + The :py:const:`~re.U` flag still exists for backward compatibility, + but is redundant in Python 3 since + matches are Unicode by default for ``str`` patterns, + and Unicode matching isn't allowed for bytes patterns. + :py:const:`~re.UNICODE` and the inline flag ``(?u)`` are similarly redundant. .. data:: DEBUG Display debug information about compiled expression. + No corresponding inline flag. .. data:: I IGNORECASE - Perform case-insensitive matching; expressions like ``[A-Z]`` will also - match lowercase letters. Full Unicode matching (such as ``Ü`` matching - ``ü``) also works unless the :const:`re.ASCII` flag is used to disable - non-ASCII matches. The current locale does not change the effect of this - flag unless the :const:`re.LOCALE` flag is also used. + Perform case-insensitive matching; + expressions like ``[A-Z]`` will also match lowercase letters. + Full Unicode matching (such as ``Ü`` matching ``ü``) + also works unless the :py:const:`~re.ASCII` flag + is used to disable non-ASCII matches. + The current locale does not change the effect of this flag + unless the :py:const:`~re.LOCALE` flag is also used. + Corresponds to the inline flag ``(?i)``. Note that when the Unicode patterns ``[a-z]`` or ``[A-Z]`` are used in @@ -725,29 +774,35 @@ Flags letters and 4 additional non-ASCII letters: 'İ' (U+0130, Latin capital letter I with dot above), 'ı' (U+0131, Latin small letter dotless i), 'ſ' (U+017F, Latin small letter long s) and 'K' (U+212A, Kelvin sign). - If the :const:`ASCII` flag is used, only letters 'a' to 'z' + If the :py:const:`~re.ASCII` flag is used, only letters 'a' to 'z' and 'A' to 'Z' are matched. .. data:: L LOCALE Make ``\w``, ``\W``, ``\b``, ``\B`` and case-insensitive matching - dependent on the current locale. This flag can be used only with bytes - patterns. The use of this flag is discouraged as the locale mechanism - is very unreliable, it only handles one "culture" at a time, and it only - works with 8-bit locales. Unicode matching is already enabled by default - in Python 3 for Unicode (str) patterns, and it is able to handle different - locales/languages. + dependent on the current locale. + This flag can be used only with bytes patterns. + Corresponds to the inline flag ``(?L)``. + .. warning:: + + This flag is discouraged; consider Unicode matching instead. + The locale mechanism is very unreliable + as it only handles one "culture" at a time + and only works with 8-bit locales. + Unicode matching is enabled by default for Unicode (str) patterns + and it is able to handle different locales and languages. + .. versionchanged:: 3.6 - :const:`re.LOCALE` can be used only with bytes patterns and is - not compatible with :const:`re.ASCII`. + :py:const:`~re.LOCALE` can be used only with bytes patterns + and is not compatible with :py:const:`~re.ASCII`. .. versionchanged:: 3.7 - Compiled regular expression objects with the :const:`re.LOCALE` flag no - longer depend on the locale at compile time. Only the locale at - matching time affects the result of matching. + Compiled regular expression objects with the :py:const:`~re.LOCALE` flag + no longer depend on the locale at compile time. + Only the locale at matching time affects the result of matching. .. data:: M @@ -759,6 +814,7 @@ Flags end of each line (immediately preceding each newline). By default, ``'^'`` matches only at the beginning of the string, and ``'$'`` only at the end of the string and immediately before the newline (if any) at the end of the string. + Corresponds to the inline flag ``(?m)``. .. data:: NOFLAG @@ -778,19 +834,19 @@ Flags Make the ``'.'`` special character match any character at all, including a newline; without this flag, ``'.'`` will match anything *except* a newline. + Corresponds to the inline flag ``(?s)``. .. data:: U UNICODE - In Python 2, this flag made :ref:`special sequences ` - include Unicode characters in matches. Since Python 3, Unicode characters - are matched by default. + In Python 3, Unicode characters are matched by default + for ``str`` patterns. + This flag is therefore redundant with **no effect** + and is only kept for backward compatibility. - See :const:`A` for restricting matching on ASCII characters instead. - - This flag is only kept for backward compatibility. + See :py:const:`~re.ASCII` to restrict matching to ASCII characters instead. .. data:: X VERBOSE @@ -829,8 +885,8 @@ Functions below. The expression's behaviour can be modified by specifying a *flags* value. - Values can be any of the following variables, combined using bitwise OR (the - ``|`` operator). + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). The sequence :: @@ -860,6 +916,10 @@ Functions ``None`` if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. function:: match(pattern, string, flags=0) @@ -874,6 +934,10 @@ Functions If you want to locate a match anywhere in *string*, use :func:`search` instead (see also :ref:`search-vs-match`). + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. function:: fullmatch(pattern, string, flags=0) @@ -881,6 +945,10 @@ Functions corresponding :class:`~re.Match`. Return ``None`` if the string does not match the pattern; note that this is different from a zero-length match. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionadded:: 3.4 @@ -896,7 +964,7 @@ Functions ['Words', 'words', 'words', ''] >>> re.split(r'(\W+)', 'Words, words, words.') ['Words', ', ', 'words', ', ', 'words', '.', ''] - >>> re.split(r'\W+', 'Words, words, words.', 1) + >>> re.split(r'\W+', 'Words, words, words.', maxsplit=1) ['Words', 'words, words.'] >>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE) ['0', '3', '9'] @@ -914,6 +982,8 @@ Functions Empty matches for the pattern split the string only when not adjacent to a previous empty match. + .. code:: pycon + >>> re.split(r'\b', 'Words, words, words.') ['', 'Words', ', ', 'words', ', ', 'words', '.'] >>> re.split(r'\W*', '...words...') @@ -921,12 +991,21 @@ Functions >>> re.split(r'(\W*)', '...words...') ['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', ''] + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.1 Added the optional flags argument. .. versionchanged:: 3.7 Added support of splitting on a pattern that could match an empty string. + .. deprecated:: 3.13 + Passing *maxsplit* and *flags* as positional arguments is deprecated. + In future Python versions they will be + :ref:`keyword-only parameters `. + .. function:: findall(pattern, string, flags=0) @@ -946,6 +1025,10 @@ Functions >>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10') [('width', '20'), ('height', '10')] + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.7 Non-empty matches can now start just after a previous empty match. @@ -957,6 +1040,10 @@ Functions is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.7 Non-empty matches can now start just after a previous empty match. @@ -1012,6 +1099,10 @@ Functions character ``'0'``. The backreference ``\g<0>`` substitutes in the entire substring matched by the RE. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.1 Added the optional flags argument. @@ -1025,8 +1116,6 @@ Functions .. versionchanged:: 3.7 Unknown escapes in *repl* consisting of ``'\'`` and an ASCII letter now are errors. - - .. versionchanged:: 3.7 Empty matches for the pattern are replaced when adjacent to a previous non-empty match. @@ -1035,17 +1124,20 @@ Functions In :class:`bytes` replacement strings, group *name* can only contain bytes in the ASCII range (``b'\x00'``-``b'\x7f'``). + .. deprecated:: 3.13 + Passing *count* and *flags* as positional arguments is deprecated. + In future Python versions they will be + :ref:`keyword-only parameters `. + .. function:: subn(pattern, repl, string, count=0, flags=0) Perform the same operation as :func:`sub`, but return a tuple ``(new_string, number_of_subs_made)``. - .. versionchanged:: 3.1 - Added the optional flags argument. - - .. versionchanged:: 3.5 - Unmatched groups are replaced with an empty string. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). .. function:: escape(pattern) @@ -1091,12 +1183,12 @@ Functions Exceptions ^^^^^^^^^^ -.. exception:: error(msg, pattern=None, pos=None) +.. exception:: PatternError(msg, pattern=None, pos=None) Exception raised when a string passed to one of the functions here is not a valid regular expression (for example, it might contain unmatched parentheses) or when some other error occurs during compilation or matching. It is never an - error if a string contains no match for a pattern. The error instance has + error if a string contains no match for a pattern. The ``PatternError`` instance has the following additional attributes: .. attribute:: msg @@ -1122,6 +1214,10 @@ Exceptions .. versionchanged:: 3.5 Added additional attributes. + .. versionchanged:: 3.13 + ``PatternError`` was originally named ``error``; the latter is kept as an alias for + backward compatibility. + .. _re-objects: Regular Expression Objects @@ -1231,7 +1327,7 @@ Regular Expression Objects The regex matching flags. This is a combination of the flags given to :func:`.compile`, any ``(?...)`` inline flags in the pattern, and implicit - flags such as :data:`UNICODE` if the pattern is a Unicode string. + flags such as :py:const:`~re.UNICODE` if the pattern is a Unicode string. .. attribute:: Pattern.groups @@ -1285,7 +1381,8 @@ when there is no match, you can test whether there was a match with a simple Escapes such as ``\n`` are converted to the appropriate characters, and numeric backreferences (``\1``, ``\2``) and named backreferences (``\g<1>``, ``\g``) are replaced by the contents of the - corresponding group. + corresponding group. The backreference ``\g<0>`` will be + replaced by the entire match. .. versionchanged:: 3.5 Unmatched groups are replaced with an empty string. @@ -1538,7 +1635,7 @@ To find out what card the pair consists of, one could use the Simulating scanf() ^^^^^^^^^^^^^^^^^^ -.. index:: single: scanf() +.. index:: single: scanf (C function) Python does not currently have an equivalent to :c:func:`!scanf`. Regular expressions are generally more powerful, though also more verbose, than @@ -1663,7 +1760,7 @@ because the address has spaces, our splitting pattern, in it: .. doctest:: :options: +NORMALIZE_WHITESPACE - >>> [re.split(":? ", entry, 3) for entry in entries] + >>> [re.split(":? ", entry, maxsplit=3) for entry in entries] [['Ross', 'McFluff', '834.345.1254', '155 Elm Street'], ['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue'], ['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way'], @@ -1676,7 +1773,7 @@ house number from the street name: .. doctest:: :options: +NORMALIZE_WHITESPACE - >>> [re.split(":? ", entry, 4) for entry in entries] + >>> [re.split(":? ", entry, maxsplit=4) for entry in entries] [['Ross', 'McFluff', '834.345.1254', '155', 'Elm Street'], ['Ronald', 'Heathmore', '892.345.3428', '436', 'Finley Avenue'], ['Frank', 'Burger', '925.541.7625', '662', 'South Dogwood Way'], diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 8fb0eca8..4a042056 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -1,11 +1,11 @@ -:mod:`readline` --- GNU readline interface -========================================== +:mod:`!readline` --- GNU readline interface +=========================================== .. module:: readline :platform: Unix :synopsis: GNU readline support for Python. -.. sectionauthor:: Skip Montanaro +.. sectionauthor:: Skip Montanaro -------------- @@ -24,19 +24,20 @@ in the GNU Readline manual for information about the format and allowable constructs of that file, and the capabilities of the Readline library in general. +.. include:: ../includes/wasm-mobile-notavail.rst + .. note:: The underlying Readline library API may be implemented by - the ``libedit`` library instead of GNU readline. + the ``editline`` (``libedit``) library instead of GNU readline. On macOS the :mod:`readline` module detects which library is being used at run time. - The configuration file for ``libedit`` is different from that + The configuration file for ``editline`` is different from that of GNU readline. If you programmatically load configuration strings - you can check for the text "libedit" in :const:`readline.__doc__` - to differentiate between GNU readline and libedit. + you can use :data:`backend` to determine which library is being used. - If you use *editline*/``libedit`` readline emulation on macOS, the + If you use ``editline``/``libedit`` readline emulation on macOS, the initialization file located in your home directory is named ``.editrc``. For example, the following content in ``~/.editrc`` will turn ON *vi* keybindings and TAB completion:: @@ -44,6 +45,16 @@ Readline library in general. python:bind -v python:bind ^I rl_complete + Also note that different libraries may use different history file formats. + When switching the underlying library, existing history files may become + unusable. + +.. data:: backend + + The name of the underlying Readline library being used, either + ``"readline"`` or ``"editline"``. + + .. versionadded:: 3.13 Init file --------- @@ -213,6 +224,8 @@ Startup hooks if Python was compiled for a version of the library that supports it. +.. _readline-completion: + Completion ---------- diff --git a/Doc/library/removed.rst b/Doc/library/removed.rst new file mode 100644 index 00000000..4d75842e --- /dev/null +++ b/Doc/library/removed.rst @@ -0,0 +1,39 @@ +:tocdepth: 1 + +.. _removed: + +*************** +Removed Modules +*************** + +The modules described in this chapter have been removed from the Python +standard library. They are documented here to help people find replacements. + + +.. toctree:: + :maxdepth: 1 + + aifc.rst + asynchat.rst + asyncore.rst + audioop.rst + cgi.rst + cgitb.rst + chunk.rst + crypt.rst + distutils.rst + imghdr.rst + imp.rst + mailcap.rst + msilib.rst + nis.rst + nntplib.rst + ossaudiodev.rst + pipes.rst + smtpd.rst + sndhdr.rst + spwd.rst + sunau.rst + telnetlib.rst + uu.rst + xdrlib.rst diff --git a/Doc/library/reprlib.rst b/Doc/library/reprlib.rst index 5ebb0a77..28c7855d 100644 --- a/Doc/library/reprlib.rst +++ b/Doc/library/reprlib.rst @@ -1,5 +1,5 @@ -:mod:`reprlib` --- Alternate :func:`repr` implementation -======================================================== +:mod:`!reprlib` --- Alternate :func:`repr` implementation +========================================================= .. module:: reprlib :synopsis: Alternate repr() implementation with size limits. @@ -10,7 +10,7 @@ -------------- -The :mod:`reprlib` module provides a means for producing object representations +The :mod:`!reprlib` module provides a means for producing object representations with limits on the size of the resulting strings. This is used in the Python debugger and may be useful in other contexts as well. @@ -58,29 +58,31 @@ This module provides a class, an instance, and a function: limits on most sizes. In addition to size-limiting tools, the module also provides a decorator for -detecting recursive calls to :meth:`__repr__` and substituting a placeholder -string instead. +detecting recursive calls to :meth:`~object.__repr__` and substituting a +placeholder string instead. .. index:: single: ...; placeholder .. decorator:: recursive_repr(fillvalue="...") - Decorator for :meth:`__repr__` methods to detect recursive calls within the + Decorator for :meth:`~object.__repr__` methods to detect recursive calls within the same thread. If a recursive call is made, the *fillvalue* is returned, - otherwise, the usual :meth:`__repr__` call is made. For example: - - >>> from reprlib import recursive_repr - >>> class MyList(list): - ... @recursive_repr() - ... def __repr__(self): - ... return '<' + '|'.join(map(repr, self)) + '>' - ... - >>> m = MyList('abc') - >>> m.append(m) - >>> m.append('x') - >>> print(m) - <'a'|'b'|'c'|...|'x'> + otherwise, the usual :meth:`!__repr__` call is made. For example: + + .. doctest:: + + >>> from reprlib import recursive_repr + >>> class MyList(list): + ... @recursive_repr() + ... def __repr__(self): + ... return '<' + '|'.join(map(repr, self)) + '>' + ... + >>> m = MyList('abc') + >>> m.append(m) + >>> m.append('x') + >>> print(m) + <'a'|'b'|'c'|...|'x'> .. versionadded:: 3.2 @@ -148,10 +150,10 @@ which format specific object types. with no line breaks or indentation, like the standard :func:`repr`. For example: - .. code-block:: pycon + .. doctest:: indent >>> example = [ - 1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham'] + ... 1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham'] >>> import reprlib >>> aRepr = reprlib.Repr() >>> print(aRepr.repr(example)) @@ -160,7 +162,7 @@ which format specific object types. If :attr:`~Repr.indent` is set to a string, each recursion level is placed on its own line, indented by that string: - .. code-block:: pycon + .. doctest:: indent >>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) @@ -181,7 +183,7 @@ which format specific object types. Setting :attr:`~Repr.indent` to a positive integer value behaves as if it was set to a string with that number of spaces: - .. code-block:: pycon + .. doctest:: indent >>> aRepr.indent = 4 >>> print(aRepr.repr(example)) @@ -234,7 +236,9 @@ Subclassing Repr Objects The use of dynamic dispatching by :meth:`Repr.repr1` allows subclasses of :class:`Repr` to add support for additional built-in object types or to modify the handling of types already supported. This example shows how special support -for file objects could be added:: +for file objects could be added: + +.. testcode:: import reprlib import sys @@ -248,3 +252,7 @@ for file objects could be added:: aRepr = MyRepr() print(aRepr.repr(sys.stdin)) # prints '' + +.. testoutput:: + + diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index a5324c82..0515d205 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -1,5 +1,5 @@ -:mod:`resource` --- Resource usage information -============================================== +:mod:`!resource` --- Resource usage information +=============================================== .. module:: resource :platform: Unix @@ -13,7 +13,7 @@ This module provides basic mechanisms for measuring and controlling system resources utilized by a program. -.. include:: ../includes/wasm-notavail.rst +.. availability:: Unix, not WASI. Symbolic constants are used to specify particular system resources and to request usage information about either the current process or its children. @@ -177,6 +177,8 @@ platform. The largest area of mapped memory which the process may occupy. + .. availability:: FreeBSD >= 11. + .. data:: RLIMIT_AS @@ -277,7 +279,7 @@ These functions are used to retrieve resource usage information: This function returns an object that describes the resources consumed by either the current process or its children, as specified by the *who* parameter. The - *who* parameter should be specified using one of the :const:`RUSAGE_\*` + *who* parameter should be specified using one of the :const:`!RUSAGE_\*` constants described below. A simple example:: @@ -303,7 +305,7 @@ These functions are used to retrieve resource usage information: elements. The fields :attr:`ru_utime` and :attr:`ru_stime` of the return value are - floating point values representing the amount of time spent executing in user + floating-point values representing the amount of time spent executing in user mode and the amount of time spent executing in system mode, respectively. The remaining values are integers. Consult the :manpage:`getrusage(2)` man page for detailed information about these values. A brief summary is presented here: @@ -353,7 +355,7 @@ These functions are used to retrieve resource usage information: Returns the number of bytes in a system page. (This need not be the same as the hardware page size.) -The following :const:`RUSAGE_\*` symbols are passed to the :func:`getrusage` +The following :const:`!RUSAGE_\*` symbols are passed to the :func:`getrusage` function to specify which processes information should be provided for. diff --git a/Doc/library/rlcompleter.rst b/Doc/library/rlcompleter.rst index 40b09ce8..91779feb 100644 --- a/Doc/library/rlcompleter.rst +++ b/Doc/library/rlcompleter.rst @@ -1,5 +1,5 @@ -:mod:`rlcompleter` --- Completion function for GNU readline -=========================================================== +:mod:`!rlcompleter` --- Completion function for GNU readline +============================================================ .. module:: rlcompleter :synopsis: Python identifier completion, suitable for the GNU readline library. @@ -10,12 +10,14 @@ -------------- -The :mod:`rlcompleter` module defines a completion function suitable for the -:mod:`readline` module by completing valid Python identifiers and keywords. +The :mod:`!rlcompleter` module defines a completion function suitable to be +passed to :func:`~readline.set_completer` in the :mod:`readline` module. When this module is imported on a Unix platform with the :mod:`readline` module available, an instance of the :class:`Completer` class is automatically created -and its :meth:`complete` method is set as the :mod:`readline` completer. +and its :meth:`~Completer.complete` method is set as the +:ref:`readline completer `. The method provides +completion of valid Python :ref:`identifiers and keywords `. Example:: @@ -28,7 +30,7 @@ Example:: readline.__name__ readline.parse_and_bind( >>> readline. -The :mod:`rlcompleter` module is designed for use with Python's +The :mod:`!rlcompleter` module is designed for use with Python's :ref:`interactive mode `. Unless Python is run with the :option:`-S` option, the module is automatically imported and configured (see :ref:`rlcompleter-config`). @@ -39,23 +41,25 @@ this module can still be used for custom purposes. .. _completer-objects: -Completer Objects ------------------ +.. class:: Completer -Completer objects have the following method: + Completer objects have the following method: + .. method:: Completer.complete(text, state) -.. method:: Completer.complete(text, state) + Return the next possible completion for *text*. - Return the *state*\ th completion for *text*. + When called by the :mod:`readline` module, this method is called + successively with ``state == 0, 1, 2, ...`` until the method returns + ``None``. - If called for *text* that doesn't include a period character (``'.'``), it will - complete from names currently defined in :mod:`__main__`, :mod:`builtins` and - keywords (as defined by the :mod:`keyword` module). - - If called for a dotted name, it will try to evaluate anything without obvious - side-effects (functions will not be evaluated, but it can generate calls to - :meth:`__getattr__`) up to the last part, and find matches for the rest via the - :func:`dir` function. Any exception raised during the evaluation of the - expression is caught, silenced and :const:`None` is returned. + If called for *text* that doesn't include a period character (``'.'``), it will + complete from names currently defined in :mod:`__main__`, :mod:`builtins` and + keywords (as defined by the :mod:`keyword` module). + If called for a dotted name, it will try to evaluate anything without obvious + side-effects (functions will not be evaluated, but it can generate calls to + :meth:`~object.__getattr__`) up to the last part, and find matches for the + rest via the :func:`dir` function. Any exception raised during the + evaluation of the expression is caught, silenced and :const:`None` is + returned. diff --git a/Doc/library/runpy.rst b/Doc/library/runpy.rst index 406b080b..b07ec6e9 100644 --- a/Doc/library/runpy.rst +++ b/Doc/library/runpy.rst @@ -1,5 +1,5 @@ -:mod:`runpy` --- Locating and executing Python modules -====================================================== +:mod:`!runpy` --- Locating and executing Python modules +======================================================= .. module:: runpy :synopsis: Locate and run Python modules without importing them first. @@ -32,7 +32,7 @@ The :mod:`runpy` module provides two functions: .. index:: pair: module; __main__ - Execute the code of the specified module and return the resulting module + Execute the code of the specified module and return the resulting module's globals dictionary. The module's code is first located using the standard import mechanism (refer to :pep:`302` for details) and then executed in a fresh module namespace. @@ -44,16 +44,16 @@ The :mod:`runpy` module provides two functions: returned. The optional dictionary argument *init_globals* may be used to pre-populate - the module's globals dictionary before the code is executed. The supplied - dictionary will not be modified. If any of the special global variables - below are defined in the supplied dictionary, those definitions are + the module's globals dictionary before the code is executed. + *init_globals* will not be modified. If any of the special global variables + below are defined in *init_globals*, those definitions are overridden by :func:`run_module`. The special global variables ``__name__``, ``__spec__``, ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` are set in the globals - dictionary before the module code is executed (Note that this is a + dictionary before the module code is executed. (Note that this is a minimal set of variables - other variables may be set implicitly as an - interpreter implementation detail). + interpreter implementation detail.) ``__name__`` is set to *run_name* if this optional argument is not :const:`None`, to ``mod_name + '.__main__'`` if the named module is a @@ -61,7 +61,7 @@ The :mod:`runpy` module provides two functions: ``__spec__`` will be set appropriately for the *actually* imported module (that is, ``__spec__.name`` will always be *mod_name* or - ``mod_name + '.__main__``, never *run_name*). + ``mod_name + '.__main__'``, never *run_name*). ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` are :ref:`set as normal ` based on the module spec. @@ -104,11 +104,11 @@ The :mod:`runpy` module provides two functions: pair: module; __main__ Execute the code at the named filesystem location and return the resulting - module globals dictionary. As with a script name supplied to the CPython - command line, the supplied path may refer to a Python source file, a + module's globals dictionary. As with a script name supplied to the CPython + command line, *file_path* may refer to a Python source file, a compiled bytecode file or a valid :data:`sys.path` entry containing a :mod:`__main__` module - (e.g. a zipfile containing a top-level ``__main__.py`` file). + (e.g. a zipfile containing a top-level :file:`__main__.py` file). For a simple script, the specified code is simply executed in a fresh module namespace. For a valid :data:`sys.path` entry (typically a zipfile or @@ -119,26 +119,26 @@ The :mod:`runpy` module provides two functions: there is no such module at the specified location. The optional dictionary argument *init_globals* may be used to pre-populate - the module's globals dictionary before the code is executed. The supplied - dictionary will not be modified. If any of the special global variables - below are defined in the supplied dictionary, those definitions are + the module's globals dictionary before the code is executed. + *init_globals* will not be modified. If any of the special global variables + below are defined in *init_globals*, those definitions are overridden by :func:`run_path`. The special global variables ``__name__``, ``__spec__``, ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` are set in the globals - dictionary before the module code is executed (Note that this is a + dictionary before the module code is executed. (Note that this is a minimal set of variables - other variables may be set implicitly as an - interpreter implementation detail). + interpreter implementation detail.) ``__name__`` is set to *run_name* if this optional argument is not :const:`None` and to ``''`` otherwise. - If the supplied path directly references a script file (whether as source - or as precompiled byte code), then ``__file__`` will be set to the - supplied path, and ``__spec__``, ``__cached__``, ``__loader__`` and + If *file_path* directly references a script file (whether as source + or as precompiled byte code), then ``__file__`` will be set to + *file_path*, and ``__spec__``, ``__cached__``, ``__loader__`` and ``__package__`` will all be set to :const:`None`. - If the supplied path is a reference to a valid :data:`sys.path` entry, then + If *file_path* is a reference to a valid :data:`sys.path` entry, then ``__spec__`` will be set appropriately for the imported :mod:`__main__` module (that is, ``__spec__.name`` will always be ``__main__``). ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` will be @@ -146,7 +146,7 @@ The :mod:`runpy` module provides two functions: A number of alterations are also made to the :mod:`sys` module. Firstly, :data:`sys.path` may be altered as described above. ``sys.argv[0]`` is updated - with the value of ``path_name`` and ``sys.modules[__name__]`` is updated + with the value of *file_path* and ``sys.modules[__name__]`` is updated with a temporary module object for the module being executed. All modifications to items in :mod:`sys` are reverted before the function returns. diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst index 01bac5af..517dbe8c 100644 --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -1,5 +1,5 @@ -:mod:`sched` --- Event scheduler -================================ +:mod:`!sched` --- Event scheduler +================================= .. module:: sched :synopsis: General purpose event scheduler. @@ -36,7 +36,7 @@ scheduler: Example:: >>> import sched, time - >>> s = sched.scheduler(time.monotonic, time.sleep) + >>> s = sched.scheduler(time.time, time.sleep) >>> def print_time(a='default'): ... print("From print_time", time.time(), a) ... diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index 4405dfc0..75dafc54 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -1,5 +1,5 @@ -:mod:`secrets` --- Generate secure random numbers for managing secrets -====================================================================== +:mod:`!secrets` --- Generate secure random numbers for managing secrets +======================================================================= .. module:: secrets :synopsis: Generate secure random numbers for managing secrets. @@ -42,17 +42,17 @@ randomness that your operating system provides. sources provided by the operating system. See :class:`random.SystemRandom` for additional details. -.. function:: choice(sequence) +.. function:: choice(seq) Return a randomly chosen element from a non-empty sequence. -.. function:: randbelow(n) +.. function:: randbelow(exclusive_upper_bound) - Return a random int in the range [0, *n*). + Return a random int in the range [0, *exclusive_upper_bound*). .. function:: randbits(k) - Return an int with *k* random bits. + Return a non-negative int with *k* random bits. Generating tokens @@ -155,7 +155,7 @@ Generate an eight-character alphanumeric password: .. note:: Applications should not - `store passwords in a recoverable format `_, + :cwe:`store passwords in a recoverable format <257>`, whether plain text or encrypted. They should be salted and hashed using a cryptographically strong one-way (irreversible) hash function. diff --git a/Doc/library/security_warnings.rst b/Doc/library/security_warnings.rst index 284f3658..a573c98f 100644 --- a/Doc/library/security_warnings.rst +++ b/Doc/library/security_warnings.rst @@ -9,7 +9,6 @@ The following modules have specific security considerations: * :mod:`base64`: :ref:`base64 security considerations ` in :rfc:`4648` -* :mod:`cgi`: :ref:`CGI security considerations ` * :mod:`hashlib`: :ref:`all constructors take a "usedforsecurity" keyword-only argument disabling known insecure and blocked algorithms ` diff --git a/Doc/library/select.rst b/Doc/library/select.rst index c2941e62..f23a249f 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -1,5 +1,5 @@ -:mod:`select` --- Waiting for I/O completion -============================================ +:mod:`!select` --- Waiting for I/O completion +============================================= .. module:: select :synopsis: Wait for I/O completion on multiple streams. @@ -129,7 +129,7 @@ The module defines the following: Empty iterables are allowed, but acceptance of three empty iterables is platform-dependent. (It is known to work on Unix but not on Windows.) The - optional *timeout* argument specifies a time-out as a floating point number + optional *timeout* argument specifies a time-out as a floating-point number in seconds. When the *timeout* argument is omitted the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks. @@ -185,8 +185,8 @@ The module defines the following: ----------------------------- Solaris and derivatives have ``/dev/poll``. While :c:func:`!select` is -O(highest file descriptor) and :c:func:`!poll` is O(number of file -descriptors), ``/dev/poll`` is O(active file descriptors). +*O*\ (*highest file descriptor*) and :c:func:`!poll` is *O*\ (*number of file +descriptors*), ``/dev/poll`` is *O*\ (*active file descriptors*). ``/dev/poll`` behaviour is very close to the standard :c:func:`!poll` object. @@ -381,8 +381,8 @@ scalability for network servers that service many, many clients at the same time. :c:func:`!poll` scales better because the system call only requires listing the file descriptors of interest, while :c:func:`!select` builds a bitmap, turns on bits for the fds of interest, and then afterward the whole bitmap has to be -linearly scanned again. :c:func:`!select` is O(highest file descriptor), while -:c:func:`!poll` is O(number of file descriptors). +linearly scanned again. :c:func:`!select` is *O*\ (*highest file descriptor*), while +:c:func:`!poll` is *O*\ (*number of file descriptors*). .. method:: poll.register(fd[, eventmask]) diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst index dd50bac3..de8c3ef0 100644 --- a/Doc/library/selectors.rst +++ b/Doc/library/selectors.rst @@ -1,5 +1,5 @@ -:mod:`selectors` --- High-level I/O multiplexing -================================================ +:mod:`!selectors` --- High-level I/O multiplexing +================================================= .. module:: selectors :synopsis: High-level I/O multiplexing. @@ -21,7 +21,7 @@ It defines a :class:`BaseSelector` abstract base class, along with several concrete implementations (:class:`KqueueSelector`, :class:`EpollSelector`...), that can be used to wait for I/O readiness notification on multiple file objects. In the following, "file object" refers to any object with a -:meth:`fileno()` method, or a raw file descriptor. See :term:`file object`. +:meth:`~io.IOBase.fileno` method, or a raw file descriptor. See :term:`file object`. :class:`DefaultSelector` is an alias to the most efficient implementation available on the current platform: this should be the default choice for most diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index 01314f49..6e74a59b 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -1,5 +1,5 @@ -:mod:`shelve` --- Python object persistence -=========================================== +:mod:`!shelve` --- Python object persistence +============================================ .. module:: shelve :synopsis: Python object persistence. @@ -86,7 +86,7 @@ Two additional methods are supported: .. seealso:: - `Persistent dictionary recipe `_ + `Persistent dictionary recipe `_ with widely supported storage formats and having the speed of native dictionaries. @@ -94,9 +94,9 @@ Two additional methods are supported: Restrictions ------------ - .. index:: - pair: module; dbm.ndbm - pair: module; dbm.gnu +.. index:: + pair: module; dbm.ndbm + pair: module; dbm.gnu * The choice of which database package will be used (such as :mod:`dbm.ndbm` or :mod:`dbm.gnu`) depends on which interface is available. Therefore it is not @@ -113,6 +113,9 @@ Restrictions differs across Unix versions and requires knowledge about the database implementation used. +* On macOS :mod:`dbm.ndbm` can silently corrupt the database file on updates, + which can cause hard crashes when trying to read from the database. + .. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8') @@ -149,13 +152,14 @@ Restrictions .. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8') - A subclass of :class:`Shelf` which exposes :meth:`first`, :meth:`!next`, - :meth:`previous`, :meth:`last` and :meth:`set_location` which are available - in the third-party :mod:`bsddb` module from `pybsddb + A subclass of :class:`Shelf` which exposes :meth:`!first`, :meth:`!next`, + :meth:`!previous`, :meth:`!last` and :meth:`!set_location` methods. + These are available + in the third-party :mod:`!bsddb` module from `pybsddb `_ but not in other database modules. The *dict* object passed to the constructor must support those methods. This is generally accomplished by calling one of - :func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The + :func:`!bsddb.hashopen`, :func:`!bsddb.btopen` or :func:`!bsddb.rnopen`. The optional *protocol*, *writeback*, and *keyencoding* parameters have the same interpretation as for the :class:`Shelf` class. diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index f94833ad..a96f0864 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -1,5 +1,5 @@ -:mod:`shlex` --- Simple lexical analysis -======================================== +:mod:`!shlex` --- Simple lexical analysis +========================================= .. module:: shlex :synopsis: Simple lexical analysis for Unix shell-like languages. @@ -412,17 +412,17 @@ otherwise. To illustrate, you can see the difference in the following snippet: .. doctest:: :options: +NORMALIZE_WHITESPACE - >>> import shlex - >>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")" - >>> s = shlex.shlex(text, posix=True) - >>> s.whitespace_split = True - >>> list(s) - ['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)'] - >>> s = shlex.shlex(text, posix=True, punctuation_chars=True) - >>> s.whitespace_split = True - >>> list(s) - ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';', - '(', 'def', 'ghi', ')'] + >>> import shlex + >>> text = "a && b; c && d || e; f >'abc'; (def \"ghi\")" + >>> s = shlex.shlex(text, posix=True) + >>> s.whitespace_split = True + >>> list(s) + ['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)'] + >>> s = shlex.shlex(text, posix=True, punctuation_chars=True) + >>> s.whitespace_split = True + >>> list(s) + ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';', + '(', 'def', 'ghi', ')'] Of course, tokens will be returned which are not valid for shells, and you'll need to implement your own error checks on the returned tokens. @@ -431,10 +431,10 @@ Instead of passing ``True`` as the value for the punctuation_chars parameter, you can pass a string with specific characters, which will be used to determine which characters constitute punctuation. For example:: - >>> import shlex - >>> s = shlex.shlex("a && b || c", punctuation_chars="|") - >>> list(s) - ['a', '&', '&', 'b', '||', 'c'] + >>> import shlex + >>> s = shlex.shlex("a && b || c", punctuation_chars="|") + >>> list(s) + ['a', '&', '&', 'b', '||', 'c'] .. note:: When ``punctuation_chars`` is specified, the :attr:`~shlex.wordchars` attribute is augmented with the characters ``~-./*?=``. That is because these diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 4390a8e2..5b5b9ee6 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -1,5 +1,5 @@ -:mod:`shutil` --- High-level file operations -============================================ +:mod:`!shutil` --- High-level file operations +============================================= .. module:: shutil :synopsis: High-level file operations, including copying. @@ -39,7 +39,7 @@ Directory and files operations .. function:: copyfileobj(fsrc, fdst[, length]) - Copy the contents of the file-like object *fsrc* to the file-like object *fdst*. + Copy the contents of the :term:`file-like object ` *fsrc* to the file-like object *fdst*. The integer *length*, if given, is the buffer size. In particular, a negative *length* value means to copy the data without looping over the source data in chunks; by default the data is read in chunks to avoid uncontrolled memory @@ -52,7 +52,7 @@ Directory and files operations Copy the contents (no metadata) of the file named *src* to a file named *dst* and return *dst* in the most efficient way possible. - *src* and *dst* are path-like objects or path names given as strings. + *src* and *dst* are :term:`path-like objects ` or path names given as strings. *dst* must be the complete target file name; look at :func:`~shutil.copy` for a copy that accepts a target directory path. If *src* and *dst* @@ -94,7 +94,7 @@ Directory and files operations .. function:: copymode(src, dst, *, follow_symlinks=True) Copy the permission bits from *src* to *dst*. The file contents, owner, and - group are unaffected. *src* and *dst* are path-like objects or path names + group are unaffected. *src* and *dst* are :term:`path-like objects ` or path names given as strings. If *follow_symlinks* is false, and both *src* and *dst* are symbolic links, :func:`copymode` will attempt to modify the mode of *dst* itself (rather @@ -113,7 +113,7 @@ Directory and files operations Copy the permission bits, last access time, last modification time, and flags from *src* to *dst*. On Linux, :func:`copystat` also copies the "extended attributes" where possible. The file contents, owner, and - group are unaffected. *src* and *dst* are path-like objects or path + group are unaffected. *src* and *dst* are :term:`path-like objects ` or path names given as strings. If *follow_symlinks* is false, and *src* and *dst* both @@ -242,7 +242,7 @@ Directory and files operations be copied as far as the platform allows; if false or omitted, the contents and metadata of the linked files are copied to the new tree. - When *symlinks* is false, if the file pointed by the symlink doesn't + When *symlinks* is false, if the file pointed to by the symlink doesn't exist, an exception will be added in the list of errors raised in an :exc:`Error` exception at the end of the copy process. You can set the optional *ignore_dangling_symlinks* flag to true if you @@ -274,23 +274,23 @@ Directory and files operations .. audit-event:: shutil.copytree src,dst shutil.copytree - .. versionchanged:: 3.3 - Copy metadata when *symlinks* is false. - Now returns *dst*. - .. versionchanged:: 3.2 Added the *copy_function* argument to be able to provide a custom copy function. Added the *ignore_dangling_symlinks* argument to silence dangling symlinks errors when *symlinks* is false. + .. versionchanged:: 3.3 + Copy metadata when *symlinks* is false. + Now returns *dst*. + .. versionchanged:: 3.8 Platform-specific fast-copy syscalls may be used internally in order to copy the file more efficiently. See :ref:`shutil-platform-dependent-efficient-copy-operations` section. - .. versionadded:: 3.8 - The *dirs_exist_ok* parameter. + .. versionchanged:: 3.8 + Added the *dirs_exist_ok* parameter. .. function:: rmtree(path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None) @@ -338,11 +338,17 @@ Directory and files operations before removing the junction. .. versionchanged:: 3.11 - The *dir_fd* parameter. + Added the *dir_fd* parameter. .. versionchanged:: 3.12 Added the *onexc* parameter, deprecated *onerror*. + .. versionchanged:: 3.13 + :func:`!rmtree` now ignores :exc:`FileNotFoundError` exceptions for all + but the top-level path. + Exceptions other than :exc:`OSError` and subclasses of :exc:`!OSError` + are now always propagated to the caller. + .. attribute:: rmtree.avoids_symlink_attacks Indicates whether the current platform and implementation provides a @@ -354,21 +360,24 @@ Directory and files operations .. function:: move(src, dst, copy_function=copy2) - Recursively move a file or directory (*src*) to another location (*dst*) - and return the destination. + Recursively move a file or directory (*src*) to another location and return + the destination. - If the destination is an existing directory, then *src* is moved inside that - directory. If the destination already exists but is not a directory, it may - be overwritten depending on :func:`os.rename` semantics. + If *dst* is an existing directory or a symlink to a directory, then *src* + is moved inside that directory. The destination path in that directory must + not already exist. + + If *dst* already exists but is not a directory, it may be overwritten + depending on :func:`os.rename` semantics. If the destination is on the current filesystem, then :func:`os.rename` is - used. Otherwise, *src* is copied to *dst* using *copy_function* and then - removed. In case of symlinks, a new symlink pointing to the target of *src* - will be created in or as *dst* and *src* will be removed. + used. Otherwise, *src* is copied to the destination using *copy_function* + and then removed. In case of symlinks, a new symlink pointing to the target + of *src* will be created as the destination and *src* will be removed. - If *copy_function* is given, it must be a callable that takes two arguments - *src* and *dst*, and will be used to copy *src* to *dst* if - :func:`os.rename` cannot be used. If the source is a directory, + If *copy_function* is given, it must be a callable that takes two arguments, + *src* and the destination, and will be used to copy *src* to the destination + if :func:`os.rename` cannot be used. If the source is a directory, :func:`copytree` is called, passing it the *copy_function*. The default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the *copy_function* allows the move to succeed when it is not possible to also @@ -412,7 +421,8 @@ Directory and files operations .. availability:: Unix, Windows. -.. function:: chown(path, user=None, group=None) +.. function:: chown(path, user=None, group=None, *, dir_fd=None, \ + follow_symlinks=True) Change owner *user* and/or *group* of the given *path*. @@ -427,6 +437,9 @@ Directory and files operations .. versionadded:: 3.3 + .. versionchanged:: 3.13 + Added *dir_fd* and *follow_symlinks* parameters. + .. function:: which(cmd, mode=os.F_OK | os.X_OK, path=None) @@ -434,10 +447,12 @@ Directory and files operations called. If no *cmd* would be called, return ``None``. *mode* is a permission mask passed to :func:`os.access`, by default - determining if the file exists and executable. + determining if the file exists and is executable. - When no *path* is specified, the results of :func:`os.environ` are used, - returning either the "PATH" value or a fallback of :data:`os.defpath`. + *path* is a "``PATH`` string" specifying the directories to look in, + delimited by :data:`os.pathsep`. When no *path* is specified, the + :envvar:`PATH` environment variable is read from :data:`os.environ`, + falling back to :data:`os.defpath` if it is not set. On Windows, the current directory is prepended to the *path* if *mode* does not include ``os.X_OK``. When the *mode* does include ``os.X_OK``, the @@ -446,9 +461,9 @@ Directory and files operations consulting the current working directory for executables: set the environment variable ``NoDefaultCurrentDirectoryInExePath``. - Also on Windows, the ``PATHEXT`` variable is used to resolve commands - that may not already include an extension. For example, if you call - ``shutil.which("python")``, :func:`which` will search ``PATHEXT`` + Also on Windows, the :envvar:`PATHEXT` environment variable is used to + resolve commands that may not already include an extension. For example, + if you call ``shutil.which("python")``, :func:`which` will search ``PATHEXT`` to know that it should look for ``python.exe`` within the *path* directories. For example, on Windows:: @@ -574,7 +589,9 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. Create an archive file (such as zip or tar) and return its name. *base_name* is the name of the file to create, including the path, minus - any format-specific extension. *format* is the archive format: one of + any format-specific extension. + + *format* is the archive format: one of "zip" (if the :mod:`zlib` module is available), "tar", "gztar" (if the :mod:`zlib` module is available), "bztar" (if the :mod:`bz2` module is available), or "xztar" (if the :mod:`lzma` module is available). diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 7ee5ece8..17fcb2b3 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -1,5 +1,5 @@ -:mod:`signal` --- Set handlers for asynchronous events -====================================================== +:mod:`!signal` --- Set handlers for asynchronous events +======================================================= .. module:: signal :synopsis: Set handlers for asynchronous events. @@ -26,9 +26,9 @@ explicitly reset (Python emulates the BSD style interface regardless of the underlying implementation), with the exception of the handler for :const:`SIGCHLD`, which follows the underlying implementation. -On WebAssembly platforms ``wasm32-emscripten`` and ``wasm32-wasi``, signals -are emulated and therefore behave differently. Several functions and signals -are not available on these platforms. +On WebAssembly platforms, signals are emulated and therefore behave +differently. Several functions and signals are not available on these +platforms. Execution of Python signal handlers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -157,6 +157,8 @@ The variables defined in the :mod:`signal` module are: Alias to :data:`SIGCHLD`. + .. availability:: not macOS. + .. data:: SIGCONT Continue the process if it is currently stopped @@ -409,7 +411,7 @@ The :mod:`signal` module defines the following functions: See the :manpage:`pidfd_send_signal(2)` man page for more information. - .. availability:: Linux >= 5.1 + .. availability:: Linux >= 5.1, Android >= :func:`build-time ` API level 31 .. versionadded:: 3.9 @@ -423,7 +425,7 @@ The :mod:`signal` module defines the following functions: signal to a particular Python thread would be to force a running system call to fail with :exc:`InterruptedError`. - Use :func:`threading.get_ident()` or the :attr:`~threading.Thread.ident` + Use :func:`threading.get_ident` or the :attr:`~threading.Thread.ident` attribute of :class:`threading.Thread` objects to get a suitable value for *thread_id*. diff --git a/Doc/library/site.rst b/Doc/library/site.rst index 02880c56..4508091f 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -1,5 +1,5 @@ -:mod:`site` --- Site-specific configuration hook -================================================ +:mod:`!site` --- Site-specific configuration hook +================================================= .. module:: site :synopsis: Module responsible for site-specific configuration. @@ -15,8 +15,9 @@ import can be suppressed using the interpreter's :option:`-S` option. .. index:: triple: module; search; path -Importing this module will append site-specific paths to the module search path -and add a few builtins, unless :option:`-S` was used. In that case, this module +Importing this module normally appends site-specific paths to the module search path +and adds :ref:`callables `, including :func:`help` to the built-in +namespace. However, Python startup option :option:`-S` blocks this and this module can be safely imported with no automatic modifications to the module search path or additions to the builtins. To explicitly trigger the usual site-specific additions, call the :func:`main` function. @@ -32,7 +33,10 @@ It starts by constructing up to four directories from a head and a tail part. For the head part, it uses ``sys.prefix`` and ``sys.exec_prefix``; empty heads are skipped. For the tail part, it uses the empty string and then :file:`lib/site-packages` (on Windows) or -:file:`lib/python{X.Y}/site-packages` (on Unix and macOS). For each +:file:`lib/python{X.Y[t]}/site-packages` (on Unix and macOS). (The +optional suffix "t" indicates the :term:`free threading` build, and is +appended if ``"t"`` is present in the :attr:`sys.abiflags` constant.) +For each of the distinct head-tail combinations, it sees if it refers to an existing directory, and if so, adds it to ``sys.path`` and also inspects the newly added path for configuration files. @@ -40,6 +44,11 @@ added path for configuration files. .. versionchanged:: 3.5 Support for the "site-python" directory has been removed. +.. versionchanged:: 3.13 + On Unix, :term:`Free threading ` Python installations are + identified by the "t" suffix in the version-specific directory name, such as + :file:`lib/python3.13t/`. + If a file named "pyvenv.cfg" exists one directory above sys.executable, sys.prefix and sys.exec_prefix are set to that directory and it is also checked for site-packages (sys.base_prefix and @@ -74,6 +83,10 @@ with ``import`` (followed by space or tab) are executed. Limiting a code chunk to a single line is a deliberate measure to discourage putting anything more complex here. +.. versionchanged:: 3.13 + The :file:`.pth` files are now decoded by UTF-8 at first and then by the + :term:`locale encoding` if it fails. + .. index:: single: package triple: path; configuration; file @@ -184,11 +197,12 @@ Module contents Path to the user site-packages for the running Python. Can be ``None`` if :func:`getusersitepackages` hasn't been called yet. Default value is - :file:`~/.local/lib/python{X.Y}/site-packages` for UNIX and non-framework + :file:`~/.local/lib/python{X.Y}[t]/site-packages` for UNIX and non-framework macOS builds, :file:`~/Library/Python/{X.Y}/lib/python/site-packages` for macOS framework builds, and :file:`{%APPDATA%}\\Python\\Python{XY}\\site-packages` - on Windows. This directory is a site directory, which means that - :file:`.pth` files in it will be processed. + on Windows. The optional "t" indicates the free-threaded build. This + directory is a site directory, which means that :file:`.pth` files in it + will be processed. .. data:: USER_BASE @@ -266,11 +280,11 @@ If it is called without arguments, it will print the contents of :data:`USER_BASE` and whether the directory exists, then the same thing for :data:`USER_SITE`, and finally the value of :data:`ENABLE_USER_SITE`. -.. cmdoption:: --user-base +.. option:: --user-base Print the path to the user base directory. -.. cmdoption:: --user-site +.. option:: --user-site Print the path to the user site-packages directory. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst new file mode 100644 index 00000000..c704f4a2 --- /dev/null +++ b/Doc/library/smtpd.rst @@ -0,0 +1,18 @@ +:mod:`!smtpd` --- SMTP Server +============================= + +.. module:: smtpd + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +A possible replacement is the third-party :pypi:`aiosmtpd` library. This +library is not maintained or supported by the Python core team. + +The last version of Python that provided the :mod:`!smtpd` module was +`Python 3.11 `_. diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index aaec2aa1..7cd530a5 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -1,5 +1,5 @@ -:mod:`smtplib` --- SMTP protocol client -======================================= +:mod:`!smtplib` --- SMTP protocol client +======================================== .. module:: smtplib :synopsis: SMTP protocol client (requires sockets). @@ -556,34 +556,33 @@ This example prompts the user for addresses needed in the message envelope ('To' and 'From' addresses), and the message to be delivered. Note that the headers to be included with the message must be included in the message as entered; this example doesn't do any processing of the :rfc:`822` headers. In particular, the -'To' and 'From' addresses must be included in the message headers explicitly. :: +'To' and 'From' addresses must be included in the message headers explicitly:: import smtplib - def prompt(prompt): - return input(prompt).strip() + def prompt(title): + return input(title).strip() - fromaddr = prompt("From: ") - toaddrs = prompt("To: ").split() + from_addr = prompt("From: ") + to_addrs = prompt("To: ").split() print("Enter message, end with ^D (Unix) or ^Z (Windows):") # Add the From: and To: headers at the start! - msg = ("From: %s\r\nTo: %s\r\n\r\n" - % (fromaddr, ", ".join(toaddrs))) + lines = [f"From: {from_addr}", f"To: {', '.join(to_addrs)}", ""] while True: try: line = input() except EOFError: break - if not line: - break - msg = msg + line + else: + lines.append(line) + msg = "\r\n".join(lines) print("Message length is", len(msg)) - server = smtplib.SMTP('localhost') + server = smtplib.SMTP("localhost") server.set_debuglevel(1) - server.sendmail(fromaddr, toaddrs, msg) + server.sendmail(from_addr, to_addrs, msg) server.quit() .. note:: diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index fa9323e1..6b71db4f 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -1,104 +1,19 @@ -:mod:`sndhdr` --- Determine type of sound file -============================================== +:mod:`!sndhdr` --- Determine type of sound file +=============================================== .. module:: sndhdr - :synopsis: Determine type of a sound file. + :synopsis: Removed in 3.13. :deprecated: -.. sectionauthor:: Fred L. Drake, Jr. -.. Based on comments in the module source file. - -**Source code:** :source:`Lib/sndhdr.py` - -.. index:: - single: A-LAW - single: u-LAW - .. deprecated-removed:: 3.11 3.13 - The :mod:`sndhdr` module is deprecated - (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). - --------------- - -The :mod:`sndhdr` provides utility functions which attempt to determine the type -of sound data which is in a file. When these functions are able to determine -what type of sound data is stored in a file, they return a -:func:`~collections.namedtuple`, containing five attributes: (``filetype``, -``framerate``, ``nchannels``, ``nframes``, ``sampwidth``). The value for *type* -indicates the data type and will be one of the strings ``'aifc'``, ``'aiff'``, -``'au'``, ``'hcom'``, ``'sndr'``, ``'sndt'``, ``'voc'``, ``'wav'``, ``'8svx'``, -``'sb'``, ``'ub'``, or ``'ul'``. The *sampling_rate* will be either the actual -value or ``0`` if unknown or difficult to decode. Similarly, *channels* will be -either the number of channels or ``0`` if it cannot be determined or if the -value is difficult to decode. The value for *frames* will be either the number -of frames or ``-1``. The last item in the tuple, *bits_per_sample*, will either -be the sample size in bits or ``'A'`` for A-LAW or ``'U'`` for u-LAW. - - -.. function:: what(filename) - - Determines the type of sound data stored in the file *filename* using - :func:`whathdr`. If it succeeds, returns a namedtuple as described above, otherwise - ``None`` is returned. - - .. versionchanged:: 3.5 - Result changed from a tuple to a namedtuple. - - -.. function:: whathdr(filename) - - Determines the type of sound data stored in a file based on the file header. - The name of the file is given by *filename*. This function returns a namedtuple as - described above on success, or ``None``. - - .. versionchanged:: 3.5 - Result changed from a tuple to a namedtuple. - -The following sound header types are recognized, as listed below with the return value -from :func:`whathdr`: and :func:`what`: - -+------------+------------------------------------+ -| Value | Sound header format | -+============+====================================+ -| ``'aifc'`` | Compressed Audio Interchange Files | -+------------+------------------------------------+ -| ``'aiff'`` | Audio Interchange Files | -+------------+------------------------------------+ -| ``'au'`` | Au Files | -+------------+------------------------------------+ -| ``'hcom'`` | HCOM Files | -+------------+------------------------------------+ -| ``'sndt'`` | Sndtool Sound Files | -+------------+------------------------------------+ -| ``'voc'`` | Creative Labs Audio Files | -+------------+------------------------------------+ -| ``'wav'`` | Waveform Audio File Format Files | -+------------+------------------------------------+ -| ``'8svx'`` | 8-Bit Sampled Voice Files | -+------------+------------------------------------+ -| ``'sb'`` | Signed Byte Audio Data Files | -+------------+------------------------------------+ -| ``'ub'`` | UB Files | -+------------+------------------------------------+ -| ``'ul'`` | uLAW Audio Files | -+------------+------------------------------------+ - -.. data:: tests - - A list of functions performing the individual tests. Each function takes two - arguments: the byte-stream and an open file-like object. When :func:`what` is - called with a byte-stream, the file-like object will be ``None``. - - The test function should return a string describing the image type if the test - succeeded, or ``None`` if it failed. - -Example: -.. code-block:: pycon +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - >>> import sndhdr - >>> imghdr.what('bass.wav') - 'wav' - >>> imghdr.whathdr('bass.wav') - 'wav' +Possible replacements are third-party modules from PyPI: +:pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic`. +These are not supported or maintained by the Python core team. +The last version of Python that provided the :mod:`!sndhdr` module was +`Python 3.12 `_. diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 83957c87..9ae01855 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1,5 +1,5 @@ -:mod:`socket` --- Low-level networking interface -================================================ +:mod:`!socket` --- Low-level networking interface +================================================= .. module:: socket :synopsis: Low-level networking interface. @@ -23,7 +23,7 @@ all modern Unix systems, Windows, MacOS, and probably additional platforms. The Python interface is a straightforward transliteration of the Unix system call and library interface for sockets to Python's object-oriented style: the -:func:`.socket` function returns a :dfn:`socket object` whose methods implement +:func:`~socket.socket` function returns a :dfn:`socket object` whose methods implement the various socket system calls. Parameter types are somewhat higher-level than in the C interface: as with :meth:`read` and :meth:`write` operations on Python files, buffer allocation on receive operations is automatic, and buffer length @@ -185,7 +185,7 @@ created. Socket addresses are represented as follows: .. versionadded:: 3.7 - :const:`AF_PACKET` is a low-level interface directly to network devices. - The packets are represented by the tuple + The addresses are represented by the tuple ``(ifname, proto[, pkttype[, hatype[, addr]]])`` where: - *ifname* - String specifying the device name. @@ -193,7 +193,6 @@ created. Socket addresses are represented as follows: May be :data:`ETH_P_ALL` to capture all protocols, one of the :ref:`ETHERTYPE_* constants ` or any other Ethernet protocol number. - Value must be in network-byte-order. - *pkttype* - Optional integer specifying the packet type: - ``PACKET_HOST`` (the default) - Packet addressed to the local host. @@ -207,14 +206,14 @@ created. Socket addresses are represented as follows: - *addr* - Optional bytes-like object specifying the hardware physical address, whose interpretation depends on the device. - .. availability:: Linux >= 2.2. + .. availability:: Linux >= 2.2. - :const:`AF_QIPCRTR` is a Linux-only socket based interface for communicating with services running on co-processors in Qualcomm platforms. The address family is represented as a ``(node, port)`` tuple where the *node* and *port* are non-negative integers. - .. availability:: Linux >= 4.7. + .. availability:: Linux >= 4.7. .. versionadded:: 3.8 @@ -312,7 +311,7 @@ Exceptions The accompanying value is a pair ``(error, string)`` representing an error returned by a library call. *string* represents the description of *error*, as returned by the :c:func:`gai_strerror` C function. The - numeric *error* value will match one of the :const:`EAI_\*` constants + numeric *error* value will match one of the :const:`!EAI_\*` constants defined in this module. .. versionchanged:: 3.3 @@ -348,10 +347,15 @@ Constants AF_INET6 These constants represent the address (and protocol) families, used for the - first argument to :func:`.socket`. If the :const:`AF_UNIX` constant is not + first argument to :func:`~socket.socket`. If the :const:`AF_UNIX` constant is not defined then this protocol is unsupported. More constants may be available depending on the system. +.. data:: AF_UNSPEC + + :const:`AF_UNSPEC` means that + :func:`getaddrinfo` should return socket addresses for any + address family (either IPv4, IPv6, or any other) that can be used. .. data:: SOCK_STREAM SOCK_DGRAM @@ -360,7 +364,7 @@ Constants SOCK_SEQPACKET These constants represent the socket types, used for the second argument to - :func:`.socket`. More constants may be available depending on the system. + :func:`~socket.socket`. More constants may be available depending on the system. (Only :const:`SOCK_STREAM` and :const:`SOCK_DGRAM` appear to be generally useful.) @@ -380,6 +384,8 @@ Constants .. versionadded:: 3.2 +.. _socket-unix-constants: + .. data:: SO_* SOMAXCONN MSG_* @@ -397,7 +403,7 @@ Constants Many constants of these forms, documented in the Unix documentation on sockets and/or the IP protocol, are also defined in the socket module. They are - generally used in arguments to the :meth:`setsockopt` and :meth:`getsockopt` + generally used in arguments to the :meth:`~socket.setsockopt` and :meth:`~socket.getsockopt` methods of socket objects. In most cases, only those symbols that are defined in the Unix header files are defined; for a few symbols, default values are provided. @@ -439,6 +445,11 @@ Constants Added ``IP_PKTINFO``, ``IP_UNBLOCK_SOURCE``, ``IP_BLOCK_SOURCE``, ``IP_ADD_SOURCE_MEMBERSHIP``, ``IP_DROP_SOURCE_MEMBERSHIP``. + .. versionchanged:: 3.13 + Added ``SO_BINDTOIFINDEX``. On Linux this constant can be used in the + same way that ``SO_BINDTODEVICE`` is used, but with the index of a + network interface instead of its name. + .. data:: AF_CAN PF_CAN SOL_CAN_* @@ -689,6 +700,13 @@ Constants .. versionadded:: 3.12 +.. data:: SHUT_RD + SHUT_WR + SHUT_RDWR + + These constants are used by the :meth:`~socket.socket.shutdown` method of socket objects. + + .. availability:: not WASI. Functions ^^^^^^^^^ @@ -718,7 +736,7 @@ The following functions all create :ref:`socket objects `. of :meth:`socket.getpeername` but not the actual OS resource. Unlike :func:`socket.fromfd`, *fileno* will return the same socket and not a duplicate. This may help close a detached socket using - :meth:`socket.close()`. + :meth:`socket.close`. The newly created socket is :ref:`non-inheritable `. @@ -763,7 +781,7 @@ The following functions all create :ref:`socket objects `. Build a pair of connected socket objects using the given address family, socket type, and protocol number. Address family, socket type, and protocol number are - as for the :func:`.socket` function above. The default family is :const:`AF_UNIX` + as for the :func:`~socket.socket` function above. The default family is :const:`AF_UNIX` if defined on the platform; otherwise, the default is :const:`AF_INET`. The newly created sockets are :ref:`non-inheritable `. @@ -858,8 +876,8 @@ The following functions all create :ref:`socket objects `. .. function:: fromfd(fd, family, type, proto=0) Duplicate the file descriptor *fd* (an integer as returned by a file object's - :meth:`fileno` method) and build a socket object from the result. Address - family, socket type and protocol number are as for the :func:`.socket` function + :meth:`~io.IOBase.fileno` method) and build a socket object from the result. Address + family, socket type and protocol number are as for the :func:`~socket.socket` function above. The file descriptor should refer to a socket, but this is not checked --- subsequent operations on the object may fail if the file descriptor is invalid. This function is rarely needed, but can be used to get or set socket options on @@ -902,7 +920,9 @@ The :mod:`socket` module also offers various network-related services: .. versionadded:: 3.7 -.. function:: getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) +.. function:: getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0) + + This function wraps the C function ``getaddrinfo`` of the underlying system. Translate the *host*/*port* argument into a sequence of 5-tuples that contain all the necessary arguments for creating a socket connected to that service. @@ -912,8 +932,10 @@ The :mod:`socket` module also offers various network-related services: and *port*, you can pass ``NULL`` to the underlying C API. The *family*, *type* and *proto* arguments can be optionally specified - in order to narrow the list of addresses returned. Passing zero as a - value for each of these arguments selects the full range of results. + in order to provide options and limit the list of addresses returned. + Pass their default values (:data:`AF_UNSPEC`, 0, and 0, respectively) + to not limit the results. See the note below for details. + The *flags* argument can be one or several of the ``AI_*`` constants, and will influence how results are computed and returned. For example, :const:`AI_NUMERICHOST` will disable domain name resolution @@ -924,7 +946,7 @@ The :mod:`socket` module also offers various network-related services: ``(family, type, proto, canonname, sockaddr)`` In these tuples, *family*, *type*, *proto* are all integers and are - meant to be passed to the :func:`.socket` function. *canonname* will be + meant to be passed to the :func:`~socket.socket` function. *canonname* will be a string representing the canonical name of the *host* if :const:`AI_CANONNAME` is part of the *flags* argument; else *canonname* will be empty. *sockaddr* is a tuple describing a socket address, whose @@ -933,6 +955,29 @@ The :mod:`socket` module also offers various network-related services: :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` method. + .. note:: + + If you intend to use results from :func:`!getaddrinfo` to create a socket + (rather than, for example, retrieve *canonname*), + consider limiting the results by *type* (e.g. :data:`SOCK_STREAM` or + :data:`SOCK_DGRAM`) and/or *proto* (e.g. :data:`IPPROTO_TCP` or + :data:`IPPROTO_UDP`) that your application can handle. + + The behavior with default values of *family*, *type*, *proto* + and *flags* is system-specific. + + Many systems (for example, most Linux configurations) will return a sorted + list of all matching addresses. + These addresses should generally be tried in order until a connection succeeds + (possibly tried in parallel, for example, using a `Happy Eyeballs`_ algorithm). + In these cases, limiting the *type* and/or *proto* can help eliminate + unsuccessful or unusable connection attempts. + + Some systems will, however, only return a single address. + (For example, this was reported on Solaris and AIX configurations.) + On these systems, limiting the *type* and/or *proto* helps ensure that + this address is usable. + .. audit-event:: socket.getaddrinfo host,port,family,type,protocol socket.getaddrinfo The following example fetches address information for a hypothetical TCP @@ -952,6 +997,8 @@ The :mod:`socket` module also offers various network-related services: for IPv6 multicast addresses, string representing an address will not contain ``%scope_id`` part. +.. _Happy Eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs + .. function:: getfqdn([name]) Return a fully qualified domain name for *name*. If *name* is omitted or empty, @@ -1040,7 +1087,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: getprotobyname(protocolname) Translate an internet protocol name (for example, ``'icmp'``) to a constant - suitable for passing as the (optional) third argument to the :func:`.socket` + suitable for passing as the (optional) third argument to the :func:`~socket.socket` function. This is usually only needed for sockets opened in "raw" mode (:const:`SOCK_RAW`); for the normal socket modes, the correct protocol is chosen automatically if the protocol is omitted or zero. @@ -1202,7 +1249,7 @@ The :mod:`socket` module also offers various network-related services: buffer. Raises :exc:`OverflowError` if *length* is outside the permissible range of values. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. Most Unix platforms. @@ -1225,7 +1272,7 @@ The :mod:`socket` module also offers various network-related services: amount of ancillary data that can be received, since additional data may be able to fit into the padding area. - .. availability:: Unix, not Emscripten, not WASI. + .. availability:: Unix, not WASI. most Unix platforms. @@ -1254,7 +1301,7 @@ The :mod:`socket` module also offers various network-related services: .. audit-event:: socket.sethostname name socket.sethostname - .. availability:: Unix. + .. availability:: Unix, not Android. .. versionadded:: 3.3 @@ -1265,7 +1312,7 @@ The :mod:`socket` module also offers various network-related services: (index int, name string) tuples. :exc:`OSError` if the system call fails. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. .. versionadded:: 3.3 @@ -1292,7 +1339,7 @@ The :mod:`socket` module also offers various network-related services: interface name. :exc:`OSError` if no interface with the given name exists. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. .. versionadded:: 3.3 @@ -1309,7 +1356,7 @@ The :mod:`socket` module also offers various network-related services: interface index number. :exc:`OSError` if no interface with the given index exists. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. .. versionadded:: 3.3 @@ -1324,9 +1371,9 @@ The :mod:`socket` module also offers various network-related services: Send the list of file descriptors *fds* over an :const:`AF_UNIX` socket *sock*. The *fds* parameter is a sequence of file descriptors. - Consult :meth:`sendmsg` for the documentation of these parameters. + Consult :meth:`~socket.sendmsg` for the documentation of these parameters. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. Unix platforms supporting :meth:`~socket.sendmsg` and :const:`SCM_RIGHTS` mechanism. @@ -1338,9 +1385,9 @@ The :mod:`socket` module also offers various network-related services: Receive up to *maxfds* file descriptors from an :const:`AF_UNIX` socket *sock*. Return ``(msg, list(fds), flags, addr)``. - Consult :meth:`recvmsg` for the documentation of these parameters. + Consult :meth:`~socket.recvmsg` for the documentation of these parameters. - .. availability:: Unix, Windows, not Emscripten, not WASI. + .. availability:: Unix, Windows, not WASI. Unix platforms supporting :meth:`~socket.sendmsg` and :const:`SCM_RIGHTS` mechanism. @@ -1397,7 +1444,7 @@ to sockets. .. method:: socket.close() Mark the socket closed. The underlying system resource (e.g. a file - descriptor) is also closed when all file objects from :meth:`makefile()` + descriptor) is also closed when all file objects from :meth:`makefile` are closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data (after queued data is flushed). @@ -1412,10 +1459,10 @@ to sockets. .. note:: - :meth:`close()` releases the resource associated with a connection but + :meth:`close` releases the resource associated with a connection but does not necessarily close the connection immediately. If you want - to close the connection in a timely fashion, call :meth:`shutdown()` - before :meth:`close()`. + to close the connection in a timely fashion, call :meth:`shutdown` + before :meth:`close`. .. method:: socket.connect(address) @@ -1511,7 +1558,7 @@ to sockets. .. method:: socket.getsockopt(level, optname[, buflen]) Return the value of the given socket option (see the Unix man page - :manpage:`getsockopt(2)`). The needed symbolic constants (:const:`SO_\*` etc.) + :manpage:`getsockopt(2)`). The needed symbolic constants (:ref:`SO_\* etc. `) are defined in this module. If *buflen* is absent, an integer option is assumed and its integer value is returned by the function. If *buflen* is present, it specifies the maximum length of the buffer used to receive the option in, and @@ -1578,7 +1625,8 @@ to sockets. Return a :term:`file object` associated with the socket. The exact returned type depends on the arguments given to :meth:`makefile`. These arguments are interpreted the same way as by the built-in :func:`open` function, except - the only supported *mode* values are ``'r'`` (default), ``'w'`` and ``'b'``. + the only supported *mode* values are ``'r'`` (default), ``'w'``, ``'b'``, or + a combination of those. The socket must be in blocking mode; it can have a timeout, but the file object's internal buffer may end up in an inconsistent state if a timeout @@ -1599,8 +1647,9 @@ to sockets. Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified - by *bufsize*. See the Unix manual page :manpage:`recv(2)` for the meaning of - the optional argument *flags*; it defaults to zero. + by *bufsize*. A returned empty bytes object indicates that the client has disconnected. + See the Unix manual page :manpage:`recv(2)` for the meaning of the optional argument + *flags*; it defaults to zero. .. note:: @@ -1909,7 +1958,7 @@ to sockets. .. method:: socket.settimeout(value) Set a timeout on blocking socket operations. The *value* argument can be a - nonnegative floating point number expressing seconds, or ``None``. + nonnegative floating-point number expressing seconds, or ``None``. If a non-zero value is given, subsequent socket operations will raise a :exc:`timeout` exception if the timeout period *value* has elapsed before the operation has completed. If zero is given, the socket is put in @@ -1931,8 +1980,8 @@ to sockets. .. index:: pair: module; struct Set the value of the given socket option (see the Unix manual page - :manpage:`setsockopt(2)`). The needed symbolic constants are defined in the - :mod:`socket` module (:const:`SO_\*` etc.). The value can be an integer, + :manpage:`setsockopt(2)`). The needed symbolic constants are defined in this + module (:ref:`!SO_\* etc. `). The value can be an integer, ``None`` or a :term:`bytes-like object` representing a buffer. In the later case it is up to the caller to ensure that the bytestring contains the proper bits (see the optional built-in module :mod:`struct` for a way to @@ -2022,7 +2071,7 @@ can be changed by calling :func:`setdefaulttimeout`. in non-blocking mode. Also, the blocking and timeout modes are shared between file descriptors and socket objects that refer to the same network endpoint. This implementation detail can have visible consequences if e.g. you decide - to use the :meth:`~socket.fileno()` of a socket. + to use the :meth:`~socket.fileno` of a socket. Timeouts and the ``connect`` method ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2057,10 +2106,10 @@ Example Here are four minimal example programs using the TCP/IP protocol: a server that echoes all data that it receives back (servicing only one client), and a client -using it. Note that a server must perform the sequence :func:`.socket`, +using it. Note that a server must perform the sequence :func:`~socket.socket`, :meth:`~socket.bind`, :meth:`~socket.listen`, :meth:`~socket.accept` (possibly repeating the :meth:`~socket.accept` to service more than one client), while a -client only needs the sequence :func:`.socket`, :meth:`~socket.connect`. Also +client only needs the sequence :func:`~socket.socket`, :meth:`~socket.connect`. Also note that the server does not :meth:`~socket.sendall`/:meth:`~socket.recv` on the socket it is listening on but on the new socket returned by :meth:`~socket.accept`. @@ -2100,7 +2149,7 @@ The next two examples are identical to the above two, but support both IPv4 and IPv6. The server side will listen to the first address family available (it should listen to both instead). On most of IPv6-ready systems, IPv6 will take precedence and the server may not accept IPv4 traffic. The client side will try -to connect to the all addresses returned as a result of the name resolution, and +to connect to all the addresses returned as a result of the name resolution, and sends traffic to the first one connected successfully. :: # Echo server program diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst index d65e9fe8..f1f87ea9 100644 --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -1,5 +1,5 @@ -:mod:`socketserver` --- A framework for network servers -======================================================= +:mod:`!socketserver` --- A framework for network servers +======================================================== .. module:: socketserver :synopsis: A framework for network servers. @@ -116,23 +116,28 @@ server is the address family. :class:`ForkingMixIn` and the Forking classes mentioned below are only available on POSIX platforms that support :func:`~os.fork`. - :meth:`socketserver.ForkingMixIn.server_close` waits until all child - processes complete, except if - :attr:`socketserver.ForkingMixIn.block_on_close` attribute is false. + .. attribute:: block_on_close - :meth:`socketserver.ThreadingMixIn.server_close` waits until all non-daemon - threads complete, except if - :attr:`socketserver.ThreadingMixIn.block_on_close` attribute is false. Use - daemonic threads by setting - :data:`ThreadingMixIn.daemon_threads` to ``True`` to not wait until threads - complete. + :meth:`ForkingMixIn.server_close ` + waits until all child processes complete, except if + :attr:`block_on_close` attribute is ``False``. + + :meth:`ThreadingMixIn.server_close ` + waits until all non-daemon threads complete, except if + :attr:`block_on_close` attribute is ``False``. + + .. attribute:: daemon_threads + + For :class:`ThreadingMixIn` use daemonic threads by setting + :data:`ThreadingMixIn.daemon_threads ` + to ``True`` to not wait until threads complete. .. versionchanged:: 3.7 - :meth:`socketserver.ForkingMixIn.server_close` and - :meth:`socketserver.ThreadingMixIn.server_close` now waits until all + :meth:`ForkingMixIn.server_close ` and + :meth:`ThreadingMixIn.server_close ` now waits until all child processes and non-daemonic threads complete. - Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class + Add a new :attr:`ForkingMixIn.block_on_close ` class attribute to opt-in for the pre-3.7 behaviour. @@ -412,13 +417,13 @@ Request Handler Objects This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are - available to it; the request is available as :attr:`self.request`; the client - address as :attr:`self.client_address`; and the server instance as - :attr:`self.server`, in case it needs access to per-server information. + available to it; the request is available as :attr:`request`; the client + address as :attr:`client_address`; and the server instance as + :attr:`server`, in case it needs access to per-server information. - The type of :attr:`self.request` is different for datagram or stream - services. For stream services, :attr:`self.request` is a socket object; for - datagram services, :attr:`self.request` is a pair of string and socket. + The type of :attr:`request` is different for datagram or stream + services. For stream services, :attr:`request` is a socket object; for + datagram services, :attr:`request` is a pair of string and socket. .. method:: finish() @@ -428,20 +433,42 @@ Request Handler Objects raises an exception, this function will not be called. + .. attribute:: request + + The *new* :class:`socket.socket` object + to be used to communicate with the client. + + + .. attribute:: client_address + + Client address returned by :meth:`BaseServer.get_request`. + + + .. attribute:: server + + :class:`BaseServer` object used for handling the request. + + .. class:: StreamRequestHandler DatagramRequestHandler These :class:`BaseRequestHandler` subclasses override the :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish` - methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes. - The :attr:`self.rfile` and :attr:`self.wfile` attributes can be - read or written, respectively, to get the request data or return data - to the client. - The :attr:`!rfile` attributes support the :class:`io.BufferedIOBase` readable interface, - and :attr:`!wfile` attributes support the :class:`!io.BufferedIOBase` writable interface. + methods, and provide :attr:`rfile` and :attr:`wfile` attributes. + + .. attribute:: rfile + + A file object from which receives the request is read. + Support the :class:`io.BufferedIOBase` readable interface. + + .. attribute:: wfile + + A file object to which the reply is written. + Support the :class:`io.BufferedIOBase` writable interface + .. versionchanged:: 3.6 - :attr:`StreamRequestHandler.wfile` also supports the + :attr:`wfile` also supports the :class:`io.BufferedIOBase` writable interface. @@ -467,7 +494,7 @@ This is the server side:: def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("{} wrote:".format(self.client_address[0])) + print("Received from {}:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.sendall(self.data.upper()) @@ -498,8 +525,9 @@ objects that simplify communication by providing the standard file interface):: The difference is that the ``readline()`` call in the second handler will call ``recv()`` multiple times until it encounters a newline character, while the -single ``recv()`` call in the first handler will just return what has been sent -from the client in one ``sendall()`` call. +single ``recv()`` call in the first handler will just return what has been +received so far from the client's ``sendall()`` call (typically all of it, but +this is not guaranteed by the TCP protocol). This is the client side:: diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index d1693ea6..c16854bb 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -1,82 +1,18 @@ -:mod:`spwd` --- The shadow password database -============================================ +:mod:`!spwd` --- The shadow password database +============================================= .. module:: spwd - :platform: Unix - :synopsis: The shadow password database (getspnam() and friends). + :synopsis: Removed in 3.13. :deprecated: .. deprecated-removed:: 3.11 3.13 - The :mod:`spwd` module is deprecated - (see :pep:`PEP 594 <594#spwd>` for details and alternatives). --------------- +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. -This module provides access to the Unix shadow password database. It is -available on various Unix versions. - -.. include:: ../includes/wasm-notavail.rst - -You must have enough privileges to access the shadow password database (this -usually means you have to be root). - -Shadow password database entries are reported as a tuple-like object, whose -attributes correspond to the members of the ``spwd`` structure (Attribute field -below, see ````): - -+-------+---------------+---------------------------------+ -| Index | Attribute | Meaning | -+=======+===============+=================================+ -| 0 | ``sp_namp`` | Login name | -+-------+---------------+---------------------------------+ -| 1 | ``sp_pwdp`` | Encrypted password | -+-------+---------------+---------------------------------+ -| 2 | ``sp_lstchg`` | Date of last change | -+-------+---------------+---------------------------------+ -| 3 | ``sp_min`` | Minimal number of days between | -| | | changes | -+-------+---------------+---------------------------------+ -| 4 | ``sp_max`` | Maximum number of days between | -| | | changes | -+-------+---------------+---------------------------------+ -| 5 | ``sp_warn`` | Number of days before password | -| | | expires to warn user about it | -+-------+---------------+---------------------------------+ -| 6 | ``sp_inact`` | Number of days after password | -| | | expires until account is | -| | | disabled | -+-------+---------------+---------------------------------+ -| 7 | ``sp_expire`` | Number of days since 1970-01-01 | -| | | when account expires | -+-------+---------------+---------------------------------+ -| 8 | ``sp_flag`` | Reserved | -+-------+---------------+---------------------------------+ - -The sp_namp and sp_pwdp items are strings, all others are integers. -:exc:`KeyError` is raised if the entry asked for cannot be found. - -The following functions are defined: - - -.. function:: getspnam(name) - - Return the shadow password database entry for the given user name. - - .. versionchanged:: 3.6 - Raises a :exc:`PermissionError` instead of :exc:`KeyError` if the user - doesn't have privileges. - -.. function:: getspall() - - Return a list of all available shadow password database entries, in arbitrary - order. - - -.. seealso:: - - Module :mod:`grp` - An interface to the group database, similar to this. - - Module :mod:`pwd` - An interface to the normal password database, similar to this. +A possible replacement is the third-party library :pypi:`python-pam`. +This library is not supported or maintained by the Python core team. +The last version of Python that provided the :mod:`!spwd` module was +`Python 3.12 `_. diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index d5afaa1c..0d200449 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -1,5 +1,5 @@ -:mod:`sqlite3` --- DB-API 2.0 interface for SQLite databases -============================================================ +:mod:`!sqlite3` --- DB-API 2.0 interface for SQLite databases +============================================================= .. module:: sqlite3 :synopsis: A DB-API 2.0 implementation using SQLite 3.x. @@ -16,6 +16,8 @@ src = sqlite3.connect(":memory:", isolation_level=None) dst = sqlite3.connect("tutorial.db", isolation_level=None) src.backup(dst) + src.close() + dst.close() del src, dst .. _sqlite3-intro: @@ -29,7 +31,7 @@ PostgreSQL or Oracle. The :mod:`!sqlite3` module was written by Gerhard Häring. It provides an SQL interface compliant with the DB-API 2.0 specification described by :pep:`249`, and -requires SQLite 3.7.15 or newer. +requires SQLite 3.15.2 or newer. This document includes four main sections: @@ -125,7 +127,7 @@ and call :meth:`res.fetchone() ` to fetch the resulting row: We can see that the table has been created, as the query returns a :class:`tuple` containing the table's name. If we query ``sqlite_master`` for a non-existent table ``spam``, -:meth:`!res.fetchone()` will return ``None``: +:meth:`!res.fetchone` will return ``None``: .. doctest:: @@ -220,6 +222,7 @@ creating a new cursor, then querying the database: >>> title, year = res.fetchone() >>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}') The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975 + >>> new_con.close() You've now created an SQLite database using the :mod:`!sqlite3` module, inserted data and retrieved values from it in multiple ways. @@ -235,11 +238,11 @@ inserted data and retrieved values from it in multiple ways. * :ref:`sqlite3-howtos` for further reading: - * :ref:`sqlite3-placeholders` - * :ref:`sqlite3-adapters` - * :ref:`sqlite3-converters` - * :ref:`sqlite3-connection-context-manager` - * :ref:`sqlite3-howto-row-factory` + * :ref:`sqlite3-placeholders` + * :ref:`sqlite3-adapters` + * :ref:`sqlite3-converters` + * :ref:`sqlite3-connection-context-manager` + * :ref:`sqlite3-howto-row-factory` * :ref:`sqlite3-explanation` for in-depth background on transaction control. @@ -343,17 +346,23 @@ Module functions .. audit-event:: sqlite3.connect database sqlite3.connect .. audit-event:: sqlite3.connect/handle connection_handle sqlite3.connect - .. versionadded:: 3.4 - The *uri* parameter. + .. versionchanged:: 3.4 + Added the *uri* parameter. .. versionchanged:: 3.7 *database* can now also be a :term:`path-like object`, not only a string. - .. versionadded:: 3.10 - The ``sqlite3.connect/handle`` auditing event. + .. versionchanged:: 3.10 + Added the ``sqlite3.connect/handle`` auditing event. - .. versionadded:: 3.12 - The *autocommit* parameter. + .. versionchanged:: 3.12 + Added the *autocommit* parameter. + + .. versionchanged:: 3.13 + Positional use of the parameters *timeout*, *detect_types*, + *isolation_level*, *check_same_thread*, *factory*, *cached_statements*, + and *uri* is deprecated. + They will become keyword-only parameters in Python 3.15. .. function:: complete_statement(statement) @@ -388,29 +397,11 @@ Module functions will get tracebacks from callbacks on :data:`sys.stderr`. Use ``False`` to disable the feature again. - Register an :func:`unraisable hook handler ` for an - improved debug experience: - - .. testsetup:: sqlite3.trace - - import sqlite3 + .. note:: - .. doctest:: sqlite3.trace - - >>> sqlite3.enable_callback_tracebacks(True) - >>> con = sqlite3.connect(":memory:") - >>> def evil_trace(stmt): - ... 5/0 - ... - >>> con.set_trace_callback(evil_trace) - >>> def debug(unraisable): - ... print(f"{unraisable.exc_value!r} in callback {unraisable.object.__name__}") - ... print(f"Error message: {unraisable.err_msg}") - >>> import sys - >>> sys.unraisablehook = debug - >>> cur = con.execute("SELECT 1") - ZeroDivisionError('division by zero') in callback evil_trace - Error message: None + Errors in user-defined function callbacks are logged as unraisable exceptions. + Use an :func:`unraisable hook handler ` for + introspection of the failed callback. .. function:: register_adapter(type, adapter, /) @@ -523,32 +514,31 @@ Module constants the default `threading mode `_ the underlying SQLite library is compiled with. The SQLite threading modes are: - 1. **Single-thread**: In this mode, all mutexes are disabled and SQLite is - unsafe to use in more than a single thread at once. - 2. **Multi-thread**: In this mode, SQLite can be safely used by multiple - threads provided that no single database connection is used - simultaneously in two or more threads. - 3. **Serialized**: In serialized mode, SQLite can be safely used by - multiple threads with no restriction. + 1. **Single-thread**: In this mode, all mutexes are disabled and SQLite is + unsafe to use in more than a single thread at once. + 2. **Multi-thread**: In this mode, SQLite can be safely used by multiple + threads provided that no single database connection is used + simultaneously in two or more threads. + 3. **Serialized**: In serialized mode, SQLite can be safely used by + multiple threads with no restriction. The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels are as follows: - +------------------+-----------------+----------------------+-------------------------------+ - | SQLite threading | `threadsafety`_ | `SQLITE_THREADSAFE`_ | DB-API 2.0 meaning | - | mode | | | | - +==================+=================+======================+===============================+ - | single-thread | 0 | 0 | Threads may not share the | - | | | | module | - +------------------+-----------------+----------------------+-------------------------------+ - | multi-thread | 1 | 2 | Threads may share the module, | - | | | | but not connections | - +------------------+-----------------+----------------------+-------------------------------+ - | serialized | 3 | 1 | Threads may share the module, | - | | | | connections and cursors | - +------------------+-----------------+----------------------+-------------------------------+ - - .. _threadsafety: https://peps.python.org/pep-0249/#threadsafety + +------------------+----------------------+----------------------+-------------------------------+ + | SQLite threading | :pep:`threadsafety | `SQLITE_THREADSAFE`_ | DB-API 2.0 meaning | + | mode | <0249#threadsafety>` | | | + +==================+======================+======================+===============================+ + | single-thread | 0 | 0 | Threads may not share the | + | | | | module | + +------------------+----------------------+----------------------+-------------------------------+ + | multi-thread | 1 | 2 | Threads may share the module, | + | | | | but not connections | + +------------------+----------------------+----------------------+-------------------------------+ + | serialized | 3 | 1 | Threads may share the module, | + | | | | connections and cursors | + +------------------+----------------------+----------------------+-------------------------------+ + .. _SQLITE_THREADSAFE: https://sqlite.org/compile.html#threadsafe .. versionchanged:: 3.11 @@ -624,6 +614,12 @@ Connection objects * :ref:`sqlite3-connection-shortcuts` * :ref:`sqlite3-connection-context-manager` + + .. versionchanged:: 3.13 + + A :exc:`ResourceWarning` is emitted if :meth:`close` is not called before + a :class:`!Connection` object is deleted. + An SQLite database connection has the following attributes and methods: .. method:: cursor(factory=Cursor) @@ -735,11 +731,8 @@ Connection objects `deterministic `_, which allows SQLite to perform additional optimizations. - :raises NotSupportedError: - If *deterministic* is used with SQLite versions older than 3.8.3. - - .. versionadded:: 3.8 - The *deterministic* parameter. + .. versionchanged:: 3.8 + Added the *deterministic* parameter. Example: @@ -753,6 +746,12 @@ Connection objects >>> for row in con.execute("SELECT md5(?)", (b"foo",)): ... print(row) ('acbd18db4cc2f85cedef654fccc4a4d8',) + >>> con.close() + + .. versionchanged:: 3.13 + + Passing *name*, *narg*, and *func* as keyword arguments is deprecated. + These parameters will become positional-only in Python 3.15. .. method:: create_aggregate(name, n_arg, aggregate_class) @@ -808,6 +807,11 @@ Connection objects 3 + .. versionchanged:: 3.13 + + Passing *name*, *n_arg*, and *aggregate_class* as keyword arguments is deprecated. + These parameters will become positional-only in Python 3.15. + .. method:: create_window_function(name, num_params, aggregate_class, /) @@ -889,6 +893,7 @@ Connection objects FROM test ORDER BY x """) print(cur.fetchall()) + con.close() .. testoutput:: :hide: @@ -972,6 +977,10 @@ Connection objects .. versionchanged:: 3.11 Added support for disabling the authorizer using ``None``. + .. versionchanged:: 3.13 + Passing *authorizer_callback* as a keyword argument is deprecated. + The parameter will become positional-only in Python 3.15. + .. method:: set_progress_handler(progress_handler, n) @@ -987,6 +996,10 @@ Connection objects currently executing query and cause it to raise a :exc:`DatabaseError` exception. + .. versionchanged:: 3.13 + Passing *progress_handler* as a keyword argument is deprecated. + The parameter will become positional-only in Python 3.15. + .. method:: set_trace_callback(trace_callback) @@ -1011,6 +1024,10 @@ Connection objects .. versionadded:: 3.3 + .. versionchanged:: 3.13 + Passing *trace_callback* as a keyword argument is deprecated. + The parameter will become positional-only in Python 3.15. + .. method:: enable_load_extension(enabled, /) @@ -1037,13 +1054,10 @@ Connection objects .. versionchanged:: 3.10 Added the ``sqlite3.enable_load_extension`` auditing event. - .. testsetup:: sqlite3.loadext + .. We cannot doctest the load extension API, since there is no convenient + way to skip it. - import sqlite3 - con = sqlite3.connect(":memory:") - - .. testcode:: sqlite3.loadext - :skipif: True # not testable at the moment + .. code-block:: con.enable_load_extension(True) @@ -1067,14 +1081,6 @@ Connection objects for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"): print(row) - con.close() - - .. testoutput:: sqlite3.loadext - :hide: - - (2, 'broccoli pie', 'broccoli cheese onions flour') - (3, 'pumpkin pie', 'pumpkin sugar flour butter') - .. method:: load_extension(path, /, *, entrypoint=None) Load an SQLite extension from a shared library. @@ -1101,17 +1107,24 @@ Connection objects .. versionchanged:: 3.10 Added the ``sqlite3.load_extension`` auditing event. - .. versionadded:: 3.12 - The *entrypoint* parameter. + .. versionchanged:: 3.12 + Added the *entrypoint* parameter. - .. _Loading an Extension: https://www.sqlite.org/loadext.html#loading_an_extension_ + .. _Loading an Extension: https://www.sqlite.org/loadext.html#loading_an_extension - .. method:: iterdump + .. method:: iterdump(*, filter=None) Return an :term:`iterator` to dump the database as SQL source code. Useful when saving an in-memory database for later restoration. Similar to the ``.dump`` command in the :program:`sqlite3` shell. + :param filter: + + An optional ``LIKE`` pattern for database objects to dump, e.g. ``prefix_%``. + If ``None`` (the default), all database objects will be included. + + :type filter: str | None + Example: .. testcode:: @@ -1123,6 +1136,12 @@ Connection objects f.write('%s\n' % line) con.close() + .. seealso:: + + :ref:`sqlite3-howto-encoding` + + .. versionchanged:: 3.13 + Added the *filter* parameter. .. method:: backup(target, *, pages=-1, progress=None, name="main", sleep=0.250) @@ -1186,9 +1205,15 @@ Connection objects src = sqlite3.connect('example.db') dst = sqlite3.connect(':memory:') src.backup(dst) + dst.close() + src.close() .. versionadded:: 3.7 + .. seealso:: + + :ref:`sqlite3-howto-encoding` + .. method:: getlimit(category, /) Get a connection runtime limit. @@ -1248,6 +1273,10 @@ Connection objects >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED) 1 + .. testcleanup:: sqlite3.limits + + con.close() + .. versionadded:: 3.11 .. _SQLite limit category: https://www.sqlite.org/c3ref/c_limit_attached.html @@ -1410,39 +1439,8 @@ Connection objects and returns a text representation of it. The callable is invoked for SQLite values with the ``TEXT`` data type. By default, this attribute is set to :class:`str`. - If you want to return ``bytes`` instead, set *text_factory* to ``bytes``. - Example: - - .. testcode:: - - con = sqlite3.connect(":memory:") - cur = con.cursor() - - AUSTRIA = "Österreich" - - # by default, rows are returned as str - cur.execute("SELECT ?", (AUSTRIA,)) - row = cur.fetchone() - assert row[0] == AUSTRIA - - # but we can make sqlite3 always return bytestrings ... - con.text_factory = bytes - cur.execute("SELECT ?", (AUSTRIA,)) - row = cur.fetchone() - assert type(row[0]) is bytes - # the bytestrings will be encoded in UTF-8, unless you stored garbage in the - # database ... - assert row[0] == AUSTRIA.encode("utf-8") - - # we can also implement a custom text_factory ... - # here we implement one that appends "foo" to all strings - con.text_factory = lambda x: x.decode("utf-8") + "foo" - cur.execute("SELECT ?", ("bar",)) - row = cur.fetchone() - assert row[0] == "barfoo" - - con.close() + See :ref:`sqlite3-howto-encoding` for more details. .. attribute:: total_changes @@ -1494,7 +1492,7 @@ Cursor objects .. method:: execute(sql, parameters=(), /) - Execute SQL a single SQL statement, + Execute a single SQL statement, optionally binding Python values using :ref:`placeholders `. @@ -1560,6 +1558,10 @@ Cursor objects # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows) + .. testcleanup:: sqlite3.cursor + + con.close() + .. note:: Any resulting rows are discarded, @@ -1601,7 +1603,6 @@ Cursor objects COMMIT; """) - .. method:: fetchone() If :attr:`~Cursor.row_factory` is ``None``, @@ -1666,6 +1667,7 @@ Cursor objects >>> cur = con.cursor() >>> cur.connection == con True + >>> con.close() .. attribute:: description @@ -1755,10 +1757,10 @@ Row objects Blob objects ^^^^^^^^^^^^ -.. versionadded:: 3.11 - .. class:: Blob + .. versionadded:: 3.11 + A :class:`Blob` instance is a :term:`file-like object` that can read and write data in an SQLite :abbr:`BLOB (Binary Large OBject)`. Call :func:`len(blob) ` to get the size (number of bytes) of the blob. @@ -1786,6 +1788,7 @@ Blob objects greeting = blob.read() print(greeting) # outputs "b'Hello, world!'" + con.close() .. testoutput:: :hide: @@ -2098,6 +2101,7 @@ Here's an example of both styles: params = (1972,) cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params) print(cur.fetchall()) + con.close() .. testoutput:: :hide: @@ -2156,6 +2160,7 @@ The object passed to *protocol* will be of type :class:`PrepareProtocol`. cur.execute("SELECT ?", (Point(4.0, -3.2),)) print(cur.fetchone()[0]) + con.close() .. testoutput:: :hide: @@ -2186,6 +2191,7 @@ This function can then be registered using :func:`register_adapter`. cur.execute("SELECT ?", (Point(1.0, 2.5),)) print(cur.fetchone()[0]) + con.close() .. testoutput:: :hide: @@ -2270,6 +2276,8 @@ The following example illustrates the implicit and explicit approaches: cur.execute("INSERT INTO test(p) VALUES(?)", (p,)) cur.execute('SELECT p AS "p [point]" FROM test') print("with column names:", cur.fetchone()[0]) + cur.close() + con.close() .. testoutput:: :hide: @@ -2406,9 +2414,9 @@ or if :attr:`~Connection.autocommit` is ``True``, the context manager does nothing. .. note:: - The context manager neither implicitly opens a new transaction - nor closes the connection. + nor closes the connection. If you need a closing context manager, consider + using :meth:`contextlib.closing`. .. testcode:: @@ -2452,6 +2460,7 @@ Some useful URI tricks include: >>> con.execute("CREATE TABLE readonly(data)") Traceback (most recent call last): OperationalError: attempt to write a readonly database + >>> con.close() * Do not implicitly create a new database file if it does not already exist; will raise :exc:`~sqlite3.OperationalError` if unable to create a new file: @@ -2476,6 +2485,8 @@ Some useful URI tricks include: res = con2.execute("SELECT data FROM shared") assert res.fetchone() == (28,) + con1.close() + con2.close() More information about this feature, including a list of parameters, can be found in the `SQLite URI documentation`_. @@ -2522,6 +2533,7 @@ Queries now return :class:`!Row` objects: 'Earth' >>> row["RADIUS"] # Column names are case-insensitive. 6378 + >>> con.close() .. note:: @@ -2548,6 +2560,7 @@ Using it, queries now return a :class:`!dict` instead of a :class:`!tuple`: >>> for row in con.execute("SELECT 1 AS a, 2 AS b"): ... print(row) {'a': 1, 'b': 2} + >>> con.close() The following row factory returns a :term:`named tuple`: @@ -2574,12 +2587,54 @@ The following row factory returns a :term:`named tuple`: 1 >>> row.b # Attribute access. 2 + >>> con.close() With some adjustments, the above recipe can be adapted to use a :class:`~dataclasses.dataclass`, or any other custom class, instead of a :class:`~collections.namedtuple`. +.. _sqlite3-howto-encoding: + +How to handle non-UTF-8 text encodings +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, :mod:`!sqlite3` uses :class:`str` to adapt SQLite values +with the ``TEXT`` data type. +This works well for UTF-8 encoded text, but it might fail for other encodings +and invalid UTF-8. +You can use a custom :attr:`~Connection.text_factory` to handle such cases. + +Because of SQLite's `flexible typing`_, it is not uncommon to encounter table +columns with the ``TEXT`` data type containing non-UTF-8 encodings, +or even arbitrary data. +To demonstrate, let's assume we have a database with ISO-8859-2 (Latin-2) +encoded text, for example a table of Czech-English dictionary entries. +Assuming we now have a :class:`Connection` instance :py:data:`!con` +connected to this database, +we can decode the Latin-2 encoded text using this :attr:`~Connection.text_factory`: + +.. testcode:: + + con.text_factory = lambda data: str(data, encoding="latin2") + +For invalid UTF-8 or arbitrary data in stored in ``TEXT`` table columns, +you can use the following technique, borrowed from the :ref:`unicode-howto`: + +.. testcode:: + + con.text_factory = lambda data: str(data, errors="surrogateescape") + +.. note:: + + The :mod:`!sqlite3` module API does not support strings + containing surrogates. + +.. seealso:: + + :ref:`unicode-howto` + + .. _sqlite3-explanation: Explanation @@ -2690,3 +2745,11 @@ regardless of the value of :attr:`~Connection.isolation_level`. .. _SQLite transaction behaviour: https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions + +.. testcleanup:: + + import os + os.remove("backup.db") + os.remove("dump.sql") + os.remove("example.db") + os.remove("tutorial.db") diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 5d6bc829..b7fb1fc0 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1,5 +1,5 @@ -:mod:`ssl` --- TLS/SSL wrapper for socket objects -================================================= +:mod:`!ssl` --- TLS/SSL wrapper for socket objects +================================================== .. module:: ssl :synopsis: TLS/SSL wrapper for socket objects @@ -25,7 +25,7 @@ probably additional platforms, as long as OpenSSL is installed on that platform. Some behavior may be platform dependent, since calls are made to the operating system socket APIs. The installed version of OpenSSL may also - cause variations in behavior. For example, TLSv1.3 with OpenSSL version + cause variations in behavior. For example, TLSv1.3 comes with OpenSSL version 1.1.1. .. warning:: @@ -43,8 +43,10 @@ This module provides a class, :class:`ssl.SSLSocket`, which is derived from the :class:`socket.socket` type, and provides a socket-like wrapper that also encrypts and decrypts the data going over the socket with SSL. It supports additional methods such as :meth:`getpeercert`, which retrieves the -certificate of the other side of the connection, and :meth:`cipher`, which -retrieves the cipher being used for the secure connection. +certificate of the other side of the connection, :meth:`cipher`, which +retrieves the cipher being used for the secure connection or +:meth:`get_verified_chain`, :meth:`get_unverified_chain` which retrieves +certificate chain. For more sophisticated applications, the :class:`ssl.SSLContext` class helps manage settings and certificates, which can then be inherited @@ -149,6 +151,12 @@ purposes. variable :envvar:`SSLKEYLOGFILE` is set, :func:`create_default_context` enables key logging. + The default settings for this context include + :data:`VERIFY_X509_PARTIAL_CHAIN` and :data:`VERIFY_X509_STRICT`. + These make the underlying OpenSSL implementation behave more like + a conforming implementation of :rfc:`5280`, in exchange for a small + amount of incompatibility with older X.509 certificates. + .. note:: The protocol, options, cipher and other settings may change to more restrictive values anytime without prior deprecation. The values @@ -170,6 +178,15 @@ purposes. ctx = ssl.create_default_context(Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3 + .. note:: + This context enables :data:`VERIFY_X509_STRICT` by default, which + may reject pre-:rfc:`5280` or malformed certificates that the + underlying OpenSSL implementation otherwise would accept. While disabling + this is not recommended, you can do so using:: + + ctx = ssl.create_default_context() + ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT + .. versionadded:: 3.4 .. versionchanged:: 3.4.4 @@ -192,6 +209,11 @@ purposes. :data:`PROTOCOL_TLS_SERVER` protocol instead of generic :data:`PROTOCOL_TLS`. + .. versionchanged:: 3.13 + + The context now uses :data:`VERIFY_X509_PARTIAL_CHAIN` and + :data:`VERIFY_X509_STRICT` in its default verify flags. + Exceptions ^^^^^^^^^^ @@ -735,11 +757,11 @@ Constants When Python has been compiled against an older version of OpenSSL, the flag defaults to *0*. - .. versionadded:: 3.7 + .. versionadded:: 3.6.3 .. deprecated:: 3.7 - The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15, - 3.6.3 and 3.7.0 for backwards compatibility with OpenSSL 1.0.2. + The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15 and + 3.6.3 for backwards compatibility with OpenSSL 1.0.2. .. data:: OP_NO_RENEGOTIATION @@ -759,7 +781,7 @@ Constants .. data:: OP_SINGLE_DH_USE - Prevents re-use of the same DH key for distinct SSL sessions. This + Prevents reuse of the same DH key for distinct SSL sessions. This improves forward secrecy but requires more computational resources. This option only applies to server sockets. @@ -767,7 +789,7 @@ Constants .. data:: OP_SINGLE_ECDH_USE - Prevents re-use of the same ECDH key for distinct SSL sessions. This + Prevents reuse of the same ECDH key for distinct SSL sessions. This improves forward secrecy but requires more computational resources. This option only applies to server sockets. @@ -906,6 +928,12 @@ Constants .. versionadded:: 3.7 +.. data:: HAS_PSK + + Whether the OpenSSL library has built-in support for TLS-PSK. + + .. versionadded:: 3.13 + .. data:: CHANNEL_BINDING_TYPES List of supported TLS channel binding types. Strings in this list @@ -1021,25 +1049,25 @@ SSL Sockets SSL sockets provide the following methods of :ref:`socket-objects`: - - :meth:`~socket.socket.accept()` - - :meth:`~socket.socket.bind()` - - :meth:`~socket.socket.close()` - - :meth:`~socket.socket.connect()` - - :meth:`~socket.socket.detach()` - - :meth:`~socket.socket.fileno()` - - :meth:`~socket.socket.getpeername()`, :meth:`~socket.socket.getsockname()` - - :meth:`~socket.socket.getsockopt()`, :meth:`~socket.socket.setsockopt()` - - :meth:`~socket.socket.gettimeout()`, :meth:`~socket.socket.settimeout()`, - :meth:`~socket.socket.setblocking()` - - :meth:`~socket.socket.listen()` - - :meth:`~socket.socket.makefile()` - - :meth:`~socket.socket.recv()`, :meth:`~socket.socket.recv_into()` + - :meth:`~socket.socket.accept` + - :meth:`~socket.socket.bind` + - :meth:`~socket.socket.close` + - :meth:`~socket.socket.connect` + - :meth:`~socket.socket.detach` + - :meth:`~socket.socket.fileno` + - :meth:`~socket.socket.getpeername`, :meth:`~socket.socket.getsockname` + - :meth:`~socket.socket.getsockopt`, :meth:`~socket.socket.setsockopt` + - :meth:`~socket.socket.gettimeout`, :meth:`~socket.socket.settimeout`, + :meth:`~socket.socket.setblocking` + - :meth:`~socket.socket.listen` + - :meth:`~socket.socket.makefile` + - :meth:`~socket.socket.recv`, :meth:`~socket.socket.recv_into` (but passing a non-zero ``flags`` argument is not allowed) - - :meth:`~socket.socket.send()`, :meth:`~socket.socket.sendall()` (with + - :meth:`~socket.socket.send`, :meth:`~socket.socket.sendall` (with the same limitation) - - :meth:`~socket.socket.sendfile()` (but :mod:`os.sendfile` will be used - for plain-text sockets only, else :meth:`~socket.socket.send()` will be used) - - :meth:`~socket.socket.shutdown()` + - :meth:`~socket.socket.sendfile` (but :mod:`os.sendfile` will be used + for plain-text sockets only, else :meth:`~socket.socket.send` will be used) + - :meth:`~socket.socket.shutdown` However, since the SSL (and TLS) protocol has its own framing atop of TCP, the SSL sockets abstraction can, in certain respects, diverge from @@ -1210,6 +1238,22 @@ SSL sockets also have the following additional methods and attributes: .. versionchanged:: 3.9 IPv6 address strings no longer have a trailing new line. +.. method:: SSLSocket.get_verified_chain() + + Returns verified certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + If certificate verification was disabled method acts the same as + :meth:`~SSLSocket.get_unverified_chain`. + + .. versionadded:: 3.13 + +.. method:: SSLSocket.get_unverified_chain() + + Returns raw certificate chain provided by the other + end of the SSL channel as a list of DER-encoded bytes. + + .. versionadded:: 3.13 + .. method:: SSLSocket.cipher() Returns a three-value tuple containing the name of the cipher being used, the @@ -1380,18 +1424,18 @@ to speed up repeated connections from the same clients. Here's a table showing which versions in a client (down the side) can connect to which versions in a server (along the top): - .. table:: + .. table:: - ======================== ============ ============ ============= ========= =========== =========== - *client* / **server** **SSLv2** **SSLv3** **TLS** [3]_ **TLSv1** **TLSv1.1** **TLSv1.2** - ------------------------ ------------ ------------ ------------- --------- ----------- ----------- - *SSLv2* yes no no [1]_ no no no - *SSLv3* no yes no [2]_ no no no - *TLS* (*SSLv23*) [3]_ no [1]_ no [2]_ yes yes yes yes - *TLSv1* no no yes yes no no - *TLSv1.1* no no yes no yes no - *TLSv1.2* no no yes no no yes - ======================== ============ ============ ============= ========= =========== =========== + ======================== ============ ============ ============= ========= =========== =========== + *client* / **server** **SSLv2** **SSLv3** **TLS** [3]_ **TLSv1** **TLSv1.1** **TLSv1.2** + ------------------------ ------------ ------------ ------------- --------- ----------- ----------- + *SSLv2* yes no no [1]_ no no no + *SSLv3* no yes no [2]_ no no no + *TLS* (*SSLv23*) [3]_ no [1]_ no [2]_ yes yes yes yes + *TLSv1* no no yes yes no no + *TLSv1.1* no no yes no yes no + *TLSv1.2* no no yes no no yes + ======================== ============ ============ ============= ========= =========== =========== .. rubric:: Footnotes .. [1] :class:`SSLContext` disables SSLv2 with :data:`OP_NO_SSLv2` by default. @@ -1428,6 +1472,19 @@ to speed up repeated connections from the same clients. :data:`PROTOCOL_TLS`, :data:`PROTOCOL_TLS_CLIENT`, and :data:`PROTOCOL_TLS_SERVER` use TLS 1.2 as minimum TLS version. + .. note:: + + :class:`SSLContext` only supports limited mutation once it has been used + by a connection. Adding new certificates to the internal trust store is + allowed, but changing ciphers, verification settings, or mTLS + certificates may result in surprising behavior. + + .. note:: + + :class:`SSLContext` is designed to be shared and used by multiple + connections. + Thus, it is thread-safe as long as it is not reconfigured after being + used by a connection. :class:`SSLContext` objects have the following methods and attributes: @@ -1509,7 +1566,7 @@ to speed up repeated connections from the same clients. The *capath* string, if present, is the path to a directory containing several CA certificates in PEM format, following an `OpenSSL specific layout - `_. + `_. The *cadata* object, if present, is either an ASCII string of one or more PEM-encoded certificates or a :term:`bytes-like object` of DER-encoded @@ -1584,7 +1641,7 @@ to speed up repeated connections from the same clients. Set the available ciphers for sockets created with this context. It should be a string in the `OpenSSL cipher list format - `_. + `_. If no cipher can be selected (because compile-time options or other configuration forbids use of all the specified ciphers), an :class:`SSLError` will be raised. @@ -1656,8 +1713,9 @@ to speed up repeated connections from the same clients. Due to the early negotiation phase of the TLS connection, only limited methods and attributes are usable like :meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`. - The :meth:`SSLSocket.getpeercert`, - :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compression` methods require that + The :meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.get_verified_chain`, + :meth:`SSLSocket.get_unverified_chain` :meth:`SSLSocket.cipher` + and :meth:`SSLSocket.compression` methods require that the TLS connection has progressed beyond the TLS Client Hello and therefore will not return meaningful values nor can they be called safely. @@ -1684,7 +1742,7 @@ to speed up repeated connections from the same clients. IDN-encoded internationalized domain name, the *server_name_callback* receives a decoded U-label (``"pythön.org"``). - If there is an decoding error on the server name, the TLS connection will + If there is a decoding error on the server name, the TLS connection will terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS alert message to the client. @@ -1765,6 +1823,9 @@ to speed up repeated connections from the same clients. *session*, see :attr:`~SSLSocket.session`. + To wrap an :class:`SSLSocket` in another :class:`SSLSocket`, use + :meth:`SSLContext.wrap_bio`. + .. versionchanged:: 3.5 Always allow a server_hostname to be passed, even if OpenSSL does not have SNI. @@ -1772,7 +1833,7 @@ to speed up repeated connections from the same clients. .. versionchanged:: 3.6 *session* argument was added. - .. versionchanged:: 3.7 + .. versionchanged:: 3.7 The method returns an instance of :attr:`SSLContext.sslsocket_class` instead of hard-coded :class:`SSLSocket`. @@ -1813,7 +1874,7 @@ to speed up repeated connections from the same clients. .. method:: SSLContext.session_stats() Get statistics about the SSL sessions created or managed by this context. - A dictionary is returned which maps the names of each `piece of information `_ to their + A dictionary is returned which maps the names of each `piece of information `_ to their numeric values. For example, here is the total number of hits and misses in the session cache since the context was created:: @@ -1950,13 +2011,13 @@ to speed up repeated connections from the same clients. .. versionchanged:: 3.10 - The flag had no effect with OpenSSL before version 1.1.1k. Python 3.8.9, + The flag had no effect with OpenSSL before version 1.1.1l. Python 3.8.9, 3.9.3, and 3.10 include workarounds for previous versions. .. attribute:: SSLContext.security_level An integer representing the `security level - `_ + `_ for the context. This attribute is read-only. .. versionadded:: 3.10 @@ -1987,6 +2048,100 @@ to speed up repeated connections from the same clients. >>> ssl.create_default_context().verify_mode # doctest: +SKIP +.. method:: SSLContext.set_psk_client_callback(callback) + + Enables TLS-PSK (pre-shared key) authentication on a client-side connection. + + In general, certificate based authentication should be preferred over this method. + + The parameter ``callback`` is a callable object with the signature: + ``def callback(hint: str | None) -> tuple[str | None, bytes]``. + The ``hint`` parameter is an optional identity hint sent by the server. + The return value is a tuple in the form (client-identity, psk). + Client-identity is an optional string which may be used by the server to + select a corresponding PSK for the client. The string must be less than or + equal to ``256`` octets when UTF-8 encoded. PSK is a + :term:`bytes-like object` representing the pre-shared key. Return a zero + length PSK to reject the connection. + + Setting ``callback`` to :const:`None` removes any existing callback. + + .. note:: + When using TLS 1.3: + + - the ``hint`` parameter is always :const:`None`. + - client-identity must be a non-empty string. + + Example usage:: + + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + context.check_hostname = False + context.verify_mode = ssl.CERT_NONE + context.maximum_version = ssl.TLSVersion.TLSv1_2 + context.set_ciphers('PSK') + + # A simple lambda: + psk = bytes.fromhex('c0ffee') + context.set_psk_client_callback(lambda hint: (None, psk)) + + # A table using the hint from the server: + psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'), + 'ServerId_2': bytes.fromhex('facade') + } + def callback(hint): + return 'ClientId_1', psk_table.get(hint, b'') + context.set_psk_client_callback(callback) + + This method will raise :exc:`NotImplementedError` if :data:`HAS_PSK` is + ``False``. + + .. versionadded:: 3.13 + +.. method:: SSLContext.set_psk_server_callback(callback, identity_hint=None) + + Enables TLS-PSK (pre-shared key) authentication on a server-side connection. + + In general, certificate based authentication should be preferred over this method. + + The parameter ``callback`` is a callable object with the signature: + ``def callback(identity: str | None) -> bytes``. + The ``identity`` parameter is an optional identity sent by the client which can + be used to select a corresponding PSK. + The return value is a :term:`bytes-like object` representing the pre-shared key. + Return a zero length PSK to reject the connection. + + Setting ``callback`` to :const:`None` removes any existing callback. + + The parameter ``identity_hint`` is an optional identity hint string sent to + the client. The string must be less than or equal to ``256`` octets when + UTF-8 encoded. + + .. note:: + When using TLS 1.3 the ``identity_hint`` parameter is not sent to the client. + + Example usage:: + + context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + context.maximum_version = ssl.TLSVersion.TLSv1_2 + context.set_ciphers('PSK') + + # A simple lambda: + psk = bytes.fromhex('c0ffee') + context.set_psk_server_callback(lambda identity: psk) + + # A table using the identity of the client: + psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'), + 'ClientId_2': bytes.fromhex('facade') + } + def callback(identity): + return psk_table.get(identity, b'') + context.set_psk_server_callback(callback, 'ServerId_1') + + This method will raise :exc:`NotImplementedError` if :data:`HAS_PSK` is + ``False``. + + .. versionadded:: 3.13 + .. index:: single: certificates .. index:: single: X509 certificate @@ -2414,6 +2569,8 @@ provided. - :meth:`~SSLSocket.read` - :meth:`~SSLSocket.write` - :meth:`~SSLSocket.getpeercert` + - :meth:`~SSLSocket.get_verified_chain` + - :meth:`~SSLSocket.get_unverified_chain` - :meth:`~SSLSocket.selected_alpn_protocol` - :meth:`~SSLSocket.selected_npn_protocol` - :meth:`~SSLSocket.cipher` @@ -2453,12 +2610,8 @@ provided. :exc:`SSLWantReadError` if it needs more data than the incoming BIO has available. - - There is no module-level ``wrap_bio()`` call like there is for - :meth:`~SSLContext.wrap_socket`. An :class:`SSLObject` is always created - via an :class:`SSLContext`. - .. versionchanged:: 3.7 - :class:`SSLObject` instances must to created with + :class:`SSLObject` instances must be created with :meth:`~SSLContext.wrap_bio`. In earlier versions, it was possible to create instances directly. This was never documented or officially supported. @@ -2557,7 +2710,7 @@ Verifying certificates When calling the :class:`SSLContext` constructor directly, :const:`CERT_NONE` is the default. Since it does not authenticate the other -peer, it can be insecure, especially in client mode where most of time you +peer, it can be insecure, especially in client mode where most of the time you would like to ensure the authenticity of the server you're talking to. Therefore, when in client mode, it is highly recommended to use :const:`CERT_REQUIRED`. However, it is in itself not sufficient; you also @@ -2606,7 +2759,7 @@ enabled when negotiating a SSL session is possible through the :meth:`SSLContext.set_ciphers` method. Starting from Python 3.2.3, the ssl module disables certain weak ciphers by default, but you may want to further restrict the cipher choice. Be sure to read OpenSSL's documentation -about the `cipher list format `_. +about the `cipher list format `_. If you want to check which ciphers are enabled by a given cipher list, use :meth:`SSLContext.get_ciphers` or the ``openssl ciphers`` command on your system. diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst index 77538514..8434b2e8 100644 --- a/Doc/library/stat.rst +++ b/Doc/library/stat.rst @@ -1,5 +1,5 @@ -:mod:`stat` --- Interpreting :func:`~os.stat` results -===================================================== +:mod:`!stat` --- Interpreting :func:`~os.stat` results +====================================================== .. module:: stat :synopsis: Utilities for interpreting the results of os.stat(), @@ -350,6 +350,12 @@ The following flags can also be used in the *mode* argument of :func:`os.chmod`: The following flags can be used in the *flags* argument of :func:`os.chflags`: +.. data:: UF_SETTABLE + + All user settable flags. + + .. versionadded:: 3.13 + .. data:: UF_NODUMP Do not dump the file. @@ -374,10 +380,44 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`: The file is stored compressed (macOS 10.6+). +.. data:: UF_TRACKED + + Used for handling document IDs (macOS) + + .. versionadded:: 3.13 + +.. data:: UF_DATAVAULT + + The file needs an entitlement for reading or writing (macOS 10.13+) + + .. versionadded:: 3.13 + .. data:: UF_HIDDEN The file should not be displayed in a GUI (macOS 10.5+). +.. data:: SF_SETTABLE + + All super-user changeable flags + + .. versionadded:: 3.13 + +.. data:: SF_SUPPORTED + + All super-user supported flags + + .. availability:: macOS + + .. versionadded:: 3.13 + +.. data:: SF_SYNTHETIC + + All super-user read-only synthetic flags + + .. availability:: macOS + + .. versionadded:: 3.13 + .. data:: SF_ARCHIVED The file may be archived. @@ -390,6 +430,12 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`: The file may only be appended to. +.. data:: SF_RESTRICTED + + The file needs an entitlement to write to (macOS 10.13+) + + .. versionadded:: 3.13 + .. data:: SF_NOUNLINK The file may not be renamed or deleted. @@ -398,6 +444,18 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`: The file is a snapshot file. +.. data:: SF_FIRMLINK + + The file is a firmlink (macOS 10.15+) + + .. versionadded:: 3.13 + +.. data:: SF_DATALESS + + The file is a dataless object (macOS 10.15+) + + .. versionadded:: 3.13 + See the \*BSD or macOS systems man page :manpage:`chflags(2)` for more information. On Windows, the following file attribute constants are available for use when diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 6e6ca7ce..614f5b90 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -1,5 +1,5 @@ -:mod:`statistics` --- Mathematical statistics functions -======================================================= +:mod:`!statistics` --- Mathematical statistics functions +======================================================== .. module:: statistics :synopsis: Mathematical statistics functions @@ -14,6 +14,7 @@ .. testsetup:: * from statistics import * + import math __name__ = '' -------------- @@ -72,13 +73,15 @@ or sample. ======================= =============================================================== :func:`mean` Arithmetic mean ("average") of data. -:func:`fmean` Fast, floating point arithmetic mean, with optional weighting. +:func:`fmean` Fast, floating-point arithmetic mean, with optional weighting. :func:`geometric_mean` Geometric mean of data. :func:`harmonic_mean` Harmonic mean of data. +:func:`kde` Estimate the probability density distribution of the data. +:func:`kde_random` Random sampling from the PDF generated by kde(). :func:`median` Median (middle value) of data. :func:`median_low` Low median of data. :func:`median_high` High median of data. -:func:`median_grouped` Median, or 50th percentile, of grouped data. +:func:`median_grouped` Median (50th percentile) of grouped data. :func:`mode` Single mode (most common value) of discrete or nominal data. :func:`multimode` List of modes (most common values) of discrete or nominal data. :func:`quantiles` Divide data into intervals with equal probability. @@ -217,7 +220,7 @@ However, for reading convenience, most of the examples show sorted sequences. .. function:: harmonic_mean(data, weights=None) Return the harmonic mean of *data*, a sequence or iterable of - real-valued numbers. If *weights* is omitted or *None*, then + real-valued numbers. If *weights* is omitted or ``None``, then equal weighting is assumed. The harmonic mean is the reciprocal of the arithmetic :func:`mean` of the @@ -258,6 +261,81 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionchanged:: 3.10 Added support for *weights*. + +.. function:: kde(data, h, kernel='normal', *, cumulative=False) + + `Kernel Density Estimation (KDE) + `_: + Create a continuous probability density function or cumulative + distribution function from discrete samples. + + The basic idea is to smooth the data using `a kernel function + `_. + to help draw inferences about a population from a sample. + + The degree of smoothing is controlled by the scaling parameter *h* + which is called the bandwidth. Smaller values emphasize local + features while larger values give smoother results. + + The *kernel* determines the relative weights of the sample data + points. Generally, the choice of kernel shape does not matter + as much as the more influential bandwidth smoothing parameter. + + Kernels that give some weight to every sample point include + *normal* (*gauss*), *logistic*, and *sigmoid*. + + Kernels that only give weight to sample points within the bandwidth + include *rectangular* (*uniform*), *triangular*, *parabolic* + (*epanechnikov*), *quartic* (*biweight*), *triweight*, and *cosine*. + + If *cumulative* is true, will return a cumulative distribution function. + + A :exc:`StatisticsError` will be raised if the *data* sequence is empty. + + `Wikipedia has an example + `_ + where we can use :func:`kde` to generate and plot a probability + density function estimated from a small sample: + + .. doctest:: + + >>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2] + >>> f_hat = kde(sample, h=1.5) + >>> xarr = [i/100 for i in range(-750, 1100)] + >>> yarr = [f_hat(x) for x in xarr] + + The points in ``xarr`` and ``yarr`` can be used to make a PDF plot: + + .. image:: kde_example.png + :alt: Scatter plot of the estimated probability density function. + + .. versionadded:: 3.13 + + +.. function:: kde_random(data, h, kernel='normal', *, seed=None) + + Return a function that makes a random selection from the estimated + probability density function produced by ``kde(data, h, kernel)``. + + Providing a *seed* allows reproducible selections. In the future, the + values may change slightly as more accurate kernel inverse CDF estimates + are implemented. The seed may be an integer, float, str, or bytes. + + A :exc:`StatisticsError` will be raised if the *data* sequence is empty. + + Continuing the example for :func:`kde`, we can use + :func:`kde_random` to generate new random selections from an + estimated probability density function: + + >>> data = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2] + >>> rand = kde_random(data, h=1.5, seed=8675309) + >>> new_selections = [rand() for i in range(10)] + >>> [round(x, 1) for x in new_selections] + [0.7, 6.2, 1.2, 6.9, 7.0, 1.8, 2.5, -0.5, -1.8, 5.6] + + .. versionadded:: 3.13 + + .. function:: median(data) Return the median (middle value) of numeric data, using the common "mean of @@ -328,55 +406,56 @@ However, for reading convenience, most of the examples show sorted sequences. be an actual data point rather than interpolated. -.. function:: median_grouped(data, interval=1) +.. function:: median_grouped(data, interval=1.0) - Return the median of grouped continuous data, calculated as the 50th - percentile, using interpolation. If *data* is empty, :exc:`StatisticsError` - is raised. *data* can be a sequence or iterable. + Estimates the median for numeric data that has been `grouped or binned + `_ around the midpoints + of consecutive, fixed-width intervals. - .. doctest:: + The *data* can be any iterable of numeric data with each value being + exactly the midpoint of a bin. At least one value must be present. - >>> median_grouped([52, 52, 53, 54]) - 52.5 + The *interval* is the width of each bin. - In the following example, the data are rounded, so that each value represents - the midpoint of data classes, e.g. 1 is the midpoint of the class 0.5--1.5, 2 - is the midpoint of 1.5--2.5, 3 is the midpoint of 2.5--3.5, etc. With the data - given, the middle value falls somewhere in the class 3.5--4.5, and - interpolation is used to estimate it: + For example, demographic information may have been summarized into + consecutive ten-year age groups with each group being represented + by the 5-year midpoints of the intervals: .. doctest:: - >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) - 3.7 - - Optional argument *interval* represents the class interval, and defaults - to 1. Changing the class interval naturally will change the interpolation: + >>> from collections import Counter + >>> demographics = Counter({ + ... 25: 172, # 20 to 30 years old + ... 35: 484, # 30 to 40 years old + ... 45: 387, # 40 to 50 years old + ... 55: 22, # 50 to 60 years old + ... 65: 6, # 60 to 70 years old + ... }) + ... + + The 50th percentile (median) is the 536th person out of the 1071 + member cohort. That person is in the 30 to 40 year old age group. + + The regular :func:`median` function would assume that everyone in the + tricenarian age group was exactly 35 years old. A more tenable + assumption is that the 484 members of that age group are evenly + distributed between 30 and 40. For that, we use + :func:`median_grouped`: .. doctest:: - >>> median_grouped([1, 3, 3, 5, 7], interval=1) - 3.25 - >>> median_grouped([1, 3, 3, 5, 7], interval=2) - 3.5 + >>> data = list(demographics.elements()) + >>> median(data) + 35 + >>> round(median_grouped(data, interval=10), 1) + 37.5 - This function does not check whether the data points are at least - *interval* apart. + The caller is responsible for making sure the data points are separated + by exact multiples of *interval*. This is essential for getting a + correct result. The function does not check this precondition. - .. impl-detail:: - - Under some circumstances, :func:`median_grouped` may coerce data points to - floats. This behaviour is likely to change in the future. - - .. seealso:: - - * "Statistics for the Behavioral Sciences", Frederick J Gravetter and - Larry B Wallnau (8th Edition). - - * The `SSMEDIAN - `_ - function in the Gnome Gnumeric spreadsheet, including `this discussion - `_. + Inputs may be any numeric type that can be coerced to a float during + the interpolation step. .. function:: mode(data) @@ -406,6 +485,12 @@ However, for reading convenience, most of the examples show sorted sequences. >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' + Only hashable inputs are supported. To handle type :class:`set`, + consider casting to :class:`frozenset`. To handle type :class:`list`, + consider casting to :class:`tuple`. For mixed or nested inputs, consider + using this slower quadratic algorithm that only depends on equality tests: + ``max(data, key=data.count)``. + .. versionchanged:: 3.8 Now handles multimodal datasets by returning the first mode encountered. Formerly, it raised :exc:`StatisticsError` when more than one mode was @@ -447,9 +532,9 @@ However, for reading convenience, most of the examples show sorted sequences. variance indicates that the data is spread out; a small variance indicates it is clustered closely around the mean. - If the optional second argument *mu* is given, it is typically the mean of - the *data*. It can also be used to compute the second moment around a - point that is not the mean. If it is missing or ``None`` (the default), + If the optional second argument *mu* is given, it should be the *population* + mean of the *data*. It can also be used to compute the second moment around + a point that is not the mean. If it is missing or ``None`` (the default), the arithmetic mean is automatically calculated. Use this function to calculate the variance from the entire population. To @@ -519,8 +604,8 @@ However, for reading convenience, most of the examples show sorted sequences. the data is spread out; a small variance indicates it is clustered closely around the mean. - If the optional second argument *xbar* is given, it should be the mean of - *data*. If it is missing or ``None`` (the default), the mean is + If the optional second argument *xbar* is given, it should be the *sample* + mean of *data*. If it is missing or ``None`` (the default), the mean is automatically calculated. Use this function when your data is a sample from a population. To calculate @@ -536,8 +621,8 @@ However, for reading convenience, most of the examples show sorted sequences. >>> variance(data) 1.3720238095238095 - If you have already calculated the mean of your data, you can pass it as the - optional second argument *xbar* to avoid recalculation: + If you have already calculated the sample mean of your data, you can pass it + as the optional second argument *xbar* to avoid recalculation: .. doctest:: @@ -584,7 +669,7 @@ However, for reading convenience, most of the examples show sorted sequences. The *data* can be any iterable containing sample data. For meaningful results, the number of data points in *data* should be larger than *n*. - Raises :exc:`StatisticsError` if there are not at least two data points. + Raises :exc:`StatisticsError` if there is not at least one data point. The cut points are linearly interpolated from the two nearest data points. For example, if a cut point falls one-third @@ -624,6 +709,11 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.8 + .. versionchanged:: 3.13 + No longer raises an exception for an input with only a single data point. + This allows quantile estimates to be built up one sample point + at a time becoming gradually more refined with each new data point. + .. function:: covariance(x, y, /) Return the sample covariance of two inputs *x* and *y*. Covariance @@ -741,6 +831,24 @@ However, for reading convenience, most of the examples show sorted sequences. *y = slope \* x + noise* + Continuing the example from :func:`correlation`, we look to see + how well a model based on major planets can predict the orbital + distances for dwarf planets: + + .. doctest:: + + >>> model = linear_regression(period_squared, dist_cubed, proportional=True) + >>> slope = model.slope + + >>> # Dwarf planets: Pluto, Eris, Makemake, Haumea, Ceres + >>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680] # days + >>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods] + >>> list(map(round, predicted_dist)) + [5912, 10166, 6806, 6459, 414] + + >>> [5_906, 10_152, 6_796, 6_450, 414] # actual distance in million km + [5906, 10152, 6796, 6450, 414] + .. versionadded:: 3.10 .. versionchanged:: 3.11 @@ -828,6 +936,11 @@ of applications in statistics. number generator. This is useful for creating reproducible results, even in a multi-threading context. + .. versionchanged:: 3.13 + + Switched to a faster algorithm. To reproduce samples from previous + versions, use :func:`random.seed` and :func:`random.gauss`. + .. method:: NormalDist.pdf(x) Using a `probability density function (pdf) @@ -919,8 +1032,8 @@ of applications in statistics. .. versionadded:: 3.8 -:class:`NormalDist` Examples and Recipes -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Examples and Recipes +-------------------- Classic probability problems @@ -955,7 +1068,7 @@ Find the `quartiles `_ and `deciles Monte Carlo inputs for simulations ********************************** -To estimate the distribution for a model than isn't easy to solve +To estimate the distribution for a model that isn't easy to solve analytically, :class:`NormalDist` can generate input samples for a `Monte Carlo simulation `_: @@ -997,19 +1110,16 @@ probability that the Python room will stay within its capacity limits? >>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4) 0.8402 - >>> # Solution using the cumulative binomial distribution + >>> # Exact solution using the cumulative binomial distribution >>> from math import comb, fsum >>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4) 0.8402 >>> # Approximation using a simulation - >>> from random import seed, choices + >>> from random import seed, binomialvariate >>> seed(8675309) - >>> def trial(): - ... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python') - ... - >>> mean(trial() <= k for i in range(10_000)) - 0.8398 + >>> mean(binomialvariate(n, p) <= k for i in range(10_000)) + 0.8406 Naive bayesian classifier @@ -1069,48 +1179,6 @@ The final prediction goes to the largest posterior. This is known as the 'female' -Kernel density estimation -************************* - -It is possible to estimate a continuous probability density function -from a fixed number of discrete samples. - -The basic idea is to smooth the data using `a kernel function such as a -normal distribution, triangular distribution, or uniform distribution -`_. -The degree of smoothing is controlled by a single -parameter, ``h``, representing the variance of the kernel function. - -.. testcode:: - - import math - - def kde_normal(sample, h): - "Create a continuous probability density function from a sample." - # Smooth the sample with a normal distribution of variance h. - kernel_h = NormalDist(0.0, math.sqrt(h)).pdf - n = len(sample) - def pdf(x): - return sum(kernel_h(x - x_i) for x_i in sample) / n - return pdf - -`Wikipedia has an example -`_ -where we can use the ``kde_normal()`` recipe to generate and plot -a probability density function estimated from a small sample: - -.. doctest:: - - >>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2] - >>> f_hat = kde_normal(sample, h=2.25) - >>> xarr = [i/100 for i in range(-750, 1100)] - >>> yarr = [f_hat(x) for x in xarr] - -The points in ``xarr`` and ``yarr`` can be used to make a PDF plot: - -.. image:: kde_example.png - :alt: Scatter plot of the estimated probability density function. - .. # This modelines must appear within the last ten lines of the file. kate: indent-width 3; remove-trailing-space on; replace-tabs on; encoding utf-8; diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 50f56603..b5ba8060 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -44,13 +44,14 @@ Any object can be tested for truth value, for use in an :keyword:`if` or .. index:: single: true By default, an object is considered true unless its class defines either a -:meth:`~object.__bool__` method that returns ``False`` or a :meth:`__len__` method that +:meth:`~object.__bool__` method that returns ``False`` or a +:meth:`~object.__len__` method that returns zero, when called with the object. [1]_ Here are most of the built-in objects considered false: - .. index:: - single: None (Built-in object) - single: False (Built-in object) +.. index:: + single: None (Built-in object) + single: False (Built-in object) * constants defined to be false: ``None`` and ``False`` @@ -197,7 +198,7 @@ exception. Two more operations with the same syntactic priority, :keyword:`in` and :keyword:`not in`, are supported by types that are :term:`iterable` or -implement the :meth:`__contains__` method. +implement the :meth:`~object.__contains__` method. .. _typesnumeric: @@ -208,18 +209,18 @@ Numeric Types --- :class:`int`, :class:`float`, :class:`complex` pair: object; numeric pair: object; Boolean pair: object; integer - pair: object; floating point + pair: object; floating-point pair: object; complex number pair: C; language -There are three distinct numeric types: :dfn:`integers`, :dfn:`floating -point numbers`, and :dfn:`complex numbers`. In addition, Booleans are a -subtype of integers. Integers have unlimited precision. Floating point +There are three distinct numeric types: :dfn:`integers`, :dfn:`floating-point +numbers`, and :dfn:`complex numbers`. In addition, Booleans are a +subtype of integers. Integers have unlimited precision. Floating-point numbers are usually implemented using :c:expr:`double` in C; information -about the precision and internal representation of floating point +about the precision and internal representation of floating-point numbers for the machine on which your program is running is available in :data:`sys.float_info`. Complex numbers have a real and imaginary -part, which are each a floating point number. To extract these parts +part, which are each a floating-point number. To extract these parts from a complex number *z*, use ``z.real`` and ``z.imag``. (The standard library includes the additional numeric types :mod:`fractions.Fraction`, for rationals, and :mod:`decimal.Decimal`, for floating-point numbers with @@ -228,7 +229,7 @@ user-definable precision.) .. index:: pair: numeric; literals pair: integer; literals - pair: floating point; literals + pair: floating-point; literals pair: complex number; literals pair: hexadecimal; literals pair: octal; literals @@ -237,7 +238,7 @@ user-definable precision.) Numbers are created by numeric literals or as the result of built-in functions and operators. Unadorned integer literals (including hex, octal and binary numbers) yield integers. Numeric literals containing a decimal point or an -exponent sign yield floating point numbers. Appending ``'j'`` or ``'J'`` to a +exponent sign yield floating-point numbers. Appending ``'j'`` or ``'J'`` to a numeric literal yields an imaginary number (a complex number with a zero real part) which you can add to an integer or float to get a complex number with real and imaginary parts. @@ -717,7 +718,7 @@ that's defined for any rational number, and hence applies to all instances of :class:`int` and :class:`fractions.Fraction`, and all finite instances of :class:`float` and :class:`decimal.Decimal`. Essentially, this function is given by reduction modulo ``P`` for a fixed prime ``P``. The value of ``P`` is -made available to Python as the :attr:`modulus` attribute of +made available to Python as the :attr:`~sys.hash_info.modulus` attribute of :data:`sys.hash_info`. .. impl-detail:: @@ -804,6 +805,7 @@ number, :class:`float`, or :class:`complex`:: hash_value = -2 return hash_value +.. _bltin-boolean-values: .. _typebool: Boolean Type - :class:`bool` @@ -830,7 +832,7 @@ over ``&``, ``|`` and ``^``. .. deprecated:: 3.12 The use of the bitwise inversion operator ``~`` is deprecated and will - raise an error in Python 3.14. + raise an error in Python 3.16. :class:`bool` is a subclass of :class:`int` (see :ref:`typesnumeric`). In many numeric contexts, ``False`` and ``True`` behave like the integers 0 and 1, respectively. @@ -905,9 +907,9 @@ Generator Types --------------- Python's :term:`generator`\s provide a convenient way to implement the iterator -protocol. If a container object's :meth:`__iter__` method is implemented as a +protocol. If a container object's :meth:`~iterator.__iter__` method is implemented as a generator, it will automatically return an iterator object (technically, a -generator object) supplying the :meth:`__iter__` and :meth:`~generator.__next__` +generator object) supplying the :meth:`!__iter__` and :meth:`~generator.__next__` methods. More information about generators can be found in :ref:`the documentation for the yield expression `. @@ -1207,8 +1209,9 @@ accepts integers that meet the value restriction ``0 <= x <= 255``). | ``s.pop()`` or ``s.pop(i)`` | retrieves the item at *i* and | \(2) | | | also removes it from *s* | | +------------------------------+--------------------------------+---------------------+ -| ``s.remove(x)`` | remove the first item from *s* | \(3) | -| | where ``s[i]`` is equal to *x* | | +| ``s.remove(x)`` | removes the first item from | \(3) | +| | *s* where ``s[i]`` is equal to | | +| | *x* | | +------------------------------+--------------------------------+---------------------+ | ``s.reverse()`` | reverses the items of *s* in | \(4) | | | place | | @@ -1218,7 +1221,7 @@ accepts integers that meet the value restriction ``0 <= x <= 255``). Notes: (1) - *t* must have the same length as the slice it is replacing. + If *k* is not equal to ``1``, *t* must have the same length as the slice it is replacing. (2) The optional argument *i* defaults to ``-1``, so that by default the last @@ -1489,15 +1492,14 @@ objects that compare equal might have different :attr:`~range.start`, sequence of values they define (instead of comparing based on object identity). -.. versionadded:: 3.3 - The :attr:`~range.start`, :attr:`~range.stop` and :attr:`~range.step` + Added the :attr:`~range.start`, :attr:`~range.stop` and :attr:`~range.step` attributes. .. seealso:: - * The `linspace recipe `_ - shows how to implement a lazy version of range suitable for floating - point applications. + * The `linspace recipe `_ + shows how to implement a lazy version of range suitable for floating-point + applications. .. index:: single: string; text sequence type @@ -1526,7 +1528,7 @@ between them will be implicitly converted to a single string literal. That is, ``("spam " "eggs") == "spam eggs"``. See :ref:`strings` for more about the various forms of string literal, -including supported escape sequences, and the ``r`` ("raw") prefix that +including supported :ref:`escape sequences `, and the ``r`` ("raw") prefix that disables most escape sequence processing. Strings may also be created from other objects using the :class:`str` @@ -1641,7 +1643,7 @@ expression support in the :mod:`re` module). The casefolding algorithm is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. versionadded:: 3.3 @@ -1767,7 +1769,7 @@ expression support in the :mod:`re` module). cases. -.. method:: str.format_map(mapping) +.. method:: str.format_map(mapping, /) Similar to ``str.format(**mapping)``, except that ``mapping`` is used directly and not copied to a :class:`dict`. This is useful @@ -1805,7 +1807,7 @@ expression support in the :mod:`re` module). property being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different from the `Alphabetic property defined in the section 4.10 'Letters, Alphabetic, and Ideographic' of the Unicode Standard - `_. + `_. .. method:: str.isascii() @@ -1941,7 +1943,7 @@ expression support in the :mod:`re` module). The lowercasing algorithm used is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. method:: str.lstrip([chars]) @@ -2016,11 +2018,14 @@ expression support in the :mod:`re` module). .. versionadded:: 3.9 -.. method:: str.replace(old, new[, count]) +.. method:: str.replace(old, new, count=-1) Return a copy of the string with all occurrences of substring *old* replaced by - *new*. If the optional argument *count* is given, only the first *count* - occurrences are replaced. + *new*. If *count* is given, only the first *count* occurrences are replaced. + If *count* is not specified or ``-1``, then all occurrences are replaced. + + .. versionchanged:: 3.13 + *count* is now supported as a keyword argument. .. method:: str.rfind(sub[, start[, end]]) @@ -2091,8 +2096,9 @@ expression support in the :mod:`re` module). If *sep* is given, consecutive delimiters are not grouped together and are deemed to delimit empty strings (for example, ``'1,,2'.split(',')`` returns ``['1', '', '2']``). The *sep* argument may consist of multiple characters - (for example, ``'1<>2<>3'.split('<>')`` returns ``['1', '2', '3']``). - Splitting an empty string with a specified separator returns ``['']``. + as a single delimiter (to split with multiple delimiters, use + :func:`re.split`). Splitting an empty string with a specified separator + returns ``['']``. For example:: @@ -2102,6 +2108,8 @@ expression support in the :mod:`re` module). ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', ''] + >>> '1<>2<>3<4'.split('<>') + ['1', '2', '3<4'] If *sep* is not specified or is ``None``, a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, @@ -2263,7 +2271,7 @@ expression support in the :mod:`re` module). Return a copy of the string in which each character has been mapped through the given translation table. The table must be an object that implements - indexing via :meth:`__getitem__`, typically a :term:`mapping` or + indexing via :meth:`~object.__getitem__`, typically a :term:`mapping` or :term:`sequence`. When indexed by a Unicode ordinal (an integer), the table object can do any of the following: return a Unicode ordinal or a string, to map the character to one or more other characters; return @@ -2287,7 +2295,7 @@ expression support in the :mod:`re` module). The uppercasing algorithm used is `described in section 3.13 'Default Case Folding' of the Unicode Standard - `__. + `__. .. method:: str.zfill(width) @@ -2335,7 +2343,13 @@ String objects have one unique built-in operation: the ``%`` operator (modulo). This is also known as the string *formatting* or *interpolation* operator. Given ``format % values`` (where *format* is a string), ``%`` conversion specifications in *format* are replaced with zero or more elements of *values*. -The effect is similar to using the :c:func:`sprintf` in the C language. +The effect is similar to using the :c:func:`sprintf` function in the C language. +For example: + +.. doctest:: + + >>> print('%s has %d quote types.' % ('Python', 2)) + Python has 2 quote types. If *format* requires a single argument, *values* may be a single non-tuple object. [5]_ Otherwise, *values* must be a tuple with exactly the number of @@ -2429,19 +2443,19 @@ The conversion types are: +------------+-----------------------------------------------------+-------+ | ``'X'`` | Signed hexadecimal (uppercase). | \(2) | +------------+-----------------------------------------------------+-------+ -| ``'e'`` | Floating point exponential format (lowercase). | \(3) | +| ``'e'`` | Floating-point exponential format (lowercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'E'`` | Floating point exponential format (uppercase). | \(3) | +| ``'E'`` | Floating-point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format. | \(3) | +| ``'f'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format. | \(3) | +| ``'F'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | +| ``'g'`` | Floating-point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ -| ``'G'`` | Floating point format. Uses uppercase exponential | \(4) | +| ``'G'`` | Floating-point format. Uses uppercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ @@ -3139,10 +3153,9 @@ produce new objects. If *sep* is given, consecutive delimiters are not grouped together and are deemed to delimit empty subsequences (for example, ``b'1,,2'.split(b',')`` returns ``[b'1', b'', b'2']``). The *sep* argument may consist of a - multibyte sequence (for example, ``b'1<>2<>3'.split(b'<>')`` returns - ``[b'1', b'2', b'3']``). Splitting an empty sequence with a specified - separator returns ``[b'']`` or ``[bytearray(b'')]`` depending on the type - of object being split. The *sep* argument may be any + multibyte sequence as a single delimiter. Splitting an empty sequence with + a specified separator returns ``[b'']`` or ``[bytearray(b'')]`` depending + on the type of object being split. The *sep* argument may be any :term:`bytes-like object`. For example:: @@ -3153,6 +3166,8 @@ produce new objects. [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b''] + >>> b'1<>2<>3<4'.split(b'<>') + [b'1', b'2', b'3<4'] If *sep* is not specified or is ``None``, a different splitting algorithm is applied: runs of consecutive ASCII whitespace are regarded as a single @@ -3426,7 +3441,7 @@ place, and instead produce new objects. ``b'abcdefghijklmnopqrstuvwxyz'``. Uppercase ASCII characters are those byte values in the sequence ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``. - Unlike :func:`str.swapcase()`, it is always the case that + Unlike :func:`str.swapcase`, it is always the case that ``bin.swapcase().swapcase() == bin`` for the binary versions. Case conversions are symmetrical in ASCII, even though that is not generally true for arbitrary Unicode code points. @@ -3647,19 +3662,19 @@ The conversion types are: +------------+-----------------------------------------------------+-------+ | ``'X'`` | Signed hexadecimal (uppercase). | \(2) | +------------+-----------------------------------------------------+-------+ -| ``'e'`` | Floating point exponential format (lowercase). | \(3) | +| ``'e'`` | Floating-point exponential format (lowercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'E'`` | Floating point exponential format (uppercase). | \(3) | +| ``'E'`` | Floating-point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format. | \(3) | +| ``'f'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format. | \(3) | +| ``'F'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | +| ``'g'`` | Floating-point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ -| ``'G'`` | Floating point format. Uses uppercase exponential | \(4) | +| ``'G'`` | Floating-point format. Uses uppercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ @@ -3668,7 +3683,7 @@ The conversion types are: +------------+-----------------------------------------------------+-------+ | ``'b'`` | Bytes (any object that follows the | \(5) | | | :ref:`buffer protocol ` or has | | -| | :meth:`__bytes__`). | | +| | :meth:`~object.__bytes__`). | | +------------+-----------------------------------------------------+-------+ | ``'s'`` | ``'s'`` is an alias for ``'b'`` and should only | \(6) | | | be used for Python2/3 code bases. | | @@ -3881,7 +3896,7 @@ copying. >>> a == b False - Note that, as with floating point numbers, ``v is w`` does *not* imply + Note that, as with floating-point numbers, ``v is w`` does *not* imply ``v == w`` for memoryview objects. .. versionchanged:: 3.3 @@ -3972,7 +3987,7 @@ copying. dangling resources) as soon as possible. After this method has been called, any further operation on the view - raises a :class:`ValueError` (except :meth:`release()` itself which can + raises a :class:`ValueError` (except :meth:`release` itself which can be called multiple times):: >>> m = memoryview(b'abc') @@ -4406,7 +4421,8 @@ The constructors for both classes work the same: :meth:`symmetric_difference_update` methods will accept any iterable as an argument. - Note, the *elem* argument to the :meth:`__contains__`, :meth:`remove`, and + Note, the *elem* argument to the :meth:`~object.__contains__`, + :meth:`remove`, and :meth:`discard` methods may be a set. To support searching for an equivalent frozenset, a temporary one is created from *elem*. @@ -4453,14 +4469,14 @@ can be used interchangeably to index the same dictionary entry. ``dict([('foo', 100), ('bar', 200)])``, ``dict(foo=100, bar=200)`` If no positional argument is given, an empty dictionary is created. - If a positional argument is given and it is a mapping object, a dictionary - is created with the same key-value pairs as the mapping object. Otherwise, - the positional argument must be an :term:`iterable` object. Each item in - the iterable must itself be an iterable with exactly two objects. The - first object of each item becomes a key in the new dictionary, and the - second object the corresponding value. If a key occurs more than once, the - last value for that key becomes the corresponding value in the new - dictionary. + If a positional argument is given and it defines a ``keys()`` method, a + dictionary is created by calling :meth:`~object.__getitem__` on the argument with + each returned key from the method. Otherwise, the positional argument must be an + :term:`iterable` object. Each item in the iterable must itself be an iterable + with exactly two elements. The first element of each item becomes a key in the + new dictionary, and the second element the corresponding value. If a key occurs + more than once, the last value for that key becomes the corresponding value in + the new dictionary. If keyword arguments are given, the keyword arguments and their values are added to the dictionary created from the positional argument. If a key @@ -4554,7 +4570,7 @@ can be used interchangeably to index the same dictionary entry. Return a shallow copy of the dictionary. - .. classmethod:: fromkeys(iterable[, value]) + .. classmethod:: fromkeys(iterable, value=None, /) Create a new dictionary with keys from *iterable* and values set to *value*. @@ -4564,7 +4580,7 @@ can be used interchangeably to index the same dictionary entry. such as an empty list. To get distinct values, use a :ref:`dict comprehension ` instead. - .. method:: get(key[, default]) + .. method:: get(key, default=None) Return the value for *key* if *key* is in the dictionary, else *default*. If *default* is not given, it defaults to ``None``, so that this method @@ -4606,7 +4622,7 @@ can be used interchangeably to index the same dictionary entry. .. versionadded:: 3.8 - .. method:: setdefault(key[, default]) + .. method:: setdefault(key, default=None) If *key* is in the dictionary, return its value. If not, insert *key* with a value of *default* and return *default*. *default* defaults to @@ -4617,10 +4633,11 @@ can be used interchangeably to index the same dictionary entry. Update the dictionary with the key/value pairs from *other*, overwriting existing keys. Return ``None``. - :meth:`update` accepts either another dictionary object or an iterable of - key/value pairs (as tuples or other iterables of length two). If keyword - arguments are specified, the dictionary is then updated with those - key/value pairs: ``d.update(red=1, blue=2)``. + :meth:`update` accepts either another object with a ``keys()`` method (in + which case :meth:`~object.__getitem__` is called with every key returned from + the method) or an iterable of key/value pairs (as tuples or other iterables + of length two). If keyword arguments are specified, the dictionary is then + updated with those key/value pairs: ``d.update(red=1, blue=2)``. .. method:: values() @@ -4751,14 +4768,17 @@ support membership tests: .. versionadded:: 3.10 -Keys views are set-like since their entries are unique and :term:`hashable`. If all -values are hashable, so that ``(key, value)`` pairs are unique and hashable, -then the items view is also set-like. (Values views are not treated as set-like +Keys views are set-like since their entries are unique and :term:`hashable`. +Items views also have set-like operations since the (key, value) pairs +are unique and the keys are hashable. +If all values in an items view are hashable as well, +then the items view can interoperate with other sets. +(Values views are not treated as set-like since the entries are generally not unique.) For set-like views, all of the operations defined for the abstract base class :class:`collections.abc.Set` are available (for example, ``==``, ``<``, or ``^``). While using set operators, -set-like views accept any iterable as the other operand, unlike sets which only -accept sets as the input. +set-like views accept any iterable as the other operand, +unlike sets which only accept sets as the input. An example of dictionary view usage:: @@ -4853,7 +4873,7 @@ before the statement body is executed and exited when the statement ends: The exception passed in should never be reraised explicitly - instead, this method should return a false value to indicate that the method completed successfully and does not want to suppress the raised exception. This allows - context management code to easily detect whether or not an :meth:`__exit__` + context management code to easily detect whether or not an :meth:`~object.__exit__` method has actually failed. Python defines several context managers to support easy thread synchronisation, @@ -5229,9 +5249,11 @@ instantiated from the type:: TypeError: cannot create 'types.UnionType' instances .. note:: - The :meth:`__or__` method for type objects was added to support the syntax - ``X | Y``. If a metaclass implements :meth:`__or__`, the Union may - override it:: + The :meth:`!__or__` method for type objects was added to support the syntax + ``X | Y``. If a metaclass implements :meth:`!__or__`, the Union may + override it: + + .. doctest:: >>> class M(type): ... def __or__(self, other): @@ -5243,7 +5265,7 @@ instantiated from the type:: >>> C | int 'Hello' >>> int | C - int | __main__.C + int | C .. seealso:: @@ -5317,25 +5339,30 @@ Methods .. index:: pair: object; method Methods are functions that are called using the attribute notation. There are -two flavors: built-in methods (such as :meth:`append` on lists) and class -instance methods. Built-in methods are described with the types that support -them. +two flavors: :ref:`built-in methods ` (such as :meth:`append` +on lists) and :ref:`class instance method `. +Built-in methods are described with the types that support them. If you access a method (a function defined in a class namespace) through an instance, you get a special object: a :dfn:`bound method` (also called -:dfn:`instance method`) object. When called, it will add the ``self`` argument +:ref:`instance method `) object. When called, it will add +the ``self`` argument to the argument list. Bound methods have two special read-only attributes: -``m.__self__`` is the object on which the method operates, and ``m.__func__`` is +:attr:`m.__self__ ` is the object on which the method +operates, and :attr:`m.__func__ ` is the function implementing the method. Calling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)``. -Like function objects, bound method objects support getting arbitrary +Like :ref:`function objects `, bound method objects support +getting arbitrary attributes. However, since method attributes are actually stored on the -underlying function object (``meth.__func__``), setting method attributes on +underlying function object (:attr:`method.__func__`), setting method attributes on bound methods is disallowed. Attempting to set an attribute on a method results in an :exc:`AttributeError` being raised. In order to set a method -attribute, you need to explicitly set it on the underlying function object:: +attribute, you need to explicitly set it on the underlying function object: + +.. doctest:: >>> class C: ... def method(self): @@ -5350,7 +5377,7 @@ attribute, you need to explicitly set it on the underlying function object:: >>> c.method.whoami 'my name is method' -See :ref:`types` for more information. +See :ref:`instance-methods` for more information. .. index:: object; code, code object @@ -5368,10 +5395,10 @@ Code objects are used by the implementation to represent "pseudo-compiled" executable Python code such as a function body. They differ from function objects because they don't contain a reference to their global execution environment. Code objects are returned by the built-in :func:`compile` function -and can be extracted from function objects through their :attr:`__code__` -attribute. See also the :mod:`code` module. +and can be extracted from function objects through their +:attr:`~function.__code__` attribute. See also the :mod:`code` module. -Accessing ``__code__`` raises an :ref:`auditing event ` +Accessing :attr:`~function.__code__` raises an :ref:`auditing event ` ``object.__getattr__`` with arguments ``obj`` and ``"__code__"``. .. index:: @@ -5434,10 +5461,10 @@ The NotImplemented Object This object is returned from comparisons and binary operations when they are asked to operate on types they don't support. See :ref:`comparisons` for more -information. There is exactly one ``NotImplemented`` object. -``type(NotImplemented)()`` produces the singleton instance. +information. There is exactly one :data:`NotImplemented` object. +:code:`type(NotImplemented)()` produces the singleton instance. -It is written as ``NotImplemented``. +It is written as :code:`NotImplemented`. .. _typesinternal: @@ -5445,8 +5472,9 @@ It is written as ``NotImplemented``. Internal Objects ---------------- -See :ref:`types` for this information. It describes stack frame objects, -traceback objects, and slice objects. +See :ref:`types` for this information. It describes +:ref:`stack frame objects `, +:ref:`traceback objects `, and slice objects. .. _specialattrs: @@ -5459,22 +5487,6 @@ types, where they are relevant. Some of these are not reported by the :func:`dir` built-in function. -.. attribute:: object.__dict__ - - A dictionary or other mapping object used to store an object's (writable) - attributes. - - -.. attribute:: instance.__class__ - - The class to which a class instance belongs. - - -.. attribute:: class.__bases__ - - The tuple of base classes of a class object. - - .. attribute:: definition.__name__ The name of the class, function, method, descriptor, or @@ -5489,35 +5501,23 @@ types, where they are relevant. Some of these are not reported by the .. versionadded:: 3.3 -.. attribute:: definition.__type_params__ +.. attribute:: definition.__module__ - The :ref:`type parameters ` of generic classes, functions, - and :ref:`type aliases `. + The name of the module in which a class or function was defined. - .. versionadded:: 3.12 +.. attribute:: definition.__doc__ -.. attribute:: class.__mro__ + The documentation string of a class or function, or ``None`` if undefined. - This attribute is a tuple of classes that are considered when looking for - base classes during method resolution. +.. attribute:: definition.__type_params__ -.. method:: class.mro() - - This method can be overridden by a metaclass to customize the method - resolution order for its instances. It is called at class instantiation, and - its result is stored in :attr:`~class.__mro__`. - - -.. method:: class.__subclasses__ - - Each class keeps a list of weak references to its immediate subclasses. This - method returns a list of all those references still alive. The list is in - definition order. Example:: + The :ref:`type parameters ` of generic classes, functions, + and :ref:`type aliases `. For classes and functions that + are not generic, this will be an empty tuple. - >>> int.__subclasses__() - [, , , ] + .. versionadded:: 3.12 .. _int_max_str_digits: @@ -5537,8 +5537,7 @@ a string to a binary integer or a binary integer to a string in linear time, have sub-quadratic complexity. Converting a large value such as ``int('1' * 500_000)`` can take over a second on a fast CPU. -Limiting conversion size offers a practical way to avoid `CVE-2020-10735 -`_. +Limiting conversion size offers a practical way to avoid :cve:`2020-10735`. The limit is applied to the number of digit characters in the input or output string when a non-linear conversion algorithm would be involved. Underscores diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 9b28f995..a000bb49 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -1,5 +1,5 @@ -:mod:`string` --- Common string operations -========================================== +:mod:`!string` --- Common string operations +=========================================== .. module:: string :synopsis: Common string operations. @@ -206,15 +206,15 @@ literal text, it can be escaped by doubling: ``{{`` and ``}}``. The grammar for a replacement field is as follows: - .. productionlist:: format-string - replacement_field: "{" [`field_name`] ["!" `conversion`] [":" `format_spec`] "}" - field_name: arg_name ("." `attribute_name` | "[" `element_index` "]")* - arg_name: [`identifier` | `digit`+] - attribute_name: `identifier` - element_index: `digit`+ | `index_string` - index_string: + - conversion: "r" | "s" | "a" - format_spec: +.. productionlist:: format-string + replacement_field: "{" [`field_name`] ["!" `conversion`] [":" `format_spec`] "}" + field_name: `arg_name` ("." `attribute_name` | "[" `element_index` "]")* + arg_name: [`~python-grammar:identifier` | `~python-grammar:digit`+] + attribute_name: `~python-grammar:identifier` + element_index: `~python-grammar:digit`+ | `index_string` + index_string: + + conversion: "r" | "s" | "a" + format_spec: `format-spec:format_spec` In less formal terms, the replacement field can start with a *field_name* that specifies the object whose value is to be formatted and inserted @@ -316,9 +316,9 @@ The general form of a *standard format specifier* is: fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " - width: `digit`+ + width: `~python-grammar:digit`+ grouping_option: "_" | "," - precision: `digit`+ + precision: `~python-grammar:digit`+ type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" If a valid *align* value is specified, it can be preceded by a *fill* @@ -332,30 +332,31 @@ affect the :func:`format` function. The meaning of the various alignment options is as follows: - .. index:: - single: < (less); in string formatting - single: > (greater); in string formatting - single: = (equals); in string formatting - single: ^ (caret); in string formatting - - +---------+----------------------------------------------------------+ - | Option | Meaning | - +=========+==========================================================+ - | ``'<'`` | Forces the field to be left-aligned within the available | - | | space (this is the default for most objects). | - +---------+----------------------------------------------------------+ - | ``'>'`` | Forces the field to be right-aligned within the | - | | available space (this is the default for numbers). | - +---------+----------------------------------------------------------+ - | ``'='`` | Forces the padding to be placed after the sign (if any) | - | | but before the digits. This is used for printing fields | - | | in the form '+000000120'. This alignment option is only | - | | valid for numeric types. It becomes the default for | - | | numbers when '0' immediately precedes the field width. | - +---------+----------------------------------------------------------+ - | ``'^'`` | Forces the field to be centered within the available | - | | space. | - +---------+----------------------------------------------------------+ +.. index:: + single: < (less); in string formatting + single: > (greater); in string formatting + single: = (equals); in string formatting + single: ^ (caret); in string formatting + ++---------+----------------------------------------------------------+ +| Option | Meaning | ++=========+==========================================================+ +| ``'<'`` | Forces the field to be left-aligned within the available | +| | space (this is the default for most objects). | ++---------+----------------------------------------------------------+ +| ``'>'`` | Forces the field to be right-aligned within the | +| | available space (this is the default for numbers). | ++---------+----------------------------------------------------------+ +| ``'='`` | Forces the padding to be placed after the sign (if any) | +| | but before the digits. This is used for printing fields | +| | in the form '+000000120'. This alignment option is only | +| | valid for numeric types, excluding :class:`complex`. | +| | It becomes the default for numbers when '0' immediately | +| | precedes the field width. | ++---------+----------------------------------------------------------+ +| ``'^'`` | Forces the field to be centered within the available | +| | space. | ++---------+----------------------------------------------------------+ Note that unless a minimum field width is defined, the field width will always be the same size as the data to fill it, so that the alignment option has no @@ -364,23 +365,23 @@ meaning in this case. The *sign* option is only valid for number types, and can be one of the following: - .. index:: - single: + (plus); in string formatting - single: - (minus); in string formatting - single: space; in string formatting - - +---------+----------------------------------------------------------+ - | Option | Meaning | - +=========+==========================================================+ - | ``'+'`` | indicates that a sign should be used for both | - | | positive as well as negative numbers. | - +---------+----------------------------------------------------------+ - | ``'-'`` | indicates that a sign should be used only for negative | - | | numbers (this is the default behavior). | - +---------+----------------------------------------------------------+ - | space | indicates that a leading space should be used on | - | | positive numbers, and a minus sign on negative numbers. | - +---------+----------------------------------------------------------+ +.. index:: + single: + (plus); in string formatting + single: - (minus); in string formatting + single: space; in string formatting + ++---------+----------------------------------------------------------+ +| Option | Meaning | ++=========+==========================================================+ +| ``'+'`` | indicates that a sign should be used for both | +| | positive as well as negative numbers. | ++---------+----------------------------------------------------------+ +| ``'-'`` | indicates that a sign should be used only for negative | +| | numbers (this is the default behavior). | ++---------+----------------------------------------------------------+ +| space | indicates that a leading space should be used on | +| | positive numbers, and a minus sign on negative numbers. | ++---------+----------------------------------------------------------+ .. index:: single: z; in string formatting @@ -418,7 +419,7 @@ instead. .. index:: single: _ (underscore); in string formatting The ``'_'`` option signals the use of an underscore for a thousands -separator for floating point presentation types and for integer +separator for floating-point presentation types and for integer presentation type ``'d'``. For integer presentation types ``'b'``, ``'o'``, ``'x'``, and ``'X'``, underscores will be inserted every 4 digits. For other presentation types, specifying this option is an @@ -432,9 +433,9 @@ including any prefixes, separators, and other formatting characters. If not specified, then the field width will be determined by the content. When no explicit alignment is given, preceding the *width* field by a zero -(``'0'``) character enables -sign-aware zero-padding for numeric types. This is equivalent to a *fill* -character of ``'0'`` with an *alignment* type of ``'='``. +(``'0'``) character enables sign-aware zero-padding for numeric types, +excluding :class:`complex`. This is equivalent to a *fill* character of +``'0'`` with an *alignment* type of ``'='``. .. versionchanged:: 3.10 Preceding the *width* field by ``'0'`` no longer affects the default @@ -491,9 +492,9 @@ The available integer presentation types are: +---------+----------------------------------------------------------+ In addition to the above presentation types, integers can be formatted -with the floating point presentation types listed below (except +with the floating-point presentation types listed below (except ``'n'`` and ``None``). When doing so, :func:`float` is used to convert the -integer to a floating point number before formatting. +integer to a floating-point number before formatting. The available presentation types for :class:`float` and :class:`~decimal.Decimal` values are: @@ -509,9 +510,8 @@ The available presentation types for :class:`float` and | | significant digits. With no precision given, uses a | | | precision of ``6`` digits after the decimal point for | | | :class:`float`, and shows all coefficient digits | - | | for :class:`~decimal.Decimal`. If no digits follow the | - | | decimal point, the decimal point is also removed unless | - | | the ``#`` option is used. | + | | for :class:`~decimal.Decimal`. If ``p=0``, the decimal | + | | point is omitted unless the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'E'`` | Scientific notation. Same as ``'e'`` except it uses | | | an upper case 'E' as the separator character. | @@ -522,9 +522,8 @@ The available presentation types for :class:`float` and | | precision given, uses a precision of ``6`` digits after | | | the decimal point for :class:`float`, and uses a | | | precision large enough to show all coefficient digits | - | | for :class:`~decimal.Decimal`. If no digits follow the | - | | decimal point, the decimal point is also removed unless | - | | the ``#`` option is used. | + | | for :class:`~decimal.Decimal`. If ``p=0``, the decimal | + | | point is omitted unless the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'F'`` | Fixed-point notation. Same as ``'f'``, but converts | | | ``nan`` to ``NAN`` and ``inf`` to ``INF``. | @@ -574,11 +573,13 @@ The available presentation types for :class:`float` and | ``'%'`` | Percentage. Multiplies the number by 100 and displays | | | in fixed (``'f'``) format, followed by a percent sign. | +---------+----------------------------------------------------------+ - | None | For :class:`float` this is the same as ``'g'``, except | + | None | For :class:`float` this is like the ``'g'`` type, except | | | that when fixed-point notation is used to format the | | | result, it always includes at least one digit past the | - | | decimal point. The precision used is as large as needed | - | | to represent the given value faithfully. | + | | decimal point, and switches to the scientific notation | + | | when ``exp >= p - 1``. When the precision is not | + | | specified, the latter will be as large as needed to | + | | represent the given value faithfully. | | | | | | For :class:`~decimal.Decimal`, this is the same as | | | either ``'g'`` or ``'G'`` depending on the value of | @@ -588,6 +589,20 @@ The available presentation types for :class:`float` and | | as altered by the other format modifiers. | +---------+----------------------------------------------------------+ +The result should be correctly rounded to a given precision ``p`` of digits +after the decimal point. The rounding mode for :class:`float` matches that +of the :func:`round` builtin. For :class:`~decimal.Decimal`, the rounding +mode of the current :ref:`context ` will be used. + +The available presentation types for :class:`complex` are the same as those for +:class:`float` (``'%'`` is not allowed). Both the real and imaginary components +of a complex number are formatted as floating-point numbers, according to the +specified presentation type. They are separated by the mandatory sign of the +imaginary part, the latter being terminated by a ``j`` suffix. If the presentation +type is missing, the result will match the output of :func:`str` (complex numbers with +a non-zero real part are also surrounded by parentheses), possibly altered by +other format modifiers. + .. _formatexamples: diff --git a/Doc/library/stringprep.rst b/Doc/library/stringprep.rst index c6d78a35..37d5adf0 100644 --- a/Doc/library/stringprep.rst +++ b/Doc/library/stringprep.rst @@ -1,5 +1,5 @@ -:mod:`stringprep` --- Internet String Preparation -================================================= +:mod:`!stringprep` --- Internet String Preparation +================================================== .. module:: stringprep :synopsis: String preparation, as per RFC 3453 diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index c94dfde4..4769affd 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -1,5 +1,9 @@ -:mod:`struct` --- Interpret bytes as packed binary data -======================================================= +:mod:`!struct` --- Interpret bytes as packed binary data +======================================================== + +.. testsetup:: * + + from struct import * .. module:: struct :synopsis: Interpret bytes as packed binary data. @@ -156,6 +160,21 @@ following table: If the first character is not one of these, ``'@'`` is assumed. +.. note:: + + The number 1023 (``0x3ff`` in hexadecimal) has the following byte representations: + + * ``03 ff`` in big-endian (``>``) + * ``ff 03`` in little-endian (``<``) + + Python example: + + >>> import struct + >>> struct.pack('>h', 1023) + b'\x03\xff' + >>> struct.pack('>> Struct('i') + Struct('i') .. _half precision format: https://en.wikipedia.org/wiki/Half-precision_floating-point_format diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 04340cca..59c98e86 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -1,5 +1,5 @@ -:mod:`subprocess` --- Subprocess management -=========================================== +:mod:`!subprocess` --- Subprocess management +============================================ .. module:: subprocess :synopsis: Subprocess management. @@ -25,7 +25,7 @@ modules and functions can be found in the following sections. :pep:`324` -- PEP proposing the subprocess module -.. include:: ../includes/wasm-notavail.rst +.. include:: ../includes/wasm-mobile-notavail.rst Using the :mod:`subprocess` Module ---------------------------------- @@ -52,10 +52,12 @@ underlying :class:`Popen` interface can be used directly. If *capture_output* is true, stdout and stderr will be captured. When used, the internal :class:`Popen` object is automatically created with - ``stdout=PIPE`` and ``stderr=PIPE``. The *stdout* and *stderr* arguments may - not be supplied at the same time as *capture_output*. If you wish to capture - and combine both streams into one, use ``stdout=PIPE`` and ``stderr=STDOUT`` - instead of *capture_output*. + *stdout* and *stderr* both set to :data:`~subprocess.PIPE`. + The *stdout* and *stderr* arguments may not be supplied at the same time as *capture_output*. + If you wish to capture and combine both streams into one, + set *stdout* to :data:`~subprocess.PIPE` + and *stderr* to :data:`~subprocess.STDOUT`, + instead of using *capture_output*. A *timeout* may be specified in seconds, it is internally passed on to :meth:`Popen.communicate`. If the timeout expires, the child process will be @@ -69,7 +71,8 @@ underlying :class:`Popen` interface can be used directly. subprocess's stdin. If used it must be a byte sequence, or a string if *encoding* or *errors* is specified or *text* is true. When used, the internal :class:`Popen` object is automatically created with - ``stdin=PIPE``, and the *stdin* argument may not be used as well. + *stdin* set to :data:`~subprocess.PIPE`, + and the *stdin* argument may not be used as well. If *check* is true, and the process exits with a non-zero exit code, a :exc:`CalledProcessError` exception will be raised. Attributes of that @@ -308,10 +311,10 @@ default values. The arguments that are most commonly needed are: If text mode is not used, *stdin*, *stdout* and *stderr* will be opened as binary streams. No encoding or line ending conversion is performed. - .. versionadded:: 3.6 - Added *encoding* and *errors* parameters. + .. versionchanged:: 3.6 + Added the *encoding* and *errors* parameters. - .. versionadded:: 3.7 + .. versionchanged:: 3.7 Added the *text* parameter as an alias for *universal_newlines*. .. note:: @@ -605,7 +608,7 @@ functions. If *group* is not ``None``, the setregid() system call will be made in the child process prior to the execution of the subprocess. If the provided - value is a string, it will be looked up via :func:`grp.getgrnam()` and + value is a string, it will be looked up via :func:`grp.getgrnam` and the value in ``gr_gid`` will be used. If the value is an integer, it will be passed verbatim. (POSIX only) @@ -615,7 +618,7 @@ functions. If *extra_groups* is not ``None``, the setgroups() system call will be made in the child process prior to the execution of the subprocess. Strings provided in *extra_groups* will be looked up via - :func:`grp.getgrnam()` and the values in ``gr_gid`` will be used. + :func:`grp.getgrnam` and the values in ``gr_gid`` will be used. Integer values will be passed verbatim. (POSIX only) .. availability:: POSIX @@ -623,7 +626,7 @@ functions. If *user* is not ``None``, the setreuid() system call will be made in the child process prior to the execution of the subprocess. If the provided - value is a string, it will be looked up via :func:`pwd.getpwnam()` and + value is a string, it will be looked up via :func:`pwd.getpwnam` and the value in ``pw_uid`` will be used. If the value is an integer, it will be passed verbatim. (POSIX only) @@ -664,28 +667,29 @@ functions. If given, *startupinfo* will be a :class:`STARTUPINFO` object, which is passed to the underlying ``CreateProcess`` function. - *creationflags*, if given, can be one or more of the following flags: - - * :data:`CREATE_NEW_CONSOLE` - * :data:`CREATE_NEW_PROCESS_GROUP` - * :data:`ABOVE_NORMAL_PRIORITY_CLASS` - * :data:`BELOW_NORMAL_PRIORITY_CLASS` - * :data:`HIGH_PRIORITY_CLASS` - * :data:`IDLE_PRIORITY_CLASS` - * :data:`NORMAL_PRIORITY_CLASS` - * :data:`REALTIME_PRIORITY_CLASS` - * :data:`CREATE_NO_WINDOW` - * :data:`DETACHED_PROCESS` - * :data:`CREATE_DEFAULT_ERROR_MODE` - * :data:`CREATE_BREAKAWAY_FROM_JOB` + + If given, *creationflags*, can be one or more of the following flags: + + * :data:`CREATE_NEW_CONSOLE` + * :data:`CREATE_NEW_PROCESS_GROUP` + * :data:`ABOVE_NORMAL_PRIORITY_CLASS` + * :data:`BELOW_NORMAL_PRIORITY_CLASS` + * :data:`HIGH_PRIORITY_CLASS` + * :data:`IDLE_PRIORITY_CLASS` + * :data:`NORMAL_PRIORITY_CLASS` + * :data:`REALTIME_PRIORITY_CLASS` + * :data:`CREATE_NO_WINDOW` + * :data:`DETACHED_PROCESS` + * :data:`CREATE_DEFAULT_ERROR_MODE` + * :data:`CREATE_BREAKAWAY_FROM_JOB` *pipesize* can be used to change the size of the pipe when :data:`PIPE` is used for *stdin*, *stdout* or *stderr*. The size of the pipe is only changed on platforms that support this (only Linux at this time of writing). Other platforms will ignore this parameter. - .. versionadded:: 3.10 - The ``pipesize`` parameter was added. + .. versionchanged:: 3.10 + Added the *pipesize* parameter. Popen objects are supported as context managers via the :keyword:`with` statement: on exit, standard file descriptors are closed, and the process is waited for. @@ -742,16 +746,16 @@ the timeout expires before the process exits. Exceptions defined in this module all inherit from :exc:`SubprocessError`. - .. versionadded:: 3.3 - The :exc:`SubprocessError` base class was added. +.. versionadded:: 3.3 + The :exc:`SubprocessError` base class was added. .. _subprocess-security: Security Considerations ----------------------- -Unlike some other popen functions, this implementation will never -implicitly call a system shell. This means that all characters, +Unlike some other popen functions, this library will not +implicitly choose to call a system shell. This means that all characters, including shell metacharacters, can safely be passed to child processes. If the shell is invoked explicitly, via ``shell=True``, it is the application's responsibility to ensure that all whitespace and metacharacters are @@ -760,6 +764,14 @@ quoted appropriately to avoid vulnerabilities. On :ref:`some platforms `, it is possible to use :func:`shlex.quote` for this escaping. +On Windows, batch files (:file:`*.bat` or :file:`*.cmd`) may be launched by the +operating system in a system shell regardless of the arguments passed to this +library. This could result in arguments being parsed according to shell rules, +but without any escaping added by Python. If you are intentionally launching a +batch file with arguments from untrusted sources, consider passing +``shell=True`` to allow Python to escape special characters. See :gh:`114539` +for additional discussion. + Popen Objects ------------- @@ -791,9 +803,10 @@ Instances of the :class:`Popen` class have the following methods: .. note:: - The function is implemented using a busy loop (non-blocking call and - short sleeps). Use the :mod:`asyncio` module for an asynchronous wait: - see :class:`asyncio.create_subprocess_exec`. + When the ``timeout`` parameter is not ``None``, then (on POSIX) the + function is implemented using a busy loop (non-blocking call and short + sleeps). Use the :mod:`asyncio` module for an asynchronous wait: see + :class:`asyncio.create_subprocess_exec`. .. versionchanged:: 3.3 *timeout* was added. @@ -855,8 +868,8 @@ Instances of the :class:`Popen` class have the following methods: .. method:: Popen.terminate() - Stop the child. On POSIX OSs the method sends SIGTERM to the - child. On Windows the Win32 API function :c:func:`TerminateProcess` is called + Stop the child. On POSIX OSs the method sends :py:const:`~signal.SIGTERM` to the + child. On Windows the Win32 API function :c:func:`!TerminateProcess` is called to stop the child. @@ -1053,6 +1066,22 @@ The :mod:`subprocess` module exposes the following constants. Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains additional information. +.. data:: STARTF_FORCEONFEEDBACK + + A :attr:`STARTUPINFO.dwFlags` parameter to specify that the + *Working in Background* mouse cursor will be displayed while a + process is launching. This is the default behavior for GUI + processes. + + .. versionadded:: 3.13 + +.. data:: STARTF_FORCEOFFFEEDBACK + + A :attr:`STARTUPINFO.dwFlags` parameter to specify that the mouse + cursor will not be changed when launching a process. + + .. versionadded:: 3.13 + .. data:: CREATE_NEW_CONSOLE The new process has a new console, instead of inheriting its parent's @@ -1097,7 +1126,7 @@ The :mod:`subprocess` module exposes the following constants. .. data:: NORMAL_PRIORITY_CLASS A :class:`Popen` ``creationflags`` parameter to specify that a new process - will have an normal priority. (default) + will have a normal priority. (default) .. versionadded:: 3.7 @@ -1460,8 +1489,8 @@ Return code handling translates as follows:: print("There were some errors") -Replacing functions from the :mod:`popen2` module -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Replacing functions from the :mod:`!popen2` module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: @@ -1537,8 +1566,8 @@ handling consistency are valid for these functions. as it did in Python 3.3.3 and earlier. exitcode has the same value as :attr:`~Popen.returncode`. - .. versionadded:: 3.11 - Added *encoding* and *errors* arguments. + .. versionchanged:: 3.11 + Added the *encoding* and *errors* parameters. .. function:: getoutput(cmd, *, encoding=None, errors=None) @@ -1555,8 +1584,8 @@ handling consistency are valid for these functions. .. versionchanged:: 3.3.4 Windows support added - .. versionadded:: 3.11 - Added *encoding* and *errors* arguments. + .. versionchanged:: 3.11 + Added the *encoding* and *errors* parameters. Notes diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index c7a38d96..feb7768f 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -1,274 +1,15 @@ -:mod:`sunau` --- Read and write Sun AU files -============================================ +:mod:`!sunau` --- Read and write Sun AU files +============================================= .. module:: sunau - :synopsis: Provide an interface to the Sun AU sound format. + :synopsis: Removed in 3.13. :deprecated: -.. sectionauthor:: Moshe Zadka - -**Source code:** :source:`Lib/sunau.py` - .. deprecated-removed:: 3.11 3.13 - The :mod:`sunau` module is deprecated - (see :pep:`PEP 594 <594#sunau>` for details). - --------------- - -The :mod:`sunau` module provides a convenient interface to the Sun AU sound -format. Note that this module is interface-compatible with the modules -:mod:`aifc` and :mod:`wave`. - -An audio file consists of a header followed by the data. The fields of the -header are: - -+---------------+-----------------------------------------------+ -| Field | Contents | -+===============+===============================================+ -| magic word | The four bytes ``.snd``. | -+---------------+-----------------------------------------------+ -| header size | Size of the header, including info, in bytes. | -+---------------+-----------------------------------------------+ -| data size | Physical size of the data, in bytes. | -+---------------+-----------------------------------------------+ -| encoding | Indicates how the audio samples are encoded. | -+---------------+-----------------------------------------------+ -| sample rate | The sampling rate. | -+---------------+-----------------------------------------------+ -| # of channels | The number of channels in the samples. | -+---------------+-----------------------------------------------+ -| info | ASCII string giving a description of the | -| | audio file (padded with null bytes). | -+---------------+-----------------------------------------------+ - -Apart from the info field, all header fields are 4 bytes in size. They are all -32-bit unsigned integers encoded in big-endian byte order. - -The :mod:`sunau` module defines the following functions: - - -.. function:: open(file, mode) - - If *file* is a string, open the file by that name, otherwise treat it as a - seekable file-like object. *mode* can be any of - - ``'r'`` - Read only mode. - - ``'w'`` - Write only mode. - - Note that it does not allow read/write files. - - A *mode* of ``'r'`` returns an :class:`AU_read` object, while a *mode* of ``'w'`` - or ``'wb'`` returns an :class:`AU_write` object. - - -The :mod:`sunau` module defines the following exception: - -.. exception:: Error - - An error raised when something is impossible because of Sun AU specs or - implementation deficiency. - - -The :mod:`sunau` module defines the following data items: - -.. data:: AUDIO_FILE_MAGIC - - An integer every valid Sun AU file begins with, stored in big-endian form. This - is the string ``.snd`` interpreted as an integer. - - -.. data:: AUDIO_FILE_ENCODING_MULAW_8 - AUDIO_FILE_ENCODING_LINEAR_8 - AUDIO_FILE_ENCODING_LINEAR_16 - AUDIO_FILE_ENCODING_LINEAR_24 - AUDIO_FILE_ENCODING_LINEAR_32 - AUDIO_FILE_ENCODING_ALAW_8 - - Values of the encoding field from the AU header which are supported by this - module. - - -.. data:: AUDIO_FILE_ENCODING_FLOAT - AUDIO_FILE_ENCODING_DOUBLE - AUDIO_FILE_ENCODING_ADPCM_G721 - AUDIO_FILE_ENCODING_ADPCM_G722 - AUDIO_FILE_ENCODING_ADPCM_G723_3 - AUDIO_FILE_ENCODING_ADPCM_G723_5 - - Additional known values of the encoding field from the AU header, but which are - not supported by this module. - - -.. _au-read-objects: - -AU_read Objects ---------------- - -AU_read objects, as returned by :func:`.open` above, have the following methods: - - -.. method:: AU_read.close() - - Close the stream, and make the instance unusable. (This is called automatically - on deletion.) - - -.. method:: AU_read.getnchannels() - - Returns number of audio channels (1 for mono, 2 for stereo). - - -.. method:: AU_read.getsampwidth() - - Returns sample width in bytes. - - -.. method:: AU_read.getframerate() - - Returns sampling frequency. - - -.. method:: AU_read.getnframes() - - Returns number of audio frames. - - -.. method:: AU_read.getcomptype() - - Returns compression type. Supported compression types are ``'ULAW'``, ``'ALAW'`` - and ``'NONE'``. - - -.. method:: AU_read.getcompname() - - Human-readable version of :meth:`getcomptype`. The supported types have the - respective names ``'CCITT G.711 u-law'``, ``'CCITT G.711 A-law'`` and ``'not - compressed'``. - - -.. method:: AU_read.getparams() - - Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth, - framerate, nframes, comptype, compname)``, equivalent to output of the - :meth:`get\*` methods. - - -.. method:: AU_read.readframes(n) - - Reads and returns at most *n* frames of audio, as a :class:`bytes` object. The data - will be returned in linear format. If the original data is in u-LAW format, it - will be converted. - - -.. method:: AU_read.rewind() - - Rewind the file pointer to the beginning of the audio stream. - -The following two methods define a term "position" which is compatible between -them, and is otherwise implementation dependent. - - -.. method:: AU_read.setpos(pos) - - Set the file pointer to the specified position. Only values returned from - :meth:`tell` should be used for *pos*. - - -.. method:: AU_read.tell() - - Return current file pointer position. Note that the returned value has nothing - to do with the actual position in the file. - -The following two functions are defined for compatibility with the :mod:`aifc`, -and don't do anything interesting. - - -.. method:: AU_read.getmarkers() - - Returns ``None``. - - -.. method:: AU_read.getmark(id) - - Raise an error. - - -.. _au-write-objects: - -AU_write Objects ----------------- - -AU_write objects, as returned by :func:`.open` above, have the following methods: - - -.. method:: AU_write.setnchannels(n) - - Set the number of channels. - - -.. method:: AU_write.setsampwidth(n) - - Set the sample width (in bytes.) - - .. versionchanged:: 3.4 - Added support for 24-bit samples. - - -.. method:: AU_write.setframerate(n) - - Set the frame rate. - - -.. method:: AU_write.setnframes(n) - - Set the number of frames. This can be later changed, when and if more frames - are written. - - -.. method:: AU_write.setcomptype(type, name) - - Set the compression type and description. Only ``'NONE'`` and ``'ULAW'`` are - supported on output. - - -.. method:: AU_write.setparams(tuple) - - The *tuple* should be ``(nchannels, sampwidth, framerate, nframes, comptype, - compname)``, with values valid for the :meth:`set\*` methods. Set all - parameters. - - -.. method:: AU_write.tell() - - Return current position in the file, with the same disclaimer for the - :meth:`AU_read.tell` and :meth:`AU_read.setpos` methods. - - -.. method:: AU_write.writeframesraw(data) - - Write audio frames, without correcting *nframes*. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: AU_write.writeframes(data) - - Write audio frames and make sure *nframes* is correct. - - .. versionchanged:: 3.4 - Any :term:`bytes-like object` is now accepted. - - -.. method:: AU_write.close() - - Make sure *nframes* is correct, and close the file. - - This method is called upon deletion. -Note that it is invalid to set any parameters after calling :meth:`writeframes` -or :meth:`writeframesraw`. +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!sunau` module was +`Python 3.12 `_. diff --git a/Doc/library/superseded.rst b/Doc/library/superseded.rst index 910e8991..17bfa66f 100644 --- a/Doc/library/superseded.rst +++ b/Doc/library/superseded.rst @@ -4,30 +4,12 @@ Superseded Modules ****************** -The modules described in this chapter are deprecated and only kept for +The modules described in this chapter are deprecated or :term:`soft deprecated` and only kept for backwards compatibility. They have been superseded by other modules. .. toctree:: :maxdepth: 1 - aifc.rst - audioop.rst - cgi.rst - cgitb.rst - chunk.rst - crypt.rst - imghdr.rst - mailcap.rst - msilib.rst - nis.rst - nntplib.rst + getopt.rst optparse.rst - ossaudiodev.rst - pipes.rst - sndhdr.rst - spwd.rst - sunau.rst - telnetlib.rst - uu.rst - xdrlib.rst diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst index 85eae5f3..56c62d8e 100644 --- a/Doc/library/symtable.rst +++ b/Doc/library/symtable.rst @@ -1,5 +1,5 @@ -:mod:`symtable` --- Access to the compiler's symbol tables -========================================================== +:mod:`!symtable` --- Access to the compiler's symbol tables +=========================================================== .. module:: symtable :synopsis: Interface to the compiler's internal symbol tables. @@ -31,21 +31,74 @@ Generating Symbol Tables Examining Symbol Tables ----------------------- +.. class:: SymbolTableType + + An enumeration indicating the type of a :class:`SymbolTable` object. + + .. attribute:: MODULE + :value: "module" + + Used for the symbol table of a module. + + .. attribute:: FUNCTION + :value: "function" + + Used for the symbol table of a function. + + .. attribute:: CLASS + :value: "class" + + Used for the symbol table of a class. + + The following members refer to different flavors of + :ref:`annotation scopes `. + + .. attribute:: ANNOTATION + :value: "annotation" + + Used for annotations if ``from __future__ import annotations`` is active. + + .. attribute:: TYPE_ALIAS + :value: "type alias" + + Used for the symbol table of :keyword:`type` constructions. + + .. attribute:: TYPE_PARAMETERS + :value: "type parameters" + + Used for the symbol table of :ref:`generic functions ` + or :ref:`generic classes `. + + .. attribute:: TYPE_VARIABLE + :value: "type variable" + + Used for the symbol table of the bound, the constraint tuple or the + default value of a single type variable in the formal sense, i.e., + a TypeVar, a TypeVarTuple or a ParamSpec object (the latter two do + not support a bound or a constraint tuple). + + .. versionadded:: 3.13 + .. class:: SymbolTable A namespace table for a block. The constructor is not public. .. method:: get_type() - Return the type of the symbol table. Possible values are ``'class'``, - ``'module'``, ``'function'``, ``'annotation'``, ``'TypeVar bound'``, - ``'type alias'``, and ``'type parameter'``. The latter four refer to - different flavors of :ref:`annotation scopes `. + Return the type of the symbol table. Possible values are members + of the :class:`SymbolTableType` enumeration. .. versionchanged:: 3.12 Added ``'annotation'``, ``'TypeVar bound'``, ``'type alias'``, and ``'type parameter'`` as possible return values. + .. versionchanged:: 3.13 + Return values are members of the :class:`SymbolTableType` enumeration. + + The exact values of the returned string may change in the future, + and thus, it is recommended to use :class:`SymbolTableType` members + instead of hard-coded strings. + .. method:: get_id() Return the table's identifier. @@ -97,7 +150,7 @@ Examining Symbol Tables .. class:: Function - A namespace for a function or method. This class inherits + A namespace for a function or method. This class inherits from :class:`SymbolTable`. .. method:: get_parameters() @@ -114,21 +167,53 @@ Examining Symbol Tables .. method:: get_nonlocals() - Return a tuple containing names of nonlocals in this function. + Return a tuple containing names of explicitly declared nonlocals in this function. .. method:: get_frees() - Return a tuple containing names of free variables in this function. + Return a tuple containing names of :term:`free (closure) variables ` + in this function. .. class:: Class - A namespace of a class. This class inherits :class:`SymbolTable`. + A namespace of a class. This class inherits from :class:`SymbolTable`. .. method:: get_methods() - Return a tuple containing the names of methods declared in the class. - + Return a tuple containing the names of method-like functions declared + in the class. + + Here, the term 'method' designates *any* function defined in the class + body via :keyword:`def` or :keyword:`async def`. + + Functions defined in a deeper scope (e.g., in an inner class) are not + picked up by :meth:`get_methods`. + + For example: + + >>> import symtable + >>> st = symtable.symtable(''' + ... def outer(): pass + ... + ... class A: + ... def f(): + ... def w(): pass + ... + ... def g(self): pass + ... + ... @classmethod + ... async def h(cls): pass + ... + ... global outer + ... def outer(self): pass + ... ''', 'test', 'exec') + >>> class_A = st.get_children()[1] + >>> class_A.get_methods() + ('f', 'g', 'h') + + Although ``A().f()`` raises :exc:`TypeError` at runtime, ``A.f`` is still + considered as a method-like function. .. class:: Symbol @@ -207,3 +292,21 @@ Examining Symbol Tables Return the namespace bound to this name. If more than one or no namespace is bound to this name, a :exc:`ValueError` is raised. + + +.. _symtable-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 3.13 + +The :mod:`symtable` module can be executed as a script from the command line. + +.. code-block:: sh + + python -m symtable [infile...] + +Symbol tables are generated for the specified Python source files and +dumped to stdout. +If no input file is specified, the content is read from stdin. diff --git a/Doc/library/sys.monitoring.rst b/Doc/library/sys.monitoring.rst index 7b02b95f..5f08deba 100644 --- a/Doc/library/sys.monitoring.rst +++ b/Doc/library/sys.monitoring.rst @@ -1,14 +1,16 @@ -:mod:`sys.monitoring` --- Execution event monitoring -==================================================== +:mod:`!sys.monitoring` --- Execution event monitoring +===================================================== -.. module:: sys.monitoring - :synopsis: Access and control event monitoring +.. module:: sys.monitoring + :synopsis: Access and control event monitoring + +.. versionadded:: 3.12 ----------------- .. note:: - ``sys.monitoring`` is a namespace within the ``sys`` module, + :mod:`sys.monitoring` is a namespace within the :mod:`sys` module, not an independent module, so there is no need to ``import sys.monitoring``, simply ``import sys`` and then use ``sys.monitoring``. @@ -18,45 +20,52 @@ This namespace provides access to the functions and constants necessary to activate and control event monitoring. As programs execute, events occur that might be of interest to tools that -monitor execution. The :mod:`!sys.monitoring` namespace provides means to +monitor execution. The :mod:`sys.monitoring` namespace provides means to receive callbacks when events of interest occur. The monitoring API consists of three components: -* Tool identifiers -* Events -* Callbacks +* `Tool identifiers`_ +* `Events`_ +* :ref:`Callbacks ` Tool identifiers ---------------- -A tool identifier is an integer and associated name. +A tool identifier is an integer and the associated name. Tool identifiers are used to discourage tools from interfering with each other and to allow multiple tools to operate at the same time. Currently tools are completely independent and cannot be used to monitor each other. This restriction may be lifted in the future. Before registering or activating events, a tool should choose an identifier. -Identifiers are integers in the range 0 to 5. +Identifiers are integers in the range 0 to 5 inclusive. Registering and using tools ''''''''''''''''''''''''''' -.. function:: use_tool_id(id: int, name: str) -> None +.. function:: use_tool_id(tool_id: int, name: str, /) -> None + + Must be called before *tool_id* can be used. + *tool_id* must be in the range 0 to 5 inclusive. + Raises a :exc:`ValueError` if *tool_id* is in use. - Must be called before ``id`` can be used. - ``id`` must be in the range 0 to 5 inclusive. - Raises a ``ValueError`` if ``id`` is in use. +.. function:: free_tool_id(tool_id: int, /) -> None -.. function:: free_tool_id(id: int) -> None + Should be called once a tool no longer requires *tool_id*. + +.. note:: - Should be called once a tool no longer requires ``id``. + :func:`free_tool_id` will not disable global or local events associated + with *tool_id*, nor will it unregister any callback functions. This + function is only intended to be used to notify the VM that the + particular *tool_id* is no longer in use. -.. function:: get_tool(id: int) -> str | None +.. function:: get_tool(tool_id: int, /) -> str | None - Returns the name of the tool if ``id`` is in use, + Returns the name of the tool if *tool_id* is in use, otherwise it returns ``None``. - ``id`` must be in the range 0 to 5 inclusive. + *tool_id* must be in the range 0 to 5 inclusive. All IDs are treated the same by the VM with regard to events, but the following IDs are pre-defined to make co-operation of tools easier:: @@ -66,57 +75,95 @@ following IDs are pre-defined to make co-operation of tools easier:: sys.monitoring.PROFILER_ID = 2 sys.monitoring.OPTIMIZER_ID = 5 -There is no obligation to set an ID, nor is there anything preventing a tool -from using an ID even it is already in use. -However, tools are encouraged to use a unique ID and respect other tools. Events ------ The following events are supported: -BRANCH - A conditional branch is taken (or not). -CALL - A call in Python code (event occurs before the call). -C_RAISE - Exception raised from any callable, except Python functions (event occurs after the exit). -C_RETURN - Return from any callable, except Python functions (event occurs after the return). -EXCEPTION_HANDLED - An exception is handled. -INSTRUCTION - A VM instruction is about to be executed. -JUMP - An unconditional jump in the control flow graph is made. -LINE - An instruction is about to be executed that has a different line number from the preceding instruction. -PY_RESUME - Resumption of a Python function (for generator and coroutine functions), except for throw() calls. -PY_RETURN - Return from a Python function (occurs immediately before the return, the callee's frame will be on the stack). -PY_START - Start of a Python function (occurs immediately after the call, the callee's frame will be on the stack) -PY_THROW - A Python function is resumed by a throw() call. -PY_UNWIND - Exit from a Python function during exception unwinding. -PY_YIELD - Yield from a Python function (occurs immediately before the yield, the callee's frame will be on the stack). -RAISE - An exception is raised, except those that cause a ``STOP_ITERATION`` event. -RERAISE - An exception is re-raised, for example at the end of a ``finally`` block. -STOP_ITERATION - An artificial ``StopIteration`` is raised; see `the STOP_ITERATION event`_. +.. monitoring-event:: BRANCH + + A conditional branch is taken (or not). + +.. monitoring-event:: CALL + + A call in Python code (event occurs before the call). + +.. monitoring-event:: C_RAISE + + An exception raised from any callable, except for Python functions (event occurs after the exit). + +.. monitoring-event:: C_RETURN + + Return from any callable, except for Python functions (event occurs after the return). + +.. monitoring-event:: EXCEPTION_HANDLED + + An exception is handled. + +.. monitoring-event:: INSTRUCTION + + A VM instruction is about to be executed. + +.. monitoring-event:: JUMP + + An unconditional jump in the control flow graph is made. + +.. monitoring-event:: LINE + + An instruction is about to be executed that has a different line number from the preceding instruction. + +.. monitoring-event:: PY_RESUME + + Resumption of a Python function (for generator and coroutine functions), except for ``throw()`` calls. + +.. monitoring-event:: PY_RETURN + + Return from a Python function (occurs immediately before the return, the callee's frame will be on the stack). + +.. monitoring-event:: PY_START + + Start of a Python function (occurs immediately after the call, the callee's frame will be on the stack) + +.. monitoring-event:: PY_THROW + + A Python function is resumed by a ``throw()`` call. + +.. monitoring-event:: PY_UNWIND + + Exit from a Python function during exception unwinding. + +.. monitoring-event:: PY_YIELD + + Yield from a Python function (occurs immediately before the yield, the callee's frame will be on the stack). + +.. monitoring-event:: RAISE + + An exception is raised, except those that cause a :monitoring-event:`STOP_ITERATION` event. + +.. monitoring-event:: RERAISE + + An exception is re-raised, for example at the end of a :keyword:`finally` block. + +.. monitoring-event:: STOP_ITERATION + + An artificial :exc:`StopIteration` is raised; see `the STOP_ITERATION event`_. + More events may be added in the future. These events are attributes of the :mod:`!sys.monitoring.events` namespace. Each event is represented as a power-of-2 integer constant. To define a set of events, simply bitwise or the individual events together. -For example, to specify both ``PY_RETURN`` and ``PY_START`` events, use the -expression ``PY_RETURN | PY_START``. +For example, to specify both :monitoring-event:`PY_RETURN` and :monitoring-event:`PY_START` +events, use the expression ``PY_RETURN | PY_START``. + +.. monitoring-event:: NO_EVENTS + + An alias for ``0`` so users can do explicit comparisons like:: + + if get_events(DEBUGGER_ID) == NO_EVENTS: + ... Events are divided into three groups: @@ -127,16 +174,16 @@ Local events are associated with normal execution of the program and happen at clearly defined locations. All local events can be disabled. The local events are: -* PY_START -* PY_RESUME -* PY_RETURN -* PY_YIELD -* CALL -* LINE -* INSTRUCTION -* JUMP -* BRANCH -* STOP_ITERATION +* :monitoring-event:`PY_START` +* :monitoring-event:`PY_RESUME` +* :monitoring-event:`PY_RETURN` +* :monitoring-event:`PY_YIELD` +* :monitoring-event:`CALL` +* :monitoring-event:`LINE` +* :monitoring-event:`INSTRUCTION` +* :monitoring-event:`JUMP` +* :monitoring-event:`BRANCH` +* :monitoring-event:`STOP_ITERATION` Ancillary events '''''''''''''''' @@ -144,12 +191,13 @@ Ancillary events Ancillary events can be monitored like other events, but are controlled by another event: -* C_RAISE -* C_RETURN +* :monitoring-event:`C_RAISE` +* :monitoring-event:`C_RETURN` -The ``C_RETURN`` and ``C_RAISE`` events are are controlled by the ``CALL`` -event. ``C_RETURN`` and ``C_RAISE`` events will only be seen if the -corresponding ``CALL`` event is being monitored. +The :monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events +are controlled by the :monitoring-event:`CALL` event. +:monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be seen if the +corresponding :monitoring-event:`CALL` event is being monitored. Other events '''''''''''' @@ -159,30 +207,31 @@ program and cannot be individually disabled. The other events that can be monitored are: -* PY_THROW -* PY_UNWIND -* RAISE -* EXCEPTION_HANDLED +* :monitoring-event:`PY_THROW` +* :monitoring-event:`PY_UNWIND` +* :monitoring-event:`RAISE` +* :monitoring-event:`EXCEPTION_HANDLED` The STOP_ITERATION event '''''''''''''''''''''''' :pep:`PEP 380 <380#use-of-stopiteration-to-return-values>` -specifies that a ``StopIteration`` exception is raised when returning a value +specifies that a :exc:`StopIteration` exception is raised when returning a value from a generator or coroutine. However, this is a very inefficient way to return a value, so some Python implementations, notably CPython 3.12+, do not raise an exception unless it would be visible to other code. To allow tools to monitor for real exceptions without slowing down generators -and coroutines, the ``STOP_ITERATION`` event is provided. -``STOP_ITERATION`` can be locally disabled, unlike ``RAISE``. +and coroutines, the :monitoring-event:`STOP_ITERATION` event is provided. +:monitoring-event:`STOP_ITERATION` can be locally disabled, unlike :monitoring-event:`RAISE`. Turning events on and off ------------------------- -In order to monitor an event, it must be turned on and a callback registered. +In order to monitor an event, it must be turned on and a corresponding callback +must be registered. Events can be turned on or off by setting the events either globally or for a particular code object. @@ -192,30 +241,33 @@ Setting events globally Events can be controlled globally by modifying the set of events being monitored. -.. function:: get_events(tool_id: int) -> int +.. function:: get_events(tool_id: int, /) -> int Returns the ``int`` representing all the active events. -.. function:: set_events(tool_id: int, event_set: int) +.. function:: set_events(tool_id: int, event_set: int, /) -> None - Activates all events which are set in ``event_set``. - Raises a ``ValueError`` if ``tool_id`` is not in use. + Activates all events which are set in *event_set*. + Raises a :exc:`ValueError` if *tool_id* is not in use. No events are active by default. Per code object events '''''''''''''''''''''' -Events can also be controlled on a per code object basis. +Events can also be controlled on a per code object basis. The functions +defined below which accept a :class:`types.CodeType` should be prepared +to accept a look-alike object from functions which are not defined +in Python (see :ref:`c-api-monitoring`). -.. function:: get_local_events(tool_id: int, code: CodeType) -> int +.. function:: get_local_events(tool_id: int, code: CodeType, /) -> int - Returns all the local events for ``code`` + Returns all the local events for *code* -.. function:: set_local_events(tool_id: int, code: CodeType, event_set: int) +.. function:: set_local_events(tool_id: int, code: CodeType, event_set: int, /) -> None - Activates all the local events for ``code`` which are set in ``event_set``. - Raises a ``ValueError`` if ``tool_id`` is not in use. + Activates all the local events for *code* which are set in *event_set*. + Raises a :exc:`ValueError` if *tool_id* is not in use. Local events add to global events, but do not mask them. In other words, all global events will trigger for a code object, @@ -225,8 +277,13 @@ regardless of the local events. Disabling events '''''''''''''''' +.. data:: DISABLE + + A special value that can be returned from a callback function to disable + events for the current code location. + Local events can be disabled for a specific code location by returning -``sys.monitoring.DISABLE`` from a callback function. This does not change +:data:`sys.monitoring.DISABLE` from a callback function. This does not change which events are set, or any other code locations for the same event. Disabling events for specific locations is very important for high @@ -234,19 +291,26 @@ performance monitoring. For example, a program can be run under a debugger with no overhead if the debugger disables all monitoring except for a few breakpoints. +.. function:: restart_events() -> None + + Enable all the events that were disabled by :data:`sys.monitoring.DISABLE` + for all tools. + + +.. _callbacks: Registering callback functions ------------------------------ To register a callable for events call -.. function:: register_callback(tool_id: int, event: int, func: Callable | None) -> Callable | None +.. function:: register_callback(tool_id: int, event: int, func: Callable | None, /) -> Callable | None - Registers the callable ``func`` for the ``event`` with the given ``tool_id`` + Registers the callable *func* for the *event* with the given *tool_id* - If another callback was registered for the given ``tool_id`` and ``event``, + If another callback was registered for the given *tool_id* and *event*, it is unregistered and returned. - Otherwise ``register_callback`` returns ``None``. + Otherwise :func:`register_callback` returns ``None``. Functions can be unregistered by calling @@ -254,47 +318,51 @@ Functions can be unregistered by calling Callback functions can be registered and unregistered at any time. -Registering or unregistering a callback function will generate a ``sys.audit`` event. +Registering or unregistering a callback function will generate a :func:`sys.audit` event. Callback function arguments ''''''''''''''''''''''''''' +.. data:: MISSING + + A special value that is passed to a callback function to indicate + that there are no arguments to the call. + When an active event occurs, the registered callback function is called. Different events will provide the callback function with different arguments, as follows: -* ``PY_START`` and ``PY_RESUME``:: +* :monitoring-event:`PY_START` and :monitoring-event:`PY_RESUME`:: func(code: CodeType, instruction_offset: int) -> DISABLE | Any -* ``PY_RETURN`` and ``PY_YIELD``: +* :monitoring-event:`PY_RETURN` and :monitoring-event:`PY_YIELD`:: - ``func(code: CodeType, instruction_offset: int, retval: object) -> DISABLE | Any`` + func(code: CodeType, instruction_offset: int, retval: object) -> DISABLE | Any -* ``CALL``, ``C_RAISE`` and ``C_RETURN``: +* :monitoring-event:`CALL`, :monitoring-event:`C_RAISE` and :monitoring-event:`C_RETURN`:: - ``func(code: CodeType, instruction_offset: int, callable: object, arg0: object | MISSING) -> DISABLE | Any`` + func(code: CodeType, instruction_offset: int, callable: object, arg0: object | MISSING) -> DISABLE | Any - If there are no arguments, ``arg0`` is set to ``MISSING``. + If there are no arguments, *arg0* is set to :data:`sys.monitoring.MISSING`. -* ``RAISE``, ``RERAISE``, ``EXCEPTION_HANDLED``, ``PY_UNWIND``, ``PY_THROW`` and ``STOP_ITERATION``: +* :monitoring-event:`RAISE`, :monitoring-event:`RERAISE`, :monitoring-event:`EXCEPTION_HANDLED`, + :monitoring-event:`PY_UNWIND`, :monitoring-event:`PY_THROW` and :monitoring-event:`STOP_ITERATION`:: - ``func(code: CodeType, instruction_offset: int, exception: BaseException) -> DISABLE | Any`` + func(code: CodeType, instruction_offset: int, exception: BaseException) -> DISABLE | Any -* ``LINE``: +* :monitoring-event:`LINE`:: - ``func(code: CodeType, line_number: int) -> DISABLE | Any`` + func(code: CodeType, line_number: int) -> DISABLE | Any -* ``BRANCH`` and ``JUMP``: +* :monitoring-event:`BRANCH` and :monitoring-event:`JUMP`:: - ``func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any`` + func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any - Note that the ``destination_offset`` is where the code will next execute. + Note that the *destination_offset* is where the code will next execute. For an untaken branch this will be the offset of the instruction following the branch. -* ``INSTRUCTION``: - - ``func(code: CodeType, instruction_offset: int) -> DISABLE | Any`` - +* :monitoring-event:`INSTRUCTION`:: + func(code: CodeType, instruction_offset: int) -> DISABLE | Any diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 6fb4c0f1..fdacf5af 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1,5 +1,5 @@ -:mod:`sys` --- System-specific parameters and functions -======================================================= +:mod:`!sys` --- System-specific parameters and functions +======================================================== .. module:: sys :synopsis: Access system-specific parameters and functions. @@ -16,11 +16,13 @@ always available. On POSIX systems where Python was built with the standard ``configure`` script, this contains the ABI flags as specified by :pep:`3149`. + .. versionadded:: 3.2 + .. versionchanged:: 3.8 Default flags became an empty string (``m`` flag for pymalloc has been removed). - .. versionadded:: 3.2 + .. availability:: Unix. .. function:: addaudithook(hook) @@ -173,7 +175,11 @@ always available. Call ``func(*args)``, while tracing is enabled. The tracing state is saved, and restored afterwards. This is intended to be called from a debugger from - a checkpoint, to recursively debug some other code. + a checkpoint, to recursively debug or profile some other code. + + Tracing is suspended while calling a tracing function set by + :func:`settrace` or :func:`setprofile` to avoid infinite recursion. + :func:`!call_tracing` enables explicit recursion of the tracing function. .. data:: copyright @@ -189,6 +195,17 @@ always available. This function should be used for internal and specialized purposes only. + .. deprecated:: 3.13 + Use the more general :func:`_clear_internal_caches` function instead. + + +.. function:: _clear_internal_caches() + + Clear all internal performance-related caches. Use this function *only* to + release unnecessary references and memory blocks when hunting for leaks. + + .. versionadded:: 3.13 + .. function:: _current_frames() @@ -718,11 +735,11 @@ always available. regardless of their size. This function is mainly useful for tracking and debugging memory leaks. Because of the interpreter's internal caches, the result can vary from call to call; you may have to call - :func:`_clear_type_cache()` and :func:`gc.collect()` to get more + :func:`_clear_internal_caches` and :func:`gc.collect` to get more predictable results. If a Python build or implementation cannot reasonably compute this - information, :func:`getallocatedblocks()` is allowed to return 0 instead. + information, :func:`getallocatedblocks` is allowed to return 0 instead. .. versionadded:: 3.4 @@ -736,7 +753,9 @@ always available. .. function:: getandroidapilevel() - Return the build time API version of Android as an integer. + Return the build-time API level of Android as an integer. This represents the + minimum version of Android this build of Python can run on. For runtime + version information, see :func:`platform.android_ver`. .. availability:: Android. @@ -825,7 +844,7 @@ always available. Note that the returned value may not actually reflect how many references to the object are actually held. For example, some - objects are "immortal" and have a very high refcount that does not + objects are :term:`immortal` and have a very high refcount that does not reflect the actual number of references. Consequently, do not rely on the returned value to be accurate, other than a value of 0 or 1. @@ -858,7 +877,7 @@ always available. additional garbage collector overhead if the object is managed by the garbage collector. - See `recursive sizeof recipe `_ + See `recursive sizeof recipe `_ for an example of using :func:`getsizeof` recursively to find the size of containers and all their contents. @@ -901,6 +920,35 @@ always available. It is not guaranteed to exist in all implementations of Python. +.. function:: getobjects(limit[, type]) + + This function only exists if CPython was built using the + specialized configure option :option:`--with-trace-refs`. + It is intended only for debugging garbage-collection issues. + + Return a list of up to *limit* dynamically allocated Python objects. + If *type* is given, only objects of that exact type (not subtypes) + are included. + + Objects from the list are not safe to use. + Specifically, the result will include objects from all interpreters that + share their object allocator state (that is, ones created with + :c:member:`PyInterpreterConfig.use_main_obmalloc` set to 1 + or using :c:func:`Py_NewInterpreter`, and the + :ref:`main interpreter `). + Mixing objects from different interpreters may lead to crashes + or other unexpected behavior. + + .. impl-detail:: + + This function should be used for specialized purposes only. + It is not guaranteed to exist in all implementations of Python. + + .. versionchanged:: 3.13.1 + + The result may include objects from other interpreters. + + .. function:: getprofile() .. index:: @@ -1176,14 +1224,24 @@ always available. names used in Python programs are automatically interned, and the dictionaries used to hold module, class or instance attributes have interned keys. - Interned strings are not immortal; you must keep a reference to the return - value of :func:`intern` around to benefit from it. + Interned strings are not :term:`immortal`; you must keep a reference to the + return value of :func:`intern` around to benefit from it. + + +.. function:: _is_gil_enabled() + + Return :const:`True` if the :term:`GIL` is enabled and :const:`False` if + it is disabled. + + .. versionadded:: 3.13 .. function:: is_finalizing() - Return :const:`True` if the Python interpreter is - :term:`shutting down `, :const:`False` otherwise. + Return :const:`True` if the main Python interpreter is + :term:`shutting down `. Return :const:`False` otherwise. + + See also the :exc:`PythonFinalizationError` exception. .. versionadded:: 3.5 @@ -1199,6 +1257,18 @@ always available. .. versionadded:: 3.12 +.. function:: _is_interned(string) + + Return :const:`True` if the given string is "interned", :const:`False` + otherwise. + + .. versionadded:: 3.13 + + .. impl-detail:: + + It is not guaranteed to exist in all implementations of Python. + + .. data:: last_type last_value last_traceback @@ -1233,7 +1303,8 @@ always available. that implement Python's default import semantics. The :meth:`~importlib.abc.MetaPathFinder.find_spec` method is called with at least the absolute name of the module being imported. If the module to be - imported is contained in a package, then the parent package's :attr:`__path__` + imported is contained in a package, then the parent package's + :attr:`~module.__path__` attribute is passed in as a second argument. The method returns a :term:`module spec`, or ``None`` if the module cannot be found. @@ -1250,10 +1321,13 @@ always available. .. versionchanged:: 3.4 :term:`Module specs ` were introduced in Python 3.4, by - :pep:`451`. Earlier versions of Python looked for a method called - :meth:`!find_module`. - This is still called as a fallback if a :data:`meta_path` entry doesn't - have a :meth:`~importlib.abc.MetaPathFinder.find_spec` method. + :pep:`451`. + + .. versionchanged:: 3.12 + + Removed the fallback that looked for a :meth:`!find_module` method + if a :data:`meta_path` entry didn't have a + :meth:`~importlib.abc.MetaPathFinder.find_spec` method. .. data:: modules @@ -1272,7 +1346,10 @@ always available. The list of the original command line arguments passed to the Python executable. - See also :data:`sys.argv`. + The elements of :data:`sys.orig_argv` are the arguments to the Python interpreter, + while the elements of :data:`sys.argv` are the arguments to the user's program. + Arguments consumed by the interpreter itself will be present in :data:`sys.orig_argv` + and missing from :data:`sys.argv`. .. versionadded:: 3.10 @@ -1330,47 +1407,42 @@ always available. .. data:: platform - This string contains a platform identifier that can be used to append - platform-specific components to :data:`sys.path`, for instance. - - For Unix systems, except on Linux and AIX, this is the lowercased OS name as - returned by ``uname -s`` with the first part of the version as returned by - ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, *at the time - when Python was built*. Unless you want to test for a specific system - version, it is therefore recommended to use the following idiom:: - - if sys.platform.startswith('freebsd'): - # FreeBSD-specific code here... - elif sys.platform.startswith('linux'): - # Linux-specific code here... - elif sys.platform.startswith('aix'): - # AIX-specific code here... - - For other systems, the values are: + A string containing a platform identifier. Known values are: ================ =========================== System ``platform`` value ================ =========================== AIX ``'aix'`` + Android ``'android'`` Emscripten ``'emscripten'`` + iOS ``'ios'`` Linux ``'linux'`` - WASI ``'wasi'`` + macOS ``'darwin'`` Windows ``'win32'`` Windows/Cygwin ``'cygwin'`` - macOS ``'darwin'`` + WASI ``'wasi'`` ================ =========================== + On Unix systems not listed in the table, the value is the lowercased OS name + as returned by ``uname -s``, with the first part of the version as returned by + ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, *at the time + when Python was built*. Unless you want to test for a specific system + version, it is therefore recommended to use the following idiom:: + + if sys.platform.startswith('freebsd'): + # FreeBSD-specific code here... + .. versionchanged:: 3.3 On Linux, :data:`sys.platform` doesn't contain the major version anymore. - It is always ``'linux'``, instead of ``'linux2'`` or ``'linux3'``. Since - older Python versions include the version number, it is recommended to - always use the ``startswith`` idiom presented above. + It is always ``'linux'``, instead of ``'linux2'`` or ``'linux3'``. .. versionchanged:: 3.8 On AIX, :data:`sys.platform` doesn't contain the major version anymore. - It is always ``'aix'``, instead of ``'aix5'`` or ``'aix7'``. Since - older Python versions include the version number, it is recommended to - always use the ``startswith`` idiom presented above. + It is always ``'aix'``, instead of ``'aix5'`` or ``'aix7'``. + + .. versionchanged:: 3.13 + On Android, :data:`sys.platform` now returns ``'android'`` rather than + ``'linux'``. .. seealso:: @@ -1471,13 +1543,16 @@ always available. its return value is not used, so it can simply return ``None``. Error in the profile function will cause itself unset. + .. note:: + The same tracing mechanism is used for :func:`!setprofile` as :func:`settrace`. + To trace calls with :func:`!setprofile` inside a tracing function + (e.g. in a debugger breakpoint), see :func:`call_tracing`. + Profile functions should have three arguments: *frame*, *event*, and *arg*. *frame* is the current stack frame. *event* is a string: ``'call'``, ``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends on the event type. - .. audit-event:: sys.setprofile "" sys.setprofile - The events have the following meaning: ``'call'`` @@ -1499,6 +1574,9 @@ always available. ``'c_exception'`` A C function has raised an exception. *arg* is the C function object. + .. audit-event:: sys.setprofile "" sys.setprofile + + .. function:: setrecursionlimit(limit) Set the maximum depth of the Python interpreter stack to *limit*. This limit @@ -1552,13 +1630,16 @@ always available. function to be used for the new scope, or ``None`` if the scope shouldn't be traced. - The local trace function should return a reference to itself (or to another - function for further tracing in that scope), or ``None`` to turn off tracing - in that scope. + The local trace function should return a reference to itself, or to another + function which would then be used as the local trace function for the scope. If there is any error occurred in the trace function, it will be unset, just like ``settrace(None)`` is called. + .. note:: + Tracing is disabled while calling the trace function (e.g. a function set by + :func:`!settrace`). For recursive tracing see :func:`call_tracing`. + The events have the following meaning: ``'call'`` @@ -1573,7 +1654,8 @@ always available. :file:`Objects/lnotab_notes.txt` for a detailed explanation of how this works. Per-line events may be disabled for a frame by setting - :attr:`!f_trace_lines` to :const:`False` on that :ref:`frame `. + :attr:`~frame.f_trace_lines` to :const:`False` on that + :ref:`frame `. ``'return'`` A function (or other code block) is about to return. The local trace @@ -1591,7 +1673,7 @@ always available. opcode details). The local trace function is called; *arg* is ``None``; the return value specifies the new local trace function. Per-opcode events are not emitted by default: they must be explicitly - requested by setting :attr:`!f_trace_opcodes` to :const:`True` on the + requested by setting :attr:`~frame.f_trace_opcodes` to :const:`True` on the :ref:`frame `. Note that as an exception is propagated down the chain of callers, an @@ -1621,10 +1703,10 @@ always available. .. versionchanged:: 3.7 - ``'opcode'`` event type added; :attr:`!f_trace_lines` and - :attr:`!f_trace_opcodes` attributes added to frames + ``'opcode'`` event type added; :attr:`~frame.f_trace_lines` and + :attr:`~frame.f_trace_opcodes` attributes added to frames -.. function:: set_asyncgen_hooks(firstiter, finalizer) +.. function:: set_asyncgen_hooks([firstiter] [, finalizer]) Accepts two optional keyword arguments which are callables that accept an :term:`asynchronous generator iterator` as an argument. The *firstiter* @@ -1656,7 +1738,7 @@ always available. contain a tuple of (filename, line number, function name) tuples describing the traceback where the coroutine object was created, with the most recent call first. When disabled, ``cr_origin`` will - be None. + be ``None``. To enable, pass a *depth* value greater than zero; this sets the number of frames whose information will be captured. To disable, @@ -1716,9 +1798,17 @@ always available. .. availability:: Windows. + .. note:: + Changing the filesystem encoding after Python startup is risky because + the old fsencoding or paths encoded by the old fsencoding may be cached + somewhere. Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead. + .. versionadded:: 3.6 See :pep:`529` for more details. + .. deprecated-removed:: 3.13 3.16 + Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead. + .. data:: stdin stdout stderr @@ -1779,7 +1869,7 @@ always available. However, if you are writing a library (and do not control in which context its code will be executed), be aware that the standard streams may be replaced with file-like objects like :class:`io.StringIO` which - do not support the :attr:!buffer` attribute. + do not support the :attr:`!buffer` attribute. .. data:: __stdin__ diff --git a/Doc/library/sys_path_init.rst b/Doc/library/sys_path_init.rst index 72c13873..a87a41cf 100644 --- a/Doc/library/sys_path_init.rst +++ b/Doc/library/sys_path_init.rst @@ -99,8 +99,7 @@ Embedded Python If Python is embedded within another application :c:func:`Py_InitializeFromConfig` and the :c:type:`PyConfig` structure can be used to initialize Python. The path specific -details are described at :ref:`init-path-config`. Alternatively the older :c:func:`Py_SetPath` -can be used to bypass the initialization of the module search path. +details are described at :ref:`init-path-config`. .. seealso:: diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index e5ed45b8..3921908b 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -1,5 +1,5 @@ -:mod:`sysconfig` --- Provide access to Python's configuration information -========================================================================= +:mod:`!sysconfig` --- Provide access to Python's configuration information +========================================================================== .. module:: sysconfig :synopsis: Python's configuration information @@ -9,7 +9,7 @@ .. versionadded:: 3.2 -**Source code:** :source:`Lib/sysconfig.py` +**Source code:** :source:`Lib/sysconfig` .. index:: single: configuration information @@ -305,7 +305,7 @@ Installation path functions mix with those by the other. End users should not use this function, but :func:`get_default_scheme` and - :func:`get_preferred_scheme()` instead. + :func:`get_preferred_scheme` instead. .. versionadded:: 3.10 @@ -376,7 +376,7 @@ Other functions This is used mainly to distinguish platform-specific build directories and platform-specific built distributions. Typically includes the OS name and - version and the architecture (as supplied by 'os.uname()'), although the + version and the architecture (as supplied by :func:`os.uname`), although the exact information included depends on the OS; e.g., on Linux, the kernel version isn't particularly important. @@ -427,6 +427,7 @@ Other functions Return the path of :file:`Makefile`. +.. _sysconfig-cli: Using :mod:`sysconfig` as a script ---------------------------------- diff --git a/Doc/library/syslog.rst b/Doc/library/syslog.rst index f29ef032..548898a3 100644 --- a/Doc/library/syslog.rst +++ b/Doc/library/syslog.rst @@ -1,5 +1,5 @@ -:mod:`syslog` --- Unix syslog library routines -============================================== +:mod:`!syslog` --- Unix syslog library routines +=============================================== .. module:: syslog :platform: Unix @@ -11,11 +11,11 @@ This module provides an interface to the Unix ``syslog`` library routines. Refer to the Unix manual pages for a detailed description of the ``syslog`` facility. +.. availability:: Unix, not WASI, not iOS. + This module wraps the system ``syslog`` family of routines. A pure Python library that can speak to a syslog server is available in the -:mod:`logging.handlers` module as :class:`SysLogHandler`. - -.. include:: ../includes/wasm-notavail.rst +:mod:`logging.handlers` module as :class:`~logging.handlers.SysLogHandler`. The module defines the following functions: @@ -107,22 +107,62 @@ The module defines the following functions: The module defines the following constants: -Priority levels (high to low): - :const:`LOG_EMERG`, :const:`LOG_ALERT`, :const:`LOG_CRIT`, :const:`LOG_ERR`, - :const:`LOG_WARNING`, :const:`LOG_NOTICE`, :const:`LOG_INFO`, - :const:`LOG_DEBUG`. - -Facilities: - :const:`LOG_KERN`, :const:`LOG_USER`, :const:`LOG_MAIL`, :const:`LOG_DAEMON`, - :const:`LOG_AUTH`, :const:`LOG_LPR`, :const:`LOG_NEWS`, :const:`LOG_UUCP`, - :const:`LOG_CRON`, :const:`LOG_SYSLOG`, :const:`LOG_LOCAL0` to - :const:`LOG_LOCAL7`, and, if defined in ````, - :const:`LOG_AUTHPRIV`. - -Log options: - :const:`LOG_PID`, :const:`LOG_CONS`, :const:`LOG_NDELAY`, and, if defined - in ````, :const:`LOG_ODELAY`, :const:`LOG_NOWAIT`, and - :const:`LOG_PERROR`. + +.. data:: LOG_EMERG + LOG_ALERT + LOG_CRIT + LOG_ERR + LOG_WARNING + LOG_NOTICE + LOG_INFO + LOG_DEBUG + + Priority levels (high to low). + + +.. data:: LOG_AUTH + LOG_AUTHPRIV + LOG_CRON + LOG_DAEMON + LOG_FTP + LOG_INSTALL + LOG_KERN + LOG_LAUNCHD + LOG_LPR + LOG_MAIL + LOG_NETINFO + LOG_NEWS + LOG_RAS + LOG_REMOTEAUTH + LOG_SYSLOG + LOG_USER + LOG_UUCP + LOG_LOCAL0 + LOG_LOCAL1 + LOG_LOCAL2 + LOG_LOCAL3 + LOG_LOCAL4 + LOG_LOCAL5 + LOG_LOCAL6 + LOG_LOCAL7 + + Facilities, depending on availability in ```` for :const:`LOG_AUTHPRIV`, + :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`, + :const:`LOG_INSTALL` and :const:`LOG_RAS`. + + .. versionchanged:: 3.13 + Added :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`, + :const:`LOG_INSTALL`, :const:`LOG_RAS`, and :const:`LOG_LAUNCHD`. + +.. data:: LOG_PID + LOG_CONS + LOG_NDELAY + LOG_ODELAY + LOG_NOWAIT + LOG_PERROR + + Log options, depending on availability in ```` for + :const:`LOG_ODELAY`, :const:`LOG_NOWAIT` and :const:`LOG_PERROR`. Examples diff --git a/Doc/library/tabnanny.rst b/Doc/library/tabnanny.rst index dfe688a2..4f61b3dd 100644 --- a/Doc/library/tabnanny.rst +++ b/Doc/library/tabnanny.rst @@ -1,5 +1,5 @@ -:mod:`tabnanny` --- Detection of ambiguous indentation -====================================================== +:mod:`!tabnanny` --- Detection of ambiguous indentation +======================================================= .. module:: tabnanny :synopsis: Tool for detecting white space related problems in Python diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index 574ea337..08a2951b 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -1,5 +1,5 @@ -:mod:`tarfile` --- Read and write tar archive files -=================================================== +:mod:`!tarfile` --- Read and write tar archive files +==================================================== .. module:: tarfile :synopsis: Read and write tar-format archive files. @@ -116,10 +116,12 @@ Some facts and figures: ``'filemode|[compression]'``. :func:`tarfile.open` will return a :class:`TarFile` object that processes its data as a stream of blocks. No random seeking will be done on the file. If given, *fileobj* may be any object that has a - :meth:`read` or :meth:`write` method (depending on the *mode*). *bufsize* - specifies the blocksize and defaults to ``20 * 512`` bytes. Use this variant - in combination with e.g. ``sys.stdin``, a socket :term:`file object` or a tape - device. However, such a :class:`TarFile` object is limited in that it does + :meth:`~io.RawIOBase.read` or :meth:`~io.RawIOBase.write` method + (depending on the *mode*) that works with bytes. + *bufsize* specifies the blocksize and defaults to ``20 * 512`` bytes. + Use this variant in combination with e.g. ``sys.stdin.buffer``, a socket + :term:`file object` or a tape device. + However, such a :class:`TarFile` object is limited in that it does not allow random access, see :ref:`tar-examples`. The currently possible modes: @@ -255,6 +257,51 @@ The following constants are available at the module level: The default character encoding: ``'utf-8'`` on Windows, the value returned by :func:`sys.getfilesystemencoding` otherwise. +.. data:: REGTYPE + AREGTYPE + + A regular file :attr:`~TarInfo.type`. + +.. data:: LNKTYPE + + A link (inside tarfile) :attr:`~TarInfo.type`. + +.. data:: SYMTYPE + + A symbolic link :attr:`~TarInfo.type`. + +.. data:: CHRTYPE + + A character special device :attr:`~TarInfo.type`. + +.. data:: BLKTYPE + + A block special device :attr:`~TarInfo.type`. + +.. data:: DIRTYPE + + A directory :attr:`~TarInfo.type`. + +.. data:: FIFOTYPE + + A FIFO special device :attr:`~TarInfo.type`. + +.. data:: CONTTYPE + + A contiguous file :attr:`~TarInfo.type`. + +.. data:: GNUTYPE_LONGNAME + + A GNU tar longname :attr:`~TarInfo.type`. + +.. data:: GNUTYPE_LONGLINK + + A GNU tar longlink :attr:`~TarInfo.type`. + +.. data:: GNUTYPE_SPARSE + + A GNU tar sparse file :attr:`~TarInfo.type`. + Each of the following constants defines a tar archive format that the :mod:`tarfile` module is able to create. See section :ref:`tar-formats` for @@ -318,14 +365,14 @@ be finalized; only the internally used file object will be closed. See the .. versionadded:: 3.2 Added support for the context management protocol. -.. class:: TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=1) +.. class:: TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=1, stream=False) All following arguments are optional and can be accessed as instance attributes as well. *name* is the pathname of the archive. *name* may be a :term:`path-like object`. It can be omitted if *fileobj* is given. - In this case, the file object's :attr:`name` attribute is used if it exists. + In this case, the file object's :attr:`!name` attribute is used if it exists. *mode* is either ``'r'`` to read from an existing archive, ``'a'`` to append data to an existing file, ``'w'`` to create a new file overwriting an existing @@ -359,7 +406,7 @@ be finalized; only the internally used file object will be closed. See the messages). The messages are written to ``sys.stderr``. *errorlevel* controls how extraction errors are handled, - see :attr:`the corresponding attribute <~TarFile.errorlevel>`. + see :attr:`the corresponding attribute `. The *encoding* and *errors* arguments define the character encoding to be used for reading or writing the archive and how conversion errors are going @@ -369,6 +416,9 @@ be finalized; only the internally used file object will be closed. See the The *pax_headers* argument is an optional dictionary of strings which will be added as a pax global header if *format* is :const:`PAX_FORMAT`. + If *stream* is set to :const:`True` then while reading the archive info about files + in the archive are not cached, saving memory. + .. versionchanged:: 3.2 Use ``'surrogateescape'`` as the default for the *errors* argument. @@ -378,6 +428,8 @@ be finalized; only the internally used file object will be closed. See the .. versionchanged:: 3.6 The *name* parameter accepts a :term:`path-like object`. + .. versionchanged:: 3.13 + Add the *stream* parameter. .. classmethod:: TarFile.open(...) @@ -513,6 +565,10 @@ be finalized; only the internally used file object will be closed. See the .. versionchanged:: 3.3 Return an :class:`io.BufferedReader` object. + .. versionchanged:: 3.13 + The returned :class:`io.BufferedReader` object has the :attr:`!mode` + attribute which is always equal to ``'rb'``. + .. attribute:: TarFile.errorlevel :type: int @@ -561,7 +617,7 @@ be finalized; only the internally used file object will be closed. See the it is best practice to only do so in top-level applications or :mod:`site configuration `. To set a global default this way, a filter function needs to be wrapped in - :func:`staticmethod()` to prevent injection of a ``self`` argument. + :func:`staticmethod` to prevent injection of a ``self`` argument. .. method:: TarFile.add(name, arcname=None, recursive=True, *, filter=None) @@ -585,11 +641,15 @@ be finalized; only the internally used file object will be closed. See the .. method:: TarFile.addfile(tarinfo, fileobj=None) - Add the :class:`TarInfo` object *tarinfo* to the archive. If *fileobj* is given, - it should be a :term:`binary file`, and - ``tarinfo.size`` bytes are read from it and added to the archive. You can + Add the :class:`TarInfo` object *tarinfo* to the archive. If *tarinfo* represents + a non zero-size regular file, the *fileobj* argument should be a :term:`binary file`, + and ``tarinfo.size`` bytes are read from it and added to the archive. You can create :class:`TarInfo` objects directly, or by using :meth:`gettarinfo`. + .. versionchanged:: 3.13 + + *fileobj* must be given for non-zero-sized regular files. + .. method:: TarFile.gettarinfo(name=None, arcname=None, fileobj=None) @@ -621,6 +681,7 @@ be finalized; only the internally used file object will be closed. See the .. attribute:: TarFile.pax_headers + :type: dict A dictionary containing key-value pairs of pax global headers. @@ -640,8 +701,8 @@ It does *not* contain the file's data itself. :meth:`~TarFile.getmember`, :meth:`~TarFile.getmembers` and :meth:`~TarFile.gettarinfo`. -Modifying the objects returned by :meth:`~!TarFile.getmember` or -:meth:`~!TarFile.getmembers` will affect all subsequent +Modifying the objects returned by :meth:`~TarFile.getmember` or +:meth:`~TarFile.getmembers` will affect all subsequent operations on the archive. For cases where this is unwanted, you can use :mod:`copy.copy() ` or call the :meth:`~TarInfo.replace` method to create a modified copy in one step. @@ -785,13 +846,48 @@ A ``TarInfo`` object has the following public data attributes: :meth:`~TarFile.extractall`, causing extraction to skip applying this attribute. +.. attribute:: TarInfo.chksum + :type: int + + Header checksum. + + +.. attribute:: TarInfo.devmajor + :type: int + + Device major number. + + +.. attribute:: TarInfo.devminor + :type: int + + Device minor number. + + +.. attribute:: TarInfo.offset + :type: int + + The tar header starts here. + + +.. attribute:: TarInfo.offset_data + :type: int + + The file's data starts here. + + +.. attribute:: TarInfo.sparse + + Sparse member information. + + .. attribute:: TarInfo.pax_headers :type: dict A dictionary containing key-value pairs of an associated pax extended header. -.. method:: TarInfo.replace(name=..., mtime=..., mode=..., linkname=..., - uid=..., gid=..., uname=..., gname=..., +.. method:: TarInfo.replace(name=..., mtime=..., mode=..., linkname=..., \ + uid=..., gid=..., uname=..., gname=..., \ deep=True) .. versionadded:: 3.12 @@ -811,7 +907,7 @@ A :class:`TarInfo` object also provides some convenient query methods: .. method:: TarInfo.isfile() - Return :const:`True` if the :class:`Tarinfo` object is a regular file. + Return :const:`True` if the :class:`TarInfo` object is a regular file. .. method:: TarInfo.isreg() @@ -947,7 +1043,7 @@ reused in custom filters: path (after following symlinks) would end up outside the destination. This raises :class:`~tarfile.OutsideDestinationError`. - Clear high mode bits (setuid, setgid, sticky) and group/other write bits - (:const:`~stat.S_IWGRP`|:const:`~stat.S_IWOTH`). + (:const:`~stat.S_IWGRP` | :const:`~stat.S_IWOTH`). Return the modified ``TarInfo`` member. @@ -972,9 +1068,9 @@ reused in custom filters: - For regular files, including hard links: - Set the owner read and write permissions - (:const:`~stat.S_IRUSR`|:const:`~stat.S_IWUSR`). + (:const:`~stat.S_IRUSR` | :const:`~stat.S_IWUSR`). - Remove the group & other executable permission - (:const:`~stat.S_IXGRP`|:const:`~stat.S_IXOTH`) + (:const:`~stat.S_IXGRP` | :const:`~stat.S_IXOTH`) if the owner doesn’t have it (:const:`~stat.S_IXUSR`). - For other files (directories), set ``mode`` to ``None``, so @@ -1151,31 +1247,31 @@ For a list of the files in a tar archive, use the :option:`-l` option: Command-line options ~~~~~~~~~~~~~~~~~~~~ -.. cmdoption:: -l - --list +.. option:: -l + --list List files in a tarfile. -.. cmdoption:: -c ... - --create ... +.. option:: -c ... + --create ... Create tarfile from source files. -.. cmdoption:: -e [] - --extract [] +.. option:: -e [] + --extract [] Extract tarfile into the current directory if *output_dir* is not specified. -.. cmdoption:: -t - --test +.. option:: -t + --test Test whether the tarfile is valid or not. -.. cmdoption:: -v, --verbose +.. option:: -v, --verbose Verbose output. -.. cmdoption:: --filter +.. option:: --filter Specifies the *filter* for ``--extract``. See :ref:`tarfile-extraction-filter` for details. diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 5a993dc4..6971ad33 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -1,262 +1,19 @@ -:mod:`telnetlib` --- Telnet client -================================== +:mod:`!telnetlib` --- Telnet client +=================================== .. module:: telnetlib - :synopsis: Telnet client class. + :synopsis: Removed in 3.13. :deprecated: -.. sectionauthor:: Skip Montanaro - -**Source code:** :source:`Lib/telnetlib.py` - -.. index:: single: protocol; Telnet - .. deprecated-removed:: 3.11 3.13 - The :mod:`telnetlib` module is deprecated - (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). - --------------- - -The :mod:`telnetlib` module provides a :class:`Telnet` class that implements the -Telnet protocol. See :rfc:`854` for details about the protocol. In addition, it -provides symbolic constants for the protocol characters (see below), and for the -telnet options. The symbolic names of the telnet options follow the definitions -in ``arpa/telnet.h``, with the leading ``TELOPT_`` removed. For symbolic names -of options which are traditionally not included in ``arpa/telnet.h``, see the -module source itself. - -The symbolic constants for the telnet commands are: IAC, DONT, DO, WONT, WILL, -SE (Subnegotiation End), NOP (No Operation), DM (Data Mark), BRK (Break), IP -(Interrupt process), AO (Abort output), AYT (Are You There), EC (Erase -Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation Begin). - -.. include:: ../includes/wasm-notavail.rst - -.. class:: Telnet(host=None, port=0[, timeout]) - - :class:`Telnet` represents a connection to a Telnet server. The instance is - initially not connected by default; the :meth:`~Telnet.open` method must be used to - establish a connection. Alternatively, the host name and optional port - number can be passed to the constructor too, in which case the connection to - the server will be established before the constructor returns. The optional - *timeout* parameter specifies a timeout in seconds for blocking operations - like the connection attempt (if not specified, the global default timeout - setting will be used). - - Do not reopen an already connected instance. - - This class has many :meth:`read_\*` methods. Note that some of them raise - :exc:`EOFError` when the end of the connection is read, because they can return - an empty string for other reasons. See the individual descriptions below. - - A :class:`Telnet` object is a context manager and can be used in a - :keyword:`with` statement. When the :keyword:`!with` block ends, the - :meth:`close` method is called:: - - >>> from telnetlib import Telnet - >>> with Telnet('localhost', 23) as tn: - ... tn.interact() - ... - - .. versionchanged:: 3.6 Context manager support added - - -.. seealso:: - - :rfc:`854` - Telnet Protocol Specification - Definition of the Telnet protocol. - - -.. _telnet-objects: - -Telnet Objects --------------- - -:class:`Telnet` instances have the following methods: - - -.. method:: Telnet.read_until(expected, timeout=None) - - Read until a given byte string, *expected*, is encountered or until *timeout* - seconds have passed. - - When no match is found, return whatever is available instead, possibly empty - bytes. Raise :exc:`EOFError` if the connection is closed and no cooked data - is available. - - -.. method:: Telnet.read_all() - - Read all data until EOF as bytes; block until connection closed. - - -.. method:: Telnet.read_some() - - Read at least one byte of cooked data unless EOF is hit. Return ``b''`` if - EOF is hit. Block if no data is immediately available. - - -.. method:: Telnet.read_very_eager() - - Read everything that can be without blocking in I/O (eager). - - Raise :exc:`EOFError` if connection closed and no cooked data available. - Return ``b''`` if no cooked data available otherwise. Do not block unless in - the midst of an IAC sequence. - - -.. method:: Telnet.read_eager() - - Read readily available data. - - Raise :exc:`EOFError` if connection closed and no cooked data available. - Return ``b''`` if no cooked data available otherwise. Do not block unless in - the midst of an IAC sequence. - - -.. method:: Telnet.read_lazy() - - Process and return data already in the queues (lazy). - - Raise :exc:`EOFError` if connection closed and no data available. Return - ``b''`` if no cooked data available otherwise. Do not block unless in the - midst of an IAC sequence. - - -.. method:: Telnet.read_very_lazy() - - Return any data available in the cooked queue (very lazy). - - Raise :exc:`EOFError` if connection closed and no data available. Return - ``b''`` if no cooked data available otherwise. This method never blocks. - - -.. method:: Telnet.read_sb_data() - - Return the data collected between a SB/SE pair (suboption begin/end). The - callback should access these data when it was invoked with a ``SE`` command. - This method never blocks. - - -.. method:: Telnet.open(host, port=0[, timeout]) - - Connect to a host. The optional second argument is the port number, which - defaults to the standard Telnet port (23). The optional *timeout* parameter - specifies a timeout in seconds for blocking operations like the connection - attempt (if not specified, the global default timeout setting will be used). - - Do not try to reopen an already connected instance. - - .. audit-event:: telnetlib.Telnet.open self,host,port telnetlib.Telnet.open - - -.. method:: Telnet.msg(msg, *args) - - Print a debug message when the debug level is ``>`` 0. If extra arguments are - present, they are substituted in the message using the standard string - formatting operator. - - -.. method:: Telnet.set_debuglevel(debuglevel) - - Set the debug level. The higher the value of *debuglevel*, the more debug - output you get (on ``sys.stdout``). - - -.. method:: Telnet.close() - - Close the connection. - - -.. method:: Telnet.get_socket() - - Return the socket object used internally. - - -.. method:: Telnet.fileno() - - Return the file descriptor of the socket object used internally. - - -.. method:: Telnet.write(buffer) - - Write a byte string to the socket, doubling any IAC characters. This can - block if the connection is blocked. May raise :exc:`OSError` if the - connection is closed. - - .. audit-event:: telnetlib.Telnet.write self,buffer telnetlib.Telnet.write - - .. versionchanged:: 3.3 - This method used to raise :exc:`socket.error`, which is now an alias - of :exc:`OSError`. - - -.. method:: Telnet.interact() - - Interaction function, emulates a very dumb Telnet client. - - -.. method:: Telnet.mt_interact() - - Multithreaded version of :meth:`interact`. - - -.. method:: Telnet.expect(list, timeout=None) - - Read until one from a list of a regular expressions matches. - - The first argument is a list of regular expressions, either compiled - (:ref:`regex objects `) or uncompiled (byte strings). The - optional second argument is a timeout, in seconds; the default is to block - indefinitely. - - Return a tuple of three items: the index in the list of the first regular - expression that matches; the match object returned; and the bytes read up - till and including the match. - - If end of file is found and no bytes were read, raise :exc:`EOFError`. - Otherwise, when nothing matches, return ``(-1, None, data)`` where *data* is - the bytes received so far (may be empty bytes if a timeout happened). - - If a regular expression ends with a greedy match (such as ``.*``) or if more - than one expression can match the same input, the results are - non-deterministic, and may depend on the I/O timing. - - -.. method:: Telnet.set_option_negotiation_callback(callback) - - Each time a telnet option is read on the input flow, this *callback* (if set) is - called with the following parameters: callback(telnet socket, command - (DO/DONT/WILL/WONT), option). No other action is done afterwards by telnetlib. - - -.. _telnet-example: - -Telnet Example --------------- - -.. sectionauthor:: Peter Funk - - -A simple example illustrating typical use:: - - import getpass - import telnetlib - - HOST = "localhost" - user = input("Enter your remote account: ") - password = getpass.getpass() - - tn = telnetlib.Telnet(HOST) - - tn.read_until(b"login: ") - tn.write(user.encode('ascii') + b"\n") - if password: - tn.read_until(b"Password: ") - tn.write(password.encode('ascii') + b"\n") - tn.write(b"ls\n") - tn.write(b"exit\n") +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - print(tn.read_all().decode('ascii')) +Possible replacements are third-party libraries from PyPI: :pypi:`telnetlib3` +or :pypi:`Exscript`. These are not supported or maintained by the Python core +team. +The last version of Python that provided the :mod:`!telnetlib` module was +`Python 3.12 `_. diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 097f7087..f0a81a09 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -1,5 +1,5 @@ -:mod:`tempfile` --- Generate temporary files and directories -============================================================ +:mod:`!tempfile` --- Generate temporary files and directories +============================================================= .. module:: tempfile :synopsis: Generate temporary files and directories. @@ -18,7 +18,7 @@ This module creates temporary files and directories. It works on all supported platforms. :class:`TemporaryFile`, :class:`NamedTemporaryFile`, :class:`TemporaryDirectory`, and :class:`SpooledTemporaryFile` are high-level interfaces which provide automatic cleanup and can be used as -context managers. :func:`mkstemp` and +:term:`context managers `. :func:`mkstemp` and :func:`mkdtemp` are lower-level functions which require manual cleanup. All the user-callable functions and constructors take additional arguments which @@ -41,7 +41,7 @@ The module defines the following user-callable items: this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system. - The resulting object can be used as a context manager (see + The resulting object can be used as a :term:`context manager` (see :ref:`tempfile-examples`). On completion of the context or destruction of the file object the temporary file will be removed from the filesystem. @@ -87,9 +87,9 @@ The module defines the following user-callable items: determine whether and how the named file should be automatically deleted. The returned object is always a :term:`file-like object` whose :attr:`!file` - attribute is the underlying true file object. This :term:`file-like object` + attribute is the underlying true file object. This file-like object can be used in a :keyword:`with` statement, just like a normal file. The - name of the temporary file can be retrieved from the :attr:`name` attribute + name of the temporary file can be retrieved from the :attr:`!name` attribute of the returned file-like object. On Unix, unlike with the :func:`TemporaryFile`, the directory entry does not get unlinked immediately after the file creation. @@ -115,14 +115,14 @@ The module defines the following user-callable items: * On Windows, make sure that at least one of the following conditions are fulfilled: - * *delete* is false - * additional open shares delete access (e.g. by calling :func:`os.open` - with the flag ``O_TEMPORARY``) - * *delete* is true but *delete_on_close* is false. Note, that in this - case the additional opens that do not share delete access (e.g. - created via builtin :func:`open`) must be closed before exiting the - context manager, else the :func:`os.unlink` call on context manager - exit will fail with a :exc:`PermissionError`. + * *delete* is false + * additional open shares delete access (e.g. by calling :func:`os.open` + with the flag ``O_TEMPORARY``) + * *delete* is true but *delete_on_close* is false. Note, that in this + case the additional opens that do not share delete access (e.g. + created via builtin :func:`open`) must be closed before exiting the + context manager, else the :func:`os.unlink` call on context manager + exit will fail with a :exc:`PermissionError`. On Windows, if *delete_on_close* is false, and the file is created in a directory for which the user lacks delete access, then the :func:`os.unlink` @@ -147,22 +147,24 @@ The module defines the following user-callable items: This class operates exactly as :func:`TemporaryFile` does, except that data is spooled in memory until the file size exceeds *max_size*, or - until the file's :func:`fileno` method is called, at which point the + until the file's :func:`~io.IOBase.fileno` method is called, at which point the contents are written to disk and operation proceeds as with :func:`TemporaryFile`. - The resulting file has one additional method, :func:`rollover`, which - causes the file to roll over to an on-disk file regardless of its size. + .. method:: SpooledTemporaryFile.rollover - The returned object is a file-like object whose :attr:`_file` attribute + The resulting file has one additional method, :meth:`!rollover`, which + causes the file to roll over to an on-disk file regardless of its size. + + The returned object is a file-like object whose :attr:`!_file` attribute is either an :class:`io.BytesIO` or :class:`io.TextIOWrapper` object (depending on whether binary or text *mode* was specified) or a true file - object, depending on whether :func:`rollover` has been called. This + object, depending on whether :meth:`rollover` has been called. This file-like object can be used in a :keyword:`with` statement, just like a normal file. .. versionchanged:: 3.3 - the truncate method now accepts a ``size`` argument. + the truncate method now accepts a *size* argument. .. versionchanged:: 3.8 Added *errors* parameter. @@ -176,24 +178,28 @@ The module defines the following user-callable items: .. class:: TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True) This class securely creates a temporary directory using the same rules as :func:`mkdtemp`. - The resulting object can be used as a context manager (see + The resulting object can be used as a :term:`context manager` (see :ref:`tempfile-examples`). On completion of the context or destruction of the temporary directory object, the newly created temporary directory and all its contents are removed from the filesystem. - The directory name can be retrieved from the :attr:`name` attribute of the - returned object. When the returned object is used as a context manager, the - :attr:`name` will be assigned to the target of the :keyword:`!as` clause in - the :keyword:`with` statement, if there is one. + .. attribute:: TemporaryDirectory.name + + The directory name can be retrieved from the :attr:`!name` attribute of the + returned object. When the returned object is used as a :term:`context manager`, the + :attr:`!name` will be assigned to the target of the :keyword:`!as` clause in + the :keyword:`with` statement, if there is one. - The directory can be explicitly cleaned up by calling the - :func:`cleanup` method. If *ignore_cleanup_errors* is true, any unhandled - exceptions during explicit or implicit cleanup (such as a - :exc:`PermissionError` removing open files on Windows) will be ignored, - and the remaining removable items deleted on a "best-effort" basis. - Otherwise, errors will be raised in whatever context cleanup occurs - (the :func:`cleanup` call, exiting the context manager, when the object - is garbage-collected or during interpreter shutdown). + .. method:: TemporaryDirectory.cleanup + + The directory can be explicitly cleaned up by calling the + :meth:`!cleanup` method. If *ignore_cleanup_errors* is true, any unhandled + exceptions during explicit or implicit cleanup (such as a + :exc:`PermissionError` removing open files on Windows) will be ignored, + and the remaining removable items deleted on a "best-effort" basis. + Otherwise, errors will be raised in whatever context cleanup occurs + (the :meth:`!cleanup` call, exiting the context manager, when the object + is garbage-collected or during interpreter shutdown). The *delete* parameter can be used to disable cleanup of the directory tree upon exiting the context. While it may seem unusual for a context manager @@ -404,13 +410,13 @@ Here are some examples of typical usage of the :mod:`tempfile` module:: # create a temporary file using a context manager # close the file, use the name to open the file again - >>> with tempfile.TemporaryFile(delete_on_close=False) as fp: - ... fp.write(b'Hello world!') - ... fp.close() - # the file is closed, but not removed - # open the file again by using its name - ... with open(fp.name) as f - ... f.read() + >>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp: + ... fp.write(b'Hello world!') + ... fp.close() + ... # the file is closed, but not removed + ... # open the file again by using its name + ... with open(fp.name, mode='rb') as f: + ... f.read() b'Hello world!' >>> # file is now removed diff --git a/Doc/library/termios.rst b/Doc/library/termios.rst index fb1ff567..0c6f3059 100644 --- a/Doc/library/termios.rst +++ b/Doc/library/termios.rst @@ -1,5 +1,5 @@ -:mod:`termios` --- POSIX style tty control -========================================== +:mod:`!termios` --- POSIX style tty control +=========================================== .. module:: termios :platform: Unix @@ -16,6 +16,8 @@ complete description of these calls, see :manpage:`termios(3)` Unix manual page. It is only available for those Unix versions that support POSIX *termios* style tty I/O control configured during installation. +.. availability:: Unix. + All functions in this module take a file descriptor *fd* as their first argument. This can be an integer file descriptor, such as returned by ``sys.stdin.fileno()``, or a :term:`file object`, such as ``sys.stdin`` itself. @@ -43,10 +45,20 @@ The module defines the following functions: Set the tty attributes for file descriptor *fd* from the *attributes*, which is a list like the one returned by :func:`tcgetattr`. The *when* argument - determines when the attributes are changed: :const:`TCSANOW` to change - immediately, :const:`TCSADRAIN` to change after transmitting all queued output, - or :const:`TCSAFLUSH` to change after transmitting all queued output and - discarding all queued input. + determines when the attributes are changed: + + .. data:: TCSANOW + + Change attributes immediately. + + .. data:: TCSADRAIN + + Change attributes after transmitting all queued output. + + .. data:: TCSAFLUSH + + Change attributes after transmitting all queued output and + discarding all queued input. .. function:: tcsendbreak(fd, duration) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index de60151b..04d28aee 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1,5 +1,5 @@ -:mod:`test` --- Regression tests package for Python -=================================================== +:mod:`!test` --- Regression tests package for Python +==================================================== .. module:: test :synopsis: Regression tests package containing the testing suite for Python. @@ -143,7 +143,7 @@ guidelines to be followed: arg = (1, 2, 3) When using this pattern, remember that all classes that inherit from - :class:`unittest.TestCase` are run as tests. The :class:`Mixin` class in the example above + :class:`unittest.TestCase` are run as tests. The :class:`!TestFuncAcceptsSequencesMixin` class in the example above does not have any data and so can't be run by itself, thus it does not inherit from :class:`unittest.TestCase`. @@ -159,6 +159,9 @@ guidelines to be followed: Running tests using the command-line interface ---------------------------------------------- +.. module:: test.regrtest + :synopsis: Drives the regression test suite. + The :mod:`test` package can be run as a script to drive Python's regression test suite, thanks to the :option:`-m` option: :program:`python -m test`. Under the hood, it uses :mod:`test.regrtest`; the call :program:`python -m @@ -321,9 +324,9 @@ The :mod:`test.support` module defines the following constants: .. data:: Py_DEBUG - True if Python is built with the :c:macro:`Py_DEBUG` macro defined: if - Python is :ref:`built in debug mode ` - (:option:`./configure --with-pydebug <--with-pydebug>`). + ``True`` if Python was built with the :c:macro:`Py_DEBUG` macro + defined, that is, if + Python was :ref:`built in debug mode `. .. versionadded:: 3.12 @@ -498,44 +501,6 @@ The :mod:`test.support` module defines the following functions: rather than looking directly in the path directories. -.. function:: match_test(test) - - Determine whether *test* matches the patterns set in :func:`set_match_tests`. - - -.. function:: set_match_tests(accept_patterns=None, ignore_patterns=None) - - Define match patterns on test filenames and test method names for filtering tests. - - -.. function:: run_unittest(*classes) - - Execute :class:`unittest.TestCase` subclasses passed to the function. The - function scans the classes for methods starting with the prefix ``test_`` - and executes the tests individually. - - It is also legal to pass strings as parameters; these should be keys in - ``sys.modules``. Each associated module will be scanned by - ``unittest.TestLoader.loadTestsFromModule()``. This is usually seen in the - following :func:`test_main` function:: - - def test_main(): - support.run_unittest(__name__) - - This will run all tests defined in the named module. - - -.. function:: run_doctest(module, verbosity=None, optionflags=0) - - Run :func:`doctest.testmod` on the given *module*. Return - ``(failure_count, test_count)``. - - If *verbosity* is ``None``, :func:`doctest.testmod` is run with verbosity - set to :data:`verbose`. Otherwise, it is run with verbosity set to - ``None``. *optionflags* is passed as ``optionflags`` to - :func:`doctest.testmod`. - - .. function:: get_pagesize() Get size of a page in bytes. @@ -766,6 +731,12 @@ The :mod:`test.support` module defines the following functions: macOS version is less than the minimum, the test is skipped. +.. decorator:: requires_gil_enabled + + Decorator for skipping tests on the free-threaded build. If the + :term:`GIL` is disabled, the test is skipped. + + .. decorator:: requires_IEEE_754 Decorator for skipping tests on non-IEEE 754 platforms. @@ -975,7 +946,7 @@ The :mod:`test.support` module defines the following functions: other modules, possibly a C backend (like ``csv`` and its ``_csv``). The *extra* argument can be a set of names that wouldn't otherwise be automatically - detected as "public", like objects without a proper ``__module__`` + detected as "public", like objects without a proper :attr:`~definition.__module__` attribute. If provided, it will be added to the automatically detected ones. The *not_exported* argument can be a set of names that must not be treated @@ -1043,7 +1014,7 @@ The :mod:`test.support` module defines the following classes: :const:`resource.RLIMIT_CORE`'s soft limit to 0 to prevent coredump file creation. - On both platforms, the old value is restored by :meth:`__exit__`. + On both platforms, the old value is restored by :meth:`~object.__exit__`. .. class:: SaveSignals() @@ -1443,7 +1414,8 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. class:: FakePath(path) - Simple :term:`path-like object`. It implements the :meth:`__fspath__` + Simple :term:`path-like object`. It implements the + :meth:`~os.PathLike.__fspath__` method which just returns the *path* argument. If *path* is an exception, it will be raised in :meth:`!__fspath__`. @@ -1729,7 +1701,7 @@ The :mod:`test.support.warnings_helper` module provides support for warnings tes .. function:: check_warnings(*filters, quiet=True) - A convenience wrapper for :func:`warnings.catch_warnings()` that makes it + A convenience wrapper for :func:`warnings.catch_warnings` that makes it easier to test that a warning was correctly raised. It is approximately equivalent to calling ``warnings.catch_warnings(record=True)`` with :meth:`warnings.simplefilter` set to ``always`` and with the option to diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst index e2952ce3..a58b460f 100644 --- a/Doc/library/textwrap.rst +++ b/Doc/library/textwrap.rst @@ -1,5 +1,5 @@ -:mod:`textwrap` --- Text wrapping and filling -============================================= +:mod:`!textwrap` --- Text wrapping and filling +============================================== .. module:: textwrap :synopsis: Text wrapping and filling @@ -154,7 +154,7 @@ hyphenated words; only then will long words be broken if necessary, unless wrapper = TextWrapper() wrapper.initial_indent = "* " - You can re-use the same :class:`TextWrapper` object many times, and you can + You can reuse the same :class:`TextWrapper` object many times, and you can change any of its options through direct assignment to instance attributes between uses. @@ -238,7 +238,7 @@ hyphenated words; only then will long words be broken if necessary, unless However, the sentence detection algorithm is imperfect: it assumes that a sentence ending consists of a lowercase letter followed by one of ``'.'``, ``'!'``, or ``'?'``, possibly followed by one of ``'"'`` or ``"'"``, - followed by a space. One problem with this is algorithm is that it is + followed by a space. One problem with this algorithm is that it is unable to detect the difference between "Dr." in :: [...] Dr. Frankenstein's monster [...] diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 23d8cd15..cb82fea3 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -1,5 +1,5 @@ -:mod:`threading` --- Thread-based parallelism -============================================= +:mod:`!threading` --- Thread-based parallelism +============================================== .. module:: threading :synopsis: Thread-based parallelism. @@ -127,10 +127,13 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD, GNU/kFreeBSD. .. versionadded:: 3.8 + .. versionchanged:: 3.13 + Added support for GNU/kFreeBSD. + .. function:: enumerate() @@ -360,12 +363,12 @@ since it is impossible to detect the termination of alien threads. base class constructor (``Thread.__init__()``) before doing anything else to the thread. + .. versionchanged:: 3.3 + Added the *daemon* parameter. + .. versionchanged:: 3.10 Use the *target* name if *name* argument is omitted. - .. versionchanged:: 3.3 - Added the *daemon* argument. - .. method:: start() Start the thread's activity. @@ -409,7 +412,7 @@ since it is impossible to detect the termination of alien threads. timeout occurs. When the *timeout* argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). As :meth:`~Thread.join` always returns ``None``, you must call :meth:`~Thread.is_alive` after :meth:`~Thread.join` to decide whether a timeout happened -- if the thread is still alive, the @@ -531,9 +534,10 @@ All methods are executed atomically. lock, subsequent attempts to acquire it block, until it is released; any thread may release it. - Note that ``Lock`` is actually a factory function which returns an instance - of the most efficient version of the concrete Lock class that is supported - by the platform. + .. versionchanged:: 3.13 + ``Lock`` is now a class. In earlier Pythons, ``Lock`` was a factory + function which returned an instance of the underlying private lock + type. .. method:: acquire(blocking=True, timeout=-1) @@ -594,14 +598,25 @@ and "recursion level" in addition to the locked/unlocked state used by primitive locks. In the locked state, some thread owns the lock; in the unlocked state, no thread owns it. -To lock the lock, a thread calls its :meth:`~RLock.acquire` method; this -returns once the thread owns the lock. To unlock the lock, a thread calls -its :meth:`~Lock.release` method. :meth:`~Lock.acquire`/:meth:`~Lock.release` -call pairs may be nested; only the final :meth:`~Lock.release` (the -:meth:`~Lock.release` of the outermost pair) resets the lock to unlocked and -allows another thread blocked in :meth:`~Lock.acquire` to proceed. +Threads call a lock's :meth:`~RLock.acquire` method to lock it, +and its :meth:`~Lock.release` method to unlock it. -Reentrant locks also support the :ref:`context management protocol `. +.. note:: + + Reentrant locks support the :ref:`context management protocol `, + so it is recommended to use :keyword:`with` instead of manually calling + :meth:`~RLock.acquire` and :meth:`~RLock.release` + to handle acquiring and releasing the lock for a block of code. + +RLock's :meth:`~RLock.acquire`/:meth:`~RLock.release` call pairs may be nested, +unlike Lock's :meth:`~Lock.acquire`/:meth:`~Lock.release`. Only the final +:meth:`~RLock.release` (the :meth:`~Lock.release` of the outermost pair) resets +the lock to an unlocked state and allows another thread blocked in +:meth:`~RLock.acquire` to proceed. + +:meth:`~RLock.acquire`/:meth:`~RLock.release` must be used in pairs: each acquire +must have a release in the thread that has acquired the lock. Failing to +call release as many times the lock has been acquired can lead to deadlock. .. class:: RLock() @@ -620,25 +635,41 @@ Reentrant locks also support the :ref:`context management protocol ` Acquire a lock, blocking or non-blocking. - When invoked without arguments: if this thread already owns the lock, increment - the recursion level by one, and return immediately. Otherwise, if another - thread owns the lock, block until the lock is unlocked. Once the lock is - unlocked (not owned by any thread), then grab ownership, set the recursion level - to one, and return. If more than one thread is blocked waiting until the lock - is unlocked, only one at a time will be able to grab ownership of the lock. - There is no return value in this case. + .. seealso:: - When invoked with the *blocking* argument set to ``True``, do the same thing as when - called without arguments, and return ``True``. + :ref:`Using RLock as a context manager ` + Recommended over manual :meth:`!acquire` and :meth:`release` calls + whenever practical. - When invoked with the *blocking* argument set to ``False``, do not block. If a call - without an argument would block, return ``False`` immediately; otherwise, do the - same thing as when called without arguments, and return ``True``. - When invoked with the floating-point *timeout* argument set to a positive - value, block for at most the number of seconds specified by *timeout* - and as long as the lock cannot be acquired. Return ``True`` if the lock has - been acquired, ``False`` if the timeout has elapsed. + When invoked with the *blocking* argument set to ``True`` (the default): + + * If no thread owns the lock, acquire the lock and return immediately. + + * If another thread owns the lock, block until we are able to acquire + lock, or *timeout*, if set to a positive float value. + + * If the same thread owns the lock, acquire the lock again, and + return immediately. This is the difference between :class:`Lock` and + :class:`!RLock`; :class:`Lock` handles this case the same as the previous, + blocking until the lock can be acquired. + + When invoked with the *blocking* argument set to ``False``: + + * If no thread owns the lock, acquire the lock and return immediately. + + * If another thread owns the lock, return immediately. + + * If the same thread owns the lock, acquire the lock again and return + immediately. + + In all cases, if the thread was able to acquire the lock, return ``True``. + If the thread was unable to acquire the lock (i.e. if not blocking or + the timeout was reached) return ``False``. + + If called multiple times, failing to call :meth:`~RLock.release` as many times + may lead to deadlock. Consider using :class:`!RLock` as a context manager rather than + calling acquire/release directly. .. versionchanged:: 3.2 The *timeout* parameter is new. @@ -654,7 +685,7 @@ Reentrant locks also support the :ref:`context management protocol ` Only call this method when the calling thread owns the lock. A :exc:`RuntimeError` is raised if this method is called when the lock is - unlocked. + not acquired. There is no return value. @@ -763,7 +794,7 @@ item to the buffer only needs to wake up one consumer thread. occurs. Once awakened or timed out, it re-acquires the lock and returns. When the *timeout* argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). When the underlying lock is an :class:`RLock`, it is not released using @@ -983,18 +1014,15 @@ method. The :meth:`~Event.wait` method blocks until the flag is true. .. method:: wait(timeout=None) - Block until the internal flag is true. If the internal flag is true on - entry, return immediately. Otherwise, block until another thread calls - :meth:`.set` to set the flag to true, or until the optional timeout occurs. + Block as long as the internal flag is false and the timeout, if given, + has not expired. The return value represents the + reason that this blocking method returned; ``True`` if returning because + the internal flag is set to true, or ``False`` if a timeout is given and + the internal flag did not become true within the given wait time. When the timeout argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds - (or fractions thereof). - - This method returns ``True`` if and only if the internal flag has been set to - true, either before the wait call or after the wait starts, so it will - always return ``True`` except if a timeout is given and the operation - times out. + floating-point number specifying a timeout for the operation in seconds, + or fractions thereof. .. versionchanged:: 3.1 Previously, the method always returned ``None``. diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 9f23a6fc..6265c221 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -1,5 +1,5 @@ -:mod:`time` --- Time access and conversions -=========================================== +:mod:`!time` --- Time access and conversions +============================================ .. module:: time :synopsis: Time access and conversions. @@ -69,10 +69,10 @@ An explanation of some terminology and conventions is in order. systems, the clock "ticks" only 50 or 100 times a second. * On the other hand, the precision of :func:`.time` and :func:`sleep` is better - than their Unix equivalents: times are expressed as floating point numbers, + than their Unix equivalents: times are expressed as floating-point numbers, :func:`.time` returns the most accurate time available (using Unix - :c:func:`gettimeofday` where available), and :func:`sleep` will accept a time - with a nonzero fraction (Unix :c:func:`select` is used to implement this, where + :c:func:`!gettimeofday` where available), and :func:`sleep` will accept a time + with a nonzero fraction (Unix :c:func:`!select` is used to implement this, where available). * The time value as returned by :func:`gmtime`, :func:`localtime`, and @@ -84,12 +84,14 @@ An explanation of some terminology and conventions is in order. See :class:`struct_time` for a description of these objects. .. versionchanged:: 3.3 - The :class:`struct_time` type was extended to provide the :attr:`tm_gmtoff` - and :attr:`tm_zone` attributes when platform supports corresponding + The :class:`struct_time` type was extended to provide + the :attr:`~struct_time.tm_gmtoff` and :attr:`~struct_time.tm_zone` + attributes when platform supports corresponding ``struct tm`` members. .. versionchanged:: 3.6 - The :class:`struct_time` attributes :attr:`tm_gmtoff` and :attr:`tm_zone` + The :class:`struct_time` attributes + :attr:`~struct_time.tm_gmtoff` and :attr:`~struct_time.tm_zone` are now available on all platforms. * Use the following functions to convert between time representations: @@ -191,7 +193,7 @@ Functions Use :func:`clock_settime_ns` to avoid the precision loss caused by the :class:`float` type. - .. availability:: Unix. + .. availability:: Unix, not Android, not iOS. .. versionadded:: 3.3 @@ -200,7 +202,7 @@ Functions Similar to :func:`clock_settime` but set time with nanoseconds. - .. availability:: Unix. + .. availability:: Unix, not Android, not iOS. .. versionadded:: 3.7 @@ -271,7 +273,7 @@ Functions This is the inverse function of :func:`localtime`. Its argument is the :class:`struct_time` or full 9-tuple (since the dst flag is needed; use ``-1`` as the dst flag if it is unknown) which expresses the time in *local* time, not - UTC. It returns a floating point number, for compatibility with :func:`.time`. + UTC. It returns a floating-point number, for compatibility with :func:`.time`. If the input value cannot be represented as a valid time, either :exc:`OverflowError` or :exc:`ValueError` will be raised (which depends on whether the invalid value is caught by Python or the underlying C libraries). @@ -285,6 +287,15 @@ Functions The reference point of the returned value is undefined, so that only the difference between the results of two calls is valid. + Clock: + + * On Windows, call ``QueryPerformanceCounter()`` and + ``QueryPerformanceFrequency()``. + * On macOS, call ``mach_absolute_time()`` and ``mach_timebase_info()``. + * On HP-UX, call ``gethrtime()``. + * Call ``clock_gettime(CLOCK_HIGHRES)`` if available. + * Otherwise, call ``clock_gettime(CLOCK_MONOTONIC)``. + Use :func:`monotonic_ns` to avoid the precision loss caused by the :class:`float` type. @@ -314,6 +325,11 @@ Functions point of the returned value is undefined, so that only the difference between the results of two calls is valid. + .. impl-detail:: + + On CPython, use the same clock as :func:`time.monotonic` and is a + monotonic clock, i.e. a clock that cannot go backwards. + Use :func:`perf_counter_ns` to avoid the precision loss caused by the :class:`float` type. @@ -322,6 +338,10 @@ Functions .. versionchanged:: 3.10 On Windows, the function is now system-wide. + .. versionchanged:: 3.13 + Use the same clock as :func:`time.monotonic`. + + .. function:: perf_counter_ns() -> int Similar to :func:`perf_counter`, but return time as nanoseconds. @@ -356,7 +376,7 @@ Functions .. function:: sleep(secs) Suspend execution of the calling thread for the given number of seconds. - The argument may be a floating point number to indicate a more precise sleep + The argument may be a floating-point number to indicate a more precise sleep time. If the sleep is interrupted by a signal and no exception is raised by the @@ -370,7 +390,7 @@ Functions threads ready to run, the function returns immediately, and the thread continues execution. On Windows 8.1 and newer the implementation uses a `high-resolution timer - `_ + `_ which provides resolution of 100 nanoseconds. If *secs* is zero, ``Sleep(0)`` is used. Unix implementation: @@ -379,15 +399,19 @@ Functions * Or use ``nanosleep()`` if available (resolution: 1 nanosecond); * Or use ``select()`` (resolution: 1 microsecond). - .. versionchanged:: 3.11 - On Unix, the ``clock_nanosleep()`` and ``nanosleep()`` functions are now - used if available. On Windows, a waitable timer is now used. + .. audit-event:: time.sleep secs .. versionchanged:: 3.5 The function now sleeps at least *secs* even if the sleep is interrupted by a signal, except if the signal handler raises an exception (see :pep:`475` for the rationale). + .. versionchanged:: 3.11 + On Unix, the ``clock_nanosleep()`` and ``nanosleep()`` functions are now + used if available. On Windows, a waitable timer is now used. + + .. versionchanged:: 3.13 + Raises an auditing event. .. index:: single: % (percent); datetime format @@ -426,6 +450,10 @@ Functions | ``%d`` | Day of the month as a decimal number [01,31]. | | | | | | +-----------+------------------------------------------------+-------+ + | ``%f`` | Microseconds as a decimal number | \(1) | + | | [000000,999999]. | | + | | | | + +-----------+------------------------------------------------+-------+ | ``%H`` | Hour (24-hour clock) as a decimal number | | | | [00,23]. | | +-----------+------------------------------------------------+-------+ @@ -441,13 +469,13 @@ Functions | ``%M`` | Minute as a decimal number [00,59]. | | | | | | +-----------+------------------------------------------------+-------+ - | ``%p`` | Locale's equivalent of either AM or PM. | \(1) | + | ``%p`` | Locale's equivalent of either AM or PM. | \(2) | | | | | +-----------+------------------------------------------------+-------+ - | ``%S`` | Second as a decimal number [00,61]. | \(2) | + | ``%S`` | Second as a decimal number [00,61]. | \(3) | | | | | +-----------+------------------------------------------------+-------+ - | ``%U`` | Week number of the year (Sunday as the first | \(3) | + | ``%U`` | Week number of the year (Sunday as the first | \(4) | | | day of the week) as a decimal number [00,53]. | | | | All days in a new year preceding the first | | | | Sunday are considered to be in week 0. | | @@ -455,10 +483,13 @@ Functions | | | | | | | | +-----------+------------------------------------------------+-------+ + | ``%u`` | Day of the week (Monday is 1; Sunday is 7) | | + | | as a decimal number [1, 7]. | | + +-----------+------------------------------------------------+-------+ | ``%w`` | Weekday as a decimal number [0(Sunday),6]. | | | | | | +-----------+------------------------------------------------+-------+ - | ``%W`` | Week number of the year (Monday as the first | \(3) | + | ``%W`` | Week number of the year (Monday as the first | \(4) | | | day of the week) as a decimal number [00,53]. | | | | All days in a new year preceding the first | | | | Monday are considered to be in week 0. | | @@ -487,21 +518,39 @@ Functions | ``%Z`` | Time zone name (no characters if no time zone | | | | exists). Deprecated. [1]_ | | +-----------+------------------------------------------------+-------+ + | ``%G`` | ISO 8601 year (similar to ``%Y`` but follows | | + | | the rules for the ISO 8601 calendar year). | | + | | The year starts with the week that contains | | + | | the first Thursday of the calendar year. | | + +-----------+------------------------------------------------+-------+ + | ``%V`` | ISO 8601 week number (as a decimal number | | + | | [01,53]). The first week of the year is the | | + | | one that contains the first Thursday of the | | + | | year. Weeks start on Monday. | | + +-----------+------------------------------------------------+-------+ | ``%%`` | A literal ``'%'`` character. | | +-----------+------------------------------------------------+-------+ Notes: (1) + The ``%f`` format directive only applies to :func:`strptime`, + not to :func:`strftime`. However, see also :meth:`datetime.datetime.strptime` and + :meth:`datetime.datetime.strftime` where the ``%f`` format directive + :ref:`applies to microseconds `. + + (2) When used with the :func:`strptime` function, the ``%p`` directive only affects the output hour field if the ``%I`` directive is used to parse the hour. - (2) + .. _leap-second: + + (3) The range really is ``0`` to ``61``; value ``60`` is valid in timestamps representing `leap seconds`_ and value ``61`` is supported for historical reasons. - (3) + (4) When used with the :func:`strptime` function, ``%U`` and ``%W`` are only used in calculations when the day of the week and the year are specified. @@ -566,32 +615,55 @@ Functions tuple` interface: values can be accessed by index and by attribute name. The following values are present: - +-------+-------------------+---------------------------------+ - | Index | Attribute | Values | - +=======+===================+=================================+ - | 0 | :attr:`tm_year` | (for example, 1993) | - +-------+-------------------+---------------------------------+ - | 1 | :attr:`tm_mon` | range [1, 12] | - +-------+-------------------+---------------------------------+ - | 2 | :attr:`tm_mday` | range [1, 31] | - +-------+-------------------+---------------------------------+ - | 3 | :attr:`tm_hour` | range [0, 23] | - +-------+-------------------+---------------------------------+ - | 4 | :attr:`tm_min` | range [0, 59] | - +-------+-------------------+---------------------------------+ - | 5 | :attr:`tm_sec` | range [0, 61]; see **(2)** in | - | | | :func:`strftime` description | - +-------+-------------------+---------------------------------+ - | 6 | :attr:`tm_wday` | range [0, 6], Monday is 0 | - +-------+-------------------+---------------------------------+ - | 7 | :attr:`tm_yday` | range [1, 366] | - +-------+-------------------+---------------------------------+ - | 8 | :attr:`tm_isdst` | 0, 1 or -1; see below | - +-------+-------------------+---------------------------------+ - | N/A | :attr:`tm_zone` | abbreviation of timezone name | - +-------+-------------------+---------------------------------+ - | N/A | :attr:`tm_gmtoff` | offset east of UTC in seconds | - +-------+-------------------+---------------------------------+ + .. list-table:: + + * - Index + - Attribute + - Values + + * - 0 + - .. attribute:: tm_year + - (for example, 1993) + + * - 1 + - .. attribute:: tm_mon + - range [1, 12] + + * - 2 + - .. attribute:: tm_mday + - range [1, 31] + + * - 3 + - .. attribute:: tm_hour + - range [0, 23] + + * - 4 + - .. attribute:: tm_min + - range [0, 59] + + * - 5 + - .. attribute:: tm_sec + - range [0, 61]; see :ref:`Note (2) ` in :func:`strftime` + + * - 6 + - .. attribute:: tm_wday + - range [0, 6]; Monday is 0 + + * - 7 + - .. attribute:: tm_yday + - range [1, 366] + + * - 8 + - .. attribute:: tm_isdst + - 0, 1 or -1; see below + + * - N/A + - .. attribute:: tm_zone + - abbreviation of timezone name + + * - N/A + - .. attribute:: tm_gmtoff + - offset east of UTC in seconds Note that unlike the C structure, the month value is a range of [1, 12], not [0, 11]. @@ -606,13 +678,13 @@ Functions .. function:: time() -> float - Return the time in seconds since the epoch_ as a floating point + Return the time in seconds since the epoch_ as a floating-point number. The handling of `leap seconds`_ is platform dependent. On Windows and most Unix systems, the leap seconds are not counted towards the time in seconds since the epoch_. This is commonly referred to as `Unix time `_. - Note that even though the time is always returned as a floating point + Note that even though the time is always returned as a floating-point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back @@ -625,6 +697,12 @@ Functions :class:`struct_time` object is returned, from which the components of the calendar date may be accessed as attributes. + Clock: + + * On Windows, call ``GetSystemTimeAsFileTime()``. + * Call ``clock_gettime(CLOCK_REALTIME)`` if available. + * Otherwise, call ``gettimeofday()``. + Use :func:`time_ns` to avoid the precision loss caused by the :class:`float` type. @@ -808,6 +886,15 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.3 +.. data:: CLOCK_MONOTONIC_RAW_APPROX + + Similar to :data:`CLOCK_MONOTONIC_RAW`, but reads a value cached by + the system at context switch and hence has less accuracy. + + .. availability:: macOS >= 10.12. + + .. versionadded:: 3.13 + .. data:: CLOCK_PROCESS_CPUTIME_ID @@ -867,6 +954,15 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.8 +.. data:: CLOCK_UPTIME_RAW_APPROX + + Like :data:`CLOCK_UPTIME_RAW`, but the value is cached by the system + at context switches and therefore has less accuracy. + + .. availability:: macOS >= 10.12. + + .. versionadded:: 3.13 + The following constant is the only parameter that can be sent to :func:`clock_settime`. @@ -912,8 +1008,8 @@ Timezone Constants For the above Timezone constants (:data:`altzone`, :data:`daylight`, :data:`timezone`, and :data:`tzname`), the value is determined by the timezone rules in effect at module load time or the last time :func:`tzset` is called and may be incorrect - for times in the past. It is recommended to use the :attr:`tm_gmtoff` and - :attr:`tm_zone` results from :func:`localtime` to obtain timezone information. + for times in the past. It is recommended to use the :attr:`~struct_time.tm_gmtoff` and + :attr:`~struct_time.tm_zone` results from :func:`localtime` to obtain timezone information. .. seealso:: diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index b3d2a1b9..548a3ee0 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -1,5 +1,5 @@ -:mod:`timeit` --- Measure execution time of small code snippets -=============================================================== +:mod:`!timeit` --- Measure execution time of small code snippets +================================================================ .. module:: timeit :synopsis: Measure the execution time of small code snippets. @@ -151,7 +151,7 @@ The module defines three convenience functions and a public class: so that the total time >= 0.2 second, returning the eventual (number of loops, time taken for that number of loops). It calls :meth:`.timeit` with increasing numbers from the sequence 1, 2, 5, - 10, 20, 50, ... until the time taken is at least 0.2 second. + 10, 20, 50, ... until the time taken is at least 0.2 seconds. If *callback* is given and is not ``None``, it will be called after each trial with two arguments: ``callback(number, time_taken)``. @@ -214,36 +214,36 @@ Where the following options are understood: .. program:: timeit -.. cmdoption:: -n N, --number=N +.. option:: -n N, --number=N how many times to execute 'statement' -.. cmdoption:: -r N, --repeat=N +.. option:: -r N, --repeat=N how many times to repeat the timer (default 5) -.. cmdoption:: -s S, --setup=S +.. option:: -s S, --setup=S statement to be executed once initially (default ``pass``) -.. cmdoption:: -p, --process +.. option:: -p, --process measure process time, not wallclock time, using :func:`time.process_time` instead of :func:`time.perf_counter`, which is the default .. versionadded:: 3.3 -.. cmdoption:: -u, --unit=U +.. option:: -u, --unit=U specify a time unit for timer output; can select ``nsec``, ``usec``, ``msec``, or ``sec`` .. versionadded:: 3.5 -.. cmdoption:: -v, --verbose +.. option:: -v, --verbose print raw timing results; repeat for more digits precision -.. cmdoption:: -h, --help +.. option:: -h, --help print a short usage message and exit diff --git a/Doc/library/tk.rst b/Doc/library/tk.rst index 3dc21305..0593f8b7 100644 --- a/Doc/library/tk.rst +++ b/Doc/library/tk.rst @@ -12,8 +12,7 @@ Graphical User Interfaces with Tk Tk/Tcl has long been an integral part of Python. It provides a robust and platform independent windowing toolkit, that is available to Python programmers -using the :mod:`tkinter` package, and its extension, the :mod:`tkinter.tix` and -the :mod:`tkinter.ttk` modules. +using the :mod:`tkinter` package, and its extension, the :mod:`tkinter.ttk` module. The :mod:`tkinter` package is a thin object-oriented layer on top of Tcl/Tk. To use :mod:`tkinter`, you don't need to write Tcl code, but you will need to @@ -39,7 +38,6 @@ alternative `GUI frameworks and tools .dnd_leave(source, event)* #. Call to *.dnd_enter(source, event)* diff --git a/Doc/library/tkinter.font.rst b/Doc/library/tkinter.font.rst index c7c2b7b5..ed01bd5f 100644 --- a/Doc/library/tkinter.font.rst +++ b/Doc/library/tkinter.font.rst @@ -1,5 +1,5 @@ -:mod:`tkinter.font` --- Tkinter font wrapper -============================================ +:mod:`!tkinter.font` --- Tkinter font wrapper +============================================= .. module:: tkinter.font :platform: Tk diff --git a/Doc/library/tkinter.messagebox.rst b/Doc/library/tkinter.messagebox.rst index 56c1d6c1..0dc9632c 100644 --- a/Doc/library/tkinter.messagebox.rst +++ b/Doc/library/tkinter.messagebox.rst @@ -1,5 +1,5 @@ -:mod:`tkinter.messagebox` --- Tkinter message prompts -===================================================== +:mod:`!tkinter.messagebox` --- Tkinter message prompts +====================================================== .. module:: tkinter.messagebox :platform: Tk @@ -11,7 +11,8 @@ The :mod:`tkinter.messagebox` module provides a template base class as well as a variety of convenience methods for commonly used configurations. The message -boxes are modal and will return a subset of (True, False, OK, None, Yes, No) based on +boxes are modal and will return a subset of (``True``, ``False``, ``None``, +:data:`OK`, :data:`CANCEL`, :data:`YES`, :data:`NO`) based on the user's selection. Common message box styles and layouts include but are not limited to: @@ -19,21 +20,175 @@ limited to: .. class:: Message(master=None, **options) - Create a default information message box. + Create a message window with an application-specified message, an icon + and a set of buttons. + Each of the buttons in the message window is identified by a unique symbolic name (see the *type* options). + + The following options are supported: + + *command* + Specifies the function to invoke when the user closes the dialog. + The name of the button clicked by the user to close the dialog is + passed as argument. + This is only available on macOS. + + *default* + Gives the :ref:`symbolic name ` of the default button + for this message window (:data:`OK`, :data:`CANCEL`, and so on). + If this option is not specified, the first button in the dialog will + be made the default. + + *detail* + Specifies an auxiliary message to the main message given by the + *message* option. + The message detail will be presented beneath the main message and, + where supported by the OS, in a less emphasized font than the main + message. + + *icon* + Specifies an :ref:`icon ` to display. + If this option is not specified, then the :data:`INFO` icon will be + displayed. + + *message* + Specifies the message to display in this message box. + The default value is an empty string. + + *parent* + Makes the specified window the logical parent of the message box. + The message box is displayed on top of its parent window. + + *title* + Specifies a string to display as the title of the message box. + This option is ignored on macOS, where platform guidelines forbid + the use of a title on this kind of dialog. + + *type* + Arranges for a :ref:`predefined set of buttons ` + to be displayed. + + .. method:: show(**options) + + Display a message window and wait for the user to select one of the buttons. Then return the symbolic name of the selected button. + Keyword arguments can override options specified in the constructor. + **Information message box** -.. method:: showinfo(title=None, message=None, **options) +.. function:: showinfo(title=None, message=None, **options) + + Creates and displays an information message box with the specified title + and message. **Warning message boxes** -.. method:: showwarning(title=None, message=None, **options) - showerror(title=None, message=None, **options) +.. function:: showwarning(title=None, message=None, **options) + + Creates and displays a warning message box with the specified title + and message. + +.. function:: showerror(title=None, message=None, **options) + + Creates and displays an error message box with the specified title + and message. **Question message boxes** -.. method:: askquestion(title=None, message=None, **options) - askokcancel(title=None, message=None, **options) - askretrycancel(title=None, message=None, **options) - askyesno(title=None, message=None, **options) - askyesnocancel(title=None, message=None, **options) +.. function:: askquestion(title=None, message=None, *, type=YESNO, **options) + + Ask a question. By default shows buttons :data:`YES` and :data:`NO`. + Returns the symbolic name of the selected button. + +.. function:: askokcancel(title=None, message=None, **options) + + Ask if operation should proceed. Shows buttons :data:`OK` and :data:`CANCEL`. + Returns ``True`` if the answer is ok and ``False`` otherwise. + +.. function:: askretrycancel(title=None, message=None, **options) + + Ask if operation should be retried. Shows buttons :data:`RETRY` and :data:`CANCEL`. + Return ``True`` if the answer is yes and ``False`` otherwise. + +.. function:: askyesno(title=None, message=None, **options) + + Ask a question. Shows buttons :data:`YES` and :data:`NO`. + Returns ``True`` if the answer is yes and ``False`` otherwise. + +.. function:: askyesnocancel(title=None, message=None, **options) + + Ask a question. Shows buttons :data:`YES`, :data:`NO` and :data:`CANCEL`. + Return ``True`` if the answer is yes, ``None`` if cancelled, and ``False`` + otherwise. + + +.. _messagebox-buttons: + +Symbolic names of buttons: + +.. data:: ABORT + :value: 'abort' +.. data:: RETRY + :value: 'retry' +.. data:: IGNORE + :value: 'ignore' +.. data:: OK + :value: 'ok' +.. data:: CANCEL + :value: 'cancel' +.. data:: YES + :value: 'yes' +.. data:: NO + :value: 'no' + +.. _messagebox-types: + +Predefined sets of buttons: + +.. data:: ABORTRETRYIGNORE + :value: 'abortretryignore' + + Displays three buttons whose symbolic names are :data:`ABORT`, + :data:`RETRY` and :data:`IGNORE`. + +.. data:: OK + :value: 'ok' + :noindex: + + Displays one button whose symbolic name is :data:`OK`. + +.. data:: OKCANCEL + :value: 'okcancel' + + Displays two buttons whose symbolic names are :data:`OK` and + :data:`CANCEL`. + +.. data:: RETRYCANCEL + :value: 'retrycancel' + + Displays two buttons whose symbolic names are :data:`RETRY` and + :data:`CANCEL`. + +.. data:: YESNO + :value: 'yesno' + + Displays two buttons whose symbolic names are :data:`YES` and + :data:`NO`. + +.. data:: YESNOCANCEL + :value: 'yesnocancel' + + Displays three buttons whose symbolic names are :data:`YES`, + :data:`NO` and :data:`CANCEL`. + +.. _messagebox-icons: + +Icon images: + +.. data:: ERROR + :value: 'error' +.. data:: INFO + :value: 'info' +.. data:: QUESTION + :value: 'question' +.. data:: WARNING + :value: 'warning' diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 246abf37..f284988d 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -1,5 +1,5 @@ -:mod:`tkinter` --- Python interface to Tcl/Tk -============================================= +:mod:`!tkinter` --- Python interface to Tcl/Tk +============================================== .. module:: tkinter :synopsis: Interface to Tcl/Tk for graphical user interfaces @@ -58,8 +58,8 @@ details that are unchanged. * `Modern Tkinter for Busy Python Developers `_ By Mark Roseman. (ISBN 978-1999149567) - * `Python and Tkinter Programming `_ - By Alan Moore. (ISBN 978-1788835886) + * `Python GUI programming with Tkinter `_ + By Alan D. Moore. (ISBN 978-1788835886) * `Programming Python `_ By Mark Lutz; has excellent coverage of Tkinter. (ISBN 978-0596158101) @@ -232,6 +232,9 @@ The modules that provide Tk support include: Additional modules: +.. module:: _tkinter + :synopsis: A binary module that contains the low-level interface to Tcl/Tk. + :mod:`_tkinter` A binary module that contains the low-level interface to Tcl/Tk. It is automatically imported by the main :mod:`tkinter` module, @@ -252,10 +255,6 @@ Additional modules: (experimental) Drag-and-drop support for :mod:`tkinter`. This will become deprecated when it is replaced with the Tk DND. -:mod:`tkinter.tix` - (deprecated) An older third-party Tcl/Tk package that adds several new - widgets. Better alternatives for most can be found in :mod:`tkinter.ttk`. - :mod:`turtle` Turtle graphics in a Tk window. @@ -533,24 +532,24 @@ interpreter will fail. A number of special cases exist: - * Tcl/Tk libraries can be built so they are not thread-aware. In this case, - :mod:`tkinter` calls the library from the originating Python thread, even - if this is different than the thread that created the Tcl interpreter. A global - lock ensures only one call occurs at a time. +* Tcl/Tk libraries can be built so they are not thread-aware. In this case, + :mod:`tkinter` calls the library from the originating Python thread, even + if this is different than the thread that created the Tcl interpreter. A global + lock ensures only one call occurs at a time. - * While :mod:`tkinter` allows you to create more than one instance of a :class:`Tk` - object (with its own interpreter), all interpreters that are part of the same - thread share a common event queue, which gets ugly fast. In practice, don't create - more than one instance of :class:`Tk` at a time. Otherwise, it's best to create - them in separate threads and ensure you're running a thread-aware Tcl/Tk build. +* While :mod:`tkinter` allows you to create more than one instance of a :class:`Tk` + object (with its own interpreter), all interpreters that are part of the same + thread share a common event queue, which gets ugly fast. In practice, don't create + more than one instance of :class:`Tk` at a time. Otherwise, it's best to create + them in separate threads and ensure you're running a thread-aware Tcl/Tk build. - * Blocking event handlers are not the only way to prevent the Tcl interpreter from - reentering the event loop. It is even possible to run multiple nested event loops - or abandon the event loop entirely. If you're doing anything tricky when it comes - to events or threads, be aware of these possibilities. +* Blocking event handlers are not the only way to prevent the Tcl interpreter from + reentering the event loop. It is even possible to run multiple nested event loops + or abandon the event loop entirely. If you're doing anything tricky when it comes + to events or threads, be aware of these possibilities. - * There are a few select :mod:`tkinter` functions that presently work only when - called from the thread that created the Tcl interpreter. +* There are a few select :mod:`tkinter` functions that presently work only when + called from the thread that created the Tcl interpreter. Handy Reference @@ -980,6 +979,15 @@ of :class:`tkinter.Image`: Either type of image is created through either the ``file`` or the ``data`` option (other options are available as well). +.. versionchanged:: 3.13 + Added the :class:`!PhotoImage` method :meth:`!copy_replace` to copy a region + from one image to other image, possibly with pixel zooming and/or + subsampling. + Add *from_coords* parameter to :class:`!PhotoImage` methods :meth:`!copy`, + :meth:`!zoom` and :meth:`!subsample`. + Add *zoom* and *subsample* parameters to :class:`!PhotoImage` method + :meth:`!copy`. + The image object can then be used wherever an ``image`` option is supported by some widget (e.g. labels, buttons, menus). In these cases, Tk will not keep a reference to the image. When the last Python reference to the image object is diff --git a/Doc/library/tkinter.scrolledtext.rst b/Doc/library/tkinter.scrolledtext.rst index d20365ba..763e2492 100644 --- a/Doc/library/tkinter.scrolledtext.rst +++ b/Doc/library/tkinter.scrolledtext.rst @@ -1,5 +1,5 @@ -:mod:`tkinter.scrolledtext` --- Scrolled Text Widget -==================================================== +:mod:`!tkinter.scrolledtext` --- Scrolled Text Widget +===================================================== .. module:: tkinter.scrolledtext :platform: Tk diff --git a/Doc/library/tkinter.tix.rst b/Doc/library/tkinter.tix.rst deleted file mode 100644 index c86fcfa6..00000000 --- a/Doc/library/tkinter.tix.rst +++ /dev/null @@ -1,583 +0,0 @@ -:mod:`tkinter.tix` --- Extension widgets for Tk -=============================================== - -.. module:: tkinter.tix - :synopsis: Tk Extension Widgets for Tkinter - -.. sectionauthor:: Mike Clarkson - -**Source code:** :source:`Lib/tkinter/tix.py` - -.. index:: single: Tix - -.. deprecated:: 3.6 - This Tk extension is unmaintained and should not be used in new code. Use - :mod:`tkinter.ttk` instead. - --------------- - -The :mod:`tkinter.tix` (Tk Interface Extension) module provides an additional -rich set of widgets. Although the standard Tk library has many useful widgets, -they are far from complete. The :mod:`tkinter.tix` library provides most of the -commonly needed widgets that are missing from standard Tk: :class:`HList`, -:class:`ComboBox`, :class:`Control` (a.k.a. SpinBox) and an assortment of -scrollable widgets. -:mod:`tkinter.tix` also includes many more widgets that are generally useful in -a wide range of applications: :class:`NoteBook`, :class:`FileEntry`, -:class:`PanedWindow`, etc; there are more than 40 of them. - -With all these new widgets, you can introduce new interaction techniques into -applications, creating more useful and more intuitive user interfaces. You can -design your application by choosing the most appropriate widgets to match the -special needs of your application and users. - -.. seealso:: - - `Tix Homepage `_ - The home page for :mod:`Tix`. This includes links to additional documentation - and downloads. - - `Tix Man Pages `_ - On-line version of the man pages and reference material. - - `Tix Programming Guide `_ - On-line version of the programmer's reference material. - - `Tix Development Applications `_ - Tix applications for development of Tix and Tkinter programs. Tide applications - work under Tk or Tkinter, and include :program:`TixInspect`, an inspector to - remotely modify and debug Tix/Tk/Tkinter applications. - - -Using Tix ---------- - - -.. class:: Tk(screenName=None, baseName=None, className='Tix') - - Toplevel widget of Tix which represents mostly the main window of an - application. It has an associated Tcl interpreter. - - Classes in the :mod:`tkinter.tix` module subclasses the classes in the - :mod:`tkinter`. The former imports the latter, so to use :mod:`tkinter.tix` - with Tkinter, all you need to do is to import one module. In general, you - can just import :mod:`tkinter.tix`, and replace the toplevel call to - :class:`tkinter.Tk` with :class:`tix.Tk`:: - - from tkinter import tix - from tkinter.constants import * - root = tix.Tk() - -To use :mod:`tkinter.tix`, you must have the Tix widgets installed, usually -alongside your installation of the Tk widgets. To test your installation, try -the following:: - - from tkinter import tix - root = tix.Tk() - root.tk.eval('package require Tix') - - -Tix Widgets ------------ - -`Tix `_ -introduces over 40 widget classes to the :mod:`tkinter` repertoire. - - -Basic Widgets -^^^^^^^^^^^^^ - - -.. class:: Balloon() - - A `Balloon - `_ that - pops up over a widget to provide help. When the user moves the cursor inside a - widget to which a Balloon widget has been bound, a small pop-up window with a - descriptive message will be shown on the screen. - -.. Python Demo of: -.. \ulink{Balloon}{https://tix.sourceforge.net/dist/current/demos/samples/Balloon.tcl} - - -.. class:: ButtonBox() - - The `ButtonBox - `_ - widget creates a box of buttons, such as is commonly used for ``Ok Cancel``. - -.. Python Demo of: -.. \ulink{ButtonBox}{https://tix.sourceforge.net/dist/current/demos/samples/BtnBox.tcl} - - -.. class:: ComboBox() - - The `ComboBox - `_ - widget is similar to the combo box control in MS Windows. The user can select a - choice by either typing in the entry subwidget or selecting from the listbox - subwidget. - -.. Python Demo of: -.. \ulink{ComboBox}{https://tix.sourceforge.net/dist/current/demos/samples/ComboBox.tcl} - - -.. class:: Control() - - The `Control - `_ - widget is also known as the :class:`SpinBox` widget. The user can adjust the - value by pressing the two arrow buttons or by entering the value directly into - the entry. The new value will be checked against the user-defined upper and - lower limits. - -.. Python Demo of: -.. \ulink{Control}{https://tix.sourceforge.net/dist/current/demos/samples/Control.tcl} - - -.. class:: LabelEntry() - - The `LabelEntry - `_ - widget packages an entry widget and a label into one mega widget. It can - be used to simplify the creation of "entry-form" type of interface. - -.. Python Demo of: -.. \ulink{LabelEntry}{https://tix.sourceforge.net/dist/current/demos/samples/LabEntry.tcl} - - -.. class:: LabelFrame() - - The `LabelFrame - `_ - widget packages a frame widget and a label into one mega widget. To create - widgets inside a LabelFrame widget, one creates the new widgets relative to the - :attr:`frame` subwidget and manage them inside the :attr:`frame` subwidget. - -.. Python Demo of: -.. \ulink{LabelFrame}{https://tix.sourceforge.net/dist/current/demos/samples/LabFrame.tcl} - - -.. class:: Meter() - - The `Meter - `_ widget - can be used to show the progress of a background job which may take a long time - to execute. - -.. Python Demo of: -.. \ulink{Meter}{https://tix.sourceforge.net/dist/current/demos/samples/Meter.tcl} - - -.. class:: OptionMenu() - - The `OptionMenu - `_ - creates a menu button of options. - -.. Python Demo of: -.. \ulink{OptionMenu}{https://tix.sourceforge.net/dist/current/demos/samples/OptMenu.tcl} - - -.. class:: PopupMenu() - - The `PopupMenu - `_ - widget can be used as a replacement of the ``tk_popup`` command. The advantage - of the :mod:`Tix` :class:`PopupMenu` widget is it requires less application code - to manipulate. - -.. Python Demo of: -.. \ulink{PopupMenu}{https://tix.sourceforge.net/dist/current/demos/samples/PopMenu.tcl} - - -.. class:: Select() - - The `Select - `_ widget - is a container of button subwidgets. It can be used to provide radio-box or - check-box style of selection options for the user. - -.. Python Demo of: -.. \ulink{Select}{https://tix.sourceforge.net/dist/current/demos/samples/Select.tcl} - - -.. class:: StdButtonBox() - - The `StdButtonBox - `_ - widget is a group of standard buttons for Motif-like dialog boxes. - -.. Python Demo of: -.. \ulink{StdButtonBox}{https://tix.sourceforge.net/dist/current/demos/samples/StdBBox.tcl} - - -File Selectors -^^^^^^^^^^^^^^ - - -.. class:: DirList() - - The `DirList - `_ - widget displays a list view of a directory, its previous directories and its - sub-directories. The user can choose one of the directories displayed in the - list or change to another directory. - -.. Python Demo of: -.. \ulink{DirList}{https://tix.sourceforge.net/dist/current/demos/samples/DirList.tcl} - - -.. class:: DirTree() - - The `DirTree - `_ - widget displays a tree view of a directory, its previous directories and its - sub-directories. The user can choose one of the directories displayed in the - list or change to another directory. - -.. Python Demo of: -.. \ulink{DirTree}{https://tix.sourceforge.net/dist/current/demos/samples/DirTree.tcl} - - -.. class:: DirSelectDialog() - - The `DirSelectDialog - `_ - widget presents the directories in the file system in a dialog window. The user - can use this dialog window to navigate through the file system to select the - desired directory. - -.. Python Demo of: -.. \ulink{DirSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/DirDlg.tcl} - - -.. class:: DirSelectBox() - - The :class:`DirSelectBox` is similar to the standard Motif(TM) - directory-selection box. It is generally used for the user to choose a - directory. DirSelectBox stores the directories mostly recently selected into - a ComboBox widget so that they can be quickly selected again. - - -.. class:: ExFileSelectBox() - - The `ExFileSelectBox - `_ - widget is usually embedded in a tixExFileSelectDialog widget. It provides a - convenient method for the user to select files. The style of the - :class:`ExFileSelectBox` widget is very similar to the standard file dialog on - MS Windows 3.1. - -.. Python Demo of: -.. \ulink{ExFileSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/EFileDlg.tcl} - - -.. class:: FileSelectBox() - - The `FileSelectBox - `_ - is similar to the standard Motif(TM) file-selection box. It is generally used - for the user to choose a file. FileSelectBox stores the files mostly recently - selected into a :class:`ComboBox` widget so that they can be quickly selected - again. - -.. Python Demo of: -.. \ulink{FileSelectDialog}{https://tix.sourceforge.net/dist/current/demos/samples/FileDlg.tcl} - - -.. class:: FileEntry() - - The `FileEntry - `_ - widget can be used to input a filename. The user can type in the filename - manually. Alternatively, the user can press the button widget that sits next to - the entry, which will bring up a file selection dialog. - -.. Python Demo of: -.. \ulink{FileEntry}{https://tix.sourceforge.net/dist/current/demos/samples/FileEnt.tcl} - - -Hierarchical ListBox -^^^^^^^^^^^^^^^^^^^^ - - -.. class:: HList() - - The `HList - `_ widget - can be used to display any data that have a hierarchical structure, for example, - file system directory trees. The list entries are indented and connected by - branch lines according to their places in the hierarchy. - -.. Python Demo of: -.. \ulink{HList}{https://tix.sourceforge.net/dist/current/demos/samples/HList1.tcl} - - -.. class:: CheckList() - - The `CheckList - `_ - widget displays a list of items to be selected by the user. CheckList acts - similarly to the Tk checkbutton or radiobutton widgets, except it is capable of - handling many more items than checkbuttons or radiobuttons. - -.. Python Demo of: -.. \ulink{ CheckList}{https://tix.sourceforge.net/dist/current/demos/samples/ChkList.tcl} -.. Python Demo of: -.. \ulink{ScrolledHList (1)}{https://tix.sourceforge.net/dist/current/demos/samples/SHList.tcl} -.. Python Demo of: -.. \ulink{ScrolledHList (2)}{https://tix.sourceforge.net/dist/current/demos/samples/SHList2.tcl} - - -.. class:: Tree() - - The `Tree - `_ widget - can be used to display hierarchical data in a tree form. The user can adjust the - view of the tree by opening or closing parts of the tree. - -.. Python Demo of: -.. \ulink{Tree}{https://tix.sourceforge.net/dist/current/demos/samples/Tree.tcl} -.. Python Demo of: -.. \ulink{Tree (Dynamic)}{https://tix.sourceforge.net/dist/current/demos/samples/DynTree.tcl} - - -Tabular ListBox -^^^^^^^^^^^^^^^ - - -.. class:: TList() - - The `TList - `_ widget - can be used to display data in a tabular format. The list entries of a - :class:`TList` widget are similar to the entries in the Tk listbox widget. The - main differences are (1) the :class:`TList` widget can display the list entries - in a two dimensional format and (2) you can use graphical images as well as - multiple colors and fonts for the list entries. - -.. Python Demo of: -.. \ulink{ScrolledTList (1)}{https://tix.sourceforge.net/dist/current/demos/samples/STList1.tcl} -.. Python Demo of: -.. \ulink{ScrolledTList (2)}{https://tix.sourceforge.net/dist/current/demos/samples/STList2.tcl} -.. Grid has yet to be added to Python -.. \subsubsection{Grid Widget} -.. Python Demo of: -.. \ulink{Simple Grid}{https://tix.sourceforge.net/dist/current/demos/samples/SGrid0.tcl} -.. Python Demo of: -.. \ulink{ScrolledGrid}{https://tix.sourceforge.net/dist/current/demos/samples/SGrid1.tcl} -.. Python Demo of: -.. \ulink{Editable Grid}{https://tix.sourceforge.net/dist/current/demos/samples/EditGrid.tcl} - - -Manager Widgets -^^^^^^^^^^^^^^^ - - -.. class:: PanedWindow() - - The `PanedWindow - `_ - widget allows the user to interactively manipulate the sizes of several panes. - The panes can be arranged either vertically or horizontally. The user changes - the sizes of the panes by dragging the resize handle between two panes. - -.. Python Demo of: -.. \ulink{PanedWindow}{https://tix.sourceforge.net/dist/current/demos/samples/PanedWin.tcl} - - -.. class:: ListNoteBook() - - The `ListNoteBook - `_ - widget is very similar to the :class:`TixNoteBook` widget: it can be used to - display many windows in a limited space using a notebook metaphor. The notebook - is divided into a stack of pages (windows). At one time only one of these pages - can be shown. The user can navigate through these pages by choosing the name of - the desired page in the :attr:`hlist` subwidget. - -.. Python Demo of: -.. \ulink{ListNoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/ListNBK.tcl} - - -.. class:: NoteBook() - - The `NoteBook - `_ - widget can be used to display many windows in a limited space using a notebook - metaphor. The notebook is divided into a stack of pages. At one time only one of - these pages can be shown. The user can navigate through these pages by choosing - the visual "tabs" at the top of the NoteBook widget. - -.. Python Demo of: -.. \ulink{NoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/NoteBook.tcl} - -.. \subsubsection{Scrolled Widgets} -.. Python Demo of: -.. \ulink{ScrolledListBox}{https://tix.sourceforge.net/dist/current/demos/samples/SListBox.tcl} -.. Python Demo of: -.. \ulink{ScrolledText}{https://tix.sourceforge.net/dist/current/demos/samples/SText.tcl} -.. Python Demo of: -.. \ulink{ScrolledWindow}{https://tix.sourceforge.net/dist/current/demos/samples/SWindow.tcl} -.. Python Demo of: -.. \ulink{Canvas Object View}{https://tix.sourceforge.net/dist/current/demos/samples/CObjView.tcl} - - -Image Types -^^^^^^^^^^^ - -The :mod:`tkinter.tix` module adds: - -* `pixmap `_ - capabilities to all :mod:`tkinter.tix` and :mod:`tkinter` widgets to create - color images from XPM files. - - .. Python Demo of: - .. \ulink{XPM Image In Button}{https://tix.sourceforge.net/dist/current/demos/samples/Xpm.tcl} - .. Python Demo of: - .. \ulink{XPM Image In Menu}{https://tix.sourceforge.net/dist/current/demos/samples/Xpm1.tcl} - -* `Compound - `_ image - types can be used to create images that consists of multiple horizontal lines; - each line is composed of a series of items (texts, bitmaps, images or spaces) - arranged from left to right. For example, a compound image can be used to - display a bitmap and a text string simultaneously in a Tk :class:`Button` - widget. - - .. Python Demo of: - .. \ulink{Compound Image In Buttons}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg.tcl} - .. Python Demo of: - .. \ulink{Compound Image In NoteBook}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg2.tcl} - .. Python Demo of: - .. \ulink{Compound Image Notebook Color Tabs}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg4.tcl} - .. Python Demo of: - .. \ulink{Compound Image Icons}{https://tix.sourceforge.net/dist/current/demos/samples/CmpImg3.tcl} - - -Miscellaneous Widgets -^^^^^^^^^^^^^^^^^^^^^ - - -.. class:: InputOnly() - - The `InputOnly - `_ - widgets are to accept inputs from the user, which can be done with the ``bind`` - command (Unix only). - - -Form Geometry Manager -^^^^^^^^^^^^^^^^^^^^^ - -In addition, :mod:`tkinter.tix` augments :mod:`tkinter` by providing: - - -.. class:: Form() - - The `Form - `_ geometry - manager based on attachment rules for all Tk widgets. - - -Tix Commands ------------- - - -.. class:: tixCommand() - - The `tix commands - `_ provide - access to miscellaneous elements of :mod:`Tix`'s internal state and the - :mod:`Tix` application context. Most of the information manipulated by these - methods pertains to the application as a whole, or to a screen or display, - rather than to a particular window. - - To view the current settings, the common usage is:: - - from tkinter import tix - root = tix.Tk() - print(root.tix_configure()) - - -.. method:: tixCommand.tix_configure(cnf=None, **kw) - - Query or modify the configuration options of the Tix application context. If no - option is specified, returns a dictionary all of the available options. If - option is specified with no value, then the method returns a list describing the - one named option (this list will be identical to the corresponding sublist of - the value returned if no option is specified). If one or more option-value - pairs are specified, then the method modifies the given option(s) to have the - given value(s); in this case the method returns an empty string. Option may be - any of the configuration options. - - -.. method:: tixCommand.tix_cget(option) - - Returns the current value of the configuration option given by *option*. Option - may be any of the configuration options. - - -.. method:: tixCommand.tix_getbitmap(name) - - Locates a bitmap file of the name ``name.xpm`` or ``name`` in one of the bitmap - directories (see the :meth:`tix_addbitmapdir` method). By using - :meth:`tix_getbitmap`, you can avoid hard coding the pathnames of the bitmap - files in your application. When successful, it returns the complete pathname of - the bitmap file, prefixed with the character ``@``. The returned value can be - used to configure the ``bitmap`` option of the Tk and Tix widgets. - - -.. method:: tixCommand.tix_addbitmapdir(directory) - - Tix maintains a list of directories under which the :meth:`tix_getimage` and - :meth:`tix_getbitmap` methods will search for image files. The standard bitmap - directory is :file:`$TIX_LIBRARY/bitmaps`. The :meth:`tix_addbitmapdir` method - adds *directory* into this list. By using this method, the image files of an - applications can also be located using the :meth:`tix_getimage` or - :meth:`tix_getbitmap` method. - - -.. method:: tixCommand.tix_filedialog([dlgclass]) - - Returns the file selection dialog that may be shared among different calls from - this application. This method will create a file selection dialog widget when - it is called the first time. This dialog will be returned by all subsequent - calls to :meth:`tix_filedialog`. An optional dlgclass parameter can be passed - as a string to specified what type of file selection dialog widget is desired. - Possible options are ``tix``, ``FileSelectDialog`` or ``tixExFileSelectDialog``. - - -.. method:: tixCommand.tix_getimage(self, name) - - Locates an image file of the name :file:`name.xpm`, :file:`name.xbm` or - :file:`name.ppm` in one of the bitmap directories (see the - :meth:`tix_addbitmapdir` method above). If more than one file with the same name - (but different extensions) exist, then the image type is chosen according to the - depth of the X display: xbm images are chosen on monochrome displays and color - images are chosen on color displays. By using :meth:`tix_getimage`, you can - avoid hard coding the pathnames of the image files in your application. When - successful, this method returns the name of the newly created image, which can - be used to configure the ``image`` option of the Tk and Tix widgets. - - -.. method:: tixCommand.tix_option_get(name) - - Gets the options maintained by the Tix scheme mechanism. - - -.. method:: tixCommand.tix_resetoptions(newScheme, newFontSet[, newScmPrio]) - - Resets the scheme and fontset of the Tix application to *newScheme* and - *newFontSet*, respectively. This affects only those widgets created after this - call. Therefore, it is best to call the resetoptions method before the creation - of any widgets in a Tix application. - - The optional parameter *newScmPrio* can be given to reset the priority level of - the Tk options set by the Tix schemes. - - Because of the way Tk handles the X option database, after Tix has been has - imported and inited, it is not possible to reset the color schemes and font sets - using the :meth:`tix_config` method. Instead, the :meth:`tix_resetoptions` - method must be used. diff --git a/Doc/library/tkinter.ttk.rst b/Doc/library/tkinter.ttk.rst index 9f2f9eb8..628e9f94 100644 --- a/Doc/library/tkinter.ttk.rst +++ b/Doc/library/tkinter.ttk.rst @@ -1,5 +1,5 @@ -:mod:`tkinter.ttk` --- Tk themed widgets -======================================== +:mod:`!tkinter.ttk` --- Tk themed widgets +========================================= .. module:: tkinter.ttk :synopsis: Tk themed widget set @@ -104,33 +104,33 @@ Standard Options All the :mod:`ttk` Widgets accept the following options: - .. tabularcolumns:: |l|L| - - +-----------+--------------------------------------------------------------+ - | Option | Description | - +===========+==============================================================+ - | class | Specifies the window class. The class is used when querying | - | | the option database for the window's other options, to | - | | determine the default bindtags for the window, and to select | - | | the widget's default layout and style. This option is | - | | read-only, and may only be specified when the window is | - | | created. | - +-----------+--------------------------------------------------------------+ - | cursor | Specifies the mouse cursor to be used for the widget. If set | - | | to the empty string (the default), the cursor is inherited | - | | for the parent widget. | - +-----------+--------------------------------------------------------------+ - | takefocus | Determines whether the window accepts the focus during | - | | keyboard traversal. 0, 1 or an empty string is returned. | - | | If 0 is returned, it means that the window should be skipped | - | | entirely during keyboard traversal. If 1, it means that the | - | | window should receive the input focus as long as it is | - | | viewable. And an empty string means that the traversal | - | | scripts make the decision about whether or not to focus | - | | on the window. | - +-----------+--------------------------------------------------------------+ - | style | May be used to specify a custom widget style. | - +-----------+--------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++-----------+--------------------------------------------------------------+ +| Option | Description | ++===========+==============================================================+ +| class | Specifies the window class. The class is used when querying | +| | the option database for the window's other options, to | +| | determine the default bindtags for the window, and to select | +| | the widget's default layout and style. This option is | +| | read-only, and may only be specified when the window is | +| | created. | ++-----------+--------------------------------------------------------------+ +| cursor | Specifies the mouse cursor to be used for the widget. If set | +| | to the empty string (the default), the cursor is inherited | +| | for the parent widget. | ++-----------+--------------------------------------------------------------+ +| takefocus | Determines whether the window accepts the focus during | +| | keyboard traversal. 0, 1 or an empty string is returned. | +| | If 0 is returned, it means that the window should be skipped | +| | entirely during keyboard traversal. If 1, it means that the | +| | window should receive the input focus as long as it is | +| | viewable. And an empty string means that the traversal | +| | scripts make the decision about whether or not to focus | +| | on the window. | ++-----------+--------------------------------------------------------------+ +| style | May be used to specify a custom widget style. | ++-----------+--------------------------------------------------------------+ Scrollable Widget Options @@ -139,24 +139,24 @@ Scrollable Widget Options The following options are supported by widgets that are controlled by a scrollbar. - .. tabularcolumns:: |l|L| - - +----------------+---------------------------------------------------------+ - | Option | Description | - +================+=========================================================+ - | xscrollcommand | Used to communicate with horizontal scrollbars. | - | | | - | | When the view in the widget's window change, the widget | - | | will generate a Tcl command based on the scrollcommand. | - | | | - | | Usually this option consists of the method | - | | :meth:`Scrollbar.set` of some scrollbar. This will cause| - | | the scrollbar to be updated whenever the view in the | - | | window changes. | - +----------------+---------------------------------------------------------+ - | yscrollcommand | Used to communicate with vertical scrollbars. | - | | For some more information, see above. | - +----------------+---------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++----------------+---------------------------------------------------------+ +| Option | Description | ++================+=========================================================+ +| xscrollcommand | Used to communicate with horizontal scrollbars. | +| | | +| | When the view in the widget's window change, the widget | +| | will generate a Tcl command based on the scrollcommand. | +| | | +| | Usually this option consists of the method | +| | :meth:`Scrollbar.set` of some scrollbar. This will cause| +| | the scrollbar to be updated whenever the view in the | +| | window changes. | ++----------------+---------------------------------------------------------+ +| yscrollcommand | Used to communicate with vertical scrollbars. | +| | For some more information, see above. | ++----------------+---------------------------------------------------------+ Label Options @@ -165,93 +165,93 @@ Label Options The following options are supported by labels, buttons and other button-like widgets. - .. tabularcolumns:: |l|p{0.7\linewidth}| - - +--------------+-----------------------------------------------------------+ - | Option | Description | - +==============+===========================================================+ - | text | Specifies a text string to be displayed inside the widget.| - +--------------+-----------------------------------------------------------+ - | textvariable | Specifies a name whose value will be used in place of the | - | | text option resource. | - +--------------+-----------------------------------------------------------+ - | underline | If set, specifies the index (0-based) of a character to | - | | underline in the text string. The underline character is | - | | used for mnemonic activation. | - +--------------+-----------------------------------------------------------+ - | image | Specifies an image to display. This is a list of 1 or more| - | | elements. The first element is the default image name. The| - | | rest of the list if a sequence of statespec/value pairs as| - | | defined by :meth:`Style.map`, specifying different images | - | | to use when the widget is in a particular state or a | - | | combination of states. All images in the list should have | - | | the same size. | - +--------------+-----------------------------------------------------------+ - | compound | Specifies how to display the image relative to the text, | - | | in the case both text and images options are present. | - | | Valid values are: | - | | | - | | * text: display text only | - | | * image: display image only | - | | * top, bottom, left, right: display image above, below, | - | | left of, or right of the text, respectively. | - | | * none: the default. display the image if present, | - | | otherwise the text. | - +--------------+-----------------------------------------------------------+ - | width | If greater than zero, specifies how much space, in | - | | character widths, to allocate for the text label, if less | - | | than zero, specifies a minimum width. If zero or | - | | unspecified, the natural width of the text label is used. | - +--------------+-----------------------------------------------------------+ +.. tabularcolumns:: |l|p{0.7\linewidth}| + ++--------------+-----------------------------------------------------------+ +| Option | Description | ++==============+===========================================================+ +| text | Specifies a text string to be displayed inside the widget.| ++--------------+-----------------------------------------------------------+ +| textvariable | Specifies a name whose value will be used in place of the | +| | text option resource. | ++--------------+-----------------------------------------------------------+ +| underline | If set, specifies the index (0-based) of a character to | +| | underline in the text string. The underline character is | +| | used for mnemonic activation. | ++--------------+-----------------------------------------------------------+ +| image | Specifies an image to display. This is a list of 1 or more| +| | elements. The first element is the default image name. The| +| | rest of the list if a sequence of statespec/value pairs as| +| | defined by :meth:`Style.map`, specifying different images | +| | to use when the widget is in a particular state or a | +| | combination of states. All images in the list should have | +| | the same size. | ++--------------+-----------------------------------------------------------+ +| compound | Specifies how to display the image relative to the text, | +| | in the case both text and images options are present. | +| | Valid values are: | +| | | +| | * text: display text only | +| | * image: display image only | +| | * top, bottom, left, right: display image above, below, | +| | left of, or right of the text, respectively. | +| | * none: the default. display the image if present, | +| | otherwise the text. | ++--------------+-----------------------------------------------------------+ +| width | If greater than zero, specifies how much space, in | +| | character widths, to allocate for the text label, if less | +| | than zero, specifies a minimum width. If zero or | +| | unspecified, the natural width of the text label is used. | ++--------------+-----------------------------------------------------------+ Compatibility Options ^^^^^^^^^^^^^^^^^^^^^ - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - +--------+----------------------------------------------------------------+ - | Option | Description | - +========+================================================================+ - | state | May be set to "normal" or "disabled" to control the "disabled" | - | | state bit. This is a write-only option: setting it changes the | - | | widget state, but the :meth:`Widget.state` method does not | - | | affect this option. | - +--------+----------------------------------------------------------------+ ++--------+----------------------------------------------------------------+ +| Option | Description | ++========+================================================================+ +| state | May be set to "normal" or "disabled" to control the "disabled" | +| | state bit. This is a write-only option: setting it changes the | +| | widget state, but the :meth:`Widget.state` method does not | +| | affect this option. | ++--------+----------------------------------------------------------------+ Widget States ^^^^^^^^^^^^^ The widget state is a bitmap of independent state flags. - .. tabularcolumns:: |l|L| - - +------------+-------------------------------------------------------------+ - | Flag | Description | - +============+=============================================================+ - | active | The mouse cursor is over the widget and pressing a mouse | - | | button will cause some action to occur | - +------------+-------------------------------------------------------------+ - | disabled | Widget is disabled under program control | - +------------+-------------------------------------------------------------+ - | focus | Widget has keyboard focus | - +------------+-------------------------------------------------------------+ - | pressed | Widget is being pressed | - +------------+-------------------------------------------------------------+ - | selected | "On", "true", or "current" for things like Checkbuttons and | - | | radiobuttons | - +------------+-------------------------------------------------------------+ - | background | Windows and Mac have a notion of an "active" or foreground | - | | window. The *background* state is set for widgets in a | - | | background window, and cleared for those in the foreground | - | | window | - +------------+-------------------------------------------------------------+ - | readonly | Widget should not allow user modification | - +------------+-------------------------------------------------------------+ - | alternate | A widget-specific alternate display format | - +------------+-------------------------------------------------------------+ - | invalid | The widget's value is invalid | - +------------+-------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++------------+-------------------------------------------------------------+ +| Flag | Description | ++============+=============================================================+ +| active | The mouse cursor is over the widget and pressing a mouse | +| | button will cause some action to occur | ++------------+-------------------------------------------------------------+ +| disabled | Widget is disabled under program control | ++------------+-------------------------------------------------------------+ +| focus | Widget has keyboard focus | ++------------+-------------------------------------------------------------+ +| pressed | Widget is being pressed | ++------------+-------------------------------------------------------------+ +| selected | "On", "true", or "current" for things like Checkbuttons and | +| | radiobuttons | ++------------+-------------------------------------------------------------+ +| background | Windows and Mac have a notion of an "active" or foreground | +| | window. The *background* state is set for widgets in a | +| | background window, and cleared for those in the foreground | +| | window | ++------------+-------------------------------------------------------------+ +| readonly | Widget should not allow user modification | ++------------+-------------------------------------------------------------+ +| alternate | A widget-specific alternate display format | ++------------+-------------------------------------------------------------+ +| invalid | The widget's value is invalid | ++------------+-------------------------------------------------------------+ A state specification is a sequence of state names, optionally prefixed with an exclamation point indicating that the bit is off. @@ -311,43 +311,43 @@ Options This widget accepts the following specific options: - .. tabularcolumns:: |l|L| - - +-----------------+--------------------------------------------------------+ - | Option | Description | - +=================+========================================================+ - | exportselection | Boolean value. If set, the widget selection is linked | - | | to the Window Manager selection (which can be returned | - | | by invoking Misc.selection_get, for example). | - +-----------------+--------------------------------------------------------+ - | justify | Specifies how the text is aligned within the widget. | - | | One of "left", "center", or "right". | - +-----------------+--------------------------------------------------------+ - | height | Specifies the height of the pop-down listbox, in rows. | - +-----------------+--------------------------------------------------------+ - | postcommand | A script (possibly registered with Misc.register) that | - | | is called immediately before displaying the values. It | - | | may specify which values to display. | - +-----------------+--------------------------------------------------------+ - | state | One of "normal", "readonly", or "disabled". In the | - | | "readonly" state, the value may not be edited directly,| - | | and the user can only selection of the values from the | - | | dropdown list. In the "normal" state, the text field is| - | | directly editable. In the "disabled" state, no | - | | interaction is possible. | - +-----------------+--------------------------------------------------------+ - | textvariable | Specifies a name whose value is linked to the widget | - | | value. Whenever the value associated with that name | - | | changes, the widget value is updated, and vice versa. | - | | See :class:`tkinter.StringVar`. | - +-----------------+--------------------------------------------------------+ - | values | Specifies the list of values to display in the | - | | drop-down listbox. | - +-----------------+--------------------------------------------------------+ - | width | Specifies an integer value indicating the desired width| - | | of the entry window, in average-size characters of the | - | | widget's font. | - +-----------------+--------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++-----------------+--------------------------------------------------------+ +| Option | Description | ++=================+========================================================+ +| exportselection | Boolean value. If set, the widget selection is linked | +| | to the Window Manager selection (which can be returned | +| | by invoking Misc.selection_get, for example). | ++-----------------+--------------------------------------------------------+ +| justify | Specifies how the text is aligned within the widget. | +| | One of "left", "center", or "right". | ++-----------------+--------------------------------------------------------+ +| height | Specifies the height of the pop-down listbox, in rows. | ++-----------------+--------------------------------------------------------+ +| postcommand | A script (possibly registered with Misc.register) that | +| | is called immediately before displaying the values. It | +| | may specify which values to display. | ++-----------------+--------------------------------------------------------+ +| state | One of "normal", "readonly", or "disabled". In the | +| | "readonly" state, the value may not be edited directly,| +| | and the user can only selection of the values from the | +| | dropdown list. In the "normal" state, the text field is| +| | directly editable. In the "disabled" state, no | +| | interaction is possible. | ++-----------------+--------------------------------------------------------+ +| textvariable | Specifies a name whose value is linked to the widget | +| | value. Whenever the value associated with that name | +| | changes, the widget value is updated, and vice versa. | +| | See :class:`tkinter.StringVar`. | ++-----------------+--------------------------------------------------------+ +| values | Specifies the list of values to display in the | +| | drop-down listbox. | ++-----------------+--------------------------------------------------------+ +| width | Specifies an integer value indicating the desired width| +| | of the entry window, in average-size characters of the | +| | widget's font. | ++-----------------+--------------------------------------------------------+ Virtual events @@ -397,7 +397,7 @@ Options This widget accepts the following specific options: - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| +----------------------+------------------------------------------------------+ | Option | Description | @@ -473,25 +473,25 @@ Options This widget accepts the following specific options: - .. tabularcolumns:: |l|L| - - +---------+----------------------------------------------------------------+ - | Option | Description | - +=========+================================================================+ - | height | If present and greater than zero, specifies the desired height | - | | of the pane area (not including internal padding or tabs). | - | | Otherwise, the maximum height of all panes is used. | - +---------+----------------------------------------------------------------+ - | padding | Specifies the amount of extra space to add around the outside | - | | of the notebook. The padding is a list up to four length | - | | specifications left top right bottom. If fewer than four | - | | elements are specified, bottom defaults to top, right defaults | - | | to left, and top defaults to left. | - +---------+----------------------------------------------------------------+ - | width | If present and greater than zero, specified the desired width | - | | of the pane area (not including internal padding). Otherwise, | - | | the maximum width of all panes is used. | - +---------+----------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++---------+----------------------------------------------------------------+ +| Option | Description | ++=========+================================================================+ +| height | If present and greater than zero, specifies the desired height | +| | of the pane area (not including internal padding or tabs). | +| | Otherwise, the maximum height of all panes is used. | ++---------+----------------------------------------------------------------+ +| padding | Specifies the amount of extra space to add around the outside | +| | of the notebook. The padding is a list up to four length | +| | specifications left top right bottom. If fewer than four | +| | elements are specified, bottom defaults to top, right defaults | +| | to left, and top defaults to left. | ++---------+----------------------------------------------------------------+ +| width | If present and greater than zero, specified the desired width | +| | of the pane area (not including internal padding). Otherwise, | +| | the maximum width of all panes is used. | ++---------+----------------------------------------------------------------+ Tab Options @@ -499,39 +499,39 @@ Tab Options There are also specific options for tabs: - .. tabularcolumns:: |l|L| - - +-----------+--------------------------------------------------------------+ - | Option | Description | - +===========+==============================================================+ - | state | Either "normal", "disabled" or "hidden". If "disabled", then | - | | the tab is not selectable. If "hidden", then the tab is not | - | | shown. | - +-----------+--------------------------------------------------------------+ - | sticky | Specifies how the child window is positioned within the pane | - | | area. Value is a string containing zero or more of the | - | | characters "n", "s", "e" or "w". Each letter refers to a | - | | side (north, south, east or west) that the child window will | - | | stick to, as per the :meth:`grid` geometry manager. | - +-----------+--------------------------------------------------------------+ - | padding | Specifies the amount of extra space to add between the | - | | notebook and this pane. Syntax is the same as for the option | - | | padding used by this widget. | - +-----------+--------------------------------------------------------------+ - | text | Specifies a text to be displayed in the tab. | - +-----------+--------------------------------------------------------------+ - | image | Specifies an image to display in the tab. See the option | - | | image described in :class:`Widget`. | - +-----------+--------------------------------------------------------------+ - | compound | Specifies how to display the image relative to the text, in | - | | the case both options text and image are present. See | - | | `Label Options`_ for legal values. | - +-----------+--------------------------------------------------------------+ - | underline | Specifies the index (0-based) of a character to underline in | - | | the text string. The underlined character is used for | - | | mnemonic activation if :meth:`Notebook.enable_traversal` is | - | | called. | - +-----------+--------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++-----------+--------------------------------------------------------------+ +| Option | Description | ++===========+==============================================================+ +| state | Either "normal", "disabled" or "hidden". If "disabled", then | +| | the tab is not selectable. If "hidden", then the tab is not | +| | shown. | ++-----------+--------------------------------------------------------------+ +| sticky | Specifies how the child window is positioned within the pane | +| | area. Value is a string containing zero or more of the | +| | characters "n", "s", "e" or "w". Each letter refers to a | +| | side (north, south, east or west) that the child window will | +| | stick to, as per the :meth:`grid` geometry manager. | ++-----------+--------------------------------------------------------------+ +| padding | Specifies the amount of extra space to add between the | +| | notebook and this pane. Syntax is the same as for the option | +| | padding used by this widget. | ++-----------+--------------------------------------------------------------+ +| text | Specifies a text to be displayed in the tab. | ++-----------+--------------------------------------------------------------+ +| image | Specifies an image to display in the tab. See the option | +| | image described in :class:`Widget`. | ++-----------+--------------------------------------------------------------+ +| compound | Specifies how to display the image relative to the text, in | +| | the case both options text and image are present. See | +| | `Label Options`_ for legal values. | ++-----------+--------------------------------------------------------------+ +| underline | Specifies the index (0-based) of a character to underline in | +| | the text string. The underlined character is used for | +| | mnemonic activation if :meth:`Notebook.enable_traversal` is | +| | called. | ++-----------+--------------------------------------------------------------+ Tab Identifiers @@ -663,36 +663,36 @@ Options This widget accepts the following specific options: - .. tabularcolumns:: |l|L| - - +----------+---------------------------------------------------------------+ - | Option | Description | - +==========+===============================================================+ - | orient | One of "horizontal" or "vertical". Specifies the orientation | - | | of the progress bar. | - +----------+---------------------------------------------------------------+ - | length | Specifies the length of the long axis of the progress bar | - | | (width if horizontal, height if vertical). | - +----------+---------------------------------------------------------------+ - | mode | One of "determinate" or "indeterminate". | - +----------+---------------------------------------------------------------+ - | maximum | A number specifying the maximum value. Defaults to 100. | - +----------+---------------------------------------------------------------+ - | value | The current value of the progress bar. In "determinate" mode, | - | | this represents the amount of work completed. In | - | | "indeterminate" mode, it is interpreted as modulo *maximum*; | - | | that is, the progress bar completes one "cycle" when its value| - | | increases by *maximum*. | - +----------+---------------------------------------------------------------+ - | variable | A name which is linked to the option value. If specified, the | - | | value of the progress bar is automatically set to the value of| - | | this name whenever the latter is modified. | - +----------+---------------------------------------------------------------+ - | phase | Read-only option. The widget periodically increments the value| - | | of this option whenever its value is greater than 0 and, in | - | | determinate mode, less than maximum. This option may be used | - | | by the current theme to provide additional animation effects. | - +----------+---------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++----------+---------------------------------------------------------------+ +| Option | Description | ++==========+===============================================================+ +| orient | One of "horizontal" or "vertical". Specifies the orientation | +| | of the progress bar. | ++----------+---------------------------------------------------------------+ +| length | Specifies the length of the long axis of the progress bar | +| | (width if horizontal, height if vertical). | ++----------+---------------------------------------------------------------+ +| mode | One of "determinate" or "indeterminate". | ++----------+---------------------------------------------------------------+ +| maximum | A number specifying the maximum value. Defaults to 100. | ++----------+---------------------------------------------------------------+ +| value | The current value of the progress bar. In "determinate" mode, | +| | this represents the amount of work completed. In | +| | "indeterminate" mode, it is interpreted as modulo *maximum*; | +| | that is, the progress bar completes one "cycle" when its value| +| | increases by *maximum*. | ++----------+---------------------------------------------------------------+ +| variable | A name which is linked to the option value. If specified, the | +| | value of the progress bar is automatically set to the value of| +| | this name whenever the latter is modified. | ++----------+---------------------------------------------------------------+ +| phase | Read-only option. The widget periodically increments the value| +| | of this option whenever its value is greater than 0 and, in | +| | determinate mode, less than maximum. This option may be used | +| | by the current theme to provide additional animation effects. | ++----------+---------------------------------------------------------------+ ttk.Progressbar @@ -734,14 +734,14 @@ Options This widget accepts the following specific option: - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - +--------+----------------------------------------------------------------+ - | Option | Description | - +========+================================================================+ - | orient | One of "horizontal" or "vertical". Specifies the orientation of| - | | the separator. | - +--------+----------------------------------------------------------------+ ++--------+----------------------------------------------------------------+ +| Option | Description | ++========+================================================================+ +| orient | One of "horizontal" or "vertical". Specifies the orientation of| +| | the separator. | ++--------+----------------------------------------------------------------+ Sizegrip @@ -802,49 +802,49 @@ Options This widget accepts the following specific options: - .. tabularcolumns:: |l|p{0.7\linewidth}| - - +----------------+--------------------------------------------------------+ - | Option | Description | - +================+========================================================+ - | columns | A list of column identifiers, specifying the number of | - | | columns and their names. | - +----------------+--------------------------------------------------------+ - | displaycolumns | A list of column identifiers (either symbolic or | - | | integer indices) specifying which data columns are | - | | displayed and the order in which they appear, or the | - | | string "#all". | - +----------------+--------------------------------------------------------+ - | height | Specifies the number of rows which should be visible. | - | | Note: the requested width is determined from the sum | - | | of the column widths. | - +----------------+--------------------------------------------------------+ - | padding | Specifies the internal padding for the widget. The | - | | padding is a list of up to four length specifications. | - +----------------+--------------------------------------------------------+ - | selectmode | Controls how the built-in class bindings manage the | - | | selection. One of "extended", "browse" or "none". | - | | If set to "extended" (the default), multiple items may | - | | be selected. If "browse", only a single item will be | - | | selected at a time. If "none", the selection will not | - | | be changed. | - | | | - | | Note that the application code and tag bindings can set| - | | the selection however they wish, regardless of the | - | | value of this option. | - +----------------+--------------------------------------------------------+ - | show | A list containing zero or more of the following values,| - | | specifying which elements of the tree to display. | - | | | - | | * tree: display tree labels in column #0. | - | | * headings: display the heading row. | - | | | - | | The default is "tree headings", i.e., show all | - | | elements. | - | | | - | | **Note**: Column #0 always refers to the tree column, | - | | even if show="tree" is not specified. | - +----------------+--------------------------------------------------------+ +.. tabularcolumns:: |l|p{0.7\linewidth}| + ++----------------+--------------------------------------------------------+ +| Option | Description | ++================+========================================================+ +| columns | A list of column identifiers, specifying the number of | +| | columns and their names. | ++----------------+--------------------------------------------------------+ +| displaycolumns | A list of column identifiers (either symbolic or | +| | integer indices) specifying which data columns are | +| | displayed and the order in which they appear, or the | +| | string "#all". | ++----------------+--------------------------------------------------------+ +| height | Specifies the number of rows which should be visible. | +| | Note: the requested width is determined from the sum | +| | of the column widths. | ++----------------+--------------------------------------------------------+ +| padding | Specifies the internal padding for the widget. The | +| | padding is a list of up to four length specifications. | ++----------------+--------------------------------------------------------+ +| selectmode | Controls how the built-in class bindings manage the | +| | selection. One of "extended", "browse" or "none". | +| | If set to "extended" (the default), multiple items may | +| | be selected. If "browse", only a single item will be | +| | selected at a time. If "none", the selection will not | +| | be changed. | +| | | +| | Note that the application code and tag bindings can set| +| | the selection however they wish, regardless of the | +| | value of this option. | ++----------------+--------------------------------------------------------+ +| show | A list containing zero or more of the following values,| +| | specifying which elements of the tree to display. | +| | | +| | * tree: display tree labels in column #0. | +| | * headings: display the heading row. | +| | | +| | The default is "tree headings", i.e., show all | +| | elements. | +| | | +| | **Note**: Column #0 always refers to the tree column, | +| | even if show="tree" is not specified. | ++----------------+--------------------------------------------------------+ Item Options @@ -853,27 +853,27 @@ Item Options The following item options may be specified for items in the insert and item widget commands. - .. tabularcolumns:: |l|L| - - +--------+---------------------------------------------------------------+ - | Option | Description | - +========+===============================================================+ - | text | The textual label to display for the item. | - +--------+---------------------------------------------------------------+ - | image | A Tk Image, displayed to the left of the label. | - +--------+---------------------------------------------------------------+ - | values | The list of values associated with the item. | - | | | - | | Each item should have the same number of values as the widget | - | | option columns. If there are fewer values than columns, the | - | | remaining values are assumed empty. If there are more values | - | | than columns, the extra values are ignored. | - +--------+---------------------------------------------------------------+ - | open | ``True``/``False`` value indicating whether the item's | - | | children should be displayed or hidden. | - +--------+---------------------------------------------------------------+ - | tags | A list of tags associated with this item. | - +--------+---------------------------------------------------------------+ +.. tabularcolumns:: |l|L| + ++--------+---------------------------------------------------------------+ +| Option | Description | ++========+===============================================================+ +| text | The textual label to display for the item. | ++--------+---------------------------------------------------------------+ +| image | A Tk Image, displayed to the left of the label. | ++--------+---------------------------------------------------------------+ +| values | The list of values associated with the item. | +| | | +| | Each item should have the same number of values as the widget | +| | option columns. If there are fewer values than columns, the | +| | remaining values are assumed empty. If there are more values | +| | than columns, the extra values are ignored. | ++--------+---------------------------------------------------------------+ +| open | ``True``/``False`` value indicating whether the item's | +| | children should be displayed or hidden. | ++--------+---------------------------------------------------------------+ +| tags | A list of tags associated with this item. | ++--------+---------------------------------------------------------------+ Tag Options @@ -881,20 +881,20 @@ Tag Options The following options may be specified on tags: - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - +------------+-----------------------------------------------------------+ - | Option | Description | - +============+===========================================================+ - | foreground | Specifies the text foreground color. | - +------------+-----------------------------------------------------------+ - | background | Specifies the cell or item background color. | - +------------+-----------------------------------------------------------+ - | font | Specifies the font to use when drawing text. | - +------------+-----------------------------------------------------------+ - | image | Specifies the item image, in case the item's image option | - | | is empty. | - +------------+-----------------------------------------------------------+ ++------------+-----------------------------------------------------------+ +| Option | Description | ++============+===========================================================+ +| foreground | Specifies the text foreground color. | ++------------+-----------------------------------------------------------+ +| background | Specifies the cell or item background color. | ++------------+-----------------------------------------------------------+ +| font | Specifies the font to use when drawing text. | ++------------+-----------------------------------------------------------+ +| image | Specifies the item image, in case the item's image option | +| | is empty. | ++------------+-----------------------------------------------------------+ Column Identifiers @@ -926,19 +926,19 @@ Virtual Events The Treeview widget generates the following virtual events. - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - +--------------------+--------------------------------------------------+ - | Event | Description | - +====================+==================================================+ - | <> | Generated whenever the selection changes. | - +--------------------+--------------------------------------------------+ - | <> | Generated just before settings the focus item to | - | | open=True. | - +--------------------+--------------------------------------------------+ - | <> | Generated just after setting the focus item to | - | | open=False. | - +--------------------+--------------------------------------------------+ ++--------------------+--------------------------------------------------+ +| Event | Description | ++====================+==================================================+ +| <> | Generated whenever the selection changes. | ++--------------------+--------------------------------------------------+ +| <> | Generated just before settings the focus item to | +| | open=True. | ++--------------------+--------------------------------------------------+ +| <> | Generated just after setting the focus item to | +| | open=False. | ++--------------------+--------------------------------------------------+ The :meth:`Treeview.focus` and :meth:`Treeview.selection` methods can be used to determine the affected item or items. @@ -986,19 +986,19 @@ ttk.Treeview The valid options/values are: - * id + *id* Returns the column name. This is a read-only option. - * anchor: One of the standard Tk anchor values. + *anchor*: One of the standard Tk anchor values. Specifies how the text in this column should be aligned with respect to the cell. - * minwidth: width + *minwidth*: width The minimum width of the column in pixels. The treeview widget will not make the column any smaller than specified by this option when the widget is resized or the user drags a column. - * stretch: ``True``/``False`` + *stretch*: ``True``/``False`` Specifies whether the column's width should be adjusted when the widget is resized. - * width: width + *width*: width The width of the column in pixels. To configure the tree column, call this with column = "#0" @@ -1041,14 +1041,14 @@ ttk.Treeview The valid options/values are: - * text: text + *text*: text The text to display in the column heading. - * image: imageName + *image*: imageName Specifies an image to display to the right of the column heading. - * anchor: anchor + *anchor*: anchor Specifies how the heading text should be aligned. One of the standard Tk anchor values. - * command: callback + *command*: callback A callback to be invoked when the heading label is pressed. To configure the tree column heading, call this with column = "#0". @@ -1118,7 +1118,7 @@ ttk.Treeview as the item identifier; *iid* must not already exist in the tree. Otherwise, a new unique identifier is generated. - See `Item Options`_ for the list of available points. + See `Item Options`_ for the list of available options. .. method:: item(item, option=None, **kw) @@ -1391,32 +1391,42 @@ option. If you don't know the class name of a widget, use the method .. method:: element_create(elementname, etype, *args, **kw) Create a new element in the current theme, of the given *etype* which is - expected to be either "image", "from" or "vsapi". The latter is only - available in Tk 8.6a for Windows XP and Vista and is not described here. + expected to be either "image", "from" or "vsapi". + The latter is only available in Tk 8.6 on Windows. If "image" is used, *args* should contain the default image name followed by statespec/value pairs (this is the imagespec), and *kw* may have the following options: - * border=padding - padding is a list of up to four integers, specifying the left, top, - right, and bottom borders, respectively. + border=padding + padding is a list of up to four integers, specifying the left, top, + right, and bottom borders, respectively. - * height=height - Specifies a minimum height for the element. If less than zero, the - base image's height is used as a default. + height=height + Specifies a minimum height for the element. If less than zero, the + base image's height is used as a default. - * padding=padding - Specifies the element's interior padding. Defaults to border's value - if not specified. + padding=padding + Specifies the element's interior padding. Defaults to border's value + if not specified. - * sticky=spec - Specifies how the image is placed within the final parcel. spec - contains zero or more characters "n", "s", "w", or "e". + sticky=spec + Specifies how the image is placed within the final parcel. spec + contains zero or more characters "n", "s", "w", or "e". - * width=width - Specifies a minimum width for the element. If less than zero, the - base image's width is used as a default. + width=width + Specifies a minimum width for the element. If less than zero, the + base image's width is used as a default. + + Example:: + + img1 = tkinter.PhotoImage(master=root, file='button.png') + img1 = tkinter.PhotoImage(master=root, file='button-pressed.png') + img1 = tkinter.PhotoImage(master=root, file='button-active.png') + style = ttk.Style(root) + style.element_create('Button.button', 'image', + img1, ('pressed', img2), ('active', img3), + border=(2, 4), sticky='we') If "from" is used as the value of *etype*, :meth:`element_create` will clone an existing @@ -1425,6 +1435,68 @@ option. If you don't know the class name of a widget, use the method If this element to clone from is not specified, an empty element will be used. *kw* is discarded. + Example:: + + style = ttk.Style(root) + style.element_create('plain.background', 'from', 'default') + + If "vsapi" is used as the value of *etype*, :meth:`element_create` + will create a new element in the current theme whose visual appearance + is drawn using the Microsoft Visual Styles API which is responsible + for the themed styles on Windows XP and Vista. + *args* is expected to contain the Visual Styles class and part as + given in the Microsoft documentation followed by an optional sequence + of tuples of ttk states and the corresponding Visual Styles API state + value. + *kw* may have the following options: + + padding=padding + Specify the element's interior padding. + *padding* is a list of up to four integers specifying the left, + top, right and bottom padding quantities respectively. + If fewer than four elements are specified, bottom defaults to top, + right defaults to left, and top defaults to left. + In other words, a list of three numbers specify the left, vertical, + and right padding; a list of two numbers specify the horizontal + and the vertical padding; a single number specifies the same + padding all the way around the widget. + This option may not be mixed with any other options. + + margins=padding + Specifies the elements exterior padding. + *padding* is a list of up to four integers specifying the left, top, + right and bottom padding quantities respectively. + This option may not be mixed with any other options. + + width=width + Specifies the width for the element. + If this option is set then the Visual Styles API will not be queried + for the recommended size or the part. + If this option is set then *height* should also be set. + The *width* and *height* options cannot be mixed with the *padding* + or *margins* options. + + height=height + Specifies the height of the element. + See the comments for *width*. + + Example:: + + style = ttk.Style(root) + style.element_create('pin', 'vsapi', 'EXPLORERBAR', 3, [ + ('pressed', '!selected', 3), + ('active', '!selected', 2), + ('pressed', 'selected', 6), + ('active', 'selected', 5), + ('selected', 4), + ('', 1)]) + style.layout('Explorer.Pin', + [('Explorer.Pin.pin', {'sticky': 'news'})]) + pin = ttk.Checkbutton(style='Explorer.Pin') + pin.pack(expand=True, fill='both') + + .. versionchanged:: 3.13 + Added support of the "vsapi" element factory. .. method:: element_names() @@ -1501,25 +1573,26 @@ Layouts A layout can be just ``None``, if it takes no options, or a dict of options specifying how to arrange the element. The layout mechanism uses a simplified version of the pack geometry manager: given an -initial cavity, each element is allocated a parcel. Valid -options/values are: - - * side: whichside - Specifies which side of the cavity to place the element; one of - top, right, bottom or left. If omitted, the element occupies the - entire cavity. - - * sticky: nswe - Specifies where the element is placed inside its allocated parcel. - - * unit: 0 or 1 - If set to 1, causes the element and all of its descendants to be treated as - a single element for the purposes of :meth:`Widget.identify` et al. It's - used for things like scrollbar thumbs with grips. - - * children: [sublayout... ] - Specifies a list of elements to place inside the element. Each - element is a tuple (or other sequence type) where the first item is - the layout name, and the other is a `Layout`_. +initial cavity, each element is allocated a parcel. + +The valid options/values are: + +*side*: whichside + Specifies which side of the cavity to place the element; one of + top, right, bottom or left. If omitted, the element occupies the + entire cavity. + +*sticky*: nswe + Specifies where the element is placed inside its allocated parcel. + +*unit*: 0 or 1 + If set to 1, causes the element and all of its descendants to be treated as + a single element for the purposes of :meth:`Widget.identify` et al. It's + used for things like scrollbar thumbs with grips. + +*children*: [sublayout... ] + Specifies a list of elements to place inside the element. Each + element is a tuple (or other sequence type) where the first item is + the layout name, and the other is a `Layout`_. .. _Layout: `Layouts`_ diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index e885de88..39df2927 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -207,10 +207,6 @@ .. data:: OP -.. data:: AWAIT - -.. data:: ASYNC - .. data:: TYPE_IGNORE .. data:: TYPE_COMMENT diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 903847bb..40982f32 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -1,5 +1,5 @@ -:mod:`token` --- Constants used with Python parse trees -======================================================= +:mod:`!token` --- Constants used with Python parse trees +======================================================== .. module:: token :synopsis: Constants representing terminal nodes of the parse tree. @@ -75,22 +75,33 @@ the :mod:`tokenize` module. :noindex: Token value indicating that a type comment was recognized. Such - tokens are only produced when :func:`ast.parse()` is invoked with + tokens are only produced when :func:`ast.parse` is invoked with ``type_comments=True``. +.. data:: EXACT_TOKEN_TYPES + + A dictionary mapping the string representation of a token to its numeric code. + + .. versionadded:: 3.8 + + .. versionchanged:: 3.5 - Added :data:`AWAIT` and :data:`ASYNC` tokens. + Added :data:`!AWAIT` and :data:`!ASYNC` tokens. .. versionchanged:: 3.7 Added :data:`COMMENT`, :data:`NL` and :data:`ENCODING` tokens. .. versionchanged:: 3.7 - Removed :data:`AWAIT` and :data:`ASYNC` tokens. "async" and "await" are + Removed :data:`!AWAIT` and :data:`!ASYNC` tokens. "async" and "await" are now tokenized as :data:`NAME` tokens. .. versionchanged:: 3.8 Added :data:`TYPE_COMMENT`, :data:`TYPE_IGNORE`, :data:`COLONEQUAL`. - Added :data:`AWAIT` and :data:`ASYNC` tokens back (they're needed + Added :data:`!AWAIT` and :data:`!ASYNC` tokens back (they're needed to support parsing older Python versions for :func:`ast.parse` with ``feature_version`` set to 6 or lower). + +.. versionchanged:: 3.13 + Removed :data:`!AWAIT` and :data:`!ASYNC` tokens again. + diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index bffe9300..f719319a 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -1,5 +1,5 @@ -:mod:`tokenize` --- Tokenizer for Python source -=============================================== +:mod:`!tokenize` --- Tokenizer for Python source +================================================ .. module:: tokenize :synopsis: Lexical scanner for Python source code. @@ -166,11 +166,11 @@ The following options are accepted: .. program:: tokenize -.. cmdoption:: -h, --help +.. option:: -h, --help show this help message and exit -.. cmdoption:: -e, --exact +.. option:: -e, --exact display token names using the exact type diff --git a/Doc/library/tomllib.rst b/Doc/library/tomllib.rst index 918576eb..521a7a17 100644 --- a/Doc/library/tomllib.rst +++ b/Doc/library/tomllib.rst @@ -1,5 +1,5 @@ -:mod:`tomllib` --- Parse TOML files -=================================== +:mod:`!tomllib` --- Parse TOML files +==================================== .. module:: tomllib :synopsis: Parse TOML files. @@ -13,20 +13,20 @@ -------------- -This module provides an interface for parsing TOML (Tom's Obvious Minimal +This module provides an interface for parsing TOML 1.0.0 (Tom's Obvious Minimal Language, `https://toml.io `_). This module does not support writing TOML. .. seealso:: - The `Tomli-W package `__ + The :pypi:`Tomli-W package ` is a TOML writer that can be used in conjunction with this module, providing a write API familiar to users of the standard library :mod:`marshal` and :mod:`pickle` modules. .. seealso:: - The `TOML Kit package `__ + The :pypi:`TOML Kit package ` is a style-preserving TOML library with both read and write capability. It is a recommended replacement for this module for editing already existing TOML files. @@ -95,7 +95,7 @@ Conversion Table +------------------+--------------------------------------------------------------------------------------+ | TOML | Python | +==================+======================================================================================+ -| table | dict | +| TOML document | dict | +------------------+--------------------------------------------------------------------------------------+ | string | str | +------------------+--------------------------------------------------------------------------------------+ @@ -115,3 +115,9 @@ Conversion Table +------------------+--------------------------------------------------------------------------------------+ | array | list | +------------------+--------------------------------------------------------------------------------------+ +| table | dict | ++------------------+--------------------------------------------------------------------------------------+ +| inline table | dict | ++------------------+--------------------------------------------------------------------------------------+ +| array of tables | list of dicts | ++------------------+--------------------------------------------------------------------------------------+ diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index 40cf198f..cae94ea0 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -1,5 +1,5 @@ -:mod:`trace` --- Trace or track Python statement execution -========================================================== +:mod:`!trace` --- Trace or track Python statement execution +=========================================================== .. module:: trace :synopsis: Trace or track Python statement execution. @@ -34,11 +34,11 @@ all Python modules imported during the execution into the current directory. .. program:: trace -.. cmdoption:: --help +.. option:: --help Display usage and exit. -.. cmdoption:: --version +.. option:: --version Display the version of the module and exit. @@ -56,28 +56,28 @@ the :option:`--trace <-t>` and :option:`--count <-c>` options. When .. program:: trace -.. cmdoption:: -c, --count +.. option:: -c, --count Produce a set of annotated listing files upon program completion that shows how many times each statement was executed. See also :option:`--coverdir <-C>`, :option:`--file <-f>` and :option:`--no-report <-R>` below. -.. cmdoption:: -t, --trace +.. option:: -t, --trace Display lines as they are executed. -.. cmdoption:: -l, --listfuncs +.. option:: -l, --listfuncs Display the functions executed by running the program. -.. cmdoption:: -r, --report +.. option:: -r, --report Produce an annotated list from an earlier program run that used the :option:`--count <-c>` and :option:`--file <-f>` option. This does not execute any code. -.. cmdoption:: -T, --trackcalls +.. option:: -T, --trackcalls Display the calling relationships exposed by running the program. @@ -86,33 +86,33 @@ Modifiers .. program:: trace -.. cmdoption:: -f, --file= +.. option:: -f, --file= Name of a file to accumulate counts over several tracing runs. Should be used with the :option:`--count <-c>` option. -.. cmdoption:: -C, --coverdir=

+.. option:: -C, --coverdir= Directory where the report files go. The coverage report for ``package.module`` is written to file :file:`{dir}/{package}/{module}.cover`. -.. cmdoption:: -m, --missing +.. option:: -m, --missing When generating annotated listings, mark lines which were not executed with ``>>>>>>``. -.. cmdoption:: -s, --summary +.. option:: -s, --summary When using :option:`--count <-c>` or :option:`--report <-r>`, write a brief summary to stdout for each file processed. -.. cmdoption:: -R, --no-report +.. option:: -R, --no-report Do not generate annotated listings. This is useful if you intend to make several runs with :option:`--count <-c>`, and then produce a single set of annotated listings at the end. -.. cmdoption:: -g, --timing +.. option:: -g, --timing Prefix each line with the time since the program started. Only used while tracing. @@ -124,12 +124,12 @@ These options may be repeated multiple times. .. program:: trace -.. cmdoption:: --ignore-module= +.. option:: --ignore-module= Ignore each of the given module names and its submodules (if it is a package). The argument can be a list of names separated by a comma. -.. cmdoption:: --ignore-dir= +.. option:: --ignore-dir= Ignore all modules and packages in the named directory and subdirectories. The argument can be a list of directories separated by :data:`os.pathsep`. @@ -187,7 +187,8 @@ Programmatic Interface Merge in data from another :class:`CoverageResults` object. - .. method:: write_results(show_missing=True, summary=False, coverdir=None) + .. method:: write_results(show_missing=True, summary=False, coverdir=None,\ + *, ignore_missing_files=False) Write coverage results. Set *show_missing* to show lines that had no hits. Set *summary* to include in the output the coverage summary per @@ -195,6 +196,13 @@ Programmatic Interface result files will be output. If ``None``, the results for each source file are placed in its directory. + If *ignore_missing_files* is ``True``, coverage counts for files that no + longer exist are silently ignored. Otherwise, a missing file will + raise a :exc:`FileNotFoundError`. + + .. versionchanged:: 3.13 + Added *ignore_missing_files* parameter. + A simple example demonstrating the use of the programmatic interface:: import sys diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 55ac361b..100a92b7 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -1,5 +1,5 @@ -:mod:`traceback` --- Print or retrieve a stack traceback -======================================================== +:mod:`!traceback` --- Print or retrieve a stack traceback +========================================================= .. module:: traceback :synopsis: Print or retrieve a stack traceback. @@ -8,16 +8,22 @@ -------------- -This module provides a standard interface to extract, format and print stack -traces of Python programs. It exactly mimics the behavior of the Python -interpreter when it prints a stack trace. This is useful when you want to print -stack traces under program control, such as in a "wrapper" around the -interpreter. +This module provides a standard interface to extract, format and print +stack traces of Python programs. It is more flexible than the +interpreter's default traceback display, and therefore makes it +possible to configure certain aspects of the output. Finally, +it contains a utility for capturing enough information about an +exception to print it later, without the need to save a reference +to the actual exception. Since exceptions can be the roots of large +objects graph, this utility can significantly improve +memory management. .. index:: pair: object; traceback -The module uses traceback objects --- these are objects of type :class:`types.TracebackType`, -which are assigned to the ``__traceback__`` field of :class:`BaseException` instances. +The module uses :ref:`traceback objects ` --- these are +objects of type :class:`types.TracebackType`, +which are assigned to the :attr:`~BaseException.__traceback__` field of +:class:`BaseException` instances. .. seealso:: @@ -27,17 +33,40 @@ which are assigned to the ``__traceback__`` field of :class:`BaseException` inst Module :mod:`pdb` Interactive source code debugger for Python programs. -The module defines the following functions: +The module's API can be divided into two parts: + +* Module-level functions offering basic functionality, which are useful for interactive + inspection of exceptions and tracebacks. + +* :class:`TracebackException` class and its helper classes + :class:`StackSummary` and :class:`FrameSummary`. These offer both more + flexibility in the output generated and the ability to store the information + necessary for later formatting without holding references to actual exception + and traceback objects. + + +Module-Level Functions +---------------------- .. function:: print_tb(tb, limit=None, file=None) - Print up to *limit* stack trace entries from traceback object *tb* (starting + Print up to *limit* stack trace entries from + :ref:`traceback object ` *tb* (starting from the caller's frame) if *limit* is positive. Otherwise, print the last ``abs(limit)`` entries. If *limit* is omitted or ``None``, all entries are printed. If *file* is omitted or ``None``, the output goes to - ``sys.stderr``; otherwise it should be an open file or file-like object to + :data:`sys.stderr`; otherwise it should be an open + :term:`file ` or :term:`file-like object` to receive the output. + .. note:: + + The meaning of the *limit* parameter is different than the meaning + of :const:`sys.tracebacklimit`. A negative *limit* value corresponds to + a positive value of :const:`!sys.tracebacklimit`, whereas the behaviour of + a positive *limit* value cannot be achieved with + :const:`!sys.tracebacklimit`. + .. versionchanged:: 3.5 Added negative *limit* support. @@ -45,7 +74,8 @@ The module defines the following functions: .. function:: print_exception(exc, /[, value, tb], limit=None, \ file=None, chain=True) - Print exception information and stack trace entries from traceback object + Print exception information and stack trace entries from + :ref:`traceback object ` *tb* to *file*. This differs from :func:`print_tb` in the following ways: @@ -66,7 +96,8 @@ The module defines the following functions: The optional *limit* argument has the same meaning as for :func:`print_tb`. If *chain* is true (the default), then chained exceptions (the - :attr:`__cause__` or :attr:`__context__` attributes of the exception) will be + :attr:`~BaseException.__cause__` or :attr:`~BaseException.__context__` + attributes of the exception) will be printed as well, like the interpreter itself does when printing an unhandled exception. @@ -96,7 +127,8 @@ The module defines the following functions: Print up to *limit* stack trace entries (starting from the invocation point) if *limit* is positive. Otherwise, print the last ``abs(limit)`` entries. If *limit* is omitted or ``None``, all entries are printed. - The optional *f* argument can be used to specify an alternate stack frame + The optional *f* argument can be used to specify an alternate + :ref:`stack frame ` to start. The optional *file* argument has the same meaning as for :func:`print_tb`. @@ -107,20 +139,20 @@ The module defines the following functions: .. function:: extract_tb(tb, limit=None) Return a :class:`StackSummary` object representing a list of "pre-processed" - stack trace entries extracted from the traceback object *tb*. It is useful + stack trace entries extracted from the + :ref:`traceback object ` *tb*. It is useful for alternate formatting of stack traces. The optional *limit* argument has the same meaning as for :func:`print_tb`. A "pre-processed" stack trace entry is a :class:`FrameSummary` object containing attributes :attr:`~FrameSummary.filename`, :attr:`~FrameSummary.lineno`, :attr:`~FrameSummary.name`, and :attr:`~FrameSummary.line` representing the - information that is usually printed for a stack trace. The - :attr:`~FrameSummary.line` is a string with leading and trailing - whitespace stripped; if the source is not available it is ``None``. + information that is usually printed for a stack trace. .. function:: extract_stack(f=None, limit=None) - Extract the raw traceback from the current stack frame. The return value has + Extract the raw traceback from the current + :ref:`stack frame `. The return value has the same format as for :func:`extract_tb`. The optional *f* and *limit* arguments have the same meaning as for :func:`print_stack`. @@ -135,10 +167,10 @@ The module defines the following functions: text line is not ``None``. -.. function:: format_exception_only(exc, /[, value]) +.. function:: format_exception_only(exc, /[, value], *, show_group=False) Format the exception part of a traceback using an exception value such as - given by ``sys.last_value``. The return value is a list of strings, each + given by :data:`sys.last_value`. The return value is a list of strings, each ending in a newline. The list contains the exception's message, which is normally a single string; however, for :exc:`SyntaxError` exceptions, it contains several lines that (when printed) display detailed information @@ -149,12 +181,20 @@ The module defines the following functions: can be passed as the first argument. If *value* is provided, the first argument is ignored in order to provide backwards compatibility. + When *show_group* is ``True``, and the exception is an instance of + :exc:`BaseExceptionGroup`, the nested exceptions are included as + well, recursively, with indentation relative to their nesting depth. + .. versionchanged:: 3.10 The *etype* parameter has been renamed to *exc* and is now positional-only. .. versionchanged:: 3.11 - The returned list now includes any notes attached to the exception. + The returned list now includes any + :attr:`notes ` attached to the exception. + + .. versionchanged:: 3.13 + *show_group* parameter was added. .. function:: format_exception(exc, /[, value, tb], limit=None, chain=True) @@ -190,14 +230,17 @@ The module defines the following functions: .. function:: clear_frames(tb) - Clears the local variables of all the stack frames in a traceback *tb* - by calling the :meth:`clear` method of each frame object. + Clears the local variables of all the stack frames in a + :ref:`traceback ` *tb* + by calling the :meth:`~frame.clear` method of each + :ref:`frame object `. .. versionadded:: 3.4 .. function:: walk_stack(f) - Walk a stack following ``f.f_back`` from the given frame, yielding the frame + Walk a stack following :attr:`f.f_back ` from the given frame, + yielding the frame and line number for each frame. If *f* is ``None``, the current stack is used. This helper is used with :meth:`StackSummary.extract`. @@ -205,30 +248,36 @@ The module defines the following functions: .. function:: walk_tb(tb) - Walk a traceback following ``tb_next`` yielding the frame and line number + Walk a traceback following :attr:`~traceback.tb_next` yielding the frame and + line number for each frame. This helper is used with :meth:`StackSummary.extract`. .. versionadded:: 3.5 -The module also defines the following classes: -:class:`TracebackException` Objects ------------------------------------ +:class:`!TracebackException` Objects +------------------------------------ .. versionadded:: 3.5 -:class:`TracebackException` objects are created from actual exceptions to -capture data for later printing in a lightweight fashion. +:class:`!TracebackException` objects are created from actual exceptions to +capture data for later printing. They offer a more lightweight method of +storing this information by avoiding holding references to +:ref:`traceback` and :ref:`frame` objects +In addition, they expose more options to configure the output compared to +the module-level functions described above. .. class:: TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10) - Capture an exception for later rendering. *limit*, *lookup_lines* and - *capture_locals* are as for the :class:`StackSummary` class. + Capture an exception for later rendering. The meaning of *limit*, + *lookup_lines* and *capture_locals* are as for the :class:`StackSummary` + class. - If *compact* is true, only data that is required by :class:`TracebackException`'s - ``format`` method is saved in the class attributes. In particular, the - ``__context__`` field is calculated only if ``__cause__`` is ``None`` and - ``__suppress_context__`` is false. + If *compact* is true, only data that is required by + :class:`!TracebackException`'s :meth:`format` method + is saved in the class attributes. In particular, the + :attr:`__context__` field is calculated only if :attr:`__cause__` is + ``None`` and :attr:`__suppress_context__` is false. Note that when locals are captured, they are also shown in the traceback. @@ -246,27 +295,31 @@ capture data for later printing in a lightweight fashion. .. attribute:: __cause__ - A :class:`TracebackException` of the original ``__cause__``. + A :class:`!TracebackException` of the original + :attr:`~BaseException.__cause__`. .. attribute:: __context__ - A :class:`TracebackException` of the original ``__context__``. + A :class:`!TracebackException` of the original + :attr:`~BaseException.__context__`. .. attribute:: exceptions If ``self`` represents an :exc:`ExceptionGroup`, this field holds a list of - :class:`TracebackException` instances representing the nested exceptions. + :class:`!TracebackException` instances representing the nested exceptions. Otherwise it is ``None``. .. versionadded:: 3.11 .. attribute:: __suppress_context__ - The ``__suppress_context__`` value from the original exception. + The :attr:`~BaseException.__suppress_context__` value from the original + exception. .. attribute:: __notes__ - The ``__notes__`` value from the original exception, or ``None`` + The :attr:`~BaseException.__notes__` value from the original exception, + or ``None`` if the exception does not have any notes. If it is not ``None`` is it formatted in the traceback after the exception string. @@ -280,6 +333,14 @@ capture data for later printing in a lightweight fashion. The class of the original traceback. + .. deprecated:: 3.13 + + .. attribute:: exc_type_str + + String display of the class of the original exception. + + .. versionadded:: 3.13 + .. attribute:: filename For syntax errors - the file name where the error occurred. @@ -332,51 +393,58 @@ capture data for later printing in a lightweight fashion. Format the exception. - If *chain* is not ``True``, ``__cause__`` and ``__context__`` will not - be formatted. + If *chain* is not ``True``, :attr:`__cause__` and :attr:`__context__` + will not be formatted. The return value is a generator of strings, each ending in a newline and some containing internal newlines. :func:`~traceback.print_exception` is a wrapper around this method which just prints the lines to a file. - .. method:: format_exception_only() + .. method:: format_exception_only(*, show_group=False) Format the exception part of the traceback. The return value is a generator of strings, each ending in a newline. - The generator emits the exception's message followed by its notes - (if it has any). The exception message is normally a single string; - however, for :exc:`SyntaxError` exceptions, it consists of several - lines that (when printed) display detailed information about where - the syntax error occurred. + When *show_group* is ``False``, the generator emits the exception's + message followed by its notes (if it has any). The exception message + is normally a single string; however, for :exc:`SyntaxError` exceptions, + it consists of several lines that (when printed) display detailed + information about where the syntax error occurred. + + When *show_group* is ``True``, and the exception is an instance of + :exc:`BaseExceptionGroup`, the nested exceptions are included as + well, recursively, with indentation relative to their nesting depth. .. versionchanged:: 3.11 - The exception's notes are now included in the output. + The exception's :attr:`notes ` are now + included in the output. + .. versionchanged:: 3.13 + Added the *show_group* parameter. -:class:`StackSummary` Objects ------------------------------ +:class:`!StackSummary` Objects +------------------------------ .. versionadded:: 3.5 -:class:`StackSummary` objects represent a call stack ready for formatting. +:class:`!StackSummary` objects represent a call stack ready for formatting. .. class:: StackSummary .. classmethod:: extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False) - Construct a :class:`StackSummary` object from a frame generator (such as + Construct a :class:`!StackSummary` object from a frame generator (such as is returned by :func:`~traceback.walk_stack` or :func:`~traceback.walk_tb`). If *limit* is supplied, only this many frames are taken from *frame_gen*. If *lookup_lines* is ``False``, the returned :class:`FrameSummary` objects will not have read their lines in yet, making the cost of - creating the :class:`StackSummary` cheaper (which may be valuable if it + creating the :class:`!StackSummary` cheaper (which may be valuable if it may not actually get formatted). If *capture_locals* is ``True`` the - local variables in each :class:`FrameSummary` are captured as object + local variables in each :class:`!FrameSummary` are captured as object representations. .. versionchanged:: 3.12 @@ -385,14 +453,16 @@ capture data for later printing in a lightweight fashion. .. classmethod:: from_list(a_list) - Construct a :class:`StackSummary` object from a supplied list of + Construct a :class:`!StackSummary` object from a supplied list of :class:`FrameSummary` objects or old-style list of tuples. Each tuple - should be a 4-tuple with filename, lineno, name, line as the elements. + should be a 4-tuple with *filename*, *lineno*, *name*, *line* as the + elements. .. method:: format() Returns a list of strings ready for printing. Each string in the - resulting list corresponds to a single frame from the stack. + resulting list corresponds to a single :ref:`frame ` from + the stack. Each string ends in a newline; the strings may contain internal newlines as well, for those items with source text lines. @@ -405,7 +475,8 @@ capture data for later printing in a lightweight fashion. .. method:: format_frame_summary(frame_summary) - Returns a string for printing one of the frames involved in the stack. + Returns a string for printing one of the :ref:`frames ` + involved in the stack. This method is called for each :class:`FrameSummary` object to be printed by :meth:`StackSummary.format`. If it returns ``None``, the frame is omitted from the output. @@ -413,29 +484,54 @@ capture data for later printing in a lightweight fashion. .. versionadded:: 3.11 -:class:`FrameSummary` Objects ------------------------------ +:class:`!FrameSummary` Objects +------------------------------ .. versionadded:: 3.5 -A :class:`FrameSummary` object represents a single frame in a traceback. +A :class:`!FrameSummary` object represents a single :ref:`frame ` +in a :ref:`traceback `. .. class:: FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None) - Represent a single frame in the traceback or stack that is being formatted - or printed. It may optionally have a stringified version of the frames + Represents a single :ref:`frame ` in the + :ref:`traceback ` or stack that is being formatted + or printed. It may optionally have a stringified version of the frame's locals included in it. If *lookup_line* is ``False``, the source code is not - looked up until the :class:`FrameSummary` has the :attr:`~FrameSummary.line` - attribute accessed (which also happens when casting it to a tuple). + looked up until the :class:`!FrameSummary` has the :attr:`~FrameSummary.line` + attribute accessed (which also happens when casting it to a :class:`tuple`). :attr:`~FrameSummary.line` may be directly provided, and will prevent line lookups happening at all. *locals* is an optional local variable - dictionary, and if supplied the variable representations are stored in the + mapping, and if supplied the variable representations are stored in the summary for later display. + :class:`!FrameSummary` instances have the following attributes: + + .. attribute:: FrameSummary.filename + + The filename of the source code for this frame. Equivalent to accessing + :attr:`f.f_code.co_filename ` on a + :ref:`frame object ` *f*. + + .. attribute:: FrameSummary.lineno + + The line number of the source code for this frame. + + .. attribute:: FrameSummary.name + + Equivalent to accessing :attr:`f.f_code.co_name ` on + a :ref:`frame object ` *f*. + + .. attribute:: FrameSummary.line + + A string representing the source code for this frame, with leading and + trailing whitespace stripped. + If the source is not available, it is ``None``. + .. _traceback-example: -Traceback Examples ------------------- +Examples of Using the Module-Level Functions +-------------------------------------------- This simple example implements a basic read-eval-print loop, similar to (but less useful than) the standard Python interactive interpreter loop. For a more @@ -474,8 +570,7 @@ exception and traceback: try: lumberjack() - except IndexError: - exc = sys.exception() + except IndexError as exc: print("*** print_tb:") traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout) print("*** print_exception:") @@ -502,27 +597,32 @@ The output for the example would look similar to this: *** print_tb: File "", line 10, in lumberjack() + ~~~~~~~~~~^^ *** print_exception: Traceback (most recent call last): File "", line 10, in lumberjack() + ~~~~~~~~~~^^ File "", line 4, in lumberjack bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ IndexError: tuple index out of range *** print_exc: Traceback (most recent call last): File "", line 10, in lumberjack() + ~~~~~~~~~~^^ File "", line 4, in lumberjack bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ IndexError: tuple index out of range *** format_exc, first and last line: Traceback (most recent call last): IndexError: tuple index out of range *** format_exception: ['Traceback (most recent call last):\n', - ' File "", line 10, in \n lumberjack()\n', - ' File "", line 4, in lumberjack\n bright_side_of_life()\n', + ' File "", line 10, in \n lumberjack()\n ~~~~~~~~~~^^\n', + ' File "", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n', ' File "", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n', 'IndexError: tuple index out of range\n'] *** extract_tb: @@ -530,8 +630,8 @@ The output for the example would look similar to this: , line 4 in lumberjack>, , line 7 in bright_side_of_life>] *** format_tb: - [' File "", line 10, in \n lumberjack()\n', - ' File "", line 4, in lumberjack\n bright_side_of_life()\n', + [' File "", line 10, in \n lumberjack()\n ~~~~~~~~~~^^\n', + ' File "", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n', ' File "", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n'] *** tb_lineno: 10 @@ -573,5 +673,88 @@ This last example demonstrates the final few formatting functions: [' File "spam.py", line 3, in \n spam.eggs()\n', ' File "eggs.py", line 42, in eggs\n return "bacon"\n'] >>> an_error = IndexError('tuple index out of range') - >>> traceback.format_exception_only(type(an_error), an_error) + >>> traceback.format_exception_only(an_error) ['IndexError: tuple index out of range\n'] + + +Examples of Using :class:`TracebackException` +--------------------------------------------- + +With the helper class, we have more options:: + + >>> import sys + >>> from traceback import TracebackException + >>> + >>> def lumberjack(): + ... bright_side_of_life() + ... + >>> def bright_side_of_life(): + ... t = "bright", "side", "of", "life" + ... return t[5] + ... + >>> try: + ... lumberjack() + ... except IndexError as e: + ... exc = e + ... + >>> try: + ... try: + ... lumberjack() + ... except: + ... 1/0 + ... except Exception as e: + ... chained_exc = e + ... + >>> # limit works as with the module-level functions + >>> TracebackException.from_exception(exc, limit=-2).print() + Traceback (most recent call last): + File "", line 6, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 10, in bright_side_of_life + return t[5] + ~^^^ + IndexError: tuple index out of range + + >>> # capture_locals adds local variables in frames + >>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print() + Traceback (most recent call last): + File "", line 6, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 10, in bright_side_of_life + return t[5] + ~^^^ + t = ("bright", "side", "of", "life") + IndexError: tuple index out of range + + >>> # The *chain* kwarg to print() controls whether chained + >>> # exceptions are displayed + >>> TracebackException.from_exception(chained_exc).print() + Traceback (most recent call last): + File "", line 4, in + lumberjack() + ~~~~~~~~~~^^ + File "", line 7, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 11, in bright_side_of_life + return t[5] + ~^^^ + IndexError: tuple index out of range + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "", line 6, in + 1/0 + ~^~ + ZeroDivisionError: division by zero + + >>> TracebackException.from_exception(chained_exc).print(chain=False) + Traceback (most recent call last): + File "", line 6, in + 1/0 + ~^~ + ZeroDivisionError: division by zero + diff --git a/Doc/library/tracemalloc.rst b/Doc/library/tracemalloc.rst index 68432aea..2370d927 100644 --- a/Doc/library/tracemalloc.rst +++ b/Doc/library/tracemalloc.rst @@ -1,5 +1,5 @@ -:mod:`tracemalloc` --- Trace memory allocations -=============================================== +:mod:`!tracemalloc` --- Trace memory allocations +================================================ .. module:: tracemalloc :synopsis: Trace memory allocations. diff --git a/Doc/library/tty.rst b/Doc/library/tty.rst index fc7f98c7..37778bf2 100644 --- a/Doc/library/tty.rst +++ b/Doc/library/tty.rst @@ -1,5 +1,5 @@ -:mod:`tty` --- Terminal control functions -========================================= +:mod:`!tty` --- Terminal control functions +========================================== .. module:: tty :platform: Unix @@ -15,6 +15,8 @@ The :mod:`tty` module defines functions for putting the tty into cbreak and raw modes. +.. availability:: Unix. + Because it requires the :mod:`termios` module, it will work only on Unix. The :mod:`tty` module defines the following functions: @@ -33,8 +35,15 @@ The :mod:`tty` module defines the following functions: Convert the tty attribute list *mode*, which is a list like the one returned by :func:`termios.tcgetattr`, to that of a tty in cbreak mode. + This clears the ``ECHO`` and ``ICANON`` local mode flags in *mode* as well + as setting the minimum input to 1 byte with no delay. + .. versionadded:: 3.12 + .. versionchanged:: 3.12.2 + The ``ICRNL`` flag is no longer cleared. This matches Linux and macOS + ``stty cbreak`` behavior and what :func:`setcbreak` historically did. + .. function:: setraw(fd, when=termios.TCSAFLUSH) @@ -43,6 +52,9 @@ The :mod:`tty` module defines the following functions: :func:`termios.tcsetattr`. The return value of :func:`termios.tcgetattr` is saved before setting *fd* to raw mode; this value is returned. + .. versionchanged:: 3.12 + The return value is now the original tty attributes, instead of ``None``. + .. function:: setcbreak(fd, when=termios.TCSAFLUSH) @@ -51,6 +63,17 @@ The :mod:`tty` module defines the following functions: :func:`termios.tcsetattr`. The return value of :func:`termios.tcgetattr` is saved before setting *fd* to cbreak mode; this value is returned. + This clears the ``ECHO`` and ``ICANON`` local mode flags as well as setting + the minimum input to 1 byte with no delay. + + .. versionchanged:: 3.12 + The return value is now the original tty attributes, instead of ``None``. + + .. versionchanged:: 3.12.2 + The ``ICRNL`` flag is no longer cleared. This restores the behavior + of Python 3.11 and earlier as well as matching what Linux, macOS, & BSDs + describe in their ``stty(1)`` man pages regarding cbreak mode. + .. seealso:: diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 4e1a0948..afda3685 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -24,6 +24,15 @@ introduced in Logo `_, developed by Wally Feurzeig, Seymour Papert and Cynthia Solomon in 1967. + +Get started +=========== + +Imagine a robotic turtle starting at (0, 0) in the x-y plane. After an ``import turtle``, give it the +command ``turtle.forward(15)``, and it moves (on-screen!) 15 pixels in the +direction it is facing, drawing a line as it moves. Give it the command +``turtle.right(25)``, and it rotates in-place 25 degrees clockwise. + .. sidebar:: Turtle star Turtle can draw intricate shapes using programs that repeat simple @@ -111,7 +120,7 @@ off-screen):: home() The home position is at the center of the turtle's screen. If you ever need to -know them, get the turtle's x-y co-ordinates with:: +know them, get the turtle's x-y coordinates with:: pos() @@ -356,7 +365,6 @@ Turtle state | :func:`resizemode` | :func:`shapesize` | :func:`turtlesize` | :func:`shearfactor` - | :func:`settiltangle` | :func:`tiltangle` | :func:`tilt` | :func:`shapetransform` @@ -598,7 +606,7 @@ Turtle motion >>> turtle.pos() (20.00,30.00) - .. versionadded: 3.12 + .. versionadded:: 3.12 .. function:: setx(x) @@ -1491,28 +1499,6 @@ Appearance >>> turtle.fd(50) -.. function:: settiltangle(angle) - - :param angle: a number - - Rotate the turtleshape to point in the direction specified by *angle*, - regardless of its current tilt-angle. *Do not* change the turtle's heading - (direction of movement). - - .. doctest:: - :skipif: _tkinter is None or 'always; deprecated method' - - >>> turtle.reset() - >>> turtle.shape("circle") - >>> turtle.shapesize(5,2) - >>> turtle.settiltangle(45) - >>> turtle.fd(50) - >>> turtle.settiltangle(-45) - >>> turtle.fd(50) - - .. deprecated:: 3.1 - - .. function:: tiltangle(angle=None) :param angle: a number (optional) @@ -2754,8 +2740,7 @@ Changes since Python 3.0 :func:`get_shapepoly` have been added. Thus the full range of regular linear transforms is now available for transforming turtle shapes. :func:`tiltangle` has been enhanced in functionality: it now can - be used to get or set the tilt angle. :func:`settiltangle` has been - deprecated. + be used to get or set the tilt angle. - The :class:`Screen` method :func:`onkeypress` has been added as a complement to :func:`onkey`. As the latter binds actions to the key release event, diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 8cbe17df..439e1194 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -1,5 +1,5 @@ -:mod:`types` --- Dynamic type creation and names for built-in types -=================================================================== +:mod:`!types` --- Dynamic type creation and names for built-in types +==================================================================== .. module:: types :synopsis: Names for built-in types. @@ -91,8 +91,8 @@ Dynamic Type Creation For classes that have an ``__orig_bases__`` attribute, this function returns the value of ``cls.__orig_bases__``. - For classes without the ``__orig_bases__`` attribute, ``cls.__bases__`` is - returned. + For classes without the ``__orig_bases__`` attribute, + :attr:`cls.__bases__ ` is returned. Examples:: @@ -188,7 +188,7 @@ Standard names are defined for the following types: .. index:: pair: built-in function; compile - The type for code objects such as returned by :func:`compile`. + The type of :ref:`code objects ` such as returned by :func:`compile`. .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags types.CodeType @@ -196,16 +196,10 @@ Standard names are defined for the following types: required by the initializer. The audit event only occurs for direct instantiation of code objects, and is not raised for normal compilation. - .. method:: CodeType.replace(**kwargs) - - Return a copy of the code object with new values for the specified fields. - - .. versionadded:: 3.8 - .. data:: CellType The type for cell objects: such objects are used as containers for - a function's free variables. + a function's :term:`closure variables `. .. versionadded:: 3.8 @@ -266,63 +260,18 @@ Standard names are defined for the following types: The type of :term:`modules `. The constructor takes the name of the module to be created and optionally its :term:`docstring`. - .. note:: - Use :func:`importlib.util.module_from_spec` to create a new module if you - wish to set the various import-controlled attributes. - - .. attribute:: __doc__ - - The :term:`docstring` of the module. Defaults to ``None``. - - .. attribute:: __loader__ - - The :term:`loader` which loaded the module. Defaults to ``None``. - - This attribute is to match :attr:`importlib.machinery.ModuleSpec.loader` - as stored in the :attr:`__spec__` object. - - .. note:: - A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the - :attr:`__spec__` attribute instead or use - ``getattr(module, "__loader__", None)`` if you explicitly need to use - this attribute. - - .. versionchanged:: 3.4 - Defaults to ``None``. Previously the attribute was optional. - - .. attribute:: __name__ - - The name of the module. Expected to match - :attr:`importlib.machinery.ModuleSpec.name`. - - .. attribute:: __package__ - - Which :term:`package` a module belongs to. If the module is top-level - (i.e. not a part of any specific package) then the attribute should be set - to ``''``, else it should be set to the name of the package (which can be - :attr:`__name__` if the module is a package itself). Defaults to ``None``. - - This attribute is to match :attr:`importlib.machinery.ModuleSpec.parent` - as stored in the :attr:`__spec__` object. - - .. note:: - A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the - :attr:`__spec__` attribute instead or use - ``getattr(module, "__package__", None)`` if you explicitly need to use - this attribute. - - .. versionchanged:: 3.4 - Defaults to ``None``. Previously the attribute was optional. - - .. attribute:: __spec__ - - A record of the module's import-system-related state. Expected to be an - instance of :class:`importlib.machinery.ModuleSpec`. + .. seealso:: - .. versionadded:: 3.4 + :ref:`Documentation on module objects ` + Provides details on the special attributes that can be found on + instances of :class:`!ModuleType`. + :func:`importlib.util.module_from_spec` + Modules created using the :class:`!ModuleType` constructor are + created with many of their special attributes unset or set to default + values. :func:`!module_from_spec` provides a more robust way of + creating :class:`!ModuleType` instances which ensures the various + attributes are set appropriately. .. data:: EllipsisType @@ -376,17 +325,15 @@ Standard names are defined for the following types: .. data:: FrameType - The type of frame objects such as found in ``tb.tb_frame`` if ``tb`` is a - traceback object. - - See :ref:`the language reference ` for details of the - available attributes and operations. + The type of :ref:`frame objects ` such as found in + :attr:`tb.tb_frame ` if ``tb`` is a traceback object. .. data:: GetSetDescriptorType The type of objects defined in extension modules with ``PyGetSetDef``, such - as ``FrameType.f_locals`` or ``array.array.typecode``. This type is used as + as :attr:`FrameType.f_locals ` or ``array.array.typecode``. + This type is used as descriptor for object attributes; it has the same purpose as the :class:`property` type, but for classes defined in extension modules. @@ -398,6 +345,10 @@ Standard names are defined for the following types: data members which use standard conversion functions; it has the same purpose as the :class:`property` type, but for classes defined in extension modules. + In addition, when a class is defined with a :attr:`~object.__slots__` attribute, then for + each slot, an instance of :class:`!MemberDescriptorType` will be added as an attribute + on the class. This allows the slot to appear in the class's :attr:`~type.__dict__`. + .. impl-detail:: In other implementations of Python, this type may be identical to @@ -470,6 +421,12 @@ Standard names are defined for the following types: .. versionadded:: 3.12 +.. class:: CapsuleType + + The type of :ref:`capsule objects `. + + .. versionadded:: 3.13 + Additional Utility Classes and Functions ---------------------------------------- @@ -479,14 +436,25 @@ Additional Utility Classes and Functions A simple :class:`object` subclass that provides attribute access to its namespace, as well as a meaningful repr. - Unlike :class:`object`, with ``SimpleNamespace`` you can add and remove - attributes. If a ``SimpleNamespace`` object is initialized with keyword - arguments, those are directly added to the underlying namespace. + Unlike :class:`object`, with :class:`!SimpleNamespace` you can add and remove + attributes. + + :py:class:`SimpleNamespace` objects may be initialized + in the same way as :class:`dict`: either with keyword arguments, + with a single positional argument, or with both. + When initialized with keyword arguments, + those are directly added to the underlying namespace. + Alternatively, when initialized with a positional argument, + the underlying namespace will be updated with key-value pairs + from that argument (either a mapping object or + an :term:`iterable` object producing key-value pairs). + All such keys must be strings. The type is roughly equivalent to the following code:: class SimpleNamespace: - def __init__(self, /, **kwargs): + def __init__(self, mapping_or_iterable=(), /, **kwargs): + self.__dict__.update(mapping_or_iterable) self.__dict__.update(kwargs) def __repr__(self): @@ -502,12 +470,17 @@ Additional Utility Classes and Functions However, for a structured record type use :func:`~collections.namedtuple` instead. + :class:`!SimpleNamespace` objects are supported by :func:`copy.replace`. + .. versionadded:: 3.3 .. versionchanged:: 3.9 Attribute order in the repr changed from alphabetical to insertion (like ``dict``). + .. versionchanged:: 3.13 + Added support for an optional positional argument. + .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) Route attribute access on a class to __getattr__. diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index f36dc76c..0c45c218 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -18,32 +18,31 @@ .. note:: The Python runtime does not enforce function and variable type annotations. - They can be used by third party tools such as type checkers, IDEs, linters, - etc. + They can be used by third party tools such as :term:`type checkers `, + IDEs, linters, etc. -------------- -This module provides runtime support for type hints. For the original -specification of the typing system, see :pep:`484`. For a simplified -introduction to type hints, see :pep:`483`. +This module provides runtime support for type hints. +Consider the function below:: -The function below takes and returns a string and is annotated as follows:: + def surface_area_of_cube(edge_length: float) -> str: + return f"The surface area of the cube is {6 * edge_length ** 2}." - def greeting(name: str) -> str: - return 'Hello ' + name +The function ``surface_area_of_cube`` takes an argument expected to +be an instance of :class:`float`, as indicated by the :term:`type hint` +``edge_length: float``. The function is expected to return an instance +of :class:`str`, as indicated by the ``-> str`` hint. -In the function ``greeting``, the argument ``name`` is expected to be of type -:class:`str` and the return type :class:`str`. Subtypes are accepted as -arguments. +While type hints can be simple classes like :class:`float` or :class:`str`, +they can also be more complex. The :mod:`typing` module provides a vocabulary of +more advanced type hints. New features are frequently added to the ``typing`` module. -The `typing_extensions `_ package +The :pypi:`typing_extensions` package provides backports of these new features to older versions of Python. -For a summary of deprecated features and a deprecation timeline, please see -`Deprecation Timeline of Major Features`_. - .. seealso:: `"Typing cheat sheet" `_ @@ -61,67 +60,11 @@ For a summary of deprecated features and a deprecation timeline, please see .. _relevant-peps: -Relevant PEPs -============= - -Since the initial introduction of type hints in :pep:`484` and :pep:`483`, a -number of PEPs have modified and enhanced Python's framework for type -annotations: - -.. raw:: html - -
- The full list of PEPs - -* :pep:`526`: Syntax for Variable Annotations - *Introducing* syntax for annotating variables outside of function - definitions, and :data:`ClassVar` -* :pep:`544`: Protocols: Structural subtyping (static duck typing) - *Introducing* :class:`Protocol` and the - :func:`@runtime_checkable` decorator -* :pep:`585`: Type Hinting Generics In Standard Collections - *Introducing* :class:`types.GenericAlias` and the ability to use standard - library classes as :ref:`generic types` -* :pep:`586`: Literal Types - *Introducing* :data:`Literal` -* :pep:`589`: TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys - *Introducing* :class:`TypedDict` -* :pep:`591`: Adding a final qualifier to typing - *Introducing* :data:`Final` and the :func:`@final` decorator -* :pep:`593`: Flexible function and variable annotations - *Introducing* :data:`Annotated` -* :pep:`604`: Allow writing union types as ``X | Y`` - *Introducing* :data:`types.UnionType` and the ability to use - the binary-or operator ``|`` to signify a - :ref:`union of types` -* :pep:`612`: Parameter Specification Variables - *Introducing* :class:`ParamSpec` and :data:`Concatenate` -* :pep:`613`: Explicit Type Aliases - *Introducing* :data:`TypeAlias` -* :pep:`646`: Variadic Generics - *Introducing* :data:`TypeVarTuple` -* :pep:`647`: User-Defined Type Guards - *Introducing* :data:`TypeGuard` -* :pep:`655`: Marking individual TypedDict items as required or potentially missing - *Introducing* :data:`Required` and :data:`NotRequired` -* :pep:`673`: Self type - *Introducing* :data:`Self` -* :pep:`675`: Arbitrary Literal String Type - *Introducing* :data:`LiteralString` -* :pep:`681`: Data Class Transforms - *Introducing* the :func:`@dataclass_transform` decorator -* :pep:`692`: Using ``TypedDict`` for more precise ``**kwargs`` typing - *Introducing* a new way of typing ``**kwargs`` with :data:`Unpack` and - :data:`TypedDict` -* :pep:`695`: Type Parameter Syntax - *Introducing* builtin syntax for creating generic functions, classes, and type aliases. -* :pep:`698`: Adding an override decorator to typing - *Introducing* the :func:`@override` decorator - -.. raw:: html - -
-
+Specification for the Python Type System +======================================== + +The canonical, up-to-date specification of the Python type system can be +found at `"Specification for the Python type system" `_. .. _type-aliases: @@ -155,8 +98,9 @@ Type aliases are useful for simplifying complex type signatures. For example:: # The static type checker will treat the previous type signature as # being exactly equivalent to this one. def broadcast_message( - message: str, - servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: + message: str, + servers: Sequence[tuple[tuple[str, int], dict[str, str]]] + ) -> None: ... The :keyword:`type` statement is new in Python 3.12. For backwards @@ -264,7 +208,7 @@ Annotating callable objects =========================== Functions -- or other :term:`callable` objects -- can be annotated using -:class:`collections.abc.Callable` or :data:`typing.Callable`. +:class:`collections.abc.Callable` or deprecated :data:`typing.Callable`. ``Callable[[int], str]`` signifies a function that takes a single parameter of type :class:`int` and returns a :class:`str`. @@ -304,7 +248,7 @@ a callable with any arbitrary parameter list would be acceptable: x = concat # Also OK ``Callable`` cannot express complex signatures such as functions that take a -variadic number of arguments, :func:`overloaded functions `, or +variadic number of arguments, :ref:`overloaded functions `, or functions that have keyword-only parameters. However, these signatures can be expressed by defining a :class:`Protocol` class with a :meth:`~object.__call__` method: @@ -457,7 +401,7 @@ The type of class objects ========================= A variable annotated with ``C`` may accept a value of type ``C``. In -contrast, a variable annotated with ``type[C]`` (or +contrast, a variable annotated with ``type[C]`` (or deprecated :class:`typing.Type[C] `) may accept values that are classes themselves -- specifically, it will accept the *class object* of ``C``. For example:: @@ -497,6 +441,87 @@ For example:: ``type[Any]`` is equivalent to :class:`type`, which is the root of Python's :ref:`metaclass hierarchy `. + +.. _annotating-generators-and-coroutines: + +Annotating generators and coroutines +==================================== + +A generator can be annotated using the generic type +:class:`Generator[YieldType, SendType, ReturnType] `. +For example:: + + def echo_round() -> Generator[int, float, str]: + sent = yield 0 + while sent >= 0: + sent = yield round(sent) + return 'Done' + +Note that unlike many other generic classes in the standard library, +the ``SendType`` of :class:`~collections.abc.Generator` behaves +contravariantly, not covariantly or invariantly. + +The ``SendType`` and ``ReturnType`` parameters default to :const:`!None`:: + + def infinite_stream(start: int) -> Generator[int]: + while True: + yield start + start += 1 + +It is also possible to set these types explicitly:: + + def infinite_stream(start: int) -> Generator[int, None, None]: + while True: + yield start + start += 1 + +Simple generators that only ever yield values can also be annotated +as having a return type of either +:class:`Iterable[YieldType] ` +or :class:`Iterator[YieldType] `:: + + def infinite_stream(start: int) -> Iterator[int]: + while True: + yield start + start += 1 + +Async generators are handled in a similar fashion, but don't +expect a ``ReturnType`` type argument +(:class:`AsyncGenerator[YieldType, SendType] `). +The ``SendType`` argument defaults to :const:`!None`, so the following definitions +are equivalent:: + + async def infinite_stream(start: int) -> AsyncGenerator[int]: + while True: + yield start + start = await increment(start) + + async def infinite_stream(start: int) -> AsyncGenerator[int, None]: + while True: + yield start + start = await increment(start) + +As in the synchronous case, +:class:`AsyncIterable[YieldType] ` +and :class:`AsyncIterator[YieldType] ` are +available as well:: + + async def infinite_stream(start: int) -> AsyncIterator[int]: + while True: + yield start + start = await increment(start) + +Coroutines can be annotated using +:class:`Coroutine[YieldType, SendType, ReturnType] `. +Generic arguments correspond to those of :class:`~collections.abc.Generator`, +for example:: + + from collections.abc import Coroutine + c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere + x = c.send('hi') # Inferred type of 'x' is list[str] + async def bar() -> None: + y = await c # Inferred type of 'y' is int + .. _user-defined-generics: User-defined generic types @@ -526,7 +551,7 @@ A user-defined class can be defined as a generic class. self.logger.info('%s: %s', self.name, message) This syntax indicates that the class ``LoggedVar`` is parameterised around a -single :class:`type variable ` ``T`` . This also makes ``T`` valid as +single :ref:`type variable ` ``T`` . This also makes ``T`` valid as a type within the class body. Generic classes implicitly inherit from :class:`Generic`. For compatibility @@ -864,6 +889,16 @@ using ``[]``. def greet_proper(cond: bool) -> str | bytes: return "hi there!" if cond else b"greetings!" + .. deprecated-removed:: 3.13 3.18 + Deprecated in favor of the new :ref:`type parameter syntax `. + Use ``class A[T: (str, bytes)]: ...`` instead of importing ``AnyStr``. See + :pep:`695` for more details. + + In Python 3.16, ``AnyStr`` will be removed from ``typing.__all__``, and + deprecation warnings will be emitted at runtime when it is accessed or + imported from ``typing``. ``AnyStr`` will be removed from ``typing`` + in Python 3.18. + .. data:: LiteralString Special type that includes only literal strings. @@ -900,14 +935,25 @@ using ``[]``. .. versionadded:: 3.11 .. data:: Never + NoReturn - The `bottom type `_, + :data:`!Never` and :data:`!NoReturn` represent the + `bottom type `_, a type that has no members. - This can be used to define a function that should never be - called, or a function that never returns:: + They can be used to indicate that a function never returns, + such as :func:`sys.exit`:: + + from typing import Never # or NoReturn - from typing import Never + def stop() -> Never: + raise RuntimeError('no way') + + Or to define a function that should never be + called, as there are no valid arguments, such as + :func:`assert_never`:: + + from typing import Never # or NoReturn def never_call_me(arg: Never) -> None: pass @@ -920,32 +966,18 @@ using ``[]``. case str(): print("It's a str") case _: - never_call_me(arg) # OK, arg is of type Never - - .. versionadded:: 3.11 - - On older Python versions, :data:`NoReturn` may be used to express the - same concept. ``Never`` was added to make the intended meaning more explicit. - -.. data:: NoReturn + never_call_me(arg) # OK, arg is of type Never (or NoReturn) - Special type indicating that a function never returns. + :data:`!Never` and :data:`!NoReturn` have the same meaning in the type system + and static type checkers treat both equivalently. - For example:: - - from typing import NoReturn + .. versionadded:: 3.6.2 - def stop() -> NoReturn: - raise RuntimeError('no way') + Added :data:`NoReturn`. - ``NoReturn`` can also be used as a - `bottom type `_, a type that - has no values. Starting in Python 3.11, the :data:`Never` type should - be used for this concept instead. Type checkers should treat the two - equivalently. + .. versionadded:: 3.11 - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.2 + Added :data:`Never`. .. data:: Self @@ -1135,16 +1167,13 @@ These can be used as types in annotations. They all support subscription using from collections.abc import Callable from threading import Lock - from typing import Concatenate, ParamSpec, TypeVar - - P = ParamSpec('P') - R = TypeVar('R') + from typing import Concatenate # Use this lock to ensure that only one thread is executing a function # at any time. my_lock = Lock() - def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: + def with_lock[**P, R](f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: '''A type-safe decorator which provides a lock.''' def inner(*args: P.args, **kwargs: P.kwargs) -> R: # Provide the lock as the first argument. @@ -1227,6 +1256,10 @@ These can be used as types in annotations. They all support subscription using .. versionadded:: 3.5.3 + .. versionchanged:: 3.13 + + :data:`ClassVar` can now be nested in :data:`Final` and vice versa. + .. data:: Final Special typing construct to indicate final names to type checkers. @@ -1250,6 +1283,10 @@ These can be used as types in annotations. They all support subscription using .. versionadded:: 3.8 + .. versionchanged:: 3.13 + + :data:`Final` can now be nested in :data:`ClassVar` and vice versa. + .. data:: Required Special typing construct to mark a :class:`TypedDict` key as required. @@ -1268,6 +1305,26 @@ These can be used as types in annotations. They all support subscription using .. versionadded:: 3.11 +.. data:: ReadOnly + + A special typing construct to mark an item of a :class:`TypedDict` as read-only. + + For example:: + + class Movie(TypedDict): + title: ReadOnly[str] + year: int + + def mutate_movie(m: Movie) -> None: + m["year"] = 1999 # allowed + m["title"] = "The Matrix" # typechecker error + + There is no runtime checking for this property. + + See :class:`TypedDict` and :pep:`705` for more details. + + .. versionadded:: 3.13 + .. data:: Annotated Special typing form to add context-specific metadata to an annotation. @@ -1291,7 +1348,7 @@ These can be used as types in annotations. They all support subscription using completely disables typechecking for a function or class. The responsibility of how to interpret the metadata - lies with the the tool or library encountering an + lies with the tool or library encountering an ``Annotated`` annotation. A tool or library encountering an ``Annotated`` type can scan through the metadata elements to determine if they are of interest (e.g., using :func:`isinstance`). @@ -1401,6 +1458,23 @@ These can be used as types in annotations. They all support subscription using >>> X.__metadata__ ('very', 'important', 'metadata') + * At runtime, if you want to retrieve the original + type wrapped by ``Annotated``, use the :attr:`!__origin__` attribute: + + .. doctest:: + + >>> from typing import Annotated, get_origin + >>> Password = Annotated[str, "secret"] + >>> Password.__origin__ + + + Note that using :func:`get_origin` will return ``Annotated`` itself: + + .. doctest:: + + >>> get_origin(Password) + typing.Annotated + .. seealso:: :pep:`593` - Flexible function and variable annotations @@ -1409,22 +1483,23 @@ These can be used as types in annotations. They all support subscription using .. versionadded:: 3.9 -.. data:: TypeGuard +.. data:: TypeIs - Special typing construct for marking user-defined type guard functions. + Special typing construct for marking user-defined type predicate functions. - ``TypeGuard`` can be used to annotate the return type of a user-defined - type guard function. ``TypeGuard`` only accepts a single type argument. - At runtime, functions marked this way should return a boolean. + ``TypeIs`` can be used to annotate the return type of a user-defined + type predicate function. ``TypeIs`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean and take at + least one positional argument. - ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + ``TypeIs`` aims to benefit *type narrowing* -- a technique used by static type checkers to determine a more precise type of an expression within a program's code flow. Usually type narrowing is done by analyzing conditional code flow and applying the narrowing to a block of code. The - conditional expression here is sometimes referred to as a "type guard":: + conditional expression here is sometimes referred to as a "type predicate":: def is_str(val: str | float): - # "isinstance" type guard + # "isinstance" type predicate if isinstance(val, str): # Type of ``val`` is narrowed to ``str`` ... @@ -1433,8 +1508,73 @@ These can be used as types in annotations. They all support subscription using ... Sometimes it would be convenient to use a user-defined boolean function - as a type guard. Such a function should use ``TypeGuard[...]`` as its - return type to alert static type checkers to this intention. + as a type predicate. Such a function should use ``TypeIs[...]`` or + :data:`TypeGuard` as its return type to alert static type checkers to + this intention. ``TypeIs`` usually has more intuitive behavior than + ``TypeGuard``, but it cannot be used when the input and output types + are incompatible (e.g., ``list[object]`` to ``list[int]``) or when the + function does not return ``True`` for all instances of the narrowed type. + + Using ``-> TypeIs[NarrowedType]`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the intersection of the argument's original type and ``NarrowedType``. + 3. If the return value is ``False``, the type of its argument + is narrowed to exclude ``NarrowedType``. + + For example:: + + from typing import assert_type, final, TypeIs + + class Parent: pass + class Child(Parent): pass + @final + class Unrelated: pass + + def is_parent(val: object) -> TypeIs[Parent]: + return isinstance(val, Parent) + + def run(arg: Child | Unrelated): + if is_parent(arg): + # Type of ``arg`` is narrowed to the intersection + # of ``Parent`` and ``Child``, which is equivalent to + # ``Child``. + assert_type(arg, Child) + else: + # Type of ``arg`` is narrowed to exclude ``Parent``, + # so only ``Unrelated`` is left. + assert_type(arg, Unrelated) + + The type inside ``TypeIs`` must be consistent with the type of the + function's argument; if it is not, static type checkers will raise + an error. An incorrectly written ``TypeIs`` function can lead to + unsound behavior in the type system; it is the user's responsibility + to write such functions in a type-safe manner. + + If a ``TypeIs`` function is a class or instance method, then the type in + ``TypeIs`` maps to the type of the second parameter (after ``cls`` or + ``self``). + + In short, the form ``def foo(arg: TypeA) -> TypeIs[TypeB]: ...``, + means that if ``foo(arg)`` returns ``True``, then ``arg`` is an instance + of ``TypeB``, and if it returns ``False``, it is not an instance of ``TypeB``. + + ``TypeIs`` also works with type variables. For more information, see + :pep:`742` (Narrowing types with ``TypeIs``). + + .. versionadded:: 3.13 + + +.. data:: TypeGuard + + Special typing construct for marking user-defined type predicate functions. + + Type predicate functions are user-defined functions that return whether their + argument is an instance of a particular type. + ``TypeGuard`` works similarly to :data:`TypeIs`, but has subtly different + effects on type checking behavior (see below). Using ``-> TypeGuard`` tells the static type checker that for a given function: @@ -1443,6 +1583,8 @@ These can be used as types in annotations. They all support subscription using 2. If the return value is ``True``, the type of its argument is the type inside ``TypeGuard``. + ``TypeGuard`` also works with type variables. See :pep:`647` for more details. + For example:: def is_str_list(val: list[object]) -> TypeGuard[list[str]]: @@ -1457,23 +1599,19 @@ These can be used as types in annotations. They all support subscription using # Type of ``val`` remains as ``list[object]``. print("Not a list of strings!") - If ``is_str_list`` is a class or instance method, then the type in - ``TypeGuard`` maps to the type of the second parameter after ``cls`` or - ``self``. - - In short, the form ``def foo(arg: TypeA) -> TypeGuard[TypeB]: ...``, - means that if ``foo(arg)`` returns ``True``, then ``arg`` narrows from - ``TypeA`` to ``TypeB``. + ``TypeIs`` and ``TypeGuard`` differ in the following ways: - .. note:: - - ``TypeB`` need not be a narrower form of ``TypeA`` -- it can even be a - wider form. The main reason is to allow for things like - narrowing ``list[object]`` to ``list[str]`` even though the latter - is not a subtype of the former, since ``list`` is invariant. - The responsibility of writing type-safe type guards is left to the user. - - ``TypeGuard`` also works with type variables. See :pep:`647` for more details. + * ``TypeIs`` requires the narrowed type to be a subtype of the input type, while + ``TypeGuard`` does not. The main reason is to allow for things like + narrowing ``list[object]`` to ``list[str]`` even though the latter + is not a subtype of the former, since ``list`` is invariant. + * When a ``TypeGuard`` function returns ``True``, type checkers narrow the type of the + variable to exactly the ``TypeGuard`` type. When a ``TypeIs`` function returns ``True``, + type checkers can infer a more precise type combining the previously known type of the + variable with the ``TypeIs`` type. (Technically, this is known as an intersection type.) + * When a ``TypeGuard`` function returns ``False``, type checkers cannot narrow the type of + the variable at all. When a ``TypeIs`` function returns ``False``, type checkers can narrow + the type of the variable to exclude the ``TypeIs`` type. .. versionadded:: 3.10 @@ -1483,7 +1621,7 @@ These can be used as types in annotations. They all support subscription using Typing operator to conceptually mark an object as having been unpacked. For example, using the unpack operator ``*`` on a - :class:`type variable tuple ` is equivalent to using ``Unpack`` + :ref:`type variable tuple ` is equivalent to using ``Unpack`` to mark the type variable tuple as having been unpacked:: Ts = TypeVarTuple('Ts') @@ -1574,7 +1712,9 @@ without the dedicated syntax, as documented below. ... # Etc. -.. class:: TypeVar(name, *constraints, bound=None, covariant=False, contravariant=False, infer_variance=False) +.. _typevar: + +.. class:: TypeVar(name, *constraints, bound=None, covariant=False, contravariant=False, infer_variance=False, default=typing.NoDefault) Type variable. @@ -1586,11 +1726,11 @@ without the dedicated syntax, as documented below. class Sequence[T]: # T is a TypeVar ... - This syntax can also be used to create bound and constrained type + This syntax can also be used to create bounded and constrained type variables:: - class StrSequence[S: str]: # S is a TypeVar bound to str - ... + class StrSequence[S: str]: # S is a TypeVar with a `str` upper bound; + ... # we can say that S is "bounded by `str`" class StrOrBytesSequence[A: (str, bytes)]: # A is a TypeVar constrained to str or bytes @@ -1623,8 +1763,8 @@ without the dedicated syntax, as documented below. """Add two strings or bytes objects together.""" return x + y - Note that type variables can be *bound*, *constrained*, or neither, but - cannot be both bound *and* constrained. + Note that type variables can be *bounded*, *constrained*, or neither, but + cannot be both bounded *and* constrained. The variance of type variables is inferred by type checkers when they are created through the :ref:`type parameter syntax ` or when @@ -1634,8 +1774,8 @@ without the dedicated syntax, as documented below. By default, manually created type variables are invariant. See :pep:`484` and :pep:`695` for more details. - Bound type variables and constrained type variables have different - semantics in several important ways. Using a *bound* type variable means + Bounded type variables and constrained type variables have different + semantics in several important ways. Using a *bounded* type variable means that the ``TypeVar`` will be solved using the most specific type possible:: x = print_capitalized('a string') @@ -1649,8 +1789,8 @@ without the dedicated syntax, as documented below. z = print_capitalized(45) # error: int is not a subtype of str - Type variables can be bound to concrete types, abstract types (ABCs or - protocols), and even unions of types:: + The upper bound of a type variable can be a concrete type, abstract type + (ABC or Protocol), or even a union of types:: # Can be anything with an __abs__ method def print_abs[T: SupportsAbs](arg: T) -> None: @@ -1694,7 +1834,7 @@ without the dedicated syntax, as documented below. .. attribute:: __bound__ - The bound of the type variable, if any. + The upper bound of the type variable, if any. .. versionchanged:: 3.12 @@ -1712,15 +1852,37 @@ without the dedicated syntax, as documented below. the constraints are evaluated only when the attribute is accessed, not when the type variable is created (see :ref:`lazy-evaluation`). + .. attribute:: __default__ + + The default value of the type variable, or :data:`typing.NoDefault` if it + has no default. + + .. versionadded:: 3.13 + + .. method:: has_default() + + Return whether or not the type variable has a default value. This is equivalent + to checking whether :attr:`__default__` is not the :data:`typing.NoDefault` + singleton, except that it does not force evaluation of the + :ref:`lazily evaluated ` default value. + + .. versionadded:: 3.13 + .. versionchanged:: 3.12 Type variables can now be declared using the :ref:`type parameter ` syntax introduced by :pep:`695`. The ``infer_variance`` parameter was added. -.. class:: TypeVarTuple(name) + .. versionchanged:: 3.13 + + Support for default values was added. - Type variable tuple. A specialized form of :class:`type variable ` +.. _typevartuple: + +.. class:: TypeVarTuple(name, *, default=typing.NoDefault) + + Type variable tuple. A specialized form of :ref:`type variable ` that enables *variadic* generics. Type variable tuples can be declared in :ref:`type parameter lists ` @@ -1809,8 +1971,8 @@ without the dedicated syntax, as documented below. of ``*args``:: def call_soon[*Ts]( - callback: Callable[[*Ts], None], - *args: *Ts + callback: Callable[[*Ts], None], + *args: *Ts ) -> None: ... callback(*args) @@ -1828,6 +1990,22 @@ without the dedicated syntax, as documented below. The name of the type variable tuple. + .. attribute:: __default__ + + The default value of the type variable tuple, or :data:`typing.NoDefault` if it + has no default. + + .. versionadded:: 3.13 + + .. method:: has_default() + + Return whether or not the type variable tuple has a default value. This is equivalent + to checking whether :attr:`__default__` is not the :data:`typing.NoDefault` + singleton, except that it does not force evaluation of the + :ref:`lazily evaluated ` default value. + + .. versionadded:: 3.13 + .. versionadded:: 3.11 .. versionchanged:: 3.12 @@ -1835,10 +2013,14 @@ without the dedicated syntax, as documented below. Type variable tuples can now be declared using the :ref:`type parameter ` syntax introduced by :pep:`695`. -.. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False) + .. versionchanged:: 3.13 + + Support for default values was added. + +.. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False, default=typing.NoDefault) Parameter specification variable. A specialized version of - :class:`type variables `. + :ref:`type variables `. In :ref:`type parameter lists `, parameter specifications can be declared with two asterisks (``**``):: @@ -1878,7 +2060,7 @@ without the dedicated syntax, as documented below. return x + y Without ``ParamSpec``, the simplest way to annotate this previously was to - use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this + use a :class:`TypeVar` with upper bound ``Callable[..., Any]``. However this causes two problems: 1. The type checker can't type check the ``inner`` function because @@ -1904,6 +2086,22 @@ without the dedicated syntax, as documented below. The name of the parameter specification. + .. attribute:: __default__ + + The default value of the parameter specification, or :data:`typing.NoDefault` if it + has no default. + + .. versionadded:: 3.13 + + .. method:: has_default() + + Return whether or not the parameter specification has a default value. This is equivalent + to checking whether :attr:`__default__` is not the :data:`typing.NoDefault` + singleton, except that it does not force evaluation of the + :ref:`lazily evaluated ` default value. + + .. versionadded:: 3.13 + Parameter specification variables created with ``covariant=True`` or ``contravariant=True`` can be used to declare covariant or contravariant generic types. The ``bound`` argument is also accepted, similar to @@ -1917,6 +2115,10 @@ without the dedicated syntax, as documented below. Parameter specifications can now be declared using the :ref:`type parameter ` syntax introduced by :pep:`695`. + .. versionchanged:: 3.13 + + Support for default values was added. + .. note:: Only parameter specification variables defined in global scope can be pickled. @@ -1928,7 +2130,7 @@ without the dedicated syntax, as documented below. * :ref:`annotating-callables` .. data:: ParamSpecArgs -.. data:: ParamSpecKwargs + ParamSpecKwargs Arguments and keyword arguments attributes of a :class:`ParamSpec`. The ``P.args`` attribute of a ``ParamSpec`` is an instance of ``ParamSpecArgs``, @@ -1940,7 +2142,7 @@ without the dedicated syntax, as documented below. .. doctest:: - >>> from typing import ParamSpec + >>> from typing import ParamSpec, get_origin >>> P = ParamSpec("P") >>> get_origin(P.args) is P True @@ -2071,7 +2273,9 @@ types. Backward-compatible usage:: - # For creating a generic NamedTuple on Python 3.11 or lower + # For creating a generic NamedTuple on Python 3.11 + T = TypeVar("T") + class Group(NamedTuple, Generic[T]): key: T group: list[T] @@ -2096,6 +2300,19 @@ types. .. versionchanged:: 3.11 Added support for generic namedtuples. + .. deprecated-removed:: 3.13 3.15 + The undocumented keyword argument syntax for creating NamedTuple classes + (``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed + in 3.15. Use the class-based syntax or the functional syntax instead. + + .. deprecated-removed:: 3.13 3.15 + When using the functional syntax to create a NamedTuple class, failing to + pass a value to the 'fields' parameter (``NT = NamedTuple("NT")``) is + deprecated. Passing ``None`` to the 'fields' parameter + (``NT = NamedTuple("NT", None)``) is also deprecated. Both will be + disallowed in Python 3.15. To create a NamedTuple class with 0 fields, + use ``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", [])``. + .. class:: NewType(name, tp) Helper class to create low-overhead :ref:`distinct types `. @@ -2251,25 +2468,14 @@ types. assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - To allow using this feature with older versions of Python that do not - support :pep:`526`, ``TypedDict`` supports two additional equivalent - syntactic forms: - - * Using a literal :class:`dict` as the second argument:: + An alternative way to create a ``TypedDict`` is by using + function-call syntax. The second argument must be a literal :class:`dict`:: Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) - * Using keyword arguments:: - - Point2D = TypedDict('Point2D', x=int, y=int, label=str) - - .. deprecated-removed:: 3.11 3.13 - The keyword-argument syntax is deprecated in 3.11 and will be removed - in 3.13. It may also be unsupported by static type checkers. - - The functional syntax should also be used when any of the keys are not valid - :ref:`identifiers `, for example because they are keywords or contain hyphens. - Example:: + This functional syntax allows defining keys which are not valid + :ref:`identifiers `, for example because they are + keywords or contain hyphens:: # raises SyntaxError class Point2D(TypedDict): @@ -2392,6 +2598,13 @@ types. >>> Point3D.__total__ True + This attribute reflects *only* the value of the ``total`` argument + to the current ``TypedDict`` class, not whether the class is semantically + total. For example, a ``TypedDict`` with ``__total__`` set to ``True`` may + have keys marked with :data:`NotRequired`, or it may inherit from another + ``TypedDict`` with ``total=False``. Therefore, it is generally better to use + :attr:`__required_keys__` and :attr:`__optional_keys__` for introspection. + .. attribute:: __required_keys__ .. versionadded:: 3.9 @@ -2427,6 +2640,30 @@ types. .. versionadded:: 3.9 + .. note:: + + If ``from __future__ import annotations`` is used or if annotations + are given as strings, annotations are not evaluated when the + ``TypedDict`` is defined. Therefore, the runtime introspection that + ``__required_keys__`` and ``__optional_keys__`` rely on may not work + properly, and the values of the attributes may be incorrect. + + Support for :data:`ReadOnly` is reflected in the following attributes: + + .. attribute:: __readonly_keys__ + + A :class:`frozenset` containing the names of all read-only keys. Keys + are read-only if they carry the :data:`ReadOnly` qualifier. + + .. versionadded:: 3.13 + + .. attribute:: __mutable_keys__ + + A :class:`frozenset` containing the names of all mutable keys. Keys + are mutable if they do not carry the :data:`ReadOnly` qualifier. + + .. versionadded:: 3.13 + See :pep:`589` for more examples and detailed rules of using ``TypedDict``. .. versionadded:: 3.8 @@ -2438,6 +2675,20 @@ types. .. versionchanged:: 3.11 Added support for generic ``TypedDict``\ s. + .. versionchanged:: 3.13 + Removed support for the keyword-argument method of creating ``TypedDict``\ s. + + .. versionchanged:: 3.13 + Support for the :data:`ReadOnly` qualifier was added. + + .. deprecated-removed:: 3.13 3.15 + When using the functional syntax to create a TypedDict class, failing to + pass a value to the 'fields' parameter (``TD = TypedDict("TD")``) is + deprecated. Passing ``None`` to the 'fields' parameter + (``TD = TypedDict("TD", None)``) is also deprecated. Both will be + disallowed in Python 3.15. To create a TypedDict class with 0 fields, + use ``class TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``. + Protocols --------- @@ -2558,17 +2809,17 @@ Functions and decorators .. seealso:: `Unreachable Code and Exhaustiveness Checking - `__ has more + `__ has more information about exhaustiveness checking with static typing. .. versionadded:: 3.11 .. function:: reveal_type(obj, /) - Reveal the inferred static type of an expression. + Ask a static type checker to reveal the inferred type of an expression. When a static type checker encounters a call to this function, - it emits a diagnostic with the type of the argument. For example:: + it emits a diagnostic with the inferred type of the argument. For example:: x: int = 1 reveal_type(x) # Revealed type is "builtins.int" @@ -2576,22 +2827,21 @@ Functions and decorators This can be useful when you want to debug how your type checker handles a particular piece of code. - The function returns its argument unchanged, which allows using - it within an expression:: + At runtime, this function prints the runtime type of its argument to + :data:`sys.stderr` and returns the argument unchanged (allowing the call to + be used within an expression):: - x = reveal_type(1) # Revealed type is "builtins.int" + x = reveal_type(1) # prints "Runtime type is int" + print(x) # prints "1" + + Note that the runtime type may be different from (more or less specific + than) the type statically inferred by a type checker. Most type checkers support ``reveal_type()`` anywhere, even if the name is not imported from ``typing``. Importing the name from - ``typing`` allows your code to run without runtime errors and + ``typing``, however, allows your code to run without runtime errors and communicates intent more clearly. - At runtime, this function prints the runtime type of its argument to stderr - and returns it unchanged:: - - x = reveal_type(1) # prints "Runtime type is int" - print(x) # prints "1" - .. versionadded:: 3.11 .. decorator:: dataclass_transform(*, eq_default=True, order_default=False, \ @@ -2734,6 +2984,8 @@ Functions and decorators .. versionadded:: 3.11 +.. _overload: + .. decorator:: overload Decorator for creating overloaded functions and methods. @@ -2859,6 +3111,9 @@ Functions and decorators This wraps the decorator with something that wraps the decorated function in :func:`no_type_check`. + .. deprecated-removed:: 3.13 3.15 + No type checker ever added support for ``@no_type_check_decorator``. It + is therefore deprecated, and will be removed in Python 3.15. .. decorator:: override @@ -2927,33 +3182,38 @@ Introspection helpers Return a dictionary containing type hints for a function, method, module or class object. - This is often the same as ``obj.__annotations__``. In addition, - forward references encoded as string literals are handled by evaluating - them in ``globals`` and ``locals`` namespaces. For a class ``C``, return - a dictionary constructed by merging all the ``__annotations__`` along - ``C.__mro__`` in reverse order. - - The function recursively replaces all ``Annotated[T, ...]`` with ``T``, - unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for - more information). For example: - - .. testcode:: - - class Student(NamedTuple): - name: Annotated[str, 'some marker'] - - assert get_type_hints(Student) == {'name': str} - assert get_type_hints(Student, include_extras=False) == {'name': str} - assert get_type_hints(Student, include_extras=True) == { - 'name': Annotated[str, 'some marker'] - } + This is often the same as ``obj.__annotations__``, but this function makes + the following changes to the annotations dictionary: + + * Forward references encoded as string literals or :class:`ForwardRef` + objects are handled by evaluating them in *globalns*, *localns*, and + (where applicable) *obj*'s :ref:`type parameter ` namespace. + If *globalns* or *localns* is not given, appropriate namespace + dictionaries are inferred from *obj*. + * ``None`` is replaced with :class:`types.NoneType`. + * If :func:`@no_type_check ` has been applied to *obj*, an + empty dictionary is returned. + * If *obj* is a class ``C``, the function returns a dictionary that merges + annotations from ``C``'s base classes with those on ``C`` directly. This + is done by traversing :attr:`C.__mro__ ` and iteratively + combining + ``__annotations__`` dictionaries. Annotations on classes appearing + earlier in the :term:`method resolution order` always take precedence over + annotations on classes appearing later in the method resolution order. + * The function recursively replaces all occurrences of ``Annotated[T, ...]`` + with ``T``, unless *include_extras* is set to ``True`` (see + :class:`Annotated` for more information). + + See also :func:`inspect.get_annotations`, a lower-level function that + returns annotations more directly. .. note:: - :func:`get_type_hints` does not work with imported - :ref:`type aliases ` that include forward references. - Enabling postponed evaluation of annotations (:pep:`563`) may remove - the need for most forward references. + If any forward references in the annotations of *obj* are not resolvable + or are not valid Python code, this function will raise an exception + such as :exc:`NameError`. For example, this can happen with imported + :ref:`type aliases ` that include forward references, + or with names imported under :data:`if TYPE_CHECKING `. .. versionchanged:: 3.9 Added ``include_extras`` parameter as part of :pep:`593`. @@ -2982,6 +3242,7 @@ Introspection helpers assert get_origin(str) is None assert get_origin(Dict[str, int]) is dict assert get_origin(Union[int, str]) is Union + assert get_origin(Annotated[str, "metadata"]) is Annotated P = ParamSpec('P') assert get_origin(P.args) is P assert get_origin(P.kwargs) is P @@ -3008,6 +3269,38 @@ Introspection helpers .. versionadded:: 3.8 +.. function:: get_protocol_members(tp) + + Return the set of members defined in a :class:`Protocol`. + + .. doctest:: + + >>> from typing import Protocol, get_protocol_members + >>> class P(Protocol): + ... def a(self) -> str: ... + ... b: int + >>> get_protocol_members(P) == frozenset({'a', 'b'}) + True + + Raise :exc:`TypeError` for arguments that are not Protocols. + + .. versionadded:: 3.13 + +.. function:: is_protocol(tp) + + Determine if a type is a :class:`Protocol`. + + For example:: + + class P(Protocol): + def a(self) -> str: ... + b: int + + is_protocol(P) # => True + is_protocol(int) # => False + + .. versionadded:: 3.13 + .. function:: is_typeddict(tp) Check if a type is a :class:`TypedDict`. @@ -3044,6 +3337,22 @@ Introspection helpers .. versionadded:: 3.7.4 +.. data:: NoDefault + + A sentinel object used to indicate that a type parameter has no default + value. For example: + + .. doctest:: + + >>> T = TypeVar("T") + >>> T.__default__ is typing.NoDefault + True + >>> S = TypeVar("S", default=None) + >>> S.__default__ is None + True + + .. versionadded:: 3.13 + Constant -------- @@ -3111,14 +3420,9 @@ Aliases to built-in types Deprecated alias to :class:`dict`. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`Mapping` + to use an abstract collection type such as :class:`~collections.abc.Mapping` rather than to use :class:`dict` or :class:`!typing.Dict`. - This type can be used as follows:: - - def count_words(text: str) -> Dict[str, int]: - ... - .. deprecated:: 3.9 :class:`builtins.dict ` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. @@ -3128,16 +3432,9 @@ Aliases to built-in types Deprecated alias to :class:`list`. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`Sequence` or - :class:`Iterable` rather than to use :class:`list` or :class:`!typing.List`. - - This type may be used as follows:: - - def vec2[T: (int, float)](x: T, y: T) -> List[T]: - return [x, y] - - def keep_positives[T: (int, float)](vector: Sequence[T]) -> List[T]: - return [item for item in vector if item > 0] + to use an abstract collection type such as + :class:`~collections.abc.Sequence` or :class:`~collections.abc.Iterable` + rather than to use :class:`list` or :class:`!typing.List`. .. deprecated:: 3.9 :class:`builtins.list ` now supports subscripting (``[]``). @@ -3148,8 +3445,8 @@ Aliases to built-in types Deprecated alias to :class:`builtins.set `. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`AbstractSet` - rather than to use :class:`set` or :class:`!typing.Set`. + to use an abstract collection type such as :class:`collections.abc.Set` + rather than to use :class:`set` or :class:`typing.Set`. .. deprecated:: 3.9 :class:`builtins.set ` now supports subscripting (``[]``). @@ -3217,7 +3514,6 @@ Aliases to types in :mod:`collections` Deprecated alias to :class:`collections.ChainMap`. - .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. deprecated:: 3.9 @@ -3228,7 +3524,6 @@ Aliases to types in :mod:`collections` Deprecated alias to :class:`collections.Counter`. - .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. deprecated:: 3.9 @@ -3239,7 +3534,6 @@ Aliases to types in :mod:`collections` Deprecated alias to :class:`collections.deque`. - .. versionadded:: 3.5.4 .. versionadded:: 3.6.1 .. deprecated:: 3.9 @@ -3251,10 +3545,6 @@ Aliases to types in :mod:`collections` Aliases to other concrete types """"""""""""""""""""""""""""""" - .. deprecated-removed:: 3.8 3.13 - The ``typing.io`` namespace is deprecated and will be removed. - These types should be directly imported from ``typing`` instead. - .. class:: Pattern Match @@ -3266,10 +3556,6 @@ Aliases to other concrete types ``Pattern[bytes]``; ``Match`` can be specialised as ``Match[str]`` or ``Match[bytes]``. - .. deprecated-removed:: 3.8 3.13 - The ``typing.re`` namespace is deprecated and will be removed. - These types should be directly imported from ``typing`` instead. - .. deprecated:: 3.9 Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. See :pep:`585` and :ref:`types-genericalias`. @@ -3322,7 +3608,7 @@ Aliases to container ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Collection`. - .. versionadded:: 3.6.0 + .. versionadded:: 3.6 .. deprecated:: 3.9 :class:`collections.abc.Collection` now supports subscripting (``[]``). @@ -3356,11 +3642,6 @@ Aliases to container ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Mapping`. - This type can be used as follows:: - - def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: - return word_list[word] - .. deprecated:: 3.9 :class:`collections.abc.Mapping` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. @@ -3424,14 +3705,9 @@ Aliases to asynchronous ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Coroutine`. - The variance and order of type variables - correspond to those of :class:`Generator`, for example:: - - from collections.abc import Coroutine - c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere - x = c.send('hi') # Inferred type of 'x' is list[str] - async def bar() -> None: - y = await c # Inferred type of 'y' is int + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.Coroutine` + and ``typing.Coroutine`` in type annotations. .. versionadded:: 3.5.3 @@ -3443,34 +3719,9 @@ Aliases to asynchronous ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.AsyncGenerator`. - An async generator can be annotated by the generic type - ``AsyncGenerator[YieldType, SendType]``. For example:: - - async def echo_round() -> AsyncGenerator[int, float]: - sent = yield 0 - while sent >= 0.0: - rounded = await round(sent) - sent = yield rounded - - Unlike normal generators, async generators cannot return a value, so there - is no ``ReturnType`` type parameter. As with :class:`Generator`, the - ``SendType`` behaves contravariantly. - - If your generator will only yield values, set the ``SendType`` to - ``None``:: - - async def infinite_stream(start: int) -> AsyncGenerator[int, None]: - while True: - yield start - start = await increment(start) - - Alternatively, annotate your generator as having a return type of - either ``AsyncIterable[YieldType]`` or ``AsyncIterator[YieldType]``:: - - async def infinite_stream(start: int) -> AsyncIterator[int]: - while True: - yield start - start = await increment(start) + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.AsyncGenerator` + and ``typing.AsyncGenerator`` in type annotations. .. versionadded:: 3.6.1 @@ -3479,6 +3730,9 @@ Aliases to asynchronous ABCs in :mod:`collections.abc` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. + .. versionchanged:: 3.13 + The ``SendType`` parameter now has a default. + .. class:: AsyncIterable(Generic[T_co]) Deprecated alias to :class:`collections.abc.AsyncIterable`. @@ -3549,39 +3803,17 @@ Aliases to other ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Generator`. - A generator can be annotated by the generic type - ``Generator[YieldType, SendType, ReturnType]``. For example:: - - def echo_round() -> Generator[int, float, str]: - sent = yield 0 - while sent >= 0: - sent = yield round(sent) - return 'Done' - - Note that unlike many other generics in the typing module, the ``SendType`` - of :class:`Generator` behaves contravariantly, not covariantly or - invariantly. - - If your generator will only yield values, set the ``SendType`` and - ``ReturnType`` to ``None``:: - - def infinite_stream(start: int) -> Generator[int, None, None]: - while True: - yield start - start += 1 - - Alternatively, annotate your generator as having a return type of - either ``Iterable[YieldType]`` or ``Iterator[YieldType]``:: - - def infinite_stream(start: int) -> Iterator[int]: - while True: - yield start - start += 1 + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.Generator` + and ``typing.Generator`` in type annotations. .. deprecated:: 3.9 :class:`collections.abc.Generator` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. + .. versionchanged:: 3.13 + Default values for the send and return types were added. + .. class:: Hashable Deprecated alias to :class:`collections.abc.Hashable`. @@ -3609,23 +3841,34 @@ Aliases to other ABCs in :mod:`collections.abc` Aliases to :mod:`contextlib` ABCs """"""""""""""""""""""""""""""""" -.. class:: ContextManager(Generic[T_co]) +.. class:: ContextManager(Generic[T_co, ExitT_co]) Deprecated alias to :class:`contextlib.AbstractContextManager`. + The first type parameter, ``T_co``, represents the type returned by + the :meth:`~object.__enter__` method. The optional second type parameter, ``ExitT_co``, + which defaults to ``bool | None``, represents the type returned by the + :meth:`~object.__exit__` method. + .. versionadded:: 3.5.4 - .. versionadded:: 3.6.0 .. deprecated:: 3.9 :class:`contextlib.AbstractContextManager` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. -.. class:: AsyncContextManager(Generic[T_co]) + .. versionchanged:: 3.13 + Added the optional second type parameter, ``ExitT_co``. + +.. class:: AsyncContextManager(Generic[T_co, AExitT_co]) Deprecated alias to :class:`contextlib.AbstractAsyncContextManager`. - .. versionadded:: 3.5.4 + The first type parameter, ``T_co``, represents the type returned by + the :meth:`~object.__aenter__` method. The optional second type parameter, ``AExitT_co``, + which defaults to ``bool | None``, represents the type returned by the + :meth:`~object.__aexit__` method. + .. versionadded:: 3.6.2 .. deprecated:: 3.9 @@ -3633,6 +3876,9 @@ Aliases to :mod:`contextlib` ABCs now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. + .. versionchanged:: 3.13 + Added the optional second type parameter, ``AExitT_co``. + Deprecation Timeline of Major Features ====================================== @@ -3647,10 +3893,6 @@ convenience. This is subject to change, and not all deprecations are listed. - Deprecated in - Projected removal - PEP/issue - * - ``typing.io`` and ``typing.re`` submodules - - 3.8 - - 3.13 - - :issue:`38291` * - ``typing`` versions of standard collections - 3.9 - Undecided (see :ref:`deprecated-aliases` for more information) @@ -3671,3 +3913,11 @@ convenience. This is subject to change, and not all deprecations are listed. - 3.12 - Undecided - :pep:`695` + * - :func:`@typing.no_type_check_decorator ` + - 3.13 + - 3.15 + - :gh:`106309` + * - :data:`typing.AnyStr` + - 3.13 + - 3.18 + - :gh:`105578` diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 3a094f9c..37dc3751 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -1,5 +1,5 @@ -:mod:`unicodedata` --- Unicode Database -======================================= +:mod:`!unicodedata` --- Unicode Database +======================================== .. module:: unicodedata :synopsis: Access the Unicode Database. @@ -17,8 +17,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 15.0.0 -`_. +this database is compiled from the `UCD version 15.1.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -175,6 +175,6 @@ Examples: .. rubric:: Footnotes -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NameAliases.txt -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NamedSequences.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NamedSequences.txt diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 34f343eb..00cc9bfc 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -1,5 +1,5 @@ -:mod:`unittest.mock` --- getting started -======================================== +:mod:`!unittest.mock` --- getting started +========================================= .. moduleauthor:: Michael Foord .. currentmodule:: unittest.mock @@ -339,7 +339,7 @@ instantiate the class in those tests. >>> mock.old_method() Traceback (most recent call last): ... - AttributeError: object has no attribute 'old_method' + AttributeError: Mock object has no attribute 'old_method'. Did you mean: 'class_method'? Using a specification also enables a smarter matching of calls made to the mock, regardless of whether some parameters were passed as positional or @@ -798,7 +798,8 @@ If your mock is only being called once you can use the >>> mock.foo_bar.assert_called_once_with('baz', spam='eggs') Traceback (most recent call last): ... - AssertionError: Expected to be called once. Called 2 times. + AssertionError: Expected 'foo_bar' to be called once. Called 2 times. + Calls: [call('baz', spam='eggs'), call()]. Both ``assert_called_with`` and ``assert_called_once_with`` make assertions about the *most recent* call. If your mock is going to be called several times, and @@ -927,8 +928,9 @@ Here's an example implementation: >>> c.assert_called_with(arg) Traceback (most recent call last): ... - AssertionError: Expected call: mock({1}) - Actual call: mock(set()) + AssertionError: expected call not found. + Expected: mock({1}) + Actual: mock(set()) >>> c.foo @@ -1292,8 +1294,9 @@ sufficient: >>> mock.assert_called_with(Foo(1, 2)) Traceback (most recent call last): ... - AssertionError: Expected: call(<__main__.Foo object at 0x...>) - Actual call: call(<__main__.Foo object at 0x...>) + AssertionError: expected call not found. + Expected: mock(<__main__.Foo object at 0x...>) + Actual: mock(<__main__.Foo object at 0x...>) A comparison function for our ``Foo`` class might look something like this: diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 13cd593f..514c6b7e 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1,6 +1,5 @@ - -:mod:`unittest.mock` --- mock object library -============================================ +:mod:`!unittest.mock` --- mock object library +============================================= .. module:: unittest.mock :synopsis: Mock object library. @@ -35,7 +34,7 @@ is based on the 'action -> assertion' pattern instead of 'record -> replay' used by many mocking frameworks. There is a backport of :mod:`unittest.mock` for earlier versions of Python, -available as `mock on PyPI `_. +available as :pypi:`mock` on PyPI. Quick Guide @@ -69,7 +68,7 @@ available, and then make assertions about how they have been used: 3 >>> thing.method.assert_called_with(3, 4, 5, key='value') -:attr:`side_effect` allows you to perform side effects, including raising an +:attr:`~Mock.side_effect` allows you to perform side effects, including raising an exception when a mock is called: >>> from unittest.mock import Mock @@ -189,7 +188,7 @@ code if they are used incorrectly: >>> mock_function('wrong arguments') Traceback (most recent call last): ... - TypeError: () takes exactly 3 arguments (1 given) + TypeError: missing a required argument: 'b' :func:`create_autospec` can also be used on classes, where it copies the signature of the ``__init__`` method, and on callable objects where it copies the signature of @@ -205,8 +204,10 @@ The Mock Class import asyncio import inspect import unittest + import threading from unittest.mock import sentinel, DEFAULT, ANY from unittest.mock import patch, call, Mock, MagicMock, PropertyMock, AsyncMock + from unittest.mock import ThreadingMock from unittest.mock import mock_open :class:`Mock` is a flexible mock object intended to replace the use of stubs and @@ -238,7 +239,7 @@ the *new_callable* argument to :func:`patch`. Accessing any attribute not in this list will raise an :exc:`AttributeError`. If *spec* is an object (rather than a list of strings) then - :attr:`~instance.__class__` returns the class of the spec object. This + :attr:`~object.__class__` returns the class of the spec object. This allows mocks to pass :func:`isinstance` tests. * *spec_set*: A stricter variant of *spec*. If used, attempting to *set* @@ -313,6 +314,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'method' to have been called once. Called 2 times. + Calls: [call(), call()]. .. versionadded:: 3.6 @@ -340,7 +342,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'mock' to be called once. Called 2 times. - + Calls: [call('foo', bar='baz'), call('other', bar='values')]. .. method:: assert_any_call(*args, **kwargs) @@ -390,6 +392,7 @@ the *new_callable* argument to :func:`patch`. Traceback (most recent call last): ... AssertionError: Expected 'hello' to not have been called. Called 1 times. + Calls: [call()]. .. versionadded:: 3.5 @@ -411,13 +414,13 @@ the *new_callable* argument to :func:`patch`. This can be useful where you want to make a series of assertions that reuse the same object. Note that :meth:`reset_mock` *doesn't* clear the - return value, :attr:`side_effect` or any child attributes you have + :attr:`return_value`, :attr:`side_effect` or any child attributes you have set using normal assignment by default. In case you want to reset - *return_value* or :attr:`side_effect`, then pass the corresponding + :attr:`return_value` or :attr:`side_effect`, then pass the corresponding parameter as ``True``. Child mocks and the return value mock (if any) are reset as well. - .. note:: *return_value*, and :attr:`side_effect` are keyword-only + .. note:: *return_value*, and *side_effect* are keyword-only arguments. @@ -734,8 +737,8 @@ the *new_callable* argument to :func:`patch`. .. attribute:: __class__ - Normally the :attr:`__class__` attribute of an object will return its type. - For a mock object with a :attr:`spec`, ``__class__`` returns the spec class + Normally the :attr:`!__class__` attribute of an object will return its type. + For a mock object with a :attr:`!spec`, :attr:`!__class__` returns the spec class instead. This allows mock objects to pass :func:`isinstance` tests for the object they are replacing / masquerading as: @@ -743,7 +746,7 @@ the *new_callable* argument to :func:`patch`. >>> isinstance(mock, int) True - :attr:`__class__` is assignable to, this allows a mock to pass an + :attr:`!__class__` is assignable to, this allows a mock to pass an :func:`isinstance` check without forcing you to use a spec: >>> mock = Mock() @@ -757,8 +760,8 @@ the *new_callable* argument to :func:`patch`. meaning of :class:`Mock`, with the exception of *return_value* and *side_effect* which have no meaning on a non-callable mock. -Mock objects that use a class or an instance as a :attr:`spec` or -:attr:`spec_set` are able to pass :func:`isinstance` tests: +Mock objects that use a class or an instance as a :attr:`!spec` or +:attr:`!spec_set` are able to pass :func:`isinstance` tests: >>> mock = Mock(spec=SomeClass) >>> isinstance(mock, SomeClass) @@ -814,14 +817,15 @@ This applies to :meth:`~Mock.assert_called_with`, :meth:`~Mock.assert_any_call`. When :ref:`auto-speccing`, it will also apply to method calls on the mock object. - .. versionchanged:: 3.4 - Added signature introspection on specced and autospecced mock objects. +.. versionchanged:: 3.4 + Added signature introspection on specced and autospecced mock objects. .. class:: PropertyMock(*args, **kwargs) - A mock intended to be used as a property, or other descriptor, on a class. - :class:`PropertyMock` provides :meth:`__get__` and :meth:`__set__` methods + A mock intended to be used as a :class:`property`, or other + :term:`descriptor`, on a class. :class:`PropertyMock` provides + :meth:`~object.__get__` and :meth:`~object.__set__` methods so you can specify a return value when it is fetched. Fetching a :class:`PropertyMock` instance from an object calls the mock, with @@ -856,6 +860,20 @@ object:: 3 >>> p.assert_called_once_with() +.. caution:: + + If an :exc:`AttributeError` is raised by :class:`PropertyMock`, + it will be interpreted as a missing descriptor and + :meth:`~object.__getattr__` will be called on the parent mock:: + + >>> m = MagicMock() + >>> no_attribute = PropertyMock(side_effect=AttributeError) + >>> type(m).my_property = no_attribute + >>> m.my_property + + + See :meth:`~object.__getattr__` for details. + .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) @@ -952,7 +970,7 @@ object:: >>> asyncio.run(main()) >>> mock.assert_awaited_once() >>> asyncio.run(main()) - >>> mock.method.assert_awaited_once() + >>> mock.assert_awaited_once() Traceback (most recent call last): ... AssertionError: Expected mock to have been awaited once. Awaited 2 times. @@ -970,7 +988,7 @@ object:: >>> mock.assert_awaited_with('other') Traceback (most recent call last): ... - AssertionError: expected call not found. + AssertionError: expected await not found. Expected: mock('other') Actual: mock('foo', bar='bar') @@ -1099,6 +1117,51 @@ object:: [call('foo'), call('bar')] +.. class:: ThreadingMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, *, timeout=UNSET, **kwargs) + + A version of :class:`MagicMock` for multithreading tests. The + :class:`ThreadingMock` object provides extra methods to wait for a call to + be invoked, rather than assert on it immediately. + + The default timeout is specified by the ``timeout`` argument, or if unset by the + :attr:`ThreadingMock.DEFAULT_TIMEOUT` attribute, which defaults to blocking (``None``). + + You can configure the global default timeout by setting :attr:`ThreadingMock.DEFAULT_TIMEOUT`. + + .. method:: wait_until_called(*, timeout=UNSET) + + Waits until the mock is called. + + If a timeout was passed at the creation of the mock or if a timeout + argument is passed to this function, the function raises an + :exc:`AssertionError` if the call is not performed in time. + + >>> mock = ThreadingMock() + >>> thread = threading.Thread(target=mock) + >>> thread.start() + >>> mock.wait_until_called(timeout=1) + >>> thread.join() + + .. method:: wait_until_any_call_with(*args, **kwargs) + + Waits until the mock is called with the specified arguments. + + If a timeout was passed at the creation of the mock + the function raises an :exc:`AssertionError` if the call is not performed in time. + + >>> mock = ThreadingMock() + >>> thread = threading.Thread(target=mock, args=("arg1", "arg2",), kwargs={"arg": "thing"}) + >>> thread.start() + >>> mock.wait_until_any_call_with("arg1", "arg2", arg="thing") + >>> thread.join() + + .. attribute:: DEFAULT_TIMEOUT + + Global default timeout in seconds to create instances of :class:`ThreadingMock`. + + .. versionadded:: 3.13 + + Calling ~~~~~~~ @@ -1112,7 +1175,7 @@ Calls made to the object will be recorded in the attributes like :attr:`~Mock.call_args` and :attr:`~Mock.call_args_list`. If :attr:`~Mock.side_effect` is set then it will be called after the call has -been recorded, so if :attr:`side_effect` raises an exception the call is still +been recorded, so if :attr:`!side_effect` raises an exception the call is still recorded. The simplest way to make a mock raise an exception when called is to make @@ -1133,8 +1196,8 @@ The simplest way to make a mock raise an exception when called is to make >>> m.mock_calls [call(1, 2, 3), call('two', 'three', 'four')] -If :attr:`side_effect` is a function then whatever that function returns is what -calls to the mock return. The :attr:`side_effect` function is called with the +If :attr:`~Mock.side_effect` is a function then whatever that function returns is what +calls to the mock return. The :attr:`!side_effect` function is called with the same arguments as the mock. This allows you to vary the return value of the call dynamically, based on the input: @@ -1151,7 +1214,7 @@ call dynamically, based on the input: If you want the mock to still return the default return value (a new mock), or any set return value, then there are two ways of doing this. Either return -:attr:`mock.return_value` from inside :attr:`side_effect`, or return :data:`DEFAULT`: +:attr:`~Mock.return_value` from inside :attr:`~Mock.side_effect`, or return :data:`DEFAULT`: >>> m = MagicMock() >>> def side_effect(*args, **kwargs): @@ -1168,8 +1231,8 @@ any set return value, then there are two ways of doing this. Either return >>> m() 3 -To remove a :attr:`side_effect`, and return to the default behaviour, set the -:attr:`side_effect` to ``None``: +To remove a :attr:`~Mock.side_effect`, and return to the default behaviour, set the +:attr:`!side_effect` to ``None``: >>> m = MagicMock(return_value=6) >>> def side_effect(*args, **kwargs): @@ -1182,7 +1245,7 @@ To remove a :attr:`side_effect`, and return to the default behaviour, set the >>> m() 6 -The :attr:`side_effect` can also be any iterable object. Repeated calls to the mock +The :attr:`~Mock.side_effect` can also be any iterable object. Repeated calls to the mock will return values from the iterable (until the iterable is exhausted and a :exc:`StopIteration` is raised): @@ -1223,7 +1286,7 @@ objects of any type. You may want a mock object to return ``False`` to a :func:`hasattr` call, or raise an :exc:`AttributeError` when an attribute is fetched. You can do this by providing -an object as a :attr:`spec` for a mock, but that isn't always convenient. +an object as a :attr:`!spec` for a mock, but that isn't always convenient. You "block" attributes by deleting them. Once deleted, accessing an attribute will raise an :exc:`AttributeError`. @@ -1388,11 +1451,11 @@ patch .. note:: - .. versionchanged:: 3.5 - If you are patching builtins in a module then you don't - need to pass ``create=True``, it will be added by default. + .. versionchanged:: 3.5 + If you are patching builtins in a module then you don't + need to pass ``create=True``, it will be added by default. - Patch can be used as a :class:`TestCase` class decorator. It works by + Patch can be used as a :class:`~unittest.TestCase` class decorator. It works by decorating each test method in the class. This reduces the boilerplate code when your test methods share a common patchings set. :func:`patch` finds tests by looking for method names that start with ``patch.TEST_PREFIX``. @@ -1430,7 +1493,7 @@ If the class is instantiated multiple times you could use can set the *return_value* to be anything you want. To configure return values on methods of *instances* on the patched class -you must do this on the :attr:`return_value`. For example:: +you must do this on the :attr:`~Mock.return_value`. For example:: >>> class Class: ... def method(self): @@ -1658,8 +1721,9 @@ Keywords can be used in the :func:`patch.dict` call to set values in the diction :func:`patch.dict` can be used with dictionary like objects that aren't actually dictionaries. At the very minimum they must support item getting, setting, deleting and either iteration or membership test. This corresponds to the -magic methods :meth:`__getitem__`, :meth:`__setitem__`, :meth:`__delitem__` and either -:meth:`__iter__` or :meth:`__contains__`. +magic methods :meth:`~object.__getitem__`, :meth:`~object.__setitem__`, +:meth:`~object.__delitem__` and either :meth:`~container.__iter__` or +:meth:`~object.__contains__`. >>> class Container: ... def __init__(self): @@ -1750,13 +1814,13 @@ context manager is a dictionary where created mocks are keyed by name:: patch methods: start and stop ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -All the patchers have :meth:`start` and :meth:`stop` methods. These make it simpler to do +All the patchers have :meth:`!start` and :meth:`!stop` methods. These make it simpler to do patching in ``setUp`` methods or where you want to do multiple patches without nesting decorators or with statements. To use them call :func:`patch`, :func:`patch.object` or :func:`patch.dict` as normal and keep a reference to the returned ``patcher`` object. You can then -call :meth:`start` to put the patch in place and :meth:`stop` to undo it. +call :meth:`!start` to put the patch in place and :meth:`!stop` to undo it. If you are using :func:`patch` to create a mock for you then it will be returned by the call to ``patcher.start``. :: @@ -1773,7 +1837,7 @@ the call to ``patcher.start``. :: A typical use case for this might be for doing multiple patches in the ``setUp`` -method of a :class:`TestCase`:: +method of a :class:`~unittest.TestCase`:: >>> class MyTest(unittest.TestCase): ... def setUp(self): @@ -1958,8 +2022,8 @@ Mocking Magic Methods ~~~~~~~~~~~~~~~~~~~~~ :class:`Mock` supports mocking the Python protocol methods, also known as -"magic methods". This allows mock objects to replace containers or other -objects that implement Python protocols. +:term:`"magic methods" `. This allows mock objects to replace +containers or other objects that implement Python protocols. Because magic methods are looked up differently from normal methods [#]_, this support has been specially implemented. This means that only specific magic @@ -2057,8 +2121,8 @@ There are two ``MagicMock`` variants: :class:`MagicMock` and :class:`NonCallable .. class:: MagicMock(*args, **kw) ``MagicMock`` is a subclass of :class:`Mock` with default implementations - of most of the magic methods. You can use ``MagicMock`` without having to - configure the magic methods yourself. + of most of the :term:`magic methods `. You can use + ``MagicMock`` without having to configure the magic methods yourself. The constructor parameters have the same meaning as for :class:`Mock`. @@ -2092,10 +2156,10 @@ to change the default. Methods and their defaults: -* ``__lt__``: ``NotImplemented`` -* ``__gt__``: ``NotImplemented`` -* ``__le__``: ``NotImplemented`` -* ``__ge__``: ``NotImplemented`` +* ``__lt__``: :data:`NotImplemented` +* ``__gt__``: :data:`!NotImplemented` +* ``__le__``: :data:`!NotImplemented` +* ``__ge__``: :data:`!NotImplemented` * ``__int__``: ``1`` * ``__contains__``: ``False`` * ``__len__``: ``0`` @@ -2122,7 +2186,7 @@ For example: >>> object() in mock False -The two equality methods, :meth:`__eq__` and :meth:`__ne__`, are special. +The two equality methods, :meth:`!__eq__` and :meth:`!__ne__`, are special. They do the default equality comparison on identity, using the :attr:`~Mock.side_effect` attribute, unless you change their return value to return something else:: @@ -2375,6 +2439,14 @@ passed in. >>> m.mock_calls == [call(1), call(1, 2), ANY] True +:data:`ANY` is not limited to comparisons with call objects and so +can also be used in test assertions:: + + class TestStringMethods(unittest.TestCase): + + def test_split(self): + s = 'hello world' + self.assertEqual(s.split(), ['hello', ANY]) FILTER_DIR @@ -2438,7 +2510,7 @@ behaviour you can switch it off by setting the module level switch Alternatively you can just use ``vars(my_mock)`` (instance members) and ``dir(type(my_mock))`` (type members) to bypass the filtering irrespective of -:const:`mock.FILTER_DIR`. +:const:`FILTER_DIR`. mock_open @@ -2453,7 +2525,7 @@ mock_open default) then a :class:`MagicMock` will be created for you, with the API limited to methods or attributes available on standard file handles. - *read_data* is a string for the :meth:`~io.IOBase.read`, + *read_data* is a string for the :meth:`~io.RawIOBase.read`, :meth:`~io.IOBase.readline`, and :meth:`~io.IOBase.readlines` methods of the file handle to return. Calls to those methods will take data from *read_data* until it is depleted. The mock of these methods is pretty @@ -2465,15 +2537,15 @@ mock_open .. versionchanged:: 3.4 Added :meth:`~io.IOBase.readline` and :meth:`~io.IOBase.readlines` support. - The mock of :meth:`~io.IOBase.read` changed to consume *read_data* rather + The mock of :meth:`~io.RawIOBase.read` changed to consume *read_data* rather than returning it on each call. .. versionchanged:: 3.5 *read_data* is now reset on each call to the *mock*. .. versionchanged:: 3.8 - Added :meth:`__iter__` to implementation so that iteration (such as in for - loops) correctly consumes *read_data*. + Added :meth:`~container.__iter__` to implementation so that iteration + (such as in for loops) correctly consumes *read_data*. Using :func:`open` as a context manager is a great way to ensure your file handles are closed properly and is becoming common:: @@ -2482,8 +2554,8 @@ are closed properly and is becoming common:: f.write('something') The issue is that even if you mock out the call to :func:`open` it is the -*returned object* that is used as a context manager (and has :meth:`__enter__` and -:meth:`__exit__` called). +*returned object* that is used as a context manager (and has :meth:`~object.__enter__` and +:meth:`~object.__exit__` called). Mocking context managers with a :class:`MagicMock` is common enough and fiddly enough that a helper function is useful. :: @@ -2517,7 +2589,7 @@ And for reading files:: Autospeccing ~~~~~~~~~~~~ -Autospeccing is based on the existing :attr:`spec` feature of mock. It limits the +Autospeccing is based on the existing :attr:`!spec` feature of mock. It limits the api of mocks to the api of an original object (the spec), but it is recursive (implemented lazily) so that attributes of mocks only have the same api as the attributes of the spec. In addition mocked functions / methods have the @@ -2526,48 +2598,24 @@ called incorrectly. Before I explain how auto-speccing works, here's why it is needed. -:class:`Mock` is a very powerful and flexible object, but it suffers from two flaws -when used to mock out objects from a system under test. One of these flaws is -specific to the :class:`Mock` api and the other is a more general problem with using -mock objects. - -First the problem specific to :class:`Mock`. :class:`Mock` has two assert methods that are -extremely handy: :meth:`~Mock.assert_called_with` and -:meth:`~Mock.assert_called_once_with`. - - >>> mock = Mock(name='Thing', return_value=None) - >>> mock(1, 2, 3) - >>> mock.assert_called_once_with(1, 2, 3) - >>> mock(1, 2, 3) - >>> mock.assert_called_once_with(1, 2, 3) - Traceback (most recent call last): - ... - AssertionError: Expected 'mock' to be called once. Called 2 times. - -Because mocks auto-create attributes on demand, and allow you to call them -with arbitrary arguments, if you misspell one of these assert methods then -your assertion is gone: - -.. code-block:: pycon - - >>> mock = Mock(name='Thing', return_value=None) - >>> mock(1, 2, 3) - >>> mock.assret_called_once_with(4, 5, 6) # Intentional typo! +:class:`Mock` is a very powerful and flexible object, but it suffers from a flaw which +is general to mocking. If you refactor some of your code, rename members and so on, any +tests for code that is still using the *old api* but uses mocks instead of the real +objects will still pass. This means your tests can all pass even though your code is +broken. -Your tests can pass silently and incorrectly because of the typo. +.. versionchanged:: 3.5 -The second issue is more general to mocking. If you refactor some of your -code, rename members and so on, any tests for code that is still using the -*old api* but uses mocks instead of the real objects will still pass. This -means your tests can all pass even though your code is broken. + Before 3.5, tests with a typo in the word assert would silently pass when they should + raise an error. You can still achieve this behavior by passing ``unsafe=True`` to Mock. Note that this is another reason why you need integration tests as well as unit tests. Testing everything in isolation is all fine and dandy, but if you don't test how your units are "wired together" there is still lots of room for bugs that tests might have caught. -:mod:`mock` already provides a feature to help with this, called speccing. If you -use a class or instance as the :attr:`spec` for a mock then you can only access +:mod:`unittest.mock` already provides a feature to help with this, called speccing. If you +use a class or instance as the :attr:`!spec` for a mock then you can only access attributes on the mock that exist on the real class: >>> from urllib import request @@ -2605,7 +2653,7 @@ Here's an example of it in use:: >>> mock_request.Request -You can see that :class:`request.Request` has a spec. :class:`request.Request` takes two +You can see that :class:`!request.Request` has a spec. :class:`!request.Request` takes two arguments in the constructor (one of which is *self*). Here's what happens if we try to call it incorrectly:: @@ -2621,8 +2669,8 @@ specced mocks):: >>> req -:class:`Request` objects are not callable, so the return value of instantiating our -mocked out :class:`request.Request` is a non-callable mock. With the spec in place +:class:`!Request` objects are not callable, so the return value of instantiating our +mocked out :class:`!request.Request` is a non-callable mock. With the spec in place any typos in our asserts will raise the correct error:: >>> req.add_header('spam', 'eggs') @@ -2655,7 +2703,7 @@ able to use autospec. On the other hand it is much better to design your objects so that introspection is safe [#]_. A more serious problem is that it is common for instance attributes to be -created in the :meth:`__init__` method and not to exist on the class at all. +created in the :meth:`~object.__init__` method and not to exist on the class at all. *autospec* can't know about any dynamically created attributes and restricts the api to visible attributes. :: @@ -2696,8 +2744,9 @@ this particular scenario: AttributeError: Mock object has no attribute 'a' Probably the best way of solving the problem is to add class attributes as -default values for instance members initialised in :meth:`__init__`. Note that if -you are only setting default attributes in :meth:`__init__` then providing them via +default values for instance members initialised in :meth:`~object.__init__`. +Note that if +you are only setting default attributes in :meth:`!__init__` then providing them via class attributes (shared between instances of course) is faster too. e.g. .. code-block:: python @@ -2771,3 +2820,123 @@ Sealing mocks >>> mock.not_submock.attribute2 # This won't raise. .. versionadded:: 3.7 + + +Order of precedence of :attr:`!side_effect`, :attr:`!return_value` and *wraps* +------------------------------------------------------------------------------ + +The order of their precedence is: + +1. :attr:`~Mock.side_effect` +2. :attr:`~Mock.return_value` +3. *wraps* + +If all three are set, mock will return the value from :attr:`~Mock.side_effect`, +ignoring :attr:`~Mock.return_value` and the wrapped object altogether. If any +two are set, the one with the higher precedence will return the value. +Regardless of the order of which was set first, the order of precedence +remains unchanged. + + >>> from unittest.mock import Mock + >>> class Order: + ... @staticmethod + ... def get_value(): + ... return "third" + ... + >>> order_mock = Mock(spec=Order, wraps=Order) + >>> order_mock.get_value.side_effect = ["first"] + >>> order_mock.get_value.return_value = "second" + >>> order_mock.get_value() + 'first' + +As ``None`` is the default value of :attr:`~Mock.side_effect`, if you reassign +its value back to ``None``, the order of precedence will be checked between +:attr:`~Mock.return_value` and the wrapped object, ignoring +:attr:`~Mock.side_effect`. + + >>> order_mock.get_value.side_effect = None + >>> order_mock.get_value() + 'second' + +If the value being returned by :attr:`~Mock.side_effect` is :data:`DEFAULT`, +it is ignored and the order of precedence moves to the successor to obtain the +value to return. + + >>> from unittest.mock import DEFAULT + >>> order_mock.get_value.side_effect = [DEFAULT] + >>> order_mock.get_value() + 'second' + +When :class:`Mock` wraps an object, the default value of +:attr:`~Mock.return_value` will be :data:`DEFAULT`. + + >>> order_mock = Mock(spec=Order, wraps=Order) + >>> order_mock.return_value + sentinel.DEFAULT + >>> order_mock.get_value.return_value + sentinel.DEFAULT + +The order of precedence will ignore this value and it will move to the last +successor which is the wrapped object. + +As the real call is being made to the wrapped object, creating an instance of +this mock will return the real instance of the class. The positional arguments, +if any, required by the wrapped object must be passed. + + >>> order_mock_instance = order_mock() + >>> isinstance(order_mock_instance, Order) + True + >>> order_mock_instance.get_value() + 'third' + + >>> order_mock.get_value.return_value = DEFAULT + >>> order_mock.get_value() + 'third' + + >>> order_mock.get_value.return_value = "second" + >>> order_mock.get_value() + 'second' + +But if you assign ``None`` to it, this will not be ignored as it is an +explicit assignment. So, the order of precedence will not move to the wrapped +object. + + >>> order_mock.get_value.return_value = None + >>> order_mock.get_value() is None + True + +Even if you set all three at once when initializing the mock, the order of +precedence remains the same: + + >>> order_mock = Mock(spec=Order, wraps=Order, + ... **{"get_value.side_effect": ["first"], + ... "get_value.return_value": "second"} + ... ) + ... + >>> order_mock.get_value() + 'first' + >>> order_mock.get_value.side_effect = None + >>> order_mock.get_value() + 'second' + >>> order_mock.get_value.return_value = DEFAULT + >>> order_mock.get_value() + 'third' + +If :attr:`~Mock.side_effect` is exhausted, the order of precedence will not +cause a value to be obtained from the successors. Instead, ``StopIteration`` +exception is raised. + + >>> order_mock = Mock(spec=Order, wraps=Order) + >>> order_mock.get_value.side_effect = ["first side effect value", + ... "another side effect value"] + >>> order_mock.get_value.return_value = "second" + + >>> order_mock.get_value() + 'first side effect value' + >>> order_mock.get_value() + 'another side effect value' + + >>> order_mock.get_value() + Traceback (most recent call last): + ... + StopIteration diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 4c28e8fa..c49aba69 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1,5 +1,5 @@ -:mod:`unittest` --- Unit testing framework -========================================== +:mod:`!unittest` --- Unit testing framework +=========================================== .. module:: unittest :synopsis: Unit testing framework for Python. @@ -206,13 +206,13 @@ Command-line options .. program:: unittest -.. cmdoption:: -b, --buffer +.. option:: -b, --buffer The standard output and standard error streams are buffered during the test run. Output during a passing test is discarded. Output is echoed normally on test fail or error and is added to the failure messages. -.. cmdoption:: -c, --catch +.. option:: -c, --catch :kbd:`Control-C` during the test run waits for the current test to end and then reports all the results so far. A second :kbd:`Control-C` raises the normal @@ -220,11 +220,11 @@ Command-line options See `Signal Handling`_ for the functions that provide this functionality. -.. cmdoption:: -f, --failfast +.. option:: -f, --failfast Stop the test run on the first error or failure. -.. cmdoption:: -k +.. option:: -k Only run test methods and classes that match the pattern or substring. This option may be used multiple times, in which case all test cases that @@ -240,11 +240,11 @@ Command-line options For example, ``-k foo`` matches ``foo_tests.SomeTest.test_something``, ``bar_tests.SomeTest.test_foo``, but not ``bar_tests.FooTest.test_something``. -.. cmdoption:: --locals +.. option:: --locals Show local variables in tracebacks. -.. cmdoption:: --durations N +.. option:: --durations N Show the N slowest test cases (N=0 for all). @@ -292,19 +292,19 @@ The ``discover`` sub-command has the following options: .. program:: unittest discover -.. cmdoption:: -v, --verbose +.. option:: -v, --verbose Verbose output -.. cmdoption:: -s, --start-directory directory +.. option:: -s, --start-directory directory Directory to start discovery (``.`` default) -.. cmdoption:: -p, --pattern pattern +.. option:: -p, --pattern pattern Pattern to match test files (``test*.py`` default) -.. cmdoption:: -t, --top-level-directory directory +.. option:: -t, --top-level-directory directory Top level directory of project (defaults to start directory) @@ -346,8 +346,8 @@ the `load_tests protocol`_. ``python -m unittest discover -s root/namespace -t root``). .. versionchanged:: 3.11 - Python 3.11 dropped the :term:`namespace packages ` - support. It has been broken since Python 3.7. Start directory and + :mod:`unittest` dropped the :term:`namespace packages ` + support in Python 3.11. It has been broken since Python 3.7. Start directory and subdirectories containing tests must be regular package that have ``__init__.py`` file. @@ -390,8 +390,8 @@ testing code:: widget = Widget('The widget') self.assertEqual(widget.size(), (50, 50)) -Note that in order to test something, we use one of the :meth:`assert\*` -methods provided by the :class:`TestCase` base class. If the test fails, an +Note that in order to test something, we use one of the :ref:`assert\* methods ` +provided by the :class:`TestCase` base class. If the test fails, an exception will be raised with an explanatory message, and :mod:`unittest` will identify the test case as a :dfn:`failure`. Any other exceptions will be treated as :dfn:`errors`. @@ -1571,6 +1571,14 @@ Test cases .. versionadded:: 3.8 + .. attribute:: loop_factory + + The *loop_factory* passed to :class:`asyncio.Runner`. Override + in subclasses with :class:`asyncio.EventLoop` to avoid using the + asyncio policy system. + + .. versionadded:: 3.13 + .. coroutinemethod:: asyncSetUp() Method called to prepare the test fixture. This is called after :meth:`setUp`. @@ -1725,7 +1733,7 @@ Grouping tests .. method:: __iter__() Tests grouped by a :class:`TestSuite` are always accessed by iteration. - Subclasses can lazily provide tests by overriding :meth:`__iter__`. Note + Subclasses can lazily provide tests by overriding :meth:`!__iter__`. Note that this method may be called several times on a single suite (for example when counting tests or comparing for equality) so the tests returned by repeated iterations before :meth:`TestSuite.run` must be the @@ -1736,7 +1744,7 @@ Grouping tests .. versionchanged:: 3.2 In earlier versions the :class:`TestSuite` accessed tests directly rather - than through iteration, so overriding :meth:`__iter__` wasn't sufficient + than through iteration, so overriding :meth:`!__iter__` wasn't sufficient for providing tests. .. versionchanged:: 3.4 @@ -1872,8 +1880,8 @@ Loading and running tests Python identifiers) will be loaded. All test modules must be importable from the top level of the project. If - the start directory is not the top level directory then the top level - directory must be specified separately. + the start directory is not the top level directory then *top_level_dir* + must be specified separately. If importing a module fails, for example due to a syntax error, then this will be recorded as a single error and discovery will continue. If @@ -1893,9 +1901,11 @@ Loading and running tests package. The pattern is deliberately not stored as a loader attribute so that - packages can continue discovery themselves. *top_level_dir* is stored so - ``load_tests`` does not need to pass this argument in to - ``loader.discover()``. + packages can continue discovery themselves. + + *top_level_dir* is stored internally, and used as a default to any + nested calls to ``discover()``. That is, if a package's ``load_tests`` + calls ``loader.discover()``, it does not need to pass this argument. *start_dir* can be a dotted module name as well as a directory. @@ -1922,6 +1932,9 @@ Loading and running tests *start_dir* can not be a :term:`namespace packages `. It has been broken since Python 3.7 and Python 3.11 officially remove it. + .. versionchanged:: 3.13 + *top_level_dir* is only stored for the duration of *discover* call. + The following attributes of a :class:`TestLoader` can be configured either by subclassing or assignment on an instance: @@ -1932,14 +1945,14 @@ Loading and running tests String giving the prefix of method names which will be interpreted as test methods. The default value is ``'test'``. - This affects :meth:`getTestCaseNames` and all the :meth:`loadTestsFrom\*` + This affects :meth:`getTestCaseNames` and all the ``loadTestsFrom*`` methods. .. attribute:: sortTestMethodsUsing Function to be used to compare method names when sorting them in - :meth:`getTestCaseNames` and all the :meth:`loadTestsFrom\*` methods. + :meth:`getTestCaseNames` and all the ``loadTestsFrom*`` methods. .. attribute:: suiteClass @@ -1948,7 +1961,7 @@ Loading and running tests methods on the resulting object are needed. The default value is the :class:`TestSuite` class. - This affects all the :meth:`loadTestsFrom\*` methods. + This affects all the ``loadTestsFrom*`` methods. .. attribute:: testNamePatterns @@ -1961,7 +1974,7 @@ Loading and running tests so unlike patterns passed to the ``-k`` option, simple substring patterns will have to be converted using ``*`` wildcards. - This affects all the :meth:`loadTestsFrom\*` methods. + This affects all the ``loadTestsFrom*`` methods. .. versionadded:: 3.7 @@ -1995,7 +2008,7 @@ Loading and running tests A list containing 2-tuples of :class:`TestCase` instances and strings holding formatted tracebacks. Each tuple represents a test where a failure - was explicitly signalled using the :meth:`TestCase.assert\*` methods. + was explicitly signalled using the :ref:`assert\* methods `. .. attribute:: skipped @@ -2188,8 +2201,8 @@ Loading and running tests .. versionadded:: 3.2 - .. versionadded:: 3.12 - Added *durations* keyword argument. + .. versionchanged:: 3.12 + Added the *durations* keyword parameter. .. data:: defaultTestLoader @@ -2282,7 +2295,7 @@ Loading and running tests The *testRunner* argument can either be a test runner class or an already created instance of it. By default ``main`` calls :func:`sys.exit` with an exit code indicating success (0) or failure (1) of the tests run. - An exit code of 5 indicates that no tests were run. + An exit code of 5 indicates that no tests were run or skipped. The *testLoader* argument has to be a :class:`TestLoader` instance, and defaults to :data:`defaultTestLoader`. @@ -2303,8 +2316,8 @@ Loading and running tests (see :ref:`Warning control `), otherwise it will be set to ``'default'``. - Calling ``main`` actually returns an instance of the ``TestProgram`` class. - This stores the result of the tests run as the ``result`` attribute. + Calling ``main`` returns an object with the ``result`` attribute that contains + the result of the tests run as a :class:`unittest.TestResult`. .. versionchanged:: 3.1 The *exit* parameter was added. @@ -2318,6 +2331,8 @@ Loading and running tests test names. +.. _load_tests-protocol: + load_tests Protocol ################### @@ -2514,7 +2529,7 @@ Signal Handling .. versionadded:: 3.2 The :option:`-c/--catch ` command-line option to unittest, -along with the ``catchbreak`` parameter to :func:`unittest.main()`, provide +along with the ``catchbreak`` parameter to :func:`unittest.main`, provide more friendly handling of control-C during a test run. With catch break behavior enabled control-C will allow the currently running test to complete, and the test run will then end and report all the results so far. A second diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst index a5bcb5b1..1686ddd0 100644 --- a/Doc/library/urllib.error.rst +++ b/Doc/library/urllib.error.rst @@ -1,5 +1,5 @@ -:mod:`urllib.error` --- Exception classes raised by urllib.request -================================================================== +:mod:`!urllib.error` --- Exception classes raised by urllib.request +=================================================================== .. module:: urllib.error :synopsis: Exception classes raised by urllib.request. @@ -27,8 +27,8 @@ The following exceptions are raised by :mod:`urllib.error` as appropriate: exception instance. .. versionchanged:: 3.3 - :exc:`URLError` has been made a subclass of :exc:`OSError` instead - of :exc:`IOError`. + :exc:`URLError` used to be a subtype of :exc:`IOError`, which is now an + alias of :exc:`OSError`. .. exception:: HTTPError(url, code, msg, hdrs, fp) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 53e5f039..69daa381 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -1,5 +1,5 @@ -:mod:`urllib.parse` --- Parse URLs into components -================================================== +:mod:`!urllib.parse` --- Parse URLs into components +=================================================== .. module:: urllib.parse :synopsis: Parse URLs into or assemble them from components. @@ -22,15 +22,28 @@ to an absolute URL given a "base URL." The module has been designed to match the internet RFC on Relative Uniform Resource Locators. It supports the following URL schemes: ``file``, ``ftp``, -``gopher``, ``hdl``, ``http``, ``https``, ``imap``, ``mailto``, ``mms``, +``gopher``, ``hdl``, ``http``, ``https``, ``imap``, ``itms-services``, ``mailto``, ``mms``, ``news``, ``nntp``, ``prospero``, ``rsync``, ``rtsp``, ``rtsps``, ``rtspu``, ``sftp``, ``shttp``, ``sip``, ``sips``, ``snews``, ``svn``, ``svn+ssh``, ``telnet``, ``wais``, ``ws``, ``wss``. +.. impl-detail:: + + The inclusion of the ``itms-services`` URL scheme can prevent an app from + passing Apple's App Store review process for the macOS and iOS App Stores. + Handling for the ``itms-services`` scheme is always removed on iOS; on + macOS, it *may* be removed if CPython has been built with the + :option:`--with-app-store-compliance` option. + The :mod:`urllib.parse` module defines functions that fall into two broad categories: URL parsing and URL quoting. These are covered in detail in the following sections. +This module's functions use the deprecated term ``netloc`` (or ``net_loc``), +which was introduced in :rfc:`1808`. However, this term has been obsoleted by +:rfc:`3986`, which introduced the term ``authority`` as its replacement. +The use of ``netloc`` is continued for backward compatibility. + URL Parsing ----------- @@ -168,7 +181,7 @@ or on combining URL components into a URL string. Added IPv6 URL parsing capabilities. .. versionchanged:: 3.3 - The fragment is now parsed for all URL schemes (unless *allow_fragment* is + The fragment is now parsed for all URL schemes (unless *allow_fragments* is false), in accordance with :rfc:`3986`. Previously, an allowlist of schemes that support fragments existed. @@ -390,6 +403,15 @@ or on combining URL components into a URL string. If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. + .. warning:: + + Because an absolute URL may be passed as the ``url`` parameter, it is + generally **not secure** to use ``urljoin`` with an attacker-controlled + ``url``. For example in, + ``urljoin("https://website.com/users/", username)``, if ``username`` can + contain an absolute URL, the result of ``urljoin`` will be the absolute + URL. + .. versionchanged:: 3.5 @@ -729,8 +751,8 @@ task isn't already covered by the URL parsing functions above. .. versionchanged:: 3.2 *query* supports bytes and string objects. - .. versionadded:: 3.5 - *quote_via* parameter. + .. versionchanged:: 3.5 + Added the *quote_via* parameter. .. seealso:: diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 35b8f5b4..46e0f627 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1,5 +1,5 @@ -:mod:`urllib.request` --- Extensible library for opening URLs -============================================================= +:mod:`!urllib.request` --- Extensible library for opening URLs +============================================================== .. module:: urllib.request :synopsis: Extensible library for opening URLs. @@ -21,12 +21,20 @@ authentication, redirections, cookies and more. The `Requests package `_ is recommended for a higher-level HTTP client interface. +.. warning:: + + On macOS it is unsafe to use this module in programs using + :func:`os.fork` because the :func:`getproxies` implementation for + macOS uses a higher-level system API. Set the environment variable + ``no_proxy`` to ``*`` to avoid this problem + (e.g. ``os.environ["no_proxy"] = "*"``). + .. include:: ../includes/wasm-notavail.rst The :mod:`urllib.request` module defines the following functions: -.. function:: urlopen(url, data=None[, timeout], *, cafile=None, capath=None, cadefault=False, context=None) +.. function:: urlopen(url, data=None[, timeout], *, context=None) Open *url*, which can be either a string containing a valid, properly encoded URL, or a :class:`Request` object. @@ -47,14 +55,6 @@ The :mod:`urllib.request` module defines the following functions: describing the various SSL options. See :class:`~http.client.HTTPSConnection` for more details. - The optional *cafile* and *capath* parameters specify a set of trusted - CA certificates for HTTPS requests. *cafile* should point to a single - file containing a bundle of CA certificates, whereas *capath* should - point to a directory of hashed certificate files. More information can - be found in :meth:`ssl.SSLContext.load_verify_locations`. - - The *cadefault* parameter is ignored. - This function always returns an object which can work as a :term:`context manager` and has the properties *url*, *headers*, and *status*. See :class:`urllib.response.addinfourl` for more detail on these properties. @@ -78,7 +78,7 @@ The :mod:`urllib.request` module defines the following functions: :class:`UnknownHandler` to ensure this never happens). In addition, if proxy settings are detected (for example, when a ``*_proxy`` - environment variable like :envvar:`http_proxy` is set), + environment variable like :envvar:`!http_proxy` is set), :class:`ProxyHandler` is default installed and makes sure the requests are handled through the proxy. @@ -97,11 +97,9 @@ The :mod:`urllib.request` module defines the following functions: .. versionchanged:: 3.2 *cafile* and *capath* were added. - .. versionchanged:: 3.2 HTTPS virtual hosts are now supported if possible (that is, if :const:`ssl.HAS_SNI` is true). - .. versionadded:: 3.2 *data* can be an iterable object. .. versionchanged:: 3.3 @@ -113,14 +111,11 @@ The :mod:`urllib.request` module defines the following functions: .. versionchanged:: 3.10 HTTPS connection now send an ALPN extension with protocol indicator ``http/1.1`` when no *context* is given. Custom *context* should set - ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. - - .. deprecated:: 3.6 + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocols`. - *cafile*, *capath* and *cadefault* are deprecated in favor of *context*. - Please use :meth:`ssl.SSLContext.load_cert_chain` instead, or let - :func:`ssl.create_default_context` select the system's trusted CA - certificates for you. + .. versionchanged:: 3.13 + Remove *cafile*, *capath* and *cadefault* parameters: use the *context* + parameter instead. .. function:: install_opener(opener) @@ -154,16 +149,28 @@ The :mod:`urllib.request` module defines the following functions: .. function:: pathname2url(path) - Convert the pathname *path* from the local syntax for a path to the form used in - the path component of a URL. This does not produce a complete URL. The return - value will already be quoted using the :func:`~urllib.parse.quote` function. + Convert the given local path to a ``file:`` URL. This function uses + :func:`~urllib.parse.quote` function to encode the path. For historical + reasons, the return value omits the ``file:`` scheme prefix. This example + shows the function being used on Windows:: + >>> from urllib.request import pathname2url + >>> path = 'C:\\Program Files' + >>> 'file:' + pathname2url(path) + 'file:///C:/Program%20Files' -.. function:: url2pathname(path) - Convert the path component *path* from a percent-encoded URL to the local syntax for a - path. This does not accept a complete URL. This function uses - :func:`~urllib.parse.unquote` to decode *path*. +.. function:: url2pathname(url) + + Convert the given ``file:`` URL to a local path. This function uses + :func:`~urllib.parse.unquote` to decode the URL. For historical reasons, + the given value *must* omit the ``file:`` scheme prefix. This example shows + the function being used on Windows:: + + >>> from urllib.request import url2pathname + >>> url = 'file:///C:/Program%20Files' + >>> url2pathname(url.removeprefix('file:')) + 'C:\\Program Files' .. function:: getproxies() @@ -223,7 +230,7 @@ The following classes are provided: An appropriate ``Content-Type`` header should be included if the *data* argument is present. If this header has not been provided and *data* - is not None, ``Content-Type: application/x-www-form-urlencoded`` will + is not ``None``, ``Content-Type: application/x-www-form-urlencoded`` will be added as a default. The next two arguments are only of interest for correct handling @@ -246,7 +253,7 @@ The following classes are provided: *method* should be a string that indicates the HTTP request method that will be used (e.g. ``'HEAD'``). If provided, its value is stored in the - :attr:`~Request.method` attribute and is used by :meth:`get_method()`. + :attr:`~Request.method` attribute and is used by :meth:`get_method`. The default is ``'GET'`` if *data* is ``None`` or ``'POST'`` otherwise. Subclasses may indicate a different default method by setting the :attr:`~Request.method` attribute in the class itself. @@ -315,10 +322,10 @@ The following classes are provided: list of hostname suffixes, optionally with ``:port`` appended, for example ``cern.ch,ncsa.uiuc.edu,some.host:8080``. - .. note:: + .. note:: - ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; - see the documentation on :func:`~urllib.request.getproxies`. + ``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; + see the documentation on :func:`~urllib.request.getproxies`. .. class:: HTTPPasswordMgr() @@ -621,25 +628,25 @@ OpenerDirector Objects the actual HTTP code, for example :meth:`http_error_404` would handle HTTP 404 errors. - * :meth:`_open` --- signal that the handler knows how to open *protocol* + * :meth:`!_open` --- signal that the handler knows how to open *protocol* URLs. See |protocol_open|_ for more information. - * :meth:`http_error_\` --- signal that the handler knows how to handle HTTP + * :meth:`!http_error_\` --- signal that the handler knows how to handle HTTP errors with HTTP error code *type*. See |http_error_nnn|_ for more information. - * :meth:`_error` --- signal that the handler knows how to handle errors + * :meth:`!_error` --- signal that the handler knows how to handle errors from (non-\ ``http``) *protocol*. - * :meth:`_request` --- signal that the handler knows how to pre-process + * :meth:`!_request` --- signal that the handler knows how to pre-process *protocol* requests. See |protocol_request|_ for more information. - * :meth:`_response` --- signal that the handler knows how to + * :meth:`!_response` --- signal that the handler knows how to post-process *protocol* responses. See |protocol_response|_ for more information. @@ -666,7 +673,7 @@ OpenerDirector Objects Handle an error of the given protocol. This will call the registered error handlers for the given protocol with the given arguments (which are protocol specific). The HTTP protocol is a special case which uses the HTTP response - code to determine the specific error handler; refer to the :meth:`http_error_\` + code to determine the specific error handler; refer to the :meth:`!http_error_\` methods of the handler classes. Return values and exceptions raised are the same as those of :func:`urlopen`. @@ -676,25 +683,25 @@ OpenerDirector objects open URLs in three stages: The order in which these methods are called within each stage is determined by sorting the handler instances. -#. Every handler with a method named like :meth:`_request` has that +#. Every handler with a method named like :meth:`!_request` has that method called to pre-process the request. -#. Handlers with a method named like :meth:`_open` are called to handle +#. Handlers with a method named like :meth:`!_open` are called to handle the request. This stage ends when a handler either returns a non-\ :const:`None` value (ie. a response), or raises an exception (usually :exc:`~urllib.error.URLError`). Exceptions are allowed to propagate. In fact, the above algorithm is first tried for methods named - :meth:`default_open`. If all such methods return :const:`None`, the algorithm - is repeated for methods named like :meth:`_open`. If all such methods + :meth:`~BaseHandler.default_open`. If all such methods return :const:`None`, the algorithm + is repeated for methods named like :meth:`!_open`. If all such methods return :const:`None`, the algorithm is repeated for methods named - :meth:`unknown_open`. + :meth:`~BaseHandler.unknown_open`. Note that the implementation of these methods may involve calls of the parent :class:`OpenerDirector` instance's :meth:`~OpenerDirector.open` and :meth:`~OpenerDirector.error` methods. -#. Every handler with a method named like :meth:`_response` has that +#. Every handler with a method named like :meth:`!_response` has that method called to post-process the response. @@ -723,8 +730,8 @@ The following attribute and methods should only be used by classes derived from .. note:: The convention has been adopted that subclasses defining - :meth:`_request` or :meth:`_response` methods are named - :class:`\*Processor`; all others are named :class:`\*Handler`. + :meth:`!_request` or :meth:`!_response` methods are named + :class:`!\*Processor`; all others are named :class:`!\*Handler`. .. attribute:: BaseHandler.parent @@ -743,7 +750,7 @@ The following attribute and methods should only be used by classes derived from the return value of the :meth:`~OpenerDirector.open` method of :class:`OpenerDirector`, or ``None``. It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional thing happens (for example, :exc:`MemoryError` should not be mapped to - :exc:`URLError`). + :exc:`~urllib.error.URLError`). This method will be called before any protocol-specific open method. @@ -756,7 +763,7 @@ The following attribute and methods should only be used by classes derived from define it if they want to handle URLs with the given protocol. This method, if defined, will be called by the parent :class:`OpenerDirector`. - Return values should be the same as for :meth:`default_open`. + Return values should be the same as for :meth:`~BaseHandler.default_open`. .. method:: BaseHandler.unknown_open(req) @@ -796,7 +803,7 @@ The following attribute and methods should only be used by classes derived from Subclasses should override this method to handle specific HTTP errors. Arguments, return values and exceptions raised should be the same as for - :meth:`http_error_default`. + :meth:`~BaseHandler.http_error_default`. .. _protocol_request: @@ -836,7 +843,7 @@ HTTPRedirectHandler Objects is the case, :exc:`~urllib.error.HTTPError` is raised. See :rfc:`2616` for details of the precise meanings of the various redirection codes. - An :class:`HTTPError` exception raised as a security consideration if the + An :exc:`~urllib.error.HTTPError` exception raised as a security consideration if the HTTPRedirectHandler is presented with a redirected URL which is not an HTTP, HTTPS or FTP URL. @@ -844,9 +851,9 @@ HTTPRedirectHandler Objects .. method:: HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl) Return a :class:`Request` or ``None`` in response to a redirect. This is called - by the default implementations of the :meth:`http_error_30\*` methods when a + by the default implementations of the :meth:`!http_error_30\*` methods when a redirection is received from the server. If a redirection should take place, - return a new :class:`Request` to allow :meth:`http_error_30\*` to perform the + return a new :class:`Request` to allow :meth:`!http_error_30\*` to perform the redirect to *newurl*. Otherwise, raise :exc:`~urllib.error.HTTPError` if no other handler should try to handle this URL, or return ``None`` if you can't but another handler might. @@ -913,7 +920,7 @@ ProxyHandler Objects .. method:: ProxyHandler._open(request) :noindex: - The :class:`ProxyHandler` will have a method :meth:`_open` for every + The :class:`ProxyHandler` will have a method :meth:`!_open` for every *protocol* which has a proxy in the *proxies* dictionary given in the constructor. The method will modify requests to go through the proxy, by calling ``request.set_proxy()``, and call the next handler in the chain to @@ -1097,7 +1104,7 @@ FileHandler Objects .. versionchanged:: 3.2 This method is applicable only for local hostnames. When a remote - hostname is given, an :exc:`~urllib.error.URLError` is raised. + hostname is given, a :exc:`~urllib.error.URLError` is raised. .. _data-handler-objects: @@ -1112,7 +1119,7 @@ DataHandler Objects ignores white spaces in base64 encoded data URLs so the URL may be wrapped in whatever source file it comes from. But even though some browsers don't mind about a missing padding at the end of a base64 encoded data URL, this - implementation will raise an :exc:`ValueError` in that case. + implementation will raise a :exc:`ValueError` in that case. .. _ftp-handler-objects: @@ -1169,7 +1176,7 @@ HTTPErrorProcessor Objects For 200 error codes, the response object is returned immediately. For non-200 error codes, this simply passes the job on to the - :meth:`http_error_\` handler methods, via :meth:`OpenerDirector.error`. + :meth:`!http_error_\` handler methods, via :meth:`OpenerDirector.error`. Eventually, :class:`HTTPDefaultErrorHandler` will raise an :exc:`~urllib.error.HTTPError` if no other handler handles the error. @@ -1276,7 +1283,7 @@ Use of Basic HTTP Authentication:: :func:`build_opener` provides many handlers by default, including a :class:`ProxyHandler`. By default, :class:`ProxyHandler` uses the environment variables named ``_proxy``, where ```` is the URL scheme -involved. For example, the :envvar:`http_proxy` environment variable is read to +involved. For example, the :envvar:`!http_proxy` environment variable is read to obtain the HTTP proxy's URL. This example replaces the default :class:`ProxyHandler` with one that uses @@ -1371,7 +1378,7 @@ some point in the future. points to a local file, the object will not be copied unless filename is supplied. Return a tuple ``(filename, headers)`` where *filename* is the local file name under which the object can be found, and *headers* is whatever - the :meth:`info` method of the object returned by :func:`urlopen` returned (for + the :meth:`!info` method of the object returned by :func:`urlopen` returned (for a remote object). Exceptions are the same as for :func:`urlopen`. The second argument, if present, specifies the file location to copy to (if @@ -1396,7 +1403,7 @@ some point in the future. :mimetype:`application/x-www-form-urlencoded` format; see the :func:`urllib.parse.urlencode` function. - :func:`urlretrieve` will raise :exc:`ContentTooShortError` when it detects that + :func:`urlretrieve` will raise :exc:`~urllib.error.ContentTooShortError` when it detects that the amount of data available was less than the expected amount (which is the size reported by a *Content-Length* header). This can occur, for example, when the download is interrupted. @@ -1405,8 +1412,8 @@ some point in the future. urlretrieve reads more data, but if less data is available, it raises the exception. - You can still retrieve the downloaded data in this case, it is stored in the - :attr:`content` attribute of the exception instance. + You can still retrieve the downloaded data in this case, it is stored in the + :attr:`!content` attribute of the exception instance. If no *Content-Length* header was supplied, urlretrieve can not check the size of the data it has downloaded, and just returns it. In this case you just have @@ -1500,7 +1507,7 @@ some point in the future. authentication is performed. For the 30x response codes, recursion is bounded by the value of the *maxtries* attribute, which defaults to 10. - For all other response codes, the method :meth:`http_error_default` is called + For all other response codes, the method :meth:`~BaseHandler.http_error_default` is called which you can override in subclasses to handle the error appropriately. .. note:: @@ -1536,9 +1543,9 @@ some point in the future. :mod:`urllib.request` Restrictions ---------------------------------- - .. index:: - pair: HTTP; protocol - pair: FTP; protocol +.. index:: + pair: HTTP; protocol + pair: FTP; protocol * Currently, only the following protocols are supported: HTTP (versions 0.9 and 1.0), FTP, local files, and data URLs. diff --git a/Doc/library/urllib.robotparser.rst b/Doc/library/urllib.robotparser.rst index f063e463..016fcdc7 100644 --- a/Doc/library/urllib.robotparser.rst +++ b/Doc/library/urllib.robotparser.rst @@ -1,11 +1,11 @@ -:mod:`urllib.robotparser` --- Parser for robots.txt -==================================================== +:mod:`!urllib.robotparser` --- Parser for robots.txt +===================================================== .. module:: urllib.robotparser :synopsis: Load a robots.txt file and answer questions about fetchability of other URLs. -.. sectionauthor:: Skip Montanaro +.. sectionauthor:: Skip Montanaro **Source code:** :source:`Lib/urllib/robotparser.py` diff --git a/Doc/library/urllib.rst b/Doc/library/urllib.rst index 624e1646..7d9f39ef 100644 --- a/Doc/library/urllib.rst +++ b/Doc/library/urllib.rst @@ -1,5 +1,5 @@ -:mod:`urllib` --- URL handling modules -====================================== +:mod:`!urllib` --- URL handling modules +======================================= .. module:: urllib diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index 83c4aec4..0636d180 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -1,72 +1,15 @@ -:mod:`uu` --- Encode and decode uuencode files -============================================== +:mod:`!uu` --- Encode and decode uuencode files +=============================================== .. module:: uu - :synopsis: Encode and decode files in uuencode format. + :synopsis: Removed in 3.13. :deprecated: -.. moduleauthor:: Lance Ellinghouse - -**Source code:** :source:`Lib/uu.py` - .. deprecated-removed:: 3.11 3.13 - The :mod:`uu` module is deprecated - (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). - :mod:`base64` is a modern alternative. - --------------- - -This module encodes and decodes files in uuencode format, allowing arbitrary -binary data to be transferred over ASCII-only connections. Wherever a file -argument is expected, the methods accept a file-like object. For backwards -compatibility, a string containing a pathname is also accepted, and the -corresponding file will be opened for reading and writing; the pathname ``'-'`` -is understood to mean the standard input or output. However, this interface is -deprecated; it's better for the caller to open the file itself, and be sure -that, when required, the mode is ``'rb'`` or ``'wb'`` on Windows. - -.. index:: - single: Jansen, Jack - single: Ellinghouse, Lance - -This code was contributed by Lance Ellinghouse, and modified by Jack Jansen. - -The :mod:`uu` module defines the following functions: - - -.. function:: encode(in_file, out_file, name=None, mode=None, *, backtick=False) - - Uuencode file *in_file* into file *out_file*. The uuencoded file will have - the header specifying *name* and *mode* as the defaults for the results of - decoding the file. The default defaults are taken from *in_file*, or ``'-'`` - and ``0o666`` respectively. If *backtick* is true, zeros are represented by - ``'`'`` instead of spaces. - - .. versionchanged:: 3.7 - Added the *backtick* parameter. - - -.. function:: decode(in_file, out_file=None, mode=None, quiet=False) - - This call decodes uuencoded file *in_file* placing the result on file - *out_file*. If *out_file* is a pathname, *mode* is used to set the permission - bits if the file must be created. Defaults for *out_file* and *mode* are taken - from the uuencode header. However, if the file specified in the header already - exists, a :exc:`uu.Error` is raised. - - :func:`decode` may print a warning to standard error if the input was produced - by an incorrect uuencoder and Python could recover from that error. Setting - *quiet* to a true value silences this warning. - - -.. exception:: Error() - - Subclass of :exc:`Exception`, this can be raised by :func:`uu.decode` under - various situations, such as described above, but also including a badly - formatted header, or truncated input file. - -.. seealso:: +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. - Module :mod:`binascii` - Support module containing ASCII-to-binary and binary-to-ASCII conversions. +The last version of Python that provided the :mod:`!uu` module was +`Python 3.12 `_. diff --git a/Doc/library/uuid.rst b/Doc/library/uuid.rst index adf01770..0f2d7820 100644 --- a/Doc/library/uuid.rst +++ b/Doc/library/uuid.rst @@ -1,5 +1,5 @@ -:mod:`uuid` --- UUID objects according to :rfc:`4122` -===================================================== +:mod:`!uuid` --- UUID objects according to :rfc:`4122` +====================================================== .. module:: uuid :synopsis: UUID objects (universally unique identifiers) according to RFC 4122 @@ -289,25 +289,25 @@ The following options are accepted: .. program:: uuid -.. cmdoption:: -h, --help +.. option:: -h, --help Show the help message and exit. -.. cmdoption:: -u - --uuid +.. option:: -u + --uuid Specify the function name to use to generate the uuid. By default :func:`uuid4` is used. -.. cmdoption:: -n - --namespace +.. option:: -n + --namespace The namespace is a ``UUID``, or ``@ns`` where ``ns`` is a well-known predefined UUID addressed by namespace name. Such as ``@dns``, ``@url``, ``@oid``, and ``@x500``. Only required for :func:`uuid3` / :func:`uuid5` functions. -.. cmdoption:: -N - --name +.. option:: -N + --name The name used as part of generating the uuid. Only required for :func:`uuid3` / :func:`uuid5` functions. diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 18af1d41..5205c6c2 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -1,5 +1,5 @@ -:mod:`venv` --- Creation of virtual environments -================================================ +:mod:`!venv` --- Creation of virtual environments +================================================= .. module:: venv :synopsis: Creation of virtual environments. @@ -27,7 +27,7 @@ optionally be isolated from the packages in the base environment, so only those explicitly installed in the virtual environment are available. When used from within a virtual environment, common installation tools such as -`pip`_ will install Python packages into a virtual environment +:pypi:`pip` will install Python packages into a virtual environment without needing to be told to do so explicitly. A virtual environment is (amongst other things): @@ -37,14 +37,14 @@ A virtual environment is (amongst other things): are by default isolated from software in other virtual environments and Python interpreters and libraries installed in the operating system. -* Contained in a directory, conventionally either named ``venv`` or ``.venv`` in +* Contained in a directory, conventionally named ``.venv`` or ``venv`` in the project directory, or under a container directory for lots of virtual environments, such as ``~/.virtualenvs``. * Not checked into source control systems such as Git. * Considered as disposable -- it should be simple to delete and recreate it from - scratch. You don't place any project code in the environment + scratch. You don't place any project code in the environment. * Not considered as movable or copyable -- you just recreate the same environment in the target location. @@ -54,14 +54,134 @@ See :pep:`405` for more background on Python virtual environments. .. seealso:: `Python Packaging User Guide: Creating and using virtual environments - `__ + `__ -.. include:: ../includes/wasm-notavail.rst +.. include:: ../includes/wasm-mobile-notavail.rst Creating virtual environments ----------------------------- -.. include:: /using/venv-create.inc +:ref:`Virtual environments ` are created by executing the ``venv`` +module: + +.. code-block:: shell + + python -m venv /path/to/new/virtual/environment + +This creates the target directory (including parent directories as needed) +and places a :file:`pyvenv.cfg` file in it with a ``home`` key +pointing to the Python installation from which the command was run. +It also creates a :file:`bin` (or :file:`Scripts` on Windows) subdirectory +containing a copy or symlink of the Python executable +(as appropriate for the platform or arguments used at environment creation time). +It also creates a :file:`lib/pythonX.Y/site-packages` subdirectory +(on Windows, this is :file:`Lib\site-packages`). +If an existing directory is specified, it will be re-used. + +.. versionchanged:: 3.5 + The use of ``venv`` is now recommended for creating virtual environments. + +.. deprecated-removed:: 3.6 3.8 + :program:`pyvenv` was the recommended tool for creating virtual environments + for Python 3.3 and 3.4, and replaced in 3.5 by executing ``venv`` directly. + +.. highlight:: none + +On Windows, invoke the ``venv`` command as follows: + +.. code-block:: ps1con + + PS> python -m venv C:\path\to\new\virtual\environment + +The command, if run with ``-h``, will show the available options:: + + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] + [--without-scm-ignore-files] + ENV_DIR [ENV_DIR ...] + + Creates virtual Python environments in one or more target directories. + + positional arguments: + ENV_DIR A directory to create the environment in. + + options: + -h, --help show this help message and exit + --system-site-packages + Give the virtual environment access to the system + site-packages dir. + --symlinks Try to use symlinks rather than copies, when + symlinks are not the default for the platform. + --copies Try to use copies rather than symlinks, even when + symlinks are the default for the platform. + --clear Delete the contents of the environment directory + if it already exists, before environment creation. + --upgrade Upgrade the environment directory to use this + version of Python, assuming Python has been + upgraded in-place. + --without-pip Skips installing or upgrading pip in the virtual + environment (pip is bootstrapped by default) + --prompt PROMPT Provides an alternative prompt prefix for this + environment. + --upgrade-deps Upgrade core dependencies (pip) to the latest + version in PyPI + --without-scm-ignore-files + Skips adding SCM ignore files to the environment + directory (Git is supported by default). + + Once an environment has been created, you may wish to activate it, e.g. by + sourcing an activate script in its bin directory. + + +.. versionchanged:: 3.4 + Installs pip by default, added the ``--without-pip`` and ``--copies`` + options. + +.. versionchanged:: 3.4 + In earlier versions, if the target directory already existed, an error was + raised, unless the ``--clear`` or ``--upgrade`` option was provided. + +.. versionchanged:: 3.9 + Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI. + +.. versionchanged:: 3.12 + + ``setuptools`` is no longer a core venv dependency. + +.. versionchanged:: 3.13 + + Added the ``--without-scm-ignore-files`` option. +.. versionchanged:: 3.13 + ``venv`` now creates a :file:`.gitignore` file for Git by default. + +.. note:: + While symlinks are supported on Windows, they are not recommended. Of + particular note is that double-clicking ``python.exe`` in File Explorer + will resolve the symlink eagerly and ignore the virtual environment. + +.. note:: + On Microsoft Windows, it may be required to enable the ``Activate.ps1`` + script by setting the execution policy for the user. You can do this by + issuing the following PowerShell command: + + .. code-block:: powershell + + PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + + See `About Execution Policies + `_ + for more information. + +The created :file:`pyvenv.cfg` file also includes the +``include-system-site-packages`` key, set to ``true`` if ``venv`` is +run with the ``--system-site-packages`` option, ``false`` otherwise. + +Unless the ``--without-pip`` option is given, :mod:`ensurepip` will be +invoked to bootstrap ``pip`` into the virtual environment. + +Multiple paths can be given to ``venv``, in which case an identical virtual +environment will be created, according to the given options, at each provided +path. .. _venv-explanation: @@ -95,7 +215,7 @@ containing the virtual environment): | +------------+--------------------------------------------------+ | | csh/tcsh | :samp:`$ source {}/bin/activate.csh` | | +------------+--------------------------------------------------+ -| | PowerShell | :samp:`$ {}/bin/Activate.ps1` | +| | pwsh | :samp:`$ {}/bin/Activate.ps1` | +-------------+------------+--------------------------------------------------+ | Windows | cmd.exe | :samp:`C:\\> {}\\Scripts\\activate.bat` | | +------------+--------------------------------------------------+ @@ -117,7 +237,7 @@ should be runnable without activating it. In order to achieve this, scripts installed into virtual environments have a "shebang" line which points to the environment's Python interpreter, -i.e. :samp:`#!/{}/bin/python`. +:samp:`#!/{}/bin/python`. This means that the script will run with that interpreter regardless of the value of :envvar:`PATH`. On Windows, "shebang" line processing is supported if you have the :ref:`launcher` installed. Thus, double-clicking an installed @@ -162,48 +282,55 @@ creation according to their needs, the :class:`EnvBuilder` class. .. class:: EnvBuilder(system_site_packages=False, clear=False, \ symlinks=False, upgrade=False, with_pip=False, \ - prompt=None, upgrade_deps=False) + prompt=None, upgrade_deps=False, \ + *, scm_ignore_files=frozenset()) The :class:`EnvBuilder` class accepts the following keyword arguments on instantiation: - * ``system_site_packages`` -- a Boolean value indicating that the system Python + * *system_site_packages* -- a boolean value indicating that the system Python site-packages should be available to the environment (defaults to ``False``). - * ``clear`` -- a Boolean value which, if true, will delete the contents of + * *clear* -- a boolean value which, if true, will delete the contents of any existing target directory, before creating the environment. - * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the + * *symlinks* -- a boolean value indicating whether to attempt to symlink the Python binary rather than copying. - * ``upgrade`` -- a Boolean value which, if true, will upgrade an existing + * *upgrade* -- a boolean value which, if true, will upgrade an existing environment with the running Python - for use when that Python has been upgraded in-place (defaults to ``False``). - * ``with_pip`` -- a Boolean value which, if true, ensures pip is + * *with_pip* -- a boolean value which, if true, ensures pip is installed in the virtual environment. This uses :mod:`ensurepip` with the ``--default-pip`` option. - * ``prompt`` -- a String to be used after virtual environment is activated + * *prompt* -- a string to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would be used). If the special string ``"."`` is provided, the basename of the current directory is used as the prompt. - * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI + * *upgrade_deps* -- Update the base venv modules to the latest on PyPI + + * *scm_ignore_files* -- Create ignore files based for the specified source + control managers (SCM) in the iterable. Support is defined by having a + method named ``create_{scm}_ignore_file``. The only value supported by + default is ``"git"`` via :meth:`create_git_ignore_file`. + .. versionchanged:: 3.4 Added the ``with_pip`` parameter - .. versionadded:: 3.6 + .. versionchanged:: 3.6 Added the ``prompt`` parameter - .. versionadded:: 3.9 + .. versionchanged:: 3.9 Added the ``upgrade_deps`` parameter - Creators of third-party virtual environment tools will be free to use the - provided :class:`EnvBuilder` class as a base class. + .. versionchanged:: 3.13 + Added the ``scm_ignore_files`` parameter - The returned env-builder is an object which has a method, ``create``: + :class:`EnvBuilder` may be used as a base class. .. method:: create(env_dir) @@ -276,15 +403,15 @@ creation according to their needs, the :class:`EnvBuilder` class. the virtual environment. - .. versionchanged:: 3.12 - The attribute ``lib_path`` was added to the context, and the context - object was documented. - .. versionchanged:: 3.11 The *venv* :ref:`sysconfig installation scheme ` is used to construct the paths of the created directories. + .. versionchanged:: 3.12 + The attribute ``lib_path`` was added to the context, and the context + object was documented. + .. method:: create_configuration(context) Creates the ``pyvenv.cfg`` configuration file in the environment. @@ -303,14 +430,14 @@ creation according to their needs, the :class:`EnvBuilder` class. .. method:: upgrade_dependencies(context) - Upgrades the core venv dependency packages (currently ``pip``) + Upgrades the core venv dependency packages (currently :pypi:`pip`) in the environment. This is done by shelling out to the ``pip`` executable in the environment. .. versionadded:: 3.9 .. versionchanged:: 3.12 - ``setuptools`` is no longer a core venv dependency. + :pypi:`setuptools` is no longer a core venv dependency. .. method:: post_setup(context) @@ -318,25 +445,15 @@ creation according to their needs, the :class:`EnvBuilder` class. implementations to pre-install packages in the virtual environment or perform other post-creation steps. - .. versionchanged:: 3.7.2 - Windows now uses redirector scripts for ``python[w].exe`` instead of - copying the actual binaries. In 3.7.2 only :meth:`setup_python` does - nothing unless running from a build in the source tree. - - .. versionchanged:: 3.7.3 - Windows copies the redirector scripts as part of :meth:`setup_python` - instead of :meth:`setup_scripts`. This was not the case in 3.7.2. - When using symlinks, the original executables will be linked. - - In addition, :class:`EnvBuilder` provides this utility method that can be - called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to - assist in installing custom scripts into the virtual environment. - .. method:: install_scripts(context, path) + This method can be + called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to + assist in installing custom scripts into the virtual environment. + *path* is the path to a directory that should contain subdirectories - "common", "posix", "nt", each containing scripts destined for the bin - directory in the environment. The contents of "common" and the + ``common``, ``posix``, ``nt``; each containing scripts destined for the + ``bin`` directory in the environment. The contents of ``common`` and the directory corresponding to :data:`os.name` are copied after some text replacement of placeholders: @@ -358,11 +475,28 @@ creation according to their needs, the :class:`EnvBuilder` class. The directories are allowed to exist (for when an existing environment is being upgraded). + .. method:: create_git_ignore_file(context) + + Creates a ``.gitignore`` file within the virtual environment that causes + the entire directory to be ignored by the Git source control manager. + + .. versionadded:: 3.13 + + .. versionchanged:: 3.7.2 + Windows now uses redirector scripts for ``python[w].exe`` instead of + copying the actual binaries. In 3.7.2 only :meth:`setup_python` does + nothing unless running from a build in the source tree. + + .. versionchanged:: 3.7.3 + Windows copies the redirector scripts as part of :meth:`setup_python` + instead of :meth:`setup_scripts`. This was not the case in 3.7.2. + When using symlinks, the original executables will be linked. + There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ symlinks=False, with_pip=False, prompt=None, \ - upgrade_deps=False) + upgrade_deps=False, *, scm_ignore_files=frozenset()) Create an :class:`EnvBuilder` with the given keyword arguments, and call its :meth:`~EnvBuilder.create` method with the *env_dir* argument. @@ -370,13 +504,16 @@ There is also a module-level convenience function: .. versionadded:: 3.3 .. versionchanged:: 3.4 - Added the ``with_pip`` parameter + Added the *with_pip* parameter .. versionchanged:: 3.6 - Added the ``prompt`` parameter + Added the *prompt* parameter .. versionchanged:: 3.9 - Added the ``upgrade_deps`` parameter + Added the *upgrade_deps* parameter + + .. versionchanged:: 3.13 + Added the *scm_ignore_files* parameter An example of extending ``EnvBuilder`` -------------------------------------- @@ -594,7 +731,3 @@ subclass which installs setuptools and pip into a created virtual environment:: This script is also available for download `online `_. - - -.. _setuptools: https://pypi.org/project/setuptools/ -.. _pip: https://pypi.org/project/pip/ diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index 884de08e..40b96080 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -1,5 +1,5 @@ -:mod:`warnings` --- Warning control -=================================== +:mod:`!warnings` --- Warning control +==================================== .. module:: warnings :synopsis: Issue warning messages and control their disposition. @@ -178,6 +178,19 @@ If a warning is reported and doesn't match any registered filter then the "default" action is applied (hence its name). + +.. _repeated-warning-suppression-criteria: + +Repeated Warning Suppression Criteria +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The filters that suppress repeated warnings apply the following criteria to determine if a warning is considered a repeat: + +- ``"default"``: A warning is considered a repeat only if the (*message*, *category*, *module*, *lineno*) are all the same. +- ``"module"``: A warning is considered a repeat if the (*message*, *category*, *module*) are the same, ignoring the line number. +- ``"once"``: A warning is considered a repeat if the (*message*, *category*) are the same, ignoring the module and line number. + + .. _describing-warning-filters: Describing Warning Filters @@ -396,7 +409,7 @@ Available Functions ------------------- -.. function:: warn(message, category=None, stacklevel=1, source=None, \*, skip_file_prefixes=None) +.. function:: warn(message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=()) Issue a warning, or maybe ignore it or raise an exception. The *category* argument, if given, must be a :ref:`warning category class `; it @@ -522,6 +535,56 @@ Available Functions and calls to :func:`simplefilter`. +.. decorator:: deprecated(msg, *, category=DeprecationWarning, stacklevel=1) + + Decorator to indicate that a class, function or overload is deprecated. + + When this decorator is applied to an object, + deprecation warnings may be emitted at runtime when the object is used. + :term:`static type checkers ` + will also generate a diagnostic on usage of the deprecated object. + + Usage:: + + from warnings import deprecated + from typing import overload + + @deprecated("Use B instead") + class A: + pass + + @deprecated("Use g instead") + def f(): + pass + + @overload + @deprecated("int support is deprecated") + def g(x: int) -> int: ... + @overload + def g(x: str) -> int: ... + + The warning specified by *category* will be emitted at runtime + on use of deprecated objects. For functions, that happens on calls; + for classes, on instantiation and on creation of subclasses. + If the *category* is ``None``, no warning is emitted at runtime. + The *stacklevel* determines where the + warning is emitted. If it is ``1`` (the default), the warning + is emitted at the direct caller of the deprecated object; if it + is higher, it is emitted further up the stack. + Static type checker behavior is not affected by the *category* + and *stacklevel* arguments. + + The deprecation message passed to the decorator is saved in the + ``__deprecated__`` attribute on the decorated object. + If applied to an overload, the decorator + must be after the :func:`@overload ` decorator + for the attribute to exist on the overload as returned by + :func:`typing.get_overloads`. + + .. versionadded:: 3.13 + See :pep:`702`. + + Available Context Managers -------------------------- @@ -545,6 +608,9 @@ Available Context Managers passed to :func:`simplefilter` as if it were called immediately on entering the context. + See :ref:`warning-filter` for the meaning of the *category* and *lineno* + parameters. + .. note:: The :class:`catch_warnings` manager works by replacing and diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst index bb85dbe3..36c2bde8 100644 --- a/Doc/library/wave.rst +++ b/Doc/library/wave.rst @@ -1,5 +1,5 @@ -:mod:`wave` --- Read and write WAV files -======================================== +:mod:`!wave` --- Read and write WAV files +========================================= .. module:: wave :synopsis: Provide an interface to the WAV sound format. @@ -46,8 +46,8 @@ The :mod:`wave` module defines the following function and exception: the file object. The :func:`.open` function may be used in a :keyword:`with` statement. When - the :keyword:`!with` block completes, the :meth:`Wave_read.close()` or - :meth:`Wave_write.close()` method is called. + the :keyword:`!with` block completes, the :meth:`Wave_read.close` or + :meth:`Wave_write.close` method is called. .. versionchanged:: 3.4 Added support for unseekable files. @@ -123,7 +123,7 @@ Wave_read Objects Rewind the file pointer to the beginning of the audio stream. - The following two methods are defined for compatibility with the :mod:`aifc` + The following two methods are defined for compatibility with the old :mod:`!aifc` module, and don't do anything interesting. @@ -131,11 +131,19 @@ Wave_read Objects Returns ``None``. + .. deprecated-removed:: 3.13 3.15 + The method only existed for compatibility with the :mod:`!aifc` module + which has been removed in Python 3.13. + .. method:: getmark(id) Raise an error. + .. deprecated-removed:: 3.13 3.15 + The method only existed for compatibility with the :mod:`!aifc` module + which has been removed in Python 3.13. + The following two methods define a term "position" which is compatible between them, and is otherwise implementation dependent. diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index d6e062df..2a25ed04 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -197,7 +197,7 @@ See :ref:`__slots__ documentation ` for details. >>> del k1 # d = {k2: 2} .. versionchanged:: 3.9 - Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. + Added support for ``|`` and ``|=`` operators, as specified in :pep:`584`. :class:`WeakKeyDictionary` objects have an additional method that exposes the internal references directly. The references are not guaranteed to diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index 61db8042..2d19c514 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -1,5 +1,5 @@ -:mod:`webbrowser` --- Convenient web-browser controller -======================================================= +:mod:`!webbrowser` --- Convenient web-browser controller +======================================================== .. module:: webbrowser :synopsis: Easy-to-use controller for web browsers. @@ -33,15 +33,25 @@ allow the remote browser to maintain its own windows on the display. If remote browsers are not available on Unix, the controlling process will launch a new browser and wait. +On iOS, the :envvar:`BROWSER` environment variable, as well as any arguments +controlling autoraise, browser preference, and new tab/window creation will be +ignored. Web pages will *always* be opened in the user's preferred browser, in +a new tab, with the browser being brought to the foreground. The use of the +:mod:`webbrowser` module on iOS requires the :mod:`ctypes` module. If +:mod:`ctypes` isn't available, calls to :func:`.open` will fail. + The script :program:`webbrowser` can be used as a command-line interface for the module. It accepts a URL as the argument. It accepts the following optional -parameters: ``-n`` opens the URL in a new browser window, if possible; -``-t`` opens the URL in a new browser page ("tab"). The options are, -naturally, mutually exclusive. Usage example:: +parameters: + +* ``-n``/``--new-window`` opens the URL in a new browser window, if possible. +* ``-t``/``--new-tab`` opens the URL in a new browser page ("tab"). + +The options are, naturally, mutually exclusive. Usage example:: python -m webbrowser -t "https://www.python.org" -.. include:: ../includes/wasm-notavail.rst +.. availability:: not WASI, not Android. The following exception is defined: @@ -62,6 +72,8 @@ The following functions are defined: (note that under many window managers this will occur regardless of the setting of this variable). + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + Note that on some platforms, trying to open a filename using this function, may work and start the operating system's associated program. However, this is neither supported nor portable. @@ -74,11 +86,16 @@ The following functions are defined: Open *url* in a new window of the default browser, if possible, otherwise, open *url* in the only browser window. + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + + .. function:: open_new_tab(url) Open *url* in a new page ("tab") of the default browser, if possible, otherwise equivalent to :func:`open_new`. + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + .. function:: get(using=None) @@ -111,41 +128,43 @@ for the controller classes, all defined in this module. +------------------------+-----------------------------------------+-------+ | Type Name | Class Name | Notes | +========================+=========================================+=======+ -| ``'mozilla'`` | :class:`Mozilla('mozilla')` | | +| ``'mozilla'`` | ``Mozilla('mozilla')`` | | ++------------------------+-----------------------------------------+-------+ +| ``'firefox'`` | ``Mozilla('mozilla')`` | | +------------------------+-----------------------------------------+-------+ -| ``'firefox'`` | :class:`Mozilla('mozilla')` | | +| ``'epiphany'`` | ``Epiphany('epiphany')`` | | +------------------------+-----------------------------------------+-------+ -| ``'epiphany'`` | :class:`Epiphany('epiphany')` | | +| ``'kfmclient'`` | ``Konqueror()`` | \(1) | +------------------------+-----------------------------------------+-------+ -| ``'kfmclient'`` | :class:`Konqueror()` | \(1) | +| ``'konqueror'`` | ``Konqueror()`` | \(1) | +------------------------+-----------------------------------------+-------+ -| ``'konqueror'`` | :class:`Konqueror()` | \(1) | +| ``'kfm'`` | ``Konqueror()`` | \(1) | +------------------------+-----------------------------------------+-------+ -| ``'kfm'`` | :class:`Konqueror()` | \(1) | +| ``'opera'`` | ``Opera()`` | | +------------------------+-----------------------------------------+-------+ -| ``'opera'`` | :class:`Opera()` | | +| ``'links'`` | ``GenericBrowser('links')`` | | +------------------------+-----------------------------------------+-------+ -| ``'links'`` | :class:`GenericBrowser('links')` | | +| ``'elinks'`` | ``Elinks('elinks')`` | | +------------------------+-----------------------------------------+-------+ -| ``'elinks'`` | :class:`Elinks('elinks')` | | +| ``'lynx'`` | ``GenericBrowser('lynx')`` | | +------------------------+-----------------------------------------+-------+ -| ``'lynx'`` | :class:`GenericBrowser('lynx')` | | +| ``'w3m'`` | ``GenericBrowser('w3m')`` | | +------------------------+-----------------------------------------+-------+ -| ``'w3m'`` | :class:`GenericBrowser('w3m')` | | +| ``'windows-default'`` | ``WindowsDefault`` | \(2) | +------------------------+-----------------------------------------+-------+ -| ``'windows-default'`` | :class:`WindowsDefault` | \(2) | +| ``'macosx'`` | ``MacOSXOSAScript('default')`` | \(3) | +------------------------+-----------------------------------------+-------+ -| ``'macosx'`` | :class:`MacOSXOSAScript('default')` | \(3) | +| ``'safari'`` | ``MacOSXOSAScript('safari')`` | \(3) | +------------------------+-----------------------------------------+-------+ -| ``'safari'`` | :class:`MacOSXOSAScript('safari')` | \(3) | +| ``'google-chrome'`` | ``Chrome('google-chrome')`` | | +------------------------+-----------------------------------------+-------+ -| ``'google-chrome'`` | :class:`Chrome('google-chrome')` | | +| ``'chrome'`` | ``Chrome('chrome')`` | | +------------------------+-----------------------------------------+-------+ -| ``'chrome'`` | :class:`Chrome('chrome')` | | +| ``'chromium'`` | ``Chromium('chromium')`` | | +------------------------+-----------------------------------------+-------+ -| ``'chromium'`` | :class:`Chromium('chromium')` | | +| ``'chromium-browser'`` | ``Chromium('chromium-browser')`` | | +------------------------+-----------------------------------------+-------+ -| ``'chromium-browser'`` | :class:`Chromium('chromium-browser')` | | +| ``'iosbrowser'`` | ``IOSBrowser`` | \(4) | +------------------------+-----------------------------------------+-------+ Notes: @@ -153,7 +172,7 @@ Notes: (1) "Konqueror" is the file manager for the KDE desktop environment for Unix, and only makes sense to use if KDE is running. Some way of reliably detecting KDE - would be nice; the :envvar:`KDEDIR` variable is not sufficient. Note also that + would be nice; the :envvar:`!KDEDIR` variable is not sufficient. Note also that the name "kfm" is used even when using the :program:`konqueror` command with KDE 2 --- the implementation selects the best strategy for running Konqueror. @@ -161,7 +180,15 @@ Notes: Only on Windows platforms. (3) - Only on macOS platform. + Only on macOS. + +(4) + Only on iOS. + +.. versionadded:: 3.2 + A new :class:`!MacOSXOSAScript` class has been added + and is used on Mac instead of the previous :class:`!MacOSX` class. + This adds support for opening browsers not currently set as the OS default. .. versionadded:: 3.3 Support for Chrome/Chromium has been added. @@ -171,8 +198,8 @@ Notes: Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, and Firefox versions 35 and below. -.. deprecated-removed:: 3.11 3.13 - :class:`MacOSX` is deprecated, use :class:`MacOSXOSAScript` instead. +.. versionchanged:: 3.13 + Support for iOS has been added. Here are some simple examples:: @@ -194,7 +221,7 @@ Browser controllers provide these methods which parallel three of the module-level convenience functions: -.. attribute:: name +.. attribute:: controller.name System-dependent name for the browser. diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index 06bd4d87..b3a824fb 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -1,5 +1,5 @@ -:mod:`winreg` --- Windows registry access -========================================= +:mod:`!winreg` --- Windows registry access +========================================== .. module:: winreg :platform: Windows diff --git a/Doc/library/winsound.rst b/Doc/library/winsound.rst index 370c5216..f7ca9dc5 100644 --- a/Doc/library/winsound.rst +++ b/Doc/library/winsound.rst @@ -1,5 +1,5 @@ -:mod:`winsound` --- Sound-playing interface for Windows -======================================================= +:mod:`!winsound` --- Sound-playing interface for Windows +======================================================== .. module:: winsound :platform: Windows diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index 39a4c1ba..8d4c5eb6 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -1,5 +1,5 @@ -:mod:`wsgiref` --- WSGI Utilities and Reference Implementation -============================================================== +:mod:`!wsgiref` --- WSGI Utilities and Reference Implementation +=============================================================== .. module:: wsgiref :synopsis: WSGI Utilities and Reference Implementation. @@ -180,7 +180,7 @@ also provides these miscellaneous utilities: print(chunk) .. versionchanged:: 3.11 - Support for :meth:`__getitem__` method has been removed. + Support for :meth:`~object.__getitem__` method has been removed. :mod:`wsgiref.headers` -- WSGI response header tools @@ -201,8 +201,9 @@ manipulation of WSGI response headers using a mapping-like interface. an empty list. :class:`Headers` objects support typical mapping operations including - :meth:`__getitem__`, :meth:`get`, :meth:`__setitem__`, :meth:`setdefault`, - :meth:`__delitem__` and :meth:`__contains__`. For each of + :meth:`~object.__getitem__`, :meth:`~dict.get`, :meth:`~object.__setitem__`, + :meth:`~dict.setdefault`, + :meth:`~object.__delitem__` and :meth:`~object.__contains__`. For each of these methods, the key is the header name (treated case-insensitively), and the value is the first value associated with that header name. Setting a header deletes any existing values for that header, then adds a new value at the end of @@ -520,8 +521,10 @@ input, output, and error streams. want to subclass this instead of :class:`BaseCGIHandler`. This class is a subclass of :class:`BaseHandler`. It overrides the - :meth:`__init__`, :meth:`get_stdin`, :meth:`get_stderr`, :meth:`add_cgi_vars`, - :meth:`_write`, and :meth:`_flush` methods to support explicitly setting the + :meth:`!__init__`, :meth:`~BaseHandler.get_stdin`, + :meth:`~BaseHandler.get_stderr`, :meth:`~BaseHandler.add_cgi_vars`, + :meth:`~BaseHandler._write`, and :meth:`~BaseHandler._flush` methods to + support explicitly setting the environment and streams via the constructor. The supplied environment and streams are stored in the :attr:`stdin`, :attr:`stdout`, :attr:`stderr`, and :attr:`environ` attributes. @@ -780,8 +783,8 @@ in :pep:`3333`. .. class:: StartResponse() - A :class:`typing.Protocol` describing `start_response() - `_ + A :class:`typing.Protocol` describing :pep:`start_response() + <3333#the-start-response-callable>` callables (:pep:`3333`). .. data:: WSGIEnvironment @@ -794,18 +797,18 @@ in :pep:`3333`. .. class:: InputStream() - A :class:`typing.Protocol` describing a `WSGI Input Stream - `_. + A :class:`typing.Protocol` describing a :pep:`WSGI Input Stream + <3333#input-and-error-streams>`. .. class:: ErrorStream() - A :class:`typing.Protocol` describing a `WSGI Error Stream - `_. + A :class:`typing.Protocol` describing a :pep:`WSGI Error Stream + <3333#input-and-error-streams>`. .. class:: FileWrapper() - A :class:`typing.Protocol` describing a `file wrapper - `_. + A :class:`typing.Protocol` describing a :pep:`file wrapper + <3333#optional-platform-specific-file-handling>`. See :class:`wsgiref.util.FileWrapper` for a concrete implementation of this protocol. @@ -862,7 +865,7 @@ directory and port number (default: 8000) on the command line:: fn = os.path.join(path, environ["PATH_INFO"][1:]) if "." not in fn.split(os.path.sep)[-1]: fn = os.path.join(fn, "index.html") - mime_type = mimetypes.guess_type(fn)[0] + mime_type = mimetypes.guess_file_type(fn)[0] # Return 200 OK if file exists, otherwise 404 Not Found if os.path.exists(fn): diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 39e75573..59b801c8 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -1,283 +1,15 @@ -:mod:`xdrlib` --- Encode and decode XDR data -============================================ +:mod:`!xdrlib` --- Encode and decode XDR data +============================================= .. module:: xdrlib - :synopsis: Encoders and decoders for the External Data Representation (XDR). + :synopsis: Removed in 3.13. :deprecated: -**Source code:** :source:`Lib/xdrlib.py` - -.. index:: - single: XDR - single: External Data Representation - .. deprecated-removed:: 3.11 3.13 - The :mod:`xdrlib` module is deprecated - (see :pep:`PEP 594 <594#xdrlib>` for details). - --------------- - -The :mod:`xdrlib` module supports the External Data Representation Standard as -described in :rfc:`1014`, written by Sun Microsystems, Inc. June 1987. It -supports most of the data types described in the RFC. - -The :mod:`xdrlib` module defines two classes, one for packing variables into XDR -representation, and another for unpacking from XDR representation. There are -also two exception classes. - - -.. class:: Packer() - - :class:`Packer` is the class for packing data into XDR representation. The - :class:`Packer` class is instantiated with no arguments. - - -.. class:: Unpacker(data) - - ``Unpacker`` is the complementary class which unpacks XDR data values from a - string buffer. The input buffer is given as *data*. - - -.. seealso:: - - :rfc:`1014` - XDR: External Data Representation Standard - This RFC defined the encoding of data which was XDR at the time this module was - originally written. It has apparently been obsoleted by :rfc:`1832`. - - :rfc:`1832` - XDR: External Data Representation Standard - Newer RFC that provides a revised definition of XDR. - - -.. _xdr-packer-objects: - -Packer Objects --------------- - -:class:`Packer` instances have the following methods: - - -.. method:: Packer.get_buffer() - - Returns the current pack buffer as a string. - - -.. method:: Packer.reset() - - Resets the pack buffer to the empty string. - -In general, you can pack any of the most common XDR data types by calling the -appropriate ``pack_type()`` method. Each method takes a single argument, the -value to pack. The following simple data type packing methods are supported: -:meth:`pack_uint`, :meth:`pack_int`, :meth:`pack_enum`, :meth:`pack_bool`, -:meth:`pack_uhyper`, and :meth:`pack_hyper`. - - -.. method:: Packer.pack_float(value) - - Packs the single-precision floating point number *value*. - - -.. method:: Packer.pack_double(value) - - Packs the double-precision floating point number *value*. - -The following methods support packing strings, bytes, and opaque data: - - -.. method:: Packer.pack_fstring(n, s) - - Packs a fixed length string, *s*. *n* is the length of the string but it is - *not* packed into the data buffer. The string is padded with null bytes if - necessary to guaranteed 4 byte alignment. - - -.. method:: Packer.pack_fopaque(n, data) - - Packs a fixed length opaque data stream, similarly to :meth:`pack_fstring`. - - -.. method:: Packer.pack_string(s) - - Packs a variable length string, *s*. The length of the string is first packed - as an unsigned integer, then the string data is packed with - :meth:`pack_fstring`. - - -.. method:: Packer.pack_opaque(data) - - Packs a variable length opaque data string, similarly to :meth:`pack_string`. - - -.. method:: Packer.pack_bytes(bytes) - - Packs a variable length byte stream, similarly to :meth:`pack_string`. - -The following methods support packing arrays and lists: - - -.. method:: Packer.pack_list(list, pack_item) - - Packs a *list* of homogeneous items. This method is useful for lists with an - indeterminate size; i.e. the size is not available until the entire list has - been walked. For each item in the list, an unsigned integer ``1`` is packed - first, followed by the data value from the list. *pack_item* is the function - that is called to pack the individual item. At the end of the list, an unsigned - integer ``0`` is packed. - - For example, to pack a list of integers, the code might appear like this:: - - import xdrlib - p = xdrlib.Packer() - p.pack_list([1, 2, 3], p.pack_int) - - -.. method:: Packer.pack_farray(n, array, pack_item) - - Packs a fixed length list (*array*) of homogeneous items. *n* is the length of - the list; it is *not* packed into the buffer, but a :exc:`ValueError` exception - is raised if ``len(array)`` is not equal to *n*. As above, *pack_item* is the - function used to pack each element. - - -.. method:: Packer.pack_array(list, pack_item) - - Packs a variable length *list* of homogeneous items. First, the length of the - list is packed as an unsigned integer, then each element is packed as in - :meth:`pack_farray` above. - - -.. _xdr-unpacker-objects: - -Unpacker Objects ----------------- - -The :class:`Unpacker` class offers the following methods: - - -.. method:: Unpacker.reset(data) - - Resets the string buffer with the given *data*. - - -.. method:: Unpacker.get_position() - - Returns the current unpack position in the data buffer. - - -.. method:: Unpacker.set_position(position) - - Sets the data buffer unpack position to *position*. You should be careful about - using :meth:`get_position` and :meth:`set_position`. - - -.. method:: Unpacker.get_buffer() - - Returns the current unpack data buffer as a string. - - -.. method:: Unpacker.done() - - Indicates unpack completion. Raises an :exc:`Error` exception if all of the - data has not been unpacked. - -In addition, every data type that can be packed with a :class:`Packer`, can be -unpacked with an :class:`Unpacker`. Unpacking methods are of the form -``unpack_type()``, and take no arguments. They return the unpacked object. - - -.. method:: Unpacker.unpack_float() - - Unpacks a single-precision floating point number. - - -.. method:: Unpacker.unpack_double() - - Unpacks a double-precision floating point number, similarly to - :meth:`unpack_float`. - -In addition, the following methods unpack strings, bytes, and opaque data: - - -.. method:: Unpacker.unpack_fstring(n) - - Unpacks and returns a fixed length string. *n* is the number of characters - expected. Padding with null bytes to guaranteed 4 byte alignment is assumed. - - -.. method:: Unpacker.unpack_fopaque(n) - - Unpacks and returns a fixed length opaque data stream, similarly to - :meth:`unpack_fstring`. - - -.. method:: Unpacker.unpack_string() - - Unpacks and returns a variable length string. The length of the string is first - unpacked as an unsigned integer, then the string data is unpacked with - :meth:`unpack_fstring`. - - -.. method:: Unpacker.unpack_opaque() - - Unpacks and returns a variable length opaque data string, similarly to - :meth:`unpack_string`. - - -.. method:: Unpacker.unpack_bytes() - - Unpacks and returns a variable length byte stream, similarly to - :meth:`unpack_string`. - -The following methods support unpacking arrays and lists: - - -.. method:: Unpacker.unpack_list(unpack_item) - - Unpacks and returns a list of homogeneous items. The list is unpacked one - element at a time by first unpacking an unsigned integer flag. If the flag is - ``1``, then the item is unpacked and appended to the list. A flag of ``0`` - indicates the end of the list. *unpack_item* is the function that is called to - unpack the items. - - -.. method:: Unpacker.unpack_farray(n, unpack_item) - - Unpacks and returns (as a list) a fixed length array of homogeneous items. *n* - is number of list elements to expect in the buffer. As above, *unpack_item* is - the function used to unpack each element. - - -.. method:: Unpacker.unpack_array(unpack_item) - - Unpacks and returns a variable length *list* of homogeneous items. First, the - length of the list is unpacked as an unsigned integer, then each element is - unpacked as in :meth:`unpack_farray` above. - - -.. _xdr-exceptions: - -Exceptions ----------- - -Exceptions in this module are coded as class instances: - - -.. exception:: Error - - The base exception class. :exc:`Error` has a single public attribute - :attr:`msg` containing the description of the error. - - -.. exception:: ConversionError - - Class derived from :exc:`Error`. Contains no additional instance variables. - -Here is an example of how you would catch one of these exceptions:: - import xdrlib - p = xdrlib.Packer() - try: - p.pack_double(8.01) - except xdrlib.ConversionError as instance: - print('packing the double failed:', instance.msg) +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.13 ` after +being deprecated in Python 3.11. The removal was decided in :pep:`594`. +The last version of Python that provided the :mod:`!xdrlib` module was +`Python 3.12 `_. diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 72a7a98c..00a18751 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -1,5 +1,5 @@ -:mod:`xml.dom.minidom` --- Minimal DOM implementation -===================================================== +:mod:`!xml.dom.minidom` --- Minimal DOM implementation +====================================================== .. module:: xml.dom.minidom :synopsis: Minimal Document Object Model (DOM) implementation. diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst index d1df465a..fd96765c 100644 --- a/Doc/library/xml.dom.pulldom.rst +++ b/Doc/library/xml.dom.pulldom.rst @@ -1,5 +1,5 @@ -:mod:`xml.dom.pulldom` --- Support for building partial DOM trees -================================================================= +:mod:`!xml.dom.pulldom` --- Support for building partial DOM trees +================================================================== .. module:: xml.dom.pulldom :synopsis: Support for building partial DOM trees from SAX events. @@ -115,7 +115,7 @@ DOMEventStream Objects .. class:: DOMEventStream(stream, parser, bufsize) .. versionchanged:: 3.11 - Support for :meth:`__getitem__` method has been removed. + Support for :meth:`~object.__getitem__` method has been removed. .. method:: getEvent() diff --git a/Doc/library/xml.dom.rst b/Doc/library/xml.dom.rst index b387240a..f33b19bc 100644 --- a/Doc/library/xml.dom.rst +++ b/Doc/library/xml.dom.rst @@ -1,5 +1,5 @@ -:mod:`xml.dom` --- The Document Object Model API -================================================ +:mod:`!xml.dom` --- The Document Object Model API +================================================= .. module:: xml.dom :synopsis: Document Object Model API for Python. @@ -734,7 +734,7 @@ NamedNodeMap Objects attribute node. Get its value with the :attr:`value` attribute. There are also experimental methods that give this class more mapping behavior. -You can use them or you can use the standardized :meth:`getAttribute\*` family +You can use them or you can use the standardized :meth:`!getAttribute\*` family of methods on the :class:`Element` objects. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 54c93008..1daf6628 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -1,5 +1,5 @@ -:mod:`xml.etree.ElementTree` --- The ElementTree XML API -======================================================== +:mod:`!xml.etree.ElementTree` --- The ElementTree XML API +========================================================= .. module:: xml.etree.ElementTree :synopsis: Implementation of the ElementTree API. @@ -49,7 +49,7 @@ and its sub-elements are done on the :class:`Element` level. Parsing XML ^^^^^^^^^^^ -We'll be using the following XML document as the sample data for this section: +We'll be using the fictive :file:`country_data.xml` XML document as the sample data for this section: .. code-block:: xml @@ -154,6 +154,7 @@ elements, call :meth:`XMLPullParser.read_events`. Here is an example:: ... print(elem.tag, 'text=', elem.text) ... end + mytag text= sometext more text The obvious use case is applications that operate in a non-blocking fashion where the XML data is being received from a socket or read incrementally from @@ -165,6 +166,11 @@ data but would still like to have incremental parsing capabilities, take a look at :func:`iterparse`. It can be useful when you're reading a large XML document and don't want to hold it wholly in memory. +Where *immediate* feedback through events is wanted, calling method +:meth:`XMLPullParser.flush` can help reduce delay; +please make sure to study the related security notes. + + Finding interesting elements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -502,7 +508,7 @@ Functions `C14N 2.0 `_ transformation function. Canonicalization is a way to normalise XML output in a way that allows - byte-by-byte comparisons and digital signatures. It reduced the freedom + byte-by-byte comparisons and digital signatures. It reduces the freedom that XML serializers have and instead generates a more constrained XML representation. The main restrictions regard the placement of namespace declarations, the ordering of attributes, and ignorable whitespace. @@ -621,7 +627,11 @@ Functions *parser* is an optional parser instance. If not given, the standard :class:`XMLParser` parser is used. *parser* must be a subclass of :class:`XMLParser` and can only use the default :class:`TreeBuilder` as a - target. Returns an :term:`iterator` providing ``(event, elem)`` pairs. + target. Returns an :term:`iterator` providing ``(event, elem)`` pairs; + it has a ``root`` attribute that references the root element of the + resulting XML tree once *source* is fully read. + The iterator has the :meth:`!close` method that closes the internal + file object if *source* is a filename. Note that while :func:`iterparse` builds the tree incrementally, it issues blocking reads on *source* (or the file it names). As such, it's unsuitable @@ -644,6 +654,9 @@ Functions .. versionchanged:: 3.8 The ``comment`` and ``pi`` events were added. + .. versionchanged:: 3.13 + Added the :meth:`!close` method. + .. function:: parse(source, parser=None) @@ -661,7 +674,7 @@ Functions given. Returns an element instance, representing a processing instruction. Note that :class:`XMLParser` skips over processing instructions - in the input instead of creating comment objects for them. An + in the input instead of creating PI objects for them. An :class:`ElementTree` will only contain processing instruction nodes if they have been inserted into to the tree using one of the :class:`Element` methods. @@ -702,11 +715,11 @@ Functions meaning as in :meth:`ElementTree.write`. Returns an (optionally) encoded string containing the XML data. - .. versionadded:: 3.4 - The *short_empty_elements* parameter. + .. versionchanged:: 3.4 + Added the *short_empty_elements* parameter. - .. versionadded:: 3.8 - The *xml_declaration* and *default_namespace* parameters. + .. versionchanged:: 3.8 + Added the *xml_declaration* and *default_namespace* parameters. .. versionchanged:: 3.8 The :func:`tostring` function now preserves the attribute order @@ -729,11 +742,11 @@ Functions .. versionadded:: 3.2 - .. versionadded:: 3.4 - The *short_empty_elements* parameter. + .. versionchanged:: 3.4 + Added the *short_empty_elements* parameter. - .. versionadded:: 3.8 - The *xml_declaration* and *default_namespace* parameters. + .. versionchanged:: 3.8 + Added the *xml_declaration* and *default_namespace* parameters. .. versionchanged:: 3.8 The :func:`tostringlist` function now preserves the attribute order @@ -827,36 +840,31 @@ Functions .. module:: xml.etree.ElementInclude -.. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) - :module: +.. function:: default_loader(href, parse, encoding=None) - Default loader. This default loader reads an included resource from disk. *href* is a URL. - *parse* is for parse mode either "xml" or "text". *encoding* - is an optional text encoding. If not given, encoding is ``utf-8``. Returns the - expanded resource. If the parse mode is ``"xml"``, this is an ElementTree - instance. If the parse mode is "text", this is a Unicode string. If the - loader fails, it can return None or raise an exception. + Default loader. This default loader reads an included resource from disk. + *href* is a URL. *parse* is for parse mode either "xml" or "text". + *encoding* is an optional text encoding. If not given, encoding is ``utf-8``. + Returns the expanded resource. + If the parse mode is ``"xml"``, this is an :class:`~xml.etree.ElementTree.Element` instance. + If the parse mode is ``"text"``, this is a string. + If the loader fails, it can return ``None`` or raise an exception. -.. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ - max_depth=6) - :module: +.. function:: include(elem, loader=None, base_url=None, max_depth=6) - This function expands XInclude directives. *elem* is the root element. *loader* is - an optional resource loader. If omitted, it defaults to :func:`default_loader`. + This function expands XInclude directives in-place in tree pointed by *elem*. + *elem* is either the root :class:`~xml.etree.ElementTree.Element` or an + :class:`~xml.etree.ElementTree.ElementTree` instance to find such element. + *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. If given, it should be a callable that implements the same interface as :func:`default_loader`. *base_url* is base URL of the original file, to resolve relative include file references. *max_depth* is the maximum number of recursive - inclusions. Limited to reduce the risk of malicious content explosion. Pass a - negative value to disable the limitation. + inclusions. Limited to reduce the risk of malicious content explosion. + Pass ``None`` to disable the limitation. - Returns the expanded resource. If the parse mode is - ``"xml"``, this is an ElementTree instance. If the parse mode is "text", - this is a Unicode string. If the loader fails, it can return None or - raise an exception. - - .. versionadded:: 3.9 - The *base_url* and *max_depth* parameters. + .. versionchanged:: 3.9 + Added the *base_url* and *max_depth* parameters. .. _elementtree-element-objects: @@ -866,6 +874,7 @@ Element Objects .. module:: xml.etree.ElementTree :noindex: + :no-index: .. class:: Element(tag, attrib={}, **extra) @@ -962,7 +971,7 @@ Element Objects .. method:: extend(subelements) - Appends *subelements* from a sequence object with zero or more elements. + Appends *subelements* from an iterable of elements. Raises :exc:`TypeError` if a subelement is not an :class:`Element`. .. versionadded:: 3.2 @@ -1050,9 +1059,10 @@ Element Objects :meth:`~object.__getitem__`, :meth:`~object.__setitem__`, :meth:`~object.__len__`. - Caution: Elements with no subelements will test as ``False``. Testing the - truth value of an Element is deprecated and will raise an exception in - Python 3.14. Use specific ``len(elem)`` or ``elem is None`` test instead.:: + Caution: Elements with no subelements will test as ``False``. In a future + release of Python, all elements will test as ``True`` regardless of whether + subelements exist. Instead, prefer explicit ``len(elem)`` or + ``elem is not None`` tests.:: element = root.find('foo') @@ -1186,8 +1196,8 @@ ElementTree Objects :term:`file object`; make sure you do not try to write a string to a binary stream and vice versa. - .. versionadded:: 3.4 - The *short_empty_elements* parameter. + .. versionchanged:: 3.4 + Added the *short_empty_elements* parameter. .. versionchanged:: 3.8 The :meth:`write` method now preserves the attribute order specified @@ -1299,8 +1309,8 @@ TreeBuilder Objects .. method:: pi(target, text) - Creates a comment with the given *target* name and *text*. If - ``insert_pis`` is true, this will also add it to the tree. + Creates a process instruction with the given *target* name and *text*. + If ``insert_pis`` is true, this will also add it to the tree. .. versionadded:: 3.8 @@ -1365,7 +1375,7 @@ XMLParser Objects .. versionchanged:: 3.8 Parameters are now :ref:`keyword-only `. - The *html* argument no longer supported. + The *html* argument is no longer supported. .. method:: close() @@ -1379,6 +1389,24 @@ XMLParser Objects Feeds data to the parser. *data* is encoded data. + + .. method:: flush() + + Triggers parsing of any previously fed unparsed data, which can be + used to ensure more immediate feedback, in particular with Expat >=2.6.0. + The implementation of :meth:`flush` temporarily disables reparse deferral + with Expat (if currently enabled) and triggers a reparse. + Disabling reparse deferral has security consequences; please see + :meth:`xml.parsers.expat.xmlparser.SetReparseDeferralEnabled` for details. + + Note that :meth:`flush` has been backported to some prior releases of + CPython as a security fix. Check for availability of :meth:`flush` + using :func:`hasattr` if used in code running across a variety of Python + versions. + + .. versionadded:: 3.13 + + :meth:`XMLParser.feed` calls *target*\'s ``start(tag, attrs_dict)`` method for each opening tag, its ``end(tag)`` method for each closing tag, and data is processed by method ``data(data)``. For further supported callback @@ -1440,6 +1468,22 @@ XMLPullParser Objects Feed the given bytes data to the parser. + .. method:: flush() + + Triggers parsing of any previously fed unparsed data, which can be + used to ensure more immediate feedback, in particular with Expat >=2.6.0. + The implementation of :meth:`flush` temporarily disables reparse deferral + with Expat (if currently enabled) and triggers a reparse. + Disabling reparse deferral has security consequences; please see + :meth:`xml.parsers.expat.xmlparser.SetReparseDeferralEnabled` for details. + + Note that :meth:`flush` has been backported to some prior releases of + CPython as a security fix. Check for availability of :meth:`flush` + using :func:`hasattr` if used in code running across a variety of Python + versions. + + .. versionadded:: 3.13 + .. method:: close() Signal the parser that the data stream is terminated. Unlike diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst index 1e49b656..d4959953 100644 --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -68,12 +68,13 @@ quadratic blowup **Vulnerable** (1) **Vulnerable** (1) **Vulnerable* external entity expansion Safe (5) Safe (2) Safe (3) Safe (5) Safe (4) `DTD`_ retrieval Safe (5) Safe Safe Safe (5) Safe decompression bomb Safe Safe Safe Safe **Vulnerable** +large tokens **Vulnerable** (6) **Vulnerable** (6) **Vulnerable** (6) **Vulnerable** (6) **Vulnerable** (6) ========================= ================== ================== ================== ================== ================== 1. Expat 2.4.1 and newer is not vulnerable to the "billion laughs" and "quadratic blowup" vulnerabilities. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check - :const:`pyexpat.EXPAT_VERSION`. + :const:`!pyexpat.EXPAT_VERSION`. 2. :mod:`xml.etree.ElementTree` doesn't expand external entities and raises a :exc:`~xml.etree.ElementTree.ParseError` when an entity occurs. 3. :mod:`xml.dom.minidom` doesn't expand external entities and simply returns @@ -81,6 +82,11 @@ decompression bomb Safe Safe Safe 4. :mod:`xmlrpc.client` doesn't expand external entities and omits them. 5. Since Python 3.7.1, external general entities are no longer processed by default. +6. Expat 2.6.0 and newer is not vulnerable to denial of service + through quadratic runtime caused by parsing large tokens. + Items still listed as vulnerable due to + potential reliance on system-provided libraries. Check + :const:`!pyexpat.EXPAT_VERSION`. billion laughs / exponential entity expansion @@ -114,7 +120,13 @@ decompression bomb files. For an attacker it can reduce the amount of transmitted data by three magnitudes or more. -The documentation for `defusedxml`_ on PyPI has further information about +large tokens + Expat needs to re-parse unfinished tokens; without the protection + introduced in Expat 2.6.0, this can lead to quadratic runtime that can + be used to cause denial of service in the application parsing XML. + The issue is known as :cve:`2023-52425`. + +The documentation for :pypi:`defusedxml` on PyPI has further information about all known attack vectors with examples and references. .. _defusedxml-package: @@ -122,14 +134,13 @@ all known attack vectors with examples and references. The :mod:`!defusedxml` Package ------------------------------ -`defusedxml`_ is a pure Python package with modified subclasses of all stdlib +:pypi:`defusedxml` is a pure Python package with modified subclasses of all stdlib XML parsers that prevent any potentially malicious operation. Use of this package is recommended for any server code that parses untrusted XML data. The package also ships with example exploits and extended documentation on more XML exploits such as XPath injection. -.. _defusedxml: https://pypi.org/project/defusedxml/ .. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs .. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb .. _DTD: https://en.wikipedia.org/wiki/Document_type_definition diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index e2f28e32..c2c9d642 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -1,5 +1,5 @@ -:mod:`xml.sax.handler` --- Base classes for SAX handlers -======================================================== +:mod:`!xml.sax.handler` --- Base classes for SAX handlers +========================================================= .. module:: xml.sax.handler :synopsis: Base classes for SAX event handlers. diff --git a/Doc/library/xml.sax.reader.rst b/Doc/library/xml.sax.reader.rst index 113e9e93..b0bc8406 100644 --- a/Doc/library/xml.sax.reader.rst +++ b/Doc/library/xml.sax.reader.rst @@ -1,5 +1,5 @@ -:mod:`xml.sax.xmlreader` --- Interface for XML parsers -====================================================== +:mod:`!xml.sax.xmlreader` --- Interface for XML parsers +======================================================= .. module:: xml.sax.xmlreader :synopsis: Interface which SAX-compliant XML parsers must implement. diff --git a/Doc/library/xml.sax.rst b/Doc/library/xml.sax.rst index 6d351dfb..c60e9e50 100644 --- a/Doc/library/xml.sax.rst +++ b/Doc/library/xml.sax.rst @@ -1,5 +1,5 @@ -:mod:`xml.sax` --- Support for SAX2 parsers -=========================================== +:mod:`!xml.sax` --- Support for SAX2 parsers +============================================ .. module:: xml.sax :synopsis: Package containing SAX2 base classes and convenience functions. diff --git a/Doc/library/xml.sax.utils.rst b/Doc/library/xml.sax.utils.rst index e57e76dc..5ee11d58 100644 --- a/Doc/library/xml.sax.utils.rst +++ b/Doc/library/xml.sax.utils.rst @@ -1,5 +1,5 @@ -:mod:`xml.sax.saxutils` --- SAX Utilities -========================================= +:mod:`!xml.sax.saxutils` --- SAX Utilities +========================================== .. module:: xml.sax.saxutils :synopsis: Convenience functions and classes for use with SAX. @@ -71,8 +71,8 @@ or as base classes. content: if ``False`` (the default) they are emitted as a pair of start/end tags, if set to ``True`` they are emitted as a single self-closed tag. - .. versionadded:: 3.2 - The *short_empty_elements* parameter. + .. versionchanged:: 3.2 + Added the *short_empty_elements* parameter. .. class:: XMLFilterBase(base) diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 146c4fd7..c57f433e 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -1,5 +1,5 @@ -:mod:`xmlrpc.client` --- XML-RPC client access -============================================== +:mod:`!xmlrpc.client` --- XML-RPC client access +=============================================== .. module:: xmlrpc.client :synopsis: XML-RPC client access. @@ -165,7 +165,7 @@ between conformable Python objects and XML on the wire. A good description of XML-RPC operation and client software in several languages. Contains pretty much everything an XML-RPC client developer needs to know. - `XML-RPC Introspection `_ + `XML-RPC Introspection `_ Describes the XML-RPC protocol extension for introspection. `XML-RPC Specification `_ @@ -269,8 +269,9 @@ DateTime Objects Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream object. - It also supports certain of Python's built-in operators through rich comparison - and :meth:`__repr__` methods. + It also supports certain of Python's built-in operators through + :meth:`rich comparison ` and :meth:`~object.__repr__` + methods. A working example follows. The server code:: @@ -334,8 +335,8 @@ Binary Objects which was the de facto standard base64 specification when the XML-RPC spec was written. - It also supports certain of Python's built-in operators through :meth:`__eq__` - and :meth:`__ne__` methods. + It also supports certain of Python's built-in operators through + :meth:`~object.__eq__` and :meth:`~object.__ne__` methods. Example usage of the binary objects. We're going to transfer an image over XMLRPC:: diff --git a/Doc/library/xmlrpc.server.rst b/Doc/library/xmlrpc.server.rst index 016369d2..06169c7e 100644 --- a/Doc/library/xmlrpc.server.rst +++ b/Doc/library/xmlrpc.server.rst @@ -1,5 +1,5 @@ -:mod:`xmlrpc.server` --- Basic XML-RPC servers -============================================== +:mod:`!xmlrpc.server` --- Basic XML-RPC servers +=============================================== .. module:: xmlrpc.server :synopsis: Basic XML-RPC server implementations. @@ -84,12 +84,12 @@ alone XML-RPC servers. Register a function that can respond to XML-RPC requests. If *name* is given, it will be the method name associated with *function*, otherwise - ``function.__name__`` will be used. *name* is a string, and may contain + :attr:`function.__name__` will be used. *name* is a string, and may contain characters not legal in Python identifiers, including the period character. This method can also be used as a decorator. When used as a decorator, *name* can only be given as a keyword argument to register *function* under - *name*. If no *name* is given, ``function.__name__`` will be used. + *name*. If no *name* is given, :attr:`function.__name__` will be used. .. versionchanged:: 3.7 :meth:`register_function` can be used as a decorator. @@ -298,12 +298,12 @@ requests sent to Python CGI scripts. Register a function that can respond to XML-RPC requests. If *name* is given, it will be the method name associated with *function*, otherwise - ``function.__name__`` will be used. *name* is a string, and may contain + :attr:`function.__name__` will be used. *name* is a string, and may contain characters not legal in Python identifiers, including the period character. This method can also be used as a decorator. When used as a decorator, *name* can only be given as a keyword argument to register *function* under - *name*. If no *name* is given, ``function.__name__`` will be used. + *name*. If no *name* is given, :attr:`function.__name__` will be used. .. versionchanged:: 3.7 :meth:`register_function` can be used as a decorator. diff --git a/Doc/library/zipapp.rst b/Doc/library/zipapp.rst index 7c01fc10..cdaba07a 100644 --- a/Doc/library/zipapp.rst +++ b/Doc/library/zipapp.rst @@ -1,5 +1,5 @@ -:mod:`zipapp` --- Manage executable Python zip archives -======================================================= +:mod:`!zipapp` --- Manage executable Python zip archives +======================================================== .. module:: zipapp :synopsis: Manage executable Python zip archives @@ -54,7 +54,7 @@ The following options are understood: .. program:: zipapp -.. cmdoption:: -o , --output= +.. option:: -o , --output= Write the output to a file named *output*. If this option is not specified, the output filename will be the same as the input *source*, with the @@ -64,13 +64,13 @@ The following options are understood: An output filename must be specified if the *source* is an archive (and in that case, *output* must not be the same as *source*). -.. cmdoption:: -p , --python= +.. option:: -p , --python= Add a ``#!`` line to the archive specifying *interpreter* as the command to run. Also, on POSIX, make the archive executable. The default is to write no ``#!`` line, and not make the file executable. -.. cmdoption:: -m , --main= +.. option:: -m , --main= Write a ``__main__.py`` file to the archive that executes *mainfn*. The *mainfn* argument should have the form "pkg.mod:fn", where "pkg.mod" is a @@ -79,7 +79,7 @@ The following options are understood: :option:`--main` cannot be specified when copying an archive. -.. cmdoption:: -c, --compress +.. option:: -c, --compress Compress files with the deflate method, reducing the size of the output file. By default, files are stored uncompressed in the archive. @@ -88,13 +88,13 @@ The following options are understood: .. versionadded:: 3.7 -.. cmdoption:: --info +.. option:: --info Display the interpreter embedded in the archive, for diagnostic purposes. In this case, any other options are ignored and SOURCE must be an archive, not a directory. -.. cmdoption:: -h, --help +.. option:: -h, --help Print a short usage message and exit. @@ -171,8 +171,8 @@ The module defines two convenience functions: passed to the ``zipfile.ZipFile`` class, and must supply the methods needed by that class. - .. versionadded:: 3.7 - Added the *filter* and *compressed* arguments. + .. versionchanged:: 3.7 + Added the *filter* and *compressed* parameters. .. function:: get_interpreter(archive) @@ -332,7 +332,7 @@ Formally, the Python zip application format is therefore: interpreter name, and then a newline (``b'\n'``) character. The interpreter name can be anything acceptable to the OS "shebang" processing, or the Python launcher on Windows. The interpreter should be encoded in UTF-8 on Windows, - and in :func:`sys.getfilesystemencoding()` on POSIX. + and in :func:`sys.getfilesystemencoding` on POSIX. 2. Standard zipfile data, as generated by the :mod:`zipfile` module. The zipfile content *must* include a file called ``__main__.py`` (which must be in the "root" of the zipfile - i.e., it cannot be in a subdirectory). The diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 45f3d340..5583c6b2 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -1,5 +1,5 @@ -:mod:`zipfile` --- Work with ZIP archives -========================================= +:mod:`!zipfile` --- Work with ZIP archives +========================================== .. module:: zipfile :synopsis: Read and write ZIP-format archive files. @@ -79,6 +79,11 @@ The module defines the following items: of the last modification to the file; the fields are described in section :ref:`zipinfo-objects`. + .. versionchanged:: 3.13 + A public :attr:`!compress_level` attribute has been added to expose the + formerly protected :attr:`!_compresslevel`. The older protected name + continues to work as a property for backwards compatibility. + .. function:: is_zipfile(filename) Returns ``True`` if *filename* is a valid ZIP file based on its magic number, @@ -213,7 +218,7 @@ ZipFile Objects That flag takes precedence over *metadata_encoding*, which is a Python-specific extension. - .. versionadded:: 3.2 + .. versionchanged:: 3.2 Added the ability to use :class:`ZipFile` as a context manager. .. versionchanged:: 3.3 @@ -236,8 +241,8 @@ ZipFile Objects .. versionchanged:: 3.7 Add the *compresslevel* parameter. - .. versionadded:: 3.8 - The *strict_timestamps* keyword-only argument + .. versionchanged:: 3.8 + The *strict_timestamps* keyword-only parameter. .. versionchanged:: 3.11 Added support for specifying member name encoding for reading @@ -296,6 +301,10 @@ ZipFile Objects attempting to read or write other files in the ZIP file will raise a :exc:`ValueError`. + In both cases the file-like object has also attributes :attr:`!name`, + which is equivalent to the name of a file within the archive, and + :attr:`!mode`, which is ``'rb'`` or ``'wb'`` depending on the input mode. + When writing a file, if the file size is not known in advance but may exceed 2 GiB, pass ``force_zip64=True`` to ensure that the header format is capable of supporting large files. If the file size is known in advance, @@ -320,6 +329,12 @@ ZipFile Objects Calling :meth:`.open` on a closed ZipFile will raise a :exc:`ValueError`. Previously, a :exc:`RuntimeError` was raised. + .. versionchanged:: 3.13 + Added attributes :attr:`!name` and :attr:`!mode` for the writeable + file-like object. + The value of the :attr:`!mode` attribute for the readable file-like + object was changed from ``'r'`` to ``'rb'``. + .. method:: ZipFile.extract(member, path=None, pwd=None) @@ -570,6 +585,15 @@ Path objects are traversable using the ``/`` operator or ``joinpath``. Return ``True`` if the current context references a file. +.. method:: Path.is_symlink() + + Return ``True`` if the current context references a symbolic link. + + .. versionadded:: 3.12 + + .. versionchanged:: 3.13 + Previously, ``is_symlink`` would unconditionally return ``False``. + .. method:: Path.exists() Return ``True`` if the current context references a file or @@ -577,7 +601,8 @@ Path objects are traversable using the ``/`` operator or ``joinpath``. .. data:: Path.suffix - The file extension of the final component. + The last dot-separated portion of the final component, if any. + This is commonly called the file extension. .. versionadded:: 3.11 Added :data:`Path.suffix` property. @@ -591,7 +616,7 @@ Path objects are traversable using the ``/`` operator or ``joinpath``. .. data:: Path.suffixes - A list of the path’s file extensions. + A list of the path’s suffixes, commonly called file extensions. .. versionadded:: 3.11 Added :data:`Path.suffixes` property. @@ -626,7 +651,7 @@ Path objects are traversable using the ``/`` operator or ``joinpath``. Prior to 3.10, ``joinpath`` was undocumented and accepted exactly one parameter. -The `zipp `_ project provides backports +The :pypi:`zipp` project provides backports of the latest path object functionality to older Pythons. Use ``zipp.Path`` in place of ``zipfile.Path`` for early access to changes. @@ -642,8 +667,8 @@ The :class:`PyZipFile` constructor takes the same parameters as the .. class:: PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, \ optimize=-1) - .. versionadded:: 3.2 - The *optimize* parameter. + .. versionchanged:: 3.2 + Added the *optimize* parameter. .. versionchanged:: 3.4 ZIP64 extensions are enabled by default. @@ -698,8 +723,8 @@ The :class:`PyZipFile` constructor takes the same parameters as the test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile - .. versionadded:: 3.4 - The *filterfunc* parameter. + .. versionchanged:: 3.4 + Added the *filterfunc* parameter. .. versionchanged:: 3.6.2 The *pathname* parameter accepts a :term:`path-like object`. @@ -743,8 +768,8 @@ file: .. versionchanged:: 3.6.2 The *filename* parameter accepts a :term:`path-like object`. - .. versionadded:: 3.8 - The *strict_timestamps* keyword-only argument + .. versionchanged:: 3.8 + Added the *strict_timestamps* keyword-only parameter. Instances have the following methods and attributes: @@ -905,27 +930,27 @@ For a list of the files in a ZIP archive, use the :option:`-l` option: Command-line options ~~~~~~~~~~~~~~~~~~~~ -.. cmdoption:: -l - --list +.. option:: -l + --list List files in a zipfile. -.. cmdoption:: -c ... - --create ... +.. option:: -c ... + --create ... Create zipfile from source files. -.. cmdoption:: -e - --extract +.. option:: -e + --extract Extract zipfile into target directory. -.. cmdoption:: -t - --test +.. option:: -t + --test Test whether the zipfile is valid or not. -.. cmdoption:: --metadata-encoding +.. option:: --metadata-encoding Specify encoding of member names for :option:`-l`, :option:`-e` and :option:`-t`. diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 11d19e8c..9353a45b 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -1,5 +1,5 @@ -:mod:`zipimport` --- Import modules from Zip archives -===================================================== +:mod:`!zipimport` --- Import modules from Zip archives +====================================================== .. module:: zipimport :synopsis: Support for importing Python modules from ZIP archives. @@ -30,6 +30,9 @@ Any files may be present in the ZIP archive, but importers are only invoked for corresponding :file:`.pyc` file, meaning that if a ZIP archive doesn't contain :file:`.pyc` files, importing may be rather slow. +.. versionchanged:: 3.13 + ZIP64 is supported + .. versionchanged:: 3.8 Previously, ZIP archives with an archive comment were not supported. @@ -113,7 +116,7 @@ zipimporter Objects file wasn't found. .. versionchanged:: 3.3 - :exc:`IOError` used to be raised instead of :exc:`OSError`. + :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. .. method:: get_filename(fullname) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index ac179722..965b82a3 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -1,5 +1,5 @@ -:mod:`zlib` --- Compression compatible with :program:`gzip` -=========================================================== +:mod:`!zlib` --- Compression compatible with :program:`gzip` +============================================================ .. module:: zlib :synopsis: Low-level interface to compression and decompression routines diff --git a/Doc/library/zoneinfo.rst b/Doc/library/zoneinfo.rst index f8624da6..a57f3b8b 100644 --- a/Doc/library/zoneinfo.rst +++ b/Doc/library/zoneinfo.rst @@ -1,5 +1,5 @@ -:mod:`zoneinfo` --- IANA time zone support -========================================== +:mod:`!zoneinfo` --- IANA time zone support +=========================================== .. module:: zoneinfo :synopsis: IANA time zone support @@ -17,7 +17,7 @@ The :mod:`zoneinfo` module provides a concrete time zone implementation to support the IANA time zone database as originally specified in :pep:`615`. By default, :mod:`zoneinfo` uses the system's time zone data if available; if no system time zone data is available, the library will fall back to using the -first-party `tzdata`_ package available on PyPI. +first-party :pypi:`tzdata` package available on PyPI. .. seealso:: @@ -25,7 +25,7 @@ first-party `tzdata`_ package available on PyPI. Provides the :class:`~datetime.time` and :class:`~datetime.datetime` types with which the :class:`ZoneInfo` class is designed to be used. - Package `tzdata`_ + Package :pypi:`tzdata` First-party package maintained by the CPython core developers to supply time zone data via PyPI. @@ -93,7 +93,7 @@ Data sources The ``zoneinfo`` module does not directly provide time zone data, and instead pulls time zone information from the system time zone database or the -first-party PyPI package `tzdata`_, if available. Some systems, including +first-party PyPI package :pypi:`tzdata`, if available. Some systems, including notably Windows systems, do not have an IANA database available, and so for projects targeting cross-platform compatibility that require time zone data, it is recommended to declare a dependency on tzdata. If neither system data nor @@ -413,5 +413,3 @@ Exceptions and warnings be filtered out, such as a relative path. .. Links and references: - -.. _tzdata: https://pypi.org/project/tzdata/ diff --git a/Doc/license.rst b/Doc/license.rst index 1b209922..674ac5f5 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -100,7 +100,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2023 Python Software Foundation; All Rights + copyright, i.e., "Copyright © 2001-2024 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. @@ -476,7 +476,7 @@ The :mod:`trace` module contains the following notice:: UUencode and UUdecode functions ------------------------------- -The :mod:`uu` module contains the following notice:: +The ``uu`` codec contains the following notice:: Copyright 1994 by Lance Ellinghouse Cathedral City, California Republic, United States of America. @@ -655,7 +655,7 @@ copyright and licensing notice:: OpenSSL ------- -The modules :mod:`hashlib`, :mod:`posix`, :mod:`ssl`, :mod:`crypt` use +The modules :mod:`hashlib`, :mod:`posix` and :mod:`ssl` use the OpenSSL library for added performance if made available by the operating system. Additionally, the Windows and macOS installers for Python may include a copy of the OpenSSL libraries, so we include a copy @@ -1042,29 +1042,90 @@ https://www.w3.org/TR/xml-c14n2-testcases/ and is distributed under the OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Audioop -------- +.. _mimalloc-license: + +mimalloc +-------- + +MIT License:: + + Copyright (c) 2018-2021 Microsoft Corporation, Daan Leijen + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + +asyncio +---------- + +Parts of the :mod:`asyncio` module are incorporated from +`uvloop 0.16 `_, +which is distributed under the MIT license:: + + Copyright (c) 2015-2021 MagicStack Inc. http://magic.io + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Global Unbounded Sequences (GUS) +-------------------------------- + +The file :file:`Python/qsbr.c` is adapted from FreeBSD's "Global Unbounded +Sequences" safe memory reclamation scheme in +`subr_smr.c `_. +The file is distributed under the 2-Clause BSD License:: + + Copyright (c) 2019,2020 Jeffrey Roberson + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice unmodified, this list of conditions, and the following + disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -The audioop module uses the code base in g771.c file of the SoX project:: - - Programming the AdLib/Sound Blaster - FM Music Chips - Version 2.0 (24 Feb 1992) - Copyright (c) 1991, 1992 by Jeffrey S. Lee - jlee@smylex.uucp - Warranty and Copyright Policy - This document is provided on an "as-is" basis, and its author makes - no warranty or representation, express or implied, with respect to - its quality performance or fitness for a particular purpose. In no - event will the author of this document be liable for direct, indirect, - special, incidental, or consequential damages arising out of the use - or inability to use the information contained within. Use of this - document is at your own risk. - This file may be used and copied freely so long as the applicable - copyright notices are retained, and no modifications are made to the - text of the document. No money shall be charged for its distribution - beyond reasonable shipping, handling and duplication costs, nor shall - proprietary changes be made to this document so that it cannot be - distributed freely. This document may not be included in published - material or commercial packages without the written consent of its - author. + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 12ad18d4..69c47686 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -245,13 +245,12 @@ handler is started. This search inspects the :keyword:`!except` clauses in turn until one is found that matches the exception. An expression-less :keyword:`!except` clause, if present, must be last; it matches any exception. -For an :keyword:`!except` clause with an expression, -that expression is evaluated, and the clause matches the exception -if the resulting object is "compatible" with the exception. An object is -compatible with an exception if the object is the class or a -:term:`non-virtual base class ` of the exception object, -or a tuple containing an item that is the class or a non-virtual base class -of the exception object. + +For an :keyword:`!except` clause with an expression, the +expression must evaluate to an exception type or a tuple of exception types. +The raised exception matches an :keyword:`!except` clause whose expression evaluates +to the class or a :term:`non-virtual base class ` of the exception object, +or to a tuple that contains such a class. If no :keyword:`!except` clause matches the exception, the search for an exception handler @@ -378,8 +377,10 @@ exception group with an empty message string. :: ... ExceptionGroup('', (BlockingIOError())) -An :keyword:`!except*` clause must have a matching type, -and this type cannot be a subclass of :exc:`BaseExceptionGroup`. +An :keyword:`!except*` clause must have a matching expression; it cannot be ``except*:``. +Furthermore, this expression cannot contain exception group types, because that would +have ambiguous semantics. + It is not possible to mix :keyword:`except` and :keyword:`!except*` in the same :keyword:`try`. :keyword:`break`, :keyword:`continue` and :keyword:`return` @@ -489,37 +490,37 @@ The execution of the :keyword:`with` statement with one "item" proceeds as follo #. The context expression (the expression given in the :token:`~python-grammar:with_item`) is evaluated to obtain a context manager. -#. The context manager's :meth:`__enter__` is loaded for later use. +#. The context manager's :meth:`~object.__enter__` is loaded for later use. -#. The context manager's :meth:`__exit__` is loaded for later use. +#. The context manager's :meth:`~object.__exit__` is loaded for later use. -#. The context manager's :meth:`__enter__` method is invoked. +#. The context manager's :meth:`~object.__enter__` method is invoked. #. If a target was included in the :keyword:`with` statement, the return value - from :meth:`__enter__` is assigned to it. + from :meth:`~object.__enter__` is assigned to it. .. note:: - The :keyword:`with` statement guarantees that if the :meth:`__enter__` - method returns without an error, then :meth:`__exit__` will always be + The :keyword:`with` statement guarantees that if the :meth:`~object.__enter__` + method returns without an error, then :meth:`~object.__exit__` will always be called. Thus, if an error occurs during the assignment to the target list, it will be treated the same as an error occurring within the suite would be. See step 7 below. #. The suite is executed. -#. The context manager's :meth:`__exit__` method is invoked. If an exception +#. The context manager's :meth:`~object.__exit__` method is invoked. If an exception caused the suite to be exited, its type, value, and traceback are passed as - arguments to :meth:`__exit__`. Otherwise, three :const:`None` arguments are + arguments to :meth:`~object.__exit__`. Otherwise, three :const:`None` arguments are supplied. If the suite was exited due to an exception, and the return value from the - :meth:`__exit__` method was false, the exception is reraised. If the return + :meth:`~object.__exit__` method was false, the exception is reraised. If the return value was true, the exception is suppressed, and execution continues with the statement following the :keyword:`with` statement. If the suite was exited for any reason other than an exception, the return - value from :meth:`__exit__` is ignored, and execution proceeds at the normal + value from :meth:`~object.__exit__` is ignored, and execution proceeds at the normal location for the kind of exit that was taken. The following code:: @@ -533,18 +534,15 @@ is semantically equivalent to:: enter = type(manager).__enter__ exit = type(manager).__exit__ value = enter(manager) - hit_except = False try: TARGET = value SUITE except: - hit_except = True if not exit(manager, *sys.exc_info()): raise - finally: - if not hit_except: - exit(manager, None, None, None) + else: + exit(manager, None, None, None) With more than one item, the context managers are processed as if multiple :keyword:`with` statements were nested:: @@ -642,14 +640,14 @@ Here's an overview of the logical flow of a match statement: specified below. **Name bindings made during a successful pattern match outlive the executed block and can be used after the match statement**. - .. note:: + .. note:: - During failed pattern matches, some subpatterns may succeed. Do not - rely on bindings being made for a failed match. Conversely, do not - rely on variables remaining unchanged after a failed match. The exact - behavior is dependent on implementation and may vary. This is an - intentional decision made to allow different implementations to add - optimizations. + During failed pattern matches, some subpatterns may succeed. Do not + rely on bindings being made for a failed match. Conversely, do not + rely on variables remaining unchanged after a failed match. The exact + behavior is dependent on implementation and may vary. This is an + intentional decision made to allow different implementations to add + optimizations. #. If the pattern succeeds, the corresponding guard (if present) is evaluated. In this case all name bindings are guaranteed to have happened. @@ -840,7 +838,7 @@ A literal pattern corresponds to most : | "None" : | "True" : | "False" - : | `signed_number`: NUMBER | "-" NUMBER + signed_number: ["-"] NUMBER The rule ``strings`` and the token ``NUMBER`` are defined in the :doc:`standard Python grammar <./grammar>`. Triple-quoted strings are @@ -1058,7 +1056,7 @@ subject value: .. note:: Key-value pairs are matched using the two-argument form of the mapping subject's ``get()`` method. Matched key-value pairs must already be present in the mapping, and not created on-the-fly via :meth:`__missing__` or - :meth:`__getitem__`. + :meth:`~object.__getitem__`. In simple terms ``{KEY1: P1, KEY2: P2, ... }`` matches only if all the following happens: @@ -1170,8 +1168,10 @@ In simple terms ``CLS(P1, attr=P2)`` matches only if the following happens: * ``isinstance(, CLS)`` * convert ``P1`` to a keyword pattern using ``CLS.__match_args__`` * For each keyword argument ``attr=P2``: - * ``hasattr(, "attr")`` - * ``P2`` matches ``.attr`` + + * ``hasattr(, "attr")`` + * ``P2`` matches ``.attr`` + * ... and so on for the corresponding keyword argument/pattern pair. .. seealso:: @@ -1214,9 +1214,10 @@ A function definition defines a user-defined function object (see section : | `parameter_list_no_posonly` parameter_list_no_posonly: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] : | `parameter_list_starargs` - parameter_list_starargs: "*" [`parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]] + parameter_list_starargs: "*" [`star_parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]] : | "**" `parameter` [","] parameter: `identifier` [":" `expression`] + star_parameter: `identifier` [":" ["*"] `expression`] defparameter: `parameter` ["=" `expression`] funcname: `identifier` @@ -1259,7 +1260,8 @@ except that the original function is not temporarily bound to the name ``func``. A list of :ref:`type parameters ` may be given in square brackets between the function's name and the opening parenthesis for its parameter list. This indicates to static type checkers that the function is generic. At runtime, -the type parameters can be retrieved from the function's ``__type_params__`` +the type parameters can be retrieved from the function's +:attr:`~function.__type_params__` attribute. See :ref:`generic-functions` for more. .. versionchanged:: 3.12 @@ -1322,7 +1324,8 @@ and may only be passed by positional arguments. Parameters may have an :term:`annotation ` of the form "``: expression``" following the parameter name. Any parameter may have an annotation, even those of the form -``*identifier`` or ``**identifier``. Functions may have "return" annotation of +``*identifier`` or ``**identifier``. (As a special case, parameters of the form +``*identifier`` may have an annotation "``: *expression``".) Functions may have "return" annotation of the form "``-> expression``" after the parameter list. These annotations can be any valid Python expression. The presence of annotations does not change the semantics of a function. The annotation values are available as values of @@ -1333,6 +1336,10 @@ enables postponed evaluation. Otherwise, they are evaluated when the function definition is executed. In this case annotations may be evaluated in a different order than they appear in the source code. +.. versionchanged:: 3.11 + Parameters of the form "``*identifier``" may have an annotation + "``: *expression``". See :pep:`646`. + .. index:: pair: lambda; expression It is also possible to create anonymous functions (functions not bound to a @@ -1359,12 +1366,15 @@ access the local variables of the function containing the def. See section :pep:`526` - Syntax for Variable Annotations Ability to type hint variable declarations, including class - variables and instance variables + variables and instance variables. :pep:`563` - Postponed Evaluation of Annotations Support for forward references within annotations by preserving annotations in a string form at runtime instead of eager evaluation. + :pep:`318` - Decorators for Functions and Methods + Function and method decorators were introduced. + Class decorators were introduced in :pep:`3129`. .. _class: @@ -1415,7 +1425,7 @@ dictionary. The class name is bound to this class object in the original local namespace. The order in which attributes are defined in the class body is preserved -in the new class's ``__dict__``. Note that this is reliable only right +in the new class's :attr:`~type.__dict__`. Note that this is reliable only right after the class is created and only for classes that were defined using the definition syntax. @@ -1446,8 +1456,8 @@ decorators. The result is then bound to the class name. A list of :ref:`type parameters ` may be given in square brackets immediately after the class's name. This indicates to static type checkers that the class is generic. At runtime, -the type parameters can be retrieved from the class's ``__type_params__`` -attribute. See :ref:`generic-classes` for more. +the type parameters can be retrieved from the class's +:attr:`~type.__type_params__` attribute. See :ref:`generic-classes` for more. .. versionchanged:: 3.12 Type parameter lists are new in Python 3.12. @@ -1614,15 +1624,18 @@ Type parameter lists .. versionadded:: 3.12 +.. versionchanged:: 3.13 + Support for default values was added (see :pep:`696`). + .. index:: single: type parameters .. productionlist:: python-grammar type_params: "[" `type_param` ("," `type_param`)* "]" type_param: `typevar` | `typevartuple` | `paramspec` - typevar: `identifier` (":" `expression`)? - typevartuple: "*" `identifier` - paramspec: "**" `identifier` + typevar: `identifier` (":" `expression`)? ("=" `expression`)? + typevartuple: "*" `identifier` ("=" `expression`)? + paramspec: "**" `identifier` ("=" `expression`)? :ref:`Functions ` (including :ref:`coroutines `), :ref:`classes ` and :ref:`type aliases ` may @@ -1657,8 +1670,8 @@ with more precision. The scope of type parameters is modeled with a special function (technically, an :ref:`annotation scope `) that wraps the creation of the generic object. -Generic functions, classes, and type aliases have a :attr:`!__type_params__` -attribute listing their type parameters. +Generic functions, classes, and type aliases have a +:attr:`~definition.__type_params__` attribute listing their type parameters. Type parameters come in three kinds: @@ -1688,19 +1701,31 @@ evaluated in a separate :ref:`annotation scope `. :data:`typing.TypeVarTuple`\ s and :data:`typing.ParamSpec`\ s cannot have bounds or constraints. +All three flavors of type parameters can also have a *default value*, which is used +when the type parameter is not explicitly provided. This is added by appending +a single equals sign (``=``) followed by an expression. Like the bounds and +constraints of type variables, the default value is not evaluated when the +object is created, but only when the type parameter's ``__default__`` attribute +is accessed. To this end, the default value is evaluated in a separate +:ref:`annotation scope `. If no default value is specified +for a type parameter, the ``__default__`` attribute is set to the special +sentinel object :data:`typing.NoDefault`. + The following example indicates the full set of allowed type parameter declarations:: def overly_generic[ SimpleTypeVar, + TypeVarWithDefault = int, TypeVarWithBound: int, TypeVarWithConstraints: (str, bytes), - *SimpleTypeVarTuple, - **SimpleParamSpec, + *SimpleTypeVarTuple = (int, float), + **SimpleParamSpec = (str, bytearray), ]( a: SimpleTypeVar, - b: TypeVarWithBound, - c: Callable[SimpleParamSpec, TypeVarWithConstraints], - *d: SimpleTypeVarTuple, + b: TypeVarWithDefault, + c: TypeVarWithBound, + d: Callable[SimpleParamSpec, TypeVarWithConstraints], + *e: SimpleTypeVarTuple, ): ... .. _generic-functions: @@ -1838,37 +1863,37 @@ like ``TYPE_PARAMS_OF_ListOrSet`` are not actually bound at runtime. .. [#] In pattern matching, a sequence is defined as one of the following: - * a class that inherits from :class:`collections.abc.Sequence` - * a Python class that has been registered as :class:`collections.abc.Sequence` - * a builtin class that has its (CPython) :c:macro:`Py_TPFLAGS_SEQUENCE` bit set - * a class that inherits from any of the above + * a class that inherits from :class:`collections.abc.Sequence` + * a Python class that has been registered as :class:`collections.abc.Sequence` + * a builtin class that has its (CPython) :c:macro:`Py_TPFLAGS_SEQUENCE` bit set + * a class that inherits from any of the above The following standard library classes are sequences: - * :class:`array.array` - * :class:`collections.deque` - * :class:`list` - * :class:`memoryview` - * :class:`range` - * :class:`tuple` + * :class:`array.array` + * :class:`collections.deque` + * :class:`list` + * :class:`memoryview` + * :class:`range` + * :class:`tuple` .. note:: Subject values of type ``str``, ``bytes``, and ``bytearray`` do not match sequence patterns. .. [#] In pattern matching, a mapping is defined as one of the following: - * a class that inherits from :class:`collections.abc.Mapping` - * a Python class that has been registered as :class:`collections.abc.Mapping` - * a builtin class that has its (CPython) :c:macro:`Py_TPFLAGS_MAPPING` bit set - * a class that inherits from any of the above + * a class that inherits from :class:`collections.abc.Mapping` + * a Python class that has been registered as :class:`collections.abc.Mapping` + * a builtin class that has its (CPython) :c:macro:`Py_TPFLAGS_MAPPING` bit set + * a class that inherits from any of the above The standard library classes :class:`dict` and :class:`types.MappingProxyType` are mappings. .. [#] A string literal appearing as the first statement in the function body is - transformed into the function's ``__doc__`` attribute and therefore the - function's :term:`docstring`. + transformed into the function's :attr:`~function.__doc__` attribute and + therefore the function's :term:`docstring`. .. [#] A string literal appearing as the first statement in the class body is - transformed into the namespace's ``__doc__`` item and therefore the class's - :term:`docstring`. + transformed into the namespace's :attr:`~type.__doc__` item and therefore + the class's :term:`docstring`. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 362ac752..819126da 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -34,7 +34,7 @@ represented by objects.) Every object has an identity, a type and a value. An object's *identity* never changes once it has been created; you may think of it as the object's address in -memory. The ':keyword:`is`' operator compares the identity of two objects; the +memory. The :keyword:`is` operator compares the identity of two objects; the :func:`id` function returns an integer representing its identity. .. impl-detail:: @@ -81,16 +81,16 @@ are still reachable. Note that the use of the implementation's tracing or debugging facilities may keep objects alive that would normally be collectable. Also note that catching -an exception with a ':keyword:`try`...\ :keyword:`except`' statement may keep +an exception with a :keyword:`try`...\ :keyword:`except` statement may keep objects alive. Some objects contain references to "external" resources such as open files or windows. It is understood that these resources are freed when the object is garbage-collected, but since garbage collection is not guaranteed to happen, such objects also provide an explicit way to release the external resource, -usually a :meth:`close` method. Programs are strongly recommended to explicitly -close such objects. The ':keyword:`try`...\ :keyword:`finally`' statement -and the ':keyword:`with`' statement provide convenient ways to do this. +usually a :meth:`!close` method. Programs are strongly recommended to explicitly +close such objects. The :keyword:`try`...\ :keyword:`finally` statement +and the :keyword:`with` statement provide convenient ways to do this. .. index:: single: container @@ -106,12 +106,16 @@ that mutable object is changed. Types affect almost all aspects of object behavior. Even the importance of object identity is affected in some sense: for immutable types, operations that compute new values may actually return a reference to any existing object with -the same type and value, while for mutable objects this is not allowed. E.g., -after ``a = 1; b = 1``, ``a`` and ``b`` may or may not refer to the same object -with the value one, depending on the implementation, but after ``c = []; d = -[]``, ``c`` and ``d`` are guaranteed to refer to two different, unique, newly -created empty lists. (Note that ``c = d = []`` assigns the same object to both -``c`` and ``d``.) +the same type and value, while for mutable objects this is not allowed. +For example, after ``a = 1; b = 1``, *a* and *b* may or may not refer to +the same object with the value one, depending on the implementation. +This is because :class:`int` is an immutable type, so the reference to ``1`` +can be reused. This behaviour depends on the implementation used, so should +not be relied upon, but is something to be aware of when making use of object +identity tests. +However, after ``c = []; d = []``, *c* and *d* are guaranteed to refer to two +different, unique, newly created empty lists. (Note that ``e = f = []`` assigns +the *same* object to both *e* and *f*.) .. _types: @@ -159,7 +163,7 @@ NotImplemented .. index:: pair: object; NotImplemented This type has a single value. There is a single object with this value. This -object is accessed through the built-in name ``NotImplemented``. Numeric methods +object is accessed through the built-in name :data:`NotImplemented`. Numeric methods and rich comparison methods should return this value if they do not implement the operation for the operands provided. (The interpreter will then try the reflected operation, or some other fallback, depending on the operator.) It @@ -170,7 +174,7 @@ See for more details. .. versionchanged:: 3.9 - Evaluating ``NotImplemented`` in a boolean context is deprecated. While + Evaluating :data:`NotImplemented` in a boolean context is deprecated. While it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. It will raise a :exc:`TypeError` in a future version of Python. @@ -215,7 +219,7 @@ properties: * A sign is shown only when the number is negative. -Python distinguishes between integers, floating point numbers, and complex +Python distinguishes between integers, floating-point numbers, and complex numbers: @@ -259,18 +263,18 @@ Booleans (:class:`bool`) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. index:: - pair: object; floating point - pair: floating point; number + pair: object; floating-point + pair: floating-point; number pair: C; language pair: Java; language -These represent machine-level double precision floating point numbers. You are +These represent machine-level double precision floating-point numbers. You are at the mercy of the underlying machine architecture (and C or Java implementation) for the accepted range and handling of overflow. Python does not -support single-precision floating point numbers; the savings in processor and +support single-precision floating-point numbers; the savings in processor and memory usage that are usually the reason for using these are dwarfed by the overhead of using objects in Python, so there is no reason to complicate the -language with two kinds of floating point numbers. +language with two kinds of floating-point numbers. :class:`numbers.Complex` (:class:`complex`) @@ -281,7 +285,7 @@ language with two kinds of floating point numbers. pair: complex; number These represent complex numbers as a pair of machine-level double precision -floating point numbers. The same caveats apply as for floating point numbers. +floating-point numbers. The same caveats apply as for floating-point numbers. The real and imaginary parts of a complex number ``z`` can be retrieved through the read-only attributes ``z.real`` and ``z.imag``. @@ -299,14 +303,17 @@ Sequences These represent finite ordered sets indexed by non-negative numbers. The built-in function :func:`len` returns the number of items of a sequence. When the length of a sequence is *n*, the index set contains the numbers 0, 1, -..., *n*-1. Item *i* of sequence *a* is selected by ``a[i]``. +..., *n*-1. Item *i* of sequence *a* is selected by ``a[i]``. Some sequences, +including built-in sequences, interpret negative subscripts by adding the +sequence length. For example, ``a[-2]`` equals ``a[n-2]``, the second to last +item of sequence a with length ``n``. .. index:: single: slicing Sequences also support slicing: ``a[i:j]`` selects all items with index *k* such that *i* ``<=`` *k* ``<`` *j*. When used as an expression, a slice is a -sequence of the same type. This implies that the index set is renumbered so -that it starts at 0. +sequence of the same type. The comment above about negative indexes also applies +to negative slice positions. Some sequences also support "extended slicing" with a third "step" parameter: ``a[i:j:k]`` selects all items of *a* with index *x* where ``x = i + n*k``, *n* @@ -370,7 +377,7 @@ Bytes A bytes object is an immutable array. The items are 8-bit bytes, represented by integers in the range 0 <= x < 256. Bytes literals - (like ``b'abc'``) and the built-in :func:`bytes()` constructor + (like ``b'abc'``) and the built-in :func:`bytes` constructor can be used to create bytes objects. Also, bytes objects can be decoded to strings via the :meth:`~bytes.decode` method. @@ -489,7 +496,7 @@ in the same order they were added sequentially over the dictionary. Replacing an existing key does not change the order, however removing a key and re-inserting it will add it to the end instead of keeping its old place. -Dictionaries are mutable; they can be created by the ``{...}`` notation (see +Dictionaries are mutable; they can be created by the ``{}`` notation (see section :ref:`dict`). .. index:: @@ -519,6 +526,8 @@ These are the types to which the function call operation (see section :ref:`calls`) can be applied: +.. _user-defined-funcs: + User-defined functions ^^^^^^^^^^^^^^^^^^^^^^ @@ -532,9 +541,35 @@ section :ref:`function`). It should be called with an argument list containing the same number of items as the function's formal parameter list. -Special attributes: +Special read-only attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. index:: + single: __closure__ (function attribute) + single: __globals__ (function attribute) + pair: global; namespace + +.. list-table:: + :header-rows: 1 + + * - Attribute + - Meaning + + * - .. attribute:: function.__globals__ + - A reference to the :class:`dictionary ` that holds the function's + :ref:`global variables ` -- the global namespace of the module + in which the function was defined. -.. tabularcolumns:: |l|L|l| + * - .. attribute:: function.__closure__ + - ``None`` or a :class:`tuple` of cells that contain bindings for the names specified + in the :attr:`~codeobject.co_freevars` attribute of the function's + :attr:`code object `. + + A cell object has the attribute ``cell_contents``. + This can be used to get the value of the cell, as well as set the value. + +Special writable attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. index:: single: __doc__ (function attribute) @@ -542,97 +577,83 @@ Special attributes: single: __module__ (function attribute) single: __dict__ (function attribute) single: __defaults__ (function attribute) - single: __closure__ (function attribute) single: __code__ (function attribute) - single: __globals__ (function attribute) single: __annotations__ (function attribute) single: __kwdefaults__ (function attribute) single: __type_params__ (function attribute) - pair: global; namespace -+-------------------------+-------------------------------+-----------+ -| Attribute | Meaning | | -+=========================+===============================+===========+ -| :attr:`__doc__` | The function's documentation | Writable | -| | string, or ``None`` if | | -| | unavailable; not inherited by | | -| | subclasses. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`~definition.\ | The function's name. | Writable | -| __name__` | | | -+-------------------------+-------------------------------+-----------+ -| :attr:`~definition.\ | The function's | Writable | -| __qualname__` | :term:`qualified name`. | | -| | | | -| | .. versionadded:: 3.3 | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__module__` | The name of the module the | Writable | -| | function was defined in, or | | -| | ``None`` if unavailable. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__defaults__` | A tuple containing default | Writable | -| | argument values for those | | -| | arguments that have defaults, | | -| | or ``None`` if no arguments | | -| | have a default value. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__code__` | The code object representing | Writable | -| | the compiled function body. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__globals__` | A reference to the dictionary | Read-only | -| | that holds the function's | | -| | global variables --- the | | -| | global namespace of the | | -| | module in which the function | | -| | was defined. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`~object.__dict__`| The namespace supporting | Writable | -| | arbitrary function | | -| | attributes. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__closure__` | ``None`` or a tuple of cells | Read-only | -| | that contain bindings for the | | -| | function's free variables. | | -| | See below for information on | | -| | the ``cell_contents`` | | -| | attribute. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__annotations__` | A dict containing annotations | Writable | -| | of parameters. The keys of | | -| | the dict are the parameter | | -| | names, and ``'return'`` for | | -| | the return annotation, if | | -| | provided. For more | | -| | information on working with | | -| | this attribute, see | | -| | :ref:`annotations-howto`. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__kwdefaults__` | A dict containing defaults | Writable | -| | for keyword-only parameters. | | -+-------------------------+-------------------------------+-----------+ -| :attr:`__type_params__` | A tuple containing the | Writable | -| | :ref:`type parameters | | -| | ` of a | | -| | :ref:`generic function | | -| | `. | | -+-------------------------+-------------------------------+-----------+ - -Most of the attributes labelled "Writable" check the type of the assigned value. +Most of these attributes check the type of the assigned value: + +.. list-table:: + :header-rows: 1 + + * - Attribute + - Meaning + + * - .. attribute:: function.__doc__ + - The function's documentation string, or ``None`` if unavailable. + + * - .. attribute:: function.__name__ + - The function's name. + See also: :attr:`__name__ attributes `. + + * - .. attribute:: function.__qualname__ + - The function's :term:`qualified name`. + See also: :attr:`__qualname__ attributes `. + + .. versionadded:: 3.3 + + * - .. attribute:: function.__module__ + - The name of the module the function was defined in, + or ``None`` if unavailable. + + * - .. attribute:: function.__defaults__ + - A :class:`tuple` containing default :term:`parameter` values + for those parameters that have defaults, + or ``None`` if no parameters have a default value. + + * - .. attribute:: function.__code__ + - The :ref:`code object ` representing + the compiled function body. + + * - .. attribute:: function.__dict__ + - The namespace supporting arbitrary function attributes. + See also: :attr:`__dict__ attributes `. + + * - .. attribute:: function.__annotations__ + - A :class:`dictionary ` containing annotations of + :term:`parameters `. + The keys of the dictionary are the parameter names, + and ``'return'`` for the return annotation, if provided. + See also: :ref:`annotations-howto`. + + * - .. attribute:: function.__kwdefaults__ + - A :class:`dictionary ` containing defaults for keyword-only + :term:`parameters `. + + * - .. attribute:: function.__type_params__ + - A :class:`tuple` containing the :ref:`type parameters ` of + a :ref:`generic function `. + + .. versionadded:: 3.12 Function objects also support getting and setting arbitrary attributes, which can be used, for example, to attach metadata to functions. Regular attribute -dot-notation is used to get and set such attributes. *Note that the current -implementation only supports function attributes on user-defined functions. -Function attributes on built-in functions may be supported in the future.* +dot-notation is used to get and set such attributes. + +.. impl-detail:: -A cell object has the attribute ``cell_contents``. This can be used to get -the value of the cell, as well as set the value. + CPython's current implementation only supports function attributes + on user-defined functions. Function attributes on + :ref:`built-in functions ` may be supported in the + future. Additional information about a function's definition can be retrieved from its -code object; see the description of internal types below. The -:data:`cell ` type can be accessed in the :mod:`types` -module. +:ref:`code object ` +(accessible via the :attr:`~function.__code__` attribute). + +.. _instance-methods: Instance methods ^^^^^^^^^^^^^^^^ @@ -652,49 +673,65 @@ callable object (normally a user-defined function). single: __name__ (method attribute) single: __module__ (method attribute) -Special read-only attributes: :attr:`__self__` is the class instance object, -:attr:`__func__` is the function object; :attr:`__doc__` is the method's -documentation (same as ``__func__.__doc__``); :attr:`~definition.__name__` is the -method name (same as ``__func__.__name__``); :attr:`__module__` is the -name of the module the method was defined in, or ``None`` if unavailable. +Special read-only attributes: + +.. list-table:: + + * - .. attribute:: method.__self__ + - Refers to the class instance object to which the method is + :ref:`bound ` + + * - .. attribute:: method.__func__ + - Refers to the original :ref:`function object ` + + * - .. attribute:: method.__doc__ + - The method's documentation + (same as :attr:`method.__func__.__doc__ `). + A :class:`string ` if the original function had a docstring, else + ``None``. + + * - .. attribute:: method.__name__ + - The name of the method + (same as :attr:`method.__func__.__name__ `) + + * - .. attribute:: method.__module__ + - The name of the module the method was defined in, or ``None`` if + unavailable. Methods also support accessing (but not setting) the arbitrary function -attributes on the underlying function object. +attributes on the underlying :ref:`function object `. User-defined method objects may be created when getting an attribute of a class (perhaps via an instance of that class), if that attribute is a -user-defined function object or a class method object. +user-defined :ref:`function object ` or a +:class:`classmethod` object. + +.. _method-binding: When an instance method object is created by retrieving a user-defined -function object from a class via one of its instances, its -:attr:`__self__` attribute is the instance, and the method object is said -to be bound. The new method's :attr:`__func__` attribute is the original -function object. - -When an instance method object is created by retrieving a class method -object from a class or instance, its :attr:`__self__` attribute is the -class itself, and its :attr:`__func__` attribute is the function object +:ref:`function object ` from a class via one of its +instances, its :attr:`~method.__self__` attribute is the instance, and the +method object is said to be *bound*. The new method's :attr:`~method.__func__` +attribute is the original function object. + +When an instance method object is created by retrieving a :class:`classmethod` +object from a class or instance, its :attr:`~method.__self__` attribute is the +class itself, and its :attr:`~method.__func__` attribute is the function object underlying the class method. When an instance method object is called, the underlying function -(:attr:`__func__`) is called, inserting the class instance -(:attr:`__self__`) in front of the argument list. For instance, when -:class:`C` is a class which contains a definition for a function -:meth:`f`, and ``x`` is an instance of :class:`C`, calling ``x.f(1)`` is +(:attr:`~method.__func__`) is called, inserting the class instance +(:attr:`~method.__self__`) in front of the argument list. For instance, when +:class:`!C` is a class which contains a definition for a function +:meth:`!f`, and ``x`` is an instance of :class:`!C`, calling ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``. -When an instance method object is derived from a class method object, the -"class instance" stored in :attr:`__self__` will actually be the class +When an instance method object is derived from a :class:`classmethod` object, the +"class instance" stored in :attr:`~method.__self__` will actually be the class itself, so that calling either ``x.f(1)`` or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is the underlying function. -Note that the transformation from function object to instance method -object happens each time the attribute is retrieved from the instance. In -some cases, a fruitful optimization is to assign the attribute to a local -variable and call that local variable. Also notice that this -transformation only happens for user-defined functions; other callable -objects (and all non-callable objects) are retrieved without -transformation. It is also important to note that user-defined functions +It is important to note that user-defined functions which are attributes of a class instance are not converted to bound methods; this *only* happens when the function is an attribute of the class. @@ -754,6 +791,8 @@ is raised and the asynchronous iterator will have reached the end of the set of values to be yielded. +.. _builtin-functions: + Built-in functions ^^^^^^^^^^^^^^^^^^ @@ -766,12 +805,18 @@ A built-in function object is a wrapper around a C function. Examples of built-in functions are :func:`len` and :func:`math.sin` (:mod:`math` is a standard built-in module). The number and type of the arguments are determined by the C function. Special read-only attributes: -:attr:`__doc__` is the function's documentation string, or ``None`` if -unavailable; :attr:`~definition.__name__` is the function's name; :attr:`__self__` is -set to ``None`` (but see the next item); :attr:`__module__` is the name of -the module the function was defined in or ``None`` if unavailable. + +* :attr:`!__doc__` is the function's documentation string, or ``None`` if + unavailable. See :attr:`function.__doc__`. +* :attr:`!__name__` is the function's name. See :attr:`function.__name__`. +* :attr:`!__self__` is set to ``None`` (but see the next item). +* :attr:`!__module__` is the name of + the module the function was defined in or ``None`` if unavailable. + See :attr:`function.__module__`. +.. _builtin-methods: + Built-in methods ^^^^^^^^^^^^^^^^ @@ -783,9 +828,11 @@ Built-in methods This is really a different disguise of a built-in function, this time containing an object passed to the C function as an implicit extra argument. An example of a built-in method is ``alist.append()``, assuming *alist* is a list object. In -this case, the special read-only attribute :attr:`__self__` is set to the object -denoted by *alist*. +this case, the special read-only attribute :attr:`!__self__` is set to the object +denoted by *alist*. (The attribute has the same semantics as it does with +:attr:`other instance methods `.) +.. _classes: Classes ^^^^^^^ @@ -793,7 +840,7 @@ Classes Classes are callable. These objects normally act as factories for new instances of themselves, but variations are possible for class types that override :meth:`~object.__new__`. The arguments of the call are passed to -:meth:`__new__` and, in the typical case, to :meth:`~object.__init__` to +:meth:`!__new__` and, in the typical case, to :meth:`~object.__init__` to initialize the new instance. @@ -804,6 +851,8 @@ Instances of arbitrary classes can be made callable by defining a :meth:`~object.__call__` method in their class. +.. _module-objects: + Modules ------- @@ -816,7 +865,8 @@ the :ref:`import system ` as invoked either by the :keyword:`import` statement, or by calling functions such as :func:`importlib.import_module` and built-in :func:`__import__`. A module object has a namespace implemented by a -dictionary object (this is the dictionary referenced by the ``__globals__`` +:class:`dictionary ` object (this is the dictionary referenced by the +:attr:`~function.__globals__` attribute of functions defined in the module). Attribute references are translated to lookups in this dictionary, e.g., ``m.x`` is equivalent to ``m.__dict__["x"]``. A module object does not contain the code object used @@ -828,47 +878,235 @@ Attribute assignment updates the module's namespace dictionary, e.g., .. index:: single: __name__ (module attribute) - single: __doc__ (module attribute) + single: __spec__ (module attribute) + single: __package__ (module attribute) + single: __loader__ (module attribute) + single: __path__ (module attribute) single: __file__ (module attribute) + single: __cached__ (module attribute) + single: __doc__ (module attribute) single: __annotations__ (module attribute) pair: module; namespace -Predefined (writable) attributes: +.. _import-mod-attrs: - :attr:`__name__` - The module's name. +Import-related attributes on module objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - :attr:`__doc__` - The module's documentation string, or ``None`` if - unavailable. +Module objects have the following attributes that relate to the +:ref:`import system `. When a module is created using the machinery associated +with the import system, these attributes are filled in based on the module's +:term:`spec `, before the :term:`loader` executes and loads the +module. - :attr:`__file__` - The pathname of the file from which the - module was loaded, if it was loaded from a file. - The :attr:`__file__` - attribute may be missing for certain types of modules, such as C modules - that are statically linked into the interpreter. For extension modules - loaded dynamically from a shared library, it's the pathname of the shared - library file. +To create a module dynamically rather than using the import system, +it's recommended to use :func:`importlib.util.module_from_spec`, +which will set the various import-controlled attributes to appropriate values. +It's also possible to use the :class:`types.ModuleType` constructor to create +modules directly, but this technique is more error-prone, as most attributes +must be manually set on the module object after it has been created when using +this approach. - :attr:`__annotations__` - A dictionary containing - :term:`variable annotations ` collected during - module body execution. For best practices on working - with :attr:`__annotations__`, please see :ref:`annotations-howto`. +.. caution:: + + With the exception of :attr:`~module.__name__`, it is **strongly** + recommended that you rely on :attr:`~module.__spec__` and its attributes + instead of any of the other individual attributes listed in this subsection. + Note that updating an attribute on :attr:`!__spec__` will not update the + corresponding attribute on the module itself: + + .. doctest:: + + >>> import typing + >>> typing.__name__, typing.__spec__.name + ('typing', 'typing') + >>> typing.__spec__.name = 'spelling' + >>> typing.__name__, typing.__spec__.name + ('typing', 'spelling') + >>> typing.__name__ = 'keyboard_smashing' + >>> typing.__name__, typing.__spec__.name + ('keyboard_smashing', 'spelling') + +.. attribute:: module.__name__ + + The name used to uniquely identify the module in the import system. + For a directly executed module, this will be set to ``"__main__"``. + + This attribute must be set to the fully qualified name of the module. + It is expected to match the value of + :attr:`module.__spec__.name `. + +.. attribute:: module.__spec__ + + A record of the module's import-system-related state. + + Set to the :class:`module spec ` that was + used when importing the module. See :ref:`module-specs` for more details. + + .. versionadded:: 3.4 + +.. attribute:: module.__package__ + + The :term:`package` a module belongs to. + + If the module is top-level (that is, not a part of any specific package) + then the attribute should be set to ``''`` (the empty string). Otherwise, + it should be set to the name of the module's package (which can be equal to + :attr:`module.__name__` if the module itself is a package). See :pep:`366` + for further details. + + This attribute is used instead of :attr:`~module.__name__` to calculate + explicit relative imports for main modules. It defaults to ``None`` for + modules created dynamically using the :class:`types.ModuleType` constructor; + use :func:`importlib.util.module_from_spec` instead to ensure the attribute + is set to a :class:`str`. + + It is **strongly** recommended that you use + :attr:`module.__spec__.parent ` + instead of :attr:`!module.__package__`. :attr:`__package__` is now only used + as a fallback if :attr:`!__spec__.parent` is not set, and this fallback + path is deprecated. + + .. versionchanged:: 3.4 + This attribute now defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor. + Previously the attribute was optional. + + .. versionchanged:: 3.6 + The value of :attr:`!__package__` is expected to be the same as + :attr:`__spec__.parent `. + :attr:`__package__` is now only used as a fallback during import + resolution if :attr:`!__spec__.parent` is not defined. + + .. versionchanged:: 3.10 + :exc:`ImportWarning` is raised if an import resolution falls back to + :attr:`!__package__` instead of + :attr:`__spec__.parent `. + + .. versionchanged:: 3.12 + Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` when + falling back to :attr:`!__package__` during import resolution. + + .. deprecated-removed:: 3.13 3.15 + :attr:`!__package__` will cease to be set or taken into consideration + by the import system or standard library. + +.. attribute:: module.__loader__ + + The :term:`loader` object that the import machinery used to load the module. + + This attribute is mostly useful for introspection, but can be used for + additional loader-specific functionality, for example getting data + associated with a loader. + + :attr:`!__loader__` defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor; + use :func:`importlib.util.module_from_spec` instead to ensure the attribute + is set to a :term:`loader` object. + + It is **strongly** recommended that you use + :attr:`module.__spec__.loader ` + instead of :attr:`!module.__loader__`. + + .. versionchanged:: 3.4 + This attribute now defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor. + Previously the attribute was optional. + + .. deprecated-removed:: 3.12 3.16 + Setting :attr:`!__loader__` on a module while failing to set + :attr:`!__spec__.loader` is deprecated. In Python 3.16, + :attr:`!__loader__` will cease to be set or taken into consideration by + the import system or the standard library. + +.. attribute:: module.__path__ + + A (possibly empty) :term:`sequence` of strings enumerating the locations + where the package's submodules will be found. Non-package modules should + not have a :attr:`!__path__` attribute. See :ref:`package-path-rules` for + more details. + + It is **strongly** recommended that you use + :attr:`module.__spec__.submodule_search_locations ` + instead of :attr:`!module.__path__`. + +.. attribute:: module.__file__ +.. attribute:: module.__cached__ + + :attr:`!__file__` and :attr:`!__cached__` are both optional attributes that + may or may not be set. Both attributes should be a :class:`str` when they + are available. + + :attr:`!__file__` indicates the pathname of the file from which the module + was loaded (if loaded from a file), or the pathname of the shared library + file for extension modules loaded dynamically from a shared library. + It might be missing for certain types of modules, such as C modules that are + statically linked into the interpreter, and the + :ref:`import system ` may opt to leave it unset if it + has no semantic meaning (for example, a module loaded from a database). + + If :attr:`!__file__` is set then the :attr:`!__cached__` attribute might + also be set, which is the path to any compiled version of + the code (for example, a byte-compiled file). The file does not need to exist + to set this attribute; the path can simply point to where the + compiled file *would* exist (see :pep:`3147`). + + Note that :attr:`!__cached__` may be set even if :attr:`!__file__` is not + set. However, that scenario is quite atypical. Ultimately, the + :term:`loader` is what makes use of the module spec provided by the + :term:`finder` (from which :attr:`!__file__` and :attr:`!__cached__` are + derived). So if a loader can load from a cached module but otherwise does + not load from a file, that atypical scenario may be appropriate. + + It is **strongly** recommended that you use + :attr:`module.__spec__.cached ` + instead of :attr:`!module.__cached__`. + + .. deprecated-removed:: 3.13 3.15 + Setting :attr:`!__cached__` on a module while failing to set + :attr:`!__spec__.cached` is deprecated. In Python 3.15, + :attr:`!__cached__` will cease to be set or taken into consideration by + the import system or standard library. + +Other writable attributes on module objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As well as the import-related attributes listed above, module objects also have +the following writable attributes: + +.. attribute:: module.__doc__ + + The module's documentation string, or ``None`` if unavailable. + See also: :attr:`__doc__ attributes `. + +.. attribute:: module.__annotations__ + + A dictionary containing + :term:`variable annotations ` collected during module + body execution. For best practices on working with :attr:`__annotations__`, + please see :ref:`annotations-howto`. + +Module dictionaries +^^^^^^^^^^^^^^^^^^^ + +Module objects also have the following special read-only attribute: .. index:: single: __dict__ (module attribute) +.. attribute:: module.__dict__ -Special read-only attribute: :attr:`~object.__dict__` is the module's -namespace as a dictionary object. + The module's namespace as a dictionary object. Uniquely among the attributes + listed here, :attr:`!__dict__` cannot be accessed as a global variable from + within a module; it can only be accessed as an attribute on module objects. -.. impl-detail:: + .. impl-detail:: + + Because of the way CPython clears module dictionaries, the module + dictionary will be cleared when the module falls out of scope even if the + dictionary still has live references. To avoid this, copy the dictionary + or keep the module around while using its dictionary directly. - Because of the way CPython clears module dictionaries, the module - dictionary will be cleared when the module falls out of scope even if the - dictionary still has live references. To avoid this, copy the dictionary - or keep the module around while using its dictionary directly. +.. _class-attrs-and-methods: Custom classes -------------- @@ -882,11 +1120,8 @@ name is not found there, the attribute search continues in the base classes. This search of the base classes uses the C3 method resolution order which behaves correctly even in the presence of 'diamond' inheritance structures where there are multiple inheritance paths leading back to a common ancestor. -Additional details on the C3 MRO used by Python can be found in the -documentation accompanying the 2.3 release at -https://www.python.org/download/releases/2.3/mro/. - -.. XXX: Could we add that MRO doc as an appendix to the language ref? +Additional details on the C3 MRO used by Python can be found at +:ref:`python_2.3_mro`. .. index:: pair: object; class @@ -897,10 +1132,11 @@ https://www.python.org/download/releases/2.3/mro/. pair: object; dictionary pair: class; attribute -When a class attribute reference (for class :class:`C`, say) would yield a +When a class attribute reference (for class :class:`!C`, say) would yield a class method object, it is transformed into an instance method object whose -:attr:`__self__` attribute is :class:`C`. When it would yield a static -method object, it is transformed into the object wrapped by the static method +:attr:`~method.__self__` attribute is :class:`!C`. +When it would yield a :class:`staticmethod` object, +it is transformed into the object wrapped by the static method object. See section :ref:`descriptors` for another way in which attributes retrieved from a class may differ from those actually contained in its :attr:`~object.__dict__`. @@ -914,6 +1150,9 @@ of a base class. A class object can be called (see above) to yield a class instance (see below). +Special attributes +^^^^^^^^^^^^^^^^^^ + .. index:: single: __name__ (class attribute) single: __module__ (class attribute) @@ -922,36 +1161,103 @@ A class object can be called (see above) to yield a class instance (see below). single: __doc__ (class attribute) single: __annotations__ (class attribute) single: __type_params__ (class attribute) + single: __static_attributes__ (class attribute) + single: __firstlineno__ (class attribute) -Special attributes: +.. list-table:: + :header-rows: 1 - :attr:`~definition.__name__` - The class name. + * - Attribute + - Meaning - :attr:`__module__` - The name of the module in which the class was defined. + * - .. attribute:: type.__name__ + - The class's name. + See also: :attr:`__name__ attributes `. - :attr:`~object.__dict__` - The dictionary containing the class's namespace. + * - .. attribute:: type.__qualname__ + - The class's :term:`qualified name`. + See also: :attr:`__qualname__ attributes `. + + * - .. attribute:: type.__module__ + - The name of the module in which the class was defined. + + * - .. attribute:: type.__dict__ + - A :class:`mapping proxy ` + providing a read-only view of the class's namespace. + See also: :attr:`__dict__ attributes `. + + * - .. attribute:: type.__bases__ + - A :class:`tuple` containing the class's bases. + In most cases, for a class defined as ``class X(A, B, C)``, + ``X.__bases__`` will be exactly equal to ``(A, B, C)``. + + * - .. attribute:: type.__doc__ + - The class's documentation string, or ``None`` if undefined. + Not inherited by subclasses. + + * - .. attribute:: type.__annotations__ + - A dictionary containing + :term:`variable annotations ` + collected during class body execution. For best practices on working + with :attr:`!__annotations__`, please see :ref:`annotations-howto`. + + .. caution:: + + Accessing the :attr:`!__annotations__` attribute of a class + object directly may yield incorrect results in the presence of + metaclasses. In addition, the attribute may not exist for + some classes. Use :func:`inspect.get_annotations` to + retrieve class annotations safely. + + * - .. attribute:: type.__type_params__ + - A :class:`tuple` containing the :ref:`type parameters ` of + a :ref:`generic class `. - :attr:`~class.__bases__` - A tuple containing the base classes, in the order of - their occurrence in the base class list. + .. versionadded:: 3.12 - :attr:`__doc__` - The class's documentation string, or ``None`` if undefined. + * - .. attribute:: type.__static_attributes__ + - A :class:`tuple` containing names of attributes of this class which are + assigned through ``self.X`` from any function in its body. - :attr:`__annotations__` - A dictionary containing - :term:`variable annotations ` - collected during class body execution. For best practices on - working with :attr:`__annotations__`, please see - :ref:`annotations-howto`. + .. versionadded:: 3.13 - :attr:`__type_params__` - A tuple containing the :ref:`type parameters ` of - a :ref:`generic class `. + * - .. attribute:: type.__firstlineno__ + - The line number of the first line of the class definition, + including decorators. + Setting the :attr:`__module__` attribute removes the + :attr:`!__firstlineno__` item from the type's dictionary. + .. versionadded:: 3.13 + + * - .. attribute:: type.__mro__ + - The :class:`tuple` of classes that are considered when looking for + base classes during method resolution. + + +Special methods +^^^^^^^^^^^^^^^ + +In addition to the special attributes described above, all Python classes also +have the following two methods available: + +.. method:: type.mro + + This method can be overridden by a metaclass to customize the method + resolution order for its instances. It is called at class instantiation, + and its result is stored in :attr:`~type.__mro__`. + +.. method:: type.__subclasses__ + + Each class keeps a list of weak references to its immediate subclasses. This + method returns a list of all those references still alive. The list is in + definition order. Example: + + .. doctest:: + + >>> class A: pass + >>> class B(A): pass + >>> A.__subclasses__() + [] Class instances --------------- @@ -968,7 +1274,7 @@ in which attribute references are searched. When an attribute is not found there, and the instance's class has an attribute by that name, the search continues with the class attributes. If a class attribute is found that is a user-defined function object, it is transformed into an instance method -object whose :attr:`__self__` attribute is the instance. Static method and +object whose :attr:`~method.__self__` attribute is the instance. Static method and class method objects are also transformed; see above under "Classes". See section :ref:`descriptors` for another way in which attributes of a class retrieved via its instances may differ from the objects actually stored in @@ -991,12 +1297,22 @@ dictionary directly. Class instances can pretend to be numbers, sequences, or mappings if they have methods with certain special names. See section :ref:`specialnames`. +Special attributes +^^^^^^^^^^^^^^^^^^ + .. index:: single: __dict__ (instance attribute) single: __class__ (instance attribute) -Special attributes: :attr:`~object.__dict__` is the attribute dictionary; -:attr:`~instance.__class__` is the instance's class. +.. attribute:: object.__class__ + + The class to which a class instance belongs. + +.. attribute:: object.__dict__ + + A dictionary or other mapping object used to store an object's (writable) + attributes. Not all instances have a :attr:`!__dict__` attribute; see the + section on :ref:`slots` for more details. I/O objects (also known as file objects) @@ -1075,59 +1391,119 @@ indirectly) to mutable objects. single: co_freevars (code object attribute) single: co_qualname (code object attribute) -Special read-only attributes: :attr:`co_name` gives the function name; -:attr:`co_qualname` gives the fully qualified function name; -:attr:`co_argcount` is the total number of positional arguments -(including positional-only arguments and arguments with default values); -:attr:`co_posonlyargcount` is the number of positional-only arguments -(including arguments with default values); :attr:`co_kwonlyargcount` is -the number of keyword-only arguments (including arguments with default -values); :attr:`co_nlocals` is the number of local variables used by the -function (including arguments); :attr:`co_varnames` is a tuple containing -the names of the local variables (starting with the argument names); -:attr:`co_cellvars` is a tuple containing the names of local variables -that are referenced by nested functions; :attr:`co_freevars` is a tuple -containing the names of free variables; :attr:`co_code` is a string -representing the sequence of bytecode instructions; :attr:`co_consts` is -a tuple containing the literals used by the bytecode; :attr:`co_names` is -a tuple containing the names used by the bytecode; :attr:`co_filename` is -the filename from which the code was compiled; :attr:`co_firstlineno` is -the first line number of the function; :attr:`co_lnotab` is a string -encoding the mapping from bytecode offsets to line numbers (for details -see the source code of the interpreter, is deprecated since 3.12 -and may be removed in 3.14); :attr:`co_stacksize` is the -required stack size; :attr:`co_flags` is an integer encoding a number -of flags for the interpreter. +Special read-only attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. list-table:: + + * - .. attribute:: codeobject.co_name + - The function name + + * - .. attribute:: codeobject.co_qualname + - The fully qualified function name + + .. versionadded:: 3.11 + + * - .. attribute:: codeobject.co_argcount + - The total number of positional :term:`parameters ` + (including positional-only parameters and parameters with default values) + that the function has + + * - .. attribute:: codeobject.co_posonlyargcount + - The number of positional-only :term:`parameters ` + (including arguments with default values) that the function has + + * - .. attribute:: codeobject.co_kwonlyargcount + - The number of keyword-only :term:`parameters ` + (including arguments with default values) that the function has + + * - .. attribute:: codeobject.co_nlocals + - The number of :ref:`local variables ` used by the function + (including parameters) + + * - .. attribute:: codeobject.co_varnames + - A :class:`tuple` containing the names of the local variables in the + function (starting with the parameter names) + + * - .. attribute:: codeobject.co_cellvars + - A :class:`tuple` containing the names of :ref:`local variables ` + that are referenced from at least one :term:`nested scope` inside the function + + * - .. attribute:: codeobject.co_freevars + - A :class:`tuple` containing the names of + :term:`free (closure) variables ` that a :term:`nested scope` + references in an outer scope. See also :attr:`function.__closure__`. + + Note: references to global and builtin names are *not* included. + + * - .. attribute:: codeobject.co_code + - A string representing the sequence of :term:`bytecode` instructions in + the function + + * - .. attribute:: codeobject.co_consts + - A :class:`tuple` containing the literals used by the :term:`bytecode` in + the function + + * - .. attribute:: codeobject.co_names + - A :class:`tuple` containing the names used by the :term:`bytecode` in + the function + + * - .. attribute:: codeobject.co_filename + - The name of the file from which the code was compiled + + * - .. attribute:: codeobject.co_firstlineno + - The line number of the first line of the function + + * - .. attribute:: codeobject.co_lnotab + - A string encoding the mapping from :term:`bytecode` offsets to line + numbers. For details, see the source code of the interpreter. + + .. deprecated:: 3.12 + This attribute of code objects is deprecated, and may be removed in + Python 3.15. + + * - .. attribute:: codeobject.co_stacksize + - The required stack size of the code object + + * - .. attribute:: codeobject.co_flags + - An :class:`integer ` encoding a number of flags for the + interpreter. .. index:: pair: object; generator -The following flag bits are defined for :attr:`co_flags`: bit ``0x04`` is set if +The following flag bits are defined for :attr:`~codeobject.co_flags`: +bit ``0x04`` is set if the function uses the ``*arguments`` syntax to accept an arbitrary number of positional arguments; bit ``0x08`` is set if the function uses the ``**keywords`` syntax to accept arbitrary keyword arguments; bit ``0x20`` is set -if the function is a generator. +if the function is a generator. See :ref:`inspect-module-co-flags` for details +on the semantics of each flags that might be present. Future feature declarations (``from __future__ import division``) also use bits -in :attr:`co_flags` to indicate whether a code object was compiled with a +in :attr:`~codeobject.co_flags` to indicate whether a code object was compiled with a particular feature enabled: bit ``0x2000`` is set if the function was compiled with future division enabled; bits ``0x10`` and ``0x1000`` were used in earlier versions of Python. -Other bits in :attr:`co_flags` are reserved for internal use. +Other bits in :attr:`~codeobject.co_flags` are reserved for internal use. .. index:: single: documentation string -If a code object represents a function, the first item in :attr:`co_consts` is +If a code object represents a function, the first item in +:attr:`~codeobject.co_consts` is the documentation string of the function, or ``None`` if undefined. +Methods on code objects +~~~~~~~~~~~~~~~~~~~~~~~ + .. method:: codeobject.co_positions() - Returns an iterable over the source code positions of each bytecode + Returns an iterable over the source code positions of each :term:`bytecode` instruction in the code object. - The iterator returns tuples containing the ``(start_line, end_line, + The iterator returns :class:`tuple`\s containing the ``(start_line, end_line, start_column, end_column)``. The *i-th* tuple corresponds to the - position of the source code that compiled to the *i-th* instruction. + position of the source code that compiled to the *i-th* code unit. Column information is 0-indexed utf-8 byte offsets on the given source line. @@ -1153,6 +1529,49 @@ the documentation string of the function, or ``None`` if undefined. :option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES` environment variable can be used. +.. method:: codeobject.co_lines() + + Returns an iterator that yields information about successive ranges of + :term:`bytecode`\s. Each item yielded is a ``(start, end, lineno)`` + :class:`tuple`: + + * ``start`` (an :class:`int`) represents the offset (inclusive) of the start + of the :term:`bytecode` range + * ``end`` (an :class:`int`) represents the offset (exclusive) of the end of + the :term:`bytecode` range + * ``lineno`` is an :class:`int` representing the line number of the + :term:`bytecode` range, or ``None`` if the bytecodes in the given range + have no line number + + The items yielded will have the following properties: + + * The first range yielded will have a ``start`` of 0. + * The ``(start, end)`` ranges will be non-decreasing and consecutive. That + is, for any pair of :class:`tuple`\s, the ``start`` of the second will be + equal to the ``end`` of the first. + * No range will be backwards: ``end >= start`` for all triples. + * The last :class:`tuple` yielded will have ``end`` equal to the size of the + :term:`bytecode`. + + Zero-width ranges, where ``start == end``, are allowed. Zero-width ranges + are used for lines that are present in the source code, but have been + eliminated by the :term:`bytecode` compiler. + + .. versionadded:: 3.10 + + .. seealso:: + + :pep:`626` - Precise line numbers for debugging and other tools. + The PEP that introduced the :meth:`!co_lines` method. + +.. method:: codeobject.replace(**kwargs) + + Return a copy of the code object with new values for the specified fields. + + Code objects are also supported by the generic function :func:`copy.replace`. + + .. versionadded:: 3.8 + .. _frame-objects: @@ -1161,8 +1580,9 @@ Frame objects .. index:: pair: object; frame -Frame objects represent execution frames. They may occur in traceback objects -(see below), and are also passed to registered trace functions. +Frame objects represent execution frames. They may occur in +:ref:`traceback objects `, +and are also passed to registered trace functions. .. index:: single: f_back (frame attribute) @@ -1172,16 +1592,41 @@ Frame objects represent execution frames. They may occur in traceback objects single: f_lasti (frame attribute) single: f_builtins (frame attribute) -Special read-only attributes: :attr:`f_back` is to the previous stack frame -(towards the caller), or ``None`` if this is the bottom stack frame; -:attr:`f_code` is the code object being executed in this frame; :attr:`f_locals` -is the dictionary used to look up local variables; :attr:`f_globals` is used for -global variables; :attr:`f_builtins` is used for built-in (intrinsic) names; -:attr:`f_lasti` gives the precise instruction (this is an index into the -bytecode string of the code object). +Special read-only attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. list-table:: + + * - .. attribute:: frame.f_back + - Points to the previous stack frame (towards the caller), + or ``None`` if this is the bottom stack frame + + * - .. attribute:: frame.f_code + - The :ref:`code object ` being executed in this frame. + Accessing this attribute raises an :ref:`auditing event ` + ``object.__getattr__`` with arguments ``obj`` and ``"f_code"``. -Accessing ``f_code`` raises an :ref:`auditing event ` -``object.__getattr__`` with arguments ``obj`` and ``"f_code"``. + * - .. attribute:: frame.f_locals + - The mapping used by the frame to look up + :ref:`local variables `. + If the frame refers to an :term:`optimized scope`, + this may return a write-through proxy object. + + .. versionchanged:: 3.13 + Return a proxy for optimized scopes. + + * - .. attribute:: frame.f_globals + - The dictionary used by the frame to look up + :ref:`global variables ` + + * - .. attribute:: frame.f_builtins + - The dictionary used by the frame to look up + :ref:`built-in (intrinsic) names ` + + * - .. attribute:: frame.f_lasti + - The "precise instruction" of the frame object + (this is an index into the :term:`bytecode` string of the + :ref:`code object `) .. index:: single: f_trace (frame attribute) @@ -1189,35 +1634,54 @@ Accessing ``f_code`` raises an :ref:`auditing event ` single: f_trace_opcodes (frame attribute) single: f_lineno (frame attribute) -Special writable attributes: :attr:`f_trace`, if not ``None``, is a function -called for various events during code execution (this is used by the debugger). -Normally an event is triggered for each new source line - this can be -disabled by setting :attr:`f_trace_lines` to :const:`False`. +Special writable attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. list-table:: + + * - .. attribute:: frame.f_trace + - If not ``None``, this is a function called for various events during + code execution (this is used by debuggers). Normally an event is + triggered for each new source line (see :attr:`~frame.f_trace_lines`). -Implementations *may* allow per-opcode events to be requested by setting -:attr:`f_trace_opcodes` to :const:`True`. Note that this may lead to -undefined interpreter behaviour if exceptions raised by the trace -function escape to the function being traced. + * - .. attribute:: frame.f_trace_lines + - Set this attribute to :const:`False` to disable triggering a tracing + event for each source line. -:attr:`f_lineno` is the current line number of the frame --- writing to this -from within a trace function jumps to the given line (only for the bottom-most -frame). A debugger can implement a Jump command (aka Set Next Statement) -by writing to f_lineno. + * - .. attribute:: frame.f_trace_opcodes + - Set this attribute to :const:`True` to allow per-opcode events to be + requested. Note that this may lead to + undefined interpreter behaviour if exceptions raised by the trace + function escape to the function being traced. + + * - .. attribute:: frame.f_lineno + - The current line number of the frame -- writing to this + from within a trace function jumps to the given line (only for the bottom-most + frame). A debugger can implement a Jump command (aka Set Next Statement) + by writing to this attribute. + +Frame object methods +~~~~~~~~~~~~~~~~~~~~ Frame objects support one method: .. method:: frame.clear() - This method clears all references to local variables held by the - frame. Also, if the frame belonged to a generator, the generator + This method clears all references to :ref:`local variables ` held by the + frame. Also, if the frame belonged to a :term:`generator`, the generator is finalized. This helps break reference cycles involving frame - objects (for example when catching an exception and storing its - traceback for later use). + objects (for example when catching an :ref:`exception ` + and storing its :ref:`traceback ` for later use). - :exc:`RuntimeError` is raised if the frame is currently executing. + :exc:`RuntimeError` is raised if the frame is currently executing + or suspended. .. versionadded:: 3.4 + .. versionchanged:: 3.13 + Attempting to clear a suspended frame raises :exc:`RuntimeError` + (as has always been the case for executing frames). + .. _traceback-objects: @@ -1235,26 +1699,31 @@ Traceback objects single: sys.exception single: sys.last_traceback -Traceback objects represent a stack trace of an exception. A traceback object +Traceback objects represent the stack trace of an :ref:`exception `. +A traceback object is implicitly created when an exception occurs, and may also be explicitly created by calling :class:`types.TracebackType`. +.. versionchanged:: 3.7 + Traceback objects can now be explicitly instantiated from Python code. + For implicitly created tracebacks, when the search for an exception handler unwinds the execution stack, at each unwound level a traceback object is inserted in front of the current traceback. When an exception handler is entered, the stack trace is made available to the program. (See section :ref:`try`.) It is accessible as the third item of the -tuple returned by ``sys.exc_info()``, and as the ``__traceback__`` attribute +tuple returned by :func:`sys.exc_info`, and as the +:attr:`~BaseException.__traceback__` attribute of the caught exception. When the program contains no suitable handler, the stack trace is written (nicely formatted) to the standard error stream; if the interpreter is interactive, it is also made available to the user -as ``sys.last_traceback``. +as :data:`sys.last_traceback`. For explicitly created tracebacks, it is up to the creator of the traceback -to determine how the ``tb_next`` attributes should be linked to form a -full stack trace. +to determine how the :attr:`~traceback.tb_next` attributes should be linked to +form a full stack trace. .. index:: single: tb_frame (traceback attribute) @@ -1263,27 +1732,40 @@ full stack trace. pair: statement; try Special read-only attributes: -:attr:`tb_frame` points to the execution frame of the current level; -:attr:`tb_lineno` gives the line number where the exception occurred; -:attr:`tb_lasti` indicates the precise instruction. + +.. list-table:: + + * - .. attribute:: traceback.tb_frame + - Points to the execution :ref:`frame ` of the current + level. + + Accessing this attribute raises an + :ref:`auditing event ` ``object.__getattr__`` with arguments + ``obj`` and ``"tb_frame"``. + + * - .. attribute:: traceback.tb_lineno + - Gives the line number where the exception occurred + + * - .. attribute:: traceback.tb_lasti + - Indicates the "precise instruction". + The line number and last instruction in the traceback may differ from the -line number of its frame object if the exception occurred in a +line number of its :ref:`frame object ` if the exception +occurred in a :keyword:`try` statement with no matching except clause or with a -finally clause. - -Accessing ``tb_frame`` raises an :ref:`auditing event ` -``object.__getattr__`` with arguments ``obj`` and ``"tb_frame"``. +:keyword:`finally` clause. .. index:: single: tb_next (traceback attribute) -Special writable attribute: :attr:`tb_next` is the next level in the stack -trace (towards the frame where the exception occurred), or ``None`` if -there is no next level. +.. attribute:: traceback.tb_next -.. versionchanged:: 3.7 - Traceback objects can now be explicitly instantiated from Python code, - and the ``tb_next`` attribute of existing instances can be updated. + The special writable attribute :attr:`!tb_next` is the next level in the + stack trace (towards the frame where the exception occurred), or ``None`` if + there is no next level. + + .. versionchanged:: 3.7 + This attribute is now writable Slice objects @@ -1334,7 +1816,7 @@ Class method objects A class method object, like a static method object, is a wrapper around another object that alters the way in which that object is retrieved from classes and class instances. The behaviour of class method objects upon such retrieval is -described above, under "User-defined methods". Class method objects are created +described above, under :ref:`"instance methods" `. Class method objects are created by the built-in :func:`classmethod` constructor. @@ -1445,6 +1927,8 @@ Basic customization It is not guaranteed that :meth:`__del__` methods are called for objects that still exist when the interpreter exits. + :class:`weakref.finalize` provides a straightforward way to register + a cleanup function to be called when an object is garbage collected. .. note:: @@ -1502,7 +1986,8 @@ Basic customization "informal" string representation of instances of that class is required. This is typically used for debugging, so it is important that the representation - is information-rich and unambiguous. + is information-rich and unambiguous. A default implementation is provided by the + :class:`object` class itself. .. index:: single: string; __str__() (object method) @@ -1512,10 +1997,10 @@ Basic customization .. method:: object.__str__(self) - Called by :func:`str(object) ` and the built-in functions - :func:`format` and :func:`print` to compute the "informal" or nicely + Called by :func:`str(object) `, the default :meth:`__format__` implementation, + and the built-in function :func:`print`, to compute the "informal" or nicely printable string representation of an object. The return value must be a - :ref:`string ` object. + :ref:`str ` object. This method differs from :meth:`object.__repr__` in that there is no expectation that :meth:`__str__` return a valid Python expression: a more @@ -1532,7 +2017,8 @@ Basic customization .. index:: pair: built-in function; bytes Called by :ref:`bytes ` to compute a byte-string representation - of an object. This should return a :class:`bytes` object. + of an object. This should return a :class:`bytes` object. The :class:`object` + class itself does not provide this method. .. index:: single: string; __format__() (object method) @@ -1556,6 +2042,9 @@ Basic customization The return value must be a string object. + The default implementation by the :class:`object` class should be given + an empty *format_spec* string. It delegates to :meth:`__str__`. + .. versionchanged:: 3.4 The __format__ method of ``object`` itself raises a :exc:`TypeError` if passed any non-empty string. @@ -1582,7 +2071,7 @@ Basic customization ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls ``x.__ge__(y)``. - A rich comparison method may return the singleton ``NotImplemented`` if it does + A rich comparison method may return the singleton :data:`NotImplemented` if it does not implement the operation for a given pair of arguments. By convention, ``False`` and ``True`` are returned for a successful comparison. However, these methods can return any value, so if the comparison operator is used in a Boolean @@ -1590,14 +2079,20 @@ Basic customization :func:`bool` on the value to determine if the result is true or false. By default, ``object`` implements :meth:`__eq__` by using ``is``, returning - ``NotImplemented`` in the case of a false comparison: + :data:`NotImplemented` in the case of a false comparison: ``True if x is y else NotImplemented``. For :meth:`__ne__`, by default it delegates to :meth:`__eq__` and inverts the result unless it is - ``NotImplemented``. There are no other implied relationships among the + :data:`!NotImplemented`. There are no other implied relationships among the comparison operators or default implementations; for example, the truth of ``(x`. See :ref:`special-lookup`. .. audit-event:: object.__getattr__ obj,name object.__getattribute__ @@ -1792,8 +2292,8 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances. .. method:: object.__dir__(self) - Called when :func:`dir` is called on the object. A sequence must be - returned. :func:`dir` converts the returned sequence to a list and sorts it. + Called when :func:`dir` is called on the object. An iterable must be + returned. :func:`dir` converts the returned iterable to a list and sorts it. Customizing module attribute access @@ -1813,7 +2313,7 @@ not found on a module object through the normal lookup, i.e. the module ``__dict__`` before raising an :exc:`AttributeError`. If found, it is called with the attribute name and the result is returned. -The ``__dir__`` function should accept no arguments, and return a sequence of +The ``__dir__`` function should accept no arguments, and return an iterable of strings that represents the names accessible on module. If present, this function overrides the standard :func:`dir` search on a module. @@ -1862,8 +2362,8 @@ method (a so-called *descriptor* class) appears in an *owner* class (the descriptor must be in either the owner's class dictionary or in the class dictionary for one of its parents). In the examples below, "the attribute" refers to the attribute whose name is the key of the property in the owner -class' :attr:`~object.__dict__`. - +class' :attr:`~object.__dict__`. The :class:`object` class itself does not +implement any of these protocols. .. method:: object.__get__(self, instance, owner=None) @@ -1896,13 +2396,17 @@ class' :attr:`~object.__dict__`. Called to delete the attribute on an instance *instance* of the owner class. +Instances of descriptors may also have the :attr:`!__objclass__` attribute +present: + +.. attribute:: object.__objclass__ -The attribute :attr:`__objclass__` is interpreted by the :mod:`inspect` module -as specifying the class where this object was defined (setting this -appropriately can assist in runtime introspection of dynamic class attributes). -For callables, it may indicate that an instance of the given type (or a -subclass) is expected or required as the first positional argument (for example, -CPython sets this attribute for unbound methods that are implemented in C). + The attribute :attr:`!__objclass__` is interpreted by the :mod:`inspect` module + as specifying the class where this object was defined (setting this + appropriately can assist in runtime introspection of dynamic class attributes). + For callables, it may indicate that an instance of the given type (or a + subclass) is expected or required as the first positional argument (for example, + CPython sets this attribute for unbound methods that are implemented in C). .. _descriptor-invocation: @@ -1983,13 +2487,14 @@ For instance bindings, the precedence of descriptor invocation depends on which descriptor methods are defined. A descriptor can define any combination of :meth:`~object.__get__`, :meth:`~object.__set__` and :meth:`~object.__delete__`. If it does not -define :meth:`__get__`, then accessing the attribute will return the descriptor +define :meth:`!__get__`, then accessing the attribute will return the descriptor object itself unless there is a value in the object's instance dictionary. If -the descriptor defines :meth:`__set__` and/or :meth:`__delete__`, it is a data +the descriptor defines :meth:`!__set__` and/or :meth:`!__delete__`, it is a data descriptor; if it defines neither, it is a non-data descriptor. Normally, data -descriptors define both :meth:`__get__` and :meth:`__set__`, while non-data -descriptors have just the :meth:`__get__` method. Data descriptors with -:meth:`__get__` and :meth:`__set__` (and/or :meth:`__delete__`) defined always override a redefinition in an +descriptors define both :meth:`!__get__` and :meth:`!__set__`, while non-data +descriptors have just the :meth:`!__get__` method. Data descriptors with +:meth:`!__get__` and :meth:`!__set__` (and/or :meth:`!__delete__`) defined +always override a redefinition in an instance dictionary. In contrast, non-data descriptors can be overridden by instances. @@ -2053,9 +2558,9 @@ Notes on using *__slots__*: * The action of a *__slots__* declaration is not limited to the class where it is defined. *__slots__* declared in parents are available in - child classes. However, child subclasses will get a :attr:`~object.__dict__` and - *__weakref__* unless they also define *__slots__* (which should only - contain names of any *additional* slots). + child classes. However, instances of a child subclass will get a + :attr:`~object.__dict__` and *__weakref__* unless the subclass also defines + *__slots__* (which should only contain names of any *additional* slots). * If a class defines a slot also defined in a base class, the instance variable defined by the base class slot is inaccessible (except by retrieving its @@ -2074,7 +2579,7 @@ Notes on using *__slots__*: to provide per-attribute docstrings that will be recognised by :func:`inspect.getdoc` and displayed in the output of :func:`help`. -* :attr:`~instance.__class__` assignment works only if both classes have the +* :attr:`~object.__class__` assignment works only if both classes have the same *__slots__*. * :ref:`Multiple inheritance ` with multiple slotted parent @@ -2107,7 +2612,7 @@ class defining the method. this method is implicitly converted to a class method. Keyword arguments which are given to a new class are passed to - the parent's class ``__init_subclass__``. For compatibility with + the parent class's ``__init_subclass__``. For compatibility with other classes using ``__init_subclass__``, one should take out the needed keyword arguments and pass the others over to the base class, as in:: @@ -2340,7 +2845,7 @@ in the local namespace as the defined class. When a new class is created by ``type.__new__``, the object provided as the namespace parameter is copied to a new ordered mapping and the original object is discarded. The new copy is wrapped in a read-only proxy, which -becomes the :attr:`~object.__dict__` attribute of the class object. +becomes the :attr:`~type.__dict__` attribute of the class object. .. seealso:: @@ -2368,14 +2873,14 @@ order to allow the addition of Abstract Base Classes (ABCs) as "virtual base classes" to any class or type (including built-in types), including other ABCs. -.. method:: class.__instancecheck__(self, instance) +.. method:: type.__instancecheck__(self, instance) Return true if *instance* should be considered a (direct or indirect) instance of *class*. If defined, called to implement ``isinstance(instance, class)``. -.. method:: class.__subclasscheck__(self, subclass) +.. method:: type.__subclasscheck__(self, subclass) Return true if *subclass* should be considered a (direct or indirect) subclass of *class*. If defined, called to implement ``issubclass(subclass, @@ -2391,8 +2896,8 @@ case the instance is itself a class. :pep:`3119` - Introducing Abstract Base Classes Includes the specification for customizing :func:`isinstance` and - :func:`issubclass` behavior through :meth:`~class.__instancecheck__` and - :meth:`~class.__subclasscheck__`, with motivation for this functionality + :func:`issubclass` behavior through :meth:`~type.__instancecheck__` and + :meth:`~type.__subclasscheck__`, with motivation for this functionality in the context of adding Abstract Base Classes (see the :mod:`abc` module) to the language. @@ -2550,6 +3055,7 @@ Emulating callable objects Called when the instance is "called" as a function; if this method is defined, ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``. + The :class:`object` class itself does not provide this method. .. _sequence-types: @@ -2557,25 +3063,27 @@ Emulating callable objects Emulating container types ------------------------- -The following methods can be defined to implement container objects. Containers -usually are :term:`sequences ` (such as :class:`lists ` or +The following methods can be defined to implement container objects. None of them +are provided by the :class:`object` class itself. Containers usually are +:term:`sequences ` (such as :class:`lists ` or :class:`tuples `) or :term:`mappings ` (like -:class:`dictionaries `), +:term:`dictionaries `), but can represent other containers as well. The first set of methods is used either to emulate a sequence or to emulate a mapping; the difference is that for a sequence, the allowable keys should be the integers *k* for which ``0 <= k < N`` where *N* is the length of the sequence, or :class:`slice` objects, which define a range of items. It is also recommended that mappings provide the methods -:meth:`keys`, :meth:`values`, :meth:`items`, :meth:`get`, :meth:`clear`, -:meth:`setdefault`, :meth:`pop`, :meth:`popitem`, :meth:`!copy`, and -:meth:`update` behaving similar to those for Python's standard :class:`dictionary ` +:meth:`!keys`, :meth:`!values`, :meth:`!items`, :meth:`!get`, :meth:`!clear`, +:meth:`!setdefault`, :meth:`!pop`, :meth:`!popitem`, :meth:`!copy`, and +:meth:`!update` behaving similar to those for Python's standard :class:`dictionary ` objects. The :mod:`collections.abc` module provides a :class:`~collections.abc.MutableMapping` :term:`abstract base class` to help create those methods from a base set of -:meth:`~object.__getitem__`, :meth:`~object.__setitem__`, :meth:`~object.__delitem__`, and :meth:`keys`. -Mutable sequences should provide methods :meth:`append`, :meth:`count`, -:meth:`index`, :meth:`extend`, :meth:`insert`, :meth:`pop`, :meth:`remove`, -:meth:`reverse` and :meth:`sort`, like Python standard :class:`list` +:meth:`~object.__getitem__`, :meth:`~object.__setitem__`, +:meth:`~object.__delitem__`, and :meth:`!keys`. +Mutable sequences should provide methods :meth:`!append`, :meth:`!count`, +:meth:`!index`, :meth:`!extend`, :meth:`!insert`, :meth:`!pop`, :meth:`!remove`, +:meth:`!reverse` and :meth:`!sort`, like Python standard :class:`list` objects. Finally, sequence types should implement addition (meaning concatenation) and multiplication (meaning repetition) by defining the methods @@ -2588,7 +3096,7 @@ operator; for mappings, ``in`` should search the mapping's keys; for sequences, it should search through the values. It is further recommended that both mappings and sequences implement the :meth:`~object.__iter__` method to allow efficient iteration -through the container; for mappings, :meth:`__iter__` should iterate +through the container; for mappings, :meth:`!__iter__` should iterate through the object's keys; for sequences, it should iterate through the values. .. method:: object.__len__(self) @@ -2616,7 +3124,7 @@ through the object's keys; for sequences, it should iterate through the values. Called to implement :func:`operator.length_hint`. Should return an estimated length for the object (which may be greater or less than the actual length). The length must be an integer ``>=`` 0. The return value may also be - :const:`NotImplemented`, which is treated the same as if the + :data:`NotImplemented`, which is treated the same as if the ``__length_hint__`` method didn't exist at all. This method is purely an optimization and is never required for correctness. @@ -2641,10 +3149,10 @@ through the object's keys; for sequences, it should iterate through the values. .. method:: object.__getitem__(self, key) Called to implement evaluation of ``self[key]``. For :term:`sequence` types, - the accepted keys should be integers and slice objects. Note that the - special interpretation of negative indexes (if the class wishes to emulate a - :term:`sequence` type) is up to the :meth:`__getitem__` method. If *key* is - of an inappropriate type, :exc:`TypeError` may be raised; if of a value + the accepted keys should be integers. Optionally, they may support + :class:`slice` objects as well. Negative index support is also optional. + If *key* is + of an inappropriate type, :exc:`TypeError` may be raised; if *key* is a value outside the set of indexes for the sequence (after any special interpretation of negative values), :exc:`IndexError` should be raised. For :term:`mapping` types, if *key* is missing (not in the container), @@ -2768,7 +3276,7 @@ left undefined. function is to be supported. If one of those methods does not support the operation with the supplied - arguments, it should return ``NotImplemented``. + arguments, it should return :data:`NotImplemented`. .. method:: object.__radd__(self, other) @@ -2798,7 +3306,7 @@ left undefined. types. [#]_ For instance, to evaluate the expression ``x - y``, where *y* is an instance of a class that has an :meth:`__rsub__` method, ``type(y).__rsub__(y, x)`` is called if ``type(x).__sub__(x, y)`` returns - *NotImplemented*. + :data:`NotImplemented`. .. index:: pair: built-in function; pow @@ -2832,10 +3340,12 @@ left undefined. (``+=``, ``-=``, ``*=``, ``@=``, ``/=``, ``//=``, ``%=``, ``**=``, ``<<=``, ``>>=``, ``&=``, ``^=``, ``|=``). These methods should attempt to do the operation in-place (modifying *self*) and return the result (which could be, - but does not have to be, *self*). If a specific method is not defined, the + but does not have to be, *self*). If a specific method is not defined, or if + that method returns :data:`NotImplemented`, the augmented assignment falls back to the normal methods. For instance, if *x* is an instance of a class with an :meth:`__iadd__` method, ``x += y`` is - equivalent to ``x = x.__iadd__(y)`` . Otherwise, ``x.__add__(y)`` and + equivalent to ``x = x.__iadd__(y)`` . If :meth:`__iadd__` does not exist, or if ``x.__iadd__(y)`` + returns :data:`!NotImplemented`, ``x.__add__(y)`` and ``y.__radd__(x)`` are considered, as with the evaluation of ``x + y``. In certain situations, augmented assignment can result in unexpected errors (see :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact @@ -2920,6 +3430,7 @@ Typical uses of context managers include saving and restoring various kinds of global state, locking and unlocking resources, closing opened files, etc. For more information on context managers, see :ref:`typecontextmanager`. +The :class:`object` class itself does not provide the context manager methods. .. method:: object.__enter__(self) @@ -2939,7 +3450,7 @@ For more information on context managers, see :ref:`typecontextmanager`. (i.e., prevent it from being propagated), it should return a true value. Otherwise, the exception will be processed normally upon exit from this method. - Note that :meth:`__exit__` methods should not reraise the passed-in exception; + Note that :meth:`~object.__exit__` methods should not reraise the passed-in exception; this is the caller's responsibility. @@ -3124,6 +3635,8 @@ are awaitable. Must return an :term:`iterator`. Should be used to implement :term:`awaitable` objects. For instance, :class:`asyncio.Future` implements this method to be compatible with the :keyword:`await` expression. + The :class:`object` class itself is not awaitable and does not provide + this method. .. note:: @@ -3167,7 +3680,7 @@ generators, coroutines do not directly support iteration. to the :meth:`~generator.send` method of the iterator that caused the coroutine to suspend. The result (return value, :exc:`StopIteration`, or other exception) is the same as when - iterating over the :meth:`__await__` return value, described above. + iterating over the :meth:`!__await__` return value, described above. .. method:: coroutine.throw(value) coroutine.throw(type[, value[, traceback]]) @@ -3209,6 +3722,9 @@ its ``__anext__`` method. Asynchronous iterators can be used in an :keyword:`async for` statement. +The :class:`object` class itself does not provide these methods. + + .. method:: object.__aiter__(self) Must return an *asynchronous iterator* object. @@ -3255,14 +3771,16 @@ suspend execution in its ``__aenter__`` and ``__aexit__`` methods. Asynchronous context managers can be used in an :keyword:`async with` statement. +The :class:`object` class itself does not provide these methods. + .. method:: object.__aenter__(self) - Semantically similar to :meth:`__enter__`, the only + Semantically similar to :meth:`~object.__enter__`, the only difference being that it must return an *awaitable*. .. method:: object.__aexit__(self, exc_type, exc_value, traceback) - Semantically similar to :meth:`__exit__`, the only + Semantically similar to :meth:`~object.__exit__`, the only difference being that it must return an *awaitable*. An example of an asynchronous context manager class:: @@ -3284,13 +3802,14 @@ An example of an asynchronous context manager class:: lead to some very strange behaviour if it is handled incorrectly. .. [#] The :meth:`~object.__hash__`, :meth:`~object.__iter__`, - :meth:`~object.__reversed__`, and :meth:`~object.__contains__` methods have - special handling for this; others + :meth:`~object.__reversed__`, :meth:`~object.__contains__`, + :meth:`~object.__class_getitem__` and :meth:`~os.PathLike.__fspath__` + methods have special handling for this. Others will still raise a :exc:`TypeError`, but may do so by relying on the behavior that ``None`` is not callable. .. [#] "Does not support" here means that the class has no such method, or - the method returns ``NotImplemented``. Do not set the method to + the method returns :data:`NotImplemented`. Do not set the method to ``None`` if you want to force fallback to the right operand's reflected method—that will instead have the opposite effect of explicitly *blocking* such fallback. diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index cea3a56b..1cf543a4 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -90,7 +90,7 @@ If a name is bound in a block, it is a local variable of that block, unless declared as :keyword:`nonlocal` or :keyword:`global`. If a name is bound at the module level, it is a global variable. (The variables of the module code block are local and global.) If a variable is used in a code block but not -defined there, it is a :dfn:`free variable`. +defined there, it is a :term:`free variable`. Each occurrence of a name in the program text refers to the :dfn:`binding` of that name established by the following name resolution rules. @@ -139,8 +139,9 @@ namespace. Names are resolved in the top-level namespace by searching the global namespace, i.e. the namespace of the module containing the code block, and the builtins namespace, the namespace of the module :mod:`builtins`. The global namespace is searched first. If the names are not found there, the -builtins namespace is searched. The :keyword:`!global` statement must precede -all uses of the listed names. +builtins namespace is searched next. If the names are also not found in the +builtins namespace, new variables are created in the global namespace. +The global statement must precede all uses of the listed names. The :keyword:`global` statement has the same scope as a name binding operation in the same block. If the nearest enclosing scope for a free variable contains @@ -204,7 +205,7 @@ Annotation scopes are used in the following contexts: * Type parameter lists for :ref:`generic classes `. A generic class's base classes and keyword arguments are executed within the annotation scope, but its decorators are not. -* The bounds and constraints for type variables +* The bounds, constraints, and default values for type parameters (:ref:`lazily evaluated `). * The value of type aliases (:ref:`lazily evaluated `). @@ -224,20 +225,24 @@ Annotation scopes differ from function scopes in the following ways: statements in inner scopes. This includes only type parameters, as no other syntactic elements that can appear within annotation scopes can introduce new names. * While annotation scopes have an internal name, that name is not reflected in the - :term:`__qualname__ ` of objects defined within the scope. - Instead, the :attr:`!__qualname__` + :term:`qualified name` of objects defined within the scope. + Instead, the :attr:`~definition.__qualname__` of such objects is as if the object were defined in the enclosing scope. .. versionadded:: 3.12 Annotation scopes were introduced in Python 3.12 as part of :pep:`695`. +.. versionchanged:: 3.13 + Annotation scopes are also used for type parameter defaults, as + introduced by :pep:`696`. + .. _lazy-evaluation: Lazy evaluation --------------- The values of type aliases created through the :keyword:`type` statement are -*lazily evaluated*. The same applies to the bounds and constraints of type +*lazily evaluated*. The same applies to the bounds, constraints, and default values of type variables created through the :ref:`type parameter syntax `. This means that they are not evaluated when the type alias or type variable is created. Instead, they are only evaluated when doing so is necessary to resolve @@ -325,6 +330,9 @@ enclosing namespace, but in the global namespace. [#]_ The :func:`exec` and :func:`eval` functions have optional arguments to override the global and local namespace. If only one namespace is specified, it is used for both. +.. XXX(ncoghlan) above is only accurate for string execution. When executing code objects, + closure cells may now be passed explicitly to resolve co_freevars references. + Docs issue: https://github.com/python/cpython/issues/122826 .. _exceptions: diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 5d7a36aa..3eaceae4 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -14,7 +14,7 @@ be used to describe syntax, not lexical analysis. When (one alternative of) a syntax rule has the form .. productionlist:: python-grammar - name: `othername` + name: othername and no semantics are given, the semantics of this form of ``name`` are the same as for ``othername``. @@ -33,7 +33,7 @@ implementation for built-in types works as follows: * If either argument is a complex number, the other is converted to complex; -* otherwise, if either argument is a floating point number, the other is +* otherwise, if either argument is a floating-point number, the other is converted to floating point; * otherwise, both must be integers and no conversion is necessary. @@ -83,18 +83,47 @@ exception. pair: name; mangling pair: private; names -**Private name mangling:** When an identifier that textually occurs in a class -definition begins with two or more underscore characters and does not end in two -or more underscores, it is considered a :dfn:`private name` of that class. -Private names are transformed to a longer form before code is generated for -them. The transformation inserts the class name, with leading underscores -removed and a single underscore inserted, in front of the name. For example, -the identifier ``__spam`` occurring in a class named ``Ham`` will be transformed -to ``_Ham__spam``. This transformation is independent of the syntactical -context in which the identifier is used. If the transformed name is extremely -long (longer than 255 characters), implementation defined truncation may happen. -If the class name consists only of underscores, no transformation is done. +Private name mangling +^^^^^^^^^^^^^^^^^^^^^ +When an identifier that textually occurs in a class definition begins with two +or more underscore characters and does not end in two or more underscores, it +is considered a :dfn:`private name` of that class. + +.. seealso:: + + The :ref:`class specifications `. + +More precisely, private names are transformed to a longer form before code is +generated for them. If the transformed name is longer than 255 characters, +implementation-defined truncation may happen. + +The transformation is independent of the syntactical context in which the +identifier is used but only the following private identifiers are mangled: + +- Any name used as the name of a variable that is assigned or read or any + name of an attribute being accessed. + + The :attr:`~definition.__name__` attribute of nested functions, classes, and + type aliases is however not mangled. + +- The name of imported modules, e.g., ``__spam`` in ``import __spam``. + If the module is part of a package (i.e., its name contains a dot), + the name is *not* mangled, e.g., the ``__foo`` in ``import __foo.bar`` + is not mangled. + +- The name of an imported member, e.g., ``__f`` in ``from spam import __f``. + +The transformation rule is defined as follows: + +- The class name, with leading underscores removed and a single leading + underscore inserted, is inserted in front of the identifier, e.g., the + identifier ``__spam`` occurring in a class named ``Foo``, ``_Foo`` or + ``__Foo`` is transformed to ``_Foo__spam``. + +- If the class name consists only of underscores, the transformation is the + identity, e.g., the identifier ``__spam`` occurring in a class named ``_`` + or ``__`` is left as is. .. _atom-literals: @@ -110,8 +139,8 @@ Python supports string and bytes literals and various numeric literals: : | `integer` | `floatnumber` | `imagnumber` Evaluation of a literal yields an object of the given type (string, bytes, -integer, floating point number, complex number) with the given value. The value -may be approximated in the case of floating point and imaginary (complex) +integer, floating-point number, complex number) with the given value. The value +may be approximated in the case of floating-point and imaginary (complex) literals. See section :ref:`literals` for details. .. index:: @@ -218,10 +247,12 @@ A comprehension in an :keyword:`!async def` function may consist of either a :keyword:`!for` or :keyword:`!async for` clause following the leading expression, may contain additional :keyword:`!for` or :keyword:`!async for` clauses, and may also use :keyword:`await` expressions. -If a comprehension contains either :keyword:`!async for` clauses or -:keyword:`!await` expressions or other asynchronous comprehensions it is called -an :dfn:`asynchronous comprehension`. An asynchronous comprehension may -suspend the execution of the coroutine function in which it appears. + +If a comprehension contains :keyword:`!async for` clauses, or if it contains +:keyword:`!await` expressions or other asynchronous comprehensions anywhere except +the iterable expression in the leftmost :keyword:`!for` clause, it is called an +:dfn:`asynchronous comprehension`. An asynchronous comprehension may suspend the +execution of the coroutine function in which it appears. See also :pep:`530`. .. versionadded:: 3.6 @@ -253,7 +284,7 @@ A list display is a possibly empty series of expressions enclosed in square brackets: .. productionlist:: python-grammar - list_display: "[" [`starred_list` | `comprehension`] "]" + list_display: "[" [`flexible_expression_list` | `comprehension`] "]" A list display yields a new list object, the contents being specified by either a list of expressions or a comprehension. When a comma-separated list of @@ -278,7 +309,7 @@ A set display is denoted by curly braces and distinguishable from dictionary displays by the lack of colons separating keys and values: .. productionlist:: python-grammar - set_display: "{" (`starred_list` | `comprehension`) "}" + set_display: "{" (`flexible_expression_list` | `comprehension`) "}" A set display yields a new mutable set object, the contents being specified by either a sequence of expressions or a comprehension. When a comma-separated @@ -422,7 +453,8 @@ Yield expressions .. productionlist:: python-grammar yield_atom: "(" `yield_expression` ")" - yield_expression: "yield" [`expression_list` | "from" `expression`] + yield_from: "yield" "from" `expression` + yield_expression: "yield" `yield_list` | `yield_from` The yield expression is used when defining a :term:`generator` function or an :term:`asynchronous generator` function and @@ -453,9 +485,9 @@ When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of the generator function. The execution starts when one of the generator's methods is called. At that time, the execution proceeds to the first yield expression, where it is -suspended again, returning the value of :token:`~python-grammar:expression_list` +suspended again, returning the value of :token:`~python-grammar:yield_list` to the generator's caller, -or ``None`` if :token:`~python-grammar:expression_list` is omitted. +or ``None`` if :token:`~python-grammar:yield_list` is omitted. By suspended, we mean that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. @@ -499,8 +531,8 @@ the yield expression. It can be either set explicitly when raising :exc:`StopIteration`, or automatically when the subiterator is a generator (by returning a value from the subgenerator). - .. versionchanged:: 3.3 - Added ``yield from `` to delegate control flow to a subiterator. +.. versionchanged:: 3.3 + Added ``yield from `` to delegate control flow to a subiterator. The parentheses may be omitted when the yield expression is the sole expression on the right hand side of an assignment statement. @@ -544,7 +576,7 @@ is already executing raises a :exc:`ValueError` exception. :meth:`~generator.__next__` method, the current yield expression always evaluates to :const:`None`. The execution then continues to the next yield expression, where the generator is suspended again, and the value of the - :token:`~python-grammar:expression_list` is returned to :meth:`__next__`'s + :token:`~python-grammar:yield_list` is returned to :meth:`__next__`'s caller. If the generator exits without yielding another value, a :exc:`StopIteration` exception is raised. @@ -595,12 +627,19 @@ is already executing raises a :exc:`ValueError` exception. .. method:: generator.close() Raises a :exc:`GeneratorExit` at the point where the generator function was - paused. If the generator function then exits gracefully, is already closed, - or raises :exc:`GeneratorExit` (by not catching the exception), close - returns to its caller. If the generator yields a value, a - :exc:`RuntimeError` is raised. If the generator raises any other exception, - it is propagated to the caller. :meth:`close` does nothing if the generator - has already exited due to an exception or normal exit. + paused. If the generator function catches the exception and returns a + value, this value is returned from :meth:`close`. If the generator function + is already closed, or raises :exc:`GeneratorExit` (by not catching the + exception), :meth:`close` returns :const:`None`. If the generator yields a + value, a :exc:`RuntimeError` is raised. If the generator raises any other + exception, it is propagated to the caller. If the generator has already + exited due to an exception or normal exit, :meth:`close` returns + :const:`None` and has no other effect. + + .. versionchanged:: 3.13 + + If a generator returns a value upon being closed, the value is returned + by :meth:`close`. .. index:: single: yield; examples @@ -656,7 +695,7 @@ how a generator object would be used in a :keyword:`for` statement. Calling one of the asynchronous generator's methods returns an :term:`awaitable` object, and the execution starts when this object is awaited on. At that time, the execution proceeds to the first yield expression, where it is suspended -again, returning the value of :token:`~python-grammar:expression_list` to the +again, returning the value of :token:`~python-grammar:yield_list` to the awaiting coroutine. As with a generator, suspension means that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. @@ -720,7 +759,7 @@ which are used to control the execution of a generator function. asynchronous generator function is resumed with an :meth:`~agen.__anext__` method, the current yield expression always evaluates to :const:`None` in the returned awaitable, which when run will continue to the next yield - expression. The value of the :token:`~python-grammar:expression_list` of the + expression. The value of the :token:`~python-grammar:yield_list` of the yield expression is the value of the :exc:`StopIteration` exception raised by the completing coroutine. If the asynchronous generator exits without yielding another value, the awaitable instead raises a @@ -733,7 +772,7 @@ which are used to control the execution of a generator function. .. coroutinemethod:: agen.asend(value) Returns an awaitable which when run resumes the execution of the - asynchronous generator. As with the :meth:`~generator.send()` method for a + asynchronous generator. As with the :meth:`~generator.send` method for a generator, this "sends" a value into the asynchronous generator function, and the *value* argument becomes the result of the current yield expression. The awaitable returned by the :meth:`asend` method will return the next @@ -816,12 +855,18 @@ An attribute reference is a primary followed by a period and a name: The primary must evaluate to an object of a type that supports attribute references, which most objects do. This object is then asked to produce the -attribute whose name is the identifier. This production can be customized by -overriding the :meth:`__getattr__` method. If this attribute is not available, -the exception :exc:`AttributeError` is raised. Otherwise, the type and value of -the object produced is determined by the object. Multiple evaluations of the -same attribute reference may yield different objects. +attribute whose name is the identifier. The type and value produced is +determined by the object. Multiple evaluations of the same attribute +reference may yield different objects. + +This production can be customized by overriding the +:meth:`~object.__getattribute__` method or the :meth:`~object.__getattr__` +method. The :meth:`!__getattribute__` method is called first and either +returns a value or raises :exc:`AttributeError` if the attribute is not +available. +If an :exc:`AttributeError` is raised and the object has a :meth:`!__getattr__` +method, that method is called as a fallback. .. _subscriptions: @@ -847,7 +892,7 @@ will generally select an element from the container. The subscription of a :ref:`GenericAlias ` object. .. productionlist:: python-grammar - subscription: `primary` "[" `expression_list` "]" + subscription: `primary` "[" `flexible_expression_list` "]" When an object is subscripted, the interpreter will evaluate the primary and the expression list. @@ -859,9 +904,13 @@ primary is subscripted, the evaluated result of the expression list will be passed to one of these methods. For more details on when ``__class_getitem__`` is called instead of ``__getitem__``, see :ref:`classgetitem-versus-getitem`. -If the expression list contains at least one comma, it will evaluate to a -:class:`tuple` containing the items of the expression list. Otherwise, the -expression list will evaluate to the value of the list's sole member. +If the expression list contains at least one comma, or if any of the expressions +are starred, the expression list will evaluate to a :class:`tuple` containing +the items of the expression list. Otherwise, the expression list will evaluate +to the value of the list's sole member. + +.. versionchanged:: 3.11 + Expressions in an expression list may be starred. See :pep:`646`. For built-in objects, there are two types of objects that support subscription via :meth:`~object.__getitem__`: @@ -882,7 +931,7 @@ to the index so that, for example, ``x[-1]`` selects the last item of ``x``. The resulting value must be a nonnegative integer less than the number of items in the sequence, and the subscription selects the item whose index is that value (counting from zero). Since the support for negative indices and slicing -occurs in the object's :meth:`__getitem__` method, subclasses overriding +occurs in the object's :meth:`~object.__getitem__` method, subclasses overriding this method will need to explicitly add that support. .. index:: @@ -937,7 +986,7 @@ slice list contains no proper slice). single: step (slice object attribute) The semantics for a slicing are as follows. The primary is indexed (using the -same :meth:`__getitem__` method as +same :meth:`~object.__getitem__` method as normal subscription) with a key that is constructed from the slice list, as follows. If the slice list contains at least one comma, the key is a tuple containing the conversion of the slice items; otherwise, the conversion of the @@ -987,7 +1036,7 @@ but does not affect the semantics. The primary must evaluate to a callable object (user-defined functions, built-in functions, methods of built-in objects, class objects, methods of class -instances, and all objects having a :meth:`__call__` method are callable). All +instances, and all objects having a :meth:`~object.__call__` method are callable). All argument expressions are evaluated before the call is attempted. Please refer to section :ref:`function` for the syntax of formal :term:`parameter` lists. @@ -1107,7 +1156,8 @@ a user-defined function: first thing the code block will do is bind the formal parameters to the arguments; this is described in section :ref:`function`. When the code block executes a :keyword:`return` statement, this specifies the return value of the - function call. + function call. If execution reaches the end of the code block without + executing a :keyword:`return` statement, the return value is ``None``. a built-in function or method: .. index:: @@ -1145,7 +1195,7 @@ a class instance: pair: instance; call single: __call__() (object method) - The class must define a :meth:`__call__` method; the effect is then the same as + The class must define a :meth:`~object.__call__` method; the effect is then the same as if that method was called. @@ -1197,7 +1247,8 @@ Raising ``0.0`` to a negative power results in a :exc:`ZeroDivisionError`. Raising a negative number to a fractional power results in a :class:`complex` number. (In earlier versions it raised a :exc:`ValueError`.) -This operation can be customized using the special :meth:`__pow__` method. +This operation can be customized using the special :meth:`~object.__pow__` and +:meth:`~object.__rpow__` methods. .. _unary: @@ -1220,7 +1271,7 @@ All unary arithmetic and bitwise operations have the same priority: single: - (minus); unary operator The unary ``-`` (minus) operator yields the negation of its numeric argument; the -operation can be overridden with the :meth:`__neg__` special method. +operation can be overridden with the :meth:`~object.__neg__` special method. .. index:: single: plus @@ -1228,7 +1279,7 @@ operation can be overridden with the :meth:`__neg__` special method. single: + (plus); unary operator The unary ``+`` (plus) operator yields its numeric argument unchanged; the -operation can be overridden with the :meth:`__pos__` special method. +operation can be overridden with the :meth:`~object.__pos__` special method. .. index:: single: inversion @@ -1237,7 +1288,7 @@ operation can be overridden with the :meth:`__pos__` special method. The unary ``~`` (invert) operator yields the bitwise inversion of its integer argument. The bitwise inversion of ``x`` is defined as ``-(x+1)``. It only applies to integral numbers or to custom objects that override the -:meth:`__invert__` special method. +:meth:`~object.__invert__` special method. @@ -1275,8 +1326,8 @@ the other must be a sequence. In the former case, the numbers are converted to a common type and then multiplied together. In the latter case, sequence repetition is performed; a negative repetition factor yields an empty sequence. -This operation can be customized using the special :meth:`__mul__` and -:meth:`__rmul__` methods. +This operation can be customized using the special :meth:`~object.__mul__` and +:meth:`~object.__rmul__` methods. .. index:: single: matrix multiplication @@ -1285,6 +1336,9 @@ This operation can be customized using the special :meth:`__mul__` and The ``@`` (at) operator is intended to be used for matrix multiplication. No builtin Python types implement this operator. +This operation can be customized using the special :meth:`~object.__matmul__` and +:meth:`~object.__rmatmul__` methods. + .. versionadded:: 3.5 .. index:: @@ -1300,8 +1354,10 @@ integer; the result is that of mathematical division with the 'floor' function applied to the result. Division by zero raises the :exc:`ZeroDivisionError` exception. -This operation can be customized using the special :meth:`__truediv__` and -:meth:`__floordiv__` methods. +The division operation can be customized using the special :meth:`~object.__truediv__` +and :meth:`~object.__rtruediv__` methods. +The floor division operation can be customized using the special +:meth:`~object.__floordiv__` and :meth:`~object.__rfloordiv__` methods. .. index:: single: modulo @@ -1310,7 +1366,7 @@ This operation can be customized using the special :meth:`__truediv__` and The ``%`` (modulo) operator yields the remainder from the division of the first argument by the second. The numeric arguments are first converted to a common type. A zero right argument raises the :exc:`ZeroDivisionError` exception. The -arguments may be floating point numbers, e.g., ``3.14%0.7`` equals ``0.34`` +arguments may be floating-point numbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals ``4*0.7 + 0.34``.) The modulo operator always yields a result with the same sign as its second operand (or zero); the absolute value of the result is strictly smaller than the absolute value of the second operand @@ -1326,11 +1382,12 @@ also overloaded by string objects to perform old-style string formatting (also known as interpolation). The syntax for string formatting is described in the Python Library Reference, section :ref:`old-string-formatting`. -The *modulo* operation can be customized using the special :meth:`__mod__` method. +The *modulo* operation can be customized using the special :meth:`~object.__mod__` +and :meth:`~object.__rmod__` methods. The floor division operator, the modulo operator, and the :func:`divmod` -function are not defined for complex numbers. Instead, convert to a floating -point number using the :func:`abs` function if appropriate. +function are not defined for complex numbers. Instead, convert to a +floating-point number using the :func:`abs` function if appropriate. .. index:: single: addition @@ -1342,8 +1399,8 @@ must either both be numbers or both be sequences of the same type. In the former case, the numbers are converted to a common type and then added together. In the latter case, the sequences are concatenated. -This operation can be customized using the special :meth:`__add__` and -:meth:`__radd__` methods. +This operation can be customized using the special :meth:`~object.__add__` and +:meth:`~object.__radd__` methods. .. index:: single: subtraction @@ -1353,7 +1410,8 @@ This operation can be customized using the special :meth:`__add__` and The ``-`` (subtraction) operator yields the difference of its arguments. The numeric arguments are first converted to a common type. -This operation can be customized using the special :meth:`__sub__` method. +This operation can be customized using the special :meth:`~object.__sub__` and +:meth:`~object.__rsub__` methods. .. _shifting: @@ -1374,8 +1432,10 @@ The shifting operations have lower priority than the arithmetic operations: These operators accept integers as arguments. They shift the first argument to the left or right by the number of bits given by the second argument. -This operation can be customized using the special :meth:`__lshift__` and -:meth:`__rshift__` methods. +The left shift operation can be customized using the special :meth:`~object.__lshift__` +and :meth:`~object.__rlshift__` methods. +The right shift operation can be customized using the special :meth:`~object.__rshift__` +and :meth:`~object.__rrshift__` methods. .. index:: pair: exception; ValueError @@ -1402,8 +1462,8 @@ Each of the three bitwise operations has a different priority level: pair: operator; & (ampersand) The ``&`` operator yields the bitwise AND of its arguments, which must be -integers or one of them must be a custom object overriding :meth:`__and__` or -:meth:`__rand__` special methods. +integers or one of them must be a custom object overriding :meth:`~object.__and__` or +:meth:`~object.__rand__` special methods. .. index:: pair: bitwise; xor @@ -1411,8 +1471,8 @@ integers or one of them must be a custom object overriding :meth:`__and__` or pair: operator; ^ (caret) The ``^`` operator yields the bitwise XOR (exclusive OR) of its arguments, which -must be integers or one of them must be a custom object overriding :meth:`__xor__` or -:meth:`__rxor__` special methods. +must be integers or one of them must be a custom object overriding :meth:`~object.__xor__` or +:meth:`~object.__rxor__` special methods. .. index:: pair: bitwise; or @@ -1420,8 +1480,8 @@ must be integers or one of them must be a custom object overriding :meth:`__xor_ pair: operator; | (vertical bar) The ``|`` operator yields the bitwise (inclusive) OR of its arguments, which -must be integers or one of them must be a custom object overriding :meth:`__or__` or -:meth:`__ror__` special methods. +must be integers or one of them must be a custom object overriding :meth:`~object.__or__` or +:meth:`~object.__ror__` special methods. .. _comparisons: @@ -1488,7 +1548,7 @@ comparison implementation. Because all types are (direct or indirect) subtypes of :class:`object`, they inherit the default comparison behavior from :class:`object`. Types can customize their comparison behavior by implementing -:dfn:`rich comparison methods` like :meth:`__lt__`, described in +:dfn:`rich comparison methods` like :meth:`~object.__lt__`, described in :ref:`customization`. The default behavior for equality comparison (``==`` and ``!=``) is based on @@ -1525,7 +1585,7 @@ built-in types. ``x == x`` are all false, while ``x != x`` is true. This behavior is compliant with IEEE 754. -* ``None`` and ``NotImplemented`` are singletons. :PEP:`8` advises that +* ``None`` and :data:`NotImplemented` are singletons. :PEP:`8` advises that comparisons for singletons should always be done with ``is`` or ``is not``, never the equality operators. @@ -1652,18 +1712,18 @@ substring of *y*. An equivalent test is ``y.find(x) != -1``. Empty strings are always considered to be a substring of any other string, so ``"" in "abc"`` will return ``True``. -For user-defined classes which define the :meth:`__contains__` method, ``x in +For user-defined classes which define the :meth:`~object.__contains__` method, ``x in y`` returns ``True`` if ``y.__contains__(x)`` returns a true value, and ``False`` otherwise. -For user-defined classes which do not define :meth:`__contains__` but do define -:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z``, for which the +For user-defined classes which do not define :meth:`~object.__contains__` but do define +:meth:`~object.__iter__`, ``x in y`` is ``True`` if some value ``z``, for which the expression ``x is z or x == z`` is true, is produced while iterating over ``y``. If an exception is raised during the iteration, it is as if :keyword:`in` raised that exception. Lastly, the old-style iteration protocol is tried: if a class defines -:meth:`__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative +:meth:`~object.__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative integer index *i* such that ``x is y[i] or x == y[i]``, and no lower integer index raises the :exc:`IndexError` exception. (If any other exception is raised, it is as if :keyword:`in` raised that exception). @@ -1748,6 +1808,9 @@ returns a boolean value regardless of the type of its argument single: assignment expression single: walrus operator single: named expression + pair: assignment; expression + +.. _assignment-expressions: Assignment expressions ====================== @@ -1774,10 +1837,11 @@ Or, when processing a file stream in chunks: while chunk := file.read(9000): process(chunk) -Assignment expressions must be surrounded by parentheses when used -as sub-expressions in slicing, conditional, lambda, -keyword-argument, and comprehension-if expressions -and in ``assert`` and ``with`` statements. +Assignment expressions must be surrounded by parentheses when +used as expression statements and when used as sub-expressions in +slicing, conditional, lambda, +keyword-argument, and comprehension-if expressions and +in ``assert``, ``with``, and ``assignment`` statements. In all other places where they can be used, parentheses are not required, including in ``if`` and ``while`` statements. @@ -1849,10 +1913,12 @@ Expression lists single: , (comma); expression list .. productionlist:: python-grammar + starred_expression: ["*"] `or_expr` + flexible_expression: `assignment_expression` | `starred_expression` + flexible_expression_list: `flexible_expression` ("," `flexible_expression`)* [","] + starred_expression_list: `starred_expression` ("," `starred_expression`)* [","] expression_list: `expression` ("," `expression`)* [","] - starred_list: `starred_item` ("," `starred_item`)* [","] - starred_expression: `expression` | (`starred_item` ",")* [`starred_item`] - starred_item: `assignment_expression` | "*" `or_expr` + yield_list: `expression_list` | `starred_expression` "," [`starred_expression_list`] .. index:: pair: object; tuple @@ -1873,10 +1939,14 @@ the unpacking. .. versionadded:: 3.5 Iterable unpacking in expression lists, originally proposed by :pep:`448`. +.. versionadded:: 3.11 + Any item in an expression list may be starred. See :pep:`646`. + .. index:: pair: trailing; comma -The trailing comma is required only to create a single tuple (a.k.a. a -*singleton*); it is optional in all other cases. A single expression without a +A trailing comma is required only to create a one-item tuple, +such as ``1,``; it is optional in all other cases. +A single expression without a trailing comma doesn't create a tuple, but rather yields the value of that expression. (To create an empty tuple, use an empty pair of parentheses: ``()``.) diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index bc1db7b0..b9cca444 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -1,3 +1,5 @@ +.. _full-grammar-specification: + Full Grammar specification ========================== diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 0f416a5c..ac363e8c 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -281,7 +281,7 @@ When the named module is not found in :data:`sys.modules`, Python next searches :data:`sys.meta_path`, which contains a list of meta path finder objects. These finders are queried in order to see if they know how to handle the named module. Meta path finders must implement a method called -:meth:`~importlib.abc.MetaPathFinder.find_spec()` which takes three arguments: +:meth:`~importlib.abc.MetaPathFinder.find_spec` which takes three arguments: a name, an import path, and (optionally) a target module. The meta path finder can use any strategy it wants to determine whether it can handle the named module or not. @@ -292,7 +292,7 @@ spec object. If it cannot handle the named module, it returns ``None``. If a spec, then a :exc:`ModuleNotFoundError` is raised. Any other exceptions raised are simply propagated up, aborting the import process. -The :meth:`~importlib.abc.MetaPathFinder.find_spec()` method of meta path +The :meth:`~importlib.abc.MetaPathFinder.find_spec` method of meta path finders is called with two or three arguments. The first is the fully qualified name of the module being imported, for example ``foo.bar.baz``. The second argument is the path entries to use for the module search. For @@ -327,14 +327,15 @@ modules, and one that knows how to import modules from an :term:`import path` finders replaced :meth:`!find_module`, which is now deprecated. While it will continue to work without change, the import machinery will try it only if the finder does not implement - ``find_spec()``. + :meth:`~importlib.abc.MetaPathFinder.find_spec`. .. versionchanged:: 3.10 Use of :meth:`!find_module` by the import system now raises :exc:`ImportWarning`. .. versionchanged:: 3.12 - ``find_module()`` has been removed. Use :meth:`find_spec` instead. + :meth:`!find_module` has been removed. + Use :meth:`~importlib.abc.MetaPathFinder.find_spec` instead. Loading @@ -375,32 +376,32 @@ of what happens during the loading portion of import:: Note the following details: - * If there is an existing module object with the given name in - :data:`sys.modules`, import will have already returned it. +* If there is an existing module object with the given name in + :data:`sys.modules`, import will have already returned it. - * The module will exist in :data:`sys.modules` before the loader - executes the module code. This is crucial because the module code may - (directly or indirectly) import itself; adding it to :data:`sys.modules` - beforehand prevents unbounded recursion in the worst case and multiple - loading in the best. +* The module will exist in :data:`sys.modules` before the loader + executes the module code. This is crucial because the module code may + (directly or indirectly) import itself; adding it to :data:`sys.modules` + beforehand prevents unbounded recursion in the worst case and multiple + loading in the best. - * If loading fails, the failing module -- and only the failing module -- - gets removed from :data:`sys.modules`. Any module already in the - :data:`sys.modules` cache, and any module that was successfully loaded - as a side-effect, must remain in the cache. This contrasts with - reloading where even the failing module is left in :data:`sys.modules`. +* If loading fails, the failing module -- and only the failing module -- + gets removed from :data:`sys.modules`. Any module already in the + :data:`sys.modules` cache, and any module that was successfully loaded + as a side-effect, must remain in the cache. This contrasts with + reloading where even the failing module is left in :data:`sys.modules`. - * After the module is created but before execution, the import machinery - sets the import-related module attributes ("_init_module_attrs" in - the pseudo-code example above), as summarized in a - :ref:`later section `. +* After the module is created but before execution, the import machinery + sets the import-related module attributes ("_init_module_attrs" in + the pseudo-code example above), as summarized in a + :ref:`later section `. - * Module execution is the key moment of loading in which the module's - namespace gets populated. Execution is entirely delegated to the - loader, which gets to decide what gets populated and how. +* Module execution is the key moment of loading in which the module's + namespace gets populated. Execution is entirely delegated to the + loader, which gets to decide what gets populated and how. - * The module created during loading and passed to exec_module() may - not be the one returned at the end of import [#fnlo]_. +* The module created during loading and passed to exec_module() may + not be the one returned at the end of import [#fnlo]_. .. versionchanged:: 3.4 The import system has taken over the boilerplate responsibilities of @@ -417,13 +418,13 @@ returned from :meth:`~importlib.abc.Loader.exec_module` is ignored. Loaders must satisfy the following requirements: - * If the module is a Python module (as opposed to a built-in module or a - dynamically loaded extension), the loader should execute the module's code - in the module's global name space (``module.__dict__``). +* If the module is a Python module (as opposed to a built-in module or a + dynamically loaded extension), the loader should execute the module's code + in the module's global name space (``module.__dict__``). - * If the loader cannot execute the module, it should raise an - :exc:`ImportError`, although any other exception raised during - :meth:`~importlib.abc.Loader.exec_module` will be propagated. +* If the loader cannot execute the module, it should raise an + :exc:`ImportError`, although any other exception raised during + :meth:`~importlib.abc.Loader.exec_module` will be propagated. In many cases, the finder and loader can be the same object; in such cases the :meth:`~importlib.abc.MetaPathFinder.find_spec` method would just return a @@ -453,20 +454,20 @@ import machinery will create the new module itself. functionality described above in addition to executing the module. All the same constraints apply, with some additional clarification: - * If there is an existing module object with the given name in - :data:`sys.modules`, the loader must use that existing module. - (Otherwise, :func:`importlib.reload` will not work correctly.) If the - named module does not exist in :data:`sys.modules`, the loader - must create a new module object and add it to :data:`sys.modules`. + * If there is an existing module object with the given name in + :data:`sys.modules`, the loader must use that existing module. + (Otherwise, :func:`importlib.reload` will not work correctly.) If the + named module does not exist in :data:`sys.modules`, the loader + must create a new module object and add it to :data:`sys.modules`. - * The module *must* exist in :data:`sys.modules` before the loader - executes the module code, to prevent unbounded recursion or multiple - loading. + * The module *must* exist in :data:`sys.modules` before the loader + executes the module code, to prevent unbounded recursion or multiple + loading. - * If loading fails, the loader must remove any modules it has inserted - into :data:`sys.modules`, but it must remove **only** the failing - module(s), and only if the loader itself has loaded the module(s) - explicitly. + * If loading fails, the loader must remove any modules it has inserted + into :data:`sys.modules`, but it must remove **only** the failing + module(s), and only if the loader itself has loaded the module(s) + explicitly. .. versionchanged:: 3.5 A :exc:`DeprecationWarning` is raised when ``exec_module()`` is defined but @@ -512,8 +513,10 @@ holding is that if you have ``sys.modules['spam']`` and ``sys.modules['spam.foo']`` (as you would after the above import), the latter must appear as the ``foo`` attribute of the former. -Module spec ------------ +.. _module-specs: + +Module specs +------------ The import machinery uses a variety of information about each module during import, especially before loading. Most of the information is @@ -526,155 +529,44 @@ and the loader that executes it. Most importantly, it allows the import machinery to perform the boilerplate operations of loading, whereas without a module spec the loader had that responsibility. -The module's spec is exposed as the ``__spec__`` attribute on a module object. +The module's spec is exposed as :attr:`module.__spec__`. Setting +:attr:`!__spec__` appropriately applies equally to +:ref:`modules initialized during interpreter startup `. +The one exception is ``__main__``, where :attr:`!__spec__` is +:ref:`set to None in some cases `. + See :class:`~importlib.machinery.ModuleSpec` for details on the contents of the module spec. .. versionadded:: 3.4 -.. _import-mod-attrs: - -Import-related module attributes --------------------------------- - -The import machinery fills in these attributes on each module object -during loading, based on the module's spec, before the loader executes -the module. - -It is **strongly** recommended that you rely on :attr:`__spec__` and -its attributes instead of any of the other individual attributes -listed below. - -.. attribute:: __name__ - - The ``__name__`` attribute must be set to the fully qualified name of - the module. This name is used to uniquely identify the module in - the import system. - -.. attribute:: __loader__ - - The ``__loader__`` attribute must be set to the loader object that - the import machinery used when loading the module. This is mostly - for introspection, but can be used for additional loader-specific - functionality, for example getting data associated with a loader. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead instead of this attribute. - - .. versionchanged:: 3.12 - The value of ``__loader__`` is expected to be the same as - ``__spec__.loader``. The use of ``__loader__`` is deprecated and slated - for removal in Python 3.14. - -.. attribute:: __package__ - - The module's ``__package__`` attribute may be set. Its value must - be a string, but it can be the same value as its ``__name__``. When - the module is a package, its ``__package__`` value should be set to - its ``__name__``. When the module is not a package, ``__package__`` - should be set to the empty string for top-level modules, or for - submodules, to the parent package's name. See :pep:`366` for further - details. - - This attribute is used instead of ``__name__`` to calculate explicit - relative imports for main modules, as defined in :pep:`366`. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead instead of this attribute. - - .. versionchanged:: 3.6 - The value of ``__package__`` is expected to be the same as - ``__spec__.parent``. - - .. versionchanged:: 3.10 - :exc:`ImportWarning` is raised if import falls back to - ``__package__`` instead of - :attr:`~importlib.machinery.ModuleSpec.parent`. - - .. versionchanged:: 3.12 - Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` - when falling back to ``__package__``. - - -.. attribute:: __spec__ - - The ``__spec__`` attribute must be set to the module spec that was - used when importing the module. Setting ``__spec__`` - appropriately applies equally to :ref:`modules initialized during - interpreter startup `. The one exception is ``__main__``, - where ``__spec__`` is :ref:`set to None in some cases `. - - When ``__spec__.parent`` is not set, ``__package__`` is used as - a fallback. - - .. versionadded:: 3.4 - - .. versionchanged:: 3.6 - ``__spec__.parent`` is used as a fallback when ``__package__`` is - not defined. - -.. attribute:: __path__ - - If the module is a package (either regular or namespace), the module - object's ``__path__`` attribute must be set. The value must be - iterable, but may be empty if ``__path__`` has no further significance. - If ``__path__`` is not empty, it must produce strings when iterated - over. More details on the semantics of ``__path__`` are given - :ref:`below `. - - Non-package modules should not have a ``__path__`` attribute. - -.. attribute:: __file__ -.. attribute:: __cached__ - - ``__file__`` is optional (if set, value must be a string). It indicates - the pathname of the file from which the module was loaded (if - loaded from a file), or the pathname of the shared library file - for extension modules loaded dynamically from a shared library. - It might be missing for certain types of modules, such as C - modules that are statically linked into the interpreter, and the - import system may opt to leave it unset if it has no semantic - meaning (e.g. a module loaded from a database). - - If ``__file__`` is set then the ``__cached__`` attribute might also - be set, which is the path to any compiled version of - the code (e.g. byte-compiled file). The file does not need to exist - to set this attribute; the path can simply point to where the - compiled file would exist (see :pep:`3147`). - - Note that ``__cached__`` may be set even if ``__file__`` is not - set. However, that scenario is quite atypical. Ultimately, the - loader is what makes use of the module spec provided by the finder - (from which ``__file__`` and ``__cached__`` are derived). So - if a loader can load from a cached module but otherwise does not load - from a file, that atypical scenario may be appropriate. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead instead of ``__cached__``. - .. _package-path-rules: -module.__path__ ---------------- +__path__ attributes on modules +------------------------------ -By definition, if a module has a ``__path__`` attribute, it is a package. +The :attr:`~module.__path__` attribute should be a (possibly empty) +:term:`sequence` of strings enumerating the locations where the package's +submodules will be found. By definition, if a module has a :attr:`!__path__` +attribute, it is a :term:`package`. -A package's ``__path__`` attribute is used during imports of its subpackages. +A package's :attr:`~module.__path__` attribute is used during imports of its +subpackages. Within the import machinery, it functions much the same as :data:`sys.path`, i.e. providing a list of locations to search for modules during import. -However, ``__path__`` is typically much more constrained than -:data:`sys.path`. +However, :attr:`!__path__` is typically much more constrained than +:data:`!sys.path`. -``__path__`` must be an iterable of strings, but it may be empty. The same rules used for :data:`sys.path` also apply to a package's -``__path__``, and :data:`sys.path_hooks` (described below) are -consulted when traversing a package's ``__path__``. +:attr:`!__path__`. :data:`sys.path_hooks` (described below) are +consulted when traversing a package's :attr:`!__path__`. -A package's ``__init__.py`` file may set or alter the package's ``__path__`` +A package's ``__init__.py`` file may set or alter the package's +:attr:`~module.__path__` attribute, and this was typically the way namespace packages were implemented prior to :pep:`420`. With the adoption of :pep:`420`, namespace packages no -longer need to supply ``__init__.py`` files containing only ``__path__`` -manipulation code; the import machinery automatically sets ``__path__`` +longer need to supply ``__init__.py`` files containing only :attr:`!__path__` +manipulation code; the import machinery automatically sets :attr:`!__path__` correctly for the namespace package. Module reprs @@ -693,17 +585,17 @@ with defaults for whatever information is missing. Here are the exact rules used: - * If the module has a ``__spec__`` attribute, the information in the spec - is used to generate the repr. The "name", "loader", "origin", and - "has_location" attributes are consulted. +* If the module has a ``__spec__`` attribute, the information in the spec + is used to generate the repr. The "name", "loader", "origin", and + "has_location" attributes are consulted. - * If the module has a ``__file__`` attribute, this is used as part of the - module's repr. +* If the module has a ``__file__`` attribute, this is used as part of the + module's repr. - * If the module has no ``__file__`` but does have a ``__loader__`` that is not - ``None``, then the loader's repr is used as part of the module's repr. +* If the module has no ``__file__`` but does have a ``__loader__`` that is not + ``None``, then the loader's repr is used as part of the module's repr. - * Otherwise, just use the module's ``__name__`` in the repr. +* Otherwise, just use the module's ``__name__`` in the repr. .. versionchanged:: 3.12 Use of :meth:`!module_repr`, having been deprecated since Python 3.4, was @@ -812,7 +704,7 @@ attributes on package objects are also used. These provide additional ways that the import machinery can be customized. :data:`sys.path` contains a list of strings providing search locations for -modules and packages. It is initialized from the :data:`PYTHONPATH` +modules and packages. It is initialized from the :envvar:`PYTHONPATH` environment variable and various other installation- and implementation-specific defaults. Entries in :data:`sys.path` can name directories on the file system, zip files, and potentially other "locations" diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index 81f0a5c5..b7b70e6b 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -74,7 +74,7 @@ PyPy and a Just in Time compiler. One of the goals of the project is to encourage experimentation with the language itself by making it easier to modify the interpreter (since it is written in Python). Additional information is - available on `the PyPy project's home page `_. + available on `the PyPy project's home page `_. Each of these implementations varies in some way from the language as documented in this manual, or introduces specific information beyond what's covered in the @@ -90,7 +90,8 @@ Notation .. index:: BNF, grammar, syntax, notation -The descriptions of lexical analysis and syntax use a modified BNF grammar +The descriptions of lexical analysis and syntax use a modified +`Backus–Naur form (BNF) `_ grammar notation. This uses the following style of definition: .. productionlist:: notation diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 816de9b5..bffef9db 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -96,10 +96,9 @@ which is recognized also by GNU Emacs, and :: which is recognized by Bram Moolenaar's VIM. -If no encoding declaration is found, the default encoding is UTF-8. In -addition, if the first bytes of the file are the UTF-8 byte-order mark -(``b'\xef\xbb\xbf'``), the declared file encoding is UTF-8 (this is supported, -among others, by Microsoft's :program:`notepad`). +If no encoding declaration is found, the default encoding is UTF-8. If the +implicit or explicit encoding of a file is UTF-8, an initial UTF-8 byte-order +mark (b'\xef\xbb\xbf') is ignored rather than being a syntax error. If an encoding is declared, the encoding name must be recognized by Python (see :ref:`standard-encodings`). The @@ -285,11 +284,10 @@ UAX-31, with elaboration and changes as defined below; see also :pep:`3131` for further details. Within the ASCII range (U+0001..U+007F), the valid characters for identifiers -are the same as in Python 2.x: the uppercase and lowercase letters ``A`` through +include the uppercase and lowercase letters ``A`` through ``Z``, the underscore ``_`` and, except for the first character, the digits ``0`` through ``9``. - -Python 3.0 introduces additional characters from outside the ASCII range (see +Python 3.0 introduced additional characters from outside the ASCII range (see :pep:`3131`). For these characters, the classification uses the version of the Unicode Character Database as included in the :mod:`unicodedata` module. @@ -315,7 +313,7 @@ The Unicode category codes mentioned above stand for: * *Nd* - decimal numbers * *Pc* - connector punctuations * *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards + `_ to support backwards compatibility * *Other_ID_Continue* - likewise @@ -323,8 +321,8 @@ All identifiers are converted into the normal form NFKC while parsing; compariso of identifiers is based on NFKC. A non-normative HTML file listing all valid identifier characters for Unicode -15.0.0 can be found at -https://www.unicode.org/Public/15.0.0/ucd/DerivedCoreProperties.txt +15.1.0 can be found at +https://www.unicode.org/Public/15.1.0/ucd/DerivedCoreProperties.txt .. _keywords: @@ -504,17 +502,15 @@ must be expressed with escapes. single: r"; raw string literal Both string and bytes literals may optionally be prefixed with a letter ``'r'`` -or ``'R'``; such strings are called :dfn:`raw strings` and treat backslashes as -literal characters. As a result, in string literals, ``'\U'`` and ``'\u'`` -escapes in raw strings are not treated specially. Given that Python 2.x's raw -unicode literals behave differently than Python 3.x's the ``'ur'`` syntax -is not supported. +or ``'R'``; such constructs are called :dfn:`raw string literals` +and :dfn:`raw bytes literals` respectively and treat backslashes as +literal characters. As a result, in raw string literals, ``'\U'`` and ``'\u'`` +escapes are not treated specially. .. versionadded:: 3.3 The ``'rb'`` prefix of raw bytes literals has been added as a synonym of ``'br'``. -.. versionadded:: 3.3 Support for the unicode legacy literal (``u'value'``) was reintroduced to simplify the maintenance of dual Python 2.x and 3.x codebases. See :pep:`414` for more information. @@ -657,12 +653,12 @@ is more easily recognized as broken.) It is also important to note that the escape sequences only recognized in string literals fall into the category of unrecognized escapes for bytes literals. - .. versionchanged:: 3.6 - Unrecognized escape sequences produce a :exc:`DeprecationWarning`. +.. versionchanged:: 3.6 + Unrecognized escape sequences produce a :exc:`DeprecationWarning`. - .. versionchanged:: 3.12 - Unrecognized escape sequences produce a :exc:`SyntaxWarning`. In a future - Python version they will be eventually a :exc:`SyntaxError`. +.. versionchanged:: 3.12 + Unrecognized escape sequences produce a :exc:`SyntaxWarning`. In a future + Python version they will be eventually a :exc:`SyntaxError`. Even in a raw literal, quotes can be escaped with a backslash, but the backslash remains in the result; for example, ``r"\""`` is a valid string @@ -708,10 +704,12 @@ and formatted string literals may be concatenated with plain string literals. single: ! (exclamation); in formatted string literal single: : (colon); in formatted string literal single: = (equals); for help in debugging using string literals + .. _f-strings: +.. _formatted-string-literals: -Formatted string literals -------------------------- +f-strings +--------- .. versionadded:: 3.6 @@ -732,7 +730,7 @@ for the contents of the string is: : ("," `conditional_expression` | "," "*" `or_expr`)* [","] : | `yield_expression` conversion: "s" | "r" | "a" - format_spec: (`literal_char` | NULL | `replacement_field`)* + format_spec: (`literal_char` | `replacement_field`)* literal_char: The parts of the string outside curly braces are treated literally, @@ -879,10 +877,10 @@ Numeric literals ---------------- .. index:: number, numeric literal, integer literal - floating point literal, hexadecimal literal + floating-point literal, hexadecimal literal octal literal, binary literal, decimal literal, imaginary literal, complex literal -There are three types of numeric literals: integers, floating point numbers, and +There are three types of numeric literals: integers, floating-point numbers, and imaginary numbers. There are no complex literals (complex numbers can be formed by adding a real number and an imaginary number). @@ -943,10 +941,10 @@ Some examples of integer literals:: single: _ (underscore); in numeric literal .. _floating: -Floating point literals +Floating-point literals ----------------------- -Floating point literals are described by the following lexical definitions: +Floating-point literals are described by the following lexical definitions: .. productionlist:: python-grammar floatnumber: `pointfloat` | `exponentfloat` @@ -958,10 +956,10 @@ Floating point literals are described by the following lexical definitions: Note that the integer and exponent parts are always interpreted using radix 10. For example, ``077e010`` is legal, and denotes the same number as ``77e10``. The -allowed range of floating point literals is implementation-dependent. As in +allowed range of floating-point literals is implementation-dependent. As in integer literals, underscores are supported for digit grouping. -Some examples of floating point literals:: +Some examples of floating-point literals:: 3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93 @@ -982,9 +980,9 @@ Imaginary literals are described by the following lexical definitions: imagnumber: (`floatnumber` | `digitpart`) ("j" | "J") An imaginary literal yields a complex number with a real part of 0.0. Complex -numbers are represented as a pair of floating point numbers and have the same +numbers are represented as a pair of floating-point numbers and have the same restrictions on their range. To create a complex number with a nonzero real -part, add a floating point number to it, e.g., ``(3+4j)``. Some examples of +part, add a floating-point number to it, e.g., ``(3+4j)``. Some examples of imaginary literals:: 3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j @@ -1019,9 +1017,9 @@ The following tokens serve as delimiters in the grammar: .. code-block:: none ( ) [ ] { } - , : . ; @ = -> - += -= *= /= //= %= @= - &= |= ^= >>= <<= **= + , : ! . ; @ = + -> += -= *= /= //= %= + @= &= |= ^= >>= <<= **= The period can also occur in floating-point and imaginary literals. A sequence of three periods has a special meaning as an ellipsis literal. The second half @@ -1045,4 +1043,4 @@ occurrence outside string literals and comments is an unconditional error: .. rubric:: Footnotes -.. [#] https://www.unicode.org/Public/15.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/15.1.0/ucd/NameAliases.txt diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index a9e65be1..5e3ede69 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -214,7 +214,7 @@ Assignment of an object to a single target is recursively defined as follows. object. This can either replace an existing key/value pair with the same key value, or insert a new key/value pair (if no key with the same value existed). - For user-defined objects, the :meth:`__setitem__` method is called with + For user-defined objects, the :meth:`~object.__setitem__` method is called with appropriate arguments. .. index:: pair: slicing; assignment @@ -293,7 +293,7 @@ statements, cannot be an unpacking) and the expression list, performs the binary operation specific to the type of assignment on the two operands, and assigns the result to the original target. The target is only evaluated once. -An augmented assignment expression like ``x += 1`` can be rewritten as ``x = x + +An augmented assignment statement like ``x += 1`` can be rewritten as ``x = x + 1`` to achieve a similar, but not exactly equal effect. In the augmented version, ``x`` is only evaluated once. Also, when possible, the actual operation is performed *in-place*, meaning that rather than creating a new object and @@ -333,7 +333,9 @@ statement, of a variable or attribute annotation and an optional assignment stat The difference from normal :ref:`assignment` is that only a single target is allowed. -For simple names as assignment targets, if in class or module scope, +The assignment target is considered "simple" if it consists of a single +name that is not enclosed in parentheses. +For simple assignment targets, if in class or module scope, the annotations are evaluated and stored in a special class or module attribute :attr:`__annotations__` that is a dictionary mapping from variable names (mangled if private) to @@ -341,7 +343,8 @@ evaluated annotations. This attribute is writable and is automatically created at the start of class or module body execution, if annotations are found statically. -For expressions as assignment targets, the annotations are evaluated if +If the assignment target is not simple (an attribute, subscript node, or +parenthesized name), the annotation is evaluated if in class or module scope, but not stored. If a name is annotated in a function scope, then this name is local for @@ -351,7 +354,7 @@ If the right hand side is present, an annotated assignment performs the actual assignment before evaluating annotations (where applicable). If the right hand side is not present for an expression target, then the interpreter evaluates the target except for the last -:meth:`__setitem__` or :meth:`__setattr__` call. +:meth:`~object.__setitem__` or :meth:`~object.__setattr__` call. .. seealso:: @@ -403,9 +406,9 @@ The extended form, ``assert expression1, expression2``, is equivalent to :: These equivalences assume that :const:`__debug__` and :exc:`AssertionError` refer to the built-in variables with those names. In the current implementation, the -built-in variable :const:`__debug__` is ``True`` under normal circumstances, +built-in variable ``__debug__`` is ``True`` under normal circumstances, ``False`` when optimization is requested (command line option :option:`-O`). The current -code generator emits no code for an assert statement when optimization is +code generator emits no code for an :keyword:`assert` statement when optimization is requested at compile time. Note that it is unnecessary to include the source code for the expression that failed in the error message; it will be displayed as part of the stack trace. @@ -528,8 +531,8 @@ The :keyword:`!yield` statement yield_stmt: `yield_expression` A :keyword:`yield` statement is semantically equivalent to a :ref:`yield -expression `. The yield statement can be used to omit the parentheses -that would otherwise be required in the equivalent yield expression +expression `. The ``yield`` statement can be used to omit the +parentheses that would otherwise be required in the equivalent yield expression statement. For example, the yield statements :: yield @@ -541,7 +544,7 @@ are equivalent to the yield expression statements :: (yield from ) Yield expressions and statements are only used when defining a :term:`generator` -function, and are only used in the body of the generator function. Using yield +function, and are only used in the body of the generator function. Using :keyword:`yield` in a function definition is sufficient to cause that definition to create a generator function instead of a normal function. @@ -578,7 +581,7 @@ The :dfn:`type` of the exception is the exception instance's class, the .. index:: pair: object; traceback A traceback object is normally created automatically when an exception is raised -and attached to it as the :attr:`__traceback__` attribute, which is writable. +and attached to it as the :attr:`~BaseException.__traceback__` attribute. You can create an exception and set your own traceback in one step using the :meth:`~BaseException.with_traceback` exception method (which returns the same exception instance, with its traceback set to its argument), like so:: @@ -592,11 +595,13 @@ same exception instance, with its traceback set to its argument), like so:: The ``from`` clause is used for exception chaining: if given, the second *expression* must be another exception class or instance. If the second expression is an exception instance, it will be attached to the raised -exception as the :attr:`__cause__` attribute (which is writable). If the +exception as the :attr:`~BaseException.__cause__` attribute (which is writable). If the expression is an exception class, the class will be instantiated and the resulting exception instance will be attached to the raised exception as the -:attr:`__cause__` attribute. If the raised exception is not handled, both -exceptions will be printed:: +:attr:`!__cause__` attribute. If the raised exception is not handled, both +exceptions will be printed: + +.. code-block:: pycon >>> try: ... print(1 / 0) @@ -605,19 +610,24 @@ exceptions will be printed:: ... Traceback (most recent call last): File "", line 2, in + print(1 / 0) + ~~^~~ ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "", line 4, in + raise RuntimeError("Something bad happened") from exc RuntimeError: Something bad happened A similar mechanism works implicitly if a new exception is raised when an exception is already being handled. An exception may be handled when an :keyword:`except` or :keyword:`finally` clause, or a :keyword:`with` statement, is used. The previous exception is then -attached as the new exception's :attr:`__context__` attribute:: +attached as the new exception's :attr:`~BaseException.__context__` attribute: + +.. code-block:: pycon >>> try: ... print(1 / 0) @@ -626,16 +636,21 @@ attached as the new exception's :attr:`__context__` attribute:: ... Traceback (most recent call last): File "", line 2, in + print(1 / 0) + ~~^~~ ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 4, in + raise RuntimeError("Something bad happened") RuntimeError: Something bad happened Exception chaining can be explicitly suppressed by specifying :const:`None` in -the ``from`` clause:: +the ``from`` clause: + +.. doctest:: >>> try: ... print(1 / 0) @@ -652,9 +667,8 @@ and information about handling exceptions is in section :ref:`try`. .. versionchanged:: 3.3 :const:`None` is now permitted as ``Y`` in ``raise X from Y``. -.. versionadded:: 3.3 - The ``__suppress_context__`` attribute to suppress automatic display of the - exception context. + Added the :attr:`~BaseException.__suppress_context__` attribute to suppress + automatic display of the exception context. .. versionchanged:: 3.11 If the traceback of the active exception is modified in an :keyword:`except` @@ -920,7 +934,7 @@ That is not a future statement; it's an ordinary import statement with no special semantics or syntax restrictions. Code compiled by calls to the built-in functions :func:`exec` and :func:`compile` -that occur in a module :mod:`M` containing a future statement will, by default, +that occur in a module :mod:`!M` containing a future statement will, by default, use the new syntax or semantics associated with the future statement. This can be controlled by optional arguments to :func:`compile` --- see the documentation of that function for details. @@ -950,25 +964,14 @@ The :keyword:`!global` statement .. productionlist:: python-grammar global_stmt: "global" `identifier` ("," `identifier`)* -The :keyword:`global` statement is a declaration which holds for the entire -current code block. It means that the listed identifiers are to be interpreted -as globals. It would be impossible to assign to a global variable without +The :keyword:`global` statement causes the listed identifiers to be interpreted +as globals. It would be impossible to assign to a global variable without :keyword:`!global`, although free variables may refer to globals without being declared global. -Names listed in a :keyword:`global` statement must not be used in the same code -block textually preceding that :keyword:`!global` statement. - -Names listed in a :keyword:`global` statement must not be defined as formal -parameters, or as targets in :keyword:`with` statements or :keyword:`except` clauses, or in a :keyword:`for` target list, :keyword:`class` -definition, function definition, :keyword:`import` statement, or variable -annotation. - -.. impl-detail:: - - The current implementation does not enforce some of these restrictions, but - programs should not abuse this freedom, as future implementations may enforce - them or silently change the meaning of the program. +The :keyword:`global` statement applies to the entire scope of a function or +class body. A :exc:`SyntaxError` is raised if a variable is used or +assigned to prior to its global declaration in the scope. .. index:: pair: built-in function; exec @@ -995,25 +998,29 @@ The :keyword:`!nonlocal` statement .. productionlist:: python-grammar nonlocal_stmt: "nonlocal" `identifier` ("," `identifier`)* -The :keyword:`nonlocal` statement causes the listed identifiers to refer to -previously bound variables in the nearest enclosing scope excluding globals. -This is important because the default behavior for binding is to search the -local namespace first. The statement allows encapsulated code to rebind -variables outside of the local scope besides the global (module) scope. - -Names listed in a :keyword:`nonlocal` statement, unlike those listed in a -:keyword:`global` statement, must refer to pre-existing bindings in an -enclosing scope (the scope in which a new binding should be created cannot -be determined unambiguously). +When the definition of a function or class is nested (enclosed) within +the definitions of other functions, its nonlocal scopes are the local +scopes of the enclosing functions. The :keyword:`nonlocal` statement +causes the listed identifiers to refer to names previously bound in +nonlocal scopes. It allows encapsulated code to rebind such nonlocal +identifiers. If a name is bound in more than one nonlocal scope, the +nearest binding is used. If a name is not bound in any nonlocal scope, +or if there is no nonlocal scope, a :exc:`SyntaxError` is raised. -Names listed in a :keyword:`nonlocal` statement must not collide with -pre-existing bindings in the local scope. +The :keyword:`nonlocal` statement applies to the entire scope of a function or +class body. A :exc:`SyntaxError` is raised if a variable is used or +assigned to prior to its nonlocal declaration in the scope. .. seealso:: :pep:`3104` - Access to Names in Outer Scopes The specification for the :keyword:`nonlocal` statement. +**Programmer's note:** :keyword:`nonlocal` is a directive to the parser +and applies only to code parsed along with it. See the note for the +:keyword:`global` statement. + + .. _type: The :keyword:`!type` statement diff --git a/Doc/requirements-oldest-sphinx.txt b/Doc/requirements-oldest-sphinx.txt index d3ef5bc1..3483faea 100644 --- a/Doc/requirements-oldest-sphinx.txt +++ b/Doc/requirements-oldest-sphinx.txt @@ -7,30 +7,29 @@ blurb python-docs-theme>=2022.1 # Generated from: -# pip install "Sphinx~=4.2.0" +# pip install "Sphinx~=7.2.6" # pip freeze # -# Sphinx 4.2 comes from ``needs_sphinx = '4.2'`` in ``Doc/conf.py``. +# Sphinx 7.2.6 comes from ``needs_sphinx = '7.2.6'`` in ``Doc/conf.py``. -alabaster==0.7.13 -Babel==2.12.1 -certifi==2023.7.22 -charset-normalizer==3.2.0 -colorama==0.4.6 -docutils==0.16 -idna==3.4 +alabaster==0.7.16 +Babel==2.16.0 +certifi==2024.8.30 +charset-normalizer==3.4.0 +docutils==0.20.1 +idna==3.10 imagesize==1.4.1 -Jinja2==2.11.3 -MarkupSafe==1.1.1 -packaging==23.1 -Pygments==2.16.1 -requests==2.31.0 +Jinja2==3.1.4 +MarkupSafe==3.0.1 +packaging==24.1 +Pygments==2.18.0 +requests==2.32.3 snowballstemmer==2.2.0 -Sphinx==4.2.0 -sphinxcontrib-applehelp==1.0.4 -sphinxcontrib-devhelp==1.0.2 -sphinxcontrib-htmlhelp==2.0.1 +Sphinx==7.2.6 +sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.3 -sphinxcontrib-serializinghtml==1.1.5 -urllib3==2.0.4 +sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 +urllib3==2.2.3 diff --git a/Doc/requirements.txt b/Doc/requirements.txt index 4741265a..5105786c 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -6,11 +6,12 @@ # Sphinx version is pinned so that new versions that introduce new warnings # won't suddenly cause build failures. Updating the version is fine as long # as no warnings are raised by doing so. -sphinx==4.5.0 +sphinx~=8.1.0 blurb -sphinxext-opengraph==0.7.5 +sphinxext-opengraph~=0.9.0 +sphinx-notfound-page~=1.0.0 # The theme used by the documentation is stored separately, so we need # to install that as well. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 90a66ac8..41ca0bdb 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -2,154 +2,68 @@ # as tested on the CI via check-warnings.py in reusable-docs.yml. # Keep lines sorted lexicographically to help avoid merge conflicts. -Doc/c-api/arg.rst Doc/c-api/descriptor.rst -Doc/c-api/exceptions.rst -Doc/c-api/file.rst Doc/c-api/float.rst -Doc/c-api/gcsupport.rst Doc/c-api/init.rst Doc/c-api/init_config.rst Doc/c-api/intro.rst -Doc/c-api/memory.rst -Doc/c-api/memoryview.rst Doc/c-api/module.rst -Doc/c-api/object.rst -Doc/c-api/set.rst Doc/c-api/stable.rst -Doc/c-api/structures.rst -Doc/c-api/sys.rst Doc/c-api/type.rst Doc/c-api/typeobj.rst Doc/extending/extending.rst -Doc/extending/newtypes.rst Doc/glossary.rst -Doc/howto/descriptor.rst -Doc/howto/enum.rst -Doc/howto/isolating-extensions.rst -Doc/howto/logging.rst -Doc/howto/urllib2.rst -Doc/library/2to3.rst -Doc/library/__future__.rst -Doc/library/abc.rst -Doc/library/aifc.rst Doc/library/ast.rst -Doc/library/asyncio-dev.rst -Doc/library/asyncio-eventloop.rst Doc/library/asyncio-extending.rst Doc/library/asyncio-policy.rst -Doc/library/asyncio-stream.rst Doc/library/asyncio-subprocess.rst -Doc/library/asyncio-task.rst -Doc/library/audioop.rst -Doc/library/bdb.rst -Doc/library/bisect.rst -Doc/library/bz2.rst -Doc/library/calendar.rst -Doc/library/cgi.rst -Doc/library/chunk.rst -Doc/library/cmd.rst -Doc/library/codecs.rst -Doc/library/collections.abc.rst Doc/library/collections.rst -Doc/library/concurrent.futures.rst -Doc/library/configparser.rst -Doc/library/contextlib.rst -Doc/library/copy.rst -Doc/library/csv.rst -Doc/library/datetime.rst Doc/library/dbm.rst Doc/library/decimal.rst -Doc/library/doctest.rst Doc/library/email.charset.rst Doc/library/email.compat32-message.rst Doc/library/email.errors.rst -Doc/library/email.headerregistry.rst -Doc/library/email.mime.rst Doc/library/email.parser.rst Doc/library/email.policy.rst -Doc/library/enum.rst Doc/library/exceptions.rst -Doc/library/faulthandler.rst -Doc/library/fcntl.rst -Doc/library/ftplib.rst -Doc/library/functions.rst Doc/library/functools.rst -Doc/library/getopt.rst -Doc/library/getpass.rst -Doc/library/gettext.rst -Doc/library/gzip.rst -Doc/library/http.client.rst Doc/library/http.cookiejar.rst -Doc/library/http.cookies.rst Doc/library/http.server.rst -Doc/library/importlib.resources.rst Doc/library/importlib.rst -Doc/library/inspect.rst -Doc/library/locale.rst Doc/library/logging.config.rst Doc/library/logging.handlers.rst Doc/library/lzma.rst -Doc/library/mailbox.rst Doc/library/mmap.rst -Doc/library/msilib.rst Doc/library/multiprocessing.rst -Doc/library/multiprocessing.shared_memory.rst -Doc/library/nntplib.rst -Doc/library/numbers.rst Doc/library/optparse.rst -Doc/library/os.path.rst Doc/library/os.rst -Doc/library/ossaudiodev.rst -Doc/library/pickle.rst Doc/library/pickletools.rst Doc/library/platform.rst Doc/library/plistlib.rst Doc/library/profile.rst -Doc/library/pyclbr.rst -Doc/library/pydoc.rst Doc/library/pyexpat.rst -Doc/library/random.rst Doc/library/readline.rst -Doc/library/reprlib.rst Doc/library/resource.rst -Doc/library/rlcompleter.rst Doc/library/select.rst -Doc/library/selectors.rst -Doc/library/shelve.rst Doc/library/signal.rst Doc/library/smtplib.rst Doc/library/socket.rst -Doc/library/socketserver.rst Doc/library/ssl.rst Doc/library/stdtypes.rst -Doc/library/string.rst Doc/library/subprocess.rst -Doc/library/sunau.rst -Doc/library/syslog.rst -Doc/library/tarfile.rst -Doc/library/telnetlib.rst -Doc/library/tempfile.rst Doc/library/termios.rst Doc/library/test.rst -Doc/library/time.rst Doc/library/tkinter.rst Doc/library/tkinter.scrolledtext.rst -Doc/library/tkinter.tix.rst Doc/library/tkinter.ttk.rst -Doc/library/traceback.rst -Doc/library/tty.rst Doc/library/unittest.mock.rst Doc/library/unittest.rst Doc/library/urllib.parse.rst Doc/library/urllib.request.rst -Doc/library/webbrowser.rst Doc/library/wsgiref.rst -Doc/library/xdrlib.rst Doc/library/xml.dom.minidom.rst Doc/library/xml.dom.pulldom.rst Doc/library/xml.dom.rst -Doc/library/xml.rst Doc/library/xml.sax.handler.rst Doc/library/xml.sax.reader.rst Doc/library/xml.sax.rst @@ -158,24 +72,12 @@ Doc/library/xmlrpc.server.rst Doc/library/zlib.rst Doc/reference/compound_stmts.rst Doc/reference/datamodel.rst -Doc/reference/expressions.rst -Doc/reference/import.rst -Doc/reference/simple_stmts.rst -Doc/tutorial/datastructures.rst -Doc/tutorial/introduction.rst -Doc/using/cmdline.rst Doc/using/windows.rst -Doc/whatsnew/2.0.rst -Doc/whatsnew/2.1.rst -Doc/whatsnew/2.2.rst -Doc/whatsnew/2.3.rst Doc/whatsnew/2.4.rst Doc/whatsnew/2.5.rst Doc/whatsnew/2.6.rst Doc/whatsnew/2.7.rst Doc/whatsnew/3.0.rst -Doc/whatsnew/3.1.rst -Doc/whatsnew/3.2.rst Doc/whatsnew/3.3.rst Doc/whatsnew/3.4.rst Doc/whatsnew/3.5.rst diff --git a/Doc/tools/check-warnings.py b/Doc/tools/check-warnings.py index 809a8d63..d9c4a33b 100644 --- a/Doc/tools/check-warnings.py +++ b/Doc/tools/check-warnings.py @@ -2,6 +2,7 @@ """ Check the output of running Sphinx in nit-picky mode (missing references). """ + from __future__ import annotations import argparse @@ -13,6 +14,9 @@ import sys from pathlib import Path from typing import TextIO +# Fail if NEWS nit found before this line number +NEWS_NIT_THRESHOLD = 1400 + # Exclude these whether they're dirty or clean, # because they trigger a rebuild of dirty files. EXCLUDE_FILES = { @@ -203,7 +207,9 @@ def annotate_diff( def fail_if_regression( - warnings: list[str], files_with_expected_nits: set[str], files_with_nits: set[str] + warnings: list[str], + files_with_expected_nits: set[str], + files_with_nits: set[str], ) -> int: """ Ensure some files always pass Sphinx nit-picky mode (no missing references). @@ -245,6 +251,26 @@ def fail_if_improved( return 0 +def fail_if_new_news_nit(warnings: list[str], threshold: int) -> int: + """ + Ensure no warnings are found in the NEWS file before a given line number. + """ + news_nits = (warning for warning in warnings if "/build/NEWS:" in warning) + + # Nits found before the threshold line + new_news_nits = [ + nit for nit in news_nits if int(nit.split(":")[1]) <= threshold + ] + + if new_news_nits: + print("\nError: new NEWS nits:\n") + for warning in new_news_nits: + print(warning) + return -1 + + return 0 + + def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser() parser.add_argument( @@ -264,6 +290,14 @@ def main(argv: list[str] | None = None) -> int: action="store_true", help="Fail if new files with no nits are found", ) + parser.add_argument( + "--fail-if-new-news-nit", + metavar="threshold", + type=int, + nargs="?", + const=NEWS_NIT_THRESHOLD, + help="Fail if new NEWS nit found before threshold line number", + ) args = parser.parse_args(argv) if args.annotate_diff is not None and len(args.annotate_diff) > 2: @@ -274,7 +308,8 @@ def main(argv: list[str] | None = None) -> int: exit_code = 0 wrong_directory_msg = "Must run this script from the repo root" - assert Path("Doc").exists() and Path("Doc").is_dir(), wrong_directory_msg + if not Path("Doc").exists() or not Path("Doc").is_dir(): + raise RuntimeError(wrong_directory_msg) with Path("Doc/sphinx-warnings.txt").open(encoding="UTF-8") as f: warnings = f.read().splitlines() @@ -302,7 +337,12 @@ def main(argv: list[str] | None = None) -> int: ) if args.fail_if_improved: - exit_code += fail_if_improved(files_with_expected_nits, files_with_nits) + exit_code += fail_if_improved( + files_with_expected_nits, files_with_nits + ) + + if args.fail_if_new_news_nit: + exit_code += fail_if_new_news_nit(warnings, args.fail_if_new_news_nit) return exit_code diff --git a/Doc/tools/extensions/audit_events.py b/Doc/tools/extensions/audit_events.py new file mode 100644 index 00000000..23d82c0f --- /dev/null +++ b/Doc/tools/extensions/audit_events.py @@ -0,0 +1,264 @@ +"""Support for documenting audit events.""" + +from __future__ import annotations + +import re +from typing import TYPE_CHECKING + +from docutils import nodes +from sphinx.errors import NoUri +from sphinx.locale import _ as sphinx_gettext +from sphinx.transforms.post_transforms import SphinxPostTransform +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective + +if TYPE_CHECKING: + from collections.abc import Iterator + + from sphinx.application import Sphinx + from sphinx.builders import Builder + from sphinx.environment import BuildEnvironment + +logger = logging.getLogger(__name__) + +# This list of sets are allowable synonyms for event argument names. +# If two names are in the same set, they are treated as equal for the +# purposes of warning. This won't help if the number of arguments is +# different! +_SYNONYMS = [ + frozenset({"file", "path", "fd"}), +] + + +class AuditEvents: + def __init__(self) -> None: + self.events: dict[str, list[str]] = {} + self.sources: dict[str, list[tuple[str, str]]] = {} + + def __iter__(self) -> Iterator[tuple[str, list[str], tuple[str, str]]]: + for name, args in self.events.items(): + for source in self.sources[name]: + yield name, args, source + + def add_event( + self, name, args: list[str], source: tuple[str, str] + ) -> None: + if name in self.events: + self._check_args_match(name, args) + else: + self.events[name] = args + self.sources.setdefault(name, []).append(source) + + def _check_args_match(self, name: str, args: list[str]) -> None: + current_args = self.events[name] + msg = ( + f"Mismatched arguments for audit-event {name}: " + f"{current_args!r} != {args!r}" + ) + if current_args == args: + return + if len(current_args) != len(args): + logger.warning(msg) + return + for a1, a2 in zip(current_args, args, strict=False): + if a1 == a2: + continue + if any(a1 in s and a2 in s for s in _SYNONYMS): + continue + logger.warning(msg) + return + + def id_for(self, name) -> str: + source_count = len(self.sources.get(name, ())) + name_clean = re.sub(r"\W", "_", name) + return f"audit_event_{name_clean}_{source_count}" + + def rows(self) -> Iterator[tuple[str, list[str], list[tuple[str, str]]]]: + for name in sorted(self.events.keys()): + yield name, self.events[name], self.sources[name] + + +def initialise_audit_events(app: Sphinx) -> None: + """Initialise the audit_events attribute on the environment.""" + if not hasattr(app.env, "audit_events"): + app.env.audit_events = AuditEvents() + + +def audit_events_purge( + app: Sphinx, env: BuildEnvironment, docname: str +) -> None: + """This is to remove traces of removed documents from env.audit_events.""" + fresh_audit_events = AuditEvents() + for name, args, (doc, target) in env.audit_events: + if doc != docname: + fresh_audit_events.add_event(name, args, (doc, target)) + + +def audit_events_merge( + app: Sphinx, + env: BuildEnvironment, + docnames: list[str], + other: BuildEnvironment, +) -> None: + """In Sphinx parallel builds, this merges audit_events from subprocesses.""" + for name, args, source in other.audit_events: + env.audit_events.add_event(name, args, source) + + +class AuditEvent(SphinxDirective): + has_content = True + required_arguments = 1 + optional_arguments = 2 + final_argument_whitespace = True + + _label = [ + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with no arguments." + ), + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with argument {args}." + ), + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with arguments {args}." + ), + ] + + def run(self) -> list[nodes.paragraph]: + name = self.arguments[0] + if len(self.arguments) >= 2 and self.arguments[1]: + args = [ + arg + for argument in self.arguments[1].strip("'\"").split(",") + if (arg := argument.strip()) + ] + else: + args = [] + ids = [] + try: + target = self.arguments[2].strip("\"'") + except (IndexError, TypeError): + target = None + if not target: + target = self.env.audit_events.id_for(name) + ids.append(target) + self.env.audit_events.add_event(name, args, (self.env.docname, target)) + + node = nodes.paragraph("", classes=["audit-hook"], ids=ids) + self.set_source_info(node) + if self.content: + node.rawsource = '\n'.join(self.content) # for gettext + self.state.nested_parse(self.content, self.content_offset, node) + else: + num_args = min(2, len(args)) + text = self._label[num_args].format( + name=f"``{name}``", + args=", ".join(f"``{a}``" for a in args), + ) + node.rawsource = text # for gettext + parsed, messages = self.state.inline_text(text, self.lineno) + node += parsed + node += messages + return [node] + + +class audit_event_list(nodes.General, nodes.Element): # noqa: N801 + pass + + +class AuditEventListDirective(SphinxDirective): + def run(self) -> list[audit_event_list]: + return [audit_event_list()] + + +class AuditEventListTransform(SphinxPostTransform): + default_priority = 500 + + def run(self) -> None: + if self.document.next_node(audit_event_list) is None: + return + + table = self._make_table(self.app.builder, self.env.docname) + for node in self.document.findall(audit_event_list): + node.replace_self(table) + + def _make_table(self, builder: Builder, docname: str) -> nodes.table: + table = nodes.table(cols=3) + group = nodes.tgroup( + "", + nodes.colspec(colwidth=30), + nodes.colspec(colwidth=55), + nodes.colspec(colwidth=15), + cols=3, + ) + head = nodes.thead() + body = nodes.tbody() + + table += group + group += head + group += body + + head += nodes.row( + "", + nodes.entry("", nodes.paragraph("", "Audit event")), + nodes.entry("", nodes.paragraph("", "Arguments")), + nodes.entry("", nodes.paragraph("", "References")), + ) + + for name, args, sources in builder.env.audit_events.rows(): + body += self._make_row(builder, docname, name, args, sources) + + return table + + @staticmethod + def _make_row( + builder: Builder, + docname: str, + name: str, + args: list[str], + sources: list[tuple[str, str]], + ) -> nodes.row: + row = nodes.row() + name_node = nodes.paragraph("", nodes.Text(name)) + row += nodes.entry("", name_node) + + args_node = nodes.paragraph() + for arg in args: + args_node += nodes.literal(arg, arg) + args_node += nodes.Text(", ") + if len(args_node.children) > 0: + args_node.children.pop() # remove trailing comma + row += nodes.entry("", args_node) + + backlinks_node = nodes.paragraph() + backlinks = enumerate(sorted(set(sources)), start=1) + for i, (doc, label) in backlinks: + if isinstance(label, str): + ref = nodes.reference("", f"[{i}]", internal=True) + try: + target = ( + f"{builder.get_relative_uri(docname, doc)}#{label}" + ) + except NoUri: + continue + else: + ref["refuri"] = target + backlinks_node += ref + row += nodes.entry("", backlinks_node) + return row + + +def setup(app: Sphinx): + app.add_directive("audit-event", AuditEvent) + app.add_directive("audit-event-table", AuditEventListDirective) + app.add_post_transform(AuditEventListTransform) + app.connect("builder-inited", initialise_audit_events) + app.connect("env-purge-doc", audit_events_purge) + app.connect("env-merge-info", audit_events_merge) + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/availability.py b/Doc/tools/extensions/availability.py new file mode 100644 index 00000000..47833fdc --- /dev/null +++ b/Doc/tools/extensions/availability.py @@ -0,0 +1,125 @@ +"""Support for documenting platform availability""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from docutils import nodes +from sphinx import addnodes +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective + +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata + +logger = logging.getLogger("availability") + +# known platform, libc, and threading implementations +_PLATFORMS = frozenset({ + "AIX", + "Android", + "BSD", + "DragonFlyBSD", + "Emscripten", + "FreeBSD", + "GNU/kFreeBSD", + "iOS", + "Linux", + "macOS", + "NetBSD", + "OpenBSD", + "POSIX", + "Solaris", + "Unix", + "VxWorks", + "WASI", + "Windows", +}) +_LIBC = frozenset({ + "BSD libc", + "glibc", + "musl", +}) +_THREADING = frozenset({ + # POSIX platforms with pthreads + "pthreads", +}) +KNOWN_PLATFORMS = _PLATFORMS | _LIBC | _THREADING + + +class Availability(SphinxDirective): + has_content = True + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + + def run(self) -> list[nodes.container]: + title = "Availability" + refnode = addnodes.pending_xref( + title, + nodes.inline(title, title, classes=["xref", "std", "std-ref"]), + refdoc=self.env.docname, + refdomain="std", + refexplicit=True, + reftarget="availability", + reftype="ref", + refwarn=True, + ) + sep = nodes.Text(": ") + parsed, msgs = self.state.inline_text(self.arguments[0], self.lineno) + pnode = nodes.paragraph(title, "", refnode, sep, *parsed, *msgs) + self.set_source_info(pnode) + cnode = nodes.container("", pnode, classes=["availability"]) + self.set_source_info(cnode) + if self.content: + self.state.nested_parse(self.content, self.content_offset, cnode) + self.parse_platforms() + + return [cnode] + + def parse_platforms(self) -> dict[str, str | bool]: + """Parse platform information from arguments + + Arguments is a comma-separated string of platforms. A platform may + be prefixed with "not " to indicate that a feature is not available. + + Example:: + + .. availability:: Windows, Linux >= 4.2, not WASI + + Arguments like "Linux >= 3.17 with glibc >= 2.27" are currently not + parsed into separate tokens. + """ + platforms = {} + for arg in self.arguments[0].rstrip(".").split(","): + arg = arg.strip() + platform, _, version = arg.partition(" >= ") + if platform.startswith("not "): + version = False + platform = platform.removeprefix("not ") + elif not version: + version = True + platforms[platform] = version + + if unknown := set(platforms).difference(KNOWN_PLATFORMS): + logger.warning( + "Unknown platform%s or syntax '%s' in '.. availability:: %s', " + "see %s:KNOWN_PLATFORMS for a set of known platforms.", + "s" if len(platforms) != 1 else "", + " ".join(sorted(unknown)), + self.arguments[0], + __file__, + ) + + return platforms + + +def setup(app: Sphinx) -> ExtensionMetadata: + app.add_directive("availability", Availability) + + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index 3551bfa4..50065d34 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -1,234 +1,302 @@ -# -*- coding: utf-8 -*- -""" - c_annotations.py - ~~~~~~~~~~~~~~~~ - - Supports annotations for C API elements: +"""Support annotations for C API elements. - * reference count annotations for C API functions. Based on - refcount.py and anno-api.py in the old Python documentation tools. +* Reference count annotations for C API functions. +* Stable ABI annotations +* Limited API annotations - * stable API annotations +Configuration: +* Set ``refcount_file`` to the path to the reference count data file. +* Set ``stable_abi_file`` to the path to stable ABI list. +""" - Usage: - * Set the `refcount_file` config value to the path to the reference - count data file. - * Set the `stable_abi_file` config value to the path to stable ABI list. +from __future__ import annotations - :copyright: Copyright 2007-2014 by Georg Brandl. - :license: Python license. -""" +import csv +import dataclasses +from pathlib import Path +from typing import TYPE_CHECKING -from os import path -import docutils +import sphinx from docutils import nodes -from docutils.parsers.rst import directives -from docutils.parsers.rst import Directive from docutils.statemachine import StringList -from sphinx.locale import _ as sphinx_gettext -import csv - from sphinx import addnodes -from sphinx.domains.c import CObject - - -REST_ROLE_MAP = { - 'function': 'func', - 'var': 'data', - 'type': 'type', - 'macro': 'macro', - 'type': 'type', - 'member': 'member', +from sphinx.locale import _ as sphinx_gettext +from sphinx.util.docutils import SphinxDirective + +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata + +ROLE_TO_OBJECT_TYPE = { + "func": "function", + "macro": "macro", + "member": "member", + "type": "type", + "data": "var", } -# Monkeypatch nodes.Node.findall for forwards compatability -# This patch can be dropped when the minimum Sphinx version is 4.4.0 -# or the minimum Docutils version is 0.18.1. -if docutils.__version_info__ < (0, 18, 1): - def findall(self, *args, **kwargs): - return iter(self.traverse(*args, **kwargs)) - - nodes.Node.findall = findall - - -class RCEntry: - def __init__(self, name): - self.name = name - self.args = [] - self.result_type = '' - self.result_refs = None - - -class Annotations: - def __init__(self, refcount_filename, stable_abi_file): - self.refcount_data = {} - with open(refcount_filename, 'r') as fp: - for line in fp: - line = line.strip() - if line[:1] in ("", "#"): - # blank lines and comments - continue - parts = line.split(":", 4) - if len(parts) != 5: - raise ValueError("Wrong field count in %r" % line) - function, type, arg, refcount, comment = parts - # Get the entry, creating it if needed: - try: - entry = self.refcount_data[function] - except KeyError: - entry = self.refcount_data[function] = RCEntry(function) - if not refcount or refcount == "null": - refcount = None - else: - refcount = int(refcount) - # Update the entry with the new parameter or the result - # information. - if arg: - entry.args.append((arg, type, refcount)) - else: - entry.result_type = type - entry.result_refs = refcount - - self.stable_abi_data = {} - with open(stable_abi_file, 'r') as fp: - for record in csv.DictReader(fp): - role = record['role'] - name = record['name'] - self.stable_abi_data[name] = record - - def add_annotations(self, app, doctree): - for node in doctree.findall(addnodes.desc_content): - par = node.parent - if par['domain'] != 'c': - continue - if not par[0].has_key('ids') or not par[0]['ids']: - continue - name = par[0]['ids'][0] - if name.startswith("c."): - name = name[2:] - - objtype = par['objtype'] - - # Stable ABI annotation. These have two forms: - # Part of the [Stable ABI](link). - # Part of the [Stable ABI](link) since version X.Y. - # For structs, there's some more info in the message: - # Part of the [Limited API](link) (as an opaque struct). - # Part of the [Stable ABI](link) (including all members). - # Part of the [Limited API](link) (Only some members are part - # of the stable ABI.). - # ... all of which can have "since version X.Y" appended. - record = self.stable_abi_data.get(name) - if record: - if record['role'] != objtype: - raise ValueError( - f"Object type mismatch in limited API annotation " - f"for {name}: {record['role']!r} != {objtype!r}") - stable_added = record['added'] - message = ' Part of the ' - emph_node = nodes.emphasis(message, message, - classes=['stableabi']) - ref_node = addnodes.pending_xref( - 'Stable ABI', refdomain="std", reftarget='stable', - reftype='ref', refexplicit="False") - struct_abi_kind = record['struct_abi_kind'] - if struct_abi_kind in {'opaque', 'members'}: - ref_node += nodes.Text('Limited API') - else: - ref_node += nodes.Text('Stable ABI') - emph_node += ref_node - if struct_abi_kind == 'opaque': - emph_node += nodes.Text(' (as an opaque struct)') - elif struct_abi_kind == 'full-abi': - emph_node += nodes.Text(' (including all members)') - if record['ifdef_note']: - emph_node += nodes.Text(' ' + record['ifdef_note']) - if stable_added == '3.2': - # Stable ABI was introduced in 3.2. - pass - else: - emph_node += nodes.Text(f' since version {stable_added}') - emph_node += nodes.Text('.') - if struct_abi_kind == 'members': - emph_node += nodes.Text( - ' (Only some members are part of the stable ABI.)') - node.insert(0, emph_node) - - # Unstable API annotation. - if name.startswith('PyUnstable'): - warn_node = nodes.admonition( - classes=['unstable-c-api', 'warning']) - message = 'This is ' - emph_node = nodes.emphasis(message, message) - ref_node = addnodes.pending_xref( - 'Unstable API', refdomain="std", - reftarget='unstable-c-api', - reftype='ref', refexplicit="False") - ref_node += nodes.Text('Unstable API') - emph_node += ref_node - emph_node += nodes.Text('. It may change without warning in minor releases.') - warn_node += emph_node - node.insert(0, warn_node) - - # Return value annotation - if objtype != 'function': - continue - entry = self.refcount_data.get(name) - if not entry: - continue - elif not entry.result_type.endswith("Object*"): - continue - if entry.result_refs is None: - rc = sphinx_gettext('Return value: Always NULL.') - elif entry.result_refs: - rc = sphinx_gettext('Return value: New reference.') - else: - rc = sphinx_gettext('Return value: Borrowed reference.') - node.insert(0, nodes.emphasis(rc, rc, classes=['refcount'])) - - -def init_annotations(app): - annotations = Annotations( - path.join(app.srcdir, app.config.refcount_file), - path.join(app.srcdir, app.config.stable_abi_file), +@dataclasses.dataclass(slots=True) +class RefCountEntry: + # Name of the function. + name: str + # List of (argument name, type, refcount effect) tuples. + # (Currently not used. If it was, a dataclass might work better.) + args: list = dataclasses.field(default_factory=list) + # Return type of the function. + result_type: str = "" + # Reference count effect for the return value. + result_refs: int | None = None + + +@dataclasses.dataclass(frozen=True, slots=True) +class StableABIEntry: + # Role of the object. + # Source: Each [item_kind] in stable_abi.toml is mapped to a C Domain role. + role: str + # Name of the object. + # Source: [.*] in stable_abi.toml. + name: str + # Version when the object was added to the stable ABI. + # (Source: [.*.added] in stable_abi.toml. + added: str + # An explananatory blurb for the ifdef. + # Source: ``feature_macro.*.doc`` in stable_abi.toml. + ifdef_note: str + # Defines how much of the struct is exposed. Only relevant for structs. + # Source: [.*.struct_abi_kind] in stable_abi.toml. + struct_abi_kind: str + + +def read_refcount_data(refcount_filename: Path) -> dict[str, RefCountEntry]: + refcount_data = {} + refcounts = refcount_filename.read_text(encoding="utf8") + for line in refcounts.splitlines(): + line = line.strip() + if not line or line.startswith("#"): + # blank lines and comments + continue + + # Each line is of the form + # function ':' type ':' [param name] ':' [refcount effect] ':' [comment] + parts = line.split(":", 4) + if len(parts) != 5: + raise ValueError(f"Wrong field count in {line!r}") + function, type, arg, refcount, _comment = parts + + # Get the entry, creating it if needed: + try: + entry = refcount_data[function] + except KeyError: + entry = refcount_data[function] = RefCountEntry(function) + if not refcount or refcount == "null": + refcount = None + else: + refcount = int(refcount) + # Update the entry with the new parameter + # or the result information. + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + + return refcount_data + + +def read_stable_abi_data(stable_abi_file: Path) -> dict[str, StableABIEntry]: + stable_abi_data = {} + with open(stable_abi_file, encoding="utf8") as fp: + for record in csv.DictReader(fp): + name = record["name"] + stable_abi_data[name] = StableABIEntry(**record) + + return stable_abi_data + + +def add_annotations(app: Sphinx, doctree: nodes.document) -> None: + state = app.env.domaindata["c_annotations"] + refcount_data = state["refcount_data"] + stable_abi_data = state["stable_abi_data"] + for node in doctree.findall(addnodes.desc_content): + par = node.parent + if par["domain"] != "c": + continue + if not par[0].get("ids", None): + continue + name = par[0]["ids"][0].removeprefix("c.") + objtype = par["objtype"] + + # Stable ABI annotation. + if record := stable_abi_data.get(name): + if ROLE_TO_OBJECT_TYPE[record.role] != objtype: + msg = ( + f"Object type mismatch in limited API annotation for {name}: " + f"{ROLE_TO_OBJECT_TYPE[record.role]!r} != {objtype!r}" + ) + raise ValueError(msg) + annotation = _stable_abi_annotation(record) + node.insert(0, annotation) + + # Unstable API annotation. + if name.startswith("PyUnstable"): + annotation = _unstable_api_annotation() + node.insert(0, annotation) + + # Return value annotation + if objtype != "function": + continue + if name not in refcount_data: + continue + entry = refcount_data[name] + if not entry.result_type.endswith("Object*"): + continue + annotation = _return_value_annotation(entry.result_refs) + node.insert(0, annotation) + + +def _stable_abi_annotation(record: StableABIEntry) -> nodes.emphasis: + """Create the Stable ABI annotation. + + These have two forms: + Part of the `Stable ABI `_. + Part of the `Stable ABI `_ since version X.Y. + For structs, there's some more info in the message: + Part of the `Limited API `_ (as an opaque struct). + Part of the `Stable ABI `_ (including all members). + Part of the `Limited API `_ (Only some members are part + of the stable ABI.). + ... all of which can have "since version X.Y" appended. + """ + stable_added = record.added + message = sphinx_gettext("Part of the") + message = message.center(len(message) + 2) + emph_node = nodes.emphasis(message, message, classes=["stableabi"]) + ref_node = addnodes.pending_xref( + "Stable ABI", + refdomain="std", + reftarget="stable", + reftype="ref", + refexplicit="False", + ) + struct_abi_kind = record.struct_abi_kind + if struct_abi_kind in {"opaque", "members"}: + ref_node += nodes.Text(sphinx_gettext("Limited API")) + else: + ref_node += nodes.Text(sphinx_gettext("Stable ABI")) + emph_node += ref_node + if struct_abi_kind == "opaque": + emph_node += nodes.Text(" " + sphinx_gettext("(as an opaque struct)")) + elif struct_abi_kind == "full-abi": + emph_node += nodes.Text( + " " + sphinx_gettext("(including all members)") + ) + if record.ifdef_note: + emph_node += nodes.Text(f" {record.ifdef_note}") + if stable_added == "3.2": + # Stable ABI was introduced in 3.2. + pass + else: + emph_node += nodes.Text( + " " + sphinx_gettext("since version %s") % stable_added + ) + emph_node += nodes.Text(".") + if struct_abi_kind == "members": + msg = " " + sphinx_gettext( + "(Only some members are part of the stable ABI.)" + ) + emph_node += nodes.Text(msg) + return emph_node + + +def _unstable_api_annotation() -> nodes.admonition: + ref_node = addnodes.pending_xref( + "Unstable API", + nodes.Text(sphinx_gettext("Unstable API")), + refdomain="std", + reftarget="unstable-c-api", + reftype="ref", + refexplicit="False", + ) + emph_node = nodes.emphasis( + "This is ", + sphinx_gettext("This is") + " ", + ref_node, + nodes.Text( + sphinx_gettext( + ". It may change without warning in minor releases." + ) + ), + ) + return nodes.admonition( + "", + emph_node, + classes=["unstable-c-api", "warning"], ) - app.connect('doctree-read', annotations.add_annotations) - - class LimitedAPIList(Directive): - has_content = False - required_arguments = 0 - optional_arguments = 0 - final_argument_whitespace = True - def run(self): - content = [] - for record in annotations.stable_abi_data.values(): - role = REST_ROLE_MAP[record['role']] - name = record['name'] - content.append(f'* :c:{role}:`{name}`') +def _return_value_annotation(result_refs: int | None) -> nodes.emphasis: + classes = ["refcount"] + if result_refs is None: + rc = sphinx_gettext("Return value: Always NULL.") + classes.append("return_null") + elif result_refs: + rc = sphinx_gettext("Return value: New reference.") + classes.append("return_new_ref") + else: + rc = sphinx_gettext("Return value: Borrowed reference.") + classes.append("return_borrowed_ref") + return nodes.emphasis(rc, rc, classes=classes) + + +class LimitedAPIList(SphinxDirective): + has_content = False + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = True + + def run(self) -> list[nodes.Node]: + state = self.env.domaindata["c_annotations"] + content = [ + f"* :c:{record.role}:`{record.name}`" + for record in state["stable_abi_data"].values() + ] + node = nodes.paragraph() + self.state.nested_parse(StringList(content), 0, node) + return [node] + + +def init_annotations(app: Sphinx) -> None: + # Using domaindata is a bit hack-ish, + # but allows storing state without a global variable or closure. + app.env.domaindata["c_annotations"] = state = {} + state["refcount_data"] = read_refcount_data( + Path(app.srcdir, app.config.refcount_file) + ) + state["stable_abi_data"] = read_stable_abi_data( + Path(app.srcdir, app.config.stable_abi_file) + ) - pnode = nodes.paragraph() - self.state.nested_parse(StringList(content), 0, pnode) - return [pnode] - app.add_directive('limited-api-list', LimitedAPIList) +def setup(app: Sphinx) -> ExtensionMetadata: + app.add_config_value("refcount_file", "", "env", types={str}) + app.add_config_value("stable_abi_file", "", "env", types={str}) + app.add_directive("limited-api-list", LimitedAPIList) + app.connect("builder-inited", init_annotations) + app.connect("doctree-read", add_annotations) + if sphinx.version_info[:2] < (7, 2): + from docutils.parsers.rst import directives + from sphinx.domains.c import CObject -def setup(app): - app.add_config_value('refcount_file', '', True) - app.add_config_value('stable_abi_file', '', True) - app.connect('builder-inited', init_annotations) + # monkey-patch C object... + CObject.option_spec |= { + "no-index-entry": directives.flag, + "no-contents-entry": directives.flag, + } - # monkey-patch C object... - CObject.option_spec = { - 'noindex': directives.flag, - 'stableabi': directives.flag, + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, } - old_handle_signature = CObject.handle_signature - def new_handle_signature(self, sig, signode): - signode.parent['stableabi'] = 'stableabi' in self.options - return old_handle_signature(self, sig, signode) - CObject.handle_signature = new_handle_signature - return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/escape4chm.py b/Doc/tools/extensions/escape4chm.py deleted file mode 100644 index 89970975..00000000 --- a/Doc/tools/extensions/escape4chm.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Escape the `body` part of .chm source file to 7-bit ASCII, to fix visual -effect on some MBCS Windows systems. - -https://bugs.python.org/issue32174 -""" - -import pathlib -import re -from html.entities import codepoint2name - -from sphinx.util.logging import getLogger - -# escape the characters which codepoint > 0x7F -def _process(string): - def escape(matchobj): - codepoint = ord(matchobj.group(0)) - - name = codepoint2name.get(codepoint) - if name is None: - return '&#%d;' % codepoint - else: - return '&%s;' % name - - return re.sub(r'[^\x00-\x7F]', escape, string) - -def escape_for_chm(app, pagename, templatename, context, doctree): - # only works for .chm output - if getattr(app.builder, 'name', '') != 'htmlhelp': - return - - # escape the `body` part to 7-bit ASCII - body = context.get('body') - if body is not None: - context['body'] = _process(body) - -def fixup_keywords(app, exception): - # only works for .chm output - if getattr(app.builder, 'name', '') != 'htmlhelp' or exception: - return - - getLogger(__name__).info('fixing HTML escapes in keywords file...') - outdir = pathlib.Path(app.builder.outdir) - outname = app.builder.config.htmlhelp_basename - with open(outdir / (outname + '.hhk'), 'rb') as f: - index = f.read() - with open(outdir / (outname + '.hhk'), 'wb') as f: - f.write(index.replace(b''', b''')) - -def setup(app): - # `html-page-context` event emitted when the HTML builder has - # created a context dictionary to render a template with. - app.connect('html-page-context', escape_for_chm) - # `build-finished` event emitted when all the files have been - # output. - app.connect('build-finished', fixup_keywords) - - return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/glossary_search.py b/Doc/tools/extensions/glossary_search.py index 59a6862e..502b6cd9 100644 --- a/Doc/tools/extensions/glossary_search.py +++ b/Doc/tools/extensions/glossary_search.py @@ -1,63 +1,63 @@ -# -*- coding: utf-8 -*- -""" - glossary_search.py - ~~~~~~~~~~~~~~~~ +"""Feature search results for glossary items prominently.""" - Feature search results for glossary items prominently. +from __future__ import annotations - :license: Python license. -""" import json -import os.path -from docutils.nodes import definition_list_item +from pathlib import Path +from typing import TYPE_CHECKING + +from docutils import nodes from sphinx.addnodes import glossary from sphinx.util import logging +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata logger = logging.getLogger(__name__) -STATIC_DIR = '_static' -JSON = 'glossary.json' -def process_glossary_nodes(app, doctree, fromdocname): - if app.builder.format != 'html': +def process_glossary_nodes( + app: Sphinx, + doctree: nodes.document, + _docname: str, +) -> None: + if app.builder.format != 'html' or app.builder.embedded: return - terms = {} + if hasattr(app.env, 'glossary_terms'): + terms = app.env.glossary_terms + else: + terms = app.env.glossary_terms = {} - for node in doctree.traverse(glossary): - for glossary_item in node.traverse(definition_list_item): - term = glossary_item[0].astext().lower() - definition = glossary_item[1] + for node in doctree.findall(glossary): + for glossary_item in node.findall(nodes.definition_list_item): + term = glossary_item[0].astext() + definition = glossary_item[-1] rendered = app.builder.render_partial(definition) - terms[term] = { - 'title': glossary_item[0].astext(), - 'body': rendered['html_body'] + terms[term.lower()] = { + 'title': term, + 'body': rendered['html_body'], } - if hasattr(app.env, 'glossary_terms'): - app.env.glossary_terms.update(terms) - else: - app.env.glossary_terms = terms -def on_build_finish(app, exc): - if not hasattr(app.env, 'glossary_terms'): - return - if not app.env.glossary_terms: +def write_glossary_json(app: Sphinx, _exc: Exception) -> None: + if not getattr(app.env, 'glossary_terms', None): return - logger.info(f'Writing {JSON}', color='green') - - dest_dir = os.path.join(app.outdir, STATIC_DIR) - os.makedirs(dest_dir, exist_ok=True) - - with open(os.path.join(dest_dir, JSON), 'w') as f: - json.dump(app.env.glossary_terms, f) + logger.info('Writing glossary.json', color='green') + dest = Path(app.outdir, '_static', 'glossary.json') + dest.parent.mkdir(exist_ok=True) + dest.write_text(json.dumps(app.env.glossary_terms), encoding='utf-8') -def setup(app): +def setup(app: Sphinx) -> ExtensionMetadata: app.connect('doctree-resolved', process_glossary_nodes) - app.connect('build-finished', on_build_finish) + app.connect('build-finished', write_glossary_json) - return {'version': '0.1', 'parallel_read_safe': True} + return { + 'version': '1.0', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/Doc/tools/extensions/lexers/__init__.py b/Doc/tools/extensions/lexers/__init__.py new file mode 100644 index 00000000..e12ac5be --- /dev/null +++ b/Doc/tools/extensions/lexers/__init__.py @@ -0,0 +1,15 @@ +from .asdl_lexer import ASDLLexer +from .peg_lexer import PEGLexer + + +def setup(app): + # Used for highlighting Parser/Python.asdl in library/ast.rst + app.add_lexer("asdl", ASDLLexer) + # Used for highlighting Grammar/python.gram in reference/grammar.rst + app.add_lexer("peg", PEGLexer) + + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/asdl_highlight.py b/Doc/tools/extensions/lexers/asdl_lexer.py similarity index 62% rename from Doc/tools/extensions/asdl_highlight.py rename to Doc/tools/extensions/lexers/asdl_lexer.py index 42863a4b..3a74174a 100644 --- a/Doc/tools/extensions/asdl_highlight.py +++ b/Doc/tools/extensions/lexers/asdl_lexer.py @@ -1,15 +1,6 @@ -import sys -from pathlib import Path +from pygments.lexer import RegexLexer, bygroups, include +from pygments.token import Comment, Keyword, Name, Operator, Punctuation, Text -CPYTHON_ROOT = Path(__file__).resolve().parent.parent.parent.parent -sys.path.append(str(CPYTHON_ROOT / "Parser")) - -from pygments.lexer import RegexLexer, bygroups, include, words -from pygments.token import (Comment, Keyword, Name, Operator, - Punctuation, Text) - -from asdl import builtin_types -from sphinx.highlighting import lexers class ASDLLexer(RegexLexer): name = "ASDL" @@ -34,7 +25,10 @@ class ASDLLexer(RegexLexer): r"(\w+)(\*\s|\?\s|\s)(\w+)", bygroups(Name.Builtin.Pseudo, Operator, Name), ), - (words(builtin_types), Name.Builtin), + # Keep in line with ``builtin_types`` from Parser/asdl.py. + # ASDL's 4 builtin types are + # constant, identifier, int, string + ("constant|identifier|int|string", Name.Builtin), (r"attributes", Name.Builtin), ( _name + _text_ws + "(=)", @@ -46,8 +40,3 @@ class ASDLLexer(RegexLexer): (r".", Text), ], } - - -def setup(app): - lexers["asdl"] = ASDLLexer() - return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/lexers/peg_lexer.py similarity index 94% rename from Doc/tools/extensions/peg_highlight.py rename to Doc/tools/extensions/lexers/peg_lexer.py index 4bdc2ee1..06f9f8eb 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/lexers/peg_lexer.py @@ -1,8 +1,6 @@ from pygments.lexer import RegexLexer, bygroups, include from pygments.token import Comment, Keyword, Name, Operator, Punctuation, Text -from sphinx.highlighting import lexers - class PEGLexer(RegexLexer): """Pygments Lexer for PEG grammar (.gram) files @@ -16,6 +14,7 @@ class PEGLexer(RegexLexer): - Rule types - Rule options - Rules named `invalid_*` or `incorrect_*` + - Rules with `RAISE_SYNTAX_ERROR` """ name = "PEG" @@ -59,6 +58,7 @@ class PEGLexer(RegexLexer): (r"^(\s+\|\s+.*invalid_\w+.*\n)", bygroups(None)), (r"^(\s+\|\s+.*incorrect_\w+.*\n)", bygroups(None)), (r"^(#.*invalid syntax.*(?:.|\n)*)", bygroups(None),), + (r"^(\s+\|\s+.*\{[^}]*RAISE_SYNTAX_ERROR[^}]*\})\n", bygroups(None)), ], "root": [ include("invalids"), @@ -79,8 +79,3 @@ class PEGLexer(RegexLexer): (r".", Text), ], } - - -def setup(app): - lexers["peg"] = PEGLexer() - return {"version": "1.0", "parallel_read_safe": True} diff --git a/Doc/tools/extensions/patchlevel.py b/Doc/tools/extensions/patchlevel.py index 617f28c2..9ccaec3d 100644 --- a/Doc/tools/extensions/patchlevel.py +++ b/Doc/tools/extensions/patchlevel.py @@ -1,68 +1,81 @@ -# -*- coding: utf-8 -*- -""" - patchlevel.py - ~~~~~~~~~~~~~ +"""Extract version information from Include/patchlevel.h.""" - Extract version info from Include/patchlevel.h. - Adapted from Doc/tools/getversioninfo. +import re +import sys +from pathlib import Path +from typing import Literal, NamedTuple - :copyright: 2007-2008 by Georg Brandl. - :license: Python license. -""" +CPYTHON_ROOT = Path( + __file__, # cpython/Doc/tools/extensions/patchlevel.py + "..", # cpython/Doc/tools/extensions + "..", # cpython/Doc/tools + "..", # cpython/Doc + "..", # cpython +).resolve() +PATCHLEVEL_H = CPYTHON_ROOT / "Include" / "patchlevel.h" -from __future__ import print_function +RELEASE_LEVELS = { + "PY_RELEASE_LEVEL_ALPHA": "alpha", + "PY_RELEASE_LEVEL_BETA": "beta", + "PY_RELEASE_LEVEL_GAMMA": "candidate", + "PY_RELEASE_LEVEL_FINAL": "final", +} -import os -import re -import sys -def get_header_version_info(srcdir): - patchlevel_h = os.path.join(srcdir, '..', 'Include', 'patchlevel.h') +class version_info(NamedTuple): # noqa: N801 + major: int #: Major release number + minor: int #: Minor release number + micro: int #: Patch release number + releaselevel: Literal["alpha", "beta", "candidate", "final"] + serial: int #: Serial release number - # This won't pick out all #defines, but it will pick up the ones we - # care about. - rx = re.compile(r'\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)') - d = {} - with open(patchlevel_h) as f: - for line in f: - m = rx.match(line) - if m is not None: - name, value = m.group(1, 2) - d[name] = value +def get_header_version_info() -> version_info: + # Capture PY_ prefixed #defines. + pat = re.compile(r"\s*#define\s+(PY_\w*)\s+(\w+)", re.ASCII) - release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION']) - micro = int(d['PY_MICRO_VERSION']) - release += '.' + str(micro) + defines = {} + patchlevel_h = PATCHLEVEL_H.read_text(encoding="utf-8") + for line in patchlevel_h.splitlines(): + if (m := pat.match(line)) is not None: + name, value = m.groups() + defines[name] = value - level = d['PY_RELEASE_LEVEL'] - suffixes = { - 'PY_RELEASE_LEVEL_ALPHA': 'a', - 'PY_RELEASE_LEVEL_BETA': 'b', - 'PY_RELEASE_LEVEL_GAMMA': 'rc', - } - if level != 'PY_RELEASE_LEVEL_FINAL': - release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL'])) - return version, release + return version_info( + major=int(defines["PY_MAJOR_VERSION"]), + minor=int(defines["PY_MINOR_VERSION"]), + micro=int(defines["PY_MICRO_VERSION"]), + releaselevel=RELEASE_LEVELS[defines["PY_RELEASE_LEVEL"]], + serial=int(defines["PY_RELEASE_SERIAL"]), + ) -def get_sys_version_info(): - major, minor, micro, level, serial = sys.version_info - release = version = '%s.%s' % (major, minor) - release += '.%s' % micro - if level != 'final': - release += '%s%s' % (level[0], serial) +def format_version_info(info: version_info) -> tuple[str, str]: + version = f"{info.major}.{info.minor}" + release = f"{info.major}.{info.minor}.{info.micro}" + if info.releaselevel != "final": + suffix = {"alpha": "a", "beta": "b", "candidate": "rc"} + release += f"{suffix[info.releaselevel]}{info.serial}" return version, release def get_version_info(): try: - return get_header_version_info('.') - except (IOError, OSError): - version, release = get_sys_version_info() - print('Can\'t get version info from Include/patchlevel.h, ' \ - 'using version of this interpreter (%s).' % release, file=sys.stderr) + info = get_header_version_info() + return format_version_info(info) + except OSError: + version, release = format_version_info(sys.version_info) + print( + f"Failed to get version info from Include/patchlevel.h, " + f"using version of this interpreter ({release}).", + file=sys.stderr, + ) return version, release -if __name__ == '__main__': - print(get_header_version_info('.')[1]) + +if __name__ == "__main__": + short_ver, full_ver = format_version_info(get_header_version_info()) + if sys.argv[1:2] == ["--short"]: + print(short_ver) + else: + print(full_ver) diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index c286bcf3..1ad10d4b 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -15,31 +15,24 @@ from os import getenv, path from time import asctime from pprint import pformat -from docutils import nodes, utils +from docutils import nodes from docutils.io import StringOutput -from docutils.parsers.rst import Directive -from docutils.utils import new_document +from docutils.parsers.rst import directives +from docutils.utils import new_document, unescape from sphinx import addnodes from sphinx.builders import Builder -from sphinx.domains.python import PyFunction, PyMethod -from sphinx.errors import NoUri +from sphinx.domains.changeset import VersionChange, versionlabels, versionlabel_classes +from sphinx.domains.python import PyFunction, PyMethod, PyModule from sphinx.locale import _ as sphinx_gettext -from sphinx.util import logging from sphinx.util.docutils import SphinxDirective -from sphinx.util.nodes import split_explicit_title from sphinx.writers.text import TextWriter, TextTranslator - -try: - # Sphinx 6+ - from sphinx.util.display import status_iterator -except ImportError: - # Deprecated in Sphinx 6.1, will be removed in Sphinx 8 - from sphinx.util import status_iterator +from sphinx.util.display import status_iterator ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' GH_ISSUE_URI = 'https://github.com/python/cpython/issues/%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.12/%s' +# Used in conf.py and updated here by python/release-tools/run_release.py +SOURCE_URI = 'https://github.com/python/cpython/tree/3.13/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -48,11 +41,20 @@ Body.enum.converters['loweralpha'] = \ Body.enum.converters['lowerroman'] = \ Body.enum.converters['upperroman'] = lambda x: None +# monkey-patch the productionlist directive to allow hyphens in group names +# https://github.com/sphinx-doc/sphinx/issues/11854 +from sphinx.domains import std + +std.token_re = re.compile(r'`((~?[\w-]*:)?\w+)`') + +# backport :no-index: +PyModule.option_spec['no-index'] = directives.flag + # Support for marking up and linking to bugs.python.org issues def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - issue = utils.unescape(text) + issue = unescape(text) # sanity check: there are no bpo issues within these two values if 47261 < int(issue) < 400000: msg = inliner.reporter.error(f'The BPO ID {text!r} seems too high -- ' @@ -67,7 +69,7 @@ def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): # Support for marking up and linking to GitHub issues def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - issue = utils.unescape(text) + issue = unescape(text) # sanity check: all GitHub issues have ID >= 32426 # even though some of them are also valid BPO IDs if int(issue) < 32426: @@ -80,19 +82,9 @@ def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): return [refnode], [] -# Support for linking to Python source files easily - -def source_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - has_t, title, target = split_explicit_title(text) - title = utils.unescape(title) - target = utils.unescape(target) - refnode = nodes.reference(title, title, refuri=SOURCE_URI % target) - return [refnode], [] - - # Support for marking up implementation details -class ImplementationDetail(Directive): +class ImplementationDetail(SphinxDirective): has_content = True final_argument_whitespace = True @@ -115,218 +107,6 @@ class ImplementationDetail(Directive): return [pnode] -# Support for documenting platform availability - -class Availability(SphinxDirective): - - has_content = True - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = True - - # known platform, libc, and threading implementations - known_platforms = frozenset({ - "AIX", "Android", "BSD", "DragonFlyBSD", "Emscripten", "FreeBSD", - "Linux", "NetBSD", "OpenBSD", "POSIX", "Solaris", "Unix", "VxWorks", - "WASI", "Windows", "macOS", - # libc - "BSD libc", "glibc", "musl", - # POSIX platforms with pthreads - "pthreads", - }) - - def run(self): - availability_ref = ':ref:`Availability `: ' - avail_nodes, avail_msgs = self.state.inline_text( - availability_ref + self.arguments[0], - self.lineno) - pnode = nodes.paragraph(availability_ref + self.arguments[0], - '', *avail_nodes, *avail_msgs) - self.set_source_info(pnode) - cnode = nodes.container("", pnode, classes=["availability"]) - self.set_source_info(cnode) - if self.content: - self.state.nested_parse(self.content, self.content_offset, cnode) - self.parse_platforms() - - return [cnode] - - def parse_platforms(self): - """Parse platform information from arguments - - Arguments is a comma-separated string of platforms. A platform may - be prefixed with "not " to indicate that a feature is not available. - - Example:: - - .. availability:: Windows, Linux >= 4.2, not Emscripten, not WASI - - Arguments like "Linux >= 3.17 with glibc >= 2.27" are currently not - parsed into separate tokens. - """ - platforms = {} - for arg in self.arguments[0].rstrip(".").split(","): - arg = arg.strip() - platform, _, version = arg.partition(" >= ") - if platform.startswith("not "): - version = False - platform = platform[4:] - elif not version: - version = True - platforms[platform] = version - - unknown = set(platforms).difference(self.known_platforms) - if unknown: - cls = type(self) - logger = logging.getLogger(cls.__qualname__) - logger.warning( - f"Unknown platform(s) or syntax '{' '.join(sorted(unknown))}' " - f"in '.. availability:: {self.arguments[0]}', see " - f"{__file__}:{cls.__qualname__}.known_platforms for a set " - "known platforms." - ) - - return platforms - - - -# Support for documenting audit event - -def audit_events_purge(app, env, docname): - """This is to remove from env.all_audit_events old traces of removed - documents. - """ - if not hasattr(env, 'all_audit_events'): - return - fresh_all_audit_events = {} - for name, event in env.all_audit_events.items(): - event["source"] = [(d, t) for d, t in event["source"] if d != docname] - if event["source"]: - # Only keep audit_events that have at least one source. - fresh_all_audit_events[name] = event - env.all_audit_events = fresh_all_audit_events - - -def audit_events_merge(app, env, docnames, other): - """In Sphinx parallel builds, this merges env.all_audit_events from - subprocesses. - - all_audit_events is a dict of names, with values like: - {'source': [(docname, target), ...], 'args': args} - """ - if not hasattr(other, 'all_audit_events'): - return - if not hasattr(env, 'all_audit_events'): - env.all_audit_events = {} - for name, value in other.all_audit_events.items(): - if name in env.all_audit_events: - env.all_audit_events[name]["source"].extend(value["source"]) - else: - env.all_audit_events[name] = value - - -class AuditEvent(Directive): - - has_content = True - required_arguments = 1 - optional_arguments = 2 - final_argument_whitespace = True - - _label = [ - sphinx_gettext("Raises an :ref:`auditing event ` {name} with no arguments."), - sphinx_gettext("Raises an :ref:`auditing event ` {name} with argument {args}."), - sphinx_gettext("Raises an :ref:`auditing event ` {name} with arguments {args}."), - ] - - @property - def logger(self): - cls = type(self) - return logging.getLogger(cls.__module__ + "." + cls.__name__) - - def run(self): - name = self.arguments[0] - if len(self.arguments) >= 2 and self.arguments[1]: - args = (a.strip() for a in self.arguments[1].strip("'\"").split(",")) - args = [a for a in args if a] - else: - args = [] - - label = self._label[min(2, len(args))] - text = label.format(name="``{}``".format(name), - args=", ".join("``{}``".format(a) for a in args if a)) - - env = self.state.document.settings.env - if not hasattr(env, 'all_audit_events'): - env.all_audit_events = {} - - new_info = { - 'source': [], - 'args': args - } - info = env.all_audit_events.setdefault(name, new_info) - if info is not new_info: - if not self._do_args_match(info['args'], new_info['args']): - self.logger.warning( - "Mismatched arguments for audit-event {}: {!r} != {!r}" - .format(name, info['args'], new_info['args']) - ) - - ids = [] - try: - target = self.arguments[2].strip("\"'") - except (IndexError, TypeError): - target = None - if not target: - target = "audit_event_{}_{}".format( - re.sub(r'\W', '_', name), - len(info['source']), - ) - ids.append(target) - - info['source'].append((env.docname, target)) - - pnode = nodes.paragraph(text, classes=["audit-hook"], ids=ids) - pnode.line = self.lineno - if self.content: - self.state.nested_parse(self.content, self.content_offset, pnode) - else: - n, m = self.state.inline_text(text, self.lineno) - pnode.extend(n + m) - - return [pnode] - - # This list of sets are allowable synonyms for event argument names. - # If two names are in the same set, they are treated as equal for the - # purposes of warning. This won't help if number of arguments is - # different! - _SYNONYMS = [ - {"file", "path", "fd"}, - ] - - def _do_args_match(self, args1, args2): - if args1 == args2: - return True - if len(args1) != len(args2): - return False - for a1, a2 in zip(args1, args2): - if a1 == a2: - continue - if any(a1 in s and a2 in s for s in self._SYNONYMS): - continue - return False - return True - - -class audit_event_list(nodes.General, nodes.Element): - pass - - -class AuditEventListDirective(Directive): - - def run(self): - return [audit_event_list('')] - - # Support for documenting decorators class PyDecoratorMixin(object): @@ -404,60 +184,55 @@ class PyAbstractMethod(PyMethod): return PyMethod.run(self) -# Support for documenting version of removal in deprecations +# Support for documenting version of changes, additions, deprecations -class DeprecatedRemoved(Directive): - has_content = True +def expand_version_arg(argument, release): + """Expand "next" to the current version""" + if argument == 'next': + return sphinx_gettext('{} (unreleased)').format(release) + return argument + + +class PyVersionChange(VersionChange): + def run(self): + # Replace the 'next' special token with the current development version + self.arguments[0] = expand_version_arg(self.arguments[0], + self.config.release) + return super().run() + + +class DeprecatedRemoved(VersionChange): required_arguments = 2 - optional_arguments = 1 - final_argument_whitespace = True - option_spec = {} - _deprecated_label = sphinx_gettext('Deprecated since version {deprecated}, will be removed in version {removed}') - _removed_label = sphinx_gettext('Deprecated since version {deprecated}, removed in version {removed}') + _deprecated_label = sphinx_gettext('Deprecated since version %s, will be removed in version %s') + _removed_label = sphinx_gettext('Deprecated since version %s, removed in version %s') def run(self): - node = addnodes.versionmodified() - node.document = self.state.document - node['type'] = 'deprecated-removed' - version = (self.arguments[0], self.arguments[1]) - node['version'] = version - env = self.state.document.settings.env - current_version = tuple(int(e) for e in env.config.version.split('.')) - removed_version = tuple(int(e) for e in self.arguments[1].split('.')) + # Replace the first two arguments (deprecated version and removed version) + # with a single tuple of both versions. + version_deprecated = expand_version_arg(self.arguments[0], + self.config.release) + version_removed = self.arguments.pop(1) + if version_removed == 'next': + raise ValueError( + 'deprecated-removed:: second argument cannot be `next`') + self.arguments[0] = version_deprecated, version_removed + + # Set the label based on if we have reached the removal version + current_version = tuple(map(int, self.config.version.split('.'))) + removed_version = tuple(map(int, version_removed.split('.'))) if current_version < removed_version: - label = self._deprecated_label - else: - label = self._removed_label - - text = label.format(deprecated=self.arguments[0], removed=self.arguments[1]) - if len(self.arguments) == 3: - inodes, messages = self.state.inline_text(self.arguments[2], - self.lineno+1) - para = nodes.paragraph(self.arguments[2], '', *inodes, translatable=False) - node.append(para) + versionlabels[self.name] = self._deprecated_label + versionlabel_classes[self.name] = 'deprecated' else: - messages = [] - if self.content: - self.state.nested_parse(self.content, self.content_offset, node) - if len(node): - if isinstance(node[0], nodes.paragraph) and node[0].rawsource: - content = nodes.inline(node[0].rawsource, translatable=True) - content.source = node[0].source - content.line = node[0].line - content += node[0].children - node[0].replace_self(nodes.paragraph('', '', content, translatable=False)) - node[0].insert(0, nodes.inline('', '%s: ' % text, - classes=['versionmodified'])) - else: - para = nodes.paragraph('', '', - nodes.inline('', '%s.' % text, - classes=['versionmodified']), - translatable=False) - node.append(para) - env = self.state.document.settings.env - env.get_domain('changeset').note_changeset(node) - return [node] + messages + versionlabels[self.name] = self._removed_label + versionlabel_classes[self.name] = 'removed' + try: + return super().run() + finally: + # reset versionlabels and versionlabel_classes + versionlabels[self.name] = '' + versionlabel_classes[self.name] = '' # Support for including Misc/NEWS @@ -467,7 +242,7 @@ gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") -class MiscNews(Directive): +class MiscNews(SphinxDirective): has_content = False required_arguments = 1 optional_arguments = 0 @@ -482,7 +257,7 @@ class MiscNews(Directive): if not source_dir: source_dir = path.dirname(path.abspath(source)) fpath = path.join(source_dir, fname) - self.state.document.settings.record_dependencies.add(fpath) + self.env.note_dependency(path.abspath(fpath)) try: with io.open(fpath, encoding='utf-8') as fp: content = fp.read() @@ -503,8 +278,8 @@ class MiscNews(Directive): # Support for building "topic help" for pydoc pydoc_topic_labels = [ - 'assert', 'assignment', 'async', 'atom-identifiers', 'atom-literals', - 'attribute-access', 'attribute-references', 'augassign', 'await', + 'assert', 'assignment', 'assignment-expressions', 'async', 'atom-identifiers', + 'atom-literals', 'attribute-access', 'attribute-references', 'augassign', 'await', 'binary', 'bitwise', 'bltin-code-objects', 'bltin-ellipsis-object', 'bltin-null-object', 'bltin-type-objects', 'booleans', 'break', 'callable-types', 'calls', 'class', 'comparisons', 'compound', @@ -607,68 +382,11 @@ def parse_pdb_command(env, sig, signode): return fullname -def process_audit_events(app, doctree, fromdocname): - for node in doctree.traverse(audit_event_list): - break - else: - return - - env = app.builder.env - - table = nodes.table(cols=3) - group = nodes.tgroup( - '', - nodes.colspec(colwidth=30), - nodes.colspec(colwidth=55), - nodes.colspec(colwidth=15), - cols=3, - ) - head = nodes.thead() - body = nodes.tbody() - - table += group - group += head - group += body - - row = nodes.row() - row += nodes.entry('', nodes.paragraph('', nodes.Text('Audit event'))) - row += nodes.entry('', nodes.paragraph('', nodes.Text('Arguments'))) - row += nodes.entry('', nodes.paragraph('', nodes.Text('References'))) - head += row - - for name in sorted(getattr(env, "all_audit_events", ())): - audit_event = env.all_audit_events[name] - - row = nodes.row() - node = nodes.paragraph('', nodes.Text(name)) - row += nodes.entry('', node) - - node = nodes.paragraph() - for i, a in enumerate(audit_event['args']): - if i: - node += nodes.Text(", ") - node += nodes.literal(a, nodes.Text(a)) - row += nodes.entry('', node) - - node = nodes.paragraph() - backlinks = enumerate(sorted(set(audit_event['source'])), start=1) - for i, (doc, label) in backlinks: - if isinstance(label, str): - ref = nodes.reference("", nodes.Text("[{}]".format(i)), internal=True) - try: - ref['refuri'] = "{}#{}".format( - app.builder.get_relative_uri(fromdocname, doc), - label, - ) - except NoUri: - continue - node += ref - row += nodes.entry('', node) - - body += row - - for node in doctree.traverse(audit_event_list): - node.replace_self(table) +def parse_monitoring_event(env, sig, signode): + """Transform a monitoring event signature into RST nodes.""" + signode += addnodes.desc_addname('sys.monitoring.events.', 'sys.monitoring.events.') + signode += addnodes.desc_name(sig, sig) + return sig def patch_pairindextypes(app, _env) -> None: @@ -698,16 +416,16 @@ def patch_pairindextypes(app, _env) -> None: def setup(app): app.add_role('issue', issue_role) app.add_role('gh', gh_issue_role) - app.add_role('source', source_role) app.add_directive('impl-detail', ImplementationDetail) - app.add_directive('availability', Availability) - app.add_directive('audit-event', AuditEvent) - app.add_directive('audit-event-table', AuditEventListDirective) + app.add_directive('versionadded', PyVersionChange, override=True) + app.add_directive('versionchanged', PyVersionChange, override=True) + app.add_directive('versionremoved', PyVersionChange, override=True) + app.add_directive('deprecated', PyVersionChange, override=True) app.add_directive('deprecated-removed', DeprecatedRemoved) app.add_builder(PydocTopicsBuilder) app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature) app.add_object_type('pdbcommand', 'pdbcmd', '%s (pdb command)', parse_pdb_command) - app.add_object_type('2to3fixer', '2to3fixer', '%s (2to3 fixer)') + app.add_object_type('monitoring-event', 'monitoring-event', '%s (monitoring event)', parse_monitoring_event) app.add_directive_to_domain('py', 'decorator', PyDecoratorFunction) app.add_directive_to_domain('py', 'decoratormethod', PyDecoratorMethod) app.add_directive_to_domain('py', 'coroutinefunction', PyCoroutineFunction) @@ -716,8 +434,6 @@ def setup(app): app.add_directive_to_domain('py', 'awaitablemethod', PyAwaitableMethod) app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod) app.add_directive('miscnews', MiscNews) + app.add_css_file('sidebar-wrap.css') app.connect('env-check-consistency', patch_pairindextypes) - app.connect('doctree-resolved', process_audit_events) - app.connect('env-merge-info', audit_events_merge) - app.connect('env-purge-doc', audit_events_purge) return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/static/changelog_search.js b/Doc/tools/static/changelog_search.js index c881a9bd..0a77c0d7 100644 --- a/Doc/tools/static/changelog_search.js +++ b/Doc/tools/static/changelog_search.js @@ -1,53 +1,59 @@ -$(document).ready(function() { - // add the search form and bind the events - $('h1').after([ - '

Filter entries by content:', - '', - '

' - ].join('\n')); +document.addEventListener("DOMContentLoaded", function () { + // add the search form and bind the events + document + .querySelector("h1") + .insertAdjacentHTML( + "afterend", + [ + "

Filter entries by content:", + '', + '

', + ].join("\n"), + ); - function dofilter() { - try { - var query = new RegExp($('#searchbox').val(), 'i'); + function doFilter() { + let query; + try { + query = new RegExp(document.querySelector("#searchbox").value, "i"); + } catch (e) { + return; // not a valid regex (yet) + } + // find headers for the versions (What's new in Python X.Y.Z?) + const h2s = document.querySelectorAll("#changelog h2"); + for (const h2 of h2s) { + let sections_found = 0; + // find headers for the sections (Core, Library, etc.) + const h3s = h2.parentNode.querySelectorAll("h3"); + for (const h3 of h3s) { + let entries_found = 0; + // find all the entries + const lis = h3.parentNode.querySelectorAll("li"); + for (let li of lis) { + // check if the query matches the entry + if (query.test(li.textContent)) { + li.style.display = "block"; + entries_found++; + } else { + li.style.display = "none"; + } } - catch (e) { - return; // not a valid regex (yet) + // if there are entries, show the section, otherwise hide it + if (entries_found > 0) { + h3.parentNode.style.display = "block"; + sections_found++; + } else { + h3.parentNode.style.display = "none"; } - // find headers for the versions (What's new in Python X.Y.Z?) - $('#changelog h2').each(function(index1, h2) { - var h2_parent = $(h2).parent(); - var sections_found = 0; - // find headers for the sections (Core, Library, etc.) - h2_parent.find('h3').each(function(index2, h3) { - var h3_parent = $(h3).parent(); - var entries_found = 0; - // find all the entries - h3_parent.find('li').each(function(index3, li) { - var li = $(li); - // check if the query matches the entry - if (query.test(li.text())) { - li.show(); - entries_found++; - } - else { - li.hide(); - } - }); - // if there are entries, show the section, otherwise hide it - if (entries_found > 0) { - h3_parent.show(); - sections_found++; - } - else { - h3_parent.hide(); - } - }); - if (sections_found > 0) - h2_parent.show(); - else - h2_parent.hide(); - }); + } + if (sections_found > 0) { + h2.parentNode.style.display = "block"; + } else { + h2.parentNode.style.display = "none"; + } } - $('#searchbox').keyup(dofilter); - $('#searchbox-submit').click(dofilter); + } + document.querySelector("#searchbox").addEventListener("keyup", doFilter); + document + .querySelector("#searchbox-submit") + .addEventListener("click", doFilter); }); diff --git a/Doc/tools/static/glossary_search.js b/Doc/tools/static/glossary_search.js new file mode 100644 index 00000000..13d728dc --- /dev/null +++ b/Doc/tools/static/glossary_search.js @@ -0,0 +1,47 @@ +"use strict"; + +const GLOSSARY_PAGE = "glossary.html"; + +const glossary_search = async () => { + const response = await fetch("_static/glossary.json"); + if (!response.ok) { + throw new Error("Failed to fetch glossary.json"); + } + const glossary = await response.json(); + + const params = new URLSearchParams(document.location.search).get("q"); + if (!params) { + return; + } + + const searchParam = params.toLowerCase(); + const glossaryItem = glossary[searchParam]; + if (!glossaryItem) { + return; + } + + // set up the title text with a link to the glossary page + const glossaryTitle = document.getElementById("glossary-title"); + glossaryTitle.textContent = "Glossary: " + glossaryItem.title; + const linkTarget = searchParam.replace(/ /g, "-"); + glossaryTitle.href = GLOSSARY_PAGE + "#term-" + linkTarget; + + // rewrite any anchor links (to other glossary terms) + // to have a full reference to the glossary page + const glossaryBody = document.getElementById("glossary-body"); + glossaryBody.innerHTML = glossaryItem.body; + const anchorLinks = glossaryBody.querySelectorAll('a[href^="#"]'); + anchorLinks.forEach(function (link) { + const currentUrl = link.getAttribute("href"); + link.href = GLOSSARY_PAGE + currentUrl; + }); + + const glossaryResult = document.getElementById("glossary-result"); + glossaryResult.style.display = ""; +}; + +if (document.readyState !== "loading") { + glossary_search().catch(console.error); +} else { + document.addEventListener("DOMContentLoaded", glossary_search); +} diff --git a/Doc/tools/static/rtd_switcher.js b/Doc/tools/static/rtd_switcher.js new file mode 100644 index 00000000..2bf01a00 --- /dev/null +++ b/Doc/tools/static/rtd_switcher.js @@ -0,0 +1,55 @@ + function onSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function(event) { + const config = event.detail.data() + const versionSelect = ` + + `; + + // Prepend the current language to the options on the selector + let languages = config.projects.translations.concat(config.projects.current); + languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name)); + + const languageSelect = ` + + `; + + // Query all the placeholders because there are different ones for Desktop/Mobile + const versionPlaceholders = document.querySelectorAll(".version_switcher_placeholder"); + for (placeholder of versionPlaceholders) { + placeholder.innerHTML = versionSelect; + let selectElement = placeholder.querySelector("select"); + selectElement.addEventListener("change", onSwitch); + } + + const languagePlaceholders = document.querySelectorAll(".language_switcher_placeholder"); + for (placeholder of languagePlaceholders) { + placeholder.innerHTML = languageSelect; + let selectElement = placeholder.querySelector("select"); + selectElement.addEventListener("change", onSwitch); + } + }); diff --git a/Doc/tools/static/sidebar-wrap.css b/Doc/tools/static/sidebar-wrap.css new file mode 100644 index 00000000..0a80f516 --- /dev/null +++ b/Doc/tools/static/sidebar-wrap.css @@ -0,0 +1,6 @@ +div.sphinxsidebarwrapper { + overflow-x: scroll; +} +div.sphinxsidebarwrapper li code { + overflow-wrap: normal; +} diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index 7920e061..45ec436f 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -1,64 +1,75 @@ {% extends "layout.html" %} -{% set title = 'Download' %} +{% set title = _('Download') %} {% if daily is defined %} - {% set dlbase = pathto('archives', 1) %} + {% set dl_base = pathto('archives', resource=True) %} + {% set dl_version = version %} {% else %} {# The link below returns HTTP 404 until the first related alpha release. This is expected; use daily documentation builds for CPython development. #} - {% set dlbase = 'https://docs.python.org/ftp/python/doc/' + release %} + {% set dl_base = 'https://www.python.org/ftp/python/doc/' + release %} + {% set dl_version = release %} {% endif %} {% block body %} -

Download Python {{ release }} Documentation

+

{% trans %}Download Python {{ dl_version }} Documentation{% endtrans %}

-{% if last_updated %}

Last updated on: {{ last_updated }}.

{% endif %} +{% if last_updated %}

{% trans %}Last updated on: {{ last_updated }}.{% endtrans %}

{% endif %} -

To download an archive containing all the documents for this version of -Python in one of various formats, follow one of links in this table.

+

{% trans %}To download an archive containing all the documents for this version of +Python in one of various formats, follow one of links in this table.{% endtrans %}

- - - - + + + + - - - + + + + - - - + + + + - - - + + + + - - + + + + + + + +
FormatPacked as .zipPacked as .tar.bz2
PDF (US-Letter paper size)Download (ca. 13 MiB)Download (ca. 13 MiB)
{% trans %}Format{% endtrans %}{% trans %}Packed as .zip{% endtrans %}{% trans %}Packed as .tar.bz2{% endtrans %}
PDF (A4 paper size)Download (ca. 13 MiB)Download (ca. 13 MiB)
{% trans %}PDF{% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}
HTMLDownload (ca. 9 MiB)Download (ca. 6 MiB)
{% trans %}HTML{% endtrans %}{% trans download_size="13" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="8" %}Download (ca. {{ download_size }} MiB){% endtrans %}
Plain TextDownload (ca. 3 MiB)Download (ca. 2 MiB)
{% trans %}Plain text{% endtrans %}{% trans download_size="4" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="3" %}Download (ca. {{ download_size }} MiB){% endtrans %}
EPUBDownload (ca. 5 MiB)
{% trans %}Texinfo{% endtrans %}{% trans download_size="9" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="7" %}Download (ca. {{ download_size }} MiB){% endtrans %}
{% trans %}EPUB{% endtrans %}{% trans download_size="6" %}Download (ca. {{ download_size }} MiB){% endtrans %}
-

These archives contain all the content in the documentation.

+

{% trans %}These archives contain all the content in the documentation.{% endtrans %}

-

Unpacking

+

{% trans %}Unpacking{% endtrans %}

-

Unix users should download the .tar.bz2 archives; these are bzipped tar +

{% trans %}Unix users should download the .tar.bz2 archives; these are bzipped tar archives and can be handled in the usual way using tar and the bzip2 -program. The InfoZIP unzip program can be +program. The Info-ZIP unzip program can be used to handle the ZIP archives if desired. The .tar.bz2 archives provide the -best compression and fastest download times.

+best compression and fastest download times.{% endtrans %}

-

Windows users can use the ZIP archives since those are customary on that -platform. These are created on Unix using the InfoZIP zip program.

+

{% trans %}Windows users can use the ZIP archives since those are customary on that +platform. These are created on Unix using the Info-ZIP zip program.{% endtrans %}

-

Problems

+

{% trans %}Problems{% endtrans %}

-

If you have comments or suggestions for the Python documentation, please send -email to docs@python.org.

+

{% trans %}If you have comments or suggestions for the Python documentation, please send +email to docs@python.org.{% endtrans %}

{% endblock %} diff --git a/Doc/tools/templates/dummy.html b/Doc/tools/templates/dummy.html index bab4aaeb..49c2a71a 100644 --- a/Doc/tools/templates/dummy.html +++ b/Doc/tools/templates/dummy.html @@ -9,6 +9,16 @@ In extensions/pyspecific.py: In extensions/c_annotations.py: +{% trans %}Part of the{% endtrans %} +{% trans %}Limited API{% endtrans %} +{% trans %}Stable ABI{% endtrans %} +{% trans %}(as an opaque struct){% endtrans %} +{% trans %}(including all members){% endtrans %} +{% trans %}since version %s{% endtrans %} +{% trans %}(Only some members are part of the stable ABI.){% endtrans %} +{% trans %}This is{% endtrans %} +{% trans %}Unstable API{% endtrans %} +{% trans %}. It may change without warning in minor releases.{% endtrans %} {% trans %}Return value: Always NULL.{% endtrans %} {% trans %}Return value: New reference.{% endtrans %} {% trans %}Return value: Borrowed reference.{% endtrans %} diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index 1e3ab7cf..2686f48d 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -7,62 +7,64 @@

{% trans %}Welcome! This is the official documentation for Python {{ release }}.{% endtrans %}

-

{% trans %}Parts of the documentation:{% endtrans %}

+

{% trans %}Documentation sections:{% endtrans %}

+ {% trans whatsnew_index=pathto("whatsnew/index") %}Or all "What's new" documents since Python 2.0{% endtrans %}

- - - + {% trans %}Start here: a tour of Python's syntax and features{% endtrans %}

+ + + + {% trans %}In-depth topic manuals{% endtrans %}

- - - - + + + + + {% trans %}Frequently asked questions (with answers!){% endtrans %}

+
-

{% trans %}Indices and tables:{% endtrans %}

+

{% trans %}Indices, glossary, and search:{% endtrans %}

- - + + + {% trans %}Terms explained{% endtrans %}

- + {% trans %}Search this documentation{% endtrans %}

+
-

{% trans %}Meta information:{% endtrans %}

+

{% trans %}Project information:{% endtrans %}

- - - + + + - + - +
{% endblock %} diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index 9498b2cc..b09fd21a 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -26,6 +26,9 @@ {% endblock %} {% block extrahead %} + {% if builder == "html" and enable_analytics %} + + {% endif %} {% if builder != "htmlhelp" %} {% if pagename == 'whatsnew/changelog' and not embedded %} @@ -41,4 +44,9 @@ {{ "}" }} {{ super() }} + +{%- if not embedded %} + + +{%- endif %} {% endblock %} diff --git a/Doc/tools/templates/search.html b/Doc/tools/templates/search.html index 85297446..6ddac5f8 100644 --- a/Doc/tools/templates/search.html +++ b/Doc/tools/templates/search.html @@ -2,61 +2,16 @@ {% block extrahead %} {{ super() }} - + +{% endblock %} +{% block searchresults %} +
+ {# For glossary_search.js #} + +
{% endblock %} diff --git a/Doc/tutorial/appendix.rst b/Doc/tutorial/appendix.rst index 588591fc..6a1611af 100644 --- a/Doc/tutorial/appendix.rst +++ b/Doc/tutorial/appendix.rst @@ -10,6 +10,28 @@ Appendix Interactive Mode ================ +There are two variants of the interactive :term:`REPL`. The classic +basic interpreter is supported on all platforms with minimal line +control capabilities. + +On Windows, or Unix-like systems with :mod:`curses` support, +a new interactive shell is used by default. +This one supports color, multiline editing, history browsing, and +paste mode. To disable color, see :ref:`using-on-controlling-color` for +details. Function keys provide some additional functionality. +:kbd:`F1` enters the interactive help browser :mod:`pydoc`. +:kbd:`F2` allows for browsing command-line history with neither output nor the +:term:`>>>` and :term:`...` prompts. :kbd:`F3` enters "paste mode", which +makes pasting larger blocks of code easier. Press :kbd:`F3` to return to +the regular prompt. + +When using the new interactive shell, exit the shell by typing :kbd:`exit` +or :kbd:`quit`. Adding call parentheses after those commands is not +required. + +If the new interactive shell is not desired, it can be disabled via +the :envvar:`PYTHON_BASIC_REPL` environment variable. + .. _tut-error: Error Handling @@ -20,7 +42,7 @@ In interactive mode, it then returns to the primary prompt; when input came from a file, it exits with a nonzero exit status after printing the stack trace. (Exceptions handled by an :keyword:`except` clause in a :keyword:`try` statement are not errors in this context.) Some errors are unconditionally fatal and -cause an exit with a nonzero exit; this applies to internal inconsistencies and +cause an exit with a nonzero exit status; this applies to internal inconsistencies and some cases of running out of memory. All error messages are written to the standard error stream; normal output from executed commands is written to standard output. @@ -40,7 +62,7 @@ Executable Python Scripts On BSD'ish Unix systems, Python scripts can be made directly executable, like shell scripts, by putting the line :: - #!/usr/bin/env python3.5 + #!/usr/bin/env python3 (assuming that the interpreter is on the user's :envvar:`PATH`) at the beginning of the script and giving the file an executable mode. The ``#!`` must be the @@ -107,7 +129,7 @@ of your user site-packages directory. Start Python and run this code:: >>> import site >>> site.getusersitepackages() - '/home/user/.local/lib/python3.5/site-packages' + '/home/user/.local/lib/python3.x/site-packages' Now you can create a file named :file:`usercustomize.py` in that directory and put anything you want in it. It will affect every invocation of Python, unless diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 7b92e1a5..49256896 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -276,8 +276,8 @@ definition looked like this:: then ``MyClass.i`` and ``MyClass.f`` are valid attribute references, returning an integer and a function object, respectively. Class attributes can also be assigned to, so you can change the value of ``MyClass.i`` by assignment. -:attr:`!__doc__` is also a valid attribute, returning the docstring belonging to -the class: ``"A simple example class"``. +:attr:`~type.__doc__` is also a valid attribute, returning the docstring +belonging to the class: ``"A simple example class"``. Class *instantiation* uses function notation. Just pretend that the class object is a parameterless function that returns a new instance of the class. @@ -338,11 +338,7 @@ code will print the value ``16``, without leaving a trace:: del x.counter The other kind of instance attribute reference is a *method*. A method is a -function that "belongs to" an object. (In Python, the term method is not unique -to class instances: other object types can have methods as well. For example, -list objects have methods called append, insert, remove, sort, and so on. -However, in the following discussion, we'll use the term method exclusively to -mean methods of class instance objects, unless explicitly stated otherwise.) +function that "belongs to" an object. .. index:: pair: object; method @@ -386,12 +382,11 @@ general, calling a method with a list of *n* arguments is equivalent to calling the corresponding function with an argument list that is created by inserting the method's instance object before the first argument. -If you still don't understand how methods work, a look at the implementation can -perhaps clarify matters. When a non-data attribute of an instance is -referenced, the instance's class is searched. If the name denotes a valid class -attribute that is a function object, a method object is created by packing -(pointers to) the instance object and the function object just found together in -an abstract object: this is the method object. When the method object is called +In general, methods work as follows. When a non-data attribute +of an instance is referenced, the instance's class is searched. +If the name denotes a valid class attribute that is a function object, +references to both the instance object and the function object +are packed into a method object. When the method object is called with an argument list, a new argument list is constructed from the instance object and the argument list, and the function object is called with this new argument list. @@ -666,7 +661,7 @@ class, that calls each parent only once, and that is monotonic (meaning that a class can be subclassed without affecting the precedence order of its parents). Taken together, these properties make it possible to design reliable and extensible classes with multiple inheritance. For more detail, see -https://www.python.org/download/releases/2.3/mro/. +:ref:`python_2.3_mro`. .. _tut-private: @@ -693,6 +688,11 @@ current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class. +.. seealso:: + + The :ref:`private name mangling specifications ` + for details and special cases. + Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls. For example:: @@ -769,8 +769,10 @@ data from a string buffer instead, and pass it as an argument. or arithmetic operators, and assigning such a "pseudo-file" to sys.stdin will not cause the interpreter to read further input from it.) -Instance method objects have attributes, too: ``m.__self__`` is the instance -object with the method :meth:`!m`, and ``m.__func__`` is the function object +:ref:`Instance method objects ` have attributes, too: +:attr:`m.__self__ ` is the instance +object with the method :meth:`!m`, and :attr:`m.__func__ ` is +the :ref:`function object ` corresponding to the method. @@ -930,6 +932,6 @@ Examples:: .. [#] Except for one thing. Module objects have a secret read-only attribute called :attr:`~object.__dict__` which returns the dictionary used to implement the module's - namespace; the name :attr:`~object.__dict__` is an attribute but not a global name. + namespace; the name ``__dict__`` is an attribute but not a global name. Obviously, using this violates the abstraction of namespace implementation, and should be restricted to things like post-mortem debuggers. diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index aa9caa10..8261bbdb 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -61,7 +61,7 @@ they appear in the sequence. For example (no pun intended): :: >>> # Measure some strings: - ... words = ['cat', 'window', 'defenestrate'] + >>> words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print(w, len(w)) ... @@ -160,21 +160,60 @@ arguments. In chapter :ref:`tut-structures`, we will discuss in more detail abo .. _tut-break: -:keyword:`!break` and :keyword:`!continue` Statements, and :keyword:`!else` Clauses on Loops -============================================================================================ +:keyword:`!break` and :keyword:`!continue` Statements +===================================================== The :keyword:`break` statement breaks out of the innermost enclosing -:keyword:`for` or :keyword:`while` loop. +:keyword:`for` or :keyword:`while` loop:: -A :keyword:`!for` or :keyword:`!while` loop can include an :keyword:`!else` clause. + >>> for n in range(2, 10): + ... for x in range(2, n): + ... if n % x == 0: + ... print(f"{n} equals {x} * {n//x}") + ... break + ... + 4 equals 2 * 2 + 6 equals 2 * 3 + 8 equals 2 * 4 + 9 equals 3 * 3 + +The :keyword:`continue` statement continues with the next +iteration of the loop:: + + >>> for num in range(2, 10): + ... if num % 2 == 0: + ... print(f"Found an even number {num}") + ... continue + ... print(f"Found an odd number {num}") + ... + Found an even number 2 + Found an odd number 3 + Found an even number 4 + Found an odd number 5 + Found an even number 6 + Found an odd number 7 + Found an even number 8 + Found an odd number 9 + +.. _tut-for-else: +.. _break-and-continue-statements-and-else-clauses-on-loops: + +:keyword:`!else` Clauses on Loops +================================= + +In a :keyword:`!for` or :keyword:`!while` loop the :keyword:`!break` statement +may be paired with an :keyword:`!else` clause. If the loop finishes without +executing the :keyword:`!break`, the :keyword:`!else` clause executes. In a :keyword:`for` loop, the :keyword:`!else` clause is executed -after the loop reaches its final iteration. +after the loop finishes its final iteration, that is, if no break occurred. In a :keyword:`while` loop, it's executed after the loop's condition becomes false. -In either kind of loop, the :keyword:`!else` clause is **not** executed -if the loop was terminated by a :keyword:`break`. +In either kind of loop, the :keyword:`!else` clause is **not** executed if the +loop was terminated by a :keyword:`break`. Of course, other ways of ending the +loop early, such as a :keyword:`return` or a raised exception, will also skip +execution of the :keyword:`else` clause. This is exemplified in the following :keyword:`!for` loop, which searches for prime numbers:: @@ -198,32 +237,19 @@ which searches for prime numbers:: 9 equals 3 * 3 (Yes, this is the correct code. Look closely: the ``else`` clause belongs to -the :keyword:`for` loop, **not** the :keyword:`if` statement.) +the ``for`` loop, **not** the ``if`` statement.) -When used with a loop, the ``else`` clause has more in common with the -``else`` clause of a :keyword:`try` statement than it does with that of -:keyword:`if` statements: a :keyword:`try` statement's ``else`` clause runs -when no exception occurs, and a loop's ``else`` clause runs when no ``break`` -occurs. For more on the :keyword:`!try` statement and exceptions, see -:ref:`tut-handling`. - -The :keyword:`continue` statement, also borrowed from C, continues with the next -iteration of the loop:: +One way to think of the else clause is to imagine it paired with the ``if`` +inside the loop. As the loop executes, it will run a sequence like +if/if/if/else. The ``if`` is inside the loop, encountered a number of times. If +the condition is ever true, a ``break`` will happen. If the condition is never +true, the ``else`` clause outside the loop will execute. - >>> for num in range(2, 10): - ... if num % 2 == 0: - ... print("Found an even number", num) - ... continue - ... print("Found an odd number", num) - ... - Found an even number 2 - Found an odd number 3 - Found an even number 4 - Found an odd number 5 - Found an even number 6 - Found an odd number 7 - Found an even number 8 - Found an odd number 9 +When used with a loop, the ``else`` clause has more in common with the ``else`` +clause of a :keyword:`try` statement than it does with that of ``if`` +statements: a ``try`` statement's ``else`` clause runs when no exception +occurs, and a loop's ``else`` clause runs when no ``break`` occurs. For more on +the ``try`` statement and exceptions, see :ref:`tut-handling`. .. _tut-pass: @@ -436,8 +462,8 @@ Defining Functions We can create a function that writes the Fibonacci series to an arbitrary boundary:: - >>> def fib(n): # write Fibonacci series up to n - ... """Print a Fibonacci series up to n.""" + >>> def fib(n): # write Fibonacci series less than n + ... """Print a Fibonacci series less than n.""" ... a, b = 0, 1 ... while a < n: ... print(a, end=' ') @@ -445,7 +471,7 @@ boundary:: ... print() ... >>> # Now call the function we just defined: - ... fib(2000) + >>> fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 .. index:: @@ -559,10 +585,10 @@ defined to allow. For example:: def ask_ok(prompt, retries=4, reminder='Please try again!'): while True: - ok = input(prompt) - if ok in ('y', 'ye', 'yes'): + reply = input(prompt) + if reply in {'y', 'ye', 'yes'}: return True - if ok in ('n', 'no', 'nop', 'nope'): + if reply in {'n', 'no', 'nop', 'nope'}: return False retries = retries - 1 if retries < 0: @@ -807,7 +833,7 @@ parameters as there is a ``/`` in the function definition:: File "", line 1, in TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg' -The third function ``kwd_only_args`` only allows keyword arguments as indicated +The third function ``kwd_only_arg`` only allows keyword arguments as indicated by a ``*`` in the function definition:: >>> kwd_only_arg(3) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 87614d08..263b0c2e 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -19,13 +19,13 @@ objects: .. method:: list.append(x) :noindex: - Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. + Add an item to the end of the list. Similar to ``a[len(a):] = [x]``. .. method:: list.extend(iterable) :noindex: - Extend the list by appending all the items from the iterable. Equivalent to + Extend the list by appending all the items from the iterable. Similar to ``a[len(a):] = iterable``. @@ -48,16 +48,15 @@ objects: :noindex: Remove the item at the given position in the list, and return it. If no index - is specified, ``a.pop()`` removes and returns the last item in the list. (The - square brackets around the *i* in the method signature denote that the parameter - is optional, not that you should type square brackets at that position. You - will see this notation frequently in the Python Library Reference.) + is specified, ``a.pop()`` removes and returns the last item in the list. + It raises an :exc:`IndexError` if the list is empty or the index is + outside the list range. .. method:: list.clear() :noindex: - Remove all items from the list. Equivalent to ``del a[:]``. + Remove all items from the list. Similar to ``del a[:]``. .. method:: list.index(x[, start[, end]]) @@ -94,7 +93,7 @@ objects: .. method:: list.copy() :noindex: - Return a shallow copy of the list. Equivalent to ``a[:]``. + Return a shallow copy of the list. Similar to ``a[:]``. An example that uses most of the list methods:: @@ -127,7 +126,7 @@ Python. Another thing you might notice is that not all data can be sorted or compared. For instance, ``[None, 'hello', 10]`` doesn't sort because -integers can't be compared to strings and *None* can't be compared to +integers can't be compared to strings and ``None`` can't be compared to other types. Also, there are some types that don't have a defined ordering relation. For example, ``3+4j < 5+7j`` isn't a valid comparison. @@ -143,8 +142,8 @@ Using Lists as Stacks The list methods make it very easy to use a list as a stack, where the last element added is the first element retrieved ("last-in, first-out"). To add an -item to the top of the stack, use :meth:`~list.append`. To retrieve an item from the -top of the stack, use :meth:`~list.pop` without an explicit index. For example:: +item to the top of the stack, use :meth:`!~list.append`. To retrieve an item from the +top of the stack, use :meth:`!~list.pop` without an explicit index. For example:: >>> stack = [3, 4, 5] >>> stack.append(6) @@ -341,7 +340,7 @@ The :keyword:`!del` statement ============================= There is a way to remove an item from a list given its index instead of its -value: the :keyword:`del` statement. This differs from the :meth:`~list.pop` method +value: the :keyword:`del` statement. This differs from the :meth:`!~list.pop` method which returns a value. The :keyword:`!del` statement can also be used to remove slices from a list or clear the entire list (which we did earlier by assignment of an empty list to the slice). For example:: @@ -384,16 +383,16 @@ A tuple consists of a number of values separated by commas, for instance:: >>> t (12345, 54321, 'hello!') >>> # Tuples may be nested: - ... u = t, (1, 2, 3, 4, 5) + >>> u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) >>> # Tuples are immutable: - ... t[0] = 88888 + >>> t[0] = 88888 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment >>> # but they can contain mutable objects: - ... v = ([1, 2, 3], [3, 2, 1]) + >>> v = ([1, 2, 3], [3, 2, 1]) >>> v ([1, 2, 3], [3, 2, 1]) @@ -466,7 +465,7 @@ Here is a brief demonstration:: False >>> # Demonstrate set operations on unique letters from two words - ... + >>> >>> a = set('abracadabra') >>> b = set('alacazam') >>> a # unique letters in a @@ -501,8 +500,8 @@ any immutable type; strings and numbers can always be keys. Tuples can be used as keys if they contain only strings, numbers, or tuples; if a tuple contains any mutable object either directly or indirectly, it cannot be used as a key. You can't use lists as keys, since lists can be modified in place using index -assignments, slice assignments, or methods like :meth:`~list.append` and -:meth:`~list.extend`. +assignments, slice assignments, or methods like :meth:`!~list.append` and +:meth:`!~list.extend`. It is best to think of a dictionary as a set of *key: value* pairs, with the requirement that the keys are unique (within one dictionary). A pair of diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 1ec59767..c01cb8c1 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -20,12 +20,12 @@ complaint you get while you are still learning Python:: >>> while True print('Hello world') File "", line 1 while True print('Hello world') - ^ + ^^^^^ SyntaxError: invalid syntax -The parser repeats the offending line and displays a little 'arrow' pointing at -the earliest point in the line where the error was detected. The error is -caused by (or at least detected at) the token *preceding* the arrow: in the +The parser repeats the offending line and displays little arrows pointing +at the token in the line where the error was detected. The error may be +caused by the absence of a token *before* the indicated token. In the example, the error is detected at the function :func:`print`, since a colon (``':'``) is missing before it. File name and line number are printed so you know where to look in case the input came from a script. @@ -45,14 +45,20 @@ programs, however, and result in error messages as shown here:: >>> 10 * (1/0) Traceback (most recent call last): File "", line 1, in + 10 * (1/0) + ~^~ ZeroDivisionError: division by zero >>> 4 + spam*3 Traceback (most recent call last): File "", line 1, in + 4 + spam*3 + ^^^^ NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "", line 1, in + '2' + 2 + ~~~~^~~ TypeError: can only concatenate str (not "int") to str The last line of the error message indicates what happened. Exceptions come in @@ -108,8 +114,7 @@ The :keyword:`try` statement works as follows. * If an exception occurs which does not match the exception named in the *except clause*, it is passed on to outer :keyword:`try` statements; if no handler is - found, it is an *unhandled exception* and execution stops with a message as - shown above. + found, it is an *unhandled exception* and execution stops with an error message. A :keyword:`try` statement may have more than one *except clause*, to specify handlers for different exceptions. At most one handler will be executed. @@ -120,9 +125,9 @@ may name multiple exceptions as a parenthesized tuple, for example:: ... except (RuntimeError, TypeError, NameError): ... pass -A class in an :keyword:`except` clause is compatible with an exception if it is -the same class or a base class thereof (but not the other way around --- an -*except clause* listing a derived class is not compatible with a base class). +A class in an :keyword:`except` clause matches exceptions which are instances of the +class itself or one of its derived classes (but not the other way around --- an +*except clause* listing a derived class does not match instances of its base classes). For example, the following code will print B, C, D in that order:: class B(Exception): @@ -253,6 +258,7 @@ exception to occur. For example:: >>> raise NameError('HiThere') Traceback (most recent call last): File "", line 1, in + raise NameError('HiThere') NameError: HiThere The sole argument to :keyword:`raise` indicates the exception to be raised. @@ -276,6 +282,7 @@ re-raise the exception:: An exception flew by! Traceback (most recent call last): File "", line 2, in + raise NameError('HiThere') NameError: HiThere @@ -295,12 +302,15 @@ message:: ... Traceback (most recent call last): File "", line 2, in + open("database.sqlite") + ~~~~^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [Errno 2] No such file or directory: 'database.sqlite' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 4, in + raise RuntimeError("unable to handle error") RuntimeError: unable to handle error To indicate that an exception is a direct consequence of another, the @@ -321,6 +331,8 @@ This can be useful when you are transforming exceptions. For example:: ... Traceback (most recent call last): File "", line 2, in + func() + ~~~~^^ File "", line 2, in func ConnectionError @@ -328,6 +340,7 @@ This can be useful when you are transforming exceptions. For example:: Traceback (most recent call last): File "", line 4, in + raise RuntimeError('Failed to open database') from exc RuntimeError: Failed to open database It also allows disabling automatic exception chaining using the ``from None`` @@ -340,6 +353,7 @@ idiom:: ... Traceback (most recent call last): File "", line 4, in + raise RuntimeError from None RuntimeError For more information about chaining mechanics, see :ref:`bltin-exceptions`. @@ -382,6 +396,7 @@ example:: Goodbye, world! Traceback (most recent call last): File "", line 2, in + raise KeyboardInterrupt KeyboardInterrupt If a :keyword:`finally` clause is present, the :keyword:`!finally` @@ -449,7 +464,11 @@ A more complicated example:: executing finally clause Traceback (most recent call last): File "", line 1, in + divide("2", "1") + ~~~~~~^^^^^^^^^^ File "", line 3, in divide + result = x / y + ~~^~~ TypeError: unsupported operand type(s) for /: 'str' and 'str' As you can see, the :keyword:`finally` clause is executed in any event. The @@ -512,8 +531,11 @@ caught like any other exception. :: >>> f() + Exception Group Traceback (most recent call last): | File "", line 1, in + | f() + | ~^^ | File "", line 3, in f - | ExceptionGroup: there were problems + | raise ExceptionGroup('there were problems', excs) + | ExceptionGroup: there were problems (2 sub-exceptions) +-+---------------- 1 ---------------- | OSError: error 1 +---------------- 2 ---------------- @@ -561,10 +583,15 @@ other clauses and eventually to be reraised. :: There were SystemErrors + Exception Group Traceback (most recent call last): | File "", line 2, in + | f() + | ~^^ | File "", line 2, in f - | ExceptionGroup: group1 + | raise ExceptionGroup( + | ...<12 lines>... + | ) + | ExceptionGroup: group1 (1 sub-exception) +-+---------------- 1 ---------------- - | ExceptionGroup: group2 + | ExceptionGroup: group2 (1 sub-exception) +-+---------------- 1 ---------------- | RecursionError: 4 +------------------------------------ @@ -608,6 +635,7 @@ includes all notes, in the order they were added, after the exception. :: ... Traceback (most recent call last): File "", line 2, in + raise TypeError('bad type') TypeError: bad type Add some information Add some more information @@ -631,23 +659,33 @@ exception in the group has a note indicating when this error has occurred. :: >>> raise ExceptionGroup('We have some problems', excs) + Exception Group Traceback (most recent call last): | File "", line 1, in + | raise ExceptionGroup('We have some problems', excs) | ExceptionGroup: We have some problems (3 sub-exceptions) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File "", line 3, in + | f() + | ~^^ | File "", line 2, in f + | raise OSError('operation failed') | OSError: operation failed | Happened in Iteration 1 +---------------- 2 ---------------- | Traceback (most recent call last): | File "", line 3, in + | f() + | ~^^ | File "", line 2, in f + | raise OSError('operation failed') | OSError: operation failed | Happened in Iteration 2 +---------------- 3 ---------------- | Traceback (most recent call last): | File "", line 3, in + | f() + | ~^^ | File "", line 2, in f + | raise OSError('operation failed') | OSError: operation failed | Happened in Iteration 3 +------------------------------------ diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst index b88055a4..dfe2d1d3 100644 --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -6,7 +6,7 @@ .. _tut-fp-issues: ************************************************** -Floating Point Arithmetic: Issues and Limitations +Floating-Point Arithmetic: Issues and Limitations ************************************************** .. sectionauthor:: Tim Peters @@ -88,7 +88,7 @@ the one with 17 significant digits, ``0.10000000000000001``. Starting with Python 3.1, Python (on most systems) is now able to choose the shortest of these and simply display ``0.1``. -Note that this is in the very nature of binary floating-point: this is not a bug +Note that this is in the very nature of binary floating point: this is not a bug in Python, and it is not a bug in your code either. You'll see the same kind of thing in all languages that support your hardware's floating-point arithmetic (although some languages may not *display* the difference by default, or in all @@ -137,7 +137,7 @@ the :func:`math.isclose` function can be useful for comparing inexact values: True Alternatively, the :func:`round` function can be used to compare rough -approximations:: +approximations: .. doctest:: @@ -148,13 +148,13 @@ Binary floating-point arithmetic holds many surprises like this. The problem with "0.1" is explained in precise detail below, in the "Representation Error" section. See `Examples of Floating Point Problems `_ for -a pleasant summary of how binary floating-point works and the kinds of +a pleasant summary of how binary floating point works and the kinds of problems commonly encountered in practice. Also see -`The Perils of Floating Point `_ +`The Perils of Floating Point `_ for a more complete account of other common surprises. As that says near the end, "there are no easy answers." Still, don't be unduly -wary of floating-point! The errors in Python float operations are inherited +wary of floating point! The errors in Python float operations are inherited from the floating-point hardware, and on most machines are on the order of no more than 1 part in 2\*\*53 per operation. That's more than adequate for most tasks, but you do need to keep in mind that it's not decimal arithmetic and @@ -230,7 +230,7 @@ accumulate to the point where they affect the final total: >>> sum([0.1] * 10) == 1.0 True -The :func:`math.fsum()` goes further and tracks all of the "lost digits" +The :func:`math.fsum` goes further and tracks all of the "lost digits" as values are added onto a running total so that the result has only a single rounding. This is slower than :func:`sum` but will be more accurate in uncommon cases where large magnitude inputs mostly cancel diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index fe9ca9cc..35b8c7cd 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -37,16 +37,23 @@ printing space-separated values. There are several ways to format output. * The :meth:`str.format` method of strings requires more manual effort. You'll still use ``{`` and ``}`` to mark where a variable will be substituted and can provide detailed formatting directives, - but you'll also need to provide the information to be formatted. + but you'll also need to provide the information to be formatted. In the following code + block there are two examples of how to format variables: + :: >>> yes_votes = 42_572_654 - >>> no_votes = 43_132_495 - >>> percentage = yes_votes / (yes_votes + no_votes) + >>> total_votes = 85_705_149 + >>> percentage = yes_votes / total_votes >>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) ' 42572654 YES votes 49.67%' + Notice how the ``yes_votes`` are padded with spaces and a negative sign only for negative numbers. + The example also prints ``percentage`` multiplied by 100, with 2 decimal + places and followed by a percent sign (see :ref:`formatspec` for details). + + * Finally, you can do all the string handling yourself by using string slicing and concatenation operations to create any layout you can imagine. The string type has some methods that perform useful operations for padding @@ -80,12 +87,12 @@ Some examples:: >>> print(s) The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: - ... hello = 'hello, world\n' + >>> hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # The argument to repr() may be any Python object: - ... repr((x, y, ('spam', 'eggs'))) + >>> repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" The :mod:`string` module contains a :class:`~string.Template` class that offers @@ -93,6 +100,13 @@ yet another way to substitute values into strings, using placeholders like ``$x`` and replacing them with values from a dictionary, but offers much less control of the formatting. +.. index:: + single: formatted string literal + single: interpolated string literal + single: string; formatted literal + single: string; interpolated literal + single: f-string + single: fstring .. _tut-f-strings: @@ -197,7 +211,12 @@ notation. :: Jack: 4098; Sjoerd: 4127; Dcab: 8637678 This is particularly useful in combination with the built-in function -:func:`vars`, which returns a dictionary containing all local variables. +:func:`vars`, which returns a dictionary containing all local variables:: + + >>> table = {k: str(v) for k, v in vars().items()} + >>> message = " ".join([f'{k}: ' + '{' + k +'};' for k in table.keys()]) + >>> print(message.format(**table)) + __name__: __main__; __doc__: None; __package__: None; __loader__: ... As an example, the following lines produce a tidily aligned set of columns giving integers and their squares and cubes:: @@ -267,9 +286,11 @@ left with zeros. It understands about plus and minus signs:: Old string formatting --------------------- -The % operator (modulo) can also be used for string formatting. Given ``'string' -% values``, instances of ``%`` in ``string`` are replaced with zero or more -elements of ``values``. This operation is commonly known as string +The % operator (modulo) can also be used for string formatting. +Given ``format % values`` (where *format* is a string), +``%`` conversion specifications in *format* are replaced with +zero or more elements of *values*. +This operation is commonly known as string interpolation. For example:: >>> import math diff --git a/Doc/tutorial/interactive.rst b/Doc/tutorial/interactive.rst index 0d3896a4..4e054c4e 100644 --- a/Doc/tutorial/interactive.rst +++ b/Doc/tutorial/interactive.rst @@ -51,4 +51,4 @@ bpython_. .. _GNU Readline: https://tiswww.case.edu/php/chet/readline/rltop.html .. _IPython: https://ipython.org/ -.. _bpython: https://www.bpython-interpreter.org/ +.. _bpython: https://bpython-interpreter.org/ diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index b71c6108..299b6c27 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -10,13 +10,13 @@ Using the Python Interpreter Invoking the Interpreter ======================== -The Python interpreter is usually installed as :file:`/usr/local/bin/python3.12` +The Python interpreter is usually installed as |usr_local_bin_python_x_dot_y_literal| on those machines where it is available; putting :file:`/usr/local/bin` in your Unix shell's search path makes it possible to start it by typing the command: .. code-block:: text - python3.12 + python3.13 to the shell. [#]_ Since the choice of the directory where the interpreter lives is an installation option, other places are possible; check with your local @@ -24,7 +24,7 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a popular alternative location.) On Windows machines where you have installed Python from the :ref:`Microsoft Store -`, the :file:`python3.12` command will be available. If you have +`, the |python_x_dot_y_literal| command will be available. If you have the :ref:`py.exe launcher ` installed, you can use the :file:`py` command. See :ref:`setting-envvars` for other ways to launch Python. @@ -97,8 +97,8 @@ before printing the first prompt: .. code-block:: shell-session - $ python3.12 - Python 3.12 (default, April 4 2022, 09:25:04) + $ python3.13 + Python 3.13 (default, April 4 2023, 09:25:04) [GCC 10.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 0fc75c7d..65e3b193 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -62,7 +62,7 @@ For example:: 20 >>> (50 - 5*6) / 4 5.0 - >>> 8 / 5 # division always returns a floating point number + >>> 8 / 5 # division always returns a floating-point number 1.6 The integer numbers (e.g. ``2``, ``4``, ``20``) have type :class:`int`, @@ -197,21 +197,19 @@ and workarounds. String literals can span multiple lines. One way is using triple-quotes: ``"""..."""`` or ``'''...'''``. End of lines are automatically included in the string, but it's possible to prevent this by adding a ``\`` at -the end of the line. The following example:: - - print("""\ +the end of the line. In the following example, the initial newline is not +included:: + + >>> print("""\ + ... Usage: thingy [OPTIONS] + ... -h Display this usage message + ... -H hostname Hostname to connect to + ... """) Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to - """) - -produces the following output (note that the initial newline is not included): - -.. code-block:: text - Usage: thingy [OPTIONS] - -h Display this usage message - -H hostname Hostname to connect to + >>> Strings can be concatenated (glued together) with the ``+`` operator, and repeated with ``*``:: @@ -405,13 +403,6 @@ indexed and sliced:: >>> squares[-3:] # slicing returns a new list [9, 16, 25] -All slice operations return a new list containing the requested elements. This -means that the following slice returns a -:ref:`shallow copy ` of the list:: - - >>> squares[:] - [1, 4, 9, 16, 25] - Lists also support operations like concatenation:: >>> squares + [36, 49, 64, 81, 100] @@ -428,13 +419,37 @@ type, i.e. it is possible to change their content:: [1, 8, 27, 64, 125] You can also add new items at the end of the list, by using -the :meth:`~list.append` *method* (we will see more about methods later):: +the :meth:`!list.append` *method* (we will see more about methods later):: >>> cubes.append(216) # add the cube of 6 >>> cubes.append(7 ** 3) # and the cube of 7 >>> cubes [1, 8, 27, 64, 125, 216, 343] +Simple assignment in Python never copies data. When you assign a list +to a variable, the variable refers to the *existing list*. +Any changes you make to the list through one variable will be seen +through all other variables that refer to it.:: + + >>> rgb = ["Red", "Green", "Blue"] + >>> rgba = rgb + >>> id(rgb) == id(rgba) # they reference the same object + True + >>> rgba.append("Alph") + >>> rgb + ["Red", "Green", "Blue", "Alph"] + +All slice operations return a new list containing the requested elements. This +means that the following slice returns a +:ref:`shallow copy ` of the list:: + + >>> correct_rgba = rgba[:] + >>> correct_rgba[-1] = "Alpha" + >>> correct_rgba + ["Red", "Green", "Blue", "Alpha"] + >>> rgba + ["Red", "Green", "Blue", "Alph"] + Assignment to slices is also possible, and this can even change the size of the list or clear it entirely:: @@ -480,12 +495,12 @@ First Steps Towards Programming Of course, we can use Python for more complicated tasks than adding two and two together. For instance, we can write an initial sub-sequence of the -`Fibonacci series `_ +`Fibonacci series `_ as follows:: >>> # Fibonacci series: - ... # the sum of two elements defines the next - ... a, b = 0, 1 + >>> # the sum of two elements defines the next + >>> a, b = 0, 1 >>> while a < 10: ... print(a) ... a, b = b, a+b @@ -527,7 +542,7 @@ This example introduces several new features. * The :func:`print` function writes the value of the argument(s) it is given. It differs from just writing the expression you want to write (as we did earlier in the calculator examples) in the way it handles multiple arguments, - floating point quantities, and strings. Strings are printed without quotes, + floating-point quantities, and strings. Strings are printed without quotes, and a space is inserted between items, so you can format things nicely, like this:: diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index bf9e8e0b..de7aa0e2 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -437,7 +437,8 @@ When importing the package, Python searches through the directories on ``sys.path`` looking for the package subdirectory. The :file:`__init__.py` files are required to make Python treat directories -containing the file as packages. This prevents directories with a common name, +containing the file as packages (unless using a :term:`namespace package`, a +relatively advanced feature). This prevents directories with a common name, such as ``string``, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, :file:`__init__.py` can just be an empty file, but it can also execute initialization code for the package or @@ -584,8 +585,9 @@ as the main module of a Python application must always use absolute imports. Packages in Multiple Directories -------------------------------- -Packages support one more special attribute, :attr:`__path__`. This is -initialized to be a list containing the name of the directory holding the +Packages support one more special attribute, :attr:`~module.__path__`. This is +initialized to be a :term:`sequence` of strings containing the name of the +directory holding the package's :file:`__init__.py` before the code in that file is executed. This variable can be modified; doing so affects future searches for modules and subpackages contained in the package. diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 6bae279c..e96e3431 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -15,7 +15,7 @@ operating system:: >>> import os >>> os.getcwd() # Return the current working directory - 'C:\\Python312' + 'C:\\Python313' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # Run the command mkdir in the system shell 0 @@ -138,7 +138,7 @@ Mathematics =========== The :mod:`math` module gives access to the underlying C library functions for -floating point math:: +floating-point math:: >>> import math >>> math.cos(math.pi / 4) @@ -153,7 +153,7 @@ The :mod:`random` module provides tools for making random selections:: 'apple' >>> random.sample(range(100), 10) # sampling without replacement [30, 83, 16, 4, 8, 81, 41, 50, 18, 33] - >>> random.random() # random float + >>> random.random() # random float from the interval [0.0, 1.0) 0.17970987693706186 >>> random.randrange(6) # random integer chosen from range(6) 4 diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index 33f311db..4f460b8e 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -279,7 +279,7 @@ applications include caching objects that are expensive to create:: Traceback (most recent call last): File "", line 1, in d['primary'] # entry was automatically removed - File "C:/python312/lib/weakref.py", line 46, in __getitem__ + File "C:/python313/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' @@ -293,7 +293,7 @@ Many data structure needs can be met with the built-in list type. However, sometimes there is a need for alternative implementations with different performance trade-offs. -The :mod:`array` module provides an :class:`~array.array()` object that is like +The :mod:`array` module provides an :class:`~array.array` object that is like a list that stores only homogeneous data and stores it more compactly. The following example shows an array of numbers stored as two byte unsigned binary numbers (typecode ``"H"``) rather than the usual 16 bytes per entry for regular @@ -306,7 +306,7 @@ lists of Python int objects:: >>> a[1:3] array('H', [10, 700]) -The :mod:`collections` module provides a :class:`~collections.deque()` object +The :mod:`collections` module provides a :class:`~collections.deque` object that is like a list with faster appends and pops from the left side but slower lookups in the middle. These objects are well suited for implementing queues and breadth first tree searches:: @@ -352,11 +352,11 @@ not want to run a full list sort:: .. _tut-decimal-fp: -Decimal Floating Point Arithmetic +Decimal Floating-Point Arithmetic ================================= The :mod:`decimal` module offers a :class:`~decimal.Decimal` datatype for -decimal floating point arithmetic. Compared to the built-in :class:`float` +decimal floating-point arithmetic. Compared to the built-in :class:`float` implementation of binary floating point, the class is especially helpful for * financial applications and other uses which require exact decimal diff --git a/Doc/tutorial/venv.rst b/Doc/tutorial/venv.rst index a6dead2e..91e4ce18 100644 --- a/Doc/tutorial/venv.rst +++ b/Doc/tutorial/venv.rst @@ -36,10 +36,10 @@ Creating Virtual Environments ============================= The module used to create and manage virtual environments is called -:mod:`venv`. :mod:`venv` will usually install the most recent version of -Python that you have available. If you have multiple versions of Python on your -system, you can select a specific Python version by running ``python3`` or -whichever version you want. +:mod:`venv`. :mod:`venv` will install the Python version from which +the command was run (as reported by the :option:`--version` option). +For instance, executing the command with ``python3.12`` will install +version 3.12. To create a virtual environment, decide upon a directory where you want to place it, and run the :mod:`venv` module as a script with the directory path:: diff --git a/Doc/using/android.rst b/Doc/using/android.rst new file mode 100644 index 00000000..957705f7 --- /dev/null +++ b/Doc/using/android.rst @@ -0,0 +1,65 @@ +.. _using-android: + +======================= +Using Python on Android +======================= + +Python on Android is unlike Python on desktop platforms. On a desktop platform, +Python is generally installed as a system resource that can be used by any user +of that computer. Users then interact with Python by running a :program:`python` +executable and entering commands at an interactive prompt, or by running a +Python script. + +On Android, there is no concept of installing as a system resource. The only unit +of software distribution is an "app". There is also no console where you could +run a :program:`python` executable, or interact with a Python REPL. + +As a result, the only way you can use Python on Android is in embedded mode – that +is, by writing a native Android application, embedding a Python interpreter +using ``libpython``, and invoking Python code using the :ref:`Python embedding +API `. The full Python interpreter, the standard library, and all +your Python code is then packaged into your app for its own private use. + +The Python standard library has some notable omissions and restrictions on +Android. See the :ref:`API availability guide ` for +details. + +Adding Python to an Android app +------------------------------- + +These instructions are only needed if you're planning to compile Python for +Android yourself. Most users should *not* need to do this. Instead, use one of +the following tools, which will provide a much easier experience: + +* `Briefcase `__, from the BeeWare project +* `Buildozer `__, from the Kivy project +* `Chaquopy `__ +* `pyqtdeploy `__ +* `Termux `__ + +If you're sure you want to do all of this manually, read on. You can use the +:source:`testbed app ` as a guide; each step below contains a +link to the relevant file. + +* Build Python by following the instructions in :source:`Android/README.md`. + +* Add code to your :source:`build.gradle ` + file to copy the following items into your project. All except your own Python + code can be copied from ``cross-build/HOST/prefix/lib``: + + * In your JNI libraries: + + * ``libpython*.*.so`` + * ``lib*_python.so`` (external libraries such as OpenSSL) + + * In your assets: + + * ``python*.*`` (the Python standard library) + * ``python*.*/site-packages`` (your own Python code) + +* Add code to your app to :source:`extract the assets to the filesystem + `. + +* Add code to your app to :source:`start Python in embedded mode + `. This will need to be C code + called via JNI. diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index bade3ca6..8f54a0fd 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ Command line When invoking Python, you may specify any of these options:: - python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args] + python [-bBdEhiIOPqRsSuvVWx?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -42,6 +42,7 @@ additional methods of invocation: * When called with standard input connected to a tty device, it prompts for commands and executes them until an EOF (an end-of-file character, you can produce that with :kbd:`Ctrl-D` on UNIX or :kbd:`Ctrl-Z, Enter` on Windows) is read. + For more on interactive mode, see :ref:`tut-interac`. * When called with a file name argument or with a file as standard input, it reads and executes a script from that file. * When called with a directory name argument, it reads and executes an @@ -59,7 +60,7 @@ all consecutive arguments will end up in :data:`sys.argv` -- note that the first element, subscript zero (``sys.argv[0]``), is a string reflecting the program's source. -.. cmdoption:: -c +.. option:: -c Execute the Python code in *command*. *command* can be one or more statements separated by newlines, with significant leading whitespace as in @@ -72,7 +73,7 @@ source. .. audit-event:: cpython.run_command command cmdoption-c -.. cmdoption:: -m +.. option:: -m Search :data:`sys.path` for the named module and execute its contents as the :mod:`__main__` module. @@ -103,7 +104,7 @@ source. :option:`-I` option can be used to run the script in isolated mode where :data:`sys.path` contains neither the current directory nor the user's - site-packages directory. All :envvar:`PYTHON*` environment variables are + site-packages directory. All ``PYTHON*`` environment variables are ignored, too. Many standard library modules contain code that is invoked on their execution @@ -161,7 +162,7 @@ source. :option:`-I` option can be used to run the script in isolated mode where :data:`sys.path` contains neither the script's directory nor the user's - site-packages directory. All :envvar:`PYTHON*` environment variables are + site-packages directory. All ``PYTHON*`` environment variables are ignored, too. .. audit-event:: cpython.run_file filename @@ -188,35 +189,35 @@ automatically enabled, if available on your platform (see Generic options ~~~~~~~~~~~~~~~ -.. cmdoption:: -? - -h - --help +.. option:: -? + -h + --help Print a short description of all command line options and corresponding environment variables and exit. -.. cmdoption:: --help-env +.. option:: --help-env Print a short description of Python-specific environment variables and exit. .. versionadded:: 3.11 -.. cmdoption:: --help-xoptions +.. option:: --help-xoptions Print a description of implementation-specific :option:`-X` options and exit. .. versionadded:: 3.11 -.. cmdoption:: --help-all +.. option:: --help-all Print complete usage information and exit. .. versionadded:: 3.11 -.. cmdoption:: -V - --version +.. option:: -V + --version Print the Python version number and exit. Example output could be: @@ -240,22 +241,23 @@ Generic options Miscellaneous options ~~~~~~~~~~~~~~~~~~~~~ -.. cmdoption:: -b +.. option:: -b - Issue a warning when comparing :class:`bytes` or :class:`bytearray` with - :class:`str` or :class:`bytes` with :class:`int`. Issue an error when the - option is given twice (:option:`!-bb`). + Issue a warning when converting :class:`bytes` or :class:`bytearray` to + :class:`str` without specifying encoding or comparing :class:`!bytes` or + :class:`!bytearray` with :class:`!str` or :class:`!bytes` with :class:`int`. + Issue an error when the option is given twice (:option:`!-bb`). .. versionchanged:: 3.5 - Affects comparisons of :class:`bytes` with :class:`int`. + Affects also comparisons of :class:`bytes` with :class:`int`. -.. cmdoption:: -B +.. option:: -B If given, Python won't try to write ``.pyc`` files on the import of source modules. See also :envvar:`PYTHONDONTWRITEBYTECODE`. -.. cmdoption:: --check-hash-based-pycs default|always|never +.. option:: --check-hash-based-pycs default|always|never Control the validation behavior of hash-based ``.pyc`` files. See :ref:`pyc-invalidation`. When set to ``default``, checked and unchecked @@ -269,7 +271,7 @@ Miscellaneous options option. -.. cmdoption:: -d +.. option:: -d Turn on parser debugging output (for expert only). See also the :envvar:`PYTHONDEBUG` environment variable. @@ -278,15 +280,15 @@ Miscellaneous options it's ignored. -.. cmdoption:: -E +.. option:: -E - Ignore all :envvar:`PYTHON*` environment variables, e.g. + Ignore all ``PYTHON*`` environment variables, e.g. :envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set. See also the :option:`-P` and :option:`-I` (isolated) options. -.. cmdoption:: -i +.. option:: -i When a script is passed as first argument or the :option:`-c` option is used, enter interactive mode after executing the script or the command, even when @@ -297,20 +299,20 @@ Miscellaneous options raises an exception. See also :envvar:`PYTHONINSPECT`. -.. cmdoption:: -I +.. option:: -I Run Python in isolated mode. This also implies :option:`-E`, :option:`-P` and :option:`-s` options. In isolated mode :data:`sys.path` contains neither the script's directory nor - the user's site-packages directory. All :envvar:`PYTHON*` environment + the user's site-packages directory. All ``PYTHON*`` environment variables are ignored, too. Further restrictions may be imposed to prevent the user from injecting malicious code. .. versionadded:: 3.4 -.. cmdoption:: -O +.. option:: -O Remove assert statements and any code conditional on the value of :const:`__debug__`. Augment the filename for compiled @@ -321,7 +323,7 @@ Miscellaneous options Modify ``.pyc`` filenames according to :pep:`488`. -.. cmdoption:: -OO +.. option:: -OO Do :option:`-O` and also discard docstrings. Augment the filename for compiled (:term:`bytecode`) files by adding ``.opt-2`` before the @@ -331,7 +333,7 @@ Miscellaneous options Modify ``.pyc`` filenames according to :pep:`488`. -.. cmdoption:: -P +.. option:: -P Don't prepend a potentially unsafe path to :data:`sys.path`: @@ -348,50 +350,52 @@ Miscellaneous options .. versionadded:: 3.11 -.. cmdoption:: -q +.. option:: -q Don't display the copyright and version messages even in interactive mode. .. versionadded:: 3.2 -.. cmdoption:: -R +.. option:: -R Turn on hash randomization. This option only has an effect if the :envvar:`PYTHONHASHSEED` environment variable is set to ``0``, since hash randomization is enabled by default. On previous versions of Python, this option turns on hash randomization, - so that the :meth:`__hash__` values of str and bytes objects + so that the :meth:`~object.__hash__` values of str and bytes objects are "salted" with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python. Hash randomization is intended to provide protection against a denial-of-service caused by carefully chosen inputs that exploit the worst - case performance of a dict construction, O(n\ :sup:`2`) complexity. See + case performance of a dict construction, *O*\ (*n*\ :sup:`2`) complexity. See http://ocert.org/advisories/ocert-2011-003.html for details. :envvar:`PYTHONHASHSEED` allows you to set a fixed value for the hash seed secret. + .. versionadded:: 3.2.3 + .. versionchanged:: 3.7 The option is no longer ignored. - .. versionadded:: 3.2.3 - -.. cmdoption:: -s +.. option:: -s Don't add the :data:`user site-packages directory ` to :data:`sys.path`. + See also :envvar:`PYTHONNOUSERSITE`. + .. seealso:: :pep:`370` -- Per user site-packages directory -.. cmdoption:: -S +.. option:: -S Disable the import of the module :mod:`site` and the site-dependent manipulations of :data:`sys.path` that it entails. Also disable these @@ -399,7 +403,7 @@ Miscellaneous options :func:`site.main` if you want them to be triggered). -.. cmdoption:: -u +.. option:: -u Force the stdout and stderr streams to be unbuffered. This option has no effect on the stdin stream. @@ -410,7 +414,7 @@ Miscellaneous options The text layer of the stdout and stderr streams now is unbuffered. -.. cmdoption:: -v +.. option:: -v Print a message each time a module is initialized, showing the place (filename or built-in module) from which it is loaded. When given twice @@ -425,7 +429,7 @@ Miscellaneous options .. _using-on-warnings: -.. cmdoption:: -W arg +.. option:: -W arg Warning control. Python's warning machinery by default prints warning messages to :data:`sys.stderr`. @@ -437,6 +441,7 @@ Miscellaneous options -Wdefault # Warn once per call location -Werror # Convert to exceptions -Walways # Warn every time + -Wall # Same as -Walways -Wmodule # Warn once per calling module -Wonce # Warn once per Python process -Wignore # Never warn @@ -484,120 +489,186 @@ Miscellaneous options details. -.. cmdoption:: -x +.. option:: -x Skip the first line of the source, allowing use of non-Unix forms of ``#!cmd``. This is intended for a DOS specific hack only. -.. cmdoption:: -X +.. option:: -X Reserved for various implementation-specific options. CPython currently defines the following possible values: * ``-X faulthandler`` to enable :mod:`faulthandler`. See also :envvar:`PYTHONFAULTHANDLER`. + + .. versionadded:: 3.3 + * ``-X showrefcount`` to output the total reference count and number of used memory blocks when the program finishes or after each statement in the interactive interpreter. This only works on :ref:`debug builds `. + + .. versionadded:: 3.4 + * ``-X tracemalloc`` to start tracing Python memory allocations using the :mod:`tracemalloc` module. By default, only the most recent frame is stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start tracing with a traceback limit of *NFRAME* frames. See :func:`tracemalloc.start` and :envvar:`PYTHONTRACEMALLOC` for more information. + + .. versionadded:: 3.4 + * ``-X int_max_str_digits`` configures the :ref:`integer string conversion length limitation `. See also :envvar:`PYTHONINTMAXSTRDIGITS`. + + .. versionadded:: 3.11 + * ``-X importtime`` to show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded application. Typical usage is ``python3 -X importtime -c 'import asyncio'``. See also :envvar:`PYTHONPROFILEIMPORTTIME`. + + .. versionadded:: 3.7 + * ``-X dev``: enable :ref:`Python Development Mode `, introducing additional runtime checks that are too expensive to be enabled by - default. + default. See also :envvar:`PYTHONDEVMODE`. + + .. versionadded:: 3.7 + * ``-X utf8`` enables the :ref:`Python UTF-8 Mode `. ``-X utf8=0`` explicitly disables :ref:`Python UTF-8 Mode ` (even when it would otherwise activate automatically). See also :envvar:`PYTHONUTF8`. + + .. versionadded:: 3.7 + * ``-X pycache_prefix=PATH`` enables writing ``.pyc`` files to a parallel tree rooted at the given directory instead of to the code tree. See also :envvar:`PYTHONPYCACHEPREFIX`. + + .. versionadded:: 3.8 + * ``-X warn_default_encoding`` issues a :class:`EncodingWarning` when the locale-specific default encoding is used for opening files. See also :envvar:`PYTHONWARNDEFAULTENCODING`. + + .. versionadded:: 3.10 + * ``-X no_debug_ranges`` disables the inclusion of the tables mapping extra location information (end line, start column offset and end column offset) to every instruction in code objects. This is useful when smaller code objects and pyc files are desired as well as suppressing the extra visual location indicators when the interpreter displays tracebacks. See also :envvar:`PYTHONNODEBUGRANGES`. + + .. versionadded:: 3.11 + * ``-X frozen_modules`` determines whether or not frozen modules are - ignored by the import machinery. A value of "on" means they get - imported and "off" means they are ignored. The default is "on" + ignored by the import machinery. A value of ``on`` means they get + imported and ``off`` means they are ignored. The default is ``on`` if this is an installed Python (the normal case). If it's under - development (running from the source tree) then the default is "off". - Note that the "importlib_bootstrap" and "importlib_bootstrap_external" - frozen modules are always used, even if this flag is set to "off". + development (running from the source tree) then the default is ``off``. + Note that the :mod:`!importlib_bootstrap` and + :mod:`!importlib_bootstrap_external` frozen modules are always used, even + if this flag is set to ``off``. See also :envvar:`PYTHON_FROZEN_MODULES`. + + .. versionadded:: 3.11 + * ``-X perf`` enables support for the Linux ``perf`` profiler. When this option is provided, the ``perf`` profiler will be able to report Python calls. This option is only available on some platforms and will do nothing if is not supported on the current system. The default value is "off". See also :envvar:`PYTHONPERFSUPPORT` and :ref:`perf_profiling`. - It also allows passing arbitrary values and retrieving them through the - :data:`sys._xoptions` dictionary. + .. versionadded:: 3.12 - .. versionchanged:: 3.2 - The :option:`-X` option was added. + * ``-X perf_jit`` enables support for the Linux ``perf`` profiler with DWARF + support. When this option is provided, the ``perf`` profiler will be able + to report Python calls using DWARF information. This option is only available on + some platforms and will do nothing if is not supported on the current + system. The default value is "off". See also :envvar:`PYTHON_PERF_JIT_SUPPORT` + and :ref:`perf_profiling`. - .. versionadded:: 3.3 - The ``-X faulthandler`` option. + .. versionadded:: 3.13 - .. versionadded:: 3.4 - The ``-X showrefcount`` and ``-X tracemalloc`` options. + * :samp:`-X cpu_count={n}` overrides :func:`os.cpu_count`, + :func:`os.process_cpu_count`, and :func:`multiprocessing.cpu_count`. + *n* must be greater than or equal to 1. + This option may be useful for users who need to limit CPU resources of a + container system. See also :envvar:`PYTHON_CPU_COUNT`. + If *n* is ``default``, nothing is overridden. - .. versionadded:: 3.6 - The ``-X showalloccount`` option. + .. versionadded:: 3.13 - .. versionadded:: 3.7 - The ``-X importtime``, ``-X dev`` and ``-X utf8`` options. + * :samp:`-X presite={package.module}` specifies a module that should be + imported before the :mod:`site` module is executed and before the + :mod:`__main__` module exists. Therefore, the imported module isn't + :mod:`__main__`. This can be used to execute code early during Python + initialization. Python needs to be :ref:`built in debug mode ` + for this option to exist. See also :envvar:`PYTHON_PRESITE`. - .. versionadded:: 3.8 - The ``-X pycache_prefix`` option. The ``-X dev`` option now logs - ``close()`` exceptions in :class:`io.IOBase` destructor. + .. versionadded:: 3.13 + + * :samp:`-X gil={0,1}` forces the GIL to be disabled or enabled, + respectively. Setting to ``0`` is only available in builds configured with + :option:`--disable-gil`. See also :envvar:`PYTHON_GIL` and + :ref:`whatsnew313-free-threaded-cpython`. + + .. versionadded:: 3.13 + + It also allows passing arbitrary values and retrieving them through the + :data:`sys._xoptions` dictionary. + + .. versionadded:: 3.2 .. versionchanged:: 3.9 - Using ``-X dev`` option, check *encoding* and *errors* arguments on - string encoding and decoding operations. + Removed the ``-X showalloccount`` option. - The ``-X showalloccount`` option has been removed. + .. versionchanged:: 3.10 + Removed the ``-X oldparser`` option. - .. versionadded:: 3.10 - The ``-X warn_default_encoding`` option. +.. _using-on-controlling-color: - .. deprecated-removed:: 3.9 3.10 - The ``-X oldparser`` option. +Controlling color +~~~~~~~~~~~~~~~~~ - .. versionadded:: 3.11 - The ``-X no_debug_ranges`` option. +The Python interpreter is configured by default to use colors to highlight +output in certain situations such as when displaying tracebacks. This +behavior can be controlled by setting different environment variables. - .. versionadded:: 3.11 - The ``-X frozen_modules`` option. +Setting the environment variable ``TERM`` to ``dumb`` will disable color. - .. versionadded:: 3.11 - The ``-X int_max_str_digits`` option. +If the |FORCE_COLOR|_ environment variable is set, then color will be +enabled regardless of the value of TERM. This is useful on CI systems which +aren’t terminals but can still display ANSI escape sequences. - .. versionadded:: 3.12 - The ``-X perf`` option. +If the |NO_COLOR|_ environment variable is set, Python will disable all color +in the output. This takes precedence over ``FORCE_COLOR``. + +All these environment variables are used also by other tools to control color +output. To control the color output only in the Python interpreter, the +:envvar:`PYTHON_COLORS` environment variable can be used. This variable takes +precedence over ``NO_COLOR``, which in turn takes precedence over +``FORCE_COLOR``. +.. Apparently this how you hack together a formatted link: + +.. |FORCE_COLOR| replace:: ``FORCE_COLOR`` +.. _FORCE_COLOR: https://force-color.org/ + +.. |NO_COLOR| replace:: ``NO_COLOR`` +.. _NO_COLOR: https://no-color.org/ Options you shouldn't use ~~~~~~~~~~~~~~~~~~~~~~~~~ -.. cmdoption:: -J +.. option:: -J Reserved for use by Jython_. @@ -716,6 +787,15 @@ conflict. This variable can also be modified by Python code using :data:`os.environ` to force inspect mode on program termination. + .. audit-event:: cpython.run_stdin "" "" + + .. versionchanged:: 3.12.5 (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) + Emits audit events. + + .. versionchanged:: 3.13 + Uses PyREPL if possible, in which case :envvar:`PYTHONSTARTUP` is + also executed. Emits audit events. + .. envvar:: PYTHONUNBUFFERED @@ -839,6 +919,7 @@ conflict. PYTHONWARNINGS=default # Warn once per call location PYTHONWARNINGS=error # Convert to exceptions PYTHONWARNINGS=always # Warn every time + PYTHONWARNINGS=all # Same as PYTHONWARNINGS=always PYTHONWARNINGS=module # Warn once per calling module PYTHONWARNINGS=once # Warn once per Python process PYTHONWARNINGS=ignore # Never warn @@ -851,9 +932,10 @@ conflict. If this environment variable is set to a non-empty string, :func:`faulthandler.enable` is called at startup: install a handler for - :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and - :const:`SIGILL` signals to dump the Python traceback. This is equivalent to - :option:`-X` ``faulthandler`` option. + :const:`~signal.SIGSEGV`, :const:`~signal.SIGFPE`, + :const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` and + :const:`~signal.SIGILL` signals to dump the Python traceback. + This is equivalent to :option:`-X` ``faulthandler`` option. .. versionadded:: 3.3 @@ -902,6 +984,9 @@ conflict. * ``pymalloc``: use the :ref:`pymalloc allocator ` for :c:macro:`PYMEM_DOMAIN_MEM` and :c:macro:`PYMEM_DOMAIN_OBJ` domains and use the :c:func:`malloc` function for the :c:macro:`PYMEM_DOMAIN_RAW` domain. + * ``mimalloc``: use the :ref:`mimalloc allocator ` for + :c:macro:`PYMEM_DOMAIN_MEM` and :c:macro:`PYMEM_DOMAIN_OBJ` domains and use + the :c:func:`malloc` function for the :c:macro:`PYMEM_DOMAIN_RAW` domain. Install :ref:`debug hooks `: @@ -909,12 +994,13 @@ conflict. allocators `. * ``malloc_debug``: same as ``malloc`` but also install debug hooks. * ``pymalloc_debug``: same as ``pymalloc`` but also install debug hooks. + * ``mimalloc_debug``: same as ``mimalloc`` but also install debug hooks. + + .. versionadded:: 3.6 .. versionchanged:: 3.7 Added the ``"default"`` allocator. - .. versionadded:: 3.6 - .. envvar:: PYTHONMALLOCSTATS @@ -939,7 +1025,7 @@ conflict. 'surrogatepass' are used. This may also be enabled at runtime with - :func:`sys._enablelegacywindowsfsencoding()`. + :func:`sys._enablelegacywindowsfsencoding`. .. availability:: Windows. @@ -1063,6 +1149,79 @@ conflict. .. versionadded:: 3.12 +.. envvar:: PYTHON_PERF_JIT_SUPPORT + + If this variable is set to a nonzero value, it enables support for + the Linux ``perf`` profiler so Python calls can be detected by it + using DWARF information. + + If set to ``0``, disable Linux ``perf`` profiler support. + + See also the :option:`-X perf_jit <-X>` command-line option + and :ref:`perf_profiling`. + + .. versionadded:: 3.13 + + + +.. envvar:: PYTHON_CPU_COUNT + + If this variable is set to a positive integer, it overrides the return + values of :func:`os.cpu_count` and :func:`os.process_cpu_count`. + + See also the :option:`-X cpu_count <-X>` command-line option. + + .. versionadded:: 3.13 + +.. envvar:: PYTHON_FROZEN_MODULES + + If this variable is set to ``on`` or ``off``, it determines whether or not + frozen modules are ignored by the import machinery. A value of ``on`` means + they get imported and ``off`` means they are ignored. The default is ``on`` + for non-debug builds (the normal case) and ``off`` for debug builds. + Note that the :mod:`!importlib_bootstrap` and + :mod:`!importlib_bootstrap_external` frozen modules are always used, even + if this flag is set to ``off``. + + See also the :option:`-X frozen_modules <-X>` command-line option. + + .. versionadded:: 3.13 + +.. envvar:: PYTHON_COLORS + + If this variable is set to ``1``, the interpreter will colorize various kinds + of output. Setting it to ``0`` deactivates this behavior. + See also :ref:`using-on-controlling-color`. + + .. versionadded:: 3.13 + +.. envvar:: PYTHON_BASIC_REPL + + If this variable is set to ``1``, the interpreter will not attempt to + load the Python-based :term:`REPL` that requires :mod:`curses` and + :mod:`readline`, and will instead use the traditional parser-based + :term:`REPL`. + + .. versionadded:: 3.13 + +.. envvar:: PYTHON_HISTORY + + This environment variable can be used to set the location of a + ``.python_history`` file (by default, it is ``.python_history`` in the + user's home directory). + + .. versionadded:: 3.13 + +.. envvar:: PYTHON_GIL + + If this variable is set to ``1``, the global interpreter lock (GIL) will be + forced on. Setting it to ``0`` forces the GIL off (needs Python configured with + the :option:`--disable-gil` build option). + + See also the :option:`-X gil <-X>` command-line option, which takes + precedence over this variable, and :ref:`whatsnew313-free-threaded-cpython`. + + .. versionadded:: 3.13 Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ @@ -1072,13 +1231,33 @@ Debug-mode variables If set, Python will dump objects and reference counts still alive after shutting down the interpreter. - Need Python configured with the :option:`--with-trace-refs` build option. + Needs Python configured with the :option:`--with-trace-refs` build option. -.. envvar:: PYTHONDUMPREFSFILE=FILENAME +.. envvar:: PYTHONDUMPREFSFILE If set, Python will dump objects and reference counts still alive - after shutting down the interpreter into a file called *FILENAME*. + after shutting down the interpreter into a file under the path given + as the value to this environment variable. - Need Python configured with the :option:`--with-trace-refs` build option. + Needs Python configured with the :option:`--with-trace-refs` build option. .. versionadded:: 3.11 + +.. envvar:: PYTHON_PRESITE + + If this variable is set to a module, that module will be imported + early in the interpreter lifecycle, before the :mod:`site` module is + executed, and before the :mod:`__main__` module is created. + Therefore, the imported module is not treated as :mod:`__main__`. + + This can be used to execute code early during Python initialization. + + To import a submodule, use ``package.module`` as the value, like in + an import statement. + + See also the :option:`-X presite <-X>` command-line option, + which takes precedence over this variable. + + Needs Python configured with the :option:`--with-pydebug` build option. + + .. versionadded:: 3.13 diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 3fe2a635..bf980b51 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -2,42 +2,61 @@ Configure Python **************** +.. highlight:: sh + Build Requirements ================== -Features required to build CPython: +Features and minimum versions required to build CPython: * A `C11 `_ compiler. `Optional C11 features `_ are not required. -* Support for `IEEE 754 `_ floating - point numbers and `floating point Not-a-Number (NaN) +* On Windows, Microsoft Visual Studio 2017 or later is required. + +* Support for `IEEE 754 `_ + floating-point numbers and `floating-point Not-a-Number (NaN) `_. * Support for threads. -* OpenSSL 1.1.1 or newer for the :mod:`ssl` and :mod:`hashlib` modules. +* OpenSSL 1.1.1 is the minimum version and OpenSSL 3.0.9 is the recommended + minimum version for the :mod:`ssl` and :mod:`hashlib` extension modules. -* On Windows, Microsoft Visual Studio 2017 or later is required. +* SQLite 3.15.2 for the :mod:`sqlite3` extension module. -.. versionchanged:: 3.11 - C11 compiler, IEEE 754 and NaN support are now required. - On Windows, Visual Studio 2017 or later is required. +* Tcl/Tk 8.5.12 for the :mod:`tkinter` module. -.. versionchanged:: 3.10 - OpenSSL 1.1.1 is now required. +* Autoconf 2.71 and aclocal 1.16.5 are required to regenerate the + :file:`configure` script. -.. versionchanged:: 3.7 - Thread support and OpenSSL 1.0.2 are now required. +.. versionchanged:: 3.1 + Tcl/Tk version 8.3.1 is now required. + +.. versionchanged:: 3.5 + On Windows, Visual Studio 2015 or later is now required. + Tcl/Tk version 8.4 is now required. .. versionchanged:: 3.6 Selected C99 features are now required, like ```` and ``static inline`` functions. -.. versionchanged:: 3.5 - On Windows, Visual Studio 2015 or later is required. +.. versionchanged:: 3.7 + Thread support and OpenSSL 1.0.2 are now required. + +.. versionchanged:: 3.10 + OpenSSL 1.1.1 is now required. + Require SQLite 3.7.15. + +.. versionchanged:: 3.11 + C11 compiler, IEEE 754 and NaN support are now required. + On Windows, Visual Studio 2017 or later is required. + Tcl/Tk version 8.5.12 is now required for the :mod:`tkinter` module. + +.. versionchanged:: 3.13 + Autoconf 2.71, aclocal 1.16.5 and SQLite 3.15.2 are now required. See also :pep:`7` "Style Guide for C Code" and :pep:`11` "CPython platform support". @@ -57,21 +76,28 @@ files. Commands to regenerate all generated files:: The ``Makefile.pre.in`` file documents generated files, their inputs, and tools used to regenerate them. Search for ``regen-*`` make targets. -The ``make regen-configure`` command runs `tiran/cpython_autoconf -`_ container for reproducible build; -see container ``entry.sh`` script. The container is optional, the following -command can be run locally, the generated files depend on autoconf and aclocal -versions:: +configure script +---------------- + +The ``make regen-configure`` command regenerates the ``aclocal.m4`` file and +the ``configure`` script using the ``Tools/build/regen-configure.sh`` shell +script which uses an Ubuntu container to get the same tools versions and have a +reproducible output. + +The container is optional, the following command can be run locally:: autoreconf -ivf -Werror +The generated files can change depending on the exact ``autoconf-archive``, +``aclocal`` and ``pkg-config`` versions. + .. _configure-options: Configure Options ================= -List all ``./configure`` script options using:: +List all :file:`configure` script options using:: ./configure --help @@ -80,7 +106,7 @@ See also the :file:`Misc/SpecialBuilds.txt` in the Python source distribution. General Options --------------- -.. cmdoption:: --enable-loadable-sqlite-extensions +.. option:: --enable-loadable-sqlite-extensions Support loadable extensions in the :mod:`!_sqlite` extension module (default is no) of the :mod:`sqlite3` module. @@ -90,12 +116,12 @@ General Options .. versionadded:: 3.6 -.. cmdoption:: --disable-ipv6 +.. option:: --disable-ipv6 Disable IPv6 support (enabled by default if supported), see the :mod:`socket` module. -.. cmdoption:: --enable-big-digits=[15|30] +.. option:: --enable-big-digits=[15|30] Define the size in bits of Python :class:`int` digits: 15 or 30 bits. @@ -105,7 +131,7 @@ General Options See :data:`sys.int_info.bits_per_digit `. -.. cmdoption:: --with-suffix=SUFFIX +.. option:: --with-suffix=SUFFIX Set the Python executable suffix to *SUFFIX*. @@ -118,7 +144,7 @@ General Options The default suffix on WASM platform is one of ``.js``, ``.html`` or ``.wasm``. -.. cmdoption:: --with-tzpath= +.. option:: --with-tzpath= Select the default time zone search path for :const:`zoneinfo.TZPATH`. See the :ref:`Compile-time configuration @@ -130,7 +156,7 @@ General Options .. versionadded:: 3.9 -.. cmdoption:: --without-decimal-contextvar +.. option:: --without-decimal-contextvar Build the ``_decimal`` extension module using a thread-local context rather than a coroutine-local context (default), see the :mod:`decimal` module. @@ -139,7 +165,7 @@ General Options .. versionadded:: 3.9 -.. cmdoption:: --with-dbmliborder= +.. option:: --with-dbmliborder= Override order to check db backends for the :mod:`dbm` module @@ -149,7 +175,7 @@ General Options * ``gdbm``; * ``bdb``. -.. cmdoption:: --without-c-locale-coercion +.. option:: --without-c-locale-coercion Disable C locale coercion to a UTF-8 based locale (enabled by default). @@ -157,13 +183,13 @@ General Options See :envvar:`PYTHONCOERCECLOCALE` and the :pep:`538`. -.. cmdoption:: --without-freelists +.. option:: --without-freelists Disable all freelists except the empty tuple singleton. .. versionadded:: 3.11 -.. cmdoption:: --with-platlibdir=DIRNAME +.. option:: --with-platlibdir=DIRNAME Python library directory name (default is ``lib``). @@ -173,7 +199,7 @@ General Options .. versionadded:: 3.9 -.. cmdoption:: --with-wheel-pkg-dir=PATH +.. option:: --with-wheel-pkg-dir=PATH Directory of wheel packages used by the :mod:`ensurepip` module (none by default). @@ -185,7 +211,7 @@ General Options .. versionadded:: 3.10 -.. cmdoption:: --with-pkg-config=[check|yes|no] +.. option:: --with-pkg-config=[check|yes|no] Whether configure should use :program:`pkg-config` to detect build dependencies. @@ -196,22 +222,245 @@ General Options .. versionadded:: 3.11 -.. cmdoption:: --enable-pystats +.. option:: --enable-pystats + + Turn on internal Python performance statistics gathering. + + By default, statistics gathering is off. Use ``python3 -X pystats`` command + or set ``PYTHONSTATS=1`` environment variable to turn on statistics + gathering at Python startup. - Turn on internal statistics gathering. + At Python exit, dump statistics if statistics gathering was on and not + cleared. + + Effects: + + * Add :option:`-X pystats <-X>` command line option. + * Add :envvar:`!PYTHONSTATS` environment variable. + * Define the ``Py_STATS`` macro. + * Add functions to the :mod:`sys` module: + + * :func:`!sys._stats_on`: Turns on statistics gathering. + * :func:`!sys._stats_off`: Turns off statistics gathering. + * :func:`!sys._stats_clear`: Clears the statistics. + * :func:`!sys._stats_dump`: Dump statistics to file, and clears the statistics. The statistics will be dumped to a arbitrary (probably unique) file in - ``/tmp/py_stats/``, or ``C:\temp\py_stats\`` on Windows. If that directory - does not exist, results will be printed on stdout. + ``/tmp/py_stats/`` (Unix) or ``C:\temp\py_stats\`` (Windows). If that + directory does not exist, results will be printed on stderr. Use ``Tools/scripts/summarize_stats.py`` to read the stats. + Statistics: + + * Opcode: + + * Specialization: success, failure, hit, deferred, miss, deopt, failures; + * Execution count; + * Pair count. + + * Call: + + * Inlined Python calls; + * PyEval calls; + * Frames pushed; + * Frame object created; + * Eval calls: vector, generator, legacy, function VECTORCALL, build class, + slot, function "ex", API, method. + + * Object: + + * incref and decref; + * interpreter incref and decref; + * allocations: all, 512 bytes, 4 kiB, big; + * free; + * to/from free lists; + * dictionary materialized/dematerialized; + * type cache; + * optimization attempts; + * optimization traces created/executed; + * uops executed. + + * Garbage collector: + + * Garbage collections; + * Objects visited; + * Objects collected. + .. versionadded:: 3.11 +.. _free-threading-build: + +.. option:: --disable-gil + + Enables **experimental** support for running Python without the + :term:`global interpreter lock` (GIL): free threading build. + + Defines the ``Py_GIL_DISABLED`` macro and adds ``"t"`` to + :data:`sys.abiflags`. + + See :ref:`whatsnew313-free-threaded-cpython` for more detail. + + .. versionadded:: 3.13 + +.. option:: --enable-experimental-jit=[no|yes|yes-off|interpreter] + + Indicate how to integrate the :ref:`JIT compiler `. + + * ``no`` - build the interpreter without the JIT. + * ``yes`` - build the interpreter with the JIT. + * ``yes-off`` - build the interpreter with the JIT but disable it by default. + * ``interpreter`` - build the interpreter without the JIT, but with the tier 2 enabled interpreter. + + By convention, ``--enable-experimental-jit`` is a shorthand for ``--enable-experimental-jit=yes``. + + .. versionadded:: 3.13 + +.. option:: PKG_CONFIG + + Path to ``pkg-config`` utility. + +.. option:: PKG_CONFIG_LIBDIR +.. option:: PKG_CONFIG_PATH + + ``pkg-config`` options. + + +C compiler options +------------------ + +.. option:: CC + + C compiler command. + +.. option:: CFLAGS + + C compiler flags. + +.. option:: CPP + + C preprocessor command. + +.. option:: CPPFLAGS + + C preprocessor flags, e.g. :samp:`-I{include_dir}`. + + +Linker options +-------------- + +.. option:: LDFLAGS + + Linker flags, e.g. :samp:`-L{library_directory}`. + +.. option:: LIBS + + Libraries to pass to the linker, e.g. :samp:`-l{library}`. + +.. option:: MACHDEP + + Name for machine-dependent library files. + + +Options for third-party dependencies +------------------------------------ + +.. versionadded:: 3.11 + +.. option:: BZIP2_CFLAGS +.. option:: BZIP2_LIBS + + C compiler and linker flags to link Python to ``libbz2``, used by :mod:`bz2` + module, overriding ``pkg-config``. + +.. option:: CURSES_CFLAGS +.. option:: CURSES_LIBS + + C compiler and linker flags for ``libncurses`` or ``libncursesw``, used by + :mod:`curses` module, overriding ``pkg-config``. + +.. option:: GDBM_CFLAGS +.. option:: GDBM_LIBS + + C compiler and linker flags for ``gdbm``. + +.. option:: LIBB2_CFLAGS +.. option:: LIBB2_LIBS + + C compiler and linker flags for ``libb2`` (:ref:`BLAKE2 `), + used by :mod:`hashlib` module, overriding ``pkg-config``. + +.. option:: LIBEDIT_CFLAGS +.. option:: LIBEDIT_LIBS + + C compiler and linker flags for ``libedit``, used by :mod:`readline` module, + overriding ``pkg-config``. + +.. option:: LIBFFI_CFLAGS +.. option:: LIBFFI_LIBS + + C compiler and linker flags for ``libffi``, used by :mod:`ctypes` module, + overriding ``pkg-config``. + +.. option:: LIBMPDEC_CFLAGS +.. option:: LIBMPDEC_LIBS + + C compiler and linker flags for ``libmpdec``, used by :mod:`decimal` module, + overriding ``pkg-config``. + + .. note:: + + These environment variables have no effect unless + :option:`--with-system-libmpdec` is specified. + +.. option:: LIBLZMA_CFLAGS +.. option:: LIBLZMA_LIBS + + C compiler and linker flags for ``liblzma``, used by :mod:`lzma` module, + overriding ``pkg-config``. + +.. option:: LIBREADLINE_CFLAGS +.. option:: LIBREADLINE_LIBS + + C compiler and linker flags for ``libreadline``, used by :mod:`readline` + module, overriding ``pkg-config``. + +.. option:: LIBSQLITE3_CFLAGS +.. option:: LIBSQLITE3_LIBS + + C compiler and linker flags for ``libsqlite3``, used by :mod:`sqlite3` + module, overriding ``pkg-config``. + +.. option:: LIBUUID_CFLAGS +.. option:: LIBUUID_LIBS + + C compiler and linker flags for ``libuuid``, used by :mod:`uuid` module, + overriding ``pkg-config``. + +.. option:: PANEL_CFLAGS +.. option:: PANEL_LIBS + + C compiler and linker flags for PANEL, overriding ``pkg-config``. + + C compiler and linker flags for ``libpanel`` or ``libpanelw``, used by + :mod:`curses.panel` module, overriding ``pkg-config``. + +.. option:: TCLTK_CFLAGS +.. option:: TCLTK_LIBS + + C compiler and linker flags for TCLTK, overriding ``pkg-config``. + +.. option:: ZLIB_CFLAGS +.. option:: ZLIB_LIBS + + C compiler and linker flags for ``libzlib``, used by :mod:`gzip` module, + overriding ``pkg-config``. + + WebAssembly Options ------------------- -.. cmdoption:: --with-emscripten-target=[browser|node] +.. option:: --with-emscripten-target=[browser|node] Set build flavor for ``wasm32-emscripten``. @@ -220,7 +469,7 @@ WebAssembly Options .. versionadded:: 3.11 -.. cmdoption:: --enable-wasm-dynamic-linking +.. option:: --enable-wasm-dynamic-linking Turn on dynamic linking support for WASM. @@ -229,7 +478,7 @@ WebAssembly Options .. versionadded:: 3.11 -.. cmdoption:: --enable-wasm-pthreads +.. option:: --enable-wasm-pthreads Turn on pthreads support for WASM. @@ -239,7 +488,7 @@ WebAssembly Options Install Options --------------- -.. cmdoption:: --prefix=PREFIX +.. option:: --prefix=PREFIX Install architecture-independent files in PREFIX. On Unix, it defaults to :file:`/usr/local`. @@ -249,20 +498,20 @@ Install Options As an example, one can use ``--prefix="$HOME/.local/"`` to install a Python in its home directory. -.. cmdoption:: --exec-prefix=EPREFIX +.. option:: --exec-prefix=EPREFIX Install architecture-dependent files in EPREFIX, defaults to :option:`--prefix`. This value can be retrieved at runtime using :data:`sys.exec_prefix`. -.. cmdoption:: --disable-test-modules +.. option:: --disable-test-modules Don't build nor install test modules, like the :mod:`test` package or the :mod:`!_testcapi` extension module (built and installed by default). .. versionadded:: 3.10 -.. cmdoption:: --with-ensurepip=[upgrade|install|no] +.. option:: --with-ensurepip=[upgrade|install|no] Select the :mod:`ensurepip` command run on Python installation: @@ -281,7 +530,7 @@ Configuring Python using ``--enable-optimizations --with-lto`` (PGO + LTO) is recommended for best performance. The experimental ``--enable-bolt`` flag can also be used to improve performance. -.. cmdoption:: --enable-optimizations +.. option:: --enable-optimizations Enable Profile Guided Optimization (PGO) using :envvar:`PROFILE_TASK` (disabled by default). @@ -293,6 +542,15 @@ also be used to improve performance. GCC is used: add ``-fno-semantic-interposition`` to the compiler and linker flags. + .. note:: + + During the build, you may encounter compiler warnings about + profile data not being available for some source files. + These warnings are harmless, as only a subset of the code is exercised + during profile data acquisition. + To disable these warnings on Clang, manually suppress them by adding + ``-Wno-profile-instr-unprofiled`` to :envvar:`CFLAGS`. + .. versionadded:: 3.6 .. versionchanged:: 3.10 @@ -307,7 +565,10 @@ also be used to improve performance. .. versionadded:: 3.8 -.. cmdoption:: --with-lto=[full|thin|no|yes] + .. versionchanged:: 3.13 + Task failure is no longer ignored silently. + +.. option:: --with-lto=[full|thin|no|yes] Enable Link Time Optimization (LTO) in any build (disabled by default). @@ -322,7 +583,7 @@ also be used to improve performance. .. versionchanged:: 3.12 Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag. -.. cmdoption:: --enable-bolt +.. option:: --enable-bolt Enable usage of the `BOLT post-link binary optimizer `_ (disabled by @@ -347,19 +608,39 @@ also be used to improve performance. .. versionadded:: 3.12 -.. cmdoption:: --with-computed-gotos +.. option:: BOLT_APPLY_FLAGS + + Arguments to ``llvm-bolt`` when creating a `BOLT optimized binary + `_. + + .. versionadded:: 3.12 + +.. option:: BOLT_INSTRUMENT_FLAGS + + Arguments to ``llvm-bolt`` when instrumenting binaries. + + .. versionadded:: 3.12 + +.. option:: --with-computed-gotos Enable computed gotos in evaluation loop (enabled by default on supported compilers). -.. cmdoption:: --without-pymalloc +.. option:: --without-mimalloc + + Disable the fast :ref:`mimalloc ` allocator + (enabled by default). + + See also :envvar:`PYTHONMALLOC` environment variable. + +.. option:: --without-pymalloc Disable the specialized Python memory allocator :ref:`pymalloc ` (enabled by default). See also :envvar:`PYTHONMALLOC` environment variable. -.. cmdoption:: --without-doc-strings +.. option:: --without-doc-strings Disable static documentation strings to reduce the memory footprint (enabled by default). Documentation strings defined in Python are not affected. @@ -368,11 +649,11 @@ also be used to improve performance. See the ``PyDoc_STRVAR()`` macro. -.. cmdoption:: --enable-profiling +.. option:: --enable-profiling Enable C-level code profiling with ``gprof`` (disabled by default). -.. cmdoption:: --with-strict-overflow +.. option:: --with-strict-overflow Add ``-fstrict-overflow`` to the C compiler flags (by default we add ``-fno-strict-overflow`` instead). @@ -422,34 +703,39 @@ See also the :ref:`Python Development Mode ` and the .. versionchanged:: 3.8 Release builds and debug builds are now ABI compatible: defining the ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro (see the - :option:`--with-trace-refs` option), which introduces the only ABI - incompatibility. + :option:`--with-trace-refs` option). Debug options ------------- -.. cmdoption:: --with-pydebug +.. option:: --with-pydebug :ref:`Build Python in debug mode `: define the ``Py_DEBUG`` macro (disabled by default). -.. cmdoption:: --with-trace-refs +.. option:: --with-trace-refs Enable tracing references for debugging purpose (disabled by default). Effects: * Define the ``Py_TRACE_REFS`` macro. - * Add :func:`!sys.getobjects` function. + * Add :func:`sys.getobjects` function. * Add :envvar:`PYTHONDUMPREFS` environment variable. - This build is not ABI compatible with release build (default build) or debug - build (``Py_DEBUG`` and ``Py_REF_DEBUG`` macros). + The :envvar:`PYTHONDUMPREFS` environment variable can be used to dump + objects and reference counts still alive at Python exit. + + :ref:`Statically allocated objects ` are not traced. .. versionadded:: 3.8 -.. cmdoption:: --with-assertions + .. versionchanged:: 3.13 + This build is now ABI compatible with release build and :ref:`debug build + `. + +.. option:: --with-assertions Build with C assertions enabled (default is no): ``assert(...);`` and ``_PyObject_ASSERT(...);``. @@ -462,11 +748,11 @@ Debug options .. versionadded:: 3.6 -.. cmdoption:: --with-valgrind +.. option:: --with-valgrind Enable Valgrind support (default is no). -.. cmdoption:: --with-dtrace +.. option:: --with-dtrace Enable DTrace support (default is no). @@ -475,34 +761,41 @@ Debug options .. versionadded:: 3.6 -.. cmdoption:: --with-address-sanitizer +.. option:: --with-address-sanitizer Enable AddressSanitizer memory error detector, ``asan`` (default is no). .. versionadded:: 3.6 -.. cmdoption:: --with-memory-sanitizer +.. option:: --with-memory-sanitizer Enable MemorySanitizer allocation error detector, ``msan`` (default is no). .. versionadded:: 3.6 -.. cmdoption:: --with-undefined-behavior-sanitizer +.. option:: --with-undefined-behavior-sanitizer Enable UndefinedBehaviorSanitizer undefined behaviour detector, ``ubsan`` (default is no). .. versionadded:: 3.6 +.. option:: --with-thread-sanitizer + + Enable ThreadSanitizer data race detector, ``tsan`` + (default is no). + + .. versionadded:: 3.13 + Linker options -------------- -.. cmdoption:: --enable-shared +.. option:: --enable-shared Enable building a shared Python library: ``libpython`` (default is no). -.. cmdoption:: --without-static-libpython +.. option:: --without-static-libpython Do not build ``libpythonMAJOR.MINOR.a`` and do not install ``python.o`` (built and enabled by default). @@ -513,31 +806,41 @@ Linker options Libraries options ----------------- -.. cmdoption:: --with-libs='lib1 ...' +.. option:: --with-libs='lib1 ...' Link against additional libraries (default is no). -.. cmdoption:: --with-system-expat +.. option:: --with-system-expat Build the :mod:`!pyexpat` module using an installed ``expat`` library (default is no). -.. cmdoption:: --with-system-libmpdec +.. option:: --with-system-libmpdec - Build the ``_decimal`` extension module using an installed ``mpdec`` - library, see the :mod:`decimal` module (default is no). + Build the ``_decimal`` extension module using an installed ``mpdecimal`` + library, see the :mod:`decimal` module (default is yes). .. versionadded:: 3.3 -.. cmdoption:: --with-readline=editline + .. versionchanged:: 3.13 + Default to using the installed ``mpdecimal`` library. + + .. deprecated-removed:: 3.13 3.15 + A copy of the ``mpdecimal`` library sources will no longer be distributed + with Python 3.15. + + .. seealso:: :option:`LIBMPDEC_CFLAGS` and :option:`LIBMPDEC_LIBS`. - Use ``editline`` library for backend of the :mod:`readline` module. +.. option:: --with-readline=readline|editline - Define the ``WITH_EDITLINE`` macro. + Designate a backend library for the :mod:`readline` module. + + * readline: Use readline as the backend. + * editline: Use editline as the backend. .. versionadded:: 3.10 -.. cmdoption:: --without-readline +.. option:: --without-readline Don't build the :mod:`readline` module (built by default). @@ -545,21 +848,21 @@ Libraries options .. versionadded:: 3.10 -.. cmdoption:: --with-libm=STRING +.. option:: --with-libm=STRING Override ``libm`` math library to *STRING* (default is system-dependent). -.. cmdoption:: --with-libc=STRING +.. option:: --with-libc=STRING Override ``libc`` C library to *STRING* (default is system-dependent). -.. cmdoption:: --with-openssl=DIR +.. option:: --with-openssl=DIR Root of the OpenSSL directory. .. versionadded:: 3.7 -.. cmdoption:: --with-openssl-rpath=[no|auto|DIR] +.. option:: --with-openssl-rpath=[no|auto|DIR] Set runtime library directory (rpath) for OpenSSL libraries: @@ -574,7 +877,7 @@ Libraries options Security Options ---------------- -.. cmdoption:: --with-hash-algorithm=[fnv|siphash13|siphash24] +.. option:: --with-hash-algorithm=[fnv|siphash13|siphash24] Select hash algorithm for use in ``Python/pyhash.c``: @@ -587,7 +890,7 @@ Security Options .. versionadded:: 3.11 ``siphash13`` is added and it is the new default. -.. cmdoption:: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 +.. option:: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 Built-in hash modules: @@ -600,7 +903,7 @@ Security Options .. versionadded:: 3.9 -.. cmdoption:: --with-ssl-default-suites=[python|openssl|STRING] +.. option:: --with-ssl-default-suites=[python|openssl|STRING] Override the OpenSSL default cipher suites string: @@ -620,21 +923,21 @@ Security Options macOS Options ------------- -See ``Mac/README.rst``. +See :source:`Mac/README.rst`. -.. cmdoption:: --enable-universalsdk -.. cmdoption:: --enable-universalsdk=SDKDIR +.. option:: --enable-universalsdk +.. option:: --enable-universalsdk=SDKDIR Create a universal binary build. *SDKDIR* specifies which macOS SDK should be used to perform the build (default is no). -.. cmdoption:: --enable-framework -.. cmdoption:: --enable-framework=INSTALLDIR +.. option:: --enable-framework +.. option:: --enable-framework=INSTALLDIR Create a Python.framework rather than a traditional Unix install. Optional *INSTALLDIR* specifies the installation path (default is no). -.. cmdoption:: --with-universal-archs=ARCH +.. option:: --with-universal-archs=ARCH Specify the kind of universal binary that should be created. This option is only valid when :option:`--enable-universalsdk` is set. @@ -650,11 +953,36 @@ See ``Mac/README.rst``. * ``intel-64``; * ``all``. -.. cmdoption:: --with-framework-name=FRAMEWORK +.. option:: --with-framework-name=FRAMEWORK Specify the name for the python framework on macOS only valid when :option:`--enable-framework` is set (default: ``Python``). +.. option:: --with-app-store-compliance +.. option:: --with-app-store-compliance=PATCH-FILE + + The Python standard library contains strings that are known to trigger + automated inspection tool errors when submitted for distribution by + the macOS and iOS App Stores. If enabled, this option will apply the list of + patches that are known to correct app store compliance. A custom patch + file can also be specified. This option is disabled by default. + + .. versionadded:: 3.13 + +iOS Options +----------- + +See :source:`iOS/README.rst`. + +.. option:: --enable-framework=INSTALLDIR + + Create a Python.framework. Unlike macOS, the *INSTALLDIR* argument + specifying the installation path is mandatory. + +.. option:: --with-framework-name=FRAMEWORK + + Specify the name for the framework (default: ``Python``). + Cross Compiling Options ----------------------- @@ -664,31 +992,39 @@ for another CPU architecture or platform. Cross compiling requires a Python interpreter for the build platform. The version of the build Python must match the version of the cross compiled host Python. -.. cmdoption:: --build=BUILD +.. option:: --build=BUILD configure for building on BUILD, usually guessed by :program:`config.guess`. -.. cmdoption:: --host=HOST +.. option:: --host=HOST cross-compile to build programs to run on HOST (target platform) -.. cmdoption:: --with-build-python=path/to/python +.. option:: --with-build-python=path/to/python path to build ``python`` binary for cross compiling .. versionadded:: 3.11 -.. cmdoption:: CONFIG_SITE=file +.. option:: CONFIG_SITE=file An environment variable that points to a file with configure overrides. - Example *config.site* file:: + Example *config.site* file: + + .. code-block:: ini # config.site-aarch64 ac_cv_buggy_getaddrinfo=no ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no +.. option:: HOSTRUNNER + + Program to run CPython for the host platform for cross-compilation. + + .. versionadded:: 3.11 + Cross compiling example:: @@ -722,30 +1058,108 @@ Main build steps Main Makefile targets --------------------- -* ``make``: Build Python with the standard library. -* ``make platform:``: build the ``python`` program, but don't build the - standard library extension modules. -* ``make profile-opt``: build Python using Profile Guided Optimization (PGO). - You can use the configure :option:`--enable-optimizations` option to make - this the default target of the ``make`` command (``make all`` or just - ``make``). -* ``make buildbottest``: Build Python and run the Python test suite, the same - way than buildbots test Python. Set ``TESTTIMEOUT`` variable (in seconds) - to change the test timeout (1200 by default: 20 minutes). -* ``make install``: Build and install Python. -* ``make regen-all``: Regenerate (almost) all generated files; - ``make regen-stdlib-module-names`` and ``autoconf`` must be run separately - for the remaining generated files. -* ``make clean``: Remove built files. -* ``make distclean``: Same than ``make clean``, but remove also files created - by the configure script. +make +^^^^ + +For the most part, when rebuilding after editing some code or +refreshing your checkout from upstream, all you need to do is execute +``make``, which (per Make's semantics) builds the default target, the +first one defined in the Makefile. By tradition (including in the +CPython project) this is usually the ``all`` target. The +``configure`` script expands an ``autoconf`` variable, +``@DEF_MAKE_ALL_RULE@`` to describe precisely which targets ``make +all`` will build. The three choices are: + +* ``profile-opt`` (configured with ``--enable-optimizations``) +* ``build_wasm`` (configured with ``--with-emscripten-target``) +* ``build_all`` (configured without explicitly using either of the others) + +Depending on the most recent source file changes, Make will rebuild +any targets (object files and executables) deemed out-of-date, +including running ``configure`` again if necessary. Source/target +dependencies are many and maintained manually however, so Make +sometimes doesn't have all the information necessary to correctly +detect all targets which need to be rebuilt. Depending on which +targets aren't rebuilt, you might experience a number of problems. If +you have build or test problems which you can't otherwise explain, +``make clean && make`` should work around most dependency problems, at +the expense of longer build times. + + +make platform +^^^^^^^^^^^^^ + +Build the ``python`` program, but don't build the standard library +extension modules. This generates a file named ``platform`` which +contains a single line describing the details of the build platform, +e.g., ``macosx-14.3-arm64-3.12`` or ``linux-x86_64-3.13``. + + +make profile-opt +^^^^^^^^^^^^^^^^ + +Build Python using profile-guided optimization (PGO). You can use the +configure :option:`--enable-optimizations` option to make this the +default target of the ``make`` command (``make all`` or just +``make``). + + + +make clean +^^^^^^^^^^ + +Remove built files. + + +make distclean +^^^^^^^^^^^^^^ + +In addition to the work done by ``make clean``, remove files +created by the configure script. ``configure`` will have to be run +before building again. [#]_ + + +make install +^^^^^^^^^^^^ + +Build the ``all`` target and install Python. + + +make test +^^^^^^^^^ + +Build the ``all`` target and run the Python test suite with the +``--fast-ci`` option. Variables: + +* ``TESTOPTS``: additional regrtest command-line options. +* ``TESTPYTHONOPTS``: additional Python command-line options. +* ``TESTTIMEOUT``: timeout in seconds (default: 10 minutes). + + +make buildbottest +^^^^^^^^^^^^^^^^^ + +This is similar to ``make test``, but uses the ``--slow-ci`` +option and default timeout of 20 minutes, instead of ``--fast-ci`` option. + + +make regen-all +^^^^^^^^^^^^^^ + +Regenerate (almost) all generated files. These include (but are not +limited to) bytecode cases, and parser generator file. +``make regen-stdlib-module-names`` and ``autoconf`` must be run +separately for the remaining `generated files <#generated-files>`_. + C extensions ------------ Some C extensions are built as built-in modules, like the ``sys`` module. They are built with the ``Py_BUILD_CORE_BUILTIN`` macro defined. -Built-in modules have no ``__file__`` attribute:: +Built-in modules have no ``__file__`` attribute: + +.. code-block:: pycon >>> import sys >>> sys @@ -757,7 +1171,9 @@ Built-in modules have no ``__file__`` attribute:: Other C extensions are built as dynamic libraries, like the ``_asyncio`` module. They are built with the ``Py_BUILD_CORE_MODULE`` macro defined. -Example on Linux x86-64:: +Example on Linux x86-64: + +.. code-block:: pycon >>> import _asyncio >>> _asyncio @@ -1029,3 +1445,14 @@ Linker flags Linker flags used for building the interpreter object files. .. versionadded:: 3.8 + + +.. rubric:: Footnotes + +.. [#] ``git clean -fdx`` is an even more extreme way to "clean" your + checkout. It removes all files not known to Git. + When bug hunting using ``git bisect``, this is + `recommended between probes `_ + to guarantee a completely clean build. **Use with care**, as it + will delete all files not checked into Git, including your + new, uncommitted work. diff --git a/Doc/using/index.rst b/Doc/using/index.rst index e1a3111f..90fdfc0b 100644 --- a/Doc/using/index.rst +++ b/Doc/using/index.rst @@ -12,10 +12,13 @@ interpreter and things that make working with Python easier. .. toctree:: :numbered: + :maxdepth: 2 cmdline.rst unix.rst configure.rst windows.rst mac.rst + android.rst + ios.rst editors.rst diff --git a/Doc/using/ios.rst b/Doc/using/ios.rst new file mode 100644 index 00000000..4d4eb203 --- /dev/null +++ b/Doc/using/ios.rst @@ -0,0 +1,343 @@ +.. _using-ios: + +=================== +Using Python on iOS +=================== + +:Authors: + Russell Keith-Magee (2024-03) + +Python on iOS is unlike Python on desktop platforms. On a desktop platform, +Python is generally installed as a system resource that can be used by any user +of that computer. Users then interact with Python by running a :program:`python` +executable and entering commands at an interactive prompt, or by running a +Python script. + +On iOS, there is no concept of installing as a system resource. The only unit +of software distribution is an "app". There is also no console where you could +run a :program:`python` executable, or interact with a Python REPL. + +As a result, the only way you can use Python on iOS is in embedded mode - that +is, by writing a native iOS application, and embedding a Python interpreter +using ``libPython``, and invoking Python code using the :ref:`Python embedding +API `. The full Python interpreter, the standard library, and all +your Python code is then packaged as a standalone bundle that can be +distributed via the iOS App Store. + +If you're looking to experiment for the first time with writing an iOS app in +Python, projects such as `BeeWare `__ and `Kivy +`__ will provide a much more approachable user experience. +These projects manage the complexities associated with getting an iOS project +running, so you only need to deal with the Python code itself. + +Python at runtime on iOS +======================== + +iOS version compatibility +------------------------- + +The minimum supported iOS version is specified at compile time, using the +:option:`--host` option to ``configure``. By default, when compiled for iOS, +Python will be compiled with a minimum supported iOS version of 13.0. To use a +different minimum iOS version, provide the version number as part of the +:option:`!--host` argument - for example, +``--host=arm64-apple-ios15.4-simulator`` would compile an ARM64 simulator build +with a deployment target of 15.4. + +Platform identification +----------------------- + +When executing on iOS, ``sys.platform`` will report as ``ios``. This value will +be returned on an iPhone or iPad, regardless of whether the app is running on +the simulator or a physical device. + +Information about the specific runtime environment, including the iOS version, +device model, and whether the device is a simulator, can be obtained using +:func:`platform.ios_ver`. :func:`platform.system` will report ``iOS`` or +``iPadOS``, depending on the device. + +:func:`os.uname` reports kernel-level details; it will report a name of +``Darwin``. + +Standard library availability +----------------------------- + +The Python standard library has some notable omissions and restrictions on +iOS. See the :ref:`API availability guide for iOS ` for +details. + +Binary extension modules +------------------------ + +One notable difference about iOS as a platform is that App Store distribution +imposes hard requirements on the packaging of an application. One of these +requirements governs how binary extension modules are distributed. + +The iOS App Store requires that *all* binary modules in an iOS app must be +dynamic libraries, contained in a framework with appropriate metadata, stored +in the ``Frameworks`` folder of the packaged app. There can be only a single +binary per framework, and there can be no executable binary material outside +the ``Frameworks`` folder. + +This conflicts with the usual Python approach for distributing binaries, which +allows a binary extension module to be loaded from any location on +``sys.path``. To ensure compliance with App Store policies, an iOS project must +post-process any Python packages, converting ``.so`` binary modules into +individual standalone frameworks with appropriate metadata and signing. For +details on how to perform this post-processing, see the guide for :ref:`adding +Python to your project `. + +To help Python discover binaries in their new location, the original ``.so`` +file on ``sys.path`` is replaced with a ``.fwork`` file. This file is a text +file containing the location of the framework binary, relative to the app +bundle. To allow the framework to resolve back to the original location, the +framework must contain a ``.origin`` file that contains the location of the +``.fwork`` file, relative to the app bundle. + +For example, consider the case of an import ``from foo.bar import _whiz``, +where ``_whiz`` is implemented with the binary module +``sources/foo/bar/_whiz.abi3.so``, with ``sources`` being the location +registered on ``sys.path``, relative to the application bundle. This module +*must* be distributed as ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz`` +(creating the framework name from the full import path of the module), with an +``Info.plist`` file in the ``.framework`` directory identifying the binary as a +framework. The ``foo.bar._whiz`` module would be represented in the original +location with a ``sources/foo/bar/_whiz.abi3.fwork`` marker file, containing +the path ``Frameworks/foo.bar._whiz/foo.bar._whiz``. The framework would also +contain ``Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin``, containing +the path to the ``.fwork`` file. + +When running on iOS, the Python interpreter will install an +:class:`~importlib.machinery.AppleFrameworkLoader` that is able to read and +import ``.fwork`` files. Once imported, the ``__file__`` attribute of the +binary module will report as the location of the ``.fwork`` file. However, the +:class:`~importlib.machinery.ModuleSpec` for the loaded module will report the +``origin`` as the location of the binary in the framework folder. + +Compiler stub binaries +---------------------- + +Xcode doesn't expose explicit compilers for iOS; instead, it uses an ``xcrun`` +script that resolves to a full compiler path (e.g., ``xcrun --sdk iphoneos +clang`` to get the ``clang`` for an iPhone device). However, using this script +poses two problems: + +* The output of ``xcrun`` includes paths that are machine specific, resulting + in a sysconfig module that cannot be shared between users; and + +* It results in ``CC``/``CPP``/``LD``/``AR`` definitions that include spaces. + There is a lot of C ecosystem tooling that assumes that you can split a + command line at the first space to get the path to the compiler executable; + this isn't the case when using ``xcrun``. + +To avoid these problems, Python provided stubs for these tools. These stubs are +shell script wrappers around the underingly ``xcrun`` tools, distributed in a +``bin`` folder distributed alongside the compiled iOS framework. These scripts +are relocatable, and will always resolve to the appropriate local system paths. +By including these scripts in the bin folder that accompanies a framework, the +contents of the ``sysconfig`` module becomes useful for end-users to compile +their own modules. When compiling third-party Python modules for iOS, you +should ensure these stub binaries are on your path. + +Installing Python on iOS +======================== + +Tools for building iOS apps +--------------------------- + +Building for iOS requires the use of Apple's Xcode tooling. It is strongly +recommended that you use the most recent stable release of Xcode. This will +require the use of the most (or second-most) recently released macOS version, +as Apple does not maintain Xcode for older macOS versions. The Xcode Command +Line Tools are not sufficient for iOS development; you need a *full* Xcode +install. + +If you want to run your code on the iOS simulator, you'll also need to install +an iOS Simulator Platform. You should be prompted to select an iOS Simulator +Platform when you first run Xcode. Alternatively, you can add an iOS Simulator +Platform by selecting from the Platforms tab of the Xcode Settings panel. + +.. _adding-ios: + +Adding Python to an iOS project +------------------------------- + +Python can be added to any iOS project, using either Swift or Objective C. The +following examples will use Objective C; if you are using Swift, you may find a +library like `PythonKit `__ to be +helpful. + +To add Python to an iOS Xcode project: + +1. Build or obtain a Python ``XCFramework``. See the instructions in + :source:`iOS/README.rst` (in the CPython source distribution) for details on + how to build a Python ``XCFramework``. At a minimum, you will need a build + that supports ``arm64-apple-ios``, plus one of either + ``arm64-apple-ios-simulator`` or ``x86_64-apple-ios-simulator``. + +2. Drag the ``XCframework`` into your iOS project. In the following + instructions, we'll assume you've dropped the ``XCframework`` into the root + of your project; however, you can use any other location that you want by + adjusting paths as needed. + +3. Drag the ``iOS/Resources/dylib-Info-template.plist`` file into your project, + and ensure it is associated with the app target. + +4. Add your application code as a folder in your Xcode project. In the + following instructions, we'll assume that your user code is in a folder + named ``app`` in the root of your project; you can use any other location by + adjusting paths as needed. Ensure that this folder is associated with your + app target. + +5. Select the app target by selecting the root node of your Xcode project, then + the target name in the sidebar that appears. + +6. In the "General" settings, under "Frameworks, Libraries and Embedded + Content", add ``Python.xcframework``, with "Embed & Sign" selected. + +7. In the "Build Settings" tab, modify the following: + + - Build Options + + * User Script Sandboxing: No + * Enable Testability: Yes + + - Search Paths + + * Framework Search Paths: ``$(PROJECT_DIR)`` + * Header Search Paths: ``"$(BUILT_PRODUCTS_DIR)/Python.framework/Headers"`` + + - Apple Clang - Warnings - All languages + + * Quoted Include In Framework Header: No + +8. Add a build step that copies the Python standard library into your app. In + the "Build Phases" tab, add a new "Run Script" build step *before* the + "Embed Frameworks" step, but *after* the "Copy Bundle Resources" step. Name + the step "Install Target Specific Python Standard Library", disable the + "Based on dependency analysis" checkbox, and set the script content to: + + .. code-block:: bash + + set -e + + mkdir -p "$CODESIGNING_FOLDER_PATH/python/lib" + if [ "$EFFECTIVE_PLATFORM_NAME" = "-iphonesimulator" ]; then + echo "Installing Python modules for iOS Simulator" + rsync -au --delete "$PROJECT_DIR/Python.xcframework/ios-arm64_x86_64-simulator/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" + else + echo "Installing Python modules for iOS Device" + rsync -au --delete "$PROJECT_DIR/Python.xcframework/ios-arm64/lib/" "$CODESIGNING_FOLDER_PATH/python/lib/" + fi + + Note that the name of the simulator "slice" in the XCframework may be + different, depending the CPU architectures your ``XCFramework`` supports. + +9. Add a second build step that processes the binary extension modules in the + standard library into "Framework" format. Add a "Run Script" build step + *directly after* the one you added in step 8, named "Prepare Python Binary + Modules". It should also have "Based on dependency analysis" unchecked, with + the following script content: + + .. code-block:: bash + + set -e + + install_dylib () { + INSTALL_BASE=$1 + FULL_EXT=$2 + + # The name of the extension file + EXT=$(basename "$FULL_EXT") + # The location of the extension file, relative to the bundle + RELATIVE_EXT=${FULL_EXT#$CODESIGNING_FOLDER_PATH/} + # The path to the extension file, relative to the install base + PYTHON_EXT=${RELATIVE_EXT/$INSTALL_BASE/} + # The full dotted name of the extension module, constructed from the file path. + FULL_MODULE_NAME=$(echo $PYTHON_EXT | cut -d "." -f 1 | tr "/" "."); + # A bundle identifier; not actually used, but required by Xcode framework packaging + FRAMEWORK_BUNDLE_ID=$(echo $PRODUCT_BUNDLE_IDENTIFIER.$FULL_MODULE_NAME | tr "_" "-") + # The name of the framework folder. + FRAMEWORK_FOLDER="Frameworks/$FULL_MODULE_NAME.framework" + + # If the framework folder doesn't exist, create it. + if [ ! -d "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER" ]; then + echo "Creating framework for $RELATIVE_EXT" + mkdir -p "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER" + cp "$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist" + plutil -replace CFBundleExecutable -string "$FULL_MODULE_NAME" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist" + plutil -replace CFBundleIdentifier -string "$FRAMEWORK_BUNDLE_ID" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/Info.plist" + fi + + echo "Installing binary for $FRAMEWORK_FOLDER/$FULL_MODULE_NAME" + mv "$FULL_EXT" "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME" + # Create a placeholder .fwork file where the .so was + echo "$FRAMEWORK_FOLDER/$FULL_MODULE_NAME" > ${FULL_EXT%.so}.fwork + # Create a back reference to the .so file location in the framework + echo "${RELATIVE_EXT%.so}.fwork" > "$CODESIGNING_FOLDER_PATH/$FRAMEWORK_FOLDER/$FULL_MODULE_NAME.origin" + } + + PYTHON_VER=$(ls -1 "$CODESIGNING_FOLDER_PATH/python/lib") + echo "Install Python $PYTHON_VER standard library extension modules..." + find "$CODESIGNING_FOLDER_PATH/python/lib/$PYTHON_VER/lib-dynload" -name "*.so" | while read FULL_EXT; do + install_dylib python/lib/$PYTHON_VER/lib-dynload/ "$FULL_EXT" + done + + # Clean up dylib template + rm -f "$CODESIGNING_FOLDER_PATH/dylib-Info-template.plist" + + echo "Signing frameworks as $EXPANDED_CODE_SIGN_IDENTITY_NAME ($EXPANDED_CODE_SIGN_IDENTITY)..." + find "$CODESIGNING_FOLDER_PATH/Frameworks" -name "*.framework" -exec /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" ${OTHER_CODE_SIGN_FLAGS:-} -o runtime --timestamp=none --preserve-metadata=identifier,entitlements,flags --generate-entitlement-der "{}" \; + +10. Add Objective C code to initialize and use a Python interpreter in embedded + mode. You should ensure that: + + * :c:member:`UTF-8 mode ` is *enabled*; + * :c:member:`Buffered stdio ` is *disabled*; + * :c:member:`Writing bytecode ` is *disabled*; + * :c:member:`Signal handlers ` are *enabled*; + * ``PYTHONHOME`` for the interpreter is configured to point at the + ``python`` subfolder of your app's bundle; and + * The ``PYTHONPATH`` for the interpreter includes: + + - the ``python/lib/python3.X`` subfolder of your app's bundle, + - the ``python/lib/python3.X/lib-dynload`` subfolder of your app's bundle, and + - the ``app`` subfolder of your app's bundle + + Your app's bundle location can be determined using ``[[NSBundle mainBundle] + resourcePath]``. + +Steps 8, 9 and 10 of these instructions assume that you have a single folder of +pure Python application code, named ``app``. If you have third-party binary +modules in your app, some additional steps will be required: + +* You need to ensure that any folders containing third-party binaries are + either associated with the app target, or copied in as part of step 8. Step 8 + should also purge any binaries that are not appropriate for the platform a + specific build is targeting (i.e., delete any device binaries if you're + building an app targeting the simulator). + +* Any folders that contain third-party binaries must be processed into + framework form by step 9. The invocation of ``install_dylib`` that processes + the ``lib-dynload`` folder can be copied and adapted for this purpose. + +* If you're using a separate folder for third-party packages, ensure that folder + is included as part of the ``PYTHONPATH`` configuration in step 10. + +App Store Compliance +==================== + +The only mechanism for distributing apps to third-party iOS devices is to +submit the app to the iOS App Store; apps submitted for distribution must pass +Apple's app review process. This process includes a set of automated validation +rules that inspect the submitted application bundle for problematic code. + +The Python standard library contains some code that is known to violate these +automated rules. While these violations appear to be false positives, Apple's +review rules cannot be challenged; so, it is necessary to modify the Python +standard library for an app to pass App Store review. + +The Python source tree contains +:source:`a patch file ` that will remove +all code that is known to cause issues with the App Store review process. This +patch is applied automatically when building for iOS. diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index eb1413af..4b6c884f 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -2,173 +2,473 @@ .. _using-on-mac: ********************* -Using Python on a Mac +Using Python on macOS ********************* -:Author: Bob Savage +.. sectionauthor:: Bob Savage +.. sectionauthor:: Ned Deily +This document aims to give an overview of macOS-specific behavior you should +know about to get started with Python on Mac computers. +Python on a Mac running macOS is very similar to Python on other Unix-derived platforms, +but there are some differences in installation and some features. -Python on a Mac running macOS is in principle very similar to Python on -any other Unix platform, but there are a number of additional features such as -the IDE and the Package Manager that are worth pointing out. +There are various ways to obtain and install Python for macOS. +Pre-built versions of the most recent versions of Python are available +from a number of distributors. Much of this document describes use of +the Pythons provided by the CPython release team for download from +the `python.org website `_. See +:ref:`alternative_bundles` for some other options. + +.. |usemac_x_dot_y| replace:: 3.13 +.. |usemac_python_x_dot_y_literal| replace:: ``python3.13`` +.. |usemac_python_x_dot_y_t_literal| replace:: ``python3.13t`` +.. |usemac_python_x_dot_y_t_literal_config| replace:: ``python3.13t-config`` +.. |usemac_applications_folder_name| replace:: ``Python 3.13`` +.. |usemac_applications_folder_version| replace:: ``/Applications/Python 3.13/`` .. _getting-osx: +.. _getting-and-installing-macpython: -Getting and Installing MacPython -================================ +Using Python for macOS from ``python.org`` +========================================== -macOS used to come with Python 2.7 pre-installed between versions -10.8 and `12.3 `_. -You are invited to install the most recent version of Python 3 from the Python -website (https://www.python.org). A current "universal binary" build of Python, -which runs natively on the Mac's new Intel and legacy PPC CPU's, is available -there. +Installation steps +------------------ -What you get after installing is a number of things: +For `current Python versions `_ +(other than those in ``security`` status), the release team produces a +**Python for macOS** installer package for each new release. +A list of available installers +is available `here `_. +We recommend using the most recent supported Python version where possible. +Current installers provide a +`universal2 binary `_ build +of Python which runs natively on all Macs (Apple Silicon and Intel) that are +supported by a wide range of macOS versions, +currently typically from at least **macOS 10.13 High Sierra** on. -* A :file:`Python 3.12` folder in your :file:`Applications` folder. In here - you find IDLE, the development environment that is a standard part of official - Python distributions; and PythonLauncher, which handles double-clicking Python - scripts from the Finder. +The downloaded file is a standard macOS installer package file (``.pkg``). +File integrity information (checksum, size, sigstore signature, etc) for each file is included +on the release download page. Installer packages and their contents are signed and notarized +with ``Python Software Foundation`` Apple Developer ID certificates +to meet `macOS Gatekeeper requirements `_. -* A framework :file:`/Library/Frameworks/Python.framework`, which includes the - Python executable and libraries. The installer adds this location to your shell - path. To uninstall MacPython, you can simply remove these three things. A - symlink to the Python executable is placed in /usr/local/bin/. - -The Apple-provided build of Python is installed in -:file:`/System/Library/Frameworks/Python.framework` and :file:`/usr/bin/python`, -respectively. You should never modify or delete these, as they are -Apple-controlled and are used by Apple- or third-party software. Remember that -if you choose to install a newer Python version from python.org, you will have -two different but functional Python installations on your computer, so it will -be important that your paths and usages are consistent with what you want to do. - -IDLE includes a help menu that allows you to access Python documentation. If you -are completely new to Python you should start reading the tutorial introduction -in that document. +For a default installation, double-click on the downloaded installer package file. +This should launch the standard macOS Installer app and display the first of several +installer windows steps. -If you are familiar with Python on other Unix platforms you should read the -section on running Python scripts from the Unix shell. +.. image:: mac_installer_01_introduction.png +Clicking on the **Continue** button brings up the **Read Me** for this installer. +Besides other important information, the **Read Me** documents which Python version is +going to be installed and on what versions of macOS it is supported. You may need +to scroll through to read the whole file. By default, this **Read Me** will also be +installed in |usemac_applications_folder_version| and available to read anytime. -How to run a Python script --------------------------- +.. image:: mac_installer_02_readme.png -Your best way to get started with Python on macOS is through the IDLE -integrated development environment, see section :ref:`ide` and use the Help menu -when the IDE is running. +Clicking on **Continue** proceeds to display the license for Python and for +other included software. You will then need to **Agree** to the license terms +before proceeding to the next step. This license file will also be installed +and available to be read later. -If you want to run Python scripts from the Terminal window command line or from -the Finder you first need an editor to create your script. macOS comes with a -number of standard Unix command line editors, :program:`vim` and -:program:`emacs` among them. If you want a more Mac-like editor, -:program:`BBEdit` or :program:`TextWrangler` from Bare Bones Software (see -http://www.barebones.com/products/bbedit/index.html) are good choices, as is -:program:`TextMate` (see https://macromates.com/). Other editors include -:program:`Gvim` (https://macvim.org/macvim/) and :program:`Aquamacs` -(http://aquamacs.org/). +.. image:: mac_installer_03_license.png -To run your script from the Terminal window you must make sure that -:file:`/usr/local/bin` is in your shell search path. +After the license terms are accepted, the next step is the **Installation Type** +display. For most uses, the standard set of installation operations is appropriate. -To run your script from the Finder you have two options: +.. image:: mac_installer_04_installation_type.png -* Drag it to :program:`PythonLauncher` +By pressing the **Customize** button, you can choose to omit or select certain package +components of the installer. Click on each package name to see a description of +what it installs. +To also install support for the optional experimental free-threaded feature, +see :ref:`install-freethreaded-macos`. -* Select :program:`PythonLauncher` as the default application to open your - script (or any .py script) through the finder Info window and double-click it. - :program:`PythonLauncher` has various preferences to control how your script is - launched. Option-dragging allows you to change these for one invocation, or use - its Preferences menu to change things globally. +.. image:: mac_installer_05_custom_install.png +In either case, clicking **Install** will begin the install process by asking +permission to install new software. A macOS user name with ``Administrator`` privilege +is needed as the installed Python will be available to all users of the Mac. -.. _osx-gui-scripts: +When the installation is complete, the **Summary** window will appear. + +.. image:: mac_installer_06_summary.png + +Double-click on the :command:`Install Certificates.command` +icon or file in the |usemac_applications_folder_version| window to complete the +installation. + +.. image:: mac_installer_07_applications.png + +This will open a temporary :program:`Terminal` shell window that +will use the new Python to download and install SSL root certificates +for its use. + +.. image:: mac_installer_08_install_certificates.png + +If ``Successfully installed certifi`` and ``update complete`` appears +in the terminal window, the installation is complete. +Close this terminal window and the installer window. + +A default install will include: -Running scripts with a GUI +* A |usemac_applications_folder_name| folder in your :file:`Applications` folder. In here + you find :program:`IDLE`, the development environment that is a standard part of official + Python distributions; and :program:`Python Launcher`, which handles double-clicking Python + scripts from the macOS `Finder `_. + +* A framework :file:`/Library/Frameworks/Python.framework`, which includes the + Python executable and libraries. The installer adds this location to your shell + path. To uninstall Python, you can remove these three things. + Symlinks to the Python executable are placed in :file:`/usr/local/bin/`. + +.. note:: + + Recent versions of macOS include a :command:`python3` command in :file:`/usr/bin/python3` + that links to a usually older and incomplete version of Python provided by and for use by + the Apple development tools, :program:`Xcode` or the :program:`Command Line Tools for Xcode`. + You should never modify or attempt to delete this installation, as it is + Apple-controlled and is used by Apple-provided or third-party software. If + you choose to install a newer Python version from ``python.org``, you will have + two different but functional Python installations on your computer that + can co-exist. The default installer options should ensure that its :command:`python3` + will be used instead of the system :command:`python3`. + +How to run a Python script -------------------------- -With older versions of Python, there is one macOS quirk that you need to be -aware of: programs that talk to the Aqua window manager (in other words, -anything that has a GUI) need to be run in a special way. Use :program:`pythonw` -instead of :program:`python` to start such scripts. +There are two ways to invoke the Python interpreter. +If you are familiar with using a Unix shell in a terminal +window, you can invoke |usemac_python_x_dot_y_literal| or ``python3`` optionally +followed by one or more command line options (described in :ref:`using-on-general`). +The Python tutorial also has a useful section on +:ref:`using Python interactively from a shell `. + +You can also invoke the interpreter through an integrated +development environment. +:ref:`idle` is a basic editor and interpreter environment +which is included with the standard distribution of Python. +:program:`IDLE` includes a Help menu that allows you to access Python documentation. If you +are completely new to Python, you can read the tutorial introduction +in that document. + +There are many other editors and IDEs available, see :ref:`editors` +for more information. + +To run a Python script file from the terminal window, you can +invoke the interpreter with the name of the script file: + + |usemac_python_x_dot_y_literal| ``myscript.py`` -With Python 3.9, you can use either :program:`python` or :program:`pythonw`. +To run your script from the Finder, you can either: + +* Drag it to :program:`Python Launcher`. + +* Select :program:`Python Launcher` as the default application to open your + script (or any ``.py`` script) through the Finder Info window and double-click it. + :program:`Python Launcher` has various preferences to control how your script is + launched. Option-dragging allows you to change these for one invocation, or use + its ``Preferences`` menu to change things globally. +Be aware that running the script directly from the macOS Finder might +produce different results than when running from a terminal window as +the script will not be run in the usual shell environment including +any setting of environment variables in shell profiles. +And, as with any other script or program, +be certain of what you are about to run. -Configuration -------------- +.. _alternative_bundles: -Python on macOS honors all standard Unix environment variables such as -:envvar:`PYTHONPATH`, but setting these variables for programs started from the -Finder is non-standard as the Finder does not read your :file:`.profile` or -:file:`.cshrc` at startup. You need to create a file -:file:`~/.MacOSX/environment.plist`. See Apple's Technical Document QA1067 for -details. +Alternative Distributions +========================= -For more information on installation Python packages in MacPython, see section -:ref:`mac-package-manager`. +Besides the standard ``python.org`` for macOS installer, there are third-party +distributions for macOS that may include additional functionality. +Some popular distributions and their key features: +`ActivePython `_ + Installer with multi-platform compatibility, documentation -.. _ide: +`Anaconda `_ + Popular scientific modules (such as numpy, scipy, and pandas) and the + ``conda`` package manager. -The IDE -======= +`Homebrew `_ + Package manager for macOS including multiple versions of Python and many + third-party Python-based packages (including numpy, scipy, and pandas). -MacPython ships with the standard IDLE development environment. A good -introduction to using IDLE can be found at -http://www.hashcollision.org/hkn/python/idle_intro/index.html. +`MacPorts `_ + Another package manager for macOS including multiple versions of Python and many + third-party Python-based packages. May include pre-built versions of Python and + many packages for older versions of macOS. +Note that distributions might not include the latest versions of Python or +other libraries, and are not maintained or supported by the core Python team. .. _mac-package-manager: Installing Additional Python Packages ===================================== -This section has moved to the `Python Packaging User Guide`_. +Refer to the `Python Packaging User Guide`_ for more information. .. _Python Packaging User Guide: https://packaging.python.org/en/latest/tutorials/installing-packages/ -GUI Programming on the Mac -========================== +.. _osx-gui-scripts: -There are several options for building GUI applications on the Mac with Python. +.. _gui-programming-on-the-mac: + +GUI Programming +=============== -*PyObjC* is a Python binding to Apple's Objective-C/Cocoa framework, which is -the foundation of most modern Mac development. Information on PyObjC is -available from https://pypi.org/project/pyobjc/. +There are several options for building GUI applications on the Mac with Python. The standard Python GUI toolkit is :mod:`tkinter`, based on the cross-platform -Tk toolkit (https://www.tcl.tk). An Aqua-native version of Tk is bundled with -macOS by Apple, and the latest version can be downloaded and installed from -https://www.activestate.com; it can also be built from source. +Tk toolkit (https://www.tcl.tk). A macOS-native version of Tk is included with +the installer. -*wxPython* is another popular cross-platform GUI toolkit that runs natively on -macOS. Packages and documentation are available from https://www.wxpython.org. +*PyObjC* is a Python binding to Apple's Objective-C/Cocoa framework. +Information on PyObjC is available from :pypi:`pyobjc`. -*PyQt* is another popular cross-platform GUI toolkit that runs natively on -macOS. More information can be found at -https://riverbankcomputing.com/software/pyqt/intro. +A number of alternative macOS GUI toolkits are available including: +* `PySide `_: Official Python bindings to the + `Qt GUI toolkit `_. -Distributing Python Applications on the Mac -=========================================== +* `PyQt `_: Alternative + Python bindings to Qt. -The standard tool for deploying standalone Python applications on the Mac is -:program:`py2app`. More information on installing and using py2app can be found -at https://pypi.org/project/py2app/. +* `Kivy `_: A cross-platform GUI toolkit that supports + desktop and mobile platforms. +* `Toga `_: Part of the `BeeWare Project + `_; supports desktop, mobile, web and console apps. -Other Resources +* `wxPython `_: A cross-platform toolkit that + supports desktop operating systems. + + +Advanced Topics =============== -The MacPython mailing list is an excellent support resource for Python users and -developers on the Mac: +.. _install-freethreaded-macos: + +Installing Free-threaded Binaries +--------------------------------- + +.. versionadded:: 3.13 (Experimental) + +.. note:: + + Everything described in this section is considered experimental, + and should be expected to change in future releases. + +The ``python.org`` :ref:`Python for macOS ` +installer package can optionally install an additional build of +Python |usemac_x_dot_y| that supports :pep:`703`, the experimental free-threading feature +(running with the :term:`global interpreter lock` disabled). +Check the release page on ``python.org`` for possible updated information. + +Because this feature is still considered experimental, the support for it +is not installed by default. It is packaged as a separate install option, +available by clicking the **Customize** button on the **Installation Type** +step of the installer as described above. + +.. image:: mac_installer_09_custom_install_free_threaded.png -https://www.python.org/community/sigs/current/pythonmac-sig/ +If the box next to the **Free-threaded Python** package name is checked, +a separate :file:`PythonT.framework` will also be installed +alongside the normal :file:`Python.framework` in :file:`/Library/Frameworks`. +This configuration allows a free-threaded Python |usemac_x_dot_y| build to co-exist +on your system with a traditional (GIL only) Python |usemac_x_dot_y| build with +minimal risk while installing or testing. This installation layout is itself +experimental and is subject to change in future releases. -Another useful resource is the MacPython wiki: +Known cautions and limitations: -https://wiki.python.org/moin/MacPython +- The **UNIX command-line tools** package, which is selected by default, + will install links in :file:`/usr/local/bin` for |usemac_python_x_dot_y_t_literal|, + the free-threaded interpreter, and |usemac_python_x_dot_y_t_literal_config|, + a configuration utility which may be useful for package builders. + Since :file:`/usr/local/bin` is typically included in your shell ``PATH``, + in most cases no changes to your ``PATH`` environment variables should + be needed to use |usemac_python_x_dot_y_t_literal|. + +- For this release, the **Shell profile updater** package and the + :file:`Update Shell Profile.command` in |usemac_applications_folder_version| + do not support the free-threaded package. + +- The free-threaded build and the traditional build have separate search + paths and separate :file:`site-packages` directories so, by default, + if you need a package available in both builds, it may need to be installed in both. + The free-threaded package will install a separate instance of :program:`pip` for use + with |usemac_python_x_dot_y_t_literal|. + + - To install a package using :command:`pip` without a :command:`venv`: + + |usemac_python_x_dot_y_t_literal| ``-m pip install `` + +- When working with multiple Python environments, it is usually safest and easiest + to :ref:`create and use virtual environments `. + This can avoid possible command name conflicts and confusion about which Python is in use: + + |usemac_python_x_dot_y_t_literal| ``-m venv `` + + then :command:`activate`. + +- To run a free-threaded version of IDLE: + + |usemac_python_x_dot_y_t_literal| ``-m idlelib`` + +- The interpreters in both builds respond to the same + :ref:`PYTHON environment variables ` + which may have unexpected results, for example, if you have ``PYTHONPATH`` + set in a shell profile. If necessary, there are + :ref:`command line options ` like ``-E`` + to ignore these environment variables. + +- The free-threaded build links to the third-party shared libraries, + such as ``OpenSSL`` and ``Tk``, installed in the traditional framework. + This means that both builds also share one set of trust certificates + as installed by the :command:`Install Certificates.command` script, + thus it only needs to be run once. + +- If you cannot depend on the link in ``/usr/local/bin`` pointing to the + ``python.org`` free-threaded |usemac_python_x_dot_y_t_literal| (for example, if you want + to install your own version there or some other distribution does), + you can explicitly set your shell ``PATH`` environment variable to + include the ``PythonT`` framework ``bin`` directory: + + .. code-block:: sh + + export PATH="/Library/Frameworks/PythonT.framework/Versions/3.13/bin":"$PATH" + + The traditional framework installation by default does something similar, + except for :file:`Python.framework`. Be aware that having both framework ``bin`` + directories in ``PATH`` can lead to confusion if there are duplicate names + like ``python3.13`` in both; which one is actually used depends on the order + they appear in ``PATH``. The ``which python3.x`` or ``which python3.xt`` + commands can show which path is being used. Using virtual environments + can help avoid such ambiguities. Another option might be to create + a shell :command:`alias` to the desired interpreter, like: + + .. code-block:: sh + + alias py3.13="/Library/Frameworks/Python.framework/Versions/3.13/bin/python3.13" + alias py3.13t="/Library/Frameworks/PythonT.framework/Versions/3.13/bin/python3.13t" + +Installing using the command line +--------------------------------- + +If you want to use automation to install the ``python.org`` installer package +(rather than by using the familiar macOS :program:`Installer` GUI app), +the macOS command line :command:`installer` utility lets you select non-default +options, too. If you are not familiar with :command:`installer`, it can be +somewhat cryptic (see :command:`man installer` for more information). +As an example, the following shell snippet shows one way to do it, +using the ``3.13.0b2`` release and selecting the free-threaded interpreter +option: + +.. code-block:: sh + + RELEASE="python-3.13.0b2-macos11.pkg" + + # download installer pkg + curl -O https://www.python.org/ftp/python/3.13.0/${RELEASE} + + # create installer choicechanges to customize the install: + # enable the PythonTFramework-3.13 package + # while accepting the other defaults (install all other packages) + cat > ./choicechanges.plist < + + + + + attributeSetting + 1 + choiceAttribute + selected + choiceIdentifier + org.python.Python.PythonTFramework-3.13 + + + + EOF + + sudo installer -pkg ./${RELEASE} -applyChoiceChangesXML ./choicechanges.plist -target / + + +You can then test that both installer builds are now available with something like: + +.. code-block:: console + + $ # test that the free-threaded interpreter was installed if the Unix Command Tools package was enabled + $ /usr/local/bin/python3.13t -VV + Python 3.13.0b2 experimental free-threading build (v3.13.0b2:3a83b172af, Jun 5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)] + $ # and the traditional interpreter + $ /usr/local/bin/python3.13 -VV + Python 3.13.0b2 (v3.13.0b2:3a83b172af, Jun 5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)] + $ # test that they are also available without the prefix if /usr/local/bin is on $PATH + $ python3.13t -VV + Python 3.13.0b2 experimental free-threading build (v3.13.0b2:3a83b172af, Jun 5 2024, 12:57:31) [Clang 15.0.0 (clang-1500.3.9.4)] + $ python3.13 -VV + Python 3.13.0b2 (v3.13.0b2:3a83b172af, Jun 5 2024, 12:50:24) [Clang 15.0.0 (clang-1500.3.9.4)] + +.. note:: + + Current ``python.org`` installers only install to fixed locations like + :file:`/Library/Frameworks/`, :file:`/Applications`, and :file:`/usr/local/bin`. + You cannot use the :command:`installer` ``-domain`` option to install to + other locations. + +.. _distributing-python-applications-on-the-mac: + +Distributing Python Applications +-------------------------------- + +A range of tools exist for converting your Python code into a standalone +distributable application: + +* :pypi:`py2app`: Supports creating macOS ``.app`` + bundles from a Python project. + +* `Briefcase `_: Part of the `BeeWare Project + `_; a cross-platform packaging tool that supports + creation of ``.app`` bundles on macOS, as well as managing signing and + notarization. + +* `PyInstaller `_: A cross-platform packaging tool that creates + a single file or folder as a distributable artifact. + +App Store Compliance +-------------------- + +Apps submitted for distribution through the macOS App Store must pass Apple's +app review process. This process includes a set of automated validation rules +that inspect the submitted application bundle for problematic code. + +The Python standard library contains some code that is known to violate these +automated rules. While these violations appear to be false positives, Apple's +review rules cannot be challenged. Therefore, it is necessary to modify the +Python standard library for an app to pass App Store review. + +The Python source tree contains +:source:`a patch file ` that will remove +all code that is known to cause issues with the App Store review process. This +patch is applied automatically when CPython is configured with the +:option:`--with-app-store-compliance` option. + +This patch is not normally required to use CPython on a Mac; nor is it required +if you are distributing an app *outside* the macOS App Store. It is *only* +required if you are using the macOS App Store as a distribution channel. + +Other Resources +=============== +The `python.org Help page `_ has links to many useful resources. +The `Pythonmac-SIG mailing list `_ +is another support resource specifically for Python users and developers on the Mac. diff --git a/Doc/using/mac_installer_01_introduction.png b/Doc/using/mac_installer_01_introduction.png new file mode 100644 index 0000000000000000000000000000000000000000..1999f3a37590933a4ca77774d51bfc06e9322010 GIT binary patch literal 190852 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

-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 z

>nGx-|N-b>n6dwG|65BM~%_mnZBPq0FGhP*sKZ5={QAz_^AGYEj|aGGCkk1nT73Hgid(-URYOZ3h-{%PsHL7(lKU# zs7Ooxw~f{Lu3^yDL_4p$WKBkLEr!r^+r^mcLK<>@!!uX8F78)$bM4v{%DHJ997sHo z0HEBu)@r8Q4*T=314xey-Rm#q7_OO4{iBra+soG1UM$0x50&A@?{KBsOb3?}XgYYC zoFNs@a)CO&{n0-6C+lO_#0q5+u2>F`T!L&bn4WpVuDMc zGg?dc0O-nyfcQmf0Aiq2GWp8G8UR3cj)2fQ0%E|m37ss|4S+&~)HMlt3ZO+Y5Rh0y zvj6hSFRKr&tg<6o0Lw-<5g^nAPd=V49XWEO04|3QA1+Tk@dS_yoC;{xb(I4`fDfP& zNCuS1TRDI#fD?E}oU$+&VB6;LPvg3fbKLkNH+1cbJgtUZe>o@;E%NoLwD zz+7K&4;i{1kgdxOeA<9SfDsS`a*zX{to{yWiCj=T903t&! z>VS$sI8CxOGx|*cCh!StlOqC78w|WVPuoo!jW{96B1>yy`!BupQXxMi18GzCBrJu-#Ap1yqq?vU}l$7mEI!2>g;U;27Ze z=8akJ1miAa$Gz&It!u(zUmw#))UDSZ*7=dw|Kul_zv#5sus&n%%T>+!)x342pZ4S{ zSe>Y7`E4H3jeW|XNt5O_7|aF9jS`lG3I}6OL2#ao7MUgwS#?|{R6gXzuHQ3 zthm;GezU*rTEFtlwY6*4`ggtAPkH?2x^XMl)vjC(QL-gD#gfAZcUhLhlB-tMz&OTj z%kTO+5-~B_lCA6fZ$(KJ3?08wr`0=Cb?z-&Uq4=!cmAjhw|)=#2=UuIv}}Ot_Knl^ z_fKwFKb`o?ugY-k{bjXtW&&cnUxN+|nXqa5O|T}y#4O+<1H92FNFxe2Ut49(bauM?jF502&h{Qe+}!Rj?sGKuv(F6xRgLM39sRpm1NF-%B|k z!XnW|lLt^~f(6)s`J}jexG#067li|hz%d}B{2@-t7VULwu^_7uKPeWOxIrb cuW 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

a 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¥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 z zFn(%#<~RyMix&Q*dg5YmzilDu5NM-`c+Z?DXM6Mj3Z;bB|Tk!t+ZPbGnU582;pL$Po15@3gmhU9Tp1zzJwkPV-t$TNV z4*RaZ)=TOoA^JO7jM7dE+AlE`$81jCFE0s(FMs^jcpLmSPd{kTj8V(P1K%Q<(=68O z&tR4sElz8c_(s8t;sQ5E6P5+NAT4xz#%;g9#;mhH&OrbvBG_T1b4I17$p|$gefrOprKPFoWw)t=vRx%Mq}X1B>v4M^>f)ipI-WO$)4XhksK_uYGt}GcYDh# zBkKh7;&+kUIVSeK{yty4WOMti(k!H&u$38D@a%K}?@!qH^ZXYl8~FDlYf)ud=&pNjWDSu&QpJSgd=Kiqn*lnCfa7a$L~6`4gF^d!Gr>Kr zijzVBs>{*f?4j`M7ab9z!bA0jWyMfX1|FoE<9EL>1y1-(zr}>&Ni^pNDUh0^5(Wb0 zV)=+v#DWo5?eH}Q8xob( zfl`{Buh7dWG4&OU?1f4%e+nE&W4Oi%UZ#5R4_smM;fv43LfFO_zhsA>@E|1)%$mdo zPOuM-&98W`hCzs8;T5Rf7|x3M7@{7GElDP6@5Jvc$<6xb6JO4RYcpwOXpcg4GNWoE zS1!mX7q(=`er6HO=pLkRmx13Rjrxb~gJWi~vq-nXLI{I`GF8s!k5D_g(zt2cB)Qg1 zTMVyMr!?>P&Em$(AP=QrLtmGcK)S64J8c2KyiHE_-6rHPkyuW|9u*XW^C`zUvfoDM zPq>#cKH0X*L&HR6T|_tl!4Urfs#fePxpnXZFBHj`{=fZO3OcAUo-5&qwT<>??V>0v zuG0Dy+*myHMCf>wGMUz#m>G6(`y8GB{qrsI^L@OfXZa&J^X%_)XOQ)?D{XeV{pucu z@AF!gx?7_CIu5*KPM1d=SFMRwwucxMe@U)h23A~kvdAMasPV1Q;^E(ID*+!wbyl1_ z@hr1@=KWr)$DxUPM$@O&DuMP^MqGhuxf_ImKn2zekG!jzIVU{@^GeB7Fh`Pd#jD!F zt-v{@{6W(XSGH~f8=7hq9BKFO38ARS^m|&TK}BLrqKHjIAq%xAOL1xmakeX)2{BLt zaxa%S?^^KPy${sjx*F9K1~l(AnpCyybWo=@8!D6nz5im2%)I3?IJ1Zj;jH70VqaR} z`r(odGY+KnJh8yOvI~vr&^L{(!xptAXrtKgBHcXTVCe-AOfSz;5cB+M;P?Nk1>#!2=^Gxxs)B^Oo#)PPW?)go$tj zuKQqN5j_l4JDwXSX*#92kQ~iz)g&s!-$U?B2hV~kA7lE5arK4RT($A+>~w6P5pSuu zi;jJE%vumffdh~7ciYZ#n$;4=e!ZL`aFpuS(Wm*vHABF;U4*1e@VI2@)thLr+s6K| ztTm>6?xNrQaR&wvIHgO`>PP?^*%MQ%y{wbU#nFJiO;$5}D5$o;#WVX+kdTK^RfBZ9g%7<+Mcz*%|5J;Rrnd+o!Uap*#1+<@>!GkBW|bA>h@P(>6)FQ zb|2vtA&X+D#3cRvi=V|RLd6^h?7XyD$y(8KO1BaZ=)J}%iHk*iRgQI@>{F7Ojh{0g5cYI!d~a~j zOhnuy=wRA{e~1z=b0E1IycD6(d4`b^0U+>tzyd(}Nc{wo2x=(?790cXseQfF^W19Z z>YP|l=@J%9ESzrPQ0)*JETGgZQLYj~uheg}p8kncmM_WS6zOPG5IuD&s&`KZXRf1ceZ1Z*zJNhG<6=#m?^&;NAI zkN49xI!$@1tdRB`KsRQ9*tL^o^#b^L1`(7M1u)(_%sL&5pPRQM`HlHl44%DB%bm*M zV3XJ#Pzm6inFiYoC_R~;Dp`Z;=|F@9>i7+&&83S1jJqoe5M9&i0$^o55lagA-R@Xm z7TQ|_yi!vloy&m~BeWYZukiBD<%LtDsZ4Z{I5;3+ZQ)Qvzx}G%Muq9Xz2s8TZU{Rh ziob}Nfc(AMmTi6HU97=p${|C^xU=bGMl4R;rv4GdBh;m50D@F)OBJVg%+j6@h948# zg~TLWpWF*1BZ~SYI_XRnl zd6zWMi4Cn`Kx#!xzPT|lWMD2Jx+x@W>dotp0t|5OVcJx1bz(k$5| zBtIubC5ANNAgF3}qvDG{8c8tY02;CvLD}oU5dkg|Qfus8ubc&BuR=yi6F&~T!;F40 z*-x93qOX9i$gwma1gU*d%mF?%=PjLJ5b+V$F)2LKcD4FnnGSuS4+;IA&#l(KIu6(Z zoaBkW*x&*bTSk`+=VeOZ91!|+sg1Bc%!n{KG&tn3>P%A{P}m7tniVmA?klXh1Y3HF z)I--i5~E;L8g1Y!8qqcNL&Am(@C5?|Ks!;Wo_hS$NV?Aj@Z}lz0QMfHZvw%bB&hVh z3`SCV$V<1*c2-av6~>K|+>R&fJ~jYF5@U^HxSuRW$f>wqDq+uTd)XY`8HR)r+-`a) z%Ho|rRiMoYw!R@}&V|RBhl{S<9?5O^C4Q{J9;kogx-Hv4w<^j4FNIzsnHi7gghnm# zznkRiKS4&VB2lwcQ|V2a`?)fk?i+!~4k=Q08Q@nk@!&BE?Sd5vp%u7ktVN<`Ry3X zsXR4IRaXHHu7Is}+vqz!fkJ9JGR?mC1L8F+xnbg-nT})gD}C`HTEzyQQJBR@R9%+u zb9HS*Q;)K3D|Ni;NS&?=UACJF9cXK=p=T^=f90R^ZoASjMB%O?z`+z(M5tLWs(1Z- z)N)H#rN6$bfBO?7K8HuQ)@Cdq*qujy1#AC32ET`2nB0714UR?X%{f?NONhm&)5eoXJ-+E_WM78nMqAq>a|gv*uPK#A7SoW!mCmx&#Fb2JUH4dvI{v^sshCn9?R6!TKEMU?N_%)M{CBe3U;R?`kkctRi;mAX9pvJ_IfjDv* z{Uqrk8^O13IH0d$gKI#rr+-zXy7N?CU3lY;h(Ln1wK@<&Jy1$Df9)$h`yeV1!7!pa z0?zum=#~cZLBl<9=^4@F_T~cx-oUK>S@zIAKN;XCA@;qog|f+Li2VxZ3{dXX^)^;T zmCw8chCu2JC)u;Nmodl4BZ~dTsyo)xm@i(HBt@Sgkt|2mM#d$r8#Bg27k~PgnOt!? ziej;)dz5IIlB7Aaul>FJ{%b>It&G8%jD6b65QC*ib1|(qVr4kYxaL+x<#P@dqIL^LCL7~^IUz4LvKN}^v{m%?aIVF{VbjMox? zBO>q&@$w!Sr;09aN{Ujk8u8DDd__(z{?P8HgumN(`w~$>A2So>A!{qtZ|o};*eJqf z{MMjysF~sZhL_{ZGwq)tghObRC#jy_es|OwYYuY2P>{lra#E1A>?H^wllT(I2tiCT z53LC~Ong706p@|%E!PSFI>dGhNpQkJaM6eXxUon_DyuE3Eehsko6PzCwu{zuoa=9B zR+Ka7%zS>IXXTBqEGcDZ2})ZUp~RljSO6}xR6-gyLiZ?bh?Ya572EuL_eMj)eM&m? zA@kXP79gXYLby%lEG{93BDy7p*4ZaAWT=%C_bz$l(W4*cM(k8Jq$K77C4`H?nyX!e z|2eX`%(!iVHIo&M4|vTp*EteGpn8O2Gm8AC4Ir~4#ajq{iAynoMQd4V- z0-S2RV=fvYV(;ecHnla!*uN(k_U=5g#M~p@;~ZeOwtoV9`nb3^b)NF}ES5(bc}7Ss z#gp%kvY9&{y%G0@Li6|MeKt-UNn=pK8L4<_QUGT$fzJ;y@S~)-M`+2Q#0UubR09_9 z*L)b6Gjd|d)wl)xA_q_u=6QtMcajIV;G{GsxL!cRn23I;j|FtdAV<+Di&f;+)*G+G z$IFL*(YX0=g&vr;WTdyGKx?OMbd<-ZHJc{qpNti3_>EG|Cs(n zi~e&syx?_1^4nemjRpr_ZS}zt6S%)0t=5WrQoGMdh+zF=c#Z<=B=oTZA35+`7qOH~ zJET!75pfXt(sNzcNF_2oNsU{rySRmelB7sb&CL^!D9nkxES6}pI zCq;b<&2sH3@%mf0PQ#gdX#!cH=uRY84%U~tR0Yy9R`D^#AX<({!AzrvVn+v`lm?oN zwGNach&da;^^YjRC*PY_QzTPQi1#9Y66rBAP}U6ERLD+DqJ^;XU$+Qi{77Hk4?Ka9 z*H(h_bpkQ_^Q6WiW7ld=o(W)8nj4oy<}>C_Ob9NplW86TDHfG)VPV&+Cn9ltU&jjoN8nXPgk91KKM4?+sr4GaqYz^@3pjX?r?Xm ztRY}_R@ULf?atW8O5x$3(E;c2sk-`u!Rb4DMqVY9tiQA0%7YO(ylU;~t5`Sx3S#HZ zC;TkO=8Iu0*EHkp???UM%j@xXk_tdEi=d?g8VLSV_yv%!tlauPlCC*EuIKIU#KsfIhl9A8r_{)R2eu0xdy;*vP{}U4K$L zVf|p*3YDX1FnG26g;Qcb*b@WLLCXl_@~tDp-67m67YG)yt5pgGeS%68k~yx&Yn-u; zVjY&QZ;Y`XU-HOplgZ)~=g?~Mu`7RX8H{%mK%j15UZu7&)7v7@^e{)*bAPhFP$^T- zudMA=W2UZIE-bLH|0Epm&58OcjI@!QkvHEG3w5 z!|Tu{+x}*}yD}A)jtyaVjs8dSlYG@XW%iI6VaLTXJ%x_xK42JO=A2EbiCtBQXHm>} zOMh%y_b%KZlIU`Xzo`fdo55Q(&t^@U#!$_PT2Si#(Ma?{~1nSExyQ_ zN}TKYwv(kxgeuXNoE3#Jzdt*>l$MLvEKIVBT3>_J_RBBY4?~V9{^HDK1CwlUdnnaU zaiBmsNV%v0uPNw9)88wwg;|8oL$;a zoHyKop-bgut-K-uF}Wt``sYpl{aEyj-FH7`^TujY_iPI1`Dn3V1bqjCLyxzuh0n;~ zz}5_o*s!h?@2&uU<=ptvTVq_nMIj#1!SR8E)QHEh(}+IRQuc!9?{^X9D0F_RvR`mH zyj1VCQxe+Un=H5&S7l`T6F=qlzmVcx>S@b$(6E!b4IRz=Re%mOFrk-}esz>wFNTsE zb~SM`l8wepjG&W#$)A8RR43(#F3PTNERJ=cbHjsS7~G-C>pyHjDDNt~8dWIu*i-Kh z-Q?<|IOML#&W#I78G59*Z5Q46{2&h)7NWNm%*9Hvhr>BmfEAFyDX!Y)Djx`dp$URK zcmu>II;2N=qkEfWv8An$G{M8FI%xUP94UjJ=6B})A9R6VmlcIfn?nC_h$8fgAC~Ar z8p{ui!gA?&llA^6F&8>PnyW#Z5Ax9#){v$Qtg0@$$J=}dWLYw_-!`R_os7sP*g>a+ zIcUwxDk|@L{gAZGrO)u?jd70pSqyA}&PQ=Ao! zSXKJIm{a0$&wSOj;8Oo36m-lk5iN*hE>&YCp4A9%Spma0$m@1EDkWgq1;)vC@bv$r zv?UjpmfETCgHcl5c6X(_M z4|Bp%{cwBL)Lb8@`SMAhfx(cH;cJxn$j{|33kpEe8p5NEHEw9L#``~*?&qmGAeK8; zov~S_hM#y7B_`Ire{uCcs_T!mtJ0TY1Yf=( zM&Y`oQ(M=={m4Zh@oyjgdh3&YqKP3?`HKPsBkv31D*!Ew}91@t?Z$UUj?RM0Ii&z!2sh691I)-&9C0vzi}m# zmKZ_Z>P>cAG-m$-f0GYyfmNbkIL3p)SwsawLPF<*QEajJPS*>9EJ2@i7M*5)S7^d> zFw;fb`EVQ`YB|wL7=-^qcD25`O7IkCOzZGB57~SRQP+AEjMhhV`?Vl9r}~gDXNw8K z3a~HDcEYXFE-kf)F!qnb0cd|=^lY^_9lg*U!GQ+Hr@u>8OVp3N_qm7r$K<*|k}ao4 z0m0s8flNYfmzx6}DImXG%14~|1-s4ma4*027Z;*WMl*-9nr??qjB`|{xZ&I8sqv^9 z3>84T6oB{25sXG$^^P~Qrm*Ptz9*F&!%eFFcUWN$LcD6Yha>GjwjBVrpmR_sGaU~s zWT($$u|eMx@p}4AU>_24B#SmJLCx9Bt)yfv#n_%)W^!m`aS$CNSf^SxPVaJU7otVc zFE<>@%vNo}=BqAOP7jj@0}+%6dka3u@H27aRF?h165c@-0fG6sPZHz^5n!!0B}Jtk zTn53JU_^1-A$HGM4plMqzO_s_ou5@c^`(mZU0Qd$Wk%q7J8_<9zvwA8xAZ zE~?0VnN?l4VLb@c&;krmjC84%->PPtnnWIX>L1fGzjZ@TVg2So&%eKiK$FAomUp*F zVeCpfh^X>(KjH(#p6VCJkf(9*o&9&COwQ zP$YI}toSHdCgr7_PmP)yM)2Wh*===RQ29rLi&jJ6SWQH;c^oLdcl>s#4a^bp+w|>H zilFXU4~rUCE&_r)aj(yr=Wd7NDS=3%ILOm@Uu`qJz}Px~-h_Ioo$gRFhR6X7dj&H~ z^@P?Y*Hx;PtL^O7+HUYJGDGJyFmiHCg#mZp!3BPajbxRpm{KA*q2sELj8rRyy38~OZ3*h6T)KL=kvqoq4<{CsXi-s z_Z`w~FbaQfGFw2#)jWDQzk8G1fR?-STLvS+5}8F z8RPptw@{7pMgH{iobTeaA{It)RrM86XhG}bx%Mo%8arx=Bn3l48u^5`e@5`PJ?xzc zi3krYz0go+^pA=$9B;Nx5)q~UsQe*-m>8BetMwxrElxwkV0&h2-I(hq7o9F& z;#~5^0e_(W^`Gx(%{BLv{9-6sD-ox|Q> zw;G!(STDgA%;*7; ziDEM9SAXxQ8{QU$ZrJaF)^LwlAUK!#4{2o!nej>hA$qF&n2sGJ4SQG~7Y16s(V@og zsh5Am{{0@VScPUt=$20BC<)cGlzr+y`MAIsXEs z0*M)J9qD2)xd){#;mP2t;j805(EnBC^LgIUb@xo_`6Gj<(O?h@oNB*)!-Ry5cM>|Z{?FBo{|k)S z_ig0HzD*&URW5Ui!(rJGfV38@kR3bixuhTsx0{*p|L%a=73SZWy2Q?x@xyH8#90dB zt*JMP0WZ!TOVeEj$(!`^aMQ?1h|c`Vg32i1PPya9+>>FUqR0Iu+2hT<1thW3Pci7C z+{;!j1H*HP(>C-viW*JqM>WaZAl@$v97WW=uwVB6ZVmR|PETslK{tFCHjKK|4Fsa& z#is%zJ~+({EH%P=G00!k({K2W1YeV1e_;UTiu+z(+YAM9{QZ|{MfKMwLV+-pD6ov| z)EP(rHaiftYuzsOWTWp?iHl6`j%T>PMmR$FR#YNU{xmMkEU1vtJk&KpQp`v8w~(WI zC9p!z)=;OYAM=I}7Eo&jhd-1)$;p9UB&+vS?Gb)NQk*Q(T;XlH z?7mGIFK9+JoCT9?pDj3%P?e>(>s@lFytz1kt zY{8Y76IJ|2ln-4#@BN%Tzl^>$hv}4}4uV;;ynkd;m{Ry5M(wLbIR59GJ{x}|ssd9GJjWXZw2&De?RkFn=AGHw2vSVrfFEyT&r zFkbbzT}MHRikDkvVY*6bAUBR~ApWIW^w2dmS{mXO;^}|u&D0=$%cQOweUlS(^moR^ ziYeGz{KuMerXBkDv|w)9ba{`2K$ePwerV;WiLB>l~QYlZ5WFl zl?Nxqc6=?F-XE@_-fk&P!}y~DnVg_4xwZ7gL4hwz+zNB6=N<@F1zUC8FJpA2Wd7eD z^Zsg8LW_R(DM2b=H+ru91t@Z(U`V1;g4shVijm!iY77=# zupNpa<_U@H*~!x4Je0es0xVnD65U~TVPv+0&+7@7Q4u;L>_a`rpdoA7n4M}8UN`?? zFqs3gx!Xf8W}6Ki0%x2S)a?;Q-V-Z9V?X$#hWj1KVynrHH0B1(8_ZK!8q~V>&OBH0 zhpo={*{QB{+QSE;`TjGzDH6E7o%nATFvS;!^)C5=n$CEH4aU}v=R6>5qx3xjBk{PN^mRQ%{fla6xg2lbue40{qDdmsy4>{$C!NG2j zls}M8=tf}Dj>npRJ!Y42-@)7_{e`JO3`8$ijQ}v6r@L-I@&fQH3tfXFLRY2*KnKwz zK==NhWq*R~niq9NZAOEBwxoYA9|~*T2#Jj>g9uk&bo8f`#K4#p{xS@f#eG5CSPtaS zPoMaqddr9Nm8h><==5)glHIsI8yWdiZ;m%Ky@~zV@VP;qVA|Z;l25mP=Q(Dl`Y6Br zLY>)!BgUJY?Rqo1$Y-y6SPig$z1@Qo0M$D=nwR17y+^Vplsa5CvYzz!3#~$SPzziV zqkph;N)X%+Bake)dGyW5w$@SKJJ`rGEBryc4a@70P{_BPQ?uS8K1&6F4dA{&BrA5S zCWSWuSq-)5&6L=SG}WzD8$vS0bb{9uttz*M#TWL zsmMgrE?|B`WP{Ph;a))4U-GrU9t^l$0`GfAlap0#_pps8I`WYppW(Cw z^O0SCF401M&#@hhX3-3Ay<6vP>jFxY;e%pOfjIe%i^<%{i!Z1Z)^FsljUUi_Ucx={ zP{N3q=#c6D(orKDYYuikfr&fGM`LaFxvxD#|HjYPHu#!Njt~8#0xq5ApvfmDd4EwV87#39N0Iu(0I9#6 z;d^T4XWmFyuL+F#)(0BJFE!$Y%>KteCd1Bp7GZbD>RuE1L>S6M?Gs#4*naIN(@weE z-$6f-R&{$3s-T`e&#)|e5dksq!<;7v7QIO6rS4sN>wGpz62wt{vl~Uu8$+9AOIyi0 z+UCm%WO#P~XB8?*4IZr@%^xlGQ?g|4376*UxkoOitMY!bDzQqxc#;UPQ2y7DA)wAP z_vU|Xo)YF0s!7VNNqr+_p4??dz;!J@>nVkkI>o=x;SvKe>59<4m_YR}M_jGlTrXtb zo)PNjWNYeZyr)r;aRLHMVZHsLZ^kGy8DPn<4AKM3Zwb78$Y{U978&4%b|;l>hK>NA z*ZAqwc#URCccMySeZb%^FNQKE#xdCAp|$vsV0CuJ z$j~=;*-SB)D`3Z1>`d1O$cKop_tN;lK_b&KX^l zWRD_HCX(VH2B_3U2?4R8{5r<~sbkr4%*_nOa<|ryN1n(SD()%b#XTJ9s|q{3t7qSr zv|e<>Adho3bz#}*t?gPK%>8crB0(v`Ow^erpNM(x_#|EDQ_TpcCGG|k=lVb75xb+U z$V@MogLg>AR8-ZdBA-{Dj&iKn0L)alR)3*eHngiXJIF0Vtt&n&Jev*x-RnO7|5{zZ zx2IRrv1hKJ?tw$k^0#dpOp2 ziTy(kjdzT547%?kJ8qwA%7_0wJ^t8m)9?DnZL`XalnhP6iInJ$hn6v7M~%qgn9rn0 zVG2_V=!cPjNbvvN1y~M(7Q!TlAe^oS8HrM1$k36QenH|4Vds7Ttu3435w2DFbv}Y! z{th>lll0_TWDaCdr)++Zo|O2mx89eLZZvoDx|~K0`4c&jiCbC~*g?9-!$dEQ(|%HmsP&4tX@Z zjmcqMHk$CaAk2CB2Kc<-FnD?WU&kA8Gbed3Z_FhF1=GjoGpr_WnQ*F~Y%qvIzqACR zDjo&Mh?QiiFv7)*jLQ1VMC{^cDRAQCqs5^lwr_V|PbMfp!#SMElvKHQP`&yvl9-i2 zv0n6k{FED$jz7uS7{k0#j6M{qe^>`Pa`_gi#RZ&(!) zfOu?*vy2eHm$EGn+`xiQXqS&q@>`GUQ`+}kjmH^L} zuRgLUZsW8+8KB|B^LO4!1B{PWAoMAEZ-=H@Jgf{QbrY!4YSHx^@u;Z8>}b`BKMDHE zU`sHd&Q?m+Gm7ftSwsmfmlz?Ih*)kE5?1iXHt}lB5H6c>Dx~$pqU5*^A2sW2O3$bq zDaX-N*CVcpsH8m#!-&R|H#4)FuQ%bXpo4kZ4S~Ct=f1J=@4H5u zkyM;i?)?jf2(=yiPg=^8`O7a&8e^T25z*WYgR7wL=7_M(vl5DAY7$X&3MNkhz)7dB zi9xOX<2-{=f+0$gNpxn(s3)4BTc+D~YHl;CB^nbHjO-+zACZ>@IxpB_w32RTa%c;< zbg=@FJFuToJ-_^VR)6^oSn5`OybWo*uAs8>KcUUzeulO`+BjD=lLTQLj6#(4RKP$sgj$UQ zgwrwCnnn&JG~$S1ROy)H$|5{3pT`Zy**v36n)^i@oDv#TS{hSwIK$X$u;;I}+ICPO z>8e-q*nh7gvDQu{z8!Qrrr;JL4X-w33k|F63x6hSnMBr{Z4+mN9bpmUhSto8`vzsI z<^F?FQZe%tI%0rQaeyKSYq+Qq3joCUBjk2t4h54nJEn*mHsklWx3_!BOR&#n?yV4|WWATL<5s*%Oy#{a+FOTmtg_k}7yI|SzmcwTnV*7N>)nTCX} z#o|vv(Y+`>)=x{Jfm;6UW{B<&orfs*S4}sR)KAI^COc@gtwGs)^1@7*0L*F-~mOmxSm%bb-AR<0DAL`~WZWk9tP8`(I|fWr_yJSe=T zBpw0^D2(wViEOl_6rnu zV1y~iySB#iujRH}9sK^j4pnr<+eb2{3@lDt8Y*I?69gyIqq8nJX&ZQ2Yz!eMA=U4A zX*g&l`tgg6K}DdI9~`Dq+iHL7eMqn?KECCP&G zY5!Z*>m<=%K9=sEL_*S75q_K9o0;to`pql5vx?i`;v4KkT@JPNjSW|Ow$=;?87{d zPj5d8SzAiZ1xFu0;fuM@xK_>YLzp~If+RuROb}4NjR&-Z2 zVvM(UZR|$p&Ev?K75!;{%Cvax`;^?`!fL$NoL+H~1}~o?U?Nv~rWJ-a6^2f9 z&+~K0H463*dzx? zM!kbvw0VuKGi>lbw2xBRYS?LTb*9czq38_q=?8*;o#k`lP}H)>C5VjH9fUneWP&<|zplzPaZP%9# zZb^CQkV>#YXO6I$u4P3Me9UmXe-X#~zFEvyt1?+3uQNMY4WMZ@+b|qUz<@8RS!Sk0 z(xn)?52RZ018BhpIq!>DAu{36_}qt6n#V@t0I4xtlwFeqIn@8+vV}0!Aw_dlCB-dS zIwKW{w{2bti$(Y{2%?wmn)O#80~3MFtGW@T74JISL1jet2q8|lC?7|kyc@K!n<1=?J*q*29k+|<DHfz=&Ov(RU!JCdzi@+)7rw0Yhd1U>MSl>?-XkS z&|)`T9}zXxvHfNheSw>y$+XQ4FZ(U>}sr&OikkV=CJNGC7_|9QB4w%>L&IG zPwsp&`FLJ8Wn^oMlH>D`Ca}35+hly7+IHDVSk?K$K!8HTIA{L{+{~?E`-7_A_kmP4_O8lMY){H5f(1`~tg% zn~QsPO7?vC$x`2RK+3q24c=YBK*l9c%FuN@oY6rX@zp~-lb^PbaIk$D9j8*mfuCZ3 z-U{;@8Q=CK4p!Y)!#@us%>Ull)m+~MB<8*b)cw`UjMG%n4uflKe^|AenLcqor_n{k zG#dn?C)dwMIeh~Wp{RmSpcGe8Mv^wb34is_ILy{fNz zp-qcB_F+RLUb23heW*ee1EV{Ap$)i&hFhIJ6XwS?GBPp~FZTq3A5X>?D`XUHEbp6E zRUIK<{R!tb-S+o~HTS*fuhqswC~b#_KJWi}0%02z9fHK_a4x?62(u_Gi64k>TV-=6z@ zvZ};OEJAJr8``>jzYV&*(d$n#hw7rskkc+a)>7LpY~CibLR&~X9cWkMUXAO5Y{WA5zY+i z=fZFk3gvTl?(3Nua8gC7P@#FiR_?XGhO}@l@HzeSY1**GtTFJT!xCY_=`t^tvC zk4jf9_1W|6H)qMy7R}Kk1ViY{SMtwK0C8=Umx)b;~1LYG9%` zaT*c690pq!K7C{dG(~hc9N4@kI4jro_Ibg7Tq3QxZtr=F1kB$O!cmaQ+WsK)-t1&B znz#K?uKMIH`1?CGS{U2-k(1UwCvez=<40RhsZ5Iw%7!g&j{%x*7iqyv*r0p-mNj=c z51aJQ1}#}KjBu!O7?e;*$=;Hw+xTZftx(|&yBG+)mNWX-0CVZIF9oBwk+M6@lG(gwm&`# zCs=%GFc4bl$@oYT@ylS@bHqw9T^!#+CP`F14tB(JGx^ra0W#KVQF4(#H(6VS#U3&z0z?GBX$>XwOeiQ-=%A9XFZkt?KLg3+$UxNFh+K&j;ARu?Qe=GX9%NL*I?<7slDZ;t&qmlOz`oSZ)pWU*V^uPGJ~%3vt4 z{+2076X!*c9Y2G?3DFbPh|lAh0*QRvjn-f=Bpr~endQL5#FV>qmWFEL>Y9uYr`#0< z0?U^ZELG_bfrnhIkqY@D?SkD4N&@H&sko@LU!Jdy@-^J$9q+)B6lFA}yK3Ow(kmhC zFDz*Khn?#@OWkckwW_J43_IPM#=-AhrFxa`y5oM~RHcmQbmKAaK?|7xiOM#!?(%0$vaP zxjDfOCo8^P`d=cP#*HW+{%s%*@CXU9Dw9J8M!=~oF8`UOgb+#OS4CxDRaUidq)jVu zOjNGM05@)^e4?|kp!v9Pw7-4EK{$Wh881tfgtQ7YJ?IyAf;B}We%R<~C)$a=AM4x( zhqQ39gz3VN9k6)g+oJ_ApBl1>)VfSo!X8zh3#jqgZ4Yhc#1;IWePQzc8Vor3`ZP)As16Pb_Rh>@WX@A7EfDG5!@SKEoE^+>Pmzpq&e^9oYqD`{blKoc&+gM~tzGB**5=+ihHz?2;3 z(Z3it4qyrj8Ws8L!^K{2W@n^(0**!llxEoJFp*=XB0_ z!4w}C1a4C#lj5$yhBhH6|zak{88Y}$RAHhr>J;+aIfD8w85H~I-hXxp|&eRwWrIHN1 z3tIdude+Xypht~%DDlL?#+md0v$!aQ-2SbTkFf8(maA7Cw;3R$;t#_QI^XO|t3Bn@ z>zFw*(67P#eERwSunw!JGx(=MS zW$fY3|3zJEyeF7B_dw4XF}BmX)b_k{6=6U^I5~g4-}VTW>r*&|%T-+zJUaJh&Z6Pxcvc z$*$6TDNE5TZ{r<=NHVc?eWJvS%oymVnS7(A5x#o5i61l@ULq0)2S&ud43_BKoRAOVtMq%GNb* zg?5kXzCK0>5 zQ!YZO!53(5c;$GL!Gl}QH<3sidQ0V+{2DFFmMRbZ$anEo)v1>%Y&7zZ;R;?gNrv4s zWU;=1p;pvN!3=&f_%nG82u1G(cSj7!Gf1Z zM0bX4$lpU;%V5$aZyD7HyF6}b;9)xmbgoo(*pfu1+bn#GVFSGat7oypp~+nW4?PFP zFu>#%O0|aBM^3XrsX5*e^sd+~`aZsqw1GkfJ)w_*&6SOQ6i6kW#5KU>yf|X}436$J zs+N3iYS`F$YF^sTJenjmwsw> zfF*$0>g4ASs6cIWDLs7jiZEe%@tGjRMZn&`XNBLheC8V?4#E3hHdfOw;uTH)6=sOv zq5cK@6~aWveL;=V-xU%ROn!WH8;}$;wYN#8mTH`6YCF?1A~OQ*%NI^GWvlybM9Q_i z{G_a$!c%|%*|2B#hwe&J0k~ogXK#7cGXh#%?pS2doh#)!f5I@ZF`v>h z1{?jLa>nuoAM$1sc`bMChpKJ=B!LotHJzj~OJf&HcSBmMJnnstb>8pkA33A*T#mC> zT`b1wbV^<^OdW+)rg0<=p=&71Dq4iDE+_2uNOXQIXF`kN=l^z8BRt*|kdf5c+KfCiD89TPYFm15 ziSf-AcxmY?BXhXEyDL;^0gcqw=ytWYTU1y^zqcRoMcloPEa9cKppgOqsG|?%9_r=t zk`xrqm!I-)5_|-d%5a%#P%UnSHojZmkBR>qb{VOoF zf4f%aEC4U=@q+WM_%2Gf){VW^Av0sq$p1FT5PeM!pX($90CZqjS3Q-CB-j7eR`7|x zf=Z(dMj<$IBrI4rDV5Z$I3&>Pvmd2{BaUAQTtI+-(P_Gi#K)tTFaUsGAnE!QY75`J z&zY>MAi73&lxE%LTJ&G9o%MGHIs`%-;H6-7ayPCyEwI{JhXNfJ0O;;B9Q*o_Rr&>$ z<&j~K5?OI-c<8E^CytOz`4BoRDgMeuOQ)QPe!)A?s%8xd(xeBXSr177JgxvEO)GJ{ z=4YmqpI>hvJvMdl5!g>58MydtGuqtS`kt9Og<3hV7baxe2Z;y(x5@AeEVMf&&T|tv zA(>U{qm|@-bJV(z^hAkH&{<5*_{j*KZy|Sh+P6)b|GL{lR7mxkU`hZ<8)NpDGp|yo z0#sFSd9K61F*YpjH6=}N%z$qoxE}&P>u$$P#J-GxAReBrG0ty~Mg13yzgLWPfvhGg zE}5|!AT296)c^WEIeEiV$hWZU`mm90p!A1O-7dVI)WM;x;n)3%99QxEEAwIM{&FyX zFQT=zh3j|>83zrX`gUyCMAgdd&dD>bmpQm(8L9ue%=L`9JvEp13PBHag_A9!(}p7q zrEW*tjP8;-@)`dN>{F-rXJR~Z_Y>Bzh?Z1WwdUecs3nbZ$hG%J5C2Uyyz#`u80&NFz@#4~7#X#v4O{o-UnX#b67D??_# zRSt}0>8Y}QewahiTiIz5I9ZIi=1-K z5!~27&^bi}O@K5i54q^i#Y`gUn@@)apY^}qND`3xOWtmhJelp?sBSR@ zY2v^Qm1=9zk7+q3>mdZs)XP+tf>Y$4`h*+onPH^N3ihIv1^CdACY+U#M z*){VJvv&RuRh77K&YiE^GLjf(d2vZn)x(D6GPFfZ`{MYI-?rosp~S#Pqn2g}zduxj z7?}oM40RSd0cEl^z_Q*`dd3^EGAa{v#s`9GRg&&m=3;3!F<0faO)3?#Vl#;>%bP zb@7bJ^UdeBl7^;QxoR@4pV{ld)XiE|7b;KFhQTinHgN`D{~44mow4g-spBx6WYCE{ zvh*}b0Ea~!Y@$3740(S*=ht2Z1qDZEXR4*8rG!%A$gwe*Z-RoGyf)NTldN69u+6g7 z8>jnI{wjIhsw1L0jy0#>u=Q$SirE4rFIY;BDcC@s#j$U3?HW?1i93H>2961im zFO(7jZTR9Aj)~8dlvVTvgoMW4-+dg=qIGIe8go=#UcY+#`m%(EhTdFVDe6O3%DZ@J zCWGZpTUuJ^C)3R-%M~g!?ngW)M#1v63}6PXYFkaEW=dpaq;m1%TGH6*{nHbj-$$*R z0P~Qzuy=MCHR1ynVol+Bp;+xL@Ha9dBB8Wq^|dfoO)_10aI|u*L0$#vKySdk)7Ipj z{07YtafjP2(?9FVZ{R%XH=(2PtQNn?_mAZBAyEAfhMs5dkfk%|XK%fR1E;gU9YI+X z2gd0WG^_6>f! zKJjEeNes3jTgF80+=)H@AflDbm0QA8;fF*4dh>>@6iuQc9agT^UlE3+05J+6OA2Dm zfd)tI_S)vo-54t`p^yj@)6g3Kzhu{%gPQrUzuu#uWw59*;H4a9x}Rl<4;$~ zGfSv=4{jjq+VHuQ21%0M9X1%yi8H~!M?P@AL9u@8GEcASKTEvai_2Gyw=#|-bOq1w zrICz-uwoA0)7AF5&r*KYL=x5>C@O;JUfZTXcYc(@49v?!`T4*ez~})78vFxY_L4Nu zj2%2GJYSJ^xBOsw(<@$6-wq&6R)U}oM|84p*X#;9X%f*C)Hj|4N}`KP9=r6fS42DxdBNxgi5?W*brg9&C+ z4upto96>ZpW$3-9O=n_WmcFwyZx#st*{CMBvxEdQ^Vz%7odET|+&R)I{!W(#7n`X( z2zJeeo3P!}Zc*ANNQC^#oxjyX_F&i8LMQob$0dsGM2jV5`s{x5S!0*_ll*zU$$0m| zs0J@;$oR^$qZvl~FV5YokBfXa)aKQ<5ajQ%?f$A_P~wr5x0^uXSEN%U5* z=ZLqcyZYJTSFrKPQyAe=VD>%R+Rj( z-!wBNYq^?YO5s$<5eY1<@wTm2Xi5oOQUqeS;>yVR!Y2}eV#oy9PH!Ll?RuAjYeQ~4 zfh3I`TP{9}pB{^zpJ$p@pTmBRtevH$Bjn}fND45GbDR?o51Sww9LESH)rVIw{154-TkJ@80k4 z5A^i(o)mKukt59lAfMb{kz}SfH#f1Ag!uUj<@%;GU`fPE<{cN;~n#Bc4p@B+Sa=)h z>I7?d_oyrn3=W1+J!ERJJ$B>xnQd-s7kc=_PZWNgupTE8!-KS0(R#SL>eiWUx=+f? zJa=?*x=7=Ho;W!vwXb1!A2<~3^!GDVus+{7-({@tdl}TBo`UM?say;_LFxJ0ZbACW zNs>Jic@JFMSqn=teTRa*17N;*4&++TdS+6^o3{?>qv=<2QxA< zI;pCvvM?}2e56+0g$o3(Qbpfmb=3TE>u7Yr^RC7`OP#38y+8GP)z2b}_TBqj?0O<* z5F&bfNI}Ky{^T2%IBxo^_&AH*5ij1ED=m*@-5OLCnaGgX=-TL!?C{B*K=`;=s@mx0;mSz_IlD4KN zq@|s3b93K`5EBw|CKTfONJ@rkYiT)3OH13jxh;`vYiqNB&n#?Q+_uU}mXyTAy}_ZO zdyfBv)P3^%(JU6ErKEBNc|gv`m_)-WIbg->ZI~7~{1&LA)Kt8auL1&c8NEb12eKr* zQ86*C&CNW+9S07U&?I8j;v!)0R9!>Eyz}4j@jHu)i&5kGk+U$cu%)n_zg|+2mz|Yi z_@>6km&1eZGP1Hv$B$u7{`jnv6&CiZs;eUw^!JMm3TN~dwX|qH9G{&9c3UM{aeVt$ z`f_%57NHXx6&3ay2^sktl=XCZak1nx_{V0gEG-$>cE<*B+H!?vJO?390?&nWhbgn< z5*GR-maFRO=ECSw(@{lFk1=;y_`o{Qt+TVrOIur)%F4=Q8LrWA0TM!)o+tBQTR)U2 zF2Nv7@!{sr7u;gf%yF_~bEjx-uwFC-W%n}CE6AUI$UA@wys}2-hQB~ME9?I7ov1X{ z$K;_;vsYJax4ND5B|Hrz8bVNp?$5vTngZ+yIY0N`$-9bA14NeHD^ z3bA%`<5>BQ_O_k&Z44&pnJ$MzQ%8qN?v}WwyzmJ=fFy~`n!x3w6&7X&h>S2eTRoM>bja<-D!zz z)FP;tQ@i3@`USt%WcM3jLCFSdz_uLbosx+|Mhi)*tyXL zWX0LPa$>6+91io&WReVm(0?`ILH`z~@iH%yx#%A;TL^|WsCXIoglOQkuZI$uTc`7Jo< zwrFJ)_8K?;lh_w53S1wu(dLHgF#j=df7<_Na{X#>h0@^gzVB${d65!L^3xBb#-Mo- zG^$}_cy{pDZ4!g>?ea_eYk9Tn3iY?un%ZvYE1NyPmpghg0NtvXHGo?IFqVc!2p=c- zD+Mei8AJXIFAJ_6GaqL?JZap409u$piMmxn!yNdSMI@y1h!*k&Y+;uEVAioNh*4 zrVpgWx=QPw1%Ci)fQZB5JZte>Ziv7-&263nkeLvG?nq?3I3N`b+0)atF-US%YMV%7 zN&j?#1`2*U=OqPjJ{;}(_V%pu`5hJ#ZLkhy5af52%%Fm=%r<}G){O*$6hwo5^dK1q zN&v*(QT!n^Mxo1o*=M_4q_(GnQ|jh2&LB`UENG-4;)($A{{W{zSikj@rw^n7F|GsS z^aT13&*T&_0t`LFc7aNuQ+wI5`VeJfI|0E%;`-vn3t%t88)1!rxE~mD&AoKc9$<;? z5kuG1F_GtAzkabd0By2KqVJG|Qi~E}3zYr-{hJ-=TVrax^iOS_^i2>6wm^UFL(JKv zF+d{gLv~aujrqV<^@Z^STFnb%Vr*{Rx&?Rwj>c135CWLZlLSBpCXp&+nys3f2&(=u z=GGFnWUd3wbk_FSHHgRDc{6RGi*o%Sw456HGhl37IT)-BofQE5zkU05M%2kJ^&Mi2 zY#|=J`H?|srASVMhApyHy80a`9{aqxXM8zqv`HU{jv^8C^}BVlF*AmKM-q$)=YW1v zJ{#4yh>9@>yp8|o&!4r)yrZvAeTvAXzweN1{boG%QSCyOkrU(XjEQyB`inp<5lK?| z(`+i4`JsOhGq$NtZP%|!`27N zj~{_p-ZDRJbkoLj|Ni|_KO9u#aU49O^KbNN11k-MCzRNrY>EH|;0QPa`G9m_BaldV zo#_ZP00=W(gjG9hYueHcFMD#K8q^6d-qP- zjPDQ@fCxaPE03>wfV0{@D}f*FMpl4-00yWa^?#c-;Z4=&jROH(I}<=eix3~FCpK|l zG{9`k0@q180;9kq@PJtP)PLFpAOmTx10nz`!pLp_ZfP4xC%e#&qGP}qP!7xj-)t*T z27m#OPo6wEBLF0z!5-L9AP6WX$O-TT`1+KmPPYW{BfP4Omoa4%NC4eP<6qkwZ$M6D z010Fp$g%#GQe$4+xN!q;G#2XC$09#SptLPu8<>ya7F|0$?=eeAn=^=(wh;hS8?^yJ zl{OYxN&?=c?KsB;;H!%r=arW}gM=W`Qmc@n>`9;aA&(wC0_qVdAQ^eBo>@CC-H7d}4!Gj0p-!x}$-@c8kDc_hC>C>L(neZ{%Yz?80XUqX@LL%Kz?DQo$q1Xh1f~Z+95hQkMj?v%P`tdtwjPK1I_sy+Wrzy+-56E)H(0XdrN;z92 zFc+)3^!@+;|A1`6@O3~+SH@LSzP6nmX|woi4}k2l%kia6hS$($56l8wrKtG*@YSDE zaF#;(z}Q@VH=qjmD6i+FZrH#9R9Bj@u?*N=~`>yA@o_>A@ z3i7bgv1@(T{r={$JOnbpNB8vn;wJC=2oMcAGBGF#$T0+76_uPyf`ffpvg0 z9r^^AfO-)ufEIa>;sfN5!s`s|AaDSTu?eK{A_E${!}Km?ueRuqQCDeCyuwHbV2jiM z>&P1W(H10>6cGSwjFD>*KxG3Wz#EX|83fd|;hfRRf1bB|pEMAl7ia=@06Wn@9&XV9 zK(q5KdBGcJ-feb66`PyXXw^g*+hAOZ5cC*={L}>S&bZQ-tYE{Hd)WiH!j=4?Ot$RZx!CIPb+K<>t z%}N@JmoHyxhjqkx63#1*n(jsNkTlUs?Lm;W#dVR++4bu5M0+o1!TbvD-hiXYl_MAD z8}2`D1Y~1n=j&uy7EQ?ZLS9lNqwBI z0E)_u*`&2WN)FF^&Vd=xCVe{U+`Q;}_K750myk>;K<0uvfMa#%NT@H6 zt1d*tB8}!A8{G1rG!`8fP1M$G4_Q#YNbvX)5PgJnsMq%hhF3;6 zuSMZpvz~~KZ~(ZU?jl=@>y`3PLh{I8o)4II!(s4sf^xZ3# z4FqI>CAr8_u|_Ys%`^Z;FW^MmZ2Sq3D!<-litqp-q7FRaKx=>_X`=>M=mlhY4&mSx z0|3=2eL){dTE7uj*ugK`iLIpPSL8)cj=>^r<3nGdxiMxbN8F8=BN3TO`5Bf zW8UdE>0L#q^{X=}$l;>HrG9H{*d=F)h)U}mIUpdBS}Ayl$Z~ zd51h%ue4`zy*f2H@1LCHq$3YLH%21jG;8>M(_68|Ye$m5uW&RqrIymFMiO%2bE!eI z*BXRm7?_@0IV?Y3b3E#7mtA%_?jiKidoBfw$1(A?7J!IX*XHLSxy_>#A=hlg0H9BR z(q>b+ZQ=lq=WL>`+ia944FM70;k0Q1EC7f!27uUE2z4VV32!|xKI#uN0G{%>y>Z88 z2Xq0$>I3{DLcDSv+~gtl=9|g^KzWIQ6VCt(^aHv9?f_wDF#u2AOZnzDS0soR66i%7 zc=$$9H}DbA^{g^%;DEYkkP-c(J-o7{H)pwzsK@>EEdSbdAP|TIP@JCt3f{hb+naXs z?gkpvjc7{m(r-u(Pp;>c4}=@zQdW>V{e^G>3P9Q9H7+_rq!RHed;1cQVVnWCYzF|z zUH}dDVXS}>W3FDHRv8W`^B@Cz0KPVm+Tb~98zLFn(4k~Ni_l+r#&)#*h=wsQ_rHDs zsJoBtmikllgB|HV`m;6OZX^q+1pNH48K1_uw^apf{UGq73G5#@1k?dl02O%y+|nUY zMiCjd$tDwa)BHfdj4i#0ag)MEw9i|o%F{jK<^lxFt^!|F%<=*hp_{C6MaGGdq_S<5~{7rGFBovbWZfW z_ElbILpTt$LH`r;1tA&5d}dETzI(M7=|(=0IiMWSSC2@O>xc;3?Z7&6fDp0|?O;RZ zcW)y^{@5}5KuoQ5z&RVS9(wVC{;?M6Uy%asFkaR?#6f=|O8TJ)p0gkv0)(!<({D>+ zJ!Bt6Ospkrn5{{rWH0~x%ih_n*l`0<*xgn2>;AA0h=Vi-(S6-_1{L)5?Uqz3l}bHT`l(vRG~>ZniU`;VZuJ@C9+?K{U)rfO zj6cSO>OkJ*^Q$2Kjr9q87N*ia;$n2z%TfOL0OJn z3|$N!CM_^R_1V!`VzyAII)uU%j0&NF}Wn9khZ*Km(c>e6~#c=w#Onlwa4AQu2zwMbzWppX+uFKtT zsoZ4wrWHX8kE;z3H!#vWPp_rvvh=F4VQG(*Cm0?6eqK6vUOM;Z>(_4<1LWz8VSo%6 za3TZ5V|Qdl*MHX{-6lLW9PVK&MKBk%6caC_XHRoHMt9_om*uzf!||-4H9u!12S|OO zG!LZ6iVU;6%=-4!-z5(~XB(XNNwM<$_8fQ}WH{9Acv4%vjOa{swfLN5*l{W?l#Bf# zaGrTyRs`5i$I1+=3|c`+{U7)edF1byy=VIo+n>Ui4YJcQ)(d=E@ss;*R#Moqgt5cw z2XwL8lE$6a=@4W%%4U$c72m6~GeF*7Up)T}1LVV^qtcMiW=P!X+3)_&u3IxSEFGvk z_jujP@75b2z3=>YhXLZ(e8;jN^0`uWLfxy|ar!Zm4Xzb!J-H0j=wE?9;K+E`mcxuWXGD;*giq;P z^GK1;Ir~z}yR|}{3>OT4wrR0i#F--|0T_Q?eg`=UdHd7O)Bt(67$CpD{I&ve@KugG zo{#=)@48k%^uBiA(*T)mDJB^pQ+PLbY{3F%Pt!^W_h5kd3dk?R02we~O9LeTliLaM zjNSf_S5Y#b9~2)o@w>Q1nSlM14_LQS+Xk|LKR*p|!c0G>-Cbzr8d7jVs z4hG20Vt~8|21xj=XTS{;-6u<{u807&=j4U!#9OfPyY@K{H#D;G;YLWu$_Mb+jg+wh zGGIWL0rFt~k=zIR&Y4EhwK2YX#e)I&6Wmzb2Yg%A{^0R#=6R?^J8Z#v>1RN~7OaE6 z>pcU~SPeOP@WE59fXo~F%b9{_s^H}+c-s;fz8pTj@GwAy%b*{T2nP(<+}k&Y{@6|< zuSR$@l8aB9fr~-Cdh;sX0}67`QHL&ZTZwB+3p^Kba`n;@@s;)CB}#5eudc4}Jfl7G z%BxFTN#t@ zz#VtK1)fxAi!Nex;2xHP!MNEaayaoNQ0kE#;ZBFiOXZSFGJs)+n^IgLtKZA~Tvfh! z|9hLjqd<4K(8X;mAbh$ibSHj;6L-8A6S3_MxQ~X9GOjK!FF9YMwzuU$kYyVWOpI;h zqDPMSCU6K`0X+#E%J~E5bK0Wh>9}FW^)YRCI-Dk#Px?#pA}>(Li^iAUd!NeK!%Z(P za#5b)2XqhzrPb%95yv?cTwTkU;roQ^WpK6VRQaZy3Ov>exEaI972g=#5HseW9sU_O z4_oapI*r%)J1+j>GMylaWxS?@Q@HN6A);A$#i|R+|KzI@`ki##~kUj<{Zyh0U0o0J$NK&qW2Pmp*%#)omoX@`bt-o+~pRPtHe`N zR5fGBA<{B0t1jR}86ZvWK&9~DW1c%MEcr*Q_#Nb-9Lj!)vvlDp_mxrz0MQRl%85Si z(FhPeygpHffJpA7LnFZq6(CI!vO)iTv+lByf3Kp^0+T(KJwy2^3j?)enp?6nSD3pqMd3tNPWqaM2{+^R<~VM zS&@;EnP2>5#^t5DJn!3c=sM+re&9hu|L(pYb;~p18*kNfDtqeFe-(5kPhk!TeGV`iP2ngiq1N_4e zKt!T1V97^lM+yR~w!TuQcV`ivvY- zZmvtzC!wSF0&M`%zkB~Aw3F0~^%uX<=RHo{@(jTEOMVs4cpg3IlJE^JGB-=+CQpgB zWo-v8U%h$-O)p7-s3bV-J(&B9%Pc6>*_kQhAMlpSq1j_}sl;SoxafAHWz-Y7+4 zI^j&bNfKDPhlh&1lMQlC5%C@hfLspbK|g9&?T|cC!aq4#&~Hovgws>PgCRL2a7+&H zkSBnAp;yvOqZhWIf9|PUL`=3IuZgTYU(7h=s$xX_= zB(vxy2i65++WW{YW$ww7CwM`TkwCKfS7K1}qdH11Dv2Sv(I)&jYfs1u5AP@a_Pxf; zH+KZAy&gS(&mNGqhO=PG9`S3}O-x_k)Av3t{k}L~2|dbD{&dLX(001%6zzh%qPypXc zK1uk++7IMths7Fbu&96*eUmMqoYJOv7f+3XW}p#>qa)Dm- z;f;QyFax>34q)wlDWQP7a3+cpMOXG}N`V4MO|S_-Q7Xui_XmoAEnW!?&vXL8K z`VipvoIcEpx>r7b{!AXoiuVXDG&gFi4DIF?V_a5wv>GF1SiR&FP41Cl-3Pzjudhq$ zsc-QqWnBH{-A% z5C3JqCx_;Bxkf1W=5~scb%2ott*>9d_I|R?m_Qk}-^Q3{B%$OAFEnP=LBYxpbXH2p z)e`WpG4tY?#ny;%eL>4z?k4@~Zo}B7W;L0x&Z?-Md41tpTGKM?yE;=}-BFJ62bLy$ z0E4BE^%U?+F%fUfV#^}QA`DQmoLZDwX<1__0v1mHv$(cswip67yd@NZLS8J|7FvrA z#livzj9VyKHwiC$LjfP#e)7(lN@j|J7DU%YbQTODWwJb~}s z*!;pUcnetZo;`b}9h5Bqcr)zD-vCsh5Mabe&abM<2Qi)`0*nE0QBQwNaEzAUe3yV?o39BxvWuPYSjrss49s|l&mRr27 z#LF^9M|;W*Am)Cb$_!Pijy8moJ&G2qHQIpB6l8!V&jpJ;kcq$TTLJ(Blt3|sk(E`U zdG{W$p>6oyJ)iwWntwI+7za z8#@#{0Gf5(Tmi(E7sk9nslr=cfI#dr??d36Vor&y&&aKhaiIXu=m2JcVziSJh0<(X zkSE}tGJ>~xN%ikus99k}6kSRj*&*YFU>W}}UcB&=ENK6=Eae$(QZRUOd{TOiu?qPl zm#(WvNdc)89ya@~LS7Zd9rGWhFj;MU84LKyQ*6%3`-*Q0B}99D6!K1S9EXB5cTytA zns$;!a^74`>7sO#PjnhrpB4a)yBb37SPMw_>q+UR_P3Vh|r>nh)passp zSd+0%K)6zpMm=}C34Q)vZ6=?LOSxFow|jlodjnc7PEQy(PQg0LQSPSz3O-6e?sQSL z2wPArFj?y?#=-#rVHQH*V=5p3E~{>J24r|7EIHphvG_{wVO3@!2ar7Po1&xbKmsc= zE3^eU55d@{0&KG+7XFZ80BCqe3RyG>quA}&=&C({SwOGr=wRIqNVo?Gj<;xv*@E{mwp5hZ!Tv(q-Pm{#z#(4wwWrc;CziYoet7iQ8# zxhB_?O@Nvr<6eMDds%%8-HT^ir?*i8+}C^X(io~AEB>Z5;!%HlzI{x|fA6ZT?#Vlo zyqwBIK)L(&O0+l5y>kx)PI}axl2oWrJOn1~X#h;MUHA~N?%CBw{CE^i=7;)Tf3l=Y zMra&U4#*47Lwm}So0J(|p~CUZE6dH#@eEISO30dVXHJQ}DUY+B=x9G!ikpHj@lxIT zUVUWtCgpTbkGYppZq6{C$gTd5my8G%idh@!qn|;@JWhebr{<;8_fU{{D23b^PrT4P zQBx*_$0`&Ib(;Hm$82hOc;--3k-fcIPMwnauc*>KJ3 z8OSP=aEgb;_!K0i3o;)%wUISnSozdERC}*_^AjCfwcwmOb7;s|g zCmXIMm$hM9k@aE9YxfP{9iR3KS_;h)qC+NxtEi8nE8bq6EW-e{HV7YNy`3_n|MeT* zb&XQyd9oA#1GBsa(e3}Zc zt31jShf1>6sf6mIkWc{0Ild2CFF8H?S#*| zOzgeH=lcgrUEb9hnt$DArhvVD8RK)acTUEy9*5tX_X)Xbp8`cd zf8kLfN#z>I8`H*jA!g$A#pml^#l8)^0I1`Ey#V-Ff8Y_X2Wz%>vGAt^6`E8yny@xu zW(wd>Zq#S5MAqiO`leNT|8D?_72V#C_B;SkfGfGcgXqu?6h|B6?UmRJ!AlVXwg5Lg z;ms;sO$7f%$l@EjHLR-f1($4gDIpycN{ zEX>us$IIt=V~i3$lw~|MXW^M}wiL4N$wCQ-@-dmS{5O79fk2 z5Q4cFw9&XtrT}=y&jMzYfUM;HU#O3b+rW2Vf#r+^({-U47AA|Hg_Bo7_>01uB7Dnp z7BdP%VLO1EI)$KEO-i}hwrMQ3F= zgKfV6zytuGW8Q~u{Q;-|^MC}}(U9f3ds9RxViW*iQyaA-IZ{^#1^_zlqm)np^GNAi zV26_B9W1wi3ClJ>LI&&uuo>CLZ2aeW@Xbr2KC$^Wy#rKu7+9Wt-|zmO`%zNL@R=fF z9|4QGeiI{4zA0D~57))i3+Ypm`F^u5v(N+MehV)H!0}9bg>d;z7PDR}!e10J0RZa@ z2M^dcMFGJ>-Wa^4p zsE^U8-2vmCi}&?e^GWq}Z;Alfr6{)dfu{|CrI?XdGN6ALM94(@BkYHv6u7@IC}3He zHuH_(9gwV0KK(XlwRggEl*$e#!2iIuz68|G5!z&*l23!@S)H+o?3;)pxO)AK+PP$K@W(Q4K?k0*%CVaJzh^A`fO6L?v{?vS zoYAT+7E3_0#DNw}o|qPCAqW$^7Ir2~0gy+xHc*(d40^`<@hos)u?HIMnPD;X?s8_t zbN9*~4zxvo3%@!6AK;e-Sq%B0O32K{1_vhU5%62LWu&3hI%(9U?&y_*UKWw5bLS;UV*Xgn{RZf?>~ zpcgs-yt7;LzoO9 zAJmEWgg=urN{fjeKkB?+A~*e2zlY2RCF46nxkq*-PY@FmDktruO%JSG)0RvGfRgjg@ZAwtGDVxyH&PdrK>Atw zXZlWLg)-~BC;BxM9wwhiOCP+G=tn1q)+w9d(9spng7j8yg(d7L+d1nw%ro<-%7|A* z4kb|o)LfS=o)JT1Jx6Y_(#yXeZv4awtCbcveofQVv)SzBmz%|>>GbgA;o;$b`3e;( z^hCFd#puJkx1-66joZ>{aEkl+{tQ<9_%JKT%(soNYexP_>G*+QaAvkneku9ov_-}< zHuzri{S(?LU-qDZv`cDT2P+S2EbD;!r2Qz5o`rISvWLkZNRtjjlt~uK2MRpOl1b~8 zbDgp-bO`hVL=aSHYwzjL)@`^A?Qmt{R^02Ff_^wBv*(*&Sy;%?pjsQxK|wm_1V(f3+PPV6PTFNv zS9RG1t5BiM4VtjrHq36{D@Z*&fW+f!c8;?mgbaX4gl5@cH-Gs-k+R!#u=3MPEXs#{ zmPJFveLtIzjc@ahwRtR0ThDkM{r4JA>*wi|F(?bFvv^s4aIAg2cet!w;Ml!&8-7;1 zDBM0HR;N|UyLNeiGUW(Lk)u`1{$?rMQsFeX`OfqbI_Q41f;SMkb{cE+_3c@8~*?@5=20tTKlQanGX?>f-`rjv zOsA&>0Vz~ys|bh&62ba0(zysbHK=G1)WEIsJBvSUTiCdv@J+uPt~+VYknq!`_Y;!2 zRoZNHclYy?YNxh6u2vp1$J88le)r$U8xMRqbwojmiz0klC7CBwb53dr5v zxB2Pu(Z{A~ej5d(3%RXXmSc7mHo=19+v|4rnsT7H{5G}?uVaFhaKK4Yo>gdJj<@RH zKBFrqp%*H&ZPI~r9CT&3xwV5E3lDWZfoD=coFOP5EbL^VG&a-Jkp-F7WJ-JJ69;Ai zz2bz<3}Jy~?%`T1D{w6ABtP!431@-sK2Z0My?eop90Y;@s@?PE2sud3GB=n@?XF%% zC0V7A9+ZzVE4PIF#X!@>G~lXR{os)acHOD_<} zIM7NU5QPja*KkBYuCWf8fOZU2X0I3Sb=BFH^nHu4T-(1&^UXElKFCm8z_0pYQyC$= zfI#IyxF>ui&~V%%KoEkcqtn}Ia8#fIaSYN)PM&gK=dJfSF;IG-2(>=CemGCkla72s z>*=y~{MK*Dw8p*brfp}D?zZy*xyQP3C~fo(RSmQ>T-5Ay2tahcbF^9c4d=Zs1!7 z&WypX1|5`iJ@4B6WG|iH*j>1Eppij&>-X~BcW3#|wq2J@y6Wq-zugW@c9&!D(s+m7 zDx#nff&|qa%NU-Xz#OeZ4_>zI1`iI1|1C~a_4P$=c{b% z_Fzkw+ATlNAGw#h9eEI0{zoy*G^~(icl*p^|9y}zm;sqHFc%=__LA~sr$Na+ICjy?l>Rp4xB05;#@#ZQ%9gv z!4sSLP~Py0s7r9q(Ytho-UnMMUfbC;Vq4`{>7Zq8gXB)TAMM4pes=65kjW8o$`-ne zouB19+jdqrmpWt?|bO7O(B|zAJ5vmz!412P8coe`wBFqxkvGa{IgPaZ% zHIgj2@kscLawE<{ASiA|9>Y?NZCIxrX&i?lX&NPT4k4McSdKz63NAl5BREbz&=9fU z@^h?|*GE1ibvmyCQZpl{Iv@RE73Xrf&?!889cBc2bc9a=^RPB8dGj231E*>B#B;Eq zgScX>*?vq=qE0TcTt4I5tpMx--sSle?I`OKz+$y`^d&w50zmYJ$m#=zV36PyEg9feD>@a z5?8g1WxqLO(&2i}lb}=X1A=*?^ab5j=hYBF<5!#Mi*}Ls(tGIq4&xfArk7dv9ct%V zhcUX3%#H1rFJJDyKY#vQ+bU8Bo&z$~iKXAz-8;XStGpyKG$!?*@{PyA^Jpvy15|(V zD{tO7hnVs#m@gP4+*6tUGv>+L$@TI&lYG{PbbATX%@1@~y~y1`k9L#NH}tv*KYjXCdCq*H3+lxqv&*MM{^Zu2;Xn0uIOFTrug%+J zDK9!S%90LsCX$0B85y+8xBw>;m|cehqX+I3(#h%+ez*g&fB+d z1AIH+C;%*`z`KB zz_>VP9Sw}>7uJ3Ue*wSh97zJ0)C&+)_EIOv$-!sZ01#-eejqpHAwdoh1a6&*eDB^p zpv-@Ojl&F;A#6%NA_C?8)rVsuJlaZTOLE1-1GLZ~^^1UzyEbXR`XViWlkx#NvQ;Mp zQhSjQdPMd@@9IOZ%11Pj(+3Y80QCAm{yZ-Ffc)q*9r2%g#_e-ExQ$MeC5x}HKXn@W z&umuLYsE;&8=Ivoc^6x^~|lewO4<;M!n1f z>VxK#@<#5>3;N4*C-NtAztLN|kfBFD zyprZ?ZKh+$ANl%^u9|ZkKxqypO9mrrNd}0Lb%iXAB|1hQ&1bG9Cvsy5vMycMbhLs~ zC-`}Sp(mJmmiPQ5^^+?jAoDXg<`0g~o*_B>8I-yAWvvd!N5`8RWJ_DR;Ls}z3Sh(v zi8NRM0A4`HLSa#`=mG~U&;fOyT`&0$hym&?b}Vba2`gDZ*@6tL0CE;5q=Ge(WwrX0 z0>nHQ7CIJ2NnRFcUIidN@X2xpl*u1Rv%mtF>I2}j%H6qhN461%p)c=2MiuvVY)w6Jz481RO~SX?dCS&)Gx00nU)3o-|;ldH2*kO&}5 z-N_EABfBMFPlm}3(BQcMW&u2*9c0e45olqd1>gXx>RbpIYqNU+;9cD%?X7*R;Q*lj z5JjK`3D5`R%qmWIv`KxJR^>@jzWxO=Yft^NdVWUra{aq^?|f7*K%O1}j0hA0gAA}N zD+BP-r(-x0u&50PBtXZj1NhRZJYUKI+>sc7i8o>IL*Vq4OvsX+Mvli+Tj`cls#%HM zqil&h^!w?qJH~}`9Ivu?oAO1vmxR1A;Qk$ue)#aASM?@K^9}hKqdZN!dPkZhvdbtU z@u-j^y+YU}UPFC~Ko}?VoyS66quv?!##QAz7>~ZI11r9{irl1h4v9oC5I6NibQ(kY zf;{Mn`NsSxFZu_pt2?6Tn$h4=>bvnnN83~ZiB~2PPv4xVt{xKEJ3v)=r3eFqffv&0 zIV$?<@1#x>0&-rl z9r8JnaQLAm^DVv($n%Jea(fJ9OIx~F0#dk=#iqoPD6#NaFtX;4);hmS{Re}O=0bn9Yz(&9W*a7-2 z#(4`ySATT^S_1_DgvFPo8CU_jfVVSJ`Las)j7ASi%iBT?jFA`c$lJk6X<=W=7YJqf zk{7h=Ct65JnSd=pNSDy*ugfI*=s~5iiR9`}fBOT6fP}lz>+W zSfC3mrzQEM8$%weiO#U{0zCS8^eO{^leg&i=oh-WbTXjn3cp3CBd9x6g=RUos&r5yb!7GfB*GZ@oB0>*d zy?TW#Ym?vo7U^-HHZ=Z#Y~e8aGlD=K$^z!q4VkKLhz|MWE#i6L@iAtA+DI-^ZtNi{ z^i4nS)hX8c5}A`(`ay1hr#?qgfa>JIkYRjRFJmC^pP>MNMYxPjWWYTP5s~J71lOyv z9?@;iT1)EFeZAkjc{B1z@5zV$Ej`P?IMDB>WVf2!ZwzT8qD5cG5E-R!=Du-$h&VT< zwI5;PnL-lvx&M(LV^v+#FR66^@UOq=js7+k7+lDm#|*(jGE< zs#~9vrI$X9#Ms=U#KR{I`gCp5$^Q?-7Wpj1ENAkFJo#L{JODt0h5F5#H|_;+T6A4jJUj1)P!rZ_ z;bh2x7i%8^frRh?bOP}-tVjy%=Halg18!odfmn-rp>4`=JT$s^XebPgD`3!smaQdY*iJjWsbge++$OgENLICx=Z}?LTeJy@VEyho^)Ih1=;?@Z zdnQd=5g2`%z9UEU{mk&c@|mR3t695}kyL#u3xT7@>f<_I<*%wwNnaxq<_EGD>VMQBj7Y^ezRwCdqwC)H zu0cq5gs}gvQ#x7$_Ve31$Iko7%KxkRg}cY=C!0PUP3jUMx%d#QDVv)Ae$;DZQ0eY8 z-}zR*<+EOgjecxtOBeq92TNJ8(4{^DY!)mQ$ur2y(xTRa++vDISd>__gdDL3v*h~D z?cXk2<<))V*?0A<&hp~{0E!R@4?$W40aFXDMH1juh7f}+l0q6-V#QAjU$H>7Fo{aql~O{l5*Y4Itg?q&zY=i3lPe>&tgqpLMg<(0|=~)WRX0T<)Kd@CI}01 zB2;0Y2Si?ZLBwSXdlJGy-YnPvgZ`|ot91snfj8D@7E|CZf}#G!+)ITzDTAJLZbzx` zAwX5xJwr2-6)-9BHtA1wc0XAJeglqUJ6L}8d)DUqoi&wSAss?Rgte$Q!kt&3Sb5}< zRlkI|_PkSRl)XBZ$_t=sL$&IVPS}*zTg2te%;5? zF7&V@lqMo8)J54qWZ`8!fQ{tQcVv}^GO}naA)wVaQm&0abonAINVHHk{qEj9{h8jB zhxW7ddrrj|MJW@fpJ;y^?vKzh)c**=s}^ zSXQ6rOGH5kAcE_6V__;E^&uOE6rpnng?WYtL^7twdm@Yyoj?>2AKq0v_PM9T2?SY?`_B4i z4|yOAKn0-exPnw5HSQPwAlwNMSFU()3#ZTl3m!l&ObN)gFl)O7+rsK|U=7$4f&?6i zIk&iri3ae5^5mr$9|F$uFF+Q!LR!V* z3$EMkIu3t`h% zx~{MDHqjmB@;H*Sx@eOzLgw|K_t68ol$AOG?4H>$#^fWEhpfy;LaLM{bW@6unHLsb zKF@Oj%!~v=&Ug)MQlPK(JAK@1UGMB7<3&G|(y3v0xjdr0ra~u`J&tYUTE6Jeyu8WYT*2F_Uya2=tjrIQ@OHsUceL3&rBBRJ=5_st6d~fZ zwQ-Xk^F~YRsXSxN%X}jtvnA!HkBF-IRnm5SJLIo!V|&d*+RB?^EkIO>;EOWBwre@tRP^yu0R9 zd5?FMIQgl!Trj85U_o zM<|Ggl7R*w(z6;YxMK{y`+(HEAS|r%0j44a?W$vu2iEQW0we+1taQMOg$)4JK5byx z=YdgHKo1a77BG(-0d%b8E$ZqAkg>3`&;c(%1(N1NP8Mz8mC;`%}knRzB zBHT%R0VZI={ZexBTnKGNtndG?LqTJI4 z2S`<*65&z4_NbS#fMcJ@RvQ3V_0aDUfDY88zhd7J62wJ&DqDN}_x9~u;9cMIsAbvK zH|>xnsoP%9l5*8wKkGMri6{!WqX(scAW%Nw`9Z22^on5W2$ZZNtCx72^U0rau! z-`J2n+n^(%KZFvg>TyH}s*-%l-1$ETD3FMj;nKmPRnFTelYsilBGulFf6TiVhU zroW#8)8GH**Wdm8XFt7+b3)E>-!!j&Km7ao+tvGduNl8zo@@_q<3*Rt%Z0cA77>dQ zFaf9l#jN&|a?jO<5ty7u*RE22XSD?>_iPIgc0idIdW}?g7E8FWA;b)z1^$s>p^39G zep%z?s`dRmb-hmGxBIR^c~_gqe@_YcpMU)8cRwJC7ni=A64c{=|LdQB`R%WM_`@ki z{m&^zg-d&#aE^Ijd>{Vz8oqlC_w3shYvsE%yw4w4zwDFH59qy_XT)oscWi5xM`#D?29H`5wks$?1}v z!KW}@`4E|%L&z+Wb*%6pADZu$KAJ&d1ofdAx4NXN?&(RYRMk}tAJGcNGxz)ajn61g zm&y6`_|1_WNG9)(t%vjQru+TcjP*7d!+vlce9G8RpCPQMTA#jj1&r6!jc}4!{M;M{dDu?{{H^=)6qU9BI2mAxHrZj1za(RDLp`PfXE2IpZRSm&Aop-?Dn2u(r7qt7-3$5F0LnYr#^7r(8NyhYS8wgx3`%%Z_&frq8y{JAGPKQ=FYdopk;C6M5fW1< ztdGGAfL1r|XRNZZU;t#D+4$M`QP`bsfVhzP8M|Pta7GgTufWQM1-aZ3<4W!{%fc^Z5fiQus|R1^}rv1j`J@NsZ%o)u(KE90Y3cn6&U z=_h>(`fe!j4PvI)LH)i_lCg{jLc| zLKjWo9k6U6!rdJDF!79B<71flX0{BELSeyJd=8sZ3*hnbksSPl-n4JIsgpsC5R^tj zPBf-MUgWB$=o!l1I|Y$GZ;g2yO_3_6qQ!U!#mH_Py%mIL(g)N{#E z&)f5tmw)WtO^Sm+5QgE*Ej^SwkD#DCR~|x`BY2i^c!Y0oAf`zmi$K@LL}OW1-GM6m z=l!;az4NZ)G|**l{L44~_UxA|#%_Dfd&_RySohN-v7{%{o_zNV&$JaO4uk#hiSu;O zg@Yh=d}144#e}bX0|2wVYCvQ0Rjm0)uWOhTl2c3&$u2&EQ4pgs_Q{Wk5&hv^D4OVF zuUH#3Fp|J#F}YV5#z!0iP)55PVGW$Ghj5KY!Pm4y+Lce3AlgNe?mYk4#Ksg<+6qg= z?{GCdlW(r4z_Z0GoAE6i`4SuW1WqT;?jerbw%wLxaZNuB^zMiy!FLh=6i<<`6y|vr zBk@Z7a5C^-{3rAcZNWbMLt9yZudR));H{i_D%c3x(tY|&Y_*u1t$g-hqDR};BBV-{ z4;BB~*K_Og5{A;!i0F9Hto`j%u$~<4_$kao+Y81Q3JvFSEQ43-8jvbg-Yb%ykdHyT zB)W*(7!Hy)f&~E1C8r}$7n>8BEZ&!a~hI4UM0d6u~9kL$YL+O`!h#f|vk zoA}N*KB3_IoxXq>Y%A1~u~=ZU;O(Hdj~#_JL)<+nt?x-%+3EeP`~4ht8ms zBY&hVSi>ux;wmvr`dP^s(*30lDNkLc49Jr_&nhKSp+ad^W2pN?sn^%nOfi`ElKh;H%s<6hNa z7UEVJh<=SNM%Z_DcG$}M6tatR1kcG% zuuY@U$WBg9`h8Di5|4bSpF*SO2vs0yD6OuYCo6HD{SAkbMC5Bw(#8B6=x^+OJ_ge9&&Utr2Sp z@xOP*htOtI{Sh{7WX%w#ejkA7C2Y*yJ*tHBwROvHer8)77^e&ue-TdRptU~r1I~(o zb;cK3eGqE_RTiW|g)IBOzRaPQh%Jr@lpHC@2XWofT6yJlLGl5I++nC%eUG>WOFO(c z8DON_f9&UO@K^>r>7jmZ!-A^fL=`IZA@4P*&4k+;)9Hk*N>d1S zBxb*^t`JQ31QPlY0Y!deWdG0gbrc@oFD@cEzw1Tl_3r|Nv=+`@yq=xSK$N|R{KJb7 zMV_0R^PH$T!WpC2FgZC%;H0d}%aE!0u(>I^j8wW`6kpU{$u?D2L8HoBw5KBn>^71?5wpA=Ndsnj?H4KD3PDv>j+MZSjiPtC(L7#w@9(yRyj5ritp>#Jf`9`Bp zWaMZ_SLw;0WZBM)JwNtt>^P2fvh{K5E1$2fK!OhN0pi)d4gf1G-)?WU9Rb*fzKp)s z*&da3=P(TVy4C&ted?z&sPFs3LpncykKYRV2-=x8V+9JUPv}Ft z-44GqT}=V7N_BJd)pTk*92*)oSl!=Zb*ox z1QF4J|Dd|dM3Z!29jYI{9)xt#6QhSDS<5N!UUe7M`|YITX#9Zr12U0@9OypZ=$tdI zF`v6m?I{1sSDL6?AICQe-`LN zKz*}QxSzz@#QK;_c3RnCL|XlRIP4)Fy0f2YKk730RIbTkKgc5JL)JOiZm<`z$*A-V zky#&yuZ!9VUuN@{dJr_&0AAE#{p7$pRStYuN-$Dj{Oa&>V?L&1-XnJCy8QY_#w%p4 zws*bl>&tB_`*@wwF|v+t2i|v{{ye82kH22=91w=$&IKt*J6doS$oextf~^vxKL@Zn zQ3`N!jN_uV3}#>Q!r#33vZhPt=;W_BvaNtLGRwHC$VY~{x(_&@R_ zLfQn&&Yq~x2K|p9!(L?lYtV@c`cf&1-5K90g>df>=dc3I7JijH9Wz+X3i_^ zCE13C8ZIs`Q$s^TLqkKu_9#rniVqfO}XjA(K45q||MFVR;x zD0^LI^wQpvZD{b|SsZ#!LuYA?kw=<=v@Rn(&wCypNJE&(Kz;>YU2yz)ss38XHT^Bbbs{X+nY|A@9r1!5z8#qN{_=Xv`8+RUuWzM4)@={^ zo-1qlzwF&#P82~9$MLQrM0xW7B;3iX7~>)I!IO9?PGI=62uqidkO?Wb_)P_Lc=&#j zN!E3yx2Ir->C|*r@%eeb)Q4rCBBuFRPw}eyTYL}lF`i?TU*~i1;`^M>NyMSE`B8C= z$e&fj!c{-Scd588)!*|R=OtFT@8z|s{`t5%hXdEV+^5IazU*7YP{h^q?@sZ)mocrs zU+Emh?@(%2yJ?tO_1h`?az$f)61FAf0%p;(cyoswKTvR#Fd@VoHx-#f-@$5C8xG zY|Ly$&Ach^(RCH{ncB3}MmnY(E6kzA5PWD+WHAIeQt~y&iDHJ|u>KG*lms?ea=*Eg60vTE{pGzy$_KT`)(XHhJugbn}zfQ^~B*G;d>42PJG zkoFV*R!DMt_rWLpD4qW4*&oFyb=9*6fqLC@3|KbrW z-2r_9R%S;8@m!jkiT+IUS2+I7Z(?7FWZ(_UR_;{o12@lzrP<5@vyyA zM2x$;yK%kS{bujlcH72*=owj8+iB|B>2|mKq5A~|`qU5TL;KKgX!{9$FADUb??I4k zuJuh9&aMY4;RtaitfkgLcz}UyQKG1!M9mqJLwui3eVw&cXIHk)R=O1(GyBg=ix7QQ zRV7lcq+FMBO{%6e(#j3#74&0DC9V0pnU`Kh{k+oZp)#hG=gb&m^K4w(RUcN|_lsyc zb~skMm-3Ef5WR?w+D3~`f6@avi3E<^^qiwlZ zAnFC!OA>^=p0BgEK=xxJ2FrYzW0o(Gq#42>@X=1TYj4ESQI#c#8TB*!UwMb!bKIF`0k(pm;JY}6YF1aFwfVYiCS zZZ?k~vS1~hHXPqQ0nvsyDLN&ET@e&)A~4N-6vfyuya5INW%Ka3JH#s=u)*`m6GTx2 zk8Z(i@bCErzRzaJ`u*CLbvHEf#R3PTeGIY;9^K<=I>pJw71At2uh#>465>ieMCP-Z zI6B7rdr0CKK@h-0AfEX}p5t;l!)#U{%Q6s=h(hY59VcTj8upPTDZ;P^kIg8G67%H} z7t<-KUWg<~AVd%?gN?OO6+)p!g;fZQGCHY|uAHlJ0PcDvbawo0mEzdd#L&SSv9UcM zV80HChsT{8;X*!I&z~Mx^1-|={QCuvtuaQnb-C`503r~G*KINyVVK5ZG%!04uaKUP zXXDW|^1(n?`njiiZ>`P*dxHUd=3>PW|OJU^I#Ooin#2X!*mDuA_7 z-ECcNZk4GHikGRJQo53^vr8X_*TdsZFw9uiUUVX| zMitSzP^$u5H)0`Bu2ZK6K_J^Zmdob*`vnlebxcN&0VCs+U3;v=h)a`XU58dr-PM~} z_qgt?VbN8cF*64J41*-bV!4Ee1DNHx9i|CJ`;V+Xp`%F-TO&hFX&KgG;s|@r!IKe^ zUVx?Ytd&J6?Z}^#@p?Png>GBb{Vsr+S0q?;SCzT6#chHbHmW|n%AUqs+RUU*KDSWI zVw!}gbpoQYDSba#xtT$kO$L4YKVtwGswV{eH>Elpx_ zYgtcEPvL-_9wJkl@ED{C@}h7uYD`sOkSX&=I;yvNyVJVudi?mXpP}-T(p{Y$GUwy* z-q7j&Waf=dj4g1hbEGBw?0d3KB1B(Bp5In3At;af87K&>z69>NZTXqDJ=ZtteiuMQ zmV^w`ROTji1hzdO+EfL7{s%jR*HtE;TaaS_Dzv{2h=>klTo^a=R+LOiS@eiqJ`|RR z$IlQDnZPWK@GmlAzkdCSmoH!9?c29_^X3iSy?ckxpFg9js+&H5_T%;O<426gV;mkH z+Woh9)Fi*l%S*Y(UB-(1m5u}i%!uO{zY0WzZ{NP*_3PJo@!|zuy?TXDpFZ8@-Msgn zQLWC{7#QONo;ZxRm$oK~BG)!U-sO{%6C52K;q2^8^uDdJe13ku%2V2ii;D}1b_QVE zeC@fj*$nUBzn5#k?sq4NL_vG>i$Kq$H&Jq+^c0`U>z3g?ed2Y zAMoYN7e~Ex?^x)kX-AF)0|0D$K(saZbW%WC9-H&g7Z6vjPpuM=4dJ{P?mZ=@apSDc z%Gb+6&2&XcWZ2;0`Q|)4+`-0x?H}%(fB+Cf_MiXQyLJ{;Vkms(&faQaU+gY6D_GcS zDHc{@qoo%92N47xtb!n7X(NL82P`ZU1xste2in<)B8Vb_wbgYlC+HyrC5)n2%m;&* zNzP=FOmfb5^7#FQPNxIiZkG*4Hk%D{xg0Wi;s8j4m)UG)hRgHwGlh$c8gH1Oq4N6r z3aix$03LUT9R(EFYkQqa`u=X74@9rm1FO{vwOWnMQJ+jE;B-2nTCIw4FJY6#v=3ch z$9x*QE$YL5{}2A0s9TxwF`v&N5{baq*B6*fCiwXHfK)04o6SZv7PvKHn$$Q+*aomrJl%EHInRU^pBy@?tO; zFfXdh<-&GGZIqkxM65f?IVT_cjASy&`ksEj&j^rsJPz4x7TYDtI63uDlp{V_@(}Pu~>k| z;~`Hpda;od3Wvj#{)7z5EB9X(Ce*`4xDBzOXd0~n;c$iCt(`lcDo&wS*BPZaB5aG8ihik0H2?q zO!=5jr||RhpS|;WNhONn_@RA&K*WQnD2iG{Eux^>MVn~dCg=yW2n07ST#6vLRYXuh zT_`9Bx>9iAuf2*Ox)H&@Lmr<4bCJk~dCwQZ^9vHpoqOjtbMKk&_ndR*{(^L9{rC5G z35Ubt^?LQ3_4Re*k%v_5@9)dS#f3aPJc!HXk|o2eg@j-@sy5~P9|F$_F-HUn@o3@h z?v6AH1fd}sFE1~$wY8;Q<+ryth=vk^Kp>#MS>jSEmE`{Z9vHWz0S{~z~{x+)l3t(LZ3E|;a(>(K|+^63vCGHC-rSgBO7;iTl6zLIiR ztJP*x|b8IvkX+$TR&2pW;c|R@O%;Off;k0v{?sl66ntC>i+ie{B{|IXi zqaXH|zsca*yc;#|#(qBj)whnFEQVKgsWxsE8ed@rXFT}l!8g|}Ktg$eL1wKN8{&iL z1>Q+W2T>4SepZ;BvX74sEt^ax5|77K#0&-lB`eixRS88T5<#T=my4zsAr{Hm$202j zcqAAMLb4z*x(4O&@Q{=^$REUo2!@i0ZnukIM0C&$sU186^5J<7ctc62gY>Z(BkO?h zh(cZ0bU^A91eS4SfiZ+FU<@S^3B(2S z-?RzrA_s_?%gam4Heo}Ez!>t4T|wYjfS7ZgR4Szc(-YV zRaCsdojH_*KNc&30^vk#35W6V@kow0squm!qF=sz36BYw99hgxPELADOH0k9xV*gV zkZano>e;ZGif^tY_62n%RD*T#=H{j$S>L{W6TZ?A0RY}81cK)Y0a#yO?>#&`ID}BB zgZM0@205Iaoh3fS^s_J{I!%4;?CcPn4PmMH0O;2k;zYnP|v(aglrX+XYIQ zTj$p++&?gc9FW!@AIj>9p;Bd6Q~3vn2r0evur7L4QSrWDLI6q4go7=YxwvDldO$7) zlOQn?-%Egm5E(5nF~v4PPDBQuM>PP~04X~^Kku!st|A_Y zif}C6Ea7qD>l-UF5F$tjt0h9o%89_t&(AlZUAw!xPD5M<^-}BYJ!94^Q}N|~Ik)ZN87ZFEp6bwl&0hV_Ux>o^RQM6LEhxvl<)Wk@n&LZgu5GrzUsoro zs2EwKt6{MYnnc9?r%9jb#N>E}*l!{#5E$e*-=F_KxNi;9Y7uhCgghJ8N`LY}e*XL^ zJOvRm`6F;V7gj8i145+u831CNPovd$7bETF8hNgJs3_FnM}nxnn( zh7r8Hpuj`Q+o8R&wi_b=>7SgOG#*5o&<25_B17a65DzTx0KBq9F)>4M^8gUV1O#J= zu>`b7f*U*wAli--NZ_;f%L4%J2cytd^)Dc_jKSF|bPQ$wiYzsnrYeL7+|nxkVxo zOMMb7!7H5a`}gm>5{&=`V~Nn4WJNXPIgWw-CAgl@9qr9nL3~JRzP-KWp_8N?eS;SU zg!zEBuFcD3BchF8#F8XzeaE#Ni&eXZk0=8o3xtMcFHDp>!Ruk4{wTj9ejfk|6JH8=e!<-(Wxs*?CQ$)_wU~$AwVAc|Fv`5cF_@hxAna8 zLQaqQxg(W?4lng)lzvP><(0Dg+pp2y$?8m0Q8A)9AV{T^tPn@YCmL`(e}4xOlAbRC z6iLX#a#-xs&y#!;-V1=+uPg1;0P3Al6RvK7<+qrmP|(EqFz{97Zw(pV^dR8&R3Vs{)2-939h^+ z2&ePJ??+vWAGZRU`X)?xV9w6Y9P&I!W+c`|y?wBL^R5xIc_;D9JAqWnIbbYM|HP(u zcp%T-vk~E(fOu+iM1dR-VuEKbLl`iKULicj1EN+tmq#F3JPjQ(RuI6ar>Ef+MB;fy zv`zQp5z#LQXvYzDK#)DByavaNYwb$}4=wyvo`&2m0?G5nYFElkfAajwK~9D~=C~EV zcrNu*1U$HI~;-3={b_{&#)gMFL6b?l)L)gxAIO7_;R63I9}&<`;s| z_@b?h#8@7hYpg@=MW=j?etGHL?w*grd1HTV8Q$1-IIsAfa-K)OSQzEP?AMo|S5!O$ zgK($lRYSABNj78=YjfFK;lzqo>Gw?J5)H%M&*I6_4#48*x(Ejd6<~p6bw@P7a=(Zx z>#F-BH(OgQ)^iCWxME0W#&9+Q*RKjTY6<-UVUH z?bPmA;I#)9dBy@FIPxmwj4>Dx2t=^`;4Rt>?6C@e!u73A|Tw?D8jgDaXzk<`~7q}p%iO^1#1YvdV*Wm;c$Sg^ksL8 z)_BlO?zmQnKa&AurQ&%as2)XLlQP71(ALDZ@Jut_vJXq=0#c_#1YCwO##4gNk&kS- zqd^q1HKTU>WITWb@?0}cGmdj^+7H>ZFN6d#!Jr8^|eE4J;J6NJ4rc3yMD|rRe@dv85g{4yt2#1-z7HYAX^#alwi? z%ZWXXIynG2@1s6w%g|>@=K2PZzb`NJLuVVl%^aePZv(ZJ$cJg`?BibdvuR@;qy0(t zcj>q6gFb@ad!PM&A42*T1-G6&uw)a0K=E~itf1OsPeo`_aYxL@Lo#w*6n07% z+E!9;P4V?bx*$=M586Om6nY9stC3@w%CR1K9~RQuvJ5%1Z35_T3UK`ZnW?XbbFeN^ z2YlbhDlwMGPsBjmNEV7PmI{}ycS`c6CYkUgMR1?#{faJFai=SkZ&=mw)(dB5YG>0D zVxGsZ!oYyg2n;-5ukv@^0Q%wbP+od>Tn?Oc`*^L=kik~(H-Hp|U%&r!5s4kyzgURz ze3qQ`p|;ZbOk3+S*M~aJ%TIN_Prs?ph&_rj2uKHZW%uebb9*C?cTHNTIAYPLW9qtN zd_8w<*3~Q5?E!8^x7%dLOyr^lU9Q(2AM{M_^R?PK{yPf!eU@L#amQ00>4&>W!ufLf zFN?pg!g~uUKH2EdPQPx&TN`pv`jR-cW3$bW7onOw%!{M0ZlO?qF+(SA^E zM-ckJz~>1F>cG$E=l4N=1W|2(dH%=VweY451L5zS5Ge0<>h}Nt(=<)%b1i*rqvhFj zTOl`H8mj43w=o7pRezF^Vr&y^aPH3c-7$zLcW0WU_fDCS$rx0U1pUEKSwA-eB6`!~ z`>vVbW;hZTlC8bhZG`MKf9JEM6lWsRrA#~5F{QYEcA59|wX=a@&MKU^Hr7ZUp6T79 zBOKs6ueLf{f8EDnOt*D#!Xo0|^bT=cQT_cvN=DVPu_gDN20P^Z$V!YuP;hX~;&m$^ zWUDWsebFnCt;k^_p~usoqoZGiJRku9d)c#~;iN^`7lEe{cTd5K->N zbJDv&t-g~B7cLO@gL{bxb9Dv%z~>FDmw%u2v|-lQZfnN;x?*(N>tR+z^$IABf~Qr( z<&U2LKUu#+v6RIgangWK^0cWD~tb;-FNPbQe8>018R%w*?0Yp)^yz)>W{ zgIHcl9$&Wt!d8vQp3RZV_^atLmb@3%<1EtLhddww0p+mpRc?2>IK8~W*~JCY`+IMT zI*~)YXS>bco8LG>lKj>0<%R)&%rdsx8oCecs{w&(FWGbzt4Kw z5b0~TH6yZfK1QQ4z8)Uo?#}}{oo>Dc0d9MZgk+tQ!9kI4hloP46geF|IQ@<|siIb` z0iYL8mm19`j?a6t7i{f!+SW1{j`HVUquEl%ATMa+IM0Y|#PiHS2~d32^gRTS|~6B5@TE!fhTQ=?BG4JFQi#00SH{6zG|jm)sq2IG*75Y=*tP4^L6LRt-i5 zLCmZP;|9Q7%ivlevB>CU14=RMBz4yEyk&f&>Ux*?b1h7}-1h;nIS` zVB|zP$pzv4{f{{}jEpI*+({&;q*B2&O>uoQkUc>R5`o+I%v_tuAW5pIH|qFQZy>HH z?#CK9AVmMzJD=Ssjv$PG)w5pySPP0cazrR7RyYs|uFeG>AmR`bamXd&!ihtaM+j1$ zA&(G}93n;JhGc}{fTb84#|9~mK>S&IS-@WJOvMw8@T#>P zx60ks<*k4O@4Xzn#?>f2N~i}E4I>+@ff!c84-E&ANvFQ_d|~yf$~dx$LaABw4=Aw*6a8v zUjaFMm@A=?wjMIlbxs5M9};l-iwuL&)1#+;J#8q2qAHkiI(gQ4{b#Vz>H&x^*hWf^=%(wcAYq zNFP32`K#GngNP(N{F)F#2qA=w5EYT+`ST{0mzU=Or0r(Y_kDu_i62me+S&m}eEzl{ zkPJ5mB!0C6)+$D1@{1a)9+nmXfV+3^>e;hrCoW&QG}l^RU--W;5BFgaLI@#*kP)G( zy8pldylAx+E?@d~?(=i!YPpY!@J^r%1xAn{p`zZgIV1rsF~Lmr0L0i9C9qMypNMmZ zHDF*Lvw%yx-OlpDI{=>EnZ0!_O;a94M+hN=5JEp3^61ec0r29pPp7V~tUOq5G$v~RQf|j0gb+dqA%mvyG1Ehh z$=ct`4^~c1eR37R`s2rsk^82|32(iU*n;7a_lX~n82!ko0uT)di$#qG_0fneTfsoZ zd*R-_dwS~3830(ic;UNgD^0!Bwgsz4t6YJ>Q(C_i@j~opD zT6X8=&Ghu?({gKOX8z=f<5&LtjU>f|Fh(aG!B+jPGB4ppqy{+uO6mSf&w# z-=$ArB(U2`pk|2+-CMle>guXaO-;F@M~}Yx@#+t^e!uqXjbq1;{oCnuJFV9GMrW&& zWoZfk;+#uFWTzt$z!xY0pb!X(wh-wx4T@|2XWh9bc+*~Fr;T8z@0?OvR3TFI6Vw9# z^We20Qj7H1Qe3na7+Q+<<+T6<9ixKYvGTNJkg%2>4Ph;a&?1HwRMk@8|NeL_3fWC9 zsHR0CwG{URwb=7TqP3u;7DUfo8Khmjv8rGf#M%XsTBNt{9-H-hHsf!%IYwC-yBJ!k z%@--DrFgcXYC%;k81xwV-}T0Pv9uso3;Z!MzSG`OOQ!#^cgCu11VI@7XI3Ez!i|v| zKY*RirHg$H`muUqtWPUFc|(E4hKKJot}Pv z_vY=Vk00KD+1uM2_j)}&J3Eu&+s?~AK>?E5E&m%`ej-WH-Y9G9y0*Yn=#&bzv>?V- z%P4OosGz5KUE>9{-0gO0e}CT{9UY0qUjo>CeQ?lywY&R#YisM-i*C2Ws;sKy0WcAX zR|+3eB`aij58@7~=$zB*R2dGc67xfQrjetL3Owt~Xl5b;W(Gu{O3{>>76kCB>Ovj_ zWI;hwBO>Yaf`&$mwHzf-Q!6kdjj@>L$Z23Rmgv)Qfdtc>SB!%ZS&UDO^>z$KB?6G6 zChV0GON>4Ui*>OQmQdUzt%k+&9+V{{qRe7Bi&z*$dPf$sj0Mb4^|~C3d9MmiEC5(r zu-K?9U;(VdDA8>e=T!Z2EM9$x-GQY%|7$Gq8cox>kh36&6&CXamfE<~S<)I6uQ|m$ z0jSJk^S{nw{bHpoQES06Ga#{)=1YmiYKc&zql zR`62yHYmw^q~Dr<7wD+G%uuozmfh5t=RAL<8<6rwqh3?J?@w%34rSuY-b+VZ0f6S8Q zwPUe1o>-n({;_v9xorb66y_)j&@Pf2kIo|3`_It{Kg*~ z!}JhWvP0NteUA6%^|idbyu`=H2mZdj)%W-JN(lug88FER+rlIqoLI1q-d+=9Up)aC zWFxvyLU@FHP;VpKMY3V59&|iRbFPMPjK{~v;raP_`2F-$evM-p$8m^pj0y~>^|N^np2>?2~N zhv7rh$ro+&WUtfaayYTYe%gbRu};rrWf*FSKsg++-|y?!*P(uX?y%eK>i73IL?R&* zjdmPFk|TASi1?mth-9ylU4Fr^ZUw}DGv#|f<`}$I#9SP6|B9%7(A=-7ghuTn&Y6MP zeWeGqcedGN&wtavG03*^jY#iFmaAZqk}OxxGDHNDC0TBevGiZfMw}D4dJVO z5H=R(1lf46?9-qshN^<-iifUtpkt3ed^0=jTebT8M6gy9`VdB30%H0<;;ib2jysrS zC0G~n40Cq^htN7i#t36mWkQY%<!P+dWC(Dmm zVha|w-#81BC0VYB1;W3Gb9UWdRaHRx@Vd5vW4gHPC-f>l@4{zJwz1u}Rc!gLyh2b0 z&a8>%a~fy6s5Ef$VJaG2IT=K3AD1gJK5=4hG#w&2f^G2E)ee|7-pgZ{IAGRfVHUlw zBgS%;=6i80O;46&>0)W~WSM>MgavUT7st}XvNZb*vozbbEVM5=sv*R<3S^?>7LSh}J(jj8lMs9EnqtgSwZIJh$r@sPH z#6O7A^X38LQ`NeOQ)q-Zm$z$fY|MfyWhrN}#Fev@WVtJrCW~20vKSTaG&f z?0ha)fiZuBgw|*jHqt>cloZz}W`6GGX4xHMIZGRpC0R~%&q9(c$&xIrYe^Os9WPln zVL_ZP2pt>77iw<%Ky=k3O!GNhm4wbEVxGrI2~L}v>*9a+u=FihOMSV~9Hv?!MqLF_ z2PX%tv!9tu-EpYDYr^)9{u8151aZ9vHZL6GLRpS-#Vks;{~0y8@#~T-Yq4zK#LrTa zC0W*E+5SF~EFxaVx_GTGOn*hs!#%`dn#WC}xrt|3!q1!hYwv879p!N?DwFPS-v51X zqgz8!la!`4>j;Cx&)!uOU>mWTBnPWy+3U5C#9x2*{YmINY%1$iSB5=dM1-A|DPhAE z+oR2Dw1B4~rKSo}dO zE*7yoh=uw<_QT|Ei|0vhMYt~EN+Kc&%gj#0`y9$G)ZyyrVE!T4? zJQt`FOPwXQdl*aD4`2!HN3rlV<5^DrT)y~z9sgV|!jcZ@N_b&?3v{CD&Ip&e@e1d2 z!CAt{M|}Z8&YL>g0kJ&1&g)iCSvHg@)Q2`OG^;pNi-&kcmNzHlx=j3BI2ni>jksse zmvwL`yNN|CViAj2f(9^Somj*&fTb{VrNwq3ih(m^(I}L-FC>p+1SB~(F6S+>z-(UK z6AVEe>SaY05}`|uN8(&KtrLOgvH@}5DU)+CYD>V*uz;^%;G0wu^m`kESF$uPpcNX5j@G^C^Y>gJq_Kot^hr z6W{ay1*A6x2`atAixmVE=|!a(Y}ht}5EepE=}7OrgkBbqB8nZv6al zY(?oIhVPSQ;X={@+l%$xx~jNflR9~BeQ%Co?uRl%ZC;3q`pUR>CZGCWtCb$#NJaD; znH@anpcwSa@ySa|iz5ez1OKy4h9eWw9b$)#s(ZUBj_2&(kd{Sv8pd)I+{S?LL%4aW z&}bUgn~?Y{hTW|wne5R6B@inL!4D{L(7a(zH{!`7@{`nQyMy$Y5?qUHqzK*Vx!-81 zpyg22W{KR*lfEZry*Lj>vg%OHPb&=7M2~UD`_g=^n^200vrG6GS7XnqW$}*x6t#ci z()|N>v}=`!Ud;a5C|d$p$A!Z&2Qi3`V$&o>dCf@z=%T?xqa1L7P{m#UI(b&1>c)Vu z-{+TnlZJi?m_tt8e{2R5868vDmV1XQe%4mG^>wa0g1cgGzm~}Nhqy8FG!v9FZ@Exj zQa@x>(R^Gqm~Vx{x* z=KUNCL~>QL7Y%Vs^zz29>r2t`ZbP!jR$LnMNZc}=A1qN)$`6R7E|ajhwVnyCb5tR^ ztV)bB7oSui@u@F(x}-ZrNN-hSR`>A1@M5E&K5OwnYyHFX-MR_7j z8ukfQgM+>aI(}?Aql86ulYMkyGeI=r#NyDeP4lF$S{2+`I^yCiN%L(D2BT1&D`&U1 znK4z8r9fF6HZw)vSQ~jw|8vOtXAb&-d=+wmy$8R94pqx&9zU_=AOPXdN_>=RCt3nQ z4WK!}i(c&Jhd0r$_CA7C9%uM!L)<%h$QAA0vx+J;@K#%~v~Uw0 zHAnauxT?et$H#Zm&W(dj6)(AR!dz9>Mmq+#jrj#gcI@zjnLT4woRYP#_9@lj6n6tP zjMS*owbvJCR_CrPtz7+SIdTgWnt7kdjuOZK+hq}2bpjN}eGNGnjr}z4v4C3%R(z0B z9IQsq9SoWtdemhmtY3Ogszy1)lTHi|riIqJD@7ILaZ>vBT5uYyq4DpJT>*iCvylp%H#( zlmizugGMR9v2+voiV=)?rvit=V1NePF#guQFgy?2!Lzw0uRB&gmvFG~mBekluD}f4 zjJU1a0)2PzH}MgCKrKoNbhy1Oo?YkLSr&HE`j=g^uK0`1r7rP^_6b}cPB9vNB6Ddf zjC2IcLF7T|7>OVUj!iqEC}baL%Du~gA3WVf7U)PqwfZ@sn&aJ_CYr_!fh(NAU&;3> z$Xd^F#(F$}yF`Ux66hQ?ozM^zbL~KXI>>P~EnmLxVhU0iHf`IK!Ez zorAe?OD=ZR1iIs-6q|6nU&F#_c)JUs3>bLYxg{Hy?NmL44kM!!s&*B5FKdKC@Uvbs za8Hhqh&f8x*%hS(!kc?X00Xg`4`OQ@Oz9;f)Q^5Ya}Fk8%Y)8*XmS1XF;- zrKzfQmY4Avi>B+VTTXlKzKD( z+oPF@iS615!YBRTZxV=q`vRB~5+NoEExQ8-kiyqC4Qh@V_pGu zaRILKD5q%0N7G&=V&!^bA4?Y7(z4Dq(56&^)~{FwC(N~KyhLlc9^f^|3j^~_fo6Oz z=F2e<`bGv}?O-)A=K9EZc4E{74jfBDA?{>gbP>pb{x_r^ZeD6>?jM z6g+W5tT{)Af1PfkR`;wT4_aPi8^A*1EWDWfUNC{ zLH#tUC?sv=p+fn1jUxz&WdTTeicxY_=j3X=q+^s`$xkx~I2EB{Tg6)xr+KOLzgXE#X3z&7>NEA(P6{H9SV-uB zg7P8?$V?TLoSnHA@QFLhzm^#EchgzRPT?@mNKLoz#NV{wK_xt&-}#XPA%kiHhRF|! zvA$iKOW-5xyu#|Flr0vTfqlND=#WvA`t@@8FGDU>vsi9=8>%%t01^Bf+Ezmvh~hw_ zIWkd;@*hEde4h=3#^O**cLe>TOWk!YR~EF~ZGNXenGuqby!1ix$C;@c&J(W!-u{mK z`9b;$C-YET@U3E|QV6un6LDlO5%1EB2+rVULA`jwN& zufLV)zxe<{Me9H|TORS?jpr}P8+Hr1dX-r1vSY)x+(Hd5G;RsvS-g!ByRNU+Jt+aya!J#^w0JEY^SOAEHS>IsOY*&DjVkqu_nr6LNDfVIDLXAe>=)I6 zz9ue%g=%+u=Mo+rg8t{FiXJBcl*3URw?U)>zk33d6j6&0So`_-epIzm7 z8XVGeK`8i($7p_-vFRnNsp_IztV#0|^;6?)Q+B))3~uqqUiOy{l@EV(Gf2T?f;I^) z?OAWHtHGTFohq?D;_O)f$;c-D*}rry6??3IF;ZE!LN0GKa(~zdKQ(An;zZP|si`nf zEDx|QTfF6CGGLG#SdWGD#_BSz+Y=_x>WqntwtKGL4`SJMbsL99I3SI5x+s>gB{scH zWoAMQ68;|!+_1Vcj4wL(+NkW`-ket_-fvd10)Og(WQo96O?nO|SXnn(w5TJi`&%`E zY1}K@ewU~h>IL@r!Mx#9FL5h5yw~kN7SH!A?>S&lP3n+UV>TOTspNu6})88QW)W+dj!xA=%x!}7!8ponI%2nf0F<22pHYdeSrI5+c)$nU@kSKfu(oK1G zjMP&MG|J(aj1X{Hj#VINHV zrA0P}%?@3U*I5pVIHqR~*yAm-2*(1LxD?Gw92q74n_UrxSanUFB>|@*Td(-u8HO_E40< zy$iFfPX8r@Ksgak<4ZTs;kEmO*ahD{b{F8T=D9^P%9Z+r>YPiWVK+tojU9pjd{`N0 zkQd@ml^gXukrQ7XIZyb%_vE#aWJAG<{=*Q4Wr!^T>k5Bx)vscOB zA2mh=eeXOmxXU}zzY+4TW&Ude7*G1^D@|D(zQm+H5F$-6hFB2F`Ye>Db{`$e;$Z;o zbOsJ=3iO;F+U1$gBerfVL{!pIO%KLy|LN?|o7H+TD(F`uzcv_Ct~S7`b?}s>ePQbl zsIZw`(oo)pmQwP^@!t6CC(Up*Z^1tO8aBNwg;@yjKZtDo;?V(}aawKx<{_ZH9VqVx z?r*cB3vEQb6#!C(vL|YW1xQP9mx!v>i^l-;?V6bx1%g(#&i*p%S z5c_-Idm=Q2&G=}#n7)Wx*(ZU{D`y+DhMwGfCj;B!x46Oju1P^igJAcN%z;0})aGPP z{O~!H!7JQ7IC14FnwzUj&M{5(O3_CquCn8#RqsX?t%#a zz2P*_qivww2S5&*p>7u|)X2aWfr~&;T@32EFmYHJzVf3*Xz(NJ{g(>v`V6NYC^z70 z>y15rJMwmI)`(z@N(q*RZ{V4?m+JJ^eiLZau=zMlS&re=#ESgb@wRUjhp(6HSP`Nq zpz=QsQ+vVZ5}-YFjJkpZ!WJ`Ylj27A@W$Gv5qzjDW)uj)?Do#~yhV+w@-=<9eekIQ z#{Dy3;Z~NrJv>#?bzhJnfT(x5;NsZKNHzmRvCHI+aKHoi0UYKiPg2MO+lj(RImDLO z=`3cFvEpsGIag|IuB+%LS#sCyx#dq0;oe2XB>~5nE=%ta5n06(tKp;-=PA9keCr1% zhG#GZ?Zg7wEqs3)(_Iy&mxn2WC`Ce1G|i8XcL?{4zT4fO_;kGb{qnCe6Teb<;EgCNK=zka$)LHo*&>Wwp`xg*Q9CEY)q>Ds0? zS7y?A_PIKmVwu?HC0H~4V@EA)*&e}x3(Yo?XZ_HFPFbto{4}TOADv(K$!M{5R@&%Z z-oqNvoC#)r$JD$rD0@*XOXFF_6xd-r8V)PMoh0ihc81L$C&PbyiTm6e#kv;;6|W_~ z4p{EbztJ8QiO@jjT1Sv3W+@z)Ua0W0r!xeH(ZMY;^Ellc41(hLFQA1*k!$d= zAGXo(*EXSaP6CJ~$f3{-1kSLC%*MO%EQ^8F+Dcs%Yh)gEQa*RzI=^B(K8bb`Q740B z#^irkTVncX_f&9=YwR?uP)^{GguRC=#lQ9kv)<~Dy{k{E62|9)m&gN>9Zb9IxTLtD zJBKK*z(4JPQL;kSx{{fGW!0gHtCI>VysZj5bJe3%;4?R9&8(cF+!ER63Hb_N>%ev! zG$DalTX33C)Hp5!ryD&-@a3@CWCp}`JeSjZDgo@>JqM&aetQDr0UET;i)`t*2#y3I z7SM^bx4`FP;Kp8v3VeGcVqq5RPJk^z#2m(5?x`DIf@I z;QE2S4DkOl14!!Km-5)D6%pVssI2K82|vO1`qpr=eo|d0RTXzwGkKpW@Bas0DNDo zO0!Z|(^(#VVw9C3yJw=lr-_t7Afpb&5%EE{52X^JV}%Wl?nEx!Ss8@na#tS^m6jG6 zism^TAzL9H&qqZZbq)_kLw=zeazp2a`t#=o zRL=l-;3{f}hSmv-^hIx%3pGUuf<>we40u;3|K~pNI3gYWolJ;-FNR0wgV}P(SwTqH zE*tRJ`m<^7Bmq>%Kw;h=Qnn-bK?^zW&K}t2EG4aZ%@8K002Li7qs z&o3j2k?Jq8j8lhFXrPh(8`;Pz^x+sP6Vd2r36&BC4#N|pOe2;?BU8P<>9|$?$te4o1+k-Lv-`bB1JRMp=WbklwXonjtL^e2}fx~nPAy*87;b1Y&KR*WGLrr&KFE8 z3*361<0vxI8!E`OBnECRZm*ypM@YzPF+4p0z`PTvlJNzq=Sm_l@MAi!DH0PP>;u6P z@3(Zm3eYVF9L2-$*HeT^L9!vTh(Njb!cX)dp7-K!^kDjt1I5T7P07$zP1xYc2yaDU z=S{d6f-vYpQfpDUdNo%de0Sh@;2)f^lzN$+A=Y-jZUmzqhtkd<)$9m{n{dQNofu1{ z^IC@RnmFPS-VKY@(lL<856;ywC`H^H2z#~&J4 z9x7xa%7bYiEI$CWk)R=`Jj5uL;8l@az=%7}X2v9zK)d->l*~sJ<4)s0>dY2}l{i1r zy3gi{*&0zvnKe4TFIb=UCSjtgK&OO7ikQHbn=F~3^rhgZnx_h?+Eo6wD(wMws@!7f zno8%46KiUwc#foj)TY9wvY@O(sZjpotThK^Cgx-Uj`-d@q78LpT%&&@W}|$g(i$PQ z2DTeEcj~uP4(zBgu~gU8&acB7Ol1P9-pb2G>ofkxtnTFgH2yIDw4F%-Nn5gk(=(Q`l58uOZN>U-si>M0eB zTI*Gwsuv||NHi%n%4?k6E9T_=_@iMh|XmRX;;akFYTg-zbmi--T!-f9zSPgWWtVa7Nk zwGMj5XvRGK^86+H3yJYbZ>!E!yRM3@YDt$<=Rr41FQFmV!N3gMjOVqyMw`(UNMpP`)yH5efnT2xzd^~%Y#oYZzy$_mv=0XZ1i^?b!< zZ+~vwhKyu5m9R^>ie~4M=RJ!b6yY;!9mS3$5~8RvYZU9VILziiqeCfoG^AO-S;K@6 zzVT5DQu{l-zy%<8M{lR~j{liB#&(7|gHaCs(bv@Hn3QMTbgWWhba*;Z&Cp%Rsk6BX zv3js7Xj=U}h0rE#eV4#X_B?PEA^z>WXV+e8k0xzFB$$4 zkb)j}l@`vIb&Viwg|F6h3zC8Rdi#&JPWw;MZ!uq^w-l6f1FXZBkVj*GWyG_mP5G%4 z>Ary(Tz?sB&fCYVB3W){^=CBrGjVa7InE1Ic*h)hOrd3UTS1tKUIuUDv@z*-ULXAa zDH#`|h&yfcwv$!sWGlBIZ%)13{Q&kn!*GrIE_*h|D$mUXR{zQXZklMS>^Sdd>#aBH zCIoMWU%jMRF*zCRwwjL1oyv`l*;PPlUg%UcwS9jG;oMtVsIsVHGLu^#bsn`nuYaLo(79}W6;03~WjNpI z^snnLX>g$RACKzIE~CJ}RR|t3;p^w&d(s->Sb-JyNdG^Nv{`vy(awmNs`^hYmmZd^ zmc2NNxEe{Lc;*(4*S|korR8~%Hu31XC|s>X@5S!LBs}HO3C((``qUq(FO|V5s%1Ln zkOaQSx#_!|WsI;N1t5SA?scYCF^}G+hy}0Q-bZTAjn0_A8~(AovF3ft8g`1%6Vy9n z@-eWtzH_v*CtVMCQ|&2MOABHCa1HZ1=vzFlxL8iE-fR)N@fk+hjjPV`=FS5f-oL); z-8rc_rfto3s0A$VJ1&x<2A*GCpYwP!KO2sNLtmRo;7J5P4Lj3lIWeScq`!pO0@XJU zmOL8y8{02#LWgsdiaD=jX`L)Sb+5&*<0V}y zUF|iuMxB8MFGI(Zxy|RzR@=oLzV`tyaBC4Lq{Kp80nu;n?ZVyNMq_C=COz;R*Aogs zN9_>lWdJ@0KrBMYRUl$NfRN@{S>QST4~ue;u0c=>3EYP9`<#_s56;s#F`_E|X~ILqj` z0RTvt|6LG(%xpXW#OOa+2~qX$Yv(yAt`$7MP<(I9BkC(?UgN2x6zO(P6;8tDpHk?; z$;Z{17&4~mATlXLW94Kj+5f*4NA~(R7N=vthvi@C0`3W^ao+2oISebzKiceAZ{XcU zhEvWq*~G>Egx<$F)}0$0n&}pm+j@$(rypMn)4aA1k8{9p5Z`0X3U0NVP8jnNvpYsg z`Ufp5t{dxiTx(QodW<)>S*Te?q5b-sGwJH+cqO~SH{Dcp`mDtzJ-Tz;$GEaBzA5F2 z!8e78hjp5T}>E*b0{potc6MFCGv90ZTf{HS_xk2fAy%4+Lu1IC4z34{a zG>v<5kOMQTQznS&kUPqoaDr8s759$w7W2+B<4J%iCWr0n@TQWbi8d>ai03%O0hG2D(3`k6~p{7y)Ue#LNn^UBe_H8Nqk4TEcdUIO)7x=jdI4Jd*T%*}$hTao zxNlq}jglj&&w0!J_314}81u<*$hU>8H*cB=QLq14C&x{h4(-@$MrxvYpMOu>J(vm! z+S&7OI%;<=J`auP>ERlWnBGd*^4G@E9imQOEh0k`_J1;$_I3P>bOK;Vcp9 zNzu=LHvP|chU1tcFUZ4clnmch;GK@?7Pgxfy4yMJp=sCfL-g?eg=qklTg`e_>yuLq zZ(Ld=3p1AE{4G_!rj&8Xud3&uU0F+PxTxuG-U@!f4+n%5l1uv1O~1J5lR80~TF|CI(RZixqH$ftyzdIb7C{R;o6g~X zXNW}L>3=*P4|4NR5SkgeINP6asuxY)=7e{nJInA5{8XrDI_=$AdaH0B%0;);*6~Am zbSv{!kKdBoHeb8|#0^z< z^Jj2a?@f;tDF2Hg{uY8+JCRnGVLyApKl1|e-h2ctvLAKfm8P&oT&$a3{%0^#A>_Li z*#Oh6ZMx67(8*TmB5`Pm!1o z`B{eR%(ikn5)$-C*Lp|ro|9`68#bOh4z^JX`a)+$il8QYg?HNsv%V!_p24hjLf^fA zo3pr#NlRrlurn3wHmvt|Pc~9faExFHM0eW=Usz`8js|&7DBrH?jJ@gh=`YiN8rnZ2 z4cw3M3JhUoijQ)ksK1V2MnOIkSH22@{vI`SHqv#|+8N>VN8G4m(#%yfaPIId*NA3H z`>q~mfA0WyG+|)Cv^X!`MLfezVYBncAUd z&s(xt*GJ2Q8HK_*`F0TN?hS=LnXs`^7yQ@PU_a^l`=|q!-a|d9j^K>8Pv=SWPd8>jBR=)Z$UdLmj5FN^vrq3la=tpBo_H9 zriX`r;>?8W&LUg;=~^ff9SO}6wU3qr)xj`#Qq&jZEV8lF!}PNEaz>q96iB*MfFf7R zW~6OuR72~qQz0b$FK*2~4XuB>w2GkjFeU_U3#4TkV z%R4mSmo$nNtC5m|!9j|7m$uAo&BLVJ4foHZ${(dBiEq4{HaI~qNly_KW|`R!W5B6G z@E*zVH?t{bR20GbkqB!TwLkyoS8CYO(e#p)IE$3+>OLD${_|Bm&+hba_1*o@gbU|M z!tCGP{2SX+Sae<^S$EBmLqxP_@wRhVb9nB~nfs>UyVKRxRShXAX-!^U-bcOLP#Xdi zD;|z~F^;uH6AT7PNQ5=66wN^2$i$4aNQVTqYMRn+I zO3rvvLm>Wj6N1;?O$(y4070DXwTVM`zlmT&{`S?j)l$jwnP89HjK1T=oi>zax^mZ^ zHff5V;fz?zukE#+WKKA88`QB%Ub>LO9aRqLfV67fxHAqoiv^-%&Le$JW?eS|G#xiy zVf@MipU%yM!`B5r(ik(q_NDhMQX#G9b|&?9vSdpjIsHQ3Vb!yfm<(X~LKE6|Xpd|C zyKyysMX5lEKxs!2hiYceGvjkDFU9&adI~d!-cAe32O!D($6=F5{HU;$gP~vbN81lu z5`GR`Ghw!;$5sxsmMQGa@iXiqZ}-IwBRA)&J7Z3-W6#Vh`Z!1Gc>z@IJIJn@9*_^T zNxZ~3u>a8dvcSY=op%0gsU8K^XSdh*TX7uxb}ZmAGUSJY$Vf1v{YX|~G!$ZPKGns( zEM5;cNw`vJii3c&P^MC;Q^V@HzffKv15V8JqHSvB@>va)Y?qp+ar@>a!w2pXUx|y^ zBpw6H-UggIae!mP>P!=n+fz=18DuMwI&14K<@g~w39Brq7sD{~3M-S}WA1>qW^XJ3 zcsp-5Wj43W3#vaf&4EgIQ};j>IMW|fF5}H(9xVEE*T;ct3Rzn1Mz-*?ek$tYdDYbD zDgW^K{5~P-^NH#K?SuuV2hLGYgK09kl%zL7l$U0gZydJ}`6fO<;b(0bkAQ)Qc5Q&8WW?6-c_%gC?m+wwz` zuNO5(IR}XH~m-P+~yMQt;B zzapol{>@qWknOZ8>lB-oUmG5|Ag^&ce-gOJhFA+? zwe~%%dHmoOjyx1722Y+qY;9z1Y;9s~YHe1Sw5^p5G~(C~8x+Q(KLU~A{wQt>s)Bc> z$%b-TfLd6;c)X&XRIonjcjpr%N|1Jl{lFX=Ud>1NAC$M)+hSj2WV-bTx-Lk8e_1eI z2IV^idHmfEcjLzS)ugL2t#`2C6mjC5b)3{5HcR(*-0&V}xE{V)VCkMH{C^lDs^WxK zp8P0P$deoPTs1*fq)E>*kp~oM1=?x72uHt;P(NIS&Mg_Va+HqNvbT|8L$ZXYq^r^L z{*xp$(bt_JIU8twuP7t`qQjiWmhy= zu0fZdcw|t+Xrlj(tbYyJYijrbkW@5pmFBHaOsGE_ilY>@TdPiVPe z6?xBmrd@=Jvp9gSO7E_HWGxoCB`n!FE0LJdS&mr7+yf9U!bY+ z@WTFs(H)85x7p(if-gBn1_uUvB3@9aNKue!j8agVVB`4lpXtdXJ{xrcYMXL6fz93| z46N!4s;(y@qhU||7Y|XIeQLV(%Gz>xh=d#n8x7EPhj~h`7OGeN{7KPvK*zFfAb*b1 z#xrRuDGA!xm*IwpC8DVkjpC2($E!9Z6?AwHbdS&QEw3Syq198OWb^9-cqY69d<(zH(y|ICHww(Hi_lQ5O-rEfh#j3T23 zHDqECU9>{INes%1Tm?tY;&XA309|oyjQ+CV+>TeW!3$4vM{jcVZ9RVa=_wOx(u=H1bT(Pi6J-xyaU^L^5ApzJbBlV&`JjWCQ4*p1pY3N$@ zz8jQrHCO`@-+ob}WkH0I8H*6SqV+v$o*zOFyWuLj9}@lX_XZuCJ)!o8*YF1b>7<}P20n^67J-ulcd`7OjD4lZt9@+HnsE4-JeYx-Lq z86BdtW~E;iHDB8|%kAjKF|NsP?=M4eZes3`q`BT%bw>Qx(~KSu3Tf*>Gs7IF-(BSh zlNX6+IyWyj@L4lL&CL~H%z=09X)14XyV2Jbo-0$v^-=<^AVvdUD#-+}sm|;#&7Z~8<BO>Ork+LvantaAMa|Z`u%#{8K4JZB>L=u zPESt-ye~)BrY}6RAc(slz%^$+KS~*-_?Jc9`Ett7AIh`1xf%5RL<%uO$8lLyPM;32 zlPi29`z|iJk6D+}F2?Z5{gQl?xcG1`C}whmS`{UaCvjbD0|oH$jWEu8;f8A1_orEV zuyY5T7JIVuS*UNxze)-Hj)AXNR#IYVWSx`rOtiQIxMF#77~k97{XQ5Ev1Pl~6@j-F zzqMDAsD2U4l@3UZDp2-E2U4=LqQN_SgPVrCO;pZ|3>9n<{pO0&$?^K;TO=z*;L8ay=Awq z2W3ZL|K{x%S7>SGcuKQLignOa7125B5ZzIvC*54vwc(ZF^?pZ(X4jPDYvDc)96^L_ zL0&^gfbaH4_D1$XcDO|Oj*kT?NBEOG=S5$qapEpmE6gv5Tp1t#w9&>U$QS>CA$Sin zv6fUbd=OnH5$;7wFIil0UfPgsD9vv^r)@zLClBg_5>v*@_!f{S&%$*d_Fjk!rrLgC ztce??3AF7_`OmwU{g~Nbh0`P887)xlo0LwyUCqo2*Vfl79PI-XazevU;ut%-y1IfK z7$Gr)vF(=n%}nSZ5LnS~S^qv!c0Gyjn|%fxUM`0<^|(}&dnV+CX_637 z%RxyK5EvvN=TalyM5_Y`Bq)m^YBIb5ww|OPH%_n(kCMjU%vjX&xUL0^2Pom7GTrYe z5{D^Dzp*{4B*w=VWz{Klr&nBt1SOXEl+b$2NScpz$bao$VV$Pze;Mz59Cqdu6C=Kz zQTb2{_g*~}qdCqSbC#qP!OsiL$NkVFy@Se+jg5`!xC`MWO0H{d9SwK$0;l+z`1-cL zRIQo|&FK^Rl9QuN))mwhPnHDOay{zTl1e~R!S~By0^ex@h@AM|Y=@-XucYyOU~*aL zxOnd9>FKvqE^%_U@g-p0(j$W7)_|$xB#65XrON8n)rK-k$T){&u4-7~7HY7`J$>2k z%PGUKi@$?5+{^MLni;OR7LFuYDECAQ5~+}NWZ;Ir_zt$5-qRyLH8cp_@Cfo(O(|_I zLKLpUL%2#&lTko7LXhVZ`^qIStx<|*q9Yy3U%vvb;YTomyx4Y{(9lJlWJYk`UVdf= z6tC1@hlNm(_P|`I!?8PZPbO5|n=Lrklf=F8KNeFjSk71^g-c++Zz zgMLjOfARhC{l}ex2 zIzQoInTJ|_$i2Z7OX{|!j>WT8|3X%4(J8B3T{fBH0dveFu<~J8w@Vd0bM|CbpKz12 zzAdHBK_*!})uODP!OcU5^VRzSdSzi>q!mwAH=@X^6MESzeq6I!q!KAFDDo_m%GVw4)H+YG;dU9NiY6%i5XLHjL8 zGvh@J|UlBCrZv&W$?KjX7SdoTMs zmfYhA2|wsW!q&c-8?=PuED;VM8f4u|u!~22n6I}8WAva+PAox?{UJ-oV6a8)XixhM z4iW?COq}TD(xhLOFg<b(enlwZdFWiWW*C?8~#LX(f~{(N3Z3X&L)Y32N&x*nHf3Cwk}(AS#_ z7HAVCigAn zzVx9X0m-gwc*;5S`iGf6vw@8(-b%t;&*!Bhc;Yhld84BU4yNtJ>&=?3gE394(*qA| zQKZ=;csae@u%B`QLwR-*Hs&^^3qn+zlaZSlAAvDrO9vQOyO65g3r-^XA?vh2aeMF5 z%Mm0!vm24pFdFMRLN4$0MBsJz2$e`ccb#q(8HOu!I}{aswWhqr$%}9yx`Ptg=00Il zI&gS#JZnU;mXbBxE(xKg!&^yv6e;g@g5~vHJdS zF@ss7q-!oATLF?i%C#-CmliSVB8VM&GQN9Ok{mx*gE2?KIH?t=q-Pq@sZ?e^vX{i> z5aKpGIAl@LaG|xj&39tByx1h~SfMMoZvu()xI#bt!DFxzQC1voDrD3Gm>zW@b(LwG zL+obELK@=LB+(+RdS!meL@(&ln~DPVu1qF*jhOX~;`$%bkCMy9rSygc)o`{~l{tTf%q-UtchSt* zVhpn<+<=h)+xHQb(|N+%M-|LQe$3f{LFn1js~d>T5p|o~aq`7t^k3hbaDceDjYUen zYQkTsk{)&64-Sgs(%Lp#9sk;*!Hu!G)6CEp9KrY^~Xa{@vx_ z!5&#a1-q9m&psNc3I5FHE#TdMQbrqAFbn`}f7t_Nb$K$gSriWs3webFbQ4|Xh6`~wRE)Q6-F06^ z^%eX~&=FpUx&W06khO^#lt^CCW%~WZU~A;;HXD_vbMwpAnk;J;Bs4-w!3iQI%H8F& z3?GC51b9!_>s%J|OZUW?S>d8vH#oP0b6NuuhCnG_g+0QDc? zA3c?+Ssg_@pu&p}mHFuC@;*dVPBsP;)^tW}e(^f17zyNmWctIK>`2o389%3|nPYx=1R5!cg;Vo7rTDXd%>Qj9 z8-ZDU0(1JdjZGf)u^5XMnX;~*{;q<-N&KVleo|RYJY~j|$dm7R3vsjcx>R~z>LBob zP~ZNiyPLQ4vAwd;VtOomub}cWh7MO^L2)fw^|;-d-mp|4zGV~1!xYqE)c%!rE%oT` zwQ5)kWMl+t)e!3L`>5i}-R|~Vr$4xz*4s||r~P=!H8OY=0W+;T0l(b+eyu6? zVP4>Ac-8U_w|!{B+Ctd%Q#_qkJ2u-TS#oj5JWRd#A}sWcPEM{LxNC5M-*c z)!Af#t~tK%u*nnh-^k7TXwegW-U2!a|#>*x&#$I?X~?sJhEXhkUJ@IW=b+O z;jgNagisP&Rc+%~=TEi~JAvYsQQ(avb47ti=ht1cvK6;7omIyTgmZ$KI|E?(3p}=g*@^`)s`fmq7e~|kLOayb5j}!>xWOi~3AWiTn z5PuG))248*CJD`ZlC-M#u=cDE!o&HWDuNLIW;C^y%P=(D4rmot+!N|dC1R`83b=FG zDw2$i+GU?jxRo$a#XtU^Q#1zITPc8#^CY@3rcOZmfl)A290dIKzvp#)9;^K%P$#s1 z!2HLCb5eod{mBv#8Q!P$C(4N!ugdooBU6Z3d@MySC~bT_R+N55^YU?RQb(9?j478Exl(L<=HC_Sz0uGC~bFtb=&#-&(C|#D;cx z%ZvNHqqm@ST^`9TS=%MzFZ=~ZQPlP#j2j1eg|NvO-DzH;;55~U)yQfL)nmm{JG{q+ z+$Eqk+uYM?Djbp8B+#Db5ug8(E#gB z@i^Y>+pXE_KaK1Q6*9;(B}GLOAD@@iDQ({Kp^RxBE~b?5JdX#Fd6#V2-@yx|no&od zUt#dWHQt-s2tsG23h}q_S(9}WYj6#cFDS6CyCLH50wEIux)VIx<32kz^|noX$(T4| zFr9{^la`oAM@Pq=z8HxTuX`fdP!wZRY7MJ>gM)(-yyp@Fc9#kP`6oP6<3Ik~E~i+e zh^=D5^TTb_7T?PUqLbTXjC`4A!ut_bPFeo_d6(yd>)E*U_4yfEPmi;*rh9m32=4qU zaPZ=y3Q;UlW(;UwYFJaK`8x6l8zL0_yXWA5`ttJf*>Irk+sm!Nc&x8{j=rKG3Y<)i z5?p(`(Tw$*`4PL#v_B~_?8^Fjf3K)uJm>0e-Id8x4y!|~p;OJr=%|;y;}Xv^GCAHI zZGG~gkONe2t-+WdCi(i|%L@TFH@8`H$fwp*-cXC~)m2m%>b@kERV1yOKyy%cL?)6` zdP|O0?di8}Bnqd5v4Tp=_F@?&Li_uj&ef-z=-)e=S*4|(3u+F(-^a!fKWlm_ktpiWH^IonlXencc+m&pR!e*M zn=M-hSKv*@%}Z`h&hF`{*2bpE>P$=Org_)AM>HEK`-;8zZ()`BCFFSh+1I~1%A?73 zb%rH|=Jk$k({Jo9?(U%(85wn}oo+MwedIM?Yv#bm%Wb#NYR# ztW^*MJwfE6B(PLAU#gHCSt>Z9`xLXBJ4wKW5r7o!^54PB?ET^(lvOYehs1%fy z#|H*N6%+-3Wn|DIDs|JdbpAUy060`E*5edO6`Ei}nX;N@XH{VIyerz+)E@ zvi8m`G}mIgCbvI!b>3YD{LA~%cjH93XnZ-SN2j!m!L|)UTPJ)01^q90r9Q)JJPiZS zMok-G7;<#Y;;=?~+*lZp@3IB`M>K(J)eqe8@c+_P$e<9J#`WQ#iHn@HRx(KqpZ}pz z{|tOGg#<#b01N@Va9=+Iu`-%fNNCE9aC_aCan^cb?Wcf~C>IwOMAT#I^Z9vBWmRY5 z?ykw`fvdVQ^8II973M+Q)%8~M@Q?!5GG>s%K^Gu00z`G)79`c)`gTtAd@?C>v9VuxZk12#n!9mDc?t=ck zzDJ2ZlRU#AYrNtk$=q1(iT6c$RcI5UWrL1uJW5l$QkVU9@+em5XyoYmdG=Zb3%C6s zBK6O20S#VE!io|qL_)05jYU|PbziDF#3*j%w8_xP56De%|K9&-V#eVDV{RI6v^dW@ z4nWUKE~d&tm<7w5J^0a1G7ywTK_VsdB4j8XP5Dn!`E|QZpLB{1eKd4mLiOEb>S1_a zZNzV(E8(`G$uy@suS(Qv1-F7*ktgby3dG=lmGTMPohPG=5aC^qPfWy$-Ri-Nb0c~g zA%CqaC?NaSn}2zI9TMzeAfD(+l@~}pY96eQV7x6b;O6F*EF-|4A3vP8cJyiYReRWk z76`}UTh-v+d}Oq3*bNAc9;NkHsTItgBdY2>bW-9@c|6>IgB|B5?sCzC!2_nOK}6aI z0h$Kay7U|GKV4fH&dyk&WT6qBE-oyJzm1H~&0z#XEAw5y8HtSgH%86Ef&oQpWk2^_ zd3E&kicxyD#ujZopwkSMb+?=Uase#KGTMj|1Wg@09+G~_Q4?=xA|`spCb0cnK}iU`LrEt23h4Y3Mdt0l3X*u>2gZsT5-$&|haCYzgpu zgz7DvK8ugPXq__o!NRBaCjos+^n)YjyeRv`&dRD8$i3>L?i;%`$x9S(d z?%p0IX2spz-GXelH*@-3d=JjeE12f5rIl5g`1Uf7|6a!G^V|ssr2eoV!=i22j6`V4 z5%S#x`*d~D?t<6kiSu^QH+_j{`6A5Wm<_lhudRrjkN)@*rR)qn!A*Ly?nQx`6suf= zYDQ+^Z!B9>?g$AShGrd0h&FjSEch@SjLns%2VFl-7Z!g0xSgGqmWU9`L8}#Ca4w1s zKJ`=rKPk%#D<=yg~Zs%+n_1vk(HH}R3m+T^;$+*4uU4^Ur|vm zfOJp((On0ABORTjq$C!KQmAD`Oz0$;&{udysK(K|{H;5xM{=55m@g z86X4oZ>=UG^zW=Rrtkdx({(x2K+s?B16&*&b5~ak(Lc+j)L4kT1=^Kt5Er3tD!FHi z!snaHb|e~Du-ABUb?Wth91;iK(EUR+`O_+y@$%I{(Y+*-cNij6Rt@JAVd|KV#q(s6f`%YTHr?|tbum6IT(;1ONkP|H$- zvIl%c!u;$luv!YooVY|Mw2%|B;%HG=vJZU`0apy^e9d-Ac-qzSM>4&Of0q$VDH&$A zpj{WG0_o`zkYV}RNHYl396i3dOlFA=Jr?uJV%m-Lou1kjH5s_%JpoTdkJ&CR=ZZ_w zrOokFY-PqaHuMuCv?zws%D7)>1mldFh3y$}d(NhSUvD~sK1xmg={IAcE3 z>+of^RqGH;@B}@*+lrr8yr@*^Hn~|ifK9x6|J)*KrR-gMUpaxy_Cf9TxbKP}y4sw+ zfLWWo$e-&rRX7D&6`qf<+8MmCD~U+?xfpc~4VX5pc^MC|BY+`*t5YkKD8P2o9V*IJ zvN6Q3sNR&Gh<%($~9s)8W%s*kLuUd|l z;6#i_>3HCi?Hokvt?H(6O-+Xk5!DAAXnJn%;u0#fYAEpFg9xHzcwe%0flo%)Z$q;y zWWN5lz0F)846O)sUNZgIiI?GbC%||6X)>bK!08IE!ui~@du}_4>}FXP+xgkpGOoR= zt5eB8=mj1AjK3ZYq(^6-sC?idQzJgO9424;OR+egd<+Z!1=wcV6%QWxo;Gt8YmnES z@+V?lkc<1pcpVuieq01-2$ySAcy2kE(?=nP*_U=$Wn=WoS>TnDk=aO|SY~IcY>-}+ zDsgI5JbvKK&|Hk#I|bFoKs;AxsG#O^Rd9)ZO~8Ns%S3jB*akBri!oHzb^(G;y1PTN z94#Xah?ur1g0@z6HCrN#gjW4w&VC%klpp)&{+Gq%-;C}aN(-1DkQ`s&xt&xIn3R7` zx>@)R2mG04QhT<~BR$glK+wO4x%&6dG%?Hy!X#+*oFAA2v+VZ>c1Kz%!}7Z9VCI?| zUXYToU4BvxqZ1mU9$DkGk(CX8P9l&*pOtbNWE0t@nVMbt%f9MWS91K#3>ED|`h8eyd^Se!|yLyG@h2PrjM^R~f?|ztW0$aw2-OKQh$@7~p zBBZOTMd3$I!f5auEAOG-OH80pYNUFF=g?Ths(qP~WsK9N&+<7-Vm9arKnApe-L&T~ z7HgB!!=)hI4hY_$A{bU^1B|XgOM$s!-uFlIPUVV_AxdneAoYdW3Tv3(R1J#|Wz8Td zKuz^3ffk<`xN1<7LBo?PSWR)p(AQt~x>)8|8S)8LM_zbJmQaj>!H8bSv=?pB!qzrg z^@lZJCCD>53aexu~qoyb(p|Me*o~jH) z-3_G>Yj}iADHhB7AnKQT44vkSIi47UE;k1Qq~zHpv`Na`j6NxH+u>4&J&AoHn`j4Z zwc7uDvijWmpC!lFKZN$`JuibaA1h zV=|h$o11a>|Ir>zdQ!sA*)1@q52lg8$iVS*{=w7k>gF=o`wr#z^z>A03c}0RNNC$0 zweA(<_hABPDTZnkkO;p|RR*Z7_&;3^zZgA_`4;kN%PlptE__=#S0hoK6)AZZal~4t zch-bgWUMz$dBMMkjJY!{BO^?z7hCG|&663oePw};CfqhCT#+gLH}B?TZyzZfZ_mg)x{Cn z$YH*S{O#CqY7io*<`~zdQQ>NpCYZcDKcA}E_w@@Lf{3uDP~H9GIAh`;(hGp|e340J zi4JM(U3-=~yPwXU*(MvIycXNQgHx%Hfd@&1v$@{uTk1+d{y&=DIk1lB`yY;Nr?J`C zys@1$R%5$ya%0r^WMf0qeDwiJ0l`LmfprNL17h@d@LNt!+623ag8aZMkAKmDan->dn3nev>UUh7 z;L1u1o=Y*DmLsAD7V$bA>%<1lk$KF$S?d@{3jUcZhA!&l`mmXwP72BpLjWE<`E%NG z>Al`wT{yb8fG$mHce-@%325Xw;zgH|&-qJNzQ&Koj3bS&r>Eg_^bx31U!e*n9f8Nc zm#j%*Z!W(cL;MQe{vPt7!9leF$G4gbk@2;TtvR)~mcMH*0@n?r1P|aPc5>g|3|{3u zeeIeiQ76D3(*`HMjD!=f&bPW+70ka3NYS3R;xB}$S#fcN(Qluh44U3$1cO-!)6r25 zTF%~CI#!UbMrHVUOV-}(_Q#4nYr^H@k>z+Srx#-VhqGWrEYU29f*RIOk@SZoLtb#Wu7Mf~ z@c`(Y5^$e!o0!~+^A3M{hK809g;YOk$(8)3{=U~X{NN#QsX(2yRaTa_>0mD;$f0{k zN*d6UvKl!S(8Br}hxSE8|W*_$BX_>(*4WN)kll>_XU* z3qbPW9W*>I1DZuEe#2bbpP6AWkS<&tn$O@OO+2tL-DwNphL(#oF$|08C!Xbg2n!DD z%=9)-3J>4qt04jaM_}Nrb~WhnB*Wg`a5_B- ziTNE0rk6U=EoIeKXA07f|2o@Pq%bn87)m7(dajj5FywTwmrMyM8;37`inDK*!@c+l3mZJ5O6iG7# zeCPQSm9*s=e!UId>0+o-Q+XYZZ})!Yj|rz8I%2s}s60FIyYRCN-=8Tn9CkXk6tEi1 zb4q%JVS#K^5UFzWkG11l{foXH%-3Efvc2BfnoAO-YHLYiw$$LO0KU{u`dV)QTm7~s z3K-ZgfFmmG|E`KVZewbF_~p!-oo3cqmQja zUmVeYs4p1UB1?>=fMJ6W?o;41-c@9yU&{_lKT5b;Jk9w()P?0R%qCR1UgU=VYrH@~ z*(Y$pgH%&)ag@))Pw|hJHPapN&s~*0eMBsh{1B4=r+F_7-2XLp3;!+7vG(LU`I=pX zSxKKOmRE4Wto0XRVoHfJ_Uk&l8WVl!|8JX>Z8TD`GTm*&SuqVcTtx0#H!@pgY=FQ7z?CVu=R4K z@WTJNjRvvGWgCoymAIXYHzBxh+?28Cti{rTyfrzLDnx`(g;5N5HPzKEZ5yA}LyUo> zu3$~Su(mwPAbq7X7oJ+xqjFMVGk<5I%?T~$6Ji9tNj@Ny*bPV`(R^6?R%uEP|AwU8A@G@gN+yIY2 zjk-N>l7>>^!K8~sv_cTA=3&xQSJ{3E4H{JkYN3HOp|b0?ku}XbdU?r)g@w8L`6*gh zSh%{niVqJDH|R0hE$8dHxjH+Gf~qF}l~%7Ms6tX6nVLCCbSP+%#7%!AD=M78kZwhS z5bq-kvpr6Oioq$MmXyl7B_pQ!HUKRFO*)e(-n;7U*AYS-(c=Xf9K?h<`*RoS^qp44 ze3)o3blanQyS~R%kPFDDuLyf(JknYB;3Wvs6Cs6(RUNQ@i($!|9yDv;U?b*LwH$E} zAa+q8xRa^j$WkCgfqfloTDusDc&Ed%+!N#99okB^V8Oel&#nA{XpG0!)J8MBm+(Yt zkn7_3`h4wM_QsQ=7zt{D1OpjdChT!CF}~b*BI5hGjkSOpI$Qnt`3kpGq#fT*6u+i5 z{UohFynqDP(9~>%kMxC#eNd}~RK6%%SY%L5kv1M+)LgJ(Pmv*Cs7`OSWQrkQqvw~e z`iC@c`p&F*b3-KjX_ST|# zLDA*Q4p$p`%nrh0B}jaljGKr{gLf^wSY`1rWKghWWvqkQb;&E7CatLA6L`p2~!G1zQD zoOen}3L4pZd$M}I9sr8;+wbpnp>1Xw8XBX1U{GfM{#y@EPl%qp6U1W%RY7iAYRebr z=dP2JlPw-E1A%X^DDjwrqU($>14f{*HN$9pVv7iHNyjaY3=fCgkdh_rbUcd&%UtXE z%yvvysg`6rMwcRuV**URI63||ve1N>-J1G($k`rbndq~E0y1tPq1f^ST4W{AP8#X? z%9h)$Ej)r=_akoZ?(OyU>{a;FcZFKNt({(861_#0t5&+!Z{J6A!~4vQtk>ZE-X+6pFTgQ+aSw6MWhkCF)i)s9)DV$Yj26f z-Q&Ofm(u-2q*n{2OR>K%h)9X|h@693W|V^wQ@d&5a8bB%y3`pFf0!~U;D^2%pZ6QJ z;Ko0rl3`aHqPEAxApaCl{wA(rX=f)90kjOqxV?|SI}+)D4;7{iX8lV%BQ+5k=%5al8;{r*CmhCWE)-Hz1c^}(jl&wFBZi4i_nA_Ycn0Hn}2Af?k!;NCAzKEBQ=7MeObFs#Z!LY(?FQ?SNB4>UcL zSztrHVtyCP@Sq{?<=z&FQ$*i~+)`&ti(^@tMO9Hze@=EbfRU6Oqxp7Mq8<$;5ADT! z(i8&@IymI2;Ej|R3itaE!)SoC6UVLbfAdaPd>10Pm;!U)m*u?oDr%rpuU>$bN(Dq> zaq+Qi;8~3@=AGD{UR=Sf2|{?UqaiS%v$;8}H*Pf`Ar1q86kXNrnS z28Oq79Y0S>Vpx|^OZ-dL=@c8mxfHt9|%nN$`z65gm$L3X|7U3QuD{t?$ zxTv1r%jZgXYk0dYS}I?V{lw&?q24kw5d-??mzRYC077+rAP>}}p;-Jty~|E$NTP@j z!VRIU2WaUkzIuNTYB4;~@qT-&>g?R;^t>z2%F1#9fy?&h<}l54Keg0vt`TXiG1+e4 zU*aZQI-h^eyaNCqDF5}8W!>xB<~^m_4PI=#bnygoj2;?f%fzl(51hAQ((fa|#LyitZ;ZlO`F2DDf~{9#6Bkww7H)9TLMc{e)Zag@=Yt z?0I;cJzb1E5T8GbhHvJ#Uc}=R-$~Hoo|qH=1f}uOBGH_oC;|)&jxC^@8m+_dd>EA zXa(fHkTR5A6xlSk(364C-t2ftPmnrf9c5*(C14apdnEk^LA3|pj(K(|e?ut>*HYj; z=#WNGuzrh*io!dtHL`nEW^r8Wv!ll=FE;x1YYDtN@1eA;?86fdhX$KvnJ;b=^QjWF zZj=MxLPDVZ1wUXkwVS{mB=Km@hDHhO4fJ$WME{o?EQx2@HHpmU8?%aQ0JM-DUZ$%r zNdagj@ZCsNO1NkB*ap|ZUmRSDg$=L5qq5cn-VzSK(la(LpQR6PMlsrDR0~cBmSFia zXTky+aSxUWD$gM^>Jyo=eBlCY=IWs3U`(u79Foosj^D^uTd7#IzD?o!w=2z^f;Jn` zC^emYSxQQ<+WV8ca)GNVlyv9<)-(7IW%RN~ASLAJTYZ;bEaLoz(^hWQY1sv=+b&7D<}v2$pRwuk|*20|Wo5QM4wFr+qQo!amRWc9h4DUJ)0;r4>fEJKFX-FY_Jp z7C8T_Ft#X1_2GY<=j3S$Qk0DY_h+MG=Ab+kcX#XdPJNqX_5VUI1_#~y0 zTT*y?Vv3I@LF3t*4aK01RkH8hZb8>ee)`|dxDr#vM!UST-uTqbMTcxwv%syAp)gk1 z)gPkO`B~}^{*wV+=OBeAo0HwXw9b=Kmc8eGfQKiA@za&ddW%QGO;kcfY5XUM1KLrB znBv|&{S8|?(d$0!q|##gtbEkg)6M!&HVmZtU@8Bfi015HtY@qUtFXJ%m-^QHS~pVl zPl7=_-bs@rSwXG0pvoDL(gv79Imn?f>%=8YQdNC*bL{Ccw235rD~cT;g~Ry=FMn0> z*c9;JBP$7;-crm`rlzI72@Qk(R_$XKJ~e6z!_$)&Vvv`UMozT?C1CdNZND_HK)3DD zM47TEa-Mja@K0^(-@4^>woklN|Jt1GIkU|l{dW{ycjK1 znbBnrNgbgI;Dq(>cyx4k`}3nEG`vd?HEH_8UN~GWG6Rqi1H{B5K=-Mt*9VuU+j5Fh(twVTlW9YSyBy9uS zcT>~swioR6{$3vT7%3Ms0&@u&{ZBA3xL;SAI!O|mRlFyf^#OwSI)2oYg`as zg#KTj0Hm}e(FL~9lvizv%jkK!4({g3LCNb={(!L$@CXS$f$~dg%0m-$;-FdU#5mJi ztQA|F7lAcAD25cEX+8u-U**E$V&9!KCC^rNx3a@u#!{5mof}{0L{qTp)k+rv;-I&) zvpDL!Xwz=`xxOsX1q)@&V!(qwDvf!y- zsEtiwrKXA!T6Db)4Z$oeFW0uWmwgEmr{cd>k#hmVh*77;*+p|bxIxw5hn4g@~1qFq%ZjlY8#e@DZlZQ{~ zzyfJvcy;=ep&nqK%kB-2O!zAMkwrbPt;1Ky)72i{w{N0KO3mcj?SJhEzLA4`!v7Z% zC&bjiQF{6UKaXEo`oF^ADs;`-yI+OL8;EL-R;E&0U@A^60MWAG+<4(x9Dikv=VCyU zV|HsRuBwVj!1I=UYI ztHZ<9ie;N)`wpDe9HY0uS%+0Azpxc>S3x!36kv-AFLNXq_veslyoWKoYVr1Xk}mihN@O)P6| zx*kTg?$}&M5mcm4y#b7ixGey9><{J75&W;PrM*35(*EgZ={#K>#XjV(1{zE8-|~n} zrmz@lSiJ6#VohQ1Hn`tIME@H=q_O3b&kL%wN#9X1D}Od{BnmG;qQsp!T-Q;?wAjQ( zilN)scW6{5wEq(Ir)_jz?x$H!A1N9l@|)3CUwN>?H>ol@)^%eBjK9sbrI35BwT`*) zC~pIPZ*F(5r$56;3=pTMTBlGn+emVQ1kq9c&2QDB4onn>E=MfWSRRV~UkrCyy3o^% zO7Ky-xt-$qk}=T@YKY_k75SD=@J{h?Q5UtW|8B?Yny3iB3x?E@9DNq^p$b@N<1{9I zAUA|YKvGbNdm4~3(FgQ_=c3*gSA%I6^0pmO=UaU<72=6fTjqbCtj=5l*WU4@hT3fY z=aPGrUevf9)~;^XteY%3>mtuJ*P{I|wo1!QpTdutIeAcI!i={!{W?;^r|N(2SacTC zj-ZN*t`|dmS8(b`wOxN@*%28oYNQgt1eHiedlhmnlL>x9EG9J%i0o@RjP(N+hd2JUPMd{*jvsL~miFgBzdaw60$Pt#vmqKWj+^hoCu# zv=2pFvD@^}Re+P$jcnrwi4w;>D=W`goi=AFyF7i1E^B7fJI)hS!BB$<9+6wO!B|05 zo63x~U+PIT6f|F?%n8|LMiH>OO%XeUM$?y5m%rLy=Tq0M?Phfjfj&GB1?J{$<>k!m zkau=&8pFOyT8G|0dsIGe_8de^TfUF@J@4fGL){mqH4$7tM7>|sj4Q-!jYf>fnW}}7 z2iBrXV}giMQr0b>J442kpFe}ULbhv>7=rVIp<=xzAb$RbKm_&HFl4)kaMC6djk;J; z4%t-U1Qi*X<&5){CxvHIUCgwS4*xA|hJQ&Rj@{O*HYl)JuG;lDnHvOe4+(ol?B-G0 z8&RpQ`_*ZSKsx|2bwWsoXzaCu3gN~pi!+8<*r&MdFEL_(5`(x>-TkRaNq9X@ia@GB zSc?F)J6j}mf4w8TojetL87@s_9O$swF}l|o`um5W-%EUv`3FB=LJ;LhB15b+G$`BJ ztp*@Z6q>v|~R26mS!bsG%! zzMb?2!P>^GM7ae|7+Edk@VlQ}U-R}sv0DKlxyR+U3Z6DQz5kU5osr7huW_k#^SJl# zyd^0W=8E~elMoV$-$K+axan8GV%*&f`$vs8v*1)g&h?m}2Zo^aonNEu_U(xZcRlac zdoU?J{=?51C90qln6B9Sd0rIH5S^2d*o23Sh;q&75PSUpjZ>nSKyEowP8?JvaJ~HgN+*rd%IS{5s%9Q%5CCiyX8km9xzQp_*_}mJJ8({%B7W-ZqlZkq4 zH&k+PFp;Eh6K?Cc)-Q@rnN5(&Wbc3Tf=XoeY9$npNb4iJvg=8RbvA0-fSi_bD^mTx z{%&H_T`?}^^;^6!@gvBJlmr&~YS20Vt(HnP#J&$ll@8G-Jh^`X2k8P8vrr#_ zE&<|UW4Fq2WG}7J$q}|gu6MLQgsc_r#Pdp}ZZYszse_UW*BwUo_hwEZH>DsbJjM0^ zP>E4BDXwi5iae~&n5I*=&S_nQWw)%{|CiCr9BfENiiK>e94rQPG#FPyjs?Odx z6>tT=FX!TnW78-JK_!3p&3_r2&y1tTn)s(A>d2|5doH{ae|8m{U0JPC#0fwzBygF;{q_1* zJv$8AhFd*hBp;QOI;pB;w56o!k4t$5TCJMQ!vD>!4rC|<<1@wMg7Y=-=e|DIl1l)h zw1`zn@HIKrG#vpNj=MH0k_$kHKR!&fg8Mdq5=SmRIwU^YEnlO-;GTicATYRRIJBOZ zqzO~UgXbpU?6U^s{~)E zodfO;vxI(31>`ffRLhac>TzW~><7V;{nhWWnbt3C`!yqY`fZiOeSwoxdNf>3b2-~E zDBINzd4uc|-kg{9zt_KG+h5|>JIdW*y)$A)uWhf!x= z(`vM(VgZKYAK*CSOeDOtyud6ts`|VCBs-Uc*>b76*3^2+)7KGBZr!m{r2(ViyZ&*e zG*^7OspC(4Tuf7^3MZ&pKo&A1DoPF-IXc&okS*ISH`npm=IXy+(wqBe0Gy?w)OZ>Z z$bp|2Ni^BaonabfTg8K8K^=shI&<#KUOKh%askww66DagPBp@%h(~;kH{ZCk+sy0F zd~0F||Mw<%g5by;Zz*x&MJX#thn-y+d`)hW3FEj ze}ux00!d&PVVNxi1$}voEar1#acuYupl=g+99R3Di(^q%VMx{~6y308#3dBeRK^c@ zs)<^WN4M(-@O{Q5Ib3rde zKZ$sElt(0bHBEm*7k4bf9t4Zi%`*}yT0vgto@=f@p^^1`L6EG>4<`Bv@WJdnd!nbQ zdomXNL|?VBZWFMwthU*15VSYm$*($~Bw1dm`%cK_T%h`pEn{jHYv3@9i0~yf=dYt| z!aIVu%9ogmAaT?N5LrbeK%9+Kqa=??PnDNWueiB6nWy`>T45!MCV1T&gx44TSJdg$ zOh$gFWcEK4UmF0|{hIBreKAN3s_FIlA({Lh#*D`;Iw@7#n>FX&RzB$=E7AqY}Ls z`$ugR9GOXIY2##O4;XR2E@grT@o)-Qa3mwb9qF@i)m~mgx^rY@R7Zx#I&EB5D`^EK zcY7#)NTPh1ZKA#}092k-?$U%?@-Uv0aD9nZQW`H3u>eBe8#^*B?zYl`(bia@f5KAC z8R75m){0@n0?W*}KIbQ8R!ZDVlgFnmeUeFH%FCP;bafeKC`W``)$)(-0Tl~!pG6|R zD+h+BRz|$VO?J(8;Sp^ER~4Q{6CM%c{bbg3k5muo^Ths8IOAjF zNaTOX65%J^YrN`a?!Ehs^E9xI^US>#YUciFAdVgNl|Lf99bG@z3(g*)y=ypQPou~q z$ryJfZWeM!(kL4#yBqP?$R5`du`p(=Zs(Rhc|V1#tG%qcl3=6mj63PZ4gB6FQF?!A z?ThB?oFgnZlOyQ<@-f(Wt2mlnN-6o8@>IeBgI~^NVbwn8aI!ViI(}9>t#?8M@#74e z)9nt?+hPe*0%!212o(b1-e|zI5Z{8>=VpUuFUt?CJO5h|c?_a`MHS;NL|{137NX9f zjw@^X{R~%0we=*E*ps~=G3m6;_iDvqq7%?>Ro`p5;Ka0Lot`-D8 zUcc2iTsrM&jgRhyJx%s9a1SD~VpHhl{_x@1l2r@2H5>b+Q&<^YK=*Z@8A|1<@OB<; z8^X2qJ>&m)VyV^wl$MsBgMR5AAI_E?MT~E>^z|DbAAg;JtO4kE62I*1CfnNEL9q4U z>guYkrR5BWnVP^I1F>yqr>AvsB*Jy>ulFZOzR%aaUA}LU!Z#t^_t%3tkF&EX_c~fy z;jy!3#(uq<9iAp2?|3sVvw;?9&mw2N!@0RcH&<6u8Uiymd>4F3NXVss|KO@iOQ{L) z@dKo)p4O0%Q3@UW{e^vYNsWK~;!2D&-0g8NGo!MWDvhn>T&SnZvXP*g~?(gq^yxico@%&iz^768Ea!UC3@^~e_fQLG0 zCjN@?77+ozobgy&%L*dbu)BO;ZmDiS8U}7=t+KK*d>a2}JXba0TZzY6YLdbrS4z|a z?xE2`+tx^=nCVQHF>F&yiX&ITt01Pa6Eq(u0e1Ev6y!RI)0j7ACr_N;piimX45N;b_+ZCXPwO5qHpwe0hCAyn7Y3@yAAu;XmOW_}2TNM;##L zmfjSxv5aOf4c_4MwL_L8;}rSH)0V?^yZx-fUY0IDS8a>A;QaU!Uz6p>9lq|yW+TLh z^{)<=EyWb96+@}0bC1)SlGuF}*J~T(xOwEBH`Ebf{tt_r8cY?IPbu4pSpOy<>cyt8 zWe`S}JHCOfV}+n8I2p;uKiG@-JH%Bn!yZU~e5DhmfcK3_VkGCJXx;CJcZ*pzx zv$nRj_4MRDg-i!wd_nXK3>3sOo!(F9V<`-bJ+n*e>$V{N{&9aa={LX;5GVxF$pAG1 z5bhb|Rdp$SqVI%o;J=G8`H=o9N8n1%fnOJWGR|D`FV`0q_StWC zMC8%kCq97rNTcw1=t*$S(W`O2< zsBNpy9d2x`>$}36)5UV2Ji3V~gY)Ux*-g^B=oBXx=Z@hd!(l{_-bF+SLN;X$+`m+x z^Ta%#DdT2mg_|iUp;j%8$&Qrj8o7^I!(V{Ry<-}ZnJtsOqi@a3jH3H;D=Ow{Noup6 zz;|UrydvI{yZH6*3=DUD-!g>?pc8Sc zh)o9j?XF*t{lR@-|JG2X?zEn^9VU4^3!_iq55kj_9~*Zu_+8uB**y>z9w%PapN<5#8d6ouf}I-PmBARWZxHV9IZ6kEEi@2XySrQTVkGd zc*8E=ge9*|BwbnDs+#F&HkNbB!$$_)r?0?e+Rg;AQs4AR3KEo`U-GYlpznM9rat_# zc87e4id@Q<*z5aziD6@&Y_9MBnn*##zm!qL$%PB>_Gwwf_=@JOGk1?XG?aUI*GR?E z#$&Fx?-+)3bg2E7yj%mxVhvJ@Ep|WXvuC2>u*9R_o}woz&26o|@4Y{^^>U}kQt4mz zlI!c~P3#tTfk}d60tQd!%PuA|*ip=j412U1nDyHRS^@(h9*?GSAU!T2PA9q?uC%PI z==N^!?kbCmDIvnZg6b`%Uk~UL^zJc8A^+Li+W#Aj!o2`Z9u)$hLAPt)Szibus0N?o z5%T|h?>^75s@5M&32jyo=y`Cfidm!J8v2FAVa{UCfs#bUVsZ=yF)$H#{Eod%;@b7l zoH}PXr|J(xQQ=l4KqKEE;*7a4dfUD68aWX-n)NIxnOouQ;^s=gxGML367pWIv0nW9 z*S%6lqaCy2dU(^@FU`!{d??^`&;PBZ-S`f9L-1+cgm{ba)%v-&96^ndwhA#69RZguUZ8Zp8txQUrD1oM_kMy@=sm)wCljg1!=h$8C?jNt z@9!IyX@jnZ*aShww2i~btV*R*fKWn{fd6g;O|;A8u1#Bp2D?)unk8gr<^A9k&3MPqjg(j-!mHJnX?jivas4k^8za-q>X$#GfAp)W}=H z4X7EqZH!ekZ81HX&9(CBpsyP}CdGkd{7aPor^M43Lp4$!Vm_Es>XFKG%R^}vR6Ip_ z?SbD;2ySu4YlGrt`<2jMANQ?(w5{GT2oG8wECGEp#~A88>E#z<4k(eg7Wrrl%@7U9 zh3Atco>=n8%1UK&4`KBogirbFQBu=b4!?#79FVM_;{Ah4K3vua?UsG=dmmw2Qm)*$ ze4lE%Qof(cv&1mcDpksppB+jN(FN7s%IzU%(eC{zkk>8acfUNpY&)wmCiFz?47A=? z@FXSjtT!1(QSz|lw=nN%BkQRA`TwgwI;jt=DMf~Sqh&N_vUrysFPmJJu1Od*-bMT zm#@!{ld=kjWcHV#iZEkosV>2<_d79z70?-ce!|b&L5B)$O$=kSzRg>H{1=`?2OW56 z4GkKe;0jA`3JpZLbg(nYUd_1$cc-=^`(ng5TmB2iQEV_5SGjNSv=z9Z-K1~N0~f88 z5#2jahv>f9y|Y9aX+ql>BlP4&IRr}nvgkXoz|kycx350aq|3L6toC%s?yAxax~=uG z>WV_oBnZ$B2P}mg2^tq3@4w&;l1<;Wqpi%Wb~R_eOe*wcTAKVgW;o6-6S&jr$G~Vw znzqrbKCjYmYT)-Zw=Zxu?if1qDeUGAN?a0xVG{Y=ixa*~=?_2xoERbhc8!M&<^j7{ zsUHrg)Ov*W1x6J!YxU3{0>*pPKW-Gl8k}x)Pk|wUXv$alJcAiE#Wn^&F4&%*H;5kY zJ-WzXkkaW_so!;7?I7dR6_81kt z!Y2|aP=3iWHC*04OAQHBXY^)rM2}Blb99qWn=aJ?zuBaOatE+o!J{ECQWz?(0s%eg zbL9bw~}K$f&eJPA}>r67Y$?EFXiV#)MoO>PfBKFC6w}g>0K? zg%a|DRU(36PWHK=7f5W;> zCP^M=*j{53_Z!ufi1%Vqnrn8TQt0ir`zYUXE&oxS*cC&-jpAwX1?ym2jprMkh7T}R z%VgI@u6#tL`9rZg07ovYb^@3Nv!_XSn|`pNJD_4iYGx?`@5V>#jy6!cF=I>cd+!rVr}`rr5m)xAib z&5sy%5%yDxS7zt#nJXDOmN>@yY(Ug<$a%$#xSWoVa8T5A*_U_6+v&fR%Uw&0a&V_A zx6Wa8_mBHVoqgmy7&d&)A4X-mpW@;lPs$OQu^Q~-_IC(~v2is~bAyl1MpJ~9( zAIX&2rjK&HnWESbrGU2}f5h{DNh zDpsFAu6LHbQ7wUXn|cRR&u|BlrHbDLz}!W9s~yn%Y2U*Sas#k~nIv_PDfB}5RDf+U z)N?}gd0(|_mXmMG0-*pkdO#czMki)t+a?IfPwLsDO~;HV_P_Es^;P z3Z)b_eL;1~_f$zptlCozC50vyi17lsO&Cy~)Nk?m$yraQT?E#HIlx!sa!z~ivrNS6 zGr$JkGBoM2zv{>E@0Jacl9>XxxM)J+M@tW6iqT21VJbn7Ew2ZYQLw`jjTIh~aRymr zM~J2hgu1hu!@h;C$dG8%Q?j-v%)%&cPr1*&HdpgVMZ`nU+|Tz3*}n3>3sN}hl;D5q zEP7;<^Jyi)6P?b+kpkH!qr)D=2-E`1evvw>4`=KbAkA{kEwQmv2=A2mLb1b736W-b zR?kU!r{T`1f>)3Vc#>0;f(u&7CH)#eQ069CEnv%N(LQs8SZ$eZub`>_F5;ame+H$K zOtL@XIAi6j7Fw~vGQEImtS%mIVbJlUot$iqC$mCVKTV;TOh7SzV!uq(&iJ;z!fWA7 zm&7($5qi;dJ@r1a>$j7>=a_op>n@?82s7FU{uT0;WR#sWR~zzHkXh8BG7M4R^%vTo{3F@a02n^0{ydkNv$Y}B*H>`&#u+a~ z$0%96Zkd~t<@ycH;Uh4)B7I?x=IALW$f!w+($qMd)cz>2S7~*o56HoEna=ZT)()BvlFy6Yb`s7K% z8*?Xeo%%GFS2!;c&^&CQ{o?m)A9w2O-_;Y`A9B*W?yJZr;kSrMV{x zpukb7UQ_8)hEVSVtC?y6lZEmDA017y0Tu=cTK%As`z&?<4u@6_7tV^lf?2)ynoucp z(&N&Sm6Cjh*k5XR)op^mLXR$V3rtSn<2d*C==P2_3l#Z)uO{vD`9_}X;p}m;!R9w@ zf+>_ltht9OZY3!7v~Gu6+{W~`4YD!$(-j$^wk9qQM2*MYobn|;ZF(z#S$#W7Mjel; zqaqDC8bbuu)2k*Jg1h3tO9jB{WjO#D>b~bxbdF9)9%zrPjH&O_+egvc=drN^cx??E zkk_aqM|hUG@A9WK5*=|94Jt-=eO~2c>_|`X?jwgInid2dK{BvVd4S zB(JyMUdT%MB0{yL{Ty_1Smq~uGI*9shL~+Wd9RU(*jFXr1;!KFq(bLI_X&I&HsJ`U z#12UCqgnfWoX*sL>_lDQ8T^JaI#!m6cV{RqI+iu@$mJwBVX!o5<119A-Hsj|5|MF+ zfl%ei$!Qcefstz6tJ$Keauz4vd;RS-v^Xi0+_hlAbS$;=@|O28;Ya>3`v~pS7}QiA zIouJwd0S_pYSf22p0$P9|44$U37|$l^xgP!uOmqHU4!~=Tf4gYqw^C_ml(LM*h60Kmy=Xt(&nvyP`%aUFLf>-(n{wu$ zzH_!}HP!^b$11)%u%|yw@8ek{*lQXRzQ$(6v8xCn$(j8suhKolsg)bq`cpr%z^$T5 z;{E7b0Fu7BdMuqnePlXqBHw?I6y@Dh@3s344m?fj#KK$2>kX^Y=)O`k;lCtV!{8b8 zpUC+!N>2?5wMuX9*d;vOq_Xjh^1!oUO ztTI_d0h&3c4jqhVo5AJZ^7hak$mQ+iqgrB4AWMP?TigCG>Z^ct6*$tpanI)Eq`|N$24nPEy{~`Y1{T7rK?Tgz z6!COhR2yW%%k4Uglh`U0PqF+I9>Cok9*RT2o-af%f=$5J#G}+5x}GciH9>mC$e8OcwM|+K|Db`SRbpe|avsMKgH!v^)KE z3i6wO9PhLuvGEu-{wQQwF`NlYpZZn<=^M4fUc|psBR})^T#~8q_knxD(F|INI{qZ% z{NkSK^>615@`6w87@TF795k9?(wkSeu#l_3#oc1A9WLapqw`_i*2k+vw-Vt^LPW}- zZ%dR)N`AvcMw=(#$F<@QgDZ<#z?JSaDPNELFrAxzv1hIbzlPED@bwiTESTIk(YR3 zneJ^#N^|4axmqL2zZG)g%T0OvmTKP|Y*QUNs+~ub9yJTg7iAoadi|`W(D#B z<*5o?B2L2Rsdaf0VJY9xOrgOrs$XL(E2F{)D1JoRso{^{pRd=3t7Yta&bdiKB9?B4 zmRBKxOGQ0XR0QEK$!_F#iT?ou#sZ=dfH)Er>Gb4p#H(e9NV2Vvg7$Eu^8u*w4F9Ba z+tk5QJ(;yEY8xS05aNJ0gSdtZqSCF2*3 zrNVQW{8NK5zpy_uP#ZFy#z?BLk{i9BhDBwy-1A?q`%xd%U?=!&z<@X{B8Y(9-)@Nw zyp7iNm!}vdd8>;QpuXRF0zmSKF>^Hgk8(5 z0}?!8=U|4=m-twtV2eQ9-QQZOpTOi_!{sA?jMXH!*2-d1c>6V0;-b}HP9#e!_hxz) zU-K(M_i`dH$C)P`osrphc zCBtnZ87jnsJP@2#7d@rM8;K;%eyrr*R`R>`X?E(DJRtZM;~rsv2!4DUEY$Z)TIhtL z7&+4xBuK5_Bj)F8)y198cPOdDS?0T>a9HW$XR_7CED{aHuq6orA9@`et_$nr@L$1?_V z!y)f?-3!~cPG;9tlzU{7?UqV+o7=@DYmmUKbUa~B%!*Z#M_>Wg-X^#74?iB^=bK%- zpmE>C|2Qc~A#4lU7t!{w=G{ghzJ3wkY%s#8r{h!=7F| zMqkAAMeL<94msO%-QLt^fiNfXiyU9F*a_Ao^Jh5+3v8b=C1K7eet^twa>q}y>wWz> zOa4zbza8RVw%}IIp)R?_A=C9axiL%*AiD-Vvlr;f z0Cz+!JMwk353AYlrQorL3*0);Z@N)f&GzJ0WTo5TQ5bjSO;ReMlNGUKyPy_I<3gQo zYjn^YTc5+;#H)%*9KQ=`r$b1^_aR)Uv!i*UU&R+FjJDmZ%Mfw0hI7uY1jMEkDAk0U zm~kkAX(sE!G%{X3jOFKiT}_1(2R4Dwd#?af(mj#r*+dj zLAb4&Hw{cG8Z;_}$2miHtZ*%J_2plj!^tKhAYM%I6qE2lSQjb7i(8I+=5`d{oo5eW zfb;*b*}#XR0V`)G1uq1`3nAsPY|vvJA>;NH z)Tc^k3FIU$2W){!Eki;hXi0Jeuz<7-{H3>`TZii}qUsOrPtw4U{nQ zJ+poE1@_@Qx1SrMP`0z1R~3=M^Q-~MqY3zYf)^BL&&0%pxZP#_5_*rzRsY8ZQ-B(; zKkZzdKH|Jmi^3U%PI+xDw`tV8w?WSDu%4WSpfmI2uw$UpVBnvn^AUX5p<>Y*xlAkp zOzq~~miQtwSRSIY`wu#jll*pZCP3!SSikJJKl$X>0vZlo9J2jsDNmzB=-Ull7ehvkWT-GJfCItB?2$|-0fX9lddk`}$0vXcD;#7?R zfY&JhwjaK2Qop<{eQ&@0w&g*2aM0wN61HLD2;galF7D+BAEcE5(*cz2XN{XhngAEy zarHTI;M);tPJEurTk^N>3D4^XzbLoukTkU*LW9q$`xR~5#jdnfd4UBzK*4&TK3qUe zpP>aB&}!P0Q-yJsH5KRJ53Xt1MaOc)J%m$GOkB4n#h+i`1UNAq@?f3DdJJ%}Ug5cM zmcIpM1QC(!FSU`HjRs1drzHY9U#w7OCR#- z@3I(KaQfP7uh~aOA*8L?W^s*WrtE&p42^=!0B!P8PEfpSnwAf1v)f%$H}a40)(!l% zZitids)9IwXF+tHLCpd(>7K(FtC4KXcdl@`YS%7!GXIp0F6@}dTWyZrg zq0FAhqy12J?4r+8Il~=I_e1iR@6eVu6(!7miEAx`Uz&$T>o_zL-}+71YVb^5;uhzc ztB>%u_~P>~9P3G69?@4=hVUrQOTKXd%UTipA`}JtGF*9p@x4H0=hanX9+hSwPo&MToA#`5BQlSc%c_vdt>;(k7< z2Ta5&nJwxZ>|!xJ$e!RR4|b@m#n9r)AkO>!S{G=@f&{F7fUh6Z5uV1%_$vm}p-=jQ z9S4o{-;GCS>9jAdUs@y>gvTxz&muhrFBKv>SQQEA%zpZG#IF5NF(Pc9<7V+McA8j+ z=-6kmj{d4!g3>gzVN3U0+^-gsnPo3Pdr2(eBk(J)xe_dZ+UMsk(D9r*?~KQ3?$6Q5 zL@7u(=+G&F)dY^xhOBpe8Nik7RmZcfqnB zOL_^!0+&;mA0H?A|WxKq|x=j8)5 z3M8vb0lx*TS)9+-zJQU(Y>ROLA+7^Gyz)8aQ|STF#Ht%BvhQh+^?CBk?pm%pgZI^K zE+9lD3~;Pl2j8+#F#_}$cgK%*lJ<6aMZ8#cW1)?#SZDCc{%Qn}1Ym$H>msu|02H6m zzgXv)Nqh3iC+$}N=cWOz@)kg6Ijc&9;M7>2PtUrzRavhC-ocvCw<6@Wz8%LG^m(BpTG*awLCj_{)lp$X1fj{d{egg zUX5}{+A4dbDZfZVH!z}OGEIe*!!)UiYCoVF$FKYpOM>@(S?L=9Nyylx9Cst+bW& z4Yi#qYuUvr;W=(HaBK8Yg+b!YvOe%u?af9gqq49zhF*yoYH z06j_s;quLrv`6EUw_$4;SffdP%R{%cL9?`1g)T>29^t>rD~g+#gSMyq63_lBvs~1b z{QCY`-i$Q4G_!q&;!(HFXTn$@`O{ugKI;y? zSuXCYLOI{Hi+^iC-{zO!6x- z4@d(7@x(9#JTRk(2Lv7v5d)LqVw+J02OHn8P21hobt>QabUtZiO|9N_4%Kd#U0Z#0 z&e_+sSDkZuul=nH+YC70bI(1Sp!RSUQ8WMTnrp895hU_eFtd|Jlgv)cQC^3M$i+_Q z%_B@&xL{Z7HMx?kb`^SDP(Xhg|8Q?F|7ilgewqJ-pg)Vgxf=zKB)=>_?AWpV0T%}7 zOFEnKy-vYp@7{j`{ax-_;X{XyvwZCLAhi4^{z;u;9iS@ag-z&Z6Wc>b!Gh){?9lwG zJZtxYJHop=v}0%& zIDYXYftzRDBQa0Aw5Y2Ekao9K$BwVD?GCBx@Y>L*G4&ouT}ZoX%vbCLluKyf5qSGj zU#iFV5sPyLFccl0Pb@d>RVJFWv#h#Wcv)VF2O2-*x%lAem(U=-nWQq&XKlN*mb_c}!HAe9i&pz$r=lnkAk zpRcFi$JW=gqWO@A;HCIt-x2?OTRP5-)|6a^?d5xB@fZR=IVcUjThzHG5qtH5)#v-)EBemyFoLW4^gQ>pTBOak_w&>HD%+6Y z|5cbSSRn)gHeC#3UZX}oR-xU}!CLPpci#EKA7f3u8EfjUOdW!A;mjfWy0>Rt=S(zg zd2<9LZv)Z}Bc11sS^BQbMr~}35CIAGK!g6x2cLE7MvEqD0Ko}u3!G0@yIE8z5CmP? znNXKl|Kwy}Az#->6kOoro^=FoBGGjy5DE%NC{xfN>;~=P&WGmU*3CBf8h6iNjLzMO zrKPjDJ_zB5JFWUB#D1YJph(gfi*XoAfrNri`{Zei10kXB-Np7P2;d+cMG`tvaJ{|K zU4?zeG6V`hvlwH!3pE1>5#QduEnU82j&Va~5H+31MvH`lCg=z+%%yXy;KkAkk(WQ5 zf;&$LWAn??5LTvvip)?DX`_)3V{Va`WRr2@+rmV6)@=G!nI2~$5I#PLgasi%ES8X? zKJ``@8bnuB$I>iRgZ-%gC}g`X)kr1s@zrY6ri9}vKZAhiUOLdwBc{5I+*1bjPb%~7 zoV7D1l>+Z>kw=iM3sCRg(f;$-;m71zyLXu})y~%w%E3OIDu73eEX|&m;*F)zw^zRE ziSCduE_p;JSEf9np`4%Lbu=%}L$(d(&;BB(8rnhiyj2Q#6VFxo`R6HGkofuJcrQL! z1YBxO!8;Nr?>S0s{JsATqxacAOM`xcU{2XGi;RT7osypeQdDoyyBodt(eEBTLq2BK zu>C~e0>2p6S#}NLjW!ep@k2cH&w2E%$nj3Ui=M$jzj>2ylPQ88q(tW)x`m6MV_yMxPPXu$@j8BY<|%nnGJ{)I6N^C5vm`+ zH0^*XOd}2g;)M%&GqJm%E@0ATl+_kMxWETwiQ}*M;_ut{>ryDdcr%JyfqX_@Wu9J6 zpgr=7PvHbASVS>)@BWs8@07xTd7<6z8EF?w`B4Z0#wC_vJm`bJPNVaqN54$SqI!ga z#i1U@QQ$M|=E;RH5uVQc_H?|9N=B_mG!@8z@IiWdv~QpvSoXQx?ZT+M6h4-Sd|;$> z!>+CA%EkG#bK5M`sy49?E!;J~&h!)_dLvRYN)~~RY@3@-3&*F^r(d2dY{OOkriaT zuL>orcrV(RM6R+h*9{t^;I+@_|9cJ8#53NK)| zvM~7IkmeW7Z9sxS18GO+P-yY}7HipttdkA8)?YvYwpd#b9>%vgbr$OiA2M|Abhrb? zMKA;r7}fm(#%mwbh#YQ7Sq|M*+FMA6QU+#dC%2`L_V18RFpSyWqwXmL7|^zrV?nTy zp}c~G*?Bnn^|EoNf_lBsyQEPapg`(0&&|yei9szHTFP}MJq}s#UHd*cl>P_mSFGuG z_xluv7?iB2t_uh+T?h%Mm(HaVnClYkKBm#;+m~%g-}%#pw6JBS@=7E0VGvx)a-t$T zw{C`qtxlSSU@~*~RQepo@GHGl8nAEcA&462hWlSlTQ(ZDZ}PHA6au`4p<+*1(OLE= zR-KAn8~YK}E367t3)gx^tWZ;E#42)pIcCq$r8c4&Wnzm_&r-iQ8G)!^=j^xFXTJC= zUJvt6foHifUE_oA+xof@>KOFt^7A`cs<&1|cV9ObBWTdrxifcBcwuxs0tCbi=u!}f&`MA#upem$gr$j9z64a4B&iYhFyyI@=p2q+K)E~86asADl7HXzgsL|b}20bMlo zgCT6CPrORu>53~Zr(rr4g%p-xkWP;kFi7_=8vD==yYA7BhNeJh7(5BagF-zx2MI8s zi5`VuG*8rI6~f4G-iHmy=SNcO&%UQ|wCI&PD0;PmOI`4pW3$~E*uk6xTCv=P@PWEl zFU+UwuSB3N*d?@t>>$5oplJ5*?s<*8*-dcExNAFAwU&N=ES-i>^A&!}vlx3vca?T1 zGqjpJ;#)=A=HC3ROdFT7e+{skv$32c8KjQk?G?Noinn1YwmBru zjvWbB7o8AN@ux2ptjH`vdEV<)AYcS%$pEAGg5@P3PgpBsxZbvB-zSeCty3Hjua-fC z0SkDMZUP13sGXz-Ti8r`8iCt78i7N=pywW-2=sgfgn_~aY%<`f;(E4+Hwp+Hhgpt= z6TM)-sJ#mC#0LrimS_q4m<3X@aP@c6@qQ;kfz7zr<&HZAh_4}JbRgW#meJq)eR{e&gE{x8&)bKs z$85R*$jA0s2nYeJpZl1}J?}24Ze6!?YkL2GPo^G(k5!Cuv~uUWeZEiiv39C#JcJ$C z5aqmf@1n*LKEW$j)-TvkVU@O6=HFf-A-XbkSw9u!ywu7G8Q$KcZ>gcc(ZgA2hoO>c zU6tN_YEifmJv;}xy#ab*19lOilWR^GIVu1g%Z$(<4>|I5rT7iJS5Pt>tUpM2k#OUk zZ&)K)8B0R2XTIWhAaOjYSjyeyHrPLHo}HCTReBb}I7AYy7bWBoQ53C6IxAqBY^7-L zg>k)2h~~j>Oa>ju{Uf#cIkZam;W#d31p?pRUz-%sGy8!TtH- zIgbWB&%IA7tIczy4d8j>=e)_cCAuC3&+EL$R<$ZC1o(bTiszi~Q|F6JCCl(96g0db z;mh)>R5`ov5qQB0>IZ69-o8VJ@_3FtVokwfzf*d_f-mrYzxLW|o|G4?GzLlDCt$ll z6vMm-G~~u&hA4(!IC!06KI}~@A&5KcTIg|cBp=^W(^7jG=gG~Vi4TH0a|y-%L#v=q z){QCqw2?X?i!8Ap(qPIpPDyY0*olSpt)ppp~Y)-32jVr@* zA5(xrG0-?Zn@C)^!v!i`dCr=JJ%UJ;t~3=pf@*_6?dYagLA~H3pXeHd621qbLxK5_ zM~4oZAjHD$v%CQD!0*XAh$X>iAK#7gOyBh|mM7i!-FF{dO+r->p67m+jzI{y7kQy6S%x?yoGUgH*v`5qz7D*(6Oo!t zYVw>1Wi=K&@pYc2n7+J?OMVWuY=(4pDH?NZc;1kQb>^Qd%hHrd>&0{3uh(-P%x_(J zo<}?LyuVPM^No&2pbPz&Qn?j8{5^t1bzXe&#pR#>{AX~(d+n200E~?Q zf@Hmo_-mTNcLFF-LC-RFLM=y>|z zi__^$7wzq0T%dyToLo}YUBTk_uYp#4@2bln7|b;OSow!?8FcOc;;Zyuhfct_eU(P= zML9prWh)kj+vexWMJ(q4t{GvVKUj~BFNKhD1fI>vfr9gr{g;-L! zfNCRSP~3g@-4qBQATg>po?-f`M@$g9p2jz&MEn@P0O$n;g;!pAMTjAVlD(CnAorp# zz4Q{16O^$H-U*^2@MK41 zZnx(I3*CFcM0q-VzBj|r(XztIhyoGDA=Y&t7^*mX5MH~wzKkA*#xkb96(oGVl5txX zuv0c9t7fMy-hvj5Ih3vovvWRz-HsN1HeDbfvrc`MFsjE}JUvQGPvd z10M!qK4q*fep$K)^aUj5k7-w2bv02Ns!Q2eh#JqoG=-=!JXWAa($6+5RaF|V7rYcL zb$Bl10nz!X?u6*tRQE$Ug$Km!;i4RidLkZh*~^7EPz8Fai5GVjil@N{@DBPUF$6S$oL1U$Mb*wxS#eg8gF@@5g z9wRwJb>#`uq@u4a~>Rn`1)-k!_LBelTAKCImV|^)n=*9Y9bRluYx`dm~h3Se|Fn zum-8?wPQs#M2I zSzUXNi^4dazY&r(Lid3OLvL8I@R3}(zt6}2aD#?PgXUGPyf6`$M|xteOkS|Y@|Vx- z$oXrz&JAExoA2war8B9QOnvnSe#j)4DBIWJz0bq3+$~a9#@D_>CD6x{rK#wrh3PVQ zU?;T&}Hi3DC-of zDDRbJY*Y5c@`7!9HV#M~p4-T@JfOOSX!-wLF2cEBfAYyE(;au*LG>go;w4m2)k>b` zu<)mQYP9FV9lwJRKrY^aVh~->8ErVO4A*fZe%T;_9KTG*Ay7cj;P_C@q5yQ_zBx$nEl@8{boPv_k4th&B@kb%1L!}-V0&sgq*iw7+kp+{@;5IBfE-S$UDV?6{U zuY%>;wS#-9UeUn7om*8T^mF5?f;Hd)_J&R-FZ@6@sT&#B)i5f|dFUvE2=>$42M(u$ zC(lWh$?wDu6om!FT)Ay7-EifObj9KpXMEl`i8dlL?|pVO?LP|Jnxao?7=NVdep4Hf zmZuSaWqO(_G#%WxWDFv@z0rAJp+i_E8xpC$v4SdFH7WkF$n3gQeRDjOC7VKndq0L~ zmLa?C*MCzeoSnuZ|L?C^OuHf#tbFVoE~sHkK>-7KRFeV%zy&{q3!({czWHW)?X}m^ z?YG}fq(o={o;#urFTC&q)Z*Idv44IH!7umIUSs?A?Ly`_7uXI_r3&gz90w=_)un(~ zP=yMrR&rTQ)vV{9d#+Roqg}@H&p%(PgAv~T&l_*N!Fmrp^ibKSPz=uJ;fEil zdcUafGQOuB>Elr%Cr+@5J zu%H?6lf8Sb3RaTJO%a@V9YsM`eh{QEyswRb#K=Z$8xpwN4f={;97RGWd1DEG1yG?4 z1XyRsjP0|#F5c@$+?RG1Y};`62G;}VE{rH_o-tJ5z3W#sl0hn_K!@&=<`*BLE3;EX zTL+>m)9ser=aOF0)GbPNtYs|5m$(DJ(p^d1VaHLS8B|rmiS2tug;bPh@m#7z zT;xCc=%eYj+iojeOVd#S>?>%;@#?Fu5*3iwDbx@9o@!6oGA`nQWYCk_P6#yesuk_F z*=yK?ur1IBdfmc8pF#%gJ(vd@4N6-v^o`<%x+hN>5#mA;+7kH)e59hRne zoIFj@*nWNypK^VR=f2&A$n%KK3ytTw`Hht4NbCQckDll1t1i!VUxVk3zUOMc9?!X- zUv&8ST3gs0T9g|%Mlb529Al1zP)6`7SneDJ30HaEy;dZkj06D*d;?o4r|qE{k9N4c zmPI?vF{N@LAlRY&SHzw8(YSfR%9eZiEOzJE6khiI>Q0fnqX?(kSdVw3P`I*Mq__72 z0Xelydx(txCMFw6{Hh&5K(1IwyBFq1X5gl=R(eJH6gD6q;y76uq9=j^)MaBG8riqn zKtEF2jD_#ars>ov)oWU`PmyiMU@$TX)$kMczpD#aXsVlb0q;ny=pew+7Am9qq3YZJ zkA5yx3RyHlzva(&HbOx3amT`)yERzg%QG5PjbKd9MgAj?JVFEj-lK>RKrM?%0KLC$ zo=v~~-EY$`V9SApI*|!1=!r7GgBDQ>*>xD&I39#W3OEh{k?Ipsmv`TNw-jJFK6ZR4 z3_bhov!&ocq2eYOf69* zRqlVaAg}sgMcKKPZu**0*@1>&5!%JktL#H8vO(0NCtD2Mvu~jsym$5`n!{c8EFi%k<1M&!qha z_Lryy<7~jzgF=StAdmJJLJj1)_RFJRrVoDe0r`T(JkgUi4C2GxIGZPx1$f5d8A6ca z`fyCZ(EP}^T0|^ZAA$w#KR`bZp%b7-hz{$ZKOsL9GSDacgE|)L$z8R5*Oph7728Ay z?OQU>c{UGem|etXeZ_6^`T2gvW_~sL*#Meq92?H_<_FS+_e?c^)-T%U9C^_i!Cre5 z!?(*LO?l+b*BREux1}$-9(yE2fe34?&y9(MORipI)9w2mMIgcy4B*N$`I^{J5!M+- zVr-I(y|dmI;y^$dgd;5T!P!DxN!DjQjaBlPs!GW7bn?#hMWBoI%jUh-6zwNA$qu45 z{3FuEc->xso$Gc+pVsHaI>LHbK_}e=caS$Tjr_hr1yBa!iGHYVixs$Nr%=`DOaV1% z^Juf22nw!^okfxhU-oIFPyc&}1CI8#Y2!f=4u`Y%Y0Nsx;~&SC8XRY$@kx^vYWtka z6z(xE=HnjcT0G~19-gd-g6w;HUpoB75#-SZqg?m{)wqhb99XOqK|p*Dy2FKGH}fEn z(7+t-cj+lg2Ivq1bgjewu5t@)4Z(G-cZcd$5InfxhcH3`0g2ZbA41V(yoR7edV#94 z4LonrwgY1@t_kc+SOz*Nu*mSSx+K%NJm!vLg(coC9i4jg^W6Mav^@MTcm@Bj;4>kT1s=B zHoGWn^zW8TxlLa!mABZ(Oz&LU+NO(P^}p5!XlMxdAR zGF))H4rt(FT%ID>7-LoW9W8L%3D*=zScgK0&Z0p{w1%RWggDv3NN`Io>UrN7?0chr zUHgw^VwuJ%jG(E0r%-$X9>D%$M>}k7ejT2JCsb#G3tR>eeCM5agbtMIRuC$_ z%iaDnXU>$1d)kQX+qbWb6GHVS2q&~5x$(vu`K&^a;bI?#;%tv=<_}otDIg(*7}#|X ziGTp$XTN4Fc)IV-s0}7|W1(hw*+590r@&QHy1$qIU*fwlLBTyR?Y42ub+Cv2+x; z*@EcgJLYG&5O?((z3{5Hz1vIoE&fSbEqa4wV<8uIex!@}HYkS=ps4ql#XJRkVk6m` zIQ}bNi8ajc;(Jp2;5Ujs@>SQWqXBy0$>NsTG&|i%J=UwmbKO$~37(=T6yP}|GJ@w% z&!y^d5f5W^swtUz{O2J-1IPe9NeR_hD?RnpQ?mIONb?g;OQBmipJLBdvHl`n zKpM+JtpvNte_86&a}h+hvYoN8)t{tEnxsjZq)D2jNg6g$2w4HDyov*kMTkyArIzZq z7GYM(A|T3(-2jhmkitsogO^!tCNE^fazNV~qKEw;H8w)`QcPW>#1i20TNyM(sleX_ z4TKE)kmgb#-TO= zeT@!J8_y#;T%Y;;sGnRLe{R-Kd_5{&dz!vUJ<+8j_uGCGBh}nEs;6^6x8c3L_s^iY z9_jO)uQSr|`sed#HoxZl8l(9Y{yxat0GjKyZ9Kn?f0m0VZv&5F1L)X@_fBZ@-0Um` z4tPQ&f)4M7^mvH1(V!^wk)eA|B}?~X?3%ZwC4S#ULieet;ThL^!(s~7`q}=bhMPqk z>%(2=0um~BU~6R}b|ln4<{w zU$%EkHQL&n1urdDEVZR-DpG`!Sa+HoG7yHHUD-5s1K$rUZ-4(H3-6nGGv9HpVrSf^ zwvh>KJ#oUd5fg*6{|pfjdqF?CK@ANE*|a(Yi$Y*-v%+NN3K7Ac(U95K98;p&)j@hJ zJ|vko%QBm!)#^|n00000z$}E4K9A-XZf$Le7|}?`BlBu?@~V~E{aYUOQ1m_dg2GF! z@LkR=z6g1&7>SK5VCm%h&js&>Yemizz^qfF1T9Yyd!^{aRXfH&TE5qc5p6Z+BS{kZ zz+#N8AA1M@0000mXS7cw?dIlY(Mo}y8Uf){*HhflB?~hQYvMnqgU4x z^q%(j`$f)1i8)T7i;D|7IXMyk1N|VTwAi%2gDCl>rRRnJ!a|jR0{{R30Qe7RUrUT` z$3wBi^GU^qE$lPJES?{_t)(J_C5>TXBJA|f>#EW=@9Q_Hg4NhyM9-C*TEV%as6s^! ziAF&35O{9=ZJroXf4d2E@G+scrwJW?j&xYGz}hZfSpRW3fJ}Zr_VKy2#8)Ff5h-C_EeGcz$Rfv#_-L>pymF7=+lo#fkbqOD9D+l z%@UIBrMr7;#Wm5z8)@85BzEoU5f#5V_Y-6(n$~+y*01s)lHhA(_!tgul%5LI>QU~|LEe$E;l#@dUCsWnU0*&)@rq4yH$dIzmMD7Uz3obL`E(zFC^;m`1o5QA@y1v zhG7_nVHif`jucs6)$4VPMkAg7Q6)6=+)(Z}oQG%ZL^66&#E63t;cDx1f#&rqHN)xx zBpyOp#_L1%qdp+|8Z#3!)(cM`l6zE=dlic!TEZ2R!0hAK1(wfze(vMx=?RTS1Lx-* zoSmJa)9K*kZ4JT$znBy@`R_1OH-jy_i{0h(m}i*71%K;AL-Q-9MLxSUdMeu=+Z@!uou^5Q&dr4L%@q%}Ti9!M;jisWu#h4MIg^W4{i3Z!)qmkWfh) zk{nW+_xOkkuFmNknHgrlH6^8ZOTbKNb=5 zrjpQ^fzz)ZKbnk}A;kM*>>cjG&CR555fH;L48t%C#e$-t+}HDz;ow|z!kzeIxX1w^RRt@W zB(Bewa5txl&tg>I5F;)yq_0#|qUPv(lQ5>t2X!mgLlrFVu`xVDs$X6F%<<(zfBD9`)jfewz^& z2Ip1LDDQYba^7M5b^%g|4!pr86F_933Ti!J1K07^IRtm9C`wXN9NZ?(gpfKQc2HcMIWhef?9eu72c$93tfM@>1^Z?&Rs| zkL>sR=W%pF|MGAN$aJDWPLESY*RG-jsxaq@k&Tk zjl~NAvmgX(kPA{ZGbubHj&t~)FF7Ets?UdfG^*Wk=}AJ@oLT%0kH$>=VA|6A5$9%} z_PFkDx6Ahp0b z5JCuf&jx(d2^|{~RvwbH;cH?3Jjlwc3Fc!L3Fe4(*0q=)Mn^4gM5u$;IjADVi+2?k z@Zte6)s3(Ih1M~I;EJ0nZi%B{qM+;f{Ftaf2qA7zIh0d$KaQ-Jb5LrP!Y%Iy3JlrdbHCU+MwD8)}%$ zQrvXXiZ!UN9OlFWS(Bkl%{|uSQ9Z~riA%4?W`?#;)bNH7LI@#bZ7|ZrF(()8X&Y70 zLN7@7+Uui&nyJ{I%V>XI2$a!#`C<>qp!2yFUJ|rxp^UuO{$15o&VzC1^B8+44iMMs zYyuM=`Bu(Qtaov`i2Fb9r^A`MmI)z*ka^53DvGw&Fu^?LIzJp&KLmf0u&e2PS=I1c z`xR~jLmRwC(O#S{%K;h0j9KxTy4qDe=kVqG%0d!_1}bP+`ODA5)@ICP% zupWwl@1{xb!kOq_0)(ee)1+ydet~BI0`R-}AppO9Ordn&%6v&}bb5LU4Gj%2IXMZB zkB>k74qk5&IccoPkpS~5{?igOKXb552EmqP30x!$sQ?S@G*L*-I zn4GD(RgtIXgk<>g9Bvq(yAhKStDRzl1g;fO4X+a_`s93`xj2}D(ER%PikCrtvCvQW zphf28<%RI^g^8XlM2Hi<8;12=`8a@69lQu!0g~|aS>ayc=7c9;-vksAKZHMBkz`}W zXSWynR(|+waC`&4Vr?iJINu*Lztx|l)JEzO=d7$OxV*fCiHQlk3|hgz4hKF{+p^UT zY1a$I`_XO&Tmf-afdE<7mw|uJe8Zztu%x9KcYa)+a+c>|lUeO?JJr3{T;Q`9Z%Fx~4-+z_hie-`z zUs+iRrKP2Cb93_<_0qF1SC_-2Sdqsf|!~c z)Wrn_&;J3DGhnSNAjmEr6!PKDq*Jf}zEtp)7?y~SzjG~_3-0`cET)*yx6aB3dR|aN z2)Ft9c}Pl1g1>+KfTE%zC@d^QS6o~SB_$=0ot+JPdwZ0|d3)B!j=u9GUb6JyL^m@t zgSZl0UtdE_O%2r6*22-z5n0W2Tg|j#Ry2>MF(`A0H!aZfN^t()(vOtBx_>5(oaDzvLcx^us{+hYKy>Z7OkLx&}#l^)za&j`{<>kTR z;-a0y+wtetr%e9UVA-nGOf-JfQJf^K-d& zMMP>tA5!!bj)v38vKHq+p8;1)xYJzCp$E^mVCk=A=gTmfB^!tIy${_($ca$eA1{8# zS57F{Mv-CvebAFvK&=ws9?9nBW@u|`gTcW;C2XP)+S1aZ-qCWefGjKqIf2nQ6LZJg zjyntRILVrfI42||Ku=E(#VKJBh3N6|afpnJ1Y|_2gIumlVH|(7{^7GcXoZG`qChh? zHU?2qQSkr3@V0)gw-YInN?1ZmPkDJcu4+*_DXq1C5)%^%7xY6yLX?LVA_eK`>CoTb zui6-`N{kkC{VO_7FO+XpRTb7{Zf?%04P#?t@i{0ci12lTrerYnbV@i_t*+b>hC+aX zf`S56l2TJsNy$grY;0_#Z#ixpZ`rb`!PP=PQW-p6wmH^K6XJxy^2XcLd^xA#tydOBP;ntLxm>7tTjz&WS z#c9g3Gi0f)t|}kQkAz_2RoV_i{L1>>W!mKRt*fhpg!p(=dK9?9BX*ABBu6yE`QK(P z(DN3BN_D1mD=RDbFGF_rf7IPesE=tF0PuH=Vvc(x#mp!cLdalN?u2H8(qw~BisY8d z%F4>Eq!hW74ar7Q6q3y>OesdwtY&j23#-Y@W)?H^{hpbp-oDN^|IwK6)NxM#@4Y}po@I7kt@%HnOYo^X@aom8a_iQusEUnm zoW+wTPdKP}He<#NxNyYUxqcYK0o#|ga@KS1+_@ttGpDXXxLOkd+Rd9c?H@s04fdBn zeBV@$Rp}l-eq3(cxM8gf6d37fQv>I)o_4EepY-*W(W6JlTmT>I_4oIy)VVGbf%VIm zFG~Uk`smRk)jMa%btP)(0_UWmbyc3=WGz(}pAYD4%o{p%r~qF@AAW*tNfNp{Yg{q9 zfB(M3u%?sh4Vp(HaQE(A9Td1RrZMl?vuEjGTz61)Pe+0la71J0f@2uq1h~}lhDV@o zqyYD%R(0L(%IpQ z)(NW8mHf;?qqPN3mD_-xJW?3tr`Vod6UB-Z(3ex4tYYkVN*&R`F6 z3ydN2_(5KcgU3KRj2CEVJ{%I934MHym*zTGTZd~0po;t8!Gl`2&5iw^K7ERB?dm+a zg12?!d@o+SDA%uFr|T(`=t5ttpXbxXgPTfm(h#5Mne~#dojfOJ)+UDu_-9}8*S7U} ze$UwvS7q{?p4DUMIr_jC-R(h#(3H%=0gmJY&7IBPDcfYsXKaA$eeFGr!S{MhJ6bT- z8Lf*ZeSLj=09@GAT$2rOrnL95Zf)1=wUSr!=g(L4!PAi88rUT?_@>#j=2=Zgb_xB+ zCS5}BdO!arE#Zr90KM&*yaoJ$V4Mv=SMr?C*h4l*W!xM(WMBKFtfD`g?Aj;3nq#)- z@PF9Iu5(xP$5S+|?QHJZ8L6?IY?L|XI$PRpaz_Wj`0?Y>!=7y!MC-7JfJ~D!GK}WV zkmJwI}NZ;tDbh_?q>(NQJv113zEP{1#Za!&g6)2LcyKzioPnX+%+zEXoLIs5nTR~2v5 zAm&`SaG~tnxwF)8;>3x#-ZgC4urU5dj~LoIQIMUe@F!;&U*pam3#>LC)mKlf!ZC z-o3l*+O^AdDb=G0fR-*@3U5w>Lx{Hap+kqt<;#~#4T2xlz@$aN&%cAe#FasuIB{aM z*TKPq2ZJ^stLQ3xj3_5!A9&Yr{`~nk$CWErT%a$#rhIQ-Kc}{-?fy81A-N75LE=eH(Xa*`nc9cJU$-yp$+&Uj%C>FWGFgqWKyc1~z_HCUYe;t3#u~`^sZ*!e zh`MVf$%Z%H(zmdkfQ_bC5{MNmR+JjNcjw0(PdBc1C>vggd1Qvg|IE7&B-75SBzc<15LrAzVtVS-LM{tg*3B<$D4ix-2pHF)Qb zOoU(mfc{Hlw5f{`{Xg}W&p-Q|?#AcOpFhW2K9((TesbDXcOj2p8&tnLUS_W|v&hy0-kTRUyIRIQ=Jfhn z-|lSNCE-(%NLuwSE)Y0Uv|Rz`KXZfO7Dh zg$gX-5w}F#8J*fGc8fX5<-eMuj7_7Ng5J13_yV7zT%v z6filHHMD4dZK_KuT|iYZ$AY?r&Eb9gCv|s>8$}aD0eEF`2WtZdHu6fo0K%DxAR#7l z=**!r+lhUMy#|2|2?0VR90Ys>1O`NZt$k9db>e|ylM;Z z1{91*qLA!~B$XA2(YC-fNgKPnyR*H$Jz&+?0B8LHPEt8n?bctwL=_YXkgO#P&*@3x z?Ch-TVP|KDO}sO#(gXYgPLfye;IzZSf!Fb09eQ% z!sdC=5Ap$6sb1@Y4^RmxjFlw`0sufhB!1+SAF&r7)eox$#>c0CV{K_0s35=u9ZD|x zMz0byu!-=*CUtek^(2))NgOx|2$aP5qz#SippQU5Q0${kx(CDoV?>7!8Y41*r0a`0 z!^Z4Om&eD)GXemnk{kKjKoy&!{HccOFQ9?^A`<$? z1^|j9z=Yf)ZUGuuNkYO1(33s_o5Vd&o3GK8XYe8QTbKny&hRm$`gk+5K3AmgM zz$`I{AiJvdNGD*swY3G36igxw&b)<^+E>f011C zlYjQ#x3{;&V}5S_v7s@BT*nvKm2LX98%+;6$3EgMdm_!|Fa7fmHWYWQ&2xgQq$=>KLIG2~YEO=ijs!fQu?JG(nUS<}dV1>lDnqHFW)DNEXGn^+ zBq;zcASU+6D@m$MHr*pG9WWA!u!?bv_EgmaasWI4m`JF=rb?}ZVVPdva$gk{sr+6y zQ__pE0Wt_vuB}Joku)Vg3D=T5up>bxfdee;1MCD$u+N*OKglaq*1Xz+NQ9`Z^Zk0= zuT{U#&(A$ik_RTU`CroOl_mlpNZtUql^Ipty9hmi0>}b1spzqdBuY<~(&-&I;Zpz; z(nD0f+4-vZBhilWs>%kWA~mB;j7gHpchzP-sQ;3+Yk{5kAb-)eV=AkBf)DC1VGlkC z5CO6LA_R_&0RYL5jq*Cux0@S;0BFqSUF{-52x5P55-917lZg4vXgm00`$yn{dEu04jfm}ch>^p3JT&O(xZA!*v>N$S#}GMCL4ozMwi(Oq9{Ym0|gy(*Y^~o=(g&BuOU8kEY{GKz8X(# z@Uq1x1qIi|W*-`n(ieK*OZGPympRQhz4j>&@PX<#3Pa|XVoQob;-3Nr5)eID2{U(I zH(L_1Fhv)F+ym=YJNVYdYDFQ$!S6sgzm~7W9mG=q*_o)a*CGOPD_$W%&LJ)eTGhsM z2ILcVHfLV7XUMO_d^G38YM&I*=x$u8)Smc~IOxcC*~C~Jy>5Y}QV>E)gM^X~Kt&5R1(K=gsAy?vEQN}fCVT`$I#Q#w zNR&vR0HQ$=0&EhoNpNB>*xt3h4)c@zmyVC_JlCs@H@hP}dfx7xmosP1{LkCm&;|y; zzhs>`M|b>&uZ%I?pI!M>$^_T#I!xihC?cMvS3-Z$&&^$;3&j~^^YCm%0w|NHjx<(Giy^DpVA z4aEi!V3k7n2PoONZIm?@IXM|NwTugB@d~hr!r&EQ3drSDmE<@mKpTJ>uR#MD$;*h+ zv1z>s$PLiy^Pc|n-;6__q7)EhHh@+L{WQ3F8d;?+kb|~$Osw~Qvw?akHgiDO1{G^h zz!l(1QSk!US;uYUya5U;Ydy~K427jJfY&BT@r*JD6xI1sYzDLSmpMh_@WATY34LrJ zK4;tj-=BtZ0|54LsaWr8TcI~am@=AsyrcQmt5<=CfD53*y`dpxkMe-tnXe~2iAi`g zj{NRgb*jf^AAlNAK(Pnp0GfEDOc*B^%RK`CK14Ucu@FhB%t@E1PLy3jtQq8DK; zcsX(XnNxs^qGz33r#w`<(l$#T<`O zR(T-2dMKs7%L_8!ls~UpD4*$jrA5tY2@h+}+O2Xi;jQ6uFJp6GtxNy&xtCXlY_La! z4tX9!r7wd8IoSCUkC8LIJ?p8;K0MBt5RW;~oe~2?yb%gT4qanVp(y(=JZwC80ANib zeG0=*U3X*!j}k@Hi&8{!!%ybAE5r7`x>m9$MNTo2xi4cgR&*!x`o5O2XMXg_nhOub z_>nQ_8@_Rkc_(Mk!Fuqjg`%GNE?X&>Dq&U$Tg!UrGGZ%)sv24^e2$E6C5>VGAgTPe ztvsZjiT7iY?0&{muv!BxmMq`qd+4)<5@+p{Q69xaFW?k@+2_m;O0#_@>%yt(}Lox^xQKD9#d*pNHO@j0NN0*mfF zAn;R9?H2(Vz|HE-Y9^F`b&xj+Am+*FbU=gj4VdATvC#oZ6d1}!=Jd?G(fggb2VP^P z#s4Wl>khiq=Msd*o3XyNKk^^|86h8N#)6kQ`QBsCSwF!EU<0s)O$fW7M0x-5h?$Os zxbSj#129ax>&c46N}2hj6#Bn{b^z7fL=iQ=EV;mb0GoS-)#RizVSo4yAEfS-d?(9V zpD2myaWCsR{_!4VsGqI|ti)g-^anWAHl+al@KLVsV2F|sI){Fz-$Y|&ENytNpF4m^ zTgIQ?E5KG*g8Q8FIE0>i1)P|()YCl)LK-QEtld0Jygu=q_#b_EN0snP*2HY>yRWtf zbPDGZ`h%DC)x6>9pALCIp>hr2Do+DHxh8YVbKKTj=b4N#?NwkOYk7FteIY_$x4o{E zSf6*wZXOF`vStC~-;Mrzk5cm7Mti(jQKKZJr0K@~b6=Ae>s#RAsX7^9>K+Yb5HBlsHbv&0>{k}Em z-r;9|3Kq+P2k{+K4u&vz;GIQgELZ|&rrmaJxOQKi4=n7lF}yGY&GSPjh&w)7Y&xtT zxh~#<`@`FDaO>{!#~U9mzyH^*tBnbWiIof( z>2ayC=CBU30uq2MQmkOY4sjI*a$sAql8@5=ZOR; zqCxs$zJx^B6q7`cKWjXDHmu(MCcV|w@5`o&C*qwD%gmC7XMXhRtMYtic_($Vv?<1# zx@keD#8N(lT%>O-oIGkadwh1Xay+s5!`FC}6_XX)k<`h^McpTBBGB4KeSy)G85Y9F%}$(=!y0MgKXHB*I19CPY2mijB-*OFEgV> z<_j&zQ_7X1E%LPOOto$@GXQ<+k*fER^^yPh$(p6K-5E*`#b?71!P}13_yWI12Jr$4 z1+%8`T(4_(T=SZ;GyP4QXq1z)%#R!nIU!#iypRO^iWkU>@PxfD9w&UN2(u$sdfPh+ zdPioO^W4*Us(YKsMtgY165gSdgm=_&DFF8bqs``f*XKz%);vkw>tdC7Ky+*#l{CZn zQzc|lHX@+To`gR0hCHt$Zr9?yaOyQ zWApzaAph7Uf0#B${li=Gzj3_k^$(V}ZrofBZVzyO{BU{jDD9;Fb1B)7Y@ih&vkd0c zE3vU+`B`CeVoQysj8(<&*>qVO-NzCiD=g5S918Wt{VU0lyPZ`rb2PIQ0TTI~5EdIH zAu1_ZzXB?1sMge)6)+bNOX&~`3#736+R)z}n+3sbZh=N6R%zp4G3Is;aMo(!pZ-Kz zfUJH`AM4mz^qm$1h{~amoC-A8&9o7;m5&h{UfHf&hUR2Cc-V1KZ-?DGBD;wNb9{a_v`@DFOdcByIKq8s@=w zGz|E%cAP*L{tJLgeotb=S+(W1IAkE>PaiTDRbYQ@v;!E0r=5r+zFqy|-?h88!IEES z={`US-{bKZ36jSpj-673{t|c54j@;ez!|q(3p^P40TeDf;;5tW)v*D3e(TBrJ~bC) z!Fz*e^o1o{KhUo5m=L?wIX52W<-b!sm+5Ysw6oF)S$73!3Gq*TRphvW_yWUSU(lVPC)_4jUosqBKxcD~Qj! zbASLDjX&L^4hp5vH2+bc8Eh!^k!LZ`d^|CJc&{?1|7L9Y&)9j=w4+UJlX=(2+>kBg zSu5twGfZ4(?D)_j3o$U{o+eY~CE;PedgBee#@K;(@Z#qFLXO}CbM0kK+iUQSdM&d(n4EAFrK2ilEK%IKlEA#Pe&^H{ zmT3hrpfC{9LS_g%G3Tty0WAQJO&)-#{j`y@6sKL_78uhX9sq!h0Hz#hCstE}U0pQ< z$!G0l1LZasssxM>{Dd*A}=lo$zzgtii* zTf;n9MtN7_VW0rosEmWf{O7N|M!{o!jh7*(joEwvR$$wBfF5m{H$cNU^xFn#9O)Cf zp;4@y#teMsR50_IIdLBV=RV^|zj?iYp7h&2EOIc*yl$R- z=V^!nj`pmpuBmi&WHKXwICa+mIpzc3{&kGM9*5i&ef%9uIgs>HEcfLhmBt|a2Yn>y zvjF24bsD$Ree@Gx2K)gw^XVFG_JS9!Z{XDDtb6>8_adM0(U%4g#jp6pd@^EKV`u>Q z=H#Uuhe}y@^3~d$M}gHRd}uwJ7ySlYv$MxL;SdJb0l&s)Nhw+g&nCJl}A;>`ex@-~P{gKIi-X*mU>DLOg!+&0qiI<(FUi{;&)^ z9FuwF6SnpXz1q?s37D;VB2;2s8J4p5hv4`;q5Pz!T|(ioqW$;iWV!w5Gt2dxhePqW zHR6p27`yVhQOCIU_|75+<+ERSarw);?=3(4*4LNse&^dsCVke{0`1IP<~9Xhhq%pc zl$+K8pulG2T7p!)ec|36%EE`EUe^%z1baUnDVsUQHMqVSpB zwY_AM&^AS=H;7gU3AGof4*&=dqEtmZ0GGX@kI>%H$DprL-lFBIEm9+;O&da+()>6+ z%;)TZ(UC`!!5ZOB=39+ykH_Bm^Vr{LFEzmcl(`&mgrzc9(^0vX%RgBANNGQ z&`*UJc>AgY-8bFx>h_RwxeF)dzS1wzrb4>J`cr3H>E}__S)r`BUWmAy*JB&n59(4N zj@ZZA5wxX@dkF3`fR7&3pMEX@QG)@&7S${R5^Mv7pOtVN>dG0b@T{PW_|Q^)$KU39 zp(8W$*{Q0iC7b9E2yNRji`RUZv4vz3lLR1|NCVOasR}+0A$`FIt^AMVv2!d%|3lr% zIH@6NMo4q+oG;J1om~&n`WZqT>PIa+S5WmOlN)NR4vpWaNAzzzvuHP8-;_8#PPp;N zJIa8%lJ~flrnzJDQSCL_f_j+9q|d#vL%VUJPaQgPvTPF0oRwvDfY+Ln9r`0 z{id$$H+4N9-Wn&c+L9c50?9VQ8ZO5ZkTBt3Y<(moupPVPLz56Y15nsmt6jT(;O@nX zAKtWsQX&GfE7|rD5WJN1Y){ZM8$|W9*|H@d%k42Y-2TnpK~2A}Z_uO7*Yu*PsJ0Rh zQ}0tVUH!rUKIpTi; zY0^VG+5!o|461h4n4Zi9I9j`8Kx#~|OBC6_f-Q2WB{C_YRg>RaVI z6~g7|+vbAUeg!EDh=xd4F++{Im32i>b@|U@DcLyFe~eBr-Y4jr@z?avU;6y_$Yc63 z(?%|g1HuRbf_+Ukyg{I}JTyTW909QtjvyfStn~M`{idGU_i+vW=^-75&c1KU2%dd` zq&K|@h(52$hawe5ZxI4g54}IeergGbbW%t_u=QayG9Vy9{Xadkva#_@Bp@<_(UOmi zKi<%TC+qb5O--hn5nH0c^*)gqQNvAJtK80f*7W}QH5zkGUtax$u6^@$Dgu)JBPe{0 zoR7Khpvu~&3Z+e-r(qBgH8{Z5KGc_>B7qq}s0~4t2#YKwPXnndoqn)=HLhIoWsr8k z%MqjlDo$4}UxvyZX7A;EOuqE_A=Hyjlk&f?&I;;IPzwTqgNl~;yclemhT3LB&3oW~ z2R){!yezEcEAkT%Ash}7@dhn5T3`vt<9pYy|3g3yJQ5HIhgt$6WWqy2^f7y^-1d=x zh|ZTjmTUc_Lv4+UlVJ4L5|9Z9h&69|_tK?{Hxm#L09LOcvh==8p%PRS6YL+8fEX-X zZ)docW;0ryt6;&D?$eh$^zhj>ZN1ncGbyPlr$ldeh;4ccUE+gX zx_bFz`s$0%sA<697k5y|I9*^H%s?eG8RTNHL^dNMBcmq)fohvf;Cj@rypj-2JoI(} zBp{Eh1myeMa}_L+a=3v!>R23-g6OUGB_i>C{eZCNm?KPjnXa_Du=-llf|5aOW;3%6 zIMsveY+w)gezx7p{hQ~#lhRvMI*<({oshLcvtSVYts%Uj- zN;nHbV=+_*@txoWv6D?s zjs?dwx7&5^K|3Nm%KL~M%d#BsRIbl8k>+^Wci(<0Sm9$S+?W6*@$jf!=|$;!5&FKB zfc%_L0wRFVkNF}+7TehfAyaCd9UJ$;8j!LqXi}84`R8BsaATWZ+ASR(5LGj3CdFLf zRTD!Bf`ds(JTkOuYPzrjlZF@Q`Q{6{^3ex${o1!A41UNsO&=(ysjL|p85tQFi-1T8 zh!`U{aT1Ut6|6^g5&Dfg9TJd3Njl$W3CCOuVpROdqi)sD5n+T^LpK9PGN?&Pgm|Vg zh7F|$Oyr^y*ib?33Z2p4iTq4@zR#`XWOr|$o<4g?51ww)*6X)0(L%JeN<1m4EfzE4 zT0%l*)T&#R^&XvBn$nqb=WW#3o(74jsKvmSf=PXd^%N}d$3wr!sOuW#z*eLmSUe5C zB7>g!$jHdZ$jHc0lgI&|ZUKo%=w1U`%gO{O35Z0Fw0{tF%mEMQjXw5hKK1tl5-Em} zwCohpsI87eU{zT*j0Qc++(kmbWU**-x^kAbcuL!&8S!-Gh-i!o0@$rqn2ww-Q}fO$ zt(;w>vuo$6s7h*hPEmFF(~B&l(?~tQS`O^3|8(mX7Jk9wZ`bwF4>L#Rl~uafath$T z0`~Rc_zl2}3VbubX%uEIP-d@MMSPySRF!(SQv_o3-_;NL)ctYGuJ0A0`WJt1FHVq} zVMazq#z})B5t?-9G+pU6LGj&7?+--9(zrgz7!d)-;Kp;#kcOYM8231Z1jGcK6e`x^ z&$vfw!bg<_{O|hq`v1M1&h4bTdk3_>{f3@wza?%Q2TEWStT_b}8=_)7rlqo=axx|e z4i4vmopcGH^%-6N3ciQgs~2fi=32)}zuvzO=Xv5|Kpgbpywp>a{*96xvb zBz`kNMK^+vm4XXxT_}Qzue%X^;Kua@H*Q?C>n{4Bi z#{}{-oa@PD00nVAru{+r*ye>D-UVszmfOD?dN+%SD`yDCftg zS3n{+jd(S2@5WKZX%| zT0U4QXEF>hpd0*wa}UzPdl;6Oj*SJ{VCm?QW^t~qU&Fe6jG5zxJnBZ0^ta%*!N~1k zKWA+BdOazmkU|P6WHKe=1zFCwn-SgkYRW{fkf+aHmp(hQ=I6d7InIR3*|HV&89uuO z%jGbiOP*Kc$FuTc42paM@=bmC;eCFF;OXVB{C;|s=YJzZ!U_ki#l_Z_y@9yqOwOU12 z9g%~B1F6^Ra(Q{FJP^~<(^}{H`noimO&OC+%F@!3+~41eITWX-r?6yeJ;r3azrRlz zJ|;5)JKBenqq-Lt7kccmO-O&9pR0rL@bJK75h6U=LB8spot7Zw)e=;%oL{XQ7L z8SQg(iW-duZ@?kg)Am~bKR!On#>R%s&(BL~ds}{uu`yXi%wf2@yOZVRWo48ul}b2e zR$lG6y1L5tHJmiH-Qwb+l*?r%x~9jrFSdgz?wOexY_8;f)>gxKa&m%wz^IPjU@%BA zx=f6fN`<;uy;2;vx3{oX`xA7wpJ_j=tgNs#P0N(WIQI7Tu!SDHu)VcKoIJJD+}s>} zsP(klZQ0q`VSMQpwws$9vmv%O9om5oV}o|!h>=Ho$fFJ&1J~Er*c)Oz9UGlaM>aP% z75Cxc;X8Y0tD8U&Md90~8pW^0fdfMzDFy|K7a%+UFMtBcDNbG^7K??h|Lt~*^EdNB zA8@R;YtOu?c**DUxK~pjuE#zd%frLNBj$Ku*D8Cj9iw<)9KBR%AM1uECk4wM62Z?M zQ4u9Pz~kvUFHvK-AIXT$33JMxo#)Qc5LRmx$HJJ${++#XF0=#I?~hzQzvTV%TWnx% z>_`{&^Ofj`KG#B9>|$A36yHk0`bT%|5IKg>&So=dG#cE9uPG+ra5zY%Qc)7z?RI6i z+lc`J3E6)Oh<+}YQ{tM%x&TI7o6SZEU8z)30>4_VByi>wFdmPUgtl5Oh^D4# zflMYNwOUQnpZfhiuc;qlqIH5qBB7)dbUGcGOeU-w$T1{R$*N&67^ooV^?G_980jQE z4Dm(ZqYTy{(};p*vnheGj~eT(*K29F+u{O&23dyyBM9u8;w()cAkN3*QOf1A1Wx~m zJ0eCZjtpkxw_GmSE}FJgkX5TyNu^RM2moWCPmp0qGh)X8(Z&D`p_Wdk-5*w+k6?!k z0m)=i#|RK{TsNXX`~6<(^|}}k7qpLX1&AfY9|YY6VgT{V*noYG`9g5e4iTpF`7HI< zSNRCqr=JL^>2#{+hr=OrtEPB>^2_BCc2!p)c{-g0%;$3i2||wRrgawz1zTH)CBz=} zvaZ;80uf1{7^_9rM#A)T*^Kp-My4J)aVyPG#}+SzAi@EK8djkqDwzIUIvs6qwoUK0nz z1|Xky_1&8*yUlRt&K*JRh@*b7sMwL#mVOgMeos8r-EYoYd9Zwrz8-T2g*p*4wi}z(fop z{oaVqI>8dbg7B*{2GAbyp)JpszQhVd91tmc_U!54)~#DaTOBJrdGbWe5kXq#06eeO z!x*&#o^y3O2!|gRi;X!l=C|~)s+}R{Q7~wKweLr zI3ZwM`w<4ndaN>)%HuxJ{q(Toa{ZR;&>tMvPeF z=<#A1N`}*Vx#a9v^X~#H-P6a$1#9^r@gd>Sa(&3>;kv%L3s(E%&z2J=&ABJ0!*AQ` z;5vg(9IY1u%Ryz8GA>whV?4<`Kx!_xYS)97(u?J zE`IwT60Lwj?vc}b_wLo5>cDO@vWR5awT5K13ZVwO$qC*?(sB+ERG)L5@3$0^efsoi zgpk0gE;HA!UnffJ+RHK&a#-EBfNPa9h-7g1@Zr`}7J}H@C&I&Sd&-u|t#3L*YQ5m2m3 zNVhc-SHtxQwrtr#NUFEjh0y$8ym+yL0I>%GN1d-8&~f-J7-?g{{8#+t7Qld7JCqXTG2rFIb0+C+%eX>*hbD5hF&7__m%ZWwT>K(3D?V*SfKKmp=Y`8Qwna z5f{@zA<{2mrbDh+D~JJsRMHF}*F7SlMAS9a#Pt8jmI&@4g(9_m@ zA+mojRvLXII#{1t;ik_SL)tlT;DB}EGDW-)8m?JHkZG0^Ru1#XTGfuR_9e&~Mtrb* ziN#^gbmjmaS<{#5nq9IX@yeGsT0XWVhN?) zyLYRP`x@6O^&{-uzmWgB(+=7q;*iu|miPo2msolTtJJ?~)22Eua25lSF`1tmH*ScD zsB>}r_;D73d~dBXMj4t|P7r%>FV(H>=bwMB&fe@^VmGvfF%vGv=s9Zs!yp`c zMWN@`__WV$FLiV6Q~#q!kGP)^RlRGScG`Q^6g+!`qc*I^!-o&ePrWy@4*p{rF=E7s zPZ@ph(Sk;h^a+)|vdd-0a_v}SX?W8w-bBMGa^3$X8eo9yH@{hd3)b-4&->Hq_IIQ| z>s9Mtw&b<(tBpKxz1{W9&Angf-p+p2y_+vYHz{}hBiP)KW@NmYGLRMMkP~eYR^mG19%k+1f`;Uq6LoRH za`df}Y*xQ3u{1v|u14ByvvRe6Jc$lMf@=~ttrig|Qrr5Sv3f=XXA`X4z=)=l74MSk z2pFP4HZUs`j zzOf9|Be-_$TG~%mt!i-za!oK<4`cD%iczvo3Doy&ip43g#-8`l6>G$Z5hGR)y+R=t z4At);u{Mz-X>dt7tgmt(Rx@!~kv743Xf zVMPQ;(JH<`8d9W6<|VE;Tz>R}Fpx>e?!NC+hWigvte&L9WlazWoE>C9&{9vM-4z@GcQVo)ss3NUQ*|O+YCl zHLmd>kowa{7|)zJ!yQe4bK+u*kBF(H6Sx%pwghg=vW1i@PXuv+3hd(B=_jg`QHP-W zq$6fY(P!D5vZK%HL!hvn$h2e}M1*~{?M4uACcCpV8o5&ZCkdu({NO%W{9}%&?1%&V| z;7i!g!F>Wkz5$0JFz|e~x!t*)?&(%BrJi~tm!+*Y*Ec&od-bz*QcG&Jq}JR`O{r90 ze#vvd{bx-K_lbo9UL)K$el}~e_obi2pKexl{il57M zSlh;Rcs_ZJ@t1!&%`3fYhVwa(w~z7tV#C4LoG%)rAAk5E`wiha=6U1i^B8%|sjo!D zhWPwm(iSa7-Yu^!et)u-In5_*@%sPt)6e*Qv6h8}Xr6E0(snWXgB{0l9xGZP(0L&Q zd*@4Cps5Nj(?GTi7tAB-8W73?Scd2o`wz_OnBWK-5aPI!7bIVWpwgvyw)-V_w)?WM z`TXVUqic%GDQdN24zR@s^f1{jnvjY z9b+Ii2%<3DuzK0AN>*vKB|*#4?_ zRK70~K`3}vwVp-xJ2-lbl4roj`to)$wg+M@3){Q!mv|NySQz8-`nc<9)pxVbn~uk5 z+q~ykPdu*ua2&@u6Y}>j|LDiZ{PPb{k|){^334rICNF1nno$Rj6w55c!R>0b-_M1QK{FYtqewf?t1qR|+(&`#iJ`+`}(xwK4MtDLmHcH0UtE#<7 zer@a@Ln1^tA60`_K;+KBU9*L6)(v#=`{paCuQ-rI87LYNE{L#cn_at2+P>1KcIo6& zvZ(4Pvk%c~NNp6Y>&ShQFQ~HoKAo?hrQ4ExjwP+@6`!Ho6?8p8pWwx@?pNM!%ud)S zmFLeAuj^51Bh(z!#*$yFGINa9yXRQXt2i2DTN(CSB1Z+Y@WI=$czaehZgcKSwQkYG3=2Pv@8Ygq$4$qLL?c+qT2_ zu5UUdAE5y;y`cx)DG55y)_`zGNdAn|dksjl+k*1Pr%ylnWVaW85*iRezDWN2+co^{ zi|2AkyurRWn;v51&SwIK9J#CBg-m3sBOqTQaFZg0^n6Tc+rVwpf^#`s%9rpr(2%ix2^&{m zywG(yJ#`$%ao*C_`C@zzR^2>b)tdsMm5*XWYaPE!hVX#aiMJ{(;Mgr#x)VY)I-_hv zREO%F$J~j^L%mN#G*xLrB;t^~pErGW!&$X0}uF3pH5-bbSnO-}lDWsNzXjaEz;sa@lwd zNW!r55P>AzQ#P~O(jAV2SMZb5_Yq?3Wf8HoC@Qh)q}*;=_;%d@Qo)|1xdE6h0p_bi z0Ul&ILSV9lY||2nTQUhKx<3Ku{2-zW8;;{R&c&d%Oce!@yiAv8=r9kK$ZG*_mS40qQ~O*bEbYs6sf?VvI7@lO<^%Y0I7RRG#(~{4XR^k7_g`EOjEMYs2<2a7vOpM}*Re64fu48FMIKBYQ$iXAVc01GG&!Z9~OndH%kRk*_ zGcsBOq8$lFU9Mt=O4oWKDw6<|INjpxy6zrH6}en3NQn{FU4(Ue*ds>SA1KZRF(lyw zH@5)I8mL_Zw0D4;8;%d2(EEO0=Pn5#w0Q;4zTR)qask9~9LI4SXPg$K?jMR#0!B$I zGErfpW`y2jW&=W1-+uM)`Z2Gk%C%4u>I#eTr(lt!ResH=JXG7N+lCMaF_;Mf01-}r ztxiMaI+gB5_CF`)dD~wmojBM6W6E@VfN^5LE zL)|;d2wgXV)jAT}9VDY2I80UmL_E`}KFU~J>Jq@KbpyAX?QlN_z2{Ea#&F0BLCs>8 zUM>N-d~*x<`V|C@V-IsbdB|}b$8j9zl!A%YlvKB9<>+#qcW$H$Y6}+WYKDD>LY13G z_Kvp!!F!}9GF3EoKB@Lk4kE&QKD&2+AbWY1#gyB6tlJLmx(F!w##A8g>tU9Wos0#G z70~quX$w}^rLpe-np=R_f#W!i<2a6UGOfsc#_M_7+QvU2A6eXQBKc9@5F)JIOFGsV z?T7eE}xaU92S3@mTuI^XgaQYw>J!ekxt z5^1|zp%RXQInDXFI3DQQ#GezlXcTrOa>TJ43AdAh#3T5(!+UYwUB zv=N}AT)h#}+a{n?ha@eF6Qc6zktz)V0}u-!cQ=6B!8o1TbrNQ9zL@L@3y$MBj^j8} zrsC_PRHs%?x5HubCt)FSK&qKS=(u8=E!f}fZ66@xw_vGlShY4#LcJY{>*}8n;6Y%| z=d0C{1(Brr2>QX&u?TS2Y@zK4P`XQMp>oM=!D7@PU~oQP17@QPoR zAttXgX=j9pC^jGh*0dIeFoLQ+8Yf+y+!K1Jb-L0?%m-q$joAd!1dcM36c7yt=uO`b z`Fnwbq}P(j?8`Zb7$pVizZASMSuE zm)3VY@%knr9qw)0c^nXcexKw0SJ_N@ZOPcw_1HEq`tPuZ>VLfOc{1!jOhG~jAy~qT zWt^^_cP`{}4F&A)=YlFT<%3fk!;6InMx#wC9qnZqt?OfWi3q3jp&*DruxSSegn$R3 z1ObP1ib>QVBAiG%Tac9bDCGQnvPDyZ5a2=323Hb_AG{Dk`6y!>b^lRJ*3fIp|DYd% z2pjrcas251VKUceer>Ng{rNcdnL5b&DYX4~oswSSXJ(A>f$GbS^_kS`h2Cag#;+~A z?=~_veLZRo;e{V%|4{u8-+j)b`0+{o+ojXGT=Fe}h2#AG$!^0ce6Fct1`+QOG@{fq zeEQW)H1KUYB1FUPgNeGnDPd(~r(hA{jQ-EvwX8G~L*Z|Rf2rWx2)a>0-G~b}f^Xmp z_y!`bUFpV!x^^M16x5CPTSZ0Gjr8||h**2S%;e__JunQhX*+*g+YdsRlgu+06}9Wxd@OBx15W>l|sqUyp@7fDuqNMfpj`8 zat0%vKR-WXXJ-fbd>+Kf$q9~*j;hw-)6*07_V(a;9%_ZOtynDLH=|uAi(#_y_4S2~ zjSYN$es(+wk-o*_aqRByqEsq@I6FJT!NEZ__Z$5~!9GdLWHQKRv&iLgIu!~9i2Vcy zxBL5hY;SLC-|0lOqtDbGALw6+1h%%e7;8mt^-0>x;o%|f?(X;ukwCcSjA}Qia(;1ffmkfo@Wm&_z1!Pc5p~Ss(+@Ui zdsDf|C&ji*B-yx7(0XwE@EkeTU_5tiKOW%*>ssEZE@ghB{sl`JSdmkK6)8#PT@`Z~ zcR-j^d98N%6``K9NRs%a&uV)eY2e$=s1BEqI`aSj`8tv z%0=I{p9@)J4by?GUDmo%n-i76!9fxbO$26UX3*EyM`BR%Ugkmn`2PNehUHw@`};d4 zCnvQJ_4f9nzrP<-Q&U)8Ue;tiIIyj(tYCO}n0{*Ma|F8y$eQIdBBkxo)~NSLJ`-Ix zyl$v|iNEnUMn*>P@$mr@XoInG->+9>7pPz?dVPOGlYiqXeH5_+oL(&fVmwAke9#0x(Q$EXlAH?eFDwdX( zYO{B<&W*c8varXvx45`SnNF9Nm$bc(AR&gsq@xrW6-QC^pU2Y03Qc83X@W-X9qwzMh>f_BA7#MJsm6h(sjT`Wbd7RSI z(`5m+c_3wHXTwvrHkDH33-Ls#JPP}dSTi!vu$Le#qP($BYD;+<&_`=B71)Av&3+2~uUxs}_nR^efmxPwc>2<%ORl`U zTx}9B{qEhn*Bv=>#EDN29XiC>l0@&|z6&gagM+N$@EMi*{D+k2ZS$1sNe&<^onv&Q zO}B<)+qP|XFfk^!t%+^h*2J1;nw6Qw$$90@3{lA)Nl9x=?yvk z<9gmaj87j2_XX5CTVyGZnXxMCnj2fZfz}%jm4tUuKS0}WJ6$5$Fegz!h|77&COitd3o`&gyY(cNb1bP zX5``#MM5I*40$0*;+m*enn%FnWK8{QAC%qJggI?Cw;Ooc!Dbc6|BlA8PWt^59v+9KB+1dA=ao0GvmiR5^92PO4Il-*Uy+}SZ9TTu0FAo8rIHkXSX;wyB zLjm%6P3|xR>6ZB*+^&P-1m8U}HAnK6mT=H>RR|5XOOVWF0zKox+ydBJ!J!*hQVa{b z5cmlA-C`UACGYogIAMvw@jtAEk`8p7r#r0`;NvJspVpeJVcPo*3Igv@H|{)s=xajH zpx_N;^-g^TuuX0DYtMTf4Cu~N`@kZLUlFdX(}rK|CpNkTB4&4XB`BPC%ZeDq^A@dq z-K2rgzcca#7+44JLJFNae8PXth-;lTU}d83FxX?c1Q7MYZaIeC$mg^=Lp_gLRPQ~; z9s9vC&oI9iG{jRM^irh82}j*6 zoxH`VPl2c*A?R6y96$_-xEgm6!xF{SIBvDLLR0V<-cn);-Z)x}F%hti_@95E53mLr zY~=Y@d1B9m4tf2i$1ga-)e=Htm@(e-6 z$HldGb^`hpCw>rY1jx$D;$q8o_vxvq>;cVqY_n*~i;D-leBYKZv9Q{Kuh!cO3P?-4 zkqLN&bNhUruZ@tXh_Oz|5Hz0XizdzpJ0neF`%B(A0U0v$xKw~{cd7(~c=5P4fTFO~jS-#kf zH%ma%92#iz*P*%CCQPq6XqU*GH$5VxYqST{6e2+%OXyb1nZ-p&`Rl?P;eY;!GK-s= zNCHFD9zKKQAp$trL3>Zg#M`*&AQS*h3=9^iXK-|%!@HK;cJiV1?QaO$deZePY)E@~ zLjIeaoSX#_5uYJu1tAe}Tvxz%)vSD+P=aC7^;_g13&RXJ_--t2kO(TA#jTg8i9(u#Ej+ zQ|+}g_^D4%PvGDz{iVOv`XqBS4~pvQW`S;xtXvA6k}x`Gm#k&I%)LnZH2yHNKjFQZ znV8&q4h~qU0MN+f88X|U7TfNB@`ERxB_*MKm-(X*U z)9rzLPJO3}M7;>bv-(S=9HRJ*@vGPvemvAasWFu-s4$;tupl;VszQwk!lD45R7!V6 z*lw)}k!~_ovGt?|iGA%w_fS>=`N?fF-O+rLms!Zq|FY{S_b&SgaP;Pz3$&~WP%uSL zz)FQET!qcw%mDkjUv7JP#4y(^1~{2qmY|q!9r@+BP9va3N2_@sPLv$~CU7^wep!IT zHJz>3>uBn8zEWqV>&H{bVM-HJJ*_`_$A8sn5+B{xT)auwL*O>%yCBVclHgX}kiIEF z@*Ik-Kf~p#eRvs+EZB<9|2`+ntk%)7LObNOuuOB7CPmHPpVsxf8!g*|**r~{oh^ReZ|54^o+8ZNGto6N8)fVSWZTm@(*?O*vYEFL{(Jos~q(QbB z91uDPyrapBh(t^iq3*Z*-fVM;;0-QujZKtL<66oX;NLggw z{2{T@{}iyQ zAd?8k2N3eTf6nNUL=gl^IbkstN54ucpiqvGvqL~DHM}g?lf?x14|o1aWgN*Nu2D1ap9Cc_6=BF#%qL3nc| zNL?I})M*IA-n{hbxidZ<1(R~0C?3Y#oU)DM(C|W0eAy(}f6V$PI?5v^-X2rr%YLC_ zx-rLr*kV=H=h42p4Ipwe>>oUmD)1e0KPrSw`yQXAeZS3m%docT^qWWYH9x}~iQ0f{ z*I1@`B=lrMS}Q&)QQsV9)^oEez&I-|m;vlu#vGv

>#iNAZ1Z+*Xy7b<)y!j5|F|6Hp`J=z_Zcm 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 literal 0 HcmV?d00001 diff --git a/Doc/using/mac_installer_04_installation_type.png b/Doc/using/mac_installer_04_installation_type.png new file mode 100644 index 0000000000000000000000000000000000000000..9498fd06240a4ed3821a31ca4f194a0fdcd647f2 GIT binary patch literal 125352 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�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 literal 0 HcmV?d00001 diff --git a/Doc/using/mac_installer_07_applications.png b/Doc/using/mac_installer_07_applications.png new file mode 100644 index 0000000000000000000000000000000000000000..940219cad6f61c02b5ee19617a24acd092d38fe4 GIT binary patch literal 148826 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%0A{@Gt5p7h`7lxqz- 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 z zsaSDSDF2v%{wIvEp5(p(v8R2ZLmk#i5@EN7%tSi%DI-zFcb+|6UP9h|+DwEV>(`a( z0o~1h1~V{&)*TiDu^|qbe$VR<6IR1j_3F}V3suweoJHr4-kOY`f`r(@J;F9x)<#zr z*G6}TpOG>I5(>csWJ+$%@gCMFoILQX>Iz)DN8*d>h>`p93B(Z1E=%TxFI=#Aqo{UT z{2H^$|8Yc`v{2@nE9InjKhWB$`tdC7T2vrgTeCx3@!)eEHR(aZaTEj6?Z zvYbM}Pb;T;rBJmm;juwRr020kB(wB^{GR3=WB2R`)8oo>gPW?nuv_c|FZpn4ayCy~ z>`R%5vkc89KHVhGwKk+nx>wS2(?M{{e)w#-SPI`d)Rx{wKv*644V*qwg`W?)0dr&_ zg!B{i{_nDRVU`0eDDORbtX}7k!&1NGeHHwch{vo58?bA5v&wZoI)0?`4 zB;1QKT^6;o9dF!HwY)@r&VQ2wjibIiR5&Ku71_h-qk=?CK{LESR`((I;Usi8cpkuX zgj(C$9)1=rEjFvpR|J(5vBP_@g@X#7$+Y*3drX!~njzyUiq0niHI3o(36zz@uKwTx z<=Uf1DPn+Ro5)g_iG*lXgWK-(<1iyWK@$l=DFVu>XXSoQa-q-q*sGX=s9ddIglwif z^w>h<6rxjj4Zm%nDeV|s{(JVqfLz-3{6gpp7Ne@C$>6H>eYj0)xF)ccuO>N6;{5!# z-Y>t~H7>HbCOK9!RgbIg1LNl3d*XNf;JAiVL*OhUEb?NmnY_!rR@D4|TcZNKKP-%u zP2vhb`Reb4zQ22DD2YcqmK|GS)gkA&e11^t76Jh^$*IE~ zaT91HEjKA1RhcH4k zn;)xKOQ9|-{^$Hbcw_|!vB!3xB_cps3FuEn^$vWA07Il~hl!0^R2Y*S6WK^5+Nyqk z$A4`xg##tqK*`1A2-s`F5Q!1jR~x_xbwX1qJAWDMWAUXl8h8Z!XEeHw ziGEL&>OKw&uz!xv?f`WZrn4f26ZZpYiu>G)q2FHx{4eKvUxSEiD{3pTw*^t6VZ!`7 zm5Wb5DXBziPz;z;)ba-(GfGRw#zgf|U73ng;ShAa)+5)PuOS@WJ1-Om!>wgq`% z7`{oP;Iyam(P11fji^aPnTv?|q{J`otM;2g5u<2s*4qzq-ivy0&zpn54p_E;!+HGN z-*!9q!phI@Z!BvQbaey6{l{8m{=FQ`b^|+Y@7c$VLau~lNn*+h2+ZO|ak0&W(%n@E6*WiwS+XWLruh}(=U;`2)CEsZ8O^4Vgp ztihsj*4K_leTABs2M*@ zd~aBQGWm2-Uj_f+c$#6_eC9eQX?wE(1>3{yem>viW{)Vk^7Azgm~WjK^8P#fTkW^z zy2s-ieX_Q%ZRP{h#U60doHAkcgU$9}JS3 z+v|4^^|LlW9bkYoM@@CBLatY}h@#zd#Bonh6gH2g{SY!j^5{TAjcFCgS_S$gPoGhh zDl?Ort{`3>CqC2ulMz)?3Fd__K4>_XD(P<)$Dm40$M?H|xPd5jha=#2gbRJ5>k``O zGRkIZKR$$opK}dSRhHt$X&GtavrY`|7QvUY6@a026c&5O%|ykeR*ZQT6^{;l0wHBe zp(4eMug%eAW6*dd!8IrGG<;%(#P8W+pGpi0ue$kHd4&@drc(N-MTl$^D_^faW)rKs z2?9T4bT)E4J&)64L=kl0M4f0)Vi#PY5{-Y9clYM^NzIDNy*`$b{Fk~}IhXmVe|XmP zdC}SI_7DIfLPgv?yi8WE!o0oR-!?cnS?^->4ll{vem`V562y8R;v95(90Sb$jz9~T-F@mjZm3W!wL z5$2bZJ6k;)SMl>X1(^+cKKm{qCyyR_E;}0>L>6R(w5@)L%LiGD;lTumjKpB<;`i`H z*W)xy$n5hpva)QFlaHfkOIrqZZkUR3$+O5CkNN5|iK$u()hG4(f}l0<59g$QNFJU5lfVr{yO_ub%O-6lM z7&|Pb=aCfpTV=FRbE6DZyjH8Jbp2T+O)M}Joqd;4E^=qR(CCd^@);W0uLyg$_-yIh znc4H|Asg#Fn^23O6JX_jdw~qP($<2?8gSg)o3yqTK6r|M^MBL#y_s=uamp;S*`vVz zow&Qbx*7{o#B5%B;ZNYcp#K+HW8=zp(x(1o9)p8UB8N^a)mKN+ucWM}E8(~`)v0|x zri14l3J^_+$Bf339S@&PzgL|#RmiHI;!dCY+?#v!IVK<&ERzKWQpn|&D{$Z@U2$@C zBm&p4nf>#mq2eCq~#);Js z;!~yZWFFK>y=PwFHxKDRSocCjlZQ=lI4~!<7_+M=0F*n3MO4 z7DuW=oKK|L{syqWIRI6hhV^>;3M`B6${Qg56rLrv4<6+fHC!OqUL$`Q8_aDlgSXG9 z;>kaW4n#$iGJTQ&MV%qeBfO+BjhljY~=gp z`5P1LiHvKG=Xr{ilrtnUCqRcBHvt*FJ-x~&G`kP&h5a@X4Jz|{Dm8p)O7Z^O-?tP} z8$rEa{mIzg*8bT3dGsz;d_f%9*kYi6CFAi0?nPuB6ER&R&M0pPj7z_dW!685P)8^y>D?4~Nyh17*-ir3)o^2@=(CWm z`^Wab4mi)$8zju3<^J>UJREBE%Ws5c^hCd_+tkt?2qH%?n^Km)kj4AayO^0$wY3)| z+Uv`B+ovqp%3KHIJLxjtktCrd#*oLy>h;-DZND3o?5aa=r%rGaiXiKWPKpQ;K7+R) z`-Coyb#RhzTm0Dcc$|@1RnbgvSm&;>al3c|%*T-;*`y%2!(6@S6nSa5=k9U;1|Q;k z`);!hhe64o-8`ph?KR_8-)A=(2Ds*MCT7$XPXBES1;$fy7IOK=QuJ#<`70PA=@-f$ zy4Xddg_(?_ta{jpn9*8GphnJM}l5IqR zYn2t2IqE7?3K<9U>}aO5R%H3~y!f?X2YQgSYi`DckYo_V$Yk{;REU%$aOA}D;?u-O z`JhAKG%YH<98H5>Vh+psGh+1Z{w)ao|X(Q{h%D;YLO zN8K=K$STxB;Nr^h96mZBEb|=!5}0Zb+B@-`_C_G=e=jNswXboePY;WqTfH^@J0awc zDB9o8%4C?7Ys%-i7&u092azs0^;MjJ5Z>NN*{f=7BYr1;U9W_s7zT7bZW%Wn-kXJ* zM@v7i@o4Z@?KxWV7B1)r6rb5|d;GmOn~}wOZpB>@&C;LHdSlnivLQ-g9dHmW*R9d} z!GfNYlodkC+VZZET#a=75mN=BH-e61FT!c#0)|C<5#kDUs1V40X}burfA%|Ik3!6O zmIsFm+3}Tt+vd`fxdns_*?(%(^3zhhCgGuV2mMeKHclPU5k(vQ&h*S!dMgk`f79vg zpS6ahFSU}NuB6{VL?UtDCoSA~C1jsF-ELUU01pmqp$@ZvExG)cUT59IjjvR>@>?TRYBzsWR0GtJa@mg-H#hy_vP3V_Xt(XdBdM2Jb^p5qchfFH*vmY%-i?tIuqU z?2+B`ZR^kn#;XQ4*Pl)&=Y)oq4@A(Ue|VSs@KJ%*HD00i41WVM#55VMN$759-n; zM=mF7Cm>exG?`~UQ0_~2INQKNqo)k5_>4OvF56DdQw|pf4;Pzx6R5m*H&3fb}dsa~nbyS8&D5$obUz^jsTWf|2p3W;8oHTP|)p z?hM|LzKx#Czh#VbQ)iqlLq#Gs%WtW9rH5O40BrZU_}VoWS(@Zu83V(0Rp_f^U`*2= zp-D1U;krxH1{py_w!dC5&}^)L(KwZt9XN@(ggqP?^N*Uw-^XCwCaUq61!aj zk&V)_$eSTnVXZuW#NoG+^pYm31=GlD9fX3C(mJB#Mfs>77DMj&ToF@vIyCsxB2>cK ze+@2Eu6v{}`0gf2kAGNb`j6CMx2D$Wg6Io`)BEhwAaYi1&1ZjK%Z{#;t^dF3jWCBA zt>}65#&T^N$=zNckw=YhbFz5kQY)UQxZ+2ZT=g7SY_LMY00lpWzw+P_kcCCCYO;ck z>mNpE{%OI~ew4*@rdOl8i_Lp+t(?Az2ew#5h0PRQu}I=Q0R;x1J8=~Yw|z}Qi0RF=zrWLwQy zsdP?}_sJtx7v0g6VPS9u`B{tR2=9F6%{U*!=e@ja^c$G!mRo=-0tS}AM(ixVXMhBi zxyUN{9$C>8F*Jx%x5bIw0`TB9ncVB6j&Fm7AW7pU z>GSB6^W-wUn{RV-G{C9WWp~grX3g0GY>NSupJjCm#iXOZ$;kvDAfhnQmBbX@!V)>L zMAEPnUeA>T-f;x8p~~*jq$7ZCRg=H?F!F{_L+6!QH!G}BDM77piyX+`QB#yaKQ3x9 z*Ws`j=$ANAl)z8{zm=B1h#MRe<9kP~_P)1NCpZgJOIE}XvHhLL!n4~P`!(Isje{iJ zdM~bZTJboim-oFdZlc|nf0yiGCFu|9e>46)FYpbib$b_4nRs#m?mzz_Ve+4O<$z}a zJJsd+0ZyNWnetbc5#6GHj50n>*&8x4^w!G5Rg6}jO=57^1VNTSC*B#3v`59o_wYdx z&oW25xthnKsfmQ{XfrDOO^r?xpSsWhh+$nA0<><;jbKA(d{umBa{U*y_M@6r9WDEH ziQH9&jqEYz5k8tFoQh8Nx=gg5N)m?A{a*XBVMB@p>?+smHXyIohdg#Mx5Pj^+J~mEju&o_`syw^LU~ zoX_dQ5gxOvX}6Z#cYnGlM%?C$C$ekUVm$lWE&U=-4_n3%O%2U%=iux%QvvjXrGy!e zhzrnJ>shs;U`(5418xg4E%)o6V;tr&)Us=mt{*n({nGN~J5@5_I5?79EnSz!^DWJ$ z8jyI!02yXE`&^qM?&u8KNF`SS5y1*#oF_Yl7_7V4!brCvG2P1a8~h~(Iu&pVU=D^u zt;KQ1uJ@<2Mn_C5ztiG!--u&Dpig)1$^y%@*X6%q`4-D6|USFjirnhP3A z0wSY3-db+JcXN6VD&Mv}6254Q{8J5v%EPWhY5O^Wzj%essT%9zvmOtoLybqD@g}uC zk>vL*kM-wb68nzTOBz=@a{1tV$cgh4^*p@dC{K%7Y5tg+pPk3S_U{dMKr~wbGwVum_Q0^SqHV z&m}wLCAtq)pmndRi(vt;Z1#~BaK;tm{7((~ZMXv7XM+CeQ|`O-D>$G3A|j-pcNtW@ zyXnLtsZ*W{i~3J@U#G=VvwQj*epJ0;wasqpkQVX?ldSj6l2)zZcoEtpD4IZ>`csmb zLuG9s&5_(PDOejv*7eenAXkBQeKcvU1MDRkOmiu(l_f^G_omX^Bna}2dAy_e6To1U zaP(OXo}+Xh>fsvn#X4DT1Ph#X}N{ZsS@$GOrMsbq!;DtB;Z(&n=wVu-nnS0xe(LWC-h~F(B9|>!JkKxzQU` z^x2w%}c<>&W>P4f{CT@tQGk5J5 zrW-j67RFw1ul`DZf2D6SVR;@hKFD41{c=SO)V=*@{!K57BezcEYIK(ILXaO7vH5){>p6<>p z#6MQmWX=spp%f2+(vNzoL_d!Z$>jWLEi4*iT?3zs(A@sAA;GlE4!u#p|7~(g=O24b z1o+oZ82#1O=`EpGTz%idZbaL_*V3NrdX_QQadTf2N~q%gX${@e=3e^q76Nd{z#RDW z)}~{7R3DyAWt`d}TeBJ^@eG<-6GSo~T7ndjfrZx*)gB5L^@^eM7+5xA>fZU4;Sdap zzEx(PB1E_=$;nf+X|Q!pRAa#LT69k9E9FJReq-`6VzIx5R)ckOzQ9s<7p$%cNp=?} z%v9esr0)AH>d9EnePHzV71ya3ZeP+96}#rqPxMBJ+bz92fL%`0A%E8W!VF9@wj#Hu zH!HQ4wv9EGTYQm{EjDowrgUF*zZgcL!>Vs=v+@ZaU~f7e1Bs6-%eLtjaa4_ZvvpK+#`I} zzp3S`p{%beA)pv((=!hsQsQW+RA#+PPn(++k2ToW5i}oRy&ZTo3BJI4;Hx!8X}84` zq3t#N7`wgL!}jew>5mT=_fL&9?WR0`wRC5c+ss7LP!*Hqs~n05jU-1677@}H(Sn;4 zhE1_FG2`KEe7<>Fx@cJ=i0hH3&`K|yHnyTf+Yi1M*y!?S-tMl7(&LA)RKq|t#=(<8 z((OA0YEbTS7~p@@vaHAN<1I%Ir8ul_ZBuc+%fF3;54}v^T=;1D+M$8A_Rl-LO*L=N zCA+(amn%r$8PWyhhUh}8t@pQ%O)=xZfeEn4Tjx9xZmh_Sh%Fwa^K{OUJGba(JQ|T` zOz>JqqvdenM=JXzGInnWcq)fZofGcv63B4MIIoe2A{lZz9g(wzy2~OEOl7Qdw9ZE z=FRN9NYpO!G_O`M_eWJS?4iG8M}01-$?WwSisLapjTYau&pV7*2k{A%)v!^*2MyZh z08+hVCm$QF06kmfMYhsy)%Tdia(~1sI(2!ip*M2+j}^B=cA^wp#oj9fwUBNHDjB(I z&KD%nO;IeY&zvT=81ic7Xh8YD@EtYaO9C<80D3-@2`!sGp$%((L4du@gF?$~%>WB+;6HmHsKIDMXkunJe-CJ^-Cc;n30ZTB$ zt2Cs>fon=lg^}Fcdvu2}u3^333Tl17nxik)c81m}BM$dL(Azx%Z?>e@4lSvH+a!B0S;MFvU?`AiW;H@8|ZWziyU%&3)jw!;1!a%5aIT zp;vNOR+IaFAEV|t?*0SEja+^ObmqKm^9?qcmO||kWl}qBPjS~;AwNAG$5yfxrHVD{ z4cjU(T=1sb?R7{*inf$fB88F9xB`%kvvKjBX7i1@9`DQvkv^;SwL zv9hLlcyZiuNrJZQJvVvOP+l?5tNT%&JqDVGIIsV-F!^tfuK^9a%|oQdXphp&KO>1( z2Btox!T$KZmt|D9_nxv}tJxlI)tqIOBX`rX&tKiTr2Addl&z)OmL2Eb*%&b0`jO|KZt908`4*$daKH23OAno*t1Zc&PA8f>_ zM?PadbDw+eSKxlwi(|$Y--y!p=^;xGf-(~EifB1@^|$O1W+5)ZZF|@xwts#u_M6z+ zxEt8h{AY2#;Uc@(Sh7?n3)dFD-?w<{w)@}hj4^^4D_VPZiw|gg>1s<@-y+bx2LO8% zcCB}9%+3|Pa;t&f1fg}LSnm1fsg3of7sW?-*5lK8${pHle{{?UG5rXNDo3GrUq~?H}~j`e?SBbB#HM9 z`NSL~|1z*M;qo&Dt{V8~D^s8_aypPXG1x zgT2<~g@@dK$g{S-Y;fA2;XjrhGQOwX;JAHpyPi~nFx5=!6bf+v5(Zb!hbUG!3sqs#ol+1#nM!sC#w7nx2eTZVpI4S zu(gx(mR-G@lHtdFhs4U18A5Wqbyw@IIOl*NFUBO9YthQBe_~&Z5Kw3((skzU9q??* zxOHKZ3HwdRM0mLw)iC8czs+%2SFGh@^P5S~AzNT5n=tLbSjNA3-xs@v+^(iJXmCot zDfv4!U27Gw{9)0;`Nb7=d4_+m3 zkg*VS-aE+^mb{WRIXan8pE)q?hUWw&C}oBHa)LPtD#tjAZ{&w<^~|kDBc(nONOL2c zUygOxz81-9;vUweFGt1ZWmg($F`en#xn9#{^eGNY@>rA+22`{4G0{KT8a0?9cvU5b ztF{MXMCHiMJlYPPexhy|Wo_1*PciDHQ|NTLdt=MjJe|G#b9}FY3HZu&?#_VMmak=| z8Q=xJWxsPrrLCQWsMe}L0n+%r`e&SrngWo`eHHmiIE7l93&2tf9_5K+6~rV!Ck&5L z)>fkSe{I)e--2UXs)15vGq9_$XA*Ep>s>pCAe`{{vXdofUzeBsh_%L(Biib z{^d;5HV$4xLQ?e@Fv_BNwMK^8TueH*#SAw}axgL=lH{uemLceE(YbSzIl8<*nD_b^ z;7+Z3j5WFs--5|>O1@4i>8KG!%aI+USu-V?C>_Ij->-+>3s*F1Dzp;uJ7R_86#WB6 z3ka(8fa2w0B;Vaaiv1Yta?Ig5wf`xvL-o$#lCAWt@(!sF1U zw&K?2VDW<6t2z6$!DRmo-Mt*Y0m&a-GnSWjA8@jC^Fh2VYBl#b`wHDI7&ezpy`7qhr(TdthMVGeFT%gOv@C1^8YWAfV$-32B5F z{l<#Dd}&zBPejcq$J6t>gd^XWV_smU5voo1QCJTY2LyaEbTu3vkACivSQceUKG4fe zfu$-*2Her!6%V*{cGCRuBD*M3$&E1nnffySsbtntjIqcOFe4@Dy^9eZ>=gd^&=!>U zl@cdvlI(?%vlme&&%2%T3?OUS36u!uaGfuZWzG(E1*p%W#IS7~c1QMu=Obc6Qa5S- zB_h7-^9yrD%Ljq@9@N=qRx*|g6`Z#`5Rbi%)3dV+p)zWJ{6j$iKO^g}A}$)ylm33b zUiax2qWNs6RLe1VoKSL(bizMW`xLYmkq}d>F4M^c!NCs%3nG=tw^o_E9IWUA*qewI=hlx&>qy>*ZF)mOMgeyJFA@LDNpbzN|zTc6FeR%%J{DRg)l9@h& z#EhZ(v95$?GQ^whM*vMrTVnJQc`9fYL17?mH@B>|WckMgd`ia&P>9kBIqw==`01T-CMM09XBl1V^ zWk}nv->#VH*SLmZ$DF*uHwKy_n+2K>+a5o}HrH)_aH`Il1s)^r;W#;fa*zTQF>iWC%n}+DzPZy5FtZ z2P!XsovR+Y;6i}V0eo_ivoc2$Hat=hpkznn4)rqZUbKK3tB74>2bejwGfkV(8OB*V z9uy_^Y#ScU9Et`@4djGL+x;LYyBzdCb2e z%8ILlH2XjwDJ;u{>?(OExTl4~BTz##r}2rcv9-tfztZxsS1QcT)1j7DMrebYYZfwFCKxxxqNj%ewEi*Bq;NE6hM zt4k&K(mTb6QnMiC5Olyv%d->JbT$;j4vI5P><_>xtd@Po_l-`Ts|ovSC!PTi!IN(E z=GUz*>TzsjuxG_b=RpJ;+fEAk>KFX66ds_33Hs{PRNukBogb81Y9}~!QO(_=Xa~+6 zH^?WD)p*#_(9OYr)wo^9OzFZ7^_9N+wrA<>7wH4J+KkE?7iq4N%taBDXj+ntmqElb z&;&CGnvmM@(h={1l%Nvc%hKbt9{nPkiS)4uNYpcqO$q1neN2!MJ`8xwhVgVk`NTkW z55?_I(Xu7!tA`&AtPa894HJ;4=$cgS{A&V2KuB{#HhY z8$N-OWZL1#XXS)|K~U5mEf($w_H<2y{IYd+i$S*lo#-UK7grmSQ(sY%(n8|cSuT;Z zL=Ho>9WubiCPgZGv0h575X!;#{#AZt?ISWn0p>AcBjzQp1Qp&@Q>pR%3KYfh=}!0w z%LQPR)2PONB(vBs!;ivX!rRH!d-?&R;i)T20z??~r|AjJLkp;Nym|JCcDw4$e-pbm zZY_*$RJNZh-L)4UlvJD@oPG(tNEw*-_;Ar6Tf#$P-zGMG7$Vj0fcTXE%Yc8mqWzY5 zJNSd%RV_04WPVkU`OvG~&JCGlZQgQT+vl5 z-8+PVVLLW%nf8nm<<0F=d{S+vgAIAm^S`!YV(-S09h5>>NskQ4uKPWR<|n76cISUB zVQ7m<>g4vbGxDE{j(mNVz!nol=1FEvW>Uqa=opwu_Fvb~AjIGfbdH1E2;59#Hh)Xl zIXpV#=6HL3VIxlC9+v6&T#;-y<>rT^C{I7U>E!j!SIUY#Tzni5aU1j6Ij}hk>hV^MPzJr=-v(6 zh>;h@Ym^|A^6m10s52EKJ>DsbQw76#?rj3V6f;op6LI?SYP#XJTdY}ZKg}wuTJ(T& zIJ<%Q^`1yD_@J{eiR{qJJQc+a8C%>=kAFpb4ZBNLs#Kpfxas~3XY!5o1!`-M3D-I; zEn+%uQKJPfvjQYLW*^vL81L;VT!P;yS=^b&sNIN%L97V2W@UsOZ5}SDbkv z9vu#`m+P-@FD5PxZg@RnAdGg6SWs$Ch*d(Yf@<^H*}=a1)fpP4_lGq5`4r;sUKP)c zK|;dU+l`@=nIN*MOu9FIeQr<_VURo0b$i_0ERqR_2Z;;w?xZFZBrx)l3P}>#i_4K) zi;7ZUMuV!JtFlnBZ&KG!G&TwSJebULiC7l{ITA6N1-JQKSpjxm~lP&Pm| z0{`0<4!a!t_P?yHhF^Bd22`m(J+2B`T{cPmVdj?3mk3|n1B^cp zyFKH##4*_{vls~f{pYd-!ywGz-RFh6rWJTkKG5lu9i6XK5~G<@#9o*0zO9= zR6O?;Q9DM&XBI$w5?62_hJw1HKPBoA0l5))rHd}8_&uIssi-*sQ%zOAs3)L*4j z`=RCu&LY6A+vY7}_Q*RYQj+W%8-%0FRmE2E0kKPGP!uvVNH0*sHpgV8W@K<(r9K#^ z=F8RZ^V>E~mk%19|3BqrLLQ`K;0M-8l;yTDbb|1Y#Y%6ffDf+Wqet9EM?aqWX^w>? zM5E}vfHK*?QJ#e^?R9gYM_j+vl|R4fmfZvd0&93Zszx|LRuod$okzV)UMN)>PG-YZ z4yqXJmofjId}rl@yre< zjARo^KaaFGpz}YF0^_ljy#k2@&(dM-5^!>I!4kzMHLJN(ltIu|F)ElI`VP~!F=*_^ zZ}z6$j#yMz?&pGG`FF>GA6dj>?sPjc>Jl-Nso3Wg-T_CeboeF|cKNIG-EV8%xaRuM zv?d-H+YEh1mY8y9lo3kRDiKa15tkx>WTR&+EBUVKd88bMS>?0&r)N$04#7x@{v5*B zrcet_;N$jxq0aqfNAF*H+oU?|jqkb+)C;KIl^7LajUxW&w)x3;VFlv+n<)JTkahov z|4t>&MlwZM{LZlp{_a1x(Mp`g8}jY-74q!C5;>cmeu;llz8Xj>bDEt4(8(hhn9wge zA(WCS?*4A3WhY8u>0tEqb$0T3+Mc%;aq{sRzd-dW0owEILT}v7DlRchx>4L~ElPME zI3e`Cn>7+%KebzHfvlUyIeXAvb;4%DDrG`ILBbC-`r_7x1!Zy00)xY~!lOX5Lem@ z(~KCPUe4TO6cl8_e2;3hipQ}mI@Z)|mf(6zql#N{D*)1hYrT#)`y!{~-MO{uDHbgP zoRI+0a^!7-`Nq8b{MKw!s@PM+2FrliYyNTn^h3VS@TTe2037BDH`><8Gl{ZP4=9wsk2}ZrQ(}N*3Bds9KI=8xBC846Ns6(FAKci&~DvgCo zotw<>8fW3tI$5(bfY+W{MIQkrzUy)D@$|B2sY`3|v$y`>gzj%IY~!Pxe+5CWd{)13?1fOMDM51_=Ic1;Ag;PP zKP_{uw#N&LVLLrpKiy5Amtjq7YdCjM`zm$ez~=t%6U~FcgLP_hnv5LbD+IT$`t)ALwGXQN?@~`f8E7o9CG*1DhR-_8s14CUDr`- z57GSA&95tp5;^>!{KK>0=!entUQ0IY=$y#4&syQF8teoguI`gE#k&54;YPxiv0?T{ zDqE5V+G?i(>y0EMO{5uJb4E~yMdzZChRa_^Q&hg;WN_$G!7O9bnCcQ<7sz$*+htt0 zXeeoifywn5Xst(u9@62afb35_765}5t~#N9v7eIvu_|Z39Q-EKq%O?YqI~Yo9PTXt z^~p`_W>@1F1z~#m{KjtgMsEK*0Gdf%Yt1(XlWeGBrl{KL{BBNX7Q%q)wz~0`^rQYj zSK}l4rh}&4_@xP;>b{O8*$npXf3^;G9q9UPk&g~L^;n3OJ|o%C;84Tks7?Zb)wq^% zhU}DHI2WCb)OPWwqfLvIu!1Y^a5EST1wOYA6Fz1kLXPqr zv6mfjxOsuxfG{WEh`i?rkKOB+3HL8$pnLG47^frFCFS1`Zu?H-! z>RRMYwMzdB!q!=kNPsP!>|o<&R{G$zqpx`qTl>8l9^zYqntUKGUQja{_g_TDt9clj z>Ah4rR&35Ep4^ZIAD;me0UWWEMqV}$-L)Hb*beHVNbb*5J>9t?#eETmBl3F)cI|3&?WvP^ZB2Cc* zafYZwi>ooql!YPnY6B{ns1qYZ`}QAlUqhC_-^DC z&LH>f>(kmE)D$%@!@MkGex>aMDr~x^kFPA#(QehZ0@`dw`sI&Pn@oaxibnV{t@rb%> zg)(qgw&B=G>hS;Pwx1gYQ$c<@Ab)f6> z$9l+pH9gmj;Vo(~28d4_ujp8Br686F{%x1s{-;nlyhbI|Ar-j9?$5mC0xL}^jqm6_ zPW0`R`Ar)i3im3EFV&+a^&O1JMgU%#(byTj+o<8n_^0i~5W%D;C)K3p!LH#ys zb1}lL+ppb$O3t}%sB{K{3cD3P^Yz40Ypg172T|6{a$ljN&z8gCJvvkYZwm-PLzqPdE z(O_Wz`x?KVuVz=D-1Vse@@YNAm3EGVm!he2wsMQRiTG?<(5pU*tM050W1tqs#{0=a z&1`h9!8vdHHP+mvrI19_6;n=kj&nlMQRNns1g+4=V*y>RY?3{x)b>0fpgGP)sm;E!Q(-}9-x z_jT=kZD#oJ_TfanvK@VY(}Rgmq?00NrN+l})UhS=~uke5!bV{5E+YS(RVs84-lmCyYRf;#A%_r^k0ZL(MKgLI-|>pAuZ31~)58-T>5gqFSI$3=>aun4nbF zp8`W2`l`Ug+%GO{2rLg1RE$L?T#=r`PsZVBC545^Pk5*8jd>nXdW9^{>u1oBBe638 z^rdmj6Mu3e?N`qT`Avv5#mj6}@8v*~vd@?27Q}h6n|GD}z3)to%5hG6zymvrlk=DN z?4IC5lQ0ngk;U3qc_%4C9^-w^hpVwt;FFOYwb3s(&;_4R(PRR5mA-mvN6o+QVzo1PM87-k3f= zXi`*ABN7?>Y-+GcGo+6Fk3$FX39tbQjKl3A=#DyE z@*PQcFrW(X8O&x#^o;7x!q>vo*N#b9m)}yazbE$e=^1 zD(?5Gjl@K?p_SZ^vQP|+KS9ZiPTR?!_4Yh34m(F*Gx6y1xbkQR-AZc)TDdmzb(!9= za<(#&m@S{u=jMe`v0uz-znP_!z!-BY`wcrW{(KiA5$J7-B1#L=W%b*QaOz-Z^k5ac z5@~txhw2;Q6q85#GB-_pIwvuQrRNlVmb|PC!S)7Ya%WSMiG(4k-w~CZ;0>V@_J^H$ zk9Zp@qAHr(_6R#zX3d}DUgj*#AHY4lHR&9-R%K5jbsFx(7XfmBGs?&=r$+B}0h6!R zfQFDa#od~(K{sv2R{>1Pjz9R1d#!z$8(r!eGl+dwl|zZY-sUqbdOa6^Pjn9vr#yOc zXh2TTAeJyyhHp4!J@fc=_ z$x~>p$#pJ$H(q!gs>D6N^jOp2Gu5k)bYrpq7&QSZKp#3Jh)d&7n2FVCwX-|r-T1;^ zmE78@2zK7(bfkSmoOIOT{Fx6&3)GE%j9^lA1U&CTKoQr0h23_ z;nUMVq4?u~5`i(&-P_P%jh}b`u=&fB*t5t#gGX#rx4o1EN=SGC6VgziMf0JAnMe_% z%=w%@H9$D^NzhgB{F7?yC4x0zQo?;t&|ObdKa1e-rQkg8sk>n7EBB9EOAbCe>t~g@ zYJ*nlJVVcNX;&4BXiuE~bFR4fw+T*ITu3gt0)4YX(Oe&gJEm{mXwac%82 zdb%&jzAGoLWigasJ~!WB zrpgI2hy3XJp%eJ=J(z9j`>Lr1$6n6-kDTW?rc;Gx8FLV`Tt~`eFtNTLL8l}LI!z$e znrxwHSUp4>i+1 zWTseQi=5X9%IH-!RL>Huv(7f`Gyk^I9?FRe{pXGZOTf1hJ?pl7uyP#Q=9k9!ckrUe z4ThX&<6J8&&kBzx6B1c3;Egbc7MpDDNxhy0z_zkJZ=RD}i)z6)wD&Ga+q*f(H^%k= zn|wSS*?wiMk@ieUojXAoES8`sJMA5kA!JaM-JRJ?f+Ro?C1iofNK4X}m0}s?qZ@bC z-2=e?vge>Syn5=ggqUT=NS8l%)MZn9Et7}d`K3UsgI>)7N&Kwf*{J2=V`O@vHr(<+ z>4#ICw}r7cxA4Z1)MNduhWGbJv|&%x0NIRWM}?2)jcEijH#mlu2M_sIo1Ve;dm}-O zcolZ+lfWlgf|qNlfrg0h&jAu&>t(U17MZcc2pK=pwfnKLBMJ4&Jq}#9T8%D!v4%BJ zHmVQp#)cTWTI0#&G-)2QG|`NmrI`C96utsxKWi z$z{6y9k$Rom@haSQn0TsJzdZ$rS3z}84+w1SQ2tU<=FVPw*~w{R*Q!&ZsbW6ZnK21 zSnAh5{^DNmrO>zjwGH8+?HP<(Adcpqq{_f?4lQ{*-&d0QclMnMuidiJYfR2<-0+&- zyN$Z8Bi@ne=PVR|HMLgDKx=cZv+)^AQjw$H2$k zYDu2s^wvbyuT-#gTh>H0fSOpixi!JfmAfwCH|a#Ym$dc7eutG2MRYOjd@OL~;!Z=O zc1{{v<0s^(Q8z;I;8)diCm=(0rJ#J^S;F$!$<8PR$ia(iYKgOC$uyN1{Ig1b`Sud$ z{rJ@e+7Bh^QAkD4^KroBYkvD7B+Cs+{v%QSvEwQA{S6Y%Xi;|>w&G!lQl{E?&(N&6 zP*M^1qHmGTrQ^fV8%Le_O7YY`ZUy`!UBq2!es?;4bCV-BmsY5={Gl&)IZT?aInGr* z#2Bwv156iMdp$~nN90@dHAVQ(+fcT6_M?@1H?s5jwVQ^TJH5ZZ45fD?_JzpDpytbHS$%;Ew)YUCF%{n!AsGDrfdO18RjAz>z<8ltRC!W&#Ni4B+Q zKxpma%?ow#FpHA_^U9}SEA2u8xSM>QFn#S6uJ5x4z^mJBsGp2mjE~C!k%v9PY0ANy zPC6-*LcKgxDhb0J>5@Hz(l0@TV#u~g_H~9I3&`^Zo+vmGjor?hL<*$BOjnBxtV7N? z*Zj(KGl^<@nYkPD+Wx}PzI|d$?w$~UA9~#D%~4eBCb~XB+{QTh z5R(Vt*0IkJ_urA=Iw6YAn_Mxnck?m7<=<1dh=1!?qnk(ocx>D+wU!T#6_3T@RiG>F zBJ!5&J2|vT=zWQbGm`ObkNr3lzy`$0fhm27m{64U+uw!oP%-;I8|o#P9%(KOU8+*{ zp=S&N=FX%$koS;Sv2Xrr!(nPB;YB$LGC>6!j<<7BA)6-~J4@al(#;$SN;JOouj#+B zShBQQi4g0FGHKvf+c3=?%VLq7J8qdkvp_)g13!xKmMnOY7+&}U`qLyy>iimAjN8VM z`i~knIaqWKPdZe-JgH_HO;-!NClrh6Q zfKCsD`9W!&+=pLIT^=$wxXL~(` zzjg8P#y9)|DmQ}GQaj+y4v7c9Z_DD|`k8s|Y|#s!wXTH`S3bz|%qog^ee(8+>=%MZ zi9f=93zA7Yz&h;4oaoodeism-jQ4$Nu@c+7#bvJX6e94$e{Y!l{kM4Q{-1A#e@-*y zFfsNU?OH;QKb;U-5+1!n=(Hsy2`?XcXZ=(0B%735f`Q4jfQR1v< zj8gclfS*!l(4P)Ac8^u|2Bav%UpV6lSl#<`5W|>ll69p7e<2sko0qW~IX!>aoj$WX zc+V;S`5p1Q?Dd%3v{hE^gov_{dxpYEJGVH_{ss^K->m)bM?rl!PZbVdtT+8O#^uNB z$asFxp-?~mMQNxIj{QY!-192QGbHNlQB)1>5kU03{7L%T?6;EV9t_9@=Z7;38R5vu zMA$xk7hL#P1nvkil6|r~O6$c9>rVQg75eY9WPT~!$1>aD@Gl7b!i;M6u7x1F%PAGNRxr-_S~B+)eYnoM>=vLwWA>{7CzNXV1?{31 zVw&L5&AvnpulE6HT-9&STO;?3x1xchB-AshTs3Mm(CV=DPeL_cPrS(gHEH<0w-mBV zh^rrCx_n*vUC%@YjjYSoK{#eBN7;o}$itXkrv4s5n2eWGk8)1FCm2y`m>{@8EJ_d_ zV_{40_Acs+x`dS01^1SQfwNv>7W>vi9{;IEW0vgt|JV1SvZ4MUq>EM_=J3<)8TO}p z;hDG$v=64~eWm(%9!aVB#kcVrNuBG{I1OtwvRn1zKzM#C2as^0@^K`5ie`AsQTw^x zNnRkN*p<9kVq3#l;#jTPI$QP|F$yWu^NQM6gdg=vkqwm3C3w1J5eQO4KJhl*JX5iO zWj8Ti((Ysycug0MAkXFVtQ`63Uyna=m%i2bbCdJU7@{Et^x%Xm=f`kzpu;2Es$dC~ zel*8(=y-Z2F~*rwio4N9pbjnjNZ>D_BjQcH6h?%8)!nO;=+FFaC@@V`=8!+;Y?(Hr zfq)$)`+=cbO|e7aM~2PD<19^G@5R7(6f!YHZB%LF4~Ctz2SK#wr2(|rra_dwi) zC|Ztxmu+Wpvq{xp++6WbR=+u2dgHvH z8(Xf!%mKZYTtU4L(AnG%#N{Q~h69U%vpQCy8;JhF#c!wu-l7#T-dr0umjT2$L$3YdoMNgIed`hf>59Tg1ru#!g4pV@%I+XDY21kQ^0N&yj zLQkQ8Y&<+SH@CCu{j{@^$073;^rifz6EfXn2B?9<1f6sSR(aj&@^E*b+2~KTo2|0z zcCW9i(KSBr@rW&|34b>Jo0L!}aIdpc!vr8QMR zQeBdp%V8W+S02rT*+9BY_~i;ileNk?4SPD+{WOc?^4D9W$Glrop?;+enFHTnTe9y> zzzc)(AsmlQEG)7V)u1A3)M7v4DZWuYinCmQnxiIt%3b&hIx!y3y9`_u=E2=aIzY84 zQR7v1ZY0P*TkY68&+`YgEkq|n3;p9UlQnIzn6n7~zs!h}34=W#051p7t=2ChCiXhU zUOAV`99Q29jq0UdJV!a*AAUr`KIeBjZv}K=f!RIW+uN&*5^=ZNPGR&tBW z3N+bMm3JDh;a5W-0(DGl2xUUQFaUf`qs|wv;XcR1stJ2N3uveA`WJq`B}VS$%T5*= zSc&-KdNrGgIov$}=X194bRo6PJe?DMb(G0_7EBFI-rS5INait5&+OvXnbCoK*roEpxSTBxr4^uKY9jk~tayxg_2 z^^AF%5t*rF@h^Z(Zo&3GsR`#9i9C+WTdQ?pRTr~7WlE{JWaJ%TsGIycQZ zGTr|QSGhx5AU)?8d^x{(Y4m4DRK8R=UBuJ$WP99w+A@hrx*~wucZs+g+Rd%=*Q`1X z6XO)QuWEd!HZxlpdL@i~hkmdh0?|Vk;j1L9K+j8~rLmuBu#1zCsSNL9<|2S8&ro_V zANfo0^}ohBzXj1`ph4(?=9Hi8PItIKm9pF8tK>Mbp1AtYa%M97_(tvt;FD_q^Xe_( z>3U$lx-xvsaiy9U8YL%#;p7%^v3}c{nZJeV#g`klwTsIjE*p0-RaI3fR4-JrH$U6w z{7`H1bgrBE{+W(uU+|eRHu+hShP9Vm8;4hO9=uY`ay)5=mQByKarvf0Nv#V~qk?#g zdOY(s+lu1UJ|J6dkMAL+K@;uLC6nel@)WaMKKK*f`D#R$KWA3Ler-JWSqq`lb0%@q znTmIOAq<>TqzH6karS3f0*$q%v+?4eVi@vA={9kmU}X&0>sNx9?%I8#SEFEU-Myz=DhQ1w0`x^9i zs~}g^ja&KU(;=d7CUx3L8p}C4>i{$+J5S)%Z)==jFQ{S8|OkLu<{%lqLug7w~$cOW+wf6d1ZANAs1H>O_ zrOU~%C8}tc`caOPu~(eaCQV(5?V=U+?PgIrWNyq);%5xBSY z7wBF)ASLPPKUVuyv-WBU$H!Zvdp}d{#rDg}#{=r;qZmZgsW?5Boah~iWH<&A_aMjI z`AW}sD;QK0;TEaHvmyZ9yy?pDxgPl`m#u(#S)Kz>z3YDW(#KJzw*HC#1u9IjLI>Ca z-NQwb3^*^?hM2ogD>?67WH|IXK@kV$rfCT@tgwE?oWz^yD|Q08RCRR5i#HLG@82&s zT1#rW$Z>OZoyyD2NZE&vT20*^;JJ)J;N>c(DJ3ArYk?xZ%aoWRk4AyY8|gB!1#P|? z;+aofr+GbR0@YtLz2kNtynfEAwvJnD{`rfA#gye{Rg@iKg|4{7{|f1^jtnmEyym#J znxpw9g2z|2Ja9}#Kr!xTl`RYg^G0(Ct7!SWCh*S*MQ4Wg8zN;Q?Mo9dL5Y5QWpLul zB4WefH_B7Qvq>eOB8DkmZ?ckFjCqow%ad9ar@g??nWd{Ab z{2vIaW|Qy&=KK1aF?5B$=n{wKBxE9JK#z&02_JGX;8MD|#d*5Yua`gnN?3Z8WuDd2 z3I55-)f3E-r_4N@I?TsD!vF#`%*5w@@_MDodRe2I{*;Cw%;FNrnrU3`9Q>4w3@AQpJSdrz6;?4>gzdFt!!IK?Z^bHL6eSIIg` z@BiVra@^Zr!FL!U`Vt2}&U$yJ{_1RJ^i9{@um&E78FAKdYTnpFkn`^*4*Yqulp#0C9 zEj$p0nGc%1*LTJeR?EJZCDJnZE`K-{Mf#Q^nR$MM9@>?oUW9#8@og1=2W=M z95pXhCskHPSaL&awx=c(0dVByy_YFOj;lzKs}+$ENeY9rN&m~q+s`f3DiXYFG60U$ z;hAg=;&T7s%D#VKtSGzS;;$Ey;X|OPg|L5bbqssVKm|q1{xIz8RZQ~Tr;PHrtAP4W z34OqA^n+vUbI;dqi{A~X-KZ|=*SfCH59L)mmqf=kF)tmTpIUS*wdji)S5slAN=@Eo zaLnB@k?~~R--?F|qJ#6#hT*KMowpRfoH;dc^j^xe#DOnmrsFg(WX9tX;YsLw@TBeM zgC=|6L7paSYV4Z{*xAEi*vGtQ9yX+Nfy^jOcG+S&3wA@g>1*_#)33a9nb){X>Y7yp z+m*$O{>6W=^l|#rr&QE6M}`7ff6`9_7q9jf*&RXh%a>HfBU{uDexhd=Fjaxna1@Z- z_%WwUE;3?2;SIlL*y0uo>M1nQ5B=g8zqj)WFajsdcZTQ5pBy(BTvDwD6g%H#R)n9H zbR2kyX=X@~$#*@I@%RVi`;Z+a^p5zzYtV;uZc9xN;heB3%i)hPZRR~@W-~(Ev}@K0 zxYY!kBW^lmX%bzEeZ+sB-f{PONSQjP42C6!>o_&@o@xDL_uwb>wT1EfuYfZd9eK@~ z4?g`wf4?}oEqR|UsR-670+^|52>(W@G+NTa(!H;2EG zRiVJ#B*Otj{0z5Way0&eSrvB8sAnsp zEb1;V*(wi&P8j|CPx4I~yA}7H;^b^7TlcF4v~x>X^Y_yrhtZr7W#mD)sy)yXa5sPWe zi1iss$f#I;uOsWdizmV2;%#*bVto;_Xx%v1kW|VDiVIgI&ee-pO?*u+iFh~RNJxGPQl*I@>a)G3fUS? z)D?IsR@qg*XR$S#Xs@%A z6kHlzgRRt>YG*?pP|+Fh{=R?T>XG%MMhwR1!=!92DyI8WO-?eS>rD6Ki?Ul#(e=^# zFzE63OR%o+iAyi|wCJc?)VbJa-qsB%w^(a3y!7cDoQZAgFTA&g)2eRlK7oHcUIb{%GFwLNed(B-k%}%8tV}V-hTdX-BYi&!jIx zfZR8wQ^cRkm#CZdBSw10t#X?qDV(eaNP1XiSj;i8=5xuSu41eXDpd-U3{J!cw%OCWu)4UZXo3r4rBcmSfyF1=ZgMZ)Qp5H z$WmQqr>q9#%lkgNNyTBW_#zjC@}>j(_e{$!xqKNvo<@c>xqPsAxGb|YQRA*L>yWi_ z@HPMK-kS;zlex0)MRA?`GV~7a<*6sg^hqOQMNhxgniC4P;zapQTwSMVq~oqjgHxZQ zWT?dsZJcM@1_dkQMo(I8PwNhU^*1ppo%`4f(oQxVLz%bO1)A#DT=*=Qb8T6BO68gt z@sp0mie5siHI1X``(wqwQPQ1^S9T{sxchSV145LIax(dtOg6Js)PVHHEQ ztOV(us`hjaPe-itc7o=b1`EfwA56*lR$>>c71ZtFI7on<{m6Qo&dIthC9)JAqp!%5 zbmAOt(3*T*V!iMP=Pbd?B)C}vw4zU?e9zOafHCZ_8t!1RK5wgS@`9K#D4kjF>!=^T zNR{SaFr_`Y`tfBR-m^a;d-i?A~*8_HKWlVw4yfV5nQq1 zCO)<%X}te%vx?SMJH>;g^>=t-m4{(vK6JIhE}%4}PqnMteUMicrc=>6cEruWF7gsA zN8dlZ3AM-~Uu-lrR-0p<&P74=$FHwAu%;)HL@=-LHuzY62QqvZq0rr>0 zLRR&HGd^9pI}}k?XCb-{>B+X`KRpC7x>|=9@~A-SUCKK}%uee;7K!qwo!5XLp0RLbC%!f0w*!{l+@uzg(xOjiuXl{Yo;P<=vr@BKbQ{^;Qrw$oEAeM#Ap@Ea_B+xJbQ3k* z!WLL5?A&JJ=yNOxSgn^&qj3=nbkt6urlV2(U|nrxmtk9^;)rf}dSexx=B%-_Lo{=f zD#HQFx-w-~O>eJmUt`m`VaueuJ;hrjxH^}RQ(CB z*p9AwGoSNTeoJr83o1FJ`9JJ?V>6PAE$8xS1sc^^)i+JmNj?5)+W$wiLn1@hlb^xU zT#D~#W&PKTzJ$i%+0L#ds_Q{_uD9W~sweUB3*N;?`|wks9gPXS`pKJ+8>iq5)Q79k z{s>~X2Bse3Vh61bY&sSIey%Pj18V$2MKr3;*UyCnmh?R9u^pJsFD64%+sRc=}pX20tpP|v@OV;nz?R7n|d}nyP z0716=CTv#JGuX=a?12NF*ZLZ!0HY9am9Nql|5$X@g%Z>%fv2&&UgP%f z{Ik8l3(o)@Hf%)_%*M+YOOn*iR{hnntSdsYl_)-eK;5wBW;^VY*A)#yqK}-f>CIZ} z2r>p4zxo*&`j}bg!OUrDU1(TMwOUL2BCQGOhQBaM;2CSaphhiSXcJ3O^nFmQcAHZj znA%WpdCIhDld$YVOxZj8tpLim&~YS)8*3VB5UbnZ67A>%ZWU3_L9H@f%y2YSb%JwGT-b5?GCWXpD1Zpg3*uSaF#5(8V2kC*vdi*?fvr>kW`xQt3kWExz`(X zwy_E;6rH|^1*S}IcT@MJKQn|A-_&+qJBRDDG)T75OqR9L9&N92ie$LSe8PFFf2^&T zOx)4$a1vbg*^-^A`Z2t;G*ABi{`=>oPiLQQJX)8~sa>KG`NH^+Rn)lij+IcASnJpG z5*uhE68wg~n@nGhx1&&L5x~#p{YyJ%%YFZBOzO&fUDA9*4~V*Y0GNy&G(90{meki` zy^0uW_qMd1MV6Q2f`Yc%hpR!<1=iTAiw~7xPASSRx7rk`SNqd_ws0W~aP|bzE(IVa z+l!K0kbvl!#`h?iXoVlD4CHRiWeg$iFZioW`n@rRKYVf1$^QCK^F>h!igYl7O7Wzp z*z9mLr2%);q25?+^AZ+^`>M86%aNM-b{*_d^z*)ldbo_}!>#xzhqry${n+XjaF1@=j(&+ul1F2XK_H%b*;kH=I1&;Fae+AGL#P;C8E5Q!ZoUaC-?VxI#zG z(CT)p;j5?uba+KA8XxhUU!ptO%T0;@kl&2rfkIaMyTDW^Q%~jo`J7Mz7Qr*$qad&# zk#SyH$FMI^C*rQOlP^+9LC43leEm%j3_ImuYs0>XGyk*7I-eOW%1)_T#8XP(WLTO7 zAM?fpLPk^-zlSBs$WK$ROup5Vb&qhlD6u}OU9a8X2X*Q#{Cs#VbA_d%(n)JRGDI#C z5As&Z=e8ZyplZ~73yV9cEYOB!-*N^Xvx|0E6%7nqbgq8X4`J1r>I(D_<}Q%bJlGEy zBz|(%E94`8%F03Jx8d+rAkP=u3Stnfs&(#uN;3G^`Q_@)Lv{`|*6|0;EV`LkRGpSqS2RtZS5uE(#WXErGCGBrda+qk+Rb@p03W87oXGb=H6;2?5vV_*_t4}6Roos8xhhACN15HQf7hK z`E`^`)2OG&5Z0oxBx|qtV)ni!{ULvnIo}%W@YXk_&yHlyygB#SSL|)CL%f)bJC0cYQu}3Qt)!c8V#$Kr#?IF`O-!ANslBS* zhn8BnM>sF@w25idquwOA~=*>Xqws-GlRbQN>!7`LC zSmu>FYU__%an7#dIm~JhJv=iw>2_N$Ea^8l(%S#vPG!ierU_Yn7^V5=9hCtWH9Ku8 zd>!px;?{m93Q0>a97vT0yXg7oO(T|p#s{89qQ<=Sw~K4GGb@YGyQ>GxwmR@hMg{}w zYcI#$6lA4n)7WHAjlxVKgU2u96{ARw9>qh3#lT?~GobOx#mZN6L&cLS)*2(+y*{X0 zSRZ$(8s@u&@L?Zzw|TdDe3H;U;r)vK?J&uIS#*?cqa$~;EzZ_Pc?M^u1o*x(gzbYl zrypg?BF$OTMK5kcBFwl4oc8RzTpu*u7}2~HWkCQMXc-~R&-AP<03}tqMTqlcLiM|O zAja!-sj?7p`1B0iS!&T&csAEs{XKr4*z5)rN9e46bon(Mh#ygV0k+yOGUxtn=9<_C zF*_3#?chlOYaBY>D`Z`8|5TZSnHvFcAk>OzAzNnqEx`YKc zOIoF*A{uPa`6N@nv=8b3*>Ob_2E9^MuyiTIpUR{X;v>n!TT&hxc>gZV76cSsaTf0A zY1Fl z3Ry1x!bw!Di$U$o6-CN^542KM1=fz+jZOKvB$h=tkUmehH&7+B>Wg?B)+g1!vlrJ zmw2rC8u|HxSP?FDDos>7HcUR*a*M}UZezI4` zhjXU~8Z;YEKVM``K_Q~E6^+Z8@@S6P#lu(+S8SDN^ew?)ep8UldJIB~#-!1%4nG0~fI|i@JXOlfM1iN&dJbou*^8riwbG!a;2v zfQi>aM0NGoZWY%?{{`|RO+XE+YzH-Gu?N`Lt3g6sC;WofyQmBmcZnTby|8kzY_lrb zj=YyyT2aW>-lu0GIu1g1GeM4+@(m?b;dhlq#LK(< zdVof|XDa~OeU-V1>nuqV3|LL@yxLK?UY>m{3AxJmI0qRkkcQ6T3DSYnn~SKM`7qpP z*cPRm`jd-p=c0f)fP6c+-dZsF5$j#_agA|fT(FOggWU#8z1bl)IM?NZR$gFb=IZd= z&Ac8?W5)FQ5rM*ZiH?`NC+inBnvwy+`{2OqF!lkP{F)0KEh@!w9F7Qt0Lb>g_9Alk=HzfD9fOzdZ22hHJDc8eC2|TuvZ3f9_Ah_a@J- zaWy+e2X$vf2WLg&i`SQnr;pDvFQ+pLi|V$2(;XILBa3wvR%qikqqcM!R_O9U@=Jt% z4+es+g&e$kHz zdj!u`7aO0}O}fcbdZ=f^_mOaWw>Y0U3paeseUhbkmX+^+ed>R3L~z_^1$8<3qj>S> zGLne*A-)VlXAX|}!O-|ClduT^%UkkvOVB|INElBB3)h&dQX%~T@sw) zx#4_~%Mp=1oosfXR;<|ga$BbudL*uRbXx`S7hM_1A+Cjoyfi@{k4h=(H%(Bl0?qcv6dn(A31A^lL=bNS=% z)O!%<<@GV_`k1cTxHK8QrDjrhhM%Z$Jn4f;0AsQHL~a=`9dG>!EvZ5D8tsobfP8>7 zibaO~%u}z-YHxrIA7wb6D5+6}pXm6zoh*SAJx`jhPp|h^6Poty9A;r+U3iLX&*eNX z^DGa3r=|Pm;^V_}u!H~ktd1fu9izpv4ZD^i27Vn@zAB2eOLqf+`>>|75P|eTSh)x= z^GfXQ#5nk_!hf8IavX`~%grrQYmCA|2MPHZO?kA zQR#QH{jt>s5|_hv^_H{t<5h9*W;?6)R%bBecIVkue$KN+HnX`EdsTMzMzhdDyUc~E z!S}OP)xCWlSRnfZD<^f{yLgmw+ECk=$66`we+ z4}5KR3sV4t$1qMfnYohH>>RRTE|!Ql-d_snkSUL5v>nVufA7*J(r5@}F<*`a8T+V@{+Ein@)m%0sR8_VtbT^f^pY zT>^(ET4zHDF?7abG$%9lsCap>a;{PQbH-Q2jVD^pot@ZdhDbUo9-ciVSS`&Zox)l^(_ zb?qLvYaXIh{f|{Iqju+lK2%7b6#1dfsj!AIC?D!MXuHs}x&6mC7d<>%D2+>ODEEzf z662~~ZdQ9%f}`18d^ftrnTxtO=VU{DcRS12b=Bmi_53ER{3f;w9sF#mU%J%K&KDhU z6C#)4WiZ1%Yk|~Qq@2*0Pi1&5r?KS2#qHPC`jrV;?8tg?!yE5-pXR%ZRn;c;!dnNm z8FrReDX12O9$?+>7k&E(irRQx&Vdc&nChz~M*hM3GdY_9JK7aHqpVh!L?y;?*WAZ^ z;bmBP{z1MqsgzdKu`-`iVI#OUevnakjj7tmOHToh0Y`Z{`+BVLNG}urIbn2mDhsZe zI#8FFIVE#Tn5`86hVl*(jOO1pU;5SqQK?Lc7ef_ULOu}Z`(#L!0Tbcs9Ee(OU5ThU!k z-|HX&ZXgXjs(uiQ=e^H8Ud$A}$v0R$n@|`?TBZXgL7T~j)}~=Qa8Q2h0mY*2;Rho5 z)D?J6C`{huEz;*Mo_C*X(mK%HSVr4~r9~gm-9nID18{Y=Ng`42mE!sI;J(ROb@jww z2gUJ_O$IK+T&Uo3)0Vxkv4Y-R!_RJ(wIUT#A@3Z?pb2}@9Qa^tsuJq5cKXS$IN)w= z3-d>p|7rn%d&p&US4O1b2J)F4qt%0cS>}5|VxmNiFIAj=zgq*V!T%?C*(ad%WoT?5 zEdS4U^+^Qx2_DqkO!&YuTbiJ{~=G|6npyH`%yfxsrM4^mzF&&foVs#{eg7@atPv3#>DYlJAgb@=jBHW7&79 z57X3E)Thrg0$#4&9sg(PO-zKcP99jo!H~o5xv?bVy`O8O%N-t`qnV{x&m&t6NZa%O z?N6$+EoIWwl?;HXxAgk(>5_}SnXNDs4obvJeql4(bkW;XFvHMyevMtS@};F;82e7A zu7!Q4FT)sRl7{}UvvmfoKZcNUEff0OW|r89szSdBqJSm$y3|t~MMn znWz(tpgIAT{RX4D)J)Q*j>++3lZx6Kz5bs(FW{pNY(5?08NioW=Hb})NGjvvPH?dFh#7JpcI@o z>W~9d5>_~qw0KUQc$EAX_Vxv6d3wEIwD;y2*a#*l`ynjwSaR2?!9|jV%I^3U(rKFS z-hy`mRx(#aCA|{DaKvD(bRJ&wOg54w*y9b0nnGEl*u&VHCI(F*>g_GzEL$%Sjb4Uf z(gm1M_k2v=u=p$kt-~-Csrs{}46*;iQGeQ1lr-IzojwYYP#2Qy8o?%(pEY8!W(MkW zP{z{D$YQv;Dz~7 zaR2j>OTn0%`k8530=92`u3v88Zz%USoSP%GhnUY+P2DqLm|rTqrz6T_(X$j&OR1-M z-AkIoWU{IwvumSmuA`x76*$z)Qo zn#|kzdtW{a_n)#MZJAI-rp(C5Ojb@sfMJ4%OMPa!@BfS&PM9Sm=@^MJV9ytVDkWry zA&eja z&j*qFJ4;(~zf#OSM?s1+rL@#1WG8FWYquPVa=eB8Eb>az!BepgA|;pP5GYym^Z(xO z|3N+eA|JA{&E8rqZ;iHP$7^g&T+Swb0X}dzmWx*h;mu*a3$%gtn zQfSnD0%Ez330jl#2su7dBVP4BUvcS+sqlswg(>z=YR}j6ESxZUnPj-Xlm9;t`unik zY}T29rv@d4O=a%d;iXKP^+j&!sh)Ndbt`MbAWhqrxQW)K?V3aoB6`aptm$7X1wu0= z(h`L5{!YOD6ZOx!XHzJxqB`y~J+(g4Tb&-Z8!F-P2bG<$D;`M9e^=sveyfcKt{U(d zW&O}=s{8r4oQkI?`Ol z5_EWBY^;h$FMBN&>LwzTxy>s_r8h26qhC@PtDrT1!Rr5DApiZD)IfYlOkJeuqEK(^ zr+;*os5W5eAJy+y;Kscu>!O#5De^TJkr9hCSQXN+Z8pbT*d4@nV8ecCe}} z!hGrBae@xZ3u6ws%MJDa$4bq}E}c~rJvAy$fn|1YAs@BBEih*T#cUQgjv^RcvPAoH zirl`+St5U2Y5kCKTe2h8+7&htu2j}cDz%f}xFtd@dekw3^!Pf;Abx^B)&Kud>$c?C z-(5E1gsXH-|R*C$1szB)UkZO1BaI~XX*F0RtLxaOk z&}mA0Z6L))Q#tzPD_aNWJhK22wG=2SXn z<%T+qDbtu5nhT0JjWbfC;gp#hYC(mHWI%2yI*l`_sgRkuflfJTDrlsjr$5IdEWPh_j&I7{(L_7{m|^8eX%+|8W^V$6UBJn2GbV!-UqjPrh70RbD|lBzdp*gAg z?5V*Or@Q#UC|cy#;9I;AbHA9OaH;(%W8%PlL(Aa3#)ejx%i(Hic1qGulT6<-=|SXw zEYrX7j(=eu<-okPxr_5pvEdsWXsGg;&rExCKJfG&|A6AoWKQYAzMe*ubOKS)La~Aw z6F>i!r6X*m4W(+q=AU7Zr^Y_EI#CK>(UcR+MW1BE<5N3gzVLOG+W0BT{>QOqjY7dj zg;8M)H`NVJwa>@|cbACU&prlyLIc$so11H`7=XP_PZATQlfU{}#eS_4k5L4m>l)YH zrvKnMKX}%s=)EwS_gD74-60M6WmUupFr1*TQI>jQFm91W>2YdJXGi}ZP~g8m8ENi^ zjXjYqhGlyvoUYd%v{%A-PdLoa#ZeF_xz?U=OxmT5$f$10MyON;YyTiTHMtPeaR~g4 z#~+^eM^h`s^%x$TiG8a7()W3wsq(RAqa$vze;gJTymmWV8}cu;z<&bKfB#3_)#OR~ zqL|MpN~imx%D#5aZyz7SV3-OBQ?(*-r|jeeUCqQSR>C$9Z8^;7@7u*ky4 zdHrE8U&iuYNxG*YthG>s??sJ^Qku6yc=~_Lq<*7zyT>Xq9`o$}7b@XSmR#F=@CACJ zPT}Nux=Y`I?|3B57P*I}3J3URH?JQ+M}>&&>o)d>=7;R9WgpuAjK;EBl|#~iSRIFI z^OVE7TrFe4`N5X0MPbsr&C|z9|DPB2=@qI%vo`R_*kC=CGWb{38B!1~nHqLrm}n3Pv8c7q|bbtC{-pwzUez_4nvVd|Ch0puTtjCnvHwDiumIG z-`T<&80Zs7C+T;dO)(T&fh^(~E_dAl87}hVVTv1F(Vv0H09bUX2Y}GFmm5z0FFSM2 zD7GhlOdXQBo{ZWNhC6eMz`RXYO}$+^@QPJ0K5gPW_(DN6^4#N!fnH@ol+PrM&xkii zj@+I7$HCv6>DdnF|8nlRJ^G--C+>B%GtLqPzo>6Yq1|TJcuD5~+-7V^QS{&F?LUh$ z08x+LT*_{svzXBF*BQ&7po$)CRLhNp&xY8Q1__c2qwP!$$JNgO-`{(p9F<=thLL`> z;ZPVRZI>g;$YPy4PG4=(E*Uk>9*sly+fYY$pd&oavfksI!Q8uZkLgi2R#i=((5da2 z*uQv3GhJl=J@kK`#m77kd_ozd%{7fJRtXM#JxC87ln-(5pWeeM)Kgr@EXezu;&|4M zC2vJA^e5$hrd}k<2PrZvX6f9uiT+la-me-vv!fqnnG(>c`3|MVZJC+1kg2|4Y5d$L zfOUJ>@%={I|5~6}M(=Q4(Vs6!+&_*Bw*NRbSe}^LH^ovbz4-~?>n)&<#Fb70~w=-Vm`ODk5cFd(@?yM)HB)D9J>#4;lX+f zE@%m;-WIjk0pwOBe@efaBP1J+PPkh}_lwR7|4$_OUk9N6u_mb6vN{5663GSlfz|!j z*XO?=Uj{W>ap3d{= zvP?tF(U>3U=R|Ez#N#Fr{M1gU6hd|9DRfS4xP2;X?7IwL?o|n&;5up~fE{gVwVEHO zqlg6mUDp2d?4|Ro!TXW1FAcYP498dagKw08WI?0?fZ~lKsKFZU*no(J3%GJ8x++J< zTBKiS8?3U4+$(d;Wdy#UNQwB5{?)%ZW{t*S3>U8S=Ou>E1R!9fHU89B9&5v|%o3<| z=|;ZItKE@XuK<+PbwdE?Qpc^=Q>iPdh8)`gt?tTiRu9%hI0PdE;SzE8)!&CCN|FbaTpF@hbx zDFXuhCQGoQAAhQF!uVFU4|P{(9w+wJF~v3cQkqXAO{}8UGv2&wS#M}rf8_$`s4YU~ zZ~Ja+ssULsnB#%AK>p%*!TztX|L-aWdUaElO||e3gn!bWe~at3UVm!c@Q~@^U-`_e z1m};g!Vd6>WSr<(|AfVP7#IIz5OMWTi{1J{YReDBlm9$9o569?cnkqYHiq}q_S;cI z9Qda9N7w9;o&)mohKKabs@YHZ6svgxn1UU{?FjA)sgf+~6Bo%`dB#?~uYZ22)Nflngvqy2YnAEFI6qq!l5*M^K!mn$dVweo4 zfs57qB0WRs>MQ~1#{R$#--tCyIP}8-Md(;8pZ6el!QWMaRTB@Jlc47%9(pn#X9_4P z>A8hv%1g1AK|zw4VO@|5fa+`wM=#7zbNC6{yF*rfgb#79B}YOAALrxVdJjz{pKgpM zh7ATJ@L&O1gHbl{RbHw~%~&qrp%#60QK_l?iE(HSdB>s3-dy)atr?|}7N%ocr8w*X zM@xzl^xZxI&Z{|taq~bei)R2gwf3G09UX(clT!Zd9UyHWrGc* z>!$<+CdzjVNEL1Y5^84Wo>mVw4KS}p6@G$|Vj6*Dn;V53^7JPnr0@*@(lz!j0zezJ z{?p`g>G=(6>rUC6z2;6!)Bw5uR%b7hSb`B+MwoT4e+0(BN;Q7oU5%5sLxG=ptEf|v z{k`&A_pOQd7(Fi#OJO^h7;(W^aBF>V!LTZ7_{KdsXKcP#k!hv{;XY^0e_;)5n9+9v zMVHI9KKx!}q--D}9U)hHdeu&4ybERRmlJA}^0PbhP#=zmP08aR;OKihF~KlY_pHDS zI`wq~M=fbV-axuwDcq!}F##rOa_i;^_w`&TH)HXkEJc1d<(?l}jHSn6gl?Wz*CKMC zD)IGO2~ zWt=!$_FFCydiywPu6&q5gj2hQ7ylADM<-*@{TEDt(nl;C|KewLgW;L(e zOdP0Ro?5Mfo_MK97!WuQk7nDwg6Iy7eK|EWu=VTK5=DimkWq17i!@f2xN^B^xoM6( z{)sc*4hI`;4{vp@wy=}tK1iaa^BqeTzS~3J%tel``ZaA#S}%8`fOUM_LK(nbL$@3a z?-Iz@(Y#Xe!9t1B5+ct!6G8WPo$ZK3f}Vz6TEdbf&6LVXQ`cqEisTi0DK{XR*-o+Kf8Y{X(ou<(%bELmKNHv)Pesv@`37{ljV zj%$VA!;|(UBdcn4Of{Q&Hh2x=D!$&fV%}ZDXb6?DeEXO zbLPrBxxUVEj4xiEC-K`@*AVjKt_wIyz+kFL=+e4mX^hiUhWD-AUM5W9g4G6FlgVI> zP<(y#ut%KogmJGI9tPoa!bnSdk$B>lte~elJKw`U7k%{@7liK8_O2b^vGNb^j^NRD z$H&lCsxoh=~VSo}yud50HBx1b*8C1gi@d`7+--Fk1pDSb0t3UBshN-Oitz)`3`-GZ*WD5|@xXW$PKyj;aOweUfcmM^kj9 zBM{!5IjWYVc{oGEMlXv1$hTYz#A9iPSEu}|51rSh{egk~$05L-_A z5jgL^Yk*`c@GkipdNa>Zv+i~|K^?w8e2`h`HBgt#Sf9}<9iNJtjzsUJ&evC0n-d-I#}f+Xus;Q&)?+Vb!)1*u;b2RnDz6zTTI``FXr+a z{j5~IC*et|_ARO~${3b$RJm2-m{}W4c8a&3LvtCv#rT7&@1gzJ$&R(!o)_4rwWA=m z0{8%7sw5CRe3U_26gOw%nV^@Y0+b*1>)KK;qlZhJT-iLIB zK)j;S>~u)*7)lQN-b$@N{VglAJbxM)7_p|m)A@yMbq20-@+BgimZzuIH!Vwwh}JA} zgl77p#J>xC1HCaNJAX9BRRl{tX^jo_jI6#@eMDjBkX1a7RD|+frcK3`Z0=0{bdh(O zo;X|ycg-xT${SWsi=NKRJH$7Sn%a5@?z!x*^GJ8~=&@K1MP8U1cVil^npUZ$&^c%; z)&#L`bDJKu9j@gL%kU+XK>LSMRgJMrbZ?``Fyx1$#Y%>-7O;c)-TPlG%8guA;(G6`SDWtIh-iq}11Pzz*8#wdT%#!3W}&^U?c%tvC5 zRg@&nu#E&-xGH{-#TW?2B8k$jGBL0`$jVhT#+l>;*$`;zp|qFLDj~)d51lMGh#+2S zmPl=`k|{NR=u{p|sXiPdkz0(xl58dA`8s!_@&(ajX&xB_0g`B=teVO7Y1vLy~$-%6FJFqvwwgeQ-dUn zq0n8hFSk-VQBrnqSo)uc_r{j0o5>?kJByIKo-5iJsqJlJp4Vk!e zZb6x{m)pZP_aX|<1A*-v}6ihAIw8gpP?U(UC zSnyF(v>1M!Wc_QmCwrC8J@k+uV%f*GvdE)R?0FI8SL#QbhBJoiN1MZmrrN$Fey@)^ z_qNBl-LC@|c#lLnf80KV-D7Fbjzim3_2g*(WI~UUgsa70BVG~pJjVUPXOP#rZZ_># za_!4ReiFso!2L;_XzgpX-}3eX(uZusE(Z4_4o-S{*jzpIJ{@6L9pK44fDP7^O%>?o z&W8_{f_=NscpQ~U_~j1f#@#n_p!4#t$+)^OqHy4=U0OuVvo7ZZj=QatPk~$I{!%E6 zII`ehv)h8|gkxn^;)3_Yaq#O{rr&0Tkq7W~DhBwyJX*SwS|WbP?tV0u_I3Ak%MMnDuwhef>ItKrP55p3 zr zB;p<}!wZj$P`Gne&QS7TQ$h7-#vrdomU;sI)3np}g*M45Ty-|k!dFq-EeuOIl@6u` zwdF|~;m@vK=)%dAQYYC^D$LXw^C4p;QK&u#yOS>Qd5^QPY1L>8U%GF%cjQqPkJQzr@0)!3kQG*f)_nU5W06t_Mf2Or z>FF!!GjX%t5~wkUL`+bJVnjl2W!qnqz3#p{OtBIv5hVCE{R~)~H`JwVYlWOa@j^6R zdbk&zW9%Tx!u9)c$NouJw#BPcu9=B%2)aQKnY3T@^Ty;TNm1%JK3dlcS8S!(MIW@n zxuc?xC9A*Atw^nvMM}71$TFQQgu(BwgT+GztnKj(%vlGiP2|<%CgDaQzyRtRka9_| z*+u5NkH!F@yTl~vuuiVTd;O)MiF$+@ObDVnrGyl1vX{4qhK{O<|(z90`$Gjioi5$lBXkzZi;ZHC5CK zsj=aBv48sc_8Q@zRikKca5KMe{PN3^zfXIP?>y^D3QH!1*dT+h=2zM$Zn64V-IJ)t zCu~abO>wdnMgOOF+tN-bcf}|^Xk&yWP42Xei=zb$uLdcvgl%E2Vrd`qh$SiFTj$;Q zwMJTBLjKjuaQFat7u|3)|0N>BjJjk%*dqNt2muxQNzfTSFgR2_k&_V?s8uQkyh2mX z!g*S3+6N-+hfcklkJ7wysYtkb9i!di^MA zNMpQug{V!+FdMl+2>yY+>H8mp~$j3j2 ztKvVb+yp%gjvp~0X?}|%uR*=$b>AJW{|5TyVPj{FUhD%ArQt%Zdx)l89PtQnHsDg~ zjJwNxm&_J{tnE(&Q>Yo?ZRbTiOm@s3+u{|D9x!0Umg8l3Xl%BJv*7cZ z!$1c{BHG5GpxW+Tmv4x%9p<-Tvjyw!wAf#y47(OQa)j6q&W)x_>Y36Vac%Fx=A_}i zjN~$V^?+_Q$35xPT!9Yk2s8%Q9a-4N0WAt2(J|0lPRrH=@$Eh@PsP(R{ah2~bGsLX zb^mJYP5DZrc@8J;ppzu`b&8)!g_C|j+LiQsY9g8ec9?o#2Qcn&{TVy1BK*J*Ken$kT96FC`(1axN^pjytN8&ETjk)KJJ6)XL7JhjMWqk zA+akaRctbc@Gv>g7b){Ej_y`f)?Kts3BrAtVM~gVtJgjE=+CFx`7S5DbM16;3BJ2pa_+EpY0}KOI@+nYLgr^kZA3 z3kL$I$?d4tzAmR8+}|s7ia5+&?3I&hQpEW?)6W&_jWQr~LQcFcoF&?pLY9{;Lir=Gg}=4H)d*xg1|`&ahrAyZKX#*~Or)&rFW{p*f{A;R}2 zXB8DpsyibjzKl!~?dS@nu#%4ZPN97TMe?e;xlP2P%S za-hf2ZzRq$SkapNk-5^WIsBS_=QFt(C3Rr7b!lRpg}K7C_froMeS%0UV&Nk%&2rHD zY>i?dTk%zD6mG7z7^=$7EuiJDRJ2|`s=Ax&`0e=yjggmjEM?R-Vm&cxkp>@RSq&E1 z`o`zD^hbxhO7+9n3TDq<)y<6x=f2NpQ%-1>CuU~VHKWr^`OEW@KVpN#PUcRKwNNkj z0-#QWC>D+2#1ciPXq%M;+^a8F_LHZWW|1(~i1a|+d{AEG=kW$dpXUFeal#Vt`3aGD zsr;S=Y3O}tj^9E<>||Eu+6VpQN{UAo zb~EM@z0u#bV+2Q(^oIv##}Okwg|m#o7y7!mEzdQ^VetdfS2*(|<8`S`@I29MmvdV|#-r25ML{U( z)SoW!kxznF1Zm_ol``zG2|& zG($obLi0^a)WCa$K*COvJ~r-7bIfy79+wgsK_qln(6@t!>K{Q{3GcQt`BBJ*B`*-D z1gfn;dPj3dQP?LG^bcTyIs(J=){DXhx6+a^z{-C?liruw$%^h4LRu};P#$rz zw7>$LA@Z^o=qc}KTDRTj(Fc@=51N$wsa4abf@!3K*aW$<5%3UNJ96wH3EXfIOr7J) zXog-_*c1&J2oTS|S=wh6j~s>Be|vQ%D9@q!G5PMn9lO);Q65}_L0{W@_63tfdWJZoU;56!$5qxCJAbjqM$+<#7Q0$G`^U^7Ra>4L)^o&Q zp#*w4h{@V!Urp=0v2a@k&UK7J8+FnQJSF}mcs#oNM7YRr613_8nEF9?izw74?`nFh zX|W?_#RGawfhd4UVXuwboK{v^A%vLjQ&u>l74dd2!qA&aJOI9OyzKS?)0P0ugr7j1 zyhpSZ-i#!K)&IQ*MBSjc8VXm z8w**r19s!PDY)8CqaVLZ@<$+h9`G3s6j2^$LyjPIIN|OCh8VbgDxmWVzNd{L!81ii z<1po_`W0xIyiC*>wWi4M7W^)`A(QsyGEhH=O$^3yR79y$-LD2^g7N*}j5fXDO12na%fH zVnmeUX2@|Vie9*NveTQia9Gg1J_znLX5@6Tx|~bnj@wCXtaTwX6>VkwXq=+dL6T-> zuKcbDmX>3IVZ+IBHtv=`9#vj5cA4V|w1_gr3XeVr`PdI*xH*^ctO;pk$R*4BA-%S3fGy?Cm51a z0EG=9uJ>xbZBIg1N!Fw6{jzfA316$Yx5umTnsioen_lI!rO#bgKW3hZ++!#lb$XiU zi2}gEcAukgsiU3O)%~6IadzDF9QiNty48NidmOC)IcvyPuyW31pfbyfIWUiB=y`3W zk6P}|%E&gEG0Cg>g_6Hy1!sAXY>HtedaDLrt}}9jVbciyYfj>RQ!I$gU4$tqWQgD# z5iisBWs^H%`L7S!-p;b66uHy|>V~i1%g=aZdF4}Emnm*soMx|o;gS{Qb{m3YRLs5- zM0lEHnpEySZAD)U3v~F@Z>&x!Zg2WqCwFPzSZtfr6g#u}?8au^Xc&0c2&Aq}C!4dV z-{)SoSFEE!QrLob;o*2(+uJgH;@=2as%c%fJ=J|*1BDj6Gs`y?zS#Rd{Y-k_c)8Z9 z*Sk~aHC~4lpfY6^v-=YlCe-o|8fA9|tNqANK6s~#SbbN^Gv$sS`U&zA=~0cmA5*R2 z$~%}EE$QPODZibu@yf7v;?Awev*bYtF;!pJ!##e)PfpXZBl>&nA#97s3Jf#W0f3~_ ztS$}+MMRH?0bnn2SY=&z8u^YJ{!Qq1JCx(7vbnkkSY~zxw>Iy0F_{Sw_09KoWz$Ih zQ(V8}PivFd!L;?XNQMqOrLsgh+p_+Ch`*e#lZRgirx;xQDQPB1Qbb*%5@uRR^`Ln8 zln$%rBf#)|z=8Yy}-zKlvB@I?34~e()xYC>>A?*j>dd5Riqg z7+;aY171L~`|H7AtQ9D^9)*6DgX`Cw7YUtkGr9)axvNoEHi59+W(b%<7eG4=A=Ph^ zCr^m>_!_G+m5q!Z8e}S?GZK&P(y!sKVl(|}bP7!TGhfrxbU^Y$vB}cTf{dbWwcDa>XqAkNkl41I~7}1tr4Zv4Sp4!5%@|+K{ zXoLQWdoraS_H95xOQZ08BU3w@fG7ETWi&!Iv~yVYZM>v6g1k zot8&niN*DC?A89EwTU|$!zi^+awX*8N8z7y50n0=E224K!ilMI5rUH$0OONwxR{z3 z6&`;7l1W#oc!$GHm&^dcUsk_o|A?CX19HuSg93s|%PYZqV3Kkcj*>@MLNw&-4#~g9 zRd{J8{!9brqGZ7l&SltnHKH>f=+y0xu?oF(&Kom9L~Y!AH2Pf;gx~5VY@9!nF?u#3 z@M<}K z2A!5T23)JQEg|!Y@sS2;E*jauAGa%G2%1N4%x(;6{cXIvVJULF=%tIaW2hPBzq9)3 z{uU14b$>I}OZo*a8*b>u{f_EC!g~scSSD;s@u2Zcy%!+f1A6w-m!^m*GaBJ~8#RG? zXkI+x7XJ03ePMxi760uIz@ji6d;P5Q1>L`w%L8A0jg_T!{Opu`X)iRo9Y95SmprY| zSM6@it%Rxu?98c7tFJj@dJ=*Sf-xJi*s9DfSp4w42SNQ#-a+`@oIHK|bWxWtO7SG? z_DzfJ3#!C(3E<&{Z-QNZ7o!$cTf#F0eoUCE9}si24+3*0ZqZ(Jn_IfP!B}^g(t)%! zN*tf@E0V;}NxiVnYU4?pTS2T8koWpEx?p_%5UFC_d-G9Iy7wSCaG|YI2Ur)Y=iQd9 zS99yFF88QbN}w4_k;lP=DedL&%!BE9XCjUZhSk~Z(@T*;PW2Qo6P>aITU}zQ=jx^T zJtw2vY^#~KyaKx+neQ;zt`#`s$<+@R0s)NXyDP?-f6aLFyB<~9!!f^7+kN81!*8hK z8F%|Xl4rlreD#dk(3?0KfPwd^3+_ z7XOD=gn})M9BIKX=J!>(IEZ2;;mSK)vj*|I%1MLOL5>U-{}+?vnGfof{8&Do)gkfQr{)u?TZ|c~?W%#D;3wJ0@sdm3OPWxzw~fl@G{VAsV!6_N-jD~l)Vyr>zXU8sj=`;m|T z$mGBa@<<&8G*Tv*ib6k@rIB zkCWOTz(O`AvO61Lp_ow4FzFfbbuPPZiS=H|E?34S45hnKj>L1)HE4Q*R)m#L&)_t; zhl$Zg3_>p-Rf0u&_0u|u2Uxk`+e`V`ddmBx3eLLec~>^Hb~MyJIB-9AzTAs-b$^YO z;P@`M%)i?5;HdvLg&q<2GL1-(qSx8q($8P1S)*#nRVrI!A^mr{A`Hxu{uHl~4i+Ke~zMaPbAB-_6}TrD<3`G?l)y(()Ex z=OyB7x<3|4H5K33sI74~v`pgHcE=slb3KP8O8`ZXqT*n>J544DoFirCdsu3*YISO= zKRGL|xAOyE_kXiK-DwcF1`&7$_J4P!Dx4Miw@A3*)Uc6PUz=-j-`2mFbD$)TYj%3? z+2u&1H=B8wQvBrqPYsFXOLKRiX-)m4fVufZs_3ihlJkIg;Qq%)V}OL>@Y30yuyWm! zdeXPKoS`#aqj%w|E&p6hcp<6lW1o37^@?n+JNwTo!2ltqU5CUofP9-wp>+!3I7E>` zpH~zubYF(yRcf{w?)kU+B-Ek-!2lCsO;4WlIrf_o2%46yVN$;JodN{=EdK3}Ola-q35#owTyM`MKhPWv zMG8Z>A}6rYKWefX9*a&@8(b8p_E9IIXU5;(?yOTTJzuq2yl~{I(KB>~^)8oqq^{Uz zN+qNz#!UvwDCmrrTEIlCWo`-CQ9~+XY`w@v}~p7h}+m=L<%}%7B)4)Lnu9(Awu80?zxu(|5Q+Pwd8`0%y{HF9?X>>G?TG z#RfXX1VYK^m$|IkwI#hf*Mim zVrI#K^?WW!P`}cz=$Ah^z@68@z-5Yo5n@_7YDE-ch(A5mg|SG>>LizQfw6gol_(ww zgv$s-fG(b}DkZ*;xe)){q13#Lx%7|EgI9xAk_k1@a_h;|PWE0I>XpdNnRM+t{vy4h z*#K0CJ1bpTI%h(Da#+~f#(aLGHv2~leL%@QdAA3)k};>EhNp5{liyWlmTP4Orno;w z+(op2DJ0Voy@DI@Gy=(vBkz0={33`>P(EzVV@>{AoTEakNGNW9{`$3H08xgh@3@iA zSEVz12$N^Av%jvx9QC}77ayokHiD+QjL;zwWQtj?6DdVPe5}RPjck&v_}7A_YOeiC zVl6_eP(YjT&Ij*=h^Vl+F?bQunKiF2nzjsak!Y(w3o=@0B-M>aRqmq?aEn;h1}LMe6S@rkI@73vTvzv17$dn zFjTZWtBYw0h7jSyLYE3w^eOP*K63y^m@am4&=f<<(~Q0~t->!#={jqTZIFqmmi`n< z4r;ysHUisIv&0}}y@Y&Ne!Fju_DX3<*-=e8YvOdCIOA<$>=K{2AgS@1;|;lO1_f-` zv6ZtSGj4pB=79qZonBQzehbpxK^`!ZE1TNuo6h@ATe)(hF9JKqgwS2avD-AAHHLJ{ zzq;Cd7S)el9>~E3(lL(#!|v@Nf(7)#e@cFH%Vd(S6VPi+xV*=CSwN$$mFvvKDi(Y7 zEA7^%c;*7+`ZH(kh8-!$--TyusHr~QB~1JK28n{N1=%(M#{+YrXn5MtYzd(@b~WwL zhNl5E=|wjTMBL|1t8|p1iLUKFAqlg^EFRjKzppMTbe>-^*VCH0u+Y$gekD3W65@?D z;~u}{C|6E0v-_OXQ&9se+8K-Agr8npNH*zCTkE=PY5%Q266k79Ik`5}a6{94d57j7 zj(52or^ld=jAx2hLDrZdq1N)r=!-ViNlQM+YbO;?#f>1`$2ADyr`Lk!b1u~wsKdv& zCD?KqB`w5kUUX#rdt=aDz|FT77&Ik%g0eocVisuzu|_*hda+2!JDS@XzjshxG*^>^ zor%K*%`Hwt>5f_C_#y#D5*M+r`p4-zMK9~{NQM0R252OYBwXEB+3Xmlm_#@BjvE7Y z`vM}qFy_9xc1XXkR1?YblkjY=T4C6(B?hWjY1MwphgGX`At?HnwV~lk-mn8C|0Ty& z+68unkZUEUqcPU-1#KsCXsqEpc3wcImh=x*H)2(zMH? zJNJ6#@JeS)iZs573hT^;cTx2NhkLg!#V4CW}IV}zK11TP#v3a?cIJQ!n3F= z8IaQwFL$R}U_SIiuQYA=d*e5qz~tlKB2Pyg2iy|qRF|0sEH##>Xp8wF{<%g9QrpYZ zI6?+wxmLB?RqVi^jL{z^3=QXh_t5r;2xOu{c}@U>{Rh*rte`}MBKm=gXmRuC4{iEx z=^;*;6_lY<4E=W}Y1Z$0k;WhuO=5m2U^VU3sKX_4MmsA(=+Jh?UO{Nxt} z6H?b*4Gp&`opC~qL;up!R%w+(|8%L=`Pw`f?7EPDj8JYcnou!Gx`t|6d- z1|0*kI=PkIzT=M1DEYEGF%c2}NV@Ks8T;ID+&-nC=GKi%#haZ_W~G=aG^0XlId&@( zqmk-x0udU+UY#;TQ0r|JL*fbLR+>*b3CXYPexP8KqonLmOOD!kZdI{^7_ApNeC-E+8 zqHZ^d0PWce_p@bmQb)ZVZ-|IoOUq4hI;{E_|E)0td`{^s?bKs8bH4VnTG>zZ$8L13 z!Gs(F%dNrOD;VT_FCh$25N&^FOPO&uI!m6~j{{6mW?sgb5Hi}II=3Y}u}6QExA4QO z+#224`Cqw5vUbn3KGPT|MMf+f^Ifi1EP4mxy0}l0*1Lo(ci6B40g6;)mLO1FlSf^~ z?cLwBIL%f;xn96sr#VU7o}$S;X8fWurqXLTKr@`?IJC8<`ke7phA?dm!O#iZ1f=Ah zY=9-3b{k+@%QGKX3pN`-%AZ=QMMY}ZA-FGY?#C8Uxs(|wU6_k4F6w0C_Z(B&l~pz< zMGZiV-8R!l4M;K&J}ZP_PuPtqoa+kDh3w?~N&50KJAI?~Lv;DY{A>MxVE z<}8uW;JP$}8at^Qi4VuKR#sy!H^R4tr!v1aHgS&6hsHnRj6M6P#UZ^)PA|Ej>xG1~ zq6DfRtyz1@fQixny}V7Y6UO>zkr-HoUVM}5bam~67@XV4lA|eN^B6R{t+W_p=GCTH zk>BB!1(DV$7QO=$UjtB591T#$;VHY#H?x{}-nc~-%v~Kr>u6$f6pT0aRZtd1MXT7A zq8Achqg?79`zvigc}X6K^QyeH8`8XlB!MF(X;HKepLr+}h&mI_?Y{hw+FqU+ zEgB&n00aPNi|UQ=YuicA%7^=*caQdNZ@|_hPl(wv^*7^($nHpHmy#Z1CkrsUOTqX#NoZ?sv zzY9zSmEjd1-+p{^cDFIYazpO5c&#+sKqs-FWWG|Ae?RvgHX=#QLv@Ax)s1WI0|yf( zF9scLhD6ciM){@=^E6A91bp6keX8ew?j_ZSYZp(X~dD$4XS)YG2jE~|=K zMBVuEmEe&C^$D#y9pS6N>0Z*x+&6(z~Vgu`XO;r18j*)h+;D zXen7+>4LA}CkuxM4W_|_S;^e(|v`f~Y&JlfI>_ik@xjPvBIvgqR z4d42>dEWN&mRC=Iysap|i#}{&m$a5xnQyb*ksn+h#fkjTD7d{nl`m?h`U358Y@5#F z*e|=3E;hwmmDp!7TkEb=()h|Yhn}>!8PFp0ZB&LbC~LyEE^{GM<+&w3eR`_plj}OU zD6v6dr(Y0BqPVNf8@z&K^7aYl`cT)RUL)giOpp1>EyTOwj1%j5eZR}F5#9b(gea6T ztGOVojeTJSbTouJ(f`YM!I6~vV4#c~7LY9#lvJGSkYHp+toVKeK_)8 zP2LffKm)HHMzw`3*23pfsEXmE;gS$saN+95Ht=q1>|OOcPcd^kW|*sXxzREJ2aZ8D zkDp7Bbi|8X!pE~-b|$QKcj}F87Af7~YqMw8wS%^&al!oZoW#Vr%W&L$j32Qlk@Hu{ z{loy3FKs#}YNbCw!waTXJcllfn3rl{3$$o`21X`~n6Y!D``*dW1;;?eYu%Vq-s{LW zyrQL$O^x>O_9L#7jqQJ2o~@W8R==wV%Ve?rND`j;cuK{eCCyvs94>~hB;WM2Bsp7R zIp*AOFLDfwT`TUZ#C8}joDB?N%FC=HFS~k=lQX=%w>vh8N|$Phyl;G74%8^jZ?N%J zVacMbtt!Rv4Z8*^Bxb%yUe)Z~Ct~`JlE3cIbX#yS5SPbcjVIro_RBk-yZ+844(JQTO<(%fbC~co`q^g0@u23_=As>8fvcF zqC4bhyY}lo)48NS!Rm0dv)5ki3r1jAz_R(*CfWC&6ok#Mf85NN^!H-4yw1Ylaaj&2 zleMLB5Qg1KTo+E~rLTpOUZ3ALSaGV0TVXd}?ob@?W_JcAIR4VO>%fgGrTynLF0=O~ z&Bc;SZJGUpgA!_<%yXq%ILgx%5c>M zZ7dM$l*VY|eN<7ofY(iHKIoD_wbceAMrn4!I`^tPJH^OtTw58S^2J%LDtH61LZK5g zN-~`VjVhxB1UODjVDZG~jta)9<`u*F!4#ka`_sdln)a!~D;w&z!-Sj;E(f0*>-hd;Qe z1tEfE`sTEGbCPOXo7thQQEzIDG1LK3JbiOoYaD3fi6~Bq zsS?2X5!Utx%aUJM@-g_R=if|0o^^ph^`KAzS)H3FSk(ey}I?cb!Y`?=1h>e3%MT zcMr>`?*n{izoXutN|;jI9X#WJpXw`wXJW=Y!dz?UPmj0GYo3mdqzf7&?8|LkG=6JV z(ib>f)Gp{4Me?M|Neq@C#=>1|oRpOHh2({V;bfN+So5&AbfEj*yn^mB`ywaTncJ+o zT)TZ?STkW(gwcZH8HP{UGReP@VSuN10vv`4?abE;iVB+s*{3p_0(gtKlvs?56*x=< z11`+s=0bQ4>g@9pQ}Nh~Tgfgd1MCe9)d0ANuBIWXQcss4QYw5fRE zVsEpJ*Fx5oU5&ISIc4td{MHiPAy#fotY3+Olo#xmgiZWD4eYY0w@n?3N6{TM>Nlp2 z1n6FMdx5R~&O&R%_;i>0Hdi}k?qFL!^R75@C*Om>Sj@+FDc-_li+-OQPg(D0-sS(6 zmx;%_f7vjEDj$l@AFG9e55w@vPb5ipP~`Pkp~F8k*k`*5MHgSI=#NMkJ)4ppZmk~i zf(8Kp9ghsQ))`K#*e3wdG?5}tzcOeYGiaS1+RHj45?&bG4Zr_BG z23|bdEk{NsEVY)~vSkXVkD&S=iUs9IV2kTZ*PZ(X34sQS@^d^mArkpnH^!NSb{K+@ zNMm^)7Byx+jjQjcY2yUE9u)6sVO0_W&$=VMT92+j$n0EafM8}+OP}KMcL*ahHKltIe#m%1`j@!N$@U6i(} zW7bSR7kuENUG$9DZ)=%V6Ja}T{9-)N4T+-p1&H4YgSt#TqKCsVqMz;K7Vo^MCAWc+ zshWLreec(2*d7N2_%{4K3J&Ueh0Tzf9qfuX1rH{7$%>w zm&^ALU(&z5ayl)*xMU2GJ~z%%(&dMszN1_607C^HGD-byibu{jL7R*q&M;+&SXliU z&W!QnM^rd={TY)hp3)tyyOa`NkAVKs^Bx=?i&D9a)1(9&7qI|wiimcBf=m3|OhWI9 zh&v#4hz%@cZ@)cc`?pYD*#V2s8zSwyy@HVsg6%UHd!mzHEQEmUUh2gx&R7CMTSs|* zFEBSN0`cxj&F178S8-+QpBq2KJ(A1z5Rz)7p0mlJxGE8)SrOqY?C-)vAlBzYu;8Ky zhG+WqwbITXx_AkQd;doX#LmObKf?Ed&=Cr81#I^>#N`L6K)GyKNbm~E`KjVlCcW%{ zFRjiPz4XUgYtlobYB}jM$-^}}jnNK?SfS>wHsKQx?*mtnb}iPvw8gtdYin?NPagE1 z`?y^4SyR%$wNm4;z|a%;Mw$@Oczdj;Qf|^NJfYx`9<|(>wc@vfTtlM4b?4*%JcBtb z@RNMk(|emc3Z!zxZ1ucBHZ&H$RVK^gSQG(QdwbgaSr+3yW3={$;D9~w;fY*fZY$BR z-#;kM3<`?XX$w0R_hG+Bi#Jqg`h%7IbVVfWB=Re!-zln_?83Iefs9ZcKJWcH^xD;+sB zZ9aj`Sp^xJS_p|L0Vn*Mue`UM9kR96ZBY7^KNrgfhq|tv37I{TqRP*BS><$N_!5JL zFbjcl^N0(?E&gYso~pji2)j$3!$-Z-wi69?JAb?QD(0Wtu1o>#kSXq8aff0W@Z85X zpmAF9%6M)zs|*w>J05r^vyh4{FD6rMv;A#=7;gDgvk<;l=6k|IMq0($gTWkLVc;rY zE0A-@g8SxhYYhGza<02fVzdc|F-!_-es|Oi2S<9Ex6=$aoT^wJdg~I;ppAtLgVO54 zj9)MV?ZI1%)btR$RPB27-iEC)%i~g)gM29FSpiRxWEEi2D(aI^jEv~a_TBhm%R=Jn zolhJv=Ug)%4MZn93EG+d_v%Q943pv5f2&dqlA9`7_`cM!C3^+fP*K72{;%AZL2jA9 z8oG?w>T0VE70K{Jn&H*K3MQUd?`K)07PMCGv2x)S5B0;=R=;KBe@LzXZ~0-)1=9-y z!z}y%nqrxvUn&|rsOBlI&3nuJCQ!~kv{B#F4gtL#yYW^BLgE(R>;9U=*&eKixA9+C zKJ4TjZcX2z?I~^=5NCUmGf@jEhSI8&Uidk~8&e|NN9xEBBlhh*xtJn7=1w#zXqtLw zwS!@&$Ki{(Bv0C4Q0{<}KpR`BpHkq8Kg5ZAJg}~A4xjs3>idm#+|%V`;<^6xwxK07 z+i9_gEC5w@FYZhKQ2!vTTK*@fo=as~YBxju#hA-k%-G>#!i`vdyy!Q1roTK&z8{+G z?G0wm@DLNL65K#`zkhcQZrJ5U{(evesM)<$*TWjycr=3$;;$-Q-L!Y~DTg&}$cZt! zMDu!c;r5bdb+@4mq=zoIQja6Y)9rKe0@?CQ(Vp!b(UQKU^skBKA?guO*x6Q{B*GL%vVzQybbU=ca@7?WZ| zJdumY707~hy}rywL3c^63S*LIR{fj;Qyu_yJ!5ez@i`^+ zgGaF7Gjm8#RBiFr@dME_gPq*Vd1IoL>-u#*D9gDGsIhB&C*o``U+qt&vo@3JHMHb4 z-5=hTxJ4ql=%n}~^~}QIZtntd(DF-LrnU!wB-))dyOUydx9P2yv?%Z{TT_Cx@Gy+n z8<(`BaQFiMtve^Q-W}KXski{O8dBthj1|4z6`9O!$v~Y8t}mz2>1~S9hYM0 zD5I|)es>3H-d$B09CZm zzlf79+#&i}Z+IP{@WmLcNNyz8l}mlEg!L`CNbw#zveP&Sda%= z^X!W>*(4D!)lGDIZ9cBvpFd6N(@viY6a{?UE94Z@gh`r55BZiw5&IKH@Z2My8}kQwW#z^nY~`I?_!T7TF_1pGOCuMKu4=noHyV}zg9&UPet@c zHP1z6uJ@jHFW0*QTB+?9<`5Z#!!E@;%OYHRf?>q>%-k%;;}XgOM4wU3D=_0=`yO14 z^qJKrh2m^SNT$xy3Tx${L_RcE(8nYG?GzOG=d=n8TmZmBim(%d9cyRZ=B z>ZU2pHnS2rErvBxVQsk|cFHb(UqjQqaP>Z1&2kwD?di-QPT?9@5e)~5b9b^o>AuAp zi#UnrDt=k2>aOsZP(3P!#-OpzmL8W_^wB|cpXeKxZ3(YyZTAmxP@?-qEA@X23n?iW z=KzN%Q>Kc9IaO^jueq@9IO7oS_R4~#Ug)D=XXi5o`s5cn`Rb!A?NryF9e;k?itpi6 zE}ch6Zu80KLsA3A;WHe9fp+Jpcge6sTfWKDB%Tk*@0r>;4$&AN zYCL)+_AmK!gc>e{vFI@_gAYFv?1X%|8i$$k(wtb$nQw4}t?q}k7G$ZMq%AxS?Z2lX zmej4)C8uAx!7n4Eb`e}zQ$~9LmZwbY(U>#vPOZ~ zgrDMtGhG?=D)`I(pd;(K z#S?(t`-U`$o_n#sU-|gX!Xby(YeB>7cS>nOczB8@*~ft51l4UmP!ef*bI;Y}&g7a! z8yG0G(-jozkF5y;y1h3HeWR~jcVVw8_p!hk&K5-|zoxRzuUVXQRu%`Ad_7JBWci~o zNOESt27I-m-OTdT->Wcutr-ZB*khbG8OgDfWK}h3$`$b*7&N>Nc>O^1MOJTc>=rPT z@Qws;jsR6lN9&Nzamk*>0ZaRhHsnAgN!c)@ur$vEuk;LO2B68)wogS-wP{i+b@^-^ zZ#{UJl{fy0OZu2Ac(gwIf;}=QP5rzKX_qxu8k~lG?xV12vO0nMl2N=hdYQrBAUb)% zJ?s41qnO0@K6yNZ>51ZoT0yfJ#WtJgb~v8fnRP60-psF2eg6)GTGN8i=Q{>KMb=RL z8r;)BztRYDGl%J;T1UM1aUs$bHeo=3>K zc)H}I#ZDa1@Q)ttKb_ed*h9bM@Oml(H_^X}{awE#UN$b@+8iPXMjlRE5tvCUKWW_e zm0VtFgQWNiA@}r4U7)1&UQ02=h}=LeF5Q5vT2Y&QEA&g=ocaAmxj=_p9q$;-=JqSz zaoS2me~)*oFYpUozPSkFfy~=YPHVBlRyt6-DW!XY4^8v)_8TJG;#I_W_dTgXAKO{1culyaL`ncy0lV^g{MuvTPTIV9G z{&q)Ss1P4;8q>U6?VsM+G}H`X(FLBPknp*sL8l6_xHCcqY~{|dyl2w<%v7BXEZ!ch z2@EUt!kdv^N@^Q>hDK2Ke=jopPQWUqmlv+4#HmGZoxF)W#kQ-)bT!X-MI#H%%|#A9 z>j)&ZEYBYI1jvKt`)2+Aw1ab1VMY>TiT$N1>TNZ zl_AgYeMk(&UCn)4Zn*vJUE6Sx+|0SKkf?j1zju2YkxshxB4_O|EL-*X&e*~62CeCz zWHR(fPv@1z#;8r#+#+lm#ui=tZX+cQE#zih$B_;yhnA+%aM#@guW*cBxBH9%EIE4; zQ5R{qNn8L}gbB!6vK4+p5!M)^8P8o4Zc}ly#$mn;veQPFg?=UO43A>A|7FYhODHFG zxq1Qv*T+o4ka%`f%_c=YIb(?+zCx$$hmb)bMjOd$(ytPJy?QGuW#$`+Be#RHT$%+` z@S%fFZVGw0TbU(;`k>`UZSqZt8cFMg8Z>v3_@ixZnui{)~EkdyA1KM zmS-rZhBWb1hO|DnIj4p$QjtXKHxGcKDs&Vz*taFglWg`UXSxRG6=NUC5p|T=zaMaT z2YuMo&eZuoEW-)cMpc_vQ-)E_dL~7PAoxnE5Tg4A$g-bO*pU;zRtysR*XZ6^Uj4Wi z4YL4WUioAZ!S}R=sc@JfBUTT4S^~MVE_fs0n`xA`Ov;`+P*swT&@qLat-s*FaT7}< zLo%7ZGrF@fZXc6gIE#vw~4ejWoEey(kQQz0~+(;HTh@N|+!Uy%N_@zXD}dwSbPqb6I6jz4&rc zs2Q%jHjcd;9vr-?YW!$M#xuG4c2F8dU0k?O5V;axvfj&?palsK2pzoMlhYP&2=~Uq zw>sm^qtGgf=Tbc7yD)KSliw2xVnZxYipmYIqv}^E=Uj*;q_k2XkBXfGlku6{MR5vB zA5wzK<} zNa-0Js|;vjje-21jPV(44dvBO!PESkFCNp2CmKjk99y4wGBe@&1^jq&8kp6k1tjcW zM<#b2+oA9LEdx({J)}mzRiQhe^NL4u>yR16qcAh()%$O$k|!0J=HZ{tOt)p)SbaZx z1dKp)Ocg#70moZIe8Lh(MJ9t@ z9E@H$?l}!}%Y0Mce2+|0-%38J@xg<`wGkjEm(0^8%t*5kAjka46J?Zh4guWJFS|z0 zhM7kdpGus)Ou|9Ry^hM`U=|s_)iVMEXgLj~r(x)K^9HNh%2XDC8L4$Hx$o5|gvE*e z4o~q6R|!2U5QWw52LWa-+y(#tE)Noth8Yo4-rQm*opa|c{^c6G$^^qr=~^+ zfV24?htc9;&VIgJ_aV8etfacnS7$d!Rk2^6n+EK7<~m!LV@hy!6+_>jbFqxR>=b16 z4sOL8YcKAYf85#kCMDA0M>7(Okoz@nIG+Qpoe#ylr|+th)9M=a%+~`4D+H)G`UCu^ zj`^6BR1<{d>W+8S<&9akF6LC{i6v{On)9S5c?%+*MCGrUt@A;`@_OY9EG212N>^H- zI_LsJB45e64z@8gAq&`=tTqrfOvN(Z%t=S+Pv?P~yUU zA(H_4jkgz~nF!&u3AOB#XRE8Y7BIVU?S|`b}$=l%}7a$;z?)XSGxAT2e zh0Ikze9Ep)n+j^`${0&Y19;SIo=pa}M|w$8LAA|Y?JKP-&qzq`F+UaHRX>xw$$qMP zfu!mWrTsa&*)!-_UPndS0fr^K+tyFVN({4e%bcX3&4iLrNo)R)CGKvD{<8Lc{_&pV>)J^66j^-RV*pka(nxfWV49 z;iRlAPF+Csvj##@=ImrI+%RBVdm_y>LI;b`O|v|Zk;0@KUTv?_I}WmqBXRtA={&5f zg2h^h1rx-tD`!~^>ihPiz7@U--Lh7Q&QrP6dLTd9iD+>cZ9Q`G#>K*pf`xlg0>J{@ z{^g|oGRIjO$0{i)2fhFJUm^!zmZS3ER-YzvW{6tVM+OtwG(mj7_L&uPmJUh}ogI%E zzYpuE{1Uvu_8cAsg-o&YvsS$biL<_`+7TEnSNzJyHf(XNc9W9lx}kqVV|T2IT$bjvMy8=mapuyEZh=Tu9a&K2p#v^xFm)5f{_G8vjx?Rwil5FU&c@Nth$+rgpf|(|<$6eWEo%a9jcx&{=VR->R=e|ut()5h2O}TzO<0CiEr8quoA0AXm4>;}06uZmMS(Y@IQuD69po zohzsWwoj+TvDE?^}rO`bg6vmawY>qT$MuuFm_XA-{c2@n}^wFmaKEP9|imq zV|N0dvs6iL6j)#0PwgKVbIw|X#7k@PBD%U?<0A$uh_yQ>3=|4uWipc(kd!m#J&#;9 zrliU_^T^DZ!UHqn%ZY9zm0_r)hqd{`Or06#9{>p#84k0N=vqkPYSc_8T*d!$XE_8s zjcjJH{ik0vwc|NW_9b&-(KmX0MA4>yG-SAxhs=!U=>+m7&;oy*Ii{kF60Q@+Ld2>N zoR36{*JLM5v0%z`aEIa}Qw{1v4E@w%?%+o4_6KvP#r8kWEk$=dW4=Atk+a9w-B?Px z9FhsS(=!5hHQx0x19QtQ?(HS{hKA&Rv%>b$Q9)4fypuFauWJ+nU_g{%TRlIXG$sx&Yz)nmZke= zn{B$*iaS1%MKxoxxP{g7BdF?7s3}&KGaNdzzHo8u)d2Yt&8u;pTqV!$*EYWqJq!)$ zN>$ZxZnUUxlJlIx?lgp^EI^7PX2VCw#}z$)VT@dQ6wxt4JW;pX%uuy9>Pd%pUqKEa@9<@Q`hzz!#yl*{?ywBoTQ(%ATvcWEB9{--nOxVB-~$_EJt8O4xs{yQ1kb z4uQ!cz7kz>z!C#CuX&G?FcCyHH?R+Nd2D3B=|=vH{+hT^!0SWVEzgsWY~Ed>)ca33 z@NCMDNH5b%?jtsR&uH%v5^L(m`kz$Ykak9#^Z@#alCJnm2@X2xlSKRAJH(p=XY>mn z!}IuysON7ZtDKa#MZX^+^{FV)`tRUY(EiAe*{0F2`YS*{v)~QJ=Zf!$2l-W2P0uT}54KJqe4%_i&u?A~FS3otd=~7M3sb$zkAlo_HYdb6=#D^@ zSIvzGH#WCN1ayQmL(&X?h=4b<=;8*pSv-;Y_Q{?kwlNs!D6mOsI$&3f-`ZbuLt5Fq zakwrqF63i3V()w1^T~^ER4=;`$OiC?<0T>*fRrmt4vBf@t`CHXN{4Xhn;znxp-*+^ z!eYSW>zoLw_AA9cI~YQ^8x9XZKZ7qWb$?)_o|qr~eXqdRP>SX^X7&up@fr2p#hc7Y zo_=O8oA!as#7}jJ#-Ngmn_`POnPQ@g0~2&AfYJzzFqp%UUnlVL)&}0!2KYN znQninKCof!=LPR^CSCeVcPhiDC1Vb5@q@V`uhh^U5LG@>pQ^QM_RIuIu>A1Q;YJ`#SbIsAOorL7NJB{p8~A$9KtKNOnQ(!0^Dxdq7cgL`CXK$QUgRB&M_TU@ zsi;wS+|}>)7U!xU2d4GEf%ISX2cuSQ8H==Cy8@xY;^B+63)@N(Zc4_WcF0-9IRY?{K><;eNI;KCO3i*Sd2LM&+_t^o# zT&nNVrtrqdnQOW7GoepeE~c5KS-7S($9c3!Utb5#xlzm+YL;xbF6ZiV9cJ*_nQ1=O zdo2yFaqloM2XNkLXR@|Qx^5jq1mwwV4Osv)O+tVb&x`9F+YL*kr?yB9!QtH+c=(Hx zeI30&8E-C%SI5>SEtToF7kq5W-E|ivLEFEP^ShJT#nw`5%a*t0=-ohvYt|#X>H5W| z+RxJSdK=^X@qKJ^#<;m#mfoodBNs9E|=ow0~-K zOh1DiIbBfRu6UIYz~19UUmf%CM1|=ogW%KhrV#&o@@&=iZ*)j{08-;K0}CMl7>%uA z*?&g}G1kmp+n^X_zV!%z0QyO7;;hItyjjZTWeCxssi`47PJMN`$x#j}e2w&-2_|92 zhGYsD_q{!z37T}wq*r?`w45K@Jc{Gv@odRjnsZ}Wgz+BC8g-Kbn{~(G>sR8C#_$ex z&G%r*Z@9E-I)8Ksp+0S#x9ki!eBt*h_qksiY0uF-#oMgZepk0_68SQ@uGl@k&nz4- zkQ+g(P`1RQlG3dNViWugr$oLOyFm@5UOp*RO-v0L<7xz8n0@%4b%qHUuH8}UL*vHbr*mlt z(IGXeV}EpXxZO13|Eh#J9Lnw)=^B}@o7I&_x&rwJ=NZ(0oWfQAN9R!H%;&f;HfTE2 z4o4J?O_Y>~PwvdSM;?rvsn}wYULpO(@7t#iJt;kqAot98TD;#y93(0=S(-d=CnnJZ zZ4vvZF38IwO`8#tAP0+#>qw<5~)fHyOyv03{RkGZkf=4~p3Wez*Ge4mnt zZ3v3q0)bvbxVWZc9L?PfGu!3HFerJ@G-RpgrW-=yWsD2)p5bVv?UFJCTx6Rux8BQ5 znDApw+8Uh$)>sYr9_dZ){{9^2)HU(YZzR+-Csp*#S}!ZOEAw;~3ByX}Z~U(n1rRd` zz_I4KLUXjxjvE~VX+Fd?VMEf>I2oT+nk`Cz0_6UuXf)fuqhXD~(#L&@6tkEca6_e8 z@KD|=+2Cv)y*oB%DRQ74EOHN@$|oRG319V|nUp!|hcnX`r>8DGlZH(=f(eK!K&{ppoqCCVQPx?v23&XAZsjW_ zvz@r#2gOGf5~+-k!MAR|iV~lSW2J>_y zK1W!)W&s56lx~VHDx*A8hM^0+^q>-l7D+I zjK*ACXVkyHUIdx;iQ2F zK&*u)Vq@bld9dlvAv7xpDEt9pt0EAtq(z`THZ3UcI?QyuK(tDdUKX2w?bg$u&mt$D z1F^$Te<%OD>$lK!nh$mfm)b8J8~4H;#NEl5rr)^l*|R|^3_y>K)rfwde(NuZvYZ_R z{3+2^gGU;nW>?xBXvX5p0PN_inm*wA`zB{gJ#|Z=Lc45_(T=3Dya67;R?gYKgNln? z8S~AKm4G}2lCTCr794kj^}5^_>w2fJ5YqZ&#V>O^KmOxXEG}dGlg;m9=i%IX$*M|p z%5&-*GOhZxPlhsrORrs>HJP?^y7;<2g7`3il`PGlm|Es*$wiv+TX~+G1}}Au%t}KM zso)4{GI58Tw^{VDEbo^S2bzMEdl!Ru({uZl@{u%XBx8?b1@W!T=8o65GUUiLAY3!Z zA#S#|Q7SyN+EW3#s4$bXjS|Y$$_m>0TYP}_&NZ@{ax-s0#N;uJePPI{aNRvJ)DQV* z`jCt{3nuylY~#FtCDYXR?jqarbd+W}`dR@a8O}O1fZlp1Srzvm?$Y|V9?bF#$94wl zK=S)$d;q3Lyeyk}T(odC9$9$`3nsVkT&EiwCUzq$0RJk8X$F8?tBLCc^xOrAep!Ui zvTV`t6iXT`3;O%0{BA8H(HQnygK+&D(o$U%uSa=?iJl?85$Hf+@8j=z-rYW!5k$BIdCMP#(-$tG zYk@8xiV$9pq=0bUJ&=0DEKZQ3U;h;BYIr;|=2F9z=<+{+l$LS%AD2r9w;nNld?gPWcF2dgkH!U51E32$CmMo79N5fetdg;OHC|J(CF7CiHrOAQ#4OfM^}MEt!ivm6 z2kC&G=&lUzUrK^#*}i12%noC2^)x~f0!Ln+eY9Y^KBj4B1a<19)bWA-d*r~|u#>#P zZc3Q8mqq9`u6;xH9|;2;D-KA;2dMNNX(Kl}2(_>7tJ=kBHH`TaSvAXQdV4y`iMjQS z6?s{q2dFB3*0f(^3} z$fY9+)PVt1iTE``>^TNy4gBRJ?NJAPQt5k|5e;1iw;oNt#Qq?t{3M{)9MC=bB6p~+ z79if8`2E#%E8=i~ySSWpAl_$KV*&7ck7K7$9N3LCpOM6Z10-gWAj`=!brDjkj6mjb zRK`QLZ;Pw^oT;ZIGldmW!Oe~QUbR0S5X(U(b<{6fb~{TL9q&GSgS+nzOU+M_PLSWx>kbK5j3KFo`~Ch`iVY^pv zhgi%1yB#(L13*q6XR{k8fRHpOngP|jAEHM192Gk#>Y0d090M()fbc||jaYPlSkMSk zF;;lDGE;bxgm>7w02xpn0H~Nei!O>bYwu_McM9+EDSL46iC69;FJR!b-3@i^8@T*mj~pe2rOj-}?==hT~6*tz~G zVKYT@hxL6}sow+oVW5TbxpI9ap*cIHmJ^pbn>j{i%Q}d<1Ct4pr-_n7t2^MGwT zK0JCv2^Ksp9_=Ma5xA1fnf#rWn^vr%ydu85v&o_XuYR%aPy<_&U1O^*ckOv?yrHD7 z#YU>$c=2S@{9}PWyVx#!F#D7W`J>;z29T2J5_Y zm}SNpJiBL;bW?>*(|X#a(ngo-mEG6z&I!?j*)7g({k8Pd`uWP(qRCLTTFsO@YCCvG zvfGavkE4qn+B?4OkCd1|x$G%|KRr~7N=!xPnX^}xhhujemu1(6FNJR(`$gC64@WOc zFZ>7$$S4r!aBkx@2m20>4%yILkdoh!A)}$(p=sf`P$S`y;OXEmk!Ii|U`k-!Q7o|1 zf2`tg;U5w-5}pfl5b-d1X}i%cg^nGu+5INrA;A*Kj4luv6j>DJi>!@^7j2LeDH4^| z=6~2^88hECub4rZh|>A#%|FOxVl!?#7dB`3cS+V4;|#xzp^-Tnmz~>2Zaw3<`CO|@e+kmj?C z&Tf04NV>>wUge9+o!X?Y7QV*&9r!!=XFzoDU-%T-bIpGBdT+*B4nzAPv^z2~DX8QS z+6rA!?c}EOS%;zn%rV_6ag7-r1LfNKg0HsfD?F(MslvjJtv9c(3+Q*`-k+^%t(EKb zw@PU_=YlOt?kX?8Ro+#weVjgPUWca2>Qr5;Za{U;wDuKl7Zc8(XQwnQG~qO_OLE#< ziX)}KGOrH($B;V}8eBquH8yoCjkXgZ8QF=b)$Y~9iI5C68-fkuWd~== z?!~{>qHCi~9bXd9a}^i*YnrF!r=>0^t{9hY_00CBM^op2zPsR_Q*S-kH@P+C@il%r z1)2)=5%lp|;?0PuW5Dud>nh?e)bal z&mL?#AIHBH3T+T<(5CRxH)-Fr&TcXn9xbbUl~Ghd>T-K#d4B9hnX`M?kgvBdWGt37 zlQpxtX*#_PWc6|zx~6QBtkbkr*>|1#?*z7PS^L_mx=}_yLOwb3MtZt6{n`4uj|t%C zLrCPw<1h8Fx^32a0G&&yoFV{26+qt9%UjJC9lW^gtPA$@yRWyWZvu38w2t31BtRhr zz_tJY>3`sw0~is;pI+kC=n6YKmWGaAOjZ7VseeIwEkW8{-UDs_ol9Zu#MK=E0C@EO zJYazIOdJ4smbrxRFJ-sY^Oau_a{?I9*DnOw?oVcZrxg_E4>P#7_mqAC3^gTdb zIg;Fg>g)ZVVL?YMkk_Kl!-D>2%LXuSzv1co3A%%C&S;_I&or^C|7Tfsc^Ga`iJuX5 zgjqpzA}C3kzTN+WaTyP%e!?DM9<(G&VA>(QKzwK@>iaYkRlvuvV6SL%ANz5Ri}hb? zbf#$^^hHvT6i*A3<9EH}#SqlGoaq_*Ss+cgB8E4=kz?GX6m{z0%QDq_>$tJiUc5iY z0zCS1Fuy}2AX$Q{y47RZigz}q_|09Ly|m)xanSzPnWn(;O_S_Ae$VCs0Uq8nTeV&x zMA_@$@|*ro?x&x@3G+U2j+$*0D+gn->!~lrB|-nx114 zk5=_-`5gS^s}Oq^@8&(hE05MYcJYVIT3vL;cCVgN{8)uCjxQe3yLPRFSw=6A&v<^p z!Mu)Amk?#M9Sl0YxPyFC;uIaZSYJQcb;Wi_Pkgg6Rqk2~5Ke$-vup}%YJ;NZHBo1h z~IshF2qH2fxdQl6AkW`Mw!H-Q0Ebr8I5%k{AQ6R_o4~!}}y8xklm-WY**< zyg8?Cxqo)*`aT{mwpFR?w3w1-oqri`tq0~+=5chU%}Xal#V3LE!te;;1SKKDW7JWE z30i=bG-uD0isQ=C@TT~IA_@!?3IpfP&x$zzkN8f+J5kjSSfXa+1K;~ zO2e5wCT7c9a;^Ey{y=}Au(G{>gzxqb11-Z|*5(QGH=VKl(~sA3KBdEZ$qb(Rge=uZ zJ_&0(*0U_B!g_OrYZm3w_h^rOy596?-z`Q$9Na(QERvzUc|{95q}~+q2Hh<`8(mTe zXMzImp8MM!R2C!qzG-nE@6mQ9!|KdP@WCegq;cw@p5kI}kL3ud+L&4ZD-P$Ck65J2 zno%2=e)h(BPAzw~;nvt89_$CE{9>zgI8Z<>Hrt*>q;x`uuKH9L#WAR<~gw!>EbeZ$%f7kTY(@(ckSfbiLuw0udi#LW_{jD0dz7w{Por z#oC;85LL}JcwU_0LAJ72jb|+;Hh95vJtM5TU8e9?#b?W3#>gRXgiMw*ut0wTC#7y@ zY;Ea+K}>{nwv;IxqmNQ^NXbWrnD5!H!x}nrG6{AmES4a?I4QP*8ZV>AABRuAXNqm+ z8}&A;U-666X!vhK+Vkc=>vR!xtGV1B-(xu=plG*v43@(DrPxC{d3^;Y;lA$Eh}0us zW~Y~D)*OAbTn5EFf8%I8Lr#o?`H$F$y9Bmby&~y{czDDL#Tg1wvr_0#e@EBXiYMMl z%1p$_bGYOB-N|A!fvw6lBOIuTV_428P{93#S_X-Iv@lcZqyAwGowgeJ0bUs6l!n)H4m`3y}(Tvx#hX4 z>dfr*Nj>^}1Ctlz?BH|Ijyyh`XF9dbFy*74_4;_V&VTzW5De4}gwevFscv#=s`q=K}bw-_K_sknrq-Cw(Oq-!O>%mbJyyw;(33mx?NLyct=E-> z5wW7l`y5p7YmEyso8f4ugCJrgfk!oge_t|wA4 z4DU(LzT4-_E7~=Rg2oUEYWL}G8#8Fcs1vDO0n^%b%_3E~8MVIdf0R@X1Vx{?AzF+6 zD3M-vjppSoEI2#}Op#bnkWeP~nW91>7!}@z2||ft{`2ZD#;K+#SxJuRW69?p#pF-S z^vh{@#qej%HV-rpcQe)!s+ovQw6v@l^C zDeMN6>c%VS?g6n|CF;!Q7u1fO0mj04w5sj8${ZyFR{70`2UZ>)V^-UD^!iHl!cC ztuB^ZFSd`9Jk6!2(R=irvDHeC0Sst*l)r@8eyRRK zg=i?JgW(D=cFk2RvY-iFR^@idtf?@p$ZGVxcbuYMcjs|y=uGiV?PRy@ZF%Z+oZ{@N zd+$7Yd;388#lv*(>L7sr)hmsziA?%3x;nHAFFd?auM79%>C`j9<_jIX)Xyu6}hjKCQ-3}=-O9%+!BdCOXyrR}Bvg(kD(11!Lf;8IA8 zlE&0@;_T|kYW)h2K;}b8vNY*p`@0i$_W&77Ja8UNc9?={gPoS$_0B)&g$DW=k_!)k zv4S~>NI;T>M}HIU>wKntZY~vnjqiIrGFd5Dd6Bc9v42mkplbLMmCs>)fcy~Za1gha za?j%tyi2>^w6IX5MjNx`hRs*|Y;o9J?b4OVoq2|5QWo!Ps5?zS_)xG4TVciWyxT$J ztk)LSC1>u)OOho6h^rgTvYghL4H^{g`R$gNxaOqTwo1F<^8EKOb3r+ula=<)r6EZQ z|6t5_x{ZLeG7fjvR%5P^>={ovD2!xo4lZbnL=iSQD)&c(DkjV-S_iCXinki?#0bg5 zi5$5g5|qZ{5%i0$kH*hk3L);Jm=)jfqFE~UH6#%>XUP2|q%5AI`{^^qKMFAyQX1>u zI3cFZeU2RSgwU`npHP@T;XCCb7xTm;lcps{vK3o`!(aF;pGhX*vY7TW? z|LrzDMORoFRN4u*(q(t@gRC2aNRdf-jtO`fP4X1l$==hrqLd%DKwB?8`+Z2qkVk@` znOC=ekH_JiK}6Gs1{89;g>Ou-+Z(NhPxR!|G>>mM#6})t@~n6()-?xeV7f5)EGo|P zWJ0tSVe4(Y^S#aR{zXVebWR2y0^r%=O7p-695cgrUN+qh>ZW(8vj-a|m?kwOd&vkx zyB@G@8@JwV?mv|ZYPN2oR9Sy&EhM%VKobGfiwkrrtsNHk)jcnTHvimCYfuBfal6|i zyXHvEv@K6am{x3r<%t{)Cy)7MGD<}FknLChXJJ$CuUz3ZPl3|s2fJ$-#4)~{ z1~EXNT%W==w=uRZD}rLCjgyIatRrM`4PcG)wT? z$4GULN@p>eh08Rm1UJC(1Yq|kQ*Y`~o`fy2GF$cqXH2L0P^q^=j|xL!KHX4K&~DCY zsg`I(#gsd zg+U@V$UgG>;Tt)1CSt8>5xp|B$nM`;kLfKTC4Ku){#&WJRQ4H{>RQBZVd4(&TgI;g(z zdE2t!7p0BeuJv`@(*o4^<@@n=`Roq>w| z<3o{{#gsQG2aeysVUW}MeoMXhqi20@Un)3k(T-rv#j3oir_Mj$gl4JgInBof-B!c6 zQJ9(mEMwbxdd13r3zFm}ymBck;*__6VVNCPZ0(tOZM~8LwM3Giaizq6CoR^3OY-1- zk}2#_j0sAx7SnQxf+)*z{@v!G(9I#cD}sLL^wbG;H+mz+s;yu0jalK|dsGEopfrxRz|GDRt2=V~!VR1<;(@Tbzip+7sCAywa;p5cPsZu@(A~;A*4xjC# zs9nsf5db3Aw+mBqAaAtAlq)jO%H|&;F_6qD5udhanj;HGiJkG?7LYXZDOsVA`yyqa zvA1awFaPY7L3_4>)eHU!H%f!M(h=4XC1`6(M%iEbsPWhnj!Uqx42w>GgN~M@_;|+- zsYis!c$n@jtXi!~>dW7c+-NFfAWD@Je=%2{VfD(R=VrdP#R~X!hi|MT=@{u5%xeDyEVMcG-R0C49jEGOR?0=gK1eVIIJ(`}lTp>{V>0e2>D8d8AR5_&>z}~~xu1Pr? zh`b-z^v6&_0YKrPoMU5qpCdEXL4aZfcg)ocEfjSW?dns!qg^V5MK?Vhx8imGP7b3A z2Pv%EMIG0e+AsgmRn@vJ#jYkdt+}rLB z@3IS^jwH`cQq!-#FvFkPm0TVagnmn}p#82hWh2s(j0;rqb5_Y4bxdrYyG$&1sj+Cy79$5(eD@<@H~ zdL}nEqvx?tGZD0TP|1>^uXLRNtEq zp7jzfX8={(yd!)u&$5V}rE^D1W`~_LmpMv@2?M6>2o$t7GJZZdvTWN!F7NWjdQI|y zW!sa8>xI$z946KUg2ls@;rFQkVpT30#`OjU#n@dNPAA>r?vlzrkc&D*=g)nq9xz z2U}sSS7ve_!;eg-n-BLT^;C{2`fpu~>k?0H5qk>ZRc7fdsV&9^3Oy9YybV0L|&8>yWR%o@K=$L&kF z0)t)gT>A;Ak%qGeg=MjDI-Ulmy-nzDw!)hzp<4^ zE@*PvXUxHIJm~bO$Fad#(L)Qql9~(~^V*^KId4ZoWQEalnwz@Pw+cm%S9iuIe<6Q6 z?%vLmL^M>9OZ-BUv@#79@v4?zV^DE$qArqR@R?P!Cc8*Th06isyZ!klER#B#wf}oD zFCKU59yNt%K&AQZ-n{`*n$Sr9nKb=ZHHOMTsNN-nQ4AO+V~mkcVX>Y*bv`P8AKFUL zvFT}Y=?)?Rcre4bxF?d_ASY~<*b!JIcy)T^N8E0yj!%ZvQ>xoKvHiCr4D}PLG$u0n znA2~-duE1%egXqAB;vRk&^v?C=?eGQn+Fc5r$^eXByMKG%I)`uyO3#{-~q5x>P1U(lQr z?nZ2HUs}h;7|Q`+)t6Xn77o%6lB}IB4?m*8a=(EK+5be%%MJ*Q?ImjMN~uy6GCjI3 zh0USKu5FZ@W|dVlFgFMrIv}fbti+e@{-Np>-L>mr_aHpZrHABldfAuI(wF-yk%m76 zb`Nz;J!QMvhY!rH96nHFo>YzzUBJ+eqQWyFBHqu{!DMih)<<0g?MKL=z{ca6r%u}sW5l1fO+GpS9OPeSrggp=TRB9+%Kl)8~=&wkP zVl7l*hA4hGnvCs*PcSMGNK{3b5-S5^eOk~f_Ohnim+<~I-IpLA_tu!v7XH${b;9*N zQJW{Tt*Hq`+ntMvX;@fK_bzBkWLi5Kr79zlrp6Lf{3*!j}iRh7al4tKkw9&Qom5!G7Hv)?) zUf+R{Ut5&Mza9bVBU}Q|`}RGMfH)e?f-lHOTYG z!t409NMOUoc6B{4A|6a_1(fvJcB|-ZEkt2k+BQ0TgEuXnWkE?vUdD}Fc_G)#j=_6^ zCxYPTXuo-YhDwG?4{R#V>yE|zqk`AQ#lqfo zl^_3yQLFRKk8HXEg2- z(?OQ9dxe9dpKOcoGGzBBlt=D(;02o9%Sd#2jQtd9O<8IrZ1rY>PT6Us_%dFt;xkga zAqJYSD19r`nt6!qDCfjwK1Nn%fDr{$nx6FA31`CH^cVoUK)ru@?~Grf9Rrx)Ngb-e ztUGugVXCS|6@jfwu8nBKVbN> z_Y-(5o|4|>_1&q=$Nv);&h9AS#u-5k<2z5vPrg|;%o>;r8ts5e4JqvF?`Rn!W4ot6 z-1FZxw6ZlmWcN;8>h6_?_k78g>sgW(cds9nbujS^7XVPDqI#2OtmGgygLq9F(T&C;E8tk)5l(E{@`MU z4ay4*D-cuWA4SW-ztmYT-AP6Ble4H3Hy|-g0c_IM;C0non??(QDKx=sb^zL z-3oyHc5Q`|O^P{q(B6%LSlR5KA(!BF`bfA3`B0VnIVZv6!TMbQ z_`fAVc(6o0p)>X0+1jDTekFlw^+%+xAwnU)t6Cef%c}dMz+*{&Zwt%fgE}PRc=~)y z%P@=-idUT+=YMs+-`abV!EcNAJ>Z&jov;qLU92wEyr`Wr8j0t1Vmp17c(>^LZKDqf zrrYrn<9ka<&VwhmlBKicQJg_5V%?~?uf@${XJmY^MEk!^k2Nc1x-nc8f9SWnmZBi37z3oB53N0T zXw?4=kiKyGZO!!G3m?;W-q*3j1%Cp(|BOra4`+pT*%1-sU0NSP{9n}nG_M(y9k+iD z-fm46W1B0{6lhMoS1ddJug5uepUofK*Sc^s0jvAcave)^i0Zp3V(cv>E-X$pUdyCJg9Kb6`tkv3M|1_6{_aPQMR~dpy6^|k%@Nv$q~Bg zfvBSrj!aCF{7=;WX|jR6=6E4`(R>*Z2RqA>_AA6coVBp9j4jH^l3W8(Y{pDAdRDYf z#rp36CGC8^2W^&KjwK8MG)wtYF~`rx$U%l{&d5{B#ZEl)!{f3zkHmdT<{B01|1Y^{r42_yRnqutk=Tw5tCSPJWg@<*awDJvD7XhzYM6EsKVE zC7O9=t=LbB*_ZVN5KkmJPvi|!&>y4X3eIDJogiuQ*#9KTKYUjM72c&w!tsH}(=9li zi{W6c+!HvyP<4jNy!_feFzE8_i6He__oK%<>Ll1|v6}CvRJi8ENOGhFeZFfLI2-e1 zRw`^H|4XyWK?}*UZ)uN=MJq;RiIrk$K{+*G>VlYb5k$WQcAas&Kx7RTie~H zccyY5(OX{8kWRGOMPs*9UZ*_&w3#V6BSZKuiMoLvKvE==uy{luf_(KLwfaX(~iHfz7COR1BK{#hJ0@J1;skzrlb! z@_nlDig#w#&B!b+|2n9&Yu^e*4#Xi&C1j_2A6n(nbVQEF(iI70=wuDhZW#Lh>Csipo=O*3+4HR>BpsS zfyiZc1<@2M5}Do@rc(*;bELj$`=$~;=|)BNF4TOJ>kQdrC|nUorUvA$l~g`V{Fpsb z=sJ-^{yHuUgePYGTiO1bL{GgTKgI?bIuoADyy8i|3D75;i^TK0DiHC9-R(U@ zVymPvZeW=nEo7k`JM3MiCvZd z=QGsjo%eNT>G)0eQ~zo`J-s!L!zX*y-1L=Lqm2fy2O>|GW_v;O(C>j$X|Nw2bOI?A^CZ0pg5- z2APs;B8{yitWI`So^;&@y(DPYzkkg1Dqub04e5+ImgGQpX$4XX;P7$%+&l>sL=Ylv zq@0^Q4H@N?Y^#+tHBS1hl;_obK+DZ;j<=-5Lp=QyoObmr`=GKik2$}@d4bSz-fdmL zS@!0!yMAA=^$d_<5788ysodeOiroB|IJ_P1Pdet+8Cf4@wP32fQNmIA&CniQ)ct`NTDS>OT&&>OCgrdE{=WQNWZyRxA8PG7 zLww}-VoH&oD4eY+v|{=rM^A71hkvTettMQf4fyp<=dl#RqJ~2z%j&un^bq?`GvI$Y zQE$F~zO90sYhOx#xfqkx)q+d-{Zs2O-h8<4se>pKg2fVfzW0(t5m8)V>ub0vjzls!Fw19Q@<=5_oCg>w+!VX;7 zgh42RFbV?5gs}3EFhalt2@}T?ug{p17NJkRG9o~OpPto>#zDTwUu-95$>@3k}HD_E47Qj`;V^pGb!<9B_K*>7zPT$wEI?MEb zk=HD~gp`L|ULJ3_v5k!q{)f#XO0kF+)f%e@cCA7Yo8OH{qG5^um4LabJxvRD)vxGP zmhy1;FLME+^6(F-OTe2e(tW=Nd|9`e`?1z$QTUF;+hS1Ch%Ud zLpQZ)UJBR$KoGNINw4u^^iYltn7P)m??D@yr4B58kbJ~hUE>Qvz2Mh@8(^xZ`A@tO z2WqgGr1-Vq1UVl^Rp%gk9Da;#;A^lNnv;C5UW9;Gb|g;@W~Z1JKa^QfX){#Qv&^6c zMe!a9=Hs{zy#9AGqY7j}CM?Lpv~qym8kNUbpESb-aWp9+3o^6dUTUu7LI*YRHqPjS zgpUl8W&#P_9XMBm$E2dMpIPF-8nB3efhMw?D&Gi!T&d>SKtVnpl1cyx{Jgq!Y0Ge7 zRbAcJLG0<}W}8#f2lT8iay2(Nci%n>A^)T|Nd^)BCo1Bc5b)`!Uf0VO_qKN-jafg- z&3|BgM;)5Q+m!ktRT>mxqQV_$JZTKDmVJd=dbB_5hNkV=h{C>-p3LdX+N=7f0*Yd^ zKgjH%^UldcE&of%7Uosq+Yq=c0gV9$+(PHbz{cgS$|;DfM{&YH)RudG6zY~kKH^@* z@#{$D^LL#ij#3R@7v_KDv~oI}JLx(+d}7rJa+~)MibbIf!?b^P1~GvwECSOxA$_TT z@Rl;FD)dlCiZ0BlmD=jo&wLNi(?4BGiONc-5rO+}wvIwP`e$o_-b+U?fjJa4^(Xm# zyPz_X?|A_;7dq{%`Ukh5WXAMg=s*f@6%?Q?N`T6ilf4JyXJo*Cv!WIj%P7CI27Oln z1t_mU*)I)LAyaPlzMMJzN|qmF8UEzU3#!x}d8iM83s^v_pM2c0paT6<5{9ZuZ(#R9 zChK1m#G2U>2LN~57|g2|LtGA;KhZmIa)c@)RgOQB27E^lCR}kvMU8+gd?zsL~Ehhr&D9vdp^EIIHtl4{;F6?awC>j-f9jp>+cz z?i5eCPlC2Dz?Hjq=SV|`&Wn#RB6WOEfZm3mPq&btl44+{-(!5wr2vFfJP59ahVzxi zLalq&W6eLi6OJ=r!D|e)JOn8j29_w}_pIlLRqZjZ`kB>gI;st#+!6L`2r)ZUAA6sW zEf}~ENxo9efU{2uYFoP7eRIRzZd&8x_40Gu1t`9_FNFy`W~v{(*~RboGyZ65PdM%6 zlM|@O`d^jaO6JO!21Of|HzTlgu;ouJ0>>8MB8ReoAs(!(sa@SV+H z>3VWq?^ND>y=I_$QEhL0V#AhpyE(tfd@oL0*=)misaczUk>_f5;m!U73w85fd z=a$iTvWQrsagsiHaq){b(J|Pd^S(=2+k(Y)jlC&TQMNjO3?>;lz_#2IO@%82qf)|)1EbG2IJc{+X-=J_ z(W!A$BSX+7mYFk|aH9O@owComXH}jtc7mX8{Cu8???f3Ztkyyr5MI}+Ejp}0<_yn- z`l@(r=}9v&NK~NYi;J995>V{Wb^Dfl_26JaEwofHNy~*$5Ju|lp4ofisqfp&0Vboj zv15eYl|WE@d%%BY1s1Uz-1b}SrdOtE4I8#|AATQ1jaQU~gm^@fG7dRSD6Zg!cStKJ<-pOzM7Mn%gmV*$n@&R~>&u}GwrQHqr|=)hL=@$WBA##F56ZtlKf zJ`iVT>mx*y8#WqI%LCf=S8eG=QPut3%<9#ql>JtOk1|w55_M;wUJb!9DNe|4*x?Lg z)~Q3k<&)a!E{_N1Je+!szOW}g1k&WBzIMV%WTM#1U%>!O;AB3053>huhr@@L5d)Fo;Y0npPXhw{ib7qp9bmHMo?d;{eE(8b$sH&^ap9 zv5w%k@fWws(p6_n;P3F5$PQDZ!VF*y19~Dnt<_fB%QsNQCyfHf^pP>7!d2y?GF$4c z-lX&-)&WsOS=C+-=|$87I~Fw3BV+6~dJ5moRxwuAJqB5b<;FOQ%k-(f74+rWk^b1b zaChBY9;yD??u}C_a%?iFm6z*EdwjMABozmJ)|qtz8tZvr1$5Cofx>QPQv1J@n?U6n5b9Z{7*)tU@npAx?* zjA8Tn+uL>;+NVVWZ<|@QEDPXlIikv?yhl|xg8UQc$0KMQOy)X;hF`!8}p^Eg$-#C!om$?y7n zG1WbYz9KYhgCC*(99S*%JjFU&Fa2v1>yUT?8ZO?Ra5&Gev9vB4y!sP=(N8z%Pa9rTf_-q*k zxO?2LyGut$XLD6(H^-sNWy#(IUL;h$NHk5wMNe7d!N;fK&vNY*P9EmBwx~)NPC$=2 zdvsSA9j_zHna6g#To%$Ep?Fi)+~w9+5vpJ%%Z8{e!EssHHjmKpGT3FbEmeG`&P19( zzb}Wl%;+Hk7OlQj%jdwCBB4R)1#86NX*8E2`xQD6xmC~VW&OL=$MR#XE6$?tWLnBa zRvpbXhlox2J|QflSkRV{IR~0=zKL=dG4!`{*G~InOy(*cf6lxE3iel;TlLj{^#vxg zGk{;Lx7lJEe!SPIeN9_cpF$^u8pPz&5YvY`?`AY89O8q=qxq4Mb)8w@S-@u{Hpou5 z*c_;9A|WcdTmy(tyb4yp#8x_MMdSYBPrr2Zi2?5jh{pCIsuR&6`MxF3l4{J@|NXSL zCi_O#1W;82&_t6%mN3WZ4S-iWd5Tv2`^Yq82dCrL*OWFVV)CzgcjnF>kdnpz4?wx? z15V9!v&wsj8mnZC1l5Vz!7HM#?N&=*hdm!+B~@6#+3#)`NZG`iWwy8O8ADMopB)BN z2wyXC7SJtd-N|g5WTD3KW zZB*UZpH;F_(OT!VBSPryUxAQ8{gNQ9jlGcI(!ii%2WPPvy^1gnxTkw8oBI}4B#=lT z=EK5lW7d#vDrasM{fBY1{4t82zWOe#BWQ-`W*ACJgWgy8Q!(UB$TDr&DgtL&}ILiHvvitAf6rg{oZNGFc4TLEGq0JYsIr1u?BA72v-j+s@aX{* zy#eWVJh0@*@vsR1B=7xG#M5h&ND(!I%eZU^x@o2#4@|@IL%~{Dqmt5wqJZn>R)wH> za%izy(3h`4NylfpIy+Xs8y$AWlj6da2K?m|g_gjb{>8|kIy~)7f6)kdsM-uT4UBn9 z{7yaUV511R3IO>naT|}!3Wzy#*>54TVdP(qiefhzo;Mj|pR+@PWZ25LwOd(qFEc$@#2(Ggh!i)1|ExzVzcx9>@#CJ!M5(L z=3Aj!?~>d1AI_#Ibz6!GIpwLfj`R*-OKRQ^nH4k#d%7&hi>p6xQ77byH z6HcpDChALgBQf_(jYFKrB~c_h_x-KA^+nwrrI#UNm)cA^^J|k~`@5l?`H_-T2U6Rhx8wnbX%=*KoI>pC-=pFR<(=NfS)@ew4MxzZO z_zW~ZDb~rkls2y&DFP>w_z``cGj=VG7WzD=HLt0^M=|w5DNPedVhbS!+Gx_i+9U0t zBaa?0clH1|iYi0grVC0@g~MOkc-ushhl~K*3lx-LsZQcRdXXs^`f!>{(<21$4*JU4 zAKXivV1)OD##f$sXx=e`qdpBEbXn;?@8!hnFwN-$?kNNQYE8uCg^UMRl@9?|iEDlH zbmm1t%#}GljK)p9=elBc1yzhjQ{`VVYNY3xz~6R*mHQw3>z$XG)L8WlnYf(qw+{}{ z*Q8YiT+Qu?EI9icrnSOn-_LI603bdW+*n3G5n<*|8Ln^+7ImrdL5hO+kU+xG1a1GQ z52xd|KRdN&wyE}pbSWSsXbS=`&WqR>zQqVi+rYHc`WFOcZr*mFC3bsqXvKJMRLSpu zq^8T)CnCADxCtWEFpUQzOLr4%_thjo421SW`Em3|<~16(M3sYti2_3s1! zHnhb*RxLArfW?x-x=QSQ&H3(>CzvQ`z!4iZo0p4#xp+6p4cfx91y~but+6}nPzdz( z%xTQG%%n9B)%wm(a#ey3NZytZ^+jh`U*_|$S-9PAyy3wUvzXfEg~{q1#}OxQR&95G z-XTt$)TOT0y>Hy&6am+{F9djq(KB>vcc=L%KjmzarKzvRt|x=AMd%R_@nxBWc*Er6 zc@l{StTS#hf@;vA`t7f*(SDJA)(XR)2Iq1}!D;kE4Q~lnXOFRwPJKa_ zBMncg)TA)NA76_A_@;S}4xR|Maoo;ZL9*Avnte(azmOC&llRd%k!Eum?~U7j_??ur zN2;xh%UjS4=@G{gx`rL-ZqV;LUh)HorVXC7Ymh)ZXk;ibNhD>N&*3jNu}CJpplxP3 zUrFWSu7!~s2rW;A`XQcZ%}_~CaLuTMq$W9?)C^e50Yv=av$2!2k<7jUEr5mEw8vJu#Z$WU+ z?o~Y|;URH|exk3-XqP>LreR|hZP@W-6JFL)T$ul$KkIf5OJGUE{O_5_sTrA}72N{T zhu?g^2ma)S1Je{gkK!mH)H5lEBOgAG#-}9X<4C9sAb<0st86Oo2a@y=oO0sJJGEtG zhSDVID=MDACfNfQS}t;?tff*>MW&PtO5V+ks&Ox--k@k_w~IBMlMY$C7LwvG@HXKd zWf$40D6NWIUt2T>QANLC?kY?ryaSi~NdkCipKGBv; zwJLXyfv?MTQGe1_q~2hsQopWTu-k0lApI`i3aWZ8d}~EPNZ!-DC8DZ!9&Gy9+(eYaf-H%(23>J^&VQxEqR*wx3{6X9RX zH)9K+!=n=bpe8XrZbd_vmBgf@7yJ3bzT%F8;x#>sM*D zEfK?5&U=Y7JSNYs3;FL#L`gIvgsq{AJzk$A-yPGl7j=L0TbJY7L9N0coIm^2Nrt&t zXFs4YJVid3^-;UG!O78EGsF$9rV<;ktsEh4zpzj=XKjio@NL(1t!@Md5+afqmI-Mp zt0G)~;8?bs%_SQVGn9^79W$0>*Ji;V`@zymal+jDeaq(Hd_}{;%3^;X=x^rwY_Tn6 z0MPE3$wVEAF$TQtZ3rgmSI)p)U z=13lle@UTczb`e;TS>2~a4#6ssYV+hOISJThUA}LFlh0!r~C8Lx>_t--M)iv6DWG6 zba%o5F9uR>WDFP-(hM9^5)ZY_c2ceb{@{z~u7KQ~E^Xd`#$`dKU#cc|z&tAFm@pQG zUPD_N9@xho_Ne(p@HtqURU>56gfi!1M(P(@a2g5b3cys_uSps5*iGr@@Fc0j(0gSZ zq>L<;$aQV07k!Mm*iXs2{h%A>%>$dACDp7x;Y*~tC>0T_-em@`){%|LevpNSoNf^e z8;v$KBk*}4ksN#)c@ht~#R0$62O%pGCuv_2TO*&xOLlaoR+#+#6=@=p_l@8!8fdEW zYE3LjTVWBDBzrT*wK-q!&y(NgD+QMHeSB^jtc%~BJPDgJisECnd^g8F`z70rnFQS+ zT_wy^qz_|b6*!K+!bK}4od11%*Z`K<+Vs~o%fd%WU zvF1Hp$N518r6a=w*e$yvtytTY&q(h>Y zWsgJnj&RC6x%c*Jp{fc{<>ZWF`|qcVPRGtQ0im?-mN}NUDFurUP(V7?U?Cl|kmWbN zd0`a-f|??D1lB;Eq^K_Gxc57uon_z6EYq(t6(0JFwYi(43f_%f>m2v1GHl>Q%o0xv zH1Km;OALViB@O^85^f^Y5N@*8DtrDS&|F6&P?3R?Q((x(ejLwWn89GkOQYz`8gOzA z%++KKocoW+`Gut}=80v!mm78#-cPY$A>&lOM0g;NlF8RPo92Ol$8f0)6?jj`8gy zZyQ_kbaP9OHG#SHi=*BF1lli-=f&4u?|{A^f5VFS2R}L|`u}p-RIwMniawdA*!U@c z5Bfz;nhNM}`^D1{#}9mQC#%`t^$#m@8yz}$vFFbVuq}aY-`i7?{^{AKC&Cgi7@JX; z-*EH|`n{b}1jv3ebF#e#*{@Z0BKtyuQ-~>&5edZX&qediR4|225)atbg zBP`pK3Nq)#Jc^T9>VR!y!A$1Op+qQOX}Cc)Js664-yCC}$mIM5^H_ogdv&-PrL!cd zc@Y1R{j&-tR5kul&xj!{LkwSU07(iPG1#hja}MW}ugxu&50uM9uZ=@F27mR3gc$=~ zzL#ODN{2VL&07S8?V!OwUhXrfJgfa>iup~#6%>|gc{z6wi2d+9Da^a=a^$m7I6oNT z^lvcArCh9?3hK#l2hVC3@$V1(ShzS>NLZOo8cfm|mlB_NXt#rtren5`BP5pm&O_}z zknN->$etuSoDbh)*0(?09)r}j^5L~NJ|^e^+={V?x0+6+5@-%>5v|1ofus)=Li011 ztWI4}jub+DqZpunj$<$uJH1n$a%Y0lQFr8nj~{Le#0T%@E;ZvC4Bg%6zV_s?f5H2w zBWuO`An$>;x&P25<5Yd&5&CMG-#rlVUjLTT{<4QkwClAwZRU09=^NwctXC^)GOf@K zB->i#R5+F9dBjBBtui3}PV%^X=)c^RGFW3Qqn;IQ2LhAdb}pO|0hT-e7s-%q`?|B! z%6>P}pQ}4bw>|DT#jCv0Nps*oy^fj69DW#f=b=}FJ+Sec-<-I$y%L0Nrz!Y6L^a=L zNQ0)FsNm5fh7J)qL8mr@u4J~bTNh-mHDHQ$EuV1Fe1QK#MI^?k{)***Nlm40QeDXtMtVJpJ-^}DuB$GEu3 z2mRABIYz2)mz1xgM*;?y^ikoqHw2O)@Z41e-UFRNZR8(X$zL1KxZQ1V)2fku_zKFN zdLu45zX5JqyS4|le~nA3(RABpJR;zLaxr=luKLnYFS23LJE+TngyUt7vbB}u2{AfG{BjI zg_!VMAQi)z(jfGAe2x*MCsMvp5Y6dd3J6Vz)+rt$kv%B`XSE96$Fj3184kNY{gkL; zucz06sf&P}=3z=P(qG?ZRLi+SIex}se`Csfc>0ZY{Vvk7_do1mZ zD5&MzZO^U+ZrGW~>qCpIUIai_T()53Q19SZCK(RHkxb}Dld>cWM8wiDIY#mvJ+Nam+`W}LEO94qM99g#`O^2YI7+A{COa4cy7#GAAvX`}H2|=-~ zc6LTt4B10mG?3=*sgDY!Qjhw>%8E;L94!KBv~G#xNwIMze#-$%nK}|~p*L9nQ9h?_ zw1zr`YJPGcEJ#Dm9Xky7=o4fvnpyZ4w(i^<&T~NM4o_4Hb z70eG*7(OcNyXT6bw7e{37TlE-|0k}mG`lRlHbe#2Jz_QtQ9B+x2Iwm=p9rZhnQh&7;^pmZv-|yCHq=>HT;T z!pI%Neg`&IU1O0XiK`qj{4ZPlE>30wB}R)!>{Q@H9V}2Z6G02Xo~#+t4W$$0q0^O) z%mBTEq`jGUy6FFJLw_lNF3$P)@KrX>MjVvD-`-FFPr5lY2i9gS57bv_30g($%kv4` zH?-g;)xq_Ls0;jWVj46ZW-8|%x-^Iu!ANLsX|^QzAn8Xmd(h0tdK~Rdag+7$@*Im|^;w@(%d+GD(=+W9c3| zf};2zKS!J(CS3PwsY74r_=t#$$~o+PoL&_BO>0OheeYq27Jutz2$-AEBYt#wzMSlT z2A$P&RpiX}sb4E}=@}@w!cCUaLzAezYbLXI6O9b)j{Z}_McT=;I09Ct4*H)NSRkce z^kiN2IPgldAs#18_c% zk5zx~*)GpHPxf$brU1r|zPptWY+WrUTjPjBntcM_=A=BKRfbCEKdrN~puC3|8NK`+ zn`HfOmXSdSnQ(P*BkB`02E}dlc+@{&k4x$TlU6sl1vLuG2NXU~t2wof8*?n5pA^7H zupc+abzcgjDsTSljop|3sGIzL?)dvWRHmBQQ_pbkOk}JKE>Mt*Gw;iDu~WfvnDNtc z?lXsK+<|8*$Bsh)y8M=NP{%uGHt3{BeQs`U_eO_TwHgxvTA1XFxVVMgw{Q8MyrEQL zAe!PCCVSF1$-yXqd@N;^c$0Nfhe}Y-h&Glm*!D>g3?70#YjvZL*(0d`i`(GP>|*1L z{D0#VsBshd`1tG$0DBvZiHzBx{PB(pmeBH=N?st;;cHRO{dm8YnohA-(F_FTkkjTp zP+!{f=V4DUY{l=1$fv8jJK)Fv&4^?A2Q2Vci{qsr7w9eGBaeAQ(@z>ugO<5L$Yaag zEfS&fTp$LhFS2d%IC#B^6XX@;_-t}V1g}`|zX1vhe!z}*;m0^Z7IVKXaoe;)xk)j3 zF()gwkl)D^wJ1;T`gaad0RQth$6r5&xN)qmuZ#R2=>jWFaGlim_E@%Xb%D1MEIjIy zkOm9x$6>^D%CtTqs<#jdO7R&68(JWrv~hyo#P>#$6f-i;DIGPb3*OE-pO^B#1tx`z zj#xA!z(q>GS;9x!q%Ob!%~AfGLEpPJ;@44xSMc9w1ko0z9?ipG32>TBQF@Oa@_q;* zC&;c3e$qD8@7yBTO;V<)ONyV<&>Y$p@g9PX_y5SvrlTr@b2+k+nTR$+%w>ug-ehbL z;RC_m*tL(=3jJXTk1lSw=c+}c`9HlRF@R`%`Mz2}_ig_R0*Lz|Xp#=@kGGiSM(aq?H?RDs3RP!}w@lR(8C~25+nWp*rHQD*QP0knP^QYgcgjfzwzXpZ-}jkYKl$N znhDm#y0&A0N=8A^gGwlX(p3l>t^wTv)MG|rl1?l|!{7yl(0RHWE5`=ZC2@Kv#Y%@| zacv|%C_xDy%TDOwm>z-6O1Q&RQImTG#l!J1$F57$+p= z*LUPOmLVqR?tgv`p12CMTjv~@)<9gDiM-l*IJ;RV!4P`IP)HBW(10Udi zgElMg4;)F(;G~{5k@iIT-d|)8Nq!E1_kWYBno&PbC~^>B8gPW7RAjDR!aLX+DCTeK!i z=E0dRQ2x>&GF;Dof#tLw`=BrrNZ=b~i4J5|%kLsa1MR5vAxPG@=YpC#zp{=MiV5%L z8b|*!!z-qv@v`v zcf0J<5Zp>=ZfFSd$q)$$@1#x12U&)0X!_yAO)E$thj`Ss(63Y8=(jW`%9&|hFq_jM zr~PrJH&~M{4bb`3kv2r8poT6aObuSKiZ#?aErs}#WJQmLq{8vq7Xr|%G)eZZ|DF62 zSU%|qlM@8#@s7)R{Nz(kq*tST{dbM>u?5#%@a$`CJ7`>Bl*v2@$t$$JI=-+oL>o_8 z0y{*F?w_Bm`j^8y88k>=@N50D9k2X0N0bv@(K-fU*9A6#XV`>zXvgx8nS{1sk$q_< z9#C@6EW9oLc1p-c#B?lXn4l(cL9F#dylEl_<|l1|QyL|cT*R8A!{c5;G97&@=AnvJ z?Gg=dCSr8=zZ=!MY1_F6Zh!o?84;4BVU5<$un=Yq@Hn!n4SV~!?rC@V`^7}Y2le?11%kwo6)BpK$mP)jt-r^ab53oci zhDsI|_P$VHkE&_5i0>rpzgT9(-0yWGRk`Xk#C#m0@SKqC7Rrv*zLsD2W+M3ayN6gX zRvtotNaPUu(|$+hMap$2(8{qneA(rOmSK$`;7S8m=DoM>}fh5jxx?!LZphcz@DkVQ*T_O#f|~({0!-XE!Mm(I>wz09V=Z}x#C0j8ZQSo_)8@sE!2^Jf zqSzHuB2M2zRG>8X=Ln3nNQ1$y?K;Q(Kn~PpK@mFd>q)jIRY8T`i7&X1<*ORyPFTiv zcCrx>D($u0DX%v9*n9l?La}h;wKu`79)^U{F}joyzk@Rk&_)bgICCHIO?JRNN;DXI zr92My51v9~woRX<3JcC8l$Ws7<>b@tFkr(EWgX4p?FAu23kg0-QJ}@xXHFe7EZYg@ zs?g!J8n9(5m1*Y=X$tgr9d#bv6IukiBrvgM ze|DoYAEPR*79!SHqH>cGCN+4VdigV-?oK)!K0XyL4h|w3>N{iOfL7IIp4Jfc&zu|% z`E5K4b6g(q_pbTZ<1Q-sce3PBD2wm9^pk}#hnY2hcW#DrAO-OlxtWRL%FWRH357SV+*zN6Tub%S}<_&t;e3w2P*# zlGjkOG17C1U;E8TAJhNRbCDN%cXdpvXR7eC1lpXhvZ9}mEi9CTEw?v2h-<1+Y#8bK z*Wa0ttN+cK`bH`;l|MP5q^hhOrSkj=TQo!jMWRh6U{3f{QUGF{5W``Rqa*7?xxOTR zw~-g&^Cgij9u5uCctlU<1Qk+OSH>G&F|mtwvY%gc{4%KT4z`og2P*+pToTwW{sXPE zV-FAfep{IgK84E4nlgS4*B>0HxpM%Ga2Dg!?P3L774WUqSD<$KX|3Si1YU*gB${q= z3&KDojSq?z`4rJLB({vB+<}x6boaa9u%2UVTzF7HEvY$a7M=DXYyLVLcUw>oOPI{7 zru_LgjOV}D(U9yQhVj{18Yv_V`h;VPPYK6mKF#@}{%ZUzo69Ed!z(eXis(D0w59Yv z)QODhd`kgQ*JMGEls?9R3h@2AVhg%&@vx9>#cYw9`gWQ4xe| zha!TUg4GBDV4Z!-6F6vP2Qw)aF|i4_xaw%b3lep&-gVg<=@-JnaZp8hdDH3c4@D40 zG7Q#Hzq zMeX?1q(MIZZFZl!NLzsHJhtrZ)qqR6ReNIMfv~@$hl$y+P~w9hCXFis6g2x?&kO+> zy`&&1)YV?(w>np9qIIqTZM^x z-t<8(*hZ2+sMku))YQz(48llIHm8M|%T%+qWo$omeK2*>;~96iJ6oa{|M8BflbMa{CsrSX#!ct8;+*SK&y;?q zmU6TApVaF%E8Xn4T<=_s87a~;^l$swmMmOJUYIcr<}zwHHOfw0xN=8^k{B%FAe)dy z{SznU=@;{!9_v{28$xBy%`YI-IY`RAfq5QL-n zw)Wp-0AM|=Oxntm3F#WGi_r=d?Lz|p71t37Y>N0CN}s^u6>pc*fAgWxUnKr`@VS|< zb}FLC`|e?Dl*>z#mHv1ssKd9e-qqgS&UJqLCIO<}J4pfzuISZre5*0~H%tGm(2CI> zRo>E@U*#E5l(s|q{O@+mCu9_q+_qE-ohFe#yWh=%Um{F3h0u~qm5NUW2MQD0BMTpd@7U_X`uEt}>mu8lw;fe3AQ zGF8lJ8<8p2;YLO(g!Ja>s4Slp!FBiMbh+Vc%Ha&^%%>}##~bSt)uZ(a(4RWfAu4N~ zIGV#8xGBV15?dcWABTmWw{Wu0(pyk0AP-v^2B&F-mLv;VA*nP?r>V-ClPX|oONIh= z{=NB`1P)Nevvv6R*S}Lml;1vyd9~DIs8@Hep!n>i)w^77O9NtxN(?mEwS_3F;2~Imbjtj} zkaSel%dIC*~oY@`NuH^xjg~)^bR&ymZ^Kl(He#%kKwmCLU)GDi$=9U zarug3)MRJ##*{0viq^y`(s)69%;H14#l#y{>RY!E| zmQr<5JA>GwJ2UHfHnnCiP{`lJ?SJO5}A2x?YE?8`qbs^Yx-G?ov`6ccaRh?W~hr;%W1Y!{hwM#=V z&Y{$ zlQJDgr}ov8X7A*@dSE7ry0)(g^w|=CzJ|MLEcm508YQgxmz2&b>-B94ug5~T?y~zd z*I#Qk-9{#9h6dRo29mL6IV6w}9Q3(kpcP(Tt@b9d!gu*d_xm^ZvZoCE?*VU55jOmeL9}LUFb`|1ky7L| zio){uUC}lt!mSMXJ{xW4Zw|68mvdT~;q}W6s^8ujyAW=*is+P5W27sr=jRH1%zxQi zp}aQwr;s}vpci~EIOXBLWYc(jrS->ZE7-dQ@3!Hq%ByqJ-!=cNaSGs?Q_K(K$ zdgtCA4K)L;gqq`<&bSSL^w&w3FDQ#gE$kqAsg@yUC z>r;bsN@T>YBFB#!czv%WjJ8L^H|!hhKcQBB6B#&A9YJwi-3F+=03KqG0-|@vKOJ)_ z4eG#P=VX^--p+R)HMb^VkcehyY?R zLCK-00!pl+`m z`p;_+uaroQltqR1sODKK?f1$Bj-tPw9Da79!}Lx@_DRM(6d_P}NG~jSgx71kW!u~^yO)E>Vq)3@~!=o@>-%JUMIq$J8$ts;XUu5&2i@-+8Zf43?fX6 zYAbiIsm6&mqQV|3DQ4YKao+(LyWRH~wd{%{i!6Obt7n4VdN5GK3)0Me5x^{eE*hs5 z>L&n->qH$uN!j{J0@;`B?KM1m)D}Q_^XUy(ixjMLuttuU4Qb?07{cC;I!oz!b8CV( zd)H~iW2{v%9s!Rw=T8;iG8k&vRL0l7e{cQwa^}PQV?ga6TcVkKk)#2>X&=M4k4If| z0M=S)=(p>2$dij1%KM&u1#z~9Q~C@;HMwQacse@*vpGc2GGoME+K)LDsGJZbD^oSL zsa9YUJ_gay`|8VfO>moZ16lEEPIw?U34DD@ZpvBVI*fJb;$Mq;y>0Z62`4*E3#N$l zMfRTzP3@Bo4{Yf3J_$4P@z)?Fm)Ig#CHWHuAZuN~tN%O!eH&f3f_MA8;I*O(#Uq-x zcD+RDx-6w%=$iLM=lzD)0r_=j0u(}G+wSt;-WiGwhWq#?rXOic#?xu0_=bd5CF^_I z0<=irG@Px+fTCutc-3W=p;z~B_IKlLnc$5tQ<%Q)7mJ0$_tg@t6Hf_w2Ce>h8U5f7@uEd~uRhnfE(5mpJ%x;O(Bbn9={{v-#BoXF2BbHm&B>69RTu4tFQjTe{z z%N2g5d7$gr2J&O7S5pxw)(aTxaxCg=Ie*gM`{9$7wub$h(0LtLb38hGlf6*oQ(9)( zX6vSWTUnE-tJP3iX;8zWv-*oJM46o-O@4AOC$5JVoMMk3YY29pM0>k~A~}?khDA}1 ziU1dt`duOpo}8Sjw`y-*?d?68(MH1pJYB2SS|^2NuFrX^PD1mAz(Kdq#q~w@m%U*z zl5&I4MYAbuDwbnpQ?D<^Zc3G8x=@0U5`GU|D3Gmp5AmVi0<=ho36Y(3a zq51|>hZ=60H!pty>{YI(Ylq%AbMI+(?7q}!!)06H_a$p~3ac+(EhMfM^j_z7aQ~E8 zbX8N+S)Ht`S#oh&&6R;qfH?`*>PuTQA8hsnIA`S7pe6xY1@UC^>C(cfc8uX=_N>|P zJ~G1_Zq@ahv3J53L^|)~F?`NkmL4WYUHWaFk?nXr`1;8qh9m-BlG1b`Q9`j;h!^aFitmnnn7kTOC}_fW|jxl3GZwJr$D5)@ggYaISv3Mx7u(jr@2c%2P{;Y*g1g|ZHM_Fke zj)I^MsNfMvI`s4{EB01YWsLM6Y3$lVT&=9b>+G$p%MB(_r9>YRB8bYHH2LH#U2=rR z+simL)^FXKqkn{8S$>Qk-^_8f-YZC+7}5DzY-pIFR=0h)hZMoG-*1qIt1BwfVW%N? z)M6-2iJ147?zC4dVVTpZ#%SVpMW55eSg&2iZM?orL z(Y+r)l@c}no8^T2V+KA5bB=h6zlFq62GBsatr~0?)nF$DKV|&k%U3K2EyDmcOvRn& z1GwoOEEy94^9nz+IvA2P7-;Mp+z54?g~Kc~ZxmP6Z8#heWbr5n{sZyO(AUj;>&Z+~ z=P1_n!=qpS;`w8jIOB@k4W$7Dpva&UwNY=SZdf=|O(fxn>D5pAqax^AxPVO0U3cLqy)26Uy-{_UE-YLe-f+%zb~9IOJR(_3oJ=^2YW1V$0f}QFM6iL zQ0{B4a28x(lf-1_z?4)-B@5`+^{GyCEefO^E$=@aN+0|r2>MAw!^l$PsSO^?&aP(+ zOAjFM{@W))JcyVd;PaHp$9vFq?6MuUAg}sSRM^>H>7L_+tZ3itfS7YJE6c&tPS9@4 zXK_I@mp`vJ()`yOZuSL0#FfinurHg=MMS{=7GD_-P| z(7C|*v_Xzlha8JG>7zVAzt8~Qrw+q~=rb`dwt3TB9*?Ao_uDd{3KK4!dkour zTxb68ky?4WmcKkSzOgnmE%IHXWW!A}i=j#Hg;_ry2XnN{PD@&e2L(c%jn|=}oT4`| zB_dZ~=lRb!$T;`2`g<6vwCx>Wg|jVfNrK}vRro`!tO|9x%!=$6%^OW7PjS7$_<^R) z1L-=MucWpm+}p2=(7A9X)bolN@NZ|pD~BJ?JYX#QoV+EDaQ=Y4hBeOLW7$L_UqyXlAH+|7yB zA4H#mq_>qE7*fxHs|LTKU$ZcK9q_@{KTC>hq?5c-7(=Z!70Vi?4cF@Tf`Vn97F^RAu5*IZ2K3L3b;^=KH< zl***CA>Q;y@oFqP_BRv!^k-TcJj`$Bx>Xxt)#~Lp@v}i{-iZ+J1CEr90YmGXnrcE` zF6}2cpp=3om8p5Cd%g}iw@OPf9@*B$z}^rY;ITk+w%u3$k5=;2w#gY1ud`lfwAxAn)~fKEp~e40FdUW|9icrZ!qp;XuAwaN0Qw!St^5 zp9;2mIF-&*ISssiu=)ww5pT_813~_L17NorO@V!+;3zzOX^@qit~Kkz#e*dx0JA7gf1)CukPiwCm zZ77?DM^DH=~0qH9>#~;ojIHfzSeQ8w*pF6@SXRqSRJ62|iFZjv?WHsijf>aKmXS<@mQ5&z|RZ&sey1YHfe>eeI zv;WgmIjRb?OZXc_IJnzU5+V9%I~?Fl^gIp+(9RmZ3RmR9N!gQOP-R>yqBW-RsZzair+! z`Ds>-DM+ofqliPPL!a{otC zbDdpl)dSaktNdoF5^KUmR#$`K->{C-(%QFG`=zL=u{^Ldl+<~Hfo-&2k-jL;cVo*@ zDVLjC&~RhO%xJ9(u9v^cwLBLGJro*eYijs_xjHu*pdRCRBW}Z3A;uq8X--@Sx`o zveBX&zgAea!Z+QE4Fx{Ww>Fba0yE`spxJr?mLy(fX(1hm&4LPQR5&l8GWy`J@n1T- z?Hzrok@fnccJiuH;1$8UCZwjh%#VVSjWKF$lH)qQ1iM&3IPi#=6+LMhQp}V}71CH1 zqilXG7OmBvQfqdAA~$9_2_$YNmu

y(uC$J9{K|TwGKr7rDXQs1zUcBiWQ7zB@Yy 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 AK>z>% literal 0 HcmV?d00001 diff --git a/Doc/using/mac_installer_09_custom_install_free_threaded.png b/Doc/using/mac_installer_09_custom_install_free_threaded.png new file mode 100644 index 0000000000000000000000000000000000000000..0f69c55eddb228bac62345bded45b539003af6ea GIT binary patch literal 192812 zcmb5V^K)j;^FDmXwry?hm>U}#TN~T9ZQHxCZQD*Zwr%s9&+GmC15Z_-^TX8inVvp# z^>kHV9WE~`jsS}b3jhERBqc-?0RS*!002}E8uEL@K^Lk90DuiP7Z#Q`H#7tQ+*T`7 zT;-KcaEG=W=Y)m)0HBIOwgFC{5-_}e0Zz!taq^%fLvh3gYAM>ijl`q@#-eJ1=)bi= zG-xq_VFvwOf|wA_+Q6`g1HuQ&^NsYk;q2Dwblc4>o;$CrryTySbR<9ai9`vJ5=enA zb;@W2I3tSUf;x#nfnGky?cTIuhB!L|gFL`|^Q&BED-5(=+u?N~*1PQ-vJvJrNSt02 z3pm8PSJYYULpVeH7{CrY@P#LRAI??3f^HCUK>a4TzWe5kA?qgjX1_Z9d6_s00c3=g zP%Z;OpdJLEO2V%dV$V4wYv3;*WsfrClg7~7f?((}wDoB6C7uhfLPW@*HK=>^Md?se zBS5-48T!?HE9!87v$&jhAklAFYXR_kkLRFL9NdjEpZ$di3rNZ$Lz0tc?k1*I8HLE> ztV)3B*p^Tsnr)z_Foh9T!TB47SG_+G5XVU&bu=JWemh4Tli)sggR}1r^Mju%vHVmw z3oW-`Ur2wK^`Diyef(ZJaWX^lFlC7eawtShE*@_A{(C_8M|)iPD(!eUk{WYv=w$V2 zKhBj#Tt$XV91cEnj->nnMO}|NMx;TWGLAyp7z1^b(nYf5-tb*rnj6K@EvZ2gJbs*B zE;O@0L^v@x&4>UZ&jg5uNjy9w#AN(LDr~)@5fIU3o>}8J)0REz_~7Uu!uEJ)aJ2^p z9JDI(2HDV0kGa?&ybJ$rx9J?YO2Mw7Q(L<^iN?RLn@}v-L+phKv~a^{Wy>* zEf9gz56;aG30weLM1XZb77* z`{q+=XL0AMHUaN&k4lfoSCxk&c-a1gUi}FJbe1w~D4bNBX;x}nRa`+_p6Ef`M%+*~ z4>mE@^o*&D*^HNra@HraoF)7PQgaRSU^AG8Ukxs1*>k6+yJ?3L#FV+M0j-JdAwU1f zEHo`1S{zxVT3*dxE)p)z&e_jPF3`-C{`*;$KQnludE($K+Ggp5biBFX&EIPVYASRX zl#G@^`8%7jj6;DzfI+ERx?1BZWYg0-#V5=s=acJ0_2UiF4U9YR1o95P2{(($ja|Vr zZ(8JYpe`JWa+65};R4~%-nalWoLVby|hjXcA?m6uy4rYE} zTEtAz++lqmMk;hrKV1D^#e9XnlJLBpQtOG!yv;lli)B4{{ej7($tNuqFWW9I&k}1-`^O5oa4;mzlWe|fyzhm=3%%SMf#nc<{7b@FP;@$im zQe@+R`|iAB)DimRN&K?ZFN%oPO-GIif)ue|t{B7+EO4tvtIXjQQZ{5?vYTqhYU*0g zE;_p%fub3ryLnYFE_Z5EzQ6G`-|s-*K|cdxf{Wl%>CUwVG#b2_>NpMUhf(h+D5M}$ zLg*@W#k5nJ&*vP94=~1ct0gpNbqtj28VbJJYp!sm{z(-Uc5c0SbzeZeBlQurskK$D zH{2?v|2Y?GRdQE(2~~Ml!SZqXtbHAxF0WU0t-evOcc!zibi0^z{yaOSWu=XveO;2% z-clSb1D1Pr>OY3uso1Eju`62yta;>0q|HS+VxJi|BFuiT{P-BQ+C>6v+wSh{)>o z-|f<5XjHTy^Q{m~H(|spG{v*%J5%;URP=*?Y2A%ts z<++1R=i`L8Lg5X<4Z2ibhGy-Xwz*A~!lPxCuX3tt2wiT^Y|oF~Xmbt^8_M;Lf0>Kr zEfg(mZdy)ngV}xDhOVibWb3r;)%M+|{yTwfTh_j|s&3RVj}TAJyiuNR&AD4&_pt%| zeDFy;dHiJ_R<|wsGsf2=^2amDR4h60Jjpx+o~p0Khq;-#Ydl{M)qdS=A&H?-Iug2G zKCP$8pXD3X8#=C015rF~iC-pG4d<1gYp<^7uGv?KoBV{CPyY9RU-K`9ALZh6FTJO} z-ZlCXZ?_}umWAr;06LeDe~JN&)c|=@FK;zpG|-arvu>DAJYR25-$baM7#+W72!KK= zfc+mpUH=2e9KZxW@${0QMqk*~xiozAVyaT~rSS#fwFF^zc@MPx&P!qJBs3fW064V& zdq4mgS=a#3Lm5dCL1nkq^9{JfU260YeME)5iK(xz*2zT|XF6GAq-JvD&Fa&nRBW%d zPJfsoWFcshp#T4`dm>47$}uj~)+vVhwUj_$(ceKQ8x)}W51{@jT>ymC=-UARlcr$= z9Mdr(7&(u;J5jHj;pJ}bk5%At(ZNfEfq@m-3fRwRz!bcv)zkaxu=V!IrR0Y~;pyYk5^iAeD(+`rAIQn z0>`5Drgxt%ot!9otEJ}H1E)x(Rl0`fvs!e1mnp42J#*`u)LOlhgM1q9QDn6?+5%_6fU0pBPCX^H3HnQ*j~qXcHc}n!^!R~Z6qC-E`D??0kyTh{aSLf*Mp| zbtg`pQQMRWK>2-=oQPVV@w8r=TQsA-QAiWNIGc0Arnoe_w`n;S74u;LN)X>P&S@naL)l~D9Al^-`SG|vhysSHL!S+6Y zJ!!Vi=H{&Q4fWJItd4@hgb7M>KM!-se^A_ z`$fCSaqIr@Hh=whEKEN}Pln3H*kGg}|o;rikCZ3vxn&YcfO<(D) zJhT+{X^}Oq-RfyB+-|EM-n8KvKM(yR?0))c)3nO$d^X?yMJV>7B^0w|U>%S_truCe zC;DXX4SB(nZGY?=SzJFRupgZb1;ia>V>irJhfO4;xo*lM1i#wUDI!?o_8 zV68vxBz=`P$|=Yu5N;$_jkMf)us)h6A5hAx?H0TkmJ@2b791T{w#2HB4jT%xiw!jJ zG*p4=h)q0@4HY;kM*=BF{wWyWaR(^(ebfk<)IKrAe9NY3VQ6o#c~og0{sfav!2ASK zK&j0_5{=oYQUu0m8Tr}EVH@$lav|)%jW3mDJ*7UZy(^}?txne&{G7PW8mU7xc~LQQ zH!y$l!AY`lH|U*fJ$M zr6Havz!2Up*Sh^$(`iSV92+gG4r`k)SA>ATZj6>+{e)@kP@n?rQf{`HUH!RrOVArY zF|MdfU+Ddf%HLDB+F1YRoq8Z&{HOYMRC@oohp+V9>VoUPA8W?^R$3be9GgoIt;Yb7 z)#_p*Dk1NLh@F%5|dsT(c{XR6ErE;b$Y#Xe+SR4n7}j( z<_s)=gTq7$0mfXBI0FV}eAVCC)lu}zXNJMbI{nQOw)fm2d}k~=q3~1`GnL2$$}ACj zDr1XX`nV`lk`6rXR*HM*=H}GZ{M+ynk*Yn$Oz1da#^;`M?(OPP6mWwV_ z8G4_$nLM1as;4ImmU6UphO`9Xku~)}B;u0kD|yPeYW=|{^QZ+|-`Cnt7}>xBm526! zuj=%MFD&7rH2-d)zQeV!7HB3%mgNd=O+&NDt46PTq0iu{?&DO6s6BSrUV2hJDeu7y zRj&8_n=ddH4ZSn;k#!(j=M(-*aiP%~R5-ze`Ng^a64BZuV+6mz($4d#p(~gq2l}B| z!2o9z5BY>we2vXlw1`cThB_+t7~*Y)3OF*MI}5@hc?HQHPXB53#&4X)DOD4%!90$p zE|dut<{N;71Qni)Sw$x{6ZZURbhv9BDQ&DYWzzHt=^XWf*|2*q z1=G>;7aKZ^aQ7NV{Dp=3dtbwj8%Dy^6c5gjH@7a%EvZlMgfI!qxl+Iz^&aU7(DtFR zpQ#anq-P&AXqxgh%$GC>@8Cre=?M}^2AmYo7+3+`_5%6p(}1^sft%msV38e>g->4| zUE&v{k35&LC~r9z2n-{1E_l#C`DNFt9as7K5=`h*TJ$E z!mkpQI}#X#@pD`fqWi@Wk6LvLT+ll6pRhxMNay$QD#&^LOUl_33E$f%S65A^sP`fs z|4~mp-u{?=a)0eVfeZ0bAyQVLZH@;XgK1GYe6^xLC-EQ^V{+5bd5Wh+0zdEsiSvqw zOoEe%i|U6U*B#YHDL05qn{8vzO(KU(U`2V_xFpK!1$tVE-Z6w*2FGqdG-zneLW;J@ zv5pplQIdZq6Zh?h(HaR8m_|I9NLMrQxWPjL>`0=Yk)C9c(td>km~XD}wPw+Vi_Vq^ zfrA>r{X}RX*?u<%p+cn;7%>q=+58thu+%b%u&fp zmX5XzS4%b*w~Ks~ZBMm^<=Lx9mP4PN-b>koO_7eKm9>SZyB%hCSC#yhYjVHpLh4Gg zi|YYU#^E0mbAb>`hQQKj3d8WbZ5_{gGf!#Yst6MA3Gg^unk$0hn<#a5{_KqX3SIu$^gYjpJD$H54JCV=k3z6s1bfy@5 zhVq+vImy2@nJdp`LkN`UFRE_7iik;>bTU)5ccmivNSsa@YE{!2 zcVyco98@RtuA0aGS8;9@$u!)MDNpXLuiS#;>4S0xe}brXlW9Fp`ZSCrYL4Qs`B^iO zqIvU(^`HZSdhzl&X9<3G7ix}g=<2*DO4Gi}9AfN;l$W781gb1pvFFPc&&NgFw|ud^ zVw_taALC7LRPU{~(UB>+{-SHvzME)vIK&~Drj9Rk=>azO+{&du>$k|I9P4OEYy3?;!t)g}gmhJNYFqX<69@F~8RjAyP&)&F6An65bZoJ=re{mTEF9=0g?Xs|7b%6pMSZ!e zrshIjndp|oK|_5A^vfRt_A+w3&kj?Yp(o%9ju1hiRgr z`dRF*(Nh!lpmFOASacLToZnqfosH_f$2-VDG+KM*%*Xf|ZdC2uX*N8-Np^kb!S5oF zU?}CGAlXk>R`HOz_{l2?{fZY4y7a)eN{O;EOg`{4F?4}LlJ7?s`9QAQb7HJd_ZH*D zQSMa8)%M%Li%P=p>BP)~U7PgHA`+n>XcSVBFk}*;3ank%i6(R%*ImW%8bj+51x1p> z>&%mB&jGZ*{;~e zyPea&4)W;S*W%Uo`6$Gg&oPWRvlD>fTO&<5oEi}Juh-b#aP1kQbc-F{R1ev_GFiuX zTyYSAoxBBSzC-H0;VgV>FT52Bc5GW~&{(_|$7sW_5Y1a?&wa&^SA#iZ%e+#&xONim z2>>)vSt-oMHAYm5*DC&<8PDX@LT)5diWrJSnF?K}V)8X8S0I2}Z44VibiM$ZjKZfq z2F^87FnDt=DsFC;38Q(Tqn53nky%lcp!mq31BkyRY+wMF86cpw8YQlY#(JcYZx4^F zoPj(TW<_hMRKrnvhA={To3<&E;k_XPt$LHy+lI84L^~N!>{X~3PXD|%KcD*OMjE0+ z+*4a+jf@5^i2N<-kPU}3NW^SX9qvz`7-qArl+h~?H4vv^Ac9LlCC3k*nDAkW`UGJw z%fFY|S%|n322&wYeiia0g@#T)`948jgd-dAK?kV!`t}{pO#Bc;9uOv7h=HR~Mz8r4O(Qov8n2xCNO*y6P#ZU3B=r+LF0ku%a z`^81U@vB(7^$d3gT+k@3)X|XVbsY{y1j(+?+7$Cb*gWUk>J>=%VK&#n5iG#^784q1 zOI(ceXX6VlYpJp5sfsuO8Qd{8=L|{p~Ucvc=I(IM?OZJ z=QUQkuA=RC8t*SRf=;1yvxHH>y!v_kcRSq6X}aZ1@DELU?4UIp*){(*Bll}})}4IG zpm#SXpn%L@|A@lmuu^y5Z`;j246nR&G9mjpW0>!W9lyfV7&duSmjZKmJkdJceuTLx z*qxKtqu=Lk8zT;qP^-j2BT{aJ%voP(avU`@jb;+bEH#cNQ0hK)fbY7E&ZR_u5Qiek zZE>8eQAuuHdu?@mUoVNLd6!c3gMTn&)DlMb-6Les!bOOM@`{bJ5w8vRE)(XUV%8Em z0%pQci3K${Y4VSudn01?Cw_~2 z-=N;lVVLpT1bTPIjxBH+6+&i0350YN;xP{F+L6RAoujAo}`n;H`krqG@ zze%=<)|L|GBfe(AAQv0j_+Ba;friggymasCQFrV_~;47CIG@V&MF0bJo}G4p?3 zKCJMy4=r-2Pp9+!SH2+vs*%6vKMFrKj3l4S59awA1Y}^*_-FQ5f%*r4Q8s4#JCpA^&%2fOUhpCyypJ zT0N0EyHRUMHw28w3CcvPe#6n!-^6YJI(@%pONiJDDE$ONOBpx4}6AyMr%wF?Yj;1*K#}RAL=Sr9<76_WEttdnF~X2zj$1hXm|awB91Jg zI0&IdX4%>>@@LggP5wn>uqoWAgGJ<#x`7auPzNxs(>vs^!*jrg;*)_22HC!Sl^3s; zPBGSqYFMer{Zp%sb#8(xL)|{Lhd`;lS>QJg5cLOzu!Y#g z9@yJlym}<&p$B;lC;hsXIA8Te4o?18WL33<02ra9SW|9L*h-ZMBOgvs6w*pLPUay_ zYWhj6jfin{0-fsu&6TRRt4%~%poV&*CovF6f)a;>rpR)+044&d`RK>WE{KO8W$}h# zR>KTsq6KiIl>hbCcXQC^&URqQ`|@0r!*I>i+Nl>)3k@=WqL2S6bN4@tJY-N0tL|C}$x2}U0K1SGG13%!L^wqZj~J?a^O2aGTw0=GplSrU zl#(U%cs!0l$&C@x)ZydTJDU2!?`w%DkVc5d)%fh5dV^05 zE(p4f3mUJHasNsm3E~UymDz$?(8axKsi;4Luz6cpaeQT(QPu`uaoR(56nF5j#otYNQo*p?2qmhY4H3(rQYBF@KsMwKn4I(d}X~ z43H45{Ssb?I)zx)0>eA^e`xCA()wkd8@m*B9=sdslaxEwXpz#u`3gL>Df5e)1*HU7 zz`>B9`Ty}Lxm6V`hq0}s3i^WolJpo7A*1U?rfGeVm>MOUVJ9%GmbgyDCMAiW67dgk zp(Ive)&E;AoO7kRAYLv{$c4TdRyu;zD5A5CjUFT&!tTHYD?BWOXA+Zv?MVEfP3%MT z161~Ji9q15pCG*~GKia3x1K<)T2u{DO_wvZa0klO#c&<<)szt!DX^A~V;r_P8HJVV zW^2>E4F*p1Mn+=9->GS_&uVR=6Y7AtgPQOLw$KPHOmARl-p z$HcxqKbU-XgqEu`z(N_i2h`!k^0|8hDF26KooYFz2sWyK#$O_w1?k2Y2^R>5k`)qZT8ys z-ijSYR-ha!*z04H2c91UE5kS zWYEP^+?Pq;6Eep&fjCuLl4dV^aja_dnR#-6q1n_%!#xiLRA^XTRV5?GAFCb+fWl)u zuK;;F@VNH5)8q@qVi|^enJ>+OzUkZHsOGu?h z{p0FUSVI(KFhahQt_>vD_=p(#q5>FHQ911n!WpJL~6t!20&|kYM9w7+p9uDfU`4OHRkN%$;iGhNF zQ2K?Hbe;kc<+?o^<9IepRb(_Qa2(!Od)qtxz~~zo+0%BvlsE z-FgVP9`FK1D&)w<=kKID+)4smgjBAtRj%YpIi>n+blzy0yTWi685wiR-G}ce!m`;r zY{qU&O1EPm8L#;}T;eE5%I%yuhQdrFna^K;{1v`#bBtYUu{-#&K0je0r%&Csw`(23uk;Vrxs%65Ih<>|254kZ&`;a0xgrHD=( zGl~X_u5dg43))_FQ_7+JGonj0jb(2(mSgY7F)&GIvFNJ!wx z7=WxOX|m?+9e5%>=W6@}EZ6JQF!AxR>>m6D3`6oRg;YeKZ4tUQxp`x!3my%~L7OvS zidd$s)0v>}lQGbt_7%-&w;Fl(QHk=GDv|a?(`Od)m@PPN1)vLt;da=)jE_OAuVwP6 zSF(a-bPy$T!U_8-B8*{S*kr`y!=wRy_9Uh55E1B7{sE71I&7?YEoHb0Ri1G^R_qS+ zHsV9U*%FT#p&bB>2%=K?g3mC?PcI zQ-mw4iiD1*AozSf38%($NpU&hNPOpFZw-?d1LVcmp9P~z$e09?qEe~)6D{^azF25D z`JXKMZEg>^ZLVKr`0Q2!RJGNe9!~=WG$|6}v;uTJHza#hvipu;P>A~t;<2%I{1P(O zDB*jC^QM!et=P6_S4)LwIZgy)oTUQ(pc>NnD+=vTL<5h!Z+3kL`1o?|J+m+HvN_zb zliaR*etY(21NO0F-+mrUZey*J5yeZ^6N@WQXGSGWG#E8frwo{r0Zxva6*}%*_-Ym- zB%&cJ&C#M=y%J-`A!$s6f~RPA`r9BPB5njVR5$%f)u2K_PG?e3tqio8_t1Ml)tekk zfrid5_7eJZrY@gTaIX^Av1R#{iT4t=AWl z5^qQ_0T_c2E+wNDz>Yy}CT?VGOx){CRi}L(f6;`1+w8kr8cN{s?i*S+@|5Oe^ztZ@ zFl;oyMJGI=;5k5~6(3%dC3(}Tw-c!aHyKy@yq7z#j#7<^XYH7 z2G(Oh2WSbAQ%+UvDd`o=a11mOoZHresLs!E2}uu%2Hv~A&{H(Au~ru>2&tw$Mh0)*-XetNwgh@+2~aRq>*isz}km30%h^gkIC;yzilmy zn<zc7{EJDF+=sA88fVbXZ)6jscszd;&lN|lOYdatvMGji3R#Tmz zyxt#Qs)@%ovy-^{q~r?XB{yZ0O@@zrgqO(SB$;LBBrhb0)T%4LpdKJny$uydI7GjLkDd8zpgf1N=?uWB&Fo<-UiNaOsj@fzC=4`1Fp1 zgLYJ!p-UKl9j3jwHOiS;bPyUXinra5g-}%-H$iEXxC3@}Y(_i4^d<*Ln3QDyerZY? zlP9~oq?t1{d!OlKdf?tvvHdW=Uk4Vx?cY?hi_P}fJ093r0fIkEtSo{s-l)-@v7kF{ zr>0SvdV&cwDK^IF=)HAx;3AytM#soN^}3(~Ier3u|G~w@<69lmHpsHrwXQoxzqi}` zJ*GAnQb5NSF?HIM4L?9Fr3X5yPj9FroI;kPODbz=GlA&9|iHQM_*65E1m7WpSGXrZ2v01^tAMm!XyPsY(^s) za($#09p@l{dAB#8va_W1L>wC)v=_OOaQdjMr;gUz2-X8vr^zNng zmEIgH&x`%BX|`9lj}z{Lv^q2t#BCG%^xl$IsX=7cFJvcy6GFo{B*)h33|}_s7Z|7P zpv(!!pp1j0#AuaiY^q^~*5CtTLip?jO0_7+5H6^BZNUCrECZIdh?_t^f{BB5$szpx zy#0{uPt^03wBPim+3iZSLl^?keoU`t@Cku5u+Ty+O6>lQK_GT6s`U%(hMeMYRr=W5 z=f02KC!W{WzR)37Kf=e#INKb?Tpo5NkVu3d#PU~ayIUoZ!t%1bO(uRDjoV8GNhBh)9!gj(CK_N zSj(mzL59VYlTE${dZ88MXjgL^|*!~Lf;qkEQQ@k#oEOb&eRbf_}B z99Jz2+RXe$q!qg`yW%L52q}iV3egzO?kl+r3PBKylf;o#`v)PhIw6X+yA*+a%nCi@ckJ#ZaDh;APmTf82V-HcDB zZ${($_gTQTk#IS|_<{o-4s3z_qXX2cw#z|mcpSU&!$iaJ{ZKS!uDMioflS2Nzevzw z4NuCe1#N)CcTzr-7xY4%916@SujNcEVcqs4!H+3eFZd zFrVbWsorY`Qq!f~QW-Je1j_swaZULdV->30>476ZQYw(oW zaAZh@R-|(nPlEd{AirK#MvHJo=n?kIs-V=AEyigw6-=7oW&~vX16U+-WQ$P{Lwh@b zVNghWuq1vJASD2UF7hHBR*VQ-aSg_ZoxdOrA0Nnzz6-$!)^Bl=CbM=h+w&}p11nSr zW5OgE+09;&JgO+r;1Xh7dNW>pxX2$FM80cn7)oV7ZeD4-2hzyN;>{q$#Kq*7W&~J1 z`o=EVWo-La|M~V7O=`t0Ia5anC87lef|-4lXrm@@$SY~dJzz>yjWt0}oJR)S-o^>< zhL9k`kD&_uHsLNSqmuMhv1yXq?Z8a^8s(-ESys!>6v%xIL(Bp+|t5s1Azmz)cvlxyLX6AtJZ6U*=nN>gk$Sb zR62W6!X>X3`=K|eCdZu|7fcQP|3DK+5b#c40R!hrGvsRr6J%yhs~*D$-tv*CXa0w$b5twwa5X|Pvxg~9aSK-nCR6|6@Nbs ztM6xzkmdpmL-C z11~0FGYRw{9|#P!2i?m`!S(iVfjjJK#25Zrh9XM^C<)Cx@Q@xD9~0q&EIFp3as^CK zt;MBrA$*o`Vc+AK#-zvaw!7vxH$$=32>xj<#?xZACe`RICg5=cygj+di|s`mnvC!g zy1hcl?bhMQwCGQ%$YWq^`P?%Nl$VW6P2L^lckPhA8;rua?Q%zsV6A^7SI;F>ykTwz z|E%YWm8T|O$~R=UGE3@#y08r@A>cCFH=- zy$mc|Bb+GH{$|iD+Z9Zf5;bjOJ-}Q>W+64;Dr0RmLW;q5NG|t-iLm9##)uh*6bUt{ zlV(|}P%(~?N;3?f_xb^<_P9OrrtfZgr^xbf4z+#_Ydu^Xi%!U0!!K-X>Vn(ueYti% zFy7|)`1CxXz#dvBW;qZF$%S#hQc}0OZ~N&jk^<$eRz=G zXsA@wo^OqG-QeSf4C%5!v?gxj1`bZ%+>ZJvg6PN3@MuSkV7{V5}t_=I_=+_+Ju0z^RdH5~#f-qC_)L zow7PwN`pd%2i+={(;jrRR_XeMm6S3fFU_BGB|!s3vyT<%%z4zHD?EKP*)`LcJcpV3 z3ik0~q_kSxs|Kx5BS)?u_ga-^jTTSrP9xz{QH>;dpcL%)m-L_oBwNR}Q z|M*3jD6f+InkW&qtGr7-)=wgm&xGzggp4RYL7{4-MK4MAm4;0~p{Syy7Aiq*@R%7k zD^MG|kEc{h9s&tPb4GqOKOXdr)4xu;YV$R+CYJo~H3&+$xB`hJQ5fjdQtK=Kf?t|9 z15#4TBRoZZ>4Sse65&YVmxQaVlNv50GK*2bQJWBhV}Sk(PvAN-eCnR^M5|T>|0D^js82=gQn&p?=K75M zT$T)N^+Nj|xFNs}@fV=_Du(U44zZO~iku!5P0pE!Z2t5-yq#T5!ug2GdWHxN zHb)wBKQP>5vJS=e8!lcBEUKSCM97So03W}=P*kCUGWchllDwjlk|AP^&SQUIC>$pz z6M(Oq=#ATDZ+iNhI31W7S6wUPGoy?TUx&ix!U+A29-bZl@s-mK)ZsQ;tpXM-(LRPnI- zXj)9IZ2GX4S#k3nJtu9`3-XGKL%oR9&E05&{=lTKu4>*=uoD?j5#Jd{Wjs@Pn$F{j zA_wg>d#ra3T7e@)L_~=9c9Y!f)gX^d-))oB)IfFn_>+dI#iA(BWR6nK3cD0b%^A(( zt>&4KrdM3^&7_}Pq|365B7V52I7f?-v55@lF~)o4R6l@+lQ2d+=3Uyd7jD2H6PYWz zRuEOurl4dQrtH{J@7=f^3}5a~o|cgb92)#x63&{G_kGJ)uXIusrdR1%#Zcz3C4tD9 z{(6B2qM({~D_mI#`(6lJ2H%7Bjj1RHt|12*j*AQ6m6iR{jR*`3YPkT};N|)-7Z6=rm;^fC z!Dt8@H+s4G*x2~*VaKk8pD-4~PdhH`MLjI6C;)u3l}dnq5!8T8W-#4s z57I~wMHD6njMzB(bSQPH5&(5VvR)UUC;Vd9QL{mr{6-L(WLy>#YmmP65>%|oPnu6x z7q5bUV}0GXwo#=;6XR07wFi|-Y^^k39|tDHGo??weFQ8|#!#fAGnBwG%>FVgS^8Pa zQyCgJUQ{6BN?!Y&2MerQSB74-IQ_}~`yBXn6I{EXj~Jqg_{Yco#(> z0{KJyyN+BzP7iW{Vi*Ve#m9t>6Twck6-orq)f7E#lg%wKnRRQRs;O(ZD5L}HxXJUy8SAIm-{?EXwMZ8hb;wSg!klL~iUi|O+zpas@* zeML8G<0&xOQV@rGZwW7p$a^4V)-NLzLlPkWV?w8Z{c{Rq(saKF(EmV|gU7b6tR&tr z6?%dQc>P$TBrWbHB_37^$|)?UvW!6bPo)k&tRQ#Z{2%$~cgs$BwN;|Y3$IrjD)BBn zJ7@cE<9EIVW%mOx)jcGY-*|7{u>T`l*Ws7I0$_IJ>C|Y+YF!yQT&EhSqz!=Gzu*G90Z# z=Qc3P_!`EWj&nb-Q({vN6PNz_xT$5(-DI~~gRrfx{!7LGwf8ROU9$<9?AtQFm@>gD?8PX7zTfNwad<}>$4h`&%dj~ zc~_~fPjF|RZJ9#3rMkd_3o8XLSbJwwgAjd2U&+(11DRQ6vsBC*}WW{G4dtO`L{PqlCpm zWUwAnSe$TL3a`H4p@Sgyb=}GCb${b<(>Ob!-kl9K{42k>mi|9ajY_Yp_X8yVl8-Py zrBBsUzta?VOd@)Nmsc49Ic^bF)n7QpD%cl^BYgg6SQo)1t2#&9`2Iti>}~SUs5_*D zw!2fYAM;AdPW8z_Eq`404AeHW#D7K&v|{_&2_a$Fz*xHm_p~KKBY+*IHS4hnw`kSM z+21zkiz!rLAf$K+0Op0&|HIU-@;dKO$+|dM%9}nNzL!ByguT<<3H1~p5GySj(k6+M z#x!o4Or`(_IaYRYBJ@8@JriO>BCD4$3Y{Jw`3$$LWk3dDt%zeRNUEECC2DL&sKDH9jb5!Dzh*x<6y#)LK~$uhwCIXNfr(4P#~LM} z+D!c>Yl{qR*W`~cz2lrwC%K}C;Ih&xdfUsennZE#YLs~7?0#JHW&JJps>tuMAI6IKApa@VD5qKCvDHjgp=|uo z+v&^rRqg5M=IzKrW0YaYnO_f%QhOltR5n5s;gOMI5_SE%emQmj-nz9fS07!%~n{VG0kgQ1M zaIF!21O`yWqAb3k#%WchpzL$zyI-$Mrz;+6*!qfkpZsVuX={JMfnGO!yv3_JO_D%|G~xo%><@O9Wp(7PJ{gD z`m{!2tnd0NkjXk#I$)l?Vin3;ip-mNv$Fd6e(rKo0d(d=Nw4qM8~?L(HY-_-M%66! z5_Y64YxG0p)%WzO&|SK-yafOD<^eeEj1SN=);r3Qe$|;0O|;7pbcA0shlfp!?&P*1 zw+Sg!YZAxQJrm}UqtEK0_n%Re_unIB=<5iu#0R9^z}@Whf^>R)MlD`#8z#;*?u=<*?M_?iCwL5(;g8e6kc>F%3mUpI5)V-5);Cp2kLha>44w*sgO| z8Axr|s2v#`&Zu3Fc3K4aEN>KQao8TacQ56iEmh4m_X{VRtEkM*Ld7qlz&k&V)fF^r zX*t>33tlxfpS;bYXlrQYGkAL5JKdo;a}6U1YYbD+WM}8hMN-9{+!e<*e&&-=ofrCxb)L|eZf+&IlK|x_c2B=|X(EFBHGN1`Eab7lcXYSqZ zu8T))T}Ej;NZzK0ljH4A>vvO~M~9PFuG8Lc=a0ybQ9(O>FL#1ZH+Y7ITrNJjv3g(G z%}9Da7C*da$s4}Nb+evUG{)@?@6FALs;n#wNsKYn>zOkRap{|$E;b@D^4f3H57cj* zFcea(VnyoA>pXEV(PUqM8R1uKY@d<9U3~#ny3O z=g~>7=^unv7<(5x4*`_VA3ux)UWq$pztW05&;OoH)Ki1tEm|I@s2k9O{P8&67F>7e zN5^09Ci*7Q9A93Fof0X<)lwr6#)^ZLf=jvVJ(5(FII{5rPD{#}Ar!>`m?$XzmF^5X z@%K=TT&s%KR&zRIZs0vM!AlNEr&66DK<;~XF=l}9+Ue;J;FKG*wRL63p?*EBCl7qj zrdj3_=GO{V^-^R|i#j?S^*3V|vIg%ETIuuu0mwi%zZvZK{65rFRY8pd%R+-+L)J#l zL96m%ECbI1tiLfsWf%Pur6o9cU_UxLI&lAe^U&?}vj1l)Ph*t;=C}6j(d-5hx59z~ zf@*hN9qeH$CaeqU=hw!baUv1pnEx$p5q^EwY}P4|&;Bse5$J~;?AL*PZ(;5qQqa}e zsbbE<9*CRD<^+)kRj)D>Hh^|oTAHb2GH+Ne`Xpct4fO`!?DDtU<;IhbEk;{wEBkr0 z@CcTPu9n?$)z#vIq9XiKNT(bmeCmJULgRU{xrFWROP!0Zt}d<4+KOd~CEs$f+3Y-t ze3=;7%}9dD`yXb>0>448@2_I`uU-b^%0Enk-~lza73#w)y?-%Y=?A|5VLi_+v7}ez zgFyEaw;Qv6H4A@AO~sDgZ(`9y8OU0Zjl$!_*p`=vEt@wJM7FoJp}oBwUzRp0>kx1& zqCh2A&+BSyrMz7MJxz}pkY+h#WtiYg0cmenCtNNUTmp7G1Ar4Eyr0-7Av!01HeI}^ z`K$xFMwUq(?F97?psol(w+L6Zg-Fo;xpQtbHZ(x_uE4hlZM$7A`lGL6({B-GK;%%w zgl$?cx3bU89#6pDSHFsC(@!B{Vb{rAQ&W=w*GhOiO>D1hNI#iH5gnduYpMxm>2nAv zID8m4B`2e%x*Ac@(TI(U6FXjnhexn}^M(!F9_7$8GGdE_^YxuOAR=Ty0J6`|d)mVs z`25l(_Oqp>MG*)E%&8;s5x;8CD*kD8cD;V)tXY^oV+Py!dU_-d96xOw#h&N~`oTV3 z68o-mE@l}d28!IMd7#g)4#QlLxkg=y8~Y^Xs-E}#;lP3P>9Y&xnfd7vTdc>|k`O(P z4*Dy;(vJKsZNe16Res6;&R?)PXD!yO{WsQc+=N3%-(&V|!M*or@zmpb5x3v*3k-`I z&UOijiQ0WE0%D0J-wh!~HTmFRD6Gr6K7JI?c7^!fcC|7fw%~K$+nIcLu-EUMn0zT6 zW+cUCvtB~C#1eBMFvF=2%XyXdKstUfV1Net3FIawB_Z#X9T+rt5U-zIm5rR$s}%Sm zkk5Qz5%ON#q=9q-^ySN*!uZ%x_;KO{j2to;1^I`$qP^^2Ph$B~O9dDsoJB7Rg1ZcLhlaU)|mw)%E1ZU-7Od>Gch@B+tcN@4;=%YDmAN`kgY zNnc0=*X2CNw#VLo4~_NppdO&MB5^xV$p^*ECg|A#ZV}t16A-VrTl0;C@uiLb$C&6S z_H*or;mG~pe>n$a+zHG#ZOCPOrd*qVSn*S~84={$>^8~1%%{H7840)BjpXaE$1^fl zZkw8{+2i;XA3si8*-vL7J#8T(g(O`&ZY;KM-HOP_ND{{1&%TQ>mo_p+6Hy_)_S3UP zr7{k;-jb}vjqzKYnSn-qUP#tSV%&jsYjZGu^e9Y_4%_#cYJd6j%NjT( z$Scf0%zg9k7MGx=z7dZ;u>^O{yd5nb5B`y!js*+TFm&iJlzvo!o2O2dRp@%mNx2(C zh6o`!R)izRi;y^RB5u9;CR}Q6CaCQ3`LO4WUAS%fbd-I3nl@8@GaDz%%20H&9QzLC zW9Rnm*t>f-eK1M+Xe7!+<*T~4BLy#u5OEEl5=Yl~yuuZn_-YchmJ}*6E zW2IlOo@5Lh0GP$X`;xSDxioBypgbr@Hh;ZS2fOM%lJS~6eTFPcUW|MD2mPIc-|PhV z=sRGbbne;>&xcAAQu?3_&Smww4P58qoziJ{8;sj@j00|?GvTn;B(QjOJ_16BjV#Z z??XqA%ds(pz`ES%-;>9W6O^4k ze}N3e&abyq7lY^BWjfryFI|+Ar_ainQzzv#wo`bvvCrWg?eAxdzOPx+S72nb08r@9 z=B=Wo1VGrP?K{NX-CeEG1R$oF_7^s**p$hzTrEO3=rC>|TgWSnTq6IS&QXOeP2nZ=~zJLIB?Z(Yg z%imv={WD>l0s+t{{34AbA{Y=iiHt%J+C@CTnDposLpEjbkfBl+U?n>{M|!=}8^GYU zny^u2BL?aN--}bf;oI$U06#DYp6`hI^<4;`D`K8l0|D6#q@s=ac&vDMct@`pnhN={WfvxGysTI00ft$L3lVpY5NWx)%?ib-TL2s0+uJ) zxuS1F+|c*M2iH`VFln-AeU5|KbvguH&oQj6ywmTnFsJ+4G^!bxn;X0@ZQH*^Mo3xh zfI8}4nBc=S)BfUSu}85MFd(j24gw4PufuUyB6Y`O)&e&bG&YMvL-7~QfE1*GpsQ|+ zMoNAI=0yxTr}LOAXBWk03eZh6tw1G88K@#9if?I=D&nLO0WiUN+~fQQ!=A&=V76#KjY;4!BUK1FCdk+awCf=`BEvD^2m%_l%8|)9Y30Ou<@8073x*yYs zx^?V;6s83n13sXT8>TcA*q5uB3nkcQnpl9Z57W=^*1tgIYhR(h<`G$h;LuRzRn84* zO$?TiV#PpOGrN_&yy!20FPG`2+IP@aaQ_WYodSxLCmflJE)yIl$It{7C{cC!}T24yH^IFFoBO(c?k`uO)v*PQX77Dm z3N#tA94N*UjOO-CAgJteRkjo(d?3vS22D%g5LHn2v;E3P(+XD0!*CJ>gWZJ&x z@mjgLPo-|X`tsGTRHXR)s8Y|U8EF^YiorU9Z7n+1eKiOgP+}G$>kg8-{~*`iqE$2l za7Qy{L0}ZKBk1S#F%JETK%4A`UZt)qWe~t>zv_Rv*^jBQekZH*c5Ezl7a8Zyk^LAH z7Y}gYNq~VNDZ1VS9mas(vC^YwjHDkuDQU-!ix&dx+#GuW092XMWAT1N>%ePZpR1B8 zT4c`~s`u(uVQ%ybj?o7&uo(oLdOi651n03Q2U)WJT)!#%(+?{k%T&GfYuBh_+Hd@9 zA5*kXIfmohXk^H|y(?p_-s0uujn7`#S5EuaX)SvF5bu-ufD!N#kUE@W>J&{g?d7pN zfw>hG2eTNI+I7>P^Ig%(xNn{|H-m~=M&rHsMubKP%5a~f^SBuZ*InEkBayq~ev<<+ z&9wXnzX5gX3Ji?JJQZj&%?80WK}l5OhD?3&^z=mVRYmsf+Qm1x$YW=phW*ejAUI?| zyAyp4jvYB7wNc$?VBbEnC+(2H(Es2z0!ac1qS7gpFwFtG z5ELB3G#G#zo@+-P{Nxa{;yBN9TARK4mHr(;6;qk)#<%BMguQ*s7Nk#|l6v(6Wk}p$ z+5g>Pr0HCS!2Y2Q8WB`K)Foe4&`!pnbGL31780b=&De9IM2S}g#_=KS){}M$Ty>ue z_!l~v4wq&i9&CCWiUN?M?dI==zDrGBZC?guw7)qV2W+h;EcrqlvS(d1CX1kv@A^7 zYZlo=#!sFi@5aTGnE|L}so&zoOE@<>#D13!BqNhcwhMsLw&n1CJ+Irn)z0oPm96<3 zjU+TYOakiGQH+ksc$j9|OKWZdvlgTqxr=JAhEj+^#_tv*QsD(w!7?7C5V>R)7mjv0 zPba`)pc~O;c+I+orkQ4J7MoDHs*jIs+_s&0{9W6(W3`?I^X9SI5cC&(BaX8rFgTb3 z+zDt>xFjh_`o{DW7)tB1PY5eTb%gF=Qo>kSow82)#l*1us-K@9bp(F?{>bG&Dly%= zLjQ3>{E@~pXYS`H0o(yX@X74E(4!MR&zcQwMHRkXe{lZ+O0HfNWty#kIRtdSqQvYy z1nv0dR0T_?9g#)B`QIHpD11|IM_|-HJbd^7={!Z)x1n9D7BXYn6j`-qtwcvQm45FI zQaS$|uY1p4GN@l4nTR!_>KDPs_vz{K5t=v7p7SZHcr_7aETPNs|DYa2H^ozyos<2% z-Wv??kqXC3V2c+fN_gPkIp5(Qj25O5W#`!644llGlDp$b$YyEZTTa*eD^Nm1!16iJ6PXdvJ0JD}2A*o$H2zdn=oTfb7d z{|vAo5XbTT5S*7`WvwYQXRt2<-lQ{^AE`+=f148K+WILJRe>w_x!KZ=QZ{dq0fXNo zOM$Yq>>V*EKF-b*l=PIj3lb@C)`4vNu;CCNcMvVW)`kjN0677u*t9~4p&2mFPfk{# zf#+%_U@7`G1R)LW@sk{g+lR>Z)ZL=4auL;%R;)>pNz*DKj<77kUk3pDa1eV(>c7k zk7F;3F&`(O(pQGm^!26Yqe7*MGB0tVxO;eTEm#9Z@Lwb?Qt3+EXKVxjWSG8~pQKm- z{w@MQ^YevC@>a)AD)^>fP|*wL(J$;@v32J+YHWOe%t~h|o3<#;3g_lmOU?afG#nhk zf&d>SOpr6@FRHn7ZL{#KK)9}eD4&l7i<6~7#frMe26agAD~~-!fL}i-m{q%?TC^k( zwTgfVdI$S<;CXsg9zS}7`E8W=_lI$=Wufgr)iS04LX=MCB=tZVD`h=`&LkwXfvi}Y zqFF4C8`Z2i#P6d-_X)9?t#M{C_&Q0d`Bc;3fg1o4QVnZJ;*zC`rQ-jccK>JZY*wQR zf+&2uvyfRR7!;Rr={mU08|V`#g7|8>a3${C=S9?=Aj!f_AW4@s-o$15aNzf5CZ~od$(kF z;0;ztxDG+(ZJR0WxndqLK33TBnS3tf!F8!UKRD?5i)UGubvZdXDW|8W_rL%6`TpVI z!>9i1XY+h*wiP15%+|M+hq2{Bx?ymyR;$=!e|^;rd(VgQ9>(kB`PN!&tAdejvvKU( zxWf2CeZ)=JYye(f#;?oKCSoSMJlbllp+1fT#QPLq8Z_$i+OrG2D;O1AiA|yytlvV3Z# zZU0_`-Z$T2Y;l^Vvd+WYqR;3r=0E)jM(^#!7+N!Lqw8YUPsHhXpD~}}d0tNQ1u@=Q z<2~H~^GDD)-qk|q7^}~Pj(~1vF%B=6^C86DrL9)0>i0{1^}CT?yN&wGZB!Wk*Dm;M zkq#maF)Bme!hxWtu_J;qF5e=&qM(iaI3UEX4oL2NaGISGb~Jj~zyW#S=fJxIa(Hwh z2Sf;v0;3LxA6{fS$g%F~zfSjGV1M)a^ zKn6|+t$O6n2d{?EXG(J*e6rGEdyN6vHMV1ipVl5+N-i2SxjZUe%e8Rz3&%l{BU2qAL>9fK4SZXCF9O3rzaaLP5O zyg{BK_dEa+QX)ml0f|URK(NFCe2y&>#|a1_8{313@&9$aU07pU?5HVMdzkfl?e8a5 zcDARxw=>?E?%JyA!t@p3eF}v_p-?CdnLd)<2!6sA1OU(wLY64d%!y}PN7QHwCk`Zk zpA(#H>>UK5ce^#OS}`L=SsP6&lqf;}{BglVgoHGekEtH8xev@P0bjoWzL}#?C=?2X zawPS<_`@sUuf5~>Qngdpp^^;fTCk3m0waJr^~4`8qOWlH1UNXBi4r7hXKQY->Y6@p z`Na@dlM}jN5i+cNtZxFJ&kDX+2>9-ofNy`MP$(1%g>oeIy!ho$0iXRS_ZEF9t}A?kP` z6~$|}@O&Dn1tdCybF-j(Nlyx`DDW@7O$5~sLKHv{VE-NP>s!IKX<%oskG=gq{@Chc zeRChxk*wR|)bZ-Tab_0bhmC_|BN)g^^( zG$}f+1;n?8h;fX@tG7R~Mkd1|B%wfz3V~p6Ah`9B;L}?HQF{QDbwUUsmlTCyDh%+| zi-_43-~#~;qv5O58a480q~5bo1NGM3S(&k;tohy^i=M3lVryk`dIhFNjboJgx8+KS z(^i`21D92VAiqPR0#h=;Cm&x2V`}+YO!^>xi^bV48j8bvjc(T6gYSG~_ha4I{}4oC_K3^Ykhq#6v`m zU%6v7A%u`iiD1-d`o~8dE6MP&lqd;~0+U|V>%*|FxP%tUhgT??%1|IOO2;BY zV`(HJRED7wLI@#*kZ~jBwJa|n_s4!;`AGGnQ{Oc}bYTJUV=D4Gddl_!JJLQB#G43g z3rK97A4)_h2y`kTgb+dqA!9>oQT<=uNV(NRP3wgnHyxdNg_O4qE%h{Ycdqi23aZmj zsn({3LJ|N79j^!>gb+f=c_gZeBc0^|>BuE2)mKMBD9!_7 z_L0ArMy<3&RO^m@HUn1G>pglsKtBc_$4Jn^8R6y>ql zW<7_14sk3P*+p%s_^1;g<7!|LN*63b2q9zw*xA|P!np&sx3>{v1UWwlV1Bo=*o^X> zV%2er(&Aix{`y_)F?FwiNJ-p>V*+xqtsLonxdkNE4I$9*LC6?URm2!;QPo#4mn?jEMS~vazuN5pkXa%|&c_ ze$36y;o-xF>Alr9mGhoF1Lb3PcNg>X^O&8TMS9+*Ipgu;$C#O!X;{C8WOAOL>W48D z1#I_mgQpozL1BmWuqm-!6StJ?|DR=sZkhzd{e}rl!!mTW?~hS!DKNY7L2lrSuq-n76v6LB{4}dFxdSGA}K}a>z?;h zPu<>o&wa1DNw@b?#QU80Ip;m6=l6LJUIHdKyXW)yZ{&`z{a=~*4*}2ne!r(|HVeBk z91fvx8;u4%9uKrTolbPS-MIQC)u{p>t3M6+dOrV<*f(gMYNhsdCI6+bNvL?p`Xde6 z^W7B??dV6oCk+$#V$}EbLIvb04^j+z1foO7djZ97v)QQE>rt!Kg5ggllT;`a=z6`v zfLtyYR1l8GqxxP{OLn`Ra*_+$3czvj`~B?bgO3PG@Sn41;vVo*0enPXFkr&zz`fkp z{eA}@kxi9u0pT&^^Lg~aPK?=XCX2aB@|02Yx~xp*vW===k?*IvS1edp@62wOU05y;v;LcDn^VlgUsx93}ziYSy!2 zov|iD_hQYMF4hX`{5e4gXXC#NveRBQ{P3?|4`%`Z75&w%RZk82yDA{B7m+m1Dwai2 z-`c^5IPVIJ^ zcq_zewW3fcq-4U7<(y0=Y^Y#ZOeT}!C@??p-)uJI@pveeN`YU$-zUa+JSL~pi2$fl zsZcx~=Sl{Gfm|*}u~>}UZZ~zi-QVpGharnbqZAAVsaC5gW8v&7j~j+i1Sl9+AP}HZ zsRYMG!C)|;bUIDta+zE%7uD-^>U27Ieuu+B&1RFnf3SD%ER97`6y6z7un+`ANTGt2 zg!ngj4E1_lR##W$ z`ubX2zKX}=J|@4uULaaILO3}&Nq!z18xzCb-5sBi;pOGU@+mp??Cgxsq}gnWg1kC0 zF+on(d`w>c86?DQ@Mv}0qlbd0x?Z<~fFJ5+pLdV1x4zo}2?f9RNK88aXY&BsJlJ+5 zCe+Pe!TRML5D$-kf?(1w7K;)Nhh<=3fPEp4kB>MbN=7IqN-A&)=I7_-=H^DC(I^he z=H@2EqrbmjMn*G-P{wo7v%HGRay>NL-PF zOw7&Ap^jFoRSH_6PzW>^{A>;f1V-P3_fi=7aK|yTytue%=W|bqL_*T(v^eO!*!dL1 zr>7^>*jOw^qjP$CYVHWvyu7?@Y9P(h#l;0*s>u3rEDsN1?+1$a%E}7y3>gq&(VA3* z1dS_P5+(k`;QIPH`DTBAU!I?zEe9cl=sA#@a=C1;AzWx|BTB5Tt%(A`Lt_>3L30Re zZf$LutLkI&i|T~J#1``K?Ch+(zrWivC*Kba4hBUb8^t9@zP`T7)YOzYCI~s%Y*ub> zZ>3VHNG6k!>FH^CdwY`~h1REZBdWLSr#l?ms{<11)>!!NP3Wy2nGTJA+lSNr1MfVl z)!BvlRB)d7E$AK|e;X9#(a}*qB82A0MYlP=ygUVx~%} zb4Mt4wOY-74^dJCXTZ5mJ(i8|dwY9ai(Z#I4kDv#Qv`FloH-qg2q+*B_xJY{Nmc8( zCS3y}q%IH5l-?)zuLKM-rcMxRYeNJv@$m2vNu^Raj7k8Ar_0Mra~g^Fhld9n)qymG z!@t=(f7N7yD2lJvA&~NeG@^~#*@^F9XRobTiin_vt%6u-C)il~47OIjf`V_M-XjG_`bv8088!xLfjwSb3h#V;cs>g@ zr-zFKzlS9A_c-@Ux1RSL5dXx&%jsVHWBd;LTiXL{h=0-eJRt3gkNt=i?d3*rCs~*L z$uzuXumaL)qunl-%PR5B!3>40fPh9R%%rgJ4p1WByl` zhyMf=mtB1ZMb<1Yb@Ibl+{eq4hko`R%)~dZO!F!Btp_IbN;njEm^PE zE>Vh2uhBl%vj5pTx188vAc$UPKS=P;epmt<;G2c8NOEhAC@E^$YRe*{py@(Z#u?k> zF>d$U+s09rPAsQ#Z^T7PN&(y+70ZP+QuCkSW4Ti?j}$8g4G_qhC4~XBK*|7=5Kf`3 zxC1P!veYt$=m7gpD2WDhSaYAbXIdtj!m;pcS+H=+RpJfku#`}^!AW3*1`51iTco6* z;+-hIhjl>jA9^o0Uudny;XP{Iz*>HtAapRYfV9Xfk7A=|GiZf=+dx3sR`~0Crs2)g z;2L@E;XN5=`ntvs3xZWEb)j%yKFMd;>+9>y8Uv#e_vp|$vgTMDr|%IKblnbC#T`Ix5TX?GLSU+)KkD!A@3%}Y)IUEzi5=1P)^6*ChlZ2@%ni>Y(E)3{nRikOAh>Hjqim4% z73GC3uu?QI&m?HjSK4;yggzr^Xr3Xos6EzM{~u}8>8Cc-CHP>Kl*?9GC4Vnj30ccz zy~Y|PWfT@>35Zy#9e8efDhoR9wh|N(9%aFHwnYNdr3gYul`9t3kW0O%JPsqa`R==7 z<+4t&dVDYN?_iX@_6!%SHZSqyn*#=StmUj*(H$!r59tz=%CJzlGY~S&V4HD1E;d>y z$mwp_jBWwt`T3b5_&h$@Dy}1-s5n!N1%bH#2br>Doq!?v`ue&FEC?KCVkAgVK>vCX zj#T2J3Bz-^ZkQXDsNo~P@&Fj5Lu%3EvqIR=Vodo#2_J=rhvo&$=3(AgfM?G6{9r!Q z-}B6Zgo@iBz&J+j*jIvv`?($0QTTNs1cjAK&;5>USAl+l*j54y%A_k|=Vqrj`D?xK zhv=S_SV6jNdSfnR(Av++f)(re#pHeYoPE!cGXKBgOR@!o`d(>x3x)dw=H81(Z?W%H+PVjf7-DXki*aiu|H4*@MwW@6lD=6d7#*k^c8K4*0LjqbmMkHW)& z-}^jG>CuU9Tb~z(^u#5ekM+VSLP)wM_%mhvzApKm+GKdaq-Rm&nOhPt9^1z;RvuPc zvw-AilP*y$IX^gpmbC3f?}PX`w6g`IRT#(`cKx+;o?K~l9|VKUBQXPw>%G3QO}9QC zkKY)N#EtcEQ?OCr-J|W`<4Nwi3R30r@yP z<+Oc3=8-?Z94(1Q$uniy0&+fLuqyQxkcv|T!>KoC`<#QOy$JrZcP%|p1VQ-g*&X*s zz;93!eu17$48%mm2T#$E;KhS-fD0b*;zfxDV*-i+qdeuNi4Wq9D60uUSOZanMHIZj zx*L!gYYHmaOjes2b`8Y-lFrUd^;Ff&0qUFT>RO|*o==tHuMk9JGHDnX6d2O9N`@gH z1_rwrv^|v5FtCY4qh3)f2kVaG1pdS6LW1!Ooke*u%aBexMw7oDE0(<##kcH-{sK58+*W4Etg+es|mS(`-j-U|?WiU|_KK;5tFt zU0C? zACGfae3HVa{S+qn~ErI?-l40|gJB11APa&AQ;_?b$f>B?nHjF0o~9umOI99iO& zb&bzOk049Veuz9dKaY=zDVZz3T7si2MMDaE#cmWMFJIvH%^OVA6c)L3LdIA!j{a85+I=VLT z8kv&gfO@Q4FGJE>aP!YXET#Bs{)dSP%uG)c8AyBQ+;lB5IZ1(gB5+_VgoOff$%=5M zAQp>p&`v{o7qCpx=<4iX;u4G5qQkpKdIqq}1!o+1q*AM*$G;rPyT(}$-A;Lc#$A^9(>GT^?~4@pC=$CW-!&hWg|7<>SYBG%DwyL8g%=F-`9dY$s7)TZ8=v4xs&38|u&1VSR0l zmo>FCH({{959h0^aQ#{UiOyn~^3lRn;GgTxnKURj} z!2zU+ylnj1fKB%1D67+Op$Lg{@RMOXuaCv`NQ+u z+uG1^_m1~$WdHPU_O9=xsVI(r&g`}JVt<232vI#Ww~W=A)*kvnYiw@Lxv68DBOxuU zE!?1p2`&f>deC69RzXHDlA-l3!E~+q57HaDl~0P^?!N3oUbtMQ?#c6o4?DXL=N!KG z!ufvqe81m=&-0&X{`+@_P%JFdd`Bcy6r|hX5M1_~2zWi1o1LXSN`#11rsTso=I1^l z==Z_xuw#5Ig>tD>AtpR{-iI;9J1%kK#*G`d!)x;S$Ld(PFINgHYCxDuTue~j{h^4N zb=6;1V@ejQHM>Y_jd~K08rp`bUVK938QOYjAHE6M-`_0OKB zk(rvrWt$Clr;|v7QV{UQUrOL;!DcuV`L}s}td96w6C_oNR6)B4+7mN1NG9 zdkjV*Xlibzxn4|65P^|M4iS-y=ZtjOTWmA|qp1zIu3yEMg#}W0{*=o|kEJ9c^Bi41 zKSBdhB;zq;r!%~((VodP(4b=|mDaJkDnJl8I5;>sI1VQ&=ivI<8l8(G>SQ8QS1#0J zW>G`A&>$Qt-Dx$li+31iSfJb0;&6a>|@6-v?C z+K;nIIq0}z!{E>`46R0Zy1UV8GNJgb0KNVw&Q@=1J<-wvgV8`Lg3R1wi6p!|0h~I0 z245E!@$>r+q{h=YZ#Ki}_8|A}JqCh(q#j7>hcxcTWM&$jU0ztMR>YIZU46uL4Z45q zU2AL-Qo6Jd`hvEUf%1ZrQV|g~{^TDN5d0-+(^QgXo0htBz4xRy*`07XncYq(>73+bcJJId_q8)~ z&Yts~t78|Vc6|mw?MgZ14LN?|B$mJY3Kl*63_d+@5Ff5>ps=*rvno(Nvx2gGJz2c~ z`S}G}w!G2DNCp`_iQBpMCb(=TXV(Js3z%hAq6rfLMUWDVtx-HlufQ zIy0}o^CV#Ii|`~178hFOK83E?ax)CpA%j?O8MVxEZCD;`uog%TnErXEa>7r*iq*?P ziu>HEDx{^SD{liC7n7$lY@gGXXV zrYbB8^))R$4dS8M??zJfp~rbo!z;>jL1a<6$r}_g zKV)ne+qbA(M4i{t9M?o;>++!=@sj1tpyndwF;kDP?|nV~n)usvFNd$oug3_O6A!M5 zrw%`#F4ioLF}d$oJnO}d!E@rr82fzj_kw1w9d~PJZvTGm=}k|WwfEpY_U`#c9K$#@ zyP03UAN)D}o$G`7x!~ar@wVabBSV=y|iV2lzX7kCd=@AldQV!N<!zLJu zZ`fQ+8UtcOz#3i*2pJwZ!62rWl;{jqlJAl?!nOrwl$RqTGgE#hW5m_8TNZShSyHs4 z!m<)|8T3E@guzHk8VhZZIKfnpRaT;@aVxsIx{#WdhD0g%#`SAZG(L4ac`6iLy?RAq zS7cclx;i_tr)dXL)6<9cHX&n!vTDhH2gs1PefuA6?2yMrQHPR|m`JY7o}M1;+`df# z*eOg40=V<<9d#{XK6L-Xb{Hus0hE@N;rzLCgg23HP-^$*_IA|1v=rId*>Y|NF)nGG zGo783H5NX_{iBXFq+{IhlIoGyt+%)LeyqG~OxPTwSQvUG#@(%iNCRvvJc?X6-${ zkKNzP{3grJay?F?ap&AVK$Ah9yY)Ap)892~eUMp)$TB*59)jgGF3bi7zeNV8zcX^o zVPFh-=>bXLtsZlJVS@+6Vt_ZMGRtt}^Aii(vwwIBi;GFYpPHYK+`P#sC@R9-dGjb# z%C>FS@)Z3S4#NTnbR7!yMGjPjI#H@z2ujy0F(K7x+SZ7+?@y6J2a*A5TN@`;^B>0} zbLJ>OJ1O`rN1L&{t`_?be}RmQObU7W?9gGn{^|-G`|=2W{NW5XG_2LBZb@!Va1s{O z)L`A3)%g9=C4AM=f)&e_0)SFDrJM{UkIGu4jPvd75|I9y%7jJ61S|`|++6(j>qWwJ z{C)E#63BxBGUmcI2>)@WtreR-ZotJ~E@0p8UHD}4Cc?f*5IVIpaCacmHACrpFUt@! zpGE|!gaTxE_V-ixpNYwk?e6ZT&&&%)vsVgH{KWTtRN#|F!x(*faAe!Gk*yJrIYNlu zNw;p@qG#a4OcCMb^arcsUZ-bxXJ;p!(?*8Fn4ouod?(On#!yjfNNa593(YGt?^>Sf z6NQ0G-Gbz5V`-$24Po*s2qv70%|vC;-@(WM(--dz5JveIZoN!~fe0o(&6pFJJ8xc~ z1PFLSVZdPZ@j&dj0yll#zPRtj(?;2MjHX1ZEMBB=A&3r_aZbsUt5R0 z2M*%&sZ-d$cMs~8F2msD7%3KMCsKRX|Lk2oXj)MeK7mfn76@&o&_X(tgoXq{ z$kHJM0wsbWLm&<2htNW$QiKqkidJZwX0afOgMZ-QAg&I&2!dmE$)Fv?pGkD8Q?ciL zaKOI4$K#=r8a!}$@7HUY=? z;=~_db#87>(UL(MqD8DB!Qj?zx8e9%)uv2=dhBlUlR@veNd`h5c#&^${CL|vS6~=Y)aTad?$gFF|}5!(dFeOg~MT#PpDWd(%#-4J?8QE^z@V}m5Nw~C|4ZD ze06n2&v?$Uyu3__L<0X!3#cemC=}@AEJn& z$i`MkxiS1q&Y5RS>|$$R!ZjQ{Fa;upIG{vb5VeX) zSG!_dXrwi9Y9vE%1dNN&=!P|sU>;a(e&hR&4yyO7M>cLeOfc;de(&Bp{*nf)uB|EB z4N-C8aKF#rZUp%Q^>bWkXg+@OVxqw2P*_0ECQZ_SagN7pn~kgo2XdB)be!PDJg{}H z_scc)dOal^ykA)?5{`5Shlh$E(mkA=RWvXnA%RKS`J1<7J3l8WkN4{}-op#yk>^`wc}4o)Jb7DNUk8Zca>?R*1}87Evlsgz{jk*6wYF3TNN`^&neN`x;%D4i zu>OT66-seE0Py7Xp~$o*Wlz6V?{6+B#*}yi^X6@zO}VQvPfL|)<7UY$z+mzJ|E&Y z8VyC*1-_gXz{YB|QYw|g_0IdJ86APYI2Gy5qYdWWeG@`|-MkoRT1E^&%rgfdQ2QB} zU8&+|fRjJ$ooQ@b)fLCjjK?z`FG-xl378~M6%pE~w1HL#1t>*`ltluGtss?tC}LAV zfW#+20ttyt0wh34Nc2mE02P!{wz7zdkdP_~1W-cALK5l_9B`b(cIHq!IBRyT_ z3 zEtoO@%%FoB$eBE6?vU1o<|LkXp`k!};d7DF9RxJ^xj%OXRl%hoLHUX2*GR{`OrC!H zeW&1FB9#MlQPEt63%~?1{CYyE9G;f_zdP6;(cNhZ&1t?7r~kec2l-vQb}>2VJ3NwF zoOj#X+W{ORCaMh^HXvzRvSbOrxlihWq?G%b4EaU{K>VJ6mk!Jc36fE?dO_O6cXJQY zN+!PFGtM|8o<^9KOKQn0CPh7(ym@}4vV?Ix9i0; zHLB6r2!(-&MJ3$(L1>%Wm#$4!M z+GlIw!iDzn#~&jkIqR&m5W1~dvnEOt#`g5nPiK5``skyN7@y`#+rMbhBKp7jh?g5p z!m3rPqCUu&_H%6@JO#GLrf*I{;5-GuBv!PFhAe$Qfzq^DsI`J4RhqL^ zH4b#n^i)bWWE>M6yGo-aj!ET{Q@R3i((03RO*yMEAyKTeHPWxa>hpke0|BDWL{nMTH%12+?-_{cdE7oqempzqMW8?zfKb4%i`q#JZ@= zDr2n7)I))dk}9tFVUtDt9tqzQlNuAaHkw3I?f{HHbHDLYRyAQ#l2!#~z|AZ^|NL`I zs$xKt$x^_BXOfB{Et3S!8F;|0CP$=Ut5>fE2*n7Ei4KWljBMy>3`Q#JZx^=6q zU%#Gr^&C)Cr3L{;Mri<~WHtcfBZ?+q%B4X5k|KIKOzfLCZ;mEw-qAVrT)TFymxXkl z^lro?kdERYffQj9BF&6P!%kiA(mq}WP3CS=1p}ru2x@EpJ!ls_qb=Wm|9!MozB*pK zE%kd$dpr0VO$|!-1AytIA6$6hg?8eJC)#VTy@u(I7+)Avr)Qsi*3LZhOvZ@UUw<7y zuzdM)zF&>=4ANs&AC#qF!-p3Q;uvpviCngg^$SaT;4(cnRb0ns66Q<-s z1U#Da01=y6ELdxEgEb)KHpl^3$r*UdOp2Do9S>VtS{xw2bgN7-2hy~qtq|uEo*!W* z+^j)TNG5hkFS#dX0OmuJAlebK+T!K%WdGqEWJrnpq0xGE)6Q!63$|rkee6YlD z13IMc=Up)rOlUHrV&cKW_9lh&d#LWgUB~h7?f=U`ly*fHNkQ54>k*+3r z@>V>Ucm)_Gz0X81b27@JG+}!5K9XLg4Tw;^(f;T@*V4w&9s)enL+uYx(WFn>Vh~7E z`ICq0PCJ|?vqzPWJXIDLDN)pxn40K0>H6=jwjocoAJ3F-%^a&n6AnzAe0+HH(MRp} z+i&Mw-#&d_AOip+fWY_dT8ITQTbA^lZ`8FUPe1)MAjM6*1UO)_HNL=n>$|3p%Crck z_W9?Zx8KS9SVX##vO9x}S1nGeTJiKY^1OeDnH*T*86F#+;o z#5n2zL>eH@SFT)%R!L(LV9-sYG=_M6@e7P=d6US2%@tQ%VK?4*qg{91b&PQuw=o5K z=9y>g!3Q6Vmp^KA0H4yvRP4O-&a;Ofe%L0N+;lt8G$ioX$r_MSg=b-!VH#ojrG$7@ zQ8m`)xgXM2gv2e}(-BsvvPtpv;Jqr!l7RkTT&9cSqefNvXE0#H$Y-*q^DGSafkT7V zBe2moET0sG@~8=X4B7UsgSMl)&o=Grv(>t`{?P~#C}a(;zoE`%i;+L6DR0LXo9w5v z@>Z|GcC=KsUl;RwRl{x2NL?P%o6YDgJpNA$ZBxstnk*>QBhWsEX zSK3COVvcb{S6t4;*kXPqA`LOqFunpD#M3>PVwaBT97fv#kQi#$yf6tWJ%EZPE3^Xw zGni0_BIce6RE#!Ex$4Bbs*5u%)F-64&xcF}ygew3OadGXVM?O%cv%4(?r$YKYRn!6 zV#`r0KcB3ruNWoDCBhL@^>FP6c?oEdp6Y`(LS@BdL`($f>KQ?4ARSa2a9`I*fhE~= zum!Uva6}t9^Pv0GK@3#f&K=+(%@d57%us6JqekONeD~?nYr_;s&} z7$@~T_d#$8I^&d&8~Tnhxzcz*pVmEpMw;qBfE*`D;(Z)&&1_T#K#|4;#zlb_`ijQ0 zDceT^P~d%>u}E6sFs_eh2$)u^SYhX%f4*IP_0_bQ9M%y?1R7#L64K@a34IW<2mqqF zy5*Kz?45Vs0qm)Lc^)?%z4+pb?bcgw`)9&!d9Jb!t>z zbCqVMTqe?}2JQJXn`}^EDNCJ3RgV!H87)!20o83t$9^59#Q{upsm@>b583JihwZg5 zcdLFK2D&Jet$9Yymd$FkUoDtzOOHRsj%{tG?6Vv5$~$jHxngA(qOrg$eTXME)<*Vg#NE5;kfUQ9WR zdwkO3-Q+d^1gN}m4TvwO5co@wA7D!0!R^>XKod@wT!(SoS4MRK0LCSk&RB^_a7K)F zQ=I`>x=*&MHkwjf=vU+AZzcYXO$erLt6EzMh_aU{Mm9HX7w4=eyAY5mg8 zDt$blFNEK!7+CK+0P1tjIR^$>S`@~hYQAmtFUCWG4aO7o4Zw^92UEI_P_DqIOYMgy zK>!MqG>@ZxkFd$<(n~Kz`yj0{fJN`3kvQ(SP{(nv7n5Ir;s3g!YIlt@YAy7yI6QPzQ0gRNZ*cd#U z=1M_Gp$UO~DWD(|G(u`RNdP8A1HyH}n#(m4tZ7Vj86+hzQgiBkfc{kVCf746A03KnM5V|S1^GK*r5FoLkvS5l;>!6-*w3< z8UUXhUF8oW{lnS$!i628C^>>GLFJIgwOb+nm zEAZl`r1)kDtQvdbb?5g?1_Wrb7?(6BFuqBffpAFUCh18_OM2e!L0bIQqDdEyWDM|} zrfDEr+CF(n%zpqnQrsr0-w8b_y@>!InG}!rpwSWvnnuZ54$`es1H!Rpf;GJY}nguj+ zb$|-XM*no8OMr!I19TFD_c4(J`Nti`LZHC2ltr{dE6pH|uTaEI(&J73$AEJ_m$8DF z?3Q8ySfXlc5G(Oq8X&Ym-}Uy}-UI!%OAhs4bobhJnVs$4@QuBSSp>X*^Q7TZm(1mLj0mh(KC zC*Olb3>oFp?*rIS`v5?E#TeDuwK7cVVweDutSFXTZ_-iwF~Q4$7v@Y%*_1UgsnPTx zXCx)Hju>0ap~Ud={l56(i+~9+{q!MeHqchwci(-HM4azeK!c@TC5h)dl>Y~NPRN&l zxbpP?^t%b91q`B_Wj^r00|0FKd$^w)O!J#>zG)X+aDhGX#1o|PQxbn&?@ypTg&lslrq^IA_+n!~a-4s=0D*hi@ zu9-1u5&?*Nta2*KB=|&U(oLke4teu*|Bqxq!gV$N-V!82&w=(6^_+| zCQYKwSJq6hrWN6{fVN}fo_+TA=C5tb*FCnWYrwwg88p1S<*5Cmd98NxoMt;A3aw2x zr>OyxDQPwoSoI2^5nI|8LUX}IrV`HAsRNVPy_lDGIsRI#ha@8MvR_vk4*b%6MK}o} z#Sjk~8$guhvRTSi$d|1s?M~awMmzDClAR_;`~7mJ-@f;NZBYBI+0$+7cPQ-cu@5%y zvBm9eR;rUay0yj1L@ExRjqKvWGbm5$7+C&r^lwKix>M+n1CB;iU1xi z{d38yjt=C=-=(>#GYp0p2c(9|k9JNspEKG@l4ih+?}egwYapaX<6_z=;J}z74I!&E ziSfrd+`mo5fzj7;t9*;{zrbJM+;h)$-z=o?TGEb@&J6l^wLWlJzr<2 zwUjKHN-?&q#^nBF@^xT^D}iqMnpSC|@2Ow8#sJW-JP~XNz`(?-k57w!A#DSG6KY!* zaXc1pq>{6Jz$;_|MK*{Z*e-T+)fT0n za^xtHNyhfe-(k&{owjQ0UinR+lT-Sjbm+atCl{2;2-P zWT4d_ky=(Tb8@CXZNCjBdigY<-VX?7Lku|SD}REQ%b)um7ES^ohg@l80rt^6MCt9wk|$!$yC#8;WZdXR?l@iaU> zX?PtH?$MSy=U$C!1Wl~NG-H9l1A>G~%%=Jnpyi^AF0yN`xdu()4L97tN>*Zk$9qH2 zQ2XgLZ8q!lGA7*fcCX}E9>z_tb9$VVG{>)9%cDc~=Xdwp%H3IOmvD2qZ1$(K%QmCY z5E70d^-@EznBBjx`>W%RY5To+)L!wZO3}iA0fs^0eSgN$Ln*utwIsoPi^mC$shb(5 zXjjG#K&n{n$|-GSs%#i9A!Nh%La=ePAmqOQr1`7PZv{Z+oKOQGQ}~$U&f(B zCfLn9238DP%GTNA%NN)!7tgb7Zp@6LGtwMWCIlE@r0`V}Dt1)vlF-9w zNHR9oiDz0e2m#gVUZekeif^dt=OT_WrD8=Z?c9w?kdH&LIA{lDl7&QFCR%_GZK{X# zJlF>-N$VKK@p2?RkEiR$Y16-A8;@23R`K(scO0mM&ys%EwBJ4aof7j1i06|HK#Bq& z-QE9T?^v!IEoY+YdJ93nS(gsKiv?`*sNR{|W#V>wUps1os$q&RI5Tzj0 zRurmKNKI){l{Qgmny7$yh>}Po0@MZ?m6D{fo%r3@v9DiAW5@TkdzgE;M;b=E8gK1u z`Nn&qlbM~znX@;uoAd3NnKRzk+O)m^K&FZS#J7M%;L4jICF0s<*w?Pq&O6IW?*VaN zheb6H10oT1%1ROC0SRv}Y74KJ-?z#*VOxi?`5prFvU(m~|ON!<#H0Z6pBMA^Y; zNVAD^P`oCyErkOM6}|4!CYkI38J-!VKZwgX^@=a)bUu&a>o;(=XB2OqtHp+N23Lot zvG0-X*!$HD@G8pZOSJ|dyc|LU5B}nLt59P2CzQ~fgB7|qG|REPylhB&_mXEXp#}AT zT%VZi-`vy~;sJ^BdPtthmvWo!wow2?#t4mo9vy203+DleU#22b8+6$9p2HJj)H}Q% zQf32?k<_7vhQtH17|AEX`N0Xi_D&a$oE-u(gr@2WjMP+N%f@;<*w&2Oo9nS|c`cL& z1QcU3hprbiK?0e(!41?*kcna~#&m`pC5k#0&ITZgQ>*Q)Z-^5T{VX}M?L|5mq&y%s znZeP22AG_@f!?lB?ECsw?0vYr07ya!C6v${LB3p<#c5OtL8z<&$p1VbdI?rj=n^an z0UuGzvdB!W^4J~_W+C_H_xO8CT*kKpOgPAKwr~tkW0t#u4@Qk`o`U5;sdCwbPDD1B zeoXKK)AE%Gf0L$1L@RY%A{*metkbw)$0QX<7@cTLqNqf4s!=u3Vn%gc3?<0m$`E zFqcJ@-EydeZV{ruy^JY(B{w3Niw$s_*pt%ANveOv-BF_zu@q@d6bhloCCIu!{ z7N9{kY*yFQFxP0-uH=#%S{0rISqmlBNj9uToJPdDDy3#UvGPHHv;CuZ@~sbWwsR7V zHI*3l158y_qHXhfJhWpIwluCm01s^71IQXieVDPHH&SUU2Dku?Orf5bb-B{zO6QdT z0%qwaU?DGTjGrMeOFqqgjW&f;`okPwbQc{h@Ik_SEgapiptspa#$YB>C)UR&#ZlQw zDXd;zhpOfVsEUfRJSQ$O91=<>p^*1N^8QF@(GmghlqY*q$Z?7+Vgw*`f&^DEL03P? zmkxlql~?gLuDcOkm>jnUMataw5Kw6Y5mr=IGE1~%oqn8`CZ8hH+tY*I?r!wyv`43- zsT9l9Jij1Bz=H-BA6z((qeqTJo_NvM+l#A1Lt&m1zSr@wF?3zN%xiC@zfJZ&iF1P! z`0gLiEccmy}6r~f~&8We-OgTH(cpWS%}QX|6;gdFp`EarU>1WWE&6uU#G zQS~O+sUW{*NDHG;1^ z_yC{B|GghPArXf)S0R_nvIisZeMoEo0>=X=wBfRv+FGv97V3)+rku;~>+;%~LY#m) z+#4R1mD{gxYQmex-oOP7vc7o#{R~QEX;ydFW&G@!r_svyN&po1ktJEWE$fiYWC}GL z(fsAVx8qFjM_3sEQwpdgprGB3=6Y=3&eEaU3Y%t~TI4&2XQg&n(xDGvDWW{(PyIg~S;n zj=sr8+JtU-GUoT9p7);TExD7mlv3gETz5PXPGeBmIQCeJ_LM;x-SB{rRTYE<@|Jvz ztqWl`yT|ekFk+QE0gK2hr3VC2UWhne2Pq5lqB!Kl&?^#*fYD_MNIVv)kyK&HlEE1}1Lc zg>$1=k@k@R5Qwo{SB-Tmm!VqsOq0_&04dT5kW9S*5!uZWBrnRuNPnLJW@=%y%RvXFZtUAdH+cGltSR%t$$P_qG z;CgdId+0d!-VUi($Z9tA$oW!dGGWHjlb2wzM`hk#s;u|(r+}~h0oeN<@c6sHx6hia z%QWwKTj$RJUpNY!Y?nC(d(N4_gTb;U1WbWx_0ea zAsRVHg_rla)N7lDqr~_1^`XDNA3Z%iZ1045JEo_nIoiDuJNg;GWN8pudkJJ`d^# z^UiHs@#@P5p^qNMs|OF@p3i&=gBp}9TfUt4YTUc))A;@GehVF(5l{X2N&Mu8Phiug zO$aD_drm%=!|wmGckMA*UT6IGwFpyCF)c{38e?=|g$i|uA(y;GG~?{0OXnYU7n z!%Mwn@z%{hOpG%#@itn=gy4(?RFDQlY?UD}0byQ{4=IRR70?eRmv7JeOP=J-8^3)} zXEo-p+HL-}yb~Jxi7fkVrsfMFm+Gxo#?mW0JS#lMQ&>&>+{|W`HjO zoS(lFhTN~ehOci={C3`49Q@0lVZU=9Nd*-^{S&kTXx4{nSi)YO@bL69t=}*k;7&BQ zwBfF>CuMi*aIT^jU;f*U?9y_aF1d-Eq6*{{+mT;nN1psXS9B98MK_RDd;{mM-9qv0 z`?%fEB+a%Gh%~BfrWWwg3OLNhJV6Usr;%<=Ru?NXKrodlpwOswTdhDsfe6dZay7Mr zG1EOVwaN2yg7uwNKxAXuBC(b7n34r~DDhc4hrTv74}gt@z|VRC?{ovgeE^MN5`Wqq z2=D@A+Yw9&1hr8@K7kP5cMJI7PTFZ{X;`{+Ddx?a$IZiJ@X~(4LFK@K0~~C$o-%uh ziHRr`5Uc~^p+kqvAmFKnLvC&^Ox!LuR(JVvrt>t>m<;#~bbLLDVpF6kr=+Og( zg@r70EtkPn8UIWF<2C6(eEj%v%9g?3jck^6sO^{GWq3|O-%A>{GiJ=7UNGgePYDCh zeLXC$IPLxKs?GM+QJtj#g#BIglez8-{q;U$Q^&r2`(nqA9S92xGj^A!Uejqcp{mbwH4;)Q+`rn0^S=p9!C-qvGk)D#Kj*)*s!0VzM-D=pXL@;X}2Tdm+vC# zgPCjx00GFq3i44WN_N8J$*8WWk^B8Bjkiy?Zo%3Oo3KCbGpzjmYUG!cVdvJZNIad5 z3l)!OX}4IpL{AUcJi2g!v>M!MXxB@Iz3wq`h3!ZaKv90Z3ij*OsJ(R$@Ol-$emekL z#|^@tB7^bi#2_pTdjs(HKxNH+6ch^}DXTzEd9^Sm4-61PFe7p$k`(~~i3uDuD;UuA zB(2u3UDf&c$>GC? zBRf0W{6)L}b!ep`9a;gZ{I!uATtpe8Ht>n9GpIV8f9f=1~?&0 zq@hOahm4F2>UNPsa4~J#G}U$1XT$eE@9E*ghq?2;$R!X})_K*cRY*xmG30W>r>Lk1 zadB~Y-oe&B_QBRp&mybMY;(h4SdX{LXnTfBdUgQPiL2tB?PNG?ZjObUeL!3xLS;Z~ zTG*LEI{^TfKImOMyL7Naw+R!`7tz0&k6|HiVZ^X-O#0Qk_`~)cSRV5+n#F+1%e{z^ zzZi|2v)TCkuW>k&mPUnlDkYg6KPWgDqehS6V)(xuiAVaWQ|Q{Y8yt?uTtt3ET(TBK zFT!hnet7)o5kbwQ_uof#)i+PQ4v;#10PpTTm^@_)K3NlMEQqHfK73$5nGt{g-l}jp z1Cf6zk8WM5$zR||+~;B>{S%%5ath1P*wDf$^H!Cw8|is=A+yqKHk4a|x+g8T{%t)n zZdRkHyb4b$Z=urfwCs7r)i5s{%3tjAu^3f zU;(C-uQC-}K-<*z6?CvJWoaJ&Q=XJ-9hbnw2CHiqWhnr0c0K^1D6%U+HvrxMf451L z#|U@=A4h;|Pp;l(1(ut~VIANzGc&P$`*sc*^XJbe5ZSV23wG_=ML;5ef$NO)y|eU9 z&VFgRxu3cUO5Y1mp%HI3I%;ccN%_kRD-C{`iKQEW%9DK7mqC+k$E8b`3|SmFRgSQe zyf)c{3WEm^Hkb+>T-k5)^Yc+qP+*>+V=DcL?TJhd(rN^il$03m1x&@ofO)S8qd9Qk zK(k*pcZ(O<9Go2vhnDFzkwp==2+EOrYOYJU7cX8UlOzNB3t=?93_tAPx(|cEyQ!%O z>(;G9a&j^@Z{CdYZYFp7DM%--`D=|e1AyLK(&( zA7W!;5fv518Tzwl&+7RYZE^;F(xgdPzI-|LhfFX~p7wDuylJEhgG0kyn9CQYKN&`T zOiT>MjvY%K`8$x{Z2K?g^ixx3@Rl#a-MV z>QgBv)3I>jLh3JJO%w#Oo{x`@VH+_WI&>(Xo9NN!zh+2Juwy_3-(kCoSKMqE?#8RA zP`TIi`e_Iz*IosN#ymv=F^}}yN zS5@7@-;ezR6*aZU`sxDne;gDWS$^z(lm z>tk1=xacx!s=q;FlY{3g3X!f@-ag*Y*`SuzR@Qsf^*$g{?kV7>8KG|v1u4+dQnDf` zCr$|18EwAbJU5%uDGL7%io_VZa-{^<%1SYJ^;(p+c%tf26X5X*+H?sxzoZ59^z@W- z=mN95Q{8`Ba81BRro9GjRkd)|KE#kWeeuW05Nw_piVsHz;k_Y&cLyqL$GIDFv0@6<5AUJ*agI--7ws;zQw)9W{~wTqB0L;HB4?z zjLLTK7?5FL1XBVB1qBwSLBY%u0uBWg%2JT=V7W3PjaJt#qn@^FVOl6tkJB=(qfzr! zChIv(0EDsg5J)Sy$5P2dpje`Z@oa6twL0Llk-#8-ptJ_~AOk>GG9%`GWxPY2brg3Z z0+5i95aw%;L5-k9-)9%PoP9;}nYsz51gJ+uL}1C1C3N{xfT47LzkdD5j_lmIlP(4; zSFTjL-vAvP{G=|KmszuBAv`>su3rkOYMbE>Qog8YePNWQLAo}H?_OkR zbY*2F7SmWZZQ3+!+qO*ryS%*I&DDB`*R5M8i})7iCr+O}UBF=H&YiApl_8Hy9;{ij z26N}m6`!qMz1k_W;*t6D=Q~*;-gUHh?_S48#`_8tC3rXaAwZI!pYO_ukN54{haEe1 z;EO^Iw2dA;T5^Q4LLiN@M?iz*z?kkC4J|Ty@ZMTzt%cG`2RV4~Ac~5LP@yI9=eC$sXcxOk4R=~QMIU4a^ z7jP0u=mIvkWZr_WP=LNryB*7m3Z23)tH8Jk<1z8}9F$U!J-ej>n<+$}eCh`TAO#YT zZyY+L5UV%d{tdQNR^WTze~OC6SeM5ki*V7hhtT-fMggSs>#tXcRWlR#(s(WrrKhLS zI@&>jG6GwxYw+`fui{s~d>t!FO4N2&cbB=Vl~?jHnLdBvxA6RP&!U{(o9CG9zNoka zXEJU>dMvI!jVw5BD8WZKBo$JcV{je{fscl!Q%FD6g0@fFF>>sevFYAB@Z`M7$QySP zQqafuB>WYs`0w_S8Cdo8iP*g0PTYT27JAw{Fq~eHcj*mzx0wQpO9Ef$331T_J_^gy ze&B^a1)gH>oeu-mZHoo0XCOwu^`|mc$J(`a4E*S~_2q#Lp0javdHo8!SQ%|O2K8e= z#I8kSQ%IDyYENZhD`6py{-rnwG=cghz@f#!zdL}&HelHV;GwTV{XTyL`~guI!{}2f_H%oTKuI*A7{Sf?Afz1XU-e}81u+je#7qFyD@LxJb7koYip$l(-?3~ z19}5|BxgL4e4r6Th8h9`d6r0K)R0$%vQM5O8f;{UvBd=_H|3S3XG-#{q@+Y3q>pE= zXG9N_o^PUeg1U~LJ41JskHhDpurLEf15aTh9W}IVvO05wAwS~0*H?5OSN}U8SLO|g zUZE<oXfmF(x}(prj8Xpz4GT@9z2cpzf!yVAInZ zu&nrD3>~IrfP0xKCM9U=_Ls1-cp2XO^;>9eYT{(@I+o0s1f1Z?U@56yvU`Ad@8fLk z>_*GQE}ZG;!Rhu+ynp5#-Xl;L_R)V4ceyn5a@5kBu_!ki!-oz*h{WHM2w=wpmCG2G ziUstP{E+phj=K?Uyv~d>XVHA(B!1u2jDMXwk5(6w^%?N+ydWu`0T9na(jEr9UAUy!`CISUBfV#T@TmUxS16(%*c=b4N;CQl}S0lT4xs$iA6_Xrhd~V| zeFaEXSJv0~R;^kk<((6>6cNu`BPEC+K}yg5{rg>6T?@-;@~*0?QoXNnY3#znLd8xK zNN9|v)c8s7M%>p}Np7;0mDa}0iC2?50hE=;A~2syvqTdP;;5mbZKo8}EKn?lOJO|fwZk0uX@J|K{$_N1q0u0GDUbA!=lUbDA zir_FK2SaM@-YG4+V*-Zt_4P8|@EIsn zi{sQ71|0Zl;)~XUqjIPt07vxs&@))9Z2*rg<^?i;O zS`F5$-+1&kl%Vf-_QsoULMpuz-90g6Q&?{-dj`k<_y^pXo69z1N1|*&NOA&SsrCIq~%fyyPxDuG8eoieU`I{FOqDv zm6a=3stqbCvS`vXAXnm|$KcBCyJ=PaUp)xIxB(422($Nbd52lUlS|-X7c{6w&CTj%hXlT)WPr0pY zr$XoO%vh7;B^d1NxsuI2U3nH+@2JYqIGE7k5+Z!@F_YRD@dd}UnUrd_dfthJlK>z1{>G$#M%5o#JRx# z9obIev8Wxsgeg`dym}x+Oy}i+*nU!$9o7+(oIKqkCha0qQg|uxJfF#OAAIyNggLVNl6h%SyA#>uaN8%lRx&I?_%+i0(5de zGjo(#49sfmUz^JRto|^!>f4o3Sl8oJ&Y0XT!7(N)%Z*#iZ^^+=Fy8gS<;z*;63%u3 zFTc}_@Xsws58}#$0K9(Oy`zvu(|>S2bqEkAs3A~Ei~WzivuUlX2;=zN8*h@@m$Xd` z1hny`7NwvTVnD=A7E%yFvk1hc3wLql-h6=wuKWN6#YGkY#Sfqa5mzomD2R&ILYrEP zn5H@R#NYjKpD^6q;~^w%NXdkgJLk-tnK>`>%=3TVPML1Ob-!_OBE9zPW9iJJEyk4L zq}_oK!OP|6C(_(cf2J$9*VD105L7i7`yUXjjVI2f$&piO5U|x2VQ~HNDoQlW#Ta@% z5V&Q&O+h1=e)F71J`-nH9_RMH)aLqpDX5(UE}l~gP#lcfqyQU@V0hzP$6-eTpJ=}* z8W8A59AA={5A3T32gw-om=olTiy8{b!)aAJWqHD+6SBF81q2<-$Bl z`*V_xv4DZz2tB5p;UUQ&&Cbp$Z4K~*L%Dt`&=;>WBFW^5F+_-8K_6R;&wBz8Isza^ z>4Bzr*TQ56EuLBk=9KdV|0L%yYoQYJ@$qrPZWET(xdxE-Jo19@`T2RZj`)B$*YMlW zd@8;Z5q3+N)Yhjx=NXcCO&B|Ad3iaHz||3K7>S8`(lTg==1B_+3lGJ| z3ek9Uv=C|-FnRMCEG{leJK+U%Hm8n24ih%P8uV8B4lPm>#Cd8o02JO=?vJKZ(9?dj z+xoPlmK+-Adce5~jRMpmAd(*mq0-9AO8y=l%MYc#Ru0i{`KZo#MV%k%n3OuFX?Gw)a0r>_xvoJi|q!H#i>1KVq``rtCVo$-wc3g(8f^I_XC3`y5pwO zb{}IfK0}P<+ST9F7uRnm;s6;ImX>zle7^+(v1n{i+O?r-Z5bUay*o9To*p|HN}@ff z@Xj6|Ommmc;ajqnuKxBH*8*^B19)!UN;jJWR-Az74RK8X4z&;YOmD`}ZBW)d9O}D1 zDFTqZ4trj6yutdWnDzW1s(_2yoIdHy=3&wotmnbY9Rg69y*pR(^@_u4;Gc(g+P@Ln_)6@3DcmxrI zsx*((PNs`E`Sur5J?xxaP^s%Z;Ck!>lPd2Y5XiNkvg8U4a@a+pthmgcOhp88))c(Sl+ZQxT;De-Iz`|O8 zsOM9R8)1nwn&+XTJ@i@a1YyE0$1hEvHH1WJf)FC9p~mMe%s(~t1mGzk!Msh-hz4A~ zBmi2j@y2J(V`0LDpPYTd_vjl!9ewclMvOp(Kq30nt*)*LL=O`5g&|@1fK-ITtuk?H z=fe7o_ib0SQRmuV8x?gb+o>trgAd3a{X#0hN6*F91Dl%tvc|V09&Q+!9GV%<;@>yw zgU7p!J%8?_9m&02bD%NS0-0COhkQ_KU*bybnyi=z}kjZ`@0F z)&W8sFRNgvpd_+@4|eWQKaCtq=W!$-ZiRMcZ>crVOfNq*mR>wP?3V_IyW=StYhw)% zf;8qDYVx~`yWkq*-j!{(&OZ6gvQ1f$%A)W$>TMPrFUecZCO9-OfxjH54UgNV=d?@f z+Mefb*#`HMvaG%B{la6L?B6RkJ(vAx&%EXS7H%Bxj-%6GVO}uFmSWq7G&sb+7E+GQ z7WstQcKPMrV&nGY6u z7nn$BNR*}l3S_u(_Ed8~v>Dq7Mji8^9pA?wDM5un5qtzdCuysF5&te2b&tV_D`BHu z{X_8o2#0mc$qP>CUj_$Y;n+w@N%1SOPb7jmvxZOrpdteVBc;y;lG|`9cQIyBmbn7# zXwS@kES>@cv^?PqZysRe^QL{r!MKbB1Oq1c2%iunkzQjrDO3RXI6m@9X^~_aF$m_s zd(Ssm4!yMYC>_oe?;K2~0G?nB3L5w@sqcCCc>oRs%t*rZ8$%GGe*kkgfVci*fO*Zi z@LP~Rghqooq{a^r5o@oYg1PB=)OU_UHxvwzI)F!pdTD9NdYCWDM2DoEv8l;~8FpMa z!`uJEl<*l-!vRe(Iu%a)YNEJ*f(W!dJ_iIS-U|SO8e+@!m} z!}W511$2?7rlxG4_rraB=M1{Rvyir;{WaQF1U5PNFuaXwX1$tct~Z;i_W^0_($uTj zJC@o$_Ad%m{juu2Tb>uG<;VMM0g%l1lnwOBH{&xI9FuLtF+i8~f^qU(!3DexJrSo9RXyz*C8}wQX`c!R|kV>wWvuJjihGczjAkW zlHGh^_XD(mgaiU1#DOy$K;q6TAi)(OUWGdc9)TAC3BiFkKp<}XSzwplBpW7~=^5LF zQ*ueARxGEPVY4&zPpY=vF1tORagWQcD)0Xf2dVun0nwDVKVp~L9Z79004A2W5~SU^ zyjEh=&AYZhELwu#mDbH z3D-`r3Ic#nzXCq|y!R&P089YH-mC8>@a+e{n=b)eI1OEeT31LRbN?cHM*{|>P@va*gV}e6ta2NHe>*7c^e!~D zc?YETgb2(!8MWoS_p(rsgcDgLNWz9JP9&8d5ojvU9GbrsDpo6gR~lYnzYVXG!vddu zd4z9%b$IU94J;Y>=xxTqb-+hpg;vG1IOL8GkA8ao_EYaAJD8L7-@*W*Ax#HB(9h#S z8n%4FX_FF)@veug3uT&(1~#3k8#dh~b9jr0I&IrXea+Zh*bV$^r-% zI^#0nLT6xr%}BvO-K49hrQ3rD8*HYdyDb6f)n5Js-NmjGyAXx(B1LcjC@LFPHivjNG9Qz zIDsJiSy*s6Ce=yIP7nc2TO;@&&tyAzq<$%*_XyI47#WchfvuFV7U6EM1>Sjez=@#+ z6eh<)HTRrl9t^tQG>xhUh-!i1wQUiPDoMpjRRa3Lj)_;()+0`72V+RR^}I6wR!^2j zY%U7FM?I5AjF$`JN!2@LJSSS=JyFbmtS7!}!WHyUk#FPPS$s}>VFT;-7-i#eC76&3 z@nZcY!KPMLvF;s^SUr8QEKCr}9Y6)Eepkt-A%2Zjx{Tm)2jnWj>VLNOt&xyT5@GFN z1|FVuK<6<5a4KzM$x!tuhPVv_9Uo)nJ$~8W$Bn%`?C-R=<{Z>*ZY#VD>$OVTY$yLM z*ch72Ma3OBv!^0yu*9roxdxQWs5M#x1;ZMWiMD#YVG|?5UQ_m z(4arJEBKSwos}ZQ-XhT|?fB16UPg>~1Zp-H?hGc{cvrY1HVclZxPX3L z$Vug^d&*k>L4=l{s%11R?_St=A5`n;LRj}t%n>854$}P#fCe1o$@y~sY$0B%)&b68 zV8$;Groia}lZNsfoS|gF-UAO$fcy7xn&|HFG44#K_KQ{*VppO zs#mVZOQrPCqci?h0i?QpQwR42k%|Pxg|vi~IO->_yHN$}%Af)Wm4D`H|6y3XBVZYl z5!exCi=d2H2Npi!WZFqQ?ldZR6zsA{@?X^ExxSxATycHZZ_>}4wpEJ|K@jqu_% zFQW5Wmpntl&TDy(z!5PKV#FiBMvp%;VJYR0yA&fvj2JQE(i-U%(}T)fw`e!Qg*pcq zjh8f)R!57=gI77Ar1C+yu)9+K(EYM?Ns&MpRj?i#Fa(q@bg_861aJ@ne!P2vdnYrz za{FK{13yH@&kv^f{bVLL7NwuJy+=mLDR|&4(F}ld;C2Vgwgp-TGz~g(fFsFs5(fx` zh5!a3g5k2qr-leFZ^vFsgzRl=k{_z7gTliM&TUc$e#DY56m$Dr4$;?mV-_Aq3=WWf zh*FT(`F<%L6iG$?&DjYVF=E7s5hGRxK~NDQN<1V~KctWcEc(~l!Udjx(FUZ1xN=YwNbfF*>h5(^1^JU>f%SR$e8iXJL2?Y>f(r83@0XYXL0-&W_ z1_Z}!nvrc!K+;vsIpyYX?#9Ll9Ia6ka@iA?XNUm8!~lo24G_*B$;*aOg^u2a%#17Et$!qhGzr%6tZXpUD`z~kaQ}zhh=NGzauwDjh zAC-4E>^fwjp6W9O8l2m*F^5&OYZ5-_Z}zTUw}~JKf4dGON}vDr7MWRUjh=Pj55`;8{C^3OJvE#Gv&S#(ZSdVVyQQ~De9Faed z^l7~RXRmf|zdO&28PpQF9JU|IQl4`#HP+VoL#nht)`1#wkdq*yACDIxEg9!bjle?* z_z? zn${zN@(<0!m_`%8{ae6;yTHUn2MNjQ?ZoX7YG~}8=>TWHiAyPY*@-0#=Xq|=iU=Ww z^Lqxx;x*9eOaShOP1Zh-Tcm(P4wDW`^z+2^284@+G$>2`EH5CEfo(u+7vUfUNrv{q zQl_i~DEqaD!wux{FIdMe2T2Eq1ZhbJYYj$K3glqkIVT*B9%H4GwKRUgmauj4~4 z#Q4|@t3Ax7Lt%K989YY&|zrDKq~^88es?oT?Byd0}Vgb4WM4vNOi3S z?C%qjszz5=x~P(UN~F`VMpWBJli(rr>Imx^eu!4P4W&V2ChADYhZg~lUIWk8f$vRV z#Rpb{9tt6_ruBRoSgHaK-vTc`GIzpEq9`J8F+mB#Foe081VMm4LUnXq^OTH5^C ztxcoRpf=}C%uTsiEMjwW^G|gs&|9HUAp0W?iZEQMRLqmh|73TQoyh3#MM39=a{7eN z;qvk_*~9Vta=DC!g#}vk>3XL!hJJn8>SWI6af7lB!pzJ}-#x{A-rnBE;^Ly&tGo3m68-G#EJZ)pX^L7uJw1(lK99M%Ip~1Y6oLL& z$p=5+^1x?Y+@U6nsDot;MnuLlvl#SbHxL1F+j6*VG#p{x9sM|1o3jrBe>!*SR=UgE zj#8)GqnCi096%r?9g@<7oG_qttjn&Cj$q}Nhovt+@NKt|)f)mysT$zLyLCJ*lyGx= zlw9emRtzM9ksk@toP>a<(W@&>F$ayt+Ss-N(SNxTK~V%EDM~T2!qRaJv|B(F0nH`| zL7?FSe!vKehF1rn=4ss{EeM+_*@=$qFIamuV7>(0xeQ!LfUBa1D;n1XezSKaP+An{ z_Wr~C10xKCeN(o9077^oAR-8g%R_yj2tF0ipyIB$fucrb6XOPgf~c%9h#@3TL1e~3 z5P?US89;V~VV@_PFpv>MVEEt7J@cK^snDnWb7ler>YO^=UDZ|9U0ut)-}hA)_Aq>6 zM_@=(07<}KHfv{Ds|#!2nmFEj?>(5a@Oks*;pwNJ2Aw9I+i$-evu4eL-*?`4;|_vXCtpfn0|;!GPTVongP=d^e)-*Y6yskZ|M4rm-7I&>&f zQ&TmbUvb41B9>k~+xONUE{8bJfsW)wWB2UYvr(Z!1<;9b+ehBiMtDNBzrE-?|@Z{W;THw%;-*#HFi%_lm(Pzw?(BqqB_6n+s+ zM0V~0O#I&*WN+DvqXj>&o{#gs6+8Ch&9s#moVf)JOGiNc>KE+u z239n&nKtCJ&pzX8AJLBG_uqfNCanDYeD$|oyLO>NhYon)fd^2nTD2gRz5yFMT3@#? z^A_i)JL$QfmtTf?H{5Z$_T&6={doT#+i0cEAxy?eK{M{9Qi!_**}0K?K) zn^%8fe$wJ_JUT~09LMoo^_rHJhP&>%3zH{LMw2E@MB=O-{dQ2NP91R9dws8a@4Xkb zYuCn@F=N!v?VcB3d=bw)^9){i;RWUY+;h)i+_-V4++;6iZPhTUhaLhjb1WV!C0|Pt zKv=>EjE~>L|I8ImK#JalZxASd;-4fwv5*BaVHIe96Dn2~&jv4_NdHd`E@o0935pj^ z@=*f&I7rUtzbK77uKPIp<1s{F z&rw3&AtK(hLf%ZqJV8VN@rVT|M}w^v;gXw}Ys%#bM$PmPTRg)~y5Yl?0dO0@5fAz$Hp5 zi)9*klLT_%!iB1fmtTGv)H(?0u`C03B7(2J`l{-lV9X~G%6IYN#UhqG*L$sBzh39e zOX0(Z4_A6>NnCQGI-N9WlHys8#!{v;!eryB?)~PQZ@|1&FVuc1{+v6#9ovWcID&|JtzC=E(6mVT@jjKswtLo-5WYW* zfIRioQz%=utm-N$DGB%7bB_pvnag@wVtqf}tFeTnPj${+@U4&gW0~Sgmo6;(I%7Rmh6G>gKo%cmr(Csi1-fVQem46)R<1u;gTY(4WWn$$J4*IA(6c$YYy{==7=Yt`Wi^mUBnx9&}wD!pu zzI;1I&0mjkU#-K(i#OoUS)1kml(h*{7j3}!xvMcEeIzo# zhAn@k1ge0~`ws-j*T{&3I9eMs*8=2p?SOy(7Z;I$E)uF0@$>MVmFoxlWW@2oTG%4q z@g6vM94c~q0kG*9kiv8P1pKB0P_`71wh9=S1%T(r3gX(_Phl>QB&ZfJH$vf?`uN%c zlZF#mh;$4YGDM`|*=L`%biUbzB$p&PDvQ8ECSW~!^njUs5XcJXRIOT7pt@nhhFHCN zHOx$mAV(m-diClm_qN+^!+-$;K$8GT<}SSOLhwET^zPleiwLp*3)nL+X=XSniej7`fddB$ zB$X*sCTtPE)ujLcpVw^NMYLE?DuWVCnN^G$H464E-+%vobne_)bx1%cGYi^f`#?-U zgx^SEtRuY}>qbDaU%!4JkW(3yf~x-bEHbkr093u7fByNn>86|XP8^GU^Hq_p=FOW6 zNY<}kU)rxvKKTT6=ghIraL2Z!zCzL};?4C+GA(T1zCB1_HBPi{-5NB<6A|G(>I)_? zuz8zihSGGf4~f)#_0?A*swCKIYix%y?E&53!Gm$}#TSD>SpAP}O$5Wnn~y&F2yAmI zn`xEj^Uptj*8jQ7`uruAT!K$O{ZxV+5(V|aMT-_`d}03$!d(*Ha7>WUfn%INz12C# zJAE$-EJPk@-X-D9lTSW*icPQ#$R_BNE)r}(6uw`cg~dSj>^|f&wod(;IrAiU7(DUeZaK#hMD4ypA2GoI*lg|_J zVW-zULFpMUZ|UirJd%;bv^*mCeO>K`z`YR-BOyiv6y|C}xKW_W+5h8lEZWJ9|G0r* z5I^u^{E4livHY zSFyX}KyD1k=n3T94KyqTuHONMwF25U0CpY(dZYt28IA%GmblkL`6d_yq#^+iKKP)m z?FgK>3}jMDDybPIrCM)7a-eYEOvxns1gu(JAlVk!s*hEvQbqUl?AcR!(TR}s>C*>&`}RezUcEp9 zV(%>zll$(w4>Us%0h=;qib?!*9655N0MFx(KaM-^yi*f9oq!Va6*%K_NTTc2k?#Zl zTw`WgBnqkvN-jkJ7A#mGfI#vfGDR{ZtqY$=!KEek@1ig|_~ZMBj4DEqYH9 z3y~Ru3Wf1prgQ`@Mt)SM)GFy45df+lS)NZUL?j7FMGU)k?F!bt)&d79<3%!wcb zj}u0&B~d3q)x1PufrNWB%`&r2eS7v1k>Q6PdPqdYopZZ%>7u^K^3<*=5YSP0Ba+a&cW;fgPdxDi zKK$@Qjj{f?WA)1QVbUr$Yt~HU&}$p&#~dp}5-IFZUGrSu@3e4*Qy86xbK}R%{&hS8 z|DxNHqv$mtv9R;-bm0{mx^aqs9e?=|QjsFXUIO0<2^xS%IK;f8g+QN^u?WQKRjVX9 zVW;@{1B_!c>ZGvrA}AyQinorK%gJ+YMh516Ifo!U=axs45gWq@deXoSbD|L)Jy;@bIB5XP7tv)J4+G_ zi-+HY4Y(&t>tNmphkOZMN147P&r3%CPD~1TOkmp0hmT_JcL%U~SH7OHb?qv6xLGYc z-lzt8laTy(or>sAO-Ikh)p39G+PLFaweTP3S3;EUv1;!@%-@r*eMKT96tSpGy_A2% z)xd~+$Rvy2B_Yy$6doh~f_V$~0KZ2_6z-X3c^7sN!3f?to<1N>`Fml|v-ta+*!@Lr zf`wzyvXj&*z~nAKjT%6o_K+Kq0p#rm$|Z=b1pR<39x$kONKJtV1&M_KLdA*|gQVGJ z&Z9p#*~03R{o2uNw|Spzli9X)U8zzfX-)`Gl$K^-uE~Wo4F>eh@p%lS3xL$BRm;kh zH;oNJk^nfJ{vLd^cBomUn*Y26gCZT2a_ha=7Nmtb=T2{De_>;LGEx~d zPPqNR+PvD6wH;?(HnSZ6hX+=s+9FLAMTpsM1&(P7rhHA%VR@L)!O_-g?Fd1#nf&Q* zPt516H~TZqC;PO>8T+Nov97u18jKw~R>UFLl0;*aOjS9KNxNZf!p0A-|Byh0LJ(=X z_*X1xiAh3Fz4==#d>KQC*+Lj`IpL>?r@ZjE;y1yH1fIvg3%V2rag-I52mE`(?A2_~ z=;G)&|CgIK`rZ=hw4N zhB2c?vg03t>H}_-i+H%;UPtq#2=dD_uJYe}v;=*k&MWblLSL#-6B1$a9n^Zv-F*P_ zwtSD(BqIk8A48esB-E{34ozxS1ijA7C6~lsj~vCSoq70T+xN)aOVUEEQG&=vBFJ#) zc_jIWiG(B~%J5{KpGRMY#3+f+5KWB8M_jFlyPicJ^v*AZ<#p|7BXkaTZAY->p%#XBo#MUkp!Z|AFFlvZ8Kt3S9%c(( z&qac8cl*~nF~?-r!j|`y|aD~6TZ95(pY~Q3#h@=Peo`#r#hl( zm0w4ych;Q*K@>QNTyPxJe8Kwm#}9KR*zv~5f3-6>;Qxj<+y7CIVJ8nE?e>qR4TSI^QD#=P;tywX1 zt9q%aO8frANqB4Y7~FG5FEFhp@5z)eyQRmC@5bCsd$4fJ9xU0mm;QS!*s>St4F7EF9;A`1 zY(I1ad;}4X6G;nuq08N$^qXU1Uk(GN+tt)O!Gk>&@m;Er^HH=lYtFRQd&!4l5S4|DlkBkBT33R*^4;% zn^4)pZQdjECu%QbT6NiFmkBsne|FY`Xq^Qm<)+b;1dZlC0y&KuHBx>KpwS|1l7S$z zF@YfGT7Z~G`Fi#0xpA6+T_VMLu!&XXV_Xm~31G{XEj2L{}sORELJ_PjKI z5n-UlMBji!R8nc0aY?Jh=M=azg2wmJcO^ivHX?6;lO{KM2CjRN6m{yZj}65_H3q`dMQQhMiI0Ixy>2(d(ju|cyyK(i)RVLBPw5zMpH)>hoZ1RwK=` zR#1bl*bO9pA&qY;O~lpC3#pMSPLy}Erz8sejQN0`hnV{`Mwrl-=u17AC^mhN5R5rIrYTL#hKct$hfs;zBv zCix(EJj3If$8(4mNDyl5LjW?`0Fv|L&`3IP;h(gBkne=>p~C%VF||7XXFB}H#q_f) zWI+b`e^ZMql&Mjf-`XPCSlryK#$_J+?d;#m{|q%lnhBwpPCV^u`4Xip&6b=H*q_J# zEJ921-pVFfK~gGY3uUrVBpCIV{=J6y))^ioG3E0n-3k2?n6VS=zYp&4+P;*&8NgBV zWAd0A=GT%dWW_4Vqq( z_Gv(igktaByACz~1??83G8M`NQ&9(MZyHUuWLP1Hw6Wc+djlYl`%Eo0)8cMQG> zw;+WsOn?cWWSHkI>BPBM@&Ujv0#r?$&}!)%PM`E$fvB3#^R}-tp6EZtdn-r{vVl)R zNYX7A4WoV>^bt*X$kX2}v}^c~2yF3N@;yR=FBlGu8{a7LeDZwnAi$D;$jg-OZ`^m7 znfk6XW-9pL`M8Q5LXrt_6j&$BN8{MJg6nx5HibNlWeS<-3qF7R_-uFne?!|{f8Xjk zxTy}F&W#Cm1o&B_3qCdOeBL;aXl}%byA-EJ9oXxcU{zeVs$rWd9!OQ$u7c%>ldJ&= z|A@Km?M~>iazo+8a>6Fx{f0Lu{Zc6XWpMCZNF4<)O!n64-tJX?_v9SX8f~t3za!8f zPYKbTcP$5)4Y|*TIo31@$5=tqkdNQrv)i7Nm^|I{nCXu{xiRf{{f%@x(&>{w9Z#q5 zFFAzi3grv#hc6AKuDe$Npd>I}CrpqEW=jI~7PTJ`4Z<|ax`n(}LXBXPaqg9zcC3w= z-pc++-js&(-2Iu5kIRISrkvOp8c<6b#WiP{*K4L=n5WllC5?253o&&d&3)w%#+0p+ zA`72!)43+W>rev6l$o>NN&+x3%^1t6S8_F{VgCDfMkdFGvOh*<0cB-fiF{O$i#V-3 z#$=vbEwmV`NH^IqX`90Hd6+~X)Lu;YT863Bp6>~VlOxX(v>z8}G?G&r)foiqF27&b zn~4@b5L81%1niJrKSIbP5^KHd@QKZ^;I=qXp?%QiI{Yk{)chZPSpw4A+pEexzzXlL zngpa}N;dhvMNCk}02S@Nk*F%c#JSPQF>JjdL~09=fC}i5xGL#qlej=4qRz$ukf^g| zQ&%+~+_U?vrWJ%qM{YuZcF#Et{LE;lD>i~+ZU-+DG&$dx)fUOWbSie}+2dSf^ zfOpU8$uq(dW0m7U9?e!K-aOs1vd(s zZTkV56LD9(?}Ulk_vRpdV|k^|MV(_wNaRhF-hc)quSm#Rcck7gze;P?u2s9BLwKHh{X+nt4eQsXfx%zZfUI88 zl@9fNm+o1)(z-w-Tncz;XQxZ{Zg_ZI`r*XMv|!=FSQ=QOGMz#4c>gi{Nmi%BNBhx| zbR=GGwIh!_v^MphKI0%T{y{H6*-5Uu>#a8(fZyKzZrc9J%jtnN52h{Kwo%WE-Y0nm z_B~f13A+5G?@ZeA;gPhcttFl1dYL{SHM9v55VZ`qjFXZUc}g}84gvoXkzBH2V1OBw z6wuD5^MCdkc1+{v1CE|m%e*GB1DMB62GS)v{*mJX2r`K6Elav!nGzkIN0cXkh4ffA z|2s_l7hxnflR!*5H(|`_#$~7T`m19_R6e(GJtGrJX|bP=hgL#YTEtENa(*c7+T595 z>RF6`OzZVn2ud8k=uc_=M zopW}(KW4X@CN^0~Hc?Eerv9{v5Y)!fi-=fDM3h3)8?UUXw1q0@onAzd6@NfM#Ug@u zVX&6^6Ahvwz0$TO)R3gO-L@N&rpY!5NxI2*X8N9odD-c(FT=Fow||*88D`G>ojLoR z^L_K2=lwB8>zg}9pCdgt^89%rIcw5IADgrJ$zQMDo-j+uen0MI52fbfk3kg;xTy%?jyMuF9yn2ERr ztN{1Rc?yx8=P%LIFQ4WwMoy>O{1t$UAgC7JY_iG}8;3tiCr_M!e)XUJ@C5C+?Zb42 z``^S&L@Q4`{`*!H1?&44zw!Lq!w>QNuTp5NB@(=`0jPNRD-Y1`_Wu@dFh9s|6SuP) zU}in=2KJLoB|o_LemZ*ONDH2D&VAqdCjIT;U-`OqPgsuAaBXOi^M0TDJV3b4_+wu` z&{x4g{kocuVGwR$BtBFl(JH=%5k4MlQwwG|jkI}xn`%C;p;EP~t~l@WYF#{Mn*eyg zx}ZE*waFk2`7k70jrIY_+je76?#Ft`mwAkgGO)|R+N{WxBeBso{|yfQva(ymB+J@K63_~aVG zaf+Z1Cvo(lk57L_>bg0V*dNPCg3mJq9!TP4ju|$n;Avo+)uRx9hE;yRe1>kA(NDkk zweN=%un+qb<|F;N;y81BR=>p;qeVh@`kpy$oSuqSt`Go}9jg!0Lk2{%tj|=TLOHIB z0FhBr6_qQE4N=-_WeNZPdGjW(*Vs?9vsY>OZG&`)ji?VDJ>CKmc$+%@;xyDWo@LjQJ8u0D`hV>9oeVJk zLBIU6s%(Y2)}fRaFIb zs$F;Nq@&NjKsPcKy`O#SfAPM1>F(X1h5gCn953OqKmM8SxbsfX-xJ^YHvRB>6R;zB zjDgC>cYcC?{Ij3a7^_!wp#M#C49NbL0U4l^wV{z3b{w#?81?{TplU$@)T8DcN;w1Y z*s<2L9-KFh%f$5-42k7(;8_s<2kkGgI+D;P*kJBf7ar1C&wd!e2+psE zkXyf|#u3t0Yr%ZXa{WcFINw-u0TY5wPMC-gTqxE~bA_1Eh@VW%DH8VM6pe2P42W$R zkct_QOF9G6d%?2GZ*h?#MHWyBQ&wbA8IYMXXQ#&3t-Y5SkP8t5;vy!aNiZN`PB{!n zl-soNdm7+$!3HEkUV1r}N-+v|ikg;*FEE>ZNzWliy%4eWKt2q;P>9qa<;*iWdOfRD z{Z}@-;=PsIEWMreSVu-j>B;{*-M;04A>|f+%X4IMiq)>3^PYn?&=~8Si(&3<+qTo; z_|+L=us_vW{vpWWBuy#d>`P6~1gZ=Y%%rkI{^Cgk$C0R`&B~b0KKK z?%4(p70QNyH3m7K<@6fGOavxVgAyVc6M>9K1xxjpk+dN}p{J4)`O_5eQKU$b1qBoF zoA$y;6j@L)K~aKb2Td_ZFv{ymr!XfekF*u$k8D7sKEvJw$GtH^PrLup`=@;mR~n;| z9c^6)9nKpqxdoyQ#rP=$c+78jd(+MDqi}TWQD*hlt>Q7K1qon6B-og1`*E8Hw*!=H z*sxK~fq6O|2LSQ@t+)8O00!U0$jjAhzAMle2)M;pk&DZM}IIMF7Q$- z^9g`x+k^dn6?`5|z))Z%4h_h|r(G(-8@vW!ie5ehc`!J7q+MbMFBgY)g(-=LJMHo8 z-4|^6JugzE$U;jROh}&sI*Kf|IHk@g426_U0thI;M9TSVNqDbyJ@JB-6MRtb8zVS< ze4HnA*eEq0(537q7voDWAA}%AhvL##KnKb!vgudWfieI?)Q;5HhB}vnxxD*bW=Fz+ zVlb%J;u+Y+(roiuc(0;f)wQt}P@_YRiw@w!G+bv5HJlJ0B-E>G&tbT)Z2XBu48i$W zAW9Pw17J%CY>4s93g!Ysf*H^jZj{3i9LAt5><7jQU=eTt)i1Q0IX!ZJEtF_1T zXeJd}dj>vmU1mUZ<|OW~vn#@Ya584Og!f_L^#YRo z_)5?PIqB#7c;FQBpS}%K2>_8fJrmMM4)B6923Si3_rMlw474{<_PG+jBYtdbq>dGU zAVt#OW5@()^~$CrZ7gPr4M>q9MOLV-#&TI_rYMH=S$*>R=F5^c_*e8pRQ4hf>%&T& z!k!py4kT@k49Q_Z`no(Z+LNkOdXBQzSGV3zy8#vkq-caJvVbM9M4b-*ujoo;$kvW# zx$a^c?9Uk*GKQ)KU8ygy%cx94*5RfVHUg>RK|+n($1U-!hXvSh!fXg41zTZI2S7qK z`gq`>P<4%GLMpHNWxV}}HQeUsvFL$;=s)XS@m^}6V)jNOa62CplCTGHHc-9N#yACU zgt?s8cu><5BMeOU!daqo7f{yTVBp|gYlz-4q`Z}IuB%L=FjWBfz5jt;;vQI*jyUJa z-=|0`%gl?>%2;QH~Z1&TDAsVUxI^b@1*i>+7 zD-4G7pH)52YXD(KtbhxrY~L}+Q6)zF0%*Wm7?M%_E-+kIw3CD-X~Da5g#)y9MX`;<*C}u*^@g~xu{U|QP=3`mCkt1D}wD12S*OmmENHtE(;tT9G;h2Sk zWWt60N)l1)=Gb5eswzPsqvsc1GC3$C>{=7gKAhTcIr+D0ng-`fx1)^D0dp=fn;(Y- zRYvxx8SZp7(4hB)1o>ML{k+oVx^DxLFDBKN7M&r<2_J8*Ex%@qD8?AD0NXdMrKj%O z;i)K5e+q*BNx>OiHwVYj?I1^Q5=R?MV^Ye3i8F}ly8#pP_hTpM`~RMza~Ed;qB^2_ z)mY?7G0_VPDY`_AAZeGf>N6t*C9bRB+D@wXjMlT{$jaqrQmZV z#enp|1~)_z(WoeKgMe5cTo9KBMHCkr#Xd*`UsM!##T7+VM9fmM2a<-+glr9lq#+9= z1X9dWNt(JOH@E+M@YCs#%XmphjNE~_=bkfj{+V-T&YACL$Bz@(>hYGA z7Tmmflitw<6cc>vHA4ru3b2Cx*-X=y1QJa}Nd?@y0>#nV_>!3vGQ0g0=r@M}2y-+4^3_uVqQ zFR+i09Uztiac$OaFe|~Qw*BJl@n!zB5 zs@-K*Bmk~OE7%B}2kbPz1*=e)TS2)td9yEf)IMt~%27Xc`?5%Dirx+yBBHch6zJ24E8!Q>O{rr?sxt)zu^uPo6yCq(Na} zAr>rHKw=mlACKndX3Uv02j|Y6BOwqnLb6a+Rz~nIa%|%{Y{$;dPLc+3mQ2EO`SN8P zK71HX;CuAiwQFc=Yon~GQ>PkvDvM;}(W6H=bLI^5x3;!YrZ}DCxxb1N=5_1VAtNIL zn>KA4|N9>r;;%24hn&DiT)gQK29FG{%t<3Ch|#}Z&2OP9(hGA@<)?l$PxV%G_0@O> z`u+GQfP7$ZNWf-L;?NkzkVLm!-Pd&g`5Fgx>mD28e|(VZd^<3RfNVp9gFw*4pyiCv zv0~*q3WWb-bC+;1!adzRKSnnWQyHzm%Ol%=9|WcVm`n{2sQj4@;LSTAB>{;47Kk+* z;)7Z$8-CC`apDACzI@3+Lk1p#*IT!4sfwL>+*wUEADy3{kE*IFP2zwxYt}4XLcl?3 zIPb(FgM>%-HO=-gE)Gq-UXzzBSwdhf#EEr(@!|!xY}vx=aX=5t6Zyjd6fMt959f8< z{coGb)@x@}S;Gxho-ZC2r%X|Cr*e7mIVy6zt~{5va*sB z5+x-i%qswueWgwtY`Jm>*CWIoBWJR{ro=9ET zA5{K$1~IUs@2waQhK?EOswEet`@nuT@$j1k^UCo%K@9z8 zhBwMW#xuk~fr-6^?)(4izF&s!d-8bYyE6Re0gORoqSt)?A;g1P5Jlj@5F`NznMkCr zB!OFtjQA{3N9gfyjMaZZ&>%p4Kk&ytAn}+M1N`0#B*z1ZKLEY&fuHlpP=vUBnxnAT z*jUb($r1p9iIkKSY7_t{c;+m6d3iamUcG7tHmde_?AXEe$}%fS&~W9-6|7vj(hQUY z3-(|ngBxeZ)~{cWg9i_qC0k4rP(siwGI@OA!i5}UdwP0Y@T>c}B*8@1UC0NQ2yETD zl}isqE@uoy9?O$*b@0{eCQy+j2dwLc4I5ZrB`mvl??z2c4Kx@~^piLP1wgID-o1Nq zw)hO!Y3)%vuBSoG%3e-?AT$wkUWoku+I;b19vLr zTI6JiC-O=;Pg#6!u8#sE`5!)fSXp}w)O#YuZ{QvLIiyB(`}COEbOpif4XtFG*eo*v zX}el2hvlO7yJ@WQDAsG0B>_HZzN<&yu+k|tl5M)SUEwyF=C@iIG;9!%rHSMtmXGXv z6`#K=ONg6)53eCK6c^$)mxXpYQ>GmL=Ta%#zgEhRzbXlVjCCxel%IU3n11sY295vl zW4*?qp#evYX5WcAQRkH$`Lf&a1tB<=;~&%F-5d-v|ub%+5_Z6^Sy>83==pcr3h<69W4)%xFY z#~mFp(Ug!Gi}&h}|1+ywQOz2^u6&GIi|OG2aK*7weEZ z75MRubfo|&c>R-4KG^{`-DlYAKMo+1tN;>y2SA%(AzIdFo_VIzwCYyDJE^@)o$lPZ zv(tcDCcd}d3v1V^0CQ_;ML}{vsco5lYWtx*Yu$MI>8Hzy6DPX1CyAwfOROR3YVz;7 z=N|iA+^28_vVGB}?MIMr+d1vuduemJ7}2+tCG9)Q}Gq z81$`GV+jGkce2X&K#5~a8tFx?RQfiv5(mTgXR` zG)!xYMvnJSx6NVj38n9PH6B3ewTG8*4yP+l2+efhd}K26uzi8Eo9M>EaXjp@$xNNX;e3 z9LN|%)q;|=mSEu!SUmq%*@!LSmmE?=8s#Jb#mj4H(Cb3iX;Z&C-KRw zIF!-r0dxXBKtkLo0{kRLkT3xW1WoWp`2;YTQD^)1?OkxMWyR`aJ6KECM@lI9=ENIL~8{lMQiUhSU(~M(jIMlQ63N!ZGI>@Y>y}-@*LYWeZf4EAliMG&W`v? zevmKTk4)1N(tqZ)o{-0qH~O7q3t6H?0W#%AlBB)<`s?Ms`|j(2zjcPJ)lyjp;zxEN z4AmC!eNwQH|dl&se^7Kw9i(&hW3(B7K1@1BLqw{zJ_sJm*Od#_ z)c>WULo`O?xCYtGiPAc4oEWnKM7I4I+QH zdclx6Yz~LWp~N4fTw00 zv%78=fLVi`AqWBUf=|eaV1YqQ_bXBcAc1}ozXikOn?qVdLQZfeQZt%snL^UP8Dt&Y zNFGZ944YS5D{EQ2_W1GR(ax#Gr_2tzJkRrhB7r_`MQRTL;R2)p6aaUu5*{Cj0dXGy zls$mo0XV=Z;0sU|D~Mo<*=Vc}tUt+1V3C<=xJROrJQ5SaH}YP9f}j8kh400+DPOMl z8m_lKxi{ZikVbhVGr0!<nQST$YP(oV*GHn=1nj0?d2B`+nyS~flRi#+O@FEt z36UMqFZr)uP0?~>>#>qgi z+)BVA*NEG*u5e$~atUcsnZdi~yQI#oV~)Fp^r7sKI3NS+cr@iFa#!~_WV1>cETRUU z^K9iupM)m8MWIi0TOqSPc z$Da3E_i0ePRWh~?MxIYzqzpjvEYGvYb><9%*_n&oYUn=1JG`LVj~ZcRX4>m9-aqi6 z^TLf8#kjW0dnMyT{E%C~xm$lv+y>b5+gkv)-z&cUuihnY;62WN0h7L~Ne=NS2Pg+H zfb7t;oDL*tv>dD$w48yZ2Lc4O^?gYJ7l0TCH3lcA{l&79U{+lTh}oET!NKJ1MoKvn z!{I=VCRU3^$OlQcE3|w54LQz0QEX3-Mj_>jaG*lGhsP!lO#O=3hRTd zPiE@-qCu?5SmHnYE(E9QLWbqS!M<{j=#z-#>GR`ihh{X>Zwf2`DfRbTHQM8~w0t0# zr0Wv|Ic-QV4=|P_hfEM;9>OkpjRGNg5XYo;oPOxU7PQf5-s?W3TtGn~LC3=9K5Z}g zVI2|NlC+xk@q(#Y8gqX;5}7}oWo^#fv|LWm%Dtx0@SWjC@hlZ>R^ zYjWW=kylr{-a90cIOWD#ACsDtv@v^|pyU}tc{JjzvtRLPc!cM z5hT*|i?$)2cT1Td0Rn2XfQ}yv5W;+C3&RhSsS_6BYj(gq)US4J4sIBW;Gh+fsIwotLAJq46Sr-r8nhANXN=E zkC?UG;f{tY!tYA?2S$aje+8E!ykwq#hiP~>GN4mIpO3|DGC1(n8vc6zeW!k8KoWca z7(wU05GUba6mr7e!H_{RAiExrvY(_sqoO zz)bMBU>&ex&?T`DYE=O_#(?005VsM@2v#5iGa0Z2NdSAbdXOy#d}3h)`2Z?4ssqV) zt&#&i1GylIe05KwKJ|;g>#n=X)~#DJGgVEl`sBm76ttiM1m0C5@xTKQ2-a|wNS)+* zeX)5Tujy%=1(di~30m+o_j}@gC1In!tfM+nwrd)|t)(kZX@3w}XEFkC>du6=T$e@K ztAL(<6?veG5MbA9=-0+3(67x45UqCnl~-Po7|@?=w}~?#xlh8CGqD_9zch$FaS^m< z`!s#nSOoHj(j;WaI3=u`J_AzZa{=gHzZz1A8L?T)3y70eQC!h{N8Cpvh+(Ybq9^YBn#CKKhBj1&Q5KX^ZNZzZj zzM6GdROV3c#`bXRDiV-{Z_a%9v_&EYNXU$U(FQ4Lkd*qm#=R?M0hzR%##;*pwr04h zgJ~M)=L&!cyPOCeSGIGG=@d8gT_NUovG3*M?`rkYCGxJO$P5_g7}LsP?YLAbnw#?=F#SQDr#&x_QzdhVpfB-fNlp*d?m+O~Fpl}ClmoAo@&z&x3H&O?q@$i(m zwMS&8*_9CG_%s$0V?Zi*s_OX?lDtcGellbQnR9{Cl}|J&AGLw)%QT;37qNtZr+@m* zQhxpSqPc64bGNeHq!{HpY8;yB$DILumWxBQkIu3LNpN865fx{1!d=TjiP>xf%>ahv z6HRKacR(X3JMkE5RS8}dOmknQZ5N>EPBD-K<&Qu9xIxwgS4x%$bng$=P8Z6IJC>Dm z4wwm&glu?>a}p4Uhy!)Bx&&A{*yG-yc9Q4#j@6XG*;^0nYb%r5M&476GJwLMPU=A5 z-+#~4TjDwLjQC^&4lOU*PQeLf5?q921Q-Bd3>Zy)oyZF9s(N$PQ{v>$UUWW_d2f6;ozHTHknrRNf_#5rAh=!f=ICR6Yk zkY*=%V4vrD4X&8xN!*vNpTreNj7iEMloeV@XtR@1w8^PcCkG%dP|J7RX;I$9s${#MjQNIIM^N}EZ?1mQ1#3`&UK5O_H~H|)Sd%LO z0yWuLj^NSujqN~{cHBjXL|sAk@8NBfee!dw&kg?;moq?*a0%G>-tiN^z3u<(U2BM3 zMHc?Ld!~DOy64d|nIvZ84vB2CY>4@@$hwNV3krfP>>|FR28|C05e0vUf*O4OkYE(S zw+UiI{SjXT-|t5>F-FBCnin`@)Oq(zPo~q;efwU&`Rvk5F_%(0Mk6VvnA=r#Pd)Cv zRp&eBRGrQl-CU%7i~8XI>FV{g6$l*&k!*&bi}okS~0 z#86Dc0iR%?TtqS3F0XNmT2k2Y^h3brXK>NFx6#p>K`zyZbTSU@p+*3iAjLu$GYkOC z<`I<%1ouYsBRcCkOD3@~MVt4{?_%9`m*T1ip2OVv3*c4Cy45#iL{^f4T6&{I|t8;ne>ko11}hr2?Y`3H(sgQFBPwki@{g z?bvwRGMstmt4Ouvps@yIE>;cU5M$cK+q947AZbrbmifObEli=}VX!ob>R28a9|Phk z#F!o!pkXA+@u}ZR(4R7e$gDZV^41<9=!gPv*0b_~pb_vFVs;{izM&%4oHZX;{_hxK zu4G-u;fZUxW+1r1z*v6V4lo#8PCti1rZ_+)!plXOwvj~1M02Y^~+xM^9o zzA6h&i5Dc28N8U=vhHv zfcaqwuI{5m-)g_i0wld7ZD}y9KBzr36Oow$7kb+UL|Uq!jDjS)Cf$si2^@=Xe^iF_G?si`Do@*Q)lFJz3+ob- z5iZX@E1l0tZ8LRpT-9f`+w{!<5cPv~7?Uq!iY736H2krH#jNW+4uNjHyXO5MP>{C5 z3VQcwLL_r2O5F8*Q9~hyl}GK?)h4$CP=zDX8DXfs_Sl>BaK14u{WYA6*5N?*7t~QL zW9@5syt6-!Ik^lf0dU1B0a}{@&j;$D?l+~=@%+e0Pxq{@3&^7$Adl(;2*)7eTE8Rm zVdZJit$X0QjsPAe9j>%P20$G9H=G;49Y7>LU0MVPnFe$yB%(lxi8TO{?dcm_pX==C zF4+L2e()g%V&9%Un)t}D3V?KwS_prdC4Um6;LfqQSi9y8}0i?c3S2{9DkeuK}pY{CiuIt|UOZSV{&)+I0EHRpiF zY6)V*m_9`_!TNb!_02`t^X--%-+vo#oqhD*IqJRm< z7YUTreh(GWlS9H-1NLuz6}vXvgXZ&ZB12jN3S)qR#Quu9j+qDpOd=czIsixzxX)eI zJxQRtfB*ypASD8jdG!DgLtb6z837)6i~svHMoLRCdPXT|VjTF-B4Fu1faXS%_p=ut zNiTV$hoj-h4rX&Qqq#N=u7n5FlIRpW zYT2eckUi5XBbj|-G@}0JvwnmN9bdFB# zu{FOnZlP<}a}VD;?K241Wd-H`)&L|;05UR605ZGlLh`8NH2_kz0E8Wb>A;B%IwB%O z-!i9iXh;I9ysi%$0CA_eH6S+laDb3lgw_L5K*RO>M-52-;A4~wS{ji0!AFr&&QG>& zljM;ABJ2Q1li89VHp(dtZU7=_%z{79#q00U&ikZ)Qj$6;ruhZ>9k}TH^KjoIYjMuG zOHuZy@fa%L<yuWc;-Qou)R-j+a$-#x5Qypb{`X(N-X~UL-qrVG zzytce8vu$$Z~(0cb8YD#V{Rv=v9M+X(*#R168Hij(tyOLG$03U08%#ysRTOlO5+z5 z8WTV^$?}ecE`k}AO)vL7$QK38hg>vVQaJk_N7;z>MbNS6IqGxdyX%N(uk&{#9R?SZ z5x&pWce}i+Ev|O|?lkB$C1;i(>>{9GI5|MHL{1PB7!gE4 z5Jfx$QMB$r6c9xPy<-)Ll7k4MD2HSbP;$^k$r6^`ojg4q{&TOctERe`f7jl!9(T;Q z>eY0=*ZrH&#)l8Z`mjio#Wa#7fbKgV# z_-f@+PW)0xi@a+YJ!vZSn=~V=gxRw0OI{lED2d4_gaUpZcwz_-Jw2Snq$I`-AH?46 zo2g!}0S9+&XZn}h2?YWS>DiIF+kPf3GmC)V$I97%W9~a+Ns8>w)BS zv2o=>)-9bwqZWCrUojtl$pvoi`7k{Pk0v#%8frLt>f(qaj{hj)BsPvKCj`st0V#V3mKN>Fu=9e%AR2mX!eQ_2h*2)MoI-?F zL-xnW*o%`GHWwn>jAJj_61z;9fsVoDg{EngloS(Pr{C%!DJd=%+hv8h@RVd3RaHgq zM_ztDr_P?EVC@bjt@$BBKAs~huNBD;PNC%9NrY4#W9M?5k^zAtK|cDwIfGe?R`brB zWqdN>6;A!~6E}43%Eak&1o>FBZaa5B__)ZAkR1*j&ID8);U#bv6=BE@rp#H+{Pnxg zfE5eo5!NMsJ9|!$kC)yqVD7hjcxT~PEGT%No!hsfJChjr%0%*R=oo38n6>3+D%Y%! zFBk$Ks7WX|S@-!eK|Wrd`2`b~ZDz>iS-d;q34YwR3B_=tN=^=czk#fJO?h?kR$iF( z4V#wF;m7Yb5!5Ao8u&HDt5-FslG_@9>4SUl{nslgJg}P!7fWzv*FjIMjK^?rWY714 zeBAN+r#!g)C+?WIlrP5*=J2k~cyZxV4FKFKcy*b5YnKS}@yB<+=8n1h$$w@t>xOry z_{?#_n!!&iKH_+UeBAKnXWTS(GcATpV#nCNT>NPdwYoe&(?M^d`8_myWg)e0>_$pL z0=OJVvJpk64GR^&#J+iqfDxmfTy!{BERQPYc#Pi)%83}3Y(Bi@SxCgyuj7a#4ja#4 zOfTVobvRTU|GkhUVk7ptSF%|%Um|3}wqTUKx5Iv(a=EKum0eZQN>uF6xAt2_3S;J* z*v~}WRSsmE;haiTq%$sLGvy+R*y&R z{1A<+XYeynEfK1x$TYvD6B`bn7NJ2-S0a_FWCM^!9igbnV%j z>{|7Oe#iX-o@Mcj4~Q)4g$H8U?$bCD5(ox@RIA&FJNoqJ(7wIo-F!QVm9lXrr9@gP z$yqrfx5KX*04O*pDsl70rv*Iq=0`Mad$UNmZ`HX6w?6s|Ti30oeuu7tP$jt}uIX|& zj?{Fjq*b9){}KFpct4Fg_CPoO6*r0`ydeoW_31Zz8wWRj!J<)*08p)7L-HRPNxd7p zA*ZAXLerpAFEX#`fFDT9ZA;@n^`r2+^;Bxp6~Cqf5YQz;#YGf;{xNyaO(CgzJv3FP zO8(8H=G3O>=zg-2Blc#$PTq*=q%~=S77kIh!=1EB%R+S|5O%nbQZmprMR=ujR}vC{ z-4~rXE=6m3Si`BLXo3=>lCKmsW?1^Hwhby85|5)fjFqS#l)GGYh^#*%`^M$f~3F0t94&;hB) z+T`i!8F<|uOyM$Xnb7o%jB+Q%s;bV9CoZsf+W`QwapCr#!ws-;2IwJhxJXnygn;}? z5`AvDk@J-&G5)#7nF8F^Zy;T|_ae7tKEbd?NYMZYgjAf0Dsnee9drXixhZONX^&`Z=t4ZJsiG+GNwKBfa zU-7607&0258>VkkCaGQvTGePoqi&DkExy3ftzWWs?2~jHw~!ibJK?!-j#K|w%9=CB z&_Y3+$!QcH_>Ni~d*Si>#C!oE)~I^j1b*Jb$#si3_SxUjwJ?t4bbMz|;yGDJLbbX$ z04Y5SpWlnF1ThRqZ+R1%s))RnprQa0fuNtD4kdvgL|4NSh$a&z>}tS2Qxrv%j;v9$CT8V^vOoyh z$+D=XwBtk(Z>-(RinUuwN=c_EArr;nLg1#ypzHHEZy8AFt}(QJZ6WvHm`}S#HMp1P zj+#wq&~p&AI^D;q13U4AHME2za=Jf3>k-pw{o-`48TvLiP5+(-kG@PuQA9$y1cbs0 zDl$5d-Q_`=4F8bE&%8&&CnwN)%6c+7bVHFGNI)RqC8+BJ)G#4U!&7t?ue$`lsuB!` z!I>Zk)oHgI-RlNTj}Diz-qIH3a{5tP|;PlqN`h7_3HbEVZ?0kyUig+U+g(vDKH?qe6(a;KgU=z8%DAPwVL$p3klxP7sHtdN$ChEe#pqds9Kkl z1PAV;KhQ8clcNXs@!7(;xRTRp^M|fH@YFB>ArchSB|@43Kyj%T1*h;%sD=#AL_s>j z$N+*g_%-mW5He)sluUxU%;}RSa7mDRLl>$vZb?Xk{ae3*f075)5a;Mf6c=BlG#JKb zIPmKTctR?AN@d#JGl1__&ZDTfl%O+()2C0eWA-?*nzq3!NQ;E#OcZ3pt%65|AhIAe zUKP<-q8gNj4LpX--qrJ1Kek`QUJ-6h#~V^8Ie(hceH+1*C%s zs?@@L{0OB-_n`=nO&A9d36Ou`4-k$S2 z*5NI=NKgm&Z^txk#$#PR>)3J$w0%e^Yg za&)yev41r~lBAdoez!T;RRFZME9TiNS(NrIu;yl97YkvY7sHNG1`mc|<5aLssi+77 zVqs`@8S$|b#LKXbiNOl(Js{C`Dl!Di4719vT9r2K+R-X6k84`Cq*d$IT-&CNASV_L z5L;-P3c&jl#xdr_;fx&h0vm_-AZ6|Qcy8_wby|a}Kw1^(^fas4E@SIz-o)LnV3U%i~L?85EwaAN;1 z0xEceVE_WEPC!F=G<<;|XMa5;L=Urb^9UR8$(SK5n>L=0UmeWZV}*E%iv$7j=@M02 zT*ro)Z?j-@KTe%KC5Q`vJFMfyMbjQnu>12lEF1YCTjssToSw}|&HV$_I^N9%#lREr z<2|xN5RHqXNq9YOyywqEwsnfbn(%6Pl`sKKr^c;)2p#>NEq!w-T={XN6|n8GJdD&V zGTL^*7w}W5O(zoSUc=VD`TV^2T@JkeJbVB85dKhzfT|J-22g=OC`eE@$m-mObDw?4 zp*Q+*B4Y3G*atZ}Z8&}d(K34uq4cYnoG2K@*)L{rVoWcTlu9U-YvBIp{L`|~0d2t> zNC&ooBu9}9YXvOXLKvc0gf$^uHlkb#AetP#ZS9ky65cDO29+t;IQ3h&b16Kr1^R8i zMB4(7uZR8{pxr$9_K3M4i2X%ptsQR`flyWT-(Gx#!(r2w*skDTHLcebt@JKDrmCu% z*CocT1gNSi8uo}M^2Slo5aOO^&z{9FjNg^WY}&MmJ$v>LIY%gauUoh7swUeJ5m6yD z8WAoPs`F-x{BJ7yIcf^M3LPkm$3x7iq@)B%l7v`lM77^_{7<$38`Y=t7v4@&E=7|KEEK*ySQu864LW-!L1sQU5h`y_6a^mA{PT8 zTy>gq*Q}jnb?VK9fJU>IX3+Y%cL}9cjqHbTG;TxfCnw?75k$kMgh|WqNOsqU2}ZVq zVTDlSHKeL|{a&b?LyO6qsXlNjC8v&3`rC18K0B4%KTpS1r8YsY2R%81+7FMW#-O+G z2ZA^owkCJ%XCyaokI&~uP0OO%lM{r9px5U`uUd~*R>;!}=cOLNs|ea}i$H0qrY8+jM9X)vis4_8Cwo3GQtOU2^~f z=IjLBD)uf6!jU6Km@;Jw{rmT4+O%mD78YWDrq--k!?7aBsQ9XoI9rcO9~MgUHh)j+=ic^s>wR$O&>=c^?uAx^J}1eNLN~FDxL1Qlj0wKfwNV}NDAN;a@#uSs(CPG zXrH5IGt}D6Y1S}@Yp=^iPDsM9=;-KV)@;CywHpfoKgr<~`3*ir1tc`XAg4(lIl1}# zAA4sSVpVd*@pIp6N9|#Zqch{E6OCJpxS+U;%ShB{M8^+;L_tLaLELbO3nGf37zIHQ z1QGn81{V+)l(@tV5mAZY_95bujfup}sI+$Xd+*-->&Go}z4V)ls3_RgR9D?wd)->j z|D02=Lizt&RgF~R%OG#h-KC1nT3R>#`c$k-ctQB*7Bty z2jPD#6)co=qe2DLy0$iJCGgYAg0N&^5Kvze_%K(N`rN*1howS%!z5s^I@F+$ZlqPM zl4V1MJ(Txk%#a+~e7YuBuA-@dkL)hZi5emon0$BrHC#*G^g?;>{Lf+cP^&blewpT~l@ zKX&YxCt%=eLX5lyr!?c|JAd*v?=@@I*vy$TZSLH;v~~LQ>GrASz6|vcfkga_yfVs6 z^+`rM>SzyK#LCJ_{6C?7!uu^-wphD%?I6z5`N`J*0#Utr8w4=(UanV-${g?MecE3@ zIC0`cIO&Nsr|j5l+qNwl4KmEr;lqd9$7teyVZE9%WeWW%<}3Z#rcE2$wQCobI{N-E z^IfvmGyGZR{{8#7F(Be5`#X2;um*Xl^1ONTU{YzlXN{jab*ckSth?{sL~p=+FLQ54 z@_ohu^^EdfOJWkeMF5hmK9vO`(m*8zC^Au8Mjk;rZl=B({upI`z`ChQ&*gc4y7j<* zf9j4^J$xpjEDu2N1S)PsWSW#O)>^S~Bm45xhSo60c?}NSgINl-qy^lB@+)!V!w9b- zoJ?KW#5aD?DiYybsxDY4e~AS`uHF@+f+g&a8tLC6 z@v(_bj_0~YGVkjc#<^F|Y~(HC75yVOpFAx_pGWjVg++}18u=~C$tD0!@D2{4hX$ai zG_pp56&SrhB^Q2cjMcwAA+Epq-Wgm^2pl+Yz}Br>XUmr_=Xt_}3D&%Mb2wW9AV?WM zm*ns1)2Ezm5~0i{s9&V>8yXT0iRC$?_02cm;Kp-}xUqpd=F3e17H(Ys;)^fr*|TSe z^Hm2nv6yLqc)v-LCXTa)O4YA)`KSzWMZlAHt5&V3m*OMEdHndXwQk*-x~mPe$Codc zwj|aC%FrfHT%{vUdehb>OI;;_@`rJ$v@p`Sa)9MZo}$F=NKq z_3PJd_Uzdo`i0H|aC)ymaZ3Tif|o zW5*fdsotmoDx*kzQ#4jsBMV{{8#g!i5X%?AfybkoU;|3HX=# z8Q!d)&n^E;u%QpjP{~Ta&n_?fT8!v@NI)>@=M2zb*) zrX#e;4u9yZ2OM#{63<3nSn`pD$R$7C)e>$-`Ve9te-IP>5cdEHbnmeN`Id~h1OrA~ zeBR}w7#Q$OnB`FEhyXMg!Xmvl-T@kjOT__ol5Mk}6OboHBp|w@f_zEaZJn< z7A){$cZiS+7cMxW8-if}{{6Oj^Jbere?EQk;K2ik=pH?KIQ?x1imh9>LL6&ML6~F8 zsB$O|@|`tnmdgi@n+R%DF^(KLV&le*qi%x-54P^zy912YuU~J=mMx<$lO|1q=s9@s zpl#T&!4@xGjC3RB$RRPfd-pE!SFBiJy?XURDx$iuiN^I|gB>wqgpD3O8nrXE0Rl?> zldLQKA{7MMs`_}&Ao}Za*`S9F8|FBL5O30B=UH_Hw5Uw_Z|TydZu6(l1r8`z27+$& z>eaS!<3=P>>I2#)H4F$4)f2!Y0*-tHKyan@fO^L9g(V8*Rn2+`fUcQfuq+(HCv4lxJ1b?e5Q-n40xtz5a% zsp&B0#4U%Y)_5h}(4j-&nk$?#>rKKWq(-MtpSC4SmcVF;83-^GX3UsjefsoaeUr4A z_3-G?qt>ED3(jU}ong)^Eo+Uy3Tw9jBi~kQ25XZ*WnEB*-A03qDxiJt}s9(fT?e0mKOMXwR& z!3A-!9*kJx9iJmDy-2B6CB5lUAC$Z21Ghq6S^N#0dYb%svWQh&lEBCCl0}7kElT-mckbK?XpwXW zVqAtcX%kLLGf-_17ZJkg%9ShDuU|i;2C5JFs?6kuo7{MloJ#5>1GmtbfddEHwr$&x z=%`QVzqM=E+Qo|(AqsBYx@BFvcBM>lh9LyJL`V5?&{Tj0@Td9%Iu`%r~9$fUB-CP8xw{#;O3wM|s}EvcU&)UXmo{x}>S} zqd*9Z6)|dHOsG$hd~Dyo-L77}%6Sa+Cm>J&(o0YQA4=yX$fQ@^NN&AaS8P~w1yryy zgr^MOS!I%^7%8am_U_%Az2SWuDEsnsdye4pnnHe*~5B0L2QJa9-_Do>=8Gz0r;I`jVjv3LHy zRuoYjpWXZ5`8$RV8!IhdVoYc(NDQ%|upq?F1QQBP_!|h4AQ~DH5^10SiKUGV7FIU? zXar-Su^~_yBqAd4^1!?6$4};j$z(5kktdIYdtP4d?Ck99?C$K$`JV4Nvx7`#0XS6t zV^?ff?1pHdD4$FZ@r7**(8z9NEx*fTFOyH&w_qvpZ#{8}#(P+fNmd!y$a=`@8kws} zYdyxMud^GL9p@S9etjjS7YI7P0nza8=PAAa4ur=Nz~nmu23e-})hz^--trMt3Wk)s z7A_QSCoQb)S~{6Lw5FkK$WB1{YxzRL>aU`KGV3t}MG8`w6pbH2*>>V%TX&>+lpR=@ zP;$)MxpSuzBNLkn4wg0ZvZ8N$Ifozt@w^1mtKb7bYRjA3CF6m(jd+gCKB(}cENSt> z@~09N?g_Ib*px^k0yM5)CTQQjeS!#>4FMCeDS`;Z_Om~jB9%BS#=4MU!4y~^0vX)8 z>cCNf4Ck^eiwUSmBm~w&0K&8NKJiQ!3f@Bg(=zw~2*GWhj~PM>7I$))jyZM&{4WE-B+*PanI;5kNH7t`3*y8UDsTPn@@lW9srHh)F}i-h=O6Fb@N6R5jR$ z{DFY-7SNG*EjNvTV-w|j((H2I#6$Qquea_=)Yej#lvU-+C|t6vtDBI=Z#!*_326dA ztuvy&aWkclVLm>3E2TZ#Sp*E%|82}C7p}m9e3{Z#jQv;d1j3zd<=nb;t4cfWPP$Am z;W?o&k=PedJ}RZ%$tjd(m1-0Wx3R>@lF$#M+}umiM(jdZ_)x}GpeqT5T;;wj&$(5? zL*`q}O5hP}f)gtDMHT@!lKWX8qpY(G5ZBrp;DiafzD~DE$I3z8e-t#`t}4dD-w@g= zK;gdY0Mxok2BU{kYyS&& z4?}@&kuV|lRT$34{)2<}65?yTucuC(s^5R_En~K0b+9G4p_-5Qj0zW6$7rOy-?86k zR7sSRNrvgrHFf{~{W2boOSuf=mt!xYfe0g(E@8OjX|URuaVNZ9+QLXa_o}h|2#^>7 z31jTVIO|cT|6c}VHo$P-SPaNaATka@n&I=7GJjyZmiP3?iEX+KV)%*mOTWKxHSrOR zw7L}G#PQSL^A_uV)h_u}@Ki7zfBPG5Rcw=*%4~$YRFlh*p98hqf}xmZ#k|Xk{nT`q z%nxRxbgxPoNOYa&wjN_Ybb}&adPYEza=B>+2Ytm{gxi)4cSj8n0z{-pm%kooIz>AE zD*)5Pwv0dlCTdoqWIa+PLm*_J%h!SAZn`fu0uKKTE)Tb>C&Edp3D(2&m@64#YQWR0 zH$V3Uo=a-IWPw~heiDp|CD)e$c?E!RgAmmRUfI5sAQb6r(Y~RIb-=8w$W> z`*HUQP$A>N^&6y*+e#=1-XjzYUBC)!qdXL~ECE@%GuWFJdgPJ^+Y$yLa#QJs|c&x64pw z`7IZTuzx>}65}&*X0l5dBfNhY7-BruumF2)yazEJrZGt9dI|^>6x6^1=E^ubj*+Qi z40D-e7;fty5Z$Q&DH>6Z9z7~!!n4-pHrMZd>atxhDH=ntE^FNtmv8YRK82#$<{+-Y3{f#WeBsVbtMq7TagHoG$0_MqhP(Jo& zz+z2;k#^>b(bG;#3M2)h)WI{-1&jLoRu`^y#~=A|UZ3K!L#W1kXR(H1WPj^50;0c8 z>60JHe?Fy4bcHQ8&&OC_fs+o3s#Ypok7OKB3Jgd*dGcgX^SbqvlOqbZtN~!f$#2)L zU9u%iQu-JJB2?yMHL3tGxCxn8iTeQou9Smf;)*+1Nd+~uDU|*4SQ!f1sr8T5S&V(4 zEl%25bjK=z0@o21Kl1@f)`@$WtNI)`aKONG6ea5?;M;ZZXW$V z%>YR2AOPK!Z~!qrUlhPaaPLCyM|?*B2JsDa1$#C_F z73GW#pwHX)aSPIIh z84AWrnN!4L^1H9@z)F0ML)*4(6DYEJpe~%mcnJRD+{K4ueFo%((MMNXp104II1~E{ z#JPa|gwY*YW6jU^U53`1{Q@zKMV$b&GFhEKPJ-8o0{AO9ex4+-myy>h;t< z^;~)qt72!kb$|~+g5@>#tB?vF1QT5nPy_=(8IR5+g8MvnEgzFQzy$-%YClC$n);m! z5*b|N0F(lB1Q4)Z(wWt|lI{g`5yv^eW;yU{3JnqWrk|~L- zs5S3@qL~#}9yCRBO{RqY~~vmJQ~ESP{$C z!an_$aW@d8u*#Kw^iMxOxDb9g~R{v$h zeBwNum{HWV95Sg}7uH>a;Zg4E_4U0LT%2Tx`1qFBd;Iuu&lkXkwhPJ*9Xh0o6oK<@ zBL;-yvZ7MK3PM^US(zr>$pj^A`&>{aJO@gd=grF`>y}0v^rgoI#_K+P`g8&WdLPc6 zJExMzwW*Bo3>QB33z^r&$}xcW0{b+|t)QZ0(uhZhZH)lL9SC#*=k{3^d+=RBVb!3) ze)}c$+wTF;vac8zG&BUm!h00;x+)xs?qk$$-gzuu@@^@k6sacI)y8Qz>68-@MD})4Sky!)l#XIhq z=||~PJHnGWDjrP5g)=Q1`SZ+mqLNAC=lKHffAItG zYYQYn*9~M%Q^Yt0x;e?gJ>2`{F7~EVTxt?iwOZDwc`iJ(P6;du7U_@xw7H%`(V1?S zCYM$Xvv9O6!3VFG#lk^d0Z>E`K-PGhu=QbGx35Kkm?)&EZCJZ;!bSveFL#+c}z;n-%ruI`=ErTKY`Z0EPOK3e?=P zI7M-{DG*lbj7Nf%;k6`u+70|;k&^<|ock-!0RMjs_9UxK> zkmp74Q5n~K+-=;xdBk?l*XA=W=0@6zM8v<(@!jtG`w(^bzLnpz-f{i)LvOXS?=Db` zXN!HJy!Lm~x3LVo2XXVnKhN6uEN4xemDJa}1MXN+-o^G|un=|B+c&@mdWIGdQmUrj z?dMaEOe!Vy*7fTKB-W`|K(2gqd++V5fBWm>bF+Y)JuznDvs*vlg?Bzj+B*cAM8MGV ztyjT^i=u@*dJTHxG0b*%@Fx|5jV0Cr;>>8p0zkEzW|p;`=zY`z?NI<7T`eBPRa(hW z)|XYvlMXuWk<_QR^#i$aMEYI1&~F`~b;9^ks|dNIeo9JEuv07ZuI={~zdU6@64Wu9~`$-dWgIjNj3yt(cR@cc#^ zX{3=VboLgI{cHjG`?Z&{1>|7B0uuRX?T9i2S+s6Mne@np1KJ}XIXMeRRJ?g$N|4v< zx{g>!%ZD8E&_lC;h&7%EQU#hu@Z-S|KD~7t-TftIB53 z7qpW}2-J4E$h(448~9i(3ixOZ^u48_OfJcJ-G;yI(a2_ zLwsv-ae`3o3_uE21X>Tu2O9v^A70qtY34Y~@4pPot0ZUTyP|bB$#-M`JdB>$6WJEkYL}#^l<+wTc{KB0F z5awxt{VcK1_PWpS^BZZTkw!X~R5u|7*-$WfU0%z0Rkx_rgV(n_lw3~;fYg<36CfVz zfxa6bj2PvXVZZ`*PmQ7n(m>B73Hygfc<-w{$kCFiQ9D?3SCph4dy)j#q{82y13B9V zLBo|Rz;xmO2Nm~&4`!z-E?4bh4Ll^3FK@-JEWW=GJ<7h2ZAZV1SoF|T98+)!qI*cn8ibV_Fl@8JzIysrX16I zg}H22g%=UGSZ8C=DKLN_6dNxP2b{>2Il0-I#ls4D>3AOuLbspOAgQZ8_jw^6^xgXh z>0U+}X{3=ZA}Ih!5?iBIcbSzza&rNrM&#>>9`}f+7fl;tME-YHVPji9Wyvn&}IOfhLQYiGPww#9%bgK#WWV z-9S(l(H)qDVRw3TrtO~YI^staT@1Tin%Q9orq89gr%v5Eb-HffroR5_R>93{NWb_5 zbXOoH>giAQC|AkL=+vZ(!5Ho%Mx@t6AS8IMXZ1cA@~t4f0FN@dk1!g-=2bY{gIBM> zgO9)upTo~z!JAj%;$@glvcFW_i8{8t{|CsY(!YPh*B`@;U*WBf;ISv=XI{6YtjO*Z zQv~`zlk-+hZ;HAf2ICQv>st^buGqZveGV-$xbzgU=|YAX0VlYtTvB$7Cg24}DWCm# zww3O8aB{h!`c`o>GO2MHWQ!C)0w$dTEMzzNP(onFf_&7#r2sJsGvfizzyn8dS%MTy z8Fz@O^uuX96N~xvB?el`QkJrmrJN`6)XqrIzPVrCv=Wcx>C&)l(ND`98Kh3?8Vk5{PGRF^fo;H zEKJAs3n>sgV3`f6H}l*519rDFh;TRA*j?VDl3gtiubh!|FpQ zo@ZW!3zuMR9Z2&#+H^9IQY^?6z=AP|k%(hyM)SXJQM#oB7LW^{5j&CT{sDh|`aZ|M z^i$^Y^n0JtU3~zb9^vko4ku*BD5V)8nA%P$37kZsP4L-tPVNL$zcIrsqOP0GNS?5e z!Gt5=prc}VA{C$r)bD?&-3Tf$CC3Cn6ek9_t_^eg#i;;DB4idMkN~iRSeU8mRk7S7 zapstKGA#xq$Ms;)jS$Wj2q`P6ELXgN)BOCU0JK0$zn{---!5fgIrq=wSrK=??<{LQ zowR)gH096M?@h20SL+yh0R|*3uxgbT`w9LN^p^Hd06^M7(+)A?*GMJJ(@v z2M#VHX2lwarm0X$oi40CjOyd^DgeE#qoYp|R2*?dL`6khKtTiq5t~K!rRj~{s`5qs zr{cUk^*X2QGtC*^qi>(+$cl)JjEu~Txc|L3;_4XCb%HxyxgOG@lx{`W&(1^b!be(- zlC7|G4it2Tk}c>O(Ja_+0Q5Qpa+@JjGdBgE%CGN?5mOOD-|G}SI(@u~_UIe98qRlG@HAUnSm3D7w%$lQyXN-DQ+ z(7D;oT9RezBvGq;+`#Tt_SF_{2ml|)!E-GrK-YxNRp}5+Y4d>AN#e1SOlUDVy5<@X8G^;{n*P z9K6&Tk5vm`#>4RZmGJCk@X<4{bu|JA?>z>~-iNl`;gjcK>K~xG5@{>GodvJl1y5WA z&rX0@e}j_E2%OmUB8i&d)~*3=(?y_S_KWcJrSSN8c*RpZqrEHvXAMs7A$clJmd64b8#2m=U&7)1b7NczP*m;Bm;N?9RxrR=w}0K zKFX@$x_97Di(pO(Oe==h(!#7A@Z!(#>PEP5CQSaSuHj2g{1oa*|AN#@p3LR(+-z5? zbBq^XZNs~#lDT&Us|{)(k`qMZ-CkP*H&P@0LLq`Y?VD}&^_|*u8{2@T@N}JTeEWoz zPd`VV(Ess|e*o~o2On_PU3V#ePa}KJ3l}cr_19nL-FM&Rop;_*m^Evbo{jaHMCRvW zL&oyy*Wa{h6CZ#4vHTjP#(0g{Z@u+a($T7ZFI~EnDO08}W5x`%@9VF>mZ$aI0en~} zWY>U%dq1vod1@jp%@0uqgaH>(m~W9x;3d;Fb|nDu$()vX_bY|Wrd=6+Co*(K@ZsXq zu=vAupt{Ck=Jy^ng*CNMEwAIS(}%5bARFc`kEC}{%CT7-O5@?1m)Q(cR%0sEn0=|41YAc~^E4+CxGIu)eY8ZANES?2Ze}|a;uKl1zS18>8d-Z|Bp-2ny z<9vAQA!PP6>PqM_0On0M;caP7bdw4DuBY|1^5V$6>a(eEz_D=bCDPJp-N?`1LtZ}g z86k}ZKG1&@v}~_>q?IWvL-oXBINyDO^TuECoG494T|{iJ-c)@wnbHp?lM}BY+i^&& zUq$88&nfwI8u>*Qh>Pmdv6l+TW5*Tvkl9usc$i>+2fQIQ7yV({?_sI_aQ&^N32jW^!lsi&T@-;C02Y>xvJ%nv#l(}eW>_ut#} z(E2Q6+_Ps-zWL@G0C_-v;)y51%nt1Nb+suiJ^b7N)!D}IdPwh&e|nFW(&`MY&oW+< zCQY(=3hCDhA?1hkv!2NT2OPk+-+pTu!t}CxB!kyT|CI5SaA5G@!E&Z)g?To%A^83W z)9rg^>$&>stF3?|I9}9Q*SvZ2B#f}kuVHBS==XEQiWR*5_S*shAAb0ufX7is9mV3>V<{Tx=l&hgHUA47)@O$snnw!FNYapT7E?6c3(v}scSKKbMmPCxy0we6#i zKB8a0eza-RM!;mZ@J;PoyXnlDg?gGzWpcLW)YH_*d=Kwd@G(dO+_Z;Jk@&wh5jGeMiFHeW0QY_8Sa?PDP-jeK#2Y6pX$C4jusq z9*OAZrD*pn#}g0tq2S zz>P-9Ghih0*)$xW)$te7=BVG$cJu{AJ9MRV&g;@%L`^v-3VuZ?UB+Ba*D>SiFyc3A zM!a-8PIUz_&m-a?ZG%F@#r52PsfUBr9JnONZ`YYNzZywZwNHG<76FrzAH@*Ss%s(H zSurB1fiVAo0UR{$M)o`T0(zWy0RY>7Sb*y!C|kXp;-aPObM)zS9XyJC1|CD<*eeV! zTu({S5@OMaz(F+Pq(FxS9-d;QMa=J1dQiim*am?Ol|#WCdns*)4R(89lWp# zU_<)W#tmfG55%F|gc=j7O{h$TEMQRy+UG6a5m7*Gx|?HWfqX`)}YY?+;~^c-z$ zj{_9US8OLjhcZRM^MmyR>FJ^82B@w! zhSr~6M#tgzXwONnGxUA{-Fx8vZGJG$;1Rj*e(v7AI~zA{q<{bZ0C=8PSKWIwlh;V; zBrp78JYCn7^t+^_MDK_hEA&2@Z$9|`3#hDLzdo5SQ0sY~@>Z{2&BTcllNuFC>@Cw< zQBk3^ty{O+I_!5~z4>cwXxFYCdm`EXIOUX6B$&DT?z<(Vx#W^d0C?`X=P*w8Y~Shm z7!7K=rc=L7UrXS#cJ12ab5eQpEcC3lY}rEaS*DSm!QOlCoqQ&Gu2)@kmC73cqA?pF z5{Yp0%{Oz$9d~f=z4xju*IaWAPe1+i?qEiyIoYmL&HzH{!FM+R{~oRoNMr&W4Q7Is z(X=Y_x%J<-*!~XpqVCtj?kp`mfz!~oXD$@9Oh6p6(khRo9#?*gL|_5B{C}{axSY?5 zwt(YPMX;ehHd1f{J4pfLw?h}rZv(CORsGUJ6zm0i9SAGt!r#Wj8-Ie;-+=>UH-UJK zty_!9wKfB^{z7X)=D!Pn9S1L53oY6s^DjT(RoprfR6>B$^r8@n!MYVNa}wNt0(>zI zKqggcTcS2_P7PMGVo_IKBtmvYu}rbNf(|rk(}|dAUtWGIay#`xs;<&4NhV#V$GYrG zt|=DdT+7$K!pkjRyepLlq=glC$ zb9Y*H*qex-5J&(_x&Ee2EoJJ}w(wv8s>@4=mldORA;5-(bC_}67~Y<6Jd370jOyLG zQEkmmYBj9Z!vc&zh$(nF7Fcl=3uxFhFOrJw{Uys-?S^6jTpjBV0&6{d>~34iOVb-R zRg%>oj1x$Km z4)Dk$kMQD)FD97|O+a6K@kLTvsr+Z2c_x{ziD$=-9lZA1YdresqrCFUD^ks;zEP?2 zO>8Bm3L)S_Qqh-Rewinqd{QO|<~o+~k%Z7_Qj|Y+>QqgXfpf($8M6*e#3@o8Mk}EF z`Sa&Xif8Uw%+lZg{&#C$VC#@1_xb0aPhMYIp7-B>Uuo6^VfO6VI^Qq}0&^x^zs)2p z?b4h%b8NekdFmh2x9Z0Q3l>EE64Af04DH6|Q=^wHdN z&pjM>+;IX0x7>1zq~VU^2xOde(n*|p>Zx?=)-B1T>bv~%%P%?Rm}8O>dja6NbLV0O z6-}BnVdTh>6ciNj;DZm^_fwjZz&kGRvnNwPtE&DUHENW;@k0+i)Q(Nbu}i>h#E20| zt%OXWESd2~+KIEzKAX;+J5yR(%7zUaIPJ947(RSBef##6hRTjFb!oeeQ&o*84?OSy zpMUj%;dN#I9fYb(~0a5zyKz6le&{ae|mLpIP0emR0T~8A#H@vQf2Oxe(XVm9h zKOIoiW6g-4p)CZ{Lec|{2)zbhgdX#JPC2+1DxoRR*@I3Vbn&3P7Vu!i0X5(|K~)S} zDyn#AQz`jC4FtT@xhS@+7e^UL!^fscqhQmT6~L&g;n#nFfoC89G4nC_+l8=WBSfPC zXC)q3CxBnQ36pQuS`qDzHS!v$DhYOJILy;Fy`?buCYXLd(f zkq8NrmT`kP;+h8-a>YFiH}UWZ_tCZg5Y-b)X)tVvC4+6B(v*({NNQ(5yAcuCNF6%? zO-Cv%u!EL~Lv*peg8uC?o=%7n%4(5W;>v0$s)1$>Br4$#L!m`3%vu6Bd=6woZ9LS3 z$4(|%FJMeB1U`&}OH8+!tTg!nJpTCO+44o4P<9$CjpJj2rP&)44BNt3{cRyS6+Fg7_uLK z{1HF^WZ1A_+Z{SCMo0bH|0>egHu6$sR2OO5tG@#n;_LXH+KT4;D zK@CXeRsF$pL-MK50vPM$C4rCAz@DCKY8`&nqn1ai<$M2A&TE>77t2bSE(Of63fi&vkQ3PS&1`=D z;ynOb@6$^_BkF?ZAX@+RY)aRzpt^W7>*vn~AeP&Nyynem-mVkYysll3{SD|COm4I0 z1_zdD*Qu;nG_`I+*Cv*VqiUlC6)CMoFijd9dkhh)=>P;k0!YJEdL7!dpac9mj&}*g zVU-WxoCQn9LCY8{*bKM!gJJuE!QNav16pUHvVJ17%HJ~Zx7~IdXPj|HQkx+L-Dn`h zz)zSkLDEmd^b1%RrbB?jFxz7Cjg(C`!e*kB)a=iH{<9{)GtWFz8VaL{5HoDRq@;0V zwnvv%uhIp+wF7*j9VM;pK(M%pmk0!@Z#*Tk4+Mj+-Xb&u9GNzA{M*a4bk z4Wlm!p8*VFk}QK|uBUss=%R~w_~D1`#2k#1>0;(Pb?TICml%R;uf0|hVbebKWl9U7 zdw=uIH+4UzAA`)77I7LtA`=PIm(qY3rcRT58mS+Fq^3lmYW(=|$#Sw0HzqD>TgQ$a z#Y6&J(4_NezcgaeDXeog4?G0kr0mW*pFa3kck% zO#bwZ8E~uEzOUwe6Bt>!a;3(O!otGj_t3ceR(RhF_!;1!G0KcBR$DC1ry0LAzM1h* zV<8}Ln9`a^urg@SprjB;V}cn^_593plK|<)8*h|Q$p|ab#{i8RUw!qJwA)7LBp_pC`M!C_xmjf#$6tHv&Zq;k`*vRt!Z85Y?oN z%d&EyO;=dA5++@TH}-er6dp=x={6ET)YOxk*NhG$&tc_Lzi0LHcd}#gk(4c%CDWX4 zr(RCeww*UbKivO4H#v5C^KZZAh73xsdRKFG`AePq4GJ%!Czq4r2U$U#~S@ zRu&z4A41W`)A3?CwC;Hjtvc-^pyWn8Jud*)i!kf%@iMim@)30(aI`cV9S!K%clgOH zeP=SoMP}e_(~;$~rvq^OO%v5FUmnoifaAb4-yeW}>v}W<>TJt-sTS4J5YR1g3f z3i_v5e?Y=fwynS(G$;U}7CaXUJHTtBVeoXgcqpPrX2FWh&^sSCSA_$Rbd#PduDHV5 zUQ3leaNxkC)Lv3EBej=V#if^Cs@SOUC8Y<%Xqbu7`kl~(XP67^kYcn2nhbxbl+&)E zFm*~wclqU)+w~^0Nxt~vi<4$oniS2%DL?@zU(9w|UDnpz{x*_WwbS0S0UiPl=6o?( zC!BDCCQA%ZEhL59W-GtLNv9CFAZYKI-8jkZJ29Z=DTMcW%j> zurqarmVA0UoZ7>)|*sLtAX#E(ailth;ciKY$^`vw6myuWTGr2jO+3*VXWg z&~4-5afbst$LX_IEjBTpaHy^cf)9}Gd3h!4cT|AmQi~tZ76isO-k)~ov9Gqi3*kllW7va)lDBx-3{*pJvHf1-HNT&hhQTMigai|z-} zrq3X01pH`}uE(5#mz7I2sht3FOn-Dc>NK*O7Z8ia1VR$7gY_it<4a?ZlhcI4*x0k!Agkz|h?%g>9xl+TZjz5BCQ z?|#X?5rFD{(m0wMptNb_5~|B~(D$Ts>Dupb3c7Tc(?Zwt0-(Y=CG-`$*1Qa*2Ry>~ z_$r^l5YoqbK37b_948~i|2z0f4~|+s4Nf&M?iG0VTsXWJtT_+b<->4??K)`@_F~mkFp?B4c6?Vb7-E2bZrwsVe zw_rfLz`I$C75sh`QpbC&4;$0JR^TFSv@!3Lsb$)8k!h+48gGndME#i3FxzoSby$*y z1OX9&Mk}bWpd_8FfTVr<_DS#~ZLk@aw2q{0+qOYK8hmf`Y;E2DJ^*4(qQke|4FMP# zodAX{U#RaQ^5A*l?b`JK#Q#?ulw`0)O9vqinU4trFd4Kf4vsQ*8CBO1H1e{{X0X9x zhF5Lg!KX!=z=KM$ptfLYv3XV#7%=J?>JPR)b_egE(|yY`5N(J|IOa{yyj7aas1isn>QpTk|yoN*tF0_N>Q6g zs}ZCko0)#>sAVqP|kxDlBRkUNgmZn=)C%^+g7B~T*Fb-wZqyu21Rwl72PC$xF zxb_5pRKmw&W;cE@eWcUu^LNdjo-|ai-uc?F``A($w*J8Nv=JH*2)<$Y=9O$N93s3C zv5UZfE@# zuu#X6?l|S7Vno~$yj_bv0UO3I6*>qOsbFz`q>q32QOLuPf?(8j{F#7AO@h=b9W-F_@*8dO!z)~t#?py@Mi=@bamVIY%6swlVDi z0C|+gyCoXL-QWAjC$-Gm?rNibEadKCaH6ui(3T`1w|@Ui3tMReh{*Ildm|wx6E9c+ z;+lgHYRW~!bpQaB`y=k{Dnmg5@RCxt^j!t)IiOtms(OYO>%q>kuxRM;cEiAJQYZ^> zN{rCQRBklXfR29gz?NaC5$FhpT9SYnc}1vjo7;P041144eF0L6=$f<9d76IUQkFVK znlT+ohF7g*D=$NHfSaxz;3Me~V_I5T!suN@ zn(M&>B&5y&=TRQH02J~-gzDBVoKjTeWcbM(N<9t0B$Wxkk^mtfLqv#!EmYcce^95; zT=HK=?1z$&!;pH$Lq#guQ1MKr&xU|809JwZKsHOL2kL!B1xVhqI41&>_g{`J_>P4n zp)eC<1H${Xyu55KDN*2=6)1PxD%2ehTF^V~k|R_vFJHclr!d)pG3Q!C*fYg6LHZ#8 z2cXc}jJlTAMwm9vgh;$qaW8d0aF;8<;;w#KGj?G>P+t855Zy*lYZq&oyzjBbNs+M=Bl9?@%7XaP8_ZFERiIz#UG6x*318qlQ zM>>(3$K5w8&|VTC(`+9@V+`yM8KB?Z9@vBu_t3A&ri{ovVl|xigFMb>X^sr|mYEQV zY_IF(V*8;<`_2ZProA68pTfsLpK+}GA5uK3co$NZ%&!v1x^A%J2h`643QJ) z5Dsy}f+%$x0_X0FU@TU;;k$y%bbi)Q7iE9IugkA*lu%zwBc0Mk9jH^}Cs88L9Hl z2}ogEqBOu#fRXV@(sU^OI1Ie+{!B}PM_TVWKsbFrS5{X1S;5Xr&k<4*0TYh+&h)$=LX`$@<7HKD9Hl^e`2eH zQ;Ou?QeTV>q@H4U(1!ZS!H3T|wrsk$+zWTrHK^y8v5LR2L20N#WG4`y`JwSB}x4^&-m%y}OY)VmvDN4?l zq*B0`jGdN!1Zh1Mc&`bR4*#%sH7}ASMf?}}s=9l6*cp31*4>@ib-j3)gZ>425@8kb zqPHDAcpU^qyy@b>vnQ{D>`9b8dQn95AP9o)L6!w!#~F2czPo2zLW(2ON@x!q-C?KRdx@S zN<6gx3OWE3qw-cj$=qd?gg7;32!E)5($jE zSHpsEpk>K|Vn3feV7AZWpz^nZ@z=3m;(jgC-v8Cc7MYp!B=qR8z(CsvK79dDKq1gr z-VS_u2}nhxLP32L0E`5mUU$idBMFF&dkM&`-TQB!zp(R(!!=1jzz~(9xBu`yzWs}L zarw*$A_1{0RI7Fca%X>#l`;nF-HVVJypJZ|KQ)Whc`t+!`s+lm&5irq&;*doHl z+$9pcWkHAlj+6=yNU7(mZw}itLqH%SIcPv;h`I7~l@zxp9hp*z$uJq7h&jH&PIh5c zwBXw8TXrf~?$-2g54PPhJ6UBgi&~YcUkSjl;g*dwM9OtI>c+VJS{g5{BV-8V{r%*@fXH9*amooXQu6yJrP7!U`ymU{G=4;y>7O zH&rAc0Z7vC*6Sl8;P!((ymxmGXc8t26#Q#??BWh=NSsW(dPQVLPy^NNl$4=iSFPiD zBI7`^pgo&_O+cg|W0iy`xImGDB=nMxRCuIel&y62y6d|SbYKu`-25^hyTt)}Yl`AB zvl~*j!)F#n4%@K_Ykp$?DyvDD98gh~#e3#F5A7F2c~Y{IumB7-G8e$107L;vThb)G zgzcFjqjB=0h}9DTO@o1sp)_tzq!GKdwJA3|3*!8zcHt&E&2O4Og^;2q) zc{Q&iDiYv8(jeKO6z_V)m3nfp>(x>xq1WnL1puMI;@u5ewWD-WgO&<_acS}SA$7CQ z6T7~U1yd4d&ai+9%tiVknS|GGy_r z6)CQ%WSO$5Ch3R{CX9f~D!1WfZ*vi^BVs^+fNb8lY+O&yIhpnA8j0}eU*O+^CI z`rDb3jrWN}*41$zdGHe47RRpJegv|nRGL?VbFwN{zz8NzWThR32c*Iyn9aY?$Ju`U zhxW6COgwXeBg80(#1N|mN5#gTVPjGSu_;~?)3G>-tH`1lS<(x~HdNl_jC!p)3K z5MM5pbMX~m018Od?^t<|yb3@z$An+~@hN`zy%zW^fGJKxIxk|%00xblfd(3Apn;wT z+5qrZ;Je>Rvu%5~(J`-5XNYFR6=0B0T2mmM2qYdStv^m%{XvAwgOH^Bpp5mCuVaDs zy+R)d>!pWJC;0P|Lu@w*6EMJ4BXR{B$~R#T2!dg-KHIobg~z5%W^-puUk!~()vXwb zNPq{Gd<~3&xjM5|t+`V9wOi7PZx`bFwO`^AHfd6*#CotoYyk+6Or_SwB9(SC6;Q## zuV6CeJ8Z`6Y&$%$@oZr&?(T`R0g-fby;(7f9yTZpKvl1xfWxa}=ORo23!0l;MzDN6Qj)pB0r)WNPxpWdA_eV-YMK)p8{Bu z;>w2Mm^kX2?@LUYJ8CcPv(IDw1^dd;*u;{5doN79et!^u-*Pnse$Z#lMP7BFHcx|a zjd2~7+gnOPh6IOm`*y!gSesidMYgi zW8mLZ_4o5aR~ZoS2y2v)V0dNTn)Z_Ll^{-w668sAVPi%0w zU|>TM)ImXCDq<^QteK{5209ig0J8xQ>{i3xsN4e&n6&W4#f}xefDF4fS4|&565J{u z4jMAf?igIcdMS(FcVBVhnY@38_gVPtVxd}c}Q)vQ>T!@f~bNj+rTp925vD({y7 zyq+Uqe?oZqg#)~Kc`9mnToI7$wZJ>OTRgguF)1v+lz_7Y-0a|pu|>cuBbfrw zuYOYo_A(<^`sn=;0Uh^?h*ulAueg^heGSJZZj(yvVgk++OZX`RcjNnWBAd$CkLfZo zMgVr*Gp^;AoHt?FGWHNw1!Tk>r0# zqEc6excX)=bXekB50cJCn%^ z%t`%V*ojOu03XcpT8$LDu@hBjn9-OmcjZ)bb4gS>kQx!V`y997`UFtIO)74opivEw4`Fns=&c66TrnWxA4= z`?|F*>pIOZeUo^neU>^ptxNK`zDt^v$*kiduG4csm^Cg=cfo3PJPSBcDF`-4pmh3O zlXemWe0=lTK7Rh@KHj=c_`x?4-uf@si2wbsC;aGo#yekoh);j)5C<*c3_(e3i5@*+ z{ChWJ_g==GyW%9=wyf)mmD4tWOXelC3E=i)#+?rt=jnf|J(kKNd-EaV{vqQ6Ew;4V z`44;N9%I*W*YVGs=e>9Lu6OtDd+ptIY;SC*e${o;Bvumhs2idxcKQdjC{+;RAs(Ww zph6`IEhQ}=)QU=ggpd#we;|Y^ArPce#UH2zT2!S(G^!JDlE(3C*Sq$p`bRnvJN&8 ze8c}+r~wVY+otTBE5emELC5Z@@alEZ`I1-&_<;y||Kr2%enWq3NKz0BA}~@h92^Vq zOv!r^7^@nNPKDG$K;C&D?SC7RjvxjaRRcbHjTHY;X@VwZ>OKP%Ly~m=KeH($7L}{T zM$^{P-DL?3(uFCGj{y;MoTvK@;sHLS0-d%XJ3saa;Nf+9m@eC0DlA?1uBW%0-0p$o zcMpK{4nl9GOpmWt*=??4_I?SbkYg+8Y}nb5IuE;imWPXrw5L?a^itdbgx(|N%B$WI#;gQkH({Tzg73garai2jTSQk>kK#hNAu9f=4z@JP#!xz&6n z%`3_k*N&eSphV-u@wMGtrXUKLGLYCRuK+t5yL6e7LMPY9GU!p=NR?DZuM4>X_@t%w zZ4NrhTdoSw#%7Yz7Kp=udVdA>4B-VqaWXo$A7TT`sUfPhc=}Aj@k4WrPt0yXGa8R& z@zm5DkDi?5mmgY#w$N|DfW{jw;TKL<`Q4u!;B!AQz~?_Q!0%-A*&iR^)L1~$5o#WI zK%WQU+vlS}^L(Hj0>_Jb-&WKOtP5OigEi=Nt0jE(lOz1)PY-hIhGkC(VaeGEUENg! zm2K+fJ6>fAy*yyp2Ww%x?(wbX#`%LE>tpGJ_D_`aAr@)KR!3gAOFlQp37|h=_l))pAT7B6++jCvfVsq)6hT%)K+Z(3ys+D z^-quShgm&0Z&+qRvn6o!L3Izyb(d_}t$(9Ftgi@P$lAH^#R=Z{vuXa~qXXQyVwnxl zI{HfWdr*g(WbETA&2kflfyBdOK)dHq__1&daPp!+YY8HpjMUj ztPjA);7M^ZxmPHIF@l()ZTt4^L(V~#!hxo6vNMwZ>72V23n!<%+|e%NQ{~al!G{#r zMO_6LP@c9UDx2q}spb`6LG#Mw08Jt}h;j0cUrHyXc9XXQswC%?R&P{JlvLj7TIA>T zNDkl%P?n?`TR?oDxK`od)DTB^H#oI#lJnC;_~y;s zO@VbwqhdI5pu+yi0B#9=o?*;G+u3LeeWgB+`Or>u#RQgw`KgfO2dWT2?x2nMDDOij zV$Qs~pPxEAs5XD*!wtUj>=b|g^e)ZnU2xlNQuJX4zTuT?3Ez5YlQ&jU zWwzQvng~fdqr^QOe`jT+>$W#Zgd<}<2WBIhP0K51v0ey3c#}#ZY!XM5y?Ndc|XU zG-R-5NOc%pT@}Ob(LniCRTf=QX|*j23kf$C6HV_P4>JH2f)#wj&IYl)PZ;m*Pxsz( z)jgOy@YT&-+k$mRn_atal`^+!l-@?~U7yW@;Rhs$7?8JvjxOVCyb`}GQa%@?i^U3t z($<1ffSRtK|1E(ZQz#QCp|Jrx1dUx8QIO?9vE|YIz=}9>2j=180(`jD33c*{?MDhy z9LUgg;iOw9pHjRhl4`vci;z=_rQo5IyhS(wQqoE560lBI+Ymt|ROKQ)Hb^Jx1S#Swca26^JxEYCfDl4s5y=f24y zM*1t%0v`-_zOPdt4m_%r3W4uqjOjrhVHm1BQo6|#hyu89xlQe3mw4h+mw4>gFY&?O zc#|*x`zE6kJ_}Wkn@!>Lfr!H+0j)$>xFy^(9`JCMx7mTkRdq7ep<7%N(!lUThaxI< zpQ|@4B3u6<#_m2iush;Cdt(kyhoBCmWc3Ow8x}B}$=adjv#=uc0o4#1LjjBH!jb8K z_sxd1Q@DOhn4eI+*l5GTYT;yFU9@z7hvy>>WipE^!dhEs1hBR#tR!eV2WLWFx+Sc) z)DeXMM1*U%MD;tpFJiSN+Rq^m1!vc93In@*&fFVA-Q(uERgkmQaa559EelV5@fweO z{0$y>=1pGwuO?5ue~^zHi@4T-y`upeK%aBKA&4Q1kF1Ys+ez z^cx=8A7g#PjWtn#wae+33Oa_S|E)0*Iu>wSX2MMO#ap7F^VHsmr46Ck5fpTkyI_T@ z%L!+nzQL#deuLQ|!^I_meqYC&$Y^^V3kL^0=EnoI?W6}cHwCh`PK^3sV7d`-bxq6i zBZniXdMvGNJ(prPm-2gHX3%E^g9L^jo{tEJ4IlW^B@X@m0<5Nt)I1uQOg7Hiuj3hA zS`^jo)ZUPH&xC5DW(Ot$G@W>cGg(`^vU1m#g|@TNc+Ft@J)P&L=0Z-+ggW>96z~oA z?umHsJu%0obpEnw;mUOjb)QG?ji?OxnazZj01EUht&YI5<-;Fc;;+8Grt{sVfB|7= zf;dDmJm9n5w0!kHTD*8E;T!+i=6kQTXeB^sumTwEDz+ocH?r}&FJ`Ll5qdDv=K&A~ z@X)@9dq)FK?~gcpB-S_z^QZ6cgssBJu0Vm?^WV+vp8=4sW#h2Xv`h~B(1E#zuQvS7 z#WpWrPWaj@ZPwN;)1v`+rZ`u_!f3_NY+L^IMA)g|0J2Aylh93% zqIdkRb`jtHsz*6}S6)KzvE|9@W{4gyqi^$tmZEIA-5z<}^ugZo>CU%*yuXM5MMzT* zGBN>38R83tWm-)LBk+Adl;3rF3ebjYG2`_r^=icIP#?36I{lT9S{yN2kFlw*&T?wO3ja4j$ic<-3xJas zq{Q-!VZ9^R?<71wZouX*hgiP+YePJAvd-#y%7LkfKlz87{M_f4`Mcj6;q3i&fQ)DP z!dI5~?dR9Qz^^=9(68HIg#TvmJfP$#&VB!@?w&lec~`5rl28T-5FkM0U`!Ip zV3TYx;0xFWgCD^}gTWVH!1rR4!8nmkFecbwq6L-!lN3M!goMIs^UTi9PU=u^_|EL< zqdA(hI@Z&J_YQqd&s0}+RabpgJ@ftRORu~)$YHnj(GY@wsAH7%$ODQcpSj$BZY`&N zy-s$EA33juQ{K#Q)X#c^VB<#z+3@ffS{p54= zJjdMgJNeu7O?+)mT-r}(TyB26j~iahf(f^LE5YeU)Dw#sC}7E|94Fk~%O^c9v&L9F zab7bMOJj6h_~6q#VaxaC@NofNyrhW(XUAk7lWCWqKhn#uUeAGzwEev!>*de6>pvVa zgD#GvtBQUU(2>);J)oh(=JH2VJbQUWnA;qR2QO;nrbl}C>9ZN|;J!0Upmxs$x4ksL zrSocKd>5bC$icft+2zI_JP&41kJ9}>oQ7JH^q|M}5BKuR`B^9;{rm2rbwomj0Ek!L zFU`r_eKN;ao>t4r2h`A&beKFggaY1Ond6{ad&uN8VH5HdYd2s5ds|G8Dwb_@x#`3N z-#@y6U_i;ZpL`?DDL3?S+{uxWEmAWNKA+-@Yx+3zq!_pUa0HLNlH$SF26^!Ek*wNK zVA|M_td~r-)bEFSxcQYFD7aw12-lqIucenuYw7UY`@q#ae?c>Wpg}{-AQCZ&Ue?aj z$0nFDA;hHbw)2BiBb675pOTcGWW+_Jbp-Vo0mB#jZ zns46N$6v2#7G)0WTS;) z;@fwaur}kdc1a!pqKejtNpr2qK-L2r3}e&C)rKrrC>A|wk9M0<5-i22CQE>`X^73~ zroRU<1qwz+43R>n20ZY^}VGZxaAg z)koRz5B7!uA^?#uTVba6+m;1kW~BpNnnfL;M`6u1tgIw0Nv%7AP? zxV8WgzplTHp_P)Z$hGHCOm+}T)S@DB6yRjjc=xq+459Z^c1=UErW0{Q2I7Wgag!sgQ&9JElM+Jdw5zQeOBAVBy8*4 ziyMe^s4ix4($Qg>LJDO-uBf^9`8<}TXstErOF7)|a4(O(o#oDpYB^$$1W&z@=IMWB z`N;|OTzX<7FRm=I^mE4d^k%w~HW%NUWd9w)oP1C%_n++W?b}k2P{^WEun`~vx4tyU z$Oemj=OnoOsXpFVoQFmw4Bdng0Un>9F6HI8@Xg& zTa2GRmVt=kkkYf$Ige|eO*1x%fQctxPVwZzEEA&gelxK(z;FJVWOcjEPfl&(!sF`s z<(~(+Tzp3-2hEOhWU2g` z{bF47P@1MzgZ0j4mY%Cw)~h*tpD;fE@=lIpr{hYdAyaZ@!S+U;cXZH{At$h=m zc32(PEy!`%H|u5h|FnnGoIb^(DQ?g>HNqeMp5l`YHWwb>z!j%7ar1}mw3%>S3A}Xm z$y(xonPE;ku(Xy=a`^TQNor#TqZ$J|^X35m`X~qMY--|WDc=MK3`5aSy6)|Fx#+G= zPXAgB$L?Lj+HRXm?(F1<-D4#{8Rx878E!7o{O4yh3(&s$_dV<}B_tB52TpW3^{gIY z{zlfBbobd@aBC;W?NzF~OPrs7C(iLD8okkAvFofjzkZ^R7v9NoDIEza0Rq|s*8mg@7Ce*zwIM|^tHHOk z61BHEZ2`uQ3JM_58eadnAPFUt36;(SR(Cl}85v-DgUPaXhsh%>0gfx%Z6=Ng46#=- zzYPhK<9CjrflyFMzdqbx`+UzAH^0Km0J>5FQpF3FTvyWqs^rgyQL*y=4fkhN`R#4* zhIh;J4L}d$5_kBB=4`o9%oewy*k(sMon|nTK`FHfAW0+=#7gHTQVLZ)E~PK2@cc}X zDBuGZ<=^ACX@Zi1vQnfgNvr_m2B45dBpRX|>jDNC259ZqlYCX~pXE=JX#nP?TT!N5 zOPNw$nZcK-r`WrJKqP_+1aX}_k=Ah-D70bVX%B_MF#XVd%20UasCXLi3OBjxbWKQgGi=J8k4 zT>kB5PTwiW>a-S*IrqGlCf)1s@Ee0AhBn5o+eabP&vl2#h(--;7lM{zZMVZM_hwkJ zM}d9jB)Hn+po?NS3$n zw3swDM5a>zz<`1aAp`#Q&01FO<1l5U#i6^#S=Zxm(+5QXB?}j4*lVY_7|DENtVwHg zfImE!goQRQ&MI*Fp@=HQL(k;dZf=lp(BQ45gM9C@Bt&8Q#E^ghVv2)yjF7Wo=FL5@ z+U9>A%d+hEL3WuDfrNpjguHy`zCPZ4CC4rA7Rk(xF}5`T9@P&+LCWK>*%1uj{+9=^ z(=HFbGQgg*VjR1Bl%L&^<~#TH^5SK!EWL7sfP%~J>xOkMdTIcG7vCD-yH`lR#m465 z65X%fA&9n=tfjk$*3#>xwX}12EmJl^fF?@loe**OY9pPM-I z?q1$`rNF(P+N4T#_m~ib`%#pMM8CfJpG zZRKUs-s=d^3WOAkx*R5q3Q!j}p!X|VkjhuewKco739Z@K@c{-emlU0L#`n zOc-Iw`}tYYW%9@XTKlX}zUZ-Lqb=z`KqMv1nH1!i4-2@C{=zVb!cT5S0s`Pw3FI=I z{f8bVNDmbf5D%ate^|h>?E%Q}o4?iXA6}ATROAl>G=`5_R0WJ6=yDsXU1bLc1$>mA zL*+3rFn|>Zh$O_Tg5RpZJ3o=`1Z5y#VxSic1LBPktpQw6Cgjpcndd?{28l)lxb&_^ z00=_X=<#F|HAX9vJ85NRBND>Q>bvYWy{KT3O8(HP;n78#@VJhD9-F#;i!=aT8~ zrJyV(j2p{t<6D{16k}9<>8y(~qDG`0XzerE8gLw!uMY6_;x<(g)YaZh#h2@FklnR) zy$)AA&`W(#c861K^rQi6JupIOo^~ z&i#e~Xab_k??IEnS%=lq+z=2$#c0UjjSq9&^4kpYu+(FpI)i6x6ll;uU)qHR1*QCC zPU8U>O4OqYz{Y+TW|)j^Fc?*5QI{}zY0FC^4j^6Vd&DZAq42JeeYubj4WWf!7B)WVZz8?Hm>x7te$LnxB=i z)`b-S^)UlR8w3EyE7NMcfdHtiFyjI+YU(Vyk~Sng_Mc|)+H#l9&LXq6j|*@cG6sJ) zWGNg^!6b`CON%`ETACjoRnLN@S#EhM z3u6q>8W&jGVMCi@O0&T~*Vz;`Olq+Nr~;gOTm#=X<$hU9T^UbkeNDz&J_FU*96;9Xyn4<#x&f^-iMD}q(o*9!O0<=R)qXFap5pH`_+#q9XmUlVO zafSF@&vT^&IS3XRvU+!zJ?~oUnflZ!Q_+iYNMcC8^2YG)hz% z9_;e?t%kN{3)Xt9$!Rf050%vm=+^Y-H5+>hY`JIH zSg_uPUQJ!Ch4wb%>c@qk2}KVMy|I%wRu+*5^?6XEXbOt~Gxxt+;QDTx)Ao;xD$LSP z^L+fVc$~uXh73PF$Y>1Z;{k+Ll82Jt5>0N$<)*_d4p~J(cE39|? z?Q6XyiUNZgUG&J>nwsl6n38kpLs1)1v}nN6AQGM!05d0rIpyFm55Ag%X$li)sxx7| z$4XmsMv3l01shW?W=;ce{@vZ&R~q}oh$3YwW(eZ)nIBxpyHq_)17uCEXd;1*S$6NmDU9s)U{z03kO6HsA?;H~k3*(ghDzy4-YjJ#%-6^1us8 zzWv-FKb#)q)^l6XUt*E5!XL|SQ^T^c@XX>oXuw6@QBOm`)tJhl=)kijS{*ncz|^*o zNKHQLbWsW_okO=qejJZKD;l zS}fjMRm7|_X{xtGa*G485H!Y2)+RkMSl?knhy@?zSkvo*fq-J|LDAiOz(G$#)P(oC zT-rv#t`mc3U}>i#fM%2VmEUswh{%>E5mo@$?iai1rU4Yy`Q7U3Se5x6)yrXcXHaS@ zokaoYt@DDl^`So1)`ak^Qde)G`d4)i0=@)9Z<|1b0&sxphwHjf>A{LBUYx0nfDQs8 ztRS?E6T1)r7N!N+6et4$CuR_u$3s&ajF}FxI`CYmYlTQ0tN^sMA!*k^^2bg`@HsPH^lgKTEYMgFyxhNNY<`dyecoc!M7b2Wnr(!UHe6N^1=~ZJ~zyb z3v#%?xrf$3NHL?{WbuW~TysnfUQ*-bHS1F@8~R<=mA-|EF1uk3DmZ=j2*gYf@GE_* z5?xjM(_|{h!Q0DoqFV4jM@4zPS990?5itt>#*~0C{QxUA*u1jB;ZMiK1$;>Tk6hNY z7ddop4d;9(&VIXv`N_BHefj)4&HF2JOdK8Jh9e`)@74VNkSI_6cm#(}4={g8j*tlp z&Zvh8L2f+1mi>2(i4-Yns_H-Hhj!~b!=C9?)UEKqG;=q-9#fOg@MKc zzP@J-m!6$q#*SewJ)s_3!vh}`g}HTs@0Zuo4h<%Ye%#EJN7q1?E;G7SJfkZ=?NwY$ z0^g%oH~@cHEYISy!xDreipjMG3(s%j>f`HRt;Xj(^yZwO2y-4W;f&p*5Hn;q8sO#S zMF75gaKf)sp$PJ2IW%An0s1bR+Jwo`J4e`ma{YX8WcqfBlKk?eQHNM4y=ob*F&v3INL{Bac^pc!79sPg{GHoSjlNZUXK zYs*DE!>UqM|CV&Md#gx3B!Ad;dKLt*!$A!7!Ks#JJqf;|Cyg<-4lloaZ5G zUrrJFd&=#3XcVsJ;%JR>9RU%Z>*6^!S}7duNnH;p=CV@5Ow{4J9vTl7j-i4PvV#NE z)HTo&4|3ql?KphT$&9OuptNRVFhrqH90t$&G*lSd_+M0iG5^qN%jAxgfL2@+7YFc) zX|ywlNrqh4#}v9v40i)+U?VVntH$I47@FQ9Om9CIpqgC6x!LSG=&S$Pv8`|8Yb;t);e) zzEX^%F@=Ni$!-8cwJlX1grjL}F!;`&`q^$|fFFFLk#mnm`t{cG9DiA5^Mr!qKFxF5 zp>>>eNS)|aYrqO9Ky$;Ref-ZkE!=r-3q_51P8za@VZ7q1KcyJm6yTy0o4D`<1aQ2* zB+Coy9o$}zeRfXst^I0ne-R~})1vkh3MsO>LQ79*st6dMWI)I`*17(yeda)-!vT{rdnvyg0_;yC?Yb8)<%XQ--lM23Mcj#6uU>^T4Ya91l{1E?1q}%nbohz-@m? zvSf_|ipsSlYEaL;C2I-ORC1z+*0PLQ#!{A;NgeP#$5{s8ON?ZVMMDPfy=imH6MdY0 zR0FABj3!_pM*qM4TR%j=5Qfa3PlU-fkmt@&y!2s_1NLMko*0o2KdL+D8KvB z2<~v8KjWZ5o`<6`O{7gcAgnMIUy8%g(l0TBwjD$&SQ{5mA@*2rt+zoTlE&UXo3Mg> zUh~e!1!j#4GNIO_H~V>+L(b6{Wkz+?hN6JfM9iSG$L6iIHn?Dzd<8%@YlLo#>)i35 z(?4Qh+a60+*(~ZP8|^zVe?@_kt%!g-*VTNmGS9MJSHOBt+NGx3Mq(=2npZx`v(xAR zHBkc%vf;9z^b9m;-+?D6Mb_3bf7zl269Gf9km9or8w^B+v8Pl%ST0ZYd*C?)l~k9Q zHXrpk0(|hk1Rz`M;WpzL&X|1Ia23_Rk2VIpi!}&@e7qVgxBAJ0GSQe6209Cf_G(teJGwE52NK8UuFil)Ej^0d64-K-D zD9u{J8Dp5(7)N`aw1?2TiZ-9}|GBm2;yGEg zXUhp5ptdyt*~0f$Z#iz!Z2e8z2JNDhMmuS8eJjZ)7vT*qCgi?^XV(&R&qEtw46}Kw zr5|YznnRjr+5^0|BEuoO$1to2hT&~qS}U~h$YfHyxX1++zyv&?!vRJrZhEj6TLTG2 z(!(zsYjE%L13dqBmXt^;6a@toJm%ie%~`Vo5>I1opUbZn6d;61PtJKT%^w$LIdW=1 z@btCs7qL5Cn(7p#uT74E3-wXOQ!8zj-O$0QGlHz@a;0Ct_+1y7f`(=T40w5Io~!Qa z$0<`zJV&MF4kIRnNcJhN#+Y?LmKIw9~ z^UVUppr%G~;%}0?{y~oIT1?S}{-jiIzws7iTw%iU9&~D;S@C#@Hmf$+EbVY0r091y zowZg2Hmvh_zZPLw-&v7^wJtT|453%CRN?Snc5%wI0DXfRfNSsSka?g*xB#AfW03W0 z@_d}}2qzRL+?nKd2Po?~iKh8nkqfln(uerOE<=rkc8I-;@ zJ<35KS?I8QrpefP#YuN3nKwVf-V*{6knY;I3()7%98g?)ZzngtS0sLr#ZO<(Qb>2u zH{eNBZCAss&!pI}zR2uJLEit&<`3@|sZS_0FtnEDO%2L#+f}79-RZ(8gX`|=l6WOF zDb^J=j8NS3mlQ1t1KJeNy^~|0x08>$To_?c^3o)0=G9M%vZhugU9P^PgMY4dV2a5_ zPYm$LJ2{C;uMAb9QGpHZF6?4)_j74RFB~M3*D_}mJg&XFgZ5q*=9v6$ae?>$vxDQO z1z6GPvTQ|>Bd_n^*zJQN^|@tHku#=PytB@M$tE}6FRqiJ-hfAKdggg@{bf+m@<2f9 zl8rV?+HDY^q(K9g5`F&Vy&lUu3s6d%rE_h+$J+ODU;&0={n9*`kccV_6Y=i0aJj5^ zX-nEMz5*Xrb>9tG*5$BlqvKnX8(>%p7b%yRIxl{dhan(~06sLZGU>6hI}eu3kKFs( z^1`NnKO&{t)bK$W(4N(_FUdnd=9N!H zz(sqoZW(wLYkPBGq`wP7aTqg2zz22?22u=x4nqvWJ#3Bad>fuCY8Xn&J(Lv^=}0l3 zL&a+(KdfE)+ybZVI*B9qn8cc;{g`5|qHs4GW5stP=D7v5R{(7TMVvxE`GM8g*>>Dw z4|q8=eqFRbLX<+GC9U-4eFMmxQT^SO(n_beT5aB@XXsh}wO?3q58Bt^kpAN#y{!^M zNXFrJUci@fx=Ux@|7P#}e&af-IQ}_v_ul>O_3qknoYYO|4>f=g2t=h;5f41HZ~O!B zfOskho_Ga`N)&_;1qtPW3JD2SDpGi;$ODo3i#Cxt=Bx=!O?@y3pS?e4vI z2Jg{GBbGXD8`?&Yvl`ud=FFTq^JDG#?)*4Ja*f2jgtJgmag9g}F20LGaS}=PQ_f?= z#H!^+RzTJPOvFRS9S>if=X1BmL`HVsrr*nX>Q&3br;1c6ux!JA_K`$5cCHUVwJ!Mi zEL#q0iSWmZ8T>s(8U_Tq4ob1m0Dk*YAGQ^EaG+_p;$X?b!BJuQQpWUaDN0RY-%eP{ z-*Y3Zf}U1I^uGHap4ftl(5ec@&h{aKN>%7NIN!-R|5OG|!)(_v^XxW^7~%p7%*wGa z8pChSbfF7)yA~ZJfMkvzpWK2Bwdv)#T=gdvVYDVpU-mW|C^ZEIFGZ-9gdAu9#|ClQ z2%`0zcW})+syjB_MP*fi1kSvj5sxZ3QraGf65-^0&dE12*pZ2VCD3gVT)OJ`-SR3U73Be)Q)I5}{ZZetEhJMWI|)TY383jHmyRY8fVi19joa z*HWIG>7zigVc0;^a`IBf$qOk_(>Yv)qI%dzUInL>r5sI;} zmO37JwhJ{ONrcvjFmpL$W}w5NWlijaRSU<%_W&mlIe7F`X!BA6uPkM};?L=c?q5N(y`G?%` z#K+ z_7!xyw7MI15*Xe^LYy(sxeVP6^gKsghAe}q0474o#L(@aXGJOvh+?ogY^_65g7szS zZ9usSq0A5*!6s9Hw1*x>7of8MHlqi`>d9NM2xhH=NlL`Uih>ho9lb0^;v%k8<=Vnq zly>Z`CNbG|hi`xBFkid((@cyMnG?a<;hTwVm}_3~vLP*S|Y`&x74zjauUsia6_af&tZM#A4#ZB-JC7YE$&grzov`9!!}e z?IRKaVYSKd!Kv$@QgF;|7Wmc^k=k&5igY~IDzF7e2s(M**AN`AoCkXZ1t_{YQLGNY zLx}G==m<=V3Q1GQ913c3-wyLRG|NJ@DgdlmhII!DAVk5?$bMndLdU9p)xBatP~by* zpRkyr+rnDoIuWJsz<9f^2uw5$i9qTBk#o=mN(K(@GZ;|7QYvX0Eo<39vn13if(7(4 zswN5=RxKFds=)rH5Q}KOMGN?{S6q;7JJjxSNm$T&2ikN{AJlVPWonx+?1ur?v%%So zE&lM_22a14GEoy)5GK9?NQetII>-oVQVT}V zb5JK<-Np_02>R~ky%6wbBW?dZ4i@Jwq#c%LZn(ep@6SZ)KDeBb){IQ!pO z-jCD28#rHmL%`++E~|3W$GS8{ZaJE=Vyufn>3nLzWK#Fc<|_#86O){@b>b|46SyXJMOwmd1oyz zojt>CQ&UV$O|rIho^EHFD7}E>7qRIa*hPdcM!-MKG68L|U2NFc1hD1Z)%{d#u2R<@Hc(CBNn|XWnV*?NrpI1B(@n!lrQB{JE zR5F-&gs4zQqB4cz7^bkp7e^@;Yi#Eu{OYfF-RZ0xROpvbi;3jQ`MME@s)(*i|Mz{O@UWybT)LY6`y3VDsu5D8Qe5}PA9 zl0pIFEDnb;5dsgGlp6(gX%O2bFaQuFO9g@f)GGKu)1Om!}2(dwkMT7vcV!;A|5G!^d zBo;`pMiFrm1HzGTLLQDSTbRT`NEj{6QGdEex2A5Zx#>hc zzfq~q`_w(v-Matz&UZfS>c0>-pF^Cb5=e)ECNqvzporKYgo9M0+h|s9p&Fe)VU4Oe zNT?4IRAB@pz#@JelYu}+8YciCtTzU^k}i-%ya1Sqgdfw`hOv_bA`mglPPB=+6%5BB zMwdSY;NnU33RS%d3WRC}sRk;lN^ER3{OQvlA|hTtf0duS=M1mEZ2aEmJGdEWDHI?l z2rBS>7vD!zZo1pk^9iU0-3NF-PFjN|AM&d{?%m*kY9cOKgln> z|DWUrbh)_jvKbKq(CxJIJedF)5+a@+wzk;bPQZ0)_R8YU;(0su`IhwrDpZf-O+J?Q z%WwxDGqJza`I8%SNFsp<*p6WEK9+=sJP*)}JRc3f^Agkzn1>_v_A$+AE?7c^_pLwx zzR{A=7*G;I0SvH6G`I?ML5RR4MuI>DMqQ-A*pT@6=_CC1C+^^*r;k#>j`#qm>n2$Y zG`(+Leu>GuPtjfcXYA@@)B)=1IFTFii1GgHFcmLUqti4icQ9HxGxc?-#>c7ZLnzcp z0n}vCFtgvKl+sRJnE89)C}rJ|UuNvsCQLv~dGl8$n-}>$-8xU2A#lvMdl?Z>X891Q zP5PV_9_ikI7Nz-&4lK|Fn+A~jjn5qCv!5B^>$%teG3@U@T)vEU%YU}T$JzTC2i|T! z)?`_Ime9r)KMrN@?=-I)>OatDZw!Bi{kAd;fA-z4I|KFF#aQYee|WB;y5;>I5BFQ@ z+Sc<*}Gxq`U*#}lZKnE!MUL3sK$JoW`SGKt0`tTgf z5+DYM-JgCHvil+dSi(R)0@XGDg!{{tVPYQ8Hh*L*`H5KPTSYApfLh zct%;$Ad*nZ+x)g>I9a)b3moNc5g5<{Z7QsHE-?bmR^q2mALX}x^maaW>Ih2C>yl>T zs)VYc-M+|`cb+C*e3JI^U(f^y%}KBh=n#_~?J8Hn(geXeyfW-bmLKe^W(Si(3xXcs*{9c zNP+E*vuwQmB-`iyijh6Xs5%Kmu+1!VN(Iy?tWURCO@+tWt&CPrQZGcZmcx#-c*oJ%=|cbA4-<^6ic=ocF5b#7nWfQ}Op`^#!mb6ZpK zG83A4U+mq|;c0Bh1e~9aJ;b{ViQaMzy+l=qN-0YUb~l-gZE9vM>RU;&g8a@ zVZM#ZJEJU)k1Vw$i3S+}mWvcig2Vf})kyyCgbNh6wRFB-X%wSH=Hr=}iy^my?JR#_ zvLhV8nfYsJ5iI&UGv7icl6ab49frW-jAcd=gII*O--NIKBRu&9_|8*MRq)wAK*h1M zP$(1%KadC##_}+t0TyG_K&+3rprf~Txs}RxDM*6XrTg-a;msFgn4ZXr8ggXsnH#Uq z^WLVX+yfC-6~_K@bZyM-2gkhp&Nj7RGS|7-Kw_9&45WlIAtP|i=NJrP*&~YbF=Njg zh=wHAqVeuZ&F}p1Nq*+;8|k`;BywUmq1}9it8YC)XLDW7gr{?cK>-8qni(Grk-lil$SpgbcVQZ2slLNZfDr_kFqqlC<^8ijA`)1KA0D7o zZ9tb9mkgzLE*$c$aV{`LL}s8g76K!Cr{;bl5!^#0APm%k8A3h=9Rv6r7tX;qz6?)( z5uX1lY;M4I3#~Er&U^S#3WY+UP$^}LYlQh zh#F}`JwDBW!yjYy&;!(?V`<6>zP-v20W^E+oTt->N-2xe%j$bMqLO-I(b^VlKi&M^v^4p?M~)hYNmCsRyGoVWt zU}nfI3p?Ac>gG5H4t@Cj>prT{8qx#+%@_>aAzLO~Y#2VOkhxg6wxKW1o?4}Oy0^>P zM=J^J7Lgsj+t1+eJ%{O9V*d+_Yn zn2L^X{sX-CE^JR=V$5Y!!B2gdX)0v9#;Inug z%N8KR{u_%67H<|&)~tZBzZ@8kIJ}Z9ASm;@NXX{sT7e8_m%c~&9M;pv zdc;iMD(7R#kHb2QI4ALk51!)T+pY&QBr=4>4K~jH4R-O*sKa5phDFO zx z=FcE=pAHW~XhR~^`{Zpbf(#cKAqkZlZ=dd)SK)=P!IO`}*B^(A@4)spY#W1&M(`6q zN1;$C6bglY1YpqTde9>u zAodS4s1QwKFp7ZY%RCbZFX)q9>U%4i-ysMLTrh;5ErWS>SghoNWdxi99=+=XAGzf? z*Nqz{9_s@aA6r~__3yBEzeuA1Y-5(%DG(3}!M8!FV!U#S)q{618XrUIfS4_V03oJz zUg|C8hzhb;8KK81Kc(}RV8SgBxd?C};3A|0$WN@=xjQXR7L<~S=S@ju^!%Dd7gt!D z+O|MT-FDpf+6z4L?Z>J9{HyT4XOpEPg0UC@xan57_eUrc3WY+UFo5W{It<6~5Gg(I zz1s#tXbf6FhGKp!+XrNrVT*d$`7~dDH)q=5@Y=K-4I5Lng38wj{ zV|hQ%vkQHTfh-?m(dhdr>HoqHZGeV*F>6SM|u z5dk4kKw>8yLPJ%rvATXcWqPPeWZ(C=?2XLZKf6uwCyy%6sMY0^*|1;#vCu*dh++1J;#6>b;7OeA4XU z8Hyj;Q(rBp)HL+6JV>EqM2vkzBmol8xMFk52tdR#CE|A{t5?rkk~=CR0hyRlu8Eaz z`SP+<@7T44vl#+v;N2iTb>|J-d(&aon~JTrL()v&Zug_4Qv4sq0CX-ozTfG7z)1K$mR(F*T2w#`TAigKbJ`+#4`6Ms zx!p&^(uMG{S(hp=2QaU<00L+;9q(h(0sr+jdgf(#=0(P5ukevABXow0y)kOwk+S`& zP$(1%g+&MgKdE)`(}?ou=L07QEfQly1MLTJ0kdZT(klXn%{N-Gzvy3#u%N$*`WGOj zGekh_FNSe^eT7dRUE_(1msvGvpIF`Mj$Wuv;hoSON3Yj zE=l~-eK&LZ$Qs*SoE0Cc=q6Wq@13Wqw!TRqf@(wy5<*Bd2qcgyLa3<1Dx>iU>gE8V z1p~Ym| z-X5~&mX9~3f@tu@1$g!qc05Fmrz@bn0e{KMvHvOazv5HN$!;>h!vy4+_3ShVR$ zSP$NOgeSgxnXzCKFbp*02js$Gwk+%G85a?Gof(K+;?8 z+_Etzri$0aEU(Nb!!@z@%>-EzGu}VAgL=Y+iI3r1t$e<0-7~=x@$t#GdijZ35?FxP z!aJAX+1KD(ufTUNfQyd*e?|cw`9&CwDHIBYLZL8BG|3~O4+RVC-|e$t0C8JTP#76Q zb<6evv0Xlh`aGcr{6w6gI3dH4)Rn~nAxId@$IOt#JR)#(eU)2|u7eqM5V#mfY2m9U zkTS`pY^D7*Aspce11HU4y|B(k4@+E&G>96<^41*2${%9*^N#3_FM4G8}OZTu$e?h%lDopz>j|lRt``o6bgkx zVHg8M05CJtfP?s=TeS3l?43`G6HO4tf7LycOp?te`-c}5;XMk17r~1ler~UN(1V`z zs)!!kB}PrMnas|lyM)PLWM~zjutn-Piyk5H5D#Y=OL1bniedfpB;TPp_sF zu7tP>ctTuD$W$0m0)bHjxLWIDC7jDtzOMFy9i#=kox`gy@MaEce=yRqfA_2I?^hi< zbm-8b!(I>oL`0f2JNzDznzIvsUe_UQH6(`@BK&g_V#0j0Pi?KK$Jk^4y5u%;0P>M# z8H>dNk*ay$x%NVK`aIfosMiQ+zax}>;HF>!($9N~;b zoWrL}TrYwA8nP6UAta;Sce(;&AvppYf%kxgB7`T2Hg#Dl}$q2ASxI}qMLO!)mPb&qNdMb34(S@31^)&FIGVzvr*!Dhp+kob9rl0{(4hCx)<(C5xcG+nd+k?`|93JV&E2kOB@yl7 zg6$cM<`~j)mWH&I=phQu(==@)C*J$gKAB9yi&5q5c*womr@$pKT9ZqUKm|6d9SN|O z5~sI8J&1v;Z?IXy|Mvld7(=wUB=QBl@qJ{I;lI2m9*hx`IM1-F_$Pa3)6+y0h2iJi zkD(M=3Iz)qBSsU2f8frg3;#C>3m3Yv24XZsfr@Pv+tSY5Yn(Q@$&EwPD1^m4i}}d8 zlg#37-n{pm7yi5t`dDRf!xQwz4!Ze(ES)gweCEnnG7)^1Lhlr6P59LZQMsTYS%%gw zXbV5PaP|pIg4T-k@&{|RXY94ss3wLtZ;u%bhZtjU&aqrwrQQC(#`u8E-N%S`Oj5_Y z_YdAHxdo;W?VDMRe>ca!*qS?H(MQ!QnUPX2I$3+%1g2i&wBxqokyyq@<)|0rMl| z2Qa6{!p)fk>xu*LlOkbe*j6p5KR*&=EI2gDbP6cNw=Cri_79g;Mv zd+(_xmR7w2+98>rwPNHKFiX&AO?yBFJ*d`m;Xrj2j0FL-&YwlV2qa3d)?hQJD8XsX zSP9Fu2DZ6_yBaY*Y3HJ5<>7Nk5=Na9(q4y3bDPX4Foue;_|`51rMNo%2>o;X&Xegs zT=wA0F^or0wNv+F{a*gBA_^|PvNY(@SW;N6u-4`RWN&|;`dR~@U9wqE=^lY|io^&P zJt480?JbK#PyBeObCf>T4hoe3mp2I;0F0$Zsc2p%jxwg?=yq6p50l5w-_@`QSs&^6{C^>~aOd?t?PVuCjHSfP#6}{Tn46I#2$99COwa|R^F(`k6WST(37aqJ*3aXo>G6h zS7TV(AlbGkf17@`WsY>LpFZFy{0BdI22Y=En4ejG_p{T$Vi9n+B0daB*p_BU00~%w z59+eKu!@61uMrL3FBo9ok+&*i0mEl_wGHX7#Fl=zxmF z5xoB=OqeiX!h{JEo*x1d&K_7c@6SZ)hM7it+P%??gG(vK)3W@E?g6RoHx(u$d+eLj zU_bT<743g^Jq61!`4xzdrfpfT*O(dZUTuiviFP()h~#kG2Hrng@Zo1)F!x=SO)Vf_ zo%A&zY>iL*BJ_tJ!|^F5v67fewAS-N!hqSfALyeHGNQ;x1|j=G=R(@jvVVuTFcE@b zK`awUur^_WC%{G`30wkMFNz-i1OZsUV&LwbbAr_rx5i^Uy2d%WT3 zDDvnry!~c_nIIX#!tN+u%YEhkPJ_q?QHnj+VX|95^%d3TgW8TlXHS%4C`PF8R9)&m zJ3lWzrE_^K;QP0*`(MDne#W;3jo|lw0H^0nm@r|&gb5Q4geRW!WGNr3{}|3!+qe$e zGpEs#jM{e&fH8vos%jh~;T#UQOl3^D!T5gZE9fdO9bBzeIo)V@rgN9Nd=&3;xy*h$ zNO^p=obg*cePvi&OVcefxDD%P||EpE6SLVmL+$`B0cvfEDnNc zDW+*0=NZ6sI%2TS{ywcGmUzXhmK_!f(~|=8xK4SVBS5Fc{%OmfUob*@gSO*}_w+PP zAWwQMRAW>5^ry|KhG8quj#WGs#v2=Ek@IzZk46V%s!~eg(OLJ{>xhEu#w`MrjIS4L zvLS?gOwtgq?JQY%rhBrt6yo2exKX>3z?-G7lDuS(%qEvrwP@dR*mA>mzV(6X<<$1x zDBw%LSQF;!A6bpZxp&;qDyBP8kgyZ_I!G)G&)}~t;K`ek)tMDE`1 z)@H)ts48%y!1IFK^AorxPpxvV?B`Z}T*f(3*_%IRm2|P|)i@_2jGOu*Tt}{*+R|HZ zv5?3s?Ud3O8EePHTsZOt3b(u+KioY3>gN#4^SH?UChZ3DSn5Rw`F~rBR`H&;oUcHG zBbAqC@VJT)lVI?5V@Z&^?~w5v+N5~XBC`M0)QzBVXUNB0iiHyC?fDRFK|{vK@1vajHT-SU+wIqIO+I4A)2S>cV;73pWMCh?`{2Pd975Pa_Ez=R8Gvqp4xFh?Wd8${r<^1J^N?2SN- zgzw)vH_f0g9Q3=#PrglO&nI~>$J;K-b3@{oF7)>_Ydi;(AWW2{cmE0BdPzouTpZxQ za|4VF_)0$d9ecaOvxdN_|FFZ8;=Nl6$;~6{_8yhbYzHZ9`06X4?hqaq-CBEJ-5%1X zK&1IitFrdniK@MNE|vG!`^FPU#G&R#PEUs;)Q__)TW9A)?i7Jt5I=gU7LujmRtYIn zmY^d!IfeFBvzpNXkD8;CxvPVyG*h1@@XuwhIM2UI;@W9)6kLgG-Lk%F?UN=zO;s1m zcdLbV`Jff{h>2}xnJ9E+{s*p~Oj4(*h>;kIHj~opb7_~!Rkx9turuJ8-w&8QS0BW} z?;wKcffI7kX!}g)kk9#c-FTNMxXaF6jN4@>y6*vMU{o5vbjRFo{* zK~J-r|3Gr>-N+QB#J;aLJwwB)9szNvp&ZxtTG-;K78V$g=q4Rqqw^M_U3Th`Mi6@? zI1`g=zsqv9w9o(0K(YS&jsXaN#!u0X2n3ZE_IHCX3_7VUan zVna!!9eLM(aiEYzMB1#KN`T_J*wU70I1c`ZLf($vvq>H}+8`+uB6iR99-IE1qz&MX zJAvqhysvuAGbHmfoACWc?c`mBN>9a(b07geE|G5FH_{OkGxM%Yqk}VjY{WmS0!A!e zZ$H|yU!PRG|C%d(sVVIil0%OyF=oItPp6Orka$PX^q~R(p3I22ZSuq2P)_<3*bG6i z`%x32B)beN$x*vgG_q&ZNZ1f7a%{QL&hObGfM#7cKJv;`$ToYRj+x0yO)U6F)>I@LaHa z*xx7W#e+Z$Re|c(zxh$4`ZjI|H_5emoA}mW_{H|QR*H-1Np6BCSjciPR{EFcWnX=Zd{;5J8Ob=&gq>-*mZEiiuuk zwQ8=Jd0_HaQK_hw{^(W9z~<+WPbF;PX`2)F_v`0l&7Pj&VT)o2ATT`bSGA4#9H>cV zHIlLqQS~Kd0Y8uR?&_KF&Kv*!jM1>+Yj(UiZT`^m!>0%tGduVZy_Gr|S-J*ggg*Qc z&ywP%xSqBf3?JEQa{0BVB24UECEXLh{{~FF86OC+{QoIDBKOVh`)A^=<36sTx~TBi zJ`t=4NnyGZX?s6oP;>aHT)jnorSchlwUZKS)kUGCN8@0(L z6IXdERhmSu!I4sdTU?5YE8T)O{28zsqD3-g-j%kM8J_xGQb(&C=?=g%l(2mNlkcb`k#Zof$=`eI+D@y9 zYXoTMqLHZyj&7O399k_@y7-+s7PRQURw#E6jjS}Ojs5tEKrAeI92^)J=uy~rW$|D@ zu$-JQm^xz2ZEgu=PV|G-x5mdme=~l%`4qo2h@RV?GJ2+!Tzmg;WV;~1=R_c)sIs!e zygKsiEvpK;I+cW7^&-n{RgnJI2AtKaHMa@f>j7|*g(ii3ed)o6JW_T~?%-0%IPWvB zQ1kn2P8gTZRmU75rE08sLcdPwJWRIM(W6^2VWKs7&EROgC*(`Z^N*&1AX%y4*3vI= z!X5?NYS?^r-(>~&Da+&G#4qpEpIznIR29R!QXM8HG(TzzMoUw}0HOjGkQX;S^??Q& zm^Q7hu0}qLN9%+}zYfsf_-HKUo^yBnRiCf_Y9Go}WMeVtU`gqlm)AkNZw1}CqjP?7 z&%kywsck~2G7QUWLqemAYkoPB{rvdxKfh{BBqz%~VyrAd#zn`oAZa1OcdDXS4$UOR zPDd~Pb~BAC_zw`LRtgvfLaTi=@;2uTy@NY1Ph2%1Dozn7-_l%8b_6wX#vB<$-`_#H zorq>dwZ83|nQ_-2z%2zV%#Y4H@C8T>`-hnzmIrTRV%*^S?C4RBf5QhAZDclgYS-H~ z6zIB2ChU4lt>I99bMt9-x^m7gVpYh@P4t+vOVX9iu$SRa$2Bz@ha1jxJwJC7u0yEO z51AB2K%QKpsfqysQh>q3{!A8(`!O=BcOY2a3W@H}483Bb z9%{o~oDi@LGo2{Y`rS1!zV*ISGE^23-MJu0V_u)%e@vNgz8x>7Mfshog;eyecO)7J zm)nW7;HdVWIV(nPYXJ$p!&ATUEhtw@Dza^h=MrmFMnnOE=X)VfzFdx9T?4Dlecr8b^1Tm5^*hc%oiLTDTm zGlBf=YpgL_zx2KCn7zobOz}LDoJ))G zVTzdOQN>bXhI;eYkx}d!U+N+u6ia=Wg_8TgaF+whnTpZjh%?B(bG=2VlvRHQmzO78 z*GtnygKstg9*WoH&cD#p)Fi=xf#`aH;mP-Dbbi0`7dLx)4~DK(RqB|XWM4L%q5#__ zSE`DwPwAymWCv|_(=Y?|fjhsC;>ivsPMmz-OdNz;``+rS+2!C_Kx|mS8Hwzlu#*V( zZQX1$?j>7EiDtPX>1AZU#z`+@iq2nT8V64bu{_iDnnZG~0?*i(-<;-&Pn9S%CF*q+ zFnY|=`@5_P_=3?nm{Q<%{`NUdgwr!Rjw6S($V-7Et;4^>02w&&Suzp}aqSZXHeWpT z?r*xnt6uS`mEn=~JCXUs!2cKX@QgW0S_pogn@}Zw`9=oJN-*GleD1u#seI!8K@bPp z<9#IC=`zmQ7Q_7emq?t13%B!aP*lw41uJ1O*=yecpmvPD z%vB&4d8>Bm`LFN|NvTUR`u=Pz(>|qxBTMHm#qh(`=z}{`d!oMtXC6X>xUF~! zpI3zqbGPcD-G{w!Xq=BEDY_r(d{@2qvBU!Q)L!`rg|POo=VRuLEiO0Fj9EE9#RpJt z)G64~esVQQdM4S3XbSHMw~+7=FT@*wqFN4`3^L9!?qN64nLsILeKy&kgF0kLq_=7b z*#VMAm{3#SQpm(06w*?p%V82A1qE@p#4Irx{)m=vYp>Q)Y~Zg0{~!v!sT|12M~WZAmHlA!Y?T#zl0vn~+l^n)7w_mGL*2i07N{Y|HGjjADk`4lhtV5PXL{0SG**I`$AWl z8m18YjJgrpvx9$VB7vi54E(DcV*m>SSzST+_JZ(ib@`xn?R`gB0#B!h@vji#m$x@?gmI2F%J`U?0MPJ)_op; z`FfRSGBWL~we>^j!l^E2rOGfMC;C4-1(`^y!4dy}BeT*r!6oI03Bcbed`Ra9*Sl9j_qJ97S2IV=6cuHID0D2@wvr-Ws zN7p+2rq^taHdRCq{ju{)d>pHs#Mo{?v9*QzsN3;iG>9MsF_|xvKRzNb=xUNF18kCs zU-^Vo!=eA2fR0z{N!d{W1bLInHjz29iaH?HfHG>dxu`_GvnOjr#~W9UZ|3%#`$Ko$ ztIQ4zvAqD=A7C#gtTtC;p2DFH$RaQT(*Nfe7;3C-XOHnDaKLBD%AQ3h(ND;3>6w7@aWTPO8 z)xvg5u$;jRm}pi(CMCQ_C`bf5d3$cD;#MSeGA%c|-T{x23-`NUQT#}C8dygDsDHB? zmm*gCvJT0WmS1c-y@qFF&H+hxHXS^-_W#G1D9NrzVP?^e{09mH<%}H zk?$y}D}#M>GVsY;rk?k*kZ~mmDhihFL~Za(@}k^PN?fI^P%dLCy>T(Z#}Iant)*WF zUdOi|*PCzo5$eKAo_JGpnh~K*@fdVE^4al;_SfTobKDi!`~NhU9Z)FEBeuHJhALa7 zYf@ii3pd8u7WZSuyAJ<_aJ*26VLXswf$MrmES)g^m(6jmgDlt)9mXUeF(49YdzNDJ z#T+IBo>g(I|4z>P6s||=Uh7k{C;saN%7s-R1_BAG6(Hah&1(;K3Tj?Zdx}8#n)G6# zY^xVtHXI5=44K>~<9`s97|@$b4R9>8gH`hYIVK1=CLuAGrt#Ci3k- ztt{by=6GXv+F!Pa{kG>V)?F>dZF8L1?;y+zW(S;O`vz`(`o@*> z_PL&=tkK)9Oux3Nr6LI#aNQ+2L0hj0=Jy!g?5mDJOt^K>2A|=*_pmA^WUmV!%sD%woypq~KC8%_>Q~C?a>adB(RH|Azc(-g>`jb=E!9N$dva zvEU8GaMyM{3;hS{ry<1Xfm&bCwf^sSZ9@d_1RCG}zSa(Q7? zICXVjItdCIqJFnh=r*xvHpV(-ar?LmYvpAqyC&u~b|>FI+v=fe;1fMZITI^8!ifK#e@e%#~*A!4%S06_Xvqeo={ewg$TxG zygIAVF675lG&(bTdOl2F3K<6uDGVP;JN0e+SLWmtfXPnqPBKZ0T0NGn+o4U@>WTNw zH|DP)=Zg8Vr^Nsv$I&)4 z{}`>WCeoxDhY;b6+otD+;ctXuJNDF<-8UbrTug5C=7+OGZ&))+WwFiF#XeBRp7Mq< zu>~W%#s1XU%RXUmex=oEd+#X!r|#tdA65d1+pA(uddt;0Wq75iED0tMt`J85xXB-h2m98u27*`kL5ng{B7hL-0d@sIY zl22q$9(8}4(jQ>LZ!V%2bSj|My3iSf`~1AyYu2W($p9lnYqe=w&aZsSV69EJm6$rZ zY#8m3;h43^8Ls=)G()ex;#)jAq-0`_(}ek}V%&&$+>E$mq__3x3@V;X1(%Tyl>*Ua z4K!O9>}30zh96WDdAJ^W4+Ufa<;!>S*pgNq^3rc78e^6hzt(!r_-T1q8+_fWJL>)POjbBAC}r%mPV z_#iC4O&bz0$anc#PMM9s!EW}pjQqrAxTWp8a6gWlc9A!W-6_Jgcddaf`uNCgl=I^u zfOBV822Cbq-eY1&3rhxvm;gR&dI65!VLDS`3}6)6&C@nm85^#d8gFZg%KJnGwAq7= zs&5!oT_~~$cKhm(Eb&?S033<-;mFo88cQNy2O%HIS#g9NNzoWKVVi$&6+!VJ2nbVb zMiYB3%pUOKKS;NJN+&AQ9f+|b`!j?TRE5?Nib z2ZpQ|?X5{ZwSP++P4wuTEiFe8Vb3{|h9?W8JM-=cx{UM!p_8=v4#Yz>-Iy3`AGA(6 zeA-2+Q6J#y;J%C0ARuD#pAexv+^m18@lR82yIzwS*Dj;Y&X`F5?Mhn*C3B}iWq+Bd zP8K>8JhVWDfuP^enKfM<4O1EhwJ)czO~vEzP=RPwCxKTdFN?^oE%eaI205bB0)k-@wi<~|7S46hmTmOs_c^h;?-ZK39HJ^TcRQ>qoa<~iq0MS zWV0b-?$IHz(t~TjM>G&&h(dM-`u%q`M!!Z+F47^1g^EVL+g$c`g&(DNEm^{r$NBH(;7k?B^ zc<&BtmW1r@e+z*@TTdrp9(YTikPZDRd9rwoK#hQ!HFx5-$KWAy$9&2|hnrXo*}gvNENg z^lDKg#1F91T&LWz%vW6Nyash#MwL304MekP4{5!l`c#KG=gMly<_yI0gpIwoT%jV`3 zj22=vII&%%G6$OR&&AQWWlt0aITp_#&X#6S8nL)h*Xka!I&atH&Py*F;W4G|+dE%2 z`Y(Qa9^_((XX~<&4IHrm=2<_>js7kKWPAT|_xj6(5lsHbe=)7n>r67_oc%Rl zf#oV_k5uvaBi&+Z72OR{zG63A{(w+@hOit(? zhmsM%5V=1=+RKSv!YNW}*bvNM-kV^!r$4!V7vQ0)iJAUd6^nxwjEZI$aP0mrL;`ye zXS>B8x5Gc7Fy*hVe@kdE^X+=3(vKnqggXMO`=^cr7d2lKA%rb9mhDHP?JqAG3C^h3!?;r4vmVHD}ah0{p>Q`100AN-hhH z915GzVZLu*5C-vJTt*M3g|Bz$n^C~{#2kr)PB1342F{T@JYWXReS&f}RFB_?t>LN- zQ`D;zyQRy%zg$cB!I5f7D=O+r*Le1V$^QY7ejJYHaL&S#?E2q%LI6MmkcQ1A@OQVu zBIg=wXO2yr_A;hEz!ardQ?p6wU=QZAZ)gQzBs%6wg*wVheQ{H?0M~`Q2LfACPH5n=hPguspnJq&r{um&o0BHvJHlYHi*&)ZpZY^SxDCDU z3|)al08}X%aJNZ{qYY)48JB7AR1co1mow%gd7s`iS(1nR5FTgdhaYzqEj-UlN7n3c z(AXprEYd6Wx!xA*=<>@F_Meq(DJnU5K7XT>2V<+oyc9(c_Sk&cKhJ7@zIzKttr13J z@7yB@&l8HcnU+kz1gFzu$*3A9WVExuP{PQ=NY|{W7ZvaZjri8^K4a0N!S|6;7$S7< zh`sMy605I>CnY}MbhiOT)SK5D<}g`{(nya-S&bu+F+m)Y))VqsJV$_9< zi55prE=k=yJM~X=K}W}X)BJ2PW;b9et;jQX6o^Md7og>eoC+$r#2q?hoI8lhgs34O zFTD!RtnUD&a0!VFI z>q|1u#RmpX)eC`jT%ouB2`fyr<1(tk%6xg}RIEo;!!MwgS7iTg+yMwdn9i4kzjc@OSb!kDcaMqFv+CN9b$bjpjT1duj;W7At%CI-Wd0mAW@s&pN;r&!tn{ zZ`B9ZX(KHN8#DLHC^&UF?bdO{hij+ux4B-~bkxVLvMc!s?rZ*k>v`(Bc9XKuPW1G)>4 zL+x=XJ~eV_u)%p6Q}(tKuBD$&Y**@UzDzmuI0@TMS^9 zs7VKgpd4`}2aq;uF`m-ETus_@cRk}@sF&O~9};c;Eem3@{Az#;PfKRW>$r0Z6F;1q z%E-@ugu0_#?DW=NfQ;V(FUvbPU(KRpw+8z!)Dhs!9v*neVNG|RiVHWEj}n$2pmA{w zByY-0bbb9*QJ4boBxYBiX6Mu(P##d203;xI91FRSPAp#}T+Rw7la{AWyyZvY>P8xJ zywoa}ZYmTdXfjUl^3wEuOqYzCohne;=uj1l)_g(D--1mnS7@=C*KQj01RW4pEG;Nu z@YqZZ(I@PP8`o9e^RKL+Wd&tFSAoz!xjhI3%_XO>MfmA6Y!6c}h%wnKt;z3)6a)tw zgQzBjwsT5b5E=zn9%wUk@klklMG35g1xT5>NC6}WOe2nNr6PU!S}DOZvw74n5E@se zKLnWshxxh_zF0`!mc&=xv)w2Foh`@qEo!Gnvz&tvM#1gy=ol6VF(Wwq+5;PxkutxK z^0P?A04X*ZiF?V7p3pdose~me3OLWJQTbnl=@i>!M#kBtUPoK)FB90$?`<-nWZ@zv zNbLIN98l8G`j1(vu=#=kNO+r)k2`Z)l$?-A2oW>cN#v3ycr5l>VBVf)7JhNMUjO-2 z{@kXnSYT-e4!RI(G8SSaj3#WvAo`OW%Cn1{zXhp34dNj=5HaAFZa+TWPFd916oOan zV2_8-c|5xaB(1Z#X*_PSy;bg++29qi_~!`XIxT_qUFNUCt?boFU;9bMoY@TCtR?|6 zlX92(C|TkRj}`;?o=BxDshE1yQ3v@(=iZ_^5Vh(!UNVd;OTq$Re1n9qu_TT61=9dV0<^@YAtI8nbtMF zgEPM3oXXV(6$Tf6wB>tWj|RuyBRxxJUaen;-o~}iiWBa~=dT-v*>i2LHcjE)vUVtV z@<3?Uen;H***&0?vcniuD3Fsb6f1m2@DcY%Mf~m|_%-jH#4xg&C`cVdQOR9GOK%hs z#uY1R@GO79q7xAX6$+_ebjE7zh=!(yrtQt!kDZd>3VIh6M{R30fP4{76I2G-Bf6tc zN5$ufA!UEVAwS1E2{=97{0K`ChdE@{KY}j71-722754z`Vpl8^@9(e1T8S)@VMmlZc}JA9)Ja(PeZ~%A3WVn}I@cN)dWnafY=mM8oo@pqx2+@Tcffat zN~|bP4>I(c$I!-5j4$ga}?ajEA&e_;xM{(cCS(P58RFwJrF7e$Eb+5ScA9f7k zf~QV!$X^88D092kr&6FS!UdB!)U@!@vV zDh?z07gps~3M_PnM3-{c1|VoVDwrDnN|P)K>atr5w)FS|T2vTx7eXPZ7Ic8O469B}iS;;@g3iVfLRo0;GkZGA8Bl$Pt%B@fN8#T9AKB8TqXH+6wE zxiK9V+71=o>>P3A>UbOJ){+9+!Q_6|4Y72R6*iUlLc|Nz4Ovp?5m}41_`jGXKWj*T z`YgmJ-pV7f=d`*_{ABY`A%UiV{$r9LfrW@_Ty=z)Mp_ju5Ajivib`?AKNRt|P)_YE zMeR0lJ!oq~X?lfmWTA_~5GCIw7em*c$7GoZf=ccogaRo(_}cqkbccd1K5SEvO?Xq8 z4?B!_N4e?+hptQ1mC0LmNoKz>I&aA@-cx>_2ntOTaym!5>fjq$sq#0js%^TXt=m5r z_B|sEXt*IE{snig-+CCvn(*254|)ho=H65624VX7DkVMnUx&&uTwhw zvT_1Wk2$9~JB;G-SM8Js~MM z{kj!d3I;|Ks~!{5Du^Qv6N#Qy`wRbWJ0JhykKfY88T#{y%0>K(&GrsQV&D~AGjCZ{ zc&IACW6&W{{OD{bVZ>PD&nS#q=5L-TD56b~?d@xBqks(lH=N?SJ`Ih-Ae(?#w--L92`$wt_R^|%tPXA zSt28v)=7Z`W)V>P1nO<7v}jRuuE1uQ*Ds+cS0j z8NZmbJ}_^*3gE;1)DK;RQbh~We8=40@7W2Hrx(SnFu*p!bRtrF^r?x@k94k zb0R=tNlAHj9r;D6N=h-7hO&U=F7wH#iv_OiXTr#5gfC~_mV~nA_~Yo20}r&`2ymRt z5d_killc2}X^e+yiLr+nmuS8ShszsM|B0`JMXJ7(7#(jN#ro{rJaK8SH&DQ3Y6H>ni!a+E+pdVCQs$ty;D zE*ls50_xcd;syzrNL+-`EE&F-tcI6LMxvHe8I}f&sK@lKY{f6d**9i-nh&3nm+ z+1MdxNx$7?_vgaXx3)$FePFt7maYMj@}lu)(cjn~s-r6rq)`UIq1(PS?Tj%|Ujuj! zj|Y&^-$EiLQ#0cIL%ITkSNQUYdwxP67suV=RseuM}F!_Gy zyRu$v{%|xf`LzMZK0RrMET?y?>tgfJ<@$2L;QoxZnB%r!@%|Gd3!{2`7oj8p<_HBR znAivyMifTn3EmvCZb#D=Md+WOg2W^6S=4S}h)d>qFX56+#X`E9HV%@J0;q1Var^Db{ z9F^BDl{SvZWQ&*LQmzuZ7}j_W3fuRqlDu_%KvMl^A7S^S)vcg{@uLJq&2-6!0d4Wn z*vaYJUv9?YiJY2>F&6m}xUl(@g$X1h9gJ~@eRRsS2_blU@^6c5%6`fuL+62$lVrdI zk4NFZesTlq94e6|td3Gt>}TUo5Wpc6UiJiqBlJl<=Y2cUMxc1!@vl0-5&7mRN;xW0 z*g%1faXa-#3@RCRQf62Um1-Og$|SK?fHaR}-D|b*6WSc#up-*~BgLF3@+EGP>QW@H z(mU!>XQLN4#F&T`f;+Q+LISA>WBodYdl)_scPFf);F6?<<@Zmgoh8fls}Ew!ntDd+z#JKR zl=Zs%OyK0O3zNjozTT4-rAQT*qLX3RAL%tyg2>3P_D+g`TtTohe`ZuQx@d8PBvcy#JCz6D+06$Ft?L7zu+lBD-$&h=}$Th7&U$ zW8@fbvnV;o>s%uxSCn=xE&nyHlQtiB>}l(I*JGgYGl37Ma5h;F>gF|RP}Rn}j3oEf zC3nz`%Ec>>;&}LnmZVi>gAuB8xEczdFBsn_6+w8Yj^2#rh|wX5m~d4B&9W>Ov<&XS z%WG>E78YS)VQ`-th`xXSPC`buO!}8;lV)m2EtQV^#wTZBKsq%oEh8(-%-%ls<;CB2 zh28a|14hhVMk|9w*(IJhtgtT3YawAm~hvssI(0_+fkt zlfG~?orcf2SlHM$fTt;g&h~4g;vFJl;w7;h-cOx$!)lU}u)Geda_`MMd~i93U9b5+ zh24*EOwG({>{obq_xEc99b5da_hVx~2QUU!9rMG(h=!ehQ6(SJOz+Otbh-jWkWo-{ z9glLyv-r&3USE3cl9Q4sC(V?Df&AT*D#fR(-&V#h?%3QVJ|}YG2K{|OO!N=lsJe;5xofX(j`S3F3KJWNHW8$AI!z;?%KpcS=>`Op}Whi zyD9UZ<41zx;b25f-+vn-1WSs8cU*i=#gOLxCC>Sr|HwtG-?Lh<(=b7UoD#+7&*`~Q z2XMBx5=UeN3Sv0Gv1YCEFHiW!F_ZnZv_ub9leu4`BvEBDApD8?EiMDuUZO)jrZaor z<`1K^%d$6>^F(7SE1AtLEnRBGeEyan`ag9Y-yh`_U(dTZIk6WZAfS^>eJHOycw8&{ zwbxs!l;wq{lHvYJgrTIQq*HH=sqo>$^y;c2RIT|477_RPMi<>5uZvCSPkMToWMt?C z25lblhQdE#u=uqG1_rQy8tCaUog&r?3JD>piy}aUAtNKx#^?qFh-zH7_weMn0Pa4ACEE*CiA|CQYLsm-*b>^FD)(YUmMrot#|l(UF{;V8n(+_XlQDN3doOI z5{JBPiXYbQHJc#d**(=YZOkdc03(#v9SBoBt%na)jCdD}*Y}0jw6eN`2tR8Liwiil zc7@pXV6gu#e=Q+as2Gke2M{ID6P;;=SHshqC$J0+E2{{8h7x;$d7kGNxZp6l_3MY8 zP6SUirIzR?CH-In|2CGAm1I6gP@C9Psl1EhH(t*|K^@A(1nwoMOjUEH9Go7Su)n^N zes(in-l(*RiI*#Pl4*~8d3oVh#UK@=p2qNLdT&baPx#84t?IDWDjjltvDLSGb>)(d zJv%i8{Atie3ojIF;PccYNR*exW`q~t4n^d%BkayysFEwpkjr^%#fmXi5Fm2-L#GDj zS1OC7q9ST+Oi~h-&w*0k-9(O13{bzr=c}RrAW_!R^NLF;z~Vv#RU07AT~o??=|(AqW^` z#jD@F|5Jh<{yv(y9Oq7%`@2wU(oqht1jvH}hDtUz!706Kg zzmpUZ#8TYF>dyBxM)xr?{2T(S>n2a{+!j~P>wwT1!q!tmBe&%$2RX@+5c&;@0ZcGO zosW?c91q90Ug4O*%3I?_Oi?u??t47{1N7)V&a=?p6M_(uxYF!w z=CmwOg361Kf<3{0w%owP-$r843w9ADbYbuwjL`5qTNMaLMnePxbEvB4uLd-EOi9Jeh0s z35K!w?fC|Iws-HQt1&;{d!rY)na^0NR4NaZ8#d4QPpY0nRF*?4gA_D$+d-}`D+K0+6%yQM?Rhzc@#N1LpAQOnJuNre$aF5;5qBK zGZa*WNR(2GL;Ht2Fr-r?sfgW=j}lEeyCEJd^O71XLP1$zM$EEfa-Uj*`k(Kl`EyHide@Fg|09c%?*6@hR(pn4|OV8zvnrz zsVZ8MYB30KxB{$9zo0#y{{r`XW<@*ZSf(;`n=w#?j6ZdgbRw z!Rp}mrF*NQjYadEfq!kDVi`sU5E zKbgyJ`KzY{56+BT`U(mf96CEP%@zPVa}I_r)3~Lu5r~=Gi5DZ|q~q@o?b(Upl!>$7 z=rm}}H5=W+#l(Kt=^u57to(lf=Rg?0F@g;1!1Vz%qV%#X&e4bHq5kx7;J|_4)Vprr z!DruHq~!G&vxS@jnIIr9K?+J0V-E;A#^G@PqLo0&V%i=Uf9E~= z=%WCIHaJQgF;P?CGMx(bA3!Ka%bGKnJopvoe2isf2vCcfNXN*u0vc+b=n8WD`0-FP zhAKq|&~Fbv{BYzP@>``N95-hKGw2(E5h9yP7g%%9ue)yx23=)d(H}AgKn}g=o@5bH%sIguV86jr=wxcNsZXFJzfZ>tEYVl& z0R3C&y;?GmLI0=TK-~n&jEC$F@Z^{_eHNTC-gNPbd<1d*BErS`=&gaTTIVu?i8LbM zU$oJ*_&m>9w)cPxuA660nisK@gEHi8jU&=b#fu1`&2a|gl1VGjh+3;RM|=8<5v{o> zf5P1?xGts6h>(H#mfKaXqrdOn`H1fwjCkgc&A`XHcEq0hB0m4Ah${e!8UXdzfI&KTUcF>Lab1%mH zn+KK!fTRJFo(Bj->|cKQ@TZ7W3wkGe(IBnj%xd}iVdaW`s#)Ppq zw#L|gR5HfjcygRjO#mm?LKfn|4-?1y9%OZ7k^nwV5+}yrQpQK02|7{5fI}Ii91jlR zSjMuP#pnQoV20p>K!@L}`5*&=J|)`+q@!S&uZ~$f%pvErtOLopOXx0+wfVGR!v^zB zw!~a2o*b1x9?*|c>>sG50AzrG>?4nzIddjtB~xcw10t!juDtR}fT*#42c8ZcIz(s7 zWXRxX6L_Grfh6=$*CbmiqikLmV=UMr8|-_j%YZq-B>{>YGY_Oi#fo*A2cmgk#odP(}~>==MAXYn=GF48&xc zSp9)$t=}H!-~C`zYCH;LSwDfp(ib27mjI(&Qt}v?nT`1Vp@?7oA!4p-20p&?^@uw@ zO>5_qx$1RN!U`Z#WG@O3lG{K*5t>dbK!3> z|JI)yPR(*qwb^<5FERg*-?$u!mSr*CjI;~{qr>2FG;x#DaR)#$0+zzDWRMsx&iAv= zJ{xK#7@b-;scI=0CT%d(B9ht^`IBW)yof{0VHK%o00#`Hex><2_9zQ79w$$pEQ~iA z0g9FE!c$K@6{48eUw^%}vu;8*1|^^<1W#j{bsgCrhd$5AeJR=^p0=Y;4nC(})Dtj6 zImk9R=o}zzEcN>~jvYH@OfmxNzWfc{GpYm%gs3O_hX|}ThPBNR8wPYlF#Rpj^w8FT z3=wAg0KKAKM?a(nwH!8}WySHo$Fg#SZrHhVr!0o~FF*nOnh$gtaDuvoVoA^V9Xpo4 z@1kJbn&jHN@IAkK)J^&WHOidI^UywX+ng_eeXdKP}9_#Z`AjrTWE8^Q< zi`e;@06t2P)3%f##I|ETM}m+3ID-Ckxw+O1WVtPk-*Lv;dEt4##GyoEkeL7^ zWJ4Z#2m>Bz$QdOW2egB%LCC1NC|lAbI0>9_Sr4=-(Q*!|VZa08{I>Z1f7EhxJMCcP;NmLJ*D5z2T zkl7=ys%Uk?5PnCg`@d)eH(8d3xUp3`7il6M8iYV2pY~>J%HS~g=mjEtqIL?fJ;{aRjY`0oXVd@*U`K|8QN%6QeqK{iqmgwfDXvSlLX=RE zxdLo`h*G*2j=wcwbX~LB3s33dL?mqs6~n!%ZDAy3Z;~D*8t6WV@7YdgfkWb4h8wu? z9nOumh;8@fdOSJD*yZ)O56*wX%m)e>YDx01-8;Yrh!ylP$7Nj9te`#UPu58kGQlP~ zoAXIcrO*~&IMA=_1{8f(@8L;7oIP|rzYCcsZ4!NO=wyWI3=n4q4Q^b7K9*$>SvJ|n z%u3QZvZH?Uf)=u%^b`F690*E0_~3(1^}8${j}5d4m=OBQ+}5u1INs);xoqB>54D4z zfCkM`8^yKJ0p^t~fnY&qhUv7N%k+t3nKckRppVp)nNuiCB=rEDr~k$1c5MR#GR=UE zzJ1O)X-=oO9{1ut3Mn64L0@=S32LTm@$@g_n)-#Vr-PD0CeV|>&^4_n03s;vvIjCC zWZ{~R$}-}Ggaud`)?U#@Q_7ZgBWaFs3a@L#{=%&)_7~?CpGiBn2liPPpDo3)A=|m` zFFhmL?nN;+o_^zBKkQA^Z9Q6t!5>?zOCnXs0CeYi&htNy#q`WCV(sKiwAyQ;s_9I{ z`#XC3Tdg%dJLbDZ;dzny*nc$Qz^@}_8iJ2+ekJ0|J0d102Ik?w6i!58RdxIagjo99 z_Ip=H*KzCKQd#CAx|aHQz4)Bp$@868DLS|A%=VUj+mIbG1}|5L~C+GEF^$O_nk8_fA+62d-}&w{r6N{vHqh$UVG^$v31v(ShMMB zT6_ulSfx=&8kQvmFIlt>t-+KG>wyQt9yXT``==rFeh+GU@$J*zCb-7fQ;+%nfDTCX& z9&%2VfTaN)tXihW@Rpg2#uqf0^{5)QGn$Jwn3fWS7-vE*8)*e+yFIx+R$cXlxH$RA znD4av&OF6b)$^*iu4;$A3X9K`vz*tb904Cc`|W!JAK%y&@uklJAHy+vHkp0q=WyN5 zE0!7@^$XX_ZB#7l@)5m#iq;i<`c+NGYFXN=qlJ!T>2{-Y@x|WqN=&Spipl84+$-Px zAA8sOBS}@of9F9uskHJB!n0rM8HUJU17zTC72raId*J-zpr{BrKS zb*FAk^>%Ij=G=1*`Y+#y!RrqrU49zb$_pcWJ|Fud`g!1b?=KIa_rljey?>y&bOc0% zEEgrZkEub{u-S^_FMsmFDs7=a`jYL$Y$>pFeU-n3(s#})FyqdeLg!c+&iTxGzBQ!n zTSKe_go}vsRV^-Ek8=)#iZy-r!0K`G0=g=P=5h6>u7` z<6!>HRee`{-)q~p$4Y&HX;(daoVNFvdp>6^>y3W!!3V{wBOXlgl!!M$#K)x154*N| zO>Tij-#zd>kFB?6qVvW>I(|0m`l^}fT&F_Le^G|xh#)) zy&poiA60lm${vt6{{7>9`}ZFX9+24pvqrl93KmcQ1RZ`3N;LqJA&Q+!=S>K0pf(VJ zO$BvIGvKF>0zdjiJ@L^b;EvF}$#zPd6gIXtOqbZQ4Q}@p6bYZ9NcMP@Ci0 z%z;=-<0;W%`_SSA5i1^$G`CsJh#dO)TDX5NAObOXX?84xgE&|1&*w#7|*J$I-F zq}6V#Qzvr|$OZrPfG~i};{{=7+_gd&>+^)@k_hp)Ex6R*Vh;#=`_*OIxvt{#7bA4x zS<9!^tOtZcA;Q@LkwV1Tm#9Z7p1TDz`9vvV1eWDgoq0}WD0;zcA2SLMg9$$1!!<|1_OBzk!edV2OXFc^ri zB_N{k!a64ipJhP6&I2>s_oA7upEK{z7TR=nEC2hkCp#=xc`!=z%jeKj4DCQX!HId2 zz!YcPZw2I?>yO??<#~z>1HzC6YsNq-M!a+tR=U@NyX)xCNdO8&Lr(zf45Vy)L<9zb zKtP%S4?PL`;m_-fj}u3M&)p0p5gagkzD^8qIj+mK_OLSNQDdf!1hB&fs@r1(=&V=| zkyXza!UU%ifk=TfGLDvYWE(Gm`^(VHgHXv{sJID=cY&}7aB8%ZhR(Xs-M294t|05b z4V`Wb&l`!r0p|R99}o}_aNdK6&Z`&wnFcdYl4jS5&8RL{p=6$C4tayu>w`C2YD3jN z@#OQUMqLrA@gY3_xrO<^iBnK&9Si7KGy|G4pLZfsmpmlxjg3 z3FA)AHi$HI|1G2&FQC8j40@-YLvQ6J^iIEu-s<0TzKZVYmmy=_)t52oz7DOs!+4UY zowJE3LO?*k3?NNYNXk{Q0RaK?2?hXC-Xh%RFgAld$0r3>Toa=L@j38(OreH|MYU(6 zPWkvyh;a51H+KX3uEWOq9^lMl=w#0$iWa~~O(DL%*%7IMho1r6|4@DL@u`mhU-&rC zu=Pi%@QbnkI|^o3*B2ePN;{dp6(P*Vs>0(TR+)L4tJ5@)0<j{u99f-67g<5k#b;7HFVg5HM3yOAR(@j55?R%%U1y5oR=fH?%~&1HO@JieN09k*lkKo$K71<2&CA*zu% ztF8xzYg`N4GWVe<;jF_HDU1@(;+5#_y$x&aV_5AkfOQ{~_JPNq1%3Zlz}cGO20@^r2=U^j$o3z_ z`odAH^)JETw=aTz@auZwqXFR92Y|b71Ddh>ozpDFkjEsjtF!e{71vMXwpoqwe*7WgtFcKkRJtIbN$>&Iw&vu1fwEo`PEK>Rm=YI!co(4KRa#6-0R#2s@B5i*BOCOZKH<`hz7 zud(+!=szzYzW;IHOil4|^nJkHMtra?)$MRBYeU;-YyD}m8P(e@No*-Suh1_@ER|SQ z4qR7_LWo4UHAM<39*U7DGG2|yw4)@qiR};DO2%SDDns7DVBr>U-VX=}*cM2U&Qekw z>C1RPK)`%~AYitCB=^0{dur!txMQ}q9ajhfs(yd3_J~xiF--x&6K206#|o=|VXEls zikrc18s4Bkb`A&_^wE0aQSABdy`YV(p7^-w8t^^G!L7)xAtF|fiVZW4%o!6pBE-<~ zn!u$4=5nArDVWa4cB~O0f>><1W(btn@tzZ9*(ew_O={gFw+*N`fzXN)r6Le9C|W?) zz6!lPH{r~o6VQ1dVXtC9z;-|?%S*tyQw@4)X$hT92LS;ATZXNxkHSRoz*FC&>JRi( zKL*4d^Ym5uTKsEFQ-BZzH58LixmB)F?HW?`;!jj~x!Ng6Q#7A=7)$rw4O*=cgc$?4 z@d)^yTYx43dI08}ItAD=E2#AtFG%LJOMM8XU2up(u=oPq%UiV+-1rb{M+Au-S4G?P zh!|QSLZ&T@5*d@WIY-WT5n1~(oZbCltX+6JHZJ%)2A%hSNQJ!c0Rh_x5g>;S9m2tb z2O)O%?%fCo2-tcM(a?f0Ehr+`IOX~^_UgxORGz2$8o0jTm|TF+IZVsThH8_Fi#&li z>`{l6>3Bn)pB;iMMe}!$VCg$w0-fHdCqAyf9Q>7!0xf{DKALGDNjM$PGv2*<(H*norON`J85M`_xcZG_f^`58}xUm~q`!Kq>@K}Gx zUAgc$fkEeL=y(Y-H_J4bIk#D0VBj`UDTO3S#LnzB1_quFWM*VK!?eKA#TG0V}S%}`AR%6em8;HAwV5ZOxQGL9lpoFOo6GVSr->ta3^bJ-~> zYWueBh!!_(@5s8E%#S<84U22#ku9H8d`;|_n_)wPRU2vRa`YCi!Ju;lI@*=915g6H z)r<&OUS7spBL;K$mIMR@1O%MlAOZ$yHkDlgEMy|jA@@Ia7wjLm^e1(yTd2^l0sKPf zTo)qLo~Zi@cTJ_|f;@^36~}7@z!-JOT66G#%rZoL{QmKw_&BwSO(Q1sZa9Y3uYL=h zY#>{G4(;q!bds}BQ4G=%U_=L-rwT(!e?)kYSVvq8p~^x;$hJvvz&s|;w;j`_$)>Hv zmIR6$f8st*+($uijn1=*27u}yZC-)?!qphGE=3mafsU4PE`mrE-X0WgX00>q*>eC* z35L}g0RaI40RiVDhzR|DA8)+*=5)7U`Tu~fYs7C5{F$+INu<<*Uj%KH2SkmusYU@p z$#K%M<7+ISnSL?coS8&@$DA>&f#Vhl-@V>q}FAk~?%v>Uum+Kh2w*^ar^ z6*e+&^qF9`k`cg-cOgwK#-MdYZr_P4-US`+MHVdqq(H1e=DfbIpi*jhM5#>& zzn@YH(}V`Ym+jRfFc?*p%E|&p*>(*ti1%8YHKr;+{O%j7Entd1l?94_`_!oQoWr9a z%i|#keMXUGXgu@OP<$+(1h|Iyxb9DREV4TU1GaP$5*@?OW_k^j3H{Oq;CW5bMU1xYi1k z%-DX;9zYV)alue%Bo`rTTquG=#75pe0P%DP9MQ3v=LU0CP@bTU5Sg_XG~ryVGiKdc zy2o36O{Fz+&i(!V|G)3fS-=Y2u{0R}}>89ajf9hS2z^F?0q{qx< z_jq*>d5sz)Qx_mSsoSMOD9{)YLjPg!N<*W{vhY`xN>_HXnn^mDhE{}e32JB5Xf$Rq znof*~&WuQ+;=b>w7!{Wv{&B?()KO4eP~7l`E25$z3d6XysH3=`(HJ{RRjMjURlS<} zOm4yJs>jW1(qcmnT<&{!JLfL%-S6CU?|V8X66x&-U zj`s+1*C5zXkMB$_n2arlwrM5t9Srvv11Kd1^?3`QqQN-&B2Ik>ogU-WN{R35TL9>b zL-Nf4Ef_%&P>fVA61*-6iYX3mZgJ0`8eE2Yi4Xp|A;bIk@3C{| zPApln1o83lBK!~Md+E|8kT?b{77I?CIDz8gVt!3Zq-l4aFJ8O=`J|?%V*L2=?KqzF zKcDB%pQjA`Y;T*M1)U^)u8to+4vxE+m>3b>=KPm0Uj|p3^YZfi@_zjI5ggO}Br)S+ zV`KT1FdozwX?4k3UtbUQS!rphY<$YfZ&Th6A3osZ$&=ur=DBm{!elauxIaBu7xHs1 zV4J3;rJ;NG?tl7veKj&@TOH_RU!#&7UGVt%ft3%r1w=w$=_^?B!{!n*51mZGfyC+| zDI;)0cl_Ys8zjYz;HUp>Q9i1w+TK4w1~`Apf@SSKDA93L1T=L}kH_8e30|ccR7gUi ze}p+99q2p+jWM}sh|WhtrvlibieQf#1xHjVY+>23xRX)e7y_%q2#3RlCPxiC&7T10 zN5J(f;I_c$6kDsa1B#=?cenaH(L<>*`v|ss@yXRwJDmiYXDUkiWqh zo`I(55;$T?VUHOFTWk>;Vt)3z;a<6i!V&osoaP_l3HoCF@j53AaI4y&y@&vTpndh~ z)!+m(Y}hcYS+fS&+1ViIr6MwQ>Qo+N_gf7kangVA-~lHpRk&n(myWb*o+8cd+qZG# z$Pr&0K>(GZhK2@JT0fcP{ON1P)zs90?a|cKq^DlGZ-m*Y-{>~bFBUhEH_KYu<5 zj(hj+t*WcO@udG*xN+kK0l$yO=g*%pYt}4|H?208$fbJ>s>-t2Y~;`9N|HBle)ij~ zTen1<%BLbfaNt1jeY0}qN^pUryu6&izD*$a?Afz?fBDkd?RHF`KAlRckU>(vHobE+ z<96)W0fO@Z0|rpZ5^*~Eq8;8HI!GdqX8pHs-;OtL-te~LLne@uM~+DivLF9x9SoOj zmy#YX*N2$(TS<(%3zVlZO46%N(@HEF8u2P$wpC2=FF@(gLB18D^6~5uqAJQ^{7|Vw z`2d`K2EnrK-%w%`0OZ zpo@ablmb_97r4IjI&&{L!!ywwnTsZ`Ym6EOd#8NZq6^RvQwVEZF)Z<=uu|cO%0y#$ zUvHit;4y}@C>yK?+yUy@{$}+lQ>K8ctfx<(#*7&=uzvk|oH}(1)z#IYVnSe_k&%JW z&`<#YReNYhj2MCa`}ZRvB0_{Sk4Ps2Oq|dNZ2i)*43YpA1g|2!0OV)RoDsm5E1tY3 z7!YzWJryVc-c<){rhWyZPW>hxa0kEAMoo46eqqT~uX~KjqQr7ymx>ucvBdp5U0kxL2=UzJ4VMP%e0B z@K&`u>nrYM^zh+BT)cP@Br)Dd!YUwS7o;JV7!QHQz8Ie@OLGjeERuNc+uGiujTukk zbIE_81R~~NuwViBzM(R~b|)VKUJ_*t)R)XB6jLsKkc4cse)13VLPm{e!LROt#(fEnWHdmum*zGoiG{ z&9AjZN^(#}q8)0;qDo}!*n;&fkfOl!zh4kpQ3hk>J6+0$D=h<-^#`EDB}$bKxk5tM zy5cF$VJI#H1&1LlAq`UA{XGyuRh$i zGiS~mDni^MM7arKxq9paDCf?d!=OQfkd>7MZmW6r?3u40Snh@m8$fv&zh%o7)=>Zh z0s>z@ZQi^YtP`(kom#$pIan^i(6(*c2w;4DNy`x1nex!`uy5Z!=J$b=yLazm@ZiB9 z&&iV~(QX#__xqBT;AKz<~&UQHZszsHkn)($Z2(Ng=+z zy}x6h1LvN5+_^8WuOHkEm-}(f*=O&y*53Ph)>`}A|GzTs4j(?u4yE}ao9w9per%o& z-+S-9>d>J>O%&?Dfdkdnty`-tTedisNTsm@IFdh|v#sbwU5yQH+O&yYV}oQO;-OED ziC_TrAp?%HarZLDMa0slkOFl(&VG#>`YlGKyf0tAydE#RcI`617@u|9Q`iG}n`5L~ z?%%(^I(6z)_5SXT1CspqQQyLV^YH0_h3WnR#~D_5=r@VhrX zvki8_J~?O7zE&Ehxez%-q}f0FM4Yy7-)?SUL+`L?{gjtH4wq{HiN5*k;{IkzK<5bcI4kP2m%iQhv z%zN5ze&CqWNA1_o#@^`jgAYCsshdVblwQC)+xI^pDT6`;-3kMJ9moA00IChpwR$Ci>k#M7(6Ks&n1XojYd%t^wq-Wy_Et;6ncc;(9&0zyy${UIh^2kwuuUUcFj<^wCFkO3IsW zzNt=a0^%Caul+WFg}Q)1vIo-X!yW+g(+=_iw0OpmCGr6H0Z`Wgup(I3u3bZ<0963I zCX5?5Zq%My4>xYy0JdD~-Mwp)asK@IqLvi%zQKSS= z*VkrDY~H+?O&hm$dgW`cy+#*o)p#IJfE3WxUO<^#dAqZ}fxJXD^b^1ZbP-s62j&6c zW~{0M8CG{siC*)r|Hd5KW5YnXlsocvOnr2RT(CXB-Ek2zq{Y}Zj?EqBCiZ16LO9s8 z_L&<1d~*+SrCxm^ck`A0keN9E7$@JBjUY7xhse%r~NN=6D2{1BE`!E%rp2&&lzbfBM&)Oa2EW|Ab!nv%q4u zPx&cV&3T3M3z;S)j3;+z|B<&y` zYv7i5Fk$@BdVyDqH!`6Bk``T{0sywy0k%M_0^o{@Sd4*83opQGqr3vBzxCEz+EW85 z01U7P(i97=Yk2qq0D&!lQvpVS00ad1jK^33aC!G#3yA68!(;|*13dx0`op_#LDx=T z#ko9*0FV0gS9^dsat;_Hdj$Xi1jq!K078HQz(d>8t`}c?kzDl!;3Y480;W_W;sc4=ir5?Zc5E0>Ci@g*3Ahx+K@dZZ$vN!iPhPvYUek59$NG(K}m5 zG=O2Y#1=*NT3UWd86l0RC++Tzh@j7zkh`wabK-$Qc4s#E(1N4nOB#z#i)F=drOjF#~ z_>Ug7|Mcn82uP08oq0>U5T`ug0$DMZ?U_=ywj0;_>}9MWHwcI^ZcasZkqgmaa#IJr ziORSg63dB@K5}NTHTPxj#t8W%R~f(N8TRa2gvy-#>^&80UiW|?)Pn}2_B=*6sZIGj zJMq?u5Rb|KU!+Td%KwC3Zlg*b6&@*cDr~J-Phqo7hY^-TL~cC&Bf`g4kdIr}9z;HF zUvFuzWU2So4L!U&ep$_|cs=Cf$tpTiem!&KW268_S>ywTLpI{Qv=~c=vOtM!$Q`$M z0+Eh)Jn0tFkOSWpAeh%q2|!iUZGpBhTa0tfXr42m6JRP8D@4P6E$BR>z?TvLlVXug zpMY52NM2Ilfk#l^3h4&g1CWFiW#0sHK@P6xffVTh`lMe-r)ZHkz#O=AMv~*XaFHF157xcw6MrIqyQ0$9C%a#4xkZ8MFasq0K2eRl}!YgDRh*4e{}%( z`sa5*2e^rz(w-0--diL|AGC#+dK{5Z+=KoR2cQeE^c%2+z`9?j&Fn_LJ^&7EB0Tgo zh8(Lq?Q7-e1N13LTS6d#NTAFUk=PtNa2$a|IuJpg?A!zS14JDIf<-f=5$2xsI?{fC zytUuS@A-}ZrSOciU%*s9y`1d%%HvI@{m-+&x| zBH)B9MO1iCwTD~~39=M5;aOET&<1RT2ms#d1$4;4wE;@xfpj1tuH_MS95DNq4-x3t zMRY9H189|o1q|`ZMxW_pKr`Y2)B>T}!lTOudP;PG;ApS7R&)XwB@08eCN`P^XY>>l@i`XE$;hac)ojD=r6>X$_ zKi5SM#<6rbGULoh^eW@Jbx-4E%*J=)H1?(*dKHys*JOY=sZ076f?+-|my#XQDY}7B zArP5U$eHa)nMKB1&ZP9si%#t+q9=2W>z$W5Q$5o%3UbMW>Snu`xr>9#DO&v`p(XqR zAsO^FcfQg(7EL0f!spU;T^3d@gB~(b>hM@4CcO3RCBQrdWp+3@-?{mKd|bae5&4*T zYXF8nA8wjCT@X&SD-gZ4m~3q?FjZ0o-a|anU?<# zI0Cn#25F17@?4U)eJF{5*i6kE4+xPl4=Run(4}8eD*!Q|82|#3c(Y6Y2#(N<1L@xN zjedQWilpCC>{_5sZhAb=3f*S^4}hiqQQZW%>bJIv_=u*hUcFl6E#B!)+t~qNCW?WW z0_WtFa|&e?XaTciYm>HUp9l;avzI1OCIFF+0Dt#HdXiG-n%0ZW#;y@6?Jbb6j%>)5 zT}uH&ILLucfp;lzj_P#ORoyyk4=uqDu7xvh$r8^8g(Fy_G{#SgF4q1 zz;(y|oty9J8-0^6*@=9K>>;l?XXKhh6jRI_WN$t+pBh84H^kQ56yhn$A*vcOE6qxj zjV+407&FEThYH7tdhIhwq?Vl6VP{OU1#=dMf;~A>(p;N8WXAEdjFd*Dg9hi$17@x! zc%*LO9)h-{Z9dWCD5uAOSoJBak95ALv9JEPk$UE$9|gK-uCi z^#^za1_0@h2#X~WAw@u5HQ?>IVzIT5^W5>U173hn$d1L5S6%(`?=8$0$}H%KG^FGy zQ;J2Kr&094lVFem*Th2#z>F*Euzy6`^7ET>Fizv{zbKo-_t1sh7u8>G3A# zi8%Q!{f~#4rxiGn@2CMMPKNiJjjNe09E8u`;ai6?xbpYZ;=WfSl{WAEL_Ll z$dX6jwIcx6reIGBa|{U0V@MzNzX;SFxsxw1KJc%QXCAP?tB>rkRk}~z zBd^#sdqc#e#kfzWEqMfPWD{Md*oQ$jKq)(88+1$dqC}!^Kq>hHqJXJ7*sbVL((IwnI0Z9KbZY@!gz4C*-J|od}5W*i%H%(iX+_EgKlEydWuV4}aC=*P_Y{eFoo6z^BY@3Zs13B8;?Rels#=X>E&WN+ z>)P#}J_&BY3-a;jA^G_E7uAyA{bn-qvFeSQeB4|4#*}mx|WC8 z0u4;X^RF!ye;cDMpstPAUtP|1P6~kLv6l)0;QrD_kQ}7S0_+~ZvIvRa#{I_t`2oA4 z9_rA}{DU=6FAYqZ7I~^$z3NKThez|yojdLYC?xelY8xOMB8QmBm3OUUfQwW&_h|CM z6}l5;vcE!`6dUvbkdQ%73j@e_yy+}*&b_=8?v(vC*+^HM2&!4?Lr3VcFaFf18qFefU5q{39tnacI*>T z7_kp~H9C)|MtDSDM2oWjhrV)edZ81?rLWLuVe_sC4dR(G!JhOjZE+nCh&1Fu3axgj z+c-it={aO3@COE`9HjiYe?YDNkfZzQv$iDt&c<_g3XDgO zWRv!#53xJ@cJkXp{tPcEMX4v_R9p2?U&v}yZ|>1bi!yG^EBdT&IhWozKtvZ(+>@=b z@sTzfzm6qhk<>J8XtmKisZB^TyK^$^+&gTs#_}(QRzUP(i?PH4XgB%+0Z{AA=~<=X1*u3uO8 z)~>Ir=_Iva+-q=QdB?KHycGM2>(xPbK2z=3VD04QME|Wx;G=9*!06y)gD(Y}PT4bETP zllKcyw_zUn6L}Hwm@CMACZ5_rsE!Ra777842ZXY zXg~xnA)n&GgM$8ppkfsKju`MCJO~mGiwIu)01-q@vg+z>aa!J?Ahn&crpR_Ov+06n zcBXr~YrA`Q`*n4_I*_7xonHAh@oRA}6A3GcPVmI}mBTWUp9Rb5j}Z*Nk-CWkOhXe; zrM6R*BUr}*K6bxQ|G{lK^U(qya@64KF?zOLz(>nPIAO}?dN~<0MC2=fY*txZu@i@5 zAcBnrV(4MlZ+|9UOeM)MxnidoXX*v5E4ORZtL4kjk@mCHKTWW*z=DL`aNOhg40dAy zJ_MP-gg*aU^!xfyp9{)oOx|P7H(PhR?>%$g8ZWPIj(MH*n@=zQ9OU-=pV{tbYYccn z3nytl+J<|7U+MG3(&wmiMC%V(-frLXozm~^I=H;01N*|^h%K{bbq0K}WDZ2At)WAc zz}v=}S<9;&!2_d_XO;0=KosEMjMpK-fV|4*N(##JxrzK>ybc>18`aLvPXF__y{&T> z&KCmr)p)xxbkRq)UUSQ1JZg7zzMT)f1 z0x~~8ABOvTpDr&i-CAE?|1)6$L5j+KRGvk{A|k9Gil0bStRAMdBZmbfDpx0amINn` zU@Gc!PvpkBuFF5@ae$Bg@6>;I#}7U(t`K}a#;ex~_-Luv|e`u!CkNox575 zv)u8tcTRDg-kj>#{4L`CzFXsx(<+Ph%{ETU9Aq7g{2c9ew$F0 z`yI|bq*S?BuqsEM)frLAm*VFlj!pHfV+ll<4Sf9ArT(M4)O-KN2R@dTY4miP##gQr zg*htHPGKkGX-Ej+$a=&W*Tuug|Ic^S3jLo>^LWg%GT9 z$uYiyQLj-O9r_KOk`Cx2?e{g;21nC*&*Rt0-}mMsBB6`*v9+eQ7-9{85fqmNSFFB# z0K~RlL??A`<=`idoXn$MI+!V8KUi{ukDvS0e|(R6?_LxAjm^Qw;v$VUU(opKjRHPe zE?^x3GZPq5+#-XDA%26i9_cI%T36`VDUnJUDrAK5PnP`eSjnMiCZ4QT8DH(f<6YR1P47$HbOWu zKgJ{z2tjI8hQSAP#dmjBrH&DoC@dff_^{UCf*H#ulB$h5G^xZjCjilaf}wyO!JLys zP(cGcPV*C4&x`pZ1Nitgq_a=%Q*ZFf2R;@S==bIpjn{4#@X=!7g~4Dj0G~hp48+kV z&>CO$(9-n=g%>?4Q=FN=bBP!R*Uh-e^3FM`hz<4pnyzrzPkhPJm8ge=$~vrbL_ ztE%qls_v=pS3_1!U2WvAmQmqXGjHgLd=z|$k*wg~pa;uEzJDEeuE8Y|4pumDVWy>q zZn@UxqtLs@b7<@9>p)Xe{=E9p8lRy(*k*|ggy=QyBw=#lm%vzwgF*OkbA9I1<{Vn* z)rg0}1AnRc z=|d$w0uD&s@M!HiG#D_5C)^AD-hs^SzAf0r(aHr%OFzDs7oXmjtkNZ7%<$kC^GtSVtPLmQz0!w`^CPV!30SJ{FWi#|9B0JY#0 z2=Q2JlT<4!&o=tr#ivHSmHQPwHjkE!>l~Gtg#_L}SO@qQUMG4`${F%~+#a54z=3OP zYsF$k)FF5t7Z(?@j^5SLiA%HBxj>vPNCqj}acJt`_ zyyGq?`iw~P7I4B5{zRp&KXo{NBl=&AXV^KRrL1}Nqb9Tbe(3+y6ClP!-xCJhd|+2I z&jPp%9ac%-Tvq3&Wc~oe>G`T$CzDBm*R#61nmGa{Ny@6}-l7N2XoR;Nhs^Cb1r&Pa z1N8p3G%!mZ^&5~5srH2is~yv78z1fRSeH*wgpXi+Oh1(6ub=yjkCm6@b}}n>Z{9r_ z9}AE&WE^wiQS@R5FectUZxxhhNX9(2_g|d6w|jeg#Uk$f{Ct2=%?qv^UQbvPUW9ph zDaV2#sf}Xyqhg|7~{-_Jza^#S{XoIk(H#fi8yPsF7 zk}D42)rpyx#HR@^#Esz6otqc~5;Y_ch={rnK~cdUh#OJSFv2(*e}Peh@mCB(5(#8s zAcPPCfk?<&H~uRVof(~hels7KZ*#5puGjnC2=>qi`gOnVd#g^JbE@il>YTduVe!5D z*!+_xPsoJ5>L)cIa~=7+U%l+|C7}BF@#ENgPVrCs$jU*LCdad?|*gt-~@Q2tt{jz6=?0HnT`qi1}OzwU3=#jPn z(m*Z0Ii*|V%YEsC=}+v{JDIX$x^)mJ9_e_Lj_7{l06pKof1fO(^Vnd<24&EN@rq3F z_>!%8XWMMhOF0i8K2%1o$#tTd76H;nwMW^b|J}ei)R;-v#+m2`aro%2;RuqKHXFzEGpFEdFP_tmTuY`>uJi@EPha<9Gwha5 z_0`lF`&6cJf}Z_07Eo^{2({nibO+s!%+Eh%!K&sQgj~+cL$J+!T8ZiQ&-knBl;s%=Bcj3Z?^u>T;le*Qeq+^Z1;gu^_ zigGv)R?W9>-=345oze}^B&Em+!R|MK0TK8B0&?Q7iG2iy-S0cs0xTxq%aMAE-&Zl*8QrHy&8l5H$Ksq5>l))+Lc=A#a^nPS+0*1dz#| zY=C$7>c=5Yzmvt;gZ_X|IzY+`fJeY^#u=aWtJG8LRJrV5KTy*H*TVTt`+;ZKpE}F64o~r0E)CQFQB2NNsJ7Kgw}`P5Ob~yfQ|J zfSf;nzG#DJ*@+V;oa&$Z$=*24X)^XYRp0zG7EZ{Z$M%9YeB6>E<<*JLJEASa`84Sb zq+s<3@pPn8wY}$a+qJE`_fdB_iGU0y+dvjhgOC1Smi+oenfmYF`Z*upn=Vh!{;9n9 z;iif6F@|LD2OJFSKwI+aP5LG;pbT&ZYD~1iqzQ_nVG_D_?V3s4BseQIz;_{_)Fg-i z0jplX{E8JTlxeaXMKzSYdi84W_>%8!U&080`(M5L_U*IUX(Ee5fMU{G3!SO(G72`T~|tojO&3407b4C=c)kWv)T?Lo| z{b?erG0wP3FTo23v zY(NJ2b13PIlY-W-Utgr_Na4~xbo=&gPRJ<7Tx0;4uW8w`Wg}hE`^#R1$NvIK5=yz)1jF z--~WI9^^uH>F=ED-Me=eynk_S0bbpc6Z4}7^^n!5AFxaIh+GfIYNNhuqd3{%k<2+N z?0_w@cMdk&ZKi1goE8(vk%NH9kMm+-f=&T{ixGzpAD-omp~Z_A7ySabB~zqdk!1+~ z?8dtnhh^u^op>ARS>%rmDi7(ubWTp>pns8@I+Ty{&H=G6gMD!xwOvZ7#e+L{?i9`d zqGNUEzQ_R?AL59xXYxnJN_Lv4FCx#_FMH6xw1o}p+nj2tiqb5@r?HKFTM#gokgJ6U zI?jXeN> zr&VR&n|y!?K+(hwy!yU%49*I0Li)#!9pikc)BPqX6J_o*8G0W9YAcW-Q5a5)I!(^N zugOatz&+5fO(A8(F#<$Q;6R;x{FGDYjsqPW2mpeUA?jl_nDb+W5%|!Kt5>fo2dES6 z;DE&O3aCXuIKZWicm+nRXo}RBSON3!fq<8hPL?iRS^#u_=+dQ208A$F(F&usahebw z5QoF{*RNkM_wL=xrv6z3U;swi3QVdS2;syaQ6hj<3Jy7{pHmiH;gRzg@)?i-novNX zw)>5&0NmUUC<7o?a3g=9Hw65sqo&9wa-$c(UcIqn0L=H{i_AhmKcW|M0>tq^ZrONC zhvcK4l)+YkV%M;FeL~-`63iaimlb1nk;oPsPNXTaO8$IS(Sb(kF&v^q66jQ2X=_cQ zX^EJH0CPMB#B#=Cr^=1I@T*QBT3gu}=TKV^hgUz;7Iw-BtoM4b%a8>L(K3#L#SG;q zf`9<=*rT)>{ii-%TcjWkeMrBHED|NmM(W%j%5|Isc9(KvrzrnN_HpF27scj9wbIYX zQ4}`)g}o*c5niHS{V0GPnAVTTLO&%R4ra*0N3GkmhdwwK?1>JI8|*_w0>A8+ZKykG ze(7g5ivd8sayTa(6=NPsT5W^!fApa&?{n!RGOWi4ix_c&?LiFB zk*hQ>cE?`uC?ZX_Z+#Tx%X2^mT@P~VeO^cR-i(=rvfjZ{XZed368U&jXNc6)FW0S| zCI=CI70$=Avg9}KmZ^XLrKj`po$~a(56X-6KQCp`#QFF-kx8iQdwE_H1aJeSHr>+n1vVsNxiv$1^09?weH;Mw`fQRc%f>va$Bmy>o z8Q^ENS$!N9z|C*Ud}YMRYM>Q9lPdtn8L{G9Z=6QiWDYP`(X^88yGnMPxO`6*q5)QG z)u$}0rRu3=9|uOX!>X)%0T7NBdAeS@gw;*y9)JSiBWjbn={a>rj`ULN%XI*? zc3Ar!cIG=;-X(vj8tU1%5fv zbXnV8XCEe4;FfGd?2(N%>+GOhgXhi-`c0juPtaQnxvm~#n%C1~%FOR`)*stXy}360 z#zCr6A9H=Z;a)0~NC1G(5o1@JM6%nwc{3*^scv=KYyM|BV4)T}z(aUxM!54`vp!=+ z5BYYE5qTJi_UXggtzV}9zV(~YhwbosrVkeHIxeI8_x{*EJiXC#Ko%Yi@!o&aO4~8; zl>mo*cp6Spu;xXBPd+NszkRPv{p-*DoR8_L^6d2Q%Zm-am^dF}P6l#e`+Tn7O)Mt3 zqzfb$J-}Eh3IJ|m2xtPvfgNByB;`mwnONkTTkTYi2^lCi*`!{8Eqvgi=2;o|0^Fn! zShY4$`F#5HX%ln}YSg1%DK%D!MO93KcxVElq$F8^6Qu$CrIi4RQZIl3vcRwWZL7^z zHGzpHug!=9@SggVCB+G!oEYE?Z>?a?y}-wSe>n(G-lN~D~zHkbV4>F4bmyp zL0+w3kAveS@<8@+K0?wbq$XKO$2%~P-<3;VP2R&>{wK3IH{?JD0UUG&bmO-M+i9m) zP5F)O<#P=R$s&|Aq7Y{)DL%lQsE!n*HqeB$!=`H~HL1&{Un}D5LDWS`qG$lSkWLgZ zoA&xWq(1$Cqf1ZpC2FHy*RmJyZKNNF;E3FWXX#*hP=g4iR2zG&q%q+?<>{v)U!pVV zhf=E8v{Wd4n_k@OyJnO#aZ7&= z88Q=zkoGFY&H@J~*MbOpL5W(_PK4`FWasyKu?UHb;7iIJz0#fNtjKcG9HlNQ&ppO{ zJVghICe{1MLgA4^Uh62-bmU_L<`5}xi6|Kx$Z#xZX85|9Lp2ue;kb1F-uYeshgB`y z0hw=TsK*nk<`aRL>C1~0tjVE-^P|D@kIVG!_sh5c`N#gw$Gg8P&wsL|lttev6B=(a z*+}^?Y4}{PZZ!`CluBSCv>MJ4F{w)ru-b0&k@^!5Zp9TS_p~2*zH*GSY1B%peIJ0R za-=wk05nsXlC~4W|Ze0Rqmt5CxF}V$Xye>SpR! z6WH1q4V+4S0^|V2q?||}5JgcIKuQLHXr4-hY*bdh_S-Zr{RGMRwz}*oV;mxY4B%^~ zQII1_PCv&-IZ}1V7DZniKjeGBjnkxFylVsAfqOu64)Q%cM)z|*IvI%M1kt}JOdUax z2M+l9jy#oDr{8%Y_9Gu%+6Nhk)NrnVQhJV#Lu3QM&P5zAj&44)q59knatfd1$41=4 zb^t)p9D9JltBCd zdF00~d`Ax12rspzrj*CAlwK$5LYD5=w}3bfhMaq{X7A*V=h%BlI;2!FJhNlzPxxU^ z9Ci1)MtgE^z%Aajg=1>35O5u5-`JrY99n>xGf4hE1J)d|I!%)ELVg@`dpK_1ya{NF zLQ1Vm*{?i&l3bHs7kwFXI8@5SgE0rC&vEi&b7@~TX|r2Sp6f!!I`tqaLu?PxmA)EE zic`S1F-LzUlQ^ILPu(?1bL9k*qy9mszT@lx=pp>aW?aX%>0Y{)vCJ5$O`)WNA@cT2GTyLl z&JYKL%*W@Ur-N@4f4|^$&<}TaW9BZWrbilAuLH{$oPyQ!>G1W9Wbr%Y*{NIQ`OmgboR6;w0WiS7 zNeXba%AF0jc?wTbB}{lGeygi_WUu`eSwU0|0D}M*E1*^yfp)+c;7CdjV8O94sc;Ga zbig8I0sY>QNm1P)e5wndCPARlW?A497zbd0qGlu~A%8##|E}jydDWmU*P8fjcIE7t z)NNh|8vG92D?@qjIG)=HwjzO11hX4YL^HAxh8dk4y>ey7n8S@ zW>14LK?BNi!tsRgtCu=+^y>w5hyjLuppDTUXotPM;zLz(DhU`Qn_2 z?6F`I0C9+8s7(PX?14;yBOp$@ve}eQJ=T-Wg{-~ara)Ch+KRQjMEw&6yTRrC7kQI3Y z@vdP9&4(l?k6qRBuG6gmMs1*L_mOS-i+;e?*eWNHy|V`tTOvO^ah6=473l13vKIoF z<=AA^n|}0P^^qxgYBw1p^58tFD>lOZ*`YCl4%ky|kI|z=5q*a3L?^*0kv#{C4RLDdT8b$9py}yXQ3jahFU8^O0Yolc&4X-n>V)nwXEW;M>s=13sLPbmLsia0BJL%^4c85y&Lg; z46hU4e#jy>^#29saL{C8u?^-5!WAt3@qTGOS}sPA@0}mM#5$b1Buk39a}!agt!QbhEQ#V2ugTEI4t_^B#p^LY>={bSC@a`HjiafN-2|M$#4S2glvKii``bhm2>n zS}kid8jFX`ql2r&j~+bs*5K zk~Ru6W8J=loY0;QA}ogKc4*CwN!&R6L4 z;WKL8d61Zogo%c0R=^Cvm?0MxrI&IRm{yd|G4vc0ZKIwrwsF^=>G-~&&dk0yvjU4? zjnT5aPU4cT`*j!@4>7?~c>tz)5q}V2U-7yZ&<_mM21E1e_vD*Go3=mfoz03!G#JV=*Ep8;yO<#A&^aGJ0zKnSH8u8rbx|6GencgEx61~ z|5jJ`&{chJpR<*SkSMbs-hgBR2L0l9={9Y_$NJs(vVQTt^!M+^Y2P5nE#}hmp>5{q za?twSdOR_`-H|+6ryo7`v%ZI~hmGA2r60;1#aIUUKQdx|^8@rh4fi*~;e7Dl8<@)5 zk+SwrL^x`|B<@qlULM~@=M0^&F?xLB{>UyU{X^*=J}Orqf0XN|FLw_<&cBt_*@q$c zI3d|`$xvi^T&NaAZY(F~N$5}TA_yN|mk4cNLbKvx=4>{r%jj+gL|VW+*4X{^6YnhO z`}V9~rw>0{>bO3z1@|cU*`QP22Le9>u&Jg!r#A>ZT#Oa3!HxB!4vWPCm{47~7vD!# zA9OPKQ7Dt?6Z-%z7El48d}Yh5p2V#UYj5$205=K@tzc>4gUHuM4)6dZD)6Q8;xhu& zEhK@!jW&!=ki&p3z^CKJ-=Me2Yp4t4ERe)zP1}62%rj;QklLCL(u2hIt*-TY1J)KO zU-&bSOc$jC?G3az(r8y>_N6qOLN+!wc9pHaRR_8fk}`dV zAN56~BV<`Px{{>dZ0t&FtwVmM6HY!vT#Qp?WBF89Jwb5(;aM^5dE3JkFr7{nL{#;C z0D^N4hXwN{XPUNR|A+_;$K!F$KA+mSp8v^Y0=b&jRc0GE50FJdK1jN=3-$muRb#`E zhX2OZi|oz{W`OXGYe<|LkN{FP8{f8hlnn{m;iAdcfyA%tWDVJMpVftfgt3Qw|39Ti z^G0yY0fh)DsRxga=0mpdZyEBrQ(vI!!CS)Ii`S&q6+RII`5LuhHW4F!&5VexnSL={%e=`(v}2JPtvAqqa^hb*?$1i--e(h!wXh=Gi$on zrAyPh;S%~zLCB|{W%K-P5`2ux=InD>oqrjEj}sI&)%kp0Kxe_>g49nNySOam9FY%; zEgLYWfRs^LNWj>vmdhn%d7L(7kbH7TQ7(6W(ZMxIBJYhHmPlo9*mEC`mG&aPJ3$y z1jmjtPS63~723cqkl^vA>hkh0d-tzWM-YVpe6>oM#>SVhvlZ0FT1YCfNfB-lL{P6_ zaS;@3wAEJdDJ-mffcqS&g>=T>!Z)z%T_%@+5ONR5%I?hU`8TuY%*>tdXGixT0A!9I zjn9yePWY4Z;kOUQ2Hig3hGb-a`j75HsYiZxW8286j)cu0`{jMnOKdaXlM-O^=3d9o zwcVE$4-!u@!h8rAT`1)NwC(NfNwoM}{5Jkd&gdmq{F1M8_(Ix@{Cv)&KuA4ula~(F zSFV>plO=j()4osQO(5z|TOHm!qest>KFik88Tr`S^XMPBk2mk*JLLAh_?0%Hwa0gn zA93>y#17gE;S2wCKY(qKzMJs?pV|;$1EB=8*8v|)Jv_kg$XJ5Z1=z<{+9X4-|9Pek zUdfbaGsj{w`eQ?S>HAH842~YzPJQoE*Z4)Z?4}&O>)Ro1^zE4T$)PNrutWNy@4H-G+kCTwk&C6)g z{QCO+ee&_;NAvP+{PzE+Wlm}Q3We0+QiskeNvebii$;NFZkG+rNE+e&=! z5||5YE-x>YfoconOc0b0uq{K*yoa{yoe+Dgv+U|SUf0YdnoK4V5?jLrvjW4iRpRdM zt~ozHhrDjvPDv;p9v+&Nm6c{^XGhR(yI4s|*4NjY!^1-}(NMVYscllnzJ3Ot{<1LuiJcj5n)C-kmKw0#@&E zg_0ee%-V*7AU6xjpk336tvPIxM8|d*xDS8?Ay`MB2}~0x;u}J^I<>7VNmc~d(4}qV z5@136p1GY)nWLkl%%(y}W<$CWglAT{Q%3-_ySv+N^+Nae_v-Oeb?L6%juv`+d~D?( zjYe={TJS`4dwXjo4SGEtk(qDtC3@ip5X7NA$Dcd$)3tjEnE4u?f!w{ewpLc7(DUDe0qA??Cm?9JPft(Y z&CU?m%QhwUvtY3{1{Kl>ie5C}!TU%S&qc14_Y|ch>!j_U`SN$Z3qXa>c!48oF zNrdsQf4^JxP##)2dw3Uq-j4In>L~zIe8Cl>+hThpX@i0em76YaZf=4`ZqkEqYtz`M z|CM)=fj#ICuV-gx>@jn73ktc_9%B$47<-_Qham6MRmNbxk_iWW1WpYe*$}__p?en> z7rQVCo%b}W-c(CVS4Z*OlaYYaEWM-TrVCdUU;fAdxSM63GIxHX);IeuJT zWveqK?^Qsv|TN1iQmkl*axzit*s6b0~IiYSWY(Buga z1r-$qFF-{@2vv|M9H9V8hlCSpW(%A8@IIGcQM)R#L(s)Pu zwBY@B=gys(bMCz}yQ3|ge1Aqle*I(m^7C(#a{A4g*Z8MrXMa1`$j2orne2cjWB^Dp z*#Z!+U%v(@|C0s-hycsH(ZDz_DFX5C-MhsL=oyFwkZ0oak*)Xd-%kqfA8_QucEIn4 z4o0MorYZEu_RxF7jJB;;$G^brG-rQC4f46!od1M>&~@?>)T^y$+CT)3V`TN;sx z9QXo?Ot47G%a<=FKj0sMk*Ci)O*a4&(BWR!&<)@MumLZ;hk!3a12{RJ?FT;rNx&P> z_Tej7W&9oALH0_970pEVoQyx8fv;Zrz0N_XuIgmJV z0UheGx3|Y8fLkO15Zmd?%<)94Kf91dcm4WxpxUvPSsO0idTTo9N*ih$fJs}m3i;Ch zJg~qW5}}^-h7bZten=i5_WASYiTwfp06cQ!>)&+x@#9Br?tb2%t0U-PK?b~#| z5D@K)^k`!#LF#w+?%m0?Y@P0{RRB2YoQwzu8zi4P0l(}5Xg)eRLYNnuL?Vz2WEbFO z`(#l(%QzzHLnk7aQt~3(n>TObq1Wz!KLDS4>(ly$ev1SeLp+Zz*sr$K?wliKv_`#v z>5_yRmyiMAy8K{Z?2at}^5oMmMDf%Y@fO{1pRo+lNZmb0RK!>C)!DimL}D2q$$kI+ zea;Zi)&JrEah-Na)Ra?#-8Kon{)oULmvn&WB8%=-Uu1&4XAIWY$}!mAjOoS=L=I^% z_NtSLbg=2}n5F`MF*L6TX z>eQ6zUYn@r@Lo0oV3Lu&A#c3IN-OU@g>Hc}B+_+v?%bIaz#kA4F#^tje>TGAkc{Zx zHGT?DvZx3Ej!Xc>z#)58k4lCR1i+9DvR&;B+_?|vOO8B3qTPK(UQ`aj-Pz6oSy4aU za`&p60zmSRBaiAL0)+S?KJok`gxXm9rjG%WY#lh&zc~`f#)fa)xItz%uRRb){}&yi z;{f}m@S=N``+#bsL}BZk0YJL8C0Cgm$x|eP7CY3(ydASa`AE60`ieIAKE`sBvN zw&7jB2k=~1Xz=}xo>Jyr)_AO31ES+@bo{&|Wbf+q*Do)0k&S#@;$i~KL}g+#@d7Z7 zFgws-QU{E(Z784slxIDMXPMM;9*_l4{NFV^Z2*u7&UFF0Yxn0bC;#paE-Ao0k1%}EZH_qeA{<4MX%7Da0VgTSS;5<7QEsK3QN_EmEqiu$px(=BR(R}#uVcE`rYT8UYlV21EDRCe2t)Jx@BrAFZ zrV(G{DDttH(k79N$f#{%!;bnP`Pe+qx%8-5Z3y>lfgE$i)` z=sw3LsX&@I2#|THSL_MUuJvmy;&=!-iVhJn_p*VE9|82W-A9JVmValBT753M6fwy= zjgyFT)&~_OV@Iohu{k6i`6$O=vLi0!)$cQIlF)FBt#>Oqg_e%uMpm2dE)5 zCO@eU3F`xeJfggTyL#1Jm*em{zZCE1{R2vQMja0h4ou25*iHeg5UT(oV2;-m*lX=# zlLf{Imi%g|B0SXyTdpk$12T}*4A=Wf9plk%)VW*F$geJ0PZJ=?BM(6Eq9Yr09~l5Z zDLV1$Yi|()x%l7#b-%odW(0HCIf&0+UODqqT{k3C<7gKzaJCO zh|o$?OFNT?{t_7gf_cRe5OPV2q6_3y|0El-ns*}St}za{Pth++n|$!#K`Cb`V-{}f zFKiv5%il$VL`CQz@&UHqM>cDX>^7yn*qdX^URvZeHj(q5Z+(gJNs6Usv*omRYzAm`^BIHH&$wBR!JHzZeA=Q# znnJ32<0#vpLk=3GQB+$rlwBj%`cm%Mq9DT*BW*ty7`4LBZOnXnj_AZm{oGoV(KAX} zMoTID#suW+lzC98u(j31Cl%{0vKcGTi?%uu7Wt&CSf`+PAAJD$2oOSu92Sw1ycY?L-HC8m1dnL2DWDJuWmEJj3c(hTZP$oG zu&F$&mR)46Y0IfE`O;sthcy`L3MeA>>Yg37ybs6~iP7H@rF0D$$YN15*`(k(6ai(-_EW4vc9%G1c);NO9=|_=4dv2v) z=0w2S<+O#Fhgm=U4VmiHto6$;`Ws8lU-3hP{WTXW_6?pp=Z4C!70`{M^pEqFg0+>c zoUgfNN2DM5`~>K@&M_WG3qf0+VCUpadw!w^yqijh4U!Qufh1XUE(afA5*+~i)zdk3lxBd0 zs24Dq_on3gCqO;Y;RvL7uSr2qeYHLRdxHBC^)+d0G(fXUY!9)&qhA1 zJp#-uL4un7QL|KVTu?rt@T7>Wb9T|q7AMYj~ioBCqDocdz*LTuG~ zAyT2Zb$*4vtcS!fY`37yfsonF$DEv;%$%=Grg7tCIH{X6JScGHDl|rOU@rr~pCIWz z_RkP#S@Bu5g&9!ONejW+q zwD*J8E1{_R)OXKlqnkw_=f(}iko-qiY1@r;uDA~Mj zo;muWcvzoVH|B!ZGkB!Ex*31=mFO#U!5?z(1J6n{#!F~p4e2-DWc;|mNXT8?UQW=H zndK4~hiLVcgw^1{@EONm>>ieNFr(g3d8mrQD3@BllR~VLAC$cLU+eeupj%CX)6=u_ zPw$S_>(d`sSDV|i1r}J~7Cui_#ly)R{Bp9KJtCx(m}r)I;Sem7gd74iOFUuNOEZ>W zFRdz|d$Bz(eM;GDK{(2bH22FU@>n!;j!0szd!Y~NrA)mV=975sfZv2I_-T{>SO*CU zdHI(6#=}C;BE$;MVVN}!IJfYr<3pPWCAADrt|OSV>i5P}q0%AkSmb%Iv~A%A_sq-R z=%*e$$o+QV&#b7I%w9GEfxwLF$ubRaMVw;pd~e^TmZytQA~^4zy~pY1a- zjE!eOoAleGVQU@qXjbR3)ptBg#u*O|V*<|%r5s=943Www*01|g0$Oq$oa zHp!?PB+Pz|yrb;3&NyXNX8m9lz$Q}a>C)nE_FjtWSD(b*h>wg`?Ds0`lzr`Nf-~_3^8#MFCl0fmsTO7ceU%p@bEUwUkAg7lb7)P}|Lcv`M~K zs5sXD#&yty_XbT^3Tyce_nlFHmvPU>cRx7nK2LW^he6q1?z2z+o{JX+gja$m!564T zc-QhB=rOFbD=mZw@)+{I_#zaAu=c$#Jod}$_m8{&{`-9%dsjfdObW=0KNOIfZlYM! z|5GMUs!E5vdP(Fh1*DYsJS7|XNGZ8@4@j$B=l805L^^3z+qFF)VL$7zcK23M zsf(fF2gG|tNPIW+e2ipWd3tfHrb+RYqNa9YPwYuzXU21H@PhMotIst4)_lG8=d@qD zIsQu5sCA8xF=ZNI0NPT|_-&?j9}Wjxjrg#@m+b~Uxw34R_c88-tgpagnM^*s9COq4 zMD{)rx$y+#Xmxzp?_a*ImLHjb{5fF(8H{Bl^1&d-RW=}L)&k%_rSvdH%RB6RP9Ra*nn;*NFn(_S1S zkG%QzF79Z0h#^R#bf=GW#k>z6~~wBkMCciTXk;oZ6xKj=G|4lCAf4= z%WT?b&TiASU`s4*Fc!i z18rm~gGqM{6M*J^`gd1H$8?|%c*3g^rj&>(k?#3JZi7h^VZ}?7kgky55g|wO2>S{X zbTA{6ZjeQUB5X2z0x=+Jl9A{~@IWA=L5oa;oejQ$$xaeS(z!AFL(7B10ap9q&`|v( zTyWF{&kbRC$s;T-+&S#e{ws6^+%s@z6xV0lk_cyn;D#rI|C872qudZvvYu}i{a8#s zh{y=93HnRgEaXp33yX(W2^0FloC++}g|Tdy$W|7^SWM_X&o{=P`L1r$Fp}oWISieM zu%qLQ2?(snM7@Gpw>01D7U4A+Koj1xEJM#xle(tsu~~lgSa>})n~e;v(z3i+U**hY zwbuw(3=6MFImsyV;3#0Sr|lO1L2_LsDI}aJ^j+q1kzGSDC&O<+8@l$>^Q$sO*iN`H zw%ctCCYacguH|GhpQ_XAir1akcdjd1CnS+@i|C}1tzBn)f4J+lX~+xL2~n?97g(rG zWVh%S_&At20;0Y#ApxfDmV3v!d69Ou9_Us=>*by)8S#N$hwd{NhSw)}a2VLbucNx4 zav5auyK8sP27YZrrYy$U&~|w&3S-91rysCs7XJu zZ`w7L$?1~GOQCucdJkzM{1Vi!a44{vpKdaS>`#QTP zv%1;bb!r<&zS9M-2RTIF{<3%PERifx9KieThuBSaVHcL&H4rsWG#3LAOhpkDHS~pG z{X6q@3lIq)sa91!J{3&>iMUBAE_R9)pLWOk`EB=t{7MKwCg?Nt8ShU1gQeUmzNj8 zhkt7GZ)Qk6@z#{h9mQi>@!kLC7@?%NW)yco${rV~#o!f$goR+Gyu7!|D3>z4{h>P` zQDHp~dRH)*7nSGxPgQ|Og@UTul1pRzqah8cPinKJ*v&1d765GC*pYFA%+Airh??Bf zb@TJ{0v7Dgn8bY#U}6Ib-+T-JLoTYxvaElp`bBU`GbiwCk1W`cw{a913%^of~Yxj+l_z zhwbf193LNN)6>&f(o=gwFiOkhV=u=#tUYu=;)n*`fyv3qY=3`W`B=JZvxBd8Z(Iw| zAo-$eI|f*Xv4`Vl0OCoIL~d69D$TKrD$sew+uGC-ZPjn10_l7EI^BR@Ys&q92*TR~1wPhE@K25UdoYUPw>!1*yB z;aAwUWx2H(t2mq6)#6_m&b5OrwNL*xHa2p^Jxtg;c?u^)RY&-ZpY0MIw>Wv#BRsylo^y}7<| zZs?OXYZKpCSXeMG1VJD_!v60&`lmbnGk95d4 zWzW;=_VzXliT3haznMGSSC;XQAd{W>ruMJ_;iKjjdd3RAw6v7<^z%ub#Bm7R>a5OZlHXv}SPwk|I(-DmDH z-=zE2*4DD;=jUi+u5a@@z0v2<(NWATF`tI5jkCCq7z4;#>CjknM6_trQf?Y!h3*7< z5;&OL9hVb~5ISZL{nYM*gM(McwDkAnCz;Xt20jSPu^m zv)XV+uch{K(qd+byK|@r8+r2^p@G zef<9YJMaY%B*L(7-@d5_0ip#YUpy_k&af-j!jG3kJAeNCY4KNX+KKu4^{aLR1%SNk z-S7H*@dE|~Kgt^!8Ij>FX6yt+0FnSj9gY$uuuPmumdSTcA6vXdcX@d^jsaL`<6c1$ zJplKm!JhN?^b70)2tEUmzkdD7`uqE{!NI`<@Ccxcja~b_NB;p|J0F6WXg|6u*ahk9 z>jNx&#=b2xuPy2mjFe_AfzhU>COYCbf>q_@{Q*b`U(y$WT>J*G^9jONySuyTitXtk zfiY5K+rGZOPChj}Jj}nnfH6B0jx4c%`u+Fs-$0!{34GZs`D0sKTMG0Dpz3}$8ygz~ zGy$VHwgLba?IB>GdmvMt`mSttpaVe7wT{-<0puTk*KcJ5sQh1GEATV6-UYzuPOwL? zbMs~GHzox#cJ1_ou#2_|%IK4y1E~ClZU9H)*)t}DUI0shpfSa-=uQwGZ8Oe{cR_nd z*aSFtG_A92$rYUznx%wfi?z=@8_h(`f#bB8fW*K9zy z5(4HcIxxSP3)tB>P$xST=PTD~U+qpt?TZ-4>?%m*2Xrax&lawsmyV7Oa|508T>(cP zv;pE0Bl>PWFju?Rj)yj2z$f};9MC`CK(I#a|3Usu{-19}X`+id7x!loJuw-}c^W-yNJAP@zW~k6&CMq3^qH)$uLF^3u{t|D1Hu793%NzwB4wcgdIcB> zu(Y(a1SkY9fsuT%m%SG(5cd!PLmUN>?Glh!hyhq&$^tF}22{v)TAVB}z#z~BSZc4u zRfZBE`~3Mcup(fxSmr?iFerP5TrvBXy}LJxCI`Yee%ytCiH$=nmjDiNU}6vsX%Gdu z++O{R|CLbbMeMt9IHM|Rftk@qcT0Mn?$+!8Jo5TJJUjpyyl?6Uc-2cT#$dDOU2C%= z3xEL7M}ByE0R@+}0mLp-5Y#oN3;<)sq5v3x6FJzxflnX|n2^5?zylHU#){YhAr*B4 z$kI*J!PEKn_J+W??Eip;PaaYFL3BJr=fDr5Wz6)UZMoU*N1|-}%M=m73wQ)%Maqx? zVA#0JNvCJ+0Q}k}|2c(>3=lJ(ScNSiOzez)0bp`qBf!S>^)*1JU0z%Fc#KR$%-Cqr zEI@|0xi6R;qjf-;agrZs-o-0yz~Ab^~X0Yvg}55ln2 zheFrtrc-iZ(+D-P1FWf=Ek8a!cBX?Z0+r-%PLZjo&!8jwypo^46xNV==L+Y4MX>$p&Cw6*_r&dEwdDroJIq?+62;VT{%XvNdPP;Pv%YJMY#j z^T(RTslZOniRLWZBJb8BZF!Cy%?BhvA2@tOK-pG~9&<c7I`5Y<0*EQ5^G>%^1IW$jAC9DoYo} zuC0#>#}4_nA0V3kXT0VHSt1tf(m2c;e_NOJ+gvk$^_Lv=MKqI4exjU0sGoeD?)scZ z=~V0M+ek^zT>i4C)0aj-_Ji0T4&T(fk7y*IJuy0c(3c`0r>m-x0WZ(_RFEfRfUZSS5D=hLAM1N5eMkh4sN!$L5GiI?o&k)JKB+^% zD9{1yNTcC_M=sJGV5%f*_M*;8{nZ{DBX2+!@D)YKE|IA0A0T6gWX9$I*XGZ{W&q3& zZH7L&PR@X2_7ALgtrtNcT@_^8eRNX$Kwxis+Ldf4otdxn=Ko}YaL`BB$)3(!SIF91 zqRbmVB21BkfHz`TLDZ2`P6c)>dVrLyQguW{5OE~p{{H@t=jUhhuez-vY@=s6Na#sF zrNIHP-3zn=>h=4b?%5QZM>MS!Qhf9|IVhuDmpat?Gp|?LmIkD#%laZ>q7OiHYbi3p zHt04Rlv1Wm#M4|8O|UK@TB3)>iEJ0mP3Ptm^6Xjbt+kjP>kobSKUw({@#N%)Ak!xs zM<^oi?&E|)F7!`-rFn^XunD^6C_<#IHP$5&le@b+WL0Fx*yv+UKbz%m9Ash5L3Z_l zE=#4*wN2@tw(yx-=!8qb{WgM5kJ0I=mn+gxXm zI@i_st7`;wzas$GKq$ZK>LH83a%8NrCeOLe`H-eMx@Xl#V{2SMCNNCiz){{rI*lmu znj%EfS%3p+H@nver>EMdBQ}EY05GK?%@G}TW9)$TICgr<%MR!vm?9xSCa{mt08r9e zv`GfZWN8PpZUHA_L~;N{#D%xLaTa}005MVuJ)B82UpW5fEiL zCpilcug05$fE>>(p3jS3UH*>HWm}B{2}6pdT=9e>2vWEL=c_j~dCt8e2O_~M4s1Xk`Ds2rRL_WxY-RY~SfcY>V$S&PUy=;ff^h>?! z^txrTMo>i1+|!z6Ol%(5PrpTm^iMn1BZPz_0SPdlMZDCf7#nhg^q4!+!|3aymw`lV z=m)t(qBuIN!y=(Y2oX4QO~3tkMufV#!>07BvqH$w7;*mp%W30`-@kxqbxdOWMS}a6 zL2ZSx$#D8o0&=?GzDXF<=jPsvLq0`7d|n-|#X8DS&MYm?7XBpw2o%k49SNk^q+Pec z@%#hwHYwiC3V^#R<6&k1w;Xio0f7q}jMNoC1$d|ryok91mMuzP zP2D_-yq~<4o)36<*7#R%98nRE$jq#}Qh{a=%44gK zJp70eAWhckhzB-rDX5{s)XA6-ei5E@kh$?fT5)O-{&K_nV)y-HS9hnC`GY z;0XLi1bh~`Fi{Df|K*-#E_7aw9z`9Klm40)#%j#$o-MeSPS}d{EzSd} zXVU7dLkLKAT~sxvRQ6A1>}a$rx>i@t0co~mXp8xN@F+*Qtk|HXIrRGo1k35plV}5! zl4GN_VMvj1MnT$(w>a6Lq<;W1Z3-P&9zCc)m@^;%9H0km0Z}$NDH?!-O;>t`x_P`y zV`)=zK#><*`ik@^n~x3Gh7I6$zs(qsSd>yoq$;S#^EPtzMzWBTey{(fVi-R;I9I^) zX*@P$=Pum0l=Zv;2Ld8?Hc!QYRA~i(7qAUDYma=?BcGjo6)6wE0`DJCCj||7cAdQF z0I+ghAITb!Fa{o1UQX@tYD)J2Adu2@4iu4*vlGA>a!_d;*-Cv%{^W|#>A&;{`UFno z%1d?A{``th_W(&i8?UE2ocjU16fz+v;1&o4czI3%GS>pX^bi3`cl0^fcWndWY>Ewt z0s(mCx+7`GrXRAC{|{t398BIw*{Dl^)|^?{47o^I8ufuZ@sb12fIPxiY8OxNXgi2u zV=@kaR$e|G={GXKlMlSRzO+Gv-?#(1>@Je4f95gp%hrqy*ev}k5Swi{KZFpHnLAWNRyef&6yJ-?NqR9{S+*w>I#s`()$#*xKTJN_G1jzvR=i-k!#mjfaes^fD0_ zq{93%9z@@K=2WS^bjV(NeYt2A@GK%YuUBKL*z&tG=o;DOWH7hrQD4cWbS(2<3YN81 zzx18%=>^F|BD87E1-OCl4&Yn!IwR*<5g7Bu+AUqnT&J@Df6*HH69qEYj8TLuCqeU{ z?P}LtEBe}56Xa5RA~*U^*XFAFq|(lMCi5bf=7RG~2(R_cdZ8Gf_Q(_=6>&i**`N83 z=t!@lb8D0Nsow13C(1v+#_FdFF!REZzq@`uw*Thu0lEBJ5+e=!bgF$?SA=o;+bsR7 z`?ktHQm~G4l(Qorc~F5V-XcH?aJ3%Dqnprx7$5RG5|bmf`Mh;y$&TCI{-L(fh+n>zIk!|ZiB8MGJs^BX&}gE%F~Y| z0^<5Y&f3(6$O>5jA^Hcj>q8#mzyD?L?semaVK{)hxurLBX%H0Xl0Hygp-|ojF~LaA`{DF7(3Z7LhkO5Ucxg_ zEZvy$-RE!B9l$TL3ysZxRkWWT<2_@GQK&wteGr@k=XlHz&XO29f=+GBewxq$7*1pz zeYKpVClBp#PTum#f-z|JJNMdSfj?9F&02H7(Wf7wLm$JRt`3S&M)r)tJdf^M-oofs zh9RyGr!R1B0@**sNs5j#l=YqTH#FgQ>IyC431gA|_jC#PiWNDhZ+Ui{8_NNWTj`r* zhG+PccA`lcd}OTa=VX^UCi=#p=jd=yr(gL~-h@OViSYVE{#lXniX+t>uZ(v+z++<$ zBb)O>C$x#ax{o8O-J*YVLL`dLMOGX#5kYj&UA#_&1ifh|{n8KVC;eya(?xaAagGW+ z(8smIcn}$LCX!DE#(L#MUC@rtKpD=t{w-3-0p^q?j~t|+l{4qThI=}PR-bOh=X}nb z{^(Q2dHE*2IDR6*z?exU`HR1ZPwI00DsVmx7w&Uj;<%iP`~p`(U4DH8BG>g7sT{ra zU@6z&rM=@SWpdu6J)HE=lsSyvwou%=`yao)j>>vF&M=(@c{}W|!vKDd#>?^WX835i zlmYuPhyzjM`?$=Md4YJ5F-(Qex2?a%7v;*lI)8mV>)W-y4Z#<*6|gO@wxMM`&C%uR zo-OlB`IN9;KiAxoYld*X5G6Iy5Poi|(_k}w+kRYPWanQpTi1ChA4HHuUPMqia`xbu zm|*a8W*6vvsRt{^p!H+-<#ZMDA+yhd0VOP%UU_-9!o&HV37d)p+%lUZ;)_LCp zvcnD+K$Zox=Yj5*qk;qQ6I{0}2+k~>SzIZ|eGLTP)(=|zZ2922(5F8~@*FdpnY+s@ z=ISYV3yOBNd~0cMpVQB;>j~Yxyq9G5lALnAL?$h*74PQg32v@0R63Vg?Y3;vT4!o` zO!0-zEYd+R^So}o(w62WeW#_vEWYJXeiA5ZS^PD-+b++p#;UpY6#CZhYhda4GY6JJ znLy3G&3!BSY?lwYcaA3_rIwJ2ppcPkA9vt`_C`$udhGt5s)2r z7>57solS1rFc5_+cI6AS%bu)vvhU?X^a9PQ+nVu*-~q$~!!d0s`T-w6C?Z9AW~fLc zN1WI4fD8-_46FcKl^-8XZyANRgFZW4e=X?&Ih{`F?d|WMUq65RzJJp8@9yclk#EU8 z8vk`vJ4Kq5Z*_eVlP!VxSm0G6@iaSYV>~OG>_`ep3;o>pfCMwJTzEk4DIe>Cnz9E2pl@QYc^2qy^Bm??GiNqxU=ZwPZfzYWx@3w!H5TX>(*;#unRsrl*v4)kj-J z`mo(3stAKIo%c^39IbYuI(7_xbKWq#v7j-s&7`a>Bs9@^E@kOqXdgs`0|QUPUz|i} z5rg$B5V;oZ%`9X5@+D-YLYJZoGRzDkPh4bGmvEiv;@{qHeqa~b967ze&~*(E+LU|c zD8RO^ANHLaBL5>iFa3Qq@a!_ZT9Xf=({08U$m4sah+M^SV0q+kH+`kk+UuMGZjWFA zJ{W8Fg#2|+h_KKEBnKXet~LTUQO&?PkOhP!ESg=W@6+&r3=BN^tuK*j-~!MfmzeP) zp`x7R;98aOx0fltJTctQ=W|&ns_SLqARvq@d8F#KBn`MA;<{e1oDxcsh%Tz*^_rXC zT_@xq-0bCYfzN`!iM!8WrJRKH>gY0vcYr7~a9q$n*AhL4*#2rqM_o%)9qbh7YKZ0P z>NnXOeiqgB5Tu0v)S#bx4{ia%2m^EvY!>KH??b;=^jmPhKx`J+%-d0UP}Z%3%3X)3 zE#>q7%>ANsI3LiFYpXT_opOrjgV4ByoMltF>re7_%haQLWK*Tq2KHY4h|mT9OnFaw zT@CgLEe%J-OSa(Xy1TrFTKgg=BxJGj3FoVj!ohuBeNJ!ov$8EBlkzluRup(Ss`*Mj zX6}t_8-11Jb(i*l++4|^jvakM5%20(UaLHykT)ViW|?_-Kn4b$aM7ofi096Wi5IB` z77P+q?o8+0zh?Ib-hdjaR&LscPCFPuYPR-_y@Q~6Cn+DYqGmN zN;zvQ`|wRrMyz^x2;dDMralv&&t!Ylc9KCXzLYU|kT(Rb26#S@!$VXu;D^UStKAJb z46$6~J*<=Lg@;kgy0b> z?@6yKuN@(E;p)I9Puqf{>+bRb)3Me*&t0Ae%7@ew;zxL&0y|Wn)4SQXvlZ|OR%5So z?jR?el)A_7F(%pwWLeY$l3dZKjtuEW4cmynQJehuus0+Rx8lG+2lVoUJsJ`yNW8QH z4e=NxPY_D6GE5nhlJbQJ$ro|_8R)Zutup@&NVFjA607+Ax8B*imz2hWFbcrw^*C`0 zu0jz94irZs;sOL6iW6}lB8Z3sABajIfj~BpW%NSQ{arXkalJ{*z*!0!+xz(Ie^u3~ zhxh!oLW{HtAyxs>DZq?RK_adKP!0Sc6hp2?U#pDjX$4e?tIf@hweQHsKy4?3KiXgnp%wt? zUP#+gFwtZF<&QQPyuH1R-wSBstI1^IpIwK!-_xh3T_bw&b)FR?ezB@9X8*ry?{liP zO(s2J!>95Fd04xS5;O7@a^!;RR%gY956MXVk#7PiX5JC&N^bp=e7cgW9=^;()^&L& z$K-xZs25wKqxc{nL=f1{Z8GUdpLYHtGL*mW(YXefK&txl-b`>$hSh6&YJUjs+C{wC zM^-)YMckM6%$Mvm*+ZbH#222Ui^;8LDqr*c%(m@k@>?EmY;4G9`QSR6)hqYe;rG1H z4)2K{A7zmvvc*5`Pu=X3bL^5^VxM?qa!m&EJN4lfay>Sx-)lYcV6_pE)wh_0=Dtuga<{zx!eE{`&ed&|oIF z;s-D^EY43)PgdJ~4<73*fL#VqU;rET#l;2UDvZVeQ|ADMIa?iyIxrtQ5<>p^`Z{*v zvODqd@zF5r4h91Z%)q@t)gVYW1G^(n^fh=kdTniO^{%h4G5*#^AIR+FJ^%{n?K}K; zcX!ATqaWaGS3|vyjv0989zRJ5`!Wz7fNBC{SLFEk7%%}Y3OH~~!*$13_yc%J@!fr_ z-zF3L`}@7i%S(*MY$(j_R%QGBemx-qSm^H9NWeAFAU>Fl!ww9vcCL5>9KaScK3^zG;e}CV}&tej` zv$Nyan>+zRfNyVaO|Ff{v$Het0MO-(_SWq7tgWp%HfnVr3wi0=FzIh@ZdxeN#=Rr|>%I%izP_Yw zUtxZKe0=OFqtS?beWEyHEvHXm5T`HsY}Ed>L3*=?3^{Xib5o8piLv&AIsNnV)AQn` zU9nYL5M%z+?)ZzW(pQPs$;nA<7e~iT(-$BQq?h(8&-4ZIkMGJv*{+EE)eq?#^y`X= zi`X3<9my5_wKiwswwi?e^mx&927b-8f9&1Asufoh2JoB<76H*Ng++=yfCdC5jfGl> zjg^H6T1BiaMXNxXfG;3Ef>?w|I_o?@(gkCgq{^Sl=slU=3E!~T>^pOge=Zni!Eo<6 zGiUF$*WP>f_pP<|Oow31Vdkmr3v*?VIb9-$ML^bX_kxmYl>W~8t(h2^*JX9!_p4VIz$lNtlnFW@UdN9g2V6G`_N`mD4kT}W5A@Mf-DxWUiY(ls z7!F|4%NL3E(3c*MA3xR}ARz=OFaJW&kUu~p#AXDLH*ekqG{>k9J%CJr3y_Ea`1*>i z=m?x?d%VPvkPPPmSJwhkKqN6H2vP zD--zgTci`v@+M{gEp~nO>={zTKI#|!L8`idD7qT2h^q8BV+2WNuSbs_sY~DTVvBwt z5TiYu2T+X{fDkDL@O=j4T#wWMdpy|s6`0dU$T09{9vMFXtFoQbPVLaA#yTQq4)p{G z1+>*cA9GOuhTLj9LSyUzncAhVw85M>efl&IZ$3zaG|v&dG3ul}$el8^#T&2@2>s)? zKrY+!_?xrFMZ57F@i8a;kBIn;B;CDxmyX6iyXZ$?cqEx@t8BWvZ;%>&GUtt1=gk%E zH=mI%^%y_qEb$%Pja}fLCm*3OJ`iz}&mok-qxMTs3|<0n7!a~<+RH|^9XQd2n}=!UHO&OOBZ;b2fc5}<5- zW!{(@AsWUFU$9I zLE7oM$d>Oi5YZE9P@)u1pFRbacu*~%W3GD@z>xp~Kq*jSVFlpgnRksckN|*SN&p>z zS=0bH24)c>dIR6|pclI!2!N{ZfD;QlV&Xgy9byNpun90n05qfm;9^$?paE3z?6N;m zAJCv|pbrRVcK{cFq=ReqlkWi58vO{lNP3rR>BSyZ*p28bqz!;0Qh5*%9#x`G*~d8Q z34+^>Ib-V5rAuQwfgzCx!ZXVz04DwQb-q97oiAt4o&~l>4>drK@al7YMc69j6v!oP zCFKp6W(Oq3SW$*ILhBFha!$KL9NAyA00BTOjUz-`AI46+&*}%r%>}=2Mcd5>WCkH7 z=gys@7kh2=IDh`Uhb%Y+)N>x_x9&p>^4URvNRc_?EOQ%~F()}4$kg1ff0Oc){zNK~ zFThwo0IfhSyAyLmbPP#$z9+_=`9aJr;NC&l-?&!}5h(@ol}C^#pdJA-cD2Vn0*Of3 z$f)_Kefn7cAp5=hhIZA+DbfwZ6ZfUwSdQI|RV2)uP$qkeXchScA4Oe^4MYm5Kr#^yZONF{wowm96=_-S4emEc7hC$Q4=-Q7?6=OvabTRq zab!NT=kj>oc}eosEdJi+U3WRZ?R)m>xweemiO25QQG4&Gz&6ipy>%p|e|~T3eEx2k zDz@J#U`fGRWRZ9Hh+7L&3+l3P#$yf)TWEnji=hQ?N}P|^v*zFDcRYaroW+s%k@pXf z%e56CsMo>>{PRZ2VFuW0JKA~zu7E`zUyHUym4}kIH2Lbl=$ypk%KK=)1F#hk!FD1r zz>d8azyi-D9Yj6=TwZN}0GL8{)NAnvaQr?t0iKi@agFo9kVp~Gz?%#FvMpQ0ORcRy zm+z$3xR$3JfoS>`A>s|z9=4%>-Pj5YwkcIP4-m0I1!4hK+de8--ysYY{ACOR!P||~O|55>6+uAr%_YTB+UdL~J*nqLuDYsp*exLOLLMY+DNyp?53XR5$Wj0hVChKESmSek6yjs`@VJF_&(>g!8IXj`bIzb z+|C8MOgWum=loyC1UniN|H~J<9)|3##y*%%gK7!IJZ4_)fSLVO&i<~%qmSR`Wp?G< z{;i5F@Sp#E`+fV8!qzxjvcni)-8Y7d_LdZ^MHYE837DyX!h+Pj&YlG#4Fp&YCPB!NsYczpUi$PoA`57y zPEnKqakdJf0!T#{q_G6_Aw0$t;vgjm8Dc~IiX>dW5IYac6xKW)vJ*$uWR>V|9i1dhOYh!h%&i3ho$di;lghcu7o%*yo4cdKh z#)v+Njg3*?kq{$oFjvg?-h8YZ;Mr%9g8=Wkz6WGINfP>mV!wN?{-$3>y=K2x*RH{d zHf!mvA|P+`h}^mNcg&SD%i8A8JL;rZsQ4m_>_#@)NQZ?Sn3tXrk2BA2_q`q#FM!!b zTB#dS3V<s0Aqm$E&*D?lN=AZd}L`$7FKCUA|^ngNAyZl zsUAEa-gN;PzzG2^fkwJK=qX?R}d&=@ZOK@wg=$q z)vHq4c(kPt*-+Y!0U*+*a0DcJ*@$1gz2g&xNR3Jmgi#a;xk85I$&2o=(G>AOBJ&h1 z;~@2AtR-~`3Dx)do97zH1f*+pETW9|J7kUS+77G(f>Mv_hFt9->?!R`kCA2S5Hqm+B1~zrO>gh z{znXyCFM-{Azj+gD=Xg_r?n474C^@3=ZIejow}qtiDpW9lQ!f50_vd~+hq(Rf5xbO zO8Z3Wq?&c_UFH(oWxR`EweMS@YivQ+i2ITGWG@xn+}EVs(Jk|sj#ZG#)R#Jq(Hhmu zJTc!Bxpc1(d5a#z_}0hnm+Y5&n>yWZjBja<`j+0tl?WbtsMmO_w#a_BL9{2N=Yxxg z9G0%$1JZdDdij4IGw<*s!Tm{0-LL<>Bob{)NmmmUPBNs4e6qb=H^H>!^fuW{ea>4Z z_g2e`2p3soQW`H>jY`;;fmi^Zz{jamr-0$=ofc_GnvI2?cNahghHVa&PSW*k0^jzM z#1owqjnoYQ0d~r^=mDj`6VN7o$!`Lj08i;g$d8TP7GgvKfkJ?O9Do(?Ab<<3TBHL8 z5SZv-@u#!j=4neJ7l?|DpLA^7;{VtJ=wYvjD1)*9S$07Tcw4_47XLqnMO%bKq=a}O z9H1v38~^~&?EOgUm#6dCI7$x@6rcsb&@T3J-tURuBN+fGag8V1M1MKvz^;wD4iO2F zj-IzyM23yN8f^c?kapwxkWl4m-^Xm&*`Uj&`U)7PtG0Ub50KrCHS+1;b=7Xf$UYjR z5KxQPH4!GD8gSG%K)F8CK4UXp|2E~wSkgZ=)yFunUjR5p4%PF+peN9!{4a<8Q3pZ9 zfK%SJJ{G$lC(3x)b;ubp<_!x)qF5+iL|k~ zxt)IeWN0JMN@rp&nFDka zjs%~ja3<}G4mCaA2H?b>n1DGcoge)85bmK_j zpr8+1i00MtOY|WdMEr&WA+|yW**gyc5p_j!vJc4pBDRyBQzCKh9rVuq08yvw2e&6=)b%~;yxxr6RWNEVlW0HLJo(?T>(+^0 zx!v>gWjNY5p}*Ii4k}wU$6kA|qXV&N4ztYYbQp#1_WnXBM!3T&Xq7f2xQ?t=VxSI> z4yV>|oE&aOpW8qA;@97Q`Rkw8>)-zT z`}J_Fmt#4W< zW&1oF%6E)q*LrIGJ_=Kh=g9yb){*Gw8j`wvZm!Ms{c_Wuem!Yt+ZKA}|K2r@)@E(} zvu%vtY#SNC-$c7!N0(A|U$@9hWw-WEyC(FSDL3|sj;SY7>{x90FMHS1Vl@!MCwVA> z2)YMRL=Z1}5WoKy@g}nCN$*~KZYOqZ0^w&~W1&?R^IJk^nrV_rCw-aipHX>gJNOIa zgMDXbAB<(N_11K!eo$mS8?xYBD3bAOc3IuZ(_Ds_iF`52evD{6jHy3~=V*-Cv3YFk z7VJXZP!40njX~87`U2b6>X%{=;`i2kkNvYgto23Zp!~D-`r{BqSs%(UXR>V zbJX`Uz0=(F?M!bpr+uyTN^{<6)iZ5v)RC9U^VU@`7_0X%x1R zCib6XS7)My@19v6e=`2MH0HtAMZuUt*`||-n@Bggz^6vElm|}CL#DHd)TYG-HEPtg z?ZRu;-pL*HF1v>XH;TQnlx5zKh-uZMX)1qe})CG2_z)U`l4ddnK$IG*GuH(harUpLL zwo~uGv*TPp3C6D;=g*tSpx&5Iqc+BD5;H?4^vTDkXkWy|i93D(SNX^O4qK)^8P9Y< zY)_4tLpw#9_anxZ`6u#o9$S$wP=>EFYn%a(2os7Ou3f=3Q6%$4Y1um zV*ltE*mF6?{55JohJDO-eRplqHun5G`R=XxROmSQ)L32av_Ounls=*b$6@Zxus_I^ z6>+^M?|$s{2v+`?E-Pog#X9WIb>cSHPm!G7JCALvuV57lA(*Ls`+mMtx5+N=$B(W2yynN<9yPYML(Z+;rR&13kXEaQ{ok;!BOU^> z`5;|-iM(%+)K_w7Nsdc{Adw-5OhCNg9VQ{{_GcYs+oFsO`aOu6NL@+_h2Qby>Z%nA zg+ifF_)CzLWFEH3K?HjKmgy+p0cGT_|K= z=AxpaqN1XrfDXC&K_Zx^26-*x{*_lA2-RfydA>|Wp1&VA0g0WnebRt3a(&{;yyZK? zmnSJiH3uma3WY+UP$>KxST@g;ENKDdxQ@p`9U&X^(e^n&4&K?1EisD0Nx4Jvm)nt_ zJA~>HtU{qsC=?2XLW1KLBD|DCbGGnya>qhecogQ=+gCUjkg@LsBNnIt_?=0`Bhzv2l;-$IJMLx zRcNt#mM+C`wnPR50002%iu`U%L#>X+j72?;ilHVlOH4qbA-G5h)voD5k%O+|Mb4ST z2LJ#7Ru|)T#YL%z<_(tA`shzDIM-t7H6Y&9rU#>J*Ap0hJwEzAa|9de0RRACWwT1? zAJ0no{4D;#AL6kp7Yo-H*`GR@q8F<~&mvBUwH+=dGnD-R006-MqAV&IDW#B) zTj_i7nD-M2fGlD(Ez4MX8{Yb$)cJ)9=23YhE9u4PI{l=xG}IFU006+ceD<=E0rB!) zxo8tf0=XbPy%Qs;r4OrZ!`qO#khMW(Ka`B4+Et8{5}6PH0068{-!prqPZp12Ra7%4 zd1`BYFJkhu=o%0=LG%p~$7^RXATr)GyNsL-00013ON@7@joazE+LBkqDf`5{zlgEc zE?7F#AZJp#EkrRwy-isCy-XR9a8E1>0RRBNYTW(`y}Ur&AJ-m{ipKl%sKm(D&X+1g z=(1g>XhHbG}d#zUeIA@C0( zEaz;euCu4Z!5$wUhvVVlf#XJwx6k~^4u@y!y3R7|>9B&Fv-N#%=kulGJRIZedV6`U z#}IAB>oQjT`#=4CW#7IZj;s7G=7=$#8q@mw($_^?ab5JSy_TPGJ#I0k3(FQZ|0lV4 z%t{cuWQq3Dl3Vd^O}J8(L@)Zgh@pDBXyx9G2 zYhS{KDFe zT(m_)c4O!x+Ql_V_tz5;t)V)(H|%(&f3W(*Wjahe@8%RG1U~0@JX(ruKfZsn-EL>V ztK;cpKY#tUQ_jPUk24AR!`>C}xCuhx542)Coo8E{ZMXmb`?@9`DixNH8zC$ma>{ng z@g*;$U|)F@l#lm>ggE3w6OUO4G}QrzvcxXWkzlot5P0DOZu|uWE0O298IL|vHw+wA z$x!WUuws|S@hgP5gO4MA^gZS*2V)G-q;F#ox@f_F>4AZUu=t6BTA-i2<-qcFAz0yO zZ%`-SI2!_p0P!)qfW~+8r3t}OiG?I2EQJsPL`pngIzv8`vPJ#h0&J>BD)kQA#njEz zHQfH+Z@496_|}~;i%Cyp5)xuSdp+&~-!Er8)isKpo+KxE6-ucdi^r!1Uyd!NVZeQ! z7kNGg&T(lzqib92O9o2myS4LgOHu65)D@n)Gl-lqjuQytfl~T_2&|hk`}O$AM~v-w zDb|DdJRkvQfJmoI8XaC&k)M>9KNm_RexH!AEGBpy26Sx$LWpt66JiSq5wr4UrEa;M z7hix)^-w|{wTol#Y6;L~)y=gzM2CB`RZ6e49_t#M^A8!akq{R;E`OTv^?X8>Wg&gc zCDB`X8)E2n^}qGInuuK51|#Q?QvT^$J!VgJg-?fr{`?Q>9;@wiYV2RBGs`mF|K|Io z`{S1Q^+a^uQzo$CKLMTiJQ;zzUzswW9#2^u0usv593xHYIsV;T>uD(I-#NgJuS@(R zAz|smKc^I|D9mJcCCrMQohqf^5|7xpUavZ|Y)kZgkK65r2Qc<-gdkl?DcfeVfxs5O zzb{J=D9m$uDLn!B$=QqPdAdy;}Qsjq)(q;kTy-))Jd10kkU%9*3Lo{ADxvT z*a(6kcD^bLQAEWDHZ~S_vOAYOT!v-II%9Uq{a}&VnK?6a+6uepi24`+0{1zITrKhg^~cML3&e~l82dgtwnxG7=lV+L*sep)ZwZ9^{}A(whBgTj za&4OA`=%Y7l*WCW&?8gmo(0@EPQ=^ zq0wlF`-&Dkiuao+Yqc5@i3Ei`>4}(>N+rx@GxvQ@x$13Vj1hsLvLu#30Ho9R_jh!= zT?%J18RT*~ktPVv&I}ll2rTOxAwp=hXww*UX_~5wWH<4kKDXIyu-onE`KSB=$8WoMV)Zy{|qlxAb`FFlTvhI ziJVdwNtlNR5rzn%25#HnBES(8g+c+(&(9c-$7E5eR4RCUd_=F;6N7v{pGP{K_AaJX z7a-o(ya?X>wrvv;pvlq`@6IomFD6Q{$X_fL-n@cVgl4npYiW1?dLa5-zu(9G{XK4PZynimeSUtT)oRIP%Hl+36x zahgESp(s-a!~)jllA|KT4v6CJ$1ypOI zBBF*M2qIdF8mm=A9CXvsMK>o!aB$JdT~S9tK?NsqP&ZvvTpV0P{SWlVcX%BxkM!oR z*Y?hGk@wDd_dY%6e&0FgJvIGeTiH+h-eGnHpKA+E72eP}n3)`EB3tCA802uwm zu!k(I%+zc2zSS*mGRoBMHPESwe9K5v(bFmIA+Hd!;#d=w; zmbBV3Q;o`=!{MNOK2O8pkox^Tg~MTbeSJmzQGu_nB~%sh*LuBwXwkKz6afdHXE+*1-Po9uyP zBL1pz7RN3BJz6HR$L>g%&N|Gj!N_KlT01{$<G%H?wEA5DQo za7)qa!*#KBhz>f$9dYX@f{s64^bs z+s$oRx3{;PrSo0UTKVz^K@>>mRmQD%)h|#h2lme!rgzg#t(j`_I+Y75haxou>Eq zcaU=duSj-)l)w)gjRt%~{BIq>d3boBySqE~zgR5BRoq^$Cx99@5WC=~AS+0G7~mQs zvht|LAZDR@0^klkHN!8qkld(Nt6Z_&o`kFk?bcT;1@x=cV6>7U4!2q@%49P5j3kjt z=n!Z5K9ou&kPfcOj7B4T7l`+~_HMT;JO(lrJ@Z2(x{DK5hg+RK9R$?KDAC(^h-#)ByVqT5?p*fpE(|nCK`>JYPBk5N0Z6K6bc0bmj*Ei3TgoIKR^JrWi%S8y3lAe zPz=aY66mB9X|-CR0w|#GbUJ3c-AWDi^Yb%(QMH92*YEcs8+D26YJ0UyqcwDl%i9~`j4X%Nd0IujGb0itS z!{GoigP6$Jocn;P^nJf5uDNCf(RM!rSj9r2kghYw@EZVPO%kwQ;PLU%6pKaiErCG5 z3Zy4kzl}Z`E-_QD#M1j}qMcDPlCZ9?P%MM zq6_&T`G60g-0RAT`<#J%+<48Nk|%sS1Pxy`9*-F-??vtYyCnDh{T*^8ub-Zt@Ldo# z@y~a6clc|3GIIx!Aps={`ew5sK4^O!XWqWV>{DttJF3@~uffc=606I8i_d=CQnmDT zzl44U{A*{fBrrM<%OqNM_n+(~xnh!#yWCjmnroNYuNyr@gkVB&CzGE}rwv9Hu~aIV zOeOQAg;9Bir*DqQtedi8_OtKxS1*51^mST_h4QSgls0BmPngYSD6S+WP&e@n_$10sIR@w!Fx_gk@P{Nt_Lm#i5-%hnNIuB=b^7yP zBny~hESt@0VgwZ%KbFhoxEByVhz5xj#)ditQG<}7EJ0XMJ5)8tALAeK{}^pSQEGCmxoBo>ia4Ec83rew_`$N%o zSM{x1)!uu~f6n=DJre=BFB63F4agCW;*z_0_E#n|wiHbjp;uJAAi`)O7aVmC0z-Xy zc}c{{uy6(#Em17aLWm^i=H{gC87j^N1FbZPgP=+8qiq1r0fPrp_MTwNNe4i5lxuO| zLI02m{ShJ6X45|{Sbjve&rma>!{1)R(u;UmSif;C18vj>oSJ`G9StmWf7G? zAs@b{R12X{9%U@&R$($H8LQ@}?d@&llt|0C9CCSiS+GJzL&VTzVhc~^sfOaAWu%pVwW=G%0EY>aQ@cc z;2|JW`(Ij7F}2{tORX~!oNi@IB4CU+eT8xZU~m#~wEZGsbP_Ze()l7_?R0zF$+ka4 zos3q?`B$bDhH-CiPg-9jP1ZzIG9^x4!^i>W1ALYoCu`9~*sUM!s3xZ-`mO9sKP?%o zmY?QfHhDV@fad8m=kr`?ekB93=49&e3E~PFXheyHZnAS{YKMY&@N|}^l z`y9hzeGp+q#S7W0FeI`UQt6^rDH!b3IB^&d6#!b0&CN}MZP@_Eo8E&#ZH!_sWpK%E}7EO0z&Xh(ypjSh32ACgV~Bu%DP*Nfrm1aThgI z2Tiwuh=>Z(Wk9+L3IJn|5Qt(bbs)w@F3!%*7%;kv5K1B;v>i$)7&Qi;!woB;+f zSwG)#`Y+ocTFJ4{Uqm2F#M1uiBO;{VX_n~X;v$v=)+b_k5meU?NEnD10>Yux1L1<* z-CboKqO=TjJeS1A(Q*EXHD_6X!}kPQ2>I;;^D-bNNlC2Def52r zu5|8C13FWa^=;w;inuTM%!Th1xIp&|NK-gx)29XmnoK7P+K!B(KBvI%-cIv$lH|9p z8IX#KA|6VEn)^OP=t>=wByg%j)1f|?Ax1I)to<%>Xyp@8MEjHYR`^1|I4K+@*9Hu>^Q&P;GB{kaBaU^i z2s)K2FyJDs?u94MGxA{RV)v{sG?jx?JOi4hTNcE4QW~XHXMKI$I5j56x{u@IFu>|ur>Cb# zj!dOFM}O%XA_Iaj!RqR&@lVvQJ%a0u5WTyL*z`|CkTRsIU1pm8J`sFzZm%m#^ z|83+g*B^-2`wxTJ53_@ciax-xyu15nu>9*U5g9KaeekF#IZ}>*)0}bQT2z0Iup;E+sCP4?Qfvv7I15?7%`2+Xo9s06}pC_~4^YiJgN_27JjSC;x?<68`}o z@&j_n!A2qh5nwU$MQ0D=Hx?YX}BCkjj4l%I%nuNq0rt`PUrGxM{Pm%sVztjwHN(O?L%d>pa97t zM~?Pap)%4b1QZdUdGt7W-jkt*ed(laRHIgZ@bZ~cA0#&FYGR`rI=@4r^S!c|jr8Gl z@-lWEVOSz;j)$=v_cK(>90mu3=g7)=0_I4d%PGkdb4qLu$iv0uzb5}FezYzQh#=U= zd*d+f!pn&P5CUUN-b=}jd7WY?JzoKa?Iui#$#C4qBEwZ)+!(Atu2*3PWUdRZ-?!ep ze(`TEk6=5fGkusm_L)LF*V(y8P(D7A8j6At>U}{D$SY@FNF3W?e+S#YLxG?7y{F^a zaQC#!2Ou%zfGjp!Ffl#>J3&rS^;j8B7gpg51efQo(p*bnh51)^CHBfT85Ds)_}Hi^jEDK!Y| z0M{@0^@}`_r60d&Y8zd~OZ(oc)`fotUl9?n5@_!t@2&eLa!tR46e%88SS;3@eTDX3ztH+hkR0gh%YY(+`Hmd6nB7V!w}X=Z@Y9 z$bY0xM#}xz<_+1az4+5%HFS+#h#JTvXIocl{K4i!T=7O+p)I=|uJMx0$^py1SXZ%d+r}>^5ma zFy717HQ91+tDZ*rIfYmVh{Yc9s#m|kf^PM>FG0~ennqO>W!af4gmo}P4Fo8 zjj-{#poPEK+8yp^M=5ukbt)%^_ub8YwmtE#L=n&@B}p7><-KZGLVB`&Hyq;%tny_; zm0D;n>81Uyz=I4JHuHYJ(^=_e;}Jm5{@01Ba`Hdx{U(*ZbzlmwWcH2{IH(lg+^i*S z*t4ri6RNI`95|?WnL`TBkwp2u-Y<_E_+@sI%rj3f^EPCrRh}S`yCpGnc`bZckZ)vb zZ0j30Chjs9Rr6(%B-Z;_orH*}fZ+{NKy3jCGqO-<6xHZmFp{AFW6GZ#l4}%6L^;7&MuL70r1ida^}~ zXb~qr8yff$sdt(EIcSH4Wmsd@oo68f%X>xjmLo8QH-&tUn|Us=ZZ}n3j#3WcT1)A* z9*SA^tnvG-B30137Zp#PcQN0_YLxwv2l&wkUF%iCS3V@5wUHMSvPsp|URs$~L?*rp@D2p3!7ES-Gs_LyitT|IrY-`#Ftz})1 z<8+>brjY^Eb;?HWH5(`>78B^TNjHwKj3GVgP@E!E;4imK2cV^4rO)2Fs(4tLLPN_* zc{sgP-WXLoSAH<)4?nDp!{Q29+`Va2Kks<&j!XJv^By-MSwZO?DSL{6ylm8%^0a^% z*h27If_YkHJBhFjE|<9jW~Q)r!A#kHDvF{?$3zZ6=**|pGdJMxMcQ5suje?)LQ71* zJ*P_E2qj!9-))j;D|Sv7seOXryM}@_#%z~vOdqrM8#3x@960c>E0h;VE)h3xC)Qn_ zXBP6F)+#6KE8E`(_H>BO6Zmjf3%J3``g-m)%e-e*e@&|*U()AD!WHwDIfr9qInFLD zk@TNUrI^u@3Z{Kc>7MmBG3*zbf?vCLGIokrH!1$}e=<@M?h=nlLwrueW$-kzUbXwE zvCH9ggA}OJ*m|T_?JSNgfQK_4?kb>e(gk;h8pjB0>)wspLws-MU1KFyrXfBt)Hp!(?%b1%c6ue*vsm}(YZZ1A^{^4p0AXsK-T-iOJMgKA6P zyKgzo?W$%nW4MV_7^qeL%|xU;Z9V*6Xx6c21J5kUemu+mJB_N;%p@XG6z)AfHi#p*`29>Fw8%2)4zoW};Y<^zvY9FcI!==o3 zRQ!iOG~vTmk_dT8$yfD3H*J(NxmGcQLqnF#SBFar^SdsNBo~DT0S;#}oPRTKe45uC zgL`5;eJp+)ZEe|HP1d>PcQhpgp00eYaazjwW_Vw}&Pc8Gg`u{%4neRsJ?($LaFJ&% z_bhuZ8M`7LZ*YGktMljI%~KA4Ey;T`c~(h?sbK5)*79*xJ0EG$TEg~UOx)P?wUE-@ zpS#exgN^L+K{}(G3%jd7b53g$#ilwpt6v|TuVEn{A3063oE$xcjWAkSS*hHnrnY<` zXwIPef7ELDl+4{g+xwRHwfN4m;lQiUfm@>mLqXZonJ-%|wpmchy&(9Xk_U9FuNwi?qiU;i)wd^f|(+Q!DE0$o2lqpNY}i8g(RJRIvo(7wJwQKv)F245ehJ#rlr&A)CWIj)CwDmSa=XCEQ)8WZDP$a_v0#7v{88ZGWJM($(m@z!yNu;kLvP4Xl{LQ zq;UKOs|MqZb>|L&oYNRw?$elK%|{T3(HbW`eixI+E!XGRk3oT_f6o(^8oYm@r53#{ z#VQmGEW*0{v4Ym>^$XcQ8#0~~#0>Q7?=FUWmb}^_)2?m9b5n}_oT&sU1w7tQRA4n^ z8r05zrf8|+>KSy6oBiufiJ3G<*Kyrl)J^@atUHpDlCUEqT2__OoS*FKnLh<|v^2hbZ%_2jk!nZWGxojD^ul$DVhnsw5&61~tsv*K*>-z>D zrF#uZAqP!8?wZ($32=&whP(N}er~;0+4_^B7_m2;mBO&QQ{WU@qmN8mObm8&VWVKi z)yW9g@0WohlrKJ7$nWGAyk-&g#BDlwb`>E7 zisd*{rYWW42jM?KYK-MD&^Gn zlDRDB^~PP;-mNI&sTcvHjNy1NuXk{%r2(xx|CN5d&)=05WnBDz^t8MCc+Yvb|lWme@K1ztWi8X8{5w-55Q^ zgx&rG$EVaUE@L;_M>Vx2a-X|qN9nGxUfgSZ*3NV<#>weJo!rhwxzln^AX&(dWtwHM z=Q90e=AD3dUew1G`k*?zm={*P&v^T}??X!}=7E^JoLhjeDhT%~Tya0QX+Jk3qN0lq zQ6XnRTTOZErk2%vNY-eauK`o;oygtEvB}97avF;M8>eN~TW_-J=SS~P<8KOGS-#|Y z7taeSge)%7)c3#JxpP^{hB{PWj~=97Tjh6AOXTsT3b4*RSi{T8(=i6^qq#A>ajLP- z8kRP|eJB}Y4>9bO(V5@%TiCmVS-|aeNJLk4MKW@$LS$IbP;z-*Qzcg%zn3JF7nCM~SqfZikxRRt-pTnqv>SVmwwnU)rb$O|Ql521hFt;uUXMg)~gv-_yE zVR;MD!QX2G{XsT>SDU!lyqS?%qo+~rURH&6Jxd(Ms>U37D`(-=P+ip9za`en6@T{Q zQR6{sJ8SJ5%;i6tX|t3$sLdy+Sb02WI5v7oPKTtjlFp;1d|%%cP7A(wUTVHgagv{+ zwE8Lk7D06I^Ix2nq|A3FV)JY**4}8^o5=Fo83%wv~1Y0#Shor=6h(8t-fL&L4k@Qs@ zb!HU~~L3Wfnz=v^ItP`h8cPVjg@_wHxte&ihT4 zPoc7x?OQ-bJxmyrD23=vf~`J21q=I{;O224w zg{nwP=X$Tmw-jBGB#U~M@m4nIWY43)jWTDY^wDP4vCLhf_*L;*!mv8QCv+g@s03EB z<=9s0@<5-qhq8z1D`8Z#VsLXVhs{GH(v7b$;Q=~?Oe}cd$j`dt^aqeXkp3u@cs4aW zqSNxwx>TBQcYZL7(j*~EU|*Y(IO_L-1^uH9&f-?Cszl7I$1mIUi39G0S+xoGKY_EL z->2Lf7KIYtV7JUn77f)sQM(1k$Ug;C)kOluai}%EIuWZoB<5f;cT)xygcv4gx>g#J zu8P=VY!SJ#LOLR+?d6lh^I5pbKoql)!!${W>vZ|E+-u9BYzZtKgJl5Ve>Sc5LDSSmP`?mqm zv!P-DU5}*9vP8NLrp8G}5YN4lf}i&_9ANZ;wWS|Tiaa-Q;xRDcuDoJK5c6k zQo7SI>Oy2lLks1GRr)Kc_ByvjT1s+ zqJ&2fs>m_H;zQzF;;bJz`91OZHNwHVW}0X-*r{I}((*Y3YyZhXysr%^dqs+3f0?}Agc&Ot4=C2n3N`2pHy$Z+qlJgH zyqZ$VdtUiYA^ogUwE3Kq%+twC7B8)f3}VicMHrlg`5dXyL`Lo2^pDiw ze-~YwIBNaij={b(5KFdL=JN1bExDf~UZTwUJD;VWvWcFyzh1nYte)N7RA8*;G_BNo z%D()`K36#Eb{C3mDH!hHgmi=2roq?;P?J~3kGv2cpp(^zIw8!r=df)t)4&FDpjVNw zzuk*cr2E9Hg77P`^zHNqPb8UDFbuy(zeGsAe&RhW|TlvLU}4}UnAjK%%2hMC-ssiyk8XMCtOd+4b8ssJF9>G*#Pq52J%h zq1|7j=3lqo@Z0B+#P`~zPK6I$zOWy6J12Q7orZmZJNb6yf1Q(tGo!FUWlJ2Lqk3jD z+x_DGqfUK^-Q}@2Uvzqo>ezN#PI_UrakHRl`ioRJgUb9EA(F7o6MB0+Liwqf>){I^ zzyqLJ*ZCsXJ66anZ3+vCX`wbjT18aQgn^zPK3&ncUHxE?z~qS^j)qb(uf zA-I6mk_C~5B$juB;vw$sT5-a? z&9fJe9=Akq28j%a-@$+{*n$f*-krY*s+H2>hhyb!ztV%!DL!+JDl}e@X>65*=}H>M zGkTrfQO~Q4pwb*j`9QrIHG+5iJ)3AvFz9_SThV7{5{QEx5+9kTkF@Oo63k!)sPa=w zq&iyuL}~!IMDd#Sen_REu_Ivnka%iK$ZO6UA+2gfMARus0V(F#4LdH-eS{)Wg1dTuif%(d6NT>NvO! z>u%}X?WKwTWSpENzL#y*4PH}8!ydqK=&m|NJ9wo7+y8TZ;nfMKm-80!l%4Bt@v8B* zRXkOX*AzZ*H_2bHHioc%=EH+{6f~nVh6sW*hV@7tCdJ?L+eOAhzWq^bv!y*W;?lFA zFtRfRbvYBnG=H1<1uOt#75T7xkfk*2b2yhz3k_s37W=ymxPpQj1(RAwMOsI_5Jelr z2RRN71j)}?w)+g1nFL09K5WM_$gRmvd(*!iZMCaq9)E1u-Od9(o9~j8Cfa)fy}Bj( zjyXUZnhFZ1CylX z;~W_(ikO414}MHQ|^KaL8WkwGG8|Nk3j zS2%5AaB8g?0@hDsPc0=4Px{lZc1wHo#eMU1qXcCkG2oi-{7LQ{iB!`XwOcWD<4J(f z2L2otI)`czU%pV8!iR(3>?AxxxuT7b5t)RhH!Uzv>n$n7dE;Ho1{sB|^*`$o-ckk| z{c7eWmq3Jjnyx&qb?*f31<|b(6IB-vUI_H1si%3ND1V1ykCtGYt}}3WYWteKN{Hf{ zh#1ek>2y-FZMoTPyM`UD3sz_3b&6gOYF0Gnus@|<5RF^@7>*bemMh|zAxRO2wMTSU zQaR;d6q;?VN%1i`9Y?u-o$vAhk({g^lLGVP9Ql3QhmzccvfI+N8BWVnkC*aVMuNeL z8)Xx+G|4Y!SF^-0PwK_QKpp~?&ixxA@#soT*z62&a<@Sg!T}e+zO*1mDsEjZ9wZ%02Yhcvu;4jjqbP2^cpNP%2ibqTOnj)Gx!eq}P{7{ROhc1X(;-3~ z5Ouuc)DJq?uHjmW7iwzyZ!%D_cbbIXyd;`UGCMxX9SIhCY8p>VQLT>|$g9B1P7N+- zRE#f}&56R^r$(p32|#Z;fNs=yHMLpD{bshFL|)FU(zgXAqCb!a#Gc9e@vT$sQ;3_V zEuRVVz8^^_DinVbUw0Q}$rXZ|4@NkfTHz}ep$(5{kmyd&A?umhRIJxOlh8}D-xYwQ zz_bEBz%2Z(IFZlzG@LbBHS8@1$%Ho?l;u!6_3Y9KyOT#VY%~)H9_%u2N1fJn8GsGdQvEq7O0mn zvq^$}0*aDtJAZGXO2im1DNSmbUSK34u|?C(&NImqHS6scp4 zF6oPg87?Hln@V9;IHyaDV&y(o9p%g-Wq#gg`3z(u;L~qn0CQ$ry~BFzhs(CropNc; z0INQRxGE)}PbN4*TJ($%e5#sFA>c0P&O-QK9f6j|Ne>xL%Uh2S zUs!%3GDe?%{7<*k_?teiC6qPhQ@;Te&#PaS>XBXq z+>m7khFoL2rMB4eYeuJx>9^^_6i?_Hmzp{$PT0!~@;*r@b`D^Q6~^C|_!FnLj@GTq zT0KbRJq6QJTi_q)Q6cCg%_&!!@sJj4oFFqoGNTP6goL&ojH^@H$3zZLk{GBhkda+@9X%dn0%=YAQS$r!f(8+*nVc4 z|0sUWN^>WChiYuU!Apm}60Fx5Up;e8VeR)0x8Cdt=W zL-?4T=x;086iulJQR);t&|^cORgqiieSsxQeLtPuYuqVChYX29tc0W}%xK}rHK+v3 ze0Gqj$Phs$gD_71LS*aMe?5=f9L2KgNxY5I3Lk&6Z(C4<@K?w{s` zoyN^h%DfAK3X7}pR#y8JlYh@XF&6aT zcwJgx`ns8~k$_Q?WBH-ZZX-P`&^Q^3BQ);Bm64YJ#c82yJDiccIo*35h`HF4+V zk_N|7TtR)GUGJ2{u(hKe%=4u|ljcLA{P-_N_${A^*jW?bxpB+4<}Zj~J#^L~{1X+` z5e1cUk=Wp!fK<3G5{HC8aIR)|Jivhvu;B-dJ3a>0Q4_^~$nx5Mx;dy;#80ITGhvit zqHvc#R{Twe+z%f=(pL|c<|>Gne{*l8n#01EF*9l8c!v+jxQ%ALgr#AJ5^){_7t$1m zh7mB6(StMdmi@R%CmFqx94$3@=KC#2J>7Iu&l6p7m#XikH0^_)qkLj<+56lT3EOhZ zzy`gX+2VdDfIX83N!IwfA{%8WteC7cKY;sP1(4oi5Z3-tYP0B=iuHWJMGTn_WO!PV zhY+vJe`wO|6RS}+O#AE?ipMuAMG~^Lm6|Z@rNg0Vb}xoc)QIGZb94pxq$*qS-R+sh z?2UA+KHxhFTV(G#azu8(7W-XcNT-$A_Hfv)aP8!*3kR)?sQz~DfnF$yk*5dd(TbCsajvb?P`GUc%B zzOiNKmDEUuI>HMk)io)D<&YN6iDHHva6*NsBZ55mM++g$M9_|DS7;{N;>P%85tV4m z7hH@f$^J>u^iuqpYfdLhKDY1^g9*X^X@O!cXBn~ z$U91E33ie*`JASzVF~Q1AQ3p57;MNQ1&8&chS0uaOO;Ek$XMdvn)*?=6%t@ph90?64r--f2X(vYPG4N}d(=1he4iR8 zV!508fYcL9>>w5Ln}{V`-HIH|I@CU!9)WHJGj_v{egfx@k)jv~)RiCUFAXsX26J?A zAAcU)WLZrq+i&(ex5pedKig|{d)+&P=w)2|i2JIp8Ga%x{a?IgRuoea#Mm#c0Lh5O z?p{MPY;LF$f}=tgE3WY*p7G1e*DjC)MwvKymqAuzyU`LMxR_Wp8*~&%KtyMtcq_$t zuTCd`ZuES~l1t<@G$E?-GAdGCDexYO>&5e3`6zI|xD^^_(lT0XnbsX(YJfdHV9yHa zO@?u7;X%~>Jt&6lw;eH&c2M=Cb}#hpU~6^paZ!6?98Mr)LL#a((JH?KR)9xEIk5$4 z*vl4uM4fxf+JV|l1{;+e=h|pkk~dqn-IY_`);ClM^Tgc?(w89W$z^CU9e(smA5TFQEYYB`CpdQHhFXo2h zNutAI+3E(I!H0K^sVVZr7A~{+{QI=-A+hb!_=#<#|GAr=@gOZU5f@N*>`N>+ves;+ zL-@$xVvvc5I-H>i%aK9Phhm*>JaHi|g=PUvwisxu_BI9u{QrjMXbb)ez~iLazSj*` Qfsd!Ds;g4^*evva04QZv6#xJL literal 0 HcmV?d00001 diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 58838c28..a2bcdab0 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -17,12 +17,12 @@ On Linux Python comes preinstalled on most Linux distributions, and is available as a package on all others. However there are certain features you might want to use -that are not available on your distro's package. You can easily compile the +that are not available on your distro's package. You can compile the latest version of Python from source. -In the event that Python doesn't come preinstalled and isn't in the repositories as -well, you can easily make packages for your own distro. Have a look at the -following links: +In the event that the latest version of Python doesn't come preinstalled and isn't +in the repositories as well, you can make packages for your own distro. Have a +look at the following links: .. seealso:: diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc deleted file mode 100644 index 2fc90126..00000000 --- a/Doc/using/venv-create.inc +++ /dev/null @@ -1,110 +0,0 @@ -Creation of :ref:`virtual environments ` is done by executing the -command ``venv``:: - - python -m venv /path/to/new/virtual/environment - -Running this command creates the target directory (creating any parent -directories that don't exist already) and places a ``pyvenv.cfg`` file in it -with a ``home`` key pointing to the Python installation from which the command -was run (a common name for the target directory is ``.venv``). It also creates -a ``bin`` (or ``Scripts`` on Windows) subdirectory containing a copy/symlink -of the Python binary/binaries (as appropriate for the platform or arguments -used at environment creation time). It also creates an (initially empty) -``lib/pythonX.Y/site-packages`` subdirectory (on Windows, this is -``Lib\site-packages``). If an existing directory is specified, it will be -re-used. - -.. deprecated:: 3.6 - ``pyvenv`` was the recommended tool for creating virtual environments for - Python 3.3 and 3.4, and is - :ref:`deprecated in Python 3.6 `. - -.. versionchanged:: 3.5 - The use of ``venv`` is now recommended for creating virtual environments. - -.. highlight:: none - -On Windows, invoke the ``venv`` command as follows:: - - c:\>Python35\python -m venv c:\path\to\myenv - -Alternatively, if you configured the ``PATH`` and ``PATHEXT`` variables for -your :ref:`Python installation `:: - - c:\>python -m venv c:\path\to\myenv - -The command, if run with ``-h``, will show the available options:: - - usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] - [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] - ENV_DIR [ENV_DIR ...] - - Creates virtual Python environments in one or more target directories. - - positional arguments: - ENV_DIR A directory to create the environment in. - - optional arguments: - -h, --help show this help message and exit - --system-site-packages - Give the virtual environment access to the system - site-packages dir. - --symlinks Try to use symlinks rather than copies, when symlinks - are not the default for the platform. - --copies Try to use copies rather than symlinks, even when - symlinks are the default for the platform. - --clear Delete the contents of the environment directory if it - already exists, before environment creation. - --upgrade Upgrade the environment directory to use this version - of Python, assuming Python has been upgraded in-place. - --without-pip Skips installing or upgrading pip in the virtual - environment (pip is bootstrapped by default) - --prompt PROMPT Provides an alternative prompt prefix for this - environment. - --upgrade-deps Upgrade core dependencies (pip) to the - latest version in PyPI - - Once an environment has been created, you may wish to activate it, e.g. by - sourcing an activate script in its bin directory. - -.. versionchanged:: 3.12 - - ``setuptools`` is no longer a core venv dependency. - -.. versionchanged:: 3.9 - Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI - -.. versionchanged:: 3.4 - Installs pip by default, added the ``--without-pip`` and ``--copies`` - options - -.. versionchanged:: 3.4 - In earlier versions, if the target directory already existed, an error was - raised, unless the ``--clear`` or ``--upgrade`` option was provided. - -.. note:: - While symlinks are supported on Windows, they are not recommended. Of - particular note is that double-clicking ``python.exe`` in File Explorer - will resolve the symlink eagerly and ignore the virtual environment. - -.. note:: - On Microsoft Windows, it may be required to enable the ``Activate.ps1`` - script by setting the execution policy for the user. You can do this by - issuing the following PowerShell command: - - PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - - See `About Execution Policies - `_ - for more information. - -The created ``pyvenv.cfg`` file also includes the -``include-system-site-packages`` key, set to ``true`` if ``venv`` is -run with the ``--system-site-packages`` option, ``false`` otherwise. - -Unless the ``--without-pip`` option is given, :mod:`ensurepip` will be -invoked to bootstrap ``pip`` into the virtual environment. - -Multiple paths can be given to ``venv``, in which case an identical virtual -environment will be created, according to the given options, at each provided -path. diff --git a/Doc/using/win_install_freethreaded.png b/Doc/using/win_install_freethreaded.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa01c1df6e051b1585228b0f963c5aaf2d0da5e GIT binary patch literal 236250 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%0A@>J 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%0DWC0rb;oy@MC+ebM>c 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 literal 0 HcmV?d00001 diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 919b76f2..63ce7f5d 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -14,8 +14,8 @@ know about when using Python on Microsoft Windows. Unlike most Unix systems and services, Windows does not include a system supported installation of Python. To make Python available, the CPython team -has compiled Windows installers (MSI packages) with every `release -`_ for many years. These installers +has compiled Windows installers with every `release +`_ for many years. These installers are primarily intended to add a per-user installation of Python, with the core interpreter and library being used by a single user. The installer is also able to install for all users of a single machine, and a separate ZIP file is @@ -307,6 +307,46 @@ settings and replace any that have been removed or modified. "Uninstall" will remove Python entirely, with the exception of the :ref:`launcher`, which has its own entry in Programs and Features. +.. _install-freethreaded-windows: + +Installing Free-threaded Binaries +--------------------------------- + +.. versionadded:: 3.13 (Experimental) + +.. note:: + + Everything described in this section is considered experimental, + and should be expected to change in future releases. + +To install pre-built binaries with free-threading enabled (see :pep:`703`), you +should select "Customize installation". The second page of options includes the +"Download free-threaded binaries" checkbox. + +.. image:: win_install_freethreaded.png + +Selecting this option will download and install additional binaries to the same +location as the main Python install. The main executable is called +``python3.13t.exe``, and other binaries either receive a ``t`` suffix or a full +ABI suffix. Python source files and bundled third-party dependencies are shared +with the main install. + +The free-threaded version is registered as a regular Python install with the +tag ``3.13t`` (with a ``-32`` or ``-arm64`` suffix as normal for those +platforms). This allows tools to discover it, and for the :ref:`launcher` to +support ``py.exe -3.13t``. Note that the launcher will interpret ``py.exe -3`` +(or a ``python3`` shebang) as "the latest 3.x install", which will prefer the +free-threaded binaries over the regular ones, while ``py.exe -3.13`` will not. +If you use the short style of option, you may prefer to not install the +free-threaded binaries at this time. + +To specify the install option at the command line, use +``Include_freethreaded=1``. See :ref:`install-layout-option` for instructions on +pre-emptively downloading the additional binaries for offline install. The +options to include debug symbols and binaries also apply to the free-threaded +builds. + +Free-threaded binaries are also available :ref:`on nuget.org `. .. _windows-store: @@ -394,7 +434,7 @@ When writing to the Windows Registry, the following behaviors exist: For more detail on the technical basis for these limitations, please consult Microsoft's documentation on packaged full-trust apps, currently available at `docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes -`_ +`_ .. _windows-nuget: @@ -450,9 +490,29 @@ automatically use the headers and import libraries in your build. The package information pages on nuget.org are `www.nuget.org/packages/python `_ -for the 64-bit version and `www.nuget.org/packages/pythonx86 -`_ for the 32-bit version. +for the 64-bit version, `www.nuget.org/packages/pythonx86 +`_ for the 32-bit version, and +`www.nuget.org/packages/pythonarm64 +`_ for the ARM64 version +Free-threaded packages +---------------------- + +.. versionadded:: 3.13 (Experimental) + +.. note:: + + Everything described in this section is considered experimental, + and should be expected to change in future releases. + +Packages containing free-threaded binaries are named +`python-freethreaded `_ +for the 64-bit version, `pythonx86-freethreaded +`_ for the 32-bit +version, and `pythonarm64-freethreaded +`_ for the ARM64 +version. These packages contain both the ``python3.13t.exe`` and +``python.exe`` entry points, both of which run free threaded. .. _windows-embeddable: @@ -475,7 +535,7 @@ dependents, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -548,7 +608,7 @@ key features: Popular scientific modules (such as numpy, scipy and pandas) and the ``conda`` package manager. -`Enthought Deployment Manager `_ +`Enthought Deployment Manager `_ "The Next Generation Python Environment and Package Manager". Previously Enthought provided Canopy, but it `reached end of life in 2016 @@ -618,13 +678,13 @@ System variables, you need non-restricted access to your machine .. seealso:: - https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + https://learn.microsoft.com/windows/win32/procthread/environment-variables Overview of environment variables on Windows - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + https://learn.microsoft.com/windows-server/administration/windows-commands/set_1 The ``set`` command, for temporarily modifying environment variables - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + https://learn.microsoft.com/windows-server/administration/windows-commands/setx The ``setx`` command, for permanently modifying environment variables @@ -777,8 +837,8 @@ The short form of the argument (``-3``) only ever selects from core Python releases, and not other distributions. However, the longer form (``-V:3``) will select from any. -The Company is matched on the full string, case-insenitive. The Tag is matched -oneither the full string, or a prefix, provided the next character is a dot or a +The Company is matched on the full string, case-insensitive. The Tag is matched +on either the full string, or a prefix, provided the next character is a dot or a hyphen. This allows ``-V:3.1`` to match ``3.1-32``, but not ``3.10``. Tags are sorted using numerical ordering (``3.10`` is newer than ``3.1``), but are compared using text (``-V:3.01`` does not match ``3.1``). @@ -867,17 +927,18 @@ For example, if the first line of your script starts with #! /usr/bin/python -The default Python will be located and used. As many Python scripts written -to work on Unix will already have this line, you should find these scripts can -be used by the launcher without modification. If you are writing a new script -on Windows which you hope will be useful on Unix, you should use one of the -shebang lines starting with ``/usr``. +The default Python or an active virtual environment will be located and used. +As many Python scripts written to work on Unix will already have this line, +you should find these scripts can be used by the launcher without modification. +If you are writing a new script on Windows which you hope will be useful on +Unix, you should use one of the shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the -32-bit python 3.7. +32-bit Python 3.7. If a virtual environment is active, the version will be +ignored and the environment will be used. .. versionadded:: 3.7 @@ -891,6 +952,13 @@ minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the not provably i386/32-bit". To request a specific environment, use the new :samp:`-V:{TAG}` argument with the complete tag. +.. versionchanged:: 3.13 + + Virtual commands referencing ``python`` now prefer an active virtual + environment rather than searching :envvar:`PATH`. This handles cases where + the shebang specifies ``/usr/bin/env python3`` but :file:`python3.exe` is + not present in the active environment. + The ``/usr/bin/env`` form of shebang line has one further special property. Before looking for installed Python interpreters, this form will search the executable :envvar:`PATH` for a Python executable matching the name provided @@ -1169,8 +1237,8 @@ following advice will prevent conflicts with other installations: listed. * If you are loading :file:`python3.dll` or :file:`python37.dll` in your own - executable, explicitly call :c:func:`Py_SetPath` or (at least) - :c:func:`Py_SetProgramName` before :c:func:`Py_Initialize`. + executable, explicitly set :c:member:`PyConfig.module_search_paths` before + :c:func:`Py_InitializeFromConfig`. * Clear and/or overwrite :envvar:`PYTHONPATH` and set :envvar:`PYTHONHOME` before launching :file:`python.exe` from your application. @@ -1187,21 +1255,22 @@ Otherwise, your users may experience problems using your application. Note that the first suggestion is the best, as the others may still be susceptible to non-standard paths in the registry and user site-packages. -.. versionchanged:: - 3.6 +.. versionchanged:: 3.6 + + Add ``._pth`` file support and removes ``applocal`` option from + ``pyvenv.cfg``. + +.. versionchanged:: 3.6 - * Adds ``._pth`` file support and removes ``applocal`` option from - ``pyvenv.cfg``. - * Adds :file:`python{XX}.zip` as a potential landmark when directly adjacent - to the executable. + Add :file:`python{XX}.zip` as a potential landmark when directly adjacent + to the executable. -.. deprecated:: - 3.6 +.. deprecated:: 3.6 - Modules specified in the registry under ``Modules`` (not ``PythonPath``) - may be imported by :class:`importlib.machinery.WindowsRegistryFinder`. - This finder is enabled on Windows in 3.6.0 and earlier, but may need to - be explicitly added to :data:`sys.meta_path` in the future. + Modules specified in the registry under ``Modules`` (not ``PythonPath``) + may be imported by :class:`importlib.machinery.WindowsRegistryFinder`. + This finder is enabled on Windows in 3.6.0 and earlier, but may need to + be explicitly added to :data:`sys.meta_path` in the future. Additional modules ================== @@ -1216,18 +1285,18 @@ The Windows-specific standard modules are documented in PyWin32 ------- -The `PyWin32 `_ module by Mark Hammond +The :pypi:`PyWin32` module by Mark Hammond is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log * `Microsoft Foundation Classes - `_ + `_ (MFC) user interfaces `PythonWin `_ + `Win32 How Do I...? `_ by Tim Golden `Python and COM `_ diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst index a5fc847d..1a949ec4 100644 --- a/Doc/whatsnew/2.0.rst +++ b/Doc/whatsnew/2.0.rst @@ -130,7 +130,7 @@ Guidelines": Read the rest of :pep:`1` for the details of the PEP editorial process, style, and format. PEPs are kept in the Python CVS tree on SourceForge, though they're not part of the Python 2.0 distribution, and are also available in HTML form from -https://peps.python.org/. As of September 2000, there are 25 PEPS, ranging +https://peps.python.org/. As of September 2000, there are 25 PEPs, ranging from :pep:`201`, "Lockstep Iteration", to PEP 225, "Elementwise/Objectwise Operators". @@ -217,13 +217,13 @@ often use the ``codecs.lookup(encoding)`` function, which returns a was consumed. * *stream_reader* is a class that supports decoding input from a stream. - *stream_reader(file_obj)* returns an object that supports the :meth:`read`, - :meth:`readline`, and :meth:`readlines` methods. These methods will all + *stream_reader(file_obj)* returns an object that supports the :meth:`!read`, + :meth:`!readline`, and :meth:`!readlines` methods. These methods will all translate from the given encoding and return Unicode strings. * *stream_writer*, similarly, is a class that supports encoding output to a stream. *stream_writer(file_obj)* returns an object that supports the - :meth:`write` and :meth:`writelines` methods. These methods expect Unicode + :meth:`!write` and :meth:`!writelines` methods. These methods expect Unicode strings, translating them to the given encoding on output. For example, the following code writes a Unicode string into a file, encoding @@ -356,8 +356,8 @@ variable ``a`` by 2, equivalent to the slightly lengthier ``a = a + 2``. The full list of supported assignment operators is ``+=``, ``-=``, ``*=``, ``/=``, ``%=``, ``**=``, ``&=``, ``|=``, ``^=``, ``>>=``, and ``<<=``. Python classes can override the augmented assignment operators by defining methods -named :meth:`__iadd__`, :meth:`__isub__`, etc. For example, the following -:class:`Number` class stores a number and supports using += to create a new +named :meth:`!__iadd__`, :meth:`!__isub__`, etc. For example, the following +:class:`!Number` class stores a number and supports using += to create a new instance with an incremented value. .. The empty groups below prevent conversion to guillemets. @@ -374,7 +374,7 @@ instance with an incremented value. n += 3 print n.value -The :meth:`__iadd__` special method is called with the value of the increment, +The :meth:`!__iadd__` special method is called with the value of the increment, and should return a new instance with an appropriately modified value; this return value is bound as the new value of the variable on the left-hand side. @@ -390,10 +390,10 @@ String Methods ============== Until now string-manipulation functionality was in the :mod:`string` module, -which was usually a front-end for the :mod:`strop` module written in C. The -addition of Unicode posed a difficulty for the :mod:`strop` module, because the +which was usually a front-end for the :mod:`!strop` module written in C. The +addition of Unicode posed a difficulty for the :mod:`!strop` module, because the functions would all need to be rewritten in order to accept either 8-bit or -Unicode strings. For functions such as :func:`string.replace`, which takes 3 +Unicode strings. For functions such as :func:`!string.replace`, which takes 3 string arguments, that means eight possible permutations, and correspondingly complicated code. @@ -416,13 +416,13 @@ The old :mod:`string` module is still around for backwards compatibility, but it mostly acts as a front-end to the new string methods. Two methods which have no parallel in pre-2.0 versions, although they did exist -in JPython for quite some time, are :meth:`startswith` and :meth:`endswith`. +in JPython for quite some time, are :meth:`!startswith` and :meth:`!endswith`. ``s.startswith(t)`` is equivalent to ``s[:len(t)] == t``, while ``s.endswith(t)`` is equivalent to ``s[-len(t):] == t``. -One other method which deserves special mention is :meth:`join`. The -:meth:`join` method of a string receives one parameter, a sequence of strings, -and is equivalent to the :func:`string.join` function from the old :mod:`string` +One other method which deserves special mention is :meth:`!join`. The +:meth:`!join` method of a string receives one parameter, a sequence of strings, +and is equivalent to the :func:`!string.join` function from the old :mod:`string` module, with the arguments reversed. In other words, ``s.join(seq)`` is equivalent to the old ``string.join(seq, s)``. @@ -503,9 +503,9 @@ Minor Language Changes A new syntax makes it more convenient to call a given function with a tuple of arguments and/or a dictionary of keyword arguments. In Python 1.5 and earlier, -you'd use the :func:`apply` built-in function: ``apply(f, args, kw)`` calls the -function :func:`f` with the argument tuple *args* and the keyword arguments in -the dictionary *kw*. :func:`apply` is the same in 2.0, but thanks to a patch +you'd use the :func:`!apply` built-in function: ``apply(f, args, kw)`` calls the +function :func:`!f` with the argument tuple *args* and the keyword arguments in +the dictionary *kw*. :func:`!apply` is the same in 2.0, but thanks to a patch from Greg Ewing, ``f(*args, **kw)`` is a shorter and clearer way to achieve the same effect. This syntax is symmetrical with the syntax for defining functions:: @@ -518,7 +518,7 @@ functions:: The ``print`` statement can now have its output directed to a file-like object by following the ``print`` with ``>> file``, similar to the redirection operator in Unix shells. Previously you'd either have to use the -:meth:`write` method of the file-like object, which lacks the convenience and +:meth:`!write` method of the file-like object, which lacks the convenience and simplicity of ``print``, or you could assign a new value to ``sys.stdout`` and then restore the old value. For sending output to standard error, it's much easier to write this:: @@ -540,7 +540,7 @@ Previously there was no way to implement a class that overrode Python's built-in true if *obj* is present in the sequence *seq*; Python computes this by simply trying every index of the sequence until either *obj* is found or an :exc:`IndexError` is encountered. Moshe Zadka contributed a patch which adds a -:meth:`__contains__` magic method for providing a custom implementation for +:meth:`!__contains__` magic method for providing a custom implementation for :keyword:`!in`. Additionally, new built-in objects written in C can define what :keyword:`!in` means for them via a new slot in the sequence protocol. @@ -562,7 +562,7 @@ the python-dev mailing list for the discussion leading up to this implementation, and some useful relevant links. Note that comparisons can now also raise exceptions. In earlier versions of Python, a comparison operation such as ``cmp(a,b)`` would always produce an answer, even if a user-defined -:meth:`__cmp__` method encountered an error, since the resulting exception would +:meth:`!__cmp__` method encountered an error, since the resulting exception would simply be silently swallowed. .. Starting URL: @@ -607,7 +607,7 @@ seq1, seq2)`` is that :func:`map` pads the sequences with ``None`` if the sequences aren't all of the same length, while :func:`zip` truncates the returned list to the length of the shortest argument sequence. -The :func:`int` and :func:`long` functions now accept an optional "base" +The :func:`int` and :func:`!long` functions now accept an optional "base" parameter when the first argument is a string. ``int('123', 10)`` returns 123, while ``int('123', 16)`` returns 291. ``int(123, 16)`` raises a :exc:`TypeError` exception with the message "can't convert non-string with @@ -620,8 +620,8 @@ would be ``(2, 0, 1, 'beta', 1)``. *level* is a string such as ``"alpha"``, ``"beta"``, or ``"final"`` for a final release. Dictionaries have an odd new method, ``setdefault(key, default)``, which -behaves similarly to the existing :meth:`get` method. However, if the key is -missing, :meth:`setdefault` both returns the value of *default* as :meth:`get` +behaves similarly to the existing :meth:`!get` method. However, if the key is +missing, :meth:`!setdefault` both returns the value of *default* as :meth:`!get` would do, and also inserts it into the dictionary as the value for *key*. Thus, the following lines of code:: @@ -656,7 +656,7 @@ break. The change which will probably break the most code is tightening up the arguments accepted by some methods. Some methods would take multiple arguments and treat them as a tuple, particularly various list methods such as -:meth:`append` and :meth:`insert`. In earlier versions of Python, if ``L`` is +:meth:`!append` and :meth:`!insert`. In earlier versions of Python, if ``L`` is a list, ``L.append( 1,2 )`` appends the tuple ``(1,2)`` to the list. In Python 2.0 this causes a :exc:`TypeError` exception to be raised, with the message: 'append requires exactly 1 argument; 2 given'. The fix is to simply add an @@ -671,9 +671,9 @@ errors. If you absolutely must use 2.0 but can't fix your code, you can edit ``NO_STRICT_LIST_APPEND`` to preserve the old behaviour; this isn't recommended. Some of the functions in the :mod:`socket` module are still forgiving in this -way. For example, :func:`socket.connect( ('hostname', 25) )` is the correct -form, passing a tuple representing an IP address, but :func:`socket.connect( -'hostname', 25 )` also works. :func:`socket.connect_ex` and :func:`socket.bind` +way. For example, ``socket.connect( ('hostname', 25) )`` is the correct +form, passing a tuple representing an IP address, but ``socket.connect('hostname', 25)`` +also works. :meth:`socket.connect_ex ` and :meth:`socket.bind ` are similarly easy-going. 2.0alpha1 tightened these functions up, but because the documentation actually used the erroneous multiple argument form, many people wrote code which would break with the stricter checking. GvR backed out @@ -693,7 +693,7 @@ advantage of this fact will break in 2.0. Some work has been done to make integers and long integers a bit more interchangeable. In 1.5.2, large-file support was added for Solaris, to allow -reading files larger than 2 GiB; this made the :meth:`tell` method of file +reading files larger than 2 GiB; this made the :meth:`!tell` method of file objects return a long integer instead of a regular integer. Some code would subtract two file offsets and attempt to use the result to multiply a sequence or slice a string, but this raised a :exc:`TypeError`. In 2.0, long integers @@ -701,7 +701,7 @@ can be used to multiply or slice a sequence, and it'll behave as you'd intuitively expect it to; ``3L * 'abc'`` produces 'abcabcabc', and ``(0,1,2,3)[2L:4L]`` produces (2,3). Long integers can also be used in various contexts where previously only integers were accepted, such as in the -:meth:`seek` method of file objects, and in the formats supported by the ``%`` +:meth:`!seek` method of file objects, and in the formats supported by the ``%`` operator (``%d``, ``%i``, ``%x``, etc.). For example, ``"%d" % 2L**64`` will produce the string ``18446744073709551616``. @@ -715,7 +715,7 @@ digit. Taking the :func:`repr` of a float now uses a different formatting precision than :func:`str`. :func:`repr` uses ``%.17g`` format string for C's -:func:`sprintf`, while :func:`str` uses ``%.12g`` as before. The effect is that +:func:`!sprintf`, while :func:`str` uses ``%.12g`` as before. The effect is that :func:`repr` may occasionally show more decimal places than :func:`str`, for certain numbers. For example, the number 8.1 can't be represented exactly in binary, so ``repr(8.1)`` is ``'8.0999999999999996'``, while str(8.1) is @@ -723,7 +723,7 @@ binary, so ``repr(8.1)`` is ``'8.0999999999999996'``, while str(8.1) is The ``-X`` command-line option, which turned all standard exceptions into strings instead of classes, has been removed; the standard exceptions will now -always be classes. The :mod:`exceptions` module containing the standard +always be classes. The :mod:`!exceptions` module containing the standard exceptions was translated from Python to a built-in C module, written by Barry Warsaw and Fredrik Lundh. @@ -879,11 +879,11 @@ joins the basic set of Python documentation. XML Modules =========== -Python 1.5.2 included a simple XML parser in the form of the :mod:`xmllib` +Python 1.5.2 included a simple XML parser in the form of the :mod:`!xmllib` module, contributed by Sjoerd Mullender. Since 1.5.2's release, two different interfaces for processing XML have become common: SAX2 (version 2 of the Simple API for XML) provides an event-driven interface with some similarities to -:mod:`xmllib`, and the DOM (Document Object Model) provides a tree-based +:mod:`!xmllib`, and the DOM (Document Object Model) provides a tree-based interface, transforming an XML document into a tree of nodes that can be traversed and modified. Python 2.0 includes a SAX2 interface and a stripped-down DOM interface as part of the :mod:`xml` package. Here we will give a brief @@ -898,9 +898,9 @@ SAX2 Support SAX defines an event-driven interface for parsing XML. To use SAX, you must write a SAX handler class. Handler classes inherit from various classes provided by SAX, and override various methods that will then be called by the -XML parser. For example, the :meth:`startElement` and :meth:`endElement` +XML parser. For example, the :meth:`~xml.sax.handler.ContentHandler.startElement` and :meth:`~xml.sax.handler.ContentHandler.endElement` methods are called for every starting and end tag encountered by the parser, the -:meth:`characters` method is called for every chunk of character data, and so +:meth:`~xml.sax.handler.ContentHandler.characters` method is called for every chunk of character data, and so forth. The advantage of the event-driven approach is that the whole document doesn't @@ -940,8 +940,8 @@ DOM Support ----------- The Document Object Model is a tree-based representation for an XML document. A -top-level :class:`Document` instance is the root of the tree, and has a single -child which is the top-level :class:`Element` instance. This :class:`Element` +top-level :class:`!Document` instance is the root of the tree, and has a single +child which is the top-level :class:`!Element` instance. This :class:`!Element` has children nodes representing character data and any sub-elements, which may have further children of their own, and so forth. Using the DOM you can traverse the resulting tree any way you like, access element and attribute @@ -955,18 +955,18 @@ simply writing ````...\ ```` to a file. The DOM implementation included with Python lives in the :mod:`xml.dom.minidom` module. It's a lightweight implementation of the Level 1 DOM with support for -XML namespaces. The :func:`parse` and :func:`parseString` convenience +XML namespaces. The :func:`!parse` and :func:`!parseString` convenience functions are provided for generating a DOM tree:: from xml.dom import minidom doc = minidom.parse('hamlet.xml') -``doc`` is a :class:`Document` instance. :class:`Document`, like all the other -DOM classes such as :class:`Element` and :class:`Text`, is a subclass of the -:class:`Node` base class. All the nodes in a DOM tree therefore support certain -common methods, such as :meth:`toxml` which returns a string containing the XML +``doc`` is a :class:`!Document` instance. :class:`!Document`, like all the other +DOM classes such as :class:`!Element` and :class:`Text`, is a subclass of the +:class:`!Node` base class. All the nodes in a DOM tree therefore support certain +common methods, such as :meth:`!toxml` which returns a string containing the XML representation of the node and its children. Each class also has special -methods of its own; for example, :class:`Element` and :class:`Document` +methods of its own; for example, :class:`!Element` and :class:`!Document` instances have a method to find all child elements with a given tag name. Continuing from the previous 2-line example:: @@ -995,7 +995,7 @@ its children can be easily modified by deleting, adding, or removing nodes:: root.insertBefore( root.childNodes[0], root.childNodes[20] ) Again, I will refer you to the Python documentation for a complete listing of -the different :class:`Node` classes and their various methods. +the different :class:`!Node` classes and their various methods. Relationship to PyXML @@ -1020,7 +1020,7 @@ features in PyXML include: * The xmlproc validating parser, written by Lars Marius Garshol. -* The :mod:`sgmlop` parser accelerator module, written by Fredrik Lundh. +* The :mod:`!sgmlop` parser accelerator module, written by Fredrik Lundh. .. ====================================================================== @@ -1030,25 +1030,26 @@ Module changes Lots of improvements and bugfixes were made to Python's extensive standard library; some of the affected modules include :mod:`readline`, -:mod:`ConfigParser`, :mod:`cgi`, :mod:`calendar`, :mod:`posix`, :mod:`readline`, -:mod:`xmllib`, :mod:`aifc`, :mod:`chunk, wave`, :mod:`random`, :mod:`shelve`, -and :mod:`nntplib`. Consult the CVS logs for the exact patch-by-patch details. +:mod:`ConfigParser `, :mod:`!cgi`, :mod:`calendar`, :mod:`posix`, :mod:`readline`, +:mod:`!xmllib`, :mod:`!aifc`, :mod:`!chunk`, :mod:`wave`, :mod:`random`, :mod:`shelve`, +and :mod:`!nntplib`. Consult the CVS logs for the exact patch-by-patch details. Brian Gallew contributed OpenSSL support for the :mod:`socket` module. OpenSSL is an implementation of the Secure Socket Layer, which encrypts the data being sent over a socket. When compiling Python, you can edit :file:`Modules/Setup` to include SSL support, which adds an additional function to the :mod:`socket` module: ``socket.ssl(socket, keyfile, certfile)``, which takes a socket -object and returns an SSL socket. The :mod:`httplib` and :mod:`urllib` modules +object and returns an SSL socket. The :mod:`httplib ` and :mod:`urllib` modules were also changed to support ``https://`` URLs, though no one has implemented FTP or SMTP over SSL. -The :mod:`httplib` module has been rewritten by Greg Stein to support HTTP/1.1. -Backward compatibility with the 1.5 version of :mod:`httplib` is provided, +The :mod:`httplib ` module has been rewritten by Greg Stein to support HTTP/1.1. + +Backward compatibility with the 1.5 version of :mod:`!httplib` is provided, though using HTTP/1.1 features such as pipelining will require rewriting code to use a different set of interfaces. -The :mod:`Tkinter` module now supports Tcl/Tk version 8.1, 8.2, or 8.3, and +The :mod:`!Tkinter` module now supports Tcl/Tk version 8.1, 8.2, or 8.3, and support for the older 7.x versions has been dropped. The Tkinter module now supports displaying Unicode strings in Tk widgets. Also, Fredrik Lundh contributed an optimization which makes operations like ``create_line`` and @@ -1083,11 +1084,11 @@ module. calling :func:`atexit.register` with the function to be called on exit. (Contributed by Skip Montanaro.) -* :mod:`codecs`, :mod:`encodings`, :mod:`unicodedata`: Added as part of the new +* :mod:`codecs`, :mod:`!encodings`, :mod:`unicodedata`: Added as part of the new Unicode support. -* :mod:`filecmp`: Supersedes the old :mod:`cmp`, :mod:`cmpcache` and - :mod:`dircmp` modules, which have now become deprecated. (Contributed by Gordon +* :mod:`filecmp`: Supersedes the old :mod:`!cmp`, :mod:`!cmpcache` and + :mod:`!dircmp` modules, which have now become deprecated. (Contributed by Gordon MacMillan and Moshe Zadka.) * :mod:`gettext`: This module provides internationalization (I18N) and @@ -1095,8 +1096,8 @@ module. GNU gettext message catalog library. (Integrated by Barry Warsaw, from separate contributions by Martin von Löwis, Peter Funk, and James Henstridge.) -* :mod:`linuxaudiodev`: Support for the :file:`/dev/audio` device on Linux, a - twin to the existing :mod:`sunaudiodev` module. (Contributed by Peter Bosch, +* :mod:`!linuxaudiodev`: Support for the :file:`/dev/audio` device on Linux, a + twin to the existing :mod:`!sunaudiodev` module. (Contributed by Peter Bosch, with fixes by Jeremy Hylton.) * :mod:`mmap`: An interface to memory-mapped files on both Windows and Unix. A @@ -1105,10 +1106,10 @@ module. be passed to functions that expect ordinary strings, such as the :mod:`re` module. (Contributed by Sam Rushing, with some extensions by A.M. Kuchling.) -* :mod:`pyexpat`: An interface to the Expat XML parser. (Contributed by Paul +* :mod:`!pyexpat`: An interface to the Expat XML parser. (Contributed by Paul Prescod.) -* :mod:`robotparser`: Parse a :file:`robots.txt` file, which is used for writing +* :mod:`robotparser `: Parse a :file:`robots.txt` file, which is used for writing web spiders that politely avoid certain areas of a web site. The parser accepts the contents of a :file:`robots.txt` file, builds a set of rules from it, and can then answer questions about the fetchability of a given URL. (Contributed @@ -1117,7 +1118,7 @@ module. * :mod:`tabnanny`: A module/script to check Python source code for ambiguous indentation. (Contributed by Tim Peters.) -* :mod:`UserString`: A base class useful for deriving objects that behave like +* :mod:`!UserString`: A base class useful for deriving objects that behave like strings. * :mod:`webbrowser`: A module that provides a platform independent way to launch @@ -1129,18 +1130,18 @@ module. :file:`Tools/idle/BrowserControl.py`, and adapted for the standard library by Fred.) -* :mod:`_winreg`: An interface to the Windows registry. :mod:`_winreg` is an +* :mod:`_winreg `: An interface to the Windows registry. :mod:`!_winreg` is an adaptation of functions that have been part of PythonWin since 1995, but has now been added to the core distribution, and enhanced to support Unicode. - :mod:`_winreg` was written by Bill Tutt and Mark Hammond. + :mod:`!_winreg` was written by Bill Tutt and Mark Hammond. * :mod:`zipfile`: A module for reading and writing ZIP-format archives. These are archives produced by :program:`PKZIP` on DOS/Windows or :program:`zip` on Unix, not to be confused with :program:`gzip`\ -format files (which are supported by the :mod:`gzip` module) (Contributed by James C. Ahlstrom.) -* :mod:`imputil`: A module that provides a simpler way for writing customized - import hooks, in comparison to the existing :mod:`ihooks` module. (Implemented +* :mod:`!imputil`: A module that provides a simpler way for writing customized + import hooks, in comparison to the existing :mod:`!ihooks` module. (Implemented by Greg Stein, with much discussion on python-dev along the way.) .. ====================================================================== @@ -1184,13 +1185,13 @@ Deleted and Deprecated Modules ============================== A few modules have been dropped because they're obsolete, or because there are -now better ways to do the same thing. The :mod:`stdwin` module is gone; it was +now better ways to do the same thing. The :mod:`!stdwin` module is gone; it was for a platform-independent windowing toolkit that's no longer developed. A number of modules have been moved to the :file:`lib-old` subdirectory: -:mod:`cmp`, :mod:`cmpcache`, :mod:`dircmp`, :mod:`dump`, :mod:`find`, -:mod:`grep`, :mod:`packmail`, :mod:`poly`, :mod:`util`, :mod:`whatsound`, -:mod:`zmod`. If you have code which relies on a module that's been moved to +:mod:`!cmp`, :mod:`!cmpcache`, :mod:`!dircmp`, :mod:`!dump`, :mod:`!find`, +:mod:`!grep`, :mod:`!packmail`, :mod:`!poly`, :mod:`!util`, :mod:`!whatsound`, +:mod:`!zmod`. If you have code which relies on a module that's been moved to :file:`lib-old`, you can simply add that directory to ``sys.path`` to get them back, but you're encouraged to update any code that uses these modules. diff --git a/Doc/whatsnew/2.1.rst b/Doc/whatsnew/2.1.rst index f0e1ded7..f23f27c9 100644 --- a/Doc/whatsnew/2.1.rst +++ b/Doc/whatsnew/2.1.rst @@ -48,7 +48,7 @@ nested recursive function definition doesn't work:: return g(value-1) + 1 ... -The function :func:`g` will always raise a :exc:`NameError` exception, because +The function :func:`!g` will always raise a :exc:`NameError` exception, because the binding of the name ``g`` isn't in either its local namespace or in the module-level namespace. This isn't much of a problem in practice (how often do you recursively define interior functions like this?), but this also made using @@ -104,7 +104,7 @@ To make the preceding explanation a bit clearer, here's an example:: Line 4 containing the ``exec`` statement is a syntax error, since ``exec`` would define a new local variable named ``x`` whose value should -be accessed by :func:`g`. +be accessed by :func:`!g`. This shouldn't be much of a limitation, since ``exec`` is rarely used in most Python code (and when it is used, it's often a sign of a poor design @@ -161,7 +161,7 @@ PEP 207: Rich Comparisons In earlier versions, Python's support for implementing comparisons on user-defined classes and extension types was quite simple. Classes could implement a -:meth:`__cmp__` method that was given two instances of a class, and could only +:meth:`!__cmp__` method that was given two instances of a class, and could only return 0 if they were equal or +1 or -1 if they weren't; the method couldn't raise an exception or return anything other than a Boolean value. Users of Numeric Python often found this model too weak and restrictive, because in the @@ -175,21 +175,21 @@ In Python 2.1, rich comparisons were added in order to support this need. Python classes can now individually overload each of the ``<``, ``<=``, ``>``, ``>=``, ``==``, and ``!=`` operations. The new magic method names are: -+-----------+----------------+ -| Operation | Method name | -+===========+================+ -| ``<`` | :meth:`__lt__` | -+-----------+----------------+ -| ``<=`` | :meth:`__le__` | -+-----------+----------------+ -| ``>`` | :meth:`__gt__` | -+-----------+----------------+ -| ``>=`` | :meth:`__ge__` | -+-----------+----------------+ -| ``==`` | :meth:`__eq__` | -+-----------+----------------+ -| ``!=`` | :meth:`__ne__` | -+-----------+----------------+ ++-----------+------------------------+ +| Operation | Method name | ++===========+========================+ +| ``<`` | :meth:`~object.__lt__` | ++-----------+------------------------+ +| ``<=`` | :meth:`~object.__le__` | ++-----------+------------------------+ +| ``>`` | :meth:`~object.__gt__` | ++-----------+------------------------+ +| ``>=`` | :meth:`~object.__ge__` | ++-----------+------------------------+ +| ``==`` | :meth:`~object.__eq__` | ++-----------+------------------------+ +| ``!=`` | :meth:`~object.__ne__` | ++-----------+------------------------+ (The magic methods are named after the corresponding Fortran operators ``.LT.``. ``.LE.``, &c. Numeric programmers are almost certainly quite familiar with @@ -208,7 +208,7 @@ The built-in ``cmp(A,B)`` function can use the rich comparison machinery, and now accepts an optional argument specifying which comparison operation to use; this is given as one of the strings ``"<"``, ``"<="``, ``">"``, ``">="``, ``"=="``, or ``"!="``. If called without the optional third argument, -:func:`cmp` will only return -1, 0, or +1 as in previous versions of Python; +:func:`!cmp` will only return -1, 0, or +1 as in previous versions of Python; otherwise it will call the appropriate method and can return any Python object. There are also corresponding changes of interest to C programmers; there's a new @@ -245,7 +245,7 @@ out warnings that you don't want to be displayed. Third-party modules can also use this framework to deprecate old features that they no longer wish to support. -For example, in Python 2.1 the :mod:`regex` module is deprecated, so importing +For example, in Python 2.1 the :mod:`!regex` module is deprecated, so importing it causes a warning to be printed:: >>> import regex @@ -262,7 +262,7 @@ can be used to specify a particular warning category. Filters can be added to disable certain warnings; a regular expression pattern can be applied to the message or to the module name in order to suppress a -warning. For example, you may have a program that uses the :mod:`regex` module +warning. For example, you may have a program that uses the :mod:`!regex` module and not want to spare the time to convert it to use the :mod:`re` module right now. The warning can be suppressed by calling :: @@ -274,7 +274,7 @@ now. The warning can be suppressed by calling :: This adds a filter that will apply only to warnings of the class :class:`DeprecationWarning` triggered in the :mod:`__main__` module, and applies -a regular expression to only match the message about the :mod:`regex` module +a regular expression to only match the message about the :mod:`!regex` module being deprecated, and will cause such warnings to be ignored. Warnings can also be printed only once, printed every time the offending code is executed, or turned into exceptions that will cause the program to stop (unless the @@ -368,7 +368,7 @@ dictionary:: This version works for simple things such as integers, but it has a side effect; the ``_cache`` dictionary holds a reference to the return values, so they'll never be deallocated until the Python process exits and cleans up. This isn't -very noticeable for integers, but if :func:`f` returns an object, or a data +very noticeable for integers, but if :func:`!f` returns an object, or a data structure that takes up a lot of memory, this can be a problem. Weak references provide a way to implement a cache that won't keep objects alive @@ -379,7 +379,7 @@ created by calling ``wr = weakref.ref(obj)``. The object being referred to is returned by calling the weak reference as if it were a function: ``wr()``. It will return the referenced object, or ``None`` if the object no longer exists. -This makes it possible to write a :func:`memoize` function whose cache doesn't +This makes it possible to write a :func:`!memoize` function whose cache doesn't keep objects alive, by storing weak references in the cache. :: _cache = {} @@ -402,7 +402,7 @@ weak references --- an object referenced only by proxy objects is deallocated -- but instead of requiring an explicit call to retrieve the object, the proxy transparently forwards all operations to the object as long as the object still exists. If the object is deallocated, attempting to use a proxy will cause a -:exc:`weakref.ReferenceError` exception to be raised. :: +:exc:`!weakref.ReferenceError` exception to be raised. :: proxy = weakref.proxy(obj) proxy.attr # Equivalent to obj.attr @@ -424,7 +424,8 @@ PEP 232: Function Attributes In Python 2.1, functions can now have arbitrary information attached to them. People were often using docstrings to hold information about functions and -methods, because the ``__doc__`` attribute was the only way of attaching any +methods, because the :attr:`~function.__doc__` attribute was the only way of +attaching any information to a function. For example, in the Zope web application server, functions are marked as safe for public access by having a docstring, and in John Aycock's SPARK parsing framework, docstrings hold parts of the BNF grammar @@ -442,10 +443,10 @@ Python syntax:: f.grammar = "A ::= B (C D)*" The dictionary containing attributes can be accessed as the function's -:attr:`~object.__dict__`. Unlike the :attr:`~object.__dict__` attribute of class instances, in -functions you can actually assign a new dictionary to :attr:`~object.__dict__`, though +:attr:`~function.__dict__`. Unlike the :attr:`~type.__dict__` attribute of class instances, in +functions you can actually assign a new dictionary to :attr:`~function.__dict__`, though the new value is restricted to a regular Python dictionary; you *can't* be -tricky and set it to a :class:`UserDict` instance, or any other random object +tricky and set it to a :class:`!UserDict` instance, or any other random object that behaves like a mapping. @@ -583,11 +584,11 @@ available from the Distutils SIG at https://www.python.org/community/sigs/curren New and Improved Modules ======================== -* Ka-Ping Yee contributed two new modules: :mod:`inspect.py`, a module for - getting information about live Python code, and :mod:`pydoc.py`, a module for +* Ka-Ping Yee contributed two new modules: :mod:`!inspect.py`, a module for + getting information about live Python code, and :mod:`!pydoc.py`, a module for interactively converting docstrings to HTML or text. As a bonus, :file:`Tools/scripts/pydoc`, which is now automatically installed, uses - :mod:`pydoc.py` to display documentation given a Python module, package, or + :mod:`!pydoc.py` to display documentation given a Python module, package, or class name. For example, ``pydoc xml.dom`` displays the following:: Python Library Documentation: package xml.dom in xml @@ -616,7 +617,7 @@ New and Improved Modules Kent Beck's Smalltalk testing framework. See https://pyunit.sourceforge.net/ for more information about PyUnit. -* The :mod:`difflib` module contains a class, :class:`SequenceMatcher`, which +* The :mod:`difflib` module contains a class, :class:`~difflib.SequenceMatcher`, which compares two sequences and computes the changes required to transform one sequence into the other. For example, this module can be used to write a tool similar to the Unix :program:`diff` program, and in fact the sample program @@ -632,7 +633,7 @@ New and Improved Modules 2.1 includes an updated version of the :mod:`xml` package. Some of the noteworthy changes include support for Expat 1.2 and later versions, the ability for Expat parsers to handle files in any encoding supported by Python, and - various bugfixes for SAX, DOM, and the :mod:`minidom` module. + various bugfixes for SAX, DOM, and the :mod:`!minidom` module. * Ping also contributed another hook for handling uncaught exceptions. :func:`sys.excepthook` can be set to a callable object. When an exception isn't @@ -642,10 +643,10 @@ New and Improved Modules printing an extended traceback that not only lists the stack frames, but also lists the function arguments and the local variables for each frame. -* Various functions in the :mod:`time` module, such as :func:`asctime` and - :func:`localtime`, require a floating point argument containing the time in +* Various functions in the :mod:`time` module, such as :func:`~time.asctime` and + :func:`~time.localtime`, require a floating-point argument containing the time in seconds since the epoch. The most common use of these functions is to work with - the current time, so the floating point argument has been made optional; when a + the current time, so the floating-point argument has been made optional; when a value isn't provided, the current time will be used. For example, log file entries usually need a string containing the current time; in Python 2.1, ``time.asctime()`` can be used, instead of the lengthier @@ -723,10 +724,10 @@ of the more notable changes are: a discussion in comp.lang.python. A new module and method for file objects was also added, contributed by Jeff - Epler. The new method, :meth:`xreadlines`, is similar to the existing - :func:`xrange` built-in. :func:`xreadlines` returns an opaque sequence object + Epler. The new method, :meth:`!xreadlines`, is similar to the existing + :func:`!xrange` built-in. :func:`!xreadlines` returns an opaque sequence object that only supports being iterated over, reading a line on every iteration but - not reading the entire file into memory as the existing :meth:`readlines` method + not reading the entire file into memory as the existing :meth:`!readlines` method does. You'd use it like this:: for line in sys.stdin.xreadlines(): @@ -736,7 +737,7 @@ of the more notable changes are: For a fuller discussion of the line I/O changes, see the python-dev summary for January 1--15, 2001 at https://mail.python.org/pipermail/python-dev/2001-January/. -* A new method, :meth:`popitem`, was added to dictionaries to enable +* A new method, :meth:`~dict.popitem`, was added to dictionaries to enable destructively iterating through the contents of a dictionary; this can be faster for large dictionaries because there's no need to construct a list containing all the keys or values. ``D.popitem()`` removes a random ``(key, value)`` pair diff --git a/Doc/whatsnew/2.2.rst b/Doc/whatsnew/2.2.rst index d9ead574..856be5ec 100644 --- a/Doc/whatsnew/2.2.rst +++ b/Doc/whatsnew/2.2.rst @@ -53,9 +53,9 @@ A long time ago I wrote a web page listing flaws in Python's design. One of the most significant flaws was that it's impossible to subclass Python types implemented in C. In particular, it's not possible to subclass built-in types, so you can't just subclass, say, lists in order to add a single useful method to -them. The :mod:`UserList` module provides a class that supports all of the +them. The :mod:`!UserList` module provides a class that supports all of the methods of lists and that can be subclassed further, but there's lots of C code -that expects a regular Python list and won't accept a :class:`UserList` +that expects a regular Python list and won't accept a :class:`~collections.UserList` instance. Python 2.2 fixes this, and in the process adds some exciting new capabilities. @@ -69,7 +69,7 @@ A brief summary: * It's also possible to automatically call methods on accessing or setting an instance attribute by using a new mechanism called :dfn:`properties`. Many uses - of :meth:`__getattr__` can be rewritten to use properties instead, making the + of :meth:`~object.__getattr__` can be rewritten to use properties instead, making the resulting code simpler and faster. As a small side benefit, attributes can now have docstrings, too. @@ -120,7 +120,7 @@ added so if no built-in type is suitable, you can just subclass This means that :keyword:`class` statements that don't have any base classes are always classic classes in Python 2.2. (Actually you can also change this by -setting a module-level variable named :attr:`__metaclass__` --- see :pep:`253` +setting a module-level variable named :attr:`!__metaclass__` --- see :pep:`253` for the details --- but it's easier to just subclass :class:`object`.) The type objects for the built-in types are available as built-ins, named using @@ -134,8 +134,8 @@ type objects that behave as factories when called. :: 123 To make the set of types complete, new type objects such as :func:`dict` and -:func:`file` have been added. Here's a more interesting example, adding a -:meth:`lock` method to file objects:: +:func:`!file` have been added. Here's a more interesting example, adding a +:meth:`!lock` method to file objects:: class LockableFile(file): def lock (self, operation, length=0, start=0, whence=0): @@ -143,10 +143,10 @@ To make the set of types complete, new type objects such as :func:`dict` and return fcntl.lockf(self.fileno(), operation, length, start, whence) -The now-obsolete :mod:`posixfile` module contained a class that emulated all of -a file object's methods and also added a :meth:`lock` method, but this class +The now-obsolete :mod:`!posixfile` module contained a class that emulated all of +a file object's methods and also added a :meth:`!lock` method, but this class couldn't be passed to internal functions that expected a built-in file, -something which is possible with our new :class:`LockableFile`. +something which is possible with our new :class:`!LockableFile`. Descriptors @@ -154,11 +154,11 @@ Descriptors In previous versions of Python, there was no consistent way to discover what attributes and methods were supported by an object. There were some informal -conventions, such as defining :attr:`__members__` and :attr:`__methods__` +conventions, such as defining :attr:`!__members__` and :attr:`!__methods__` attributes that were lists of names, but often the author of an extension type or a class wouldn't bother to define them. You could fall back on inspecting the :attr:`~object.__dict__` of an object, but when class inheritance or an arbitrary -:meth:`__getattr__` hook were in use this could still be inaccurate. +:meth:`!__getattr__` hook were in use this could still be inaccurate. The one big idea underlying the new class model is that an API for describing the attributes of an object using :dfn:`descriptors` has been formalized. @@ -171,7 +171,7 @@ attributes of their own: * :attr:`~definition.__name__` is the attribute's name. -* :attr:`__doc__` is the attribute's docstring. +* :attr:`~definition.__doc__` is the attribute's docstring. * ``__get__(object)`` is a method that retrieves the attribute value from *object*. @@ -186,7 +186,8 @@ are:: descriptor = obj.__class__.x descriptor.__get__(obj) -For methods, :meth:`descriptor.__get__` returns a temporary object that's +For methods, :meth:`descriptor.__get__ ` returns a temporary +object that's callable, and wraps up the instance and the method to be called on it. This is also why static methods and class methods are now possible; they have descriptors that wrap up just the method, or the method and the class. As a @@ -204,7 +205,7 @@ methods are defined like this:: ... g = classmethod(g) -The :func:`staticmethod` function takes the function :func:`f`, and returns it +The :func:`staticmethod` function takes the function :func:`!f`, and returns it wrapped up in a descriptor so it can be stored in the class object. You might expect there to be special syntax for creating such methods (``def static f``, ``defstatic f()``, or something like that) but no such syntax has been defined @@ -232,10 +233,10 @@ like this:: f = eiffelmethod(f, pre_f, post_f) -Note that a person using the new :func:`eiffelmethod` doesn't have to understand +Note that a person using the new :func:`!eiffelmethod` doesn't have to understand anything about descriptors. This is why I think the new features don't increase the basic complexity of the language. There will be a few wizards who need to -know about it in order to write :func:`eiffelmethod` or the ZODB or whatever, +know about it in order to write :func:`!eiffelmethod` or the ZODB or whatever, but most users will just write code on top of the resulting libraries and ignore the implementation details. @@ -263,10 +264,10 @@ from :pep:`253` by Guido van Rossum):: The lookup rule for classic classes is simple but not very smart; the base classes are searched depth-first, going from left to right. A reference to -:meth:`D.save` will search the classes :class:`D`, :class:`B`, and then -:class:`A`, where :meth:`save` would be found and returned. :meth:`C.save` -would never be found at all. This is bad, because if :class:`C`'s :meth:`save` -method is saving some internal state specific to :class:`C`, not calling it will +:meth:`!D.save` will search the classes :class:`!D`, :class:`!B`, and then +:class:`!A`, where :meth:`!save` would be found and returned. :meth:`!C.save` +would never be found at all. This is bad, because if :class:`!C`'s :meth:`!save` +method is saving some internal state specific to :class:`!C`, not calling it will result in that state never getting saved. New-style classes follow a different algorithm that's a bit more complicated to @@ -276,22 +277,22 @@ produces more useful results for really complicated inheritance graphs.) #. List all the base classes, following the classic lookup rule and include a class multiple times if it's visited repeatedly. In the above example, the list - of visited classes is [:class:`D`, :class:`B`, :class:`A`, :class:`C`, - :class:`A`]. + of visited classes is [:class:`!D`, :class:`!B`, :class:`!A`, :class:`!C`, + :class:`!A`]. #. Scan the list for duplicated classes. If any are found, remove all but one occurrence, leaving the *last* one in the list. In the above example, the list - becomes [:class:`D`, :class:`B`, :class:`C`, :class:`A`] after dropping + becomes [:class:`!D`, :class:`!B`, :class:`!C`, :class:`!A`] after dropping duplicates. -Following this rule, referring to :meth:`D.save` will return :meth:`C.save`, +Following this rule, referring to :meth:`!D.save` will return :meth:`!C.save`, which is the behaviour we're after. This lookup rule is the same as the one followed by Common Lisp. A new built-in function, :func:`super`, provides a way to get at a class's superclasses without having to reimplement Python's algorithm. The most commonly used form will be ``super(class, obj)``, which returns a bound superclass object (not the actual class object). This form will be used in methods to call a method in the superclass; for example, -:class:`D`'s :meth:`save` method would look like this:: +:class:`!D`'s :meth:`!save` method would look like this:: class D (B,C): def save (self): @@ -309,7 +310,7 @@ Attribute Access ---------------- A fair number of sophisticated Python classes define hooks for attribute access -using :meth:`__getattr__`; most commonly this is done for convenience, to make +using :meth:`~object.__getattr__`; most commonly this is done for convenience, to make code more readable by automatically mapping an attribute access such as ``obj.parent`` into a method call such as ``obj.get_parent``. Python 2.2 adds some new ways of controlling attribute access. @@ -321,22 +322,22 @@ instance's dictionary. New-style classes also support a new method, ``__getattribute__(attr_name)``. The difference between the two methods is -that :meth:`__getattribute__` is *always* called whenever any attribute is -accessed, while the old :meth:`__getattr__` is only called if ``foo`` isn't +that :meth:`~object.__getattribute__` is *always* called whenever any attribute is +accessed, while the old :meth:`~object.__getattr__` is only called if ``foo`` isn't found in the instance's dictionary. However, Python 2.2's support for :dfn:`properties` will often be a simpler way -to trap attribute references. Writing a :meth:`__getattr__` method is +to trap attribute references. Writing a :meth:`!__getattr__` method is complicated because to avoid recursion you can't use regular attribute accesses inside them, and instead have to mess around with the contents of -:attr:`~object.__dict__`. :meth:`__getattr__` methods also end up being called by Python -when it checks for other methods such as :meth:`__repr__` or :meth:`__coerce__`, +:attr:`~object.__dict__`. :meth:`~object.__getattr__` methods also end up being called by Python +when it checks for other methods such as :meth:`~object.__repr__` or :meth:`!__coerce__`, and so have to be written with this in mind. Finally, calling a function on every attribute access results in a sizable performance loss. :class:`property` is a new built-in type that packages up three functions that get, set, or delete an attribute, and a docstring. For example, if you want to -define a :attr:`size` attribute that's computed, but also settable, you could +define a :attr:`!size` attribute that's computed, but also settable, you could write:: class C(object): @@ -355,9 +356,9 @@ write:: "Storage size of this instance") That is certainly clearer and easier to write than a pair of -:meth:`__getattr__`/:meth:`__setattr__` methods that check for the :attr:`size` +:meth:`!__getattr__`/:meth:`!__setattr__` methods that check for the :attr:`!size` attribute and handle it specially while retrieving all other attributes from the -instance's :attr:`~object.__dict__`. Accesses to :attr:`size` are also the only ones +instance's :attr:`~object.__dict__`. Accesses to :attr:`!size` are also the only ones which have to perform the work of calling a function, so references to other attributes run at their usual speed. @@ -424,22 +425,22 @@ Another significant addition to 2.2 is an iteration interface at both the C and Python levels. Objects can define how they can be looped over by callers. In Python versions up to 2.1, the usual way to make ``for item in obj`` work is -to define a :meth:`__getitem__` method that looks something like this:: +to define a :meth:`~object.__getitem__` method that looks something like this:: def __getitem__(self, index): return -:meth:`__getitem__` is more properly used to define an indexing operation on an +:meth:`~object.__getitem__` is more properly used to define an indexing operation on an object so that you can write ``obj[5]`` to retrieve the sixth element. It's a bit misleading when you're using this only to support :keyword:`for` loops. Consider some file-like object that wants to be looped over; the *index* parameter is essentially meaningless, as the class probably assumes that a -series of :meth:`__getitem__` calls will be made with *index* incrementing by -one each time. In other words, the presence of the :meth:`__getitem__` method +series of :meth:`~object.__getitem__` calls will be made with *index* incrementing by +one each time. In other words, the presence of the :meth:`~object.__getitem__` method doesn't mean that using ``file[5]`` to randomly access the sixth element will work, though it really should. -In Python 2.2, iteration can be implemented separately, and :meth:`__getitem__` +In Python 2.2, iteration can be implemented separately, and :meth:`~object.__getitem__` methods can be limited to classes that really do support random access. The basic idea of iterators is simple. A new built-in function, ``iter(obj)`` or ``iter(C, sentinel)``, is used to get an iterator. ``iter(obj)`` returns @@ -447,7 +448,7 @@ an iterator for the object *obj*, while ``iter(C, sentinel)`` returns an iterator that will invoke the callable object *C* until it returns *sentinel* to signal that the iterator is done. -Python classes can define an :meth:`__iter__` method, which should create and +Python classes can define an :meth:`!__iter__` method, which should create and return a new iterator for the object; if the object is its own iterator, this method can just return ``self``. In particular, iterators will usually be their own iterators. Extension types implemented in C can implement a :c:member:`~PyTypeObject.tp_iter` @@ -478,7 +479,7 @@ there are no more values to be returned, calling :meth:`next` should raise the In 2.2, Python's :keyword:`for` statement no longer expects a sequence; it expects something for which :func:`iter` will return an iterator. For backward compatibility and convenience, an iterator is automatically constructed for -sequences that don't implement :meth:`__iter__` or a :c:member:`~PyTypeObject.tp_iter` slot, so +sequences that don't implement :meth:`!__iter__` or a :c:member:`~PyTypeObject.tp_iter` slot, so ``for i in [1,2,3]`` will still work. Wherever the Python interpreter loops over a sequence, it's been changed to use the iterator protocol. This means you can do things like this:: @@ -510,8 +511,8 @@ Iterator support has been added to some of Python's basic types. Calling Oct 10 That's just the default behaviour. If you want to iterate over keys, values, or -key/value pairs, you can explicitly call the :meth:`iterkeys`, -:meth:`itervalues`, or :meth:`iteritems` methods to get an appropriate iterator. +key/value pairs, you can explicitly call the :meth:`!iterkeys`, +:meth:`!itervalues`, or :meth:`!iteritems` methods to get an appropriate iterator. In a minor related change, the :keyword:`in` operator now works on dictionaries, so ``key in dict`` is now equivalent to ``dict.has_key(key)``. @@ -580,7 +581,7 @@ allowed inside the :keyword:`!try` block of a :keyword:`try`...\ :keyword:`finally` statement; read :pep:`255` for a full explanation of the interaction between :keyword:`!yield` and exceptions.) -Here's a sample usage of the :func:`generate_ints` generator:: +Here's a sample usage of the :func:`!generate_ints` generator:: >>> gen = generate_ints(3) >>> gen @@ -641,7 +642,7 @@ like:: sentence := "Store it in the neighboring harbor" if (i := find("or", sentence)) > 5 then write(i) -In Icon the :func:`find` function returns the indexes at which the substring +In Icon the :func:`!find` function returns the indexes at which the substring "or" is found: 3, 23, 33. In the :keyword:`if` statement, ``i`` is first assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon retries it with the second value of 23. 23 is greater than 5, so the comparison @@ -671,7 +672,7 @@ PEP 237: Unifying Long Integers and Integers In recent versions, the distinction between regular integers, which are 32-bit values on most machines, and long integers, which can be of arbitrary size, was becoming an annoyance. For example, on platforms that support files larger than -``2**32`` bytes, the :meth:`tell` method of file objects has to return a long +``2**32`` bytes, the :meth:`!tell` method of file objects has to return a long integer. However, there were various bits of Python that expected plain integers and would raise an error if a long integer was provided instead. For example, in Python 1.5, only regular integers could be used as a slice index, and @@ -752,7 +753,7 @@ Here are the changes 2.2 introduces: 0.5. Without the ``__future__`` statement, ``/`` still means classic division. The default meaning of ``/`` will not change until Python 3.0. -* Classes can define methods called :meth:`__truediv__` and :meth:`__floordiv__` +* Classes can define methods called :meth:`~object.__truediv__` and :meth:`~object.__floordiv__` to overload the two division operators. At the C level, there are also slots in the :c:type:`PyNumberMethods` structure so extension types can define the two operators. @@ -785,17 +786,17 @@ support.) When built to use UCS-4 (a "wide Python"), the interpreter can natively handle Unicode characters from U+000000 to U+110000, so the range of legal values for -the :func:`unichr` function is expanded accordingly. Using an interpreter +the :func:`!unichr` function is expanded accordingly. Using an interpreter compiled to use UCS-2 (a "narrow Python"), values greater than 65535 will still -cause :func:`unichr` to raise a :exc:`ValueError` exception. This is all +cause :func:`!unichr` to raise a :exc:`ValueError` exception. This is all described in :pep:`261`, "Support for 'wide' Unicode characters"; consult it for further details. Another change is simpler to explain. Since their introduction, Unicode strings -have supported an :meth:`encode` method to convert the string to a selected +have supported an :meth:`!encode` method to convert the string to a selected encoding such as UTF-8 or Latin-1. A symmetric ``decode([*encoding*])`` method has been added to 8-bit strings (though not to Unicode strings) in 2.2. -:meth:`decode` assumes that the string is in the specified encoding and decodes +:meth:`!decode` assumes that the string is in the specified encoding and decodes it, returning whatever is returned by the codec. Using this new feature, codecs have been added for tasks not directly related to @@ -819,10 +820,10 @@ encoding, and compression with the :mod:`zlib` module:: >>> "sheesh".encode('rot-13') 'furrfu' -To convert a class instance to Unicode, a :meth:`__unicode__` method can be -defined by a class, analogous to :meth:`__str__`. +To convert a class instance to Unicode, a :meth:`!__unicode__` method can be +defined by a class, analogous to :meth:`!__str__`. -:meth:`encode`, :meth:`decode`, and :meth:`__unicode__` were implemented by +:meth:`!encode`, :meth:`!decode`, and :meth:`!__unicode__` were implemented by Marc-André Lemburg. The changes to support using UCS-4 internally were implemented by Fredrik Lundh and Martin von Löwis. @@ -859,7 +860,7 @@ doesn't work:: return g(value-1) + 1 ... -The function :func:`g` will always raise a :exc:`NameError` exception, because +The function :func:`!g` will always raise a :exc:`NameError` exception, because the binding of the name ``g`` isn't in either its local namespace or in the module-level namespace. This isn't much of a problem in practice (how often do you recursively define interior functions like this?), but this also made using @@ -915,7 +916,7 @@ To make the preceding explanation a bit clearer, here's an example:: Line 4 containing the ``exec`` statement is a syntax error, since ``exec`` would define a new local variable named ``x`` whose value should -be accessed by :func:`g`. +be accessed by :func:`!g`. This shouldn't be much of a limitation, since ``exec`` is rarely used in most Python code (and when it is used, it's often a sign of a poor design @@ -933,7 +934,7 @@ anyway). New and Improved Modules ======================== -* The :mod:`xmlrpclib` module was contributed to the standard library by Fredrik +* The :mod:`xmlrpclib ` module was contributed to the standard library by Fredrik Lundh, providing support for writing XML-RPC clients. XML-RPC is a simple remote procedure call protocol built on top of HTTP and XML. For example, the following snippet retrieves a list of RSS channels from the O'Reilly Network, @@ -956,7 +957,7 @@ New and Improved Modules # 'description': 'A utility which converts HTML to XSL FO.', # 'title': 'html2fo 0.3 (Default)'}, ... ] - The :mod:`SimpleXMLRPCServer` module makes it easy to create straightforward + The :mod:`SimpleXMLRPCServer ` module makes it easy to create straightforward XML-RPC servers. See http://xmlrpc.scripting.com/ for more information about XML-RPC. * The new :mod:`hmac` module implements the HMAC algorithm described by @@ -964,9 +965,9 @@ New and Improved Modules * Several functions that originally returned lengthy tuples now return pseudo-sequences that still behave like tuples but also have mnemonic attributes such - as memberst_mtime or :attr:`tm_year`. The enhanced functions include - :func:`stat`, :func:`fstat`, :func:`statvfs`, and :func:`fstatvfs` in the - :mod:`os` module, and :func:`localtime`, :func:`gmtime`, and :func:`strptime` in + as :attr:`!memberst_mtime` or :attr:`~time.struct_time.tm_year`. The enhanced functions include + :func:`~os.stat`, :func:`~os.fstat`, :func:`~os.statvfs`, and :func:`~os.fstatvfs` in the + :mod:`os` module, and :func:`~time.localtime`, :func:`~time.gmtime`, and :func:`~time.strptime` in the :mod:`time` module. For example, to obtain a file's size using the old tuples, you'd end up writing @@ -999,7 +1000,7 @@ New and Improved Modules underlying the :mod:`re` module. For example, the :func:`re.sub` and :func:`re.split` functions have been rewritten in C. Another contributed patch speeds up certain Unicode character ranges by a factor of two, and a new - :meth:`finditer` method that returns an iterator over all the non-overlapping + :meth:`~re.finditer` method that returns an iterator over all the non-overlapping matches in a given string. (SRE is maintained by Fredrik Lundh. The BIGCHARSET patch was contributed by Martin von Löwis.) @@ -1012,33 +1013,33 @@ New and Improved Modules new extensions: the NAMESPACE extension defined in :rfc:`2342`, SORT, GETACL and SETACL. (Contributed by Anthony Baxter and Michel Pelletier.) -* The :mod:`rfc822` module's parsing of email addresses is now compliant with +* The :mod:`!rfc822` module's parsing of email addresses is now compliant with :rfc:`2822`, an update to :rfc:`822`. (The module's name is *not* going to be changed to ``rfc2822``.) A new package, :mod:`email`, has also been added for parsing and generating e-mail messages. (Contributed by Barry Warsaw, and arising out of his work on Mailman.) -* The :mod:`difflib` module now contains a new :class:`Differ` class for +* The :mod:`difflib` module now contains a new :class:`!Differ` class for producing human-readable lists of changes (a "delta") between two sequences of - lines of text. There are also two generator functions, :func:`ndiff` and - :func:`restore`, which respectively return a delta from two sequences, or one of + lines of text. There are also two generator functions, :func:`!ndiff` and + :func:`!restore`, which respectively return a delta from two sequences, or one of the original sequences from a delta. (Grunt work contributed by David Goodger, from ndiff.py code by Tim Peters who then did the generatorization.) -* New constants :const:`ascii_letters`, :const:`ascii_lowercase`, and - :const:`ascii_uppercase` were added to the :mod:`string` module. There were - several modules in the standard library that used :const:`string.letters` to +* New constants :const:`!ascii_letters`, :const:`!ascii_lowercase`, and + :const:`!ascii_uppercase` were added to the :mod:`string` module. There were + several modules in the standard library that used :const:`!string.letters` to mean the ranges A-Za-z, but that assumption is incorrect when locales are in - use, because :const:`string.letters` varies depending on the set of legal + use, because :const:`!string.letters` varies depending on the set of legal characters defined by the current locale. The buggy modules have all been fixed - to use :const:`ascii_letters` instead. (Reported by an unknown person; fixed by + to use :const:`!ascii_letters` instead. (Reported by an unknown person; fixed by Fred L. Drake, Jr.) * The :mod:`mimetypes` module now makes it easier to use alternative MIME-type - databases by the addition of a :class:`MimeTypes` class, which takes a list of + databases by the addition of a :class:`~mimetypes.MimeTypes` class, which takes a list of filenames to be parsed. (Contributed by Fred L. Drake, Jr.) -* A :class:`Timer` class was added to the :mod:`threading` module that allows +* A :class:`~threading.Timer` class was added to the :mod:`threading` module that allows scheduling an activity to happen at some future time. (Contributed by Itamar Shtull-Trauring.) @@ -1062,7 +1063,7 @@ code, none of the changes described here will affect you very much. simply been changed to use the new C-level interface. (Contributed by Fred L. Drake, Jr.) -* Another low-level API, primarily of interest to implementors of Python +* Another low-level API, primarily of interest to implementers of Python debuggers and development tools, was added. :c:func:`PyInterpreterState_Head` and :c:func:`PyInterpreterState_Next` let a caller walk through all the existing interpreter objects; :c:func:`PyInterpreterState_ThreadHead` and @@ -1114,7 +1115,7 @@ code, none of the changes described here will affect you very much. * Two new wrapper functions, :c:func:`PyOS_snprintf` and :c:func:`PyOS_vsnprintf` were added to provide cross-platform implementations for the relatively new :c:func:`snprintf` and :c:func:`vsnprintf` C lib APIs. In contrast to the standard - :c:func:`sprintf` and :c:func:`vsprintf` functions, the Python versions check the + :c:func:`sprintf` and :c:func:`!vsprintf` functions, the Python versions check the bounds of the buffer used to protect against buffer overruns. (Contributed by M.-A. Lemburg.) @@ -1212,12 +1213,12 @@ Some of the more notable changes are: * The :file:`Tools/scripts/ftpmirror.py` script now parses a :file:`.netrc` file, if you have one. (Contributed by Mike Romberg.) -* Some features of the object returned by the :func:`xrange` function are now +* Some features of the object returned by the :func:`!xrange` function are now deprecated, and trigger warnings when they're accessed; they'll disappear in - Python 2.3. :class:`xrange` objects tried to pretend they were full sequence + Python 2.3. :class:`!xrange` objects tried to pretend they were full sequence types by supporting slicing, sequence multiplication, and the :keyword:`in` operator, but these features were rarely used and therefore buggy. The - :meth:`tolist` method and the :attr:`start`, :attr:`stop`, and :attr:`step` + :meth:`!tolist` method and the :attr:`!start`, :attr:`!stop`, and :attr:`!step` attributes are also being deprecated. At the C level, the fourth argument to the :c:func:`!PyRange_New` function, ``repeat``, has also been deprecated. @@ -1249,7 +1250,7 @@ Some of the more notable changes are: * The :func:`pow` built-in function no longer supports 3 arguments when floating-point numbers are supplied. ``pow(x, y, z)`` returns ``(x**y) % z``, - but this is never useful for floating point numbers, and the final result varies + but this is never useful for floating-point numbers, and the final result varies unpredictably depending on the platform. A call such as ``pow(2.0, 8.0, 7.0)`` will now raise a :exc:`TypeError` exception. diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst index 0442c9fd..ac463f82 100644 --- a/Doc/whatsnew/2.3.rst +++ b/Doc/whatsnew/2.3.rst @@ -40,10 +40,10 @@ new feature. PEP 218: A Standard Set Datatype ================================ -The new :mod:`sets` module contains an implementation of a set datatype. The +The new :mod:`!sets` module contains an implementation of a set datatype. The :class:`Set` class is for mutable sets, sets that can have members added and -removed. The :class:`ImmutableSet` class is for sets that can't be modified, -and instances of :class:`ImmutableSet` can therefore be used as dictionary keys. +removed. The :class:`!ImmutableSet` class is for sets that can't be modified, +and instances of :class:`!ImmutableSet` can therefore be used as dictionary keys. Sets are built on top of dictionaries, so the elements within a set must be hashable. @@ -63,10 +63,10 @@ Here's a simple example:: Set([1, 2, 5]) >>> -The union and intersection of sets can be computed with the :meth:`union` and -:meth:`intersection` methods; an alternative notation uses the bitwise operators +The union and intersection of sets can be computed with the :meth:`~frozenset.union` and +:meth:`~frozenset.intersection` methods; an alternative notation uses the bitwise operators ``&`` and ``|``. Mutable sets also have in-place versions of these methods, -:meth:`union_update` and :meth:`intersection_update`. :: +:meth:`!union_update` and :meth:`~frozenset.intersection_update`. :: >>> S1 = sets.Set([1,2,3]) >>> S2 = sets.Set([4,5,6]) @@ -87,7 +87,7 @@ It's also possible to take the symmetric difference of two sets. This is the set of all elements in the union that aren't in the intersection. Another way of putting it is that the symmetric difference contains all elements that are in exactly one set. Again, there's an alternative notation (``^``), and an -in-place version with the ungainly name :meth:`symmetric_difference_update`. :: +in-place version with the ungainly name :meth:`~frozenset.symmetric_difference_update`. :: >>> S1 = sets.Set([1,2,3,4]) >>> S2 = sets.Set([3,4,5,6]) @@ -97,7 +97,7 @@ in-place version with the ungainly name :meth:`symmetric_difference_update`. :: Set([1, 2, 5, 6]) >>> -There are also :meth:`issubset` and :meth:`issuperset` methods for checking +There are also :meth:`!issubset` and :meth:`!issuperset` methods for checking whether one set is a subset or superset of another:: >>> S1 = sets.Set([1,2,3]) @@ -166,7 +166,7 @@ statement isn't allowed inside the :keyword:`try` block of a :keyword:`!try`...\ :keyword:`!finally` statement; read :pep:`255` for a full explanation of the interaction between :keyword:`!yield` and exceptions.) -Here's a sample usage of the :func:`generate_ints` generator:: +Here's a sample usage of the :func:`!generate_ints` generator:: >>> gen = generate_ints(3) >>> gen @@ -227,7 +227,7 @@ like:: sentence := "Store it in the neighboring harbor" if (i := find("or", sentence)) > 5 then write(i) -In Icon the :func:`find` function returns the indexes at which the substring +In Icon the :func:`!find` function returns the indexes at which the substring "or" is found: 3, 23, 33. In the :keyword:`if` statement, ``i`` is first assigned a value of 3, but 3 is less than 5, so the comparison fails, and Icon retries it with the second value of 23. 23 is greater than 5, so the comparison @@ -345,7 +345,7 @@ Python now allows using arbitrary Unicode strings (within the limitations of the file system) for all functions that expect file names, most notably the :func:`open` built-in function. If a Unicode string is passed to :func:`os.listdir`, Python now returns a list of Unicode strings. A new -function, :func:`os.getcwdu`, returns the current directory as a Unicode string. +function, :func:`!os.getcwdu`, returns the current directory as a Unicode string. Byte strings still work as file names, and on Windows Python will transparently convert them to Unicode using the ``mbcs`` encoding. @@ -386,10 +386,10 @@ one followed by the platform on which Python is running. Opening a file with the mode ``'U'`` or ``'rU'`` will open a file for reading in :term:`universal newlines` mode. All three line ending conventions will be translated to a ``'\n'`` in the strings returned by the various file methods such as -:meth:`read` and :meth:`readline`. +:meth:`!read` and :meth:`!readline`. Universal newline support is also used when importing modules and when executing -a file with the :func:`execfile` function. This means that Python modules can +a file with the :func:`!execfile` function. This means that Python modules can be shared between all three operating systems without needing to convert the line-endings. @@ -450,16 +450,16 @@ records to standard error or to a file or socket, send them to the system log, or even e-mail them to a particular address; of course, it's also possible to write your own handler classes. -The :class:`Logger` class is the primary class. Most application code will deal -with one or more :class:`Logger` objects, each one used by a particular -subsystem of the application. Each :class:`Logger` is identified by a name, and +The :class:`~logging.Logger` class is the primary class. Most application code will deal +with one or more :class:`~logging.Logger` objects, each one used by a particular +subsystem of the application. Each :class:`~logging.Logger` is identified by a name, and names are organized into a hierarchy using ``.`` as the component separator. -For example, you might have :class:`Logger` instances named ``server``, +For example, you might have :class:`~logging.Logger` instances named ``server``, ``server.auth`` and ``server.network``. The latter two instances are below ``server`` in the hierarchy. This means that if you turn up the verbosity for ``server`` or direct ``server`` messages to a different handler, the changes will also apply to records logged to ``server.auth`` and ``server.network``. -There's also a root :class:`Logger` that's the parent of all other loggers. +There's also a root :class:`~logging.Logger` that's the parent of all other loggers. For simple uses, the :mod:`logging` package contains some convenience functions that always use the root log:: @@ -480,14 +480,14 @@ This produces the following output:: In the default configuration, informational and debugging messages are suppressed and the output is sent to standard error. You can enable the display -of informational and debugging messages by calling the :meth:`setLevel` method +of informational and debugging messages by calling the :meth:`~logging.Logger.setLevel` method on the root logger. -Notice the :func:`warning` call's use of string formatting operators; all of the +Notice the :func:`~logging.warning` call's use of string formatting operators; all of the functions for logging messages take the arguments ``(msg, arg1, arg2, ...)`` and log the string resulting from ``msg % (arg1, arg2, ...)``. -There's also an :func:`exception` function that records the most recent +There's also an :func:`~logging.exception` function that records the most recent traceback. Any of the other functions will also record the traceback if you specify a true value for the keyword argument *exc_info*. :: @@ -517,16 +517,16 @@ it if it doesn't exist yet. ``getLogger(None)`` returns the root logger. :: ... Log records are usually propagated up the hierarchy, so a message logged to -``server.auth`` is also seen by ``server`` and ``root``, but a :class:`Logger` -can prevent this by setting its :attr:`propagate` attribute to :const:`False`. +``server.auth`` is also seen by ``server`` and ``root``, but a :class:`~logging.Logger` +can prevent this by setting its :attr:`~logging.Logger.propagate` attribute to :const:`False`. There are more classes provided by the :mod:`logging` package that can be -customized. When a :class:`Logger` instance is told to log a message, it -creates a :class:`LogRecord` instance that is sent to any number of different -:class:`Handler` instances. Loggers and handlers can also have an attached list -of filters, and each filter can cause the :class:`LogRecord` to be ignored or +customized. When a :class:`~logging.Logger` instance is told to log a message, it +creates a :class:`~logging.LogRecord` instance that is sent to any number of different +:class:`~logging.Handler` instances. Loggers and handlers can also have an attached list +of filters, and each filter can cause the :class:`~logging.LogRecord` to be ignored or can modify the record before passing it along. When they're finally output, -:class:`LogRecord` instances are converted to text by a :class:`Formatter` +:class:`~logging.LogRecord` instances are converted to text by a :class:`~logging.Formatter` class. All of these classes can be replaced by your own specially written classes. @@ -550,7 +550,7 @@ PEP 285: A Boolean Type ======================= A Boolean type was added to Python 2.3. Two new constants were added to the -:mod:`__builtin__` module, :const:`True` and :const:`False`. (:const:`True` and +:mod:`!__builtin__` module, :const:`True` and :const:`False`. (:const:`True` and :const:`False` constants were added to the built-ins in Python 2.2.1, but the 2.2.1 versions are simply set to integer values of 1 and 0 and aren't a different type.) @@ -662,7 +662,7 @@ a central catalog server. The resulting catalog is available from https://pypi.org. To make the catalog a bit more useful, a new optional *classifiers* keyword -argument has been added to the Distutils :func:`setup` function. A list of +argument has been added to the Distutils :func:`!setup` function. A list of `Trove `_-style strings can be supplied to help classify the software. @@ -703,14 +703,14 @@ PEP 302: New Import Hooks ========================= While it's been possible to write custom import hooks ever since the -:mod:`ihooks` module was introduced in Python 1.3, no one has ever been really +:mod:`!ihooks` module was introduced in Python 1.3, no one has ever been really happy with it because writing new import hooks is difficult and messy. There -have been various proposed alternatives such as the :mod:`imputil` and :mod:`iu` +have been various proposed alternatives such as the :mod:`!imputil` and :mod:`!iu` modules, but none of them has ever gained much acceptance, and none of them were easily usable from C code. :pep:`302` borrows ideas from its predecessors, especially from Gordon -McMillan's :mod:`iu` module. Three new items are added to the :mod:`sys` +McMillan's :mod:`!iu` module. Three new items are added to the :mod:`sys` module: * ``sys.path_hooks`` is a list of callable objects; most often they'll be @@ -790,7 +790,7 @@ package is much simpler:: for line in reader: print line -The :func:`reader` function takes a number of different options. The field +The :func:`~csv.reader` function takes a number of different options. The field separator isn't limited to the comma and can be changed to any character, and so can the quoting and line-ending characters. @@ -814,7 +814,7 @@ of tuples or lists, quoting strings that contain the delimiter. PEP 307: Pickle Enhancements ============================ -The :mod:`pickle` and :mod:`cPickle` modules received some attention during the +The :mod:`pickle` and :mod:`!cPickle` modules received some attention during the 2.3 development cycle. In 2.2, new-style classes could be pickled without difficulty, but they weren't pickled very compactly; :pep:`307` quotes a trivial example where a new-style class results in a pickled string three times longer @@ -829,13 +829,13 @@ fanciest protocol available. Unpickling is no longer considered a safe operation. 2.2's :mod:`pickle` provided hooks for trying to prevent unsafe classes from being unpickled -(specifically, a :attr:`__safe_for_unpickling__` attribute), but none of this +(specifically, a :attr:`!__safe_for_unpickling__` attribute), but none of this code was ever audited and therefore it's all been ripped out in 2.3. You should not unpickle untrusted data in any version of Python. To reduce the pickling overhead for new-style classes, a new interface for customizing pickling was added using three special methods: -:meth:`__getstate__`, :meth:`__setstate__`, and :meth:`__getnewargs__`. Consult +:meth:`~object.__getstate__`, :meth:`~object.__setstate__`, and :meth:`~object.__getnewargs__`. Consult :pep:`307` for the full semantics of these methods. As a way to compress pickles yet further, it's now possible to use integer codes @@ -925,7 +925,7 @@ Deletion is more straightforward:: >>> a [1, 3] -One can also now pass slice objects to the :meth:`__getitem__` methods of the +One can also now pass slice objects to the :meth:`~object.__getitem__` methods of the built-in sequences:: >>> range(10).__getitem__(slice(0, 5, 2)) @@ -939,7 +939,7 @@ Or use slice objects directly in subscripts:: To simplify implementing sequences that support extended slicing, slice objects now have a method ``indices(length)`` which, given the length of a sequence, returns a ``(start, stop, step)`` tuple that can be passed directly to -:func:`range`. :meth:`indices` handles omitted and out-of-bounds indices in a +:func:`range`. :meth:`!indices` handles omitted and out-of-bounds indices in a manner consistent with regular slices (and this innocuous phrase hides a welter of confusing details!). The method is intended to be used like this:: @@ -1042,7 +1042,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language. execute any assertions. * Most type objects are now callable, so you can use them to create new objects - such as functions, classes, and modules. (This means that the :mod:`new` module + such as functions, classes, and modules. (This means that the :mod:`!new` module can be deprecated in a future Python version, because you can now use the type objects available in the :mod:`types` module.) For example, you can create a new module object with the following code: @@ -1069,11 +1069,11 @@ Here are all of the changes that Python 2.3 makes to the core Python language. * Using ``None`` as a variable name will now result in a :exc:`SyntaxWarning` warning. In a future version of Python, ``None`` may finally become a keyword. -* The :meth:`xreadlines` method of file objects, introduced in Python 2.1, is no +* The :meth:`!xreadlines` method of file objects, introduced in Python 2.1, is no longer necessary because files now behave as their own iterator. - :meth:`xreadlines` was originally introduced as a faster way to loop over all + :meth:`!xreadlines` was originally introduced as a faster way to loop over all the lines in a file, but now you can simply write ``for line in file_obj``. - File objects also have a new read-only :attr:`encoding` attribute that gives the + File objects also have a new read-only :attr:`!encoding` attribute that gives the encoding used by the file; Unicode strings written to the file will be automatically converted to bytes using the given encoding. @@ -1084,7 +1084,7 @@ Here are all of the changes that Python 2.3 makes to the core Python language. C3 algorithm as described in the paper `"A Monotonic Superclass Linearization for Dylan" `_. To understand the motivation for this change, read Michele Simionato's article - `"Python 2.3 Method Resolution Order" `_, or + :ref:`python_2.3_mro`, or read the thread on python-dev starting with the message at https://mail.python.org/pipermail/python-dev/2002-October/029035.html. Samuele Pedroni first pointed out the problem and also implemented the fix by coding the @@ -1096,12 +1096,12 @@ Here are all of the changes that Python 2.3 makes to the core Python language. switching overhead. Some multithreaded applications may suffer slower response time, but that's easily fixed by setting the limit back to a lower number using ``sys.setcheckinterval(N)``. The limit can be retrieved with the new - :func:`sys.getcheckinterval` function. + :func:`!sys.getcheckinterval` function. * One minor but far-reaching change is that the names of extension types defined by the modules included with Python now contain the module and a ``'.'`` in front of the type name. For example, in Python 2.2, if you created a socket and - printed its :attr:`__class__`, you'd get this output:: + printed its :attr:`!__class__`, you'd get this output:: >>> s = socket.socket() >>> s.__class__ @@ -1113,10 +1113,10 @@ Here are all of the changes that Python 2.3 makes to the core Python language. * One of the noted incompatibilities between old- and new-style classes has been - removed: you can now assign to the :attr:`~definition.__name__` and :attr:`~class.__bases__` + removed: you can now assign to the :attr:`~type.__name__` and :attr:`~type.__bases__` attributes of new-style classes. There are some restrictions on what can be - assigned to :attr:`~class.__bases__` along the lines of those relating to assigning to - an instance's :attr:`~instance.__class__` attribute. + assigned to :attr:`!__bases__` along the lines of those relating to assigning to + an instance's :attr:`~object.__class__` attribute. .. ====================================================================== @@ -1138,9 +1138,9 @@ String Changes True Note that this doesn't tell you where the substring starts; if you need that - information, use the :meth:`find` string method. + information, use the :meth:`~str.find` string method. -* The :meth:`strip`, :meth:`lstrip`, and :meth:`rstrip` string methods now have +* The :meth:`~str.strip`, :meth:`~str.lstrip`, and :meth:`~str.rstrip` string methods now have an optional argument for specifying the characters to strip. The default is still to remove all whitespace characters:: @@ -1156,13 +1156,13 @@ String Changes (Suggested by Simon Brunning and implemented by Walter Dörwald.) -* The :meth:`startswith` and :meth:`endswith` string methods now accept negative +* The :meth:`~str.startswith` and :meth:`~str.endswith` string methods now accept negative numbers for the *start* and *end* parameters. -* Another new string method is :meth:`zfill`, originally a function in the - :mod:`string` module. :meth:`zfill` pads a numeric string with zeros on the +* Another new string method is :meth:`~str.zfill`, originally a function in the + :mod:`string` module. :meth:`~str.zfill` pads a numeric string with zeros on the left until it's the specified width. Note that the ``%`` operator is still more - flexible and powerful than :meth:`zfill`. :: + flexible and powerful than :meth:`~str.zfill`. :: >>> '45'.zfill(4) '0045' @@ -1173,10 +1173,10 @@ String Changes (Contributed by Walter Dörwald.) -* A new type object, :class:`basestring`, has been added. Both 8-bit strings and +* A new type object, :class:`!basestring`, has been added. Both 8-bit strings and Unicode strings inherit from this type, so ``isinstance(obj, basestring)`` will return :const:`True` for either kind of string. It's a completely abstract - type, so you can't create :class:`basestring` instances. + type, so you can't create :class:`!basestring` instances. * Interned strings are no longer immortal and will now be garbage-collected in the usual way when the only reference to them is from the internal dictionary of @@ -1191,19 +1191,19 @@ Optimizations * The creation of new-style class instances has been made much faster; they're now faster than classic classes! -* The :meth:`sort` method of list objects has been extensively rewritten by Tim +* The :meth:`~list.sort` method of list objects has been extensively rewritten by Tim Peters, and the implementation is significantly faster. * Multiplication of large long integers is now much faster thanks to an implementation of Karatsuba multiplication, an algorithm that scales better than - the O(n\*n) required for the grade-school multiplication algorithm. (Original + the *O*\ (*n*\ :sup:`2`) required for the grade-school multiplication algorithm. (Original patch by Christopher A. Craig, and significantly reworked by Tim Peters.) * The ``SET_LINENO`` opcode is now gone. This may provide a small speed increase, depending on your compiler's idiosyncrasies. See section :ref:`23section-other` for a longer explanation. (Removed by Michael Hudson.) -* :func:`xrange` objects now have their own iterator, making ``for i in +* :func:`!xrange` objects now have their own iterator, making ``for i in xrange(n)`` slightly faster than ``for i in range(n)``. (Patch by Raymond Hettinger.) @@ -1230,21 +1230,21 @@ complete list of changes, or look through the CVS logs for all the details. operator to add another array's contents, and the ``*=`` assignment operator to repeat an array. (Contributed by Jason Orendorff.) -* The :mod:`bsddb` module has been replaced by version 4.1.6 of the `PyBSDDB +* The :mod:`!bsddb` module has been replaced by version 4.1.6 of the `PyBSDDB `_ package, providing a more complete interface to the transactional features of the BerkeleyDB library. - The old version of the module has been renamed to :mod:`bsddb185` and is no + The old version of the module has been renamed to :mod:`!bsddb185` and is no longer built automatically; you'll have to edit :file:`Modules/Setup` to enable - it. Note that the new :mod:`bsddb` package is intended to be compatible with + it. Note that the new :mod:`!bsddb` package is intended to be compatible with the old module, so be sure to file bugs if you discover any incompatibilities. When upgrading to Python 2.3, if the new interpreter is compiled with a new version of the underlying BerkeleyDB library, you will almost certainly have to convert your database files to the new version. You can do this fairly easily with the new scripts :file:`db2pickle.py` and :file:`pickle2db.py` which you will find in the distribution's :file:`Tools/scripts` directory. If you've - already been using the PyBSDDB package and importing it as :mod:`bsddb3`, you - will have to change your ``import`` statements to import it as :mod:`bsddb`. + already been using the PyBSDDB package and importing it as :mod:`!bsddb3`, you + will have to change your ``import`` statements to import it as :mod:`!bsddb`. * The new :mod:`bz2` module is an interface to the bz2 data compression library. bz2-compressed data is usually smaller than corresponding @@ -1253,11 +1253,11 @@ complete list of changes, or look through the CVS logs for all the details. * A set of standard date/time types has been added in the new :mod:`datetime` module. See the following section for more details. -* The Distutils :class:`Extension` class now supports an extra constructor +* The Distutils :class:`!Extension` class now supports an extra constructor argument named *depends* for listing additional source files that an extension depends on. This lets Distutils recompile the module if any of the dependency files are modified. For example, if :file:`sampmodule.c` includes the header - file :file:`sample.h`, you would create the :class:`Extension` object like + file :file:`sample.h`, you would create the :class:`!Extension` object like this:: ext = Extension("samp", @@ -1268,21 +1268,21 @@ complete list of changes, or look through the CVS logs for all the details. (Contributed by Jeremy Hylton.) * Other minor changes to Distutils: it now checks for the :envvar:`CC`, - :envvar:`CFLAGS`, :envvar:`CPP`, :envvar:`LDFLAGS`, and :envvar:`CPPFLAGS` + :envvar:`CFLAGS`, :envvar:`!CPP`, :envvar:`LDFLAGS`, and :envvar:`CPPFLAGS` environment variables, using them to override the settings in Python's configuration (contributed by Robert Weber). * Previously the :mod:`doctest` module would only search the docstrings of public methods and functions for test cases, but it now also examines private - ones as well. The :func:`DocTestSuite` function creates a + ones as well. The :func:`~doctest.DocTestSuite` function creates a :class:`unittest.TestSuite` object from a set of :mod:`doctest` tests. * The new ``gc.get_referents(object)`` function returns a list of all the objects referenced by *object*. -* The :mod:`getopt` module gained a new function, :func:`gnu_getopt`, that - supports the same arguments as the existing :func:`getopt` function but uses - GNU-style scanning mode. The existing :func:`getopt` stops processing options as +* The :mod:`getopt` module gained a new function, :func:`~getopt.gnu_getopt`, that + supports the same arguments as the existing :func:`~getopt.getopt` function but uses + GNU-style scanning mode. The existing :func:`~getopt.getopt` stops processing options as soon as a non-option argument is encountered, but in GNU-style mode processing continues, meaning that options and arguments can be mixed. For example:: @@ -1308,10 +1308,10 @@ complete list of changes, or look through the CVS logs for all the details. partially sorted order such that, for every index *k*, ``heap[k] <= heap[2*k+1]`` and ``heap[k] <= heap[2*k+2]``. This makes it quick to remove the smallest item, and inserting a new item while maintaining the heap property is - O(lg n). (See https://xlinux.nist.gov/dads//HTML/priorityque.html for more + *O*\ (log *n*). (See https://xlinux.nist.gov/dads//HTML/priorityque.html for more information about the priority queue data structure.) - The :mod:`heapq` module provides :func:`heappush` and :func:`heappop` functions + The :mod:`heapq` module provides :func:`~heapq.heappush` and :func:`~heapq.heappop` functions for adding and removing items while maintaining the heap property on top of some other mutable Python sequence type. Here's an example that uses a Python list:: @@ -1343,7 +1343,7 @@ complete list of changes, or look through the CVS logs for all the details. * The :mod:`itertools` contains a number of useful functions for use with iterators, inspired by various functions provided by the ML and Haskell languages. For example, ``itertools.ifilter(predicate, iterator)`` returns all - elements in the iterator for which the function :func:`predicate` returns + elements in the iterator for which the function :func:`!predicate` returns :const:`True`, and ``itertools.repeat(obj, N)`` returns ``obj`` *N* times. There are a number of other functions in the module; see the package's reference documentation for details. @@ -1356,21 +1356,21 @@ complete list of changes, or look through the CVS logs for all the details. was added to :func:`math.log` to make it easier to compute logarithms for bases other than ``e`` and ``10``. (Contributed by Raymond Hettinger.) -* Several new POSIX functions (:func:`getpgid`, :func:`killpg`, :func:`lchown`, - :func:`loadavg`, :func:`major`, :func:`makedev`, :func:`minor`, and - :func:`mknod`) were added to the :mod:`posix` module that underlies the +* Several new POSIX functions (:func:`!getpgid`, :func:`!killpg`, :func:`!lchown`, + :func:`!loadavg`, :func:`!major`, :func:`!makedev`, :func:`!minor`, and + :func:`!mknod`) were added to the :mod:`posix` module that underlies the :mod:`os` module. (Contributed by Gustavo Niemeyer, Geert Jansen, and Denis S. Otkidach.) -* In the :mod:`os` module, the :func:`\*stat` family of functions can now report +* In the :mod:`os` module, the :func:`!\*stat` family of functions can now report fractions of a second in a timestamp. Such time stamps are represented as floats, similar to the value returned by :func:`time.time`. During testing, it was found that some applications will break if time stamps are floats. For compatibility, when using the tuple interface of the - :class:`stat_result` time stamps will be represented as integers. When using + :class:`~os.stat_result` time stamps will be represented as integers. When using named fields (a feature first introduced in Python 2.2), time stamps are still - represented as integers, unless :func:`os.stat_float_times` is invoked to enable + represented as integers, unless :func:`!os.stat_float_times` is invoked to enable float return values:: >>> os.stat("/tmp").st_mtime @@ -1382,7 +1382,7 @@ complete list of changes, or look through the CVS logs for all the details. In Python 2.4, the default will change to always returning floats. Application developers should enable this feature only if all their libraries - work properly when confronted with floating point time stamps, or if they use + work properly when confronted with floating-point time stamps, or if they use the tuple API. If used, the feature should be activated on an application level instead of trying to enable it on a per-use basis. @@ -1391,8 +1391,8 @@ complete list of changes, or look through the CVS logs for all the details. automatically generate a usage message. See the following section for more details. -* The old and never-documented :mod:`linuxaudiodev` module has been deprecated, - and a new version named :mod:`ossaudiodev` has been added. The module was +* The old and never-documented :mod:`!linuxaudiodev` module has been deprecated, + and a new version named :mod:`!ossaudiodev` has been added. The module was renamed because the OSS sound drivers can be used on platforms other than Linux, and the interface has also been tidied and brought up to date in various ways. (Contributed by Greg Ward and Nicholas FitzRoy-Dale.) @@ -1402,14 +1402,14 @@ complete list of changes, or look through the CVS logs for all the details. functions for getting the architecture, CPU type, the Windows OS version, and even the Linux distribution version. (Contributed by Marc-André Lemburg.) -* The parser objects provided by the :mod:`pyexpat` module can now optionally +* The parser objects provided by the :mod:`pyexpat ` module can now optionally buffer character data, resulting in fewer calls to your character data handler and therefore faster performance. Setting the parser object's - :attr:`buffer_text` attribute to :const:`True` will enable buffering. + :attr:`~xml.parsers.expat.xmlparser.buffer_text` attribute to :const:`True` will enable buffering. * The ``sample(population, k)`` function was added to the :mod:`random` - module. *population* is a sequence or :class:`xrange` object containing the - elements of a population, and :func:`sample` chooses *k* elements from the + module. *population* is a sequence or :class:`!xrange` object containing the + elements of a population, and :func:`~random.sample` chooses *k* elements from the population without replacing chosen elements. *k* can be any value up to ``len(population)``. For example:: @@ -1436,20 +1436,20 @@ complete list of changes, or look through the CVS logs for all the details. (All changes contributed by Raymond Hettinger.) * The :mod:`readline` module also gained a number of new functions: - :func:`get_history_item`, :func:`get_current_history_length`, and - :func:`redisplay`. + :func:`~readline.get_history_item`, :func:`~readline.get_current_history_length`, and + :func:`~readline.redisplay`. -* The :mod:`rexec` and :mod:`Bastion` modules have been declared dead, and +* The :mod:`!rexec` and :mod:`!Bastion` modules have been declared dead, and attempts to import them will fail with a :exc:`RuntimeError`. New-style classes provide new ways to break out of the restricted execution environment provided - by :mod:`rexec`, and no one has interest in fixing them or time to do so. If - you have applications using :mod:`rexec`, rewrite them to use something else. + by :mod:`!rexec`, and no one has interest in fixing them or time to do so. If + you have applications using :mod:`!rexec`, rewrite them to use something else. (Sticking with Python 2.2 or 2.1 will not make your applications any safer - because there are known bugs in the :mod:`rexec` module in those versions. To - repeat: if you're using :mod:`rexec`, stop using it immediately.) + because there are known bugs in the :mod:`!rexec` module in those versions. To + repeat: if you're using :mod:`!rexec`, stop using it immediately.) -* The :mod:`rotor` module has been deprecated because the algorithm it uses for +* The :mod:`!rotor` module has been deprecated because the algorithm it uses for encryption is not believed to be secure. If you need encryption, use one of the several AES Python modules that are available separately. @@ -1474,9 +1474,9 @@ complete list of changes, or look through the CVS logs for all the details. * On Windows, the :mod:`socket` module now ships with Secure Sockets Layer (SSL) support. -* The value of the C :c:macro:`PYTHON_API_VERSION` macro is now exposed at the +* The value of the C :c:macro:`!PYTHON_API_VERSION` macro is now exposed at the Python level as ``sys.api_version``. The current exception can be cleared by - calling the new :func:`sys.exc_clear` function. + calling the new :func:`!sys.exc_clear` function. * The new :mod:`tarfile` module allows reading from and writing to :program:`tar`\ -format archive files. (Contributed by Lars Gustäbel.) @@ -1486,7 +1486,7 @@ complete list of changes, or look through the CVS logs for all the details. string and returns a list containing the text split into lines of no more than the chosen width. The ``fill(text, width)`` function returns a single string, reformatted to fit into lines no longer than the chosen width. (As you - can guess, :func:`fill` is built on top of :func:`wrap`. For example:: + can guess, :func:`~textwrap.fill` is built on top of :func:`~textwrap.wrap`. For example:: >>> import textwrap >>> paragraph = "Not a whit, we defy augury: ... more text ..." @@ -1503,15 +1503,15 @@ complete list of changes, or look through the CVS logs for all the details. it will come: the readiness is all. >>> - The module also contains a :class:`TextWrapper` class that actually implements - the text wrapping strategy. Both the :class:`TextWrapper` class and the - :func:`wrap` and :func:`fill` functions support a number of additional keyword + The module also contains a :class:`~textwrap.TextWrapper` class that actually implements + the text wrapping strategy. Both the :class:`~textwrap.TextWrapper` class and the + :func:`~textwrap.wrap` and :func:`~textwrap.fill` functions support a number of additional keyword arguments for fine-tuning the formatting; consult the module's documentation for details. (Contributed by Greg Ward.) -* The :mod:`thread` and :mod:`threading` modules now have companion modules, - :mod:`dummy_thread` and :mod:`dummy_threading`, that provide a do-nothing - implementation of the :mod:`thread` module's interface for platforms where +* The :mod:`!thread` and :mod:`threading` modules now have companion modules, + :mod:`!dummy_thread` and :mod:`!dummy_threading`, that provide a do-nothing + implementation of the :mod:`!thread` module's interface for platforms where threads are not supported. The intention is to simplify thread-aware modules (ones that *don't* rely on threads to run) by putting the following code at the top:: @@ -1521,26 +1521,26 @@ complete list of changes, or look through the CVS logs for all the details. except ImportError: import dummy_threading as _threading - In this example, :mod:`_threading` is used as the module name to make it clear + In this example, :mod:`!_threading` is used as the module name to make it clear that the module being used is not necessarily the actual :mod:`threading` - module. Code can call functions and use classes in :mod:`_threading` whether or + module. Code can call functions and use classes in :mod:`!_threading` whether or not threads are supported, avoiding an :keyword:`if` statement and making the code slightly clearer. This module will not magically make multithreaded code run without threads; code that waits for another thread to return or to do something will simply hang forever. -* The :mod:`time` module's :func:`strptime` function has long been an annoyance - because it uses the platform C library's :func:`strptime` implementation, and +* The :mod:`time` module's :func:`~time.strptime` function has long been an annoyance + because it uses the platform C library's :func:`~time.strptime` implementation, and different platforms sometimes have odd bugs. Brett Cannon contributed a portable implementation that's written in pure Python and should behave identically on all platforms. * The new :mod:`timeit` module helps measure how long snippets of Python code take to execute. The :file:`timeit.py` file can be run directly from the - command line, or the module's :class:`Timer` class can be imported and used + command line, or the module's :class:`~timeit.Timer` class can be imported and used directly. Here's a short example that figures out whether it's faster to convert an 8-bit string to Unicode by appending an empty Unicode string to it or - by using the :func:`unicode` function:: + by using the :func:`!unicode` function:: import timeit @@ -1555,49 +1555,49 @@ complete list of changes, or look through the CVS logs for all the details. # [0.36831796169281006, 0.37441694736480713, 0.35304892063140869] # [0.17574405670166016, 0.18193507194519043, 0.17565798759460449] -* The :mod:`Tix` module has received various bug fixes and updates for the +* The :mod:`!Tix` module has received various bug fixes and updates for the current version of the Tix package. -* The :mod:`Tkinter` module now works with a thread-enabled version of Tcl. +* The :mod:`!Tkinter` module now works with a thread-enabled version of Tcl. Tcl's threading model requires that widgets only be accessed from the thread in which they're created; accesses from another thread can cause Tcl to panic. For - certain Tcl interfaces, :mod:`Tkinter` will now automatically avoid this when a + certain Tcl interfaces, :mod:`!Tkinter` will now automatically avoid this when a widget is accessed from a different thread by marshalling a command, passing it to the correct thread, and waiting for the results. Other interfaces can't be - handled automatically but :mod:`Tkinter` will now raise an exception on such an + handled automatically but :mod:`!Tkinter` will now raise an exception on such an access so that you can at least find out about the problem. See https://mail.python.org/pipermail/python-dev/2002-December/031107.html for a more detailed explanation of this change. (Implemented by Martin von Löwis.) -* Calling Tcl methods through :mod:`_tkinter` no longer returns only strings. +* Calling Tcl methods through :mod:`!_tkinter` no longer returns only strings. Instead, if Tcl returns other objects those objects are converted to their - Python equivalent, if one exists, or wrapped with a :class:`_tkinter.Tcl_Obj` + Python equivalent, if one exists, or wrapped with a :class:`!_tkinter.Tcl_Obj` object if no Python equivalent exists. This behavior can be controlled through - the :meth:`wantobjects` method of :class:`tkapp` objects. + the :meth:`!wantobjects` method of :class:`!tkapp` objects. - When using :mod:`_tkinter` through the :mod:`Tkinter` module (as most Tkinter + When using :mod:`!_tkinter` through the :mod:`!Tkinter` module (as most Tkinter applications will), this feature is always activated. It should not cause compatibility problems, since Tkinter would always convert string results to Python types where possible. If any incompatibilities are found, the old behavior can be restored by setting - the :attr:`wantobjects` variable in the :mod:`Tkinter` module to false before - creating the first :class:`tkapp` object. :: + the :attr:`!wantobjects` variable in the :mod:`!Tkinter` module to false before + creating the first :class:`!tkapp` object. :: import Tkinter Tkinter.wantobjects = 0 Any breakage caused by this change should be reported as a bug. -* The :mod:`UserDict` module has a new :class:`DictMixin` class which defines +* The :mod:`!UserDict` module has a new :class:`!DictMixin` class which defines all dictionary methods for classes that already have a minimum mapping interface. This greatly simplifies writing classes that need to be substitutable for dictionaries, such as the classes in the :mod:`shelve` module. Adding the mix-in as a superclass provides the full dictionary interface - whenever the class defines :meth:`__getitem__`, :meth:`__setitem__`, - :meth:`__delitem__`, and :meth:`keys`. For example:: + whenever the class defines :meth:`~object.__getitem__`, :meth:`~object.__setitem__`, + :meth:`~object.__delitem__`, and :meth:`!keys`. For example:: >>> import UserDict >>> class SeqDict(UserDict.DictMixin): @@ -1640,15 +1640,15 @@ complete list of changes, or look through the CVS logs for all the details. * The DOM implementation in :mod:`xml.dom.minidom` can now generate XML output in a particular encoding by providing an optional encoding argument to the - :meth:`toxml` and :meth:`toprettyxml` methods of DOM nodes. + :meth:`~xml.dom.minidom.Node.toxml` and :meth:`~xml.dom.minidom.Node.toprettyxml` methods of DOM nodes. -* The :mod:`xmlrpclib` module now supports an XML-RPC extension for handling nil +* The :mod:`!xmlrpclib` module now supports an XML-RPC extension for handling nil data values such as Python's ``None``. Nil values are always supported on unmarshalling an XML-RPC response. To generate requests containing ``None``, you must supply a true value for the *allow_none* parameter when creating a - :class:`Marshaller` instance. + :class:`!Marshaller` instance. -* The new :mod:`DocXMLRPCServer` module allows writing self-documenting XML-RPC +* The new :mod:`!DocXMLRPCServer` module allows writing self-documenting XML-RPC servers. Run it in demo mode (as a program) to see it in action. Pointing the web browser to the RPC server produces pydoc-style documentation; pointing xmlrpclib to the server allows invoking the actual methods. (Contributed by @@ -1663,8 +1663,8 @@ complete list of changes, or look through the CVS logs for all the details. The :mod:`socket` module has also been extended to transparently convert Unicode hostnames to the ACE version before passing them to the C library. - Modules that deal with hostnames such as :mod:`httplib` and :mod:`ftplib`) - also support Unicode host names; :mod:`httplib` also sends HTTP ``Host`` + Modules that deal with hostnames such as :mod:`!httplib` and :mod:`ftplib`) + also support Unicode host names; :mod:`!httplib` also sends HTTP ``Host`` headers using the ACE version of the domain name. :mod:`urllib` supports Unicode URLs with non-ASCII host names as long as the ``path`` part of the URL is ASCII only. @@ -1682,17 +1682,17 @@ Date and time types suitable for expressing timestamps were added as the :mod:`datetime` module. The types don't support different calendars or many fancy features, and just stick to the basics of representing time. -The three primary types are: :class:`date`, representing a day, month, and year; +The three primary types are: :class:`~datetime.date`, representing a day, month, and year; :class:`~datetime.time`, consisting of hour, minute, and second; and :class:`~datetime.datetime`, -which contains all the attributes of both :class:`date` and :class:`~datetime.time`. -There's also a :class:`timedelta` class representing differences between two +which contains all the attributes of both :class:`~datetime.date` and :class:`~datetime.time`. +There's also a :class:`~datetime.timedelta` class representing differences between two points in time, and time zone logic is implemented by classes inheriting from -the abstract :class:`tzinfo` class. +the abstract :class:`~datetime.tzinfo` class. -You can create instances of :class:`date` and :class:`~datetime.time` by either supplying +You can create instances of :class:`~datetime.date` and :class:`~datetime.time` by either supplying keyword arguments to the appropriate constructor, e.g. ``datetime.date(year=1972, month=10, day=15)``, or by using one of a number of -class methods. For example, the :meth:`date.today` class method returns the +class methods. For example, the :meth:`~datetime.date.today` class method returns the current local date. Once created, instances of the date/time classes are all immutable. There are a @@ -1707,8 +1707,8 @@ number of methods for producing formatted strings from objects:: >>> now.strftime('%Y %d %b') '2002 30 Dec' -The :meth:`replace` method allows modifying one or more fields of a -:class:`date` or :class:`~datetime.datetime` instance, returning a new instance:: +The :meth:`~datetime.datetime.replace` method allows modifying one or more fields of a +:class:`~datetime.date` or :class:`~datetime.datetime` instance, returning a new instance:: >>> d = datetime.datetime.now() >>> d @@ -1718,10 +1718,10 @@ The :meth:`replace` method allows modifying one or more fields of a >>> Instances can be compared, hashed, and converted to strings (the result is the -same as that of :meth:`isoformat`). :class:`date` and :class:`~datetime.datetime` -instances can be subtracted from each other, and added to :class:`timedelta` +same as that of :meth:`~datetime.datetime.isoformat`). :class:`~datetime.date` and :class:`~datetime.datetime` +instances can be subtracted from each other, and added to :class:`~datetime.timedelta` instances. The largest missing feature is that there's no standard library -support for parsing strings and getting back a :class:`date` or +support for parsing strings and getting back a :class:`~datetime.date` or :class:`~datetime.datetime`. For more information, refer to the module's reference documentation. @@ -1739,7 +1739,7 @@ command-line parsing that follows the Unix conventions, automatically creates the output for :option:`!--help`, and can perform different actions for different options. -You start by creating an instance of :class:`OptionParser` and telling it what +You start by creating an instance of :class:`~optparse.OptionParser` and telling it what your program's options are. :: import sys @@ -1753,7 +1753,7 @@ your program's options are. :: action='store', type='int', dest='length', help='set maximum length of output') -Parsing a command line is then done by calling the :meth:`parse_args` method. :: +Parsing a command line is then done by calling the :meth:`~optparse.OptionParser.parse_args` method. :: options, args = op.parse_args(sys.argv[1:]) print options @@ -1925,8 +1925,8 @@ Changes to Python's build process and to the C API include: dependence on a system version or local installation of Expat. * If you dynamically allocate type objects in your extension, you should be - aware of a change in the rules relating to the :attr:`__module__` and - :attr:`~definition.__name__` attributes. In summary, you will want to ensure the type's + aware of a change in the rules relating to the :attr:`~type.__module__` and + :attr:`~type.__name__` attributes. In summary, you will want to ensure the type's dictionary contains a ``'__module__'`` key; making the module name the part of the type name leading up to the final period will no longer have the desired effect. For more detail, read the API reference documentation or the source. @@ -1940,7 +1940,7 @@ Port-Specific Changes Support for a port to IBM's OS/2 using the EMX runtime environment was merged into the main Python source tree. EMX is a POSIX emulation layer over the OS/2 system APIs. The Python port for EMX tries to support all the POSIX-like -capability exposed by the EMX runtime, and mostly succeeds; :func:`fork` and +capability exposed by the EMX runtime, and mostly succeeds; :func:`!fork` and :func:`fcntl` are restricted by the limitations of the underlying emulation layer. The standard OS/2 port, which uses IBM's Visual Age compiler, also gained support for case-sensitive import semantics as part of the integration of @@ -1998,13 +1998,13 @@ Some of the more notable changes are: It would be difficult to detect any resulting difference from Python code, apart from a slight speed up when Python is run without :option:`-O`. - C extensions that access the :attr:`f_lineno` field of frame objects should + C extensions that access the :attr:`~frame.f_lineno` field of frame objects should instead call ``PyCode_Addr2Line(f->f_code, f->f_lasti)``. This will have the added effect of making the code work as desired under "python -O" in earlier versions of Python. A nifty new feature is that trace functions can now assign to the - :attr:`f_lineno` attribute of frame objects, changing the line that will be + :attr:`~frame.f_lineno` attribute of frame objects, changing the line that will be executed next. A ``jump`` command has been added to the :mod:`pdb` debugger taking advantage of this new feature. (Implemented by Richie Hindle.) @@ -2031,9 +2031,9 @@ code: the file's encoding (UTF-8, Latin-1, or whatever) by adding a comment to the top of the file. See section :ref:`section-encodings` for more information. -* Calling Tcl methods through :mod:`_tkinter` no longer returns only strings. +* Calling Tcl methods through :mod:`!_tkinter` no longer returns only strings. Instead, if Tcl returns other objects those objects are converted to their - Python equivalent, if one exists, or wrapped with a :class:`_tkinter.Tcl_Obj` + Python equivalent, if one exists, or wrapped with a :class:`!_tkinter.Tcl_Obj` object if no Python equivalent exists. * Large octal and hex literals such as ``0xffffffff`` now trigger a @@ -2049,10 +2049,10 @@ code: * You can no longer disable assertions by assigning to ``__debug__``. -* The Distutils :func:`setup` function has gained various new keyword arguments +* The Distutils :func:`!setup` function has gained various new keyword arguments such as *depends*. Old versions of the Distutils will abort if passed unknown keywords. A solution is to check for the presence of the new - :func:`get_distutil_options` function in your :file:`setup.py` and only uses the + :func:`!get_distutil_options` function in your :file:`setup.py` and only uses the new keywords with a version of the Distutils that supports them:: from distutils import core diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst index ceda03af..7628cfef 100644 --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -324,7 +324,8 @@ function, as previously described. In other words, ``@A @B @C(args)`` becomes:: Getting this right can be slightly brain-bending, but it's not too difficult. -A small related change makes the :attr:`func_name` attribute of functions +A small related change makes the :attr:`func_name ` +attribute of functions writable. This attribute is used to display function names in tracebacks, so decorators should change the name of any new function that's constructed and returned. @@ -386,13 +387,13 @@ The standard library provides a number of ways to execute a subprocess, offering different features and different levels of complexity. ``os.system(command)`` is easy to use, but slow (it runs a shell process which executes the command) and dangerous (you have to be careful about escaping -the shell's metacharacters). The :mod:`popen2` module offers classes that can +the shell's metacharacters). The :mod:`!popen2` module offers classes that can capture standard output and standard error from the subprocess, but the naming is confusing. The :mod:`subprocess` module cleans this up, providing a unified interface that offers all the features you might need. -Instead of :mod:`popen2`'s collection of classes, :mod:`subprocess` contains a -single class called :class:`Popen` whose constructor supports a number of +Instead of :mod:`!popen2`'s collection of classes, :mod:`subprocess` contains a +single class called :class:`subprocess.Popen` whose constructor supports a number of different keyword arguments. :: class Popen(args, bufsize=0, executable=None, @@ -683,11 +684,11 @@ includes a quick-start tutorial and a reference. Written by Facundo Batista and implemented by Facundo Batista, Eric Price, Raymond Hettinger, Aahz, and Tim Peters. - http://www.lahey.com/float.htm + `http://www.lahey.com/float.htm `__ The article uses Fortran code to illustrate many of the problems that floating-point inaccuracy can cause. - http://speleotrove.com/decimal/ + https://speleotrove.com/decimal/ A description of a decimal-based representation. This representation is being proposed as a standard, and underlies the new Python decimal type. Much of this material was written by Mike Cowlishaw, designer of the Rexx language. @@ -756,7 +757,7 @@ API that perform ASCII-only conversions, ignoring the locale setting: :c:expr:`double` to an ASCII string. The code for these functions came from the GLib library -(https://developer-old.gnome.org/glib/2.26/), whose developers kindly +(`https://developer-old.gnome.org/glib/2.26/ `__), whose developers kindly relicensed the relevant functions and donated them to the Python Software Foundation. The :mod:`locale` module can now change the numeric locale, letting extensions such as GTK+ produce the correct results. @@ -994,7 +995,7 @@ fixes. Here's a partial list of the most notable changes, sorted alphabetically by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more complete list of changes, or look through the CVS logs for all the details. -* The :mod:`asyncore` module's :func:`loop` function now has a *count* parameter +* The :mod:`!asyncore` module's :func:`!loop` function now has a *count* parameter that lets you perform a limited number of passes through the polling loop. The default is still to loop forever. @@ -1051,9 +1052,9 @@ complete list of changes, or look through the CVS logs for all the details. advantage of :class:`collections.deque` for improved performance. (Contributed by Raymond Hettinger.) -* The :mod:`ConfigParser` classes have been enhanced slightly. The :meth:`read` +* The :mod:`ConfigParser ` classes have been enhanced slightly. The :meth:`~configparser.ConfigParser.read` method now returns a list of the files that were successfully parsed, and the - :meth:`set` method raises :exc:`TypeError` if passed a *value* argument that + :meth:`~configparser.ConfigParser.set` method raises :exc:`TypeError` if passed a *value* argument that isn't a string. (Contributed by John Belmonte and David Goodger.) * The :mod:`curses` module now supports the ncurses extension @@ -1080,7 +1081,7 @@ complete list of changes, or look through the CVS logs for all the details. :func:`nsmallest` that use heaps to find the N largest or smallest values in a dataset without the expense of a full sort. (Contributed by Raymond Hettinger.) -* The :mod:`httplib` module now contains constants for HTTP status codes defined +* The :mod:`httplib ` module now contains constants for HTTP status codes defined in various HTTP-related RFC documents. Constants have names such as :const:`OK`, :const:`CREATED`, :const:`CONTINUE`, and :const:`MOVED_PERMANENTLY`; use pydoc to get a full list. (Contributed by @@ -1163,7 +1164,7 @@ complete list of changes, or look through the CVS logs for all the details. * A number of functions were added to the :mod:`locale` module, such as :func:`bind_textdomain_codeset` to specify a particular encoding and a family of - :func:`l\*gettext` functions that return messages in the chosen encoding. + :func:`!l\*gettext` functions that return messages in the chosen encoding. (Contributed by Gustavo Niemeyer.) * Some keyword arguments were added to the :mod:`logging` package's @@ -1191,7 +1192,7 @@ complete list of changes, or look through the CVS logs for all the details. effect is to make :file:`.pyc` files significantly smaller. (Contributed by Martin von Löwis.) -* The :mod:`nntplib` module's :class:`NNTP` class gained :meth:`description` and +* The :mod:`!nntplib` module's :class:`NNTP` class gained :meth:`description` and :meth:`descriptions` methods to retrieve newsgroup descriptions for a single group or for a range of groups. (Contributed by Jürgen A. Erhard.) @@ -1217,10 +1218,10 @@ complete list of changes, or look through the CVS logs for all the details. now include the string ``'%default'``, which will be replaced by the option's default value. (Contributed by Greg Ward.) -* The long-term plan is to deprecate the :mod:`rfc822` module in some future +* The long-term plan is to deprecate the :mod:`!rfc822` module in some future Python release in favor of the :mod:`email` package. To this end, the - :func:`email.Utils.formatdate` function has been changed to make it usable as a - replacement for :func:`rfc822.formatdate`. You may want to write new e-mail + :func:`email.Utils.formatdate ` function has been changed to make it usable as a + replacement for :func:`!rfc822.formatdate`. You may want to write new e-mail processing code with this in mind. (Change implemented by Anthony Baxter.) * A new ``urandom(n)`` function was added to the :mod:`os` module, returning @@ -1307,7 +1308,7 @@ complete list of changes, or look through the CVS logs for all the details. sockets, and regular expression pattern objects. (Contributed by Raymond Hettinger.) -* The :mod:`xmlrpclib` module now supports a multi-call extension for +* The :mod:`xmlrpclib ` module now supports a multi-call extension for transmitting multiple XML-RPC calls in a single HTTP operation. (Contributed by Brian Quinlan.) @@ -1322,8 +1323,8 @@ complete list of changes, or look through the CVS logs for all the details. cookielib --------- -The :mod:`cookielib` library supports client-side handling for HTTP cookies, -mirroring the :mod:`Cookie` module's server-side cookie support. Cookies are +The :mod:`cookielib ` library supports client-side handling for HTTP cookies, +mirroring the :mod:`Cookie ` module's server-side cookie support. Cookies are stored in cookie jars; the library transparently stores cookies offered by the web server in the cookie jar, and fetches the cookie from the jar when connecting to the server. As in web browsers, policy objects control whether @@ -1334,7 +1335,7 @@ are provided: one that stores cookies in the Netscape format so applications can use the Mozilla or Lynx cookie files, and one that stores cookies in the same format as the Perl libwww library. -:mod:`urllib2` has been changed to interact with :mod:`cookielib`: +:mod:`urllib2 ` has been changed to interact with :mod:`cookielib `: :class:`HTTPCookieProcessor` manages a cookie jar that is used when accessing URLs. @@ -1528,7 +1529,7 @@ code: will now always be unequal, and relative comparisons (``<``, ``>``) will raise a :exc:`TypeError`. -* :func:`dircache.listdir` now passes exceptions to the caller instead of +* :func:`!dircache.listdir` now passes exceptions to the caller instead of returning empty lists. * :func:`LexicalHandler.startDTD` used to receive the public and system IDs in diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index f58b3ede..3430ac86 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -575,15 +575,15 @@ structure is:: with-block The expression is evaluated, and it should result in an object that supports the -context management protocol (that is, has :meth:`__enter__` and :meth:`__exit__` +context management protocol (that is, has :meth:`~object.__enter__` and :meth:`~object.__exit__` methods. -The object's :meth:`__enter__` is called before *with-block* is executed and +The object's :meth:`~object.__enter__` is called before *with-block* is executed and therefore can run set-up code. It also may return a value that is bound to the name *variable*, if given. (Note carefully that *variable* is *not* assigned the result of *expression*.) -After execution of the *with-block* is finished, the object's :meth:`__exit__` +After execution of the *with-block* is finished, the object's :meth:`~object.__exit__` method is called, even if the block raised an exception, and can therefore run clean-up code. @@ -609,7 +609,7 @@ part-way through the block. .. note:: In this case, *f* is the same object created by :func:`open`, because - :meth:`file.__enter__` returns *self*. + :meth:`~object.__enter__` returns *self*. The :mod:`threading` module's locks and condition variables also support the ':keyword:`with`' statement:: @@ -652,10 +652,10 @@ underlying implementation and should keep reading. A high-level explanation of the context management protocol is: * The expression is evaluated and should result in an object called a "context - manager". The context manager must have :meth:`__enter__` and :meth:`__exit__` + manager". The context manager must have :meth:`~object.__enter__` and :meth:`~object.__exit__` methods. -* The context manager's :meth:`__enter__` method is called. The value returned +* The context manager's :meth:`~object.__enter__` method is called. The value returned is assigned to *VAR*. If no ``'as VAR'`` clause is present, the value is simply discarded. @@ -669,7 +669,7 @@ A high-level explanation of the context management protocol is: if you do the author of the code containing the ':keyword:`with`' statement will never realize anything went wrong. -* If *BLOCK* didn't raise an exception, the :meth:`__exit__` method is still +* If *BLOCK* didn't raise an exception, the :meth:`~object.__exit__` method is still called, but *type*, *value*, and *traceback* are all ``None``. Let's think through an example. I won't present detailed code but will only @@ -703,7 +703,7 @@ rolled back if there's an exception. Here's the basic interface for def rollback (self): "Rolls back current transaction" -The :meth:`__enter__` method is pretty easy, having only to start a new +The :meth:`~object.__enter__` method is pretty easy, having only to start a new transaction. For this application the resulting cursor object would be a useful result, so the method will return it. The user can then add ``as cursor`` to their ':keyword:`with`' statement to bind the cursor to a variable name. :: @@ -715,7 +715,7 @@ their ':keyword:`with`' statement to bind the cursor to a variable name. :: cursor = self.cursor() return cursor -The :meth:`__exit__` method is the most complicated because it's where most of +The :meth:`~object.__exit__` method is the most complicated because it's where most of the work has to be done. The method has to check if an exception occurred. If there was no exception, the transaction is committed. The transaction is rolled back if there was an exception. @@ -748,10 +748,10 @@ are useful for writing objects for use with the ':keyword:`with`' statement. The decorator is called :func:`contextmanager`, and lets you write a single generator function instead of defining a new class. The generator should yield exactly one value. The code up to the :keyword:`yield` will be executed as the -:meth:`__enter__` method, and the value yielded will be the method's return +:meth:`~object.__enter__` method, and the value yielded will be the method's return value that will get bound to the variable in the ':keyword:`with`' statement's :keyword:`!as` clause, if any. The code after the :keyword:`yield` will be -executed in the :meth:`__exit__` method. Any exception raised in the block will +executed in the :meth:`~object.__exit__` method. Any exception raised in the block will be raised by the :keyword:`!yield` statement. Our database example from the previous section could be written using this @@ -1167,10 +1167,10 @@ marked in the following list. * It's now illegal to mix iterating over a file with ``for line in file`` and calling the file object's :meth:`read`/:meth:`readline`/:meth:`readlines` - methods. Iteration uses an internal buffer and the :meth:`read\*` methods + methods. Iteration uses an internal buffer and the :meth:`!read\*` methods don't use that buffer. Instead they would return the data following the buffer, causing the data to appear out of order. Mixing iteration and these - methods will now trigger a :exc:`ValueError` from the :meth:`read\*` method. + methods will now trigger a :exc:`ValueError` from the :meth:`!read\*` method. (Implemented by Thomas Wouters.) .. Patch 1397960 @@ -1222,7 +1222,7 @@ Here's a partial list of the most notable changes, sorted alphabetically by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more complete list of changes, or look through the SVN logs for all the details. -* The :mod:`audioop` module now supports the a-LAW encoding, and the code for +* The :mod:`!audioop` module now supports the a-LAW encoding, and the code for u-LAW encoding has been improved. (Contributed by Lars Immisch.) * The :mod:`codecs` module gained support for incremental codecs. The @@ -1347,7 +1347,7 @@ complete list of changes, or look through the SVN logs for all the details. :func:`input` function to allow opening files in binary or :term:`universal newlines` mode. Another new parameter, *openhook*, lets you use a function other than :func:`open` to open the input files. Once you're iterating over - the set of files, the :class:`FileInput` object's new :meth:`fileno` returns + the set of files, the :class:`FileInput` object's new :meth:`~fileinput.fileno` returns the file descriptor for the currently opened file. (Contributed by Georg Brandl.) @@ -1422,13 +1422,13 @@ complete list of changes, or look through the SVN logs for all the details. (Contributed by Gregory K. Johnson. Funding was provided by Google's 2005 Summer of Code.) -* New module: the :mod:`msilib` module allows creating Microsoft Installer +* New module: the :mod:`!msilib` module allows creating Microsoft Installer :file:`.msi` files and CAB files. Some support for reading the :file:`.msi` database is also included. (Contributed by Martin von Löwis.) -* The :mod:`nis` module now supports accessing domains other than the system - default domain by supplying a *domain* argument to the :func:`nis.match` and - :func:`nis.maps` functions. (Contributed by Ben Bell.) +* The :mod:`!nis` module now supports accessing domains other than the system + default domain by supplying a *domain* argument to the :func:`!nis.match` and + :func:`!nis.maps` functions. (Contributed by Ben Bell.) * The :mod:`operator` module's :func:`itemgetter` and :func:`attrgetter` functions now support multiple fields. A call such as @@ -1478,8 +1478,8 @@ complete list of changes, or look through the SVN logs for all the details. .. Patch 790710 -* The :mod:`pickle` and :mod:`cPickle` modules no longer accept a return value - of ``None`` from the :meth:`__reduce__` method; the method must return a tuple +* The :mod:`pickle` and :mod:`!cPickle` modules no longer accept a return value + of ``None`` from the :meth:`~object.__reduce__` method; the method must return a tuple of arguments instead. The ability to return ``None`` was deprecated in Python 2.4, so this completes the removal of the feature. @@ -1519,7 +1519,7 @@ complete list of changes, or look through the SVN logs for all the details. .. Patch #1472854 -* The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer` classes now have a +* The :mod:`SimpleXMLRPCServer ` and :mod:`DocXMLRPCServer ` classes now have a :attr:`rpc_paths` attribute that constrains XML-RPC operations to a limited set of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``. Setting :attr:`rpc_paths` to ``None`` or an empty tuple disables this path checking. @@ -1542,7 +1542,7 @@ complete list of changes, or look through the SVN logs for all the details. :meth:`getproto` accessor methods to retrieve the family, type, and protocol values for the socket. -* New module: the :mod:`spwd` module provides functions for accessing the shadow +* New module: the :mod:`!spwd` module provides functions for accessing the shadow password database on systems that support shadow passwords. * The :mod:`struct` is now faster because it compiles format strings into @@ -1650,9 +1650,9 @@ complete list of changes, or look through the SVN logs for all the details. .. Patch #754022 -* The :mod:`xmlrpclib` module now supports returning :class:`~datetime.datetime` objects - for the XML-RPC date type. Supply ``use_datetime=True`` to the :func:`loads` - function or the :class:`Unmarshaller` class to enable this feature. (Contributed +* The :mod:`xmlrpclib ` module now supports returning :class:`~datetime.datetime` objects + for the XML-RPC date type. Supply ``use_datetime=True`` to the :func:`~xmlrpc.client.loads` + function or the :class:`!Unmarshaller` class to enable this feature. (Contributed by Skip Montanaro.) .. Patch 1120353 @@ -1680,7 +1680,7 @@ The ctypes package The :mod:`ctypes` package, written by Thomas Heller, has been added to the standard library. :mod:`ctypes` lets you call arbitrary functions in shared -libraries or DLLs. Long-time users may remember the :mod:`dl` module, which +libraries or DLLs. Long-time users may remember the :mod:`!dl` module, which provides functions for loading shared libraries and calling functions in them. The :mod:`ctypes` package is much fancier. @@ -1724,7 +1724,7 @@ attribute of the function object to change this:: :mod:`ctypes` also provides a wrapper for Python's C API as the ``ctypes.pythonapi`` object. This object does *not* release the global interpreter lock before calling a function, because the lock must be held when -calling into the interpreter's code. There's a :class:`py_object()` type +calling into the interpreter's code. There's a :class:`~ctypes.py_object` type constructor that will create a :c:expr:`PyObject *` pointer. A simple usage:: import ctypes @@ -1734,7 +1734,7 @@ constructor that will create a :c:expr:`PyObject *` pointer. A simple usage:: ctypes.py_object("abc"), ctypes.py_object(1)) # d is now {'abc', 1}. -Don't forget to use :class:`py_object()`; if it's omitted you end up with a +Don't forget to use :func:`~ctypes.py_object`; if it's omitted you end up with a segmentation fault. :mod:`ctypes` has been around for a while, but people still write and @@ -1877,12 +1877,12 @@ The hashlib package ------------------- A new :mod:`hashlib` module, written by Gregory P. Smith, has been added to -replace the :mod:`md5` and :mod:`sha` modules. :mod:`hashlib` adds support for +replace the :mod:`!md5` and :mod:`!sha` modules. :mod:`hashlib` adds support for additional secure hashes (SHA-224, SHA-256, SHA-384, and SHA-512). When available, the module uses OpenSSL for fast platform optimized implementations of algorithms. -The old :mod:`md5` and :mod:`sha` modules still exist as wrappers around hashlib +The old :mod:`!md5` and :mod:`!sha` modules still exist as wrappers around hashlib to preserve backwards compatibility. The new module's interface is very close to that of the old modules, but not identical. The most significant difference is that the constructor functions for creating new hashing objects are named @@ -2253,12 +2253,12 @@ code: appeared. In Python 2.5, the argument must be exactly one %char specifier with no surrounding text. -* Library: The :mod:`pickle` and :mod:`cPickle` modules no longer accept a - return value of ``None`` from the :meth:`__reduce__` method; the method must +* Library: The :mod:`pickle` and :mod:`!cPickle` modules no longer accept a + return value of ``None`` from the :meth:`~object.__reduce__` method; the method must return a tuple of arguments instead. The modules also no longer accept the deprecated *bin* keyword parameter. -* Library: The :mod:`SimpleXMLRPCServer` and :mod:`DocXMLRPCServer` classes now +* Library: The :mod:`SimpleXMLRPCServer ` and :mod:`DocXMLRPCServer ` classes now have a :attr:`rpc_paths` attribute that constrains XML-RPC operations to a limited set of URL paths; the default is to allow only ``'/'`` and ``'/RPC2'``. Setting :attr:`rpc_paths` to ``None`` or an empty tuple disables this path diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 96d9b792..fdccfb7d 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -4,8 +4,6 @@ What's New in Python 2.6 **************************** -.. XXX add trademark info for Apple, Microsoft, SourceForge. - :Author: A.M. Kuchling (amk at amk.ca) .. $Id$ @@ -121,14 +119,14 @@ about features that will be removed in Python 3.0. You can run code with this switch to see how much work will be necessary to port code to 3.0. The value of this switch is available to Python code as the boolean variable :data:`sys.py3kwarning`, -and to C extension code as :c:data:`Py_Py3kWarningFlag`. +and to C extension code as :c:data:`!Py_Py3kWarningFlag`. .. seealso:: The 3\ *xxx* series of PEPs, which contains proposals for Python 3.0. :pep:`3000` describes the development process for Python 3.0. Start with :pep:`3100` that describes the general goals for Python - 3.0, and then explore the higher-numbered PEPS that propose + 3.0, and then explore the higher-numbered PEPs that propose specific features. @@ -269,15 +267,15 @@ structure is:: with-block The expression is evaluated, and it should result in an object that supports the -context management protocol (that is, has :meth:`__enter__` and :meth:`__exit__` +context management protocol (that is, has :meth:`~object.__enter__` and :meth:`~object.__exit__` methods). -The object's :meth:`__enter__` is called before *with-block* is executed and +The object's :meth:`~object.__enter__` is called before *with-block* is executed and therefore can run set-up code. It also may return a value that is bound to the name *variable*, if given. (Note carefully that *variable* is *not* assigned the result of *expression*.) -After execution of the *with-block* is finished, the object's :meth:`__exit__` +After execution of the *with-block* is finished, the object's :meth:`~object.__exit__` method is called, even if the block raised an exception, and can therefore run clean-up code. @@ -296,7 +294,7 @@ part-way through the block. .. note:: In this case, *f* is the same object created by :func:`open`, because - :meth:`file.__enter__` returns *self*. + :meth:`~object.__enter__` returns *self*. The :mod:`threading` module's locks and condition variables also support the ':keyword:`with`' statement:: @@ -339,16 +337,16 @@ underlying implementation and should keep reading. A high-level explanation of the context management protocol is: * The expression is evaluated and should result in an object called a "context - manager". The context manager must have :meth:`__enter__` and :meth:`__exit__` + manager". The context manager must have :meth:`~object.__enter__` and :meth:`~object.__exit__` methods. -* The context manager's :meth:`__enter__` method is called. The value returned +* The context manager's :meth:`~object.__enter__` method is called. The value returned is assigned to *VAR*. If no ``as VAR`` clause is present, the value is simply discarded. * The code in *BLOCK* is executed. -* If *BLOCK* raises an exception, the context manager's :meth:`__exit__` method +* If *BLOCK* raises an exception, the context manager's :meth:`~object.__exit__` method is called with three arguments, the exception details (``type, value, traceback``, the same values returned by :func:`sys.exc_info`, which can also be ``None`` if no exception occurred). The method's return value controls whether an exception @@ -357,7 +355,7 @@ A high-level explanation of the context management protocol is: if you do the author of the code containing the ':keyword:`with`' statement will never realize anything went wrong. -* If *BLOCK* didn't raise an exception, the :meth:`__exit__` method is still +* If *BLOCK* didn't raise an exception, the :meth:`~object.__exit__` method is still called, but *type*, *value*, and *traceback* are all ``None``. Let's think through an example. I won't present detailed code but will only @@ -391,7 +389,7 @@ rolled back if there's an exception. Here's the basic interface for def rollback(self): "Rolls back current transaction" -The :meth:`__enter__` method is pretty easy, having only to start a new +The :meth:`~object.__enter__` method is pretty easy, having only to start a new transaction. For this application the resulting cursor object would be a useful result, so the method will return it. The user can then add ``as cursor`` to their ':keyword:`with`' statement to bind the cursor to a variable name. :: @@ -403,7 +401,7 @@ their ':keyword:`with`' statement to bind the cursor to a variable name. :: cursor = self.cursor() return cursor -The :meth:`__exit__` method is the most complicated because it's where most of +The :meth:`~object.__exit__` method is the most complicated because it's where most of the work has to be done. The method has to check if an exception occurred. If there was no exception, the transaction is committed. The transaction is rolled back if there was an exception. @@ -436,10 +434,10 @@ are useful when writing objects for use with the ':keyword:`with`' statement. The decorator is called :func:`contextmanager`, and lets you write a single generator function instead of defining a new class. The generator should yield exactly one value. The code up to the :keyword:`yield` will be executed as the -:meth:`__enter__` method, and the value yielded will be the method's return +:meth:`~object.__enter__` method, and the value yielded will be the method's return value that will get bound to the variable in the ':keyword:`with`' statement's :keyword:`!as` clause, if any. The code after the :keyword:`!yield` will be -executed in the :meth:`__exit__` method. Any exception raised in the block will +executed in the :meth:`~object.__exit__` method. Any exception raised in the block will be raised by the :keyword:`!yield` statement. Using this decorator, our database example from the previous section @@ -504,12 +502,12 @@ Python's :option:`-m` switch allows running a module as a script. When you ran a module that was located inside a package, relative imports didn't work correctly. -The fix for Python 2.6 adds a :attr:`__package__` attribute to -modules. When this attribute is present, relative imports will be +The fix for Python 2.6 adds a :attr:`module.__package__` attribute. +When this attribute is present, relative imports will be relative to the value of this attribute instead of the -:attr:`__name__` attribute. +:attr:`~module.__name__` attribute. -PEP 302-style importers can then set :attr:`__package__` as necessary. +PEP 302-style importers can then set :attr:`~module.__package__` as necessary. The :mod:`runpy` module that implements the :option:`-m` switch now does this, so relative imports will now work correctly in scripts running from inside a package. @@ -875,11 +873,11 @@ The signature of the new function is:: The parameters are: - * *args*: positional arguments whose values will be printed out. - * *sep*: the separator, which will be printed between arguments. - * *end*: the ending text, which will be printed after all of the - arguments have been output. - * *file*: the file object to which the output will be sent. +* *args*: positional arguments whose values will be printed out. +* *sep*: the separator, which will be printed between arguments. +* *end*: the ending text, which will be printed after all of the + arguments have been output. +* *file*: the file object to which the output will be sent. .. seealso:: @@ -1051,8 +1049,6 @@ the :mod:`io` module: sockets, but Python 2.6 hasn't restructured its file and socket objects in this way. - .. XXX should 2.6 register them in io.py? - * :class:`BufferedIOBase` is an abstract base class that buffers data in memory to reduce the number of system calls used, making I/O processing more efficient. @@ -1086,7 +1082,7 @@ the :mod:`io` module: (In Python 2.6, :class:`io.StringIO` is implemented in pure Python, so it's pretty slow. You should therefore stick with the - existing :mod:`StringIO` module or :mod:`cStringIO` for now. At some + existing :mod:`!StringIO` module or :mod:`!cStringIO` for now. At some point Python 3.0's :mod:`io` module will be rewritten into C for speed, and perhaps the C implementation will be backported to the 2.x releases.) @@ -1133,18 +1129,16 @@ while an external caller could be modifying the contents, so there's a corresponding ``PyBuffer_Release(Py_buffer *view)`` to indicate that the external caller is done. -.. XXX PyObject_GetBuffer not documented in c-api - The *flags* argument to :c:func:`PyObject_GetBuffer` specifies constraints upon the memory returned. Some examples are: - * :c:macro:`PyBUF_WRITABLE` indicates that the memory must be writable. +* :c:macro:`PyBUF_WRITABLE` indicates that the memory must be writable. - * :c:macro:`PyBUF_LOCK` requests a read-only or exclusive lock on the memory. +* :c:macro:`PyBUF_LOCK` requests a read-only or exclusive lock on the memory. - * :c:macro:`PyBUF_C_CONTIGUOUS` and :c:macro:`PyBUF_F_CONTIGUOUS` - requests a C-contiguous (last dimension varies the fastest) or - Fortran-contiguous (first dimension varies the fastest) array layout. +* :c:macro:`PyBUF_C_CONTIGUOUS` and :c:macro:`PyBUF_F_CONTIGUOUS` + requests a C-contiguous (last dimension varies the fastest) or + Fortran-contiguous (first dimension varies the fastest) array layout. Two new argument codes for :c:func:`PyArg_ParseTuple`, ``s*`` and ``z*``, return locked buffer objects for a parameter. @@ -1459,7 +1453,7 @@ that will be the numerator and denominator of the resulting fraction. :: Fraction(5, 3) For converting floating-point numbers to rationals, -the float type now has an :meth:`as_integer_ratio()` method that returns +the float type now has an :meth:`as_integer_ratio` method that returns the numerator and denominator for a fraction that evaluates to the same floating-point value:: @@ -1677,8 +1671,9 @@ Some smaller changes made to the core Python language are: (:issue:`1591665`) * Instance method objects have new attributes for the object and function - comprising the method; the new synonym for :attr:`im_self` is - :attr:`__self__`, and :attr:`im_func` is also available as :attr:`__func__`. + comprising the method; the new synonym for :attr:`!im_self` is + :attr:`~method.__self__`, and :attr:`!im_func` is also available as + :attr:`~method.__func__`. The old names are still supported in Python 2.6, but are gone in 3.0. * An obscure change: when you use the :func:`locals` function inside a @@ -1737,7 +1732,7 @@ Optimizations (Contributed by Antoine Pitrou.) Memory usage is reduced by using pymalloc for the Unicode string's data. -* The ``with`` statement now stores the :meth:`__exit__` method on the stack, +* The ``with`` statement now stores the :meth:`~object.__exit__` method on the stack, producing a small speedup. (Implemented by Jeffrey Yasskin.) * To reduce memory usage, the garbage collector will now clear internal @@ -1788,7 +1783,7 @@ changes, sorted alphabetically by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more complete list of changes, or look through the Subversion logs for all the details. -* The :mod:`asyncore` and :mod:`asynchat` modules are +* The :mod:`!asyncore` and :mod:`!asynchat` modules are being actively maintained again, and a number of patches and bugfixes were applied. (Maintained by Josiah Carlson; see :issue:`1736190` for one patch.) @@ -1805,15 +1800,15 @@ changes, or look through the Subversion logs for all the details. available, instead of restricting itself to protocol 1. (Contributed by W. Barnes.) -* The :mod:`cgi` module will now read variables from the query string +* The :mod:`!cgi` module will now read variables from the query string of an HTTP POST request. This makes it possible to use form actions with URLs that include query strings such as "/cgi-bin/add.py?category=1". (Contributed by Alexandre Fiori and Nubis; :issue:`1817`.) The :func:`parse_qs` and :func:`parse_qsl` functions have been - relocated from the :mod:`cgi` module to the :mod:`urlparse` module. - The versions still available in the :mod:`cgi` module will + relocated from the :mod:`!cgi` module to the :mod:`urlparse ` module. + The versions still available in the :mod:`!cgi` module will trigger :exc:`PendingDeprecationWarning` messages in 2.6 (:issue:`600362`). @@ -1900,8 +1895,8 @@ changes, or look through the Subversion logs for all the details. (Contributed by Raymond Hettinger.) -* The :mod:`Cookie` module's :class:`Morsel` objects now support an - :attr:`httponly` attribute. In some browsers. cookies with this attribute +* The :mod:`Cookie ` module's :class:`~http.cookies.Morsel` objects now support an + :attr:`~http.cookies.Morsel.httponly` attribute. In some browsers. cookies with this attribute set cannot be accessed or manipulated by JavaScript code. (Contributed by Arvin Schnell; :issue:`1638033`.) @@ -1992,8 +1987,8 @@ changes, or look through the Subversion logs for all the details. (Contributed by Raymond Hettinger.) * An optional ``timeout`` parameter, specifying a timeout measured in - seconds, was added to the :class:`httplib.HTTPConnection` and - :class:`HTTPSConnection` class constructors. (Added by Facundo + seconds, was added to the :class:`httplib.HTTPConnection ` and + :class:`HTTPSConnection ` class constructors. (Added by Facundo Batista.) * Most of the :mod:`inspect` module's functions, such as @@ -2278,7 +2273,7 @@ changes, or look through the Subversion logs for all the details. (Contributed by Guido van Rossum from work for Google App Engine; :issue:`3487`.) -* The :mod:`rlcompleter` module's :meth:`Completer.complete()` method +* The :mod:`rlcompleter` module's :meth:`Completer.complete` method will now ignore exceptions triggered while evaluating a name. (Fixed by Lorenz Quack; :issue:`2250`.) @@ -2376,10 +2371,10 @@ changes, or look through the Subversion logs for all the details. ``socket(socket.AF_INET, ...)`` may be all that's required to make your code work with IPv6. -* The base classes in the :mod:`SocketServer` module now support - calling a :meth:`handle_timeout` method after a span of inactivity - specified by the server's :attr:`timeout` attribute. (Contributed - by Michael Pomraning.) The :meth:`serve_forever` method +* The base classes in the :mod:`SocketServer ` module now support + calling a :meth:`~socketserver.BaseServer.handle_timeout` method after a span of inactivity + specified by the server's :attr:`~socketserver.BaseServer.timeout` attribute. (Contributed + by Michael Pomraning.) The :meth:`~socketserver.BaseServer.serve_forever` method now takes an optional poll interval measured in seconds, controlling how often the server will check for a shutdown request. (Contributed by Pedro Werneck and Jeffrey Yasskin; @@ -2393,11 +2388,11 @@ changes, or look through the Subversion logs for all the details. using the format character ``'?'``. (Contributed by David Remahl.) -* The :class:`Popen` objects provided by the :mod:`subprocess` module - now have :meth:`terminate`, :meth:`kill`, and :meth:`send_signal` methods. - On Windows, :meth:`send_signal` only supports the :const:`SIGTERM` +* The :class:`~subprocess.Popen` objects provided by the :mod:`subprocess` module + now have :meth:`~subprocess.Popen.terminate`, :meth:`~subprocess.Popen.kill`, and :meth:`~subprocess.Popen.send_signal` methods. + On Windows, :meth:`!send_signal` only supports the :py:const:`~signal.SIGTERM` signal, and all these methods are aliases for the Win32 API function - :c:func:`TerminateProcess`. + :c:func:`!TerminateProcess`. (Contributed by Christian Heimes.) * A new variable in the :mod:`sys` module, :attr:`float_info`, is an @@ -2465,7 +2460,7 @@ changes, or look through the Subversion logs for all the details. (All changes contributed by Lars Gustäbel). * An optional ``timeout`` parameter was added to the - :class:`telnetlib.Telnet` class constructor, specifying a timeout + :class:`!telnetlib.Telnet` class constructor, specifying a timeout measured in seconds. (Added by Facundo Batista.) * The :class:`tempfile.NamedTemporaryFile` class usually deletes @@ -2483,9 +2478,9 @@ changes, or look through the Subversion logs for all the details. ``with tempfile.NamedTemporaryFile() as tmp: ...``. (Contributed by Alexander Belopolsky; :issue:`2021`.) -* The :mod:`test.test_support` module gained a number +* The :mod:`test.test_support ` module gained a number of context managers useful for writing tests. - :func:`EnvironmentVarGuard` is a + :func:`~test.support.os_helper.EnvironmentVarGuard` is a context manager that temporarily changes environment variables and automatically restores them to their old values. @@ -2571,7 +2566,7 @@ changes, or look through the Subversion logs for all the details. :meth:`tracer`, and :meth:`speed` methods. * The ability to set new shapes for the turtle, and to define a new coordinate system. - * Turtles now have an :meth:`undo()` method that can roll back actions. + * Turtles now have an :meth:`undo` method that can roll back actions. * Simple support for reacting to input events such as mouse and keyboard activity, making it possible to write simple games. * A :file:`turtle.cfg` file can be used to customize the starting appearance @@ -2582,9 +2577,9 @@ changes, or look through the Subversion logs for all the details. (:issue:`1513695`) * An optional ``timeout`` parameter was added to the - :func:`urllib.urlopen` function and the + :func:`urllib.urlopen ` function and the :class:`urllib.ftpwrapper` class constructor, as well as the - :func:`urllib2.urlopen` function. The parameter specifies a timeout + :func:`urllib2.urlopen ` function. The parameter specifies a timeout measured in seconds. For example:: >>> u = urllib2.urlopen("http://slow.example.com", @@ -2609,7 +2604,7 @@ changes, or look through the Subversion logs for all the details. intended for testing purposes that lets you temporarily modify the warning filters and then restore their original values (:issue:`3781`). -* The XML-RPC :class:`SimpleXMLRPCServer` and :class:`DocXMLRPCServer` +* The XML-RPC :class:`SimpleXMLRPCServer ` and :class:`DocXMLRPCServer ` classes can now be prevented from immediately opening and binding to their socket by passing ``False`` as the *bind_and_activate* constructor parameter. This can be used to modify the instance's @@ -2626,11 +2621,11 @@ changes, or look through the Subversion logs for all the details. information. (Contributed by Alan McIntyre as part of his project for Google's Summer of Code 2007.) -* The :mod:`xmlrpclib` module no longer automatically converts +* The :mod:`xmlrpclib ` module no longer automatically converts :class:`datetime.date` and :class:`datetime.time` to the - :class:`xmlrpclib.DateTime` type; the conversion semantics were + :class:`xmlrpclib.DateTime ` type; the conversion semantics were not necessarily correct for all applications. Code using - :mod:`xmlrpclib` should convert :class:`date` and :class:`~datetime.time` + :mod:`!xmlrpclib` should convert :class:`date` and :class:`~datetime.time` instances. (:issue:`1330538`) The code can also handle dates before 1900 (contributed by Ralf Schmitt; :issue:`2014`) and 64-bit integers represented by using ```` in XML-RPC responses @@ -2915,8 +2910,8 @@ Deprecations and Removals * Changes to the :class:`Exception` interface as dictated by :pep:`352` continue to be made. For 2.6, - the :attr:`message` attribute is being deprecated in favor of the - :attr:`args` attribute. + the :attr:`!message` attribute is being deprecated in favor of the + :attr:`~BaseException.args` attribute. * (3.0-warning mode) Python 3.0 will feature a reorganized standard library that will drop many outdated modules and rename others. @@ -2924,51 +2919,51 @@ Deprecations and Removals when they are imported. The list of deprecated modules is: - :mod:`audiodev`, - :mod:`bgenlocations`, - :mod:`buildtools`, - :mod:`bundlebuilder`, - :mod:`Canvas`, - :mod:`compiler`, - :mod:`dircache`, - :mod:`dl`, - :mod:`fpformat`, - :mod:`gensuitemodule`, - :mod:`ihooks`, - :mod:`imageop`, - :mod:`imgfile`, - :mod:`linuxaudiodev`, - :mod:`mhlib`, - :mod:`mimetools`, - :mod:`multifile`, - :mod:`new`, - :mod:`pure`, - :mod:`statvfs`, - :mod:`sunaudiodev`, - :mod:`test.testall`, and - :mod:`toaiff`. - -* The :mod:`gopherlib` module has been removed. - -* The :mod:`MimeWriter` module and :mod:`mimify` module + :mod:`!audiodev`, + :mod:`!bgenlocations`, + :mod:`!buildtools`, + :mod:`!bundlebuilder`, + :mod:`!Canvas`, + :mod:`!compiler`, + :mod:`!dircache`, + :mod:`!dl`, + :mod:`!fpformat`, + :mod:`!gensuitemodule`, + :mod:`!ihooks`, + :mod:`!imageop`, + :mod:`!imgfile`, + :mod:`!linuxaudiodev`, + :mod:`!mhlib`, + :mod:`!mimetools`, + :mod:`!multifile`, + :mod:`!new`, + :mod:`!pure`, + :mod:`!statvfs`, + :mod:`!sunaudiodev`, + :mod:`!test.testall`, and + :mod:`!toaiff`. + +* The :mod:`!gopherlib` module has been removed. + +* The :mod:`!MimeWriter` module and :mod:`!mimify` module have been deprecated; use the :mod:`email` package instead. -* The :mod:`md5` module has been deprecated; use the :mod:`hashlib` module +* The :mod:`!md5` module has been deprecated; use the :mod:`hashlib` module instead. -* The :mod:`posixfile` module has been deprecated; :func:`fcntl.lockf` +* The :mod:`!posixfile` module has been deprecated; :func:`fcntl.lockf` provides better locking. -* The :mod:`popen2` module has been deprecated; use the :mod:`subprocess` +* The :mod:`!popen2` module has been deprecated; use the :mod:`subprocess` module. -* The :mod:`rgbimg` module has been removed. +* The :mod:`!rgbimg` module has been removed. -* The :mod:`sets` module has been deprecated; it's better to +* The :mod:`!sets` module has been deprecated; it's better to use the built-in :class:`set` and :class:`frozenset` types. -* The :mod:`sha` module has been deprecated; use the :mod:`hashlib` module +* The :mod:`!sha` module has been deprecated; use the :mod:`hashlib` module instead. @@ -2997,6 +2992,32 @@ Changes to Python's build process and to the C API include: architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both. (Contributed by Ronald Oussoren.) +* A new function added in Python 2.6.6, :c:func:`!PySys_SetArgvEx`, sets + the value of ``sys.argv`` and can optionally update ``sys.path`` to + include the directory containing the script named by ``sys.argv[0]`` + depending on the value of an *updatepath* parameter. + + This function was added to close a security hole for applications + that embed Python. The old function, :c:func:`!PySys_SetArgv`, would + always update ``sys.path``, and sometimes it would add the current + directory. This meant that, if you ran an application embedding + Python in a directory controlled by someone else, attackers could + put a Trojan-horse module in the directory (say, a file named + :file:`os.py`) that your application would then import and run. + + If you maintain a C/C++ application that embeds Python, check + whether you're calling :c:func:`!PySys_SetArgv` and carefully consider + whether the application should be using :c:func:`!PySys_SetArgvEx` + with *updatepath* set to false. Note that using this function will + break compatibility with Python versions 2.6.5 and earlier; if you + have to continue working with earlier versions, you can leave + the call to :c:func:`!PySys_SetArgv` alone and call + ``PyRun_SimpleString("sys.path.pop(0)\n")`` afterwards to discard + the first ``sys.path`` component. + + Security issue reported as :cve:`2008-5983`; + discussed in :gh:`50003`, and fixed by Antoine Pitrou. + * The BerkeleyDB module now has a C API object, available as ``bsddb.db.api``. This object can be used by other C extensions that wish to use the :mod:`bsddb` module for their own purposes. @@ -3030,7 +3051,7 @@ Changes to Python's build process and to the C API include: * Several functions return information about the platform's floating-point support. :c:func:`PyFloat_GetMax` returns - the maximum representable floating point value, + the maximum representable floating-point value, and :c:func:`PyFloat_GetMin` returns the minimum positive value. :c:func:`PyFloat_GetInfo` returns an object containing more information from the :file:`float.h` file, such as @@ -3109,8 +3130,8 @@ Port-Specific Changes: Windows * The :mod:`msvcrt` module now supports both the normal and wide char variants of the console I/O - API. The :func:`getwch` function reads a keypress and returns a Unicode - value, as does the :func:`getwche` function. The :func:`putwch` function + API. The :func:`~msvcrt.getwch` function reads a keypress and returns a Unicode + value, as does the :func:`~msvcrt.getwche` function. The :func:`~msvcrt.putwch` function takes a Unicode character and writes it to the console. (Contributed by Christian Heimes.) @@ -3119,24 +3140,24 @@ Port-Specific Changes: Windows directory path. (Contributed by Josiah Carlson; :issue:`957650`.) * The :mod:`socket` module's socket objects now have an - :meth:`ioctl` method that provides a limited interface to the + :meth:`~socket.socket.ioctl` method that provides a limited interface to the :c:func:`WSAIoctl` system interface. -* The :mod:`_winreg` module now has a function, - :func:`ExpandEnvironmentStrings`, +* The :mod:`_winreg ` module now has a function, + :func:`~winreg.ExpandEnvironmentStrings`, that expands environment variable references such as ``%NAME%`` in an input string. The handle objects provided by this module now support the context protocol, so they can be used in :keyword:`with` statements. (Contributed by Christian Heimes.) - :mod:`_winreg` also has better support for x64 systems, - exposing the :func:`DisableReflectionKey`, :func:`EnableReflectionKey`, - and :func:`QueryReflectionKey` functions, which enable and disable + :mod:`_winreg ` also has better support for x64 systems, + exposing the :func:`~winreg.DisableReflectionKey`, :func:`~winreg.EnableReflectionKey`, + and :func:`~winreg.QueryReflectionKey` functions, which enable and disable registry reflection for 32-bit processes running on 64-bit systems. (:issue:`1753245`) -* The :mod:`msilib` module's :class:`Record` object - gained :meth:`GetInteger` and :meth:`GetString` methods that +* The :mod:`!msilib` module's :class:`!Record` object + gained :meth:`!GetInteger` and :meth:`!GetString` methods that return field values as an integer or a string. (Contributed by Floris Bruynooghe; :issue:`2125`.) @@ -3150,49 +3171,49 @@ Port-Specific Changes: Mac OS X :option:`!--with-framework-name=` option to the :program:`configure` script. -* The :mod:`macfs` module has been removed. This in turn required the - :func:`macostools.touched` function to be removed because it depended on the - :mod:`macfs` module. (:issue:`1490190`) +* The :mod:`!macfs` module has been removed. This in turn required the + :func:`!macostools.touched` function to be removed because it depended on the + :mod:`!macfs` module. (:issue:`1490190`) * Many other Mac OS modules have been deprecated and will be removed in Python 3.0: - :mod:`_builtinSuites`, - :mod:`aepack`, - :mod:`aetools`, - :mod:`aetypes`, - :mod:`applesingle`, - :mod:`appletrawmain`, - :mod:`appletrunner`, - :mod:`argvemulator`, - :mod:`Audio_mac`, - :mod:`autoGIL`, - :mod:`Carbon`, - :mod:`cfmfile`, - :mod:`CodeWarrior`, - :mod:`ColorPicker`, - :mod:`EasyDialogs`, - :mod:`Explorer`, - :mod:`Finder`, - :mod:`FrameWork`, - :mod:`findertools`, - :mod:`ic`, - :mod:`icglue`, - :mod:`icopen`, - :mod:`macerrors`, - :mod:`MacOS`, - :mod:`macfs`, - :mod:`macostools`, - :mod:`macresource`, - :mod:`MiniAEFrame`, - :mod:`Nav`, - :mod:`Netscape`, - :mod:`OSATerminology`, - :mod:`pimp`, - :mod:`PixMapWrapper`, - :mod:`StdSuites`, - :mod:`SystemEvents`, - :mod:`Terminal`, and - :mod:`terminalcommand`. + :mod:`!_builtinSuites`, + :mod:`!aepack`, + :mod:`!aetools`, + :mod:`!aetypes`, + :mod:`!applesingle`, + :mod:`!appletrawmain`, + :mod:`!appletrunner`, + :mod:`!argvemulator`, + :mod:`!Audio_mac`, + :mod:`!autoGIL`, + :mod:`!Carbon`, + :mod:`!cfmfile`, + :mod:`!CodeWarrior`, + :mod:`!ColorPicker`, + :mod:`!EasyDialogs`, + :mod:`!Explorer`, + :mod:`!Finder`, + :mod:`!FrameWork`, + :mod:`!findertools`, + :mod:`!ic`, + :mod:`!icglue`, + :mod:`!icopen`, + :mod:`!macerrors`, + :mod:`!MacOS`, + :mod:`!macfs`, + :mod:`!macostools`, + :mod:`!macresource`, + :mod:`!MiniAEFrame`, + :mod:`!Nav`, + :mod:`!Netscape`, + :mod:`!OSATerminology`, + :mod:`!pimp`, + :mod:`!PixMapWrapper`, + :mod:`!StdSuites`, + :mod:`!SystemEvents`, + :mod:`!Terminal`, and + :mod:`!terminalcommand`. .. ====================================================================== @@ -3201,29 +3222,29 @@ Port-Specific Changes: IRIX A number of old IRIX-specific modules were deprecated and will be removed in Python 3.0: -:mod:`al` and :mod:`AL`, -:mod:`cd`, -:mod:`cddb`, -:mod:`cdplayer`, -:mod:`CL` and :mod:`cl`, -:mod:`DEVICE`, -:mod:`ERRNO`, -:mod:`FILE`, -:mod:`FL` and :mod:`fl`, -:mod:`flp`, -:mod:`fm`, -:mod:`GET`, -:mod:`GLWS`, -:mod:`GL` and :mod:`gl`, -:mod:`IN`, -:mod:`IOCTL`, -:mod:`jpeg`, -:mod:`panelparser`, -:mod:`readcd`, -:mod:`SV` and :mod:`sv`, -:mod:`torgb`, -:mod:`videoreader`, and -:mod:`WAIT`. +:mod:`!al` and :mod:`!AL`, +:mod:`!cd`, +:mod:`!cddb`, +:mod:`!cdplayer`, +:mod:`!CL` and :mod:`!cl`, +:mod:`!DEVICE`, +:mod:`!ERRNO`, +:mod:`!FILE`, +:mod:`!FL` and :mod:`!fl`, +:mod:`!flp`, +:mod:`!fm`, +:mod:`!GET`, +:mod:`!GLWS`, +:mod:`!GL` and :mod:`!gl`, +:mod:`!IN`, +:mod:`!IOCTL`, +:mod:`!jpeg`, +:mod:`!panelparser`, +:mod:`!readcd`, +:mod:`!SV` and :mod:`!sv`, +:mod:`!torgb`, +:mod:`!videoreader`, and +:mod:`!WAIT`. .. ====================================================================== @@ -3279,11 +3300,11 @@ that may require changes to your code: :exc:`StandardError` but now it is, through :exc:`IOError`. (Implemented by Gregory P. Smith; :issue:`1706815`.) -* The :mod:`xmlrpclib` module no longer automatically converts +* The :mod:`xmlrpclib ` module no longer automatically converts :class:`datetime.date` and :class:`datetime.time` to the - :class:`xmlrpclib.DateTime` type; the conversion semantics were + :class:`xmlrpclib.DateTime ` type; the conversion semantics were not necessarily correct for all applications. Code using - :mod:`xmlrpclib` should convert :class:`date` and :class:`~datetime.time` + :mod:`!xmlrpclib` should convert :class:`date` and :class:`~datetime.time` instances. (:issue:`1330538`) * (3.0-warning mode) The :class:`Exception` class now warns @@ -3299,6 +3320,15 @@ that may require changes to your code: scoping rules, also cause warnings because such comparisons are forbidden entirely in 3.0. +For applications that embed Python: + +* The :c:func:`!PySys_SetArgvEx` function was added in Python 2.6.6, + letting applications close a security hole when the existing + :c:func:`!PySys_SetArgv` function was used. Check whether you're + calling :c:func:`!PySys_SetArgv` and carefully consider whether the + application should be using :c:func:`!PySys_SetArgvEx` with + *updatepath* set to false. + .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index eda6c8be..0e4dee0b 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -196,7 +196,7 @@ A partial list of 3.1 features that were backported to 2.7: Other new Python3-mode warnings include: -* :func:`operator.isCallable` and :func:`operator.sequenceIncludes`, +* :func:`!operator.isCallable` and :func:`!operator.sequenceIncludes`, which are not supported in 3.x, now trigger warnings. * The :option:`!-3` switch now automatically enables the :option:`!-Qwarn` switch that causes warnings @@ -282,16 +282,16 @@ How does the :class:`~collections.OrderedDict` work? It maintains a doubly linked list of keys, appending new keys to the list as they're inserted. A secondary dictionary maps keys to their corresponding list node, so deletion doesn't have to traverse the entire linked list and therefore -remains O(1). +remains *O*\ (1). The standard library now supports use of ordered dictionaries in several modules. -* The :mod:`ConfigParser` module uses them by default, meaning that +* The :mod:`ConfigParser ` module uses them by default, meaning that configuration files can now be read, modified, and then written back in their original order. -* The :meth:`~collections.somenamedtuple._asdict()` method for +* The :meth:`~collections.somenamedtuple._asdict` method for :func:`collections.namedtuple` now returns an ordered dictionary with the values appearing in the same order as the underlying tuple indices. @@ -455,11 +455,11 @@ a varying number of handlers. All this flexibility can require a lot of configuration. You can write Python statements to create objects and set their properties, but a complex set-up requires verbose but boring code. -:mod:`logging` also supports a :func:`~logging.fileConfig` +:mod:`logging` also supports a :func:`~logging.config.fileConfig` function that parses a file, but the file format doesn't support configuring filters, and it's messier to generate programmatically. -Python 2.7 adds a :func:`~logging.dictConfig` function that +Python 2.7 adds a :func:`~logging.config.dictConfig` function that uses a dictionary to configure logging. There are many ways to produce a dictionary from different sources: construct one with code; parse a file containing JSON; or use a YAML parsing library if one is @@ -533,7 +533,7 @@ implemented by Vinay Sajip, are: ``getLogger('app.network.listen')``. * The :class:`~logging.LoggerAdapter` class gained an - :meth:`~logging.LoggerAdapter.isEnabledFor` method that takes a + :meth:`~logging.Logger.isEnabledFor` method that takes a *level* and returns whether the underlying logger would process a message of that level of importance. @@ -554,8 +554,8 @@ called a :dfn:`view` instead of a fully materialized list. It's not possible to change the return values of :meth:`~dict.keys`, :meth:`~dict.values`, and :meth:`~dict.items` in Python 2.7 because too much code would break. Instead the 3.x versions were added -under the new names :meth:`~dict.viewkeys`, :meth:`~dict.viewvalues`, -and :meth:`~dict.viewitems`. +under the new names :meth:`!viewkeys`, :meth:`!viewvalues`, +and :meth:`!viewitems`. :: @@ -720,7 +720,7 @@ Some smaller changes made to the core Python language are: with B() as b: ... suite of statements ... - The :func:`contextlib.nested` function provides a very similar + The :func:`!contextlib.nested` function provides a very similar function, so it's no longer necessary and has been deprecated. (Proposed in https://codereview.appspot.com/53094; implemented by @@ -785,7 +785,7 @@ Some smaller changes made to the core Python language are: implemented by Mark Dickinson; :issue:`1811`.) * Implicit coercion for complex numbers has been removed; the interpreter - will no longer ever attempt to call a :meth:`__coerce__` method on complex + will no longer ever attempt to call a :meth:`!__coerce__` method on complex objects. (Removed by Meador Inge and Mark Dickinson; :issue:`5211`.) * The :meth:`str.format` method now supports automatic numbering of the replacement @@ -817,7 +817,7 @@ Some smaller changes made to the core Python language are: A low-level change: the :meth:`object.__format__` method now triggers a :exc:`PendingDeprecationWarning` if it's passed a format string, - because the :meth:`__format__` method for :class:`object` converts + because the :meth:`!__format__` method for :class:`object` converts the object to a string representation and formats that. Previously the method silently applied the format string to the string representation, but that could hide mistakes in Python code. If @@ -825,7 +825,7 @@ Some smaller changes made to the core Python language are: precision, presumably you're expecting the formatting to be applied in some object-specific way. (Fixed by Eric Smith; :issue:`7994`.) -* The :func:`int` and :func:`long` types gained a ``bit_length`` +* The :func:`int` and :func:`!long` types gained a ``bit_length`` method that returns the number of bits necessary to represent its argument in binary:: @@ -848,8 +848,8 @@ Some smaller changes made to the core Python language are: statements that were only working by accident. (Fixed by Meador Inge; :issue:`7902`.) -* It's now possible for a subclass of the built-in :class:`unicode` type - to override the :meth:`__unicode__` method. (Implemented by +* It's now possible for a subclass of the built-in :class:`!unicode` type + to override the :meth:`!__unicode__` method. (Implemented by Victor Stinner; :issue:`1583863`.) * The :class:`bytearray` type's :meth:`~bytearray.translate` method now accepts @@ -858,9 +858,11 @@ Some smaller changes made to the core Python language are: .. XXX bytearray doesn't seem to be documented -* When using ``@classmethod`` and ``@staticmethod`` to wrap +* When using :class:`@classmethod ` and + :class:`@staticmethod ` to wrap methods as class or static methods, the wrapper object now - exposes the wrapped function as their :attr:`__func__` attribute. + exposes the wrapped function as their :attr:`~method.__func__` + attribute. (Contributed by Amaury Forgeot d'Arc, after a suggestion by George Sakkis; :issue:`5982`.) @@ -874,7 +876,7 @@ Some smaller changes made to the core Python language are: Forgeot d'Arc in :issue:`1616979`; CP858 contributed by Tim Hatch in :issue:`8016`.) -* The :class:`file` object will now set the :attr:`filename` attribute +* The :class:`!file` object will now set the :attr:`!filename` attribute on the :exc:`IOError` exception when trying to open a directory on POSIX platforms (noted by Jan Kaliszewski; :issue:`4764`), and now explicitly checks for and forbids writing to read-only file objects @@ -913,7 +915,7 @@ used with the :option:`-W` switch, separated by commas. (Contributed by Brian Curtin; :issue:`7301`.) For example, the following setting will print warnings every time -they occur, but turn warnings from the :mod:`Cookie` module into an +they occur, but turn warnings from the :mod:`Cookie ` module into an error. (The exact syntax for setting an environment variable varies across operating systems and shells.) @@ -930,8 +932,8 @@ Optimizations Several performance enhancements have been added: * A new opcode was added to perform the initial setup for - :keyword:`with` statements, looking up the :meth:`__enter__` and - :meth:`__exit__` methods. (Contributed by Benjamin Peterson.) + :keyword:`with` statements, looking up the :meth:`~object.__enter__` and + :meth:`~object.__exit__` methods. (Contributed by Benjamin Peterson.) * The garbage collector now performs better for one common usage pattern: when many objects are being allocated without deallocating @@ -964,7 +966,7 @@ Several performance enhancements have been added: Apart from the performance improvements this change should be invisible to end users, with one exception: for testing and - debugging purposes there's a new structseq :data:`sys.long_info` that + debugging purposes there's a new structseq :data:`!sys.long_info` that provides information about the internal format, giving the number of bits per digit and the size in bytes of the C type used to store each digit:: @@ -1003,19 +1005,19 @@ Several performance enhancements have been added: conversion function that supports arbitrary bases. (Patch by Gawain Bolton; :issue:`6713`.) -* The :meth:`split`, :meth:`replace`, :meth:`rindex`, - :meth:`rpartition`, and :meth:`rsplit` methods of string-like types +* The :meth:`!split`, :meth:`!replace`, :meth:`!rindex`, + :meth:`!rpartition`, and :meth:`!rsplit` methods of string-like types (strings, Unicode strings, and :class:`bytearray` objects) now use a fast reverse-search algorithm instead of a character-by-character scan. This is sometimes faster by a factor of 10. (Added by Florent Xicluna; :issue:`7462` and :issue:`7622`.) -* The :mod:`pickle` and :mod:`cPickle` modules now automatically +* The :mod:`pickle` and :mod:`!cPickle` modules now automatically intern the strings used for attribute names, reducing memory usage of the objects resulting from unpickling. (Contributed by Jake McGuire; :issue:`5084`.) -* The :mod:`cPickle` module now special-cases dictionaries, +* The :mod:`!cPickle` module now special-cases dictionaries, nearly halving the time required to pickle them. (Contributed by Collin Winter; :issue:`5670`.) @@ -1042,7 +1044,7 @@ changes, or look through the Subversion logs for all the details. used with :class:`memoryview` instances and other similar buffer objects. (Backported from 3.x by Florent Xicluna; :issue:`7703`.) -* Updated module: the :mod:`bsddb` module has been updated from 4.7.2devel9 +* Updated module: the :mod:`!bsddb` module has been updated from 4.7.2devel9 to version 4.8.4 of `the pybsddb package `__. The new version features better Python 3.x compatibility, various bug fixes, @@ -1127,12 +1129,12 @@ changes, or look through the Subversion logs for all the details. (Added by Raymond Hettinger; :issue:`1818`.) - Finally, the :class:`~collections.Mapping` abstract base class now - returns :const:`NotImplemented` if a mapping is compared to + Finally, the :class:`~collections.abc.Mapping` abstract base class now + returns :data:`NotImplemented` if a mapping is compared to another type that isn't a :class:`Mapping`. (Fixed by Daniel Stutzbach; :issue:`8729`.) -* Constructors for the parsing classes in the :mod:`ConfigParser` module now +* Constructors for the parsing classes in the :mod:`ConfigParser ` module now take an *allow_no_value* parameter, defaulting to false; if true, options without values will be allowed. For example:: @@ -1156,12 +1158,12 @@ changes, or look through the Subversion logs for all the details. (Contributed by Mats Kindahl; :issue:`7005`.) -* Deprecated function: :func:`contextlib.nested`, which allows +* Deprecated function: :func:`!contextlib.nested`, which allows handling more than one context manager with a single :keyword:`with` statement, has been deprecated, because the :keyword:`!with` statement now supports multiple context managers. -* The :mod:`cookielib` module now ignores cookies that have an invalid +* The :mod:`cookielib ` module now ignores cookies that have an invalid version field, one that doesn't contain an integer value. (Fixed by John J. Lee; :issue:`3924`.) @@ -1182,7 +1184,7 @@ changes, or look through the Subversion logs for all the details. * New method: the :class:`~decimal.Decimal` class gained a :meth:`~decimal.Decimal.from_float` class method that performs an exact - conversion of a floating-point number to a :class:`~decimal.Decimal`. + conversion of a floating-point number to a :class:`!Decimal`. This exact conversion strives for the closest decimal approximation to the floating-point representation's value; the resulting decimal value will therefore still include the inaccuracy, @@ -1196,9 +1198,9 @@ changes, or look through the Subversion logs for all the details. of the operands. Previously such comparisons would fall back to Python's default rules for comparing objects, which produced arbitrary results based on their type. Note that you still cannot combine - :class:`Decimal` and floating-point in other operations such as addition, + :class:`!Decimal` and floating point in other operations such as addition, since you should be explicitly choosing how to convert between float and - :class:`~decimal.Decimal`. (Fixed by Mark Dickinson; :issue:`2531`.) + :class:`!Decimal`. (Fixed by Mark Dickinson; :issue:`2531`.) The constructor for :class:`~decimal.Decimal` now accepts floating-point numbers (added by Raymond Hettinger; :issue:`8257`) @@ -1216,7 +1218,7 @@ changes, or look through the Subversion logs for all the details. more sensible for numeric types. (Changed by Mark Dickinson; :issue:`6857`.) Comparisons involving a signaling NaN value (or ``sNAN``) now signal - :const:`InvalidOperation` instead of silently returning a true or + :const:`~decimal.InvalidOperation` instead of silently returning a true or false value depending on the comparison operator. Quiet NaN values (or ``NaN``) are now hashable. (Fixed by Mark Dickinson; :issue:`7279`.) @@ -1233,13 +1235,13 @@ changes, or look through the Subversion logs for all the details. created some new files that should be included. (Fixed by Tarek Ziadé; :issue:`8688`.) -* The :mod:`doctest` module's :const:`IGNORE_EXCEPTION_DETAIL` flag +* The :mod:`doctest` module's :const:`~doctest.IGNORE_EXCEPTION_DETAIL` flag will now ignore the name of the module containing the exception being tested. (Patch by Lennart Regebro; :issue:`7490`.) * The :mod:`email` module's :class:`~email.message.Message` class will now accept a Unicode-valued payload, automatically converting the - payload to the encoding specified by :attr:`output_charset`. + payload to the encoding specified by :attr:`!output_charset`. (Added by R. David Murray; :issue:`1368247`.) * The :class:`~fractions.Fraction` class now accepts a single float or @@ -1266,10 +1268,10 @@ changes, or look through the Subversion logs for all the details. :issue:`6845`.) * New class decorator: :func:`~functools.total_ordering` in the :mod:`functools` - module takes a class that defines an :meth:`__eq__` method and one of - :meth:`__lt__`, :meth:`__le__`, :meth:`__gt__`, or :meth:`__ge__`, + module takes a class that defines an :meth:`~object.__eq__` method and one of + :meth:`~object.__lt__`, :meth:`~object.__le__`, :meth:`~object.__gt__`, or :meth:`~object.__ge__`, and generates the missing comparison methods. Since the - :meth:`__cmp__` method is being deprecated in Python 3.x, + :meth:`!__cmp__` method is being deprecated in Python 3.x, this decorator makes it easier to define ordered classes. (Added by Raymond Hettinger; :issue:`5479`.) @@ -1298,24 +1300,24 @@ changes, or look through the Subversion logs for all the details. :mod:`gzip` module will now consume these trailing bytes. (Fixed by Tadek Pietraszek and Brian Curtin; :issue:`2846`.) -* New attribute: the :mod:`hashlib` module now has an :attr:`~hashlib.hashlib.algorithms` +* New attribute: the :mod:`hashlib` module now has an :attr:`!algorithms` attribute containing a tuple naming the supported algorithms. In Python 2.7, ``hashlib.algorithms`` contains ``('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')``. (Contributed by Carl Chenet; :issue:`7418`.) -* The default :class:`~httplib.HTTPResponse` class used by the :mod:`httplib` module now +* The default :class:`~http.client.HTTPResponse` class used by the :mod:`httplib ` module now supports buffering, resulting in much faster reading of HTTP responses. (Contributed by Kristján Valur Jónsson; :issue:`4879`.) - The :class:`~httplib.HTTPConnection` and :class:`~httplib.HTTPSConnection` classes + The :class:`~http.client.HTTPConnection` and :class:`~http.client.HTTPSConnection` classes now support a *source_address* parameter, a ``(host, port)`` 2-tuple giving the source address that will be used for the connection. (Contributed by Eldon Ziegler; :issue:`3972`.) -* The :mod:`ihooks` module now supports relative imports. Note that - :mod:`ihooks` is an older module for customizing imports, - superseded by the :mod:`imputil` module added in Python 2.0. +* The :mod:`!ihooks` module now supports relative imports. Note that + :mod:`!ihooks` is an older module for customizing imports, + superseded by the :mod:`!imputil` module added in Python 2.0. (Relative import support added by Neil Schemenauer.) .. revision 75423 @@ -1346,10 +1348,10 @@ changes, or look through the Subversion logs for all the details. * Updated module: The :mod:`io` library has been upgraded to the version shipped with Python 3.1. For 3.1, the I/O library was entirely rewritten in C and is 2 to 20 times faster depending on the task being performed. The - original Python version was renamed to the :mod:`_pyio` module. + original Python version was renamed to the :mod:`!_pyio` module. One minor resulting change: the :class:`io.TextIOBase` class now - has an :attr:`errors` attribute giving the error setting + has an :attr:`~io.TextIOBase.errors` attribute giving the error setting used for encoding and decoding errors (one of ``'strict'``, ``'replace'``, ``'ignore'``). @@ -1415,21 +1417,21 @@ changes, or look through the Subversion logs for all the details. :func:`~math.lgamma` for the natural log of the Gamma function. (Contributed by Mark Dickinson and nirinA raseliarison; :issue:`3366`.) -* The :mod:`multiprocessing` module's :class:`Manager*` classes +* The :mod:`multiprocessing` module's :class:`!Manager*` classes can now be passed a callable that will be called whenever a subprocess is started, along with a set of arguments that will be passed to the callable. (Contributed by lekma; :issue:`5585`.) - The :class:`~multiprocessing.Pool` class, which controls a pool of worker processes, + The :class:`~multiprocessing.pool.Pool` class, which controls a pool of worker processes, now has an optional *maxtasksperchild* parameter. Worker processes will perform the specified number of tasks and then exit, causing the - :class:`~multiprocessing.Pool` to start a new worker. This is useful if tasks may leak + :class:`!Pool` to start a new worker. This is useful if tasks may leak memory or other resources, or if some tasks will cause the worker to become very large. (Contributed by Charles Cazabon; :issue:`6963`.) -* The :mod:`nntplib` module now supports IPv6 addresses. +* The :mod:`!nntplib` module now supports IPv6 addresses. (Contributed by Derek Morr; :issue:`1664`.) * New functions: the :mod:`os` module wraps the following POSIX system @@ -1496,7 +1498,7 @@ changes, or look through the Subversion logs for all the details. global site-packages directories, :func:`~site.getusersitepackages` returns the path of the user's site-packages directory, and - :func:`~site.getuserbase` returns the value of the :envvar:`USER_BASE` + :func:`~site.getuserbase` returns the value of the :data:`~site.USER_BASE` environment variable, giving the path to a directory that can be used to store data. (Contributed by Tarek Ziadé; :issue:`6693`.) @@ -1516,16 +1518,16 @@ changes, or look through the Subversion logs for all the details. the :class:`bytearray` and :class:`memoryview` objects. (Implemented by Antoine Pitrou; :issue:`8104`.) -* The :mod:`SocketServer` module's :class:`~SocketServer.TCPServer` class now +* The :mod:`SocketServer ` module's :class:`~socketserver.TCPServer` class now supports socket timeouts and disabling the Nagle algorithm. - The :attr:`~SocketServer.TCPServer.disable_nagle_algorithm` class attribute + The :attr:`!disable_nagle_algorithm` class attribute defaults to ``False``; if overridden to be true, new request connections will have the TCP_NODELAY option set to prevent buffering many small sends into a single TCP packet. - The :attr:`~SocketServer.BaseServer.timeout` class attribute can hold + The :attr:`~socketserver.BaseServer.timeout` class attribute can hold a timeout in seconds that will be applied to the request socket; if - no request is received within that time, :meth:`~SocketServer.BaseServer.handle_timeout` - will be called and :meth:`~SocketServer.BaseServer.handle_request` will return. + no request is received within that time, :meth:`~socketserver.BaseServer.handle_timeout` + will be called and :meth:`~socketserver.BaseServer.handle_request` will return. (Contributed by Kristján Valur Jónsson; :issue:`6192` and :issue:`6267`.) * Updated module: the :mod:`sqlite3` module has been updated to @@ -1538,15 +1540,15 @@ changes, or look through the Subversion logs for all the details. * The :mod:`ssl` module's :class:`~ssl.SSLSocket` objects now support the buffer API, which fixed a test suite failure (fix by Antoine Pitrou; :issue:`7133`) and automatically set - OpenSSL's :c:macro:`SSL_MODE_AUTO_RETRY`, which will prevent an error + OpenSSL's :c:macro:`!SSL_MODE_AUTO_RETRY`, which will prevent an error code being returned from :meth:`recv` operations that trigger an SSL renegotiation (fix by Antoine Pitrou; :issue:`8222`). - The :func:`ssl.wrap_socket` constructor function now takes a + The :func:`~ssl.SSLContext.wrap_socket` constructor function now takes a *ciphers* argument that's a string listing the encryption algorithms to be allowed; the format of the string is described `in the OpenSSL documentation - `__. + `__. (Added by Antoine Pitrou; :issue:`8322`.) Another change makes the extension load all of OpenSSL's ciphers and @@ -1566,8 +1568,8 @@ changes, or look through the Subversion logs for all the details. code (one of ``bBhHiIlLqQ``); it now always raises a :exc:`struct.error` exception. (Changed by Mark Dickinson; :issue:`1523`.) The :func:`~struct.pack` function will also - attempt to use :meth:`__index__` to convert and pack non-integers - before trying the :meth:`__int__` method or reporting an error. + attempt to use :meth:`~object.__index__` to convert and pack non-integers + before trying the :meth:`~object.__int__` method or reporting an error. (Changed by Mark Dickinson; :issue:`8300`.) * New function: the :mod:`subprocess` module's @@ -1588,7 +1590,7 @@ changes, or look through the Subversion logs for all the details. (Contributed by Gregory P. Smith.) The :mod:`subprocess` module will now retry its internal system calls - on receiving an :const:`EINTR` signal. (Reported by several people; final + on receiving an :const:`~errno.EINTR` signal. (Reported by several people; final patch by Gregory P. Smith in :issue:`1068268`.) * New function: :func:`~symtable.Symbol.is_declared_global` in the :mod:`symtable` module @@ -1600,16 +1602,16 @@ changes, or look through the Subversion logs for all the details. identifier instead of the previous default value of ``'python'``. (Changed by Sean Reifschneider; :issue:`8451`.) -* The ``sys.version_info`` value is now a named tuple, with attributes - named :attr:`major`, :attr:`minor`, :attr:`micro`, - :attr:`releaselevel`, and :attr:`serial`. (Contributed by Ross +* The :attr:`sys.version_info` value is now a named tuple, with attributes + named :attr:`!major`, :attr:`!minor`, :attr:`!micro`, + :attr:`!releaselevel`, and :attr:`!serial`. (Contributed by Ross Light; :issue:`4285`.) :func:`sys.getwindowsversion` also returns a named tuple, - with attributes named :attr:`major`, :attr:`minor`, :attr:`build`, - :attr:`platform`, :attr:`service_pack`, :attr:`service_pack_major`, - :attr:`service_pack_minor`, :attr:`suite_mask`, and - :attr:`product_type`. (Contributed by Brian Curtin; :issue:`7766`.) + with attributes named :attr:`!major`, :attr:`!minor`, :attr:`!build`, + :attr:`!platform`, :attr:`!service_pack`, :attr:`!service_pack_major`, + :attr:`!service_pack_minor`, :attr:`!suite_mask`, and + :attr:`!product_type`. (Contributed by Brian Curtin; :issue:`7766`.) * The :mod:`tarfile` module's default error handling has changed, to no longer suppress fatal errors. The default error level was previously 0, @@ -1646,7 +1648,7 @@ changes, or look through the Subversion logs for all the details. and has been updated to version 5.2.0 (updated by Florent Xicluna; :issue:`8024`). -* The :mod:`urlparse` module's :func:`~urlparse.urlsplit` now handles +* The :mod:`urlparse ` module's :func:`~urllib.parse.urlsplit` now handles unknown URL schemes in a fashion compliant with :rfc:`3986`: if the URL is of the form ``"://..."``, the text before the ``://`` is treated as the scheme, even if it's a made-up scheme that @@ -1673,7 +1675,7 @@ changes, or look through the Subversion logs for all the details. (Python 2.7 actually produces slightly different output, since it returns a named tuple instead of a standard tuple.) - The :mod:`urlparse` module also supports IPv6 literal addresses as defined by + The :mod:`urlparse ` module also supports IPv6 literal addresses as defined by :rfc:`2732` (contributed by Senthil Kumaran; :issue:`2987`). .. doctest:: @@ -1689,18 +1691,18 @@ changes, or look through the Subversion logs for all the details. (Originally implemented in Python 3.x by Raymond Hettinger, and backported to 2.7 by Michael Foord.) -* The ElementTree library, :mod:`xml.etree`, no longer escapes +* The :mod:`xml.etree.ElementTree` library, no longer escapes ampersands and angle brackets when outputting an XML processing instruction (which looks like ````) or comment (which looks like ````). (Patch by Neil Muller; :issue:`2746`.) -* The XML-RPC client and server, provided by the :mod:`xmlrpclib` and - :mod:`SimpleXMLRPCServer` modules, have improved performance by +* The XML-RPC client and server, provided by the :mod:`xmlrpclib ` and + :mod:`SimpleXMLRPCServer ` modules, have improved performance by supporting HTTP/1.1 keep-alive and by optionally using gzip encoding to compress the XML being exchanged. The gzip compression is - controlled by the :attr:`encode_threshold` attribute of - :class:`SimpleXMLRPCRequestHandler`, which contains a size in bytes; + controlled by the :attr:`!encode_threshold` attribute of + :class:`~xmlrpc.server.SimpleXMLRPCRequestHandler`, which contains a size in bytes; responses larger than this will be compressed. (Contributed by Kristján Valur Jónsson; :issue:`6267`.) @@ -1711,7 +1713,8 @@ changes, or look through the Subversion logs for all the details. :mod:`zipfile` now also supports archiving empty directories and extracts them correctly. (Fixed by Kuba Wieczorek; :issue:`4710`.) Reading files out of an archive is faster, and interleaving - :meth:`~zipfile.ZipFile.read` and :meth:`~zipfile.ZipFile.readline` now works correctly. + :meth:`read() ` and + :meth:`readline() ` now works correctly. (Contributed by Nir Aides; :issue:`7610`.) The :func:`~zipfile.is_zipfile` function now @@ -1735,7 +1738,7 @@ New module: importlib Python 3.1 includes the :mod:`importlib` package, a re-implementation of the logic underlying Python's :keyword:`import` statement. -:mod:`importlib` is useful for implementors of Python interpreters and +:mod:`importlib` is useful for implementers of Python interpreters and to users who wish to write new importers that can participate in the import process. Python 2.7 doesn't contain the complete :mod:`importlib` package, but instead has a tiny subset that contains @@ -1805,14 +1808,14 @@ closely resemble the native platform's widgets. This widget set was originally called Tile, but was renamed to Ttk (for "themed Tk") on being added to Tcl/Tck release 8.5. -To learn more, read the :mod:`ttk` module documentation. You may also +To learn more, read the :mod:`~tkinter.ttk` module documentation. You may also wish to read the Tcl/Tk manual page describing the Ttk theme engine, available at -https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm. Some +https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.html. Some screenshots of the Python/Ttk code in use are at https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki. -The :mod:`ttk` module was written by Guilherme Polo and added in +The :mod:`tkinter.ttk` module was written by Guilherme Polo and added in :issue:`2983`. An alternate version called ``Tile.py``, written by Martin Franklin and maintained by Kevin Walzer, was proposed for inclusion in :issue:`2618`, but the authors argued that Guilherme @@ -1828,8 +1831,7 @@ The :mod:`unittest` module was greatly enhanced; many new features were added. Most of these features were implemented by Michael Foord, unless otherwise noted. The enhanced version of the module is downloadable separately for use with Python versions 2.4 to 2.6, -packaged as the :mod:`unittest2` package, from -https://pypi.org/project/unittest2. +packaged as the :mod:`!unittest2` package, from :pypi:`unittest2`. When used from the command line, the module can automatically discover tests. It's not as fancy as `py.test `__ or @@ -1936,19 +1938,20 @@ GvR worked on merging them into Python's version of :mod:`unittest`. differences in the two strings. This comparison is now used by default when Unicode strings are compared with :meth:`~unittest.TestCase.assertEqual`. -* :meth:`~unittest.TestCase.assertRegexpMatches` and - :meth:`~unittest.TestCase.assertNotRegexpMatches` checks whether the +* :meth:`assertRegexpMatches() ` and + :meth:`assertNotRegexpMatches() ` checks whether the first argument is a string matching or not matching the regular expression provided as the second argument (:issue:`8038`). -* :meth:`~unittest.TestCase.assertRaisesRegexp` checks whether a particular exception +* :meth:`assertRaisesRegexp() ` checks + whether a particular exception is raised, and then also checks that the string representation of the exception matches the provided regular expression. * :meth:`~unittest.TestCase.assertIn` and :meth:`~unittest.TestCase.assertNotIn` tests whether *first* is or is not in *second*. -* :meth:`~unittest.TestCase.assertItemsEqual` tests whether two provided sequences +* :meth:`assertItemsEqual() ` tests whether two provided sequences contain the same elements. * :meth:`~unittest.TestCase.assertSetEqual` compares whether two sets are equal, and @@ -1964,7 +1967,7 @@ GvR worked on merging them into Python's version of :mod:`unittest`. * :meth:`~unittest.TestCase.assertDictEqual` compares two dictionaries and reports the differences; it's now used by default when you compare two dictionaries - using :meth:`~unittest.TestCase.assertEqual`. :meth:`~unittest.TestCase.assertDictContainsSubset` checks whether + using :meth:`~unittest.TestCase.assertEqual`. :meth:`!assertDictContainsSubset` checks whether all of the key/value pairs in *first* are found in *second*. * :meth:`~unittest.TestCase.assertAlmostEqual` and :meth:`~unittest.TestCase.assertNotAlmostEqual` test @@ -2021,8 +2024,8 @@ version 1.3. Some of the new features are: p = ET.XMLParser(encoding='utf-8') t = ET.XML("""""", parser=p) - Errors in parsing XML now raise a :exc:`ParseError` exception, whose - instances have a :attr:`position` attribute + Errors in parsing XML now raise a :exc:`~xml.etree.ElementTree.ParseError` exception, whose + instances have a :attr:`!position` attribute containing a (*line*, *column*) tuple giving the location of the problem. * ElementTree's code for converting trees to a string has been @@ -2032,7 +2035,8 @@ version 1.3. Some of the new features are: "xml" (the default), "html", or "text". HTML mode will output empty elements as ```` instead of ````, and text mode will skip over elements and only output the text chunks. If - you set the :attr:`tag` attribute of an element to ``None`` but + you set the :attr:`~xml.etree.ElementTree.Element.tag` attribute of an + element to ``None`` but leave its children in place, the element will be omitted when the tree is written out, so you don't need to do more extensive rearrangement to remove a single element. @@ -2062,14 +2066,14 @@ version 1.3. Some of the new features are: # Outputs 1... print ET.tostring(new) -* New :class:`Element` method: +* New :class:`~xml.etree.ElementTree.Element` method: :meth:`~xml.etree.ElementTree.Element.iter` yields the children of the element as a generator. It's also possible to write ``for child in elem:`` to loop over an element's children. The existing method - :meth:`getiterator` is now deprecated, as is :meth:`getchildren` + :meth:`!getiterator` is now deprecated, as is :meth:`!getchildren` which constructs and returns a list of children. -* New :class:`Element` method: +* New :class:`~xml.etree.ElementTree.Element` method: :meth:`~xml.etree.ElementTree.Element.itertext` yields all chunks of text that are descendants of the element. For example:: @@ -2128,7 +2132,7 @@ Changes to Python's build process and to the C API include: only the filename, function name, and first line number are required. This is useful for extension modules that are attempting to construct a more useful traceback stack. Previously such - extensions needed to call :c:func:`PyCode_New`, which had many + extensions needed to call :c:func:`!PyCode_New`, which had many more arguments. (Added by Jeffrey Yasskin.) * New function: :c:func:`PyErr_NewExceptionWithDoc` creates a new @@ -2155,13 +2159,13 @@ Changes to Python's build process and to the C API include: :c:func:`!PyOS_ascii_strtod` and :c:func:`!PyOS_ascii_atof` functions are now deprecated. -* New function: :c:func:`PySys_SetArgvEx` sets the value of +* New function: :c:func:`!PySys_SetArgvEx` sets the value of ``sys.argv`` and can optionally update ``sys.path`` to include the directory containing the script named by ``sys.argv[0]`` depending on the value of an *updatepath* parameter. This function was added to close a security hole for applications - that embed Python. The old function, :c:func:`PySys_SetArgv`, would + that embed Python. The old function, :c:func:`!PySys_SetArgv`, would always update ``sys.path``, and sometimes it would add the current directory. This meant that, if you ran an application embedding Python in a directory controlled by someone else, attackers could @@ -2169,12 +2173,11 @@ Changes to Python's build process and to the C API include: :file:`os.py`) that your application would then import and run. If you maintain a C/C++ application that embeds Python, check - whether you're calling :c:func:`PySys_SetArgv` and carefully consider - whether the application should be using :c:func:`PySys_SetArgvEx` + whether you're calling :c:func:`!PySys_SetArgv` and carefully consider + whether the application should be using :c:func:`!PySys_SetArgvEx` with *updatepath* set to false. - Security issue reported as `CVE-2008-5983 - `_; + Security issue reported as :cve:`2008-5983`; discussed in :issue:`5753`, and fixed by Antoine Pitrou. * New macros: the Python header files now define the following macros: @@ -2225,7 +2228,7 @@ Changes to Python's build process and to the C API include: (Fixed by Thomas Wouters; :issue:`1590864`.) * The :c:func:`Py_Finalize` function now calls the internal - :func:`threading._shutdown` function; this prevents some exceptions from + :func:`!threading._shutdown` function; this prevents some exceptions from being raised when an interpreter shuts down. (Patch by Adam Olsen; :issue:`1722344`.) @@ -2240,7 +2243,7 @@ Changes to Python's build process and to the C API include: Heller; :issue:`3102`.) * New configure option: the :option:`!--with-system-expat` switch allows - building the :mod:`pyexpat` module to use the system Expat library. + building the :mod:`pyexpat ` module to use the system Expat library. (Contributed by Arfrever Frehtes Taifersar Arahesis; :issue:`7609`.) * New configure option: the @@ -2327,34 +2330,34 @@ Port-Specific Changes: Windows * The :mod:`msvcrt` module now contains some constants from the :file:`crtassem.h` header file: - :data:`CRT_ASSEMBLY_VERSION`, - :data:`VC_ASSEMBLY_PUBLICKEYTOKEN`, - and :data:`LIBRARIES_ASSEMBLY_NAME_PREFIX`. + :data:`~msvcrt.CRT_ASSEMBLY_VERSION`, + :data:`~msvcrt.VC_ASSEMBLY_PUBLICKEYTOKEN`, + and :data:`~msvcrt.LIBRARIES_ASSEMBLY_NAME_PREFIX`. (Contributed by David Cournapeau; :issue:`4365`.) -* The :mod:`_winreg` module for accessing the registry now implements - the :func:`~_winreg.CreateKeyEx` and :func:`~_winreg.DeleteKeyEx` +* The :mod:`_winreg ` module for accessing the registry now implements + the :func:`~winreg.CreateKeyEx` and :func:`~winreg.DeleteKeyEx` functions, extended versions of previously supported functions that - take several extra arguments. The :func:`~_winreg.DisableReflectionKey`, - :func:`~_winreg.EnableReflectionKey`, and :func:`~_winreg.QueryReflectionKey` + take several extra arguments. The :func:`~winreg.DisableReflectionKey`, + :func:`~winreg.EnableReflectionKey`, and :func:`~winreg.QueryReflectionKey` were also tested and documented. (Implemented by Brian Curtin: :issue:`7347`.) -* The new :c:func:`_beginthreadex` API is used to start threads, and +* The new :c:func:`!_beginthreadex` API is used to start threads, and the native thread-local storage functions are now used. (Contributed by Kristján Valur Jónsson; :issue:`3582`.) * The :func:`os.kill` function now works on Windows. The signal value - can be the constants :const:`CTRL_C_EVENT`, - :const:`CTRL_BREAK_EVENT`, or any integer. The first two constants + can be the constants :const:`~signal.CTRL_C_EVENT`, + :const:`~signal.CTRL_BREAK_EVENT`, or any integer. The first two constants will send :kbd:`Control-C` and :kbd:`Control-Break` keystroke events to - subprocesses; any other value will use the :c:func:`TerminateProcess` + subprocesses; any other value will use the :c:func:`!TerminateProcess` API. (Contributed by Miki Tebeka; :issue:`1220212`.) * The :func:`os.listdir` function now correctly fails for an empty path. (Fixed by Hirokazu Yamamoto; :issue:`5913`.) -* The :mod:`mimelib` module will now read the MIME database from +* The :mod:`mimetypes` module will now read the MIME database from the Windows registry when initializing. (Patch by Gabriel Genellina; :issue:`4969`.) @@ -2368,7 +2371,7 @@ Port-Specific Changes: Mac OS X installation and a user-installed copy of the same version. (Changed by Ronald Oussoren; :issue:`4865`.) - .. versionchanged:: 2.7.13 + .. versionchanged:: 2.7.13 As of 2.7.13, this change was removed. ``/Library/Python/2.7/site-packages``, the site-packages directory @@ -2383,8 +2386,8 @@ Port-Specific Changes: Mac OS X Port-Specific Changes: FreeBSD ----------------------------------- -* FreeBSD 7.1's :const:`SO_SETFIB` constant, used with - :func:`~socket.getsockopt`/:func:`~socket.setsockopt` to select an +* FreeBSD 7.1's :const:`!SO_SETFIB` constant, used with the :func:`~socket.socket` methods + :func:`~socket.socket.getsockopt`/:func:`~socket.socket.setsockopt` to select an alternate routing table, is now available in the :mod:`socket` module. (Added by Kyle VanderBeek; :issue:`8235`.) @@ -2404,7 +2407,7 @@ Other Changes and Fixes :issue:`5464`.) * When importing a module from a :file:`.pyc` or :file:`.pyo` file - with an existing :file:`.py` counterpart, the :attr:`co_filename` + with an existing :file:`.py` counterpart, the :attr:`~codeobject.co_filename` attributes of the resulting code objects are overwritten when the original filename is obsolete. This can happen if the file has been renamed, moved, or is accessed through different paths. (Patch by @@ -2439,7 +2442,7 @@ This section lists previously described changes and other bugfixes that may require changes to your code: * The :func:`range` function processes its arguments more - consistently; it will now call :meth:`__int__` on non-float, + consistently; it will now call :meth:`~object.__int__` on non-float, non-integer arguments that are supplied to it. (Fixed by Alexander Belopolsky; :issue:`1533`.) @@ -2449,13 +2452,13 @@ that may require changes to your code: (Changed by Eric Smith; :issue:`5920`.) * Because of an optimization for the :keyword:`with` statement, the special - methods :meth:`__enter__` and :meth:`__exit__` must belong to the object's + methods :meth:`~object.__enter__` and :meth:`~object.__exit__` must belong to the object's type, and cannot be directly attached to the object's instance. This affects new-style classes (derived from :class:`object`) and C extension types. (:issue:`6101`.) * Due to a bug in Python 2.6, the *exc_value* parameter to - :meth:`__exit__` methods was often the string representation of the + :meth:`~object.__exit__` methods was often the string representation of the exception, not an instance. This was fixed in 2.7, so *exc_value* will be an instance as expected. (Fixed by Florent Xicluna; :issue:`7853`.) @@ -2484,13 +2487,13 @@ In the standard library: (or ``NaN``) are now hashable. (Fixed by Mark Dickinson; :issue:`7279`.) -* The ElementTree library, :mod:`xml.etree`, no longer escapes +* The :mod:`xml.etree.ElementTree` library no longer escapes ampersands and angle brackets when outputting an XML processing instruction (which looks like ````) or comment (which looks like ````). (Patch by Neil Muller; :issue:`2746`.) -* The :meth:`~StringIO.StringIO.readline` method of :class:`~StringIO.StringIO` objects now does +* The :meth:`!readline` method of :class:`~io.StringIO` objects now does nothing when a negative length is requested, as other file-like objects do. (:issue:`7348`). @@ -2506,7 +2509,7 @@ In the standard library: which raises an exception if there's an error. (Changed by Lars Gustäbel; :issue:`7357`.) -* The :mod:`urlparse` module's :func:`~urlparse.urlsplit` now handles +* The :mod:`urlparse ` module's :func:`~urllib.parse.urlsplit` now handles unknown URL schemes in a fashion compliant with :rfc:`3986`: if the URL is of the form ``"://..."``, the text before the ``://`` is treated as the scheme, even if it's a made-up scheme that @@ -2545,11 +2548,11 @@ For C extensions: For applications that embed Python: -* The :c:func:`PySys_SetArgvEx` function was added, letting +* The :c:func:`!PySys_SetArgvEx` function was added, letting applications close a security hole when the existing - :c:func:`PySys_SetArgv` function was used. Check whether you're - calling :c:func:`PySys_SetArgv` and carefully consider whether the - application should be using :c:func:`PySys_SetArgvEx` with + :c:func:`!PySys_SetArgv` function was used. Check whether you're + calling :c:func:`!PySys_SetArgv` and carefully consider whether the + application should be using :c:func:`!PySys_SetArgvEx` with *updatepath* set to false. .. ====================================================================== @@ -2575,11 +2578,11 @@ Two new environment variables for debug mode -------------------------------------------- In debug mode, the ``[xxx refs]`` statistic is not written by default, the -:envvar:`PYTHONSHOWREFCOUNT` environment variable now must also be set. +:envvar:`!PYTHONSHOWREFCOUNT` environment variable now must also be set. (Contributed by Victor Stinner; :issue:`31733`.) When Python is compiled with ``COUNT_ALLOC`` defined, allocation counts are no -longer dumped by default anymore: the :envvar:`PYTHONSHOWALLOCCOUNT` environment +longer dumped by default anymore: the :envvar:`!PYTHONSHOWALLOCCOUNT` environment variable must now also be set. Moreover, allocation counts are now dumped into stderr, rather than stdout. (Contributed by Victor Stinner; :issue:`31692`.) @@ -2621,7 +2624,7 @@ with the first of those changes appearing in the Python 2.7.7 release. 2 applications. (Contributed by Alex Gaynor; :issue:`21304`.) * OpenSSL 1.0.1h was upgraded for the official Windows installers published on - python.org. (contributed by Zachary Ware in :issue:`21671` for CVE-2014-0224) + python.org. (Contributed by Zachary Ware in :issue:`21671` for :cve:`2014-0224`.) :pep:`466` related features added in Python 2.7.9: @@ -2677,14 +2680,12 @@ automatic ``PATH`` modifications to have ``pip`` available from the command line by default, otherwise it can still be accessed through the Python launcher for Windows as ``py -m pip``. -As `discussed in the PEP`__, platform packagers may choose not to install +As :pep:`discussed in the PEP <0477#disabling-ensurepip-by-downstream-distributors>`, +platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager). -__ https://peps.python.org/pep-0477/#disabling-ensurepip-by-downstream-distributors - - Documentation Changes ~~~~~~~~~~~~~~~~~~~~~ @@ -2709,8 +2710,9 @@ and :ref:`setuptools-index`. PEP 476: Enabling certificate verification by default for stdlib http clients ----------------------------------------------------------------------------- -:pep:`476` updated :mod:`httplib` and modules which use it, such as -:mod:`urllib2` and :mod:`xmlrpclib`, to now verify that the server +:pep:`476` updated :mod:`httplib ` and modules which use it, such as +:mod:`urllib2 ` and :mod:`xmlrpclib `, to now +verify that the server presents a certificate which is signed by a Certificate Authority in the platform trust store and whose hostname matches the hostname being requested by default, significantly improving security for many applications. This @@ -2751,7 +2753,7 @@ entire Python process back to the default permissive behaviour of Python 2.7.8 and earlier. For cases where the connection establishment code can't be modified, but the -overall application can be, the new :func:`ssl._https_verify_certificates` +overall application can be, the new :func:`!ssl._https_verify_certificates` function can be used to adjust the default behaviour at runtime. diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 4bd53fb1..d97f5fdd 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -337,7 +337,7 @@ changed. (However, the standard library remains ASCII-only with the exception of contributor names in comments.) -* The :mod:`StringIO` and :mod:`cStringIO` modules are gone. Instead, +* The :mod:`!StringIO` and :mod:`!cStringIO` modules are gone. Instead, import the :mod:`io` module and use :class:`io.StringIO` or :class:`io.BytesIO` for text and data respectively. @@ -357,8 +357,8 @@ New Syntax provides a standardized way of annotating a function's parameters and return value. There are no semantics attached to such annotations except that they can be introspected at runtime using - the :attr:`__annotations__` attribute. The intent is to encourage - experimentation through metaclasses, decorators or frameworks. + the :attr:`~object.__annotations__` attribute. The intent is to + encourage experimentation through metaclasses, decorators or frameworks. * :pep:`3102`: Keyword-only arguments. Named parameters occurring after ``*args`` in the parameter list *must* be specified using @@ -555,15 +555,15 @@ very extensive changes to the standard library. :pep:`3108` is the reference for the major changes to the library. Here's a capsule review: -* Many old modules were removed. Some, like :mod:`gopherlib` (no - longer used) and :mod:`md5` (replaced by :mod:`hashlib`), were +* Many old modules were removed. Some, like :mod:`!gopherlib` (no + longer used) and :mod:`!md5` (replaced by :mod:`hashlib`), were already deprecated by :pep:`4`. Others were removed as a result of the removal of support for various platforms such as Irix, BeOS and Mac OS 9 (see :pep:`11`). Some modules were also selected for removal in Python 3.0 due to lack of use or because a better replacement exists. See :pep:`3108` for an exhaustive list. -* The :mod:`bsddb3` package was removed because its presence in the +* The :mod:`!bsddb3` package was removed because its presence in the core standard library has proved over time to be a particular burden for the core developers due to testing instability and Berkeley DB's release schedule. However, the package is alive and well, @@ -588,45 +588,45 @@ review: * A common pattern in Python 2.x is to have one version of a module implemented in pure Python, with an optional accelerated version implemented as a C extension; for example, :mod:`pickle` and - :mod:`cPickle`. This places the burden of importing the accelerated + :mod:`!cPickle`. This places the burden of importing the accelerated version and falling back on the pure Python version on each user of these modules. In Python 3.0, the accelerated versions are considered implementation details of the pure Python versions. Users should always import the standard version, which attempts to import the accelerated version and falls back to the pure Python - version. The :mod:`pickle` / :mod:`cPickle` pair received this + version. The :mod:`pickle` / :mod:`!cPickle` pair received this treatment. The :mod:`profile` module is on the list for 3.1. The - :mod:`StringIO` module has been turned into a class in the :mod:`io` + :mod:`!StringIO` module has been turned into a class in the :mod:`io` module. * Some related modules have been grouped into packages, and usually the submodule names have been simplified. The resulting new packages are: - * :mod:`dbm` (:mod:`anydbm`, :mod:`dbhash`, :mod:`dbm`, - :mod:`dumbdbm`, :mod:`gdbm`, :mod:`whichdb`). + * :mod:`dbm` (:mod:`!anydbm`, :mod:`!dbhash`, :mod:`!dbm`, + :mod:`!dumbdbm`, :mod:`!gdbm`, :mod:`!whichdb`). - * :mod:`html` (:mod:`HTMLParser`, :mod:`htmlentitydefs`). + * :mod:`html` (:mod:`!HTMLParser`, :mod:`!htmlentitydefs`). - * :mod:`http` (:mod:`httplib`, :mod:`BaseHTTPServer`, - :mod:`CGIHTTPServer`, :mod:`SimpleHTTPServer`, :mod:`Cookie`, - :mod:`cookielib`). + * :mod:`http` (:mod:`!httplib`, :mod:`!BaseHTTPServer`, + :mod:`!CGIHTTPServer`, :mod:`!SimpleHTTPServer`, :mod:`!Cookie`, + :mod:`!cookielib`). * :mod:`tkinter` (all :mod:`Tkinter`-related modules except :mod:`turtle`). The target audience of :mod:`turtle` doesn't really care about :mod:`tkinter`. Also note that as of Python 2.6, the functionality of :mod:`turtle` has been greatly enhanced. - * :mod:`urllib` (:mod:`urllib`, :mod:`urllib2`, :mod:`urlparse`, - :mod:`robotparse`). + * :mod:`urllib` (:mod:`!urllib`, :mod:`!urllib2`, :mod:`!urlparse`, + :mod:`!robotparse`). - * :mod:`xmlrpc` (:mod:`xmlrpclib`, :mod:`DocXMLRPCServer`, - :mod:`SimpleXMLRPCServer`). + * :mod:`xmlrpc` (:mod:`!xmlrpclib`, :mod:`!DocXMLRPCServer`, + :mod:`!SimpleXMLRPCServer`). Some other changes to standard library modules, not covered by :pep:`3108`: -* Killed :mod:`sets`. Use the built-in :func:`set` class. +* Killed :mod:`!sets`. Use the built-in :func:`set` class. * Cleanup of the :mod:`sys` module: removed :func:`sys.exitfunc`, :func:`sys.exc_clear`, :data:`sys.exc_type`, :data:`sys.exc_value`, @@ -642,13 +642,13 @@ Some other changes to standard library modules, not covered by * Cleanup of the :mod:`operator` module: removed :func:`sequenceIncludes` and :func:`isCallable`. -* Cleanup of the :mod:`thread` module: :func:`acquire_lock` and - :func:`release_lock` are gone; use :func:`acquire` and - :func:`release` instead. +* Cleanup of the :mod:`!thread` module: :func:`!acquire_lock` and + :func:`!release_lock` are gone; use :meth:`~threading.Lock.acquire` and + :meth:`~threading.Lock.release` instead. * Cleanup of the :mod:`random` module: removed the :func:`jumpahead` API. -* The :mod:`new` module is gone. +* The :mod:`!new` module is gone. * The functions :func:`os.tmpnam`, :func:`os.tempnam` and :func:`os.tmpfile` have been removed in favor of the :mod:`tempfile` @@ -711,7 +711,7 @@ new powerful features added: {Exception}({args})` instead of :samp:`raise {Exception}, {args}`. Additionally, you can no longer explicitly specify a traceback; instead, if you *have* to do this, you can assign directly to the - :attr:`__traceback__` attribute (see below). + :attr:`~BaseException.__traceback__` attribute (see below). * :pep:`3110`: Catching exceptions. You must now use :samp:`except {SomeException} as {variable}` instead @@ -725,7 +725,7 @@ new powerful features added: handler block. This usually happens due to a bug in the handler block; we call this a *secondary* exception. In this case, the original exception (that was being handled) is saved as the - :attr:`__context__` attribute of the secondary exception. + :attr:`~BaseException.__context__` attribute of the secondary exception. Explicit chaining is invoked with this syntax:: raise SecondaryException() from primary_exception @@ -733,14 +733,15 @@ new powerful features added: (where *primary_exception* is any expression that produces an exception object, probably an exception that was previously caught). In this case, the primary exception is stored on the - :attr:`__cause__` attribute of the secondary exception. The + :attr:`~BaseException.__cause__` attribute of the secondary exception. The traceback printed when an unhandled exception occurs walks the chain - of :attr:`__cause__` and :attr:`__context__` attributes and prints a + of :attr:`!__cause__` and :attr:`~BaseException.__context__` attributes and + prints a separate traceback for each component of the chain, with the primary exception at the top. (Java users may recognize this behavior.) * :pep:`3134`: Exception objects now store their traceback as the - :attr:`__traceback__` attribute. This means that an exception + :attr:`~BaseException.__traceback__` attribute. This means that an exception object now contains all the information pertaining to an exception, and there are fewer reasons to use :func:`sys.exc_info` (though the latter is not removed). @@ -779,14 +780,15 @@ Operators And Special Methods * Removed support for :attr:`__members__` and :attr:`__methods__`. -* The function attributes named :attr:`func_X` have been renamed to - use the :data:`__X__` form, freeing up these names in the function +* The function attributes named :attr:`!func_X` have been renamed to + use the :attr:`!__X__` form, freeing up these names in the function attribute namespace for user-defined attributes. To wit, - :attr:`func_closure`, :attr:`func_code`, :attr:`func_defaults`, - :attr:`func_dict`, :attr:`func_doc`, :attr:`func_globals`, - :attr:`func_name` were renamed to :attr:`__closure__`, - :attr:`__code__`, :attr:`__defaults__`, :attr:`~object.__dict__`, - :attr:`__doc__`, :attr:`__globals__`, :attr:`~definition.__name__`, + :attr:`!func_closure`, :attr:`!func_code`, :attr:`!func_defaults`, + :attr:`!func_dict`, :attr:`!func_doc`, :attr:`!func_globals`, + :attr:`!func_name` were renamed to :attr:`~function.__closure__`, + :attr:`~function.__code__`, :attr:`~function.__defaults__`, + :attr:`~function.__dict__`, :attr:`~function.__doc__`, + :attr:`~function.__globals__`, :attr:`~function.__name__`, respectively. * :meth:`!__nonzero__` is now :meth:`~object.__bool__`. @@ -911,7 +913,7 @@ best strategy is the following: tests still pass. 3. Run the ``2to3`` source-to-source translator over your source code - tree. (See :ref:`2to3-reference` for more on this tool.) Run the + tree. Run the result of the translation under Python 3.0. Manually fix up any remaining issues, fixing problems until all tests pass again. diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index cc6619c5..b9606beb 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -80,6 +80,28 @@ Support was also added for third-party tools like `PyYAML ` PEP written by Armin Ronacher and Raymond Hettinger. Implementation written by Raymond Hettinger. +Since an ordered dictionary remembers its insertion order, it can be used +in conjunction with sorting to make a sorted dictionary:: + + >>> # regular unsorted dictionary + >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} + + >>> # dictionary sorted by key + >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) + OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) + + >>> # dictionary sorted by value + >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) + OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) + + >>> # dictionary sorted by length of the key string + >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) + OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)]) + +The new sorted dictionaries maintain their sort order when entries +are deleted. But when new keys are added, the keys are appended +to the end and the sort is not maintained. + PEP 378: Format Specifier for Thousands Separator ================================================= @@ -152,7 +174,7 @@ Some smaller changes made to the core Python language are: (Contributed by Eric Smith; :issue:`5237`.) -* The :func:`string.maketrans` function is deprecated and is replaced by new +* The :func:`!string.maketrans` function is deprecated and is replaced by new static methods, :meth:`bytes.maketrans` and :meth:`bytearray.maketrans`. This change solves the confusion around which types were supported by the :mod:`string` module. Now, :class:`str`, :class:`bytes`, and @@ -169,7 +191,7 @@ Some smaller changes made to the core Python language are: ... if '' in line: ... outfile.write(line) - With the new syntax, the :func:`contextlib.nested` function is no longer + With the new syntax, the :func:`!contextlib.nested` function is no longer needed and is now deprecated. (Contributed by Georg Brandl and Mattias Brändström; @@ -183,9 +205,9 @@ Some smaller changes made to the core Python language are: (Contributed by Mark Dickinson; :issue:`4707`.) -* Python now uses David Gay's algorithm for finding the shortest floating - point representation that doesn't change its value. This should help - mitigate some of the confusion surrounding binary floating point +* Python now uses David Gay's algorithm for finding the shortest floating-point + representation that doesn't change its value. This should help + mitigate some of the confusion surrounding binary floating-point numbers. The significance is easily seen with a number like ``1.1`` which does not @@ -193,7 +215,7 @@ Some smaller changes made to the core Python language are: equivalent, an expression like ``float('1.1')`` evaluates to the nearest representable value which is ``0x1.199999999999ap+0`` in hex or ``1.100000000000000088817841970012523233890533447265625`` in decimal. That - nearest value was and still is used in subsequent floating point + nearest value was and still is used in subsequent floating-point calculations. What is new is how the number gets displayed. Formerly, Python used a @@ -202,7 +224,7 @@ Some smaller changes made to the core Python language are: using 17 digits was that it relied on IEEE-754 guarantees to assure that ``eval(repr(1.1))`` would round-trip exactly to its original value. The disadvantage is that many people found the output to be confusing (mistaking - intrinsic limitations of binary floating point representation as being a + intrinsic limitations of binary floating-point representation as being a problem with Python itself). The new algorithm for ``repr(1.1)`` is smarter and returns ``'1.1'``. @@ -214,8 +236,8 @@ Some smaller changes made to the core Python language are: it does not change the underlying values. So, it is still the case that ``1.1 + 2.2 != 3.3`` even though the representations may suggest otherwise. - The new algorithm depends on certain features in the underlying floating - point implementation. If the required features are not found, the old + The new algorithm depends on certain features in the underlying floating-point + implementation. If the required features are not found, the old algorithm will continue to be used. Also, the text pickle protocols assure cross-platform portability by using the old algorithm. @@ -359,16 +381,20 @@ New, Improved, and Deprecated Modules x / 0 In addition, several new assertion methods were added including - :func:`assertSetEqual`, :func:`assertDictEqual`, - :func:`assertDictContainsSubset`, :func:`assertListEqual`, - :func:`assertTupleEqual`, :func:`assertSequenceEqual`, - :func:`assertRaisesRegexp`, :func:`assertIsNone`, - and :func:`assertIsNotNone`. + :meth:`~unittest.TestCase.assertSetEqual`, + :meth:`~unittest.TestCase.assertDictEqual`, + :meth:`!assertDictContainsSubset`, + :meth:`~unittest.TestCase.assertListEqual`, + :meth:`~unittest.TestCase.assertTupleEqual`, + :meth:`~unittest.TestCase.assertSequenceEqual`, + :meth:`assertRaisesRegexp() `, + :meth:`~unittest.TestCase.assertIsNone`, + and :meth:`~unittest.TestCase.assertIsNotNone`. (Contributed by Benjamin Peterson and Antoine Pitrou.) -* The :mod:`io` module has three new constants for the :meth:`seek` - method :data:`SEEK_SET`, :data:`SEEK_CUR`, and :data:`SEEK_END`. +* The :mod:`io` module has three new constants for the :meth:`~io.IOBase.seek` + method: :data:`~os.SEEK_SET`, :data:`~os.SEEK_CUR`, and :data:`~os.SEEK_END`. * The :data:`sys.version_info` tuple is now a named tuple:: @@ -377,7 +403,7 @@ New, Improved, and Deprecated Modules (Contributed by Ross Light; :issue:`4285`.) -* The :mod:`nntplib` and :mod:`imaplib` modules now support IPv6. +* The :mod:`!nntplib` and :mod:`imaplib` modules now support IPv6. (Contributed by Derek Morr; :issue:`1655` and :issue:`1664`.) @@ -524,7 +550,7 @@ Porting to Python 3.1 This section lists previously described changes and other bugfixes that may require changes to your code: -* The new floating point string representations can break existing doctests. +* The new floating-point string representations can break existing doctests. For example:: def e(): diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 42e54fba..e4699fbf 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -221,116 +221,116 @@ have been incorporated. Some of the most notable ones are as follows: * Missing ``:`` before blocks: - .. code-block:: python + .. code-block:: python - >>> if rocket.position > event_horizon - File "", line 1 - if rocket.position > event_horizon - ^ - SyntaxError: expected ':' + >>> if rocket.position > event_horizon + File "", line 1 + if rocket.position > event_horizon + ^ + SyntaxError: expected ':' - (Contributed by Pablo Galindo in :issue:`42997`.) + (Contributed by Pablo Galindo in :issue:`42997`.) * Unparenthesised tuples in comprehensions targets: - .. code-block:: python + .. code-block:: python - >>> {x,y for x,y in zip('abcd', '1234')} - File "", line 1 - {x,y for x,y in zip('abcd', '1234')} - ^ - SyntaxError: did you forget parentheses around the comprehension target? + >>> {x,y for x,y in zip('abcd', '1234')} + File "", line 1 + {x,y for x,y in zip('abcd', '1234')} + ^ + SyntaxError: did you forget parentheses around the comprehension target? - (Contributed by Pablo Galindo in :issue:`43017`.) + (Contributed by Pablo Galindo in :issue:`43017`.) * Missing commas in collection literals and between expressions: - .. code-block:: python + .. code-block:: python - >>> items = { - ... x: 1, - ... y: 2 - ... z: 3, - File "", line 3 - y: 2 - ^ - SyntaxError: invalid syntax. Perhaps you forgot a comma? + >>> items = { + ... x: 1, + ... y: 2 + ... z: 3, + File "", line 3 + y: 2 + ^ + SyntaxError: invalid syntax. Perhaps you forgot a comma? - (Contributed by Pablo Galindo in :issue:`43822`.) + (Contributed by Pablo Galindo in :issue:`43822`.) * Multiple Exception types without parentheses: - .. code-block:: python + .. code-block:: python - >>> try: - ... build_dyson_sphere() - ... except NotEnoughScienceError, NotEnoughResourcesError: - File "", line 3 - except NotEnoughScienceError, NotEnoughResourcesError: - ^ - SyntaxError: multiple exception types must be parenthesized + >>> try: + ... build_dyson_sphere() + ... except NotEnoughScienceError, NotEnoughResourcesError: + File "", line 3 + except NotEnoughScienceError, NotEnoughResourcesError: + ^ + SyntaxError: multiple exception types must be parenthesized - (Contributed by Pablo Galindo in :issue:`43149`.) + (Contributed by Pablo Galindo in :issue:`43149`.) * Missing ``:`` and values in dictionary literals: - .. code-block:: python + .. code-block:: python - >>> values = { - ... x: 1, - ... y: 2, - ... z: - ... } - File "", line 4 - z: - ^ - SyntaxError: expression expected after dictionary key and ':' + >>> values = { + ... x: 1, + ... y: 2, + ... z: + ... } + File "", line 4 + z: + ^ + SyntaxError: expression expected after dictionary key and ':' - >>> values = {x:1, y:2, z w:3} - File "", line 1 - values = {x:1, y:2, z w:3} - ^ - SyntaxError: ':' expected after dictionary key + >>> values = {x:1, y:2, z w:3} + File "", line 1 + values = {x:1, y:2, z w:3} + ^ + SyntaxError: ':' expected after dictionary key - (Contributed by Pablo Galindo in :issue:`43823`.) + (Contributed by Pablo Galindo in :issue:`43823`.) * ``try`` blocks without ``except`` or ``finally`` blocks: - .. code-block:: python + .. code-block:: python - >>> try: - ... x = 2 - ... something = 3 - File "", line 3 - something = 3 - ^^^^^^^^^ - SyntaxError: expected 'except' or 'finally' block + >>> try: + ... x = 2 + ... something = 3 + File "", line 3 + something = 3 + ^^^^^^^^^ + SyntaxError: expected 'except' or 'finally' block - (Contributed by Pablo Galindo in :issue:`44305`.) + (Contributed by Pablo Galindo in :issue:`44305`.) * Usage of ``=`` instead of ``==`` in comparisons: - .. code-block:: python + .. code-block:: python - >>> if rocket.position = event_horizon: - File "", line 1 - if rocket.position = event_horizon: - ^ - SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? + >>> if rocket.position = event_horizon: + File "", line 1 + if rocket.position = event_horizon: + ^ + SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? - (Contributed by Pablo Galindo in :issue:`43797`.) + (Contributed by Pablo Galindo in :issue:`43797`.) * Usage of ``*`` in f-strings: - .. code-block:: python + .. code-block:: python - >>> f"Black holes {*all_black_holes} and revelations" - File "", line 1 - (*all_black_holes) - ^ - SyntaxError: f-string: cannot use starred expression here + >>> f"Black holes {*all_black_holes} and revelations" + File "", line 1 + (*all_black_holes) + ^ + SyntaxError: f-string: cannot use starred expression here - (Contributed by Pablo Galindo in :issue:`41064`.) + (Contributed by Pablo Galindo in :issue:`41064`.) IndentationErrors ~~~~~~~~~~~~~~~~~ @@ -352,7 +352,7 @@ was expecting an indentation, including the location of the statement: AttributeErrors ~~~~~~~~~~~~~~~ -When printing :exc:`AttributeError`, :c:func:`PyErr_Display` will offer +When printing :exc:`AttributeError`, :c:func:`!PyErr_Display` will offer suggestions of similar attribute names in the object that the exception was raised from: @@ -365,15 +365,15 @@ raised from: (Contributed by Pablo Galindo in :issue:`38530`.) - .. warning:: - Notice this won't work if :c:func:`PyErr_Display` is not called to display the error - which can happen if some other custom error display function is used. This is a common - scenario in some REPLs like IPython. +.. warning:: + Notice this won't work if :c:func:`!PyErr_Display` is not called to display the error + which can happen if some other custom error display function is used. This is a common + scenario in some REPLs like IPython. NameErrors ~~~~~~~~~~ -When printing :exc:`NameError` raised by the interpreter, :c:func:`PyErr_Display` +When printing :exc:`NameError` raised by the interpreter, :c:func:`!PyErr_Display` will offer suggestions of similar variable names in the function that the exception was raised from: @@ -387,10 +387,10 @@ was raised from: (Contributed by Pablo Galindo in :issue:`38530`.) - .. warning:: - Notice this won't work if :c:func:`PyErr_Display` is not called to display the error, - which can happen if some other custom error display function is used. This is a common - scenario in some REPLs like IPython. +.. warning:: + Notice this won't work if :c:func:`!PyErr_Display` is not called to display the error, + which can happen if some other custom error display function is used. This is a common + scenario in some REPLs like IPython. PEP 626: Precise line numbers for debugging and other tools @@ -399,10 +399,14 @@ PEP 626: Precise line numbers for debugging and other tools PEP 626 brings more precise and reliable line numbers for debugging, profiling and coverage tools. Tracing events, with the correct line number, are generated for all lines of code executed and only for lines of code that are executed. -The ``f_lineno`` attribute of frame objects will always contain the expected line number. +The :attr:`~frame.f_lineno` attribute of frame objects will always contain the +expected line number. -The ``co_lnotab`` attribute of code objects is deprecated and will be removed in 3.12. -Code that needs to convert from offset to line number should use the new ``co_lines()`` method instead. +The :attr:`~codeobject.co_lnotab` attribute of +:ref:`code objects ` is deprecated and +will be removed in 3.12. +Code that needs to convert from offset to line number should use the new +:meth:`~codeobject.co_lines` method instead. PEP 634: Structural Pattern Matching ------------------------------------ @@ -433,16 +437,16 @@ A match statement takes an expression and compares its value to successive patterns given as one or more case blocks. Specifically, pattern matching operates by: - 1. using data with type and shape (the ``subject``) - 2. evaluating the ``subject`` in the ``match`` statement - 3. comparing the subject with each pattern in a ``case`` statement - from top to bottom until a match is confirmed. - 4. executing the action associated with the pattern of the confirmed - match - 5. If an exact match is not confirmed, the last case, a wildcard ``_``, - if provided, will be used as the matching case. If an exact match is - not confirmed and a wildcard case does not exist, the entire match - block is a no-op. +1. using data with type and shape (the ``subject``) +2. evaluating the ``subject`` in the ``match`` statement +3. comparing the subject with each pattern in a ``case`` statement + from top to bottom until a match is confirmed. +4. executing the action associated with the pattern of the confirmed + match +5. If an exact match is not confirmed, the last case, a wildcard ``_``, + if provided, will be used as the matching case. If an exact match is + not confirmed and a wildcard case does not exist, the entire match + block is a no-op. Declarative approach ~~~~~~~~~~~~~~~~~~~~ @@ -686,7 +690,7 @@ are in :pep:`635`, and a longer tutorial is in :pep:`636`. Optional ``EncodingWarning`` and ``encoding="locale"`` option ------------------------------------------------------------- -The default encoding of :class:`TextIOWrapper` and :func:`open` is +The default encoding of :class:`~io.TextIOWrapper` and :func:`open` is platform and locale dependent. Since UTF-8 is used on most Unix platforms, omitting ``encoding`` option when opening UTF-8 files (e.g. JSON, YAML, TOML, Markdown) is a very common bug. For example:: @@ -781,7 +785,7 @@ especially when forward references or invalid types were involved. Compare:: StrCache = 'Cache[str]' # a type alias LOG_PREFIX = 'LOG[DEBUG]' # a module constant -Now the :mod:`typing` module has a special value :data:`TypeAlias` +Now the :mod:`typing` module has a special value :data:`~typing.TypeAlias` which lets you declare type aliases more explicitly:: StrCache: TypeAlias = 'Cache[str]' # a type alias @@ -794,10 +798,10 @@ See :pep:`613` for more details. PEP 647: User-Defined Type Guards --------------------------------- -:data:`TypeGuard` has been added to the :mod:`typing` module to annotate +:data:`~typing.TypeGuard` has been added to the :mod:`typing` module to annotate type guard functions and improve information provided to static type checkers -during type narrowing. For more information, please see :data:`TypeGuard`\ 's -documentation, and :pep:`647`. +during type narrowing. For more information, please see +:data:`~typing.TypeGuard`\ 's documentation, and :pep:`647`. (Contributed by Ken Jin and Guido van Rossum in :issue:`43766`. PEP written by Eric Traut.) @@ -824,7 +828,7 @@ Other Language Changes :meth:`~object.__index__` method). (Contributed by Serhiy Storchaka in :issue:`37999`.) -* If :func:`object.__ipow__` returns :const:`NotImplemented`, the operator will +* If :func:`object.__ipow__` returns :data:`NotImplemented`, the operator will correctly fall back to :func:`object.__pow__` and :func:`object.__rpow__` as expected. (Contributed by Alex Shkop in :issue:`38302`.) @@ -968,8 +972,8 @@ and objects representing asynchronously released resources. Add asynchronous context manager support to :func:`contextlib.nullcontext`. (Contributed by Tom Gringauz in :issue:`41543`.) -Add :class:`AsyncContextDecorator`, for supporting usage of async context managers -as decorators. +Add :class:`~contextlib.AsyncContextDecorator`, for supporting usage of async +context managers as decorators. curses ------ @@ -1085,8 +1089,8 @@ encodings enum ---- -:class:`Enum` :func:`__repr__` now returns ``enum_name.member_name`` and -:func:`__str__` now returns ``member_name``. Stdlib enums available as +:class:`~enum.Enum` :func:`~object.__repr__` now returns ``enum_name.member_name`` and +:func:`~object.__str__` now returns ``member_name``. Stdlib enums available as module constants have a :func:`repr` of ``module_name.member_name``. (Contributed by Ethan Furman in :issue:`40066`.) @@ -1100,7 +1104,7 @@ Add *encoding* and *errors* parameters in :func:`fileinput.input` and :class:`fileinput.FileInput`. (Contributed by Inada Naoki in :issue:`43712`.) -:func:`fileinput.hook_compressed` now returns :class:`TextIOWrapper` object +:func:`fileinput.hook_compressed` now returns :class:`~io.TextIOWrapper` object when *mode* is "r" and file is compressed, like uncompressed files. (Contributed by Inada Naoki in :issue:`5758`.) @@ -1198,12 +1202,12 @@ Feature parity with ``importlib_metadata`` 4.6 :ref:`importlib.metadata entry points ` now provide a nicer experience for selecting entry points by group and name through a new -:class:`importlib.metadata.EntryPoints` class. See the Compatibility +:ref:`importlib.metadata.EntryPoints ` class. See the Compatibility Note in the docs for more info on the deprecation and usage. -Added :func:`importlib.metadata.packages_distributions` for resolving -top-level Python modules and packages to their -:class:`importlib.metadata.Distribution`. +Added :ref:`importlib.metadata.packages_distributions() ` +for resolving top-level Python modules and packages to their +:ref:`importlib.metadata.Distribution `. inspect ------- @@ -1220,7 +1224,7 @@ best practice for accessing the annotations dict defined on any Python object; for more information on best practices for working with annotations, please see :ref:`annotations-howto`. Relatedly, :func:`inspect.signature`, -:func:`inspect.Signature.from_callable`, and :func:`inspect.Signature.from_function` +:func:`inspect.Signature.from_callable`, and :func:`!inspect.Signature.from_function` now call :func:`inspect.get_annotations` to retrieve annotations. This means :func:`inspect.signature` and :func:`inspect.Signature.from_callable` can also now un-stringize stringized annotations. @@ -1229,7 +1233,7 @@ also now un-stringize stringized annotations. itertools --------- -Add :func:`itertools.pairwise()`. +Add :func:`itertools.pairwise`. (Contributed by Raymond Hettinger in :issue:`38200`.) linecache @@ -1241,14 +1245,14 @@ When a module does not define ``__loader__``, fall back to ``__spec__.loader``. os -- -Add :func:`os.cpu_count()` support for VxWorks RTOS. +Add :func:`os.cpu_count` support for VxWorks RTOS. (Contributed by Peixing Xin in :issue:`41440`.) Add a new function :func:`os.eventfd` and related helpers to wrap the ``eventfd2`` syscall on Linux. (Contributed by Christian Heimes in :issue:`41001`.) -Add :func:`os.splice()` that allows to move data between two file +Add :func:`os.splice` that allows to move data between two file descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in :issue:`41625`.) @@ -1276,7 +1280,7 @@ Add negative indexing support to :attr:`PurePath.parents (Contributed by Yaroslav Pankovych in :issue:`21041`.) Add :meth:`Path.hardlink_to ` method that -supersedes :meth:`~pathlib.Path.link_to`. The new method has the same argument +supersedes :meth:`!link_to`. The new method has the same argument order as :meth:`~pathlib.Path.symlink_to`. (Contributed by Barney Gale in :issue:`39950`.) @@ -1288,7 +1292,7 @@ functions in the :mod:`os` module. platform -------- -Add :func:`platform.freedesktop_os_release()` to retrieve operation system +Add :func:`platform.freedesktop_os_release` to retrieve operation system identification from `freedesktop.org os-release `_ standard file. (Contributed by Christian Heimes in :issue:`28468`.) @@ -1312,8 +1316,8 @@ pyclbr ------ Add an ``end_lineno`` attribute to the ``Function`` and ``Class`` -objects in the tree returned by :func:`pyclbr.readline` and -:func:`pyclbr.readline_ex`. It matches the existing (start) ``lineno``. +objects in the tree returned by :func:`pyclbr.readmodule` and +:func:`pyclbr.readmodule_ex`. It matches the existing (start) ``lineno``. (Contributed by Aviral Srivastava in :issue:`38307`.) shelve @@ -1480,9 +1484,9 @@ is a :class:`typing.TypedDict`. Subclasses of ``typing.Protocol`` which only have data variables declared will now raise a ``TypeError`` when checked with ``isinstance`` unless they -are decorated with :func:`runtime_checkable`. Previously, these checks +are decorated with :func:`~typing.runtime_checkable`. Previously, these checks passed silently. Users should decorate their -subclasses with the :func:`runtime_checkable` decorator +subclasses with the :func:`!runtime_checkable` decorator if they want runtime protocols. (Contributed by Yurii Karabas in :issue:`38908`.) @@ -1508,11 +1512,18 @@ query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with ``&`` as the default. This change also affects -:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +:func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates :rfc:`3986`, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser in :mod:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :gh:`88048`) + xml --- @@ -1584,8 +1595,8 @@ Optimizations :func:`map`, :func:`filter`, :func:`reversed`, :func:`bool` and :func:`float`. (Contributed by Donghee Na and Jeroen Demeyer in :issue:`43575`, :issue:`43287`, :issue:`41922`, :issue:`41873` and :issue:`41870`.) -* :class:`BZ2File` performance is improved by removing internal ``RLock``. - This makes :class:`BZ2File` thread unsafe in the face of multiple simultaneous +* :class:`~bz2.BZ2File` performance is improved by removing internal ``RLock``. + This makes :class:`!BZ2File` thread unsafe in the face of multiple simultaneous readers or writers, just like its equivalent classes in :mod:`gzip` and :mod:`lzma` have always been. (Contributed by Inada Naoki in :issue:`43785`.) @@ -1609,7 +1620,7 @@ Deprecated cleaning up old import semantics that were kept for Python 2.7 compatibility. Specifically, :meth:`!find_loader`/:meth:`!find_module` - (superseded by :meth:`~importlib.abc.Finder.find_spec`), + (superseded by :meth:`~importlib.abc.MetaPathFinder.find_spec`), :meth:`~importlib.abc.Loader.load_module` (superseded by :meth:`~importlib.abc.Loader.exec_module`), :meth:`!module_repr` (which the import system @@ -1636,7 +1647,7 @@ Deprecated :meth:`~importlib.abc.Loader.exec_module` instead. (Contributed by Brett Cannon in :issue:`26131`.) -* :meth:`zimport.zipimporter.load_module` has been deprecated in +* :meth:`!zimport.zipimporter.load_module` has been deprecated in preference for :meth:`~zipimport.zipimporter.exec_module`. (Contributed by Brett Cannon in :issue:`26131`.) @@ -1738,7 +1749,7 @@ Deprecated (Contributed by Jelle Zijlstra in :gh:`87889`.) -* :meth:`pathlib.Path.link_to` is deprecated and slated for removal in +* :meth:`!pathlib.Path.link_to` is deprecated and slated for removal in Python 3.12. Use :meth:`pathlib.Path.hardlink_to` instead. (Contributed by Barney Gale in :issue:`39950`.) @@ -1748,28 +1759,28 @@ Deprecated * The following :mod:`ssl` features have been deprecated since Python 3.6, Python 3.7, or OpenSSL 1.1.0 and will be removed in 3.11: - * :data:`~ssl.OP_NO_SSLv2`, :data:`~ssl.OP_NO_SSLv3`, :data:`~ssl.OP_NO_TLSv1`, - :data:`~ssl.OP_NO_TLSv1_1`, :data:`~ssl.OP_NO_TLSv1_2`, and - :data:`~ssl.OP_NO_TLSv1_3` are replaced by - :attr:`sslSSLContext.minimum_version` and - :attr:`sslSSLContext.maximum_version`. + * :data:`!OP_NO_SSLv2`, :data:`!OP_NO_SSLv3`, :data:`!OP_NO_TLSv1`, + :data:`!OP_NO_TLSv1_1`, :data:`!OP_NO_TLSv1_2`, and + :data:`!OP_NO_TLSv1_3` are replaced by + :attr:`~ssl.SSLContext.minimum_version` and + :attr:`~ssl.SSLContext.maximum_version`. - * :data:`~ssl.PROTOCOL_SSLv2`, :data:`~ssl.PROTOCOL_SSLv3`, - :data:`~ssl.PROTOCOL_SSLv23`, :data:`~ssl.PROTOCOL_TLSv1`, - :data:`~ssl.PROTOCOL_TLSv1_1`, :data:`~ssl.PROTOCOL_TLSv1_2`, and - :const:`~ssl.PROTOCOL_TLS` are deprecated in favor of + * :data:`!PROTOCOL_SSLv2`, :data:`!PROTOCOL_SSLv3`, + :data:`!PROTOCOL_SSLv23`, :data:`!PROTOCOL_TLSv1`, + :data:`!PROTOCOL_TLSv1_1`, :data:`!PROTOCOL_TLSv1_2`, and + :const:`!PROTOCOL_TLS` are deprecated in favor of :const:`~ssl.PROTOCOL_TLS_CLIENT` and :const:`~ssl.PROTOCOL_TLS_SERVER` - * :func:`~ssl.wrap_socket` is replaced by :meth:`ssl.SSLContext.wrap_socket` + * :func:`!wrap_socket` is replaced by :meth:`ssl.SSLContext.wrap_socket` - * :func:`~ssl.match_hostname` + * :func:`!match_hostname` - * :func:`~ssl.RAND_pseudo_bytes`, :func:`~ssl.RAND_egd` + * :func:`!RAND_pseudo_bytes`, :func:`!RAND_egd` * NPN features like :meth:`ssl.SSLSocket.selected_npn_protocol` and :meth:`ssl.SSLContext.set_npn_protocols` are replaced by ALPN. -* The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is +* The threading debug (:envvar:`!PYTHONTHREADDEBUG` environment variable) is deprecated in Python 3.10 and will be removed in Python 3.12. This feature requires a :ref:`debug build of Python `. (Contributed by Victor Stinner in :issue:`44584`.) @@ -1959,11 +1970,11 @@ Changes in the C API source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input); - * For ``FrameObject`` objects, the ``f_lasti`` member now represents a wordcode + * For ``FrameObject`` objects, the :attr:`~frame.f_lasti` member now represents a wordcode offset instead of a simple offset into the bytecode string. This means that this number needs to be multiplied by 2 to be used with APIs that expect a byte offset instead (like :c:func:`PyCode_Addr2Line` for example). Notice as well that the - ``f_lasti`` member of ``FrameObject`` objects is not considered stable: please + :attr:`!f_lasti` member of ``FrameObject`` objects is not considered stable: please use :c:func:`PyFrame_GetLineNumber` instead. CPython bytecode changes @@ -2211,16 +2222,16 @@ Removed * Removed ``Py_UNICODE_str*`` functions manipulating ``Py_UNICODE*`` strings. (Contributed by Inada Naoki in :issue:`41123`.) - * ``Py_UNICODE_strlen``: use :c:func:`PyUnicode_GetLength` or - :c:macro:`PyUnicode_GET_LENGTH` - * ``Py_UNICODE_strcat``: use :c:func:`PyUnicode_CopyCharacters` or - :c:func:`PyUnicode_FromFormat` - * ``Py_UNICODE_strcpy``, ``Py_UNICODE_strncpy``: use - :c:func:`PyUnicode_CopyCharacters` or :c:func:`PyUnicode_Substring` - * ``Py_UNICODE_strcmp``: use :c:func:`PyUnicode_Compare` - * ``Py_UNICODE_strncmp``: use :c:func:`PyUnicode_Tailmatch` - * ``Py_UNICODE_strchr``, ``Py_UNICODE_strrchr``: use - :c:func:`PyUnicode_FindChar` + * ``Py_UNICODE_strlen``: use :c:func:`PyUnicode_GetLength` or + :c:macro:`PyUnicode_GET_LENGTH` + * ``Py_UNICODE_strcat``: use :c:func:`PyUnicode_CopyCharacters` or + :c:func:`PyUnicode_FromFormat` + * ``Py_UNICODE_strcpy``, ``Py_UNICODE_strncpy``: use + :c:func:`PyUnicode_CopyCharacters` or :c:func:`PyUnicode_Substring` + * ``Py_UNICODE_strcmp``: use :c:func:`PyUnicode_Compare` + * ``Py_UNICODE_strncmp``: use :c:func:`PyUnicode_Tailmatch` + * ``Py_UNICODE_strchr``, ``Py_UNICODE_strrchr``: use + :c:func:`PyUnicode_FindChar` * Removed ``PyUnicode_GetMax()``. Please migrate to new (:pep:`393`) APIs. (Contributed by Inada Naoki in :issue:`41103`.) @@ -2311,3 +2322,42 @@ Removed * The ``PyThreadState.use_tracing`` member has been removed to optimize Python. (Contributed by Mark Shannon in :issue:`43760`.) + + +Notable security feature in 3.10.7 +================================== + +Converting between :class:`int` and :class:`str` in bases other than 2 +(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) +now raises a :exc:`ValueError` if the number of digits in string form is +above a limit to avoid potential denial of service attacks due to the +algorithmic complexity. This is a mitigation for :cve:`2020-10735`. +This limit can be configured or disabled by environment variable, command +line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion +length limitation ` documentation. The default limit +is 4300 digits in string form. + +Notable security feature in 3.10.8 +================================== + +The deprecated :mod:`!mailcap` module now refuses to inject unsafe text +(filenames, MIME types, parameters) into shell commands. Instead of using such +text, it will warn and act as if a match was not found (or for test commands, +as if the test failed). +(Contributed by Petr Viktorin in :gh:`98966`.) + +Notable changes in 3.10.12 +========================== + +tarfile +------- + +* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, + have a new a *filter* argument that allows limiting tar features than may be + surprising or dangerous, such as creating files outside the destination + directory. + See :ref:`tarfile-extraction-filter` for details. + In Python 3.12, use without the *filter* argument will show a + :exc:`DeprecationWarning`. + In Python 3.14, the default will switch to ``'data'``. + (Contributed by Petr Viktorin in :pep:`706`.) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 88eaee97..d59f2440 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -544,8 +544,7 @@ Other CPython Implementation Changes (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a :exc:`ValueError` if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the - algorithmic complexity. This is a mitigation for `CVE-2020-10735 - `_. + algorithmic complexity. This is a mitigation for :cve:`2020-10735`. This limit can be configured or disabled by environment variable, command line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion length limitation ` documentation. The default limit @@ -672,7 +671,7 @@ enum * Changed :meth:`Enum.__format__() ` (the default for :func:`format`, :meth:`str.format` and :term:`f-string`\s) to always produce - the same result as :meth:`Enum.__str__()`: for enums inheriting from + the same result as :meth:`Enum.__str__() `: for enums inheriting from :class:`~enum.ReprEnum` it will be the member's value; for all other enums it will be the enum and member name (e.g. ``Color.RED``). @@ -769,6 +768,21 @@ functools (Contributed by Yurii Karabas in :issue:`46014`.) +.. _whatsnew311-gzip: + +gzip +---- + +* The :func:`gzip.compress` function is now faster when used with the + **mtime=0** argument as it delegates the compression entirely to a single + :func:`zlib.compress` operation. There is one side effect of this change: The + gzip file header contains an "OS" byte in its header. That was traditionally + always set to a value of 255 representing "unknown" by the :mod:`gzip` + module. Now, when using :func:`~gzip.compress` with **mtime=0**, it may be + set to a different value by the underlying zlib C library Python was linked + against. + (See :gh:`112346` for details on the side effect.) + .. _whatsnew311-hashlib: hashlib @@ -1604,7 +1618,7 @@ raw, adaptive bytecode containing quickened data. New opcodes ----------- -* :opcode:`ASYNC_GEN_WRAP`, :opcode:`RETURN_GENERATOR` and :opcode:`SEND`, +* :opcode:`!ASYNC_GEN_WRAP`, :opcode:`RETURN_GENERATOR` and :opcode:`SEND`, used in generators and co-routines. * :opcode:`COPY_FREE_VARS`, @@ -1615,7 +1629,7 @@ New opcodes * :opcode:`MAKE_CELL`, to create :ref:`cell-objects`. -* :opcode:`CHECK_EG_MATCH` and :opcode:`PREP_RERAISE_STAR`, +* :opcode:`CHECK_EG_MATCH` and :opcode:`!PREP_RERAISE_STAR`, to handle the :ref:`new exception groups and except* ` added in :pep:`654`. @@ -1630,38 +1644,38 @@ New opcodes Replaced opcodes ---------------- -+------------------------------------+-----------------------------------+-----------------------------------------+ -| Replaced Opcode(s) | New Opcode(s) | Notes | -+====================================+===================================+=========================================+ -| | :opcode:`!BINARY_*` | :opcode:`BINARY_OP` | Replaced all numeric binary/in-place | -| | :opcode:`!INPLACE_*` | | opcodes with a single opcode | -+------------------------------------+-----------------------------------+-----------------------------------------+ -| | :opcode:`!CALL_FUNCTION` | | :opcode:`CALL` | Decouples argument shifting for methods | -| | :opcode:`!CALL_FUNCTION_KW` | | :opcode:`KW_NAMES` | from handling of keyword arguments; | -| | :opcode:`!CALL_METHOD` | | :opcode:`PRECALL` | allows better specialization of calls | -| | | :opcode:`PUSH_NULL` | | -+------------------------------------+-----------------------------------+-----------------------------------------+ -| | :opcode:`!DUP_TOP` | | :opcode:`COPY` | Stack manipulation instructions | -| | :opcode:`!DUP_TOP_TWO` | | :opcode:`SWAP` | | -| | :opcode:`!ROT_TWO` | | | -| | :opcode:`!ROT_THREE` | | | -| | :opcode:`!ROT_FOUR` | | | -| | :opcode:`!ROT_N` | | | -+------------------------------------+-----------------------------------+-----------------------------------------+ -| | :opcode:`!JUMP_IF_NOT_EXC_MATCH` | | :opcode:`CHECK_EXC_MATCH` | Now performs check but doesn't jump | -+------------------------------------+-----------------------------------+-----------------------------------------+ -| | :opcode:`!JUMP_ABSOLUTE` | | :opcode:`JUMP_BACKWARD` | See [#bytecode-jump]_; | -| | :opcode:`!POP_JUMP_IF_FALSE` | | :opcode:`POP_JUMP_BACKWARD_IF_* | ``TRUE``, ``FALSE``, | -| | :opcode:`!POP_JUMP_IF_TRUE` | ` | ``NONE`` and ``NOT_NONE`` variants | -| | | :opcode:`POP_JUMP_FORWARD_IF_* | for each direction | -| | ` | | -+------------------------------------+-----------------------------------+-----------------------------------------+ -| | :opcode:`!SETUP_WITH` | :opcode:`BEFORE_WITH` | :keyword:`with` block setup | -| | :opcode:`!SETUP_ASYNC_WITH` | | | -+------------------------------------+-----------------------------------+-----------------------------------------+ ++------------------------------------+------------------------------------+-----------------------------------------+ +| Replaced Opcode(s) | New Opcode(s) | Notes | ++====================================+====================================+=========================================+ +| | :opcode:`!BINARY_*` | :opcode:`BINARY_OP` | Replaced all numeric binary/in-place | +| | :opcode:`!INPLACE_*` | | opcodes with a single opcode | ++------------------------------------+------------------------------------+-----------------------------------------+ +| | :opcode:`!CALL_FUNCTION` | | :opcode:`CALL` | Decouples argument shifting for methods | +| | :opcode:`!CALL_FUNCTION_KW` | | :opcode:`!KW_NAMES` | from handling of keyword arguments; | +| | :opcode:`!CALL_METHOD` | | :opcode:`!PRECALL` | allows better specialization of calls | +| | | :opcode:`PUSH_NULL` | | ++------------------------------------+------------------------------------+-----------------------------------------+ +| | :opcode:`!DUP_TOP` | | :opcode:`COPY` | Stack manipulation instructions | +| | :opcode:`!DUP_TOP_TWO` | | :opcode:`SWAP` | | +| | :opcode:`!ROT_TWO` | | | +| | :opcode:`!ROT_THREE` | | | +| | :opcode:`!ROT_FOUR` | | | +| | :opcode:`!ROT_N` | | | ++------------------------------------+------------------------------------+-----------------------------------------+ +| | :opcode:`!JUMP_IF_NOT_EXC_MATCH` | | :opcode:`CHECK_EXC_MATCH` | Now performs check but doesn't jump | ++------------------------------------+------------------------------------+-----------------------------------------+ +| | :opcode:`!JUMP_ABSOLUTE` | | :opcode:`JUMP_BACKWARD` | See [#bytecode-jump]_; | +| | :opcode:`!POP_JUMP_IF_FALSE` | | :opcode:`!POP_JUMP_BACKWARD_IF_*`| ``TRUE``, ``FALSE``, | +| | :opcode:`!POP_JUMP_IF_TRUE` | | :opcode:`!POP_JUMP_FORWARD_IF_*` | ``NONE`` and ``NOT_NONE`` variants | +| | | for each direction | +| | | | ++------------------------------------+------------------------------------+-----------------------------------------+ +| | :opcode:`!SETUP_WITH` | :opcode:`BEFORE_WITH` | :keyword:`with` block setup | +| | :opcode:`!SETUP_ASYNC_WITH` | | | ++------------------------------------+------------------------------------+-----------------------------------------+ .. [#bytecode-jump] All jump opcodes are now relative, including the - existing :opcode:`JUMP_IF_TRUE_OR_POP` and :opcode:`JUMP_IF_FALSE_OR_POP`. + existing :opcode:`!JUMP_IF_TRUE_OR_POP` and :opcode:`!JUMP_IF_FALSE_OR_POP`. The argument is now an offset from the current instruction rather than an absolute location. @@ -1735,24 +1749,24 @@ Modules slated for removal in Python 3.13: +---------------------+---------------------+---------------------+---------------------+---------------------+ - | :mod:`aifc` | :mod:`chunk` | :mod:`msilib` | :mod:`pipes` | :mod:`telnetlib` | + | :mod:`!aifc` | :mod:`!chunk` | :mod:`!msilib` | :mod:`!pipes` | :mod:`!telnetlib` | +---------------------+---------------------+---------------------+---------------------+---------------------+ - | :mod:`audioop` | :mod:`crypt` | :mod:`nis` | :mod:`sndhdr` | :mod:`uu` | + | :mod:`!audioop` | :mod:`!crypt` | :mod:`!nis` | :mod:`!sndhdr` | :mod:`!uu` | +---------------------+---------------------+---------------------+---------------------+---------------------+ - | :mod:`cgi` | :mod:`imghdr` | :mod:`nntplib` | :mod:`spwd` | :mod:`xdrlib` | + | :mod:`!cgi` | :mod:`!imghdr` | :mod:`!nntplib` | :mod:`!spwd` | :mod:`!xdrlib` | +---------------------+---------------------+---------------------+---------------------+---------------------+ - | :mod:`cgitb` | :mod:`mailcap` | :mod:`ossaudiodev` | :mod:`sunau` | | + | :mod:`!cgitb` | :mod:`!mailcap` | :mod:`!ossaudiodev` | :mod:`!sunau` | | +---------------------+---------------------+---------------------+---------------------+---------------------+ (Contributed by Brett Cannon in :issue:`47061` and Victor Stinner in :gh:`68966`.) -* The :mod:`asynchat`, :mod:`asyncore` and :mod:`smtpd` modules have been +* The :mod:`!asynchat`, :mod:`!asyncore` and :mod:`!smtpd` modules have been deprecated since at least Python 3.6. Their documentation and deprecation warnings have now been updated to note they will be removed in Python 3.12. (Contributed by Hugo van Kemenade in :issue:`47022`.) -* The :mod:`lib2to3` package and :ref:`2to3 <2to3-reference>` tool +* The :mod:`!lib2to3` package and ``2to3`` tool are now deprecated and may not be able to parse Python 3.10 or newer. See :pep:`617`, introducing the new PEG parser, for details. (Contributed by Victor Stinner in :issue:`40360`.) @@ -1773,7 +1787,7 @@ Standard Library * the :class:`!configparser.SafeConfigParser` class * the :attr:`!configparser.ParsingError.filename` property - * the :meth:`configparser.RawConfigParser.readfp` method + * the :meth:`!configparser.RawConfigParser.readfp` method (Contributed by Hugo van Kemenade in :issue:`45173`.) @@ -1789,21 +1803,21 @@ Standard Library and will be removed in a future Python version, due to not supporting resources located within package subdirectories: - * :func:`importlib.resources.contents` - * :func:`importlib.resources.is_resource` - * :func:`importlib.resources.open_binary` - * :func:`importlib.resources.open_text` - * :func:`importlib.resources.read_binary` - * :func:`importlib.resources.read_text` - * :func:`importlib.resources.path` + * :func:`!importlib.resources.contents` + * :func:`!importlib.resources.is_resource` + * :func:`!importlib.resources.open_binary` + * :func:`!importlib.resources.open_text` + * :func:`!importlib.resources.read_binary` + * :func:`!importlib.resources.read_text` + * :func:`!importlib.resources.path` * The :func:`locale.getdefaultlocale` function is deprecated and will be - removed in Python 3.13. Use :func:`locale.setlocale`, + removed in Python 3.15. Use :func:`locale.setlocale`, :func:`locale.getpreferredencoding(False) ` and :func:`locale.getlocale` functions instead. (Contributed by Victor Stinner in :gh:`90817`.) -* The :func:`locale.resetlocale` function is deprecated and will be +* The :func:`!locale.resetlocale` function is deprecated and will be removed in Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. (Contributed by Victor Stinner in :gh:`90817`.) @@ -1821,7 +1835,7 @@ Standard Library They will be removed in Python 3.13. (Contributed by Serhiy Storchaka and Miro Hrončok in :gh:`92728`.) -* :func:`turtle.settiltangle` has been deprecated since Python 3.1; +* :func:`!turtle.settiltangle` has been deprecated since Python 3.1; it now emits a deprecation warning and will be removed in Python 3.13. Use :func:`turtle.tiltangle` instead (it was earlier incorrectly marked as deprecated, and its docstring is now corrected). @@ -1860,7 +1874,7 @@ Standard Library (Contributed by Erlend E. Aasland in :issue:`5846`.) -* :meth:`~!unittest.TestProgram.usageExit` is marked deprecated, to be removed +* :meth:`!unittest.TestProgram.usageExit` is marked deprecated, to be removed in 3.13. (Contributed by Carlos Damázio in :gh:`67048`.) @@ -1877,8 +1891,8 @@ and will be removed in Python 3.12. C APIs pending removal are :ref:`listed separately `. -* The :mod:`asynchat` module -* The :mod:`asyncore` module +* The :mod:`!asynchat` module +* The :mod:`!asyncore` module * The :ref:`entire distutils package ` * The :mod:`!imp` module * The :class:`typing.io ` namespace @@ -1902,10 +1916,10 @@ C APIs pending removal are * :func:`!importlib.util.set_package_wrapper` * :class:`!pkgutil.ImpImporter` * :class:`!pkgutil.ImpLoader` -* :meth:`pathlib.Path.link_to` +* :meth:`!pathlib.Path.link_to` * :func:`!sqlite3.enable_shared_cache` * :func:`!sqlite3.OptimizedUnicode` -* :envvar:`PYTHONTHREADDEBUG` environment variable +* :envvar:`!PYTHONTHREADDEBUG` environment variable * The following deprecated aliases in :mod:`unittest`: ============================ =============================== =============== @@ -1967,7 +1981,7 @@ Removed C APIs are :ref:`listed separately `. (Contributed by Victor Stinner in :issue:`45085`.) -* Removed the :mod:`distutils` ``bdist_msi`` command deprecated in Python 3.9. +* Removed the :mod:`!distutils` ``bdist_msi`` command deprecated in Python 3.9. Use ``bdist_wheel`` (wheel packages) instead. (Contributed by Hugo van Kemenade in :issue:`45124`.) @@ -2007,7 +2021,7 @@ Removed C APIs are :ref:`listed separately `. because it was not used and added by mistake in previous versions. (Contributed by Nikita Sobolev in :issue:`46483`.) -* Removed the :class:`!MailmanProxy` class in the :mod:`smtpd` module, +* Removed the :class:`!MailmanProxy` class in the :mod:`!smtpd` module, as it is unusable without the external :mod:`!mailman` package. (Contributed by Donghee Na in :issue:`35800`.) @@ -2018,8 +2032,8 @@ Removed C APIs are :ref:`listed separately `. It was introduced in Python 3.4 but has been broken since Python 3.7. (Contributed by Inada Naoki in :issue:`23882`.) -* Removed the undocumented private :meth:`!float.__set_format__()` method, - previously known as :meth:`!float.__setformat__()` in Python 3.7. +* Removed the undocumented private :meth:`!float.__set_format__` method, + previously known as :meth:`!float.__setformat__` in Python 3.7. Its docstring said: "You probably don't want to use this function. It exists mainly to be used in Python's test suite." (Contributed by Victor Stinner in :issue:`46852`.) @@ -2028,7 +2042,7 @@ Removed C APIs are :ref:`listed separately `. (and corresponding :c:macro:`!EXPERIMENTAL_ISOLATED_SUBINTERPRETERS` macro) have been removed. -* `Pynche `_ +* :pypi:`Pynche` --- The Pythonically Natural Color and Hue Editor --- has been moved out of ``Tools/scripts`` and is `being developed independently `_ from the Python source tree. @@ -2124,7 +2138,7 @@ Build Changes :issue:`45440` and :issue:`46640`.) * Support for `IEEE 754 `_ - floating point numbers. + floating-point numbers. (Contributed by Victor Stinner in :issue:`46917`.) * The :c:macro:`!Py_NO_NAN` macro has been removed. @@ -2295,7 +2309,7 @@ Porting to Python 3.11 as its second parameter, instead of ``PyFrameObject*``. See :pep:`523` for more details of how to use this function pointer type. -* :c:func:`PyCode_New` and :c:func:`PyCode_NewWithPosOnlyArgs` now take +* :c:func:`!PyCode_New` and :c:func:`!PyCode_NewWithPosOnlyArgs` now take an additional ``exception_table`` argument. Using these functions should be avoided, if at all possible. To get a custom code object: create a code object using the compiler, @@ -2402,7 +2416,7 @@ Porting to Python 3.11 been included directly, consider including ``Python.h`` instead. (Contributed by Victor Stinner in :issue:`35134`.) -* The :c:func:`PyUnicode_CHECK_INTERNED` macro has been excluded from the +* The :c:func:`!PyUnicode_CHECK_INTERNED` macro has been excluded from the limited C API. It was never usable there, because it used internal structures which are not available in the limited C API. (Contributed by Victor Stinner in :issue:`46007`.) @@ -2458,13 +2472,14 @@ Porting to Python 3.11 * ``f_valuestack``: removed. The Python frame object is now created lazily. A side effect is that the - ``f_back`` member must not be accessed directly, since its value is now also + :attr:`~frame.f_back` member must not be accessed directly, + since its value is now also computed lazily. The :c:func:`PyFrame_GetBack` function must be called instead. - Debuggers that accessed the ``f_locals`` directly *must* call + Debuggers that accessed the :attr:`~frame.f_locals` directly *must* call :c:func:`PyFrame_GetLocals` instead. They no longer need to call - :c:func:`PyFrame_FastToLocalsWithError` or :c:func:`PyFrame_LocalsToFast`, + :c:func:`!PyFrame_FastToLocalsWithError` or :c:func:`!PyFrame_LocalsToFast`, in fact they should not call those functions. The necessary updating of the frame is now managed by the virtual machine. @@ -2603,8 +2618,8 @@ and will be removed in Python 3.12. * :c:func:`!PyUnicode_GET_DATA_SIZE` * :c:func:`!PyUnicode_GET_SIZE` * :c:func:`!PyUnicode_GetSize` -* :c:func:`PyUnicode_IS_COMPACT` -* :c:func:`PyUnicode_IS_READY` +* :c:func:`!PyUnicode_IS_COMPACT` +* :c:func:`!PyUnicode_IS_READY` * :c:func:`PyUnicode_READY` * :c:func:`!PyUnicode_WSTR_LENGTH` * :c:func:`!_PyUnicode_AsUnicode` @@ -2659,7 +2674,7 @@ Removed (Contributed by Victor Stinner in :issue:`45474`.) * Exclude :c:func:`PyWeakref_GET_OBJECT` from the limited C API. It never - worked since the :c:type:`PyWeakReference` structure is opaque in the + worked since the :c:type:`!PyWeakReference` structure is opaque in the limited C API. (Contributed by Victor Stinner in :issue:`35134`.) @@ -2700,4 +2715,30 @@ Removed (Contributed by Inada Naoki in :issue:`44029`.) +Notable changes in 3.11.4 +========================= + +tarfile +------- + +* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, + have a new a *filter* argument that allows limiting tar features than may be + surprising or dangerous, such as creating files outside the destination + directory. + See :ref:`tarfile-extraction-filter` for details. + In Python 3.12, use without the *filter* argument will show a + :exc:`DeprecationWarning`. + In Python 3.14, the default will switch to ``'data'``. + (Contributed by Petr Viktorin in :pep:`706`.) + + +Notable changes in 3.11.5 +========================= + +OpenSSL +------- + +* Windows builds and macOS installers from python.org now use OpenSSL 3.0. + + .. _libb2: https://www.blake2.net/ diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index fad94d6d..d2b0911e 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -59,7 +59,7 @@ Summary -- Release highlights .. This section singles out the most important changes in Python 3.12. Brevity is key. -Python 3.12 is the latest stable release of the Python programming language, +Python 3.12 is a stable release of the Python programming language, with a mix of changes to the language and the standard library. The library changes focus on cleaning up deprecated APIs, usability, and correctness. Of note, the :mod:`!distutils` package has been removed from the standard library. @@ -121,7 +121,7 @@ Significant improvements in the standard library: * A :ref:`command-line interface ` has been added to the :mod:`uuid` module * Due to the changes in :ref:`PEP 701 `, - producing tokens via the :mod:`tokenize` module is up to up to 64% faster. + producing tokens via the :mod:`tokenize` module is up to 64% faster. Security improvements: @@ -154,7 +154,7 @@ Important deprecations, removals or restrictions: reducing the size of every :class:`str` object by at least 8 bytes. * :pep:`632`: Remove the :mod:`!distutils` package. - See `the migration guide `_ + See :pep:`the migration guide <0632#migration-advice>` for advice replacing the APIs it provided. The third-party `Setuptools `__ package continues to provide :mod:`!distutils`, @@ -303,7 +303,7 @@ Let's cover these in detail: See :pep:`701` for more details. As a positive side-effect of how this feature has been implemented (by parsing f-strings -with :pep:`the PEG parser <617>`, now error messages for f-strings are more precise +with :pep:`the PEG parser <617>`), now error messages for f-strings are more precise and include the exact location of the error. For example, in Python 3.11, the following f-string raises a :exc:`SyntaxError`: @@ -343,7 +343,9 @@ cores. This is currently only available through the C-API, though a Python API is :pep:`anticipated for 3.13 <554>`. Use the new :c:func:`Py_NewInterpreterFromConfig` function to -create an interpreter with its own GIL:: +create an interpreter with its own GIL: + +.. code-block:: c PyInterpreterConfig config = { .check_multi_interp_extensions = 1, @@ -354,10 +356,10 @@ create an interpreter with its own GIL:: if (PyStatus_Exception(status)) { return -1; } - /* The new interpeter is now active in the current thread. */ + /* The new interpreter is now active in the current thread. */ For further examples how to use the C-API for sub-interpreters with a -per-interpreter GIL, see :source:`Modules/_xxsubinterpretersmodule.c`. +per-interpreter GIL, see ``Modules/_xxsubinterpretersmodule.c``. (Contributed by Eric Snow in :gh:`104210`, etc.) @@ -688,7 +690,7 @@ csv * Add :const:`csv.QUOTE_NOTNULL` and :const:`csv.QUOTE_STRINGS` flags to provide finer grained control of ``None`` and empty strings by - :class:`csv.writer` objects. + :class:`~csv.reader` and :class:`~csv.writer` objects. dis --- @@ -716,12 +718,15 @@ importlib.resources * :func:`importlib.resources.as_file` now supports resource directories. (Contributed by Jason R. Coombs in :gh:`97930`.) +* Rename first parameter of :func:`importlib.resources.files` to *anchor*. + (Contributed by Jason R. Coombs in :gh:`100598`.) + inspect ------- * Add :func:`inspect.markcoroutinefunction` to mark sync functions that return a :term:`coroutine` for use with :func:`inspect.iscoroutinefunction`. - (Contributed Carlton Gibson in :gh:`99247`.) + (Contributed by Carlton Gibson in :gh:`99247`.) * Add :func:`inspect.getasyncgenstate` and :func:`inspect.getasyncgenlocals` for determining the current state of asynchronous generators. @@ -729,13 +734,12 @@ inspect * The performance of :func:`inspect.getattr_static` has been considerably improved. Most calls to the function should be at least 2x faster than they - were in Python 3.11, and some may be 6x faster or more. (Contributed by Alex - Waygood in :gh:`103193`.) + were in Python 3.11. (Contributed by Alex Waygood in :gh:`103193`.) itertools --------- -* Add :class:`itertools.batched()` for collecting into even-sized +* Add :func:`itertools.batched` for collecting into even-sized tuples where the last batch may be shorter than the rest. (Contributed by Raymond Hettinger in :gh:`98363`.) @@ -746,8 +750,8 @@ math (Contributed by Raymond Hettinger in :gh:`100485`.) * Extend :func:`math.nextafter` to include a *steps* argument - for moving up or down multiple steps at a time. - (By Matthias Goergens, Mark Dickinson, and Raymond Hettinger in :gh:`94906`.) + for moving up or down multiple steps at a time. (Contributed by + Matthias Goergens, Mark Dickinson, and Raymond Hettinger in :gh:`94906`.) os -- @@ -835,8 +839,7 @@ shutil * :func:`shutil.rmtree` now accepts a new argument *onexc* which is an error handler like *onerror* but which expects an exception instance - rather than a *(typ, val, tb)* triplet. *onerror* is deprecated and - will be removed in Python 3.14. + rather than a *(typ, val, tb)* triplet. *onerror* is deprecated. (Contributed by Irit Katriel in :gh:`102828`.) * :func:`shutil.which` now consults the *PATHEXT* environment variable to @@ -923,8 +926,6 @@ tempfile * :func:`tempfile.mkdtemp` now always returns an absolute path, even if the argument provided to the *dir* parameter is a relative path. -.. _whatsnew-typing-py312: - threading --------- @@ -959,6 +960,8 @@ types :ref:`user-defined-generics` when subclassed. (Contributed by James Hilton-Balfe and Alex Waygood in :gh:`101827`.) +.. _whatsnew-typing-py312: + typing ------ @@ -1002,8 +1005,8 @@ typing :func:`runtime-checkable protocols ` has changed significantly. Most ``isinstance()`` checks against protocols with only a few members should be at least 2x faster than in 3.11, and some may be 20x - faster or more. However, ``isinstance()`` checks against protocols with fourteen - or more members may be slower than in Python 3.11. (Contributed by Alex + faster or more. However, ``isinstance()`` checks against protocols with many + members may be slower than in Python 3.11. (Contributed by Alex Waygood in :gh:`74690` and :gh:`103193`.) * All :data:`typing.TypedDict` and :data:`typing.NamedTuple` classes now have the @@ -1248,18 +1251,18 @@ Deprecated :exc:`DeprecationWarning` when it can detect being called from a multithreaded process. There has always been a fundamental incompatibility with the POSIX platform when doing so. Even if such code *appeared* to work. - We added the warning to to raise awareness as issues encounted by code doing + We added the warning to raise awareness as issues encountered by code doing this are becoming more frequent. See the :func:`os.fork` documentation for more details along with `this discussion on fork being incompatible with threads - `_ for *why* we're now surfacing this + `_ for *why* we're now surfacing this longstanding platform compatibility problem to developers. When this warning appears due to usage of :mod:`multiprocessing` or :mod:`concurrent.futures` the fix is to use a different :mod:`multiprocessing` start method such as ``"spawn"`` or ``"forkserver"``. -* :mod:`shutil`: The *onerror* argument of :func:`shutil.rmtree` is deprecated and will be removed - in Python 3.14. Use *onexc* instead. (Contributed by Irit Katriel in :gh:`102828`.) +* :mod:`shutil`: The *onerror* argument of :func:`shutil.rmtree` is deprecated; + use *onexc* instead. (Contributed by Irit Katriel in :gh:`102828`.) * :mod:`sqlite3`: @@ -1286,8 +1289,9 @@ Deprecated * :mod:`typing`: - * :class:`typing.Hashable` and :class:`typing.Sized` aliases for :class:`collections.abc.Hashable` - and :class:`collections.abc.Sized`. (:gh:`94309`.) + * :class:`typing.Hashable` and :class:`typing.Sized`, aliases for + :class:`collections.abc.Hashable` and :class:`collections.abc.Sized` respectively, are + deprecated. (:gh:`94309`.) * :class:`typing.ByteString`, deprecated since Python 3.9, now causes a :exc:`DeprecationWarning` to be emitted when it is used. @@ -1305,149 +1309,39 @@ Deprecated may be removed in a future version of Python. Use the single-arg versions of these functions instead. (Contributed by Ofey Chan in :gh:`89874`.) -* :exc:`DeprecationWarning` is now raised when ``__package__`` on a - module differs from ``__spec__.parent`` (previously it was - :exc:`ImportWarning`). +* :exc:`DeprecationWarning` is now raised when :attr:`~module.__package__` on a + module differs from + :attr:`__spec__.parent ` (previously + it was :exc:`ImportWarning`). (Contributed by Brett Cannon in :gh:`65961`.) -* Setting ``__package__`` or ``__cached__`` on a module is deprecated, - and will cease to be set or taken into consideration by the import system in Python 3.14. - (Contributed by Brett Cannon in :gh:`65961`.) +* Setting :attr:`~module.__package__` or :attr:`~module.__cached__` on a + module is deprecated, and will cease to be set or taken into consideration by + the import system in Python 3.14. (Contributed by Brett Cannon in :gh:`65961`.) * The bitwise inversion operator (``~``) on bool is deprecated. It will throw an - error in Python 3.14. Use ``not`` for logical negation of bools instead. + error in Python 3.16. Use ``not`` for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlying ``int``, convert to int explicitly: ``~int(x)``. (Contributed by Tim Hoffmann in :gh:`103487`.) -* Accessing ``co_lnotab`` on code objects was deprecated in Python 3.10 via :pep:`626`, - but it only got a proper :exc:`DeprecationWarning` in 3.12, - therefore it will be removed in 3.14. +* Accessing :attr:`~codeobject.co_lnotab` on code objects was deprecated in + Python 3.10 via :pep:`626`, + but it only got a proper :exc:`DeprecationWarning` in 3.12. + May be removed in 3.15. (Contributed by Nikita Sobolev in :gh:`101866`.) -Pending Removal in Python 3.13 ------------------------------- +.. include:: ../deprecations/pending-removal-in-3.13.rst -The following modules and APIs have been deprecated in earlier Python releases, -and will be removed in Python 3.13. - -Modules (see :pep:`594`): - -* :mod:`aifc` -* :mod:`audioop` -* :mod:`cgi` -* :mod:`cgitb` -* :mod:`chunk` -* :mod:`crypt` -* :mod:`imghdr` -* :mod:`mailcap` -* :mod:`msilib` -* :mod:`nis` -* :mod:`nntplib` -* :mod:`ossaudiodev` -* :mod:`pipes` -* :mod:`sndhdr` -* :mod:`spwd` -* :mod:`sunau` -* :mod:`telnetlib` -* :mod:`uu` -* :mod:`xdrlib` - -Other modules: - -* :mod:`!lib2to3`, and the :program:`2to3` program (:gh:`84540`) - -APIs: - -* :class:`!configparser.LegacyInterpolation` (:gh:`90765`) -* :func:`locale.getdefaultlocale` (:gh:`90817`) -* :meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`) -* :func:`!unittest.findTestCases` (:gh:`50096`) -* :func:`!unittest.getTestCaseNames` (:gh:`50096`) -* :func:`!unittest.makeSuite` (:gh:`50096`) -* :meth:`!unittest.TestProgram.usageExit` (:gh:`67048`) -* :class:`!webbrowser.MacOSX` (:gh:`86421`) -* :class:`classmethod` descriptor chaining (:gh:`89519`) - -Pending Removal in Python 3.14 ------------------------------- +.. include:: ../deprecations/pending-removal-in-3.14.rst -The following APIs have been deprecated -and will be removed in Python 3.14. +.. include:: ../deprecations/pending-removal-in-3.15.rst -* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters - of :class:`!argparse.BooleanOptionalAction` +.. include:: ../deprecations/pending-removal-in-3.16.rst -* :mod:`ast`: - - * :class:`!ast.Num` - * :class:`!ast.Str` - * :class:`!ast.Bytes` - * :class:`!ast.NameConstant` - * :class:`!ast.Ellipsis` - -* :mod:`asyncio`: - - * :class:`!asyncio.MultiLoopChildWatcher` - * :class:`!asyncio.FastChildWatcher` - * :class:`!asyncio.AbstractChildWatcher` - * :class:`!asyncio.SafeChildWatcher` - * :func:`!asyncio.set_child_watcher` - * :func:`!asyncio.get_child_watcher`, - * :meth:`!asyncio.AbstractEventLoopPolicy.set_child_watcher` - * :meth:`!asyncio.AbstractEventLoopPolicy.get_child_watcher` - -* :mod:`collections.abc`: :class:`!collections.abc.ByteString`. - -* :mod:`email`: the *isdst* parameter in :func:`email.utils.localtime`. - -* :mod:`importlib.abc`: - - * :class:`!importlib.abc.ResourceReader` - * :class:`!importlib.abc.Traversable` - * :class:`!importlib.abc.TraversableResources` - -* :mod:`itertools`: Support for copy, deepcopy, and pickle operations. - -* :mod:`pkgutil`: - - * :func:`!pkgutil.find_loader` - * :func:`!pkgutil.get_loader`. - -* :mod:`pty`: - - * :func:`!pty.master_open` - * :func:`!pty.slave_open` - -* :mod:`shutil`: The *onerror* argument of :func:`shutil.rmtree` - -* :mod:`typing`: :class:`!typing.ByteString` - -* :mod:`xml.etree.ElementTree`: Testing the truth value of an :class:`xml.etree.ElementTree.Element`. - -* The ``__package__`` and ``__cached__`` attributes on module objects. - -* The ``co_lnotab`` attribute of code objects. - -Pending Removal in Future Versions ----------------------------------- - -The following APIs were deprecated in earlier Python versions and will be removed, -although there is currently no date scheduled for their removal. - -* :mod:`array`'s ``'u'`` format code (:gh:`57281`) - -* :class:`typing.Text` (:gh:`92332`) - -* Currently Python accepts numeric literals immediately followed by keywords, - for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing - and ambiguous expressions like ``[0x1for x in y]`` (which can be - interpreted as ``[0x1 for x in y]`` or ``[0x1f or x in y]``). - A syntax warning is raised if the numeric literal is - immediately followed by one of keywords :keyword:`and`, :keyword:`else`, - :keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` and :keyword:`or`. - In a future release it will be changed to a syntax error. (:gh:`87999`) +.. include:: ../deprecations/pending-removal-in-future.rst +.. _whatsnew312-removed: Removed ======= @@ -1474,6 +1368,8 @@ configparser * :class:`configparser.ConfigParser` no longer has a ``readfp`` method. Use :meth:`~configparser.ConfigParser.read_file` instead. +.. _whatsnew312-removed-distutils: + distutils --------- @@ -1531,9 +1427,9 @@ hashlib ------- * Remove the pure Python implementation of :mod:`hashlib`'s - :func:`hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and + :func:`hashlib.pbkdf2_hmac`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (:pep:`644`): this OpenSSL version provides - a C implementation of :func:`~hashlib.pbkdf2_hmac()` which is faster. + a C implementation of :func:`~hashlib.pbkdf2_hmac` which is faster. (Contributed by Victor Stinner in :gh:`94199`.) importlib @@ -1542,7 +1438,7 @@ importlib * Many previously deprecated cleanups in :mod:`importlib` have now been completed: - * References to, and support for :meth:`!module_repr()` has been removed. + * References to, and support for :meth:`!module_repr` has been removed. (Contributed by Barry Warsaw in :gh:`97850`.) * ``importlib.util.set_package``, ``importlib.util.set_loader`` and @@ -1555,6 +1451,8 @@ importlib * ``importlib.abc.Finder``, ``pkgutil.ImpImporter``, and ``pkgutil.ImpLoader`` have been removed. (Contributed by Barry Warsaw in :gh:`98040`.) +.. _whatsnew312-removed-imp: + imp --- @@ -1625,14 +1523,15 @@ locale use :func:`locale.format_string` instead. (Contributed by Victor Stinner in :gh:`94226`.) -* ``smtpd``: The module has been removed according to the schedule in :pep:`594`, +smtpd +----- + +* The ``smtpd`` module has been removed according to the schedule in :pep:`594`, having been deprecated in Python 3.4.7 and 3.5.4. - Use aiosmtpd_ PyPI module or any other + Use the :pypi:`aiosmtpd` PyPI module or any other :mod:`asyncio`-based server instead. (Contributed by Oleg Iarygin in :gh:`93243`.) -.. _aiosmtpd: https://pypi.org/project/aiosmtpd/ - sqlite3 ------- @@ -1669,9 +1568,8 @@ ssl instead, create a :class:`ssl.SSLContext` object and call its :class:`ssl.SSLContext.wrap_socket` method. Any package that still uses :func:`!ssl.wrap_socket` is broken and insecure. The function neither sends a - SNI TLS extension nor validates server hostname. Code is subject to `CWE-295 - `_: Improper Certificate - Validation. + SNI TLS extension nor validates the server hostname. Code is subject to :cwe:`295` + (Improper Certificate Validation). (Contributed by Victor Stinner in :gh:`94199`.) unittest @@ -1711,7 +1609,7 @@ unittest * Undocumented :meth:`TestLoader.loadTestsFromModule ` parameter *use_load_tests* - (deprecated and ignored since Python 3.2). + (deprecated and ignored since Python 3.5). * An alias of the :class:`~unittest.TextTestResult` class: ``_TextTestResult`` (deprecated in Python 3.2). @@ -1758,6 +1656,14 @@ Others (*ssl_context* in :mod:`imaplib`) instead. (Contributed by Victor Stinner in :gh:`94172`.) +* Remove ``Jython`` compatibility hacks from several stdlib modules and tests. + (Contributed by Nikita Sobolev in :gh:`99482`.) + +* Remove ``_use_broken_old_ctypes_structure_semantics_`` flag + from :mod:`ctypes` module. + (Contributed by Nikita Sobolev in :gh:`99285`.) + + .. _whatsnew312-porting-to-python312: Porting to Python 3.12 @@ -1792,7 +1698,7 @@ Changes in the Python API * Remove the ``asyncore``-based ``smtpd`` module deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is the - :mod:`asyncio`-based aiosmtpd_ PyPI module. + :mod:`asyncio`-based :pypi:`aiosmtpd` PyPI module. * :func:`shlex.split`: Passing ``None`` for *s* argument now raises an exception, rather than reading :data:`sys.stdin`. The feature was deprecated @@ -1869,6 +1775,15 @@ Changes in the Python API * Mixing tabs and spaces as indentation in the same file is not supported anymore and will raise a :exc:`TabError`. +* The :mod:`threading` module now expects the :mod:`!_thread` module to have + an ``_is_main_interpreter`` attribute. It is a function with no + arguments that returns ``True`` if the current interpreter is the + main interpreter. + + Any library or application that provides a custom ``_thread`` module + should provide ``_is_main_interpreter()``. + (See :gh:`112826`.) + Build Changes ============= @@ -1979,7 +1894,7 @@ New Features The :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` flags have been added. This allows extensions classes to support object - ``__dict__`` and weakrefs with less bookkeeping, + :attr:`~object.__dict__` and weakrefs with less bookkeeping, using less memory and with faster access. * API for performing calls using @@ -2098,7 +2013,7 @@ Porting to Python 3.12 internal-only field directly. To get a list of subclasses, call the Python method - :py:meth:`~class.__subclasses__` (using :c:func:`PyObject_CallMethod`, + :py:meth:`~type.__subclasses__` (using :c:func:`PyObject_CallMethod`, for example). * Add support of more formatting options (left aligning, octals, uppercase @@ -2117,14 +2032,14 @@ Porting to Python 3.12 :c:func:`PyUnicode_FromFormatV`. (Contributed by Philip Georgi in :gh:`95504`.) -* Extension classes wanting to add a ``__dict__`` or weak reference slot +* Extension classes wanting to add a :attr:`~object.__dict__` or weak reference slot should use :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead of ``tp_dictoffset`` and ``tp_weaklistoffset``, respectively. The use of ``tp_dictoffset`` and ``tp_weaklistoffset`` is still supported, but does not fully support multiple inheritance (:gh:`95589`), and performance may be worse. - Classes declaring :c:macro:`Py_TPFLAGS_MANAGED_DICT` should call + Classes declaring :c:macro:`Py_TPFLAGS_MANAGED_DICT` must call :c:func:`!_PyObject_VisitManagedDict` and :c:func:`!_PyObject_ClearManagedDict` to traverse and clear their instance's dictionaries. To clear weakrefs, call :c:func:`PyObject_ClearWeakRefs`, as before. @@ -2302,92 +2217,13 @@ Deprecated overrides :c:member:`~PyTypeObject.tp_new` is deprecated. Call the metaclass instead. -Pending Removal in Python 3.14 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. Add deprecations above alphabetically, not here at the end. -* The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules - (:pep:`699`; :gh:`101193`). +.. include:: ../deprecations/c-api-pending-removal-in-3.14.rst -* Global configuration variables: +.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst - * :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` - * :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose` - * :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet` - * :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` - * :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect` - * :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` - * :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` - * :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` - * :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` - * :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` - * :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` - * :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` - * :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` - * :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` - and :c:member:`PyConfig.hash_seed` - * :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` - * :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` - * :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` - * :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` - * :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` - * :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` - * :c:var:`!Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`) - - The :c:func:`Py_InitializeFromConfig` API should be used with - :c:type:`PyConfig` instead. - -* Creating :c:data:`immutable types ` with mutable - bases (:gh:`95388`). - -Pending Removal in Python 3.15 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule` -* :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` -* :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` -* Python initialization functions: - - * :c:func:`PySys_ResetWarnOptions`: clear :data:`sys.warnoptions` and - :data:`!warnings.filters` - * :c:func:`Py_GetExecPrefix`: get :data:`sys.exec_prefix` - * :c:func:`Py_GetPath`: get :data:`sys.path` - * :c:func:`Py_GetPrefix`: get :data:`sys.prefix` - * :c:func:`Py_GetProgramFullPath`: get :data:`sys.executable` - * :c:func:`Py_GetProgramName`: get :data:`sys.executable` - * :c:func:`Py_GetPythonHome`: get :c:member:`PyConfig.home` or - the :envvar:`PYTHONHOME` environment variable - -Pending Removal in Future Versions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The following APIs are deprecated and will be removed, -although there is currently no date scheduled for their removal. - -* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: unneeded since Python 3.8 -* :c:func:`PyErr_Fetch`: use :c:func:`PyErr_GetRaisedException` -* :c:func:`PyErr_NormalizeException`: use :c:func:`PyErr_GetRaisedException` -* :c:func:`PyErr_Restore`: use :c:func:`PyErr_SetRaisedException` -* :c:func:`PyModule_GetFilename`: use :c:func:`PyModule_GetFilenameObject` -* :c:func:`PyOS_AfterFork`: use :c:func:`PyOS_AfterFork_Child` -* :c:func:`PySlice_GetIndicesEx`: use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` -* :c:func:`!PyUnicode_AsDecodedObject`: use :c:func:`PyCodec_Decode` -* :c:func:`!PyUnicode_AsDecodedUnicode`: use :c:func:`PyCodec_Decode` -* :c:func:`!PyUnicode_AsEncodedObject`: use :c:func:`PyCodec_Encode` -* :c:func:`!PyUnicode_AsEncodedUnicode`: use :c:func:`PyCodec_Encode` -* :c:func:`PyUnicode_READY`: unneeded since Python 3.12 -* :c:func:`!PyErr_Display`: use :c:func:`PyErr_DisplayException` -* :c:func:`!_PyErr_ChainExceptions`: use ``_PyErr_ChainExceptions1`` -* :c:member:`!PyBytesObject.ob_shash` member: - call :c:func:`PyObject_Hash` instead -* :c:member:`!PyDictObject.ma_version_tag` member -* Thread Local Storage (TLS) API: - - * :c:func:`PyThread_create_key`: use :c:func:`PyThread_tss_alloc` - * :c:func:`PyThread_delete_key`: use :c:func:`PyThread_tss_free` - * :c:func:`PyThread_set_key_value`: use :c:func:`PyThread_tss_set` - * :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get` - * :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete` - * :c:func:`PyThread_ReInitTLS`: unneeded since Python 3.7 +.. include:: ../deprecations/c-api-pending-removal-in-future.rst Removed ------- @@ -2399,22 +2235,15 @@ Removed * Legacy Unicode APIs have been removed. See :pep:`623` for detail. - * :c:macro:`!PyUnicode_WCHAR_KIND` - * :c:func:`!PyUnicode_AS_UNICODE` - * :c:func:`!PyUnicode_AsUnicode` - * :c:func:`!PyUnicode_AsUnicodeAndSize` - * :c:func:`!PyUnicode_AS_DATA` - * :c:func:`!PyUnicode_FromUnicode` - * :c:func:`!PyUnicode_GET_SIZE` - * :c:func:`!PyUnicode_GetSize` - * :c:func:`!PyUnicode_GET_DATA_SIZE` + * :c:macro:`!PyUnicode_WCHAR_KIND` + * :c:func:`!PyUnicode_AS_UNICODE` + * :c:func:`!PyUnicode_AsUnicode` + * :c:func:`!PyUnicode_AsUnicodeAndSize` + * :c:func:`!PyUnicode_AS_DATA` + * :c:func:`!PyUnicode_FromUnicode` + * :c:func:`!PyUnicode_GET_SIZE` + * :c:func:`!PyUnicode_GetSize` + * :c:func:`!PyUnicode_GET_DATA_SIZE` * Remove the ``PyUnicode_InternImmortal()`` function macro. (Contributed by Victor Stinner in :gh:`85858`.) - -* Remove ``Jython`` compatibility hacks from several stdlib modules and tests. - (Contributed by Nikita Sobolev in :gh:`99482`.) - -* Remove ``_use_broken_old_ctypes_structure_semantics_`` flag - from :mod:`ctypes` module. - (Contributed by Nikita Sobolev in :gh:`99285`.) diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst new file mode 100644 index 00000000..237b1d5f --- /dev/null +++ b/Doc/whatsnew/3.13.rst @@ -0,0 +1,2721 @@ + +**************************** + What's New In Python 3.13 +**************************** + +:Editors: Adam Turner and Thomas Wouters + +.. Rules for maintenance: + + * Anyone can add text to this document. Do not spend very much time + on the wording of your changes, because your text will probably + get rewritten to some degree. + + * The maintainer will go through Misc/NEWS periodically and add + changes; it's therefore more important to add your changes to + Misc/NEWS than to this file. + + * This is not a complete list of every single change; completeness + is the purpose of Misc/NEWS. Some changes I consider too small + or esoteric to include. If such a change is added to the text, + I'll just remove it. (This is another reason you shouldn't spend + too much time on writing your addition.) + + * If you want to draw your new text to the attention of the + maintainer, add 'XXX' to the beginning of the paragraph or + section. + + * It's OK to just add a fragmentary note about a change. For + example: "XXX Describe the transmogrify() function added to the + socket module." The maintainer will research the change and + write the necessary text. + + * You can comment out your additions if you like, but it's not + necessary (especially when a final release is some months away). + + * Credit the author of a patch or bugfix. Just the name is + sufficient; the e-mail address isn't necessary. + + * It's helpful to add the issue number as a comment: + + XXX Describe the transmogrify() function added to the socket + module. + (Contributed by P.Y. Developer in :gh:`12345`.) + + This saves the maintainer the effort of going through the VCS log + when researching a change. + +This article explains the new features in Python 3.13, compared to 3.12. +Python 3.13 was released on October 7, 2024. +For full details, see the :ref:`changelog `. + +.. seealso:: + + :pep:`719` -- Python 3.13 Release Schedule + + +Summary -- Release Highlights +============================= + +.. This section singles out the most important changes in Python 3.13. + Brevity is key. + +Python 3.13 is the latest stable release of the Python programming +language, with a mix of changes to the language, the implementation +and the standard library. +The biggest changes include a new `interactive interpreter +`_, +experimental support for running in a `free-threaded mode +`_ (:pep:`703`), +and a `Just-In-Time compiler `_ (:pep:`744`). + +Error messages continue to improve, with tracebacks now highlighted in color +by default. The :func:`locals` builtin now has :ref:`defined semantics +` for changing the returned mapping, +and type parameters now support default values. + +The library changes contain removal of deprecated APIs and modules, +as well as the usual improvements in user-friendliness and correctness. +Several legacy standard library modules have now `been removed +`_ following their deprecation in Python 3.11 (:pep:`594`). + +This article doesn't attempt to provide a complete specification +of all new features, but instead gives a convenient overview. +For full details refer to the documentation, +such as the :ref:`Library Reference ` +and :ref:`Language Reference `. +To understand the complete implementation and design rationale for a change, +refer to the PEP for a particular new feature; +but note that PEPs usually are not kept up-to-date +once a feature has been fully implemented. +See `Porting to Python 3.13`_ for guidance on upgrading from +earlier versions of Python. + +-------------- + +.. PEP-sized items next. + +Interpreter improvements: + +* A greatly improved :ref:`interactive interpreter + ` and + :ref:`improved error messages `. +* :pep:`667`: The :func:`locals` builtin now has + :ref:`defined semantics ` when mutating the + returned mapping. Python debuggers and similar tools may now more reliably + update local variables in optimized scopes even during concurrent code + execution. +* :pep:`703`: CPython 3.13 has experimental support for running with the + :term:`global interpreter lock` disabled. See :ref:`Free-threaded CPython + ` for more details. +* :pep:`744`: A basic :ref:`JIT compiler ` was added. + It is currently disabled by default (though we may turn it on later). + Performance improvements are modest -- we expect to improve this + over the next few releases. +* Color support in the new :ref:`interactive interpreter + `, + as well as in :ref:`tracebacks ` + and :ref:`doctest ` output. + This can be disabled through the :envvar:`PYTHON_COLORS` and |NO_COLOR|_ + environment variables. + +Python data model improvements: + +* :attr:`~type.__static_attributes__` stores the names of attributes accessed + through ``self.X`` in any function in a class body. +* :attr:`~type.__firstlineno__` records the first line number of a class + definition. + +Significant improvements in the standard library: + +* Add a new :exc:`PythonFinalizationError` exception, raised when an operation + is blocked during :term:`finalization `. +* The :mod:`argparse` module now supports deprecating command-line options, + positional arguments, and subcommands. +* The new functions :func:`base64.z85encode` and :func:`base64.z85decode` + support encoding and decoding `Z85 data`_. +* The :mod:`copy` module now has a :func:`copy.replace` function, + with support for many builtin types and any class defining + the :func:`~object.__replace__` method. +* The new :mod:`dbm.sqlite3` module is now the default :mod:`dbm` backend. +* The :mod:`os` module has a :ref:`suite of new functions ` + for working with Linux's timer notification file descriptors. +* The :mod:`random` module now has a :ref:`command-line interface `. + +Security improvements: + +* :func:`ssl.create_default_context` sets :data:`ssl.VERIFY_X509_PARTIAL_CHAIN` + and :data:`ssl.VERIFY_X509_STRICT` as default flags. + +C API improvements: + +* The :c:data:`Py_mod_gil` slot is now used to indicate that + an extension module supports running with the :term:`GIL` disabled. +* The :doc:`PyTime C API ` has been added, + providing access to system clocks. +* :c:type:`PyMutex` is a new lightweight mutex that occupies a single byte. +* There is a new :ref:`suite of functions ` + for generating :pep:`669` monitoring events in the C API. + +New typing features: + +* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`, + and :data:`typing.TypeVarTuple`) now support defaults. +* :pep:`702`: The new :func:`warnings.deprecated` decorator adds support + for marking deprecations in the type system and at runtime. +* :pep:`705`: :data:`typing.ReadOnly` can be used to mark an item of a + :class:`typing.TypedDict` as read-only for type checkers. +* :pep:`742`: :data:`typing.TypeIs` provides more intuitive + type narrowing behavior, as an alternative to :data:`typing.TypeGuard`. + +Platform support: + +* :pep:`730`: Apple's iOS is now an :ref:`officially supported platform + `, at :pep:`tier 3 <11#tier-3>`. +* :pep:`738`: Android is now an :ref:`officially supported platform + `, at :pep:`tier 3 <11#tier-3>`. +* ``wasm32-wasi`` is now supported as a :pep:`tier 2 <11#tier-2>` platform. +* ``wasm32-emscripten`` is no longer an officially supported platform. + +Important removals: + +* :ref:`PEP 594 `: The remaining 19 "dead batteries" + (legacy stdlib modules) have been removed from the standard library: + :mod:`!aifc`, :mod:`!audioop`, :mod:`!cgi`, :mod:`!cgitb`, :mod:`!chunk`, + :mod:`!crypt`, :mod:`!imghdr`, :mod:`!mailcap`, :mod:`!msilib`, :mod:`!nis`, + :mod:`!nntplib`, :mod:`!ossaudiodev`, :mod:`!pipes`, :mod:`!sndhdr`, + :mod:`!spwd`, :mod:`!sunau`, :mod:`!telnetlib`, :mod:`!uu` and :mod:`!xdrlib`. +* Remove the :program:`2to3` tool and :mod:`!lib2to3` module + (deprecated in Python 3.11). +* Remove the :mod:`!tkinter.tix` module (deprecated in Python 3.6). +* Remove the :func:`!locale.resetlocale` function. +* Remove the :mod:`!typing.io` and :mod:`!typing.re` namespaces. +* Remove chained :class:`classmethod` descriptors. + +Release schedule changes: + +:pep:`602` ("Annual Release Cycle for Python") has been updated +to extend the full support ('bugfix') period for new releases to two years. +This updated policy means that: + +* Python 3.9--3.12 have one and a half years of full support, + followed by three and a half years of security fixes. +* Python 3.13 and later have two years of full support, + followed by three years of security fixes. + + +New Features +============ + + +.. _whatsnew313-better-interactive-interpreter: + +A better interactive interpreter +-------------------------------- + +Python now uses a new :term:`interactive` shell by default, based on code +from the `PyPy project`_. +When the user starts the :term:`REPL` from an interactive terminal, +the following new features are now supported: + +* Multiline editing with history preservation. +* Direct support for REPL-specific commands like :kbd:`help`, :kbd:`exit`, + and :kbd:`quit`, without the need to call them as functions. +* Prompts and tracebacks with :ref:`color enabled by default + `. +* Interactive help browsing using :kbd:`F1` with a separate command + history. +* History browsing using :kbd:`F2` that skips output as well as the + :term:`>>>` and :term:`...` prompts. +* "Paste mode" with :kbd:`F3` that makes pasting larger blocks of code + easier (press :kbd:`F3` again to return to the regular prompt). + +To disable the new interactive shell, +set the :envvar:`PYTHON_BASIC_REPL` environment variable. +For more on interactive mode, see :ref:`tut-interac`. + +(Contributed by Pablo Galindo Salgado, Łukasz Langa, and +Lysandros Nikolaou in :gh:`111201` based on code from the PyPy project. +Windows support contributed by Dino Viehland and Anthony Shaw.) + +.. _`PyPy project`: https://pypy.org/ + + +.. _whatsnew313-improved-error-messages: + +Improved error messages +----------------------- + +* The interpreter now uses color by default when displaying tracebacks in the + terminal. This feature :ref:`can be controlled ` + via the new :envvar:`PYTHON_COLORS` environment variable as well as + the canonical |NO_COLOR|_ and |FORCE_COLOR|_ environment variables. + (Contributed by Pablo Galindo Salgado in :gh:`112730`.) + +.. Apparently this how you hack together a formatted link: + (https://www.docutils.org/docs/ref/rst/directives.html#replacement-text) + +.. |FORCE_COLOR| replace:: ``FORCE_COLOR`` +.. _FORCE_COLOR: https://force-color.org/ + +.. |NO_COLOR| replace:: ``NO_COLOR`` +.. _NO_COLOR: https://no-color.org/ + +* A common mistake is to write a script with the same name as a + standard library module. When this results in errors, we now + display a more helpful error message: + + .. code-block:: pytb + + $ python random.py + Traceback (most recent call last): + File "/home/me/random.py", line 1, in + import random + File "/home/me/random.py", line 3, in + print(random.randint(5)) + ^^^^^^^^^^^^^^ + AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module) + + Similarly, if a script has the same name as a third-party + module that it attempts to import and this results in errors, + we also display a more helpful error message: + + .. code-block:: pytb + + $ python numpy.py + Traceback (most recent call last): + File "/home/me/numpy.py", line 1, in + import numpy as np + File "/home/me/numpy.py", line 3, in + np.array([1, 2, 3]) + ^^^^^^^^ + AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import) + + (Contributed by Shantanu Jain in :gh:`95754`.) + +* The error message now tries to suggest the correct keyword argument + when an incorrect keyword argument is passed to a function. + + .. code-block:: pycon + + >>> "Better error messages!".split(max_split=1) + Traceback (most recent call last): + File "", line 1, in + "Better error messages!".split(max_split=1) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ + TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'? + + (Contributed by Pablo Galindo Salgado and Shantanu Jain in :gh:`107944`.) + + +.. _whatsnew313-free-threaded-cpython: + +Free-threaded CPython +--------------------- + +CPython now has experimental support for running in a free-threaded mode, +with the :term:`global interpreter lock` (GIL) disabled. +This is an experimental feature and therefore is not enabled by default. +The free-threaded mode requires a different executable, +usually called ``python3.13t`` or ``python3.13t.exe``. +Pre-built binaries marked as *free-threaded* can be installed as part of +the official :ref:`Windows ` +and :ref:`macOS ` installers, +or CPython can be built from source with the :option:`--disable-gil` option. + +Free-threaded execution allows for full utilization of the available +processing power by running threads in parallel on available CPU cores. +While not all software will benefit from this automatically, programs +designed with threading in mind will run faster on multi-core hardware. +**The free-threaded mode is experimental** and work is ongoing to improve it: +expect some bugs and a substantial single-threaded performance hit. +Free-threaded builds of CPython support optionally running with the GIL +enabled at runtime using the environment variable :envvar:`PYTHON_GIL` or +the command-line option :option:`-X gil=1`. + +To check if the current interpreter supports free-threading, :option:`python -VV <-V>` +and :attr:`sys.version` contain "experimental free-threading build". +The new :func:`!sys._is_gil_enabled` function can be used to check whether +the GIL is actually disabled in the running process. + +C-API extension modules need to be built specifically for the free-threaded +build. Extensions that support running with the :term:`GIL` disabled should +use the :c:data:`Py_mod_gil` slot. Extensions using single-phase init should +use :c:func:`PyUnstable_Module_SetGIL` to indicate whether they support +running with the GIL disabled. Importing C extensions that don't use these +mechanisms will cause the GIL to be enabled, unless the GIL was explicitly +disabled with the :envvar:`PYTHON_GIL` environment variable or the +:option:`-X gil=0` option. +pip 24.1 or newer is required to install packages with C extensions in the +free-threaded build. + +This work was made possible thanks to many individuals and +organizations, including the large community of contributors to Python +and third-party projects to test and enable free-threading support. +Notable contributors include: +Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, +Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, +Lysandros Nikolaou, and many others. +Many of these contributors are employed by Meta, which has +provided significant engineering resources to support this project. + +.. seealso:: + + :pep:`703` "Making the Global Interpreter Lock Optional in CPython" + contains rationale and information surrounding this work. + + `Porting Extension Modules to Support Free-Threading + `_: A community-maintained + porting guide for extension authors. + + +.. _whatsnew313-jit-compiler: + +An experimental just-in-time (JIT) compiler +------------------------------------------- + +When CPython is configured and built using +the :option:`!--enable-experimental-jit` option, +a just-in-time (JIT) compiler is added which may speed up some Python programs. +On Windows, use ``PCbuild/build.bat --experimental-jit`` to enable the JIT +or ``--experimental-jit-interpreter`` to enable the Tier 2 interpreter. +Build requirements and further supporting information `are contained at`__ +:file:`Tools/jit/README.md`. + +__ https://github.com/python/cpython/blob/main/Tools/jit/README.md + +The :option:`!--enable-experimental-jit` option takes these (optional) values, +defaulting to ``yes`` if :option:`!--enable-experimental-jit` is present +without the optional value. + +* ``no``: Disable the entire Tier 2 and JIT pipeline. +* ``yes``: Enable the JIT. + To disable the JIT at runtime, pass the environment variable ``PYTHON_JIT=0``. +* ``yes-off``: Build the JIT but disable it by default. + To enable the JIT at runtime, pass the environment variable ``PYTHON_JIT=1``. +* ``interpreter``: Enable the Tier 2 interpreter but disable the JIT. + The interpreter can be disabled by running with ``PYTHON_JIT=0``. + +The internal architecture is roughly as follows: + +* We start with specialized *Tier 1 bytecode*. + See :ref:`What's new in 3.11 ` for details. +* When the Tier 1 bytecode gets hot enough, it gets translated + to a new purely internal intermediate representation (IR), + called the *Tier 2 IR*, and sometimes referred to as micro-ops ("uops"). +* The Tier 2 IR uses the same stack-based virtual machine as Tier 1, + but the instruction format is better suited to translation to machine code. +* We have several optimization passes for Tier 2 IR, which are applied + before it is interpreted or translated to machine code. +* There is a Tier 2 interpreter, but it is mostly intended for debugging + the earlier stages of the optimization pipeline. + The Tier 2 interpreter can be enabled by configuring Python + with ``--enable-experimental-jit=interpreter``. +* When the JIT is enabled, the optimized + Tier 2 IR is translated to machine code, which is then executed. +* The machine code translation process uses a technique called + *copy-and-patch*. It has no runtime dependencies, but there is a new + build-time dependency on LLVM. + +.. seealso:: :pep:`744` + +(JIT by Brandt Bucher, inspired by a paper by Haoran Xu and Fredrik Kjolstad. +Tier 2 IR by Mark Shannon and Guido van Rossum. +Tier 2 optimizer by Ken Jin.) + + +.. _whatsnew313-locals-semantics: + +Defined mutation semantics for :py:func:`locals` +------------------------------------------------ + +Historically, the expected result of mutating the return value of +:func:`locals` has been left to individual Python implementations to define. +Starting from Python 3.13, :pep:`667` standardises +the historical behavior of CPython for most code execution scopes, +but changes :term:`optimized scopes ` +(functions, generators, coroutines, comprehensions, and generator expressions) +to explicitly return independent snapshots of the currently assigned local +variables, including locally referenced nonlocal variables captured in closures. + +This change to the semantics of :func:`locals` in optimized scopes also +affects the default behavior of code execution functions that implicitly +target :func:`!locals` if no explicit namespace is provided +(such as :func:`exec` and :func:`eval`). +In previous versions, whether or not changes could be accessed by calling +:func:`!locals` after calling the code execution function was +implementation-dependent. In CPython specifically, such code would typically +appear to work as desired, but could sometimes fail in optimized scopes based +on other code (including debuggers and code execution tracing tools) +potentially resetting the shared snapshot in that scope. +Now, the code will always run against an independent snapshot of +the local variables in optimized scopes, and hence the changes will never +be visible in subsequent calls to :func:`!locals`. +To access the changes made in these cases, an explicit namespace reference +must now be passed to the relevant function. +Alternatively, it may make sense to update affected code to use a higher level +code execution API that returns the resulting code execution namespace +(e.g. :func:`runpy.run_path` when executing Python files from disk). + +To ensure debuggers and similar tools can reliably update local variables in +scopes affected by this change, :attr:`FrameType.f_locals ` now +returns a write-through proxy to the frame's local and locally referenced +nonlocal variables in these scopes, rather than returning an inconsistently +updated shared ``dict`` instance with undefined runtime semantics. + +See :pep:`667` for more details, including related C API changes +and deprecations. Porting notes are also provided below for the affected +:ref:`Python APIs ` and :ref:`C APIs +`. + +(PEP and implementation contributed by Mark Shannon and Tian Gao in +:gh:`74929`. Documentation updates provided by Guido van Rossum and +Alyssa Coghlan.) + + +.. _whatsnew313-platform-support: + +Support for mobile platforms +---------------------------- + +:pep:`730`: iOS is now a :pep:`11` supported platform, with the +``arm64-apple-ios`` and ``arm64-apple-ios-simulator`` targets at tier 3 +(iPhone and iPad devices released after 2013 and the Xcode iOS simulator +running on Apple silicon hardware, respectively). +``x86_64-apple-ios-simulator`` +(the Xcode iOS simulator running on older ``x86_64`` hardware) +is not a tier 3 supported platform, but will have best-effort support. +(PEP written and implementation contributed by Russell Keith-Magee in +:gh:`114099`.) + +:pep:`738`: Android is now a :pep:`11` supported platform, with the +``aarch64-linux-android`` and ``x86_64-linux-android`` targets at tier 3. +The 32-bit targets ``arm-linux-androideabi`` and ``i686-linux-android`` +are not tier 3 supported platforms, but will have best-effort support. +(PEP written and implementation contributed by Malcolm Smith in +:gh:`116622`.) + +.. seealso:: :pep:`730`, :pep:`738` + + +Other Language Changes +====================== + +* The compiler now strips common leading whitespace + from every line in a docstring. + This reduces the size of the :term:`bytecode cache ` + (such as ``.pyc`` files), with reductions in file size of around 5%, + for example in :mod:`!sqlalchemy.orm.session` from SQLAlchemy 2.0. + This change affects tools that use docstrings, such as :mod:`doctest`. + + .. doctest:: + + >>> def spam(): + ... """ + ... This is a docstring with + ... leading whitespace. + ... + ... It even has multiple paragraphs! + ... """ + ... + >>> spam.__doc__ + '\nThis is a docstring with\n leading whitespace.\n\nIt even has multiple paragraphs!\n' + + (Contributed by Inada Naoki in :gh:`81283`.) + +* :ref:`Annotation scopes ` within class scopes + can now contain lambdas and comprehensions. + Comprehensions that are located within class scopes + are not inlined into their parent scope. + + .. code-block:: python + + class C[T]: + type Alias = lambda: T + + (Contributed by Jelle Zijlstra in :gh:`109118` and :gh:`118160`.) + +* :ref:`Future statements ` are no longer triggered by + relative imports of the :mod:`__future__` module, + meaning that statements of the form ``from .__future__ import ...`` + are now simply standard relative imports, with no special features activated. + (Contributed by Jeremiah Gabriel Pascual in :gh:`118216`.) + +* :keyword:`global` declarations are now permitted in :keyword:`except` blocks + when that global is used in the :keyword:`else` block. + Previously this raised an erroneous :exc:`SyntaxError`. + (Contributed by Irit Katriel in :gh:`111123`.) + +* Add :envvar:`PYTHON_FROZEN_MODULES`, a new environment variable that + determines whether frozen modules are ignored by the import machinery, + equivalent to the :option:`-X frozen_modules <-X>` command-line option. + (Contributed by Yilei Yang in :gh:`111374`.) + +* Add :ref:`support for the perf profiler ` working + without `frame pointers `_ through + the new environment variable :envvar:`PYTHON_PERF_JIT_SUPPORT` + and command-line option :option:`-X perf_jit <-X>`. + (Contributed by Pablo Galindo in :gh:`118518`.) + +* The location of a :file:`.python_history` file can be changed via the + new :envvar:`PYTHON_HISTORY` environment variable. + (Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade + in :gh:`73965`.) + +* Classes have a new :attr:`~type.__static_attributes__` attribute. + This is populated by the compiler with a tuple of the class's attribute names + which are assigned through ``self.`` from any function in its body. + (Contributed by Irit Katriel in :gh:`115775`.) + +* The compiler now creates a :attr:`!__firstlineno__` attribute on classes + with the line number of the first line of the class definition. + (Contributed by Serhiy Storchaka in :gh:`118465`.) + +* The :func:`exec` and :func:`eval` builtins now accept + the *globals* and *locals* arguments as keywords. + (Contributed by Raphael Gaschignard in :gh:`105879`) + +* The :func:`compile` builtin now accepts a new flag, + ``ast.PyCF_OPTIMIZED_AST``, which is similar to ``ast.PyCF_ONLY_AST`` + except that the returned AST is optimized according to + the value of the *optimize* argument. + (Contributed by Irit Katriel in :gh:`108113`). + +* Add a :attr:`~property.__name__` attribute on :class:`property` objects. + (Contributed by Eugene Toder in :gh:`101860`.) + +* Add :exc:`PythonFinalizationError`, a new exception derived from + :exc:`RuntimeError` and used to signal when operations are blocked + during :term:`finalization `. + The following callables now raise :exc:`!PythonFinalizationError`, + instead of :exc:`RuntimeError`: + + * :func:`_thread.start_new_thread` + * :func:`os.fork` + * :func:`os.forkpty` + * :class:`subprocess.Popen` + + (Contributed by Victor Stinner in :gh:`114570`.) + +* Allow the *count* argument of :meth:`str.replace` to be a keyword. + (Contributed by Hugo van Kemenade in :gh:`106487`.) + +* Many functions now emit a warning if a boolean value is passed as + a file descriptor argument. + This can help catch some errors earlier. + (Contributed by Serhiy Storchaka in :gh:`82626`.) + +* Added :attr:`!name` and :attr:`!mode` attributes + for compressed and archived file-like objects in + the :mod:`bz2`, :mod:`lzma`, :mod:`tarfile`, and :mod:`zipfile` modules. + (Contributed by Serhiy Storchaka in :gh:`115961`.) + + +New Modules +=========== + +* :mod:`dbm.sqlite3`: An SQLite backend for :mod:`dbm`. + (Contributed by Raymond Hettinger and Erlend E. Aasland in :gh:`100414`.) + + +Improved Modules +================ + + +argparse +-------- + +* Add the *deprecated* parameter to the + :meth:`~argparse.ArgumentParser.add_argument` + and :meth:`!add_parser` methods, to enable deprecating + command-line options, positional arguments, and subcommands. + (Contributed by Serhiy Storchaka in :gh:`83648`.) + + +array +----- + +* Add the ``'w'`` type code (``Py_UCS4``) for Unicode characters. + It should be used instead of the deprecated ``'u'`` type code. + (Contributed by Inada Naoki in :gh:`80480`.) + +* Register :class:`array.array` as a :class:`~collections.abc.MutableSequence` + by implementing the :meth:`~array.array.clear` method. + (Contributed by Mike Zimin in :gh:`114894`.) + + +ast +--- + +* The constructors of node types in the :mod:`ast` module are now + stricter in the arguments they accept, + with more intuitive behavior when arguments are omitted. + + If an optional field on an AST node is not included as an argument when + constructing an instance, the field will now be set to ``None``. Similarly, + if a list field is omitted, that field will now be set to an empty list, + and if an :class:`!expr_context` field is omitted, it defaults to + :class:`Load() `. + (Previously, in all cases, the attribute would be missing on the newly + constructed AST node instance.) + + In all other cases, where a required argument is omitted, + the node constructor will emit a :exc:`DeprecationWarning`. + This will raise an exception in Python 3.15. + Similarly, passing a keyword argument to the constructor + that does not map to a field on the AST node is now deprecated, + and will raise an exception in Python 3.15. + + These changes do not apply to user-defined subclasses of :class:`ast.AST` + unless the class opts in to the new behavior + by defining the :attr:`.AST._field_types` mapping. + + (Contributed by Jelle Zijlstra in :gh:`105858`, :gh:`117486`, and :gh:`118851`.) + +* :func:`ast.parse` now accepts an optional argument *optimize* + which is passed on to :func:`compile`. + This makes it possible to obtain an optimized AST. + (Contributed by Irit Katriel in :gh:`108113`.) + + +asyncio +------- + +* :func:`asyncio.as_completed` now returns an object that is both an + :term:`asynchronous iterator` and a plain :term:`iterator` + of :term:`awaitables `. + The awaitables yielded by asynchronous iteration include original task + or future objects that were passed in, + making it easier to associate results with the tasks being completed. + (Contributed by Justin Arthur in :gh:`77714`.) + +* :meth:`asyncio.loop.create_unix_server` will now automatically remove + the Unix socket when the server is closed. + (Contributed by Pierre Ossman in :gh:`111246`.) + +* :meth:`.DatagramTransport.sendto` will now send zero-length + datagrams if called with an empty bytes object. + The transport flow control also now accounts for the datagram header + when calculating the buffer size. + (Contributed by Jamie Phan in :gh:`115199`.) + +* Add :meth:`Queue.shutdown ` + and :exc:`~asyncio.QueueShutDown` to manage queue termination. + (Contributed by Laurie Opperman and Yves Duprat in :gh:`104228`.) + +* Add the :meth:`.Server.close_clients` and :meth:`.Server.abort_clients` + methods, which more forcefully close an asyncio server. + (Contributed by Pierre Ossman in :gh:`113538`.) + +* Accept a tuple of separators in :meth:`.StreamReader.readuntil`, + stopping when any one of them is encountered. + (Contributed by Bruce Merry in :gh:`81322`.) + +* Improve the behavior of :class:`~asyncio.TaskGroup` when + an external cancellation collides with an internal cancellation. + For example, when two task groups are nested + and both experience an exception in a child task simultaneously, + it was possible that the outer task group would hang, + because its internal cancellation was swallowed by the inner task group. + + In the case where a task group is cancelled externally + and also must raise an :exc:`ExceptionGroup`, + it will now call the parent task's :meth:`~asyncio.Task.cancel` method. + This ensures that a :exc:`~asyncio.CancelledError` will be raised + at the next :keyword:`await`, so the cancellation is not lost. + + An added benefit of these changes is that task groups now preserve + the cancellation count (:meth:`~asyncio.Task.cancelling`). + + In order to handle some corner cases, :meth:`~asyncio.Task.uncancel` may now + reset the undocumented ``_must_cancel`` flag + when the cancellation count reaches zero. + + (Inspired by an issue reported by Arthur Tacca in :gh:`116720`.) + +* When :meth:`.TaskGroup.create_task` is called on an inactive + :class:`~asyncio.TaskGroup`, the given coroutine will be closed (which + prevents a :exc:`RuntimeWarning` about the given coroutine being + never awaited). + (Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.) + + +base64 +------ + +* Add :func:`~base64.z85encode` and :func:`~base64.z85decode` functions + for encoding :class:`bytes` as `Z85 data`_ + and decoding Z85-encoded data to :class:`!bytes`. + (Contributed by Matan Perelman in :gh:`75299`.) + + .. _Z85 data: https://rfc.zeromq.org/spec/32/ + + +compileall +---------- + +* The default number of worker threads and processes is now selected using + :func:`os.process_cpu_count` instead of :func:`os.cpu_count`. + (Contributed by Victor Stinner in :gh:`109649`.) + + +concurrent.futures +------------------ + +* The default number of worker threads and processes is now selected using + :func:`os.process_cpu_count` instead of :func:`os.cpu_count`. + (Contributed by Victor Stinner in :gh:`109649`.) + + +configparser +------------ + +* :class:`~configparser.ConfigParser` now has support for unnamed sections, + which allows for top-level key-value pairs. + This can be enabled with the new *allow_unnamed_section* parameter. + (Contributed by Pedro Sousa Lacerda in :gh:`66449`.) + + +copy +---- + +* The new :func:`~copy.replace` function and the :meth:`replace protocol + ` make creating modified copies of objects much simpler. + This is especially useful when working with immutable objects. + The following types support the :func:`~copy.replace` function + and implement the replace protocol: + + * :func:`collections.namedtuple` + * :class:`dataclasses.dataclass` + * :class:`datetime.datetime`, :class:`datetime.date`, :class:`datetime.time` + * :class:`inspect.Signature`, :class:`inspect.Parameter` + * :class:`types.SimpleNamespace` + * :ref:`code objects ` + + Any user-defined class can also support :func:`copy.replace` by defining + the :meth:`~object.__replace__` method. + (Contributed by Serhiy Storchaka in :gh:`108751`.) + + +ctypes +------ + +* As a consequence of necessary internal refactoring, initialization of + internal metaclasses now happens in ``__init__`` rather + than in ``__new__``. This affects projects that subclass these internal + metaclasses to provide custom initialization. + Generally: + + - Custom logic that was done in ``__new__`` after calling ``super().__new__`` + should be moved to ``__init__``. + - To create a class, call the metaclass, not only the metaclass's + ``__new__`` method. + + See :gh:`124520` for discussion and links to changes in some affected + projects. + +* :class:`ctypes.Structure` objects have a new :attr:`~ctypes.Structure._align_` + attribute which allows the alignment of the structure being packed to/from + memory to be specified explicitly. + (Contributed by Matt Sanderson in :gh:`112433`) + +dbm +--- + +* Add :mod:`dbm.sqlite3`, a new module which implements an SQLite backend, + and make it the default :mod:`!dbm` backend. + (Contributed by Raymond Hettinger and Erlend E. Aasland in :gh:`100414`.) + +* Allow removing all items from the database through + the new :meth:`.gdbm.clear` and :meth:`.ndbm.clear` methods. + (Contributed by Donghee Na in :gh:`107122`.) + + +dis +--- + +* Change the output of :mod:`dis` module functions to show logical + labels for jump targets and exception handlers, rather than offsets. + The offsets can be added with the new + :option:`-O ` command-line option + or the *show_offsets* argument. + (Contributed by Irit Katriel in :gh:`112137`.) + +* :meth:`~dis.get_instructions` no longer represents cache entries + as separate instructions. + Instead, it returns them as part of the :class:`~dis.Instruction`, + in the new *cache_info* field. + The *show_caches* argument to :meth:`~dis.get_instructions` is deprecated + and no longer has any effect. + (Contributed by Irit Katriel in :gh:`112962`.) + + +.. _whatsnew313-doctest: + +doctest +------- + +* :mod:`doctest` output is now colored by default. + This can be controlled via the new :envvar:`PYTHON_COLORS` environment + variable as well as the canonical |NO_COLOR|_ + and |FORCE_COLOR|_ environment variables. + See also :ref:`using-on-controlling-color`. + (Contributed by Hugo van Kemenade in :gh:`117225`.) + +* The :meth:`.DocTestRunner.run` method now counts the number of skipped tests. + Add the :attr:`.DocTestRunner.skips` and :attr:`.TestResults.skipped` attributes. + (Contributed by Victor Stinner in :gh:`108794`.) + + +email +----- + +* Headers with embedded newlines are now quoted on output. + The :mod:`~email.generator` will now refuse to serialize (write) headers + that are improperly folded or delimited, such that they would be parsed as + multiple headers or joined with adjacent data. + If you need to turn this safety feature off, + set :attr:`~email.policy.Policy.verify_generated_headers`. + (Contributed by Bas Bloemsaat and Petr Viktorin in :gh:`121650`.) + +* :func:`~email.utils.getaddresses` and :func:`~email.utils.parseaddr` now + return ``('', '')`` pairs in more situations where invalid email addresses + are encountered instead of potentially inaccurate values. + The two functions have a new optional *strict* parameter (default ``True``). + To get the old behavior (accepting malformed input), use ``strict=False``. + ``getattr(email.utils, 'supports_strict_parsing', False)`` can be used + to check if the *strict* parameter is available. + (Contributed by Thomas Dwyer and Victor Stinner for :gh:`102988` to improve + the :cve:`2023-27043` fix.) + + +fractions +--------- + +* :class:`~fractions.Fraction` objects now support the standard + :ref:`format specification mini-language ` rules + for fill, alignment, sign handling, minimum width, and grouping. + (Contributed by Mark Dickinson in :gh:`111320`.) + + +glob +---- + +* Add :func:`~glob.translate`, a function to convert a path specification + with shell-style wildcards to a regular expression. + (Contributed by Barney Gale in :gh:`72904`.) + + +importlib +--------- + +* The following functions in :mod:`importlib.resources` now allow accessing + a directory (or tree) of resources, using multiple positional arguments + (the *encoding* and *errors* arguments in the text-reading functions + are now keyword-only): + + * :func:`~importlib.resources.is_resource` + * :func:`~importlib.resources.open_binary` + * :func:`~importlib.resources.open_text` + * :func:`~importlib.resources.path` + * :func:`~importlib.resources.read_binary` + * :func:`~importlib.resources.read_text` + + These functions are no longer deprecated and are not scheduled for removal. + (Contributed by Petr Viktorin in :gh:`116608`.) + +* :func:`~importlib.resources.contents` remains deprecated in favor of + the fully-featured :class:`~importlib.resources.abc.Traversable` API. + However, there is now no plan to remove it. + (Contributed by Petr Viktorin in :gh:`116608`.) + + +io +-- + +* The :class:`~io.IOBase` finalizer now logs any errors raised by + the :meth:`~io.IOBase.close` method with :data:`sys.unraisablehook`. + Previously, errors were ignored silently by default, + and only logged in :ref:`Python Development Mode ` + or when using a :ref:`Python debug build `. + (Contributed by Victor Stinner in :gh:`62948`.) + + +ipaddress +--------- + +* Add the :attr:`.IPv4Address.ipv6_mapped` property, + which returns the IPv4-mapped IPv6 address. + (Contributed by Charles Machalow in :gh:`109466`.) + +* Fix ``is_global`` and ``is_private`` behavior in + :class:`~ipaddress.IPv4Address`, :class:`~ipaddress.IPv6Address`, + :class:`~ipaddress.IPv4Network`, and :class:`~ipaddress.IPv6Network`. + (Contributed by Jakub Stasiak in :gh:`113171`.) + + +itertools +--------- + +* :func:`~itertools.batched` has a new *strict* parameter, + which raises a :exc:`ValueError` if the final batch is shorter + than the specified batch size. + (Contributed by Raymond Hettinger in :gh:`113202`.) + + +marshal +------- + +* Add the *allow_code* parameter in module functions. + Passing ``allow_code=False`` prevents serialization and de-serialization + of code objects which are incompatible between Python versions. + (Contributed by Serhiy Storchaka in :gh:`113626`.) + + +math +---- + +* The new function :func:`~math.fma` performs fused multiply-add operations. + This computes ``x * y + z`` with only a single round, + and so avoids any intermediate loss of precision. + It wraps the ``fma()`` function provided by C99, + and follows the specification of the IEEE 754 "fusedMultiplyAdd" operation + for special cases. + (Contributed by Mark Dickinson and Victor Stinner in :gh:`73468`.) + + +mimetypes +--------- + +* Add the :func:`~mimetypes.guess_file_type` function to guess a MIME type + from a filesystem path. + Using paths with :func:`~mimetypes.guess_type` is now :term:`soft deprecated`. + (Contributed by Serhiy Storchaka in :gh:`66543`.) + + +mmap +---- + +* :class:`~mmap.mmap` is now protected from crashing on Windows when the + mapped memory is inaccessible due to file system errors or access violations. + (Contributed by Jannis Weigend in :gh:`118209`.) + +* :class:`~mmap.mmap` has a new :meth:`~mmap.mmap.seekable` method + that can be used when a seekable file-like object is required. + The :meth:`~mmap.mmap.seek` method now returns the new absolute position. + (Contributed by Donghee Na and Sylvie Liberman in :gh:`111835`.) + +* The new UNIX-only *trackfd* parameter for :class:`~mmap.mmap` controls + file descriptor duplication; + if false, the file descriptor specified by *fileno* will not be duplicated. + (Contributed by Zackery Spytz and Petr Viktorin in :gh:`78502`.) + + +multiprocessing +--------------- + +* The default number of worker threads and processes is now selected using + :func:`os.process_cpu_count` instead of :func:`os.cpu_count`. + (Contributed by Victor Stinner in :gh:`109649`.) + + +os +-- + +* Add :func:`~os.process_cpu_count` function to get the number + of logical CPU cores usable by the calling thread of the current process. + (Contributed by Victor Stinner in :gh:`109649`.) + +* :func:`~os.cpu_count` and :func:`~os.process_cpu_count` can be overridden + through the new environment variable :envvar:`PYTHON_CPU_COUNT` + or the new command-line option :option:`-X cpu_count <-X>`. + This option is useful for users who need to limit CPU resources + of a container system without having to modify application code + or the container itself. + (Contributed by Donghee Na in :gh:`109595`.) + +* Add a :ref:`low level interface ` to Linux's + :manpage:`timer file descriptors ` + via :func:`~os.timerfd_create`, + :func:`~os.timerfd_settime`, :func:`~os.timerfd_settime_ns`, + :func:`~os.timerfd_gettime`, :func:`~os.timerfd_gettime_ns`, + :const:`~os.TFD_NONBLOCK`, :const:`~os.TFD_CLOEXEC`, + :const:`~os.TFD_TIMER_ABSTIME`, and :const:`~os.TFD_TIMER_CANCEL_ON_SET` + (Contributed by Masaru Tsuchiyama in :gh:`108277`.) + +* :func:`~os.lchmod` and the *follow_symlinks* argument of :func:`~os.chmod` + are both now available on Windows. + Note that the default value of *follow_symlinks* + in :func:`!lchmod` is ``False`` on Windows. + (Contributed by Serhiy Storchaka in :gh:`59616`.) + +* :func:`~os.fchmod` and support for file descriptors in :func:`~os.chmod` + are both now available on Windows. + (Contributed by Serhiy Storchaka in :gh:`113191`.) + +* On Windows, :func:`~os.mkdir` and :func:`~os.makedirs` now support passing + a *mode* value of ``0o700`` to apply access control to the new directory. + This implicitly affects :func:`tempfile.mkdtemp` + and is a mitigation for :cve:`2024-4030`. + Other values for *mode* continue to be ignored. + (Contributed by Steve Dower in :gh:`118486`.) + +* :func:`~os.posix_spawn` now accepts ``None`` for the *env* argument, + which makes the newly spawned process use the current process environment. + (Contributed by Jakub Kulik in :gh:`113119`.) + +* :func:`~os.posix_spawn` can now use the :attr:`~os.POSIX_SPAWN_CLOSEFROM` + attribute in the *file_actions* parameter on platforms that support + :c:func:`!posix_spawn_file_actions_addclosefrom_np`. + (Contributed by Jakub Kulik in :gh:`113117`.) + + +os.path +------- + +* Add :func:`~os.path.isreserved` to check if a path is reserved + on the current system. + This function is only available on Windows. + (Contributed by Barney Gale in :gh:`88569`.) + +* On Windows, :func:`~os.path.isabs` no longer considers paths + starting with exactly one slash (``\`` or ``/``) to be absolute. + (Contributed by Barney Gale and Jon Foster in :gh:`44626`.) + +* :func:`~os.path.realpath` now resolves MS-DOS style file names + even if the file is not accessible. + (Contributed by Moonsik Park in :gh:`82367`.) + + +pathlib +------- + +* Add :exc:`~pathlib.UnsupportedOperation`, which is raised instead of + :exc:`NotImplementedError` when a path operation isn't supported. + (Contributed by Barney Gale in :gh:`89812`.) + +* Add a new constructor for creating :class:`~pathlib.Path` objects + from 'file' URIs (``file:///``), :meth:`.Path.from_uri`. + (Contributed by Barney Gale in :gh:`107465`.) + +* Add :meth:`.PurePath.full_match` for matching paths with + shell-style wildcards, including the recursive wildcard "``**``". + (Contributed by Barney Gale in :gh:`73435`.) + +* Add the :attr:`.PurePath.parser` class attribute to store the + implementation of :mod:`os.path` used + for low-level path parsing and joining. + This will be either :mod:`!posixpath` or :mod:`!ntpath`. + +* Add *recurse_symlinks* keyword-only argument to + :meth:`.Path.glob` and :meth:`~pathlib.Path.rglob`. + (Contributed by Barney Gale in :gh:`77609`.) + +* :meth:`.Path.glob` and :meth:`~pathlib.Path.rglob` + now return files and directories when given a pattern that ends with "``**``". + Previously, only directories were returned. + (Contributed by Barney Gale in :gh:`70303`.) + +* Add the *follow_symlinks* keyword-only argument to + :meth:`Path.is_file `, + :meth:`Path.is_dir `, + :meth:`.Path.owner`, and :meth:`.Path.group`. + (Contributed by Barney Gale in :gh:`105793` and Kamil Turek in :gh:`107962`.) + + +pdb +--- + +* :func:`breakpoint` and :func:`~pdb.set_trace` now enter the debugger immediately + rather than on the next line of code to be executed. This change prevents the + debugger from breaking outside of the context when :func:`!breakpoint` is positioned + at the end of the context. + (Contributed by Tian Gao in :gh:`118579`.) + +* ``sys.path[0]`` is no longer replaced by the directory of the script + being debugged when :attr:`sys.flags.safe_path` is set. + (Contributed by Tian Gao and Christian Walther in :gh:`111762`.) + +* :mod:`zipapp` is now supported as a debugging target. + (Contributed by Tian Gao in :gh:`118501`.) + +* Add ability to move between chained exceptions during + post-mortem debugging in :func:`~pdb.pm` using + the new :pdbcmd:`exceptions [exc_number] ` command for Pdb. + (Contributed by Matthias Bussonnier in :gh:`106676`.) + +* Expressions and statements whose prefix is a pdb command are now correctly + identified and executed. + (Contributed by Tian Gao in :gh:`108464`.) + + +queue +----- + +* Add :meth:`Queue.shutdown ` and :exc:`~queue.ShutDown` + to manage queue termination. + (Contributed by Laurie Opperman and Yves Duprat in :gh:`104750`.) + + +random +------ + +* Add a :ref:`command-line interface `. + (Contributed by Hugo van Kemenade in :gh:`118131`.) + + +re +-- + +* Rename :exc:`!re.error` to :exc:`~re.PatternError` for improved clarity. + :exc:`!re.error` is kept for backward compatibility. + + +shutil +------ + +* Support the *dir_fd* and *follow_symlinks* keyword arguments + in :func:`~shutil.chown`. + (Contributed by Berker Peksag and Tahia K in :gh:`62308`) + + +site +---- + +* :file:`.pth` files are now decoded using UTF-8 first, + and then with the :term:`locale encoding` if UTF-8 decoding fails. + (Contributed by Inada Naoki in :gh:`117802`.) + + +sqlite3 +------- + +* A :exc:`ResourceWarning` is now emitted if a :class:`~sqlite3.Connection` + object is not :meth:`closed ` explicitly. + (Contributed by Erlend E. Aasland in :gh:`105539`.) + +* Add the *filter* keyword-only parameter to :meth:`.Connection.iterdump` + for filtering database objects to dump. + (Contributed by Mariusz Felisiak in :gh:`91602`.) + + +ssl +--- + +* The :func:`~ssl.create_default_context` API now includes + :data:`~ssl.VERIFY_X509_PARTIAL_CHAIN` and :data:`~ssl.VERIFY_X509_STRICT` + in its default flags. + + .. note:: + + :data:`~ssl.VERIFY_X509_STRICT` may reject pre-:rfc:`5280` + or malformed certificates that the underlying OpenSSL implementation + might otherwise accept. + Whilst disabling this is not recommended, you can do so using: + + .. code-block:: python + + import ssl + + ctx = ssl.create_default_context() + ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT + + (Contributed by William Woodruff in :gh:`112389`.) + + +statistics +---------- + +* Add :func:`~statistics.kde` for kernel density estimation. + This makes it possible to estimate a continuous probability density function + from a fixed number of discrete samples. + (Contributed by Raymond Hettinger in :gh:`115863`.) + +* Add :func:`~statistics.kde_random` for sampling from an + estimated probability density function created by :func:`~statistics.kde`. + (Contributed by Raymond Hettinger in :gh:`115863`.) + + +.. _whatsnew313-subprocess: + +subprocess +---------- + +* The :mod:`subprocess` module now uses the :func:`~os.posix_spawn` function in + more situations. + + Notably, when *close_fds* is ``True`` (the default), + :func:`~os.posix_spawn` will be used when the C library provides + :c:func:`!posix_spawn_file_actions_addclosefrom_np`, + which includes recent versions of Linux, FreeBSD, and Solaris. + On Linux, this should perform similarly to the existing + Linux :c:func:`!vfork` based code. + + A private control knob :attr:`!subprocess._USE_POSIX_SPAWN` can + be set to ``False`` if you need to force :mod:`subprocess` + to never use :func:`~os.posix_spawn`. + Please report your reason and platform details in + the :ref:`issue tracker ` if you set this + so that we can improve our API selection logic for everyone. + (Contributed by Jakub Kulik in :gh:`113117`.) + + +sys +--- + +* Add the :func:`~sys._is_interned` function to test if a string was interned. + This function is not guaranteed to exist in all implementations of Python. + (Contributed by Serhiy Storchaka in :gh:`78573`.) + + +tempfile +-------- + +* On Windows, the default mode ``0o700`` used by :func:`tempfile.mkdtemp` now + limits access to the new directory due to changes to :func:`os.mkdir`. + This is a mitigation for :cve:`2024-4030`. + (Contributed by Steve Dower in :gh:`118486`.) + + +time +---- + +* On Windows, :func:`~time.monotonic` now uses the + ``QueryPerformanceCounter()`` clock for a resolution of 1 microsecond, + instead of the ``GetTickCount64()`` clock which has + a resolution of 15.6 milliseconds. + (Contributed by Victor Stinner in :gh:`88494`.) + +* On Windows, :func:`~time.time` now uses the + ``GetSystemTimePreciseAsFileTime()`` clock for a resolution of 1 microsecond, + instead of the ``GetSystemTimeAsFileTime()`` clock which has + a resolution of 15.6 milliseconds. + (Contributed by Victor Stinner in :gh:`63207`.) + + +tkinter +------- + +* Add :mod:`tkinter` widget methods: + :meth:`!tk_busy_hold`, :meth:`!tk_busy_configure`, + :meth:`!tk_busy_cget`, :meth:`!tk_busy_forget`, + :meth:`!tk_busy_current`, and :meth:`!tk_busy_status`. + (Contributed by Miguel, klappnase and Serhiy Storchaka in :gh:`72684`.) + +* The :mod:`tkinter` widget method :meth:`!wm_attributes` now accepts + the attribute name without the minus prefix to get window attributes, + for example ``w.wm_attributes('alpha')`` + and allows specifying attributes and values to set as keyword arguments, + for example ``w.wm_attributes(alpha=0.5)``. + (Contributed by Serhiy Storchaka in :gh:`43457`.) + +* :meth:`!wm_attributes` can now return attributes as a :class:`dict`, + by using the new optional keyword-only parameter *return_python_dict*. + (Contributed by Serhiy Storchaka in :gh:`43457`.) + +* :meth:`!Text.count` can now return a simple :class:`int` + when the new optional keyword-only parameter *return_ints* is used. + Otherwise, the single count is returned as a 1-tuple or ``None``. + (Contributed by Serhiy Storchaka in :gh:`97928`.) + +* Support the "vsapi" element type in + the :meth:`~tkinter.ttk.Style.element_create` method of + :class:`tkinter.ttk.Style`. + (Contributed by Serhiy Storchaka in :gh:`68166`.) + +* Add the :meth:`!after_info` method for Tkinter widgets. + (Contributed by Cheryl Sabella in :gh:`77020`.) + +* Add a new :meth:`!copy_replace` method to :class:`!PhotoImage` + to copy a region from one image to another, + possibly with pixel zooming, subsampling, or both. + (Contributed by Serhiy Storchaka in :gh:`118225`.) + +* Add *from_coords* parameter to the :class:`!PhotoImage` methods + :meth:`!copy`, :meth:`!zoom` and :meth:`!subsample`. + Add *zoom* and *subsample* parameters to the :class:`!PhotoImage` method + :meth:`!copy`. + (Contributed by Serhiy Storchaka in :gh:`118225`.) + +* Add the :class:`!PhotoImage` methods + :meth:`!read` to read an image from a file + and :meth:`!data` to get the image data. + Add *background* and *grayscale* parameters to the :meth:`!write` method. + (Contributed by Serhiy Storchaka in :gh:`118271`.) + + +traceback +--------- + +* Add the :attr:`~traceback.TracebackException.exc_type_str` attribute + to :class:`~traceback.TracebackException`, + which holds a string display of the *exc_type*. + Deprecate the :attr:`~traceback.TracebackException.exc_type` attribute, + which holds the type object itself. + Add parameter *save_exc_type* (default ``True``) + to indicate whether ``exc_type`` should be saved. + (Contributed by Irit Katriel in :gh:`112332`.) + +* Add a new *show_group* keyword-only parameter to + :meth:`.TracebackException.format_exception_only` to (recursively) format + the nested exceptions of a :exc:`BaseExceptionGroup` instance. + (Contributed by Irit Katriel in :gh:`105292`.) + + +types +----- + +* :class:`~types.SimpleNamespace` can now take a single positional argument + to initialise the namespace's arguments. + This argument must either be a mapping or an iterable of key-value pairs. + (Contributed by Serhiy Storchaka in :gh:`108191`.) + + +typing +------ + +* :pep:`705`: Add :data:`~typing.ReadOnly`, a special typing construct + to mark a :class:`~typing.TypedDict` item as read-only for type checkers. + +* :pep:`742`: Add :data:`~typing.TypeIs`, a typing construct + that can be used to instruct a type checker how to narrow a type. + +* Add :data:`~typing.NoDefault`, a sentinel object used to represent + the defaults of some parameters in the :mod:`typing` module. + (Contributed by Jelle Zijlstra in :gh:`116126`.) + +* Add :func:`~typing.get_protocol_members` to return the set of members + defining a :class:`typing.Protocol`. + (Contributed by Jelle Zijlstra in :gh:`104873`.) + +* Add :func:`~typing.is_protocol` to check whether a class + is a :class:`~typing.Protocol`. + (Contributed by Jelle Zijlstra in :gh:`104873`.) + +* :data:`~typing.ClassVar` can now be nested in :data:`~typing.Final`, + and vice versa. + (Contributed by Mehdi Drissi in :gh:`89547`.) + + +unicodedata +----------- + +* Update the Unicode database to `version 15.1.0`__. + (Contributed by James Gerity in :gh:`109559`.) + + __ https://www.unicode.org/versions/Unicode15.1.0/ + + +venv +---- + +* Add support for creating source control management (SCM) ignore files + in a virtual environment's directory. + By default, Git is supported. + This is implemented as opt-in via the API, + which can be extended to support other SCMs + (:class:`~venv.EnvBuilder` and :func:`~venv.create`), + and opt-out via the CLI, using :option:`!--without-scm-ignore-files`. + (Contributed by Brett Cannon in :gh:`108125`.) + + +warnings +-------- + +* :pep:`702`: The new :func:`warnings.deprecated` decorator provides a way to + communicate deprecations to a :term:`static type checker` + and to warn on usage of deprecated classes and functions. + A :exc:`DeprecationWarning` may also be emitted when + a decorated function or class is used at runtime. + (Contributed by Jelle Zijlstra in :gh:`104003`.) + + +xml +--- + +* Allow controlling Expat >=2.6.0 reparse deferral (:cve:`2023-52425`) + by adding five new methods: + + * :meth:`xml.etree.ElementTree.XMLParser.flush` + * :meth:`xml.etree.ElementTree.XMLPullParser.flush` + * :meth:`xml.parsers.expat.xmlparser.GetReparseDeferralEnabled` + * :meth:`xml.parsers.expat.xmlparser.SetReparseDeferralEnabled` + * :meth:`!xml.sax.expatreader.ExpatParser.flush` + + (Contributed by Sebastian Pipping in :gh:`115623`.) + +* Add the :meth:`!close` method for the iterator returned by + :func:`~xml.etree.ElementTree.iterparse` for explicit cleanup. + (Contributed by Serhiy Storchaka in :gh:`69893`.) + + +zipimport +--------- + +* Add support for ZIP64_ format files. + Everybody loves huge data, right? + (Contributed by Tim Hatch in :gh:`94146`.) + + .. _ZIP64: https://en.wikipedia.org/wiki/Zip_(file_format)#ZIP64 + + +Optimizations +============= + +* Several standard library modules have had + their import times significantly improved. + For example, the import time of the :mod:`typing` module + has been reduced by around a third by removing dependencies + on :mod:`re` and :mod:`contextlib`. + Other modules to enjoy import-time speedups include + :mod:`email.utils`, :mod:`enum`, :mod:`functools`, + :mod:`importlib.metadata`, and :mod:`threading`. + (Contributed by Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas, + and others in :gh:`109653`.) + +* :func:`textwrap.indent` is now around 30% faster than before for large input. + (Contributed by Inada Naoki in :gh:`107369`.) + +* The :mod:`subprocess` module now uses the :func:`~os.posix_spawn` function in + more situations, including when *close_fds* is ``True`` (the default) + on many modern platforms. + This should provide a notable performance increase + when launching processes on FreeBSD and Solaris. + See the :ref:`subprocess ` section above for details. + (Contributed by Jakub Kulik in :gh:`113117`.) + + +Removed Modules And APIs +======================== + + +.. _whatsnew313-pep594: + +PEP 594: Remove "dead batteries" from the standard library +---------------------------------------------------------- + +:pep:`594` proposed removing 19 modules from the standard library, +colloquially referred to as 'dead batteries' due to their +historic, obsolete, or insecure status. +All of the following modules were deprecated in Python 3.11, +and are now removed: + +* :mod:`!aifc` +* :mod:`!audioop` +* :mod:`!chunk` +* :mod:`!cgi` and :mod:`!cgitb` + + * :class:`!cgi.FieldStorage` can typically be replaced with + :func:`urllib.parse.parse_qsl` for ``GET`` and ``HEAD`` requests, + and the :mod:`email.message` module or the :pypi:`multipart` library + for ``POST`` and ``PUT`` requests. + + * :func:`!cgi.parse` can be replaced by calling + :func:`urllib.parse.parse_qs` directly on the desired query string, + unless the input is ``multipart/form-data``, + which should be replaced as described below for :func:`!cgi.parse_multipart`. + + * :func:`!cgi.parse_header` can be replaced with the functionality + in the :mod:`email` package, which implements the same MIME RFCs. + For example, with :class:`email.message.EmailMessage`: + + .. code-block:: python + + from email.message import EmailMessage + + msg = EmailMessage() + msg['content-type'] = 'application/json; charset="utf8"' + main, params = msg.get_content_type(), msg['content-type'].params + + * :func:`!cgi.parse_multipart` can be replaced with the functionality + in the :mod:`email` package, which implements the same MIME RFCs, + or with the :pypi:`multipart` library. + For example, the :class:`email.message.EmailMessage` + and :class:`email.message.Message` classes. + +* :mod:`!crypt` and the private :mod:`!_crypt` extension. + The :mod:`hashlib` module may be an appropriate replacement + when simply hashing a value is required. + Otherwise, various third-party libraries on PyPI are available: + + * :pypi:`bcrypt`: + Modern password hashing for your software and your servers. + * :pypi:`passlib`: + Comprehensive password hashing framework supporting over 30 schemes. + * :pypi:`argon2-cffi`: + The secure Argon2 password hashing algorithm. + * :pypi:`legacycrypt`: + :mod:`ctypes` wrapper to the POSIX crypt library call + and associated functionality. + * :pypi:`crypt_r`: + Fork of the :mod:`!crypt` module, + wrapper to the :manpage:`crypt_r(3)` library call + and associated functionality. + +* :mod:`!imghdr`: + The :pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic` libraries + should be used as replacements. + For example, the :func:`!puremagic.what` function can be used + to replace the :func:`!imghdr.what` function for all file formats + that were supported by :mod:`!imghdr`. +* :mod:`!mailcap`: + Use the :mod:`mimetypes` module instead. +* :mod:`!msilib` +* :mod:`!nis` +* :mod:`!nntplib`: + Use the :pypi:`pynntp` library from PyPI instead. +* :mod:`!ossaudiodev`: + For audio playback, use the :pypi:`pygame` library from PyPI instead. +* :mod:`!pipes`: + Use the :mod:`subprocess` module instead. + Use :func:`shlex.quote` to replace the undocumented ``pipes.quote`` + function. +* :mod:`!sndhdr`: + The :pypi:`filetype`, :pypi:`puremagic`, or :pypi:`python-magic` libraries + should be used as replacements. +* :mod:`!spwd`: + Use the :pypi:`python-pam` library from PyPI instead. +* :mod:`!sunau` +* :mod:`!telnetlib`, + Use the :pypi:`telnetlib3` or :pypi:`Exscript` libraries from PyPI instead. +* :mod:`!uu`: + Use the :mod:`base64` module instead, as a modern alternative. +* :mod:`!xdrlib` + +(Contributed by Victor Stinner and Zachary Ware in :gh:`104773` and :gh:`104780`.) + + +2to3 +---- + +* Remove the :program:`2to3` program and the :mod:`!lib2to3` module, + previously deprecated in Python 3.11. + (Contributed by Victor Stinner in :gh:`104780`.) + + +builtins +-------- + +* Remove support for chained :class:`classmethod` descriptors + (introduced in :gh:`63272`). + These can no longer be used to wrap other descriptors, + such as :class:`property`. + The core design of this feature was flawed and led to several problems. + To "pass-through" a :class:`classmethod`, consider using + the :attr:`!__wrapped__` attribute that was added in Python 3.10. + (Contributed by Raymond Hettinger in :gh:`89519`.) + +* Raise a :exc:`RuntimeError` when calling :meth:`frame.clear` + on a suspended frame (as has always been the case for an executing frame). + (Contributed by Irit Katriel in :gh:`79932`.) + + +configparser +------------ + +* Remove the undocumented :class:`!LegacyInterpolation` class, + deprecated in the docstring since Python 3.2, + and at runtime since Python 3.11. + (Contributed by Hugo van Kemenade in :gh:`104886`.) + + +importlib.metadata +------------------ + +* Remove deprecated subscript (:meth:`~object.__getitem__`) access for + :ref:`EntryPoint ` objects. + (Contributed by Jason R. Coombs in :gh:`113175`.) + + +locale +------ + +* Remove the :func:`!locale.resetlocale` function, deprecated in Python 3.11. + Use ``locale.setlocale(locale.LC_ALL, "")`` instead. + (Contributed by Victor Stinner in :gh:`104783`.) + + +opcode +------ + +* Move :attr:`!opcode.ENABLE_SPECIALIZATION` to :attr:`!_opcode.ENABLE_SPECIALIZATION`. + This field was added in 3.12, it was never documented, + and is not intended for external use. + (Contributed by Irit Katriel in :gh:`105481`.) + +* Remove :func:`!opcode.is_pseudo`, :attr:`!opcode.MIN_PSEUDO_OPCODE`, + and :attr:`!opcode.MAX_PSEUDO_OPCODE`, which were added in Python 3.12, + but were neither documented nor exposed through :mod:`dis`, + and were not intended to be used externally. + (Contributed by Irit Katriel in :gh:`105481`.) + + +pathlib +------- + +* Remove the ability to use :class:`~pathlib.Path` objects as context managers. + This functionality was deprecated and has had no effect since Python 3.9. + (Contributed by Barney Gale in :gh:`83863`.) + + +re +-- + +* Remove the undocumented, deprecated, and broken + :func:`!re.template` function and :attr:`!re.TEMPLATE` / :attr:`!re.T` flag. + (Contributed by Serhiy Storchaka and Nikita Sobolev in :gh:`105687`.) + + +tkinter.tix +----------- + +* Remove the :mod:`!tkinter.tix` module, deprecated in Python 3.6. + The third-party Tix library which the module wrapped is unmaintained. + (Contributed by Zachary Ware in :gh:`75552`.) + + +turtle +------ + +* Remove the :meth:`!RawTurtle.settiltangle` method, + deprecated in the documentation since Python 3.1 + and at runtime since Python 3.11. + (Contributed by Hugo van Kemenade in :gh:`104876`.) + + +typing +------ + +* Remove the :mod:`!typing.io` and :mod:`!typing.re` namespaces, + deprecated since Python 3.8. + The items in those namespaces can be imported directly + from the :mod:`typing` module. + (Contributed by Sebastian Rittau in :gh:`92871`.) + +* Remove the keyword-argument method of creating + :class:`~typing.TypedDict` types, deprecated in Python 3.11. + (Contributed by Tomas Roun in :gh:`104786`.) + + +unittest +-------- + +* Remove the following :mod:`unittest` functions, deprecated in Python 3.11: + + * :func:`!unittest.findTestCases` + * :func:`!unittest.makeSuite` + * :func:`!unittest.getTestCaseNames` + + Use :class:`~unittest.TestLoader` methods instead: + + * :meth:`~unittest.TestLoader.loadTestsFromModule` + * :meth:`~unittest.TestLoader.loadTestsFromTestCase` + * :meth:`~unittest.TestLoader.getTestCaseNames` + + (Contributed by Hugo van Kemenade in :gh:`104835`.) + +* Remove the untested and undocumented :meth:`!TestProgram.usageExit` + method, deprecated in Python 3.11. + (Contributed by Hugo van Kemenade in :gh:`104992`.) + + +urllib +------ + +* Remove the *cafile*, *capath*, and *cadefault* parameters of the + :func:`urllib.request.urlopen` function, deprecated in Python 3.6. + Use the *context* parameter instead with an :class:`~ssl.SSLContext` instance. + The :meth:`ssl.SSLContext.load_cert_chain` function + can be used to load specific certificates, + or let :func:`ssl.create_default_context` select + the operating system's trusted certificate authority (CA) certificates. + (Contributed by Victor Stinner in :gh:`105382`.) + + +webbrowser +---------- + +* Remove the untested and undocumented :class:`!MacOSX` class, + deprecated in Python 3.11. + Use the :class:`!MacOSXOSAScript` class (introduced in Python 3.2) instead. + (Contributed by Hugo van Kemenade in :gh:`104804`.) + +* Remove the deprecated :attr:`!MacOSXOSAScript._name` attribute. + Use the :attr:`MacOSXOSAScript.name ` + attribute instead. + (Contributed by Nikita Sobolev in :gh:`105546`.) + + +New Deprecations +================ + +* :ref:`User-defined functions `: + + * Deprecate assignment to a function's :attr:`~function.__code__` attribute, + where the new code object's type does not match the function's type. + The different types are: + plain function, generator, async generator, and coroutine. + (Contributed by Irit Katriel in :gh:`81137`.) + +* :mod:`array`: + + * Deprecate the ``'u'`` format code (:c:type:`wchar_t`) at runtime. + This format code has been deprecated in documentation since Python 3.3, + and will be removed in Python 3.16. + Use the ``'w'`` format code (:c:type:`Py_UCS4`) + for Unicode characters instead. + (Contributed by Hugo van Kemenade in :gh:`80480`.) + +* :mod:`ctypes`: + + * Deprecate the undocumented :func:`!SetPointerType` function, + to be removed in Python 3.15. + (Contributed by Victor Stinner in :gh:`105733`.) + + * :term:`Soft-deprecate ` the :func:`~ctypes.ARRAY` + function in favour of ``type * length`` multiplication. + (Contributed by Victor Stinner in :gh:`105733`.) + +* :mod:`decimal`: + + * Deprecate the non-standard and undocumented :class:`~decimal.Decimal` + format specifier ``'N'``, + which is only supported in the :mod:`!decimal` module's C implementation. + (Contributed by Serhiy Storchaka in :gh:`89902`.) + +* :mod:`dis`: + + * Deprecate the :attr:`!HAVE_ARGUMENT` separator. + Check membership in :data:`~dis.hasarg` instead. + (Contributed by Irit Katriel in :gh:`109319`.) + +* :mod:`getopt` and :mod:`optparse`: + + * Both modules are now :term:`soft deprecated`, + with :mod:`argparse` preferred for new projects. + This is a new soft-deprecation for the :mod:`!getopt` module, + whereas the :mod:`!optparse` module was already *de facto* soft deprecated. + (Contributed by Victor Stinner in :gh:`106535`.) + +* :mod:`gettext`: + + * Deprecate non-integer numbers as arguments to functions and methods + that consider plural forms in the :mod:`!gettext` module, + even if no translation was found. + (Contributed by Serhiy Storchaka in :gh:`88434`.) + +* :mod:`glob`: + + * Deprecate the undocumented :func:`!glob0` and :func:`!glob1` functions. + Use :func:`~glob.glob` and pass a :term:`path-like object` specifying + the root directory to the *root_dir* parameter instead. + (Contributed by Barney Gale in :gh:`117337`.) + +* :mod:`http.server`: + + * Deprecate :class:`~http.server.CGIHTTPRequestHandler`, + to be removed in Python 3.15. + Process-based CGI HTTP servers have been out of favor for a very long time. + This code was outdated, unmaintained, and rarely used. + It has a high potential for both security and functionality bugs. + (Contributed by Gregory P. Smith in :gh:`109096`.) + + * Deprecate the :option:`!--cgi` flag to + the :program:`python -m http.server` command-line interface, + to be removed in Python 3.15. + (Contributed by Gregory P. Smith in :gh:`109096`.) + +* :mod:`mimetypes`: + + * :term:`Soft-deprecate ` file path arguments + to :func:`~mimetypes.guess_type`, + use :func:`~mimetypes.guess_file_type` instead. + (Contributed by Serhiy Storchaka in :gh:`66543`.) + +* :mod:`re`: + + * Deprecate passing the optional *maxsplit*, *count*, or *flags* arguments + as positional arguments to the module-level + :func:`~re.split`, :func:`~re.sub`, and :func:`~re.subn` functions. + These parameters will become :ref:`keyword-only ` + in a future version of Python. + (Contributed by Serhiy Storchaka in :gh:`56166`.) + +* :mod:`pathlib`: + + * Deprecate :meth:`.PurePath.is_reserved`, + to be removed in Python 3.15. + Use :func:`os.path.isreserved` to detect reserved paths on Windows. + (Contributed by Barney Gale in :gh:`88569`.) + +* :mod:`platform`: + + * Deprecate :func:`~platform.java_ver`, + to be removed in Python 3.15. + This function is only useful for Jython support, has a confusing API, + and is largely untested. + (Contributed by Nikita Sobolev in :gh:`116349`.) + +* :mod:`pydoc`: + + * Deprecate the undocumented :func:`!ispackage` function. + (Contributed by Zackery Spytz in :gh:`64020`.) + +* :mod:`sqlite3`: + + * Deprecate passing more than one positional argument to + the :func:`~sqlite3.connect` function + and the :class:`~sqlite3.Connection` constructor. + The remaining parameters will become keyword-only in Python 3.15. + (Contributed by Erlend E. Aasland in :gh:`107948`.) + + * Deprecate passing name, number of arguments, and the callable as keyword + arguments for :meth:`.Connection.create_function` + and :meth:`.Connection.create_aggregate` + These parameters will become positional-only in Python 3.15. + (Contributed by Erlend E. Aasland in :gh:`108278`.) + + * Deprecate passing the callback callable by keyword for the + :meth:`~sqlite3.Connection.set_authorizer`, + :meth:`~sqlite3.Connection.set_progress_handler`, and + :meth:`~sqlite3.Connection.set_trace_callback` + :class:`~sqlite3.Connection` methods. + The callback callables will become positional-only in Python 3.15. + (Contributed by Erlend E. Aasland in :gh:`108278`.) + +* :mod:`sys`: + + * Deprecate the :func:`~sys._enablelegacywindowsfsencoding` function, + to be removed in Python 3.16. + Use the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable instead. + (Contributed by Inada Naoki in :gh:`73427`.) + +* :mod:`tarfile`: + + * Deprecate the undocumented and unused :attr:`!TarFile.tarfile` attribute, + to be removed in Python 3.16. + (Contributed in :gh:`115256`.) + +* :mod:`traceback`: + + * Deprecate the :attr:`.TracebackException.exc_type` attribute. + Use :attr:`.TracebackException.exc_type_str` instead. + (Contributed by Irit Katriel in :gh:`112332`.) + +* :mod:`typing`: + + * Deprecate the undocumented keyword argument syntax for creating + :class:`~typing.NamedTuple` classes + (e.g. ``Point = NamedTuple("Point", x=int, y=int)``), + to be removed in Python 3.15. + Use the class-based syntax or the functional syntax instead. + (Contributed by Alex Waygood in :gh:`105566`.) + + * Deprecate omitting the *fields* parameter when creating + a :class:`~typing.NamedTuple` or :class:`typing.TypedDict` class, + and deprecate passing ``None`` to the *fields* parameter of both types. + Python 3.15 will require a valid sequence for the *fields* parameter. + To create a NamedTuple class with zero fields, + use ``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", ())``. + To create a TypedDict class with zero fields, + use ``class TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``. + (Contributed by Alex Waygood in :gh:`105566` and :gh:`105570`.) + + * Deprecate the :func:`typing.no_type_check_decorator` decorator function, + to be removed in in Python 3.15. + After eight years in the :mod:`typing` module, + it has yet to be supported by any major type checker. + (Contributed by Alex Waygood in :gh:`106309`.) + + * Deprecate :data:`typing.AnyStr`. + In Python 3.16, it will be removed from ``typing.__all__``, + and a :exc:`DeprecationWarning` will be emitted at runtime + when it is imported or accessed. + It will be removed entirely in Python 3.18. + Use the new :ref:`type parameter syntax ` instead. + (Contributed by Michael The in :gh:`107116`.) + +* :mod:`wave`: + + * Deprecate the :meth:`~wave.Wave_read.getmark`, :meth:`!setmark`, + and :meth:`~wave.Wave_read.getmarkers` methods of + the :class:`~wave.Wave_read` and :class:`~wave.Wave_write` classes, + to be removed in Python 3.15. + (Contributed by Victor Stinner in :gh:`105096`.) + +.. Add deprecations above alphabetically, not here at the end. + +.. include:: ../deprecations/pending-removal-in-3.14.rst + +.. include:: ../deprecations/pending-removal-in-3.15.rst + +.. include:: ../deprecations/pending-removal-in-3.16.rst + +.. include:: ../deprecations/pending-removal-in-future.rst + +CPython Bytecode Changes +======================== + +* The oparg of :opcode:`YIELD_VALUE` is now + ``1`` if the yield is part of a yield-from or await, and ``0`` otherwise. + The oparg of :opcode:`RESUME` was changed to add a bit indicating + if the except-depth is 1, which is needed to optimize closing of generators. + (Contributed by Irit Katriel in :gh:`111354`.) + + +C API Changes +============= + +New Features +------------ + +* Add the :ref:`PyMonitoring C API ` + for generating :pep:`669` monitoring events: + + * :c:type:`PyMonitoringState` + * :c:func:`PyMonitoring_FirePyStartEvent` + * :c:func:`PyMonitoring_FirePyResumeEvent` + * :c:func:`PyMonitoring_FirePyReturnEvent` + * :c:func:`PyMonitoring_FirePyYieldEvent` + * :c:func:`PyMonitoring_FireCallEvent` + * :c:func:`PyMonitoring_FireLineEvent` + * :c:func:`PyMonitoring_FireJumpEvent` + * :c:func:`PyMonitoring_FireBranchEvent` + * :c:func:`PyMonitoring_FireCReturnEvent` + * :c:func:`PyMonitoring_FirePyThrowEvent` + * :c:func:`PyMonitoring_FireRaiseEvent` + * :c:func:`PyMonitoring_FireCRaiseEvent` + * :c:func:`PyMonitoring_FireReraiseEvent` + * :c:func:`PyMonitoring_FireExceptionHandledEvent` + * :c:func:`PyMonitoring_FirePyUnwindEvent` + * :c:func:`PyMonitoring_FireStopIterationEvent` + * :c:func:`PyMonitoring_EnterScope` + * :c:func:`PyMonitoring_ExitScope` + + (Contributed by Irit Katriel in :gh:`111997`). + +* Add :c:type:`PyMutex`, a lightweight mutex that occupies a single byte, + and the new :c:func:`PyMutex_Lock` and :c:func:`PyMutex_Unlock` functions. + :c:func:`!PyMutex_Lock` will release the :term:`GIL` (if currently held) + if the operation needs to block. + (Contributed by Sam Gross in :gh:`108724`.) + +* Add the :ref:`PyTime C API ` to provide access to system clocks: + + * :c:type:`PyTime_t`. + * :c:var:`PyTime_MIN` and :c:var:`PyTime_MAX`. + * :c:func:`PyTime_AsSecondsDouble`. + * :c:func:`PyTime_Monotonic`. + * :c:func:`PyTime_MonotonicRaw`. + * :c:func:`PyTime_PerfCounter`. + * :c:func:`PyTime_PerfCounterRaw`. + * :c:func:`PyTime_Time`. + * :c:func:`PyTime_TimeRaw`. + + (Contributed by Victor Stinner and Petr Viktorin in :gh:`110850`.) + +* Add the :c:func:`PyDict_ContainsString` function + with the same behavior as :c:func:`PyDict_Contains`, + but *key* is specified as a :c:expr:`const char*` UTF-8 encoded bytes string, + rather than a :c:expr:`PyObject*`. + (Contributed by Victor Stinner in :gh:`108314`.) + +* Add the :c:func:`PyDict_GetItemRef` and :c:func:`PyDict_GetItemStringRef` + functions, + which behave similarly to :c:func:`PyDict_GetItemWithError`, + but return a :term:`strong reference` instead of a :term:`borrowed reference`. + Moreover, these functions return ``-1`` on error, + removing the need to check :c:func:`!PyErr_Occurred`. + (Contributed by Victor Stinner in :gh:`106004`.) + +* Add the :c:func:`PyDict_SetDefaultRef` function, + which behaves similarly to :c:func:`PyDict_SetDefault`, + but returns a :term:`strong reference` instead of a :term:`borrowed reference`. + This function returns ``-1`` on error, + ``0`` on insertion, + and ``1`` if the key was already present in the dictionary. + (Contributed by Sam Gross in :gh:`112066`.) + +* Add the :c:func:`PyDict_Pop` and :c:func:`PyDict_PopString` functions + to remove a key from a dictionary and optionally return the removed value. + This is similar to :meth:`dict.pop`, + though there is no default value, + and :exc:`KeyError` is not raised for missing keys. + (Contributed by Stefan Behnel and Victor Stinner in :gh:`111262`.) + +* Add the :c:func:`PyMapping_GetOptionalItem` + and :c:func:`PyMapping_GetOptionalItemString` functions + as alternatives to :c:func:`PyObject_GetItem` + and :c:func:`PyMapping_GetItemString` respectively. + The new functions do not raise :exc:`KeyError` + if the requested key is missing from the mapping. + These variants are more convenient and faster + if a missing key should not be treated as a failure. + (Contributed by Serhiy Storchaka in :gh:`106307`.) + +* Add the :c:func:`PyObject_GetOptionalAttr` + and :c:func:`PyObject_GetOptionalAttrString` functions + as alternatives to :c:func:`PyObject_GetAttr` + and :c:func:`PyObject_GetAttrString` respectively. + The new functions do not raise :exc:`AttributeError` + if the requested attribute is not found on the object. + These variants are more convenient and faster + if the missing attribute should not be treated as a failure. + (Contributed by Serhiy Storchaka in :gh:`106521`.) + +* Add the :c:func:`PyErr_FormatUnraisable` function + as an extension to :c:func:`PyErr_WriteUnraisable` + that allows customizing the warning message. + (Contributed by Serhiy Storchaka in :gh:`108082`.) + +* Add new functions that return a :term:`strong reference` instead of + a :term:`borrowed reference` for frame locals, globals, and builtins, + as part of :ref:`PEP 667 `: + + * :c:func:`PyEval_GetFrameBuiltins` replaces :c:func:`PyEval_GetBuiltins` + * :c:func:`PyEval_GetFrameGlobals` replaces :c:func:`PyEval_GetGlobals` + * :c:func:`PyEval_GetFrameLocals` replaces :c:func:`PyEval_GetLocals` + + (Contributed by Mark Shannon and Tian Gao in :gh:`74929`.) + +* Add the :c:func:`Py_GetConstant` and :c:func:`Py_GetConstantBorrowed` + functions to get :term:`strong ` + or :term:`borrowed ` references to constants. + For example, ``Py_GetConstant(Py_CONSTANT_ZERO)`` returns a strong reference + to the constant zero. + (Contributed by Victor Stinner in :gh:`115754`.) + +* Add the :c:func:`PyImport_AddModuleRef` function + as a replacement for :c:func:`PyImport_AddModule` + that returns a :term:`strong reference` instead of a :term:`borrowed reference`. + (Contributed by Victor Stinner in :gh:`105922`.) + +* Add the :c:func:`Py_IsFinalizing` function to check + whether the main Python interpreter is + :term:`shutting down `. + (Contributed by Victor Stinner in :gh:`108014`.) + +* Add the :c:func:`PyList_GetItemRef` function + as a replacement for :c:func:`PyList_GetItem` + that returns a :term:`strong reference` instead of a :term:`borrowed reference`. + (Contributed by Sam Gross in :gh:`114329`.) + +* Add the :c:func:`PyList_Extend` and :c:func:`PyList_Clear` functions, + mirroring the Python :meth:`!list.extend` and :meth:`!list.clear` methods. + (Contributed by Victor Stinner in :gh:`111138`.) + +* Add the :c:func:`PyLong_AsInt` function. + It behaves similarly to :c:func:`PyLong_AsLong`, + but stores the result in a C :c:expr:`int` instead of a C :c:expr:`long`. + (Contributed by Victor Stinner in :gh:`108014`.) + +* Add the :c:func:`PyLong_AsNativeBytes`, :c:func:`PyLong_FromNativeBytes`, + and :c:func:`PyLong_FromUnsignedNativeBytes` functions + to simplify converting between native integer types + and Python :class:`int` objects. + (Contributed by Steve Dower in :gh:`111140`.) + +* Add :c:func:`PyModule_Add` function, which is similar to + :c:func:`PyModule_AddObjectRef` and :c:func:`PyModule_AddObject`, + but always steals a reference to the value. + (Contributed by Serhiy Storchaka in :gh:`86493`.) + +* Add the :c:func:`PyObject_GenericHash` function + that implements the default hashing function of a Python object. + (Contributed by Serhiy Storchaka in :gh:`113024`.) + +* Add the :c:func:`Py_HashPointer` function to hash a raw pointer. + (Contributed by Victor Stinner in :gh:`111545`.) + +* Add the :c:func:`PyObject_VisitManagedDict` and + :c:func:`PyObject_ClearManagedDict` functions. + which must be called by the traverse and clear functions of a type using + the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag. + The `pythoncapi-compat project`_ can be used to + use these functions with Python 3.11 and 3.12. + (Contributed by Victor Stinner in :gh:`107073`.) + +* Add the :c:func:`PyRefTracer_SetTracer` + and :c:func:`PyRefTracer_GetTracer` functions, + which enable tracking object creation and destruction + in the same way that the :mod:`tracemalloc` module does. + (Contributed by Pablo Galindo in :gh:`93502`.) + +* Add the :c:func:`PySys_AuditTuple` function + as an alternative to :c:func:`PySys_Audit` + that takes event arguments as a Python :class:`tuple` object. + (Contributed by Victor Stinner in :gh:`85283`.) + +* Add the :c:func:`PyThreadState_GetUnchecked()` function + as an alternative to :c:func:`PyThreadState_Get()` + that doesn't kill the process with a fatal error if it is ``NULL``. + The caller is responsible for checking if the result is ``NULL``. + (Contributed by Victor Stinner in :gh:`108867`.) + +* Add the :c:func:`PyType_GetFullyQualifiedName` function + to get the type's fully qualified name. + The module name is prepended if :attr:`type.__module__` is + a string and is not equal to either ``'builtins'`` or ``'__main__'``. + (Contributed by Victor Stinner in :gh:`111696`.) + +* Add the :c:func:`PyType_GetModuleName` function + to get the type's module name. This is equivalent to getting the + :attr:`type.__module__` attribute. + (Contributed by Eric Snow and Victor Stinner in :gh:`111696`.) + +* Add the :c:func:`PyUnicode_EqualToUTF8AndSize` + and :c:func:`PyUnicode_EqualToUTF8` functions + to compare a Unicode object with a :c:expr:`const char*` UTF-8 encoded string + and ``1`` if they are equal or ``0`` otherwise. + These functions do not raise exceptions. + (Contributed by Serhiy Storchaka in :gh:`110289`.) + +* Add the :c:func:`PyWeakref_GetRef` function + as an alternative to :c:func:`PyWeakref_GetObject` + that returns a :term:`strong reference` + or ``NULL`` if the referent is no longer live. + (Contributed by Victor Stinner in :gh:`105927`.) + +* Add fixed variants of functions which silently ignore errors: + + * :c:func:`PyObject_HasAttrWithError` replaces :c:func:`PyObject_HasAttr`. + * :c:func:`PyObject_HasAttrStringWithError` + replaces :c:func:`PyObject_HasAttrString`. + * :c:func:`PyMapping_HasKeyWithError` replaces :c:func:`PyMapping_HasKey`. + * :c:func:`PyMapping_HasKeyStringWithError` + replaces :c:func:`PyMapping_HasKeyString`. + + The new functions return ``-1`` for errors + and the standard ``1`` for true and ``0`` for false. + + (Contributed by Serhiy Storchaka in :gh:`108511`.) + + +Changed C APIs +-------------- + +* The *keywords* parameter of :c:func:`PyArg_ParseTupleAndKeywords` + and :c:func:`PyArg_VaParseTupleAndKeywords` + now has type :c:expr:`char * const *` in C + and :c:expr:`const char * const *` in C++, + instead of :c:expr:`char **`. + In C++, this makes these functions compatible with arguments + of type :c:expr:`const char * const *`, :c:expr:`const char **`, + or :c:expr:`char * const *` without an explicit type cast. + In C, the functions only support arguments of type :c:expr:`char * const *`. + This can be overridden with the :c:macro:`PY_CXX_CONST` macro. + (Contributed by Serhiy Storchaka in :gh:`65210`.) + +* :c:func:`PyArg_ParseTupleAndKeywords` now supports + non-ASCII keyword parameter names. + (Contributed by Serhiy Storchaka in :gh:`110815`.) + +* The :c:func:`!PyCode_GetFirstFree` function is now unstable API + and is now named :c:func:`PyUnstable_Code_GetFirstFree`. + (Contributed by Bogdan Romanyuk in :gh:`115781`.) + +* The :c:func:`PyDict_GetItem`, :c:func:`PyDict_GetItemString`, + :c:func:`PyMapping_HasKey`, :c:func:`PyMapping_HasKeyString`, + :c:func:`PyObject_HasAttr`, :c:func:`PyObject_HasAttrString`, + and :c:func:`PySys_GetObject` functions, + each of which clears all errors which occurred when calling them + now reports these errors using :func:`sys.unraisablehook`. + You may replace them with other functions as recommended in the documentation. + (Contributed by Serhiy Storchaka in :gh:`106672`.) + +* Add support for the ``%T``, ``%#T``, ``%N`` and ``%#N`` formats + to :c:func:`PyUnicode_FromFormat`: + + * ``%T``: Get the fully qualified name of an object type + * ``%#T``: As above, but use a colon as the separator + * ``%N``: Get the fully qualified name of a type + * ``%#N``: As above, but use a colon as the separator + + See :pep:`737` for more information. + (Contributed by Victor Stinner in :gh:`111696`.) + +* You no longer have to define the ``PY_SSIZE_T_CLEAN`` macro before + including :file:`Python.h` when using ``#`` formats in + :ref:`format codes `. + APIs accepting the format codes always use ``Py_ssize_t`` for ``#`` formats. + (Contributed by Inada Naoki in :gh:`104922`.) + +* If Python is built in :ref:`debug mode ` + or :option:`with assertions <--with-assertions>`, + :c:func:`PyTuple_SET_ITEM` and :c:func:`PyList_SET_ITEM` + now check the index argument with an assertion. + (Contributed by Victor Stinner in :gh:`106168`.) + + +Limited C API Changes +--------------------- + +* The following functions are now included in the Limited C API: + + * :c:func:`PyMem_RawMalloc` + * :c:func:`PyMem_RawCalloc` + * :c:func:`PyMem_RawRealloc` + * :c:func:`PyMem_RawFree` + * :c:func:`PySys_Audit` + * :c:func:`PySys_AuditTuple` + * :c:func:`PyType_GetModuleByDef` + + (Contributed by Victor Stinner in :gh:`85283`, :gh:`85283`, and :gh:`116936`.) + +* Python built with :option:`--with-trace-refs` (tracing references) + now supports the :ref:`Limited API `. + (Contributed by Victor Stinner in :gh:`108634`.) + + +Removed C APIs +-------------- + +* Remove several functions, macros, variables, etc + with names prefixed by ``_Py`` or ``_PY`` (which are considered private). + If your project is affected by one of these removals + and you believe that the removed API should remain available, + please :ref:`open a new issue ` to request a public C API + and add ``cc: @vstinner`` to the issue to notify Victor Stinner. + (Contributed by Victor Stinner in :gh:`106320`.) + +* Remove old buffer protocols deprecated in Python 3.0. + Use :ref:`bufferobjects` instead. + + * :c:func:`!PyObject_CheckReadBuffer`: + Use :c:func:`PyObject_CheckBuffer` to test + whether the object supports the buffer protocol. + Note that :c:func:`PyObject_CheckBuffer` doesn't guarantee + that :c:func:`PyObject_GetBuffer` will succeed. + To test if the object is actually readable, + see the next example of :c:func:`PyObject_GetBuffer`. + + * :c:func:`!PyObject_AsCharBuffer`, :c:func:`!PyObject_AsReadBuffer`: + Use :c:func:`PyObject_GetBuffer` and :c:func:`PyBuffer_Release` instead: + + .. code-block:: c + + Py_buffer view; + if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) { + return NULL; + } + // Use `view.buf` and `view.len` to read from the buffer. + // You may need to cast buf as `(const char*)view.buf`. + PyBuffer_Release(&view); + + * :c:func:`!PyObject_AsWriteBuffer`: + Use :c:func:`PyObject_GetBuffer` and :c:func:`PyBuffer_Release` instead: + + .. code-block:: c + + Py_buffer view; + if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) { + return NULL; + } + // Use `view.buf` and `view.len` to write to the buffer. + PyBuffer_Release(&view); + + (Contributed by Inada Naoki in :gh:`85275`.) + +* Remove various functions deprecated in Python 3.9: + + * :c:func:`!PyEval_CallObject`, :c:func:`!PyEval_CallObjectWithKeywords`: + Use :c:func:`PyObject_CallNoArgs` or :c:func:`PyObject_Call` instead. + + .. warning:: + + In :c:func:`PyObject_Call`, positional arguments must be a :class:`tuple` + and must not be ``NULL``, + and keyword arguments must be a :class:`dict` or ``NULL``, + whereas the removed functions checked argument types + and accepted ``NULL`` positional and keyword arguments. + To replace ``PyEval_CallObjectWithKeywords(func, NULL, kwargs)`` with + :c:func:`PyObject_Call`, + pass an empty tuple as positional arguments using + :c:func:`PyTuple_New(0) `. + + * :c:func:`!PyEval_CallFunction`: + Use :c:func:`PyObject_CallFunction` instead. + * :c:func:`!PyEval_CallMethod`: + Use :c:func:`PyObject_CallMethod` instead. + * :c:func:`!PyCFunction_Call`: + Use :c:func:`PyObject_Call` instead. + + (Contributed by Victor Stinner in :gh:`105107`.) + +* Remove the following old functions to configure the Python initialization, + deprecated in Python 3.11: + + * :c:func:`!PySys_AddWarnOptionUnicode`: + Use :c:member:`PyConfig.warnoptions` instead. + * :c:func:`!PySys_AddWarnOption`: + Use :c:member:`PyConfig.warnoptions` instead. + * :c:func:`!PySys_AddXOption`: + Use :c:member:`PyConfig.xoptions` instead. + * :c:func:`!PySys_HasWarnOptions`: + Use :c:member:`PyConfig.xoptions` instead. + * :c:func:`!PySys_SetPath`: + Set :c:member:`PyConfig.module_search_paths` instead. + * :c:func:`!Py_SetPath`: + Set :c:member:`PyConfig.module_search_paths` instead. + * :c:func:`!Py_SetStandardStreamEncoding`: + Set :c:member:`PyConfig.stdio_encoding` instead, + and set also maybe :c:member:`PyConfig.legacy_windows_stdio` (on Windows). + * :c:func:`!_Py_SetProgramFullPath`: + Set :c:member:`PyConfig.executable` instead. + + Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization + Configuration ` instead (:pep:`587`), added to Python 3.8. + (Contributed by Victor Stinner in :gh:`105145`.) + +* Remove :c:func:`!PyEval_AcquireLock` and :c:func:`!PyEval_ReleaseLock` functions, + deprecated in Python 3.2. + They didn't update the current thread state. + They can be replaced with: + + * :c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread`; + * low-level :c:func:`PyEval_AcquireThread` and :c:func:`PyEval_RestoreThread`; + * or :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release`. + + (Contributed by Victor Stinner in :gh:`105182`.) + +* Remove the :c:func:`!PyEval_ThreadsInitialized` function, + deprecated in Python 3.9. + Since Python 3.7, :c:func:`!Py_Initialize` always creates the GIL: + calling :c:func:`!PyEval_InitThreads` does nothing and + :c:func:`!PyEval_ThreadsInitialized` always returns non-zero. + (Contributed by Victor Stinner in :gh:`105182`.) + +* Remove the :c:func:`!_PyInterpreterState_Get` alias to + :c:func:`PyInterpreterState_Get()` + which was kept for backward compatibility with Python 3.8. + The `pythoncapi-compat project`_ can be used to get + :c:func:`PyInterpreterState_Get()` on Python 3.8 and older. + (Contributed by Victor Stinner in :gh:`106320`.) + +* Remove the private :c:func:`!_PyObject_FastCall` function: + use :c:func:`!PyObject_Vectorcall` which is available since Python 3.8 + (:pep:`590`). + (Contributed by Victor Stinner in :gh:`106023`.) + +* Remove the ``cpython/pytime.h`` header file, + which only contained private functions. + (Contributed by Victor Stinner in :gh:`106316`.) + +* Remove the undocumented ``PY_TIMEOUT_MAX`` constant from the limited C API. + (Contributed by Victor Stinner in :gh:`110014`.) + +* Remove the old trashcan macros ``Py_TRASHCAN_SAFE_BEGIN`` + and ``Py_TRASHCAN_SAFE_END``. + Replace both with the new macros ``Py_TRASHCAN_BEGIN`` + and ``Py_TRASHCAN_END``. + (Contributed by Irit Katriel in :gh:`105111`.) + +Deprecated C APIs +----------------- + +* Deprecate old Python initialization functions: + + * :c:func:`PySys_ResetWarnOptions`: + Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead. + * :c:func:`Py_GetExecPrefix`: + Get :data:`sys.exec_prefix` instead. + * :c:func:`Py_GetPath`: + Get :data:`sys.path` instead. + * :c:func:`Py_GetPrefix`: + Get :data:`sys.prefix` instead. + * :c:func:`Py_GetProgramFullPath`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetProgramName`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetPythonHome`: + Get :c:member:`PyConfig.home` + or the :envvar:`PYTHONHOME` environment variable instead. + + (Contributed by Victor Stinner in :gh:`105145`.) + +* :term:`Soft deprecate ` the + :c:func:`PyEval_GetBuiltins`, :c:func:`PyEval_GetGlobals`, + and :c:func:`PyEval_GetLocals` functions, + which return a :term:`borrowed reference`. + (Soft deprecated as part of :pep:`667`.) + +* Deprecate the :c:func:`PyImport_ImportModuleNoBlock` function, + which is just an alias to :c:func:`PyImport_ImportModule` since Python 3.3. + (Contributed by Victor Stinner in :gh:`105396`.) + +* :term:`Soft deprecate ` the + :c:func:`PyModule_AddObject` function. + It should be replaced with :c:func:`PyModule_Add` + or :c:func:`PyModule_AddObjectRef`. + (Contributed by Serhiy Storchaka in :gh:`86493`.) + +* Deprecate the old ``Py_UNICODE`` and ``PY_UNICODE_TYPE`` types + and the :c:macro:`!Py_UNICODE_WIDE` define. + Use the :c:type:`wchar_t` type directly instead. + Since Python 3.3, ``Py_UNICODE`` and ``PY_UNICODE_TYPE`` + are just aliases to :c:type:`!wchar_t`. + (Contributed by Victor Stinner in :gh:`105156`.) + +* Deprecate the :c:func:`PyWeakref_GetObject` and + :c:func:`PyWeakref_GET_OBJECT` functions, + which return a :term:`borrowed reference`. + Replace them with the new :c:func:`PyWeakref_GetRef` function, + which returns a :term:`strong reference`. + The `pythoncapi-compat project`_ can be used to get + :c:func:`PyWeakref_GetRef` on Python 3.12 and older. + (Contributed by Victor Stinner in :gh:`105927`.) + +.. Add deprecations above alphabetically, not here at the end. + +.. include:: ../deprecations/c-api-pending-removal-in-3.14.rst + +.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst + +.. include:: ../deprecations/c-api-pending-removal-in-future.rst + +.. _pythoncapi-compat project: https://github.com/python/pythoncapi-compat/ + +Build Changes +============= + +* ``arm64-apple-ios`` and ``arm64-apple-ios-simulator`` are both + now :pep:`11` tier 3 platforms. + (:ref:`PEP 730 ` written + and implementation contributed by Russell Keith-Magee in :gh:`114099`.) + +* ``aarch64-linux-android`` and ``x86_64-linux-android`` are both + now :pep:`11` tier 3 platforms. + (:ref:`PEP 738 ` written + and implementation contributed by Malcolm Smith in :gh:`116622`.) + +* ``wasm32-wasi`` is now a :pep:`11` tier 2 platform. + (Contributed by Brett Cannon in :gh:`115192`.) + +* ``wasm32-emscripten`` is no longer a :pep:`11` supported platform. + (Contributed by Brett Cannon in :gh:`115192`.) + +* Building CPython now requires a compiler with support for the C11 atomic + library, GCC built-in atomic functions, or MSVC interlocked intrinsics. + +* Autoconf 2.71 and aclocal 1.16.5 are now required to regenerate + the :file:`configure` script. + (Contributed by Christian Heimes in :gh:`89886` and by Victor Stinner in :gh:`112090`.) + +* SQLite 3.15.2 or newer is required to build + the :mod:`sqlite3` extension module. + (Contributed by Erlend Aasland in :gh:`105875`.) + +* CPython now bundles the `mimalloc library`_ by default. + It is licensed under the MIT license; + see :ref:`mimalloc license `. + The bundled mimalloc has custom changes, see :gh:`113141` for details. + (Contributed by Dino Viehland in :gh:`109914`.) + + .. _mimalloc library: https://github.com/microsoft/mimalloc/ + +* The :file:`configure` option :option:`--with-system-libmpdec` + now defaults to ``yes``. + The bundled copy of ``libmpdecimal`` will be removed in Python 3.15. + +* Python built with :file:`configure` :option:`--with-trace-refs` + (tracing references) is now ABI compatible with the Python release build + and :ref:`debug build `. + (Contributed by Victor Stinner in :gh:`108634`.) + +* On POSIX systems, the pkg-config (``.pc``) filenames now include the ABI + flags. For example, the free-threaded build generates ``python-3.13t.pc`` + and the debug build generates ``python-3.13d.pc``. + +* The ``errno``, ``fcntl``, ``grp``, ``md5``, ``pwd``, ``resource``, + ``termios``, ``winsound``, + ``_ctypes_test``, ``_multiprocessing.posixshmem``, ``_scproxy``, ``_stat``, + ``_statistics``, ``_testconsole``, ``_testimportmultiple`` and ``_uuid`` + C extensions are now built with the :ref:`limited C API `. + (Contributed by Victor Stinner in :gh:`85283`.) + + +Porting to Python 3.13 +====================== + +This section lists previously described changes and other bugfixes +that may require changes to your code. + +Changes in the Python API +------------------------- + +.. _pep667-porting-notes-py: + +* :ref:`PEP 667 ` introduces several changes + to the semantics of :func:`locals` and :attr:`f_locals `: + + * Calling :func:`locals` in an :term:`optimized scope` now produces an + independent snapshot on each call, and hence no longer implicitly updates + previously returned references. Obtaining the legacy CPython behavior now + requires explicit calls to update the initially returned dictionary with the + results of subsequent calls to :func:`!locals`. Code execution functions that + implicitly target :func:`!locals` (such as ``exec`` and ``eval``) must be + passed an explicit namespace to access their results in an optimized scope. + (Changed as part of :pep:`667`.) + + * Calling :func:`locals` from a comprehension at module or class scope + (including via ``exec`` or ``eval``) once more behaves as if the comprehension + were running as an independent nested function (i.e. the local variables from + the containing scope are not included). In Python 3.12, this had changed + to include the local variables from the containing scope when implementing + :pep:`709`. (Changed as part of :pep:`667`.) + + * Accessing :attr:`FrameType.f_locals ` in an + :term:`optimized scope` now returns a write-through proxy rather than a + snapshot that gets updated at ill-specified times. If a snapshot is desired, + it must be created explicitly with ``dict`` or the proxy's ``.copy()`` method. + (Changed as part of :pep:`667`.) + +* :class:`functools.partial` now emits a :exc:`FutureWarning` + when used as a method. + The behavior will change in future Python versions. + Wrap it in :func:`staticmethod` if you want to preserve the old behavior. + (Contributed by Serhiy Storchaka in :gh:`121027`.) + +* An :exc:`OSError` is now raised by :func:`getpass.getuser` + for any failure to retrieve a username, + instead of :exc:`ImportError` on non-Unix platforms + or :exc:`KeyError` on Unix platforms where the password database is empty. + +* The value of the :attr:`!mode` attribute of :class:`gzip.GzipFile` + is now a string (``'rb'`` or ``'wb'``) instead of an integer (``1`` or ``2``). + The value of the :attr:`!mode` attribute of the readable file-like object + returned by :meth:`zipfile.ZipFile.open` is now ``'rb'`` instead of ``'r'``. + (Contributed by Serhiy Storchaka in :gh:`115961`.) + +* :class:`mailbox.Maildir` now ignores files with a leading dot (``.``). + (Contributed by Zackery Spytz in :gh:`65559`.) + +* :meth:`pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` now return both + files and directories if a pattern that ends with "``**``" is given, + rather than directories only. + Add a trailing slash to keep the previous behavior and only match directories. + +* The :mod:`threading` module now expects the :mod:`!_thread` module + to have an :func:`!_is_main_interpreter` function. + This function takes no arguments and returns ``True`` + if the current interpreter is the main interpreter. + + Any library or application that provides a custom :mod:`!_thread` module + must provide :func:`!_is_main_interpreter`, + just like the module's other "private" attributes. + (:gh:`112826`.) + + +Changes in the C API +-------------------- + +* ``Python.h`` no longer includes the ```` standard header. It was + included for the :c:func:`!finite` function which is now provided by the + ```` header. It should now be included explicitly if needed. Remove + also the ``HAVE_IEEEFP_H`` macro. + (Contributed by Victor Stinner in :gh:`108765`.) + +* ``Python.h`` no longer includes these standard header files: ````, + ```` and ````. If needed, they should now be + included explicitly. For example, ```` provides the :c:func:`!clock` and + :c:func:`!gmtime` functions, ```` provides the :c:func:`!select` + function, and ```` provides the :c:func:`!futimes`, :c:func:`!gettimeofday` + and :c:func:`!setitimer` functions. + (Contributed by Victor Stinner in :gh:`108765`.) + +* On Windows, ``Python.h`` no longer includes the ```` standard + header file. If needed, it should now be included explicitly. For example, it + provides :c:func:`!offsetof` function, and ``size_t`` and ``ptrdiff_t`` types. + Including ```` explicitly was already needed by all other + platforms, the ``HAVE_STDDEF_H`` macro is only defined on Windows. + (Contributed by Victor Stinner in :gh:`108765`.) + +* If the :c:macro:`Py_LIMITED_API` macro is defined, :c:macro:`!Py_BUILD_CORE`, + :c:macro:`!Py_BUILD_CORE_BUILTIN` and :c:macro:`!Py_BUILD_CORE_MODULE` macros + are now undefined by ````. + (Contributed by Victor Stinner in :gh:`85283`.) + +* The old trashcan macros ``Py_TRASHCAN_SAFE_BEGIN`` and ``Py_TRASHCAN_SAFE_END`` + were removed. They should be replaced by the new macros ``Py_TRASHCAN_BEGIN`` + and ``Py_TRASHCAN_END``. + + A ``tp_dealloc`` function that has the old macros, such as:: + + static void + mytype_dealloc(mytype *p) + { + PyObject_GC_UnTrack(p); + Py_TRASHCAN_SAFE_BEGIN(p); + ... + Py_TRASHCAN_SAFE_END + } + + should migrate to the new macros as follows:: + + static void + mytype_dealloc(mytype *p) + { + PyObject_GC_UnTrack(p); + Py_TRASHCAN_BEGIN(p, mytype_dealloc) + ... + Py_TRASHCAN_END + } + + Note that ``Py_TRASHCAN_BEGIN`` has a second argument which + should be the deallocation function it is in. The new macros were + added in Python 3.8 and the old macros were deprecated in Python 3.11. + (Contributed by Irit Katriel in :gh:`105111`.) + +.. _pep667-porting-notes-c: + +* :ref:`PEP 667 ` introduces several changes + to frame-related functions: + + * The effects of mutating the dictionary returned from + :c:func:`PyEval_GetLocals` in an :term:`optimized scope` have changed. + New dict entries added this way will now *only* be visible to + subsequent :c:func:`PyEval_GetLocals` calls in that frame, + as :c:func:`PyFrame_GetLocals`, :func:`locals`, + and :attr:`FrameType.f_locals ` no longer access + the same underlying cached dictionary. + Changes made to entries for actual variable names and names added via + the write-through proxy interfaces will be overwritten on subsequent calls + to :c:func:`PyEval_GetLocals` in that frame. + The recommended code update depends on how the function was being used, + so refer to the deprecation notice on the function for details. + + * Calling :c:func:`PyFrame_GetLocals` in an :term:`optimized scope` + now returns a write-through proxy rather than a snapshot + that gets updated at ill-specified times. + If a snapshot is desired, it must be created explicitly + (e.g. with :c:func:`PyDict_Copy`), + or by calling the new :c:func:`PyEval_GetFrameLocals` API. + + * :c:func:`!PyFrame_FastToLocals` and :c:func:`!PyFrame_FastToLocalsWithError` + no longer have any effect. + Calling these functions has been redundant since Python 3.11, + when :c:func:`PyFrame_GetLocals` was first introduced. + + * :c:func:`!PyFrame_LocalsToFast` no longer has any effect. + Calling this function is redundant now that :c:func:`PyFrame_GetLocals` + returns a write-through proxy for :term:`optimized scopes `. + +Regression Test Changes +======================= + +* Python built with :file:`configure` :option:`--with-pydebug` now + supports a :option:`-X presite=package.module <-X>` command-line + option. If used, it specifies a module that should be imported early + in the lifecycle of the interpreter, before ``site.py`` is executed. + (Contributed by Łukasz Langa in :gh:`110769`.) + + +Notable changes in 3.13.1 +========================= + +sys +--- + +* The previously undocumented special function :func:`sys.getobjects`, + which only exists in specialized builds of Python, may now return objects + from other interpreters than the one it's called in. diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index ba1cb4ae..7104904c 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -183,7 +183,7 @@ PEP 391: Dictionary Based Configuration for Logging The :mod:`logging` module provided two kinds of configuration, one style with function calls for each option or another style driven by an external file saved -in a :mod:`ConfigParser` format. Those options did not provide the flexibility +in a :mod:`configparser` format. Those options did not provide the flexibility to create configurations from JSON or YAML files, nor did they support incremental configuration, which is needed for specifying logger options from a command line. @@ -312,8 +312,8 @@ cluttering source directories, the *pyc* files are now collected in a Aside from the filenames and target directories, the new scheme has a few aspects that are visible to the programmer: -* Imported modules now have a :attr:`__cached__` attribute which stores the name - of the actual file that was imported: +* Imported modules now have a :attr:`~module.__cached__` attribute which stores + the name of the actual file that was imported: >>> import collections >>> collections.__cached__ # doctest: +SKIP @@ -344,8 +344,8 @@ aspects that are visible to the programmer: * The :mod:`importlib.abc` module has been updated with new :term:`abstract base classes ` for loading bytecode files. The obsolete - ABCs, :class:`~importlib.abc.PyLoader` and - :class:`~importlib.abc.PyPycLoader`, have been deprecated (instructions on how + ABCs, :class:`!PyLoader` and + :class:`!PyPycLoader`, have been deprecated (instructions on how to stay Python 3.1 compatible are included with the documentation). .. seealso:: @@ -401,7 +401,7 @@ The *native strings* are always of type :class:`str` but are restricted to code points between *U+0000* through *U+00FF* which are translatable to bytes using *Latin-1* encoding. These strings are used for the keys and values in the environment dictionary and for response headers and statuses in the -:func:`start_response` function. They must follow :rfc:`2616` with respect to +:func:`!start_response` function. They must follow :rfc:`2616` with respect to encoding. That is, they must either be *ISO-8859-1* characters or use :rfc:`2047` MIME encoding. @@ -415,8 +415,8 @@ points: encoded in utf-8 was using ``h.encode('utf-8')`` now needs to convert from bytes to native strings using ``h.encode('utf-8').decode('latin-1')``. -* Values yielded by an application or sent using the :meth:`write` method - must be byte strings. The :func:`start_response` function and environ +* Values yielded by an application or sent using the :meth:`!write` method + must be byte strings. The :func:`!start_response` function and environ must use native strings. The two cannot be mixed. For server implementers writing CGI-to-WSGI pathways or other CGI-style @@ -499,7 +499,7 @@ Some smaller changes made to the core Python language are: * The :func:`hasattr` function works by calling :func:`getattr` and detecting whether an exception is raised. This technique allows it to detect methods - created dynamically by :meth:`__getattr__` or :meth:`__getattribute__` which + created dynamically by :meth:`~object.__getattr__` or :meth:`~object.__getattribute__` which would otherwise be absent from the class dictionary. Formerly, *hasattr* would catch any exception, possibly masking genuine errors. Now, *hasattr* has been tightened to only catch :exc:`AttributeError` and let other @@ -531,7 +531,7 @@ Some smaller changes made to the core Python language are: (Proposed and implemented by Mark Dickinson; :issue:`9337`.) -* :class:`memoryview` objects now have a :meth:`~memoryview.release()` method +* :class:`memoryview` objects now have a :meth:`~memoryview.release` method and they also now support the context management protocol. This allows timely release of any resources that were acquired when requesting a buffer from the original object. @@ -620,7 +620,7 @@ Some smaller changes made to the core Python language are: * :class:`range` objects now support *index* and *count* methods. This is part of an effort to make more objects fully implement the - :class:`collections.Sequence` :term:`abstract base class`. As a result, the + :class:`collections.Sequence ` :term:`abstract base class`. As a result, the language will have a more uniform API. In addition, :class:`range` objects now support slicing and negative indices, even with values larger than :data:`sys.maxsize`. This makes *range* more interoperable with lists:: @@ -662,7 +662,7 @@ Python's standard library has undergone significant maintenance efforts and quality improvements. The biggest news for Python 3.2 is that the :mod:`email` package, :mod:`mailbox` -module, and :mod:`nntplib` modules now work correctly with the bytes/text model +module, and :mod:`!nntplib` modules now work correctly with the bytes/text model in Python 3. For the first time, there is correct handling of messages with mixed encodings. @@ -720,7 +720,7 @@ format. elementtree ----------- -The :mod:`xml.etree.ElementTree` package and its :mod:`xml.etree.cElementTree` +The :mod:`xml.etree.ElementTree` package and its :mod:`!xml.etree.cElementTree` counterpart have been updated to version 1.3. Several new and useful functions and methods have been added: @@ -743,8 +743,8 @@ Several new and useful functions and methods have been added: Two methods have been deprecated: -* :meth:`xml.etree.ElementTree.getchildren` use ``list(elem)`` instead. -* :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. +* :meth:`!xml.etree.ElementTree.getchildren` use ``list(elem)`` instead. +* :meth:`!xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree `_ @@ -785,14 +785,15 @@ functools (Contributed by Raymond Hettinger and incorporating design ideas from Jim Baker, Miki Tebeka, and Nick Coghlan; see `recipe 498245 - `_\, `recipe 577479 - `_\, :issue:`10586`, and + `_\, `recipe 577479 + `_\, :issue:`10586`, and :issue:`10593`.) * The :func:`functools.wraps` decorator now adds a :attr:`__wrapped__` attribute pointing to the original callable function. This allows wrapped functions to - be introspected. It also copies :attr:`__annotations__` if defined. And now - it also gracefully skips over missing attributes such as :attr:`__doc__` which + be introspected. It also copies :attr:`~function.__annotations__` if + defined. And now it also gracefully skips over missing attributes such as + :attr:`~function.__doc__` which might not be defined for the wrapped callable. In the above example, the cache can be removed by recovering the original @@ -1007,13 +1008,13 @@ datetime and time after 1900. The new supported year range is from 1000 to 9999 inclusive. * Whenever a two-digit year is used in a time tuple, the interpretation has been - governed by :data:`time.accept2dyear`. The default is ``True`` which means that + governed by :data:`!time.accept2dyear`. The default is ``True`` which means that for a two-digit year, the century is guessed according to the POSIX rules governing the ``%y`` strptime format. Starting with Py3.2, use of the century guessing heuristic will emit a :exc:`DeprecationWarning`. Instead, it is recommended that - :data:`time.accept2dyear` be set to ``False`` so that large date ranges + :data:`!time.accept2dyear` be set to ``False`` so that large date ranges can be used without guesswork:: >>> import time, warnings @@ -1031,7 +1032,7 @@ datetime and time 'Fri Jan 1 12:34:56 11' Several functions now have significantly expanded date ranges. When - :data:`time.accept2dyear` is false, the :func:`time.asctime` function will + :data:`!time.accept2dyear` is false, the :func:`time.asctime` function will accept any year that fits in a C int, while the :func:`time.mktime` and :func:`time.strftime` functions will accept the full range supported by the corresponding operating system functions. @@ -1147,15 +1148,15 @@ for slice notation are well-suited to in-place editing:: reprlib ------- -When writing a :meth:`__repr__` method for a custom container, it is easy to +When writing a :meth:`~object.__repr__` method for a custom container, it is easy to forget to handle the case where a member refers back to the container itself. Python's builtin objects such as :class:`list` and :class:`set` handle self-reference by displaying "..." in the recursive part of the representation string. -To help write such :meth:`__repr__` methods, the :mod:`reprlib` module has a new +To help write such :meth:`~object.__repr__` methods, the :mod:`reprlib` module has a new decorator, :func:`~reprlib.recursive_repr`, for detecting recursive calls to -:meth:`__repr__` and substituting a placeholder string instead:: +:meth:`!__repr__` and substituting a placeholder string instead:: >>> class MyList(list): ... @recursive_repr() @@ -1307,11 +1308,11 @@ used for the imaginary part of a number: >>> sys.hash_info # doctest: +SKIP sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003) -An early decision to limit the inter-operability of various numeric types has +An early decision to limit the interoperability of various numeric types has been relaxed. It is still unsupported (and ill-advised) to have implicit mixing in arithmetic expressions such as ``Decimal('1.1') + float('1.1')`` because the latter loses information in the process of constructing the binary -float. However, since existing floating point value can be converted losslessly +float. However, since existing floating-point value can be converted losslessly to either a decimal or rational representation, it makes sense to add them to the constructor and to support mixed-type comparisons. @@ -1324,7 +1325,7 @@ the constructor and to support mixed-type comparisons. and :class:`fractions.Fraction` (:issue:`2531` and :issue:`8188`). Similar changes were made to :class:`fractions.Fraction` so that the -:meth:`~fractions.Fraction.from_float()` and :meth:`~fractions.Fraction.from_decimal` +:meth:`~fractions.Fraction.from_float` and :meth:`~fractions.Fraction.from_decimal` methods are no longer needed (:issue:`8294`): >>> from decimal import Decimal @@ -1335,7 +1336,7 @@ Decimal('1.100000000000000088817841970012523233890533447265625') Fraction(2476979795053773, 2251799813685248) Another useful change for the :mod:`decimal` module is that the -:attr:`Context.clamp` attribute is now public. This is useful in creating +:attr:`Context.clamp ` attribute is now public. This is useful in creating contexts that correspond to the decimal interchange formats specified in IEEE 754 (see :issue:`8540`). @@ -1427,7 +1428,7 @@ before compressing and decompressing: Aides and Brian Curtin in :issue:`9962`, :issue:`1675951`, :issue:`7471` and :issue:`2846`.) -Also, the :class:`zipfile.ZipExtFile` class was reworked internally to represent +Also, the :class:`zipfile.ZipExtFile ` class was reworked internally to represent files stored inside an archive. The new implementation is significantly faster and can be wrapped in an :class:`io.BufferedReader` object for more speedups. It also solves an issue where interleaved calls to *read* and *readline* gave the @@ -1595,7 +1596,7 @@ sqlite3 The :mod:`sqlite3` module was updated to pysqlite version 2.6.0. It has two new capabilities. -* The :attr:`sqlite3.Connection.in_transit` attribute is true if there is an +* The :attr:`!sqlite3.Connection.in_transit` attribute is true if there is an active transaction for uncommitted changes. * The :meth:`sqlite3.Connection.enable_load_extension` and @@ -1621,7 +1622,7 @@ socket The :mod:`socket` module has two new improvements. -* Socket objects now have a :meth:`~socket.socket.detach()` method which puts +* Socket objects now have a :meth:`~socket.socket.detach` method which puts the socket into closed state without actually closing the underlying file descriptor. The latter can then be reused for other purposes. (Added by Antoine Pitrou; :issue:`8524`.) @@ -1642,14 +1643,14 @@ for secure (encrypted, authenticated) internet connections: other options. It includes a :meth:`~ssl.SSLContext.wrap_socket` for creating an SSL socket from an SSL context. -* A new function, :func:`ssl.match_hostname`, supports server identity +* A new function, :func:`!ssl.match_hostname`, supports server identity verification for higher-level protocols by implementing the rules of HTTPS (from :rfc:`2818`) which are also suitable for other protocols. -* The :func:`ssl.wrap_socket` constructor function now takes a *ciphers* +* The :func:`ssl.wrap_socket() ` constructor function now takes a *ciphers* argument. The *ciphers* string lists the allowed encryption algorithms using the format described in the `OpenSSL documentation - `__. + `__. * When linked against recent versions of OpenSSL, the :mod:`ssl` module now supports the Server Name Indication extension to the TLS protocol, allowing @@ -1676,13 +1677,13 @@ for secure (encrypted, authenticated) internet connections: nntp ---- -The :mod:`nntplib` module has a revamped implementation with better bytes and +The :mod:`!nntplib` module has a revamped implementation with better bytes and text semantics as well as more practical APIs. These improvements break compatibility with the nntplib version in Python 3.1, which was partly dysfunctional in itself. Support for secure connections through both implicit (using -:class:`nntplib.NNTP_SSL`) and explicit (using :meth:`nntplib.NNTP.starttls`) +:class:`!nntplib.NNTP_SSL`) and explicit (using :meth:`!nntplib.NNTP.starttls`) TLS has also been added. (Contributed by Antoine Pitrou in :issue:`9360` and Andrew Vant in :issue:`1926`.) @@ -1758,7 +1759,7 @@ names. (Contributed by Michael Foord.) * Experimentation at the interactive prompt is now easier because the - :class:`unittest.case.TestCase` class can now be instantiated without + :class:`unittest.TestCase` class can now be instantiated without arguments: >>> from unittest import TestCase @@ -1796,7 +1797,7 @@ names. * In addition, the method names in the module have undergone a number of clean-ups. For example, :meth:`~unittest.TestCase.assertRegex` is the new name for - :meth:`~unittest.TestCase.assertRegexpMatches` which was misnamed because the + :meth:`!assertRegexpMatches` which was misnamed because the test uses :func:`re.search`, not :func:`re.match`. Other methods using regular expressions are now named using short form "Regex" in preference to "Regexp" -- this matches the names used in other unittest implementations, @@ -1811,11 +1812,11 @@ names. =============================== ============================== Old Name Preferred Name =============================== ============================== - :meth:`assert_` :meth:`.assertTrue` - :meth:`assertEquals` :meth:`.assertEqual` - :meth:`assertNotEquals` :meth:`.assertNotEqual` - :meth:`assertAlmostEquals` :meth:`.assertAlmostEqual` - :meth:`assertNotAlmostEquals` :meth:`.assertNotAlmostEqual` + :meth:`!assert_` :meth:`.assertTrue` + :meth:`!assertEquals` :meth:`.assertEqual` + :meth:`!assertNotEquals` :meth:`.assertNotEqual` + :meth:`!assertAlmostEquals` :meth:`.assertAlmostEqual` + :meth:`!assertNotAlmostEquals` :meth:`.assertNotAlmostEqual` =============================== ============================== Likewise, the ``TestCase.fail*`` methods deprecated in Python 3.1 are expected @@ -1823,7 +1824,7 @@ names. (Contributed by Ezio Melotti; :issue:`9424`.) -* The :meth:`~unittest.TestCase.assertDictContainsSubset` method was deprecated +* The :meth:`!assertDictContainsSubset` method was deprecated because it was misimplemented with the arguments in the wrong order. This created hard-to-debug optical illusions where tests like ``TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})`` would fail. @@ -1857,12 +1858,12 @@ structure. asyncore -------- -:class:`asyncore.dispatcher` now provides a -:meth:`~asyncore.dispatcher.handle_accepted()` method +:class:`!asyncore.dispatcher` now provides a +:meth:`!handle_accepted` method returning a ``(sock, addr)`` pair which is called when a connection has actually been established with a new remote endpoint. This is supposed to be used as a -replacement for old :meth:`~asyncore.dispatcher.handle_accept()` and avoids -the user to call :meth:`~asyncore.dispatcher.accept()` directly. +replacement for old :meth:`!handle_accept` and avoids +the user to call :meth:`!accept` directly. (Contributed by Giampaolo Rodolà; :issue:`6706`.) @@ -1996,7 +1997,7 @@ under-the-hood. dbm --- -All database modules now support the :meth:`get` and :meth:`setdefault` methods. +All database modules now support the :meth:`!get` and :meth:`!setdefault` methods. (Suggested by Ray Allen in :issue:`9523`.) @@ -2117,7 +2118,7 @@ The :mod:`pdb` debugger module gained a number of usability improvements: :file:`.pdbrc` script file. * A :file:`.pdbrc` script file can contain ``continue`` and ``next`` commands that continue debugging. -* The :class:`Pdb` class constructor now accepts a *nosigint* argument. +* The :class:`~pdb.Pdb` class constructor now accepts a *nosigint* argument. * New commands: ``l(list)``, ``ll(long list)`` and ``source`` for listing source code. * New commands: ``display`` and ``undisplay`` for showing or hiding @@ -2133,7 +2134,7 @@ configparser The :mod:`configparser` module was modified to improve usability and predictability of the default parser and its supported INI syntax. The old -:class:`ConfigParser` class was removed in favor of :class:`SafeConfigParser` +:class:`!ConfigParser` class was removed in favor of :class:`!SafeConfigParser` which has in turn been renamed to :class:`~configparser.ConfigParser`. Support for inline comments is now turned off by default and section or option duplicates are not allowed in a single configuration source. @@ -2320,7 +2321,7 @@ Multi-threading intervals and reduced overhead due to lock contention and the number of ensuing system calls. The notion of a "check interval" to allow thread switches has been abandoned and replaced by an absolute duration expressed in - seconds. This parameter is tunable through :func:`sys.setswitchinterval()`. + seconds. This parameter is tunable through :func:`sys.setswitchinterval`. It currently defaults to 5 milliseconds. Additional details about the implementation can be read from a `python-dev @@ -2393,11 +2394,11 @@ A number of small performance enhancements have been added: (Contributed by Antoine Pitrou; :issue:`3001`.) -* The fast-search algorithm in stringlib is now used by the :meth:`split`, - :meth:`rsplit`, :meth:`splitlines` and :meth:`replace` methods on +* The fast-search algorithm in stringlib is now used by the :meth:`~str.split`, + :meth:`~str.rsplit`, :meth:`~str.splitlines` and :meth:`~str.replace` methods on :class:`bytes`, :class:`bytearray` and :class:`str` objects. Likewise, the - algorithm is also used by :meth:`rfind`, :meth:`rindex`, :meth:`rsplit` and - :meth:`rpartition`. + algorithm is also used by :meth:`~str.rfind`, :meth:`~str.rindex`, :meth:`~str.rsplit` and + :meth:`~str.rpartition`. (Patch by Florent Xicluna in :issue:`7622` and :issue:`7462`.) @@ -2409,11 +2410,11 @@ A number of small performance enhancements have been added: There were several other minor optimizations. Set differencing now runs faster when one operand is much larger than the other (patch by Andress Bennetts in -:issue:`8685`). The :meth:`array.repeat` method has a faster implementation -(:issue:`1569291` by Alexander Belopolsky). The :class:`BaseHTTPRequestHandler` +:issue:`8685`). The :meth:`!array.repeat` method has a faster implementation +(:issue:`1569291` by Alexander Belopolsky). The :class:`~http.server.BaseHTTPRequestHandler` has more efficient buffering (:issue:`3709` by Andrew Schaaf). The :func:`operator.attrgetter` function has been sped-up (:issue:`10160` by -Christos Georgiou). And :class:`ConfigParser` loads multi-line arguments a bit +Christos Georgiou). And :class:`~configparser.ConfigParser` loads multi-line arguments a bit faster (:issue:`7113` by Łukasz Langa). @@ -2561,11 +2562,11 @@ Changes to Python's build process and to the C API include: (Suggested by Raymond Hettinger and implemented by Benjamin Peterson; :issue:`9778`.) -* A new macro :c:macro:`Py_VA_COPY` copies the state of the variable argument +* A new macro :c:macro:`!Py_VA_COPY` copies the state of the variable argument list. It is equivalent to C99 *va_copy* but available on all Python platforms (:issue:`2443`). -* A new C API function :c:func:`PySys_SetArgvEx` allows an embedded interpreter +* A new C API function :c:func:`!PySys_SetArgvEx` allows an embedded interpreter to set :data:`sys.argv` without also modifying :data:`sys.path` (:issue:`5753`). @@ -2613,8 +2614,8 @@ This section lists previously described changes and other bugfixes that may require changes to your code: * The :mod:`configparser` module has a number of clean-ups. The major change is - to replace the old :class:`ConfigParser` class with long-standing preferred - alternative :class:`SafeConfigParser`. In addition there are a number of + to replace the old :class:`!ConfigParser` class with long-standing preferred + alternative :class:`!SafeConfigParser`. In addition there are a number of smaller incompatibilities: * The interpolation syntax is now validated on @@ -2643,14 +2644,15 @@ require changes to your code: * ``""`` is now a valid value and is no longer automatically converted to an empty string. For empty strings, use ``"option ="`` in a line. -* The :mod:`nntplib` module was reworked extensively, meaning that its APIs +* The :mod:`!nntplib` module was reworked extensively, meaning that its APIs are often incompatible with the 3.1 APIs. * :class:`bytearray` objects can no longer be used as filenames; instead, they should be converted to :class:`bytes`. -* The :meth:`array.tostring` and :meth:`array.fromstring` have been renamed to - :meth:`array.tobytes` and :meth:`array.frombytes` for clarity. The old names +* The :meth:`!array.tostring` and :meth:`!array.fromstring` have been renamed to + :meth:`array.tobytes() ` and + :meth:`array.frombytes() ` for clarity. The old names have been deprecated. (See :issue:`8990`.) * ``PyArg_Parse*()`` functions: @@ -2663,7 +2665,7 @@ require changes to your code: instead; the new type has a well-defined interface for passing typing safety information and a less complicated signature for calling a destructor. -* The :func:`sys.setfilesystemencoding` function was removed because +* The :func:`!sys.setfilesystemencoding` function was removed because it had a flawed design. * The :func:`random.seed` function and method now salt string seeds with an @@ -2671,7 +2673,7 @@ require changes to your code: reproduce Python 3.1 sequences, set the *version* argument to *1*, ``random.seed(s, version=1)``. -* The previously deprecated :func:`string.maketrans` function has been removed +* The previously deprecated :func:`!string.maketrans` function has been removed in favor of the static methods :meth:`bytes.maketrans` and :meth:`bytearray.maketrans`. This change solves the confusion around which types were supported by the :mod:`string` module. Now, :class:`str`, @@ -2681,7 +2683,7 @@ require changes to your code: (Contributed by Georg Brandl; :issue:`5675`.) -* The previously deprecated :func:`contextlib.nested` function has been removed +* The previously deprecated :func:`!contextlib.nested` function has been removed in favor of a plain :keyword:`with` statement which can accept multiple context managers. The latter technique is faster (because it is built-in), and it does a better job finalizing multiple context managers when one of them @@ -2736,8 +2738,8 @@ require changes to your code: thread-state aware APIs (such as :c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread`) should be used instead. -* Due to security risks, :func:`asyncore.handle_accept` has been deprecated, and - a new function, :func:`asyncore.handle_accepted`, was added to replace it. +* Due to security risks, :func:`!asyncore.handle_accept` has been deprecated, and + a new function, :func:`!asyncore.handle_accepted`, was added to replace it. (Contributed by Giampaolo Rodola in :issue:`6706`.) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index 3361789f..f814c4e9 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -174,7 +174,7 @@ Features b or c are now hashable. (Contributed by Antoine Pitrou in :issue:`13411`.) * Arbitrary slicing of any 1-D arrays type is supported. For example, it - is now possible to reverse a memoryview in O(1) by using a negative step. + is now possible to reverse a memoryview in *O*\ (1) by using a negative step. API changes ----------- @@ -549,9 +549,11 @@ separation of binary and text data). PEP 3155: Qualified name for classes and functions ================================================== -Functions and class objects have a new ``__qualname__`` attribute representing +Functions and class objects have a new :attr:`~definition.__qualname__` +attribute representing the "path" from the module top-level to their definition. For global functions -and classes, this is the same as ``__name__``. For other functions and classes, +and classes, this is the same as :attr:`~definition.__name__`. +For other functions and classes, it provides better information about where they were actually defined, and how they might be accessible from the global scope. @@ -779,8 +781,8 @@ Other Language Changes Some smaller changes made to the core Python language are: * Added support for Unicode name aliases and named sequences. - Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases, - and :func:`unicodedata.lookup()` resolves named sequences too. + Both :func:`unicodedata.lookup` and ``'\N{...}'`` now resolve name aliases, + and :func:`unicodedata.lookup` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`.) @@ -917,12 +919,12 @@ abstract methods. The recommended approach to declaring abstract descriptors is now to provide :attr:`__isabstractmethod__` as a dynamically updated property. The built-in descriptors have been updated accordingly. - * :class:`abc.abstractproperty` has been deprecated, use :class:`property` - with :func:`abc.abstractmethod` instead. - * :class:`abc.abstractclassmethod` has been deprecated, use - :class:`classmethod` with :func:`abc.abstractmethod` instead. - * :class:`abc.abstractstaticmethod` has been deprecated, use - :class:`staticmethod` with :func:`abc.abstractmethod` instead. +* :class:`abc.abstractproperty` has been deprecated, use :class:`property` + with :func:`abc.abstractmethod` instead. +* :class:`abc.abstractclassmethod` has been deprecated, use + :class:`classmethod` with :func:`abc.abstractmethod` instead. +* :class:`abc.abstractstaticmethod` has been deprecated, use + :class:`staticmethod` with :func:`abc.abstractmethod` instead. (Contributed by Darren Dale in :issue:`11610`.) @@ -1052,40 +1054,40 @@ their ``__init__`` method (for example, file objects) or in their crypt ----- -Addition of salt and modular crypt format (hashing method) and the :func:`~crypt.mksalt` -function to the :mod:`crypt` module. +Addition of salt and modular crypt format (hashing method) and the :func:`!mksalt` +function to the :mod:`!crypt` module. (:issue:`10924`) curses ------ - * If the :mod:`curses` module is linked to the ncursesw library, use Unicode - functions when Unicode strings or characters are passed (e.g. - :c:func:`waddwstr`), and bytes functions otherwise (e.g. :c:func:`waddstr`). - * Use the locale encoding instead of ``utf-8`` to encode Unicode strings. - * :class:`curses.window` has a new :attr:`curses.window.encoding` attribute. - * The :class:`curses.window` class has a new :meth:`~curses.window.get_wch` - method to get a wide character - * The :mod:`curses` module has a new :meth:`~curses.unget_wch` function to - push a wide character so the next :meth:`~curses.window.get_wch` will return - it +* If the :mod:`curses` module is linked to the ncursesw library, use Unicode + functions when Unicode strings or characters are passed (e.g. + :c:func:`waddwstr`), and bytes functions otherwise (e.g. :c:func:`waddstr`). +* Use the locale encoding instead of ``utf-8`` to encode Unicode strings. +* :class:`curses.window` has a new :attr:`curses.window.encoding` attribute. +* The :class:`curses.window` class has a new :meth:`~curses.window.get_wch` + method to get a wide character +* The :mod:`curses` module has a new :meth:`~curses.unget_wch` function to + push a wide character so the next :meth:`~curses.window.get_wch` will return + it (Contributed by Iñigo Serna in :issue:`6755`.) datetime -------- - * Equality comparisons between naive and aware :class:`~datetime.datetime` - instances now return :const:`False` instead of raising :exc:`TypeError` - (:issue:`15006`). - * New :meth:`datetime.datetime.timestamp` method: Return POSIX timestamp - corresponding to the :class:`~datetime.datetime` instance. - * The :meth:`datetime.datetime.strftime` method supports formatting years - older than 1000. - * The :meth:`datetime.datetime.astimezone` method can now be - called without arguments to convert datetime instance to the system - timezone. +* Equality comparisons between naive and aware :class:`~datetime.datetime` + instances now return :const:`False` instead of raising :exc:`TypeError` + (:issue:`15006`). +* New :meth:`datetime.datetime.timestamp` method: Return POSIX timestamp + corresponding to the :class:`~datetime.datetime` instance. +* The :meth:`datetime.datetime.strftime` method supports formatting years + older than 1000. +* The :meth:`datetime.datetime.astimezone` method can now be + called without arguments to convert datetime instance to the system + timezone. .. _new-decimal: @@ -1097,12 +1099,12 @@ decimal C-module and libmpdec written by Stefan Krah. The new C version of the decimal module integrates the high speed libmpdec -library for arbitrary precision correctly rounded decimal floating point +library for arbitrary precision correctly rounded decimal floating-point arithmetic. libmpdec conforms to IBM's General Decimal Arithmetic Specification. Performance gains range from 10x for database applications to 100x for numerically intensive applications. These numbers are expected gains -for standard precisions used in decimal floating point arithmetic. Since +for standard precisions used in decimal floating-point arithmetic. Since the precision is user configurable, the exact figures may vary. For example, in integer bignum arithmetic the differences can be significantly higher. @@ -1210,25 +1212,25 @@ the ``Message`` object it is serializing. The default policy is The minimum set of controls implemented by all ``policy`` objects are: - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - =============== ======================================================= - max_line_length The maximum length, excluding the linesep character(s), - individual lines may have when a ``Message`` is - serialized. Defaults to 78. +=============== ======================================================= +max_line_length The maximum length, excluding the linesep character(s), + individual lines may have when a ``Message`` is + serialized. Defaults to 78. - linesep The character used to separate individual lines when a - ``Message`` is serialized. Defaults to ``\n``. +linesep The character used to separate individual lines when a + ``Message`` is serialized. Defaults to ``\n``. - cte_type ``7bit`` or ``8bit``. ``8bit`` applies only to a - ``Bytes`` ``generator``, and means that non-ASCII may - be used where allowed by the protocol (or where it - exists in the original input). +cte_type ``7bit`` or ``8bit``. ``8bit`` applies only to a + ``Bytes`` ``generator``, and means that non-ASCII may + be used where allowed by the protocol (or where it + exists in the original input). - raise_on_defect Causes a ``parser`` to raise error when defects are - encountered instead of adding them to the ``Message`` - object's ``defects`` list. - =============== ======================================================= +raise_on_defect Causes a ``parser`` to raise error when defects are + encountered instead of adding them to the ``Message`` + object's ``defects`` list. +=============== ======================================================= A new policy instance, with new settings, is created using the :meth:`~email.policy.Policy.clone` method of policy objects. ``clone`` takes @@ -1263,21 +1265,21 @@ removal of the code) may occur if deemed necessary by the core developers. The new policies are instances of :class:`~email.policy.EmailPolicy`, and add the following additional controls: - .. tabularcolumns:: |l|L| +.. tabularcolumns:: |l|L| - =============== ======================================================= - refold_source Controls whether or not headers parsed by a - :mod:`~email.parser` are refolded by the - :mod:`~email.generator`. It can be ``none``, ``long``, - or ``all``. The default is ``long``, which means that - source headers with a line longer than - ``max_line_length`` get refolded. ``none`` means no - line get refolded, and ``all`` means that all lines - get refolded. +=============== ======================================================= +refold_source Controls whether or not headers parsed by a + :mod:`~email.parser` are refolded by the + :mod:`~email.generator`. It can be ``none``, ``long``, + or ``all``. The default is ``long``, which means that + source headers with a line longer than + ``max_line_length`` get refolded. ``none`` means no + line get refolded, and ``all`` means that all lines + get refolded. - header_factory A callable that take a ``name`` and ``value`` and - produces a custom header object. - =============== ======================================================= +header_factory A callable that take a ``name`` and ``value`` and + produces a custom header object. +=============== ======================================================= The ``header_factory`` is the key to the new features provided by the new policies. When one of the new policies is used, any header retrieved from @@ -1352,18 +1354,18 @@ API. New utility functions: - * :func:`~email.utils.format_datetime`: given a :class:`~datetime.datetime`, - produce a string formatted for use in an email header. +* :func:`~email.utils.format_datetime`: given a :class:`~datetime.datetime`, + produce a string formatted for use in an email header. - * :func:`~email.utils.parsedate_to_datetime`: given a date string from - an email header, convert it into an aware :class:`~datetime.datetime`, - or a naive :class:`~datetime.datetime` if the offset is ``-0000``. +* :func:`~email.utils.parsedate_to_datetime`: given a date string from + an email header, convert it into an aware :class:`~datetime.datetime`, + or a naive :class:`~datetime.datetime` if the offset is ``-0000``. - * :func:`~email.utils.localtime`: With no argument, returns the - current local time as an aware :class:`~datetime.datetime` using the local - :class:`~datetime.timezone`. Given an aware :class:`~datetime.datetime`, - converts it into an aware :class:`~datetime.datetime` using the - local :class:`~datetime.timezone`. +* :func:`~email.utils.localtime`: With no argument, returns the + current local time as an aware :class:`~datetime.datetime` using the local + :class:`~datetime.timezone`. Given an aware :class:`~datetime.datetime`, + converts it into an aware :class:`~datetime.datetime` using the + local :class:`~datetime.timezone`. ftplib @@ -1558,7 +1560,7 @@ Schlawack in :issue:`12708`.) nntplib ------- -The :class:`nntplib.NNTP` class now supports the context management protocol to +The :class:`!nntplib.NNTP` class now supports the context management protocol to unconditionally consume :exc:`socket.error` exceptions and to close the NNTP connection when done:: @@ -1778,7 +1780,7 @@ shlex ----- The previously undocumented helper function ``quote`` from the -:mod:`pipes` modules has been moved to the :mod:`shlex` module and +:mod:`!pipes` modules has been moved to the :mod:`shlex` module and documented. :func:`~shlex.quote` properly escapes all characters in a string that might be otherwise given special meaning by the shell. @@ -1845,7 +1847,7 @@ signal smtpd ----- -The :mod:`smtpd` module now supports :rfc:`5321` (extended SMTP) and :rfc:`1870` +The :mod:`!smtpd` module now supports :rfc:`5321` (extended SMTP) and :rfc:`1870` (size extension). Per the standard, these extensions are enabled if and only if the client initiates the session with an ``EHLO`` command. diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index 8e2d0427..71b186ae 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -215,13 +215,12 @@ automatic ``PATH`` modifications to have ``pip`` available from the command line by default, otherwise it can still be accessed through the Python launcher for Windows as ``py -m pip``. -As `discussed in the PEP`__, platform packagers may choose not to install +As :pep:`discussed in the PEP <0453#recommendations-for-downstream-distributors>` +platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager). -__ https://peps.python.org/pep-0453/#recommendations-for-downstream-distributors - .. note:: To avoid conflicts between parallel Python 2 and Python 3 installations, @@ -605,15 +604,15 @@ Using ``ABC`` as a base class has essentially the same effect as specifying aifc ---- -The :meth:`~aifc.aifc.getparams` method now returns a namedtuple rather than a +The :meth:`!getparams` method now returns a namedtuple rather than a plain tuple. (Contributed by Claudiu Popa in :issue:`17818`.) -:func:`aifc.open` now supports the context management protocol: when used in a -:keyword:`with` block, the :meth:`~aifc.aifc.close` method of the returned +:func:`!aifc.open` now supports the context management protocol: when used in a +:keyword:`with` block, the :meth:`!close` method of the returned object will be called automatically at the end of the block. (Contributed by Serhiy Storchacha in :issue:`16486`.) -The :meth:`~aifc.aifc.writeframesraw` and :meth:`~aifc.aifc.writeframes` +The :meth:`!writeframesraw` and :meth:`!writeframes` methods now accept any :term:`bytes-like object`. (Contributed by Serhiy Storchaka in :issue:`8311`.) @@ -629,14 +628,14 @@ by Lucas Maystre in :issue:`11175`.) audioop ------- -:mod:`audioop` now supports 24-bit samples. (Contributed by Serhiy Storchaka +:mod:`!audioop` now supports 24-bit samples. (Contributed by Serhiy Storchaka in :issue:`12866`.) -New :func:`~audioop.byteswap` function converts big-endian samples to +New :func:`!byteswap` function converts big-endian samples to little-endian and vice versa. (Contributed by Serhiy Storchaka in :issue:`19641`.) -All :mod:`audioop` functions now accept any :term:`bytes-like object`. Strings +All :mod:`!audioop` functions now accept any :term:`bytes-like object`. Strings are not accepted: they didn't work before, now they raise an error right away. (Contributed by Serhiy Storchaka in :issue:`16685`.) @@ -872,7 +871,7 @@ multiple implementations of an operation that allows it to work with PEP written and implemented by Łukasz Langa. :func:`~functools.total_ordering` now supports a return value of -:const:`NotImplemented` from the underlying comparison function. (Contributed +:data:`NotImplemented` from the underlying comparison function. (Contributed by Katie Miller in :issue:`10042`.) A pure-python version of the :func:`~functools.partial` function is now in the @@ -1369,9 +1368,9 @@ error. (Contributed by Atsuo Ishimoto and Hynek Schlawack in smtpd ----- -The :class:`~smtpd.SMTPServer` and :class:`~smtpd.SMTPChannel` classes now +The :class:`!SMTPServer` and :class:`!SMTPChannel` classes now accept a *map* keyword argument which, if specified, is passed in to -:class:`asynchat.async_chat` as its *map* argument. This allows an application +:class:`!asynchat.async_chat` as its *map* argument. This allows an application to avoid affecting the global socket map. (Contributed by Vinay Sajip in :issue:`11959`.) @@ -1495,7 +1494,7 @@ The dictionary returned by :meth:`.SSLSocket.getpeercert` contains additional stat ---- -The :mod:`stat` module is now backed by a C implementation in :mod:`_stat`. A C +The :mod:`stat` module is now backed by a C implementation in :mod:`!_stat`. A C implementation is required as most of the values aren't standardized and are platform-dependent. (Contributed by Christian Heimes in :issue:`11016`.) @@ -1528,10 +1527,10 @@ work on Windows. This change was actually inadvertently made in 3.3.4. sunau ----- -The :meth:`~sunau.getparams` method now returns a namedtuple rather than a +The :meth:`!getparams` method now returns a namedtuple rather than a plain tuple. (Contributed by Claudiu Popa in :issue:`18901`.) -:meth:`sunau.open` now supports the context management protocol: when used in a +:meth:`!sunau.open` now supports the context management protocol: when used in a :keyword:`with` block, the ``close`` method of the returned object will be called automatically at the end of the block. (Contributed by Serhiy Storchaka in :issue:`18878`.) @@ -1540,8 +1539,8 @@ in :issue:`18878`.) support for writing 24 sample using the module. (Contributed by Serhiy Storchaka in :issue:`19261`.) -The :meth:`~sunau.AU_write.writeframesraw` and -:meth:`~sunau.AU_write.writeframes` methods now accept any :term:`bytes-like +The :meth:`!writeframesraw` and +:meth:`!writeframes` methods now accept any :term:`bytes-like object`. (Contributed by Serhiy Storchaka in :issue:`8311`.) @@ -1891,7 +1890,7 @@ Other Build and C API Changes allowing retrieval of function pointers from named type slots when using the limited API. (Contributed by Martin von Löwis in :issue:`17162`.) -* The new :c:func:`Py_SetStandardStreamEncoding` pre-initialization API +* The new :c:func:`!Py_SetStandardStreamEncoding` pre-initialization API allows applications embedding the CPython interpreter to reliably force a particular encoding and error handler for the standard streams. (Contributed by Bastien Montagne and Nick Coghlan in :issue:`16129`.) @@ -1936,7 +1935,7 @@ Other Improvements * The :ref:`python ` command has a new :ref:`option `, ``-I``, which causes it to run in "isolated mode", which means that :data:`sys.path` contains neither the script's directory nor - the user's ``site-packages`` directory, and all :envvar:`PYTHON*` environment + the user's ``site-packages`` directory, and all :envvar:`!PYTHON*` environment variables are ignored (it implies both ``-s`` and ``-E``). Other restrictions may also be applied in the future, with the goal being to isolate the execution of a script from the user's environment. This is @@ -1963,11 +1962,11 @@ Other Improvements `_ will build python, run the test suite, and generate an HTML coverage report for the C codebase using ``gcov`` and `lcov - `_. + `_. * The ``-R`` option to the :ref:`python regression test suite ` now also checks for memory allocation leaks, using - :func:`sys.getallocatedblocks()`. (Contributed by Antoine Pitrou in + :func:`sys.getallocatedblocks`. (Contributed by Antoine Pitrou in :issue:`13390`.) * ``python -m`` now works with namespace packages. @@ -1980,7 +1979,7 @@ Other Improvements now works correctly (previously it silently returned the first python module in the file). (Contributed by Václav Šmilauer in :issue:`16421`.) -* A new opcode, :opcode:`LOAD_CLASSDEREF`, has been added to fix a bug in the +* A new opcode, :opcode:`!LOAD_CLASSDEREF`, has been added to fix a bug in the loading of free variables in class bodies that could be triggered by certain uses of :ref:`__prepare__ `. (Contributed by Benjamin Peterson in :issue:`17853`.) @@ -2272,7 +2271,8 @@ Changes in the Python API :func:`super` and falling through all the way to the ABCs. For compatibility, catch both :exc:`NotImplementedError` or the appropriate exception as needed. -* The module type now initializes the :attr:`__package__` and :attr:`__loader__` +* The module type now initializes the :attr:`~module.__package__` and + :attr:`~module.__loader__` attributes to ``None`` by default. To determine if these attributes were set in a backwards-compatible fashion, use e.g. ``getattr(module, '__loader__', None) is not None``. (:issue:`17115`.) @@ -2370,12 +2370,12 @@ Changes in the Python API :issue:`18011`.) Note: this change was also inadvertently applied in Python 3.3.3. -* The :attr:`~cgi.FieldStorage.file` attribute is now automatically closed when - the creating :class:`cgi.FieldStorage` instance is garbage collected. If you - were pulling the file object out separately from the :class:`cgi.FieldStorage` +* The :attr:`!file` attribute is now automatically closed when + the creating :class:`!cgi.FieldStorage` instance is garbage collected. If you + were pulling the file object out separately from the :class:`!cgi.FieldStorage` instance and not keeping the instance alive, then you should either store the - entire :class:`cgi.FieldStorage` instance or read the contents of the file - before the :class:`cgi.FieldStorage` instance is garbage collected. + entire :class:`!cgi.FieldStorage` instance or read the contents of the file + before the :class:`!cgi.FieldStorage` instance is garbage collected. * Calling ``read`` or ``write`` on a closed SSL socket now raises an informative :exc:`ValueError` rather than the previous more mysterious @@ -2405,15 +2405,15 @@ Changes in the Python API storage). (:issue:`17094`.) * Parameter names in ``__annotations__`` dicts are now mangled properly, - similarly to ``__kwdefaults__``. (Contributed by Yury Selivanov in - :issue:`20625`.) + similarly to :attr:`~function.__kwdefaults__`. + (Contributed by Yury Selivanov in :issue:`20625`.) * :attr:`hashlib.hash.name` now always returns the identifier in lower case. Previously some builtin hashes had uppercase names, but now that it is a formal public interface the naming has been made consistent (:issue:`18532`). * Because :mod:`unittest.TestSuite` now drops references to tests after they - are run, test harnesses that re-use a :class:`~unittest.TestSuite` to re-run + are run, test harnesses that reuse a :class:`~unittest.TestSuite` to re-run a set of tests may fail. Test suites should not be re-used in this fashion since it means state is retained between test runs, breaking the test isolation that :mod:`unittest` is designed to provide. However, if the lack @@ -2434,7 +2434,7 @@ Changes in the Python API matched the input type, so if your code was depending on the return value being, say, a ``bytearray``, you will need to change your code. -* :mod:`audioop` functions now raise an error immediately if passed string +* :mod:`!audioop` functions now raise an error immediately if passed string input, instead of failing randomly later on (:issue:`16685`). * The new *convert_charrefs* argument to :class:`~html.parser.HTMLParser` diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index 3c0d8d66..3f3f6341 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -423,8 +423,8 @@ are declared in the annotations:: return 'Hello ' + name While these annotations are available at runtime through the usual -:attr:`__annotations__` attribute, *no automatic type checking happens at -runtime*. Instead, it is assumed that a separate off-line type checker +:attr:`~object.__annotations__` attribute, *no automatic type checking happens +at runtime*. Instead, it is assumed that a separate off-line type checker (e.g. `mypy `_) will be used for on-demand source code analysis. @@ -878,7 +878,7 @@ size of decompressed data. (Contributed by Nikolaus Rath in :issue:`15955`.) cgi --- -The :class:`~cgi.FieldStorage` class now supports the :term:`context manager` +The :class:`!FieldStorage` class now supports the :term:`context manager` protocol. (Contributed by Berker Peksag in :issue:`20289`.) @@ -921,7 +921,7 @@ and improves their substitutability for lists. Docstrings produced by :func:`~collections.namedtuple` can now be updated:: Point = namedtuple('Point', ['x', 'y']) - Point.__doc__ += ': Cartesian coodinate' + Point.__doc__ += ': Cartesian coordinate' Point.x.__doc__ = 'abscissa' Point.y.__doc__ = 'ordinate' @@ -951,7 +951,7 @@ New :class:`~collections.abc.Awaitable`, :class:`~collections.abc.Coroutine`, (Contributed by Yury Selivanov in :issue:`24184`.) For earlier Python versions, a backport of the new ABCs is available in an -external `PyPI package `_. +external :pypi:`PyPI package `. compileall @@ -1252,7 +1252,7 @@ Oberkirch in :issue:`21800`.) imghdr ------ -The :func:`~imghdr.what` function now recognizes the +The :func:`!what` function now recognizes the `OpenEXR `_ format (contributed by Martin Vignali and Claudiu Popa in :issue:`20295`), and the `WebP `_ format @@ -1663,34 +1663,34 @@ during debugging, instead of integer "magic numbers". smtpd ----- -Both the :class:`~smtpd.SMTPServer` and :class:`~smtpd.SMTPChannel` classes now +Both the :class:`!SMTPServer` and :class:`!SMTPChannel` classes now accept a *decode_data* keyword argument to determine if the ``DATA`` portion of the SMTP transaction is decoded using the ``"utf-8"`` codec or is instead provided to the -:meth:`SMTPServer.process_message() ` +:meth:`!SMTPServer.process_message` method as a byte string. The default is ``True`` for backward compatibility reasons, but will change to ``False`` in Python 3.6. If *decode_data* is set to ``False``, the ``process_message`` method must be prepared to accept keyword arguments. (Contributed by Maciej Szulik in :issue:`19662`.) -The :class:`~smtpd.SMTPServer` class now advertises the ``8BITMIME`` extension +The :class:`!SMTPServer` class now advertises the ``8BITMIME`` extension (:rfc:`6152`) if *decode_data* has been set ``True``. If the client specifies ``BODY=8BITMIME`` on the ``MAIL`` command, it is passed to -:meth:`SMTPServer.process_message() ` +:meth:`!SMTPServer.process_message` via the *mail_options* keyword. (Contributed by Milan Oberkirch and R. David Murray in :issue:`21795`.) -The :class:`~smtpd.SMTPServer` class now also supports the ``SMTPUTF8`` +The :class:`!SMTPServer` class now also supports the ``SMTPUTF8`` extension (:rfc:`6531`: Internationalized Email). If the client specified ``SMTPUTF8 BODY=8BITMIME`` on the ``MAIL`` command, they are passed to -:meth:`SMTPServer.process_message() ` +:meth:`!SMTPServer.process_message` via the *mail_options* keyword. It is the responsibility of the ``process_message`` method to correctly handle the ``SMTPUTF8`` data. (Contributed by Milan Oberkirch in :issue:`21725`.) It is now possible to provide, directly or via name resolution, IPv6 -addresses in the :class:`~smtpd.SMTPServer` constructor, and have it +addresses in the :class:`!SMTPServer` constructor, and have it successfully connect. (Contributed by Milan Oberkirch in :issue:`14758`.) @@ -1714,7 +1714,7 @@ support :rfc:`6531` (SMTPUTF8). sndhdr ------ -The :func:`~sndhdr.what` and :func:`~sndhdr.whathdr` functions now return +The :func:`!what` and :func:`!whathdr` functions now return a :func:`~collections.namedtuple`. (Contributed by Claudiu Popa in :issue:`18615`.) @@ -1935,8 +1935,8 @@ specifying the namespace in which the code will be running. tkinter ------- -The :mod:`tkinter._fix` module used for setting up the Tcl/Tk environment -on Windows has been replaced by a private function in the :mod:`_tkinter` +The :mod:`!tkinter._fix` module used for setting up the Tcl/Tk environment +on Windows has been replaced by a private function in the :mod:`!_tkinter` module which makes no permanent changes to environment variables. (Contributed by Zachary Ware in :issue:`20035`.) @@ -1947,7 +1947,8 @@ traceback --------- New :func:`~traceback.walk_stack` and :func:`~traceback.walk_tb` -functions to conveniently traverse frame and traceback objects. +functions to conveniently traverse frame and +:ref:`traceback objects `. (Contributed by Robert Collins in :issue:`17911`.) New lightweight classes: :class:`~traceback.TracebackException`, @@ -2095,7 +2096,7 @@ accepts ``"x"`` to request exclusive creation. Other module-level changes ========================== -Many functions in the :mod:`mmap`, :mod:`ossaudiodev`, :mod:`socket`, +Many functions in the :mod:`mmap`, :mod:`!ossaudiodev`, :mod:`socket`, :mod:`ssl`, and :mod:`codecs` modules now accept writable :term:`bytes-like objects `. (Contributed by Serhiy Storchaka in :issue:`23001`.) @@ -2295,9 +2296,9 @@ slated for removal in Python 3.6. The :func:`asyncio.async` function is deprecated in favor of :func:`~asyncio.ensure_future`. -The :mod:`smtpd` module has in the past always decoded the DATA portion of +The :mod:`!smtpd` module has in the past always decoded the DATA portion of email messages using the ``utf-8`` codec. This can now be controlled by the -new *decode_data* keyword to :class:`~smtpd.SMTPServer`. The default value is +new *decode_data* keyword to :class:`!SMTPServer`. The default value is ``True``, but this default is deprecated. Specify the *decode_data* keyword with an appropriate value to avoid the deprecation warning. @@ -2404,7 +2405,7 @@ Changes in the Python API error-prone and has been removed in Python 3.5. See :issue:`13936` for full details. -* The :meth:`ssl.SSLSocket.send()` method now raises either +* The :meth:`ssl.SSLSocket.send` method now raises either :exc:`ssl.SSLWantReadError` or :exc:`ssl.SSLWantWriteError` on a non-blocking socket if the operation would block. Previously, it would return ``0``. (Contributed by Nikolaus Rath in :issue:`20951`.) @@ -2417,7 +2418,7 @@ Changes in the Python API (Contributed by Victor Stinner in :issue:`21205`.) * The deprecated "strict" mode and argument of :class:`~html.parser.HTMLParser`, - :meth:`HTMLParser.error`, and the :exc:`HTMLParserError` exception have been + :meth:`!HTMLParser.error`, and the :exc:`!HTMLParserError` exception have been removed. (Contributed by Ezio Melotti in :issue:`15114`.) The *convert_charrefs* argument of :class:`~html.parser.HTMLParser` is now ``True`` by default. (Contributed by Berker Peksag in :issue:`21047`.) @@ -2525,9 +2526,9 @@ Changes in the C API to format the :func:`repr` of the object. (Contributed by Serhiy Storchaka in :issue:`22453`.) -* Because the lack of the :attr:`__module__` attribute breaks pickling and +* Because the lack of the :attr:`~type.__module__` attribute breaks pickling and introspection, a deprecation warning is now raised for builtin types without - the :attr:`__module__` attribute. This would be an AttributeError in + the :attr:`~type.__module__` attribute. This will be an :exc:`AttributeError` in the future. (Contributed by Serhiy Storchaka in :issue:`20204`.) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index be20ee1a..7ad7caf2 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -261,7 +261,7 @@ allowed. The :ref:`string formatting ` language also now has support for the ``'_'`` option to signal the use of an underscore for a thousands -separator for floating point presentation types and for integer +separator for floating-point presentation types and for integer presentation type ``'d'``. For integer presentation types ``'b'``, ``'o'``, ``'x'``, and ``'X'``, underscores will be inserted every 4 digits:: @@ -511,10 +511,10 @@ correct. Prior to Python 3.6, data loss could result when using bytes paths on Windows. With this change, using bytes to represent paths is now supported on Windows, provided those bytes are encoded with the encoding returned by -:func:`sys.getfilesystemencoding()`, which now defaults to ``'utf-8'``. +:func:`sys.getfilesystemencoding`, which now defaults to ``'utf-8'``. Applications that do not use str to represent paths should use -:func:`os.fsencode()` and :func:`os.fsdecode()` to ensure their bytes are +:func:`os.fsencode` and :func:`os.fsdecode` to ensure their bytes are correctly encoded. To revert to the previous behaviour, set :envvar:`PYTHONLEGACYWINDOWSFSENCODING` or call :func:`sys._enablelegacywindowsfsencoding`. @@ -549,7 +549,7 @@ PEP 520: Preserving Class Attribute Definition Order Attributes in a class definition body have a natural ordering: the same order in which the names appear in the source. This order is now -preserved in the new class's :attr:`~object.__dict__` attribute. +preserved in the new class's :attr:`~type.__dict__` attribute. Also, the effective default class *execution* namespace (returned from :ref:`type.__prepare__() `) is now an insertion-order-preserving @@ -780,7 +780,7 @@ for managing secrets, such as account authentication, tokens, and similar. Note that the pseudo-random generators in the :mod:`random` module should *NOT* be used for security purposes. Use :mod:`secrets` - on Python 3.6+ and :func:`os.urandom()` on Python 3.5 and earlier. + on Python 3.6+ and :func:`os.urandom` on Python 3.5 and earlier. .. seealso:: @@ -934,7 +934,7 @@ asynchronous generators. The :func:`~collections.namedtuple` function now accepts an optional keyword argument *module*, which, when specified, is used for -the ``__module__`` attribute of the returned named tuple class. +the :attr:`~type.__module__` attribute of the returned named tuple class. (Contributed by Raymond Hettinger in :issue:`17941`.) The *verbose* and *rename* arguments for @@ -1316,7 +1316,7 @@ Storchaka in :issue:`24164`.) pickletools ----------- -:func:`pickletools.dis()` now outputs the implicit memo index for the +:func:`pickletools.dis` now outputs the implicit memo index for the ``MEMOIZE`` opcode. (Contributed by Serhiy Storchaka in :issue:`25382`.) @@ -1472,6 +1472,10 @@ Server and client-side specific TLS protocols for :class:`~ssl.SSLContext` were added. (Contributed by Christian Heimes in :issue:`28085`.) +Added :attr:`ssl.SSLContext.post_handshake_auth` to enable and +:meth:`ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3 +post-handshake authentication. +(Contributed by Christian Heimes in :gh:`78851`.) statistics ---------- @@ -1520,7 +1524,7 @@ rather than the version that is being emulated for the process telnetlib --------- -:class:`~telnetlib.Telnet` is now a context manager (contributed by +:class:`!telnetlib.Telnet` is now a context manager (contributed by Stéphane Wirtel in :issue:`25485`). @@ -1961,14 +1965,14 @@ Deprecated Python modules, functions and methods asynchat ~~~~~~~~ -The :mod:`asynchat` has been deprecated in favor of :mod:`asyncio`. +The :mod:`!asynchat` has been deprecated in favor of :mod:`asyncio`. (Contributed by Mariatta in :issue:`25002`.) asyncore ~~~~~~~~ -The :mod:`asyncore` has been deprecated in favor of :mod:`asyncio`. +The :mod:`!asyncore` has been deprecated in favor of :mod:`asyncio`. (Contributed by Mariatta in :issue:`25002`.) @@ -2049,7 +2053,7 @@ of OpenSSL. Other features are deprecated in favor of a different API. tkinter ~~~~~~~ -The :mod:`tkinter.tix` module is now deprecated. :mod:`tkinter` users +The :mod:`!tkinter.tix` module is now deprecated. :mod:`tkinter` users should use :mod:`tkinter.ttk` instead. .. _whatsnew36-venv: @@ -2063,6 +2067,15 @@ connected to and thus what Python interpreter will be used by the virtual environment. (Contributed by Brett Cannon in :issue:`25154`.) +xml +--- + +* As mitigation against DTD and external entity retrieval, the + :mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process + external entities by default. + (Contributed by Christian Heimes in :gh:`61441`.) + + Deprecated functions and types of the C API ------------------------------------------- @@ -2160,14 +2173,15 @@ Changes in the Python API * :c:func:`PyErr_SetImportError` now sets :exc:`TypeError` when its **msg** argument is not set. Previously only ``NULL`` was returned. -* The format of the ``co_lnotab`` attribute of code objects changed to support +* The format of the :attr:`~codeobject.co_lnotab` attribute of code objects + changed to support a negative line number delta. By default, Python does not emit bytecode with - a negative line number delta. Functions using ``frame.f_lineno``, + a negative line number delta. Functions using :attr:`frame.f_lineno`, ``PyFrame_GetLineNumber()`` or ``PyCode_Addr2Line()`` are not affected. - Functions directly decoding ``co_lnotab`` should be updated to use a signed + Functions directly decoding :attr:`!co_lnotab` should be updated to use a signed 8-bit integer type for the line number delta, but this is only required to support applications using a negative line number delta. See - ``Objects/lnotab_notes.txt`` for the ``co_lnotab`` format and how to decode + ``Objects/lnotab_notes.txt`` for the :attr:`!co_lnotab` format and how to decode it, and see the :pep:`511` for the rationale. * The functions in the :mod:`compileall` module now return booleans instead @@ -2185,10 +2199,10 @@ Changes in the Python API * The following modules have had missing APIs added to their :attr:`__all__` attributes to match the documented APIs: - :mod:`calendar`, :mod:`cgi`, :mod:`csv`, + :mod:`calendar`, :mod:`!cgi`, :mod:`csv`, :mod:`~xml.etree.ElementTree`, :mod:`enum`, :mod:`fileinput`, :mod:`ftplib`, :mod:`logging`, :mod:`mailbox`, - :mod:`mimetypes`, :mod:`optparse`, :mod:`plistlib`, :mod:`smtpd`, + :mod:`mimetypes`, :mod:`optparse`, :mod:`plistlib`, :mod:`!smtpd`, :mod:`subprocess`, :mod:`tarfile`, :mod:`threading` and :mod:`wave`. This means they will export new symbols when ``import *`` is used. @@ -2211,18 +2225,18 @@ Changes in the Python API the exception will stop a single-threaded server. (Contributed by Martin Panter in :issue:`23430`.) -* :func:`spwd.getspnam` now raises a :exc:`PermissionError` instead of +* :func:`!spwd.getspnam` now raises a :exc:`PermissionError` instead of :exc:`KeyError` if the user doesn't have privileges. * The :meth:`socket.socket.close` method now raises an exception if an error (e.g. ``EBADF``) was reported by the underlying system call. (Contributed by Martin Panter in :issue:`26685`.) -* The *decode_data* argument for the :class:`smtpd.SMTPChannel` and - :class:`smtpd.SMTPServer` constructors is now ``False`` by default. +* The *decode_data* argument for the :class:`!smtpd.SMTPChannel` and + :class:`!smtpd.SMTPServer` constructors is now ``False`` by default. This means that the argument passed to - :meth:`~smtpd.SMTPServer.process_message` is now a bytes object by - default, and ``process_message()`` will be passed keyword arguments. + :meth:`!process_message` is now a bytes object by + default, and :meth:`!process_message` will be passed keyword arguments. Code that has already been updated in accordance with the deprecation warning generated by 3.5 will not be affected. @@ -2274,7 +2288,7 @@ Changes in the Python API :class:`~collections.OrderedDict`. (Contributed by Steve Holden in :issue:`27842`.) -* The :const:`crypt.METHOD_CRYPT` will no longer be added to ``crypt.methods`` +* The :const:`!crypt.METHOD_CRYPT` will no longer be added to ``crypt.methods`` if unsupported by the platform. (Contributed by Victor Stinner in :issue:`25287`.) @@ -2322,10 +2336,10 @@ Changes in the Python API * With the introduction of :exc:`ModuleNotFoundError`, import system consumers may start expecting import system replacements to raise that more specific exception when appropriate, rather than the less-specific :exc:`ImportError`. - To provide future compatibility with such consumers, implementors of + To provide future compatibility with such consumers, implementers of alternative import systems that completely replace :func:`__import__` will need to update their implementations to raise the new subclass when a module - can't be found at all. Implementors of compliant plugins to the default + can't be found at all. Implementers of compliant plugins to the default import system shouldn't need to make any changes, as the default import system will raise the new subclass when appropriate. @@ -2352,7 +2366,7 @@ There have been several major changes to the :term:`bytecode` in Python 3.6. (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in :issue:`26647` and :issue:`28050`.) -* The new :opcode:`FORMAT_VALUE` and :opcode:`BUILD_STRING` opcodes as part +* The new :opcode:`!FORMAT_VALUE` and :opcode:`BUILD_STRING` opcodes as part of the :ref:`formatted string literal ` implementation. (Contributed by Eric Smith in :issue:`25483` and Serhiy Storchaka in :issue:`27078`.) @@ -2363,16 +2377,16 @@ There have been several major changes to the :term:`bytecode` in Python 3.6. * The function call opcodes have been heavily reworked for better performance and simpler implementation. - The :opcode:`MAKE_FUNCTION`, :opcode:`CALL_FUNCTION`, - :opcode:`CALL_FUNCTION_KW` and :opcode:`BUILD_MAP_UNPACK_WITH_CALL` opcodes + The :opcode:`MAKE_FUNCTION`, :opcode:`!CALL_FUNCTION`, + :opcode:`!CALL_FUNCTION_KW` and :opcode:`!BUILD_MAP_UNPACK_WITH_CALL` opcodes have been modified, the new :opcode:`CALL_FUNCTION_EX` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and + :opcode:`!BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and ``CALL_FUNCTION_VAR``, ``CALL_FUNCTION_VAR_KW`` and ``MAKE_CLOSURE`` opcodes have been removed. (Contributed by Demur Rumed in :issue:`27095`, and Serhiy Storchaka in :issue:`27213`, :issue:`28257`.) -* The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`STORE_ANNOTATION` opcodes +* The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`!STORE_ANNOTATION` opcodes have been added to support the new :term:`variable annotation` syntax. (Contributed by Ivan Levkivskyi in :issue:`27985`.) @@ -2429,9 +2443,13 @@ The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some cases. (Contributed by Victor Stinner in :issue:`31900`.) + Notable changes in Python 3.6.7 =============================== +:mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process +external entities by default. See also :gh:`61441`. + In 3.6.7 the :mod:`tokenize` module now implicitly emits a ``NEWLINE`` token when provided with input that does not have a trailing new line. This behavior now matches what the C tokenizer does internally. @@ -2455,7 +2473,23 @@ query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with ``&`` as the default. This change also affects -:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +:func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) + +Notable changes in Python 3.6.14 +================================ + +A security fix alters the :class:`ftplib.FTP` behavior to not trust the +IPv4 address sent from the remote server when setting up a passive data +channel. We reuse the ftp server IP address instead. For unusual code +requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` +attribute on your FTP instance to ``True``. (See :gh:`87451`) + +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates RFC 3986, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser :func:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :gh:`88048`) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index e82bb756..f420fa5c 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -339,7 +339,7 @@ PEP 564: New Time Functions With Nanosecond Resolution ------------------------------------------------------ The resolution of clocks in modern systems can exceed the limited precision -of a floating point number returned by the :func:`time.time` function +of a floating-point number returned by the :func:`time.time` function and its variants. To avoid loss of precision, :pep:`564` adds six new "nanosecond" variants of the existing timer functions to the :mod:`time` module: @@ -353,7 +353,7 @@ module: The new functions return the number of nanoseconds as an integer value. -`Measurements `_ +:pep:`Measurements <0564#annex-clocks-resolution-in-python>` show that on Linux and Windows the resolution of :func:`time.time_ns` is approximately 3 times better than that of :func:`time.time`. @@ -525,8 +525,8 @@ Other Language Changes * In order to better support dynamic creation of stack traces, :class:`types.TracebackType` can now be instantiated from Python code, and - the ``tb_next`` attribute on :ref:`tracebacks ` is now - writable. + the :attr:`~traceback.tb_next` attribute on + :ref:`tracebacks ` is now writable. (Contributed by Nathaniel J. Smith in :issue:`30579`.) * When using the :option:`-m` switch, ``sys.path[0]`` is now eagerly expanded @@ -603,7 +603,7 @@ The new :mod:`importlib.resources` module provides several new APIs and one new ABC for access to, opening, and reading *resources* inside packages. Resources are roughly similar to files inside packages, but they needn't be actual files on the physical file system. Module loaders can provide a -:meth:`get_resource_reader()` function which returns +:meth:`get_resource_reader` function which returns a :class:`importlib.abc.ResourceReader` instance to support this new API. Built-in file path loaders and zip file loaders both support this. @@ -669,8 +669,8 @@ include: * The new :func:`asyncio.current_task` function returns the currently running :class:`~asyncio.Task` instance, and the new :func:`asyncio.all_tasks` function returns a set of all existing ``Task`` instances in a given loop. - The :meth:`Task.current_task() ` and - :meth:`Task.all_tasks() ` methods have been deprecated. + The :meth:`!Task.current_task` and + :meth:`!Task.all_tasks` methods have been deprecated. (Contributed by Andrew Svetlov in :issue:`32250`.) * The new *provisional* :class:`~asyncio.BufferedProtocol` class allows @@ -848,10 +848,10 @@ alternative to script path. (Contributed by Sanyam Khurana in :issue:`21862`.) crypt ----- -The :mod:`crypt` module now supports the Blowfish hashing method. +The :mod:`!crypt` module now supports the Blowfish hashing method. (Contributed by Serhiy Storchaka in :issue:`31664`.) -The :func:`~crypt.mksalt` function now allows specifying the number of rounds +The :func:`!mksalt` function now allows specifying the number of rounds for hashing. (Contributed by Serhiy Storchaka in :issue:`31702`.) @@ -1133,7 +1133,7 @@ The MIME type of .bmp has been changed from ``'image/x-ms-bmp'`` to msilib ------ -The new :meth:`Database.Close() ` method can be used +The new :meth:`!Database.Close` method can be used to close the :abbr:`MSI` database. (Contributed by Berker Peksag in :issue:`20486`.) @@ -1380,6 +1380,10 @@ Supported protocols are indicated by several new flags, such as :data:`~ssl.HAS_TLSv1_1`. (Contributed by Christian Heimes in :issue:`32609`.) +Added :attr:`ssl.SSLContext.post_handshake_auth` to enable and +:meth:`ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3 +post-handshake authentication. +(Contributed by Christian Heimes in :gh:`78851`.) string ------ @@ -1547,7 +1551,7 @@ adding ``~`` to the set of characters that are never quoted by default. uu -- -The :func:`uu.encode` function now accepts an optional *backtick* +The :func:`!uu.encode` function now accepts an optional *backtick* keyword argument. When it's true, zeros are represented by ``'`'`` instead of spaces. (Contributed by Xiang Zhang in :issue:`30103`.) @@ -1580,13 +1584,13 @@ The initialization of the default warnings filters has changed as follows: * warnings filters enabled via the command line or the environment now have the following order of precedence: - * the ``BytesWarning`` filter for :option:`-b` (or ``-bb``) - * any filters specified with the :option:`-W` option - * any filters specified with the :envvar:`PYTHONWARNINGS` environment - variable - * any other CPython specific filters (e.g. the ``default`` filter added - for the new ``-X dev`` mode) - * any implicit filters defined directly by the warnings machinery + * the ``BytesWarning`` filter for :option:`-b` (or ``-bb``) + * any filters specified with the :option:`-W` option + * any filters specified with the :envvar:`PYTHONWARNINGS` environment + variable + * any other CPython specific filters (e.g. the ``default`` filter added + for the new ``-X dev`` mode) + * any implicit filters defined directly by the warnings machinery * in :ref:`CPython debug builds `, all warnings are now displayed by default (the implicit filter list is empty) @@ -1599,6 +1603,15 @@ at the interactive prompt. See :ref:`whatsnew37-pep565` for details. (Contributed by Nick Coghlan in :issue:`31975`.) +xml +--- + +As mitigation against DTD and external entity retrieval, the +:mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process +external entities by default. +(Contributed by Christian Heimes in :gh:`61441`.) + + xml.etree --------- @@ -1891,7 +1904,7 @@ Other CPython Implementation Changes * Trace hooks may now opt out of receiving the ``line`` and opt into receiving the ``opcode`` events from the interpreter by setting the corresponding new - ``f_trace_lines`` and ``f_trace_opcodes`` attributes on the + :attr:`~frame.f_trace_lines` and :attr:`~frame.f_trace_opcodes` attributes on the frame being traced. (Contributed by Nick Coghlan in :issue:`31344`.) * Fixed some consistency problems with namespace package module attributes. @@ -1940,8 +1953,8 @@ Deprecated Python modules, functions and methods aifc ---- -:func:`aifc.openfp` has been deprecated and will be removed in Python 3.9. -Use :func:`aifc.open` instead. +:func:`!aifc.openfp` has been deprecated and will be removed in Python 3.9. +Use :func:`!aifc.open` instead. (Contributed by Brian Curtin in :issue:`31985`.) @@ -1956,7 +1969,7 @@ asynchronous context manager must be used in order to acquire and release the synchronization resource. (Contributed by Andrew Svetlov in :issue:`32253`.) -The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` +The :meth:`!asyncio.Task.current_task` and :meth:`!asyncio.Task.all_tasks` methods have been deprecated. (Contributed by Andrew Svetlov in :issue:`32250`.) @@ -2004,15 +2017,15 @@ importlib --------- Methods -:meth:`MetaPathFinder.find_module() ` +:meth:`!MetaPathFinder.find_module` (replaced by :meth:`MetaPathFinder.find_spec() `) and -:meth:`PathEntryFinder.find_loader() ` +:meth:`!PathEntryFinder.find_loader` (replaced by :meth:`PathEntryFinder.find_spec() `) both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`. -(Contributed by Matthias Bussonnier in :issue:`29576`) +(Contributed by Matthias Bussonnier in :issue:`29576`.) The :class:`importlib.abc.ResourceLoader` ABC has been deprecated in favour of :class:`importlib.abc.ResourceReader`. @@ -2035,7 +2048,7 @@ The :mod:`macpath` is now deprecated and will be removed in Python 3.8. threading --------- -:mod:`dummy_threading` and :mod:`_dummy_thread` have been deprecated. It is +:mod:`!dummy_threading` and :mod:`!_dummy_thread` have been deprecated. It is no longer possible to build Python with threading disabled. Use :mod:`threading` instead. (Contributed by Antoine Pitrou in :issue:`31370`.) @@ -2061,8 +2074,8 @@ ssl sunau ----- -:func:`sunau.openfp` has been deprecated and will be removed in Python 3.9. -Use :func:`sunau.open` instead. +:func:`!sunau.openfp` has been deprecated and will be removed in Python 3.9. +Use :func:`!sunau.open` instead. (Contributed by Brian Curtin in :issue:`31985`.) @@ -2144,9 +2157,9 @@ The following features and APIs have been removed from Python 3.7: * Removed support of the *exclude* argument in :meth:`tarfile.TarFile.add`. It was deprecated in Python 2.7 and 3.2. Use the *filter* argument instead. -* The ``splitunc()`` function in the :mod:`ntpath` module was deprecated in - Python 3.1, and has now been removed. Use the :func:`~os.path.splitdrive` - function instead. +* The :func:`!ntpath.splitunc` function was deprecated in + Python 3.1, and has now been removed. Use :func:`~os.path.splitdrive` + instead. * :func:`collections.namedtuple` no longer supports the *verbose* parameter or ``_source`` attribute which showed the generated source code for the @@ -2171,7 +2184,7 @@ The following features and APIs have been removed from Python 3.7: ``socket.socketpair`` on Python 3.5 and newer. * :mod:`asyncio` no longer exports the :mod:`selectors` and - :mod:`_overlapped` modules as ``asyncio.selectors`` and + :mod:`!_overlapped` modules as ``asyncio.selectors`` and ``asyncio._overlapped``. Replace ``from asyncio import selectors`` with ``import selectors``. @@ -2304,9 +2317,9 @@ Changes in the Python API * The :attr:`struct.Struct.format` type is now :class:`str` instead of :class:`bytes`. (Contributed by Victor Stinner in :issue:`21071`.) -* :func:`~cgi.parse_multipart` now accepts the *encoding* and *errors* +* :func:`!cgi.parse_multipart` now accepts the *encoding* and *errors* arguments and returns the same results as - :class:`~FieldStorage`: for non-file fields, the value associated to a key + :class:`!FieldStorage`: for non-file fields, the value associated to a key is a list of strings, not bytes. (Contributed by Pierre Quentel in :issue:`29979`.) @@ -2353,7 +2366,7 @@ Changes in the Python API positions 2--3. To match only blank lines, the pattern should be rewritten as ``r'(?m)^[^\S\n]*$'``. - :func:`re.sub()` now replaces empty matches adjacent to a previous + :func:`re.sub` now replaces empty matches adjacent to a previous non-empty match. For example ``re.sub('x*', '-', 'abxd')`` returns now ``'-a-b--d-'`` instead of ``'-a-b-d-'`` (the first minus between 'b' and 'd' replaces 'x', and the second minus replaces an empty string between @@ -2412,7 +2425,7 @@ Changes in the Python API to :meth:`ArgumentParser.add_subparsers() `. (Contributed by Anthony Sottile in :issue:`26510`.) -* :meth:`ast.literal_eval()` is now stricter. Addition and subtraction of +* :meth:`ast.literal_eval` is now stricter. Addition and subtraction of arbitrary numbers are no longer allowed. (Contributed by Serhiy Storchaka in :issue:`31778`.) @@ -2463,10 +2476,10 @@ avoiding possible problems use new functions :c:func:`PySlice_Unpack` and CPython bytecode changes ------------------------ -There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`CALL_METHOD`. +There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`!CALL_METHOD`. (Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.) -The :opcode:`STORE_ANNOTATION` opcode has been removed. +The :opcode:`!STORE_ANNOTATION` opcode has been removed. (Contributed by Mark Shannon in :issue:`32550`.) @@ -2495,12 +2508,12 @@ either in embedding applications, or in CPython itself. :issue:`22257`, and further updated by Nick, Eric, and Victor Stinner in a number of other issues). Some known details affected: -* :c:func:`PySys_AddWarnOptionUnicode` is not currently usable by embedding +* :c:func:`!PySys_AddWarnOptionUnicode` is not currently usable by embedding applications due to the requirement to create a Unicode object prior to - calling ``Py_Initialize``. Use :c:func:`PySys_AddWarnOption` instead. + calling ``Py_Initialize``. Use :c:func:`!PySys_AddWarnOption` instead. * warnings filters added by an embedding application with - :c:func:`PySys_AddWarnOption` should now more consistently take precedence + :c:func:`!PySys_AddWarnOption` should now more consistently take precedence over the default filters set by the interpreter Due to changes in the way the default warnings filters are configured, @@ -2567,7 +2580,37 @@ query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with ``&`` as the default. This change also affects -:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +:func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) + +Notable changes in Python 3.7.11 +================================ + +A security fix alters the :class:`ftplib.FTP` behavior to not trust the +IPv4 address sent from the remote server when setting up a passive data +channel. We reuse the ftp server IP address instead. For unusual code +requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` +attribute on your FTP instance to ``True``. (See :gh:`87451`) + + +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates RFC 3986, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser :func:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :gh:`88048`) + +Notable security feature in 3.7.14 +================================== + +Converting between :class:`int` and :class:`str` in bases other than 2 +(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) +now raises a :exc:`ValueError` if the number of digits in string form is +above a limit to avoid potential denial of service attacks due to the +algorithmic complexity. This is a mitigation for :cve:`2020-10735`. +This limit can be configured or disabled by environment variable, command +line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion +length limitation ` documentation. The default limit +is 4300 digits in string form. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 68fd4d77..a009ad4c 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -123,7 +123,7 @@ There is a new function parameter syntax ``/`` to indicate that some function parameters must be specified positionally and cannot be used as keyword arguments. This is the same notation shown by ``help()`` for C functions annotated with Larry Hastings' -:ref:`Argument Clinic ` tool. +`Argument Clinic `__ tool. In the following example, parameters *a* and *b* are positional-only, while *c* or *d* can be positional or keyword, and *e* or *f* are @@ -754,8 +754,8 @@ datetime -------- Added new alternate constructors :meth:`datetime.date.fromisocalendar` and -:meth:`datetime.datetime.fromisocalendar`, which construct :class:`date` and -:class:`datetime` objects respectively from ISO year, week number, and weekday; +:meth:`datetime.datetime.fromisocalendar`, which construct :class:`~datetime.date` and +:class:`~datetime.datetime` objects respectively from ISO year, week number, and weekday; these are the inverse of each class's ``isocalendar`` method. (Contributed by Paul Ganssle in :issue:`36004`.) @@ -936,7 +936,7 @@ Add option ``--json-lines`` to parse every input line as a separate JSON object. logging ------- -Added a *force* keyword argument to :func:`logging.basicConfig()` +Added a *force* keyword argument to :func:`logging.basicConfig`. When set to true, any existing handlers attached to the root logger are removed and closed before carrying out the configuration specified by the other arguments. @@ -1077,16 +1077,16 @@ pathlib ------- :mod:`pathlib.Path` methods that return a boolean result like -:meth:`~pathlib.Path.exists()`, :meth:`~pathlib.Path.is_dir()`, -:meth:`~pathlib.Path.is_file()`, :meth:`~pathlib.Path.is_mount()`, -:meth:`~pathlib.Path.is_symlink()`, :meth:`~pathlib.Path.is_block_device()`, -:meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, -:meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising +:meth:`~pathlib.Path.exists`, :meth:`~pathlib.Path.is_dir`, +:meth:`~pathlib.Path.is_file`, :meth:`~pathlib.Path.is_mount`, +:meth:`~pathlib.Path.is_symlink`, :meth:`~pathlib.Path.is_block_device`, +:meth:`~pathlib.Path.is_char_device`, :meth:`~pathlib.Path.is_fifo`, +:meth:`~pathlib.Path.is_socket` now return ``False`` instead of raising :exc:`ValueError` or its subclass :exc:`UnicodeEncodeError` for paths that contain characters unrepresentable at the OS level. (Contributed by Serhiy Storchaka in :issue:`33721`.) -Added :meth:`pathlib.Path.link_to()` which creates a hard link pointing +Added :meth:`!pathlib.Path.link_to` which creates a hard link pointing to a path. (Contributed by Joannah Nanjekye in :issue:`26978`) Note that ``link_to`` was deprecated in 3.10 and removed in 3.12 in @@ -1170,13 +1170,13 @@ recursively removing their contents first. socket ------ -Added :meth:`~socket.create_server()` and :meth:`~socket.has_dualstack_ipv6()` +Added :meth:`~socket.create_server` and :meth:`~socket.has_dualstack_ipv6` convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodolà in :issue:`17561`.) -The :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and -:func:`socket.if_indextoname()` functions have been implemented on Windows. +The :func:`socket.if_nameindex`, :func:`socket.if_nametoindex`, and +:func:`socket.if_indextoname` functions have been implemented on Windows. (Contributed by Zackery Spytz in :issue:`37007`.) @@ -1192,11 +1192,11 @@ post-handshake authentication. statistics ---------- -Added :func:`statistics.fmean` as a faster, floating point variant of -:func:`statistics.mean()`. (Contributed by Raymond Hettinger and +Added :func:`statistics.fmean` as a faster, floating-point variant of +:func:`statistics.mean`. (Contributed by Raymond Hettinger and Steven D'Aprano in :issue:`35904`.) -Added :func:`statistics.geometric_mean()` +Added :func:`statistics.geometric_mean` (Contributed by Raymond Hettinger in :issue:`27181`.) Added :func:`statistics.multimode` that returns a list of the most @@ -1367,10 +1367,10 @@ Added :class:`~unittest.mock.AsyncMock` to support an asynchronous version of have been added as well. (Contributed by Lisa Roach in :issue:`26467`). -Added :func:`~unittest.addModuleCleanup()` and -:meth:`~unittest.TestCase.addClassCleanup()` to unittest to support -cleanups for :func:`~unittest.setUpModule()` and -:meth:`~unittest.TestCase.setUpClass()`. +Added :func:`~unittest.addModuleCleanup` and +:meth:`~unittest.TestCase.addClassCleanup` to unittest to support +cleanups for :func:`~unittest.setUpModule` and +:meth:`~unittest.TestCase.setUpClass`. (Contributed by Lisa Roach in :issue:`24412`.) Several mock assert functions now also print a list of actual calls upon @@ -1432,7 +1432,7 @@ and ``{namespace}*`` which returns all tags in the given namespace. (Contributed by Stefan Behnel in :issue:`28238`.) The :mod:`xml.etree.ElementTree` module provides a new function -:func:`–xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. +:func:`–xml.etree.ElementTree.canonicalize` that implements C14N 2.0. (Contributed by Stefan Behnel in :issue:`13611`.) The target object of :class:`xml.etree.ElementTree.XMLParser` can @@ -1623,8 +1623,8 @@ Build and C API Changes allocation or deallocation may need to be adjusted. (Contributed by Eddie Elizondo in :issue:`35810`.) -* The new function :c:func:`PyCode_NewWithPosOnlyArgs` allows to create - code objects like :c:func:`PyCode_New`, but with an extra *posonlyargcount* +* The new function :c:func:`!PyCode_NewWithPosOnlyArgs` allows to create + code objects like :c:func:`!PyCode_New`, but with an extra *posonlyargcount* parameter for indicating the number of positional-only arguments. (Contributed by Pablo Galindo in :issue:`37221`.) @@ -1653,7 +1653,7 @@ Deprecated deprecated and will be prohibited in Python 3.9. (Contributed by Elvis Pranskevichus in :issue:`34075`.) -* The :meth:`__getitem__` methods of :class:`xml.dom.pulldom.DOMEventStream`, +* The :meth:`~object.__getitem__` methods of :class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper` and :class:`fileinput.FileInput` have been deprecated. @@ -1712,7 +1712,7 @@ Deprecated the ``l*gettext()`` functions. (Contributed by Serhiy Storchaka in :issue:`33710`.) -* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` +* The :meth:`~threading.Thread.isAlive` method of :class:`threading.Thread` has been deprecated. (Contributed by Donghee Na in :issue:`35283`.) @@ -1755,7 +1755,7 @@ The following features and APIs have been removed from Python 3.8: * Starting with Python 3.3, importing ABCs from :mod:`collections` was deprecated, and importing should be done from :mod:`collections.abc`. Being able to import from collections was marked for removal in 3.8, but has been - delayed to 3.9. (See :issue:`36952`.) + delayed to 3.9. (See :gh:`81134`.) * The :mod:`macpath` module, deprecated in Python 3.7, has been removed. (Contributed by Victor Stinner in :issue:`35471`.) @@ -1774,7 +1774,7 @@ The following features and APIs have been removed from Python 3.8: to help eliminate confusion as to what Python interpreter the ``pyvenv`` script is tied to. (Contributed by Brett Cannon in :issue:`25427`.) -* ``parse_qs``, ``parse_qsl``, and ``escape`` are removed from the :mod:`cgi` +* ``parse_qs``, ``parse_qsl``, and ``escape`` are removed from the :mod:`!cgi` module. They are deprecated in Python 3.2 or older. They should be imported from the ``urllib.parse`` and ``html`` modules instead. @@ -2152,11 +2152,11 @@ CPython bytecode changes cleaning-up code for :keyword:`break`, :keyword:`continue` and :keyword:`return`. - Removed opcodes :opcode:`BREAK_LOOP`, :opcode:`CONTINUE_LOOP`, - :opcode:`SETUP_LOOP` and :opcode:`SETUP_EXCEPT`. Added new opcodes - :opcode:`ROT_FOUR`, :opcode:`BEGIN_FINALLY`, :opcode:`CALL_FINALLY` and - :opcode:`POP_FINALLY`. Changed the behavior of :opcode:`END_FINALLY` - and :opcode:`WITH_CLEANUP_START`. + Removed opcodes :opcode:`!BREAK_LOOP`, :opcode:`!CONTINUE_LOOP`, + :opcode:`!SETUP_LOOP` and :opcode:`!SETUP_EXCEPT`. Added new opcodes + :opcode:`!ROT_FOUR`, :opcode:`!BEGIN_FINALLY`, :opcode:`!CALL_FINALLY` and + :opcode:`!POP_FINALLY`. Changed the behavior of :opcode:`!END_FINALLY` + and :opcode:`!WITH_CLEANUP_START`. (Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in :issue:`17611`.) @@ -2243,6 +2243,21 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) +Notable changes in Python 3.8.2 +=============================== + +Fixed a regression with the ``ignore`` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. +(Contributed by Manuel Barkhau and Giampaolo Rodola in :gh:`83571`.) + +Notable changes in Python 3.8.3 +=============================== + +The constant values of future flags in the :mod:`__future__` module +are updated in order to prevent collision with compiler flags. Previously +``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. +(Contributed by Batuhan Taskaya in :gh:`83743`) + Notable changes in Python 3.8.8 =============================== @@ -2251,14 +2266,60 @@ query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with ``&`` as the default. This change also affects -:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +:func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) +Notable changes in Python 3.8.9 +=============================== + +A security fix alters the :class:`ftplib.FTP` behavior to not trust the +IPv4 address sent from the remote server when setting up a passive data +channel. We reuse the ftp server IP address instead. For unusual code +requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` +attribute on your FTP instance to ``True``. (See :gh:`87451`) + +Notable changes in Python 3.8.10 +================================ + +macOS 11.0 (Big Sur) and Apple Silicon Mac support +-------------------------------------------------- + +As of 3.8.10, Python now supports building and running on macOS 11 +(Big Sur) and on Apple Silicon Macs (based on the ``ARM64`` architecture). +A new universal build variant, ``universal2``, is now available to natively +support both ``ARM64`` and ``Intel 64`` in one set of executables. +Note that support for "weaklinking", building binaries targeted for newer +versions of macOS that will also run correctly on older versions by +testing at runtime for missing features, is not included in this backport +from Python 3.9; to support a range of macOS versions, continue to target +for and build on the oldest version in the range. + +(Originally contributed by Ronald Oussoren and Lawrence D'Anna in :gh:`85272`, +with fixes by FX Coudert and Eli Rykoff, and backported to 3.8 by Maxime Bélanger +and Ned Deily) + +Notable changes in Python 3.8.10 +================================ + +urllib.parse +------------ + +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates :rfc:`3986`, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser in :mod:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :issue:`43882`) + + Notable changes in Python 3.8.12 ================================ +Changes in the Python API +------------------------- + Starting with Python 3.8.12 the :mod:`ipaddress` module no longer accepts any leading zeros in IPv4 address strings. Leading zeros are ambiguous and interpreted as octal notation by some libraries. For example the legacy @@ -2268,3 +2329,32 @@ any leading zeros. (Originally contributed by Christian Heimes in :issue:`36384`, and backported to 3.8 by Achraf Merzouki.) + +Notable security feature in 3.8.14 +================================== + +Converting between :class:`int` and :class:`str` in bases other than 2 +(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) +now raises a :exc:`ValueError` if the number of digits in string form is +above a limit to avoid potential denial of service attacks due to the +algorithmic complexity. This is a mitigation for :cve:`2020-10735`. +This limit can be configured or disabled by environment variable, command +line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion +length limitation ` documentation. The default limit +is 4300 digits in string form. + +Notable changes in 3.8.17 +========================= + +tarfile +------- + +* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, + have a new a *filter* argument that allows limiting tar features than may be + surprising or dangerous, such as creating files outside the destination + directory. + See :ref:`tarfile-extraction-filter` for details. + In Python 3.12, use without the *filter* argument will show a + :exc:`DeprecationWarning`. + In Python 3.14, the default will switch to ``'data'``. + (Contributed by Petr Viktorin in :pep:`706`.) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 6e6961e4..ab1fb8c5 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -81,13 +81,13 @@ Interpreter improvements: * a number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using :pep:`590` vectorcall; * garbage collection does not block on resurrected objects; -* a number of Python modules (:mod:`_abc`, :mod:`audioop`, :mod:`_bz2`, - :mod:`_codecs`, :mod:`_contextvars`, :mod:`_crypt`, :mod:`_functools`, - :mod:`_json`, :mod:`_locale`, :mod:`math`, :mod:`operator`, :mod:`resource`, - :mod:`time`, :mod:`_weakref`) now use multiphase initialization as defined +* a number of Python modules (:mod:`!_abc`, :mod:`!audioop`, :mod:`!_bz2`, + :mod:`!_codecs`, :mod:`!_contextvars`, :mod:`!_crypt`, :mod:`!_functools`, + :mod:`!_json`, :mod:`!_locale`, :mod:`math`, :mod:`operator`, :mod:`resource`, + :mod:`time`, :mod:`!_weakref`) now use multiphase initialization as defined by PEP 489; -* a number of standard library modules (:mod:`audioop`, :mod:`ast`, :mod:`grp`, - :mod:`_hashlib`, :mod:`pwd`, :mod:`_posixsubprocess`, :mod:`random`, +* a number of standard library modules (:mod:`!audioop`, :mod:`ast`, :mod:`grp`, + :mod:`!_hashlib`, :mod:`pwd`, :mod:`!_posixsubprocess`, :mod:`random`, :mod:`select`, :mod:`struct`, :mod:`termios`, :mod:`zlib`) are now using the stable ABI defined by PEP 384. @@ -203,7 +203,7 @@ The :mod:`ast` module uses the new parser and produces the same AST as the old parser. In Python 3.10, the old parser will be deleted and so will all -functionality that depends on it (primarily the :mod:`parser` module, +functionality that depends on it (primarily the :mod:`!parser` module, which has long been deprecated). In Python 3.9 *only*, you can switch back to the LL(1) parser using a command line switch (``-X oldparser``) or an environment variable (``PYTHONOLDPARSER=1``). @@ -300,12 +300,9 @@ Example:: As a fall-back source of data for platforms that don't ship the IANA database, -the |tzdata|_ module was released as a first-party package -- distributed via +the :pypi:`tzdata` module was released as a first-party package -- distributed via PyPI and maintained by the CPython core team. -.. |tzdata| replace:: ``tzdata`` -.. _tzdata: https://pypi.org/project/tzdata/ - .. seealso:: :pep:`615` -- Support for the IANA Time Zone Database in the Standard Library @@ -369,7 +366,7 @@ wait until the cancellation is complete also in the case when *timeout* is <= 0, like it does with positive timeouts. (Contributed by Elvis Pranskevichus in :issue:`32751`.) -:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible +:mod:`asyncio` now raises :exc:`TypeError` when calling incompatible methods with an :class:`ssl.SSLSocket` socket. (Contributed by Ido Michael in :issue:`37404`.) @@ -411,8 +408,8 @@ Added :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, datetime -------- -The :meth:`~datetime.date.isocalendar()` of :class:`datetime.date` -and :meth:`~datetime.datetime.isocalendar()` of :class:`datetime.datetime` +The :meth:`~datetime.date.isocalendar` of :class:`datetime.date` +and :meth:`~datetime.datetime.isocalendar` of :class:`datetime.datetime` methods now returns a :func:`~collections.namedtuple` instead of a :class:`tuple`. (Contributed by Donghee Na in :issue:`24416`.) @@ -585,14 +582,14 @@ queue. nntplib ------- -:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a :class:`ValueError` +:class:`!NNTP` and :class:`!NNTP_SSL` now raise a :class:`ValueError` if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in :issue:`39259`.) os -- -Added :const:`~os.CLD_KILLED` and :const:`~os.CLD_STOPPED` for :attr:`si_code`. +Added :const:`~os.CLD_KILLED` and :const:`~os.CLD_STOPPED` for :attr:`!si_code`. (Contributed by Donghee Na in :issue:`38493`.) Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and @@ -613,7 +610,7 @@ convert a wait status to an exit code. pathlib ------- -Added :meth:`pathlib.Path.readlink()` which acts similarly to +Added :meth:`pathlib.Path.readlink` which acts similarly to :func:`os.readlink`. (Contributed by Girts Folkmanis in :issue:`30618`) @@ -640,7 +637,8 @@ pydoc ----- The documentation string is now shown not only for class, function, -method etc, but for any object that has its own ``__doc__`` attribute. +method etc, but for any object that has its own :attr:`~definition.__doc__` +attribute. (Contributed by Serhiy Storchaka in :issue:`40257`.) random @@ -864,7 +862,7 @@ Deprecated Python versions it will raise a :exc:`TypeError` for all floats. (Contributed by Serhiy Storchaka in :issue:`37315`.) -* The :mod:`parser` and :mod:`symbol` modules are deprecated and will be +* The :mod:`!parser` and :mod:`!symbol` modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the :mod:`ast` module. @@ -892,20 +890,20 @@ Deprecated it for writing and silencing a warning. (Contributed by Serhiy Storchaka in :issue:`28286`.) -* Deprecated the ``split()`` method of :class:`_tkinter.TkappType` in +* Deprecated the ``split()`` method of :class:`!_tkinter.TkappType` in favour of the ``splitlist()`` method which has more consistent and - predicable behavior. + predictable behavior. (Contributed by Serhiy Storchaka in :issue:`38371`.) * The explicit passing of coroutine objects to :func:`asyncio.wait` has been deprecated and will be removed in version 3.11. (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) -* binhex4 and hexbin4 standards are now deprecated. The :mod:`binhex` module +* binhex4 and hexbin4 standards are now deprecated. The :mod:`!binhex` module and the following :mod:`binascii` functions are now deprecated: - * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` - * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` + * :func:`!b2a_hqx`, :func:`!a2b_hqx` + * :func:`!rlecode_hqx`, :func:`!rledecode_hqx` (Contributed by Victor Stinner in :issue:`39353`.) @@ -931,13 +929,13 @@ Deprecated * Passing ``None`` as the first argument to the :func:`shlex.split` function has been deprecated. (Contributed by Zackery Spytz in :issue:`33262`.) -* :func:`smtpd.MailmanProxy` is now deprecated as it is unusable without +* :func:`!smtpd.MailmanProxy` is now deprecated as it is unusable without an external module, ``mailman``. (Contributed by Samuel Colvin in :issue:`35800`.) -* The :mod:`lib2to3` module now emits a :exc:`PendingDeprecationWarning`. +* The :mod:`!lib2to3` module now emits a :exc:`PendingDeprecationWarning`. Python 3.9 switched to a PEG parser (see :pep:`617`), and Python 3.10 may include new language syntax that is not parsable by lib2to3's LL(1) parser. - The ``lib2to3`` module may be removed from the standard library in a future + The :mod:`!lib2to3` module may be removed from the standard library in a future Python version. Consider third-party alternatives such as `LibCST`_ or `parso`_. (Contributed by Carl Meyer in :issue:`40360`.) @@ -953,13 +951,13 @@ Deprecated Removed ======= -* The erroneous version at :data:`unittest.mock.__version__` has been removed. +* The erroneous version at :data:`!unittest.mock.__version__` has been removed. -* :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. +* :class:`!nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. - For ``xgtitle()``, please use :meth:`nntplib.NNTP.descriptions` or - :meth:`nntplib.NNTP.description` instead. + For ``xgtitle()``, please use :meth:`!nntplib.NNTP.descriptions` or + :meth:`!nntplib.NNTP.description` instead. (Contributed by Donghee Na in :issue:`39366`.) * :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been @@ -986,13 +984,13 @@ Removed (Contributed by Victor Stinner in :issue:`37312`.) * ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` alias to - ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open()` have been + ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open` have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in :issue:`37320`.) -* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` +* The :meth:`!isAlive` method of :class:`threading.Thread` has been removed. It was deprecated since Python 3.8. - Use :meth:`~threading.Thread.is_alive()` instead. + Use :meth:`~threading.Thread.is_alive` instead. (Contributed by Donghee Na in :issue:`37804`.) * Methods ``getchildren()`` and ``getiterator()`` of classes @@ -1038,7 +1036,7 @@ Removed ``asyncio.Condition`` and ``asyncio.Semaphore``. (Contributed by Andrew Svetlov in :issue:`34793`.) -* The :func:`sys.getcounts` function, the ``-X showalloccount`` command line +* The :func:`!sys.getcounts` function, the ``-X showalloccount`` command line option and the ``show_alloc_count`` field of the C structure :c:type:`PyConfig` have been removed. They required a special Python build by defining ``COUNT_ALLOCS`` macro. @@ -1049,11 +1047,11 @@ Removed the ``__annotations__`` attribute instead. (Contributed by Serhiy Storchaka in :issue:`40182`.) -* The :meth:`symtable.SymbolTable.has_exec` method has been removed. It was +* The :meth:`!symtable.SymbolTable.has_exec` method has been removed. It was deprecated since 2006, and only returning ``False`` when it's called. (Contributed by Batuhan Taskaya in :issue:`40208`) -* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` +* The :meth:`!asyncio.Task.current_task` and :meth:`!asyncio.Task.all_tasks` have been removed. They were deprecated since Python 3.7 and you can use :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead. (Contributed by Rémi Lapeyre in :issue:`40967`) @@ -1126,7 +1124,7 @@ Changes in the Python API ``logging.getLogger(__name__)`` in some top-level module called ``'root.py'``. (Contributed by Vinay Sajip in :issue:`37742`.) -* Division handling of :class:`~pathlib.PurePath` now returns ``NotImplemented`` +* Division handling of :class:`~pathlib.PurePath` now returns :data:`NotImplemented` instead of raising a :exc:`TypeError` when passed something other than an instance of ``str`` or :class:`~pathlib.PurePath`. This allows creating compatible classes that don't inherit from those mentioned types. @@ -1233,7 +1231,7 @@ Build Changes * The ``COUNT_ALLOCS`` special build macro has been removed. (Contributed by Victor Stinner in :issue:`39489`.) -* On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` +* On non-Windows platforms, the :c:func:`!setenv` and :c:func:`!unsetenv` functions are now required to build Python. (Contributed by Victor Stinner in :issue:`39395`.) @@ -1322,7 +1320,7 @@ New Features the garbage collector respectively. (Contributed by Pablo Galindo Salgado in :issue:`40241`.) -* Added :c:func:`_PyObject_FunctionStr` to get a user-friendly string +* Added :c:func:`!_PyObject_FunctionStr` to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in :issue:`37645`.) @@ -1364,7 +1362,7 @@ Porting to Python 3.9 and refers to a constant string. (Contributed by Serhiy Storchaka in :issue:`38650`.) -* The :c:type:`PyGC_Head` structure is now opaque. It is only defined in the +* The :c:type:`!PyGC_Head` structure is now opaque. It is only defined in the internal C API (``pycore_gc.h``). (Contributed by Victor Stinner in :issue:`40241`.) @@ -1387,12 +1385,12 @@ Porting to Python 3.9 * :c:func:`PyObject_IS_GC` macro was converted to a function. - * The :c:func:`PyObject_NEW` macro becomes an alias to the - :c:macro:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + * The :c:func:`!PyObject_NEW` macro becomes an alias to the + :c:macro:`PyObject_New` macro, and the :c:func:`!PyObject_NEW_VAR` macro becomes an alias to the :c:macro:`PyObject_NewVar` macro. They no longer access directly the :c:member:`PyTypeObject.tp_basicsize` member. - * :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: + * :c:func:`!PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: the macro accessed directly the :c:member:`PyTypeObject.tp_weaklistoffset` member. @@ -1558,7 +1556,58 @@ query parameter separators in :func:`urllib.parse.parse_qs` and :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with ``&`` as the default. This change also affects -:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +:func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) + +Notable changes in Python 3.9.3 +=============================== + +A security fix alters the :class:`ftplib.FTP` behavior to not trust the +IPv4 address sent from the remote server when setting up a passive data +channel. We reuse the ftp server IP address instead. For unusual code +requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` +attribute on your FTP instance to ``True``. (See :gh:`87451`) + +Notable changes in Python 3.9.5 +=============================== + +urllib.parse +------------ + +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates :rfc:`3986`, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser in :mod:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :gh:`88048`) + +Notable security feature in 3.9.14 +================================== + +Converting between :class:`int` and :class:`str` in bases other than 2 +(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) +now raises a :exc:`ValueError` if the number of digits in string form is +above a limit to avoid potential denial of service attacks due to the +algorithmic complexity. This is a mitigation for :cve:`2020-10735`. +This limit can be configured or disabled by environment variable, command +line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion +length limitation ` documentation. The default limit +is 4300 digits in string form. + +Notable changes in 3.9.17 +========================= + +tarfile +------- + +* The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, + have a new a *filter* argument that allows limiting tar features than may be + surprising or dangerous, such as creating files outside the destination + directory. + See :ref:`tarfile-extraction-filter` for details. + In Python 3.12, use without the *filter* argument will show a + :exc:`DeprecationWarning`. + In Python 3.14, the default will switch to ``'data'``. + (Contributed by Petr Viktorin in :pep:`706`.) diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index bfee2257..39837f8c 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.13.rst 3.12.rst 3.11.rst 3.10.rst @@ -33,8 +34,8 @@ anyone wishing to stay up-to-date after a new release. 2.1.rst 2.0.rst -The "Changelog" is an HTML version of the `file built -`_ from the contents of the +The "Changelog" is an HTML version of the :pypi:`file built` +from the contents of the :source:`Misc/NEWS.d` directory tree, which contains *all* nontrivial changes to Python for the current version. diff --git a/Grammar/Tokens b/Grammar/Tokens index 618ae811..20bb803b 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -56,8 +56,6 @@ COLONEQUAL ':=' EXCLAMATION '!' OP -AWAIT -ASYNC TYPE_IGNORE TYPE_COMMENT SOFT_KEYWORD diff --git a/Grammar/python.gram b/Grammar/python.gram index f88dc2bd..5a181dc1 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -19,8 +19,6 @@ _PyPegen_parse(Parser *p) result = eval_rule(p); } else if (p->start_rule == Py_func_type_input) { result = func_type_rule(p); - } else if (p->start_rule == Py_fstring_input) { - result = fstring_rule(p); } return result; @@ -80,6 +78,9 @@ _PyPegen_parse(Parser *p) # Fail if e can be parsed, without consuming any input. # ~ # Commit to the current alternative, even if it fails to parse. +# &&e +# Eager parse e. The parser will not backtrack and will immediately +# fail with SyntaxError if e cannot be parsed. # # STARTING RULES @@ -89,7 +90,6 @@ file[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) } interactive[mod_ty]: a=statement_newline { _PyAST_Interactive(a, p->arena) } eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { _PyAST_Expression(a, p->arena) } func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { _PyAST_FunctionType(a, b, p->arena) } -fstring[expr_ty]: star_expressions # GENERAL STATEMENTS # ================== @@ -127,11 +127,11 @@ simple_stmt[stmt_ty] (memo): | &'nonlocal' nonlocal_stmt compound_stmt[stmt_ty]: - | &('def' | '@' | ASYNC) function_def + | &('def' | '@' | 'async') function_def | &'if' if_stmt | &('class' | '@') class_def - | &('with' | ASYNC) with_stmt - | &('for' | ASYNC) for_stmt + | &('with' | 'async') with_stmt + | &('for' | 'async') for_stmt | &'try' try_stmt | &'while' while_stmt | match_stmt @@ -268,11 +268,11 @@ function_def[stmt_ty]: function_def_raw[stmt_ty]: | invalid_def_raw - | 'def' n=NAME t=[type_params] &&'(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { + | 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { _PyAST_FunctionDef(n->v.Name.id, (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), t, EXTRA) } - | ASYNC 'def' n=NAME t=[type_params] &&'(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { + | 'async' 'def' n=NAME t=[type_params] '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { CHECK_VERSION( stmt_ty, 5, @@ -385,7 +385,7 @@ for_stmt[stmt_ty]: | invalid_for_stmt | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { _PyAST_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + | 'async' 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { CHECK_VERSION(stmt_ty, 5, "Async for loops are", _PyAST_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_for_target @@ -394,13 +394,13 @@ for_stmt[stmt_ty]: with_stmt[stmt_ty]: | invalid_with_stmt_indent - | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { - CHECK_VERSION(stmt_ty, 9, "Parenthesized context managers are", _PyAST_With(a, b, NULL, EXTRA)) } + | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' tc=[TYPE_COMMENT] b=block { + _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { + | 'async' 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NULL, EXTRA)) } - | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + | 'async' 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_with_stmt @@ -640,27 +640,33 @@ type_alias[stmt_ty]: # Type parameter declaration # -------------------------- -type_params[asdl_type_param_seq*]: '[' t=type_param_seq ']' { +type_params[asdl_type_param_seq*]: + | invalid_type_params + | '[' t=type_param_seq ']' { CHECK_VERSION(asdl_type_param_seq *, 12, "Type parameter lists are", t) } type_param_seq[asdl_type_param_seq*]: a[asdl_type_param_seq*]=','.type_param+ [','] { a } type_param[type_param_ty] (memo): - | a=NAME b=[type_param_bound] { _PyAST_TypeVar(a->v.Name.id, b, EXTRA) } - | '*' a=NAME colon=":" e=expression { + | a=NAME b=[type_param_bound] c=[type_param_default] { _PyAST_TypeVar(a->v.Name.id, b, c, EXTRA) } + | '*' a=NAME colon=':' e=expression { RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind ? "cannot use constraints with TypeVarTuple" : "cannot use bound with TypeVarTuple") } - | '*' a=NAME { _PyAST_TypeVarTuple(a->v.Name.id, EXTRA) } - | '**' a=NAME colon=":" e=expression { + | '*' a=NAME b=[type_param_starred_default] { _PyAST_TypeVarTuple(a->v.Name.id, b, EXTRA) } + | '**' a=NAME colon=':' e=expression { RAISE_SYNTAX_ERROR_STARTING_FROM(colon, e->kind == Tuple_kind ? "cannot use constraints with ParamSpec" : "cannot use bound with ParamSpec") } - | '**' a=NAME { _PyAST_ParamSpec(a->v.Name.id, EXTRA) } + | '**' a=NAME b=[type_param_default] { _PyAST_ParamSpec(a->v.Name.id, b, EXTRA) } -type_param_bound[expr_ty]: ":" e=expression { e } +type_param_bound[expr_ty]: ':' e=expression { e } +type_param_default[expr_ty]: '=' e=expression { + CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) } +type_param_starred_default[expr_ty]: '=' e=star_expression { + CHECK_VERSION(expr_ty, 13, "Type parameter defaults are", e) } # EXPRESSIONS # ----------- @@ -780,6 +786,7 @@ bitwise_and[expr_ty]: shift_expr[expr_ty]: | a=shift_expr '<<' b=sum { _PyAST_BinOp(a, LShift, b, EXTRA) } | a=shift_expr '>>' b=sum { _PyAST_BinOp(a, RShift, b, EXTRA) } + | invalid_arithmetic | sum # Arithmetic operators @@ -796,6 +803,7 @@ term[expr_ty]: | a=term '//' b=factor { _PyAST_BinOp(a, FloorDiv, b, EXTRA) } | a=term '%' b=factor { _PyAST_BinOp(a, Mod, b, EXTRA) } | a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) } + | invalid_factor | factor factor[expr_ty] (memo): @@ -814,7 +822,7 @@ power[expr_ty]: # Primary elements are things like "obj.something.something", "obj[something]", "obj(something)", "obj" ... await_primary[expr_ty] (memo): - | AWAIT a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) } + | 'await' a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) } | primary primary[expr_ty]: @@ -915,7 +923,7 @@ fstring_middle[expr_ty]: | fstring_replacement_field | t=FSTRING_MIDDLE { _PyPegen_constant_from_token(p, t) } fstring_replacement_field[expr_ty]: - | '{' a=(yield_expr | star_expressions) debug_expr="="? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='}' { + | '{' a=annotated_rhs debug_expr='='? conversion=[fstring_conversion] format=[fstring_full_format_spec] rbrace='}' { _PyPegen_formatted_value(p, a, debug_expr, conversion, format, rbrace, EXTRA) } | invalid_replacement_field fstring_conversion[ResultTokenWithMetadata*]: @@ -966,10 +974,12 @@ for_if_clauses[asdl_comprehension_seq*]: | a[asdl_comprehension_seq*]=for_if_clause+ { a } for_if_clause[comprehension_ty]: - | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { + | 'async' 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _PyAST_comprehension(a, b, c, 1, p->arena)) } | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { _PyAST_comprehension(a, b, c, 0, p->arena) } + | 'async'? 'for' (bitwise_or (',' bitwise_or)* [',']) !'in' { + RAISE_SYNTAX_ERROR("'in' expected after for-loop variables") } | invalid_for_target listcomp[expr_ty]: @@ -1011,6 +1021,7 @@ kwargs[asdl_seq*]: starred_expression[expr_ty]: | invalid_starred_expression | '*' a=expression { _PyAST_Starred(a, Load, EXTRA) } + | '*' { RAISE_SYNTAX_ERROR("Invalid star expression") } kwarg_or_starred[KeywordOrStarred*]: | invalid_kwarg @@ -1131,7 +1142,8 @@ func_type_comment[Token*]: # From here on, there are rules for invalid syntax with specialised error messages invalid_arguments: - | a=args ',' '*' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable argument unpacking follows keyword argument unpacking") } + | ((','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ ',' kwargs) | kwargs) a=',' ','.(starred_expression !'=')+ { + RAISE_SYNTAX_ERROR_STARTING_FROM(a, "iterable argument unpacking follows keyword argument unpacking") } | a=expression b=for_if_clauses ',' [args | expression for_if_clauses] { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, _PyPegen_get_last_comprehension_item(PyPegen_last_item(b, comprehension_ty)), "Generator expression must be parenthesized") } | a=NAME b='=' expression for_if_clauses { @@ -1197,7 +1209,7 @@ invalid_assignment: | (star_targets '=')* a=star_expressions '=' { RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } | (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") } - | a=star_expressions augassign (yield_expr | star_expressions) { + | a=star_expressions augassign annotated_rhs { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "'%s' is an illegal expression for augmented assignment", @@ -1284,7 +1296,7 @@ invalid_with_item: RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } invalid_for_target: - | ASYNC? 'for' a=star_expressions { + | 'async'? 'for' a=star_expressions { RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) } invalid_group: @@ -1295,18 +1307,22 @@ invalid_group: invalid_import: | a='import' ','.dotted_name+ 'from' dotted_name { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "Did you mean to use 'from ... import ...' instead?") } + | 'import' token=NEWLINE { + RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") } invalid_import_from_targets: | import_from_as_names ',' NEWLINE { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } + | token=NEWLINE { + RAISE_SYNTAX_ERROR_STARTING_FROM(token, "Expected one or more names after 'import'") } invalid_with_stmt: - | [ASYNC] 'with' ','.(expression ['as' star_target])+ NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } - | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | ['async'] 'with' ','.(expression ['as' star_target])+ NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | ['async'] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } invalid_with_stmt_indent: - | [ASYNC] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT { + | ['async'] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) } - | [ASYNC] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT { + | ['async'] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) } invalid_try_stmt: @@ -1367,15 +1383,16 @@ invalid_while_stmt: | a='while' named_expression ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after 'while' statement on line %d", a->lineno) } invalid_for_stmt: - | [ASYNC] 'for' star_targets 'in' star_expressions NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } - | [ASYNC] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT { + | ['async'] 'for' star_targets 'in' star_expressions NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | ['async'] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after 'for' statement on line %d", a->lineno) } invalid_def_raw: - | [ASYNC] a='def' NAME '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT { + | ['async'] a='def' NAME [type_params] '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after function definition on line %d", a->lineno) } + | ['async'] 'def' NAME [type_params] &&'(' [params] ')' ['->' expression] &&':' [func_type_comment] block invalid_class_def_raw: - | 'class' NAME ['(' [arguments] ')'] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } - | a='class' NAME ['(' [arguments] ')'] ':' NEWLINE !INDENT { + | 'class' NAME [type_params] ['(' [arguments] ')'] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | a='class' NAME [type_params] ['(' [arguments] ')'] ':' NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block after class definition on line %d", a->lineno) } invalid_double_starred_kvpairs: @@ -1389,24 +1406,36 @@ invalid_kvpair: | expression a=':' &('}'|',') {RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") } invalid_starred_expression: | a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") } + invalid_replacement_field: | '{' a='=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '='") } | '{' a='!' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '!'") } | '{' a=':' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before ':'") } | '{' a='}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "f-string: valid expression required before '}'") } - | '{' !(yield_expr | star_expressions) { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '{'")} - | '{' (yield_expr | star_expressions) !('=' | '!' | ':' | '}') { + | '{' !annotated_rhs { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting a valid expression after '{'")} + | '{' annotated_rhs !('=' | '!' | ':' | '}') { PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '=', or '!', or ':', or '}'") } - | '{' (yield_expr | star_expressions) '=' !('!' | ':' | '}') { + | '{' annotated_rhs '=' !('!' | ':' | '}') { PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '!', or ':', or '}'") } - | '{' (yield_expr | star_expressions) '='? invalid_conversion_character - | '{' (yield_expr | star_expressions) '='? ['!' NAME] !(':' | '}') { + | '{' annotated_rhs '='? invalid_conversion_character + | '{' annotated_rhs '='? ['!' NAME] !(':' | '}') { PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting ':' or '}'") } - | '{' (yield_expr | star_expressions) '='? ['!' NAME] ':' fstring_format_spec* !'}' { + | '{' annotated_rhs '='? ['!' NAME] ':' fstring_format_spec* !'}' { PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}', or format specs") } - | '{' (yield_expr | star_expressions) '='? ['!' NAME] !'}' { + | '{' annotated_rhs '='? ['!' NAME] !'}' { PyErr_Occurred() ? NULL : RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: expecting '}'") } invalid_conversion_character: | '!' &(':' | '}') { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: missing conversion character") } | '!' !NAME { RAISE_SYNTAX_ERROR_ON_NEXT_TOKEN("f-string: invalid conversion character") } + +invalid_arithmetic: + | sum ('+'|'-'|'*'|'/'|'%'|'//'|'@') a='not' b=inversion { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") } +invalid_factor: + | ('+' | '-' | '~') a='not' b=factor { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "'not' after an operator must be parenthesized") } + +invalid_type_params: + | '[' token=']' { + RAISE_SYNTAX_ERROR_STARTING_FROM( + token, + "Type parameter list cannot be empty")} diff --git a/Include/Python.h b/Include/Python.h index 52a7aac6..fb2d32d7 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -5,42 +5,70 @@ #ifndef Py_PYTHON_H #define Py_PYTHON_H -// Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { +// Since this is a "meta-include" file, "#ifdef __cplusplus / extern "C" {" +// is not needed. + // Include Python header files #include "patchlevel.h" #include "pyconfig.h" #include "pymacconfig.h" -#if defined(__sgi) && !defined(_SGI_MP_SOURCE) -# define _SGI_MP_SOURCE + +// Include standard header files +#include // assert() +#include // uintptr_t +#include // INT_MAX +#include // HUGE_VAL +#include // va_list +#include // wchar_t +#ifdef HAVE_SYS_TYPES_H +# include // ssize_t #endif -// stdlib.h, stdio.h, errno.h and string.h headers are not used by Python -// headers, but kept for backward compatibility. They are excluded from the -// limited C API of Python 3.11. +// , , and headers are no longer used +// by Python, but kept for the backward compatibility of existing third party C +// extensions. They are not included by limited C API version 3.11 and newer. +// +// The and headers are not included by limited C API +// version 3.13 and newer. #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# include -# include // FILE* # include // errno +# include // FILE* +# include // getenv() # include // memcpy() #endif -#ifndef MS_WINDOWS -# include +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030d0000 +# include // tolower() +# ifndef MS_WINDOWS +# include // close() +# endif #endif -#ifdef HAVE_STDDEF_H -# include // size_t + +// gh-111506: The free-threaded build is not compatible with the limited API +// or the stable ABI. +#if defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED) +# error "The limited API is not currently supported in the free-threaded build" #endif -#include // assert() -#include // wchar_t +#if defined(Py_GIL_DISABLED) && defined(_MSC_VER) +# include // __readgsqword() +#endif + +#if defined(Py_GIL_DISABLED) && defined(__MINGW32__) +# include // __readgsqword() +#endif +// Include Python header files #include "pyport.h" #include "pymacro.h" #include "pymath.h" #include "pymem.h" #include "pytypedefs.h" #include "pybuffer.h" +#include "pystats.h" +#include "pyatomic.h" +#include "lock.h" #include "object.h" #include "objimpl.h" #include "typeslots.h" @@ -49,6 +77,7 @@ #include "bytearrayobject.h" #include "bytesobject.h" #include "unicodeobject.h" +#include "pyerrors.h" #include "longobject.h" #include "cpython/longintrepr.h" #include "boolobject.h" @@ -64,6 +93,7 @@ #include "setobject.h" #include "methodobject.h" #include "moduleobject.h" +#include "monitoring.h" #include "cpython/funcobject.h" #include "cpython/classobject.h" #include "fileobject.h" @@ -85,7 +115,6 @@ #include "cpython/picklebufobject.h" #include "cpython/pytime.h" #include "codecs.h" -#include "pyerrors.h" #include "pythread.h" #include "cpython/context.h" #include "modsupport.h" @@ -99,11 +128,12 @@ #include "import.h" #include "abstract.h" #include "bltinmodule.h" +#include "critical_section.h" #include "cpython/pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" #include "cpython/pyfpe.h" -#include "tracemalloc.h" +#include "cpython/tracemalloc.h" #endif /* !Py_PYTHON_H */ diff --git a/Include/abstract.h b/Include/abstract.h index 064b0300..bd12a549 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -50,6 +50,25 @@ extern "C" { This function always succeeds. */ + +/* Implemented elsewhere: + + int PyObject_HasAttrStringWithError(PyObject *o, const char *attr_name); + + Returns 1 if object 'o' has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: hasattr(o,attr_name). + Returns -1 on failure. */ + + +/* Implemented elsewhere: + + int PyObject_HasAttrWithError(PyObject *o, PyObject *attr_name); + + Returns 1 if o has the attribute attr_name, and 0 otherwise. + This is equivalent to the Python expression: hasattr(o,attr_name). + Returns -1 on failure. */ + + /* Implemented elsewhere: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name); @@ -60,6 +79,38 @@ extern "C" { This is the equivalent of the Python expression: o.attr_name. */ +/* Implemented elsewhere: + + int PyObject_GetOptionalAttr(PyObject *obj, PyObject *attr_name, PyObject **result); + + Variant of PyObject_GetAttr() which doesn't raise AttributeError + if the attribute is not found. + + If the attribute is found, return 1 and set *result to a new strong + reference to the attribute. + If the attribute is not found, return 0 and set *result to NULL; + the AttributeError is silenced. + If an error other than AttributeError is raised, return -1 and + set *result to NULL. +*/ + + +/* Implemented elsewhere: + + int PyObject_GetOptionalAttrString(PyObject *obj, const char *attr_name, PyObject **result); + + Variant of PyObject_GetAttrString() which doesn't raise AttributeError + if the attribute is not found. + + If the attribute is found, return 1 and set *result to a new strong + reference to the attribute. + If the attribute is not found, return 0 and set *result to NULL; + the AttributeError is silenced. + If an error other than AttributeError is raised, return -1 and + set *result to NULL. +*/ + + /* Implemented elsewhere: int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v); @@ -80,7 +131,7 @@ extern "C" { This is the equivalent of the Python statement o.attr_name=v. */ -/* Implemented as a macro: +/* Implemented elsewhere: int PyObject_DelAttrString(PyObject *o, const char *attr_name); @@ -88,17 +139,15 @@ extern "C" { -1 on failure. This is the equivalent of the Python statement: del o.attr_name. */ -#define PyObject_DelAttrString(O, A) PyObject_SetAttrString((O), (A), NULL) -/* Implemented as a macro: +/* Implemented elsewhere: int PyObject_DelAttr(PyObject *o, PyObject *attr_name); Delete attribute named attr_name, for object o. Returns -1 on failure. This is the equivalent of the Python statement: del o.attr_name. */ -#define PyObject_DelAttr(O, A) PyObject_SetAttr((O), (A), NULL) /* Implemented elsewhere: @@ -135,12 +184,6 @@ extern "C" { This function always succeeds. */ -#ifdef PY_SSIZE_T_CLEAN -# define PyObject_CallFunction _PyObject_CallFunction_SizeT -# define PyObject_CallMethod _PyObject_CallMethod_SizeT -#endif - - #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 /* Call a callable Python object without any arguments */ PyAPI_FUNC(PyObject *) PyObject_CallNoArgs(PyObject *func); @@ -195,15 +238,6 @@ PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...); -PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, - const char *format, - ...); - -PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *obj, - const char *name, - const char *format, - ...); - /* Call a callable Python object 'callable' with a variable number of C arguments. The C arguments are provided as PyObject* values, terminated by a NULL. @@ -335,55 +369,6 @@ PyAPI_FUNC(int) PyObject_DelItemString(PyObject *o, const char *key); PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); -/* === Old Buffer API ============================================ */ - -/* FIXME: usage of these should all be replaced in Python itself - but for backwards compatibility we will implement them. - Their usage without a corresponding "unlock" mechanism - may create issues (but they would already be there). */ - -/* Takes an arbitrary object which must support the (character, single segment) - buffer interface and returns a pointer to a read-only memory location - usable as character based input for subsequent processing. - - Return 0 on success. buffer and buffer_len are only set in case no error - occurs. Otherwise, -1 is returned and an exception set. */ -Py_DEPRECATED(3.0) -PyAPI_FUNC(int) PyObject_AsCharBuffer(PyObject *obj, - const char **buffer, - Py_ssize_t *buffer_len); - -/* Checks whether an arbitrary object supports the (character, single segment) - buffer interface. - - Returns 1 on success, 0 on failure. */ -Py_DEPRECATED(3.0) PyAPI_FUNC(int) PyObject_CheckReadBuffer(PyObject *obj); - -/* Same as PyObject_AsCharBuffer() except that this API expects (readable, - single segment) buffer interface and returns a pointer to a read-only memory - location which can contain arbitrary data. - - 0 is returned on success. buffer and buffer_len are only set in case no - error occurs. Otherwise, -1 is returned and an exception set. */ -Py_DEPRECATED(3.0) -PyAPI_FUNC(int) PyObject_AsReadBuffer(PyObject *obj, - const void **buffer, - Py_ssize_t *buffer_len); - -/* Takes an arbitrary object which must support the (writable, single segment) - buffer interface and returns a pointer to a writable memory location in - buffer of size 'buffer_len'. - - Return 0 on success. buffer and buffer_len are only set in case no error - occurs. Otherwise, -1 is returned and an exception set. */ -Py_DEPRECATED(3.0) -PyAPI_FUNC(int) PyObject_AsWriteBuffer(PyObject *obj, - void **buffer, - Py_ssize_t *buffer_len); - - -/* === New Buffer API ============================================ */ - /* Takes an arbitrary object and returns the result of calling obj.__format__(format_spec). */ PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, @@ -855,6 +840,18 @@ PyAPI_FUNC(int) PyMapping_HasKeyString(PyObject *o, const char *key); This function always succeeds. */ PyAPI_FUNC(int) PyMapping_HasKey(PyObject *o, PyObject *key); +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + This is equivalent to the Python expression: key in o. + On failure, return -1. */ + +PyAPI_FUNC(int) PyMapping_HasKeyWithError(PyObject *o, PyObject *key); + +/* Return 1 if the mapping object has the key 'key', and 0 otherwise. + This is equivalent to the Python expression: key in o. + On failure, return -1. */ + +PyAPI_FUNC(int) PyMapping_HasKeyStringWithError(PyObject *o, const char *key); + /* On success, return a list or tuple of the keys in mapping object 'o'. On failure, return NULL. */ PyAPI_FUNC(PyObject *) PyMapping_Keys(PyObject *o); @@ -874,6 +871,21 @@ PyAPI_FUNC(PyObject *) PyMapping_Items(PyObject *o); PyAPI_FUNC(PyObject *) PyMapping_GetItemString(PyObject *o, const char *key); +/* Variants of PyObject_GetItem() and PyMapping_GetItemString() which don't + raise KeyError if the key is not found. + + If the key is found, return 1 and set *result to a new strong + reference to the corresponding value. + If the key is not found, return 0 and set *result to NULL; + the KeyError is silenced. + If an error other than KeyError is raised, return -1 and + set *result to NULL. +*/ +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PyMapping_GetOptionalItem(PyObject *, PyObject *, PyObject **); +PyAPI_FUNC(int) PyMapping_GetOptionalItemString(PyObject *, const char *, PyObject **); +#endif + /* Map the string 'key' to the value 'v' in the mapping 'o'. Returns -1 on failure. diff --git a/Include/boolobject.h b/Include/boolobject.h index 976fa352..3037e61b 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -7,7 +7,7 @@ extern "C" { #endif -PyAPI_DATA(PyTypeObject) PyBool_Type; +// PyBool_Type is declared by object.h #define PyBool_Check(x) Py_IS_TYPE((x), &PyBool_Type) @@ -18,8 +18,13 @@ PyAPI_DATA(PyLongObject) _Py_FalseStruct; PyAPI_DATA(PyLongObject) _Py_TrueStruct; /* Use these macros */ -#define Py_False _PyObject_CAST(&_Py_FalseStruct) -#define Py_True _PyObject_CAST(&_Py_TrueStruct) +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 +# define Py_False Py_GetConstantBorrowed(Py_CONSTANT_FALSE) +# define Py_True Py_GetConstantBorrowed(Py_CONSTANT_TRUE) +#else +# define Py_False _PyObject_CAST(&_Py_FalseStruct) +# define Py_True _PyObject_CAST(&_Py_TrueStruct) +#endif // Test if an object is the True singleton, the same as "x is True" in Python. PyAPI_FUNC(int) Py_IsTrue(PyObject *x); diff --git a/Include/bytesobject.h b/Include/bytesobject.h index ee448cd0..c5a24195 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -1,5 +1,4 @@ - -/* Bytes object interface */ +// Bytes object interface #ifndef Py_BYTESOBJECT_H #define Py_BYTESOBJECT_H @@ -7,8 +6,6 @@ extern "C" { #endif -#include // va_list - /* Type PyBytesObject represents a byte string. An extra zero byte is reserved at the end to ensure it is zero-terminated, but a size is diff --git a/Include/ceval.h b/Include/ceval.h index ad4d909d..1ec746c3 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -17,32 +17,15 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, PyObject *const *defs, int defc, PyObject *kwdefs, PyObject *closure); -/* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction - * and PyEval_CallMethod are deprecated. Since they are officially part of the - * stable ABI (PEP 384), they must be kept for backward compatibility. - * PyObject_Call(), PyObject_CallFunction() and PyObject_CallMethod() are - * recommended to call a callable object. - */ - -Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( - PyObject *callable, - PyObject *args, - PyObject *kwargs); - -/* Deprecated since PyEval_CallObjectWithKeywords is deprecated */ -#define PyEval_CallObject(callable, arg) \ - PyEval_CallObjectWithKeywords((callable), (arg), _PyObject_CAST(_Py_NULL)) - -Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallFunction( - PyObject *callable, const char *format, ...); -Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallMethod( - PyObject *obj, const char *name, const char *format, ...); - PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); PyAPI_FUNC(PyFrameObject *) PyEval_GetFrame(void); +PyAPI_FUNC(PyObject *) PyEval_GetFrameBuiltins(void); +PyAPI_FUNC(PyObject *) PyEval_GetFrameGlobals(void); +PyAPI_FUNC(PyObject *) PyEval_GetFrameLocals(void); + PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); PyAPI_FUNC(int) Py_MakePendingCalls(void); @@ -128,14 +111,8 @@ PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(PyFrameObject *f, int exc); PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); -Py_DEPRECATED(3.9) PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void); -/* PyEval_AcquireLock() and PyEval_ReleaseLock() are part of stable ABI. - * They will be removed from this header file in the future version. - * But they will be remained in ABI until Python 4.0. - */ -Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_AcquireLock(void); -Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_ReleaseLock(void); + PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); diff --git a/Include/codecs.h b/Include/codecs.h index 37ecfb4a..512a3c72 100644 --- a/Include/codecs.h +++ b/Include/codecs.h @@ -35,34 +35,6 @@ PyAPI_FUNC(int) PyCodec_Unregister( PyObject *search_function ); -/* Codec registry lookup API. - - Looks up the given encoding and returns a CodecInfo object with - function attributes which implement the different aspects of - processing the encoding. - - The encoding string is looked up converted to all lower-case - characters. This makes encodings looked up through this mechanism - effectively case-insensitive. - - If no codec is found, a KeyError is set and NULL returned. - - As side effect, this tries to load the encodings package, if not - yet done. This is part of the lazy load strategy for the encodings - package. - - */ - -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyCodec_Lookup( - const char *encoding - ); - -PyAPI_FUNC(int) _PyCodec_Forget( - const char *encoding - ); -#endif - /* Codec registry encoding check API. Returns 1/0 depending on whether there is a registered codec for @@ -106,102 +78,58 @@ PyAPI_FUNC(PyObject *) PyCodec_Decode( const char *errors ); -#ifndef Py_LIMITED_API -/* Text codec specific encoding and decoding API. - - Checks the encoding against a list of codecs which do not - implement a str<->bytes encoding before attempting the - operation. +// --- Codec Lookup APIs -------------------------------------------------- - Please note that these APIs are internal and should not - be used in Python C extensions. - - XXX (ncoghlan): should we make these, or something like them, public - in Python 3.5+? +/* Codec registry lookup API. - */ -PyAPI_FUNC(PyObject *) _PyCodec_LookupTextEncoding( - const char *encoding, - const char *alternate_command - ); + Looks up the given encoding and returns a CodecInfo object with + function attributes which implement the different aspects of + processing the encoding. -PyAPI_FUNC(PyObject *) _PyCodec_EncodeText( - PyObject *object, - const char *encoding, - const char *errors - ); + The encoding string is looked up converted to all lower-case + characters. This makes encodings looked up through this mechanism + effectively case-insensitive. -PyAPI_FUNC(PyObject *) _PyCodec_DecodeText( - PyObject *object, - const char *encoding, - const char *errors - ); + If no codec is found, a KeyError is set and NULL returned. -/* These two aren't actually text encoding specific, but _io.TextIOWrapper - * is the only current API consumer. + As side effect, this tries to load the encodings package, if not + yet done. This is part of the lazy load strategy for the encodings + package. */ -PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalDecoder( - PyObject *codec_info, - const char *errors - ); - -PyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalEncoder( - PyObject *codec_info, - const char *errors - ); -#endif - - - -/* --- Codec Lookup APIs -------------------------------------------------- - - All APIs return a codec object with incremented refcount and are - based on _PyCodec_Lookup(). The same comments w/r to the encoding - name also apply to these APIs. - -*/ /* Get an encoder function for the given encoding. */ -PyAPI_FUNC(PyObject *) PyCodec_Encoder( - const char *encoding - ); +PyAPI_FUNC(PyObject *) PyCodec_Encoder(const char *encoding); /* Get a decoder function for the given encoding. */ -PyAPI_FUNC(PyObject *) PyCodec_Decoder( - const char *encoding - ); +PyAPI_FUNC(PyObject *) PyCodec_Decoder(const char *encoding); /* Get an IncrementalEncoder object for the given encoding. */ PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( - const char *encoding, - const char *errors - ); + const char *encoding, + const char *errors); /* Get an IncrementalDecoder object function for the given encoding. */ PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( - const char *encoding, - const char *errors - ); + const char *encoding, + const char *errors); /* Get a StreamReader factory function for the given encoding. */ PyAPI_FUNC(PyObject *) PyCodec_StreamReader( - const char *encoding, - PyObject *stream, - const char *errors - ); + const char *encoding, + PyObject *stream, + const char *errors); /* Get a StreamWriter factory function for the given encoding. */ PyAPI_FUNC(PyObject *) PyCodec_StreamWriter( - const char *encoding, - PyObject *stream, - const char *errors - ); + const char *encoding, + PyObject *stream, + const char *errors); /* Unicode encoding error handling callback registry API */ diff --git a/Include/compile.h b/Include/compile.h index 3c5acd72..52d0bc76 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -10,9 +10,6 @@ extern "C" { #define Py_eval_input 258 #define Py_func_type_input 345 -/* This doesn't need to match anything */ -#define Py_fstring_input 800 - #ifndef Py_LIMITED_API # define Py_CPYTHON_COMPILE_H # include "cpython/compile.h" diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 3b27aab2..4e7b7a46 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -4,9 +4,12 @@ /* === Object Protocol ================================================== */ -#ifdef PY_SSIZE_T_CLEAN -# define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT -#endif +/* Like PyObject_CallMethod(), but expect a _Py_Identifier* + as the method name. */ +PyAPI_FUNC(PyObject*) _PyObject_CallMethodId( + PyObject *obj, + _Py_Identifier *name, + const char *format, ...); /* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple) format to a Python dictionary ("kwargs" dict). @@ -18,51 +21,25 @@ Duplicate keys are merged using the last value. If duplicate keys must raise an exception, the caller is responsible to implement an explicit keys on kwnames. */ -PyAPI_FUNC(PyObject *) _PyStack_AsDict( - PyObject *const *values, - PyObject *kwnames); - -/* Suggested size (number of positional arguments) for arrays of PyObject* - allocated on a C stack to avoid allocating memory on the heap memory. Such - array is used to pass positional arguments to call functions of the - PyObject_Vectorcall() family. - - The size is chosen to not abuse the C stack and so limit the risk of stack - overflow. The size is also chosen to allow using the small stack for most - function calls of the Python standard library. On 64-bit CPU, it allocates - 40 bytes on the stack. */ -#define _PY_FASTCALL_SMALL_STACK 5 - -PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult( - PyThreadState *tstate, - PyObject *callable, - PyObject *result, - const char *where); +PyAPI_FUNC(PyObject*) _PyStack_AsDict(PyObject *const *values, PyObject *kwnames); -/* === Vectorcall protocol (PEP 590) ============================= */ -/* Call callable using tp_call. Arguments are like PyObject_Vectorcall() - or PyObject_FastCallDict() (both forms are supported), - except that nargs is plainly the number of arguments without flags. */ -PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( - PyThreadState *tstate, - PyObject *callable, - PyObject *const *args, Py_ssize_t nargs, - PyObject *keywords); +/* === Vectorcall protocol (PEP 590) ============================= */ // PyVectorcall_NARGS() is exported as a function for the stable ABI. // Here (when we are not using the stable ABI), the name is overridden to // call a static inline function for best performance. -#define PyVectorcall_NARGS(n) _PyVectorcall_NARGS(n) static inline Py_ssize_t _PyVectorcall_NARGS(size_t n) { return n & ~PY_VECTORCALL_ARGUMENTS_OFFSET; } +#define PyVectorcall_NARGS(n) _PyVectorcall_NARGS(n) PyAPI_FUNC(vectorcallfunc) PyVectorcall_Function(PyObject *callable); -// Backwards compatibility aliases for API that was provisional in Python 3.8 +// Backwards compatibility aliases (PEP 590) for API that was provisional +// in Python 3.8 #define _PyObject_Vectorcall PyObject_Vectorcall #define _PyObject_VectorcallMethod PyObject_VectorcallMethod #define _PyObject_FastCallDict PyObject_VectorcallDict @@ -79,12 +56,6 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallDict( size_t nargsf, PyObject *kwargs); -// Same as PyObject_Vectorcall(), except without keyword arguments -PyAPI_FUNC(PyObject *) _PyObject_FastCall( - PyObject *func, - PyObject *const *args, - Py_ssize_t nargs); - PyAPI_FUNC(PyObject *) PyObject_CallOneArg(PyObject *func, PyObject *arg); static inline PyObject * @@ -103,56 +74,6 @@ PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL); } -PyAPI_FUNC(PyObject *) _PyObject_CallMethod(PyObject *obj, - PyObject *name, - const char *format, ...); - -/* Like PyObject_CallMethod(), but expect a _Py_Identifier* - as the method name. */ -PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, - _Py_Identifier *name, - const char *format, ...); - -PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj, - _Py_Identifier *name, - const char *format, - ...); - -PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( - PyObject *obj, - _Py_Identifier *name, - ...); - -static inline PyObject * -_PyObject_VectorcallMethodId( - _Py_Identifier *name, PyObject *const *args, - size_t nargsf, PyObject *kwnames) -{ - PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ - if (!oname) { - return _Py_NULL; - } - return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); -} - -static inline PyObject * -_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name) -{ - size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; - return _PyObject_VectorcallMethodId(name, &self, nargsf, _Py_NULL); -} - -static inline PyObject * -_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) -{ - PyObject *args[2] = {self, arg}; - size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; - assert(arg != NULL); - return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL); -} - -PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); - /* Guess the size of object 'o' using len(o) or o.__length_hint__(). If neither of those return a non-negative value, then return the default value. If one of the calls fails, this function returns -1. */ @@ -164,43 +85,3 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); need to be corrected for a negative index. */ #define PySequence_ITEM(o, i)\ ( Py_TYPE(o)->tp_as_sequence->sq_item((o), (i)) ) - -#define PY_ITERSEARCH_COUNT 1 -#define PY_ITERSEARCH_INDEX 2 -#define PY_ITERSEARCH_CONTAINS 3 - -/* Iterate over seq. - - Result depends on the operation: - - PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if - error. - PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of - obj in seq; set ValueError and return -1 if none found; - also return -1 on error. - PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on - error. */ -PyAPI_FUNC(Py_ssize_t) _PySequence_IterSearch(PyObject *seq, - PyObject *obj, int operation); - -/* === Mapping protocol ================================================= */ - -PyAPI_FUNC(int) _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); - -PyAPI_FUNC(int) _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); - -PyAPI_FUNC(char *const *) _PySequence_BytesToCharpArray(PyObject* self); - -PyAPI_FUNC(void) _Py_FreeCharPArray(char *const array[]); - -/* For internal use by buffer API functions */ -PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, - const Py_ssize_t *shape); -PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, - const Py_ssize_t *shape); - -/* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */ -PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); - -/* Same as PyNumber_Index but can return an instance of a subclass of int. */ -PyAPI_FUNC(PyObject *) _PyNumber_Index(PyObject *o); diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h index e982031c..41537210 100644 --- a/Include/cpython/bytesobject.h +++ b/Include/cpython/bytesobject.h @@ -15,18 +15,6 @@ typedef struct { } PyBytesObject; PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); -PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( - const char *format, - Py_ssize_t format_len, - PyObject *args, - int use_bytearray); -PyAPI_FUNC(PyObject*) _PyBytes_FromHex( - PyObject *string, - int use_bytearray); - -/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ -PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, - const char *, const char **); /* Macros and static inline functions, trading safety for speed */ #define _PyBytes_CAST(op) \ @@ -46,84 +34,4 @@ static inline Py_ssize_t PyBytes_GET_SIZE(PyObject *op) { /* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, x must be an iterable object. */ -PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); - - -/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". - A _PyBytesWriter variable must be declared at the end of variables in a - function to optimize the memory allocation on the stack. */ -typedef struct { - /* bytes, bytearray or NULL (when the small buffer is used) */ - PyObject *buffer; - - /* Number of allocated size. */ - Py_ssize_t allocated; - - /* Minimum number of allocated bytes, - incremented by _PyBytesWriter_Prepare() */ - Py_ssize_t min_size; - - /* If non-zero, use a bytearray instead of a bytes object for buffer. */ - int use_bytearray; - - /* If non-zero, overallocate the buffer (default: 0). - This flag must be zero if use_bytearray is non-zero. */ - int overallocate; - - /* Stack buffer */ - int use_small_buffer; - char small_buffer[512]; -} _PyBytesWriter; - -/* Initialize a bytes writer - - By default, the overallocation is disabled. Set the overallocate attribute - to control the allocation of the buffer. */ -PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); - -/* Get the buffer content and reset the writer. - Return a bytes object, or a bytearray object if use_bytearray is non-zero. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, - void *str); - -/* Deallocate memory of a writer (clear its internal buffer). */ -PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); - -/* Allocate the buffer to write size bytes. - Return the pointer to the beginning of buffer data. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, - Py_ssize_t size); - -/* Ensure that the buffer is large enough to write *size* bytes. - Add size to the writer minimum size (min_size attribute). - - str is the current pointer inside the buffer. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Resize the buffer to make it larger. - The new buffer may be larger than size bytes because of overallocation. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. - - Note: size must be greater than the number of allocated bytes in the writer. - - This function doesn't use the writer minimum size (min_size attribute). - - See also _PyBytesWriter_Prepare(). - */ -PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Write bytes. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, - void *str, - const void *bytes, - Py_ssize_t size); +PyAPI_FUNC(PyObject*) _PyBytes_Join(PyObject *sep, PyObject *x); diff --git a/Include/cpython/ceval.h b/Include/cpython/ceval.h index a9616bd6..78f74056 100644 --- a/Include/cpython/ceval.h +++ b/Include/cpython/ceval.h @@ -4,14 +4,9 @@ PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetProfileAllThreads(Py_tracefunc, PyObject *); -PyAPI_DATA(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetTraceAllThreads(Py_tracefunc, PyObject *); -PyAPI_FUNC(int) _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); -/* Helper to look up a builtin object */ -PyAPI_FUNC(PyObject *) _PyEval_GetBuiltin(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); /* Look at the current frame's (if any) code's co_flags, and turn on the corresponding compiler flags in cf->cf_flags. Return 1 if any flag was set, else return 0. */ @@ -19,11 +14,6 @@ PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(PyThreadState *tstate, struct _PyInterpreterFrame *f, int exc); -PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); -PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); - -PyAPI_FUNC(int) _PyEval_MakePendingCalls(PyThreadState *); - PyAPI_FUNC(Py_ssize_t) PyUnstable_Eval_RequestCodeExtraIndex(freefunc); // Old name -- remove when this API changes: _Py_DEPRECATED_EXTERNALLY(3.12) static inline Py_ssize_t diff --git a/Include/cpython/code.h b/Include/cpython/code.h index 03834b20..58d93fcf 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -16,57 +16,14 @@ extern "C" { #define _PY_MONITORING_EVENTS 17 /* Tables of which tools are active for each monitored event. */ -/* For 3.12 ABI compatibility this is over sized */ typedef struct _Py_LocalMonitors { - /* Only _PY_MONITORING_LOCAL_EVENTS of these are used */ - uint8_t tools[_PY_MONITORING_UNGROUPED_EVENTS]; + uint8_t tools[_PY_MONITORING_LOCAL_EVENTS]; } _Py_LocalMonitors; typedef struct _Py_GlobalMonitors { uint8_t tools[_PY_MONITORING_UNGROUPED_EVENTS]; } _Py_GlobalMonitors; -/* Each instruction in a code object is a fixed-width value, - * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG - * opcode allows for larger values but the current limit is 3 uses - * of EXTENDED_ARG (see Python/compile.c), for a maximum - * 32-bit value. This aligns with the note in Python/compile.c - * (compiler_addop_i_line) indicating that the max oparg value is - * 2**32 - 1, rather than INT_MAX. - */ - -typedef union { - uint16_t cache; - struct { - uint8_t code; - uint8_t arg; - } op; -} _Py_CODEUNIT; - - -/* These macros only remain defined for compatibility. */ -#define _Py_OPCODE(word) ((word).op.code) -#define _Py_OPARG(word) ((word).op.arg) - -static inline _Py_CODEUNIT -_py_make_codeunit(uint8_t opcode, uint8_t oparg) -{ - // No designated initialisers because of C++ compat - _Py_CODEUNIT word; - word.op.code = opcode; - word.op.arg = oparg; - return word; -} - -static inline void -_py_set_opcode(_Py_CODEUNIT *word, uint8_t opcode) -{ - word->op.code = opcode; -} - -#define _Py_MAKE_CODEUNIT(opcode, oparg) _py_make_codeunit((opcode), (oparg)) -#define _Py_SET_OPCODE(word, opcode) _py_set_opcode(&(word), (opcode)) - typedef struct { PyObject *_co_code; @@ -75,7 +32,7 @@ typedef struct { PyObject *_co_freevars; } _PyCoCached; -/* Ancilliary data structure used for instrumentation. +/* Ancillary data structure used for instrumentation. Line instrumentation creates an array of these. One entry per code unit.*/ typedef struct { @@ -83,6 +40,13 @@ typedef struct { int8_t line_delta; } _PyCoLineInstrumentationData; + +typedef struct { + int size; + int capacity; + struct _PyExecutorObject *executors[1]; +} _PyExecutorArray; + /* Main data structure used for instrumentation. * This is allocated when needed for instrumentation */ @@ -160,8 +124,9 @@ typedef struct { PyObject *co_qualname; /* unicode (qualname, for reference) */ \ PyObject *co_linetable; /* bytes object that holds location info */ \ PyObject *co_weakreflist; /* to support weakrefs to code objects */ \ + _PyExecutorArray *co_executors; /* executors from optimizer */ \ _PyCoCached *_co_cached; /* cached co_* attributes */ \ - uint64_t _co_instrumentation_version; /* current instrumentation version */ \ + uintptr_t _co_instrumentation_version; /* current instrumentation version */ \ _PyCoMonitoringData *_co_monitoring; /* Monitoring data */ \ int _co_firsttraceable; /* index of first traceable instruction */ \ /* Scratch space for extra data relating to the code object. \ @@ -202,12 +167,14 @@ struct PyCodeObject _PyCode_DEF(1); #define CO_FUTURE_GENERATOR_STOP 0x800000 #define CO_FUTURE_ANNOTATIONS 0x1000000 +#define CO_NO_MONITORING_EVENTS 0x2000000 + /* This should be defined if a future statement modifies the syntax. For example, when a keyword is added. */ #define PY_PARSER_REQUIRES_FUTURE_KEYWORD -#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ +#define CO_MAXBLOCKS 21 /* Max static block nesting within a function */ PyAPI_DATA(PyTypeObject) PyCode_Type; @@ -218,13 +185,14 @@ static inline Py_ssize_t PyCode_GetNumFree(PyCodeObject *op) { return op->co_nfreevars; } -static inline int PyCode_GetFirstFree(PyCodeObject *op) { +static inline int PyUnstable_Code_GetFirstFree(PyCodeObject *op) { assert(PyCode_Check(op)); return op->co_nlocalsplus - op->co_nfreevars; } -#define _PyCode_CODE(CO) _Py_RVALUE((_Py_CODEUNIT *)(CO)->co_code_adaptive) -#define _PyCode_NBYTES(CO) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT)) +Py_DEPRECATED(3.13) static inline int PyCode_GetFirstFree(PyCodeObject *op) { + return PyUnstable_Code_GetFirstFree(op); +} /* Unstable public interface */ PyAPI_FUNC(PyCodeObject *) PyUnstable_Code_New( diff --git a/Include/cpython/compile.h b/Include/cpython/compile.h index f5a62a8e..cfdb7080 100644 --- a/Include/cpython/compile.h +++ b/Include/cpython/compile.h @@ -19,9 +19,10 @@ #define PyCF_TYPE_COMMENTS 0x1000 #define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 #define PyCF_ALLOW_INCOMPLETE_INPUT 0x4000 +#define PyCF_OPTIMIZED_AST (0x8000 | PyCF_ONLY_AST) #define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT | \ - PyCF_ALLOW_INCOMPLETE_INPUT) + PyCF_ALLOW_INCOMPLETE_INPUT | PyCF_OPTIMIZED_AST) typedef struct { int cf_flags; /* bitmask of CO_xxx flags relevant to future */ @@ -31,28 +32,8 @@ typedef struct { #define _PyCompilerFlags_INIT \ (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} -/* source location information */ -typedef struct { - int lineno; - int end_lineno; - int col_offset; - int end_col_offset; -} _PyCompilerSrcLocation; - -#define SRC_LOCATION_FROM_AST(n) \ - (_PyCompilerSrcLocation){ \ - .lineno = (n)->lineno, \ - .end_lineno = (n)->end_lineno, \ - .col_offset = (n)->col_offset, \ - .end_col_offset = (n)->end_col_offset } - /* Future feature support */ -typedef struct { - int ff_features; /* flags set by future statements */ - _PyCompilerSrcLocation ff_location; /* location of last future statement */ -} PyFutureFeatures; - #define FUTURE_NESTED_SCOPES "nested_scopes" #define FUTURE_GENERATORS "generators" #define FUTURE_DIVISION "division" diff --git a/Include/cpython/complexobject.h b/Include/cpython/complexobject.h index b7d7283a..fbdc6a91 100644 --- a/Include/cpython/complexobject.h +++ b/Include/cpython/complexobject.h @@ -7,8 +7,7 @@ typedef struct { double imag; } Py_complex; -/* Operations on complex numbers from complexmodule.c */ - +// Operations on complex numbers. PyAPI_FUNC(Py_complex) _Py_c_sum(Py_complex, Py_complex); PyAPI_FUNC(Py_complex) _Py_c_diff(Py_complex, Py_complex); PyAPI_FUNC(Py_complex) _Py_c_neg(Py_complex); @@ -17,6 +16,7 @@ PyAPI_FUNC(Py_complex) _Py_c_quot(Py_complex, Py_complex); PyAPI_FUNC(Py_complex) _Py_c_pow(Py_complex, Py_complex); PyAPI_FUNC(double) _Py_c_abs(Py_complex); + /* Complex object interface */ /* @@ -31,14 +31,3 @@ typedef struct { PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op); - -#ifdef Py_BUILD_CORE -/* Format the object based on the format_spec, as defined in PEP 3101 - (Advanced String Formatting). */ -extern int _PyComplex_FormatAdvancedWriter( - _PyUnicodeWriter *writer, - PyObject *obj, - PyObject *format_spec, - Py_ssize_t start, - Py_ssize_t end); -#endif // Py_BUILD_CORE diff --git a/Include/cpython/context.h b/Include/cpython/context.h index 9879fc71..a3249fc2 100644 --- a/Include/cpython/context.h +++ b/Include/cpython/context.h @@ -67,10 +67,6 @@ PyAPI_FUNC(PyObject *) PyContextVar_Set(PyObject *var, PyObject *value); PyAPI_FUNC(int) PyContextVar_Reset(PyObject *var, PyObject *token); -/* This method is exposed only for CPython tests. Don not use it. */ -PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); - - #ifdef __cplusplus } #endif diff --git a/Include/cpython/critical_section.h b/Include/cpython/critical_section.h new file mode 100644 index 00000000..35db3fb6 --- /dev/null +++ b/Include/cpython/critical_section.h @@ -0,0 +1,134 @@ +#ifndef Py_CPYTHON_CRITICAL_SECTION_H +# error "this header file must not be included directly" +#endif + +// Python critical sections +// +// Conceptually, critical sections are a deadlock avoidance layer on top of +// per-object locks. These helpers, in combination with those locks, replace +// our usage of the global interpreter lock to provide thread-safety for +// otherwise thread-unsafe objects, such as dict. +// +// NOTE: These APIs are no-ops in non-free-threaded builds. +// +// Straightforward per-object locking could introduce deadlocks that were not +// present when running with the GIL. Threads may hold locks for multiple +// objects simultaneously because Python operations can nest. If threads were +// to acquire the same locks in different orders, they would deadlock. +// +// One way to avoid deadlocks is to allow threads to hold only the lock (or +// locks) for a single operation at a time (typically a single lock, but some +// operations involve two locks). When a thread begins a nested operation it +// could suspend the locks for any outer operation: before beginning the nested +// operation, the locks for the outer operation are released and when the +// nested operation completes, the locks for the outer operation are +// reacquired. +// +// To improve performance, this API uses a variation of the above scheme. +// Instead of immediately suspending locks any time a nested operation begins, +// locks are only suspended if the thread would block. This reduces the number +// of lock acquisitions and releases for nested operations, while still +// avoiding deadlocks. +// +// Additionally, the locks for any active operation are suspended around +// other potentially blocking operations, such as I/O. This is because the +// interaction between locks and blocking operations can lead to deadlocks in +// the same way as the interaction between multiple locks. +// +// Each thread's critical sections and their corresponding locks are tracked in +// a stack in `PyThreadState.critical_section`. When a thread calls +// `_PyThreadState_Detach()`, such as before a blocking I/O operation or when +// waiting to acquire a lock, the thread suspends all of its active critical +// sections, temporarily releasing the associated locks. When the thread calls +// `_PyThreadState_Attach()`, it resumes the top-most (i.e., most recent) +// critical section by reacquiring the associated lock or locks. See +// `_PyCriticalSection_Resume()`. +// +// NOTE: Only the top-most critical section is guaranteed to be active. +// Operations that need to lock two objects at once must use +// `Py_BEGIN_CRITICAL_SECTION2()`. You *CANNOT* use nested critical sections +// to lock more than one object at once, because the inner critical section +// may suspend the outer critical sections. This API does not provide a way +// to lock more than two objects at once (though it could be added later +// if actually needed). +// +// NOTE: Critical sections implicitly behave like reentrant locks because +// attempting to acquire the same lock will suspend any outer (earlier) +// critical sections. However, they are less efficient for this use case than +// purposefully designed reentrant locks. +// +// Example usage: +// Py_BEGIN_CRITICAL_SECTION(op); +// ... +// Py_END_CRITICAL_SECTION(); +// +// To lock two objects at once: +// Py_BEGIN_CRITICAL_SECTION2(op1, op2); +// ... +// Py_END_CRITICAL_SECTION2(); + +typedef struct PyCriticalSection PyCriticalSection; +typedef struct PyCriticalSection2 PyCriticalSection2; + +PyAPI_FUNC(void) +PyCriticalSection_Begin(PyCriticalSection *c, PyObject *op); + +PyAPI_FUNC(void) +PyCriticalSection_End(PyCriticalSection *c); + +PyAPI_FUNC(void) +PyCriticalSection2_Begin(PyCriticalSection2 *c, PyObject *a, PyObject *b); + +PyAPI_FUNC(void) +PyCriticalSection2_End(PyCriticalSection2 *c); + +#ifndef Py_GIL_DISABLED +# define Py_BEGIN_CRITICAL_SECTION(op) \ + { +# define Py_END_CRITICAL_SECTION() \ + } +# define Py_BEGIN_CRITICAL_SECTION2(a, b) \ + { +# define Py_END_CRITICAL_SECTION2() \ + } +#else /* !Py_GIL_DISABLED */ + +// NOTE: the contents of this struct are private and may change betweeen +// Python releases without a deprecation period. +struct PyCriticalSection { + // Tagged pointer to an outer active critical section (or 0). + uintptr_t _cs_prev; + + // Mutex used to protect critical section + PyMutex *_cs_mutex; +}; + +// A critical section protected by two mutexes. Use +// Py_BEGIN_CRITICAL_SECTION2 and Py_END_CRITICAL_SECTION2. +// NOTE: the contents of this struct are private and may change betweeen +// Python releases without a deprecation period. +struct PyCriticalSection2 { + PyCriticalSection _cs_base; + + PyMutex *_cs_mutex2; +}; + +# define Py_BEGIN_CRITICAL_SECTION(op) \ + { \ + PyCriticalSection _py_cs; \ + PyCriticalSection_Begin(&_py_cs, _PyObject_CAST(op)) + +# define Py_END_CRITICAL_SECTION() \ + PyCriticalSection_End(&_py_cs); \ + } + +# define Py_BEGIN_CRITICAL_SECTION2(a, b) \ + { \ + PyCriticalSection2 _py_cs2; \ + PyCriticalSection2_Begin(&_py_cs2, _PyObject_CAST(a), _PyObject_CAST(b)) + +# define Py_END_CRITICAL_SECTION2() \ + PyCriticalSection2_End(&_py_cs2); \ + } + +#endif diff --git a/Include/cpython/descrobject.h b/Include/cpython/descrobject.h index e2ea1b9a..bbad8b59 100644 --- a/Include/cpython/descrobject.h +++ b/Include/cpython/descrobject.h @@ -57,8 +57,6 @@ typedef struct { void *d_wrapped; /* This can be any function pointer */ } PyWrapperDescrObject; -PyAPI_DATA(PyTypeObject) _PyMethodWrapper_Type; - PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); PyAPI_FUNC(int) PyDescr_IsData(PyObject *); diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index ddada922..3fd23b93 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -17,6 +17,9 @@ typedef struct { /* Dictionary version: globally unique, value change each time the dictionary is modified */ #ifdef Py_BUILD_CORE + /* Bits 0-7 are for dict watchers. + * Bits 8-11 are for the watched mutation counter (used by tier2 optimization) + * The remaining bits (12-63) are the actual version tag. */ uint64_t ma_version_tag; #else Py_DEPRECATED(3.12) uint64_t ma_version_tag; @@ -33,60 +36,41 @@ typedef struct { } PyDictObject; PyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key, - Py_hash_t hash); -PyAPI_FUNC(PyObject *) _PyDict_GetItemWithError(PyObject *dp, PyObject *key); -PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp, - _Py_Identifier *key); + Py_hash_t hash); PyAPI_FUNC(PyObject *) _PyDict_GetItemStringWithError(PyObject *, const char *); PyAPI_FUNC(PyObject *) PyDict_SetDefault( PyObject *mp, PyObject *key, PyObject *defaultobj); -PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, - PyObject *item, Py_hash_t hash); -PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, - Py_hash_t hash); -PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, - int (*predicate)(PyObject *value)); -PyAPI_FUNC(int) _PyDict_Next( - PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); + +// Inserts `key` with a value `default_value`, if `key` is not already present +// in the dictionary. If `result` is not NULL, then the value associated +// with `key` is returned in `*result` (either the existing value, or the now +// inserted `default_value`). +// Returns: +// -1 on error +// 0 if `key` was not present and `default_value` was inserted +// 1 if `key` was present and `default_value` was not inserted +PyAPI_FUNC(int) PyDict_SetDefaultRef(PyObject *mp, PyObject *key, PyObject *default_value, PyObject **result); /* Get the number of items of a dictionary. */ static inline Py_ssize_t PyDict_GET_SIZE(PyObject *op) { PyDictObject *mp; assert(PyDict_Check(op)); mp = _Py_CAST(PyDictObject*, op); +#ifdef Py_GIL_DISABLED + return _Py_atomic_load_ssize_relaxed(&mp->ma_used); +#else return mp->ma_used; +#endif } #define PyDict_GET_SIZE(op) PyDict_GET_SIZE(_PyObject_CAST(op)) -PyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); -PyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, _Py_Identifier *); -PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); -PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); -PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); -PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *); -PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *); -#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) - -/* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, - the first occurrence of a key wins, if override is 1, the last occurrence - of a key wins, if override is 2, a KeyError with conflicting key as - argument is raised. -*/ -PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); -PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, _Py_Identifier *key, PyObject *item); +PyAPI_FUNC(int) PyDict_ContainsString(PyObject *mp, const char *key); -PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, _Py_Identifier *key); -PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); - -/* _PyDictView */ - -typedef struct { - PyObject_HEAD - PyDictObject *dv_dict; -} _PyDictViewObject; +PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); -PyAPI_FUNC(PyObject *) _PyDictView_New(PyObject *, PyTypeObject *); -PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other); +PyAPI_FUNC(int) PyDict_Pop(PyObject *dict, PyObject *key, PyObject **result); +PyAPI_FUNC(int) PyDict_PopString(PyObject *dict, const char *key, PyObject **result); +PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *dict, PyObject *key, PyObject *default_value); /* Dictionary watchers */ diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h index b70ec318..e2d89c52 100644 --- a/Include/cpython/fileobject.h +++ b/Include/cpython/fileobject.h @@ -3,7 +3,6 @@ #endif PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); -PyAPI_FUNC(char *) _Py_UniversalNewlineFgetsWithSize(char *, int, FILE*, PyObject *, size_t*); /* The std printer acts as a preliminary sys.stderr until the new io infrastructure is in place. */ @@ -15,5 +14,3 @@ typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *); PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path); PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path); PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData); - -PyAPI_FUNC(int) _PyLong_FileDescriptor_Converter(PyObject *, void *); diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index 4e19535c..dbbfbb51 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -27,3 +27,9 @@ PyAPI_FUNC(int) _PyFrame_IsEntryFrame(PyFrameObject *frame); PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + + +typedef struct { + PyObject_HEAD + PyFrameObject* frame; +} PyFrameLocalsProxyObject; diff --git a/Include/cpython/funcobject.h b/Include/cpython/funcobject.h index 6f78f586..5433ba48 100644 --- a/Include/cpython/funcobject.h +++ b/Include/cpython/funcobject.h @@ -8,7 +8,7 @@ extern "C" { #endif -#define COMMON_FIELDS(PREFIX) \ +#define _Py_COMMON_FIELDS(PREFIX) \ PyObject *PREFIX ## globals; \ PyObject *PREFIX ## builtins; \ PyObject *PREFIX ## name; \ @@ -19,7 +19,7 @@ extern "C" { PyObject *PREFIX ## closure; /* NULL or a tuple of cell objects */ typedef struct { - COMMON_FIELDS(fc_) + _Py_COMMON_FIELDS(fc_) } PyFrameConstructor; /* Function objects and code objects should not be confused with each other: @@ -35,7 +35,7 @@ typedef struct { typedef struct { PyObject_HEAD - COMMON_FIELDS(func_) + _Py_COMMON_FIELDS(func_) PyObject *func_doc; /* The __doc__ attribute, can be anything */ PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ PyObject *func_weakreflist; /* List of weak references */ @@ -60,6 +60,8 @@ typedef struct { */ } PyFunctionObject; +#undef _Py_COMMON_FIELDS + PyAPI_DATA(PyTypeObject) PyFunction_Type; #define PyFunction_Check(op) Py_IS_TYPE((op), &PyFunction_Type) @@ -79,12 +81,6 @@ PyAPI_FUNC(int) PyFunction_SetClosure(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); -PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( - PyObject *func, - PyObject *const *stack, - size_t nargsf, - PyObject *kwnames); - #define _PyFunction_CAST(func) \ (assert(PyFunction_Check(func)), _Py_CAST(PyFunctionObject*, func)) diff --git a/Include/cpython/genobject.h b/Include/cpython/genobject.h index 7856481b..49e46c27 100644 --- a/Include/cpython/genobject.h +++ b/Include/cpython/genobject.h @@ -41,9 +41,6 @@ PyAPI_DATA(PyTypeObject) PyGen_Type; PyAPI_FUNC(PyObject *) PyGen_New(PyFrameObject *); PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *, PyObject *name, PyObject *qualname); -PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); -PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); -PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); PyAPI_FUNC(PyCodeObject *) PyGen_GetCode(PyGenObject *gen); @@ -54,7 +51,6 @@ typedef struct { } PyCoroObject; PyAPI_DATA(PyTypeObject) PyCoro_Type; -PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; #define PyCoro_CheckExact(op) Py_IS_TYPE((op), &PyCoro_Type) PyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *, @@ -69,8 +65,6 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyAsyncGen_Type; PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; -PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; -PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *, PyObject *name, PyObject *qualname); diff --git a/Include/cpython/import.h b/Include/cpython/import.h index 2bca4ade..7daf0b84 100644 --- a/Include/cpython/import.h +++ b/Include/cpython/import.h @@ -4,23 +4,6 @@ PyMODINIT_FUNC PyInit__imp(void); -PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); - -PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(_Py_Identifier *name); -PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); -PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); - -PyAPI_FUNC(void) _PyImport_AcquireLock(PyInterpreterState *interp); -PyAPI_FUNC(int) _PyImport_ReleaseLock(PyInterpreterState *interp); - -PyAPI_FUNC(int) _PyImport_FixupBuiltin( - PyObject *mod, - const char *name, /* UTF-8 encoded string */ - PyObject *modules - ); -PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, - PyObject *, PyObject *); - struct _inittab { const char *name; /* ASCII encoded string */ PyObject* (*initfunc)(void); @@ -34,13 +17,9 @@ struct _frozen { const unsigned char *code; int size; int is_package; - PyObject *(*get_code)(void); }; /* Embedding apps may change this pointer to point to their favorite collection of frozen modules: */ PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; - -PyAPI_DATA(PyObject *) _PyImport_GetModuleAttr(PyObject *, PyObject *); -PyAPI_DATA(PyObject *) _PyImport_GetModuleAttrString(const char *, const char *); diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index cbae97f1..5da5ef9e 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -25,7 +25,6 @@ PyAPI_FUNC(PyStatus) PyStatus_Exit(int exitcode); PyAPI_FUNC(int) PyStatus_IsError(PyStatus err); PyAPI_FUNC(int) PyStatus_IsExit(PyStatus err); PyAPI_FUNC(int) PyStatus_Exception(PyStatus err); -PyAPI_FUNC(PyObject *) _PyErr_SetFromPyStatus(PyStatus status); /* --- PyWideStringList ------------------------------------------------ */ @@ -181,6 +180,11 @@ typedef struct PyConfig { int safe_path; int int_max_str_digits; + int cpu_count; +#ifdef Py_GIL_DISABLED + int enable_gil; +#endif + /* --- Path configuration inputs ------------ */ int pathconfig_warnings; wchar_t *program_name; @@ -205,6 +209,9 @@ typedef struct PyConfig { wchar_t *run_module; wchar_t *run_filename; + /* --- Set by Py_Main() -------------------------- */ + wchar_t *sys_path_0; + /* --- Private fields ---------------------------- */ // Install importlib? If equals to 0, importlib is not initialized at all. @@ -216,6 +223,17 @@ typedef struct PyConfig { // If non-zero, we believe we're running from a source tree. int _is_python_build; + +#ifdef Py_STATS + // If non-zero, turns on statistics gathering. + int _pystats; +#endif + +#ifdef Py_DEBUG + // If not empty, import a non-__main__ module before site.py is executed. + // PYTHON_PRESITE=package.module or -X presite=package.module + wchar_t *run_presite; +#endif } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); diff --git a/Include/cpython/interpreteridobject.h b/Include/cpython/interpreteridobject.h deleted file mode 100644 index 50765842..00000000 --- a/Include/cpython/interpreteridobject.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef Py_CPYTHON_INTERPRETERIDOBJECT_H -# error "this header file must not be included directly" -#endif - -/* Interpreter ID Object */ - -PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; - -PyAPI_FUNC(PyObject *) _PyInterpreterID_New(int64_t); -PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); -PyAPI_FUNC(PyInterpreterState *) _PyInterpreterID_LookUp(PyObject *); diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 8fa82122..49f5e8d6 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -21,9 +21,6 @@ typedef struct { Py_ssize_t allocated; } PyListObject; -PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); -PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); - /* Cast argument to PyListObject* type. */ #define _PyList_CAST(op) \ (assert(PyList_Check(op)), _Py_CAST(PyListObject*, (op))) @@ -32,7 +29,11 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) { PyListObject *list = _PyList_CAST(op); +#ifdef Py_GIL_DISABLED + return _Py_atomic_load_ssize_relaxed(&(_PyVarObject_CAST(list)->ob_size)); +#else return Py_SIZE(list); +#endif } #define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyObject_CAST(op)) @@ -41,7 +42,12 @@ static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) { static inline void PyList_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { PyListObject *list = _PyList_CAST(op); + assert(0 <= index); + assert(index < list->allocated); list->ob_item[index] = value; } #define PyList_SET_ITEM(op, index, value) \ PyList_SET_ITEM(_PyObject_CAST(op), (index), _PyObject_CAST(value)) + +PyAPI_FUNC(int) PyList_Extend(PyObject *self, PyObject *iterable); +PyAPI_FUNC(int) PyList_Clear(PyObject *self); diff --git a/Include/cpython/lock.h b/Include/cpython/lock.h new file mode 100644 index 00000000..8ee03e82 --- /dev/null +++ b/Include/cpython/lock.h @@ -0,0 +1,63 @@ +#ifndef Py_CPYTHON_LOCK_H +# error "this header file must not be included directly" +#endif + +#define _Py_UNLOCKED 0 +#define _Py_LOCKED 1 + +// A mutex that occupies one byte. The lock can be zero initialized to +// represent the unlocked state. +// +// Typical initialization: +// PyMutex m = (PyMutex){0}; +// +// Or initialize as global variables: +// static PyMutex m; +// +// Typical usage: +// PyMutex_Lock(&m); +// ... +// PyMutex_Unlock(&m); +// +// The contents of the PyMutex are not part of the public API, but are +// described to aid in understanding the implementation and debugging. Only +// the two least significant bits are used. The remaining bits are always zero: +// 0b00: unlocked +// 0b01: locked +// 0b10: unlocked and has parked threads +// 0b11: locked and has parked threads +typedef struct PyMutex { + uint8_t _bits; // (private) +} PyMutex; + +// exported function for locking the mutex +PyAPI_FUNC(void) PyMutex_Lock(PyMutex *m); + +// exported function for unlocking the mutex +PyAPI_FUNC(void) PyMutex_Unlock(PyMutex *m); + +// Locks the mutex. +// +// If the mutex is currently locked, the calling thread will be parked until +// the mutex is unlocked. If the current thread holds the GIL, then the GIL +// will be released while the thread is parked. +static inline void +_PyMutex_Lock(PyMutex *m) +{ + uint8_t expected = _Py_UNLOCKED; + if (!_Py_atomic_compare_exchange_uint8(&m->_bits, &expected, _Py_LOCKED)) { + PyMutex_Lock(m); + } +} +#define PyMutex_Lock _PyMutex_Lock + +// Unlocks the mutex. +static inline void +_PyMutex_Unlock(PyMutex *m) +{ + uint8_t expected = _Py_LOCKED; + if (!_Py_atomic_compare_exchange_uint8(&m->_bits, &expected, _Py_UNLOCKED)) { + PyMutex_Unlock(m); + } +} +#define PyMutex_Unlock _PyMutex_Unlock diff --git a/Include/cpython/longintrepr.h b/Include/cpython/longintrepr.h index 692c69ba..3246908b 100644 --- a/Include/cpython/longintrepr.h +++ b/Include/cpython/longintrepr.h @@ -62,21 +62,32 @@ typedef long stwodigits; /* signed variant of twodigits */ #define PyLong_MASK ((digit)(PyLong_BASE - 1)) /* Long integer representation. + + Long integers are made up of a number of 30- or 15-bit digits, depending on + the platform. The number of digits (ndigits) is stored in the high bits of + the lv_tag field (lvtag >> _PyLong_NON_SIZE_BITS). + The absolute value of a number is equal to - SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i) - Negative numbers are represented with ob_size < 0; - zero is represented by ob_size == 0. - In a normalized number, ob_digit[abs(ob_size)-1] (the most significant + SUM(for i=0 through ndigits-1) ob_digit[i] * 2**(PyLong_SHIFT*i) + + The sign of the value is stored in the lower 2 bits of lv_tag. + + - 0: Positive + - 1: Zero + - 2: Negative + + The third lowest bit of lv_tag is reserved for an immortality flag, but is + not currently used. + + In a normalized number, ob_digit[ndigits-1] (the most significant digit) is never zero. Also, in all cases, for all valid i, - 0 <= ob_digit[i] <= MASK. + 0 <= ob_digit[i] <= PyLong_MASK. + The allocation function takes care of allocating extra memory - so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available. + so that ob_digit[0] ... ob_digit[ndigits-1] are actually available. We always allocate memory for at least one digit, so accessing ob_digit[0] - is always safe. However, in the case ob_size == 0, the contents of + is always safe. However, in the case ndigits == 0, the contents of ob_digit[0] may be undefined. - - CAUTION: Generic code manipulating subtypes of PyVarObject has to - aware that ints abuse ob_size's sign bit. */ typedef struct _PyLongValue { @@ -89,13 +100,15 @@ struct _longobject { _PyLongValue long_value; }; -PyAPI_FUNC(PyLongObject *) _PyLong_New(Py_ssize_t); +PyAPI_FUNC(PyLongObject*) _PyLong_New(Py_ssize_t); -/* Return a copy of src. */ -PyAPI_FUNC(PyObject *) _PyLong_Copy(PyLongObject *src); +// Return a copy of src. +PyAPI_FUNC(PyObject*) _PyLong_Copy(PyLongObject *src); -PyAPI_FUNC(PyLongObject *) -_PyLong_FromDigits(int negative, Py_ssize_t digit_count, digit *digits); +PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits( + int negative, + Py_ssize_t digit_count, + digit *digits); /* Inline some internals for speed. These should be in pycore_long.h @@ -116,9 +129,10 @@ _PyLong_IsCompact(const PyLongObject* op) { static inline Py_ssize_t _PyLong_CompactValue(const PyLongObject *op) { + Py_ssize_t sign; assert(PyType_HasFeature((op)->ob_base.ob_type, Py_TPFLAGS_LONG_SUBCLASS)); assert(PyUnstable_Long_IsCompact(op)); - Py_ssize_t sign = 1 - (op->long_value.lv_tag & _PyLong_SIGN_MASK); + sign = 1 - (op->long_value.lv_tag & _PyLong_SIGN_MASK); return sign * (Py_ssize_t)op->long_value.ob_digit[0]; } diff --git a/Include/cpython/longobject.h b/Include/cpython/longobject.h index 90cc0f26..0d49242f 100644 --- a/Include/cpython/longobject.h +++ b/Include/cpython/longobject.h @@ -2,29 +2,65 @@ # error "this header file must not be included directly" #endif -PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); +PyAPI_FUNC(PyObject*) PyLong_FromUnicodeObject(PyObject *u, int base); -PyAPI_FUNC(int) _PyLong_UnsignedShort_Converter(PyObject *, void *); -PyAPI_FUNC(int) _PyLong_UnsignedInt_Converter(PyObject *, void *); -PyAPI_FUNC(int) _PyLong_UnsignedLong_Converter(PyObject *, void *); -PyAPI_FUNC(int) _PyLong_UnsignedLongLong_Converter(PyObject *, void *); -PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *); +#define Py_ASNATIVEBYTES_DEFAULTS -1 +#define Py_ASNATIVEBYTES_BIG_ENDIAN 0 +#define Py_ASNATIVEBYTES_LITTLE_ENDIAN 1 +#define Py_ASNATIVEBYTES_NATIVE_ENDIAN 3 +#define Py_ASNATIVEBYTES_UNSIGNED_BUFFER 4 +#define Py_ASNATIVEBYTES_REJECT_NEGATIVE 8 +#define Py_ASNATIVEBYTES_ALLOW_INDEX 16 -/* _PyLong_Frexp returns a double x and an exponent e such that the - true value is approximately equal to x * 2**e. e is >= 0. x is - 0.0 if and only if the input is 0 (in which case, e and x are both - zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is - possible if the number of bits doesn't fit into a Py_ssize_t, sets - OverflowError and returns -1.0 for x, 0 for e. */ -PyAPI_FUNC(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); +/* PyLong_AsNativeBytes: Copy the integer value to a native variable. + buffer points to the first byte of the variable. + n_bytes is the number of bytes available in the buffer. Pass 0 to request + the required size for the value. + flags is a bitfield of the following flags: + * 1 - little endian + * 2 - native endian + * 4 - unsigned destination (e.g. don't reject copying 255 into one byte) + * 8 - raise an exception for negative inputs + * 16 - call __index__ on non-int types + If flags is -1 (all bits set), native endian is used, value truncation + behaves most like C (allows negative inputs and allow MSB set), and non-int + objects will raise a TypeError. + Big endian mode will write the most significant byte into the address + directly referenced by buffer; little endian will write the least significant + byte into that address. -PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); -PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); + If an exception is raised, returns a negative value. + Otherwise, returns the number of bytes that are required to store the value. + To check that the full value is represented, ensure that the return value is + equal or less than n_bytes. + All n_bytes are guaranteed to be written (unless an exception occurs), and + so ignoring a positive return value is the equivalent of a downcast in C. + In cases where the full value could not be represented, the returned value + may be larger than necessary - this function is not an accurate way to + calculate the bit length of an integer object. + */ +PyAPI_FUNC(Py_ssize_t) PyLong_AsNativeBytes(PyObject* v, void* buffer, + Py_ssize_t n_bytes, int flags); -/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. - v must not be NULL, and must be a normalized long. - There are no error cases. -*/ +/* PyLong_FromNativeBytes: Create an int value from a native integer + n_bytes is the number of bytes to read from the buffer. Passing 0 will + always produce the zero int. + PyLong_FromUnsignedNativeBytes always produces a non-negative int. + flags is the same as for PyLong_AsNativeBytes, but only supports selecting + the endianness or forcing an unsigned buffer. + + Returns the int object, or NULL with an exception set. */ +PyAPI_FUNC(PyObject*) PyLong_FromNativeBytes(const void* buffer, size_t n_bytes, + int flags); +PyAPI_FUNC(PyObject*) PyLong_FromUnsignedNativeBytes(const void* buffer, + size_t n_bytes, int flags); + +PyAPI_FUNC(int) PyUnstable_Long_IsCompact(const PyLongObject* op); +PyAPI_FUNC(Py_ssize_t) PyUnstable_Long_CompactValue(const PyLongObject* op); + +// _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. +// v must not be NULL, and must be a normalized long. +// There are no error cases. PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); /* _PyLong_NumBits. Return the number of bits needed to represent the @@ -36,14 +72,6 @@ PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); */ PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); -/* _PyLong_DivmodNear. Given integers a and b, compute the nearest - integer q to the exact quotient a / b, rounding to the nearest even integer - in the case of a tie. Return (q, r), where r = a - q*b. The remainder r - will satisfy abs(r) <= abs(b)/2, with equality possible only if q is - even. -*/ -PyAPI_FUNC(PyObject *) _PyLong_DivmodNear(PyObject *, PyObject *); - /* _PyLong_FromByteArray: View the n unsigned bytes as a binary integer in base 256, and return a Python int with the same numeric value. If n is 0, the integer is 0. Else: @@ -82,19 +110,7 @@ PyAPI_FUNC(PyObject *) _PyLong_FromByteArray( */ PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, unsigned char* bytes, size_t n, - int little_endian, int is_signed); - -/* _PyLong_Format: Convert the long to a string object with given base, - appending a base prefix of 0[box] if base is 2, 8 or 16. */ -PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base); + int little_endian, int is_signed, int with_exceptions); /* For use by the gcd function in mathmodule.c */ PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); - -PyAPI_FUNC(PyObject *) _PyLong_Rshift(PyObject *, size_t); -PyAPI_FUNC(PyObject *) _PyLong_Lshift(PyObject *, size_t); - - -PyAPI_FUNC(int) PyUnstable_Long_IsCompact(const PyLongObject* op); -PyAPI_FUNC(Py_ssize_t) PyUnstable_Long_CompactValue(const PyLongObject* op); - diff --git a/Include/cpython/memoryobject.h b/Include/cpython/memoryobject.h index 3837fa8c..961161b7 100644 --- a/Include/cpython/memoryobject.h +++ b/Include/cpython/memoryobject.h @@ -2,8 +2,6 @@ # error "this header file must not be included directly" #endif -PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; - /* The structs are declared here so that macros can work, but they shouldn't be considered public. Don't access their fields directly, use the macros and functions instead! */ diff --git a/Include/cpython/modsupport.h b/Include/cpython/modsupport.h index 2259291a..d3b88f58 100644 --- a/Include/cpython/modsupport.h +++ b/Include/cpython/modsupport.h @@ -2,108 +2,25 @@ # error "this header file must not be included directly" #endif -/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier - to mean Py_ssize_t */ -#ifdef PY_SSIZE_T_CLEAN -#define _Py_VaBuildStack _Py_VaBuildStack_SizeT -#else -PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); -PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT( - PyObject **small_stack, - Py_ssize_t small_stack_len, - const char *format, - va_list va, - Py_ssize_t *p_nargs); -#endif - -PyAPI_FUNC(int) _PyArg_UnpackStack( - PyObject *const *args, - Py_ssize_t nargs, - const char *name, - Py_ssize_t min, - Py_ssize_t max, - ...); - -PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); -PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames); -PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); -#define _PyArg_NoKeywords(funcname, kwargs) \ - ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) -#define _PyArg_NoKwnames(funcname, kwnames) \ - ((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames))) -#define _PyArg_NoPositional(funcname, args) \ - ((args) == NULL || _PyArg_NoPositional((funcname), (args))) - -#define _Py_ANY_VARARGS(n) ((n) == PY_SSIZE_T_MAX) - -PyAPI_FUNC(void) _PyArg_BadArgument(const char *, const char *, const char *, PyObject *); -PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t, - Py_ssize_t, Py_ssize_t); -#define _PyArg_CheckPositional(funcname, nargs, min, max) \ - ((!_Py_ANY_VARARGS(max) && (min) <= (nargs) && (nargs) <= (max)) \ - || _PyArg_CheckPositional((funcname), (nargs), (min), (max))) - -PyAPI_FUNC(PyObject **) _Py_VaBuildStack( - PyObject **small_stack, - Py_ssize_t small_stack_len, - const char *format, - va_list va, - Py_ssize_t *p_nargs); +// A data structure that can be used to run initialization code once in a +// thread-safe manner. The C++11 equivalent is std::call_once. +typedef struct { + uint8_t v; +} _PyOnceFlag; typedef struct _PyArg_Parser { - int initialized; const char *format; const char * const *keywords; const char *fname; const char *custom_msg; - int pos; /* number of positional-only arguments */ - int min; /* minimal number of arguments */ - int max; /* maximal number of positional arguments */ - PyObject *kwtuple; /* tuple of keyword parameter names */ + _PyOnceFlag once; /* atomic one-time initialization flag */ + int is_kwtuple_owned; /* does this parser own the kwtuple object? */ + int pos; /* number of positional-only arguments */ + int min; /* minimal number of arguments */ + int max; /* maximal number of positional arguments */ + PyObject *kwtuple; /* tuple of keyword parameter names */ struct _PyArg_Parser *next; } _PyArg_Parser; -#ifdef PY_SSIZE_T_CLEAN -#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT -#define _PyArg_ParseStack _PyArg_ParseStack_SizeT -#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT -#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT -#endif - PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, struct _PyArg_Parser *, ...); -PyAPI_FUNC(int) _PyArg_ParseStack( - PyObject *const *args, - Py_ssize_t nargs, - const char *format, - ...); -PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwnames, - struct _PyArg_Parser *, - ...); -PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, - struct _PyArg_Parser *, va_list); -PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs, PyObject *kwnames, - struct _PyArg_Parser *parser, - int minpos, int maxpos, int minkw, - PyObject **buf); - -PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg( - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs, PyObject *kwnames, - struct _PyArg_Parser *parser, - int minpos, int maxpos, int minkw, - int vararg, PyObject **buf); - -#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \ - (((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \ - (minpos) <= (nargs) && (nargs) <= (maxpos) && (args) != NULL) ? (args) : \ - _PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \ - (minpos), (maxpos), (minkw), (buf))) - -PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(PyModuleDef*, int apiver); -PyAPI_FUNC(int) _PyModule_Add(PyObject *, const char *, PyObject *); diff --git a/Include/cpython/monitoring.h b/Include/cpython/monitoring.h new file mode 100644 index 00000000..797ba512 --- /dev/null +++ b/Include/cpython/monitoring.h @@ -0,0 +1,250 @@ +#ifndef Py_CPYTHON_MONITORING_H +# error "this header file must not be included directly" +#endif + +/* Local events. + * These require bytecode instrumentation */ + +#define PY_MONITORING_EVENT_PY_START 0 +#define PY_MONITORING_EVENT_PY_RESUME 1 +#define PY_MONITORING_EVENT_PY_RETURN 2 +#define PY_MONITORING_EVENT_PY_YIELD 3 +#define PY_MONITORING_EVENT_CALL 4 +#define PY_MONITORING_EVENT_LINE 5 +#define PY_MONITORING_EVENT_INSTRUCTION 6 +#define PY_MONITORING_EVENT_JUMP 7 +#define PY_MONITORING_EVENT_BRANCH 8 +#define PY_MONITORING_EVENT_STOP_ITERATION 9 + +#define PY_MONITORING_IS_INSTRUMENTED_EVENT(ev) \ + ((ev) < _PY_MONITORING_LOCAL_EVENTS) + +/* Other events, mainly exceptions */ + +#define PY_MONITORING_EVENT_RAISE 10 +#define PY_MONITORING_EVENT_EXCEPTION_HANDLED 11 +#define PY_MONITORING_EVENT_PY_UNWIND 12 +#define PY_MONITORING_EVENT_PY_THROW 13 +#define PY_MONITORING_EVENT_RERAISE 14 + + +/* Ancillary events */ + +#define PY_MONITORING_EVENT_C_RETURN 15 +#define PY_MONITORING_EVENT_C_RAISE 16 + + +typedef struct _PyMonitoringState { + uint8_t active; + uint8_t opaque; +} PyMonitoringState; + + +PyAPI_FUNC(int) +PyMonitoring_EnterScope(PyMonitoringState *state_array, uint64_t *version, + const uint8_t *event_types, Py_ssize_t length); + +PyAPI_FUNC(int) +PyMonitoring_ExitScope(void); + + +PyAPI_FUNC(int) +_PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval); + +PyAPI_FUNC(int) +_PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval); + +PyAPI_FUNC(int) +_PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject* callable, PyObject *arg0); + +PyAPI_FUNC(int) +_PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + int lineno); + +PyAPI_FUNC(int) +_PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *target_offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *target_offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval); + +PyAPI_FUNC(int) +_PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset); + +PyAPI_FUNC(int) +_PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value); + + +#define _PYMONITORING_IF_ACTIVE(STATE, X) \ + if ((STATE)->active) { \ + return (X); \ + } \ + else { \ + return 0; \ + } + +static inline int +PyMonitoring_FirePyStartEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyStartEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FirePyResumeEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyResumeEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FirePyReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyReturnEvent(state, codelike, offset, retval)); +} + +static inline int +PyMonitoring_FirePyYieldEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyYieldEvent(state, codelike, offset, retval)); +} + +static inline int +PyMonitoring_FireCallEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject* callable, PyObject *arg0) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireCallEvent(state, codelike, offset, callable, arg0)); +} + +static inline int +PyMonitoring_FireLineEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + int lineno) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireLineEvent(state, codelike, offset, lineno)); +} + +static inline int +PyMonitoring_FireJumpEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *target_offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireJumpEvent(state, codelike, offset, target_offset)); +} + +static inline int +PyMonitoring_FireBranchEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *target_offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireBranchEvent(state, codelike, offset, target_offset)); +} + +static inline int +PyMonitoring_FireCReturnEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, + PyObject *retval) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireCReturnEvent(state, codelike, offset, retval)); +} + +static inline int +PyMonitoring_FirePyThrowEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyThrowEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FireRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireRaiseEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FireReraiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireReraiseEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FireExceptionHandledEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireExceptionHandledEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FireCRaiseEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireCRaiseEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FirePyUnwindEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FirePyUnwindEvent(state, codelike, offset)); +} + +static inline int +PyMonitoring_FireStopIterationEvent(PyMonitoringState *state, PyObject *codelike, int32_t offset, PyObject *value) +{ + _PYMONITORING_IF_ACTIVE( + state, + _PyMonitoring_FireStopIterationEvent(state, codelike, offset, value)); +} + +#undef _PYMONITORING_IF_ACTIVE diff --git a/Include/cpython/object.h b/Include/cpython/object.h index ae7f780a..6cb2c40f 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -4,11 +4,7 @@ PyAPI_FUNC(void) _Py_NewReference(PyObject *op); PyAPI_FUNC(void) _Py_NewReferenceNoTotal(PyObject *op); - -#ifdef Py_TRACE_REFS -/* Py_TRACE_REFS is such major surgery that we call external routines. */ -PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -#endif +PyAPI_FUNC(void) _Py_ResurrectReference(PyObject *op); #ifdef Py_REF_DEBUG /* These are useful as debugging aids when chasing down refleaks. */ @@ -44,6 +40,10 @@ typedef struct _Py_Identifier { // Index in PyInterpreterState.unicode.ids.array. It is process-wide // unique and must be initialized to -1. Py_ssize_t index; + // Hidden PyMutex struct for non free-threaded build. + struct { + uint8_t v; + } mutex; } _Py_Identifier; #ifndef Py_BUILD_CORE @@ -56,6 +56,7 @@ typedef struct _Py_Identifier { #endif /* !Py_BUILD_CORE */ + typedef struct { /* Number implementations must check *both* arguments for proper type and implement the necessary conversions @@ -228,10 +229,11 @@ struct _typeobject { /* bitset of which type-watchers care about this type */ unsigned char tp_watched; + uint16_t tp_versions_used; }; /* This struct is used by the specializer - * It should should be treated as an opaque blob + * It should be treated as an opaque blob * by code other than the specializer and interpreter. */ struct _specialization_cache { // In order to avoid bloating the bytecode with lots of inline caches, the @@ -246,6 +248,7 @@ struct _specialization_cache { // *args nor **kwargs (as required by BINARY_SUBSCR_GETITEM): PyObject *getitem; uint32_t getitem_version; + PyObject *init; }; /* The *real* layout of a type object when allocated on the heap */ @@ -272,46 +275,21 @@ typedef struct _heaptypeobject { PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *); PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); -PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *); -PyAPI_FUNC(PyObject *) _PyObject_LookupSpecialId(PyObject *, _Py_Identifier *); -#ifndef Py_BUILD_CORE -// Backward compatibility for 3rd-party extensions -// that may be using the old name. -#define _PyObject_LookupSpecial _PyObject_LookupSpecialId -#endif -PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); -PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); -PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); -PyAPI_FUNC(PyObject *) PyType_GetModuleByDef(PyTypeObject *, PyModuleDef *); +PyAPI_FUNC(PyObject *) _PyType_LookupRef(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) PyType_GetDict(PyTypeObject *); PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); PyAPI_FUNC(void) _Py_BreakPoint(void); PyAPI_FUNC(void) _PyObject_Dump(PyObject *); -PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); - -PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); -PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, _Py_Identifier *); -PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, _Py_Identifier *, PyObject *); -/* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which - don't raise AttributeError. - - Return 1 and set *result != NULL if an attribute is found. - Return 0 and set *result == NULL if an attribute is not found; - an AttributeError is silenced. - Return -1 and set *result == NULL if an error other than AttributeError - is raised. -*/ -PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); -PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, _Py_Identifier *, PyObject **); -PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); +PyAPI_FUNC(PyObject*) _PyObject_GetAttrId(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); -PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *); +PyAPI_FUNC(void) PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *); + /* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes dict as the last parameter. */ PyAPI_FUNC(PyObject *) @@ -387,20 +365,6 @@ PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); #endif -PyAPI_DATA(PyTypeObject) _PyNone_Type; -PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; - -/* Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. - * Defined in object.c. - */ -PyAPI_DATA(int) _Py_SwappedOp[]; - -PyAPI_FUNC(void) -_PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, - size_t sizeof_block); -PyAPI_FUNC(void) -_PyObject_DebugTypeStats(FILE *out); - /* Define a pair of assertion macros: _PyObject_ASSERT_FROM(), _PyObject_ASSERT_WITH_MSG() and _PyObject_ASSERT(). @@ -449,21 +413,6 @@ PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( int line, const char *function); -/* Check if an object is consistent. For example, ensure that the reference - counter is greater than or equal to 1, and ensure that ob_type is not NULL. - - Call _PyObject_AssertFailed() if the object is inconsistent. - - If check_content is zero, only check header fields: reduce the overhead. - - The function always return 1. The return value is just here to be able to - write: - - assert(_PyObject_CheckConsistency(obj, 1)); */ -PyAPI_FUNC(int) _PyObject_CheckConsistency( - PyObject *op, - int check_content); - /* Trashcan mechanism, thanks to Christian Tismer. @@ -502,8 +451,8 @@ without deallocating anything (and so unbounded call-stack depth is avoided). When the call stack finishes unwinding again, code generated by the END macro notices this, and calls another routine to deallocate all the objects that may have been added to the list of deferred deallocations. In effect, a -chain of N deallocations is broken into (N-1)/(_PyTrash_UNWIND_LEVEL-1) pieces, -with the call stack never exceeding a depth of _PyTrash_UNWIND_LEVEL. +chain of N deallocations is broken into (N-1)/(Py_TRASHCAN_HEADROOM-1) pieces, +with the call stack never exceeding a depth of Py_TRASHCAN_HEADROOM. Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base class, we need to ensure that the trashcan is only triggered on the tp_dealloc @@ -515,49 +464,40 @@ passed as second argument to Py_TRASHCAN_BEGIN(). /* Python 3.9 private API, invoked by the macros below. */ PyAPI_FUNC(int) _PyTrash_begin(PyThreadState *tstate, PyObject *op); PyAPI_FUNC(void) _PyTrash_end(PyThreadState *tstate); + +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyThreadState *tstate, PyObject *op); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(PyThreadState *tstate); + + /* Python 3.10 private API, invoked by the Py_TRASHCAN_BEGIN(). */ -PyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc); -#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ - do { \ - PyThreadState *_tstate = NULL; \ - /* If "cond" is false, then _tstate remains NULL and the deallocator \ - * is run normally without involving the trashcan */ \ - if (cond) { \ - _tstate = _PyThreadState_UncheckedGet(); \ - if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ - break; \ - } \ - } - /* The body of the deallocator is here. */ -#define Py_TRASHCAN_END \ - if (_tstate) { \ - _PyTrash_end(_tstate); \ - } \ - } while (0); +/* To avoid raising recursion errors during dealloc trigger trashcan before we reach + * recursion limit. To avoid trashing, we don't attempt to empty the trashcan until + * we have headroom above the trigger limit */ +#define Py_TRASHCAN_HEADROOM 50 #define Py_TRASHCAN_BEGIN(op, dealloc) \ - Py_TRASHCAN_BEGIN_CONDITION((op), \ - _PyTrash_cond(_PyObject_CAST(op), (destructor)(dealloc))) +do { \ + PyThreadState *tstate = PyThreadState_Get(); \ + if (tstate->c_recursion_remaining <= Py_TRASHCAN_HEADROOM && Py_TYPE(op)->tp_dealloc == (destructor)dealloc) { \ + _PyTrash_thread_deposit_object(tstate, (PyObject *)op); \ + break; \ + } \ + tstate->c_recursion_remaining--; + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_END \ + tstate->c_recursion_remaining++; \ + if (tstate->delete_later && tstate->c_recursion_remaining > (Py_TRASHCAN_HEADROOM*2)) { \ + _PyTrash_thread_destroy_chain(tstate); \ + } \ +} while (0); -/* The following two macros, Py_TRASHCAN_SAFE_BEGIN and - * Py_TRASHCAN_SAFE_END, are deprecated since version 3.11 and - * will be removed in the future. - * Use Py_TRASHCAN_BEGIN and Py_TRASHCAN_END instead. - */ -Py_DEPRECATED(3.11) typedef int UsingDeprecatedTrashcanMacro; -#define Py_TRASHCAN_SAFE_BEGIN(op) \ - do { \ - UsingDeprecatedTrashcanMacro cond=1; \ - Py_TRASHCAN_BEGIN_CONDITION((op), cond); -#define Py_TRASHCAN_SAFE_END(op) \ - Py_TRASHCAN_END; \ - } while(0); PyAPI_FUNC(void *) PyObject_GetItemData(PyObject *obj); -PyAPI_FUNC(int) _PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg); -PyAPI_FUNC(void) _PyObject_ClearManagedDict(PyObject *obj); +PyAPI_FUNC(int) PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg); +PyAPI_FUNC(int) _PyObject_SetManagedDict(PyObject *obj, PyObject *new_dict); +PyAPI_FUNC(void) PyObject_ClearManagedDict(PyObject *obj); #define TYPE_MAX_WATCHERS 8 @@ -573,3 +513,13 @@ PyAPI_FUNC(int) PyType_Unwatch(int watcher_id, PyObject *type); * assigned, or 0 if a new tag could not be assigned. */ PyAPI_FUNC(int) PyUnstable_Type_AssignVersionTag(PyTypeObject *type); + + +typedef enum { + PyRefTracer_CREATE = 0, + PyRefTracer_DESTROY = 1, +} PyRefTracerEvent; + +typedef int (*PyRefTracer)(PyObject *, PyRefTracerEvent event, void *); +PyAPI_FUNC(int) PyRefTracer_SetTracer(PyRefTracer tracer, void *data); +PyAPI_FUNC(PyRefTracer) PyRefTracer_GetTracer(void**); diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index 5a8cdd57..e0c2ce28 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -78,14 +78,6 @@ PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); -/* Code built with Py_BUILD_CORE must include pycore_gc.h instead which - defines a different _PyGC_FINALIZED() macro. */ -#ifndef Py_BUILD_CORE - // Kept for backward compatibility with Python 3.8 -# define _PyGC_FINALIZED(o) PyObject_GC_IsFinalized(o) -#endif - - // Test if a type supports weak references PyAPI_FUNC(int) PyType_SUPPORTS_WEAKREFS(PyTypeObject *type); @@ -93,3 +85,20 @@ PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op); PyAPI_FUNC(PyObject *) PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *, size_t); + + +/* Visit all live GC-capable objects, similar to gc.get_objects(None). The + * supplied callback is called on every such object with the void* arg set + * to the supplied arg. Returning 0 from the callback ends iteration, returning + * 1 allows iteration to continue. Returning any other value may result in + * undefined behaviour. + * + * If new objects are (de)allocated by the callback it is undefined if they + * will be visited. + + * Garbage collection is disabled during operation. Explicitly running a + * collection in the callback may lead to undefined behaviour e.g. visiting the + * same objects multiple times or not at all. + */ +typedef int (*gcvisitobjects_t)(PyObject*, void*); +PyAPI_FUNC(void) PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void* arg); diff --git a/Include/cpython/pthread_stubs.h b/Include/cpython/pthread_stubs.h index d95ee03d..e542eaa5 100644 --- a/Include/cpython/pthread_stubs.h +++ b/Include/cpython/pthread_stubs.h @@ -21,13 +21,29 @@ #ifdef __wasi__ // WASI's bits/alltypes.h provides type definitions when __NEED_ is set. // The header file can be included multiple times. -# define __NEED_pthread_cond_t 1 -# define __NEED_pthread_condattr_t 1 -# define __NEED_pthread_mutex_t 1 -# define __NEED_pthread_mutexattr_t 1 -# define __NEED_pthread_key_t 1 -# define __NEED_pthread_t 1 -# define __NEED_pthread_attr_t 1 +// +// may also define these macros. +# ifndef __NEED_pthread_cond_t +# define __NEED_pthread_cond_t 1 +# endif +# ifndef __NEED_pthread_condattr_t +# define __NEED_pthread_condattr_t 1 +# endif +# ifndef __NEED_pthread_mutex_t +# define __NEED_pthread_mutex_t 1 +# endif +# ifndef __NEED_pthread_mutexattr_t +# define __NEED_pthread_mutexattr_t 1 +# endif +# ifndef __NEED_pthread_key_t +# define __NEED_pthread_key_t 1 +# endif +# ifndef __NEED_pthread_t +# define __NEED_pthread_t 1 +# endif +# ifndef __NEED_pthread_attr_t +# define __NEED_pthread_attr_t 1 +# endif # include #else typedef struct { void *__x; } pthread_cond_t; @@ -67,6 +83,7 @@ PyAPI_FUNC(int) pthread_create(pthread_t *restrict thread, void *(*start_routine)(void *), void *restrict arg); PyAPI_FUNC(int) pthread_detach(pthread_t thread); +PyAPI_FUNC(int) pthread_join(pthread_t thread, void** value_ptr); PyAPI_FUNC(pthread_t) pthread_self(void); PyAPI_FUNC(int) pthread_exit(void *retval) __attribute__ ((__noreturn__)); PyAPI_FUNC(int) pthread_attr_init(pthread_attr_t *attr); diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h new file mode 100644 index 00000000..4ecef4f5 --- /dev/null +++ b/Include/cpython/pyatomic.h @@ -0,0 +1,569 @@ +// This header provides cross-platform low-level atomic operations +// similar to C11 atomics. +// +// Operations are sequentially consistent unless they have a suffix indicating +// otherwise. If in doubt, prefer the sequentially consistent operations. +// +// The "_relaxed" suffix for load and store operations indicates the "relaxed" +// memory order. They don't provide synchronization, but (roughly speaking) +// guarantee somewhat sane behavior for races instead of undefined behavior. +// In practice, they correspond to "normal" hardware load and store +// instructions, so they are almost as inexpensive as plain loads and stores +// in C. +// +// Note that atomic read-modify-write operations like _Py_atomic_add_* return +// the previous value of the atomic variable, not the new value. +// +// See https://en.cppreference.com/w/c/atomic for more information on C11 +// atomics. +// See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2055r0.pdf +// "A Relaxed Guide to memory_order_relaxed" for discussion of and common usage +// or relaxed atomics. +// +// Functions with pseudo Python code: +// +// def _Py_atomic_load(obj): +// return obj # sequential consistency +// +// def _Py_atomic_load_relaxed(obj): +// return obj # relaxed consistency +// +// def _Py_atomic_store(obj, value): +// obj = value # sequential consistency +// +// def _Py_atomic_store_relaxed(obj, value): +// obj = value # relaxed consistency +// +// def _Py_atomic_exchange(obj, value): +// # sequential consistency +// old_obj = obj +// obj = value +// return old_obj +// +// def _Py_atomic_compare_exchange(obj, expected, desired): +// # sequential consistency +// if obj == expected: +// obj = desired +// return True +// else: +// expected = obj +// return False +// +// def _Py_atomic_add(obj, value): +// # sequential consistency +// old_obj = obj +// obj += value +// return old_obj +// +// def _Py_atomic_and(obj, value): +// # sequential consistency +// old_obj = obj +// obj &= value +// return old_obj +// +// def _Py_atomic_or(obj, value): +// # sequential consistency +// old_obj = obj +// obj |= value +// return old_obj +// +// Other functions: +// +// def _Py_atomic_load_ptr_acquire(obj): +// return obj # acquire +// +// def _Py_atomic_store_ptr_release(obj): +// return obj # release +// +// def _Py_atomic_fence_seq_cst(): +// # sequential consistency +// ... +// +// def _Py_atomic_fence_release(): +// # release +// ... + +#ifndef Py_CPYTHON_ATOMIC_H +# error "this header file must not be included directly" +#endif + +// --- _Py_atomic_add -------------------------------------------------------- +// Atomically adds `value` to `obj` and returns the previous value + +static inline int +_Py_atomic_add_int(int *obj, int value); + +static inline int8_t +_Py_atomic_add_int8(int8_t *obj, int8_t value); + +static inline int16_t +_Py_atomic_add_int16(int16_t *obj, int16_t value); + +static inline int32_t +_Py_atomic_add_int32(int32_t *obj, int32_t value); + +static inline int64_t +_Py_atomic_add_int64(int64_t *obj, int64_t value); + +static inline intptr_t +_Py_atomic_add_intptr(intptr_t *obj, intptr_t value); + +static inline unsigned int +_Py_atomic_add_uint(unsigned int *obj, unsigned int value); + +static inline uint8_t +_Py_atomic_add_uint8(uint8_t *obj, uint8_t value); + +static inline uint16_t +_Py_atomic_add_uint16(uint16_t *obj, uint16_t value); + +static inline uint32_t +_Py_atomic_add_uint32(uint32_t *obj, uint32_t value); + +static inline uint64_t +_Py_atomic_add_uint64(uint64_t *obj, uint64_t value); + +static inline uintptr_t +_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value); + +static inline Py_ssize_t +_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value); + + +// --- _Py_atomic_compare_exchange ------------------------------------------- +// Performs an atomic compare-and-exchange. +// +// - If `*obj` and `*expected` are equal, store `desired` into `*obj` +// and return 1 (success). +// - Otherwise, store the `*obj` current value into `*expected` +// and return 0 (failure). +// +// These correspond to the C11 atomic_compare_exchange_strong() function. + +static inline int +_Py_atomic_compare_exchange_int(int *obj, int *expected, int desired); + +static inline int +_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t desired); + +static inline int +_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t desired); + +static inline int +_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t desired); + +static inline int +_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t desired); + +static inline int +_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t desired); + +static inline int +_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int desired); + +static inline int +_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t desired); + +static inline int +_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t desired); + +static inline int +_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t desired); + +static inline int +_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t desired); + +static inline int +_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t desired); + +static inline int +_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t desired); + +// NOTE: `obj` and `expected` are logically `void**` types, but we use `void*` +// so that we can pass types like `PyObject**` without a cast. +static inline int +_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *value); + + +// --- _Py_atomic_exchange --------------------------------------------------- +// Atomically replaces `*obj` with `value` and returns the previous value of `*obj`. + +static inline int +_Py_atomic_exchange_int(int *obj, int value); + +static inline int8_t +_Py_atomic_exchange_int8(int8_t *obj, int8_t value); + +static inline int16_t +_Py_atomic_exchange_int16(int16_t *obj, int16_t value); + +static inline int32_t +_Py_atomic_exchange_int32(int32_t *obj, int32_t value); + +static inline int64_t +_Py_atomic_exchange_int64(int64_t *obj, int64_t value); + +static inline intptr_t +_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value); + +static inline unsigned int +_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value); + +static inline uint8_t +_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value); + +static inline uint16_t +_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value); + +static inline uint32_t +_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value); + +static inline uint64_t +_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value); + +static inline uintptr_t +_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value); + +static inline Py_ssize_t +_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value); + +static inline void * +_Py_atomic_exchange_ptr(void *obj, void *value); + + +// --- _Py_atomic_and -------------------------------------------------------- +// Performs `*obj &= value` atomically and returns the previous value of `*obj`. + +static inline uint8_t +_Py_atomic_and_uint8(uint8_t *obj, uint8_t value); + +static inline uint16_t +_Py_atomic_and_uint16(uint16_t *obj, uint16_t value); + +static inline uint32_t +_Py_atomic_and_uint32(uint32_t *obj, uint32_t value); + +static inline uint64_t +_Py_atomic_and_uint64(uint64_t *obj, uint64_t value); + +static inline uintptr_t +_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value); + + +// --- _Py_atomic_or --------------------------------------------------------- +// Performs `*obj |= value` atomically and returns the previous value of `*obj`. + +static inline uint8_t +_Py_atomic_or_uint8(uint8_t *obj, uint8_t value); + +static inline uint16_t +_Py_atomic_or_uint16(uint16_t *obj, uint16_t value); + +static inline uint32_t +_Py_atomic_or_uint32(uint32_t *obj, uint32_t value); + +static inline uint64_t +_Py_atomic_or_uint64(uint64_t *obj, uint64_t value); + +static inline uintptr_t +_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value); + + +// --- _Py_atomic_load ------------------------------------------------------- +// Atomically loads `*obj` (sequential consistency) + +static inline int +_Py_atomic_load_int(const int *obj); + +static inline int8_t +_Py_atomic_load_int8(const int8_t *obj); + +static inline int16_t +_Py_atomic_load_int16(const int16_t *obj); + +static inline int32_t +_Py_atomic_load_int32(const int32_t *obj); + +static inline int64_t +_Py_atomic_load_int64(const int64_t *obj); + +static inline intptr_t +_Py_atomic_load_intptr(const intptr_t *obj); + +static inline uint8_t +_Py_atomic_load_uint8(const uint8_t *obj); + +static inline uint16_t +_Py_atomic_load_uint16(const uint16_t *obj); + +static inline uint32_t +_Py_atomic_load_uint32(const uint32_t *obj); + +static inline uint64_t +_Py_atomic_load_uint64(const uint64_t *obj); + +static inline uintptr_t +_Py_atomic_load_uintptr(const uintptr_t *obj); + +static inline unsigned int +_Py_atomic_load_uint(const unsigned int *obj); + +static inline Py_ssize_t +_Py_atomic_load_ssize(const Py_ssize_t *obj); + +static inline void * +_Py_atomic_load_ptr(const void *obj); + + +// --- _Py_atomic_load_relaxed ----------------------------------------------- +// Loads `*obj` (relaxed consistency, i.e., no ordering) + +static inline int +_Py_atomic_load_int_relaxed(const int *obj); + +static inline int8_t +_Py_atomic_load_int8_relaxed(const int8_t *obj); + +static inline int16_t +_Py_atomic_load_int16_relaxed(const int16_t *obj); + +static inline int32_t +_Py_atomic_load_int32_relaxed(const int32_t *obj); + +static inline int64_t +_Py_atomic_load_int64_relaxed(const int64_t *obj); + +static inline intptr_t +_Py_atomic_load_intptr_relaxed(const intptr_t *obj); + +static inline uint8_t +_Py_atomic_load_uint8_relaxed(const uint8_t *obj); + +static inline uint16_t +_Py_atomic_load_uint16_relaxed(const uint16_t *obj); + +static inline uint32_t +_Py_atomic_load_uint32_relaxed(const uint32_t *obj); + +static inline uint64_t +_Py_atomic_load_uint64_relaxed(const uint64_t *obj); + +static inline uintptr_t +_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj); + +static inline unsigned int +_Py_atomic_load_uint_relaxed(const unsigned int *obj); + +static inline Py_ssize_t +_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj); + +static inline void * +_Py_atomic_load_ptr_relaxed(const void *obj); + +static inline unsigned long long +_Py_atomic_load_ullong_relaxed(const unsigned long long *obj); + +// --- _Py_atomic_store ------------------------------------------------------ +// Atomically performs `*obj = value` (sequential consistency) + +static inline void +_Py_atomic_store_int(int *obj, int value); + +static inline void +_Py_atomic_store_int8(int8_t *obj, int8_t value); + +static inline void +_Py_atomic_store_int16(int16_t *obj, int16_t value); + +static inline void +_Py_atomic_store_int32(int32_t *obj, int32_t value); + +static inline void +_Py_atomic_store_int64(int64_t *obj, int64_t value); + +static inline void +_Py_atomic_store_intptr(intptr_t *obj, intptr_t value); + +static inline void +_Py_atomic_store_uint8(uint8_t *obj, uint8_t value); + +static inline void +_Py_atomic_store_uint16(uint16_t *obj, uint16_t value); + +static inline void +_Py_atomic_store_uint32(uint32_t *obj, uint32_t value); + +static inline void +_Py_atomic_store_uint64(uint64_t *obj, uint64_t value); + +static inline void +_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value); + +static inline void +_Py_atomic_store_uint(unsigned int *obj, unsigned int value); + +static inline void +_Py_atomic_store_ptr(void *obj, void *value); + +static inline void +_Py_atomic_store_ssize(Py_ssize_t* obj, Py_ssize_t value); + + +// --- _Py_atomic_store_relaxed ---------------------------------------------- +// Stores `*obj = value` (relaxed consistency, i.e., no ordering) + +static inline void +_Py_atomic_store_int_relaxed(int *obj, int value); + +static inline void +_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value); + +static inline void +_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value); + +static inline void +_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value); + +static inline void +_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value); + +static inline void +_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value); + +static inline void +_Py_atomic_store_uint8_relaxed(uint8_t* obj, uint8_t value); + +static inline void +_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value); + +static inline void +_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value); + +static inline void +_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value); + +static inline void +_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value); + +static inline void +_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value); + +static inline void +_Py_atomic_store_ptr_relaxed(void *obj, void *value); + +static inline void +_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value); + +static inline void +_Py_atomic_store_ullong_relaxed(unsigned long long *obj, + unsigned long long value); + + +// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------ + +// Loads `*obj` (acquire operation) +static inline void * +_Py_atomic_load_ptr_acquire(const void *obj); + +static inline uintptr_t +_Py_atomic_load_uintptr_acquire(const uintptr_t *obj); + +// Stores `*obj = value` (release operation) +static inline void +_Py_atomic_store_ptr_release(void *obj, void *value); + +static inline void +_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value); + +static inline void +_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value); + +static inline void +_Py_atomic_store_int_release(int *obj, int value); + +static inline int +_Py_atomic_load_int_acquire(const int *obj); + +static inline void +_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value); + +static inline void +_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value); + +static inline uint64_t +_Py_atomic_load_uint64_acquire(const uint64_t *obj); + +static inline uint32_t +_Py_atomic_load_uint32_acquire(const uint32_t *obj); + +static inline Py_ssize_t +_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj); + + + + +// --- _Py_atomic_fence ------------------------------------------------------ + +// Sequential consistency fence. C11 fences have complex semantics. When +// possible, use the atomic operations on variables defined above, which +// generally do not require explicit use of a fence. +// See https://en.cppreference.com/w/cpp/atomic/atomic_thread_fence +static inline void _Py_atomic_fence_seq_cst(void); + +// Acquire fence +static inline void _Py_atomic_fence_acquire(void); + +// Release fence +static inline void _Py_atomic_fence_release(void); + + +#ifndef _Py_USE_GCC_BUILTIN_ATOMICS +# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +# define _Py_USE_GCC_BUILTIN_ATOMICS 1 +# elif defined(__clang__) +# if __has_builtin(__atomic_load) +# define _Py_USE_GCC_BUILTIN_ATOMICS 1 +# endif +# endif +#endif + +#if _Py_USE_GCC_BUILTIN_ATOMICS +# define Py_ATOMIC_GCC_H +# include "cpython/pyatomic_gcc.h" +# undef Py_ATOMIC_GCC_H +#elif __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) +# define Py_ATOMIC_STD_H +# include "cpython/pyatomic_std.h" +# undef Py_ATOMIC_STD_H +#elif defined(_MSC_VER) +# define Py_ATOMIC_MSC_H +# include "cpython/pyatomic_msc.h" +# undef Py_ATOMIC_MSC_H +#else +# error "no available pyatomic implementation for this platform/compiler" +#endif + + +// --- aliases --------------------------------------------------------------- + +#if SIZEOF_LONG == 8 +# define _Py_atomic_load_ulong(p) \ + _Py_atomic_load_uint64((uint64_t *)p) +# define _Py_atomic_load_ulong_relaxed(p) \ + _Py_atomic_load_uint64_relaxed((uint64_t *)p) +# define _Py_atomic_store_ulong(p, v) \ + _Py_atomic_store_uint64((uint64_t *)p, v) +# define _Py_atomic_store_ulong_relaxed(p, v) \ + _Py_atomic_store_uint64_relaxed((uint64_t *)p, v) +#elif SIZEOF_LONG == 4 +# define _Py_atomic_load_ulong(p) \ + _Py_atomic_load_uint32((uint32_t *)p) +# define _Py_atomic_load_ulong_relaxed(p) \ + _Py_atomic_load_uint32_relaxed((uint32_t *)p) +# define _Py_atomic_store_ulong(p, v) \ + _Py_atomic_store_uint32((uint32_t *)p, v) +# define _Py_atomic_store_ulong_relaxed(p, v) \ + _Py_atomic_store_uint32_relaxed((uint32_t *)p, v) +#else +# error "long must be 4 or 8 bytes in size" +#endif // SIZEOF_LONG diff --git a/Include/cpython/pyatomic_gcc.h b/Include/cpython/pyatomic_gcc.h new file mode 100644 index 00000000..ef09954d --- /dev/null +++ b/Include/cpython/pyatomic_gcc.h @@ -0,0 +1,551 @@ +// This is the implementation of Python atomic operations using GCC's built-in +// functions that match the C+11 memory model. This implementation is preferred +// for GCC compatible compilers, such as Clang. These functions are available +// in GCC 4.8+ without needing to compile with --std=c11 or --std=gnu11. + +#ifndef Py_ATOMIC_GCC_H +# error "this header file must not be included directly" +#endif + + +// --- _Py_atomic_add -------------------------------------------------------- + +static inline int +_Py_atomic_add_int(int *obj, int value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline int8_t +_Py_atomic_add_int8(int8_t *obj, int8_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline int16_t +_Py_atomic_add_int16(int16_t *obj, int16_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline int32_t +_Py_atomic_add_int32(int32_t *obj, int32_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline int64_t +_Py_atomic_add_int64(int64_t *obj, int64_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline intptr_t +_Py_atomic_add_intptr(intptr_t *obj, intptr_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline unsigned int +_Py_atomic_add_uint(unsigned int *obj, unsigned int value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint8_t +_Py_atomic_add_uint8(uint8_t *obj, uint8_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint16_t +_Py_atomic_add_uint16(uint16_t *obj, uint16_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint32_t +_Py_atomic_add_uint32(uint32_t *obj, uint32_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint64_t +_Py_atomic_add_uint64(uint64_t *obj, uint64_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline uintptr_t +_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + +static inline Py_ssize_t +_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ return __atomic_fetch_add(obj, value, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_compare_exchange ------------------------------------------- + +static inline int +_Py_atomic_compare_exchange_int(int *obj, int *expected, int desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t desired) +{ return __atomic_compare_exchange_n(obj, expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + +static inline int +_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *desired) +{ return __atomic_compare_exchange_n((void **)obj, (void **)expected, desired, 0, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_exchange --------------------------------------------------- + +static inline int +_Py_atomic_exchange_int(int *obj, int value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline int8_t +_Py_atomic_exchange_int8(int8_t *obj, int8_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline int16_t +_Py_atomic_exchange_int16(int16_t *obj, int16_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline int32_t +_Py_atomic_exchange_int32(int32_t *obj, int32_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline int64_t +_Py_atomic_exchange_int64(int64_t *obj, int64_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline intptr_t +_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline unsigned int +_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint8_t +_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint16_t +_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint32_t +_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint64_t +_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline uintptr_t +_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline Py_ssize_t +_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ return __atomic_exchange_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void * +_Py_atomic_exchange_ptr(void *obj, void *value) +{ return __atomic_exchange_n((void **)obj, value, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_and -------------------------------------------------------- + +static inline uint8_t +_Py_atomic_and_uint8(uint8_t *obj, uint8_t value) +{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint16_t +_Py_atomic_and_uint16(uint16_t *obj, uint16_t value) +{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint32_t +_Py_atomic_and_uint32(uint32_t *obj, uint32_t value) +{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint64_t +_Py_atomic_and_uint64(uint64_t *obj, uint64_t value) +{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); } + +static inline uintptr_t +_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value) +{ return __atomic_fetch_and(obj, value, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_or --------------------------------------------------------- + +static inline uint8_t +_Py_atomic_or_uint8(uint8_t *obj, uint8_t value) +{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint16_t +_Py_atomic_or_uint16(uint16_t *obj, uint16_t value) +{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint32_t +_Py_atomic_or_uint32(uint32_t *obj, uint32_t value) +{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); } + +static inline uint64_t +_Py_atomic_or_uint64(uint64_t *obj, uint64_t value) +{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); } + +static inline uintptr_t +_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value) +{ return __atomic_fetch_or(obj, value, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_load ------------------------------------------------------- + +static inline int +_Py_atomic_load_int(const int *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline int8_t +_Py_atomic_load_int8(const int8_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline int16_t +_Py_atomic_load_int16(const int16_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline int32_t +_Py_atomic_load_int32(const int32_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline int64_t +_Py_atomic_load_int64(const int64_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline intptr_t +_Py_atomic_load_intptr(const intptr_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline uint8_t +_Py_atomic_load_uint8(const uint8_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline uint16_t +_Py_atomic_load_uint16(const uint16_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline uint32_t +_Py_atomic_load_uint32(const uint32_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline uint64_t +_Py_atomic_load_uint64(const uint64_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline uintptr_t +_Py_atomic_load_uintptr(const uintptr_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline unsigned int +_Py_atomic_load_uint(const unsigned int *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline Py_ssize_t +_Py_atomic_load_ssize(const Py_ssize_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_SEQ_CST); } + +static inline void * +_Py_atomic_load_ptr(const void *obj) +{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_load_relaxed ----------------------------------------------- + +static inline int +_Py_atomic_load_int_relaxed(const int *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline int8_t +_Py_atomic_load_int8_relaxed(const int8_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline int16_t +_Py_atomic_load_int16_relaxed(const int16_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline int32_t +_Py_atomic_load_int32_relaxed(const int32_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline int64_t +_Py_atomic_load_int64_relaxed(const int64_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline intptr_t +_Py_atomic_load_intptr_relaxed(const intptr_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline uint8_t +_Py_atomic_load_uint8_relaxed(const uint8_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline uint16_t +_Py_atomic_load_uint16_relaxed(const uint16_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline uint32_t +_Py_atomic_load_uint32_relaxed(const uint32_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline uint64_t +_Py_atomic_load_uint64_relaxed(const uint64_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline uintptr_t +_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline unsigned int +_Py_atomic_load_uint_relaxed(const unsigned int *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline Py_ssize_t +_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + +static inline void * +_Py_atomic_load_ptr_relaxed(const void *obj) +{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_RELAXED); } + +static inline unsigned long long +_Py_atomic_load_ullong_relaxed(const unsigned long long *obj) +{ return __atomic_load_n(obj, __ATOMIC_RELAXED); } + + +// --- _Py_atomic_store ------------------------------------------------------ + +static inline void +_Py_atomic_store_int(int *obj, int value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_int8(int8_t *obj, int8_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_int16(int16_t *obj, int16_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_int32(int32_t *obj, int32_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_int64(int64_t *obj, int64_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_intptr(intptr_t *obj, intptr_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uint8(uint8_t *obj, uint8_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uint16(uint16_t *obj, uint16_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uint32(uint32_t *obj, uint32_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uint64(uint64_t *obj, uint64_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_uint(unsigned int *obj, unsigned int value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_ptr(void *obj, void *value) +{ __atomic_store_n((void **)obj, value, __ATOMIC_SEQ_CST); } + +static inline void +_Py_atomic_store_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ __atomic_store_n(obj, value, __ATOMIC_SEQ_CST); } + + +// --- _Py_atomic_store_relaxed ---------------------------------------------- + +static inline void +_Py_atomic_store_int_relaxed(int *obj, int value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uint8_relaxed(uint8_t *obj, uint8_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_ptr_relaxed(void *obj, void *value) +{ __atomic_store_n((void **)obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + +static inline void +_Py_atomic_store_ullong_relaxed(unsigned long long *obj, + unsigned long long value) +{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); } + + +// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------ + +static inline void * +_Py_atomic_load_ptr_acquire(const void *obj) +{ return (void *)__atomic_load_n((void * const *)obj, __ATOMIC_ACQUIRE); } + +static inline uintptr_t +_Py_atomic_load_uintptr_acquire(const uintptr_t *obj) +{ return (uintptr_t)__atomic_load_n(obj, __ATOMIC_ACQUIRE); } + +static inline void +_Py_atomic_store_ptr_release(void *obj, void *value) +{ __atomic_store_n((void **)obj, value, __ATOMIC_RELEASE); } + +static inline void +_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); } + +static inline void +_Py_atomic_store_int_release(int *obj, int value) +{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); } + +static inline void +_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); } + +static inline int +_Py_atomic_load_int_acquire(const int *obj) +{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); } + +static inline void +_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); } + +static inline void +_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value) +{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); } + +static inline uint64_t +_Py_atomic_load_uint64_acquire(const uint64_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); } + +static inline uint32_t +_Py_atomic_load_uint32_acquire(const uint32_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); } + +static inline Py_ssize_t +_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj) +{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); } + +// --- _Py_atomic_fence ------------------------------------------------------ + +static inline void +_Py_atomic_fence_seq_cst(void) +{ __atomic_thread_fence(__ATOMIC_SEQ_CST); } + + static inline void +_Py_atomic_fence_acquire(void) +{ __atomic_thread_fence(__ATOMIC_ACQUIRE); } + + static inline void +_Py_atomic_fence_release(void) +{ __atomic_thread_fence(__ATOMIC_RELEASE); } diff --git a/Include/cpython/pyatomic_msc.h b/Include/cpython/pyatomic_msc.h new file mode 100644 index 00000000..84da21bd --- /dev/null +++ b/Include/cpython/pyatomic_msc.h @@ -0,0 +1,1095 @@ +// This is the implementation of Python atomic operations for MSVC if the +// compiler does not support C11 or C++11 atomics. +// +// MSVC intrinsics are defined on char, short, long, __int64, and pointer +// types. Note that long and int are both 32-bits even on 64-bit Windows, +// so operations on int are cast to long. +// +// The volatile keyword has additional memory ordering semantics on MSVC. On +// x86 and x86-64, volatile accesses have acquire-release semantics. On ARM64, +// volatile accesses behave like C11's memory_order_relaxed. + +#ifndef Py_ATOMIC_MSC_H +# error "this header file must not be included directly" +#endif + +#include + +#define _Py_atomic_ASSERT_ARG_TYPE(TYPE) \ + Py_BUILD_ASSERT(sizeof(*obj) == sizeof(TYPE)) + + +// --- _Py_atomic_add -------------------------------------------------------- + +static inline int8_t +_Py_atomic_add_int8(int8_t *obj, int8_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(char); + return (int8_t)_InterlockedExchangeAdd8((volatile char *)obj, (char)value); +} + +static inline int16_t +_Py_atomic_add_int16(int16_t *obj, int16_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(short); + return (int16_t)_InterlockedExchangeAdd16((volatile short *)obj, (short)value); +} + +static inline int32_t +_Py_atomic_add_int32(int32_t *obj, int32_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(long); + return (int32_t)_InterlockedExchangeAdd((volatile long *)obj, (long)value); +} + +static inline int64_t +_Py_atomic_add_int64(int64_t *obj, int64_t value) +{ +#if defined(_M_X64) || defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(__int64); + return (int64_t)_InterlockedExchangeAdd64((volatile __int64 *)obj, (__int64)value); +#else + int64_t old_value = _Py_atomic_load_int64_relaxed(obj); + for (;;) { + int64_t new_value = old_value + value; + if (_Py_atomic_compare_exchange_int64(obj, &old_value, new_value)) { + return old_value; + } + } +#endif +} + + +static inline uint8_t +_Py_atomic_add_uint8(uint8_t *obj, uint8_t value) +{ + return (uint8_t)_Py_atomic_add_int8((int8_t *)obj, (int8_t)value); +} + +static inline uint16_t +_Py_atomic_add_uint16(uint16_t *obj, uint16_t value) +{ + return (uint16_t)_Py_atomic_add_int16((int16_t *)obj, (int16_t)value); +} + +static inline uint32_t +_Py_atomic_add_uint32(uint32_t *obj, uint32_t value) +{ + return (uint32_t)_Py_atomic_add_int32((int32_t *)obj, (int32_t)value); +} + +static inline int +_Py_atomic_add_int(int *obj, int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return (int)_Py_atomic_add_int32((int32_t *)obj, (int32_t)value); +} + +static inline unsigned int +_Py_atomic_add_uint(unsigned int *obj, unsigned int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return (unsigned int)_Py_atomic_add_int32((int32_t *)obj, (int32_t)value); +} + +static inline uint64_t +_Py_atomic_add_uint64(uint64_t *obj, uint64_t value) +{ + return (uint64_t)_Py_atomic_add_int64((int64_t *)obj, (int64_t)value); +} + +static inline intptr_t +_Py_atomic_add_intptr(intptr_t *obj, intptr_t value) +{ +#if SIZEOF_VOID_P == 8 + _Py_atomic_ASSERT_ARG_TYPE(int64_t); + return (intptr_t)_Py_atomic_add_int64((int64_t *)obj, (int64_t)value); +#else + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return (intptr_t)_Py_atomic_add_int32((int32_t *)obj, (int32_t)value); +#endif +} + +static inline uintptr_t +_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(intptr_t); + return (uintptr_t)_Py_atomic_add_intptr((intptr_t *)obj, (intptr_t)value); +} + +static inline Py_ssize_t +_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(intptr_t); + return (Py_ssize_t)_Py_atomic_add_intptr((intptr_t *)obj, (intptr_t)value); +} + + +// --- _Py_atomic_compare_exchange ------------------------------------------- + +static inline int +_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(char); + int8_t initial = (int8_t)_InterlockedCompareExchange8( + (volatile char *)obj, + (char)value, + (char)*expected); + if (initial == *expected) { + return 1; + } + *expected = initial; + return 0; +} + +static inline int +_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(short); + int16_t initial = (int16_t)_InterlockedCompareExchange16( + (volatile short *)obj, + (short)value, + (short)*expected); + if (initial == *expected) { + return 1; + } + *expected = initial; + return 0; +} + +static inline int +_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(long); + int32_t initial = (int32_t)_InterlockedCompareExchange( + (volatile long *)obj, + (long)value, + (long)*expected); + if (initial == *expected) { + return 1; + } + *expected = initial; + return 0; +} + +static inline int +_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(__int64); + int64_t initial = (int64_t)_InterlockedCompareExchange64( + (volatile __int64 *)obj, + (__int64)value, + (__int64)*expected); + if (initial == *expected) { + return 1; + } + *expected = initial; + return 0; +} + +static inline int +_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *value) +{ + void *initial = _InterlockedCompareExchangePointer( + (void**)obj, + value, + *(void**)expected); + if (initial == *(void**)expected) { + return 1; + } + *(void**)expected = initial; + return 0; +} + + +static inline int +_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t value) +{ + return _Py_atomic_compare_exchange_int8((int8_t *)obj, + (int8_t *)expected, + (int8_t)value); +} + +static inline int +_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t value) +{ + return _Py_atomic_compare_exchange_int16((int16_t *)obj, + (int16_t *)expected, + (int16_t)value); +} + +static inline int +_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t value) +{ + return _Py_atomic_compare_exchange_int32((int32_t *)obj, + (int32_t *)expected, + (int32_t)value); +} + +static inline int +_Py_atomic_compare_exchange_int(int *obj, int *expected, int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return _Py_atomic_compare_exchange_int32((int32_t *)obj, + (int32_t *)expected, + (int32_t)value); +} + +static inline int +_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return _Py_atomic_compare_exchange_int32((int32_t *)obj, + (int32_t *)expected, + (int32_t)value); +} + +static inline int +_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t value) +{ + return _Py_atomic_compare_exchange_int64((int64_t *)obj, + (int64_t *)expected, + (int64_t)value); +} + +static inline int +_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return _Py_atomic_compare_exchange_ptr((void**)obj, + (void**)expected, + (void*)value); +} + +static inline int +_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return _Py_atomic_compare_exchange_ptr((void**)obj, + (void**)expected, + (void*)value); +} + +static inline int +_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return _Py_atomic_compare_exchange_ptr((void**)obj, + (void**)expected, + (void*)value); +} + + +// --- _Py_atomic_exchange --------------------------------------------------- + +static inline int8_t +_Py_atomic_exchange_int8(int8_t *obj, int8_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(char); + return (int8_t)_InterlockedExchange8((volatile char *)obj, (char)value); +} + +static inline int16_t +_Py_atomic_exchange_int16(int16_t *obj, int16_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(short); + return (int16_t)_InterlockedExchange16((volatile short *)obj, (short)value); +} + +static inline int32_t +_Py_atomic_exchange_int32(int32_t *obj, int32_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(long); + return (int32_t)_InterlockedExchange((volatile long *)obj, (long)value); +} + +static inline int64_t +_Py_atomic_exchange_int64(int64_t *obj, int64_t value) +{ +#if defined(_M_X64) || defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(__int64); + return (int64_t)_InterlockedExchange64((volatile __int64 *)obj, (__int64)value); +#else + int64_t old_value = _Py_atomic_load_int64_relaxed(obj); + for (;;) { + if (_Py_atomic_compare_exchange_int64(obj, &old_value, value)) { + return old_value; + } + } +#endif +} + +static inline void* +_Py_atomic_exchange_ptr(void *obj, void *value) +{ + return (void*)_InterlockedExchangePointer((void * volatile *)obj, (void *)value); +} + + +static inline uint8_t +_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value) +{ + return (uint8_t)_Py_atomic_exchange_int8((int8_t *)obj, + (int8_t)value); +} + +static inline uint16_t +_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value) +{ + return (uint16_t)_Py_atomic_exchange_int16((int16_t *)obj, + (int16_t)value); +} + +static inline uint32_t +_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value) +{ + return (uint32_t)_Py_atomic_exchange_int32((int32_t *)obj, + (int32_t)value); +} + +static inline int +_Py_atomic_exchange_int(int *obj, int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return (int)_Py_atomic_exchange_int32((int32_t *)obj, + (int32_t)value); +} + +static inline unsigned int +_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value) +{ + _Py_atomic_ASSERT_ARG_TYPE(int32_t); + return (unsigned int)_Py_atomic_exchange_int32((int32_t *)obj, + (int32_t)value); +} + +static inline uint64_t +_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value) +{ + return (uint64_t)_Py_atomic_exchange_int64((int64_t *)obj, + (int64_t)value); +} + +static inline intptr_t +_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (intptr_t)_Py_atomic_exchange_ptr((void**)obj, + (void*)value); +} + +static inline uintptr_t +_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (uintptr_t)_Py_atomic_exchange_ptr((void**)obj, + (void*)value); +} + +static inline Py_ssize_t +_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (Py_ssize_t)_Py_atomic_exchange_ptr((void**)obj, + (void*)value); +} + + +// --- _Py_atomic_and -------------------------------------------------------- + +static inline uint8_t +_Py_atomic_and_uint8(uint8_t *obj, uint8_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(char); + return (uint8_t)_InterlockedAnd8((volatile char *)obj, (char)value); +} + +static inline uint16_t +_Py_atomic_and_uint16(uint16_t *obj, uint16_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(short); + return (uint16_t)_InterlockedAnd16((volatile short *)obj, (short)value); +} + +static inline uint32_t +_Py_atomic_and_uint32(uint32_t *obj, uint32_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(long); + return (uint32_t)_InterlockedAnd((volatile long *)obj, (long)value); +} + +static inline uint64_t +_Py_atomic_and_uint64(uint64_t *obj, uint64_t value) +{ +#if defined(_M_X64) || defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(__int64); + return (uint64_t)_InterlockedAnd64((volatile __int64 *)obj, (__int64)value); +#else + uint64_t old_value = _Py_atomic_load_uint64_relaxed(obj); + for (;;) { + uint64_t new_value = old_value & value; + if (_Py_atomic_compare_exchange_uint64(obj, &old_value, new_value)) { + return old_value; + } + } +#endif +} + +static inline uintptr_t +_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value) +{ +#if SIZEOF_VOID_P == 8 + _Py_atomic_ASSERT_ARG_TYPE(uint64_t); + return (uintptr_t)_Py_atomic_and_uint64((uint64_t *)obj, + (uint64_t)value); +#else + _Py_atomic_ASSERT_ARG_TYPE(uint32_t); + return (uintptr_t)_Py_atomic_and_uint32((uint32_t *)obj, + (uint32_t)value); +#endif +} + + +// --- _Py_atomic_or --------------------------------------------------------- + +static inline uint8_t +_Py_atomic_or_uint8(uint8_t *obj, uint8_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(char); + return (uint8_t)_InterlockedOr8((volatile char *)obj, (char)value); +} + +static inline uint16_t +_Py_atomic_or_uint16(uint16_t *obj, uint16_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(short); + return (uint16_t)_InterlockedOr16((volatile short *)obj, (short)value); +} + +static inline uint32_t +_Py_atomic_or_uint32(uint32_t *obj, uint32_t value) +{ + _Py_atomic_ASSERT_ARG_TYPE(long); + return (uint32_t)_InterlockedOr((volatile long *)obj, (long)value); +} + +static inline uint64_t +_Py_atomic_or_uint64(uint64_t *obj, uint64_t value) +{ +#if defined(_M_X64) || defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(__int64); + return (uint64_t)_InterlockedOr64((volatile __int64 *)obj, (__int64)value); +#else + uint64_t old_value = _Py_atomic_load_uint64_relaxed(obj); + for (;;) { + uint64_t new_value = old_value | value; + if (_Py_atomic_compare_exchange_uint64(obj, &old_value, new_value)) { + return old_value; + } + } +#endif +} + + +static inline uintptr_t +_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value) +{ +#if SIZEOF_VOID_P == 8 + _Py_atomic_ASSERT_ARG_TYPE(uint64_t); + return (uintptr_t)_Py_atomic_or_uint64((uint64_t *)obj, + (uint64_t)value); +#else + _Py_atomic_ASSERT_ARG_TYPE(uint32_t); + return (uintptr_t)_Py_atomic_or_uint32((uint32_t *)obj, + (uint32_t)value); +#endif +} + + +// --- _Py_atomic_load ------------------------------------------------------- + +static inline uint8_t +_Py_atomic_load_uint8(const uint8_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(volatile uint8_t *)obj; +#elif defined(_M_ARM64) + return (uint8_t)__ldar8((unsigned __int8 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint8" +#endif +} + +static inline uint16_t +_Py_atomic_load_uint16(const uint16_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(volatile uint16_t *)obj; +#elif defined(_M_ARM64) + return (uint16_t)__ldar16((unsigned __int16 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint16" +#endif +} + +static inline uint32_t +_Py_atomic_load_uint32(const uint32_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(volatile uint32_t *)obj; +#elif defined(_M_ARM64) + return (uint32_t)__ldar32((unsigned __int32 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint32" +#endif +} + +static inline uint64_t +_Py_atomic_load_uint64(const uint64_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(volatile uint64_t *)obj; +#elif defined(_M_ARM64) + return (uint64_t)__ldar64((unsigned __int64 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint64" +#endif +} + +static inline int8_t +_Py_atomic_load_int8(const int8_t *obj) +{ + return (int8_t)_Py_atomic_load_uint8((const uint8_t *)obj); +} + +static inline int16_t +_Py_atomic_load_int16(const int16_t *obj) +{ + return (int16_t)_Py_atomic_load_uint16((const uint16_t *)obj); +} + +static inline int32_t +_Py_atomic_load_int32(const int32_t *obj) +{ + return (int32_t)_Py_atomic_load_uint32((const uint32_t *)obj); +} + +static inline int +_Py_atomic_load_int(const int *obj) +{ + _Py_atomic_ASSERT_ARG_TYPE(uint32_t); + return (int)_Py_atomic_load_uint32((uint32_t *)obj); +} + +static inline unsigned int +_Py_atomic_load_uint(const unsigned int *obj) +{ + _Py_atomic_ASSERT_ARG_TYPE(uint32_t); + return (unsigned int)_Py_atomic_load_uint32((uint32_t *)obj); +} + +static inline int64_t +_Py_atomic_load_int64(const int64_t *obj) +{ + return (int64_t)_Py_atomic_load_uint64((const uint64_t *)obj); +} + +static inline void* +_Py_atomic_load_ptr(const void *obj) +{ +#if SIZEOF_VOID_P == 8 + return (void*)_Py_atomic_load_uint64((const uint64_t *)obj); +#else + return (void*)_Py_atomic_load_uint32((const uint32_t *)obj); +#endif +} + +static inline intptr_t +_Py_atomic_load_intptr(const intptr_t *obj) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (intptr_t)_Py_atomic_load_ptr((void*)obj); +} + +static inline uintptr_t +_Py_atomic_load_uintptr(const uintptr_t *obj) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (uintptr_t)_Py_atomic_load_ptr((void*)obj); +} + +static inline Py_ssize_t +_Py_atomic_load_ssize(const Py_ssize_t *obj) +{ + _Py_atomic_ASSERT_ARG_TYPE(void*); + return (Py_ssize_t)_Py_atomic_load_ptr((void*)obj); +} + + +// --- _Py_atomic_load_relaxed ----------------------------------------------- + +static inline int +_Py_atomic_load_int_relaxed(const int *obj) +{ + return *(volatile int *)obj; +} + +static inline int8_t +_Py_atomic_load_int8_relaxed(const int8_t *obj) +{ + return *(volatile int8_t *)obj; +} + +static inline int16_t +_Py_atomic_load_int16_relaxed(const int16_t *obj) +{ + return *(volatile int16_t *)obj; +} + +static inline int32_t +_Py_atomic_load_int32_relaxed(const int32_t *obj) +{ + return *(volatile int32_t *)obj; +} + +static inline int64_t +_Py_atomic_load_int64_relaxed(const int64_t *obj) +{ + return *(volatile int64_t *)obj; +} + +static inline intptr_t +_Py_atomic_load_intptr_relaxed(const intptr_t *obj) +{ + return *(volatile intptr_t *)obj; +} + +static inline uint8_t +_Py_atomic_load_uint8_relaxed(const uint8_t *obj) +{ + return *(volatile uint8_t *)obj; +} + +static inline uint16_t +_Py_atomic_load_uint16_relaxed(const uint16_t *obj) +{ + return *(volatile uint16_t *)obj; +} + +static inline uint32_t +_Py_atomic_load_uint32_relaxed(const uint32_t *obj) +{ + return *(volatile uint32_t *)obj; +} + +static inline uint64_t +_Py_atomic_load_uint64_relaxed(const uint64_t *obj) +{ + return *(volatile uint64_t *)obj; +} + +static inline uintptr_t +_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj) +{ + return *(volatile uintptr_t *)obj; +} + +static inline unsigned int +_Py_atomic_load_uint_relaxed(const unsigned int *obj) +{ + return *(volatile unsigned int *)obj; +} + +static inline Py_ssize_t +_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj) +{ + return *(volatile Py_ssize_t *)obj; +} + +static inline void* +_Py_atomic_load_ptr_relaxed(const void *obj) +{ + return *(void * volatile *)obj; +} + +static inline unsigned long long +_Py_atomic_load_ullong_relaxed(const unsigned long long *obj) +{ + return *(volatile unsigned long long *)obj; +} + + +// --- _Py_atomic_store ------------------------------------------------------ + +static inline void +_Py_atomic_store_int(int *obj, int value) +{ + (void)_Py_atomic_exchange_int(obj, value); +} + +static inline void +_Py_atomic_store_int8(int8_t *obj, int8_t value) +{ + (void)_Py_atomic_exchange_int8(obj, value); +} + +static inline void +_Py_atomic_store_int16(int16_t *obj, int16_t value) +{ + (void)_Py_atomic_exchange_int16(obj, value); +} + +static inline void +_Py_atomic_store_int32(int32_t *obj, int32_t value) +{ + (void)_Py_atomic_exchange_int32(obj, value); +} + +static inline void +_Py_atomic_store_int64(int64_t *obj, int64_t value) +{ + (void)_Py_atomic_exchange_int64(obj, value); +} + +static inline void +_Py_atomic_store_intptr(intptr_t *obj, intptr_t value) +{ + (void)_Py_atomic_exchange_intptr(obj, value); +} + +static inline void +_Py_atomic_store_uint8(uint8_t *obj, uint8_t value) +{ + (void)_Py_atomic_exchange_uint8(obj, value); +} + +static inline void +_Py_atomic_store_uint16(uint16_t *obj, uint16_t value) +{ + (void)_Py_atomic_exchange_uint16(obj, value); +} + +static inline void +_Py_atomic_store_uint32(uint32_t *obj, uint32_t value) +{ + (void)_Py_atomic_exchange_uint32(obj, value); +} + +static inline void +_Py_atomic_store_uint64(uint64_t *obj, uint64_t value) +{ + (void)_Py_atomic_exchange_uint64(obj, value); +} + +static inline void +_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value) +{ + (void)_Py_atomic_exchange_uintptr(obj, value); +} + +static inline void +_Py_atomic_store_uint(unsigned int *obj, unsigned int value) +{ + (void)_Py_atomic_exchange_uint(obj, value); +} + +static inline void +_Py_atomic_store_ptr(void *obj, void *value) +{ + (void)_Py_atomic_exchange_ptr(obj, value); +} + +static inline void +_Py_atomic_store_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + (void)_Py_atomic_exchange_ssize(obj, value); +} + + +// --- _Py_atomic_store_relaxed ---------------------------------------------- + +static inline void +_Py_atomic_store_int_relaxed(int *obj, int value) +{ + *(volatile int *)obj = value; +} + +static inline void +_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value) +{ + *(volatile int8_t *)obj = value; +} + +static inline void +_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value) +{ + *(volatile int16_t *)obj = value; +} + +static inline void +_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value) +{ + *(volatile int32_t *)obj = value; +} + +static inline void +_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value) +{ + *(volatile int64_t *)obj = value; +} + +static inline void +_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value) +{ + *(volatile intptr_t *)obj = value; +} + +static inline void +_Py_atomic_store_uint8_relaxed(uint8_t *obj, uint8_t value) +{ + *(volatile uint8_t *)obj = value; +} + +static inline void +_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value) +{ + *(volatile uint16_t *)obj = value; +} + +static inline void +_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value) +{ + *(volatile uint32_t *)obj = value; +} + +static inline void +_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value) +{ + *(volatile uint64_t *)obj = value; +} + +static inline void +_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value) +{ + *(volatile uintptr_t *)obj = value; +} + +static inline void +_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value) +{ + *(volatile unsigned int *)obj = value; +} + +static inline void +_Py_atomic_store_ptr_relaxed(void *obj, void* value) +{ + *(void * volatile *)obj = value; +} + +static inline void +_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value) +{ + *(volatile Py_ssize_t *)obj = value; +} + +static inline void +_Py_atomic_store_ullong_relaxed(unsigned long long *obj, + unsigned long long value) +{ + *(volatile unsigned long long *)obj = value; +} + + +// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------ + +static inline void * +_Py_atomic_load_ptr_acquire(const void *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(void * volatile *)obj; +#elif defined(_M_ARM64) + return (void *)__ldar64((unsigned __int64 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_ptr_acquire" +#endif +} + +static inline uintptr_t +_Py_atomic_load_uintptr_acquire(const uintptr_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(uintptr_t volatile *)obj; +#elif defined(_M_ARM64) + return (uintptr_t)__ldar64((unsigned __int64 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uintptr_acquire" +#endif +} + +static inline void +_Py_atomic_store_ptr_release(void *obj, void *value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(void * volatile *)obj = value; +#elif defined(_M_ARM64) + __stlr64((unsigned __int64 volatile *)obj, (uintptr_t)value); +#else +# error "no implementation of _Py_atomic_store_ptr_release" +#endif +} + +static inline void +_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(uintptr_t volatile *)obj = value; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(unsigned __int64); + __stlr64((unsigned __int64 volatile *)obj, (unsigned __int64)value); +#else +# error "no implementation of _Py_atomic_store_uintptr_release" +#endif +} + +static inline void +_Py_atomic_store_int_release(int *obj, int value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(int volatile *)obj = value; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(unsigned __int32); + __stlr32((unsigned __int32 volatile *)obj, (unsigned __int32)value); +#else +# error "no implementation of _Py_atomic_store_int_release" +#endif +} + +static inline void +_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(Py_ssize_t volatile *)obj = value; +#elif defined(_M_ARM64) + __stlr64((unsigned __int64 volatile *)obj, (unsigned __int64)value); +#else +# error "no implementation of _Py_atomic_store_ssize_release" +#endif +} + +static inline int +_Py_atomic_load_int_acquire(const int *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(int volatile *)obj; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(unsigned __int32); + return (int)__ldar32((unsigned __int32 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_int_acquire" +#endif +} + +static inline void +_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(uint32_t volatile *)obj = value; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(unsigned __int32); + __stlr32((unsigned __int32 volatile *)obj, (unsigned __int32)value); +#else +# error "no implementation of _Py_atomic_store_uint32_release" +#endif +} + +static inline void +_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value) +{ +#if defined(_M_X64) || defined(_M_IX86) + *(uint64_t volatile *)obj = value; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(unsigned __int64); + __stlr64((unsigned __int64 volatile *)obj, (unsigned __int64)value); +#else +# error "no implementation of _Py_atomic_store_uint64_release" +#endif +} + +static inline uint64_t +_Py_atomic_load_uint64_acquire(const uint64_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(uint64_t volatile *)obj; +#elif defined(_M_ARM64) + _Py_atomic_ASSERT_ARG_TYPE(__int64); + return (uint64_t)__ldar64((unsigned __int64 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint64_acquire" +#endif +} + +static inline uint32_t +_Py_atomic_load_uint32_acquire(const uint32_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(uint32_t volatile *)obj; +#elif defined(_M_ARM64) + return (uint32_t)__ldar32((uint32_t volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_uint32_acquire" +#endif +} + +static inline Py_ssize_t +_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj) +{ +#if defined(_M_X64) || defined(_M_IX86) + return *(Py_ssize_t volatile *)obj; +#elif defined(_M_ARM64) + return (Py_ssize_t)__ldar64((unsigned __int64 volatile *)obj); +#else +# error "no implementation of _Py_atomic_load_ssize_acquire" +#endif +} + +// --- _Py_atomic_fence ------------------------------------------------------ + + static inline void +_Py_atomic_fence_seq_cst(void) +{ +#if defined(_M_ARM64) + __dmb(_ARM64_BARRIER_ISH); +#elif defined(_M_X64) + __faststorefence(); +#elif defined(_M_IX86) + _mm_mfence(); +#else +# error "no implementation of _Py_atomic_fence_seq_cst" +#endif +} + + static inline void +_Py_atomic_fence_acquire(void) +{ +#if defined(_M_ARM64) + __dmb(_ARM64_BARRIER_ISHLD); +#elif defined(_M_X64) || defined(_M_IX86) + _ReadBarrier(); +#else +# error "no implementation of _Py_atomic_fence_acquire" +#endif +} + + static inline void +_Py_atomic_fence_release(void) +{ +#if defined(_M_ARM64) + __dmb(_ARM64_BARRIER_ISH); +#elif defined(_M_X64) || defined(_M_IX86) + _ReadWriteBarrier(); +#else +# error "no implementation of _Py_atomic_fence_release" +#endif +} + +#undef _Py_atomic_ASSERT_ARG_TYPE diff --git a/Include/cpython/pyatomic_std.h b/Include/cpython/pyatomic_std.h new file mode 100644 index 00000000..7c71e94c --- /dev/null +++ b/Include/cpython/pyatomic_std.h @@ -0,0 +1,976 @@ +// This is the implementation of Python atomic operations using C++11 or C11 +// atomics. Note that the pyatomic_gcc.h implementation is preferred for GCC +// compatible compilers, even if they support C++11 atomics. + +#ifndef Py_ATOMIC_STD_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C++" { +# include +} +# define _Py_USING_STD using namespace std +# define _Atomic(tp) atomic +#else +# define _Py_USING_STD +# include +#endif + + +// --- _Py_atomic_add -------------------------------------------------------- + +static inline int +_Py_atomic_add_int(int *obj, int value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(int)*)obj, value); +} + +static inline int8_t +_Py_atomic_add_int8(int8_t *obj, int8_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(int8_t)*)obj, value); +} + +static inline int16_t +_Py_atomic_add_int16(int16_t *obj, int16_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(int16_t)*)obj, value); +} + +static inline int32_t +_Py_atomic_add_int32(int32_t *obj, int32_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(int32_t)*)obj, value); +} + +static inline int64_t +_Py_atomic_add_int64(int64_t *obj, int64_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(int64_t)*)obj, value); +} + +static inline intptr_t +_Py_atomic_add_intptr(intptr_t *obj, intptr_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(intptr_t)*)obj, value); +} + +static inline unsigned int +_Py_atomic_add_uint(unsigned int *obj, unsigned int value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(unsigned int)*)obj, value); +} + +static inline uint8_t +_Py_atomic_add_uint8(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(uint8_t)*)obj, value); +} + +static inline uint16_t +_Py_atomic_add_uint16(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(uint16_t)*)obj, value); +} + +static inline uint32_t +_Py_atomic_add_uint32(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(uint32_t)*)obj, value); +} + +static inline uint64_t +_Py_atomic_add_uint64(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(uint64_t)*)obj, value); +} + +static inline uintptr_t +_Py_atomic_add_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(uintptr_t)*)obj, value); +} + +static inline Py_ssize_t +_Py_atomic_add_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_USING_STD; + return atomic_fetch_add((_Atomic(Py_ssize_t)*)obj, value); +} + + +// --- _Py_atomic_compare_exchange ------------------------------------------- + +static inline int +_Py_atomic_compare_exchange_int(int *obj, int *expected, int desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(int)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_int8(int8_t *obj, int8_t *expected, int8_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(int8_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_int16(int16_t *obj, int16_t *expected, int16_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(int16_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_int32(int32_t *obj, int32_t *expected, int32_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(int32_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_int64(int64_t *obj, int64_t *expected, int64_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(int64_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_intptr(intptr_t *obj, intptr_t *expected, intptr_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(intptr_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uint(unsigned int *obj, unsigned int *expected, unsigned int desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(unsigned int)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uint8(uint8_t *obj, uint8_t *expected, uint8_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(uint8_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uint16(uint16_t *obj, uint16_t *expected, uint16_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(uint16_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uint32(uint32_t *obj, uint32_t *expected, uint32_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(uint32_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uint64(uint64_t *obj, uint64_t *expected, uint64_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(uint64_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_uintptr(uintptr_t *obj, uintptr_t *expected, uintptr_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(uintptr_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_ssize(Py_ssize_t *obj, Py_ssize_t *expected, Py_ssize_t desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(Py_ssize_t)*)obj, + expected, desired); +} + +static inline int +_Py_atomic_compare_exchange_ptr(void *obj, void *expected, void *desired) +{ + _Py_USING_STD; + return atomic_compare_exchange_strong((_Atomic(void *)*)obj, + (void **)expected, desired); +} + + +// --- _Py_atomic_exchange --------------------------------------------------- + +static inline int +_Py_atomic_exchange_int(int *obj, int value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(int)*)obj, value); +} + +static inline int8_t +_Py_atomic_exchange_int8(int8_t *obj, int8_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(int8_t)*)obj, value); +} + +static inline int16_t +_Py_atomic_exchange_int16(int16_t *obj, int16_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(int16_t)*)obj, value); +} + +static inline int32_t +_Py_atomic_exchange_int32(int32_t *obj, int32_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(int32_t)*)obj, value); +} + +static inline int64_t +_Py_atomic_exchange_int64(int64_t *obj, int64_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(int64_t)*)obj, value); +} + +static inline intptr_t +_Py_atomic_exchange_intptr(intptr_t *obj, intptr_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(intptr_t)*)obj, value); +} + +static inline unsigned int +_Py_atomic_exchange_uint(unsigned int *obj, unsigned int value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(unsigned int)*)obj, value); +} + +static inline uint8_t +_Py_atomic_exchange_uint8(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(uint8_t)*)obj, value); +} + +static inline uint16_t +_Py_atomic_exchange_uint16(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(uint16_t)*)obj, value); +} + +static inline uint32_t +_Py_atomic_exchange_uint32(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(uint32_t)*)obj, value); +} + +static inline uint64_t +_Py_atomic_exchange_uint64(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(uint64_t)*)obj, value); +} + +static inline uintptr_t +_Py_atomic_exchange_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(uintptr_t)*)obj, value); +} + +static inline Py_ssize_t +_Py_atomic_exchange_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(Py_ssize_t)*)obj, value); +} + +static inline void* +_Py_atomic_exchange_ptr(void *obj, void *value) +{ + _Py_USING_STD; + return atomic_exchange((_Atomic(void *)*)obj, value); +} + + +// --- _Py_atomic_and -------------------------------------------------------- + +static inline uint8_t +_Py_atomic_and_uint8(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + return atomic_fetch_and((_Atomic(uint8_t)*)obj, value); +} + +static inline uint16_t +_Py_atomic_and_uint16(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + return atomic_fetch_and((_Atomic(uint16_t)*)obj, value); +} + +static inline uint32_t +_Py_atomic_and_uint32(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + return atomic_fetch_and((_Atomic(uint32_t)*)obj, value); +} + +static inline uint64_t +_Py_atomic_and_uint64(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + return atomic_fetch_and((_Atomic(uint64_t)*)obj, value); +} + +static inline uintptr_t +_Py_atomic_and_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + return atomic_fetch_and((_Atomic(uintptr_t)*)obj, value); +} + + +// --- _Py_atomic_or --------------------------------------------------------- + +static inline uint8_t +_Py_atomic_or_uint8(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + return atomic_fetch_or((_Atomic(uint8_t)*)obj, value); +} + +static inline uint16_t +_Py_atomic_or_uint16(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + return atomic_fetch_or((_Atomic(uint16_t)*)obj, value); +} + +static inline uint32_t +_Py_atomic_or_uint32(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + return atomic_fetch_or((_Atomic(uint32_t)*)obj, value); +} + +static inline uint64_t +_Py_atomic_or_uint64(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + return atomic_fetch_or((_Atomic(uint64_t)*)obj, value); +} + +static inline uintptr_t +_Py_atomic_or_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + return atomic_fetch_or((_Atomic(uintptr_t)*)obj, value); +} + + +// --- _Py_atomic_load ------------------------------------------------------- + +static inline int +_Py_atomic_load_int(const int *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(int)*)obj); +} + +static inline int8_t +_Py_atomic_load_int8(const int8_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(int8_t)*)obj); +} + +static inline int16_t +_Py_atomic_load_int16(const int16_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(int16_t)*)obj); +} + +static inline int32_t +_Py_atomic_load_int32(const int32_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(int32_t)*)obj); +} + +static inline int64_t +_Py_atomic_load_int64(const int64_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(int64_t)*)obj); +} + +static inline intptr_t +_Py_atomic_load_intptr(const intptr_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(intptr_t)*)obj); +} + +static inline uint8_t +_Py_atomic_load_uint8(const uint8_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(uint8_t)*)obj); +} + +static inline uint16_t +_Py_atomic_load_uint16(const uint16_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(uint32_t)*)obj); +} + +static inline uint32_t +_Py_atomic_load_uint32(const uint32_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(uint32_t)*)obj); +} + +static inline uint64_t +_Py_atomic_load_uint64(const uint64_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(uint64_t)*)obj); +} + +static inline uintptr_t +_Py_atomic_load_uintptr(const uintptr_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(uintptr_t)*)obj); +} + +static inline unsigned int +_Py_atomic_load_uint(const unsigned int *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(unsigned int)*)obj); +} + +static inline Py_ssize_t +_Py_atomic_load_ssize(const Py_ssize_t *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(Py_ssize_t)*)obj); +} + +static inline void* +_Py_atomic_load_ptr(const void *obj) +{ + _Py_USING_STD; + return atomic_load((const _Atomic(void*)*)obj); +} + + +// --- _Py_atomic_load_relaxed ----------------------------------------------- + +static inline int +_Py_atomic_load_int_relaxed(const int *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int)*)obj, + memory_order_relaxed); +} + +static inline int8_t +_Py_atomic_load_int8_relaxed(const int8_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int8_t)*)obj, + memory_order_relaxed); +} + +static inline int16_t +_Py_atomic_load_int16_relaxed(const int16_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int16_t)*)obj, + memory_order_relaxed); +} + +static inline int32_t +_Py_atomic_load_int32_relaxed(const int32_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int32_t)*)obj, + memory_order_relaxed); +} + +static inline int64_t +_Py_atomic_load_int64_relaxed(const int64_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int64_t)*)obj, + memory_order_relaxed); +} + +static inline intptr_t +_Py_atomic_load_intptr_relaxed(const intptr_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(intptr_t)*)obj, + memory_order_relaxed); +} + +static inline uint8_t +_Py_atomic_load_uint8_relaxed(const uint8_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint8_t)*)obj, + memory_order_relaxed); +} + +static inline uint16_t +_Py_atomic_load_uint16_relaxed(const uint16_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint16_t)*)obj, + memory_order_relaxed); +} + +static inline uint32_t +_Py_atomic_load_uint32_relaxed(const uint32_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint32_t)*)obj, + memory_order_relaxed); +} + +static inline uint64_t +_Py_atomic_load_uint64_relaxed(const uint64_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint64_t)*)obj, + memory_order_relaxed); +} + +static inline uintptr_t +_Py_atomic_load_uintptr_relaxed(const uintptr_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uintptr_t)*)obj, + memory_order_relaxed); +} + +static inline unsigned int +_Py_atomic_load_uint_relaxed(const unsigned int *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(unsigned int)*)obj, + memory_order_relaxed); +} + +static inline Py_ssize_t +_Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(Py_ssize_t)*)obj, + memory_order_relaxed); +} + +static inline void* +_Py_atomic_load_ptr_relaxed(const void *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(void*)*)obj, + memory_order_relaxed); +} + +static inline unsigned long long +_Py_atomic_load_ullong_relaxed(const unsigned long long *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(unsigned long long)*)obj, + memory_order_relaxed); +} + + +// --- _Py_atomic_store ------------------------------------------------------ + +static inline void +_Py_atomic_store_int(int *obj, int value) +{ + _Py_USING_STD; + atomic_store((_Atomic(int)*)obj, value); +} + +static inline void +_Py_atomic_store_int8(int8_t *obj, int8_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(int8_t)*)obj, value); +} + +static inline void +_Py_atomic_store_int16(int16_t *obj, int16_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(int16_t)*)obj, value); +} + +static inline void +_Py_atomic_store_int32(int32_t *obj, int32_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(int32_t)*)obj, value); +} + +static inline void +_Py_atomic_store_int64(int64_t *obj, int64_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(int64_t)*)obj, value); +} + +static inline void +_Py_atomic_store_intptr(intptr_t *obj, intptr_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(intptr_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uint8(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(uint8_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uint16(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(uint16_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uint32(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(uint32_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uint64(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(uint64_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uintptr(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(uintptr_t)*)obj, value); +} + +static inline void +_Py_atomic_store_uint(unsigned int *obj, unsigned int value) +{ + _Py_USING_STD; + atomic_store((_Atomic(unsigned int)*)obj, value); +} + +static inline void +_Py_atomic_store_ptr(void *obj, void *value) +{ + _Py_USING_STD; + atomic_store((_Atomic(void*)*)obj, value); +} + +static inline void +_Py_atomic_store_ssize(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_USING_STD; + atomic_store((_Atomic(Py_ssize_t)*)obj, value); +} + + +// --- _Py_atomic_store_relaxed ---------------------------------------------- + +static inline void +_Py_atomic_store_int_relaxed(int *obj, int value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_int8_relaxed(int8_t *obj, int8_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int8_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_int16_relaxed(int16_t *obj, int16_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int16_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_int32_relaxed(int32_t *obj, int32_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int32_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_int64_relaxed(int64_t *obj, int64_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int64_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_intptr_relaxed(intptr_t *obj, intptr_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(intptr_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uint8_relaxed(uint8_t *obj, uint8_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint8_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uint16_relaxed(uint16_t *obj, uint16_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint16_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uint32_relaxed(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint32_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uint64_relaxed(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint64_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uintptr_relaxed(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uintptr_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_uint_relaxed(unsigned int *obj, unsigned int value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(unsigned int)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_ptr_relaxed(void *obj, void *value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(void*)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(Py_ssize_t)*)obj, value, + memory_order_relaxed); +} + +static inline void +_Py_atomic_store_ullong_relaxed(unsigned long long *obj, + unsigned long long value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(unsigned long long)*)obj, value, + memory_order_relaxed); +} + + +// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------ + +static inline void * +_Py_atomic_load_ptr_acquire(const void *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(void*)*)obj, + memory_order_acquire); +} + +static inline uintptr_t +_Py_atomic_load_uintptr_acquire(const uintptr_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uintptr_t)*)obj, + memory_order_acquire); +} + +static inline void +_Py_atomic_store_ptr_release(void *obj, void *value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(void*)*)obj, value, + memory_order_release); +} + +static inline void +_Py_atomic_store_uintptr_release(uintptr_t *obj, uintptr_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uintptr_t)*)obj, value, + memory_order_release); +} + +static inline void +_Py_atomic_store_int_release(int *obj, int value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(int)*)obj, value, + memory_order_release); +} + +static inline void +_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(Py_ssize_t)*)obj, value, + memory_order_release); +} + +static inline int +_Py_atomic_load_int_acquire(const int *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(int)*)obj, + memory_order_acquire); +} + +static inline void +_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint32_t)*)obj, value, + memory_order_release); +} + +static inline void +_Py_atomic_store_uint64_release(uint64_t *obj, uint64_t value) +{ + _Py_USING_STD; + atomic_store_explicit((_Atomic(uint64_t)*)obj, value, + memory_order_release); +} + +static inline uint64_t +_Py_atomic_load_uint64_acquire(const uint64_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint64_t)*)obj, + memory_order_acquire); +} + +static inline uint32_t +_Py_atomic_load_uint32_acquire(const uint32_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(uint32_t)*)obj, + memory_order_acquire); +} + +static inline Py_ssize_t +_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj) +{ + _Py_USING_STD; + return atomic_load_explicit((const _Atomic(Py_ssize_t)*)obj, + memory_order_acquire); +} + + +// --- _Py_atomic_fence ------------------------------------------------------ + + static inline void +_Py_atomic_fence_seq_cst(void) +{ + _Py_USING_STD; + atomic_thread_fence(memory_order_seq_cst); +} + + static inline void +_Py_atomic_fence_acquire(void) +{ + _Py_USING_STD; + atomic_thread_fence(memory_order_acquire); +} + + static inline void +_Py_atomic_fence_release(void) +{ + _Py_USING_STD; + atomic_thread_fence(memory_order_release); +} diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 156665cb..b36b4681 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -88,42 +88,19 @@ typedef PyOSErrorObject PyEnvironmentErrorObject; typedef PyOSErrorObject PyWindowsErrorObject; #endif -/* Error handling definitions */ - -PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); -PyAPI_FUNC(_PyErr_StackItem*) _PyErr_GetTopmostException(PyThreadState *tstate); -PyAPI_FUNC(PyObject*) _PyErr_GetHandledException(PyThreadState *); -PyAPI_FUNC(void) _PyErr_SetHandledException(PyThreadState *, PyObject *); -PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); - /* Context manipulation (PEP 3134) */ -Py_DEPRECATED(3.12) PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(void) _PyErr_ChainExceptions1(PyObject *); -/* Like PyErr_Format(), but saves current exception as __context__ and - __cause__. - */ -PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause( - PyObject *exception, - const char *format, /* ASCII-encoded string */ - ... - ); - /* In exceptions.c */ -PyAPI_FUNC(int) _PyException_AddNote( - PyObject *exc, - PyObject *note); - PyAPI_FUNC(PyObject*) PyUnstable_Exc_PrepReraiseStar( PyObject *orig, PyObject *excs); /* In signalmodule.c */ -int PySignal_SetWakeupFd(int fd); -PyAPI_FUNC(int) _PyErr_CheckSignals(void); +PyAPI_FUNC(int) PySignal_SetWakeupFd(int fd); /* Support for adding program text to SyntaxErrors */ @@ -143,36 +120,12 @@ PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( PyObject *filename, int lineno); -PyAPI_FUNC(PyObject *) _PyErr_ProgramDecodedTextObject( - PyObject *filename, - int lineno, - const char* encoding); - -PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create( - PyObject *object, - Py_ssize_t start, - Py_ssize_t end, - const char *reason /* UTF-8 encoded string */ - ); - -PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( - const char *err_msg, - PyObject *obj); - PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFunc( const char *func, const char *message); -PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFormat( - const char *func, - const char *format, - ...); - -extern PyObject *_PyErr_SetImportErrorWithNameFrom( - PyObject *, - PyObject *, - PyObject *, - PyObject *); +PyAPI_FUNC(void) PyErr_FormatUnraisable(const char *, ...); +PyAPI_DATA(PyObject *) PyExc_PythonFinalizationError; #define Py_FatalError(message) _Py_FatalErrorFunc(__func__, (message)) diff --git a/Include/cpython/pyframe.h b/Include/cpython/pyframe.h index 0e2afff9..eeafbb17 100644 --- a/Include/cpython/pyframe.h +++ b/Include/cpython/pyframe.h @@ -3,8 +3,10 @@ #endif PyAPI_DATA(PyTypeObject) PyFrame_Type; +PyAPI_DATA(PyTypeObject) PyFrameLocalsProxy_Type; #define PyFrame_Check(op) Py_IS_TYPE((op), &PyFrame_Type) +#define PyFrameLocalsProxy_Check(op) Py_IS_TYPE((op), &PyFrameLocalsProxy_Type) PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); PyAPI_FUNC(PyObject *) PyFrame_GetLocals(PyFrameObject *frame); @@ -33,3 +35,11 @@ PyAPI_FUNC(int) PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame /* Returns the currently executing line number, or -1 if there is no line number. * Does not raise an exception. */ PyAPI_FUNC(int) PyUnstable_InterpreterFrame_GetLine(struct _PyInterpreterFrame *frame); + +#define PyUnstable_EXECUTABLE_KIND_SKIP 0 +#define PyUnstable_EXECUTABLE_KIND_PY_FUNCTION 1 +#define PyUnstable_EXECUTABLE_KIND_BUILTIN_FUNCTION 3 +#define PyUnstable_EXECUTABLE_KIND_METHOD_DESCRIPTOR 4 +#define PyUnstable_EXECUTABLE_KINDS 5 + +PyAPI_DATA(const PyTypeObject *) const PyUnstable_ExecutableKinds[PyUnstable_EXECUTABLE_KINDS+1]; diff --git a/Include/cpython/pyhash.h b/Include/cpython/pyhash.h new file mode 100644 index 00000000..825c034a --- /dev/null +++ b/Include/cpython/pyhash.h @@ -0,0 +1,47 @@ +#ifndef Py_CPYTHON_HASH_H +# error "this header file must not be included directly" +#endif + +/* Prime multiplier used in string and various other hashes. */ +#define PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ + +/* Parameters used for the numeric hash implementation. See notes for + _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on + reduction modulo the prime 2**_PyHASH_BITS - 1. */ + +#if SIZEOF_VOID_P >= 8 +# define PyHASH_BITS 61 +#else +# define PyHASH_BITS 31 +#endif + +#define PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) +#define PyHASH_INF 314159 +#define PyHASH_IMAG PyHASH_MULTIPLIER + +/* Aliases kept for backward compatibility with Python 3.12 */ +#define _PyHASH_MULTIPLIER PyHASH_MULTIPLIER +#define _PyHASH_BITS PyHASH_BITS +#define _PyHASH_MODULUS PyHASH_MODULUS +#define _PyHASH_INF PyHASH_INF +#define _PyHASH_IMAG PyHASH_IMAG + +/* Helpers for hash functions */ +PyAPI_FUNC(Py_hash_t) _Py_HashDouble(PyObject *, double); + +// Kept for backward compatibility +#define _Py_HashPointer Py_HashPointer + + +/* hash function definition */ +typedef struct { + Py_hash_t (*const hash)(const void *, Py_ssize_t); + const char *name; + const int hash_bits; + const int seed_bits; +} PyHash_FuncDef; + +PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); + +PyAPI_FUNC(Py_hash_t) Py_HashPointer(const void *ptr); +PyAPI_FUNC(Py_hash_t) PyObject_GenericHash(PyObject *); diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 4daea33b..e46dfe59 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -6,13 +6,6 @@ in all builds of Python */ PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv); -/* Only used by applications that embed the interpreter and need to - * override the standard encoding determination mechanism - */ -Py_DEPRECATED(3.11) PyAPI_FUNC(int) Py_SetStandardStreamEncoding( - const char *encoding, - const char *errors); - /* PEP 432 Multi-phase initialization API (Private while provisional!) */ PyAPI_FUNC(PyStatus) Py_PreInitialize( @@ -26,13 +19,13 @@ PyAPI_FUNC(PyStatus) Py_PreInitializeFromArgs( Py_ssize_t argc, wchar_t **argv); -PyAPI_FUNC(int) _Py_IsCoreInitialized(void); - /* Initialization and finalization */ PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( const PyConfig *config); + +// Python 3.8 provisional API (PEP 587) PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); PyAPI_FUNC(int) Py_RunMain(void); @@ -40,28 +33,7 @@ PyAPI_FUNC(int) Py_RunMain(void); PyAPI_FUNC(void) _Py_NO_RETURN Py_ExitStatusException(PyStatus err); -/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ -PyAPI_FUNC(void) _Py_RestoreSignals(void); - PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); -PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename); - -Py_DEPRECATED(3.11) PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *); - -PyAPI_FUNC(const char *) _Py_gitidentifier(void); -PyAPI_FUNC(const char *) _Py_gitversion(void); - -PyAPI_FUNC(int) _Py_IsFinalizing(void); -PyAPI_FUNC(int) _Py_IsInterpreterFinalizing(PyInterpreterState *interp); - -/* Random */ -PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size); -PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); - -/* Legacy locale support */ -PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn); -PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn); -PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); /* --- PyInterpreterConfig ------------------------------------ */ @@ -91,6 +63,15 @@ typedef struct { .gil = PyInterpreterConfig_OWN_GIL, \ } +// gh-117649: The free-threaded build does not currently support single-phase +// init extensions in subinterpreters. For now, we ensure that +// `check_multi_interp_extensions` is always `1`, even in the legacy config. +#ifdef Py_GIL_DISABLED +# define _PyInterpreterConfig_LEGACY_CHECK_MULTI_INTERP_EXTENSIONS 1 +#else +# define _PyInterpreterConfig_LEGACY_CHECK_MULTI_INTERP_EXTENSIONS 0 +#endif + #define _PyInterpreterConfig_LEGACY_INIT \ { \ .use_main_obmalloc = 1, \ @@ -98,7 +79,7 @@ typedef struct { .allow_exec = 1, \ .allow_threads = 1, \ .allow_daemon_threads = 1, \ - .check_multi_interp_extensions = 0, \ + .check_multi_interp_extensions = _PyInterpreterConfig_LEGACY_CHECK_MULTI_INTERP_EXTENSIONS, \ .gil = PyInterpreterConfig_SHARED_GIL, \ } @@ -107,5 +88,5 @@ PyAPI_FUNC(PyStatus) Py_NewInterpreterFromConfig( const PyInterpreterConfig *config); typedef void (*atexit_datacallbackfunc)(void *); -PyAPI_FUNC(int) _Py_AtExit( +PyAPI_FUNC(int) PyUnstable_AtExit( PyInterpreterState *, atexit_datacallbackfunc, void *); diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index d1054d76..76b3221f 100644 --- a/Include/cpython/pymem.h +++ b/Include/cpython/pymem.h @@ -2,24 +2,6 @@ # error "this header file must not be included directly" #endif -PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); -PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); -PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); -PyAPI_FUNC(void) PyMem_RawFree(void *ptr); - -/* Try to get the allocators name set by _PyMem_SetupAllocators(). */ -PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); - -/* strdup() using PyMem_RawMalloc() */ -PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); - -/* strdup() using PyMem_Malloc() */ -PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); - -/* wcsdup() using PyMem_RawMalloc() */ -PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str); - - typedef enum { /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ PYMEM_DOMAIN_RAW, @@ -41,6 +23,10 @@ typedef enum { PYMEM_ALLOCATOR_PYMALLOC = 5, PYMEM_ALLOCATOR_PYMALLOC_DEBUG = 6, #endif +#ifdef WITH_MIMALLOC + PYMEM_ALLOCATOR_MIMALLOC = 7, + PYMEM_ALLOCATOR_MIMALLOC_DEBUG = 8, +#endif } PyMemAllocatorName; diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 628f2e09..f005729f 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -3,45 +3,12 @@ #endif -/* -Runtime Feature Flags - -Each flag indicate whether or not a specific runtime feature -is available in a given context. For example, forking the process -might not be allowed in the current interpreter (i.e. os.fork() would fail). -*/ - -/* Set if the interpreter share obmalloc runtime state - with the main interpreter. */ -#define Py_RTFLAGS_USE_MAIN_OBMALLOC (1UL << 5) - -/* Set if import should check a module for subinterpreter support. */ -#define Py_RTFLAGS_MULTI_INTERP_EXTENSIONS (1UL << 8) - -/* Set if threads are allowed. */ -#define Py_RTFLAGS_THREADS (1UL << 10) - -/* Set if daemon threads are allowed. */ -#define Py_RTFLAGS_DAEMON_THREADS (1UL << 11) - -/* Set if os.fork() is allowed. */ -#define Py_RTFLAGS_FORK (1UL << 15) - -/* Set if os.exec*() is allowed. */ -#define Py_RTFLAGS_EXEC (1UL << 16) - - -PyAPI_FUNC(int) _PyInterpreterState_HasFeature(PyInterpreterState *interp, - unsigned long feature); - - /* private interpreter helpers */ PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); -PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); - +PyAPI_FUNC(PyObject *) PyUnstable_InterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ @@ -62,24 +29,6 @@ typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); #define PyTrace_C_RETURN 6 #define PyTrace_OPCODE 7 -// Internal structure: you should not use it directly, but use public functions -// like PyThreadState_EnterTracing() and PyThreadState_LeaveTracing(). -typedef struct _PyCFrame { - /* This struct will be threaded through the C stack - * allowing fast access to per-thread state that needs - * to be accessed quickly by the interpreter, but can - * be modified outside of the interpreter. - * - * WARNING: This makes data on the C stack accessible from - * heap objects. Care must be taken to maintain stack - * discipline and make sure that instances of this struct cannot - * accessed outside of their lifetime. - */ - /* Pointer to the currently executing frame (it can be NULL) */ - struct _PyInterpreterFrame *current_frame; - struct _PyCFrame *previous; -} _PyCFrame; - typedef struct _err_stackitem { /* This struct represents a single execution context where we might * be currently handling an exception. It is a per-coroutine state @@ -107,11 +56,6 @@ typedef struct _stack_chunk { PyObject * data[1]; /* Variable sized */ } _PyStackChunk; -struct _py_trashcan { - int delete_nesting; - PyObject *delete_later; -}; - struct _ts { /* See Python/ceval.c for comments explaining most fields */ @@ -119,6 +63,11 @@ struct _ts { PyThreadState *next; PyInterpreterState *interp; + /* The global instrumentation version in high bits, plus flags indicating + when to break out of the interpreter loop in lower bits. See details in + pycore_ceval.h. */ + uintptr_t eval_breaker; + struct { /* Has been initialized to a safe state. @@ -134,6 +83,8 @@ struct _ts { unsigned int bound_gilstate:1; /* Currently in use (maybe holds the GIL). */ unsigned int active:1; + /* Currently holds the GIL. */ + unsigned int holds_gil:1; /* various stages of finalization */ unsigned int finalizing:1; @@ -141,8 +92,22 @@ struct _ts { unsigned int finalized:1; /* padding to align to 4 bytes */ - unsigned int :24; + unsigned int :23; } _status; +#ifdef Py_BUILD_CORE +# define _PyThreadState_WHENCE_NOTSET -1 +# define _PyThreadState_WHENCE_UNKNOWN 0 +# define _PyThreadState_WHENCE_INIT 1 +# define _PyThreadState_WHENCE_FINI 2 +# define _PyThreadState_WHENCE_THREADING 3 +# define _PyThreadState_WHENCE_GILSTATE 4 +# define _PyThreadState_WHENCE_EXEC 5 +#endif + int _whence; + + /* Thread state (_Py_THREAD_ATTACHED, _Py_THREAD_DETACHED, _Py_THREAD_SUSPENDED). + See Include/internal/pycore_pystate.h for more details. */ + int state; int py_recursion_remaining; int py_recursion_limit; @@ -156,9 +121,8 @@ struct _ts { int tracing; int what_event; /* The event currently being monitored, if any. */ - /* Pointer to current _PyCFrame in the C stack frame of the currently, - * or most recently, executing _PyEval_EvalFrameDefault. */ - _PyCFrame *cframe; + /* Pointer to currently executing frame. */ + struct _PyInterpreterFrame *current_frame; Py_tracefunc c_profilefunc; Py_tracefunc c_tracefunc; @@ -186,33 +150,14 @@ struct _ts { */ unsigned long native_thread_id; - struct _py_trashcan trash; - - /* Called when a thread state is deleted normally, but not when it - * is destroyed after fork(). - * Pain: to prevent rare but fatal shutdown errors (issue 18808), - * Thread.join() must wait for the join'ed thread's tstate to be unlinked - * from the tstate chain. That happens at the end of a thread's life, - * in pystate.c. - * The obvious way doesn't quite work: create a lock which the tstate - * unlinking code releases, and have Thread.join() wait to acquire that - * lock. The problem is that we _are_ at the end of the thread's life: - * if the thread holds the last reference to the lock, decref'ing the - * lock will delete the lock, and that may trigger arbitrary Python code - * if there's a weakref, with a callback, to the lock. But by this time - * _PyRuntime.gilstate.tstate_current is already NULL, so only the simplest - * of C code can be allowed to run (in particular it must not be possible to - * release the GIL). - * So instead of holding the lock directly, the tstate holds a weakref to - * the lock: that's the value of on_delete_data below. Decref'ing a - * weakref is harmless. - * on_delete points to _threadmodule.c's static release_sentinel() function. - * After the tstate is unlinked, release_sentinel is called with the - * weakref-to-lock (on_delete_data) argument, and release_sentinel releases - * the indirectly held lock. + PyObject *delete_later; + + /* Tagged pointer to top-most critical section, or zero if there is no + * active critical section. Critical sections are only used in + * `--disable-gil` builds (i.e., when Py_GIL_DISABLED is defined to 1). In the + * default build, this field is always zero. */ - void (*on_delete)(void *); - void *on_delete_data; + uintptr_t critical_section; int coroutine_origin_tracking_depth; @@ -244,36 +189,53 @@ struct _ts { /* The thread's exception stack entry. (Always the last entry.) */ _PyErr_StackItem exc_state; - /* The bottom-most frame on the stack. */ - _PyCFrame root_cframe; + PyObject *previous_executor; + + uint64_t dict_global_version; + + /* Used to store/retrieve `threading.local` keys/values for this thread */ + PyObject *threading_local_key; + + /* Used by `threading.local`s to be remove keys/values for dying threads. + The PyThreadObject must hold the only reference to this value. + */ + PyObject *threading_local_sentinel; }; -/* WASI has limited call stack. Python's recursion limit depends on code - layout, optimization, and WASI runtime. Wasmtime can handle about 700 - recursions, sometimes less. 500 is a more conservative limit. */ -#ifndef C_RECURSION_LIMIT -# ifdef __wasi__ -# define C_RECURSION_LIMIT 500 -# else - // This value is duplicated in Lib/test/support/__init__.py -# define C_RECURSION_LIMIT 1500 -# endif +#ifdef Py_DEBUG + // A debug build is likely built with low optimization level which implies + // higher stack memory usage than a release build: use a lower limit. +# define Py_C_RECURSION_LIMIT 500 +#elif defined(__s390x__) +# define Py_C_RECURSION_LIMIT 800 +#elif defined(_WIN32) && defined(_M_ARM64) +# define Py_C_RECURSION_LIMIT 1000 +#elif defined(_WIN32) +# define Py_C_RECURSION_LIMIT 3000 +#elif defined(__ANDROID__) + // On an ARM64 emulator, API level 34 was OK with 10000, but API level 21 + // crashed in test_compiler_recursion_limit. +# define Py_C_RECURSION_LIMIT 3000 +#elif defined(_Py_ADDRESS_SANITIZER) +# define Py_C_RECURSION_LIMIT 4000 +#elif defined(__wasi__) + // Based on wasmtime 16. +# define Py_C_RECURSION_LIMIT 5000 +#else + // This value is duplicated in Lib/test/support/__init__.py +# define Py_C_RECURSION_LIMIT 10000 #endif -/* other API */ - -// Alias for backward compatibility with Python 3.8 -#define _PyInterpreterState_Get PyInterpreterState_Get -/* An alias for the internal _PyThreadState_New(), - kept for stable ABI compatibility. */ -PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); +/* other API */ /* Similar to PyThreadState_Get(), but don't issue a fatal error * if it is NULL. */ -PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +PyAPI_FUNC(PyThreadState *) PyThreadState_GetUnchecked(void); + +// Alias kept for backward compatibility +#define _PyThreadState_UncheckedGet PyThreadState_GetUnchecked -PyAPI_FUNC(PyObject *) _PyThreadState_GetDict(PyThreadState *tstate); // Disable tracing and profiling. PyAPI_FUNC(void) PyThreadState_EnterTracing(PyThreadState *tstate); @@ -290,24 +252,10 @@ PyAPI_FUNC(void) PyThreadState_LeaveTracing(PyThreadState *tstate); The function returns 1 if _PyGILState_check_enabled is non-zero. */ PyAPI_FUNC(int) PyGILState_Check(void); -/* Get the single PyInterpreterState used by this process' GILState - implementation. - - This function doesn't check for error. Return NULL before _PyGILState_Init() - is called and after _PyGILState_Fini() is called. - - See also _PyInterpreterState_Get() and _PyInterpreterState_GET(). */ -PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); - /* The implementation of sys._current_frames() Returns a dict mapping thread id to that thread's current frame. */ -PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); - -/* The implementation of sys._current_exceptions() Returns a dict mapping - thread id to that thread's current exception. -*/ -PyAPI_FUNC(PyObject *) _PyThread_CurrentExceptions(void); +PyAPI_FUNC(PyObject*) _PyThread_CurrentFrames(void); /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ @@ -327,118 +275,3 @@ PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc( PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc( PyInterpreterState *interp, _PyFrameEvalFunction eval_frame); - -PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp); - -/* Get a copy of the current interpreter configuration. - - Return 0 on success. Raise an exception and return -1 on error. - - The caller must initialize 'config', using PyConfig_InitPythonConfig() - for example. - - Python must be preinitialized to call this method. - The caller must hold the GIL. - - Once done with the configuration, PyConfig_Clear() must be called to clear - it. */ -PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy( - struct PyConfig *config); - -/* Set the configuration of the current interpreter. - - This function should be called during or just after the Python - initialization. - - Update the sys module with the new configuration. If the sys module was - modified directly after the Python initialization, these changes are lost. - - Some configuration like faulthandler or warnoptions can be updated in the - configuration, but don't reconfigure Python (don't enable/disable - faulthandler and don't reconfigure warnings filters). - - Return 0 on success. Raise an exception and return -1 on error. - - The configuration should come from _PyInterpreterState_GetConfigCopy(). */ -PyAPI_FUNC(int) _PyInterpreterState_SetConfig( - const struct PyConfig *config); - -// Get the configuration of the current interpreter. -// The caller must hold the GIL. -PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); - - -/* cross-interpreter data */ - -// _PyCrossInterpreterData is similar to Py_buffer as an effectively -// opaque struct that holds data outside the object machinery. This -// is necessary to pass safely between interpreters in the same process. -typedef struct _xid _PyCrossInterpreterData; - -typedef PyObject *(*xid_newobjectfunc)(_PyCrossInterpreterData *); -typedef void (*xid_freefunc)(void *); - -struct _xid { - // data is the cross-interpreter-safe derivation of a Python object - // (see _PyObject_GetCrossInterpreterData). It will be NULL if the - // new_object func (below) encodes the data. - void *data; - // obj is the Python object from which the data was derived. This - // is non-NULL only if the data remains bound to the object in some - // way, such that the object must be "released" (via a decref) when - // the data is released. In that case the code that sets the field, - // likely a registered "crossinterpdatafunc", is responsible for - // ensuring it owns the reference (i.e. incref). - PyObject *obj; - // interp is the ID of the owning interpreter of the original - // object. It corresponds to the active interpreter when - // _PyObject_GetCrossInterpreterData() was called. This should only - // be set by the cross-interpreter machinery. - // - // We use the ID rather than the PyInterpreterState to avoid issues - // with deleted interpreters. Note that IDs are never re-used, so - // each one will always correspond to a specific interpreter - // (whether still alive or not). - int64_t interp; - // new_object is a function that returns a new object in the current - // interpreter given the data. The resulting object (a new - // reference) will be equivalent to the original object. This field - // is required. - xid_newobjectfunc new_object; - // free is called when the data is released. If it is NULL then - // nothing will be done to free the data. For some types this is - // okay (e.g. bytes) and for those types this field should be set - // to NULL. However, for most the data was allocated just for - // cross-interpreter use, so it must be freed when - // _PyCrossInterpreterData_Release is called or the memory will - // leak. In that case, at the very least this field should be set - // to PyMem_RawFree (the default if not explicitly set to NULL). - // The call will happen with the original interpreter activated. - xid_freefunc free; -}; - -PyAPI_FUNC(void) _PyCrossInterpreterData_Init( - _PyCrossInterpreterData *data, - PyInterpreterState *interp, void *shared, PyObject *obj, - xid_newobjectfunc new_object); -PyAPI_FUNC(int) _PyCrossInterpreterData_InitWithSize( - _PyCrossInterpreterData *, - PyInterpreterState *interp, const size_t, PyObject *, - xid_newobjectfunc); -PyAPI_FUNC(void) _PyCrossInterpreterData_Clear( - PyInterpreterState *, _PyCrossInterpreterData *); - -PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); -PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); -PyAPI_FUNC(int) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); - -PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); - -/* cross-interpreter data registry */ - -typedef int (*crossinterpdatafunc)(PyThreadState *tstate, PyObject *, - _PyCrossInterpreterData *); - -PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); -PyAPI_FUNC(int) _PyCrossInterpreterData_UnregisterClass(PyTypeObject *); -PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); diff --git a/Include/cpython/pystats.h b/Include/cpython/pystats.h new file mode 100644 index 00000000..c4480758 --- /dev/null +++ b/Include/cpython/pystats.h @@ -0,0 +1,169 @@ +// Statistics on Python performance. +// +// API: +// +// - _Py_INCREF_STAT_INC() and _Py_DECREF_STAT_INC() used by Py_INCREF() +// and Py_DECREF(). +// - _Py_stats variable +// +// Functions of the sys module: +// +// - sys._stats_on() +// - sys._stats_off() +// - sys._stats_clear() +// - sys._stats_dump() +// +// Python must be built with ./configure --enable-pystats to define the +// Py_STATS macro. +// +// Define _PY_INTERPRETER macro to increment interpreter_increfs and +// interpreter_decrefs. Otherwise, increment increfs and decrefs. + +#ifndef Py_CPYTHON_PYSTATS_H +# error "this header file must not be included directly" +#endif + +#define PYSTATS_MAX_UOP_ID 512 + +#define SPECIALIZATION_FAILURE_KINDS 36 + +/* Stats for determining who is calling PyEval_EvalFrame */ +#define EVAL_CALL_TOTAL 0 +#define EVAL_CALL_VECTOR 1 +#define EVAL_CALL_GENERATOR 2 +#define EVAL_CALL_LEGACY 3 +#define EVAL_CALL_FUNCTION_VECTORCALL 4 +#define EVAL_CALL_BUILD_CLASS 5 +#define EVAL_CALL_SLOT 6 +#define EVAL_CALL_FUNCTION_EX 7 +#define EVAL_CALL_API 8 +#define EVAL_CALL_METHOD 9 + +#define EVAL_CALL_KINDS 10 + +typedef struct _specialization_stats { + uint64_t success; + uint64_t failure; + uint64_t hit; + uint64_t deferred; + uint64_t miss; + uint64_t deopt; + uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; +} SpecializationStats; + +typedef struct _opcode_stats { + SpecializationStats specialization; + uint64_t execution_count; + uint64_t pair_count[256]; +} OpcodeStats; + +typedef struct _call_stats { + uint64_t inlined_py_calls; + uint64_t pyeval_calls; + uint64_t frames_pushed; + uint64_t frame_objects_created; + uint64_t eval_calls[EVAL_CALL_KINDS]; +} CallStats; + +typedef struct _object_stats { + uint64_t increfs; + uint64_t decrefs; + uint64_t interpreter_increfs; + uint64_t interpreter_decrefs; + uint64_t allocations; + uint64_t allocations512; + uint64_t allocations4k; + uint64_t allocations_big; + uint64_t frees; + uint64_t to_freelist; + uint64_t from_freelist; + uint64_t inline_values; + uint64_t dict_materialized_on_request; + uint64_t dict_materialized_new_key; + uint64_t dict_materialized_too_big; + uint64_t dict_materialized_str_subclass; + uint64_t type_cache_hits; + uint64_t type_cache_misses; + uint64_t type_cache_dunder_hits; + uint64_t type_cache_dunder_misses; + uint64_t type_cache_collisions; + /* Temporary value used during GC */ + uint64_t object_visits; +} ObjectStats; + +typedef struct _gc_stats { + uint64_t collections; + uint64_t object_visits; + uint64_t objects_collected; +} GCStats; + +typedef struct _uop_stats { + uint64_t execution_count; + uint64_t miss; + uint64_t pair_count[PYSTATS_MAX_UOP_ID + 1]; +} UOpStats; + +#define _Py_UOP_HIST_SIZE 32 + +typedef struct _optimization_stats { + uint64_t attempts; + uint64_t traces_created; + uint64_t traces_executed; + uint64_t uops_executed; + uint64_t trace_stack_overflow; + uint64_t trace_stack_underflow; + uint64_t trace_too_long; + uint64_t trace_too_short; + uint64_t inner_loop; + uint64_t recursive_call; + uint64_t low_confidence; + uint64_t executors_invalidated; + UOpStats opcode[PYSTATS_MAX_UOP_ID + 1]; + uint64_t unsupported_opcode[256]; + uint64_t trace_length_hist[_Py_UOP_HIST_SIZE]; + uint64_t trace_run_length_hist[_Py_UOP_HIST_SIZE]; + uint64_t optimized_trace_length_hist[_Py_UOP_HIST_SIZE]; + uint64_t optimizer_attempts; + uint64_t optimizer_successes; + uint64_t optimizer_failure_reason_no_memory; + uint64_t remove_globals_builtins_changed; + uint64_t remove_globals_incorrect_keys; + uint64_t error_in_opcode[PYSTATS_MAX_UOP_ID + 1]; +} OptimizationStats; + +typedef struct _rare_event_stats { + /* Setting an object's class, obj.__class__ = ... */ + uint64_t set_class; + /* Setting the bases of a class, cls.__bases__ = ... */ + uint64_t set_bases; + /* Setting the PEP 523 frame eval function, _PyInterpreterState_SetFrameEvalFunc() */ + uint64_t set_eval_frame_func; + /* Modifying the builtins, __builtins__.__dict__[var] = ... */ + uint64_t builtin_dict; + /* Modifying a function, e.g. func.__defaults__ = ..., etc. */ + uint64_t func_modification; + /* Modifying a dict that is being watched */ + uint64_t watched_dict_modification; + uint64_t watched_globals_modification; +} RareEventStats; + +typedef struct _stats { + OpcodeStats opcode_stats[256]; + CallStats call_stats; + ObjectStats object_stats; + OptimizationStats optimization_stats; + RareEventStats rare_event_stats; + GCStats *gc_stats; +} PyStats; + + +// Export for shared extensions like 'math' +PyAPI_DATA(PyStats*) _Py_stats; + +#ifdef _PY_INTERPRETER +# define _Py_INCREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.interpreter_increfs++; } while (0) +# define _Py_DECREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.interpreter_decrefs++; } while (0) +#else +# define _Py_INCREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.increfs++; } while (0) +# define _Py_DECREF_STAT_INC() do { if (_Py_stats) _Py_stats->object_stats.decrefs++; } while (0) +#endif diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h index fb617655..edc40952 100644 --- a/Include/cpython/pythonrun.h +++ b/Include/cpython/pythonrun.h @@ -3,21 +3,11 @@ #endif PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); -PyAPI_FUNC(int) _PyRun_SimpleFileObject( - FILE *fp, - PyObject *filename, - int closeit, - PyCompilerFlags *flags); PyAPI_FUNC(int) PyRun_AnyFileExFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ int closeit, PyCompilerFlags *flags); -PyAPI_FUNC(int) _PyRun_AnyFileObject( - FILE *fp, - PyObject *filename, - int closeit, - PyCompilerFlags *flags); PyAPI_FUNC(int) PyRun_SimpleFileExFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ @@ -35,10 +25,6 @@ PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ PyCompilerFlags *flags); -PyAPI_FUNC(int) _PyRun_InteractiveLoopObject( - FILE *fp, - PyObject *filename, - PyCompilerFlags *flags); PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, @@ -69,15 +55,6 @@ PyAPI_FUNC(PyObject *) Py_CompileStringObject( #define Py_CompileString(str, p, s) Py_CompileStringExFlags((str), (p), (s), NULL, -1) #define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags((str), (p), (s), (f), -1) - -PyAPI_FUNC(const char *) _Py_SourceAsString( - PyObject *cmd, - const char *funcname, - const char *what, - PyCompilerFlags *cf, - PyObject **cmd_copy); - - /* A function flavor is also exported by libpython. It is required when libpython is accessed directly rather than using header files which defines macros below. On Windows, for example, PyAPI_FUNC() uses dllexport to @@ -114,8 +91,6 @@ PyAPI_FUNC(PyObject *) PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject #define PyRun_FileFlags(fp, p, s, g, l, flags) \ PyRun_FileExFlags((fp), (p), (s), (g), (l), 0, (flags)) - /* Stuff with no proper home (yet) */ PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); -PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); diff --git a/Include/cpython/pythread.h b/Include/cpython/pythread.h index ce4ec8f6..03f710a9 100644 --- a/Include/cpython/pythread.h +++ b/Include/cpython/pythread.h @@ -2,14 +2,15 @@ # error "this header file must not be included directly" #endif -#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1) +// PY_TIMEOUT_MAX is the highest usable value (in microseconds) of PY_TIMEOUT_T +// type, and depends on the system threading API. +// +// NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread module +// exposes a higher-level API, with timeouts expressed in seconds and +// floating-point numbers allowed. +PyAPI_DATA(const long long) PY_TIMEOUT_MAX; -#ifdef HAVE_FORK -/* Private function to reinitialize a lock at fork in the child process. - Reset the lock to the unlocked state. - Return 0 on success, return -1 on error. */ -PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); -#endif /* HAVE_FORK */ +#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1) #ifdef HAVE_PTHREAD_H /* Darwin needs pthread.h to know type name the pthread_key_t. */ diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h index 16d88d19..5c68110a 100644 --- a/Include/cpython/pytime.h +++ b/Include/cpython/pytime.h @@ -1,331 +1,27 @@ -// The _PyTime_t API is written to use timestamp and timeout values stored in -// various formats and to read clocks. -// -// The _PyTime_t type is an integer to support directly common arithmetic -// operations like t1 + t2. -// -// The _PyTime_t API supports a resolution of 1 nanosecond. The _PyTime_t type -// is signed to support negative timestamps. The supported range is around -// [-292.3 years; +292.3 years]. Using the Unix epoch (January 1st, 1970), the -// supported date range is around [1677-09-21; 2262-04-11]. -// -// Formats: -// -// * seconds -// * seconds as a floating pointer number (C double) -// * milliseconds (10^-3 seconds) -// * microseconds (10^-6 seconds) -// * 100 nanoseconds (10^-7 seconds) -// * nanoseconds (10^-9 seconds) -// * timeval structure, 1 microsecond resolution (10^-6 seconds) -// * timespec structure, 1 nanosecond resolution (10^-9 seconds) -// -// Integer overflows are detected and raise OverflowError. Conversion to a -// resolution worse than 1 nanosecond is rounded correctly with the requested -// rounding mode. There are 4 rounding modes: floor (towards -inf), ceiling -// (towards +inf), half even and up (away from zero). -// -// Some functions clamp the result in the range [_PyTime_MIN; _PyTime_MAX], so -// the caller doesn't have to handle errors and doesn't need to hold the GIL. -// For example, _PyTime_Add(t1, t2) computes t1+t2 and clamp the result on -// overflow. -// -// Clocks: -// -// * System clock -// * Monotonic clock -// * Performance counter -// -// Operations like (t * k / q) with integers are implemented in a way to reduce -// the risk of integer overflow. Such operation is used to convert a clock -// value expressed in ticks with a frequency to _PyTime_t, like -// QueryPerformanceCounter() with QueryPerformanceFrequency(). +// PyTime_t C API: see Doc/c-api/time.rst for the documentation. #ifndef Py_LIMITED_API #ifndef Py_PYTIME_H #define Py_PYTIME_H - -/************************************************************************** -Symbols and macros to supply platform-independent interfaces to time related -functions and constants -**************************************************************************/ #ifdef __cplusplus extern "C" { #endif -#ifdef __clang__ -struct timeval; -#endif - -/* _PyTime_t: Python timestamp with subsecond precision. It can be used to - store a duration, and so indirectly a date (related to another date, like - UNIX epoch). */ -typedef int64_t _PyTime_t; -// _PyTime_MIN nanoseconds is around -292.3 years -#define _PyTime_MIN INT64_MIN -// _PyTime_MAX nanoseconds is around +292.3 years -#define _PyTime_MAX INT64_MAX -#define _SIZEOF_PYTIME_T 8 - -typedef enum { - /* Round towards minus infinity (-inf). - For example, used to read a clock. */ - _PyTime_ROUND_FLOOR=0, - /* Round towards infinity (+inf). - For example, used for timeout to wait "at least" N seconds. */ - _PyTime_ROUND_CEILING=1, - /* Round to nearest with ties going to nearest even integer. - For example, used to round from a Python float. */ - _PyTime_ROUND_HALF_EVEN=2, - /* Round away from zero - For example, used for timeout. _PyTime_ROUND_CEILING rounds - -1e-9 to 0 milliseconds which causes bpo-31786 issue. - _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps - the timeout sign as expected. select.poll(timeout) must block - for negative values." */ - _PyTime_ROUND_UP=3, - /* _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be - used for timeouts. */ - _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP -} _PyTime_round_t; - - -/* Convert a time_t to a PyLong. */ -PyAPI_FUNC(PyObject *) _PyLong_FromTime_t( - time_t sec); - -/* Convert a PyLong to a time_t. */ -PyAPI_FUNC(time_t) _PyLong_AsTime_t( - PyObject *obj); - -/* Convert a number of seconds, int or float, to time_t. */ -PyAPI_FUNC(int) _PyTime_ObjectToTime_t( - PyObject *obj, - time_t *sec, - _PyTime_round_t); - -/* Convert a number of seconds, int or float, to a timeval structure. - usec is in the range [0; 999999] and rounded towards zero. - For example, -1.2 is converted to (-2, 800000). */ -PyAPI_FUNC(int) _PyTime_ObjectToTimeval( - PyObject *obj, - time_t *sec, - long *usec, - _PyTime_round_t); - -/* Convert a number of seconds, int or float, to a timespec structure. - nsec is in the range [0; 999999999] and rounded towards zero. - For example, -1.2 is converted to (-2, 800000000). */ -PyAPI_FUNC(int) _PyTime_ObjectToTimespec( - PyObject *obj, - time_t *sec, - long *nsec, - _PyTime_round_t); - - -/* Create a timestamp from a number of seconds. */ -PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); - -/* Macro to create a timestamp from a number of seconds, no integer overflow. - Only use the macro for small values, prefer _PyTime_FromSeconds(). */ -#define _PYTIME_FROMSECONDS(seconds) \ - ((_PyTime_t)(seconds) * (1000 * 1000 * 1000)) - -/* Create a timestamp from a number of nanoseconds. */ -PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); - -/* Create a timestamp from a number of microseconds. - * Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. */ -PyAPI_FUNC(_PyTime_t) _PyTime_FromMicrosecondsClamp(_PyTime_t us); - -/* Create a timestamp from nanoseconds (Python int). */ -PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, - PyObject *obj); - -/* Convert a number of seconds (Python float or int) to a timestamp. - Raise an exception and return -1 on error, return 0 on success. */ -PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, - PyObject *obj, - _PyTime_round_t round); - -/* Convert a number of milliseconds (Python float or int, 10^-3) to a timestamp. - Raise an exception and return -1 on error, return 0 on success. */ -PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, - PyObject *obj, - _PyTime_round_t round); - -/* Convert a timestamp to a number of seconds as a C double. */ -PyAPI_FUNC(double) _PyTime_AsSecondsDouble(_PyTime_t t); - -/* Convert timestamp to a number of milliseconds (10^-3 seconds). */ -PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t, - _PyTime_round_t round); - -/* Convert timestamp to a number of microseconds (10^-6 seconds). */ -PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t, - _PyTime_round_t round); - -/* Convert timestamp to a number of nanoseconds (10^-9 seconds). */ -PyAPI_FUNC(_PyTime_t) _PyTime_AsNanoseconds(_PyTime_t t); - -#ifdef MS_WINDOWS -// Convert timestamp to a number of 100 nanoseconds (10^-7 seconds). -PyAPI_FUNC(_PyTime_t) _PyTime_As100Nanoseconds(_PyTime_t t, - _PyTime_round_t round); -#endif - -/* Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int - object. */ -PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t); - -#ifndef MS_WINDOWS -/* Create a timestamp from a timeval structure. - Raise an exception and return -1 on overflow, return 0 on success. */ -PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); -#endif - -/* Convert a timestamp to a timeval structure (microsecond resolution). - tv_usec is always positive. - Raise an exception and return -1 if the conversion overflowed, - return 0 on success. */ -PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, - struct timeval *tv, - _PyTime_round_t round); - -/* Similar to _PyTime_AsTimeval() but don't raise an exception on overflow. - On overflow, clamp tv_sec to _PyTime_t min/max. */ -PyAPI_FUNC(void) _PyTime_AsTimeval_clamp(_PyTime_t t, - struct timeval *tv, - _PyTime_round_t round); - -/* Convert a timestamp to a number of seconds (secs) and microseconds (us). - us is always positive. This function is similar to _PyTime_AsTimeval() - except that secs is always a time_t type, whereas the timeval structure - uses a C long for tv_sec on Windows. - Raise an exception and return -1 if the conversion overflowed, - return 0 on success. */ -PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( - _PyTime_t t, - time_t *secs, - int *us, - _PyTime_round_t round); +typedef int64_t PyTime_t; +#define PyTime_MIN INT64_MIN +#define PyTime_MAX INT64_MAX -#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) -/* Create a timestamp from a timespec structure. - Raise an exception and return -1 on overflow, return 0 on success. */ -PyAPI_FUNC(int) _PyTime_FromTimespec(_PyTime_t *tp, struct timespec *ts); +PyAPI_FUNC(double) PyTime_AsSecondsDouble(PyTime_t t); +PyAPI_FUNC(int) PyTime_Monotonic(PyTime_t *result); +PyAPI_FUNC(int) PyTime_PerfCounter(PyTime_t *result); +PyAPI_FUNC(int) PyTime_Time(PyTime_t *result); -/* Convert a timestamp to a timespec structure (nanosecond resolution). - tv_nsec is always positive. - Raise an exception and return -1 on error, return 0 on success. */ -PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); - -/* Similar to _PyTime_AsTimespec() but don't raise an exception on overflow. - On overflow, clamp tv_sec to _PyTime_t min/max. */ -PyAPI_FUNC(void) _PyTime_AsTimespec_clamp(_PyTime_t t, struct timespec *ts); -#endif - - -// Compute t1 + t2. Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. -PyAPI_FUNC(_PyTime_t) _PyTime_Add(_PyTime_t t1, _PyTime_t t2); - -/* Compute ticks * mul / div. - Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow. - The caller must ensure that ((div - 1) * mul) cannot overflow. */ -PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, - _PyTime_t mul, - _PyTime_t div); - -/* Structure used by time.get_clock_info() */ -typedef struct { - const char *implementation; - int monotonic; - int adjustable; - double resolution; -} _Py_clock_info_t; - -/* Get the current time from the system clock. - - If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and clamp the clock to - [_PyTime_MIN; _PyTime_MAX]. - - Use _PyTime_GetSystemClockWithInfo() to check for failure. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); - -/* Get the current time from the system clock. - * On success, set *t and *info (if not NULL), and return 0. - * On error, raise an exception and return -1. - */ -PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( - _PyTime_t *t, - _Py_clock_info_t *info); - -/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. - The clock is not affected by system clock updates. The reference point of - the returned value is undefined, so that only the difference between the - results of consecutive calls is valid. - - If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and clamp the clock to - [_PyTime_MIN; _PyTime_MAX]. - - Use _PyTime_GetMonotonicClockWithInfo() to check for failure. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); - -/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. - The clock is not affected by system clock updates. The reference point of - the returned value is undefined, so that only the difference between the - results of consecutive calls is valid. - - Fill info (if set) with information of the function used to get the time. - - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( - _PyTime_t *t, - _Py_clock_info_t *info); - - -/* Converts a timestamp to the Gregorian time, using the local time zone. - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); - -/* Converts a timestamp to the Gregorian time, assuming UTC. - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); - -/* Get the performance counter: clock with the highest available resolution to - measure a short duration. - - If the internal clock fails, silently ignore the error and return 0. - On integer overflow, silently ignore the overflow and clamp the clock to - [_PyTime_MIN; _PyTime_MAX]. - - Use _PyTime_GetPerfCounterWithInfo() to check for failure. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); - -/* Get the performance counter: clock with the highest available resolution to - measure a short duration. - - Fill info (if set) with information of the function used to get the time. - - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_GetPerfCounterWithInfo( - _PyTime_t *t, - _Py_clock_info_t *info); - - -// Create a deadline. -// Pseudo code: _PyTime_GetMonotonicClock() + timeout. -PyAPI_FUNC(_PyTime_t) _PyDeadline_Init(_PyTime_t timeout); - -// Get remaining time from a deadline. -// Pseudo code: deadline - _PyTime_GetMonotonicClock(). -PyAPI_FUNC(_PyTime_t) _PyDeadline_Get(_PyTime_t deadline); +PyAPI_FUNC(int) PyTime_MonotonicRaw(PyTime_t *result); +PyAPI_FUNC(int) PyTime_PerfCounterRaw(PyTime_t *result); +PyAPI_FUNC(int) PyTime_TimeRaw(PyTime_t *result); #ifdef __cplusplus } #endif - #endif /* Py_PYTIME_H */ #endif /* Py_LIMITED_API */ diff --git a/Include/cpython/setobject.h b/Include/cpython/setobject.h index 20fd63ea..89565cb2 100644 --- a/Include/cpython/setobject.h +++ b/Include/cpython/setobject.h @@ -62,11 +62,10 @@ typedef struct { (assert(PyAnySet_Check(so)), _Py_CAST(PySetObject*, so)) static inline Py_ssize_t PySet_GET_SIZE(PyObject *so) { +#ifdef Py_GIL_DISABLED + return _Py_atomic_load_ssize_relaxed(&(_PySet_CAST(so)->used)); +#else return _PySet_CAST(so)->used; +#endif } #define PySet_GET_SIZE(so) PySet_GET_SIZE(_PyObject_CAST(so)) - -PyAPI_DATA(PyObject *) _PySet_Dummy; - -PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); -PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h index 19d9dddc..a3ac07f5 100644 --- a/Include/cpython/sysmodule.h +++ b/Include/cpython/sysmodule.h @@ -2,15 +2,21 @@ # error "this header file must not be included directly" #endif -PyAPI_FUNC(PyObject *) _PySys_GetAttr(PyThreadState *tstate, - PyObject *name); - -PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); - typedef int(*Py_AuditHookFunction)(const char *, PyObject *, void *); -PyAPI_FUNC(int) PySys_Audit( - const char *event, - const char *argFormat, - ...); PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*); + +typedef struct { + FILE* perf_map; + PyThread_type_lock map_lock; +} PerfMapState; + +PyAPI_FUNC(int) PyUnstable_PerfMapState_Init(void); +PyAPI_FUNC(int) PyUnstable_WritePerfMapEntry( + const void *code_addr, + unsigned int code_size, + const char *entry_name); +PyAPI_FUNC(void) PyUnstable_PerfMapState_Fini(void); +PyAPI_FUNC(int) PyUnstable_CopyPerfMapFile(const char* parent_filename); +PyAPI_FUNC(int) PyUnstable_PerfTrampoline_CompileCode(PyCodeObject *); +PyAPI_FUNC(int) PyUnstable_PerfTrampoline_SetPersistAfterFork(int enable); diff --git a/Include/cpython/traceback.h b/Include/cpython/traceback.h index a4e087b2..81c51944 100644 --- a/Include/cpython/traceback.h +++ b/Include/cpython/traceback.h @@ -11,6 +11,3 @@ struct _traceback { int tb_lasti; int tb_lineno; }; - -PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int, int *, PyObject **); -PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); diff --git a/Include/cpython/tracemalloc.h b/Include/cpython/tracemalloc.h new file mode 100644 index 00000000..61a16ea9 --- /dev/null +++ b/Include/cpython/tracemalloc.h @@ -0,0 +1,26 @@ +#ifndef Py_LIMITED_API +#ifndef Py_TRACEMALLOC_H +#define Py_TRACEMALLOC_H + +/* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). + + Return -2 if tracemalloc is disabled. + + If memory block is already tracked, update the existing trace. */ +PyAPI_FUNC(int) PyTraceMalloc_Track( + unsigned int domain, + uintptr_t ptr, + size_t size); + +/* Untrack an allocated memory block in the tracemalloc module. + Do nothing if the block was not tracked. + + Return -2 if tracemalloc is disabled, otherwise return 0. */ +PyAPI_FUNC(int) PyTraceMalloc_Untrack( + unsigned int domain, + uintptr_t ptr); + +#endif // !Py_TRACEMALLOC_H +#endif // !Py_LIMITED_API diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index f6a1f076..e530c8be 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -11,7 +11,6 @@ typedef struct { } PyTupleObject; PyAPI_FUNC(int) _PyTuple_Resize(PyObject **, Py_ssize_t); -PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); /* Cast argument to PyTupleObject* type. */ #define _PyTuple_CAST(op) \ @@ -31,9 +30,9 @@ static inline Py_ssize_t PyTuple_GET_SIZE(PyObject *op) { static inline void PyTuple_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { PyTupleObject *tuple = _PyTuple_CAST(op); + assert(0 <= index); + assert(index < Py_SIZE(tuple)); tuple->ob_item[index] = value; } #define PyTuple_SET_ITEM(op, index, value) \ PyTuple_SET_ITEM(_PyObject_CAST(op), (index), _PyObject_CAST(value)) - -PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 3394726d..d9b54bce 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -6,8 +6,9 @@ Python and represents a single Unicode element in the Unicode type. With PEP 393, Py_UNICODE is deprecated and replaced with a typedef to wchar_t. */ -#define PY_UNICODE_TYPE wchar_t -/* Py_DEPRECATED(3.3) */ typedef wchar_t Py_UNICODE; +Py_DEPRECATED(3.13) typedef wchar_t PY_UNICODE_TYPE; +Py_DEPRECATED(3.13) typedef wchar_t Py_UNICODE; + /* --- Internal Unicode Operations ---------------------------------------- */ @@ -43,6 +44,7 @@ static inline Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) { return (0xDC00 + (ch & 0x3FF)); } + /* --- Unicode Type ------------------------------------------------------- */ /* ASCII-only strings created through PyUnicode_New use the PyASCIIObject @@ -140,9 +142,11 @@ typedef struct { and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is set, use the PyASCIIObject structure. */ unsigned int ascii:1; + /* The object is statically allocated. */ + unsigned int statically_allocated:1; /* Padding to ensure that PyUnicode_DATA() is always aligned to 4 bytes (see issue #19537 on m68k). */ - unsigned int :25; + unsigned int :24; } state; } PyASCIIObject; @@ -167,10 +171,6 @@ typedef struct { } data; /* Canonical, smallest-form Unicode buffer */ } PyUnicodeObject; -PyAPI_FUNC(int) _PyUnicode_CheckConsistency( - PyObject *op, - int check_content); - #define _PyASCIIObject_CAST(op) \ (assert(PyUnicode_Check(op)), \ @@ -377,9 +377,8 @@ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) #define PyUnicode_MAX_CHAR_VALUE(op) \ PyUnicode_MAX_CHAR_VALUE(_PyObject_CAST(op)) -/* === Public API ========================================================= */ -/* --- Plain Py_UNICODE --------------------------------------------------- */ +/* === Public API ========================================================= */ /* With PEP 393, this is the recommended way to allocate a new unicode object. This function will allocate the object and its buffer in a single memory @@ -396,11 +395,6 @@ static inline int PyUnicode_READY(PyObject* Py_UNUSED(op)) } #define PyUnicode_READY(op) PyUnicode_READY(_PyObject_CAST(op)) -/* Get a copy of a Unicode string. */ -PyAPI_FUNC(PyObject*) _PyUnicode_Copy( - PyObject *unicode - ); - /* Copy character from one unicode object into another, this function performs character conversion when necessary and falls back to memcpy() if possible. @@ -427,17 +421,6 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_CopyCharacters( Py_ssize_t how_many ); -/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so - may crash if parameters are invalid (e.g. if the output string - is too short). */ -PyAPI_FUNC(void) _PyUnicode_FastCopyCharacters( - PyObject *to, - Py_ssize_t to_start, - PyObject *from, - Py_ssize_t from_start, - Py_ssize_t how_many - ); - /* Fill a string with a character: write fill_char into unicode[start:start+length]. @@ -453,15 +436,6 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_Fill( Py_UCS4 fill_char ); -/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash - if parameters are invalid (e.g. if length is longer than the string). */ -PyAPI_FUNC(void) _PyUnicode_FastFill( - PyObject *unicode, - Py_ssize_t start, - Py_ssize_t length, - Py_UCS4 fill_char - ); - /* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. Scan the string to find the maximum character. */ PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( @@ -469,18 +443,6 @@ PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( const void *buffer, Py_ssize_t size); -/* Create a new string from a buffer of ASCII characters. - WARNING: Don't check if the string contains any non-ASCII character. */ -PyAPI_FUNC(PyObject*) _PyUnicode_FromASCII( - const char *buffer, - Py_ssize_t size); - -/* Compute the maximum character of the substring unicode[start:end]. - Return 127 for an empty string. */ -PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( - PyObject *unicode, - Py_ssize_t start, - Py_ssize_t end); /* --- _PyUnicodeWriter API ----------------------------------------------- */ @@ -506,11 +468,11 @@ typedef struct { unsigned char readonly; } _PyUnicodeWriter ; -/* Initialize a Unicode writer. - * - * By default, the minimum buffer size is 0 character and overallocation is - * disabled. Set min_length, min_char and overallocate attributes to control - * the allocation of the buffer. */ +// Initialize a Unicode writer. +// +// By default, the minimum buffer size is 0 character and overallocation is +// disabled. Set min_length, min_char and overallocate attributes to control +// the allocation of the buffer. PyAPI_FUNC(void) _PyUnicodeWriter_Init(_PyUnicodeWriter *writer); @@ -598,15 +560,6 @@ PyAPI_FUNC(void) _PyUnicodeWriter_Dealloc(_PyUnicodeWriter *writer); -/* Format the object based on the format_spec, as defined in PEP 3101 - (Advanced String Formatting). */ -PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( - _PyUnicodeWriter *writer, - PyObject *obj, - PyObject *format_spec, - Py_ssize_t start, - Py_ssize_t end); - /* --- Manage the default encoding ---------------------------------------- */ /* Returns a pointer to the default encoding (UTF-8) of the @@ -624,171 +577,9 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); +// Alias kept for backward compatibility #define _PyUnicode_AsString PyUnicode_AsUTF8 -/* --- UTF-7 Codecs ------------------------------------------------------- */ - -PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF7( - PyObject *unicode, /* Unicode object */ - int base64SetO, /* Encode RFC2152 Set O characters in base64 */ - int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ - const char *errors /* error handling */ - ); - -/* --- UTF-8 Codecs ------------------------------------------------------- */ - -PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( - PyObject *unicode, - const char *errors); - -/* --- UTF-32 Codecs ------------------------------------------------------ */ - -PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( - PyObject *object, /* Unicode object */ - const char *errors, /* error handling */ - int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ - ); - -/* --- UTF-16 Codecs ------------------------------------------------------ */ - -/* Returns a Python string object holding the UTF-16 encoded value of - the Unicode data. - - If byteorder is not 0, output is written according to the following - byte order: - - byteorder == -1: little endian - byteorder == 0: native byte order (writes a BOM mark) - byteorder == 1: big endian - - If byteorder is 0, the output string will always start with the - Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is - prepended. -*/ -PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( - PyObject* unicode, /* Unicode object */ - const char *errors, /* error handling */ - int byteorder /* byteorder to use 0=BOM+native;-1=LE,1=BE */ - ); - -/* --- Unicode-Escape Codecs ---------------------------------------------- */ - -/* Variant of PyUnicode_DecodeUnicodeEscape that supports partial decoding. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeStateful( - const char *string, /* Unicode-Escape encoded string */ - Py_ssize_t length, /* size of string */ - const char *errors, /* error handling */ - Py_ssize_t *consumed /* bytes consumed */ -); -/* Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape - chars. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal( - const char *string, /* Unicode-Escape encoded string */ - Py_ssize_t length, /* size of string */ - const char *errors, /* error handling */ - Py_ssize_t *consumed, /* bytes consumed */ - const char **first_invalid_escape /* on return, points to first - invalid escaped char in - string. */ -); - -/* --- Raw-Unicode-Escape Codecs ---------------------------------------------- */ - -/* Variant of PyUnicode_DecodeRawUnicodeEscape that supports partial decoding. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeRawUnicodeEscapeStateful( - const char *string, /* Unicode-Escape encoded string */ - Py_ssize_t length, /* size of string */ - const char *errors, /* error handling */ - Py_ssize_t *consumed /* bytes consumed */ -); - -/* --- Latin-1 Codecs ----------------------------------------------------- */ - -PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( - PyObject* unicode, - const char* errors); - -/* --- ASCII Codecs ------------------------------------------------------- */ - -PyAPI_FUNC(PyObject*) _PyUnicode_AsASCIIString( - PyObject* unicode, - const char* errors); - -/* --- Character Map Codecs ----------------------------------------------- */ - -/* Translate an Unicode object by applying a character mapping table to - it and return the resulting Unicode object. - - The mapping table must map Unicode ordinal integers to Unicode strings, - Unicode ordinal integers or None (causing deletion of the character). - - Mapping tables may be dictionaries or sequences. Unmapped character - ordinals (ones which cause a LookupError) are left untouched and - are copied as-is. -*/ -PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( - PyObject *unicode, /* Unicode object */ - PyObject *mapping, /* encoding mapping */ - const char *errors /* error handling */ - ); - -/* --- Decimal Encoder ---------------------------------------------------- */ - -/* Coverts a Unicode object holding a decimal value to an ASCII string - for using in int, float and complex parsers. - Transforms code points that have decimal digit property to the - corresponding ASCII digit code points. Transforms spaces to ASCII. - Transforms code points starting from the first non-ASCII code point that - is neither a decimal digit nor a space to the end into '?'. */ - -PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII( - PyObject *unicode /* Unicode object */ - ); - -/* --- Methods & Slots ---------------------------------------------------- */ - -PyAPI_FUNC(PyObject *) _PyUnicode_JoinArray( - PyObject *separator, - PyObject *const *items, - Py_ssize_t seqlen - ); - -/* Test whether a unicode is equal to ASCII identifier. Return 1 if true, - 0 otherwise. The right argument must be ASCII identifier. - Any error occurs inside will be cleared before return. */ -PyAPI_FUNC(int) _PyUnicode_EqualToASCIIId( - PyObject *left, /* Left string */ - _Py_Identifier *right /* Right identifier */ - ); - -/* Test whether a unicode is equal to ASCII string. Return 1 if true, - 0 otherwise. The right argument must be ASCII-encoded string. - Any error occurs inside will be cleared before return. */ -PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( - PyObject *left, - const char *right /* ASCII-encoded string */ - ); - -/* Externally visible for str.strip(unicode) */ -PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( - PyObject *self, - int striptype, - PyObject *sepobj - ); - -/* Using explicit passed-in values, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( - _PyUnicodeWriter *writer, - Py_ssize_t n_buffer, - PyObject *digits, - Py_ssize_t d_pos, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - PyObject *thousands_sep, - Py_UCS4 *maxchar); /* === Characters Type APIs =============================================== */ @@ -811,14 +602,6 @@ PyAPI_FUNC(int) _PyUnicode_IsTitlecase( Py_UCS4 ch /* Unicode character */ ); -PyAPI_FUNC(int) _PyUnicode_IsXidStart( - Py_UCS4 ch /* Unicode character */ - ); - -PyAPI_FUNC(int) _PyUnicode_IsXidContinue( - Py_UCS4 ch /* Unicode character */ - ); - PyAPI_FUNC(int) _PyUnicode_IsWhitespace( const Py_UCS4 ch /* Unicode character */ ); @@ -827,46 +610,18 @@ PyAPI_FUNC(int) _PyUnicode_IsLinebreak( const Py_UCS4 ch /* Unicode character */ ); -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToLowercase( Py_UCS4 ch /* Unicode character */ ); -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToUppercase( Py_UCS4 ch /* Unicode character */ ); -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( +PyAPI_FUNC(Py_UCS4) _PyUnicode_ToTitlecase( Py_UCS4 ch /* Unicode character */ ); -PyAPI_FUNC(int) _PyUnicode_ToLowerFull( - Py_UCS4 ch, /* Unicode character */ - Py_UCS4 *res - ); - -PyAPI_FUNC(int) _PyUnicode_ToTitleFull( - Py_UCS4 ch, /* Unicode character */ - Py_UCS4 *res - ); - -PyAPI_FUNC(int) _PyUnicode_ToUpperFull( - Py_UCS4 ch, /* Unicode character */ - Py_UCS4 *res - ); - -PyAPI_FUNC(int) _PyUnicode_ToFoldedFull( - Py_UCS4 ch, /* Unicode character */ - Py_UCS4 *res - ); - -PyAPI_FUNC(int) _PyUnicode_IsCaseIgnorable( - Py_UCS4 ch /* Unicode character */ - ); - -PyAPI_FUNC(int) _PyUnicode_IsCased( - Py_UCS4 ch /* Unicode character */ - ); - PyAPI_FUNC(int) _PyUnicode_ToDecimalDigit( Py_UCS4 ch /* Unicode character */ ); @@ -943,19 +698,6 @@ static inline int Py_UNICODE_ISALNUM(Py_UCS4 ch) { /* === Misc functions ===================================================== */ -PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); - -/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ +// Return an interned Unicode object for an Identifier; may fail if there is no +// memory. PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); - -/* Fast equality check when the inputs are known to be exact unicode types - and where the hash values are equal (i.e. a very probable match) */ -PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); - -/* Equality check. */ -PyAPI_FUNC(int) _PyUnicode_Equal(PyObject *, PyObject *); - -PyAPI_FUNC(int) _PyUnicode_WideCharString_Converter(PyObject *, void *); -PyAPI_FUNC(int) _PyUnicode_WideCharString_Opt_Converter(PyObject *, void *); - -PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index fd79fdc2..28acf726 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -30,13 +30,20 @@ struct _PyWeakReference { PyWeakReference *wr_prev; PyWeakReference *wr_next; vectorcallfunc vectorcall; -}; -PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); +#ifdef Py_GIL_DISABLED + /* Pointer to the lock used when clearing in free-threaded builds. + * Normally this can be derived from wr_object, but in some cases we need + * to lock after wr_object has been set to Py_None. + */ + PyMutex *weakrefs_lock; +#endif +}; PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); -static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { +Py_DEPRECATED(3.13) static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) +{ PyWeakReference *ref; PyObject *obj; assert(PyWeakref_Check(ref_obj)); diff --git a/Include/critical_section.h b/Include/critical_section.h new file mode 100644 index 00000000..3b37615a --- /dev/null +++ b/Include/critical_section.h @@ -0,0 +1,16 @@ +#ifndef Py_CRITICAL_SECTION_H +#define Py_CRITICAL_SECTION_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_CRITICAL_SECTION_H +# include "cpython/critical_section.h" +# undef Py_CPYTHON_CRITICAL_SECTION_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CRITICAL_SECTION_H */ diff --git a/Include/dictobject.h b/Include/dictobject.h index e7fcb44d..1bbeec1a 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -57,6 +57,17 @@ PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 +// Return the object from dictionary *op* which has a key *key*. +// - If the key is present, set *result to a new strong reference to the value +// and return 1. +// - If the key is missing, set *result to NULL and return 0 . +// - On error, raise an exception and return -1. +PyAPI_FUNC(int) PyDict_GetItemRef(PyObject *mp, PyObject *key, PyObject **result); +PyAPI_FUNC(int) PyDict_GetItemStringRef(PyObject *mp, const char *key, PyObject **result); +#endif + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); #endif diff --git a/Include/errcode.h b/Include/errcode.h index 54ae929b..dac5cf06 100644 --- a/Include/errcode.h +++ b/Include/errcode.h @@ -1,36 +1,43 @@ +// Error codes passed around between file input, tokenizer, parser and +// interpreter. This is necessary so we can turn them into Python +// exceptions at a higher level. Note that some errors have a +// slightly different meaning when passed from the tokenizer to the +// parser than when passed from the parser to the interpreter; e.g. +// the parser only returns E_EOF when it hits EOF immediately, and it +// never returns E_OK. +// +// The public PyRun_InteractiveOneObjectEx() function can return E_EOF, +// same as its variants: +// +// * PyRun_InteractiveOneObject() +// * PyRun_InteractiveOneFlags() +// * PyRun_InteractiveOne() + #ifndef Py_ERRCODE_H #define Py_ERRCODE_H #ifdef __cplusplus extern "C" { #endif - -/* Error codes passed around between file input, tokenizer, parser and - interpreter. This is necessary so we can turn them into Python - exceptions at a higher level. Note that some errors have a - slightly different meaning when passed from the tokenizer to the - parser than when passed from the parser to the interpreter; e.g. - the parser only returns E_EOF when it hits EOF immediately, and it - never returns E_OK. */ - -#define E_OK 10 /* No error */ -#define E_EOF 11 /* End Of File */ -#define E_INTR 12 /* Interrupted */ -#define E_TOKEN 13 /* Bad token */ -#define E_SYNTAX 14 /* Syntax error */ -#define E_NOMEM 15 /* Ran out of memory */ -#define E_DONE 16 /* Parsing complete */ -#define E_ERROR 17 /* Execution error */ -#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ -#define E_OVERFLOW 19 /* Node had too many children */ -#define E_TOODEEP 20 /* Too many indentation levels */ -#define E_DEDENT 21 /* No matching outer block for dedent */ -#define E_DECODE 22 /* Error in decoding into Unicode */ -#define E_EOFS 23 /* EOF in triple-quoted string */ -#define E_EOLS 24 /* EOL in single-quoted string */ -#define E_LINECONT 25 /* Unexpected characters after a line continuation */ -#define E_BADSINGLE 27 /* Ill-formed single statement input */ -#define E_INTERACT_STOP 28 /* Interactive mode stopped tokenization */ +#define E_OK 10 /* No error */ +#define E_EOF 11 /* End Of File */ +#define E_INTR 12 /* Interrupted */ +#define E_TOKEN 13 /* Bad token */ +#define E_SYNTAX 14 /* Syntax error */ +#define E_NOMEM 15 /* Ran out of memory */ +#define E_DONE 16 /* Parsing complete */ +#define E_ERROR 17 /* Execution error */ +#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */ +#define E_OVERFLOW 19 /* Node had too many children */ +#define E_TOODEEP 20 /* Too many indentation levels */ +#define E_DEDENT 21 /* No matching outer block for dedent */ +#define E_DECODE 22 /* Error in decoding into Unicode */ +#define E_EOFS 23 /* EOF in triple-quoted string */ +#define E_EOLS 24 /* EOL in single-quoted string */ +#define E_LINECONT 25 /* Unexpected characters after a line continuation */ +#define E_BADSINGLE 27 /* Ill-formed single statement input */ +#define E_INTERACT_STOP 28 /* Interactive mode stopped tokenization */ +#define E_COLUMNOVERFLOW 29 /* Column offset overflow */ #ifdef __cplusplus } diff --git a/Include/exports.h b/Include/exports.h index 59373c39..ce601216 100644 --- a/Include/exports.h +++ b/Include/exports.h @@ -1,6 +1,29 @@ #ifndef Py_EXPORTS_H #define Py_EXPORTS_H +/* Declarations for symbol visibility. + + PyAPI_FUNC(type): Declares a public Python API function and return type + PyAPI_DATA(type): Declares public Python data and its type + PyMODINIT_FUNC: A Python module init function. If these functions are + inside the Python core, they are private to the core. + If in an extension module, it may be declared with + external linkage depending on the platform. + + As a number of platforms support/require "__declspec(dllimport/dllexport)", + we support a HAVE_DECLSPEC_DLL macro to save duplication. +*/ + +/* + All windows ports, except cygwin, are handled in PC/pyconfig.h. + + Cygwin is the only other autoconf platform requiring special + linkage handling and it uses __declspec(). +*/ +#if defined(__CYGWIN__) +# define HAVE_DECLSPEC_DLL +#endif + #if defined(_WIN32) || defined(__CYGWIN__) #if defined(Py_ENABLE_SHARED) #define Py_IMPORTED_SYMBOL __declspec(dllimport) @@ -33,4 +56,53 @@ #endif #endif +/* only get special linkage if built as shared or platform is Cygwin */ +#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) +# if defined(HAVE_DECLSPEC_DLL) +# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE + /* module init functions inside the core need no external linkage */ + /* except for Cygwin to handle embedding */ +# if defined(__CYGWIN__) +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# else /* __CYGWIN__ */ +# define PyMODINIT_FUNC PyObject* +# endif /* __CYGWIN__ */ +# else /* Py_BUILD_CORE */ + /* Building an extension module, or an embedded situation */ + /* public Python functions and data are imported */ + /* Under Cygwin, auto-import functions to prevent compilation */ + /* failures similar to those described at the bottom of 4.1: */ + /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ +# if !defined(__CYGWIN__) +# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE +# endif /* !__CYGWIN__ */ +# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE + /* module init functions outside the core must be exported */ +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# endif /* __cplusplus */ +# endif /* Py_BUILD_CORE */ +# endif /* HAVE_DECLSPEC_DLL */ +#endif /* Py_ENABLE_SHARED */ + +/* If no external linkage macros defined by now, create defaults */ +#ifndef PyAPI_FUNC +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +#endif +#ifndef PyAPI_DATA +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE +#endif +#ifndef PyMODINIT_FUNC +# if defined(__cplusplus) +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* +# else /* __cplusplus */ +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* +# endif /* __cplusplus */ +#endif + + #endif /* Py_EXPORTS_H */ diff --git a/Include/fileobject.h b/Include/fileobject.h index 2deef544..6a6d1140 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -29,14 +29,6 @@ Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding; Py_DEPRECATED(3.12) PyAPI_DATA(int) Py_UTF8Mode; #endif -/* A routine to check if a file descriptor can be select()-ed. */ -#ifdef _MSC_VER - /* On Windows, any socket fd can be select()-ed, no matter how high */ - #define _PyIsSelectable_fd(FD) (1) -#else - #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) -#endif - #ifndef Py_LIMITED_API # define Py_CPYTHON_FILEOBJECT_H # include "cpython/fileobject.h" diff --git a/Include/fileutils.h b/Include/fileutils.h index ba5acc84..1509198e 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -1,5 +1,41 @@ #ifndef Py_FILEUTILS_H #define Py_FILEUTILS_H + +/******************************* + * stat() and fstat() fiddling * + *******************************/ + +#ifdef HAVE_SYS_STAT_H +# include // S_ISREG() +#elif defined(HAVE_STAT_H) +# include // S_ISREG() +#endif + +#ifndef S_IFMT + // VisualAge C/C++ Failed to Define MountType Field in sys/stat.h. +# define S_IFMT 0170000 +#endif +#ifndef S_IFLNK + // Windows doesn't define S_IFLNK, but posixmodule.c maps + // IO_REPARSE_TAG_SYMLINK to S_IFLNK. +# define S_IFLNK 0120000 +#endif +#ifndef S_ISREG +# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) +#endif +#ifndef S_ISDIR +# define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) +#endif +#ifndef S_ISCHR +# define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) +#endif +#ifndef S_ISLNK +# define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) +#endif + + +// Move this down here since some C++ #include's don't like to be included +// inside an extern "C". #ifdef __cplusplus extern "C" { #endif diff --git a/Include/floatobject.h b/Include/floatobject.h index 999441ac..8963c168 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -2,7 +2,7 @@ /* Float object interface */ /* -PyFloatObject represents a (double precision) floating point number. +PyFloatObject represents a (double precision) floating-point number. */ #ifndef Py_FLOATOBJECT_H diff --git a/Include/import.h b/Include/import.h index 5d5f3425..24b23b91 100644 --- a/Include/import.h +++ b/Include/import.h @@ -43,10 +43,15 @@ PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( PyAPI_FUNC(PyObject *) PyImport_AddModule( const char *name /* UTF-8 encoded string */ ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(PyObject *) PyImport_AddModuleRef( + const char *name /* UTF-8 encoded string */ + ); +#endif PyAPI_FUNC(PyObject *) PyImport_ImportModule( const char *name /* UTF-8 encoded string */ ); -PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock( +Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyImport_ImportModuleNoBlock( const char *name /* UTF-8 encoded string */ ); PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel( diff --git a/Include/internal/mimalloc/mimalloc.h b/Include/internal/mimalloc/mimalloc.h new file mode 100644 index 00000000..821129e7 --- /dev/null +++ b/Include/internal/mimalloc/mimalloc.h @@ -0,0 +1,565 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023, Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_H +#define MIMALLOC_H + +#define MI_MALLOC_VERSION 212 // major + 2 digits minor + +// ------------------------------------------------------ +// Compiler specific attributes +// ------------------------------------------------------ + +#ifdef __cplusplus + #if (__cplusplus >= 201103L) || (_MSC_VER > 1900) // C++11 + #define mi_attr_noexcept noexcept + #else + #define mi_attr_noexcept throw() + #endif +#else + #define mi_attr_noexcept +#endif + +#if defined(__cplusplus) && (__cplusplus >= 201703) + #define mi_decl_nodiscard [[nodiscard]] +#elif (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) // includes clang, icc, and clang-cl + #define mi_decl_nodiscard __attribute__((warn_unused_result)) +#elif defined(_HAS_NODISCARD) + #define mi_decl_nodiscard _NODISCARD +#elif (_MSC_VER >= 1700) + #define mi_decl_nodiscard _Check_return_ +#else + #define mi_decl_nodiscard +#endif + +#if defined(_MSC_VER) || defined(__MINGW32__) + #if !defined(MI_SHARED_LIB) + #define mi_decl_export + #elif defined(MI_SHARED_LIB_EXPORT) + #define mi_decl_export __declspec(dllexport) + #else + #define mi_decl_export __declspec(dllimport) + #endif + #if defined(__MINGW32__) + #define mi_decl_restrict + #define mi_attr_malloc __attribute__((malloc)) + #else + #if (_MSC_VER >= 1900) && !defined(__EDG__) + #define mi_decl_restrict __declspec(allocator) __declspec(restrict) + #else + #define mi_decl_restrict __declspec(restrict) + #endif + #define mi_attr_malloc + #endif + #define mi_cdecl __cdecl + #define mi_attr_alloc_size(s) + #define mi_attr_alloc_size2(s1,s2) + #define mi_attr_alloc_align(p) +#elif defined(__GNUC__) // includes clang and icc + #if defined(MI_SHARED_LIB) && defined(MI_SHARED_LIB_EXPORT) + #define mi_decl_export __attribute__((visibility("default"))) + #else + #define mi_decl_export + #endif + #define mi_cdecl // leads to warnings... __attribute__((cdecl)) + #define mi_decl_restrict + #define mi_attr_malloc __attribute__((malloc)) + #if (defined(__clang_major__) && (__clang_major__ < 4)) || (__GNUC__ < 5) + #define mi_attr_alloc_size(s) + #define mi_attr_alloc_size2(s1,s2) + #define mi_attr_alloc_align(p) + #elif defined(__INTEL_COMPILER) + #define mi_attr_alloc_size(s) __attribute__((alloc_size(s))) + #define mi_attr_alloc_size2(s1,s2) __attribute__((alloc_size(s1,s2))) + #define mi_attr_alloc_align(p) + #else + #define mi_attr_alloc_size(s) __attribute__((alloc_size(s))) + #define mi_attr_alloc_size2(s1,s2) __attribute__((alloc_size(s1,s2))) + #define mi_attr_alloc_align(p) __attribute__((alloc_align(p))) + #endif +#else + #define mi_cdecl + #define mi_decl_export + #define mi_decl_restrict + #define mi_attr_malloc + #define mi_attr_alloc_size(s) + #define mi_attr_alloc_size2(s1,s2) + #define mi_attr_alloc_align(p) +#endif + +// ------------------------------------------------------ +// Includes +// ------------------------------------------------------ + +#include // size_t +#include // bool +#include // INTPTR_MAX + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------------------------------------------ +// Standard malloc interface +// ------------------------------------------------------ + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_malloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_calloc(size_t count, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(1,2); +mi_decl_nodiscard mi_decl_export void* mi_realloc(void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(2); +mi_decl_export void* mi_expand(void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(2); + +mi_decl_export void mi_free(void* p) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_strdup(const char* s) mi_attr_noexcept mi_attr_malloc; +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_strndup(const char* s, size_t n) mi_attr_noexcept mi_attr_malloc; +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_realpath(const char* fname, char* resolved_name) mi_attr_noexcept mi_attr_malloc; + +// ------------------------------------------------------ +// Extended functionality +// ------------------------------------------------------ +#define MI_SMALL_WSIZE_MAX (128) +#define MI_SMALL_SIZE_MAX (MI_SMALL_WSIZE_MAX*sizeof(void*)) + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_malloc_small(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_zalloc_small(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_zalloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_mallocn(size_t count, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(1,2); +mi_decl_nodiscard mi_decl_export void* mi_reallocn(void* p, size_t count, size_t size) mi_attr_noexcept mi_attr_alloc_size2(2,3); +mi_decl_nodiscard mi_decl_export void* mi_reallocf(void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(2); + +mi_decl_nodiscard mi_decl_export size_t mi_usable_size(const void* p) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export size_t mi_good_size(size_t size) mi_attr_noexcept; + + +// ------------------------------------------------------ +// Internals +// ------------------------------------------------------ + +typedef void (mi_cdecl mi_deferred_free_fun)(bool force, unsigned long long heartbeat, void* arg); +mi_decl_export void mi_register_deferred_free(mi_deferred_free_fun* deferred_free, void* arg) mi_attr_noexcept; + +typedef void (mi_cdecl mi_output_fun)(const char* msg, void* arg); +mi_decl_export void mi_register_output(mi_output_fun* out, void* arg) mi_attr_noexcept; + +typedef void (mi_cdecl mi_error_fun)(int err, void* arg); +mi_decl_export void mi_register_error(mi_error_fun* fun, void* arg); + +mi_decl_export void mi_collect(bool force) mi_attr_noexcept; +mi_decl_export int mi_version(void) mi_attr_noexcept; +mi_decl_export void mi_stats_reset(void) mi_attr_noexcept; +mi_decl_export void mi_stats_merge(void) mi_attr_noexcept; +mi_decl_export void mi_stats_print(void* out) mi_attr_noexcept; // backward compatibility: `out` is ignored and should be NULL +mi_decl_export void mi_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept; + +mi_decl_export void mi_process_init(void) mi_attr_noexcept; +mi_decl_export void mi_thread_init(void) mi_attr_noexcept; +mi_decl_export void mi_thread_done(void) mi_attr_noexcept; +mi_decl_export void mi_thread_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept; + +mi_decl_export void mi_process_info(size_t* elapsed_msecs, size_t* user_msecs, size_t* system_msecs, + size_t* current_rss, size_t* peak_rss, + size_t* current_commit, size_t* peak_commit, size_t* page_faults) mi_attr_noexcept; + +// ------------------------------------------------------------------------------------- +// Aligned allocation +// Note that `alignment` always follows `size` for consistency with unaligned +// allocation, but unfortunately this differs from `posix_memalign` and `aligned_alloc`. +// ------------------------------------------------------------------------------------- + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_malloc_aligned(size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1) mi_attr_alloc_align(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_malloc_aligned_at(size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_zalloc_aligned(size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1) mi_attr_alloc_align(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_zalloc_aligned_at(size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_calloc_aligned(size_t count, size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(1,2) mi_attr_alloc_align(3); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_calloc_aligned_at(size_t count, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(1,2); +mi_decl_nodiscard mi_decl_export void* mi_realloc_aligned(void* p, size_t newsize, size_t alignment) mi_attr_noexcept mi_attr_alloc_size(2) mi_attr_alloc_align(3); +mi_decl_nodiscard mi_decl_export void* mi_realloc_aligned_at(void* p, size_t newsize, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size(2); + + +// ------------------------------------------------------------------------------------- +// Heaps: first-class, but can only allocate from the same thread that created it. +// ------------------------------------------------------------------------------------- + +struct mi_heap_s; +typedef struct mi_heap_s mi_heap_t; + +mi_decl_nodiscard mi_decl_export mi_heap_t* mi_heap_new(void); +mi_decl_export void mi_heap_delete(mi_heap_t* heap); +mi_decl_export void mi_heap_destroy(mi_heap_t* heap); +mi_decl_export mi_heap_t* mi_heap_set_default(mi_heap_t* heap); +mi_decl_export mi_heap_t* mi_heap_get_default(void); +mi_decl_export mi_heap_t* mi_heap_get_backing(void); +mi_decl_export void mi_heap_collect(mi_heap_t* heap, bool force) mi_attr_noexcept; + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_malloc(mi_heap_t* heap, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_zalloc(mi_heap_t* heap, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_calloc(mi_heap_t* heap, size_t count, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(2, 3); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_mallocn(mi_heap_t* heap, size_t count, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(2, 3); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_malloc_small(mi_heap_t* heap, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2); + +mi_decl_nodiscard mi_decl_export void* mi_heap_realloc(mi_heap_t* heap, void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(3); +mi_decl_nodiscard mi_decl_export void* mi_heap_reallocn(mi_heap_t* heap, void* p, size_t count, size_t size) mi_attr_noexcept mi_attr_alloc_size2(3,4); +mi_decl_nodiscard mi_decl_export void* mi_heap_reallocf(mi_heap_t* heap, void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(3); + +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_heap_strdup(mi_heap_t* heap, const char* s) mi_attr_noexcept mi_attr_malloc; +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_heap_strndup(mi_heap_t* heap, const char* s, size_t n) mi_attr_noexcept mi_attr_malloc; +mi_decl_nodiscard mi_decl_export mi_decl_restrict char* mi_heap_realpath(mi_heap_t* heap, const char* fname, char* resolved_name) mi_attr_noexcept mi_attr_malloc; + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_malloc_aligned(mi_heap_t* heap, size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(3); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_malloc_aligned_at(mi_heap_t* heap, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_zalloc_aligned(mi_heap_t* heap, size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(3); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_zalloc_aligned_at(mi_heap_t* heap, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_calloc_aligned(mi_heap_t* heap, size_t count, size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(2, 3) mi_attr_alloc_align(4); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_calloc_aligned_at(mi_heap_t* heap, size_t count, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size2(2, 3); +mi_decl_nodiscard mi_decl_export void* mi_heap_realloc_aligned(mi_heap_t* heap, void* p, size_t newsize, size_t alignment) mi_attr_noexcept mi_attr_alloc_size(3) mi_attr_alloc_align(4); +mi_decl_nodiscard mi_decl_export void* mi_heap_realloc_aligned_at(mi_heap_t* heap, void* p, size_t newsize, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size(3); + + +// -------------------------------------------------------------------------------- +// Zero initialized re-allocation. +// Only valid on memory that was originally allocated with zero initialization too. +// e.g. `mi_calloc`, `mi_zalloc`, `mi_zalloc_aligned` etc. +// see +// -------------------------------------------------------------------------------- + +mi_decl_nodiscard mi_decl_export void* mi_rezalloc(void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export void* mi_recalloc(void* p, size_t newcount, size_t size) mi_attr_noexcept mi_attr_alloc_size2(2,3); + +mi_decl_nodiscard mi_decl_export void* mi_rezalloc_aligned(void* p, size_t newsize, size_t alignment) mi_attr_noexcept mi_attr_alloc_size(2) mi_attr_alloc_align(3); +mi_decl_nodiscard mi_decl_export void* mi_rezalloc_aligned_at(void* p, size_t newsize, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export void* mi_recalloc_aligned(void* p, size_t newcount, size_t size, size_t alignment) mi_attr_noexcept mi_attr_alloc_size2(2,3) mi_attr_alloc_align(4); +mi_decl_nodiscard mi_decl_export void* mi_recalloc_aligned_at(void* p, size_t newcount, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size2(2,3); + +mi_decl_nodiscard mi_decl_export void* mi_heap_rezalloc(mi_heap_t* heap, void* p, size_t newsize) mi_attr_noexcept mi_attr_alloc_size(3); +mi_decl_nodiscard mi_decl_export void* mi_heap_recalloc(mi_heap_t* heap, void* p, size_t newcount, size_t size) mi_attr_noexcept mi_attr_alloc_size2(3,4); + +mi_decl_nodiscard mi_decl_export void* mi_heap_rezalloc_aligned(mi_heap_t* heap, void* p, size_t newsize, size_t alignment) mi_attr_noexcept mi_attr_alloc_size(3) mi_attr_alloc_align(4); +mi_decl_nodiscard mi_decl_export void* mi_heap_rezalloc_aligned_at(mi_heap_t* heap, void* p, size_t newsize, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size(3); +mi_decl_nodiscard mi_decl_export void* mi_heap_recalloc_aligned(mi_heap_t* heap, void* p, size_t newcount, size_t size, size_t alignment) mi_attr_noexcept mi_attr_alloc_size2(3,4) mi_attr_alloc_align(5); +mi_decl_nodiscard mi_decl_export void* mi_heap_recalloc_aligned_at(mi_heap_t* heap, void* p, size_t newcount, size_t size, size_t alignment, size_t offset) mi_attr_noexcept mi_attr_alloc_size2(3,4); + + +// ------------------------------------------------------ +// Analysis +// ------------------------------------------------------ + +mi_decl_export bool mi_heap_contains_block(mi_heap_t* heap, const void* p); +mi_decl_export bool mi_heap_check_owned(mi_heap_t* heap, const void* p); +mi_decl_export bool mi_check_owned(const void* p); + +// An area of heap space contains blocks of a single size. +typedef struct mi_heap_area_s { + void* blocks; // start of the area containing heap blocks + size_t reserved; // bytes reserved for this area (virtual) + size_t committed; // current available bytes for this area + size_t used; // number of allocated blocks + size_t block_size; // size in bytes of each block + size_t full_block_size; // size in bytes of a full block including padding and metadata. +} mi_heap_area_t; + +typedef bool (mi_cdecl mi_block_visit_fun)(const mi_heap_t* heap, const mi_heap_area_t* area, void* block, size_t block_size, void* arg); + +mi_decl_export bool mi_heap_visit_blocks(const mi_heap_t* heap, bool visit_all_blocks, mi_block_visit_fun* visitor, void* arg); + +// Experimental +mi_decl_nodiscard mi_decl_export bool mi_is_in_heap_region(const void* p) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export bool mi_is_redirected(void) mi_attr_noexcept; + +mi_decl_export int mi_reserve_huge_os_pages_interleave(size_t pages, size_t numa_nodes, size_t timeout_msecs) mi_attr_noexcept; +mi_decl_export int mi_reserve_huge_os_pages_at(size_t pages, int numa_node, size_t timeout_msecs) mi_attr_noexcept; + +mi_decl_export int mi_reserve_os_memory(size_t size, bool commit, bool allow_large) mi_attr_noexcept; +mi_decl_export bool mi_manage_os_memory(void* start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node) mi_attr_noexcept; + +mi_decl_export void mi_debug_show_arenas(void) mi_attr_noexcept; + +// Experimental: heaps associated with specific memory arena's +typedef int mi_arena_id_t; +mi_decl_export void* mi_arena_area(mi_arena_id_t arena_id, size_t* size); +mi_decl_export int mi_reserve_huge_os_pages_at_ex(size_t pages, int numa_node, size_t timeout_msecs, bool exclusive, mi_arena_id_t* arena_id) mi_attr_noexcept; +mi_decl_export int mi_reserve_os_memory_ex(size_t size, bool commit, bool allow_large, bool exclusive, mi_arena_id_t* arena_id) mi_attr_noexcept; +mi_decl_export bool mi_manage_os_memory_ex(void* start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node, bool exclusive, mi_arena_id_t* arena_id) mi_attr_noexcept; + +#if MI_MALLOC_VERSION >= 182 +// Create a heap that only allocates in the specified arena +mi_decl_nodiscard mi_decl_export mi_heap_t* mi_heap_new_in_arena(mi_arena_id_t arena_id); +#endif + +// deprecated +mi_decl_export int mi_reserve_huge_os_pages(size_t pages, double max_secs, size_t* pages_reserved) mi_attr_noexcept; + + +// ------------------------------------------------------ +// Convenience +// ------------------------------------------------------ + +#define mi_malloc_tp(tp) ((tp*)mi_malloc(sizeof(tp))) +#define mi_zalloc_tp(tp) ((tp*)mi_zalloc(sizeof(tp))) +#define mi_calloc_tp(tp,n) ((tp*)mi_calloc(n,sizeof(tp))) +#define mi_mallocn_tp(tp,n) ((tp*)mi_mallocn(n,sizeof(tp))) +#define mi_reallocn_tp(p,tp,n) ((tp*)mi_reallocn(p,n,sizeof(tp))) +#define mi_recalloc_tp(p,tp,n) ((tp*)mi_recalloc(p,n,sizeof(tp))) + +#define mi_heap_malloc_tp(hp,tp) ((tp*)mi_heap_malloc(hp,sizeof(tp))) +#define mi_heap_zalloc_tp(hp,tp) ((tp*)mi_heap_zalloc(hp,sizeof(tp))) +#define mi_heap_calloc_tp(hp,tp,n) ((tp*)mi_heap_calloc(hp,n,sizeof(tp))) +#define mi_heap_mallocn_tp(hp,tp,n) ((tp*)mi_heap_mallocn(hp,n,sizeof(tp))) +#define mi_heap_reallocn_tp(hp,p,tp,n) ((tp*)mi_heap_reallocn(hp,p,n,sizeof(tp))) +#define mi_heap_recalloc_tp(hp,p,tp,n) ((tp*)mi_heap_recalloc(hp,p,n,sizeof(tp))) + + +// ------------------------------------------------------ +// Options +// ------------------------------------------------------ + +typedef enum mi_option_e { + // stable options + mi_option_show_errors, // print error messages + mi_option_show_stats, // print statistics on termination + mi_option_verbose, // print verbose messages + // the following options are experimental (see src/options.h) + mi_option_eager_commit, // eager commit segments? (after `eager_commit_delay` segments) (=1) + mi_option_arena_eager_commit, // eager commit arenas? Use 2 to enable just on overcommit systems (=2) + mi_option_purge_decommits, // should a memory purge decommit (or only reset) (=1) + mi_option_allow_large_os_pages, // allow large (2MiB) OS pages, implies eager commit + mi_option_reserve_huge_os_pages, // reserve N huge OS pages (1GiB/page) at startup + mi_option_reserve_huge_os_pages_at, // reserve huge OS pages at a specific NUMA node + mi_option_reserve_os_memory, // reserve specified amount of OS memory in an arena at startup + mi_option_deprecated_segment_cache, + mi_option_deprecated_page_reset, + mi_option_abandoned_page_purge, // immediately purge delayed purges on thread termination + mi_option_deprecated_segment_reset, + mi_option_eager_commit_delay, + mi_option_purge_delay, // memory purging is delayed by N milli seconds; use 0 for immediate purging or -1 for no purging at all. + mi_option_use_numa_nodes, // 0 = use all available numa nodes, otherwise use at most N nodes. + mi_option_limit_os_alloc, // 1 = do not use OS memory for allocation (but only programmatically reserved arenas) + mi_option_os_tag, // tag used for OS logging (macOS only for now) + mi_option_max_errors, // issue at most N error messages + mi_option_max_warnings, // issue at most N warning messages + mi_option_max_segment_reclaim, + mi_option_destroy_on_exit, // if set, release all memory on exit; sometimes used for dynamic unloading but can be unsafe. + mi_option_arena_reserve, // initial memory size in KiB for arena reservation (1GiB on 64-bit) + mi_option_arena_purge_mult, + mi_option_purge_extend_delay, + _mi_option_last, + // legacy option names + mi_option_large_os_pages = mi_option_allow_large_os_pages, + mi_option_eager_region_commit = mi_option_arena_eager_commit, + mi_option_reset_decommits = mi_option_purge_decommits, + mi_option_reset_delay = mi_option_purge_delay, + mi_option_abandoned_page_reset = mi_option_abandoned_page_purge +} mi_option_t; + + +mi_decl_nodiscard mi_decl_export bool mi_option_is_enabled(mi_option_t option); +mi_decl_export void mi_option_enable(mi_option_t option); +mi_decl_export void mi_option_disable(mi_option_t option); +mi_decl_export void mi_option_set_enabled(mi_option_t option, bool enable); +mi_decl_export void mi_option_set_enabled_default(mi_option_t option, bool enable); + +mi_decl_nodiscard mi_decl_export long mi_option_get(mi_option_t option); +mi_decl_nodiscard mi_decl_export long mi_option_get_clamp(mi_option_t option, long min, long max); +mi_decl_nodiscard mi_decl_export size_t mi_option_get_size(mi_option_t option); +mi_decl_export void mi_option_set(mi_option_t option, long value); +mi_decl_export void mi_option_set_default(mi_option_t option, long value); + + +// ------------------------------------------------------------------------------------------------------- +// "mi" prefixed implementations of various posix, Unix, Windows, and C++ allocation functions. +// (This can be convenient when providing overrides of these functions as done in `mimalloc-override.h`.) +// note: we use `mi_cfree` as "checked free" and it checks if the pointer is in our heap before free-ing. +// ------------------------------------------------------------------------------------------------------- + +mi_decl_export void mi_cfree(void* p) mi_attr_noexcept; +mi_decl_export void* mi__expand(void* p, size_t newsize) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export size_t mi_malloc_size(const void* p) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export size_t mi_malloc_good_size(size_t size) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export size_t mi_malloc_usable_size(const void *p) mi_attr_noexcept; + +mi_decl_export int mi_posix_memalign(void** p, size_t alignment, size_t size) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_memalign(size_t alignment, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_valloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_pvalloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_aligned_alloc(size_t alignment, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(1); + +mi_decl_nodiscard mi_decl_export void* mi_reallocarray(void* p, size_t count, size_t size) mi_attr_noexcept mi_attr_alloc_size2(2,3); +mi_decl_nodiscard mi_decl_export int mi_reallocarr(void* p, size_t count, size_t size) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export void* mi_aligned_recalloc(void* p, size_t newcount, size_t size, size_t alignment) mi_attr_noexcept; +mi_decl_nodiscard mi_decl_export void* mi_aligned_offset_recalloc(void* p, size_t newcount, size_t size, size_t alignment, size_t offset) mi_attr_noexcept; + +mi_decl_nodiscard mi_decl_export mi_decl_restrict unsigned short* mi_wcsdup(const unsigned short* s) mi_attr_noexcept mi_attr_malloc; +mi_decl_nodiscard mi_decl_export mi_decl_restrict unsigned char* mi_mbsdup(const unsigned char* s) mi_attr_noexcept mi_attr_malloc; +mi_decl_export int mi_dupenv_s(char** buf, size_t* size, const char* name) mi_attr_noexcept; +mi_decl_export int mi_wdupenv_s(unsigned short** buf, size_t* size, const unsigned short* name) mi_attr_noexcept; + +mi_decl_export void mi_free_size(void* p, size_t size) mi_attr_noexcept; +mi_decl_export void mi_free_size_aligned(void* p, size_t size, size_t alignment) mi_attr_noexcept; +mi_decl_export void mi_free_aligned(void* p, size_t alignment) mi_attr_noexcept; + +// The `mi_new` wrappers implement C++ semantics on out-of-memory instead of directly returning `NULL`. +// (and call `std::get_new_handler` and potentially raise a `std::bad_alloc` exception). +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new(size_t size) mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_aligned(size_t size, size_t alignment) mi_attr_malloc mi_attr_alloc_size(1) mi_attr_alloc_align(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_nothrow(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_aligned_nothrow(size_t size, size_t alignment) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1) mi_attr_alloc_align(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_new_n(size_t count, size_t size) mi_attr_malloc mi_attr_alloc_size2(1, 2); +mi_decl_nodiscard mi_decl_export void* mi_new_realloc(void* p, size_t newsize) mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export void* mi_new_reallocn(void* p, size_t newcount, size_t size) mi_attr_alloc_size2(2, 3); + +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_alloc_new(mi_heap_t* heap, size_t size) mi_attr_malloc mi_attr_alloc_size(2); +mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_heap_alloc_new_n(mi_heap_t* heap, size_t count, size_t size) mi_attr_malloc mi_attr_alloc_size2(2, 3); + +#ifdef __cplusplus +} +#endif + +// --------------------------------------------------------------------------------------------- +// Implement the C++ std::allocator interface for use in STL containers. +// (note: see `mimalloc-new-delete.h` for overriding the new/delete operators globally) +// --------------------------------------------------------------------------------------------- +#ifdef __cplusplus + +#include // std::size_t +#include // PTRDIFF_MAX +#if (__cplusplus >= 201103L) || (_MSC_VER > 1900) // C++11 +#include // std::true_type +#include // std::forward +#endif + +template struct _mi_stl_allocator_common { + typedef T value_type; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef value_type& reference; + typedef value_type const& const_reference; + typedef value_type* pointer; + typedef value_type const* const_pointer; + + #if ((__cplusplus >= 201103L) || (_MSC_VER > 1900)) // C++11 + using propagate_on_container_copy_assignment = std::true_type; + using propagate_on_container_move_assignment = std::true_type; + using propagate_on_container_swap = std::true_type; + template void construct(U* p, Args&& ...args) { ::new(p) U(std::forward(args)...); } + template void destroy(U* p) mi_attr_noexcept { p->~U(); } + #else + void construct(pointer p, value_type const& val) { ::new(p) value_type(val); } + void destroy(pointer p) { p->~value_type(); } + #endif + + size_type max_size() const mi_attr_noexcept { return (PTRDIFF_MAX/sizeof(value_type)); } + pointer address(reference x) const { return &x; } + const_pointer address(const_reference x) const { return &x; } +}; + +template struct mi_stl_allocator : public _mi_stl_allocator_common { + using typename _mi_stl_allocator_common::size_type; + using typename _mi_stl_allocator_common::value_type; + using typename _mi_stl_allocator_common::pointer; + template struct rebind { typedef mi_stl_allocator other; }; + + mi_stl_allocator() mi_attr_noexcept = default; + mi_stl_allocator(const mi_stl_allocator&) mi_attr_noexcept = default; + template mi_stl_allocator(const mi_stl_allocator&) mi_attr_noexcept { } + mi_stl_allocator select_on_container_copy_construction() const { return *this; } + void deallocate(T* p, size_type) { mi_free(p); } + + #if (__cplusplus >= 201703L) // C++17 + mi_decl_nodiscard T* allocate(size_type count) { return static_cast(mi_new_n(count, sizeof(T))); } + mi_decl_nodiscard T* allocate(size_type count, const void*) { return allocate(count); } + #else + mi_decl_nodiscard pointer allocate(size_type count, const void* = 0) { return static_cast(mi_new_n(count, sizeof(value_type))); } + #endif + + #if ((__cplusplus >= 201103L) || (_MSC_VER > 1900)) // C++11 + using is_always_equal = std::true_type; + #endif +}; + +template bool operator==(const mi_stl_allocator& , const mi_stl_allocator& ) mi_attr_noexcept { return true; } +template bool operator!=(const mi_stl_allocator& , const mi_stl_allocator& ) mi_attr_noexcept { return false; } + + +#if (__cplusplus >= 201103L) || (_MSC_VER >= 1900) // C++11 +#define MI_HAS_HEAP_STL_ALLOCATOR 1 + +#include // std::shared_ptr + +// Common base class for STL allocators in a specific heap +template struct _mi_heap_stl_allocator_common : public _mi_stl_allocator_common { + using typename _mi_stl_allocator_common::size_type; + using typename _mi_stl_allocator_common::value_type; + using typename _mi_stl_allocator_common::pointer; + + _mi_heap_stl_allocator_common(mi_heap_t* hp) : heap(hp) { } /* will not delete nor destroy the passed in heap */ + + #if (__cplusplus >= 201703L) // C++17 + mi_decl_nodiscard T* allocate(size_type count) { return static_cast(mi_heap_alloc_new_n(this->heap.get(), count, sizeof(T))); } + mi_decl_nodiscard T* allocate(size_type count, const void*) { return allocate(count); } + #else + mi_decl_nodiscard pointer allocate(size_type count, const void* = 0) { return static_cast(mi_heap_alloc_new_n(this->heap.get(), count, sizeof(value_type))); } + #endif + + #if ((__cplusplus >= 201103L) || (_MSC_VER > 1900)) // C++11 + using is_always_equal = std::false_type; + #endif + + void collect(bool force) { mi_heap_collect(this->heap.get(), force); } + template bool is_equal(const _mi_heap_stl_allocator_common& x) const { return (this->heap == x.heap); } + +protected: + std::shared_ptr heap; + template friend struct _mi_heap_stl_allocator_common; + + _mi_heap_stl_allocator_common() { + mi_heap_t* hp = mi_heap_new(); + this->heap.reset(hp, (_mi_destroy ? &heap_destroy : &heap_delete)); /* calls heap_delete/destroy when the refcount drops to zero */ + } + _mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common& x) mi_attr_noexcept : heap(x.heap) { } + template _mi_heap_stl_allocator_common(const _mi_heap_stl_allocator_common& x) mi_attr_noexcept : heap(x.heap) { } + +private: + static void heap_delete(mi_heap_t* hp) { if (hp != NULL) { mi_heap_delete(hp); } } + static void heap_destroy(mi_heap_t* hp) { if (hp != NULL) { mi_heap_destroy(hp); } } +}; + +// STL allocator allocation in a specific heap +template struct mi_heap_stl_allocator : public _mi_heap_stl_allocator_common { + using typename _mi_heap_stl_allocator_common::size_type; + mi_heap_stl_allocator() : _mi_heap_stl_allocator_common() { } // creates fresh heap that is deleted when the destructor is called + mi_heap_stl_allocator(mi_heap_t* hp) : _mi_heap_stl_allocator_common(hp) { } // no delete nor destroy on the passed in heap + template mi_heap_stl_allocator(const mi_heap_stl_allocator& x) mi_attr_noexcept : _mi_heap_stl_allocator_common(x) { } + + mi_heap_stl_allocator select_on_container_copy_construction() const { return *this; } + void deallocate(T* p, size_type) { mi_free(p); } + template struct rebind { typedef mi_heap_stl_allocator other; }; +}; + +template bool operator==(const mi_heap_stl_allocator& x, const mi_heap_stl_allocator& y) mi_attr_noexcept { return (x.is_equal(y)); } +template bool operator!=(const mi_heap_stl_allocator& x, const mi_heap_stl_allocator& y) mi_attr_noexcept { return (!x.is_equal(y)); } + + +// STL allocator allocation in a specific heap, where `free` does nothing and +// the heap is destroyed in one go on destruction -- use with care! +template struct mi_heap_destroy_stl_allocator : public _mi_heap_stl_allocator_common { + using typename _mi_heap_stl_allocator_common::size_type; + mi_heap_destroy_stl_allocator() : _mi_heap_stl_allocator_common() { } // creates fresh heap that is destroyed when the destructor is called + mi_heap_destroy_stl_allocator(mi_heap_t* hp) : _mi_heap_stl_allocator_common(hp) { } // no delete nor destroy on the passed in heap + template mi_heap_destroy_stl_allocator(const mi_heap_destroy_stl_allocator& x) mi_attr_noexcept : _mi_heap_stl_allocator_common(x) { } + + mi_heap_destroy_stl_allocator select_on_container_copy_construction() const { return *this; } + void deallocate(T*, size_type) { /* do nothing as we destroy the heap on destruct. */ } + template struct rebind { typedef mi_heap_destroy_stl_allocator other; }; +}; + +template bool operator==(const mi_heap_destroy_stl_allocator& x, const mi_heap_destroy_stl_allocator& y) mi_attr_noexcept { return (x.is_equal(y)); } +template bool operator!=(const mi_heap_destroy_stl_allocator& x, const mi_heap_destroy_stl_allocator& y) mi_attr_noexcept { return (!x.is_equal(y)); } + +#endif // C++11 + +#endif // __cplusplus + +#endif diff --git a/Include/internal/mimalloc/mimalloc/atomic.h b/Include/internal/mimalloc/mimalloc/atomic.h new file mode 100644 index 00000000..1093c540 --- /dev/null +++ b/Include/internal/mimalloc/mimalloc/atomic.h @@ -0,0 +1,389 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023 Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_ATOMIC_H +#define MIMALLOC_ATOMIC_H + +// -------------------------------------------------------------------------------------------- +// Atomics +// We need to be portable between C, C++, and MSVC. +// We base the primitives on the C/C++ atomics and create a mimimal wrapper for MSVC in C compilation mode. +// This is why we try to use only `uintptr_t` and `*` as atomic types. +// To gain better insight in the range of used atomics, we use explicitly named memory order operations +// instead of passing the memory order as a parameter. +// ----------------------------------------------------------------------------------------------- + +#if defined(__cplusplus) +// Use C++ atomics +#include +#define _Atomic(tp) std::atomic +#define mi_atomic(name) std::atomic_##name +#define mi_memory_order(name) std::memory_order_##name +#if (__cplusplus >= 202002L) // c++20, see issue #571 + #define MI_ATOMIC_VAR_INIT(x) x +#elif !defined(ATOMIC_VAR_INIT) + #define MI_ATOMIC_VAR_INIT(x) x +#else + #define MI_ATOMIC_VAR_INIT(x) ATOMIC_VAR_INIT(x) +#endif +#elif defined(_MSC_VER) +// Use MSVC C wrapper for C11 atomics +#define _Atomic(tp) tp +#define MI_ATOMIC_VAR_INIT(x) x +#define mi_atomic(name) mi_atomic_##name +#define mi_memory_order(name) mi_memory_order_##name +#else +// Use C11 atomics +#include +#define mi_atomic(name) atomic_##name +#define mi_memory_order(name) memory_order_##name +#if (__STDC_VERSION__ >= 201710L) // c17, see issue #735 + #define MI_ATOMIC_VAR_INIT(x) x +#elif !defined(ATOMIC_VAR_INIT) + #define MI_ATOMIC_VAR_INIT(x) x +#else + #define MI_ATOMIC_VAR_INIT(x) ATOMIC_VAR_INIT(x) +#endif +#endif + +// Various defines for all used memory orders in mimalloc +#define mi_atomic_cas_weak(p,expected,desired,mem_success,mem_fail) \ + mi_atomic(compare_exchange_weak_explicit)(p,expected,desired,mem_success,mem_fail) + +#define mi_atomic_cas_strong(p,expected,desired,mem_success,mem_fail) \ + mi_atomic(compare_exchange_strong_explicit)(p,expected,desired,mem_success,mem_fail) + +#define mi_atomic_load_acquire(p) mi_atomic(load_explicit)(p,mi_memory_order(acquire)) +#define mi_atomic_load_relaxed(p) mi_atomic(load_explicit)(p,mi_memory_order(relaxed)) +#define mi_atomic_store_release(p,x) mi_atomic(store_explicit)(p,x,mi_memory_order(release)) +#define mi_atomic_store_relaxed(p,x) mi_atomic(store_explicit)(p,x,mi_memory_order(relaxed)) +#define mi_atomic_exchange_release(p,x) mi_atomic(exchange_explicit)(p,x,mi_memory_order(release)) +#define mi_atomic_exchange_acq_rel(p,x) mi_atomic(exchange_explicit)(p,x,mi_memory_order(acq_rel)) +#define mi_atomic_cas_weak_release(p,exp,des) mi_atomic_cas_weak(p,exp,des,mi_memory_order(release),mi_memory_order(relaxed)) +#define mi_atomic_cas_weak_acq_rel(p,exp,des) mi_atomic_cas_weak(p,exp,des,mi_memory_order(acq_rel),mi_memory_order(acquire)) +#define mi_atomic_cas_strong_release(p,exp,des) mi_atomic_cas_strong(p,exp,des,mi_memory_order(release),mi_memory_order(relaxed)) +#define mi_atomic_cas_strong_acq_rel(p,exp,des) mi_atomic_cas_strong(p,exp,des,mi_memory_order(acq_rel),mi_memory_order(acquire)) + +#define mi_atomic_add_relaxed(p,x) mi_atomic(fetch_add_explicit)(p,x,mi_memory_order(relaxed)) +#define mi_atomic_sub_relaxed(p,x) mi_atomic(fetch_sub_explicit)(p,x,mi_memory_order(relaxed)) +#define mi_atomic_add_acq_rel(p,x) mi_atomic(fetch_add_explicit)(p,x,mi_memory_order(acq_rel)) +#define mi_atomic_sub_acq_rel(p,x) mi_atomic(fetch_sub_explicit)(p,x,mi_memory_order(acq_rel)) +#define mi_atomic_and_acq_rel(p,x) mi_atomic(fetch_and_explicit)(p,x,mi_memory_order(acq_rel)) +#define mi_atomic_or_acq_rel(p,x) mi_atomic(fetch_or_explicit)(p,x,mi_memory_order(acq_rel)) + +#define mi_atomic_increment_relaxed(p) mi_atomic_add_relaxed(p,(uintptr_t)1) +#define mi_atomic_decrement_relaxed(p) mi_atomic_sub_relaxed(p,(uintptr_t)1) +#define mi_atomic_increment_acq_rel(p) mi_atomic_add_acq_rel(p,(uintptr_t)1) +#define mi_atomic_decrement_acq_rel(p) mi_atomic_sub_acq_rel(p,(uintptr_t)1) + +static inline void mi_atomic_yield(void); +static inline intptr_t mi_atomic_addi(_Atomic(intptr_t)*p, intptr_t add); +static inline intptr_t mi_atomic_subi(_Atomic(intptr_t)*p, intptr_t sub); + + +#if defined(__cplusplus) || !defined(_MSC_VER) + +// In C++/C11 atomics we have polymorphic atomics so can use the typed `ptr` variants (where `tp` is the type of atomic value) +// We use these macros so we can provide a typed wrapper in MSVC in C compilation mode as well +#define mi_atomic_load_ptr_acquire(tp,p) mi_atomic_load_acquire(p) +#define mi_atomic_load_ptr_relaxed(tp,p) mi_atomic_load_relaxed(p) + +// In C++ we need to add casts to help resolve templates if NULL is passed +#if defined(__cplusplus) +#define mi_atomic_store_ptr_release(tp,p,x) mi_atomic_store_release(p,(tp*)x) +#define mi_atomic_store_ptr_relaxed(tp,p,x) mi_atomic_store_relaxed(p,(tp*)x) +#define mi_atomic_cas_ptr_weak_release(tp,p,exp,des) mi_atomic_cas_weak_release(p,exp,(tp*)des) +#define mi_atomic_cas_ptr_weak_acq_rel(tp,p,exp,des) mi_atomic_cas_weak_acq_rel(p,exp,(tp*)des) +#define mi_atomic_cas_ptr_strong_release(tp,p,exp,des) mi_atomic_cas_strong_release(p,exp,(tp*)des) +#define mi_atomic_exchange_ptr_release(tp,p,x) mi_atomic_exchange_release(p,(tp*)x) +#define mi_atomic_exchange_ptr_acq_rel(tp,p,x) mi_atomic_exchange_acq_rel(p,(tp*)x) +#else +#define mi_atomic_store_ptr_release(tp,p,x) mi_atomic_store_release(p,x) +#define mi_atomic_store_ptr_relaxed(tp,p,x) mi_atomic_store_relaxed(p,x) +#define mi_atomic_cas_ptr_weak_release(tp,p,exp,des) mi_atomic_cas_weak_release(p,exp,des) +#define mi_atomic_cas_ptr_weak_acq_rel(tp,p,exp,des) mi_atomic_cas_weak_acq_rel(p,exp,des) +#define mi_atomic_cas_ptr_strong_release(tp,p,exp,des) mi_atomic_cas_strong_release(p,exp,des) +#define mi_atomic_exchange_ptr_release(tp,p,x) mi_atomic_exchange_release(p,x) +#define mi_atomic_exchange_ptr_acq_rel(tp,p,x) mi_atomic_exchange_acq_rel(p,x) +#endif + +// These are used by the statistics +static inline int64_t mi_atomic_addi64_relaxed(volatile int64_t* p, int64_t add) { + return mi_atomic(fetch_add_explicit)((_Atomic(int64_t)*)p, add, mi_memory_order(relaxed)); +} +static inline void mi_atomic_maxi64_relaxed(volatile int64_t* p, int64_t x) { + int64_t current = mi_atomic_load_relaxed((_Atomic(int64_t)*)p); + while (current < x && !mi_atomic_cas_weak_release((_Atomic(int64_t)*)p, ¤t, x)) { /* nothing */ }; +} + +// Used by timers +#define mi_atomic_loadi64_acquire(p) mi_atomic(load_explicit)(p,mi_memory_order(acquire)) +#define mi_atomic_loadi64_relaxed(p) mi_atomic(load_explicit)(p,mi_memory_order(relaxed)) +#define mi_atomic_storei64_release(p,x) mi_atomic(store_explicit)(p,x,mi_memory_order(release)) +#define mi_atomic_storei64_relaxed(p,x) mi_atomic(store_explicit)(p,x,mi_memory_order(relaxed)) + +#define mi_atomic_casi64_strong_acq_rel(p,e,d) mi_atomic_cas_strong_acq_rel(p,e,d) +#define mi_atomic_addi64_acq_rel(p,i) mi_atomic_add_acq_rel(p,i) + + +#elif defined(_MSC_VER) + +// MSVC C compilation wrapper that uses Interlocked operations to model C11 atomics. +#define WIN32_LEAN_AND_MEAN +#include +#include +#ifdef _WIN64 +typedef LONG64 msc_intptr_t; +#define MI_64(f) f##64 +#else +typedef LONG msc_intptr_t; +#define MI_64(f) f +#endif + +typedef enum mi_memory_order_e { + mi_memory_order_relaxed, + mi_memory_order_consume, + mi_memory_order_acquire, + mi_memory_order_release, + mi_memory_order_acq_rel, + mi_memory_order_seq_cst +} mi_memory_order; + +static inline uintptr_t mi_atomic_fetch_add_explicit(_Atomic(uintptr_t)*p, uintptr_t add, mi_memory_order mo) { + (void)(mo); + return (uintptr_t)MI_64(_InterlockedExchangeAdd)((volatile msc_intptr_t*)p, (msc_intptr_t)add); +} +static inline uintptr_t mi_atomic_fetch_sub_explicit(_Atomic(uintptr_t)*p, uintptr_t sub, mi_memory_order mo) { + (void)(mo); + return (uintptr_t)MI_64(_InterlockedExchangeAdd)((volatile msc_intptr_t*)p, -((msc_intptr_t)sub)); +} +static inline uintptr_t mi_atomic_fetch_and_explicit(_Atomic(uintptr_t)*p, uintptr_t x, mi_memory_order mo) { + (void)(mo); + return (uintptr_t)MI_64(_InterlockedAnd)((volatile msc_intptr_t*)p, (msc_intptr_t)x); +} +static inline uintptr_t mi_atomic_fetch_or_explicit(_Atomic(uintptr_t)*p, uintptr_t x, mi_memory_order mo) { + (void)(mo); + return (uintptr_t)MI_64(_InterlockedOr)((volatile msc_intptr_t*)p, (msc_intptr_t)x); +} +static inline bool mi_atomic_compare_exchange_strong_explicit(_Atomic(uintptr_t)*p, uintptr_t* expected, uintptr_t desired, mi_memory_order mo1, mi_memory_order mo2) { + (void)(mo1); (void)(mo2); + uintptr_t read = (uintptr_t)MI_64(_InterlockedCompareExchange)((volatile msc_intptr_t*)p, (msc_intptr_t)desired, (msc_intptr_t)(*expected)); + if (read == *expected) { + return true; + } + else { + *expected = read; + return false; + } +} +static inline bool mi_atomic_compare_exchange_weak_explicit(_Atomic(uintptr_t)*p, uintptr_t* expected, uintptr_t desired, mi_memory_order mo1, mi_memory_order mo2) { + return mi_atomic_compare_exchange_strong_explicit(p, expected, desired, mo1, mo2); +} +static inline uintptr_t mi_atomic_exchange_explicit(_Atomic(uintptr_t)*p, uintptr_t exchange, mi_memory_order mo) { + (void)(mo); + return (uintptr_t)MI_64(_InterlockedExchange)((volatile msc_intptr_t*)p, (msc_intptr_t)exchange); +} +static inline void mi_atomic_thread_fence(mi_memory_order mo) { + (void)(mo); + _Atomic(uintptr_t) x = 0; + mi_atomic_exchange_explicit(&x, 1, mo); +} +static inline uintptr_t mi_atomic_load_explicit(_Atomic(uintptr_t) const* p, mi_memory_order mo) { + (void)(mo); +#if defined(_M_IX86) || defined(_M_X64) + return *p; +#else + uintptr_t x = *p; + if (mo > mi_memory_order_relaxed) { + while (!mi_atomic_compare_exchange_weak_explicit((_Atomic(uintptr_t)*)p, &x, x, mo, mi_memory_order_relaxed)) { /* nothing */ }; + } + return x; +#endif +} +static inline void mi_atomic_store_explicit(_Atomic(uintptr_t)*p, uintptr_t x, mi_memory_order mo) { + (void)(mo); +#if defined(_M_IX86) || defined(_M_X64) + *p = x; +#else + mi_atomic_exchange_explicit(p, x, mo); +#endif +} +static inline int64_t mi_atomic_loadi64_explicit(_Atomic(int64_t)*p, mi_memory_order mo) { + (void)(mo); +#if defined(_M_X64) + return *p; +#else + int64_t old = *p; + int64_t x = old; + while ((old = InterlockedCompareExchange64(p, x, old)) != x) { + x = old; + } + return x; +#endif +} +static inline void mi_atomic_storei64_explicit(_Atomic(int64_t)*p, int64_t x, mi_memory_order mo) { + (void)(mo); +#if defined(x_M_IX86) || defined(_M_X64) + *p = x; +#else + InterlockedExchange64(p, x); +#endif +} + +// These are used by the statistics +static inline int64_t mi_atomic_addi64_relaxed(volatile _Atomic(int64_t)*p, int64_t add) { +#ifdef _WIN64 + return (int64_t)mi_atomic_addi((int64_t*)p, add); +#else + int64_t current; + int64_t sum; + do { + current = *p; + sum = current + add; + } while (_InterlockedCompareExchange64(p, sum, current) != current); + return current; +#endif +} +static inline void mi_atomic_maxi64_relaxed(volatile _Atomic(int64_t)*p, int64_t x) { + int64_t current; + do { + current = *p; + } while (current < x && _InterlockedCompareExchange64(p, x, current) != current); +} + +static inline void mi_atomic_addi64_acq_rel(volatile _Atomic(int64_t*)p, int64_t i) { + mi_atomic_addi64_relaxed(p, i); +} + +static inline bool mi_atomic_casi64_strong_acq_rel(volatile _Atomic(int64_t*)p, int64_t* exp, int64_t des) { + int64_t read = _InterlockedCompareExchange64(p, des, *exp); + if (read == *exp) { + return true; + } + else { + *exp = read; + return false; + } +} + +// The pointer macros cast to `uintptr_t`. +#define mi_atomic_load_ptr_acquire(tp,p) (tp*)mi_atomic_load_acquire((_Atomic(uintptr_t)*)(p)) +#define mi_atomic_load_ptr_relaxed(tp,p) (tp*)mi_atomic_load_relaxed((_Atomic(uintptr_t)*)(p)) +#define mi_atomic_store_ptr_release(tp,p,x) mi_atomic_store_release((_Atomic(uintptr_t)*)(p),(uintptr_t)(x)) +#define mi_atomic_store_ptr_relaxed(tp,p,x) mi_atomic_store_relaxed((_Atomic(uintptr_t)*)(p),(uintptr_t)(x)) +#define mi_atomic_cas_ptr_weak_release(tp,p,exp,des) mi_atomic_cas_weak_release((_Atomic(uintptr_t)*)(p),(uintptr_t*)exp,(uintptr_t)des) +#define mi_atomic_cas_ptr_weak_acq_rel(tp,p,exp,des) mi_atomic_cas_weak_acq_rel((_Atomic(uintptr_t)*)(p),(uintptr_t*)exp,(uintptr_t)des) +#define mi_atomic_cas_ptr_strong_release(tp,p,exp,des) mi_atomic_cas_strong_release((_Atomic(uintptr_t)*)(p),(uintptr_t*)exp,(uintptr_t)des) +#define mi_atomic_exchange_ptr_release(tp,p,x) (tp*)mi_atomic_exchange_release((_Atomic(uintptr_t)*)(p),(uintptr_t)x) +#define mi_atomic_exchange_ptr_acq_rel(tp,p,x) (tp*)mi_atomic_exchange_acq_rel((_Atomic(uintptr_t)*)(p),(uintptr_t)x) + +#define mi_atomic_loadi64_acquire(p) mi_atomic(loadi64_explicit)(p,mi_memory_order(acquire)) +#define mi_atomic_loadi64_relaxed(p) mi_atomic(loadi64_explicit)(p,mi_memory_order(relaxed)) +#define mi_atomic_storei64_release(p,x) mi_atomic(storei64_explicit)(p,x,mi_memory_order(release)) +#define mi_atomic_storei64_relaxed(p,x) mi_atomic(storei64_explicit)(p,x,mi_memory_order(relaxed)) + + +#endif + + +// Atomically add a signed value; returns the previous value. +static inline intptr_t mi_atomic_addi(_Atomic(intptr_t)*p, intptr_t add) { + return (intptr_t)mi_atomic_add_acq_rel((_Atomic(uintptr_t)*)p, (uintptr_t)add); +} + +// Atomically subtract a signed value; returns the previous value. +static inline intptr_t mi_atomic_subi(_Atomic(intptr_t)*p, intptr_t sub) { + return (intptr_t)mi_atomic_addi(p, -sub); +} + +typedef _Atomic(uintptr_t) mi_atomic_once_t; + +// Returns true only on the first invocation +static inline bool mi_atomic_once( mi_atomic_once_t* once ) { + if (mi_atomic_load_relaxed(once) != 0) return false; // quick test + uintptr_t expected = 0; + return mi_atomic_cas_strong_acq_rel(once, &expected, (uintptr_t)1); // try to set to 1 +} + +typedef _Atomic(uintptr_t) mi_atomic_guard_t; + +// Allows only one thread to execute at a time +#define mi_atomic_guard(guard) \ + uintptr_t _mi_guard_expected = 0; \ + for(bool _mi_guard_once = true; \ + _mi_guard_once && mi_atomic_cas_strong_acq_rel(guard,&_mi_guard_expected,(uintptr_t)1); \ + (mi_atomic_store_release(guard,(uintptr_t)0), _mi_guard_once = false) ) + + + +// Yield +#if defined(__cplusplus) +#include +static inline void mi_atomic_yield(void) { + std::this_thread::yield(); +} +#elif defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +static inline void mi_atomic_yield(void) { + YieldProcessor(); +} +#elif defined(__SSE2__) +#include +static inline void mi_atomic_yield(void) { + _mm_pause(); +} +#elif (defined(__GNUC__) || defined(__clang__)) && \ + (defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__armel__) || defined(__ARMEL__) || \ + defined(__aarch64__) || defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) || defined(__POWERPC__) +#if defined(__x86_64__) || defined(__i386__) +static inline void mi_atomic_yield(void) { + __asm__ volatile ("pause" ::: "memory"); +} +#elif defined(__aarch64__) +static inline void mi_atomic_yield(void) { + __asm__ volatile("wfe"); +} +#elif (defined(__arm__) && __ARM_ARCH__ >= 7) +static inline void mi_atomic_yield(void) { + __asm__ volatile("yield" ::: "memory"); +} +#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || defined(__POWERPC__) +#ifdef __APPLE__ +static inline void mi_atomic_yield(void) { + __asm__ volatile ("or r27,r27,r27" ::: "memory"); +} +#else +static inline void mi_atomic_yield(void) { + __asm__ __volatile__ ("or 27,27,27" ::: "memory"); +} +#endif +#elif defined(__armel__) || defined(__ARMEL__) +static inline void mi_atomic_yield(void) { + __asm__ volatile ("nop" ::: "memory"); +} +#endif +#elif defined(__sun) +// Fallback for other archs +#include +static inline void mi_atomic_yield(void) { + smt_pause(); +} +#elif defined(__wasi__) +#include +static inline void mi_atomic_yield(void) { + sched_yield(); +} +#else +#include +static inline void mi_atomic_yield(void) { + sleep(0); +} +#endif + + +#endif // __MIMALLOC_ATOMIC_H diff --git a/Include/internal/mimalloc/mimalloc/internal.h b/Include/internal/mimalloc/mimalloc/internal.h new file mode 100644 index 00000000..94f88fb6 --- /dev/null +++ b/Include/internal/mimalloc/mimalloc/internal.h @@ -0,0 +1,969 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023, Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_INTERNAL_H +#define MIMALLOC_INTERNAL_H + + +// -------------------------------------------------------------------------- +// This file contains the interal API's of mimalloc and various utility +// functions and macros. +// -------------------------------------------------------------------------- + +#include "types.h" +#include "track.h" + +#if (MI_DEBUG>0) +#define mi_trace_message(...) _mi_trace_message(__VA_ARGS__) +#else +#define mi_trace_message(...) +#endif + +#if defined(__EMSCRIPTEN__) && !defined(__wasi__) +#define __wasi__ +#endif + +#if defined(__cplusplus) +#define mi_decl_externc extern "C" +#else +#define mi_decl_externc +#endif + +// pthreads +#if !defined(_WIN32) && !defined(__wasi__) +#define MI_USE_PTHREADS +#include +#endif + +// "options.c" +void _mi_fputs(mi_output_fun* out, void* arg, const char* prefix, const char* message); +void _mi_fprintf(mi_output_fun* out, void* arg, const char* fmt, ...); +void _mi_warning_message(const char* fmt, ...); +void _mi_verbose_message(const char* fmt, ...); +void _mi_trace_message(const char* fmt, ...); +void _mi_options_init(void); +void _mi_error_message(int err, const char* fmt, ...); + +// random.c +void _mi_random_init(mi_random_ctx_t* ctx); +void _mi_random_init_weak(mi_random_ctx_t* ctx); +void _mi_random_reinit_if_weak(mi_random_ctx_t * ctx); +void _mi_random_split(mi_random_ctx_t* ctx, mi_random_ctx_t* new_ctx); +uintptr_t _mi_random_next(mi_random_ctx_t* ctx); +uintptr_t _mi_heap_random_next(mi_heap_t* heap); +uintptr_t _mi_os_random_weak(uintptr_t extra_seed); +static inline uintptr_t _mi_random_shuffle(uintptr_t x); + +// init.c +extern mi_decl_cache_align mi_stats_t _mi_stats_main; +extern mi_decl_cache_align const mi_page_t _mi_page_empty; +bool _mi_is_main_thread(void); +size_t _mi_current_thread_count(void); +bool _mi_preloading(void); // true while the C runtime is not initialized yet +mi_threadid_t _mi_thread_id(void) mi_attr_noexcept; +mi_heap_t* _mi_heap_main_get(void); // statically allocated main backing heap +void _mi_thread_done(mi_heap_t* heap); +void _mi_thread_data_collect(void); +void _mi_tld_init(mi_tld_t* tld, mi_heap_t* bheap); + +// os.c +void _mi_os_init(void); // called from process init +void* _mi_os_alloc(size_t size, mi_memid_t* memid, mi_stats_t* stats); +void _mi_os_free(void* p, size_t size, mi_memid_t memid, mi_stats_t* stats); +void _mi_os_free_ex(void* p, size_t size, bool still_committed, mi_memid_t memid, mi_stats_t* stats); + +size_t _mi_os_page_size(void); +size_t _mi_os_good_alloc_size(size_t size); +bool _mi_os_has_overcommit(void); +bool _mi_os_has_virtual_reserve(void); + +bool _mi_os_purge(void* p, size_t size, mi_stats_t* stats); +bool _mi_os_reset(void* addr, size_t size, mi_stats_t* tld_stats); +bool _mi_os_commit(void* p, size_t size, bool* is_zero, mi_stats_t* stats); +bool _mi_os_decommit(void* addr, size_t size, mi_stats_t* stats); +bool _mi_os_protect(void* addr, size_t size); +bool _mi_os_unprotect(void* addr, size_t size); +bool _mi_os_purge(void* p, size_t size, mi_stats_t* stats); +bool _mi_os_purge_ex(void* p, size_t size, bool allow_reset, mi_stats_t* stats); + +void* _mi_os_alloc_aligned(size_t size, size_t alignment, bool commit, bool allow_large, mi_memid_t* memid, mi_stats_t* stats); +void* _mi_os_alloc_aligned_at_offset(size_t size, size_t alignment, size_t align_offset, bool commit, bool allow_large, mi_memid_t* memid, mi_stats_t* tld_stats); + +void* _mi_os_get_aligned_hint(size_t try_alignment, size_t size); +bool _mi_os_use_large_page(size_t size, size_t alignment); +size_t _mi_os_large_page_size(void); + +void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_secs, size_t* pages_reserved, size_t* psize, mi_memid_t* memid); + +// arena.c +mi_arena_id_t _mi_arena_id_none(void); +void _mi_arena_free(void* p, size_t size, size_t still_committed_size, mi_memid_t memid, mi_stats_t* stats); +void* _mi_arena_alloc(size_t size, bool commit, bool allow_large, mi_arena_id_t req_arena_id, mi_memid_t* memid, mi_os_tld_t* tld); +void* _mi_arena_alloc_aligned(size_t size, size_t alignment, size_t align_offset, bool commit, bool allow_large, mi_arena_id_t req_arena_id, mi_memid_t* memid, mi_os_tld_t* tld); +bool _mi_arena_memid_is_suitable(mi_memid_t memid, mi_arena_id_t request_arena_id); +bool _mi_arena_contains(const void* p); +void _mi_arena_collect(bool force_purge, mi_stats_t* stats); +void _mi_arena_unsafe_destroy_all(mi_stats_t* stats); + +// "segment-map.c" +void _mi_segment_map_allocated_at(const mi_segment_t* segment); +void _mi_segment_map_freed_at(const mi_segment_t* segment); + +// "segment.c" +extern mi_abandoned_pool_t _mi_abandoned_default; // global abandoned pool +mi_page_t* _mi_segment_page_alloc(mi_heap_t* heap, size_t block_size, size_t page_alignment, mi_segments_tld_t* tld, mi_os_tld_t* os_tld); +void _mi_segment_page_free(mi_page_t* page, bool force, mi_segments_tld_t* tld); +void _mi_segment_page_abandon(mi_page_t* page, mi_segments_tld_t* tld); +bool _mi_segment_try_reclaim_abandoned( mi_heap_t* heap, bool try_all, mi_segments_tld_t* tld); +void _mi_segment_thread_collect(mi_segments_tld_t* tld); +bool _mi_abandoned_pool_visit_blocks(mi_abandoned_pool_t* pool, uint8_t page_tag, bool visit_blocks, mi_block_visit_fun* visitor, void* arg); + + +#if MI_HUGE_PAGE_ABANDON +void _mi_segment_huge_page_free(mi_segment_t* segment, mi_page_t* page, mi_block_t* block); +#else +void _mi_segment_huge_page_reset(mi_segment_t* segment, mi_page_t* page, mi_block_t* block); +#endif + +uint8_t* _mi_segment_page_start(const mi_segment_t* segment, const mi_page_t* page, size_t* page_size); // page start for any page +void _mi_abandoned_reclaim_all(mi_heap_t* heap, mi_segments_tld_t* tld); +void _mi_abandoned_await_readers(mi_abandoned_pool_t *pool); +void _mi_abandoned_collect(mi_heap_t* heap, bool force, mi_segments_tld_t* tld); + +// "page.c" +void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment) mi_attr_noexcept mi_attr_malloc; + +void _mi_page_retire(mi_page_t* page) mi_attr_noexcept; // free the page if there are no other pages with many free blocks +void _mi_page_unfull(mi_page_t* page); +void _mi_page_free(mi_page_t* page, mi_page_queue_t* pq, bool force); // free the page +void _mi_page_abandon(mi_page_t* page, mi_page_queue_t* pq); // abandon the page, to be picked up by another thread... +void _mi_heap_delayed_free_all(mi_heap_t* heap); +bool _mi_heap_delayed_free_partial(mi_heap_t* heap); +void _mi_heap_collect_retired(mi_heap_t* heap, bool force); + +void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never); +bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never); +size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append); +void _mi_deferred_free(mi_heap_t* heap, bool force); + +void _mi_page_free_collect(mi_page_t* page,bool force); +void _mi_page_reclaim(mi_heap_t* heap, mi_page_t* page); // callback from segments + +size_t _mi_bin_size(uint8_t bin); // for stats +uint8_t _mi_bin(size_t size); // for stats + +// "heap.c" +void _mi_heap_init_ex(mi_heap_t* heap, mi_tld_t* tld, mi_arena_id_t arena_id, bool no_reclaim, uint8_t tag); +void _mi_heap_destroy_pages(mi_heap_t* heap); +void _mi_heap_collect_abandon(mi_heap_t* heap); +void _mi_heap_set_default_direct(mi_heap_t* heap); +bool _mi_heap_memid_is_suitable(mi_heap_t* heap, mi_memid_t memid); +void _mi_heap_unsafe_destroy_all(void); +void _mi_heap_area_init(mi_heap_area_t* area, mi_page_t* page); +bool _mi_heap_area_visit_blocks(const mi_heap_area_t* area, mi_page_t *page, mi_block_visit_fun* visitor, void* arg); + +// "stats.c" +void _mi_stats_done(mi_stats_t* stats); +mi_msecs_t _mi_clock_now(void); +mi_msecs_t _mi_clock_end(mi_msecs_t start); +mi_msecs_t _mi_clock_start(void); + +// "alloc.c" +void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t size, bool zero) mi_attr_noexcept; // called from `_mi_malloc_generic` +void* _mi_heap_malloc_zero(mi_heap_t* heap, size_t size, bool zero) mi_attr_noexcept; +void* _mi_heap_malloc_zero_ex(mi_heap_t* heap, size_t size, bool zero, size_t huge_alignment) mi_attr_noexcept; // called from `_mi_heap_malloc_aligned` +void* _mi_heap_realloc_zero(mi_heap_t* heap, void* p, size_t newsize, bool zero) mi_attr_noexcept; +mi_block_t* _mi_page_ptr_unalign(const mi_segment_t* segment, const mi_page_t* page, const void* p); +bool _mi_free_delayed_block(mi_block_t* block); +void _mi_free_generic(const mi_segment_t* segment, mi_page_t* page, bool is_local, void* p) mi_attr_noexcept; // for runtime integration +void _mi_padding_shrink(const mi_page_t* page, const mi_block_t* block, const size_t min_size); + +// option.c, c primitives +char _mi_toupper(char c); +int _mi_strnicmp(const char* s, const char* t, size_t n); +void _mi_strlcpy(char* dest, const char* src, size_t dest_size); +void _mi_strlcat(char* dest, const char* src, size_t dest_size); +size_t _mi_strlen(const char* s); +size_t _mi_strnlen(const char* s, size_t max_len); + + +#if MI_DEBUG>1 +bool _mi_page_is_valid(mi_page_t* page); +#endif + + +// ------------------------------------------------------ +// Branches +// ------------------------------------------------------ + +#if defined(__GNUC__) || defined(__clang__) +#define mi_unlikely(x) (__builtin_expect(!!(x),false)) +#define mi_likely(x) (__builtin_expect(!!(x),true)) +#elif (defined(__cplusplus) && (__cplusplus >= 202002L)) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) +#define mi_unlikely(x) (x) [[unlikely]] +#define mi_likely(x) (x) [[likely]] +#else +#define mi_unlikely(x) (x) +#define mi_likely(x) (x) +#endif + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + + +/* ----------------------------------------------------------- + Error codes passed to `_mi_fatal_error` + All are recoverable but EFAULT is a serious error and aborts by default in secure mode. + For portability define undefined error codes using common Unix codes: + +----------------------------------------------------------- */ +#include +#ifndef EAGAIN // double free +#define EAGAIN (11) +#endif +#ifndef ENOMEM // out of memory +#define ENOMEM (12) +#endif +#ifndef EFAULT // corrupted free-list or meta-data +#define EFAULT (14) +#endif +#ifndef EINVAL // trying to free an invalid pointer +#define EINVAL (22) +#endif +#ifndef EOVERFLOW // count*size overflow +#define EOVERFLOW (75) +#endif + + +/* ----------------------------------------------------------- + Inlined definitions +----------------------------------------------------------- */ +#define MI_UNUSED(x) (void)(x) +#if (MI_DEBUG>0) +#define MI_UNUSED_RELEASE(x) +#else +#define MI_UNUSED_RELEASE(x) MI_UNUSED(x) +#endif + +#define MI_INIT4(x) x(),x(),x(),x() +#define MI_INIT8(x) MI_INIT4(x),MI_INIT4(x) +#define MI_INIT16(x) MI_INIT8(x),MI_INIT8(x) +#define MI_INIT32(x) MI_INIT16(x),MI_INIT16(x) +#define MI_INIT64(x) MI_INIT32(x),MI_INIT32(x) +#define MI_INIT128(x) MI_INIT64(x),MI_INIT64(x) +#define MI_INIT256(x) MI_INIT128(x),MI_INIT128(x) + + +#include +// initialize a local variable to zero; use memset as compilers optimize constant sized memset's +#define _mi_memzero_var(x) memset(&x,0,sizeof(x)) + +// Is `x` a power of two? (0 is considered a power of two) +static inline bool _mi_is_power_of_two(uintptr_t x) { + return ((x & (x - 1)) == 0); +} + +// Is a pointer aligned? +static inline bool _mi_is_aligned(void* p, size_t alignment) { + mi_assert_internal(alignment != 0); + return (((uintptr_t)p % alignment) == 0); +} + +// Align upwards +static inline uintptr_t _mi_align_up(uintptr_t sz, size_t alignment) { + mi_assert_internal(alignment != 0); + uintptr_t mask = alignment - 1; + if ((alignment & mask) == 0) { // power of two? + return ((sz + mask) & ~mask); + } + else { + return (((sz + mask)/alignment)*alignment); + } +} + +// Align downwards +static inline uintptr_t _mi_align_down(uintptr_t sz, size_t alignment) { + mi_assert_internal(alignment != 0); + uintptr_t mask = alignment - 1; + if ((alignment & mask) == 0) { // power of two? + return (sz & ~mask); + } + else { + return ((sz / alignment) * alignment); + } +} + +// Divide upwards: `s <= _mi_divide_up(s,d)*d < s+d`. +static inline uintptr_t _mi_divide_up(uintptr_t size, size_t divider) { + mi_assert_internal(divider != 0); + return (divider == 0 ? size : ((size + divider - 1) / divider)); +} + +// Is memory zero initialized? +static inline bool mi_mem_is_zero(const void* p, size_t size) { + for (size_t i = 0; i < size; i++) { + if (((uint8_t*)p)[i] != 0) return false; + } + return true; +} + + +// Align a byte size to a size in _machine words_, +// i.e. byte size == `wsize*sizeof(void*)`. +static inline size_t _mi_wsize_from_size(size_t size) { + mi_assert_internal(size <= SIZE_MAX - sizeof(uintptr_t)); + return (size + sizeof(uintptr_t) - 1) / sizeof(uintptr_t); +} + +// Overflow detecting multiply +#if __has_builtin(__builtin_umul_overflow) || (defined(__GNUC__) && (__GNUC__ >= 5)) +#include // UINT_MAX, ULONG_MAX +#if defined(_CLOCK_T) // for Illumos +#undef _CLOCK_T +#endif +static inline bool mi_mul_overflow(size_t count, size_t size, size_t* total) { + #if (SIZE_MAX == ULONG_MAX) + return __builtin_umull_overflow(count, size, (unsigned long *)total); + #elif (SIZE_MAX == UINT_MAX) + return __builtin_umul_overflow(count, size, (unsigned int *)total); + #else + return __builtin_umulll_overflow(count, size, (unsigned long long *)total); + #endif +} +#else /* __builtin_umul_overflow is unavailable */ +static inline bool mi_mul_overflow(size_t count, size_t size, size_t* total) { + #define MI_MUL_NO_OVERFLOW ((size_t)1 << (4*sizeof(size_t))) // sqrt(SIZE_MAX) + *total = count * size; + // note: gcc/clang optimize this to directly check the overflow flag + return ((size >= MI_MUL_NO_OVERFLOW || count >= MI_MUL_NO_OVERFLOW) && size > 0 && (SIZE_MAX / size) < count); +} +#endif + +// Safe multiply `count*size` into `total`; return `true` on overflow. +static inline bool mi_count_size_overflow(size_t count, size_t size, size_t* total) { + if (count==1) { // quick check for the case where count is one (common for C++ allocators) + *total = size; + return false; + } + else if mi_unlikely(mi_mul_overflow(count, size, total)) { + #if MI_DEBUG > 0 + _mi_error_message(EOVERFLOW, "allocation request is too large (%zu * %zu bytes)\n", count, size); + #endif + *total = SIZE_MAX; + return true; + } + else return false; +} + + +/*---------------------------------------------------------------------------------------- + Heap functions +------------------------------------------------------------------------------------------- */ + +extern const mi_heap_t _mi_heap_empty; // read-only empty heap, initial value of the thread local default heap + +static inline bool mi_heap_is_backing(const mi_heap_t* heap) { + return (heap->tld->heap_backing == heap); +} + +static inline bool mi_heap_is_initialized(mi_heap_t* heap) { + mi_assert_internal(heap != NULL); + return (heap != &_mi_heap_empty); +} + +static inline uintptr_t _mi_ptr_cookie(const void* p) { + extern mi_heap_t _mi_heap_main; + mi_assert_internal(_mi_heap_main.cookie != 0); + return ((uintptr_t)p ^ _mi_heap_main.cookie); +} + +/* ----------------------------------------------------------- + Pages +----------------------------------------------------------- */ + +static inline mi_page_t* _mi_heap_get_free_small_page(mi_heap_t* heap, size_t size) { + mi_assert_internal(size <= (MI_SMALL_SIZE_MAX + MI_PADDING_SIZE)); + const size_t idx = _mi_wsize_from_size(size); + mi_assert_internal(idx < MI_PAGES_DIRECT); + return heap->pages_free_direct[idx]; +} + +// Segment that contains the pointer +// Large aligned blocks may be aligned at N*MI_SEGMENT_SIZE (inside a huge segment > MI_SEGMENT_SIZE), +// and we need align "down" to the segment info which is `MI_SEGMENT_SIZE` bytes before it; +// therefore we align one byte before `p`. +static inline mi_segment_t* _mi_ptr_segment(const void* p) { + mi_assert_internal(p != NULL); + return (mi_segment_t*)(((uintptr_t)p - 1) & ~MI_SEGMENT_MASK); +} + +static inline mi_page_t* mi_slice_to_page(mi_slice_t* s) { + mi_assert_internal(s->slice_offset== 0 && s->slice_count > 0); + return (mi_page_t*)(s); +} + +static inline mi_slice_t* mi_page_to_slice(mi_page_t* p) { + mi_assert_internal(p->slice_offset== 0 && p->slice_count > 0); + return (mi_slice_t*)(p); +} + +// Segment belonging to a page +static inline mi_segment_t* _mi_page_segment(const mi_page_t* page) { + mi_segment_t* segment = _mi_ptr_segment(page); + mi_assert_internal(segment == NULL || ((mi_slice_t*)page >= segment->slices && (mi_slice_t*)page < segment->slices + segment->slice_entries)); + return segment; +} + +static inline mi_slice_t* mi_slice_first(const mi_slice_t* slice) { + mi_slice_t* start = (mi_slice_t*)((uint8_t*)slice - slice->slice_offset); + mi_assert_internal(start >= _mi_ptr_segment(slice)->slices); + mi_assert_internal(start->slice_offset == 0); + mi_assert_internal(start + start->slice_count > slice); + return start; +} + +// Get the page containing the pointer (performance critical as it is called in mi_free) +static inline mi_page_t* _mi_segment_page_of(const mi_segment_t* segment, const void* p) { + mi_assert_internal(p > (void*)segment); + ptrdiff_t diff = (uint8_t*)p - (uint8_t*)segment; + mi_assert_internal(diff > 0 && diff <= (ptrdiff_t)MI_SEGMENT_SIZE); + size_t idx = (size_t)diff >> MI_SEGMENT_SLICE_SHIFT; + mi_assert_internal(idx <= segment->slice_entries); + mi_slice_t* slice0 = (mi_slice_t*)&segment->slices[idx]; + mi_slice_t* slice = mi_slice_first(slice0); // adjust to the block that holds the page data + mi_assert_internal(slice->slice_offset == 0); + mi_assert_internal(slice >= segment->slices && slice < segment->slices + segment->slice_entries); + return mi_slice_to_page(slice); +} + +// Quick page start for initialized pages +static inline uint8_t* _mi_page_start(const mi_segment_t* segment, const mi_page_t* page, size_t* page_size) { + return _mi_segment_page_start(segment, page, page_size); +} + +// Get the page containing the pointer +static inline mi_page_t* _mi_ptr_page(void* p) { + return _mi_segment_page_of(_mi_ptr_segment(p), p); +} + +// Get the block size of a page (special case for huge objects) +static inline size_t mi_page_block_size(const mi_page_t* page) { + const size_t bsize = page->xblock_size; + mi_assert_internal(bsize > 0); + if mi_likely(bsize < MI_HUGE_BLOCK_SIZE) { + return bsize; + } + else { + size_t psize; + _mi_segment_page_start(_mi_page_segment(page), page, &psize); + return psize; + } +} + +static inline bool mi_page_is_huge(const mi_page_t* page) { + return (_mi_page_segment(page)->kind == MI_SEGMENT_HUGE); +} + +// Get the usable block size of a page without fixed padding. +// This may still include internal padding due to alignment and rounding up size classes. +static inline size_t mi_page_usable_block_size(const mi_page_t* page) { + return mi_page_block_size(page) - MI_PADDING_SIZE; +} + +// size of a segment +static inline size_t mi_segment_size(mi_segment_t* segment) { + return segment->segment_slices * MI_SEGMENT_SLICE_SIZE; +} + +static inline uint8_t* mi_segment_end(mi_segment_t* segment) { + return (uint8_t*)segment + mi_segment_size(segment); +} + +// Thread free access +static inline mi_block_t* mi_page_thread_free(const mi_page_t* page) { + return (mi_block_t*)(mi_atomic_load_relaxed(&((mi_page_t*)page)->xthread_free) & ~3); +} + +static inline mi_delayed_t mi_page_thread_free_flag(const mi_page_t* page) { + return (mi_delayed_t)(mi_atomic_load_relaxed(&((mi_page_t*)page)->xthread_free) & 3); +} + +// Heap access +static inline mi_heap_t* mi_page_heap(const mi_page_t* page) { + return (mi_heap_t*)(mi_atomic_load_relaxed(&((mi_page_t*)page)->xheap)); +} + +static inline void mi_page_set_heap(mi_page_t* page, mi_heap_t* heap) { + mi_assert_internal(mi_page_thread_free_flag(page) != MI_DELAYED_FREEING); + mi_atomic_store_release(&page->xheap,(uintptr_t)heap); +} + +// Thread free flag helpers +static inline mi_block_t* mi_tf_block(mi_thread_free_t tf) { + return (mi_block_t*)(tf & ~0x03); +} +static inline mi_delayed_t mi_tf_delayed(mi_thread_free_t tf) { + return (mi_delayed_t)(tf & 0x03); +} +static inline mi_thread_free_t mi_tf_make(mi_block_t* block, mi_delayed_t delayed) { + return (mi_thread_free_t)((uintptr_t)block | (uintptr_t)delayed); +} +static inline mi_thread_free_t mi_tf_set_delayed(mi_thread_free_t tf, mi_delayed_t delayed) { + return mi_tf_make(mi_tf_block(tf),delayed); +} +static inline mi_thread_free_t mi_tf_set_block(mi_thread_free_t tf, mi_block_t* block) { + return mi_tf_make(block, mi_tf_delayed(tf)); +} + +// are all blocks in a page freed? +// note: needs up-to-date used count, (as the `xthread_free` list may not be empty). see `_mi_page_collect_free`. +static inline bool mi_page_all_free(const mi_page_t* page) { + mi_assert_internal(page != NULL); + return (page->used == 0); +} + +// are there any available blocks? +static inline bool mi_page_has_any_available(const mi_page_t* page) { + mi_assert_internal(page != NULL && page->reserved > 0); + return (page->used < page->reserved || (mi_page_thread_free(page) != NULL)); +} + +// are there immediately available blocks, i.e. blocks available on the free list. +static inline bool mi_page_immediate_available(const mi_page_t* page) { + mi_assert_internal(page != NULL); + return (page->free != NULL); +} + +// is more than 7/8th of a page in use? +static inline bool mi_page_mostly_used(const mi_page_t* page) { + if (page==NULL) return true; + uint16_t frac = page->reserved / 8U; + return (page->reserved - page->used <= frac); +} + +static inline mi_page_queue_t* mi_page_queue(const mi_heap_t* heap, size_t size) { + return &((mi_heap_t*)heap)->pages[_mi_bin(size)]; +} + + + +//----------------------------------------------------------- +// Page flags +//----------------------------------------------------------- +static inline bool mi_page_is_in_full(const mi_page_t* page) { + return page->flags.x.in_full; +} + +static inline void mi_page_set_in_full(mi_page_t* page, bool in_full) { + page->flags.x.in_full = in_full; +} + +static inline bool mi_page_has_aligned(const mi_page_t* page) { + return page->flags.x.has_aligned; +} + +static inline void mi_page_set_has_aligned(mi_page_t* page, bool has_aligned) { + page->flags.x.has_aligned = has_aligned; +} + + +/* ------------------------------------------------------------------- +Encoding/Decoding the free list next pointers + +This is to protect against buffer overflow exploits where the +free list is mutated. Many hardened allocators xor the next pointer `p` +with a secret key `k1`, as `p^k1`. This prevents overwriting with known +values but might be still too weak: if the attacker can guess +the pointer `p` this can reveal `k1` (since `p^k1^p == k1`). +Moreover, if multiple blocks can be read as well, the attacker can +xor both as `(p1^k1) ^ (p2^k1) == p1^p2` which may reveal a lot +about the pointers (and subsequently `k1`). + +Instead mimalloc uses an extra key `k2` and encodes as `((p^k2)<<> (MI_INTPTR_BITS - shift)))); +} +static inline uintptr_t mi_rotr(uintptr_t x, uintptr_t shift) { + shift %= MI_INTPTR_BITS; + return (shift==0 ? x : ((x >> shift) | (x << (MI_INTPTR_BITS - shift)))); +} + +static inline void* mi_ptr_decode(const void* null, const mi_encoded_t x, const uintptr_t* keys) { + void* p = (void*)(mi_rotr(x - keys[0], keys[0]) ^ keys[1]); + return (p==null ? NULL : p); +} + +static inline mi_encoded_t mi_ptr_encode(const void* null, const void* p, const uintptr_t* keys) { + uintptr_t x = (uintptr_t)(p==NULL ? null : p); + return mi_rotl(x ^ keys[1], keys[0]) + keys[0]; +} + +static inline mi_block_t* mi_block_nextx( const void* null, const mi_block_t* block, const uintptr_t* keys ) { + mi_track_mem_defined(block,sizeof(mi_block_t)); + mi_block_t* next; + #ifdef MI_ENCODE_FREELIST + next = (mi_block_t*)mi_ptr_decode(null, block->next, keys); + #else + MI_UNUSED(keys); MI_UNUSED(null); + next = (mi_block_t*)block->next; + #endif + mi_track_mem_noaccess(block,sizeof(mi_block_t)); + return next; +} + +static inline void mi_block_set_nextx(const void* null, mi_block_t* block, const mi_block_t* next, const uintptr_t* keys) { + mi_track_mem_undefined(block,sizeof(mi_block_t)); + #ifdef MI_ENCODE_FREELIST + block->next = mi_ptr_encode(null, next, keys); + #else + MI_UNUSED(keys); MI_UNUSED(null); + block->next = (mi_encoded_t)next; + #endif + mi_track_mem_noaccess(block,sizeof(mi_block_t)); +} + +static inline mi_block_t* mi_block_next(const mi_page_t* page, const mi_block_t* block) { + #ifdef MI_ENCODE_FREELIST + mi_block_t* next = mi_block_nextx(page,block,page->keys); + // check for free list corruption: is `next` at least in the same page? + // TODO: check if `next` is `page->block_size` aligned? + if mi_unlikely(next!=NULL && !mi_is_in_same_page(block, next)) { + _mi_error_message(EFAULT, "corrupted free list entry of size %zub at %p: value 0x%zx\n", mi_page_block_size(page), block, (uintptr_t)next); + next = NULL; + } + return next; + #else + MI_UNUSED(page); + return mi_block_nextx(page,block,NULL); + #endif +} + +static inline void mi_block_set_next(const mi_page_t* page, mi_block_t* block, const mi_block_t* next) { + #ifdef MI_ENCODE_FREELIST + mi_block_set_nextx(page,block,next, page->keys); + #else + MI_UNUSED(page); + mi_block_set_nextx(page,block,next,NULL); + #endif +} + + +// ------------------------------------------------------------------- +// commit mask +// ------------------------------------------------------------------- + +static inline void mi_commit_mask_create_empty(mi_commit_mask_t* cm) { + for (size_t i = 0; i < MI_COMMIT_MASK_FIELD_COUNT; i++) { + cm->mask[i] = 0; + } +} + +static inline void mi_commit_mask_create_full(mi_commit_mask_t* cm) { + for (size_t i = 0; i < MI_COMMIT_MASK_FIELD_COUNT; i++) { + cm->mask[i] = ~((size_t)0); + } +} + +static inline bool mi_commit_mask_is_empty(const mi_commit_mask_t* cm) { + for (size_t i = 0; i < MI_COMMIT_MASK_FIELD_COUNT; i++) { + if (cm->mask[i] != 0) return false; + } + return true; +} + +static inline bool mi_commit_mask_is_full(const mi_commit_mask_t* cm) { + for (size_t i = 0; i < MI_COMMIT_MASK_FIELD_COUNT; i++) { + if (cm->mask[i] != ~((size_t)0)) return false; + } + return true; +} + +// defined in `segment.c`: +size_t _mi_commit_mask_committed_size(const mi_commit_mask_t* cm, size_t total); +size_t _mi_commit_mask_next_run(const mi_commit_mask_t* cm, size_t* idx); + +#define mi_commit_mask_foreach(cm,idx,count) \ + idx = 0; \ + while ((count = _mi_commit_mask_next_run(cm,&idx)) > 0) { + +#define mi_commit_mask_foreach_end() \ + idx += count; \ + } + + + +/* ----------------------------------------------------------- + memory id's +----------------------------------------------------------- */ + +static inline mi_memid_t _mi_memid_create(mi_memkind_t memkind) { + mi_memid_t memid; + _mi_memzero_var(memid); + memid.memkind = memkind; + return memid; +} + +static inline mi_memid_t _mi_memid_none(void) { + return _mi_memid_create(MI_MEM_NONE); +} + +static inline mi_memid_t _mi_memid_create_os(bool committed, bool is_zero, bool is_large) { + mi_memid_t memid = _mi_memid_create(MI_MEM_OS); + memid.initially_committed = committed; + memid.initially_zero = is_zero; + memid.is_pinned = is_large; + return memid; +} + + +// ------------------------------------------------------------------- +// Fast "random" shuffle +// ------------------------------------------------------------------- + +static inline uintptr_t _mi_random_shuffle(uintptr_t x) { + if (x==0) { x = 17; } // ensure we don't get stuck in generating zeros +#if (MI_INTPTR_SIZE==8) + // by Sebastiano Vigna, see: + x ^= x >> 30; + x *= 0xbf58476d1ce4e5b9UL; + x ^= x >> 27; + x *= 0x94d049bb133111ebUL; + x ^= x >> 31; +#elif (MI_INTPTR_SIZE==4) + // by Chris Wellons, see: + x ^= x >> 16; + x *= 0x7feb352dUL; + x ^= x >> 15; + x *= 0x846ca68bUL; + x ^= x >> 16; +#endif + return x; +} + +// ------------------------------------------------------------------- +// Optimize numa node access for the common case (= one node) +// ------------------------------------------------------------------- + +int _mi_os_numa_node_get(mi_os_tld_t* tld); +size_t _mi_os_numa_node_count_get(void); + +extern _Atomic(size_t) _mi_numa_node_count; +static inline int _mi_os_numa_node(mi_os_tld_t* tld) { + if mi_likely(mi_atomic_load_relaxed(&_mi_numa_node_count) == 1) { return 0; } + else return _mi_os_numa_node_get(tld); +} +static inline size_t _mi_os_numa_node_count(void) { + const size_t count = mi_atomic_load_relaxed(&_mi_numa_node_count); + if mi_likely(count > 0) { return count; } + else return _mi_os_numa_node_count_get(); +} + + + +// ----------------------------------------------------------------------- +// Count bits: trailing or leading zeros (with MI_INTPTR_BITS on all zero) +// ----------------------------------------------------------------------- + +#if defined(__GNUC__) + +#include // LONG_MAX +#define MI_HAVE_FAST_BITSCAN +static inline size_t mi_clz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; +#if (INTPTR_MAX == LONG_MAX) + return __builtin_clzl(x); +#else + return __builtin_clzll(x); +#endif +} +static inline size_t mi_ctz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; +#if (INTPTR_MAX == LONG_MAX) + return __builtin_ctzl(x); +#else + return __builtin_ctzll(x); +#endif +} + +#elif defined(_MSC_VER) + +#include // LONG_MAX +#include // BitScanReverse64 +#define MI_HAVE_FAST_BITSCAN +static inline size_t mi_clz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; + unsigned long idx; +#if (INTPTR_MAX == LONG_MAX) + _BitScanReverse(&idx, x); +#else + _BitScanReverse64(&idx, x); +#endif + return ((MI_INTPTR_BITS - 1) - idx); +} +static inline size_t mi_ctz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; + unsigned long idx; +#if (INTPTR_MAX == LONG_MAX) + _BitScanForward(&idx, x); +#else + _BitScanForward64(&idx, x); +#endif + return idx; +} + +#else +static inline size_t mi_ctz32(uint32_t x) { + // de Bruijn multiplication, see + static const unsigned char debruijn[32] = { + 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 + }; + if (x==0) return 32; + return debruijn[((x & -(int32_t)x) * 0x077CB531UL) >> 27]; +} +static inline size_t mi_clz32(uint32_t x) { + // de Bruijn multiplication, see + static const uint8_t debruijn[32] = { + 31, 22, 30, 21, 18, 10, 29, 2, 20, 17, 15, 13, 9, 6, 28, 1, + 23, 19, 11, 3, 16, 14, 7, 24, 12, 4, 8, 25, 5, 26, 27, 0 + }; + if (x==0) return 32; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return debruijn[(uint32_t)(x * 0x07C4ACDDUL) >> 27]; +} + +static inline size_t mi_clz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; +#if (MI_INTPTR_BITS <= 32) + return mi_clz32((uint32_t)x); +#else + size_t count = mi_clz32((uint32_t)(x >> 32)); + if (count < 32) return count; + return (32 + mi_clz32((uint32_t)x)); +#endif +} +static inline size_t mi_ctz(uintptr_t x) { + if (x==0) return MI_INTPTR_BITS; +#if (MI_INTPTR_BITS <= 32) + return mi_ctz32((uint32_t)x); +#else + size_t count = mi_ctz32((uint32_t)x); + if (count < 32) return count; + return (32 + mi_ctz32((uint32_t)(x>>32))); +#endif +} + +#endif + +// "bit scan reverse": Return index of the highest bit (or MI_INTPTR_BITS if `x` is zero) +static inline size_t mi_bsr(uintptr_t x) { + return (x==0 ? MI_INTPTR_BITS : MI_INTPTR_BITS - 1 - mi_clz(x)); +} + + +// --------------------------------------------------------------------------------- +// Provide our own `_mi_memcpy` for potential performance optimizations. +// +// For now, only on Windows with msvc/clang-cl we optimize to `rep movsb` if +// we happen to run on x86/x64 cpu's that have "fast short rep movsb" (FSRM) support +// (AMD Zen3+ (~2020) or Intel Ice Lake+ (~2017). See also issue #201 and pr #253. +// --------------------------------------------------------------------------------- + +#if !MI_TRACK_ENABLED && defined(_WIN32) && (defined(_M_IX86) || defined(_M_X64)) +#include +extern bool _mi_cpu_has_fsrm; +static inline void _mi_memcpy(void* dst, const void* src, size_t n) { + if (_mi_cpu_has_fsrm) { + __movsb((unsigned char*)dst, (const unsigned char*)src, n); + } + else { + memcpy(dst, src, n); + } +} +static inline void _mi_memzero(void* dst, size_t n) { + if (_mi_cpu_has_fsrm) { + __stosb((unsigned char*)dst, 0, n); + } + else { + memset(dst, 0, n); + } +} +#else +static inline void _mi_memcpy(void* dst, const void* src, size_t n) { + memcpy(dst, src, n); +} +static inline void _mi_memzero(void* dst, size_t n) { + memset(dst, 0, n); +} +#endif + +// ------------------------------------------------------------------------------- +// The `_mi_memcpy_aligned` can be used if the pointers are machine-word aligned +// This is used for example in `mi_realloc`. +// ------------------------------------------------------------------------------- + +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) +// On GCC/CLang we provide a hint that the pointers are word aligned. +static inline void _mi_memcpy_aligned(void* dst, const void* src, size_t n) { + mi_assert_internal(((uintptr_t)dst % MI_INTPTR_SIZE == 0) && ((uintptr_t)src % MI_INTPTR_SIZE == 0)); + void* adst = __builtin_assume_aligned(dst, MI_INTPTR_SIZE); + const void* asrc = __builtin_assume_aligned(src, MI_INTPTR_SIZE); + _mi_memcpy(adst, asrc, n); +} + +static inline void _mi_memzero_aligned(void* dst, size_t n) { + mi_assert_internal((uintptr_t)dst % MI_INTPTR_SIZE == 0); + void* adst = __builtin_assume_aligned(dst, MI_INTPTR_SIZE); + _mi_memzero(adst, n); +} +#else +// Default fallback on `_mi_memcpy` +static inline void _mi_memcpy_aligned(void* dst, const void* src, size_t n) { + mi_assert_internal(((uintptr_t)dst % MI_INTPTR_SIZE == 0) && ((uintptr_t)src % MI_INTPTR_SIZE == 0)); + _mi_memcpy(dst, src, n); +} + +static inline void _mi_memzero_aligned(void* dst, size_t n) { + mi_assert_internal((uintptr_t)dst % MI_INTPTR_SIZE == 0); + _mi_memzero(dst, n); +} +#endif + + +#endif diff --git a/Include/internal/mimalloc/mimalloc/prim.h b/Include/internal/mimalloc/mimalloc/prim.h new file mode 100644 index 00000000..322ab29e --- /dev/null +++ b/Include/internal/mimalloc/mimalloc/prim.h @@ -0,0 +1,329 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023, Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_PRIM_H +#define MIMALLOC_PRIM_H + + +// -------------------------------------------------------------------------- +// This file specifies the primitive portability API. +// Each OS/host needs to implement these primitives, see `src/prim` +// for implementations on Window, macOS, WASI, and Linux/Unix. +// +// note: on all primitive functions, we always have result parameters != NUL, and: +// addr != NULL and page aligned +// size > 0 and page aligned +// return value is an error code an int where 0 is success. +// -------------------------------------------------------------------------- + +// OS memory configuration +typedef struct mi_os_mem_config_s { + size_t page_size; // 4KiB + size_t large_page_size; // 2MiB + size_t alloc_granularity; // smallest allocation size (on Windows 64KiB) + bool has_overcommit; // can we reserve more memory than can be actually committed? + bool must_free_whole; // must allocated blocks be freed as a whole (false for mmap, true for VirtualAlloc) + bool has_virtual_reserve; // supports virtual address space reservation? (if true we can reserve virtual address space without using commit or physical memory) +} mi_os_mem_config_t; + +// Initialize +void _mi_prim_mem_init( mi_os_mem_config_t* config ); + +// Free OS memory +int _mi_prim_free(void* addr, size_t size ); + +// Allocate OS memory. Return NULL on error. +// The `try_alignment` is just a hint and the returned pointer does not have to be aligned. +// If `commit` is false, the virtual memory range only needs to be reserved (with no access) +// which will later be committed explicitly using `_mi_prim_commit`. +// `is_zero` is set to true if the memory was zero initialized (as on most OS's) +// pre: !commit => !allow_large +// try_alignment >= _mi_os_page_size() and a power of 2 +int _mi_prim_alloc(size_t size, size_t try_alignment, bool commit, bool allow_large, bool* is_large, bool* is_zero, void** addr); + +// Commit memory. Returns error code or 0 on success. +// For example, on Linux this would make the memory PROT_READ|PROT_WRITE. +// `is_zero` is set to true if the memory was zero initialized (e.g. on Windows) +int _mi_prim_commit(void* addr, size_t size, bool* is_zero); + +// Decommit memory. Returns error code or 0 on success. The `needs_recommit` result is true +// if the memory would need to be re-committed. For example, on Windows this is always true, +// but on Linux we could use MADV_DONTNEED to decommit which does not need a recommit. +// pre: needs_recommit != NULL +int _mi_prim_decommit(void* addr, size_t size, bool* needs_recommit); + +// Reset memory. The range keeps being accessible but the content might be reset. +// Returns error code or 0 on success. +int _mi_prim_reset(void* addr, size_t size); + +// Protect memory. Returns error code or 0 on success. +int _mi_prim_protect(void* addr, size_t size, bool protect); + +// Allocate huge (1GiB) pages possibly associated with a NUMA node. +// `is_zero` is set to true if the memory was zero initialized (as on most OS's) +// pre: size > 0 and a multiple of 1GiB. +// numa_node is either negative (don't care), or a numa node number. +int _mi_prim_alloc_huge_os_pages(void* hint_addr, size_t size, int numa_node, bool* is_zero, void** addr); + +// Return the current NUMA node +size_t _mi_prim_numa_node(void); + +// Return the number of logical NUMA nodes +size_t _mi_prim_numa_node_count(void); + +// Clock ticks +mi_msecs_t _mi_prim_clock_now(void); + +// Return process information (only for statistics) +typedef struct mi_process_info_s { + mi_msecs_t elapsed; + mi_msecs_t utime; + mi_msecs_t stime; + size_t current_rss; + size_t peak_rss; + size_t current_commit; + size_t peak_commit; + size_t page_faults; +} mi_process_info_t; + +void _mi_prim_process_info(mi_process_info_t* pinfo); + +// Default stderr output. (only for warnings etc. with verbose enabled) +// msg != NULL && _mi_strlen(msg) > 0 +void _mi_prim_out_stderr( const char* msg ); + +// Get an environment variable. (only for options) +// name != NULL, result != NULL, result_size >= 64 +bool _mi_prim_getenv(const char* name, char* result, size_t result_size); + + +// Fill a buffer with strong randomness; return `false` on error or if +// there is no strong randomization available. +bool _mi_prim_random_buf(void* buf, size_t buf_len); + +// Called on the first thread start, and should ensure `_mi_thread_done` is called on thread termination. +void _mi_prim_thread_init_auto_done(void); + +// Called on process exit and may take action to clean up resources associated with the thread auto done. +void _mi_prim_thread_done_auto_done(void); + +// Called when the default heap for a thread changes +void _mi_prim_thread_associate_default_heap(mi_heap_t* heap); + + +//------------------------------------------------------------------- +// Thread id: `_mi_prim_thread_id()` +// +// Getting the thread id should be performant as it is called in the +// fast path of `_mi_free` and we specialize for various platforms as +// inlined definitions. Regular code should call `init.c:_mi_thread_id()`. +// We only require _mi_prim_thread_id() to return a unique id +// for each thread (unequal to zero). +//------------------------------------------------------------------- + +// defined in `init.c`; do not use these directly +extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from +extern bool _mi_process_is_initialized; // has mi_process_init been called? + +static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept; + +#ifdef MI_PRIM_THREAD_ID + +static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept { + return MI_PRIM_THREAD_ID(); +} + +#elif defined(_WIN32) + +#define WIN32_LEAN_AND_MEAN +#include +static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept { + // Windows: works on Intel and ARM in both 32- and 64-bit + return (uintptr_t)NtCurrentTeb(); +} + +// We use assembly for a fast thread id on the main platforms. The TLS layout depends on +// both the OS and libc implementation so we use specific tests for each main platform. +// If you test on another platform and it works please send a PR :-) +// see also https://akkadia.org/drepper/tls.pdf for more info on the TLS register. +#elif defined(__GNUC__) && ( \ + (defined(__GLIBC__) && (defined(__x86_64__) || defined(__i386__) || (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__))) \ + || (defined(__APPLE__) && (defined(__x86_64__) || defined(__aarch64__))) \ + || (defined(__BIONIC__) && (defined(__x86_64__) || defined(__i386__) || (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__))) \ + || (defined(__FreeBSD__) && (defined(__x86_64__) || defined(__i386__) || defined(__aarch64__))) \ + || (defined(__OpenBSD__) && (defined(__x86_64__) || defined(__i386__) || defined(__aarch64__))) \ + ) + +static inline void* mi_prim_tls_slot(size_t slot) mi_attr_noexcept { + void* res; + const size_t ofs = (slot*sizeof(void*)); + #if defined(__i386__) + __asm__("movl %%gs:%1, %0" : "=r" (res) : "m" (*((void**)ofs)) : ); // x86 32-bit always uses GS + #elif defined(__APPLE__) && defined(__x86_64__) + __asm__("movq %%gs:%1, %0" : "=r" (res) : "m" (*((void**)ofs)) : ); // x86_64 macOSX uses GS + #elif defined(__x86_64__) && (MI_INTPTR_SIZE==4) + __asm__("movl %%fs:%1, %0" : "=r" (res) : "m" (*((void**)ofs)) : ); // x32 ABI + #elif defined(__x86_64__) + __asm__("movq %%fs:%1, %0" : "=r" (res) : "m" (*((void**)ofs)) : ); // x86_64 Linux, BSD uses FS + #elif defined(__arm__) + void** tcb; MI_UNUSED(ofs); + __asm__ volatile ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tcb)); + res = tcb[slot]; + #elif defined(__aarch64__) + void** tcb; MI_UNUSED(ofs); + #if defined(__APPLE__) // M1, issue #343 + __asm__ volatile ("mrs %0, tpidrro_el0\nbic %0, %0, #7" : "=r" (tcb)); + #else + __asm__ volatile ("mrs %0, tpidr_el0" : "=r" (tcb)); + #endif + res = tcb[slot]; + #endif + return res; +} + +// setting a tls slot is only used on macOS for now +static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexcept { + const size_t ofs = (slot*sizeof(void*)); + #if defined(__i386__) + __asm__("movl %1,%%gs:%0" : "=m" (*((void**)ofs)) : "rn" (value) : ); // 32-bit always uses GS + #elif defined(__APPLE__) && defined(__x86_64__) + __asm__("movq %1,%%gs:%0" : "=m" (*((void**)ofs)) : "rn" (value) : ); // x86_64 macOS uses GS + #elif defined(__x86_64__) && (MI_INTPTR_SIZE==4) + __asm__("movl %1,%%fs:%0" : "=m" (*((void**)ofs)) : "rn" (value) : ); // x32 ABI + #elif defined(__x86_64__) + __asm__("movq %1,%%fs:%0" : "=m" (*((void**)ofs)) : "rn" (value) : ); // x86_64 Linux, BSD uses FS + #elif defined(__arm__) + void** tcb; MI_UNUSED(ofs); + __asm__ volatile ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tcb)); + tcb[slot] = value; + #elif defined(__aarch64__) + void** tcb; MI_UNUSED(ofs); + #if defined(__APPLE__) // M1, issue #343 + __asm__ volatile ("mrs %0, tpidrro_el0\nbic %0, %0, #7" : "=r" (tcb)); + #else + __asm__ volatile ("mrs %0, tpidr_el0" : "=r" (tcb)); + #endif + tcb[slot] = value; + #endif +} + +static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept { + #if defined(__BIONIC__) + // issue #384, #495: on the Bionic libc (Android), slot 1 is the thread id + // see: https://github.com/aosp-mirror/platform_bionic/blob/c44b1d0676ded732df4b3b21c5f798eacae93228/libc/platform/bionic/tls_defines.h#L86 + return (uintptr_t)mi_prim_tls_slot(1); + #else + // in all our other targets, slot 0 is the thread id + // glibc: https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/nptl/tls.h + // apple: https://github.com/apple/darwin-xnu/blob/main/libsyscall/os/tsd.h#L36 + return (uintptr_t)mi_prim_tls_slot(0); + #endif +} + +#else + +// otherwise use portable C, taking the address of a thread local variable (this is still very fast on most platforms). +static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept { + return (uintptr_t)&_mi_heap_default; +} + +#endif + + + +/* ---------------------------------------------------------------------------------------- +The thread local default heap: `_mi_prim_get_default_heap()` +This is inlined here as it is on the fast path for allocation functions. + +On most platforms (Windows, Linux, FreeBSD, NetBSD, etc), this just returns a +__thread local variable (`_mi_heap_default`). With the initial-exec TLS model this ensures +that the storage will always be available (allocated on the thread stacks). + +On some platforms though we cannot use that when overriding `malloc` since the underlying +TLS implementation (or the loader) will call itself `malloc` on a first access and recurse. +We try to circumvent this in an efficient way: +- macOSX : we use an unused TLS slot from the OS allocated slots (MI_TLS_SLOT). On OSX, the + loader itself calls `malloc` even before the modules are initialized. +- OpenBSD: we use an unused slot from the pthread block (MI_TLS_PTHREAD_SLOT_OFS). +- DragonFly: defaults are working but seem slow compared to freeBSD (see PR #323) +------------------------------------------------------------------------------------------- */ + +static inline mi_heap_t* mi_prim_get_default_heap(void); + +#if defined(MI_MALLOC_OVERRIDE) +#if defined(__APPLE__) // macOS + #define MI_TLS_SLOT 89 // seems unused? + // #define MI_TLS_RECURSE_GUARD 1 + // other possible unused ones are 9, 29, __PTK_FRAMEWORK_JAVASCRIPTCORE_KEY4 (94), __PTK_FRAMEWORK_GC_KEY9 (112) and __PTK_FRAMEWORK_OLDGC_KEY9 (89) + // see +#elif defined(__OpenBSD__) + // use end bytes of a name; goes wrong if anyone uses names > 23 characters (ptrhread specifies 16) + // see + #define MI_TLS_PTHREAD_SLOT_OFS (6*sizeof(int) + 4*sizeof(void*) + 24) + // #elif defined(__DragonFly__) + // #warning "mimalloc is not working correctly on DragonFly yet." + // #define MI_TLS_PTHREAD_SLOT_OFS (4 + 1*sizeof(void*)) // offset `uniqueid` (also used by gdb?) +#elif defined(__ANDROID__) + // See issue #381 + #define MI_TLS_PTHREAD +#endif +#endif + + +#if defined(MI_TLS_SLOT) + +static inline mi_heap_t* mi_prim_get_default_heap(void) { + mi_heap_t* heap = (mi_heap_t*)mi_prim_tls_slot(MI_TLS_SLOT); + if mi_unlikely(heap == NULL) { + #ifdef __GNUC__ + __asm(""); // prevent conditional load of the address of _mi_heap_empty + #endif + heap = (mi_heap_t*)&_mi_heap_empty; + } + return heap; +} + +#elif defined(MI_TLS_PTHREAD_SLOT_OFS) + +static inline mi_heap_t** mi_prim_tls_pthread_heap_slot(void) { + pthread_t self = pthread_self(); + #if defined(__DragonFly__) + if (self==NULL) return NULL; + #endif + return (mi_heap_t**)((uint8_t*)self + MI_TLS_PTHREAD_SLOT_OFS); +} + +static inline mi_heap_t* mi_prim_get_default_heap(void) { + mi_heap_t** pheap = mi_prim_tls_pthread_heap_slot(); + if mi_unlikely(pheap == NULL) return _mi_heap_main_get(); + mi_heap_t* heap = *pheap; + if mi_unlikely(heap == NULL) return (mi_heap_t*)&_mi_heap_empty; + return heap; +} + +#elif defined(MI_TLS_PTHREAD) + +extern pthread_key_t _mi_heap_default_key; +static inline mi_heap_t* mi_prim_get_default_heap(void) { + mi_heap_t* heap = (mi_unlikely(_mi_heap_default_key == (pthread_key_t)(-1)) ? _mi_heap_main_get() : (mi_heap_t*)pthread_getspecific(_mi_heap_default_key)); + return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap); +} + +#else // default using a thread local variable; used on most platforms. + +static inline mi_heap_t* mi_prim_get_default_heap(void) { + #if defined(MI_TLS_RECURSE_GUARD) + if (mi_unlikely(!_mi_process_is_initialized)) return _mi_heap_main_get(); + #endif + return _mi_heap_default; +} + +#endif // mi_prim_get_default_heap() + + + +#endif // MIMALLOC_PRIM_H diff --git a/Include/internal/mimalloc/mimalloc/track.h b/Include/internal/mimalloc/mimalloc/track.h new file mode 100644 index 00000000..fa1a048d --- /dev/null +++ b/Include/internal/mimalloc/mimalloc/track.h @@ -0,0 +1,147 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023, Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_TRACK_H +#define MIMALLOC_TRACK_H + +/* ------------------------------------------------------------------------------------------------------ +Track memory ranges with macros for tools like Valgrind address sanitizer, or other memory checkers. +These can be defined for tracking allocation: + + #define mi_track_malloc_size(p,reqsize,size,zero) + #define mi_track_free_size(p,_size) + +The macros are set up such that the size passed to `mi_track_free_size` +always matches the size of `mi_track_malloc_size`. (currently, `size == mi_usable_size(p)`). +The `reqsize` is what the user requested, and `size >= reqsize`. +The `size` is either byte precise (and `size==reqsize`) if `MI_PADDING` is enabled, +or otherwise it is the usable block size which may be larger than the original request. +Use `_mi_block_size_of(void* p)` to get the full block size that was allocated (including padding etc). +The `zero` parameter is `true` if the allocated block is zero initialized. + +Optional: + + #define mi_track_align(p,alignedp,offset,size) + #define mi_track_resize(p,oldsize,newsize) + #define mi_track_init() + +The `mi_track_align` is called right after a `mi_track_malloc` for aligned pointers in a block. +The corresponding `mi_track_free` still uses the block start pointer and original size (corresponding to the `mi_track_malloc`). +The `mi_track_resize` is currently unused but could be called on reallocations within a block. +`mi_track_init` is called at program start. + +The following macros are for tools like asan and valgrind to track whether memory is +defined, undefined, or not accessible at all: + + #define mi_track_mem_defined(p,size) + #define mi_track_mem_undefined(p,size) + #define mi_track_mem_noaccess(p,size) + +-------------------------------------------------------------------------------------------------------*/ + +#if MI_TRACK_VALGRIND +// valgrind tool + +#define MI_TRACK_ENABLED 1 +#define MI_TRACK_HEAP_DESTROY 1 // track free of individual blocks on heap_destroy +#define MI_TRACK_TOOL "valgrind" + +#include +#include + +#define mi_track_malloc_size(p,reqsize,size,zero) VALGRIND_MALLOCLIKE_BLOCK(p,size,MI_PADDING_SIZE /*red zone*/,zero) +#define mi_track_free_size(p,_size) VALGRIND_FREELIKE_BLOCK(p,MI_PADDING_SIZE /*red zone*/) +#define mi_track_resize(p,oldsize,newsize) VALGRIND_RESIZEINPLACE_BLOCK(p,oldsize,newsize,MI_PADDING_SIZE /*red zone*/) +#define mi_track_mem_defined(p,size) VALGRIND_MAKE_MEM_DEFINED(p,size) +#define mi_track_mem_undefined(p,size) VALGRIND_MAKE_MEM_UNDEFINED(p,size) +#define mi_track_mem_noaccess(p,size) VALGRIND_MAKE_MEM_NOACCESS(p,size) + +#elif MI_TRACK_ASAN +// address sanitizer + +#define MI_TRACK_ENABLED 1 +#define MI_TRACK_HEAP_DESTROY 0 +#define MI_TRACK_TOOL "asan" + +#include + +#define mi_track_malloc_size(p,reqsize,size,zero) ASAN_UNPOISON_MEMORY_REGION(p,size) +#define mi_track_free_size(p,size) ASAN_POISON_MEMORY_REGION(p,size) +#define mi_track_mem_defined(p,size) ASAN_UNPOISON_MEMORY_REGION(p,size) +#define mi_track_mem_undefined(p,size) ASAN_UNPOISON_MEMORY_REGION(p,size) +#define mi_track_mem_noaccess(p,size) ASAN_POISON_MEMORY_REGION(p,size) + +#elif MI_TRACK_ETW +// windows event tracing + +#define MI_TRACK_ENABLED 1 +#define MI_TRACK_HEAP_DESTROY 1 +#define MI_TRACK_TOOL "ETW" + +#define WIN32_LEAN_AND_MEAN +#include +#include "../src/prim/windows/etw.h" + +#define mi_track_init() EventRegistermicrosoft_windows_mimalloc(); +#define mi_track_malloc_size(p,reqsize,size,zero) EventWriteETW_MI_ALLOC((UINT64)(p), size) +#define mi_track_free_size(p,size) EventWriteETW_MI_FREE((UINT64)(p), size) + +#else +// no tracking + +#define MI_TRACK_ENABLED 0 +#define MI_TRACK_HEAP_DESTROY 0 +#define MI_TRACK_TOOL "none" + +#define mi_track_malloc_size(p,reqsize,size,zero) +#define mi_track_free_size(p,_size) + +#endif + +// ------------------- +// Utility definitions + +#ifndef mi_track_resize +#define mi_track_resize(p,oldsize,newsize) mi_track_free_size(p,oldsize); mi_track_malloc(p,newsize,false) +#endif + +#ifndef mi_track_align +#define mi_track_align(p,alignedp,offset,size) mi_track_mem_noaccess(p,offset) +#endif + +#ifndef mi_track_init +#define mi_track_init() +#endif + +#ifndef mi_track_mem_defined +#define mi_track_mem_defined(p,size) +#endif + +#ifndef mi_track_mem_undefined +#define mi_track_mem_undefined(p,size) +#endif + +#ifndef mi_track_mem_noaccess +#define mi_track_mem_noaccess(p,size) +#endif + + +#if MI_PADDING +#define mi_track_malloc(p,reqsize,zero) \ + if ((p)!=NULL) { \ + mi_assert_internal(mi_usable_size(p)==(reqsize)); \ + mi_track_malloc_size(p,reqsize,reqsize,zero); \ + } +#else +#define mi_track_malloc(p,reqsize,zero) \ + if ((p)!=NULL) { \ + mi_assert_internal(mi_usable_size(p)>=(reqsize)); \ + mi_track_malloc_size(p,reqsize,mi_usable_size(p),zero); \ + } +#endif + +#endif diff --git a/Include/internal/mimalloc/mimalloc/types.h b/Include/internal/mimalloc/mimalloc/types.h new file mode 100644 index 00000000..354839ba --- /dev/null +++ b/Include/internal/mimalloc/mimalloc/types.h @@ -0,0 +1,721 @@ +/* ---------------------------------------------------------------------------- +Copyright (c) 2018-2023, Microsoft Research, Daan Leijen +This is free software; you can redistribute it and/or modify it under the +terms of the MIT license. A copy of the license can be found in the file +"LICENSE" at the root of this distribution. +-----------------------------------------------------------------------------*/ +#pragma once +#ifndef MIMALLOC_TYPES_H +#define MIMALLOC_TYPES_H + +// -------------------------------------------------------------------------- +// This file contains the main type definitions for mimalloc: +// mi_heap_t : all data for a thread-local heap, contains +// lists of all managed heap pages. +// mi_segment_t : a larger chunk of memory (32GiB) from where pages +// are allocated. +// mi_page_t : a mimalloc page (usually 64KiB or 512KiB) from +// where objects are allocated. +// -------------------------------------------------------------------------- + + +#include // ptrdiff_t +#include // uintptr_t, uint16_t, etc +#include "atomic.h" // _Atomic + +#ifdef _MSC_VER +#pragma warning(disable:4214) // bitfield is not int +#endif + +// Minimal alignment necessary. On most platforms 16 bytes are needed +// due to SSE registers for example. This must be at least `sizeof(void*)` +#ifndef MI_MAX_ALIGN_SIZE +#define MI_MAX_ALIGN_SIZE 16 // sizeof(max_align_t) +#endif + +#define MI_CACHE_LINE 64 +#if defined(_MSC_VER) +#pragma warning(disable:4127) // suppress constant conditional warning (due to MI_SECURE paths) +#pragma warning(disable:26812) // unscoped enum warning +#define mi_decl_noinline __declspec(noinline) +#define mi_decl_thread __declspec(thread) +#define mi_decl_cache_align __declspec(align(MI_CACHE_LINE)) +#elif (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__clang__) // includes clang and icc +#define mi_decl_noinline __attribute__((noinline)) +#define mi_decl_thread __thread +#define mi_decl_cache_align __attribute__((aligned(MI_CACHE_LINE))) +#else +#define mi_decl_noinline +#define mi_decl_thread __thread // hope for the best :-) +#define mi_decl_cache_align +#endif + +// ------------------------------------------------------ +// Variants +// ------------------------------------------------------ + +// Define NDEBUG in the release version to disable assertions. +// #define NDEBUG + +// Define MI_TRACK_ to enable tracking support +// #define MI_TRACK_VALGRIND 1 +// #define MI_TRACK_ASAN 1 +// #define MI_TRACK_ETW 1 + +// Define MI_STAT as 1 to maintain statistics; set it to 2 to have detailed statistics (but costs some performance). +// #define MI_STAT 1 + +// Define MI_SECURE to enable security mitigations +// #define MI_SECURE 1 // guard page around metadata +// #define MI_SECURE 2 // guard page around each mimalloc page +// #define MI_SECURE 3 // encode free lists (detect corrupted free list (buffer overflow), and invalid pointer free) +// #define MI_SECURE 4 // checks for double free. (may be more expensive) + +#if !defined(MI_SECURE) +#define MI_SECURE 0 +#endif + +// Define MI_DEBUG for debug mode +// #define MI_DEBUG 1 // basic assertion checks and statistics, check double free, corrupted free list, and invalid pointer free. +// #define MI_DEBUG 2 // + internal assertion checks +// #define MI_DEBUG 3 // + extensive internal invariant checking (cmake -DMI_DEBUG_FULL=ON) +#if !defined(MI_DEBUG) +#if !defined(NDEBUG) || defined(_DEBUG) +#define MI_DEBUG 2 +#else +#define MI_DEBUG 0 +#endif +#endif + +// Reserve extra padding at the end of each block to be more resilient against heap block overflows. +// The padding can detect buffer overflow on free. +#if !defined(MI_PADDING) && (MI_SECURE>=3 || MI_DEBUG>=1 || (MI_TRACK_VALGRIND || MI_TRACK_ASAN || MI_TRACK_ETW)) +#define MI_PADDING 1 +#endif + +// Check padding bytes; allows byte-precise buffer overflow detection +#if !defined(MI_PADDING_CHECK) && MI_PADDING && (MI_SECURE>=3 || MI_DEBUG>=1) +#define MI_PADDING_CHECK 1 +#endif + + +// Encoded free lists allow detection of corrupted free lists +// and can detect buffer overflows, modify after free, and double `free`s. +#if (MI_SECURE>=3 || MI_DEBUG>=1) +#define MI_ENCODE_FREELIST 1 +#endif + + +// We used to abandon huge pages but to eagerly deallocate if freed from another thread, +// but that makes it not possible to visit them during a heap walk or include them in a +// `mi_heap_destroy`. We therefore instead reset/decommit the huge blocks if freed from +// another thread so most memory is available until it gets properly freed by the owning thread. +// #define MI_HUGE_PAGE_ABANDON 1 + + +// ------------------------------------------------------ +// Platform specific values +// ------------------------------------------------------ + +// ------------------------------------------------------ +// Size of a pointer. +// We assume that `sizeof(void*)==sizeof(intptr_t)` +// and it holds for all platforms we know of. +// +// However, the C standard only requires that: +// p == (void*)((intptr_t)p)) +// but we also need: +// i == (intptr_t)((void*)i) +// or otherwise one might define an intptr_t type that is larger than a pointer... +// ------------------------------------------------------ + +#if INTPTR_MAX > INT64_MAX +# define MI_INTPTR_SHIFT (4) // assume 128-bit (as on arm CHERI for example) +#elif INTPTR_MAX == INT64_MAX +# define MI_INTPTR_SHIFT (3) +#elif INTPTR_MAX == INT32_MAX +# define MI_INTPTR_SHIFT (2) +#else +#error platform pointers must be 32, 64, or 128 bits +#endif + +#if SIZE_MAX == UINT64_MAX +# define MI_SIZE_SHIFT (3) +typedef int64_t mi_ssize_t; +#elif SIZE_MAX == UINT32_MAX +# define MI_SIZE_SHIFT (2) +typedef int32_t mi_ssize_t; +#else +#error platform objects must be 32 or 64 bits +#endif + +#if (SIZE_MAX/2) > LONG_MAX +# define MI_ZU(x) x##ULL +# define MI_ZI(x) x##LL +#else +# define MI_ZU(x) x##UL +# define MI_ZI(x) x##L +#endif + +#define MI_INTPTR_SIZE (1< 4 +#define MI_SEGMENT_SHIFT ( 9 + MI_SEGMENT_SLICE_SHIFT) // 32MiB +#else +#define MI_SEGMENT_SHIFT ( 7 + MI_SEGMENT_SLICE_SHIFT) // 4MiB on 32-bit +#endif + +#define MI_SMALL_PAGE_SHIFT (MI_SEGMENT_SLICE_SHIFT) // 64KiB +#define MI_MEDIUM_PAGE_SHIFT ( 3 + MI_SMALL_PAGE_SHIFT) // 512KiB + + +// Derived constants +#define MI_SEGMENT_SIZE (MI_ZU(1)<= 655360) +#error "mimalloc internal: define more bins" +#endif + +// Maximum slice offset (15) +#define MI_MAX_SLICE_OFFSET ((MI_ALIGNMENT_MAX / MI_SEGMENT_SLICE_SIZE) - 1) + +// Used as a special value to encode block sizes in 32 bits. +#define MI_HUGE_BLOCK_SIZE ((uint32_t)(2*MI_GiB)) + +// blocks up to this size are always allocated aligned +#define MI_MAX_ALIGN_GUARANTEE (8*MI_MAX_ALIGN_SIZE) + +// Alignments over MI_ALIGNMENT_MAX are allocated in dedicated huge page segments +#define MI_ALIGNMENT_MAX (MI_SEGMENT_SIZE >> 1) + + +// ------------------------------------------------------ +// Mimalloc pages contain allocated blocks +// ------------------------------------------------------ + +// The free lists use encoded next fields +// (Only actually encodes when MI_ENCODED_FREELIST is defined.) +typedef uintptr_t mi_encoded_t; + +// thread id's +typedef size_t mi_threadid_t; + +// free lists contain blocks +typedef struct mi_block_s { + mi_encoded_t next; +} mi_block_t; + + +// The delayed flags are used for efficient multi-threaded free-ing +typedef enum mi_delayed_e { + MI_USE_DELAYED_FREE = 0, // push on the owning heap thread delayed list + MI_DELAYED_FREEING = 1, // temporary: another thread is accessing the owning heap + MI_NO_DELAYED_FREE = 2, // optimize: push on page local thread free queue if another block is already in the heap thread delayed free list + MI_NEVER_DELAYED_FREE = 3 // sticky, only resets on page reclaim +} mi_delayed_t; + + +// The `in_full` and `has_aligned` page flags are put in a union to efficiently +// test if both are false (`full_aligned == 0`) in the `mi_free` routine. +#if !MI_TSAN +typedef union mi_page_flags_s { + uint8_t full_aligned; + struct { + uint8_t in_full : 1; + uint8_t has_aligned : 1; + } x; +} mi_page_flags_t; +#else +// under thread sanitizer, use a byte for each flag to suppress warning, issue #130 +typedef union mi_page_flags_s { + uint16_t full_aligned; + struct { + uint8_t in_full; + uint8_t has_aligned; + } x; +} mi_page_flags_t; +#endif + +// Thread free list. +// We use the bottom 2 bits of the pointer for mi_delayed_t flags +typedef uintptr_t mi_thread_free_t; + +// A page contains blocks of one specific size (`block_size`). +// Each page has three list of free blocks: +// `free` for blocks that can be allocated, +// `local_free` for freed blocks that are not yet available to `mi_malloc` +// `thread_free` for freed blocks by other threads +// The `local_free` and `thread_free` lists are migrated to the `free` list +// when it is exhausted. The separate `local_free` list is necessary to +// implement a monotonic heartbeat. The `thread_free` list is needed for +// avoiding atomic operations in the common case. +// +// +// `used - |thread_free|` == actual blocks that are in use (alive) +// `used - |thread_free| + |free| + |local_free| == capacity` +// +// We don't count `freed` (as |free|) but use `used` to reduce +// the number of memory accesses in the `mi_page_all_free` function(s). +// +// Notes: +// - Access is optimized for `mi_free` and `mi_page_alloc` (in `alloc.c`) +// - Using `uint16_t` does not seem to slow things down +// - The size is 8 words on 64-bit which helps the page index calculations +// (and 10 words on 32-bit, and encoded free lists add 2 words. Sizes 10 +// and 12 are still good for address calculation) +// - To limit the structure size, the `xblock_size` is 32-bits only; for +// blocks > MI_HUGE_BLOCK_SIZE the size is determined from the segment page size +// - `thread_free` uses the bottom bits as a delayed-free flags to optimize +// concurrent frees where only the first concurrent free adds to the owning +// heap `thread_delayed_free` list (see `alloc.c:mi_free_block_mt`). +// The invariant is that no-delayed-free is only set if there is +// at least one block that will be added, or as already been added, to +// the owning heap `thread_delayed_free` list. This guarantees that pages +// will be freed correctly even if only other threads free blocks. +typedef struct mi_page_s { + // "owned" by the segment + uint32_t slice_count; // slices in this page (0 if not a page) + uint32_t slice_offset; // distance from the actual page data slice (0 if a page) + uint8_t is_committed : 1; // `true` if the page virtual memory is committed + uint8_t is_zero_init : 1; // `true` if the page was initially zero initialized + uint8_t use_qsbr : 1; // delay page freeing using qsbr + uint8_t tag : 4; // tag from the owning heap + uint8_t debug_offset; // number of bytes to preserve when filling freed or uninitialized memory + + // layout like this to optimize access in `mi_malloc` and `mi_free` + uint16_t capacity; // number of blocks committed, must be the first field, see `segment.c:page_clear` + uint16_t reserved; // number of blocks reserved in memory + mi_page_flags_t flags; // `in_full` and `has_aligned` flags (8 bits) + uint8_t free_is_zero : 1; // `true` if the blocks in the free list are zero initialized + uint8_t retire_expire : 7; // expiration count for retired blocks + + mi_block_t* free; // list of available free blocks (`malloc` allocates from this list) + uint32_t used; // number of blocks in use (including blocks in `local_free` and `thread_free`) + uint32_t xblock_size; // size available in each block (always `>0`) + mi_block_t* local_free; // list of deferred free blocks by this thread (migrates to `free`) + + #if (MI_ENCODE_FREELIST || MI_PADDING) + uintptr_t keys[2]; // two random keys to encode the free lists (see `_mi_block_next`) or padding canary + #endif + + _Atomic(mi_thread_free_t) xthread_free; // list of deferred free blocks freed by other threads + _Atomic(uintptr_t) xheap; + + struct mi_page_s* next; // next page owned by this thread with the same `block_size` + struct mi_page_s* prev; // previous page owned by this thread with the same `block_size` + +#ifdef Py_GIL_DISABLED + struct llist_node qsbr_node; + uint64_t qsbr_goal; +#endif + + // 64-bit 9 words, 32-bit 12 words, (+2 for secure) + #if MI_INTPTR_SIZE==8 && !defined(Py_GIL_DISABLED) + uintptr_t padding[1]; + #endif +} mi_page_t; + + + +// ------------------------------------------------------ +// Mimalloc segments contain mimalloc pages +// ------------------------------------------------------ + +typedef enum mi_page_kind_e { + MI_PAGE_SMALL, // small blocks go into 64KiB pages inside a segment + MI_PAGE_MEDIUM, // medium blocks go into medium pages inside a segment + MI_PAGE_LARGE, // larger blocks go into a page of just one block + MI_PAGE_HUGE, // huge blocks (> 16 MiB) are put into a single page in a single segment. +} mi_page_kind_t; + +typedef enum mi_segment_kind_e { + MI_SEGMENT_NORMAL, // MI_SEGMENT_SIZE size with pages inside. + MI_SEGMENT_HUGE, // > MI_LARGE_SIZE_MAX segment with just one huge page inside. +} mi_segment_kind_t; + +// ------------------------------------------------------ +// A segment holds a commit mask where a bit is set if +// the corresponding MI_COMMIT_SIZE area is committed. +// The MI_COMMIT_SIZE must be a multiple of the slice +// size. If it is equal we have the most fine grained +// decommit (but setting it higher can be more efficient). +// The MI_MINIMAL_COMMIT_SIZE is the minimal amount that will +// be committed in one go which can be set higher than +// MI_COMMIT_SIZE for efficiency (while the decommit mask +// is still tracked in fine-grained MI_COMMIT_SIZE chunks) +// ------------------------------------------------------ + +#define MI_MINIMAL_COMMIT_SIZE (1*MI_SEGMENT_SLICE_SIZE) +#define MI_COMMIT_SIZE (MI_SEGMENT_SLICE_SIZE) // 64KiB +#define MI_COMMIT_MASK_BITS (MI_SEGMENT_SIZE / MI_COMMIT_SIZE) +#define MI_COMMIT_MASK_FIELD_BITS MI_SIZE_BITS +#define MI_COMMIT_MASK_FIELD_COUNT (MI_COMMIT_MASK_BITS / MI_COMMIT_MASK_FIELD_BITS) + +#if (MI_COMMIT_MASK_BITS != (MI_COMMIT_MASK_FIELD_COUNT * MI_COMMIT_MASK_FIELD_BITS)) +#error "the segment size must be exactly divisible by the (commit size * size_t bits)" +#endif + +typedef struct mi_commit_mask_s { + size_t mask[MI_COMMIT_MASK_FIELD_COUNT]; +} mi_commit_mask_t; + +typedef mi_page_t mi_slice_t; +typedef int64_t mi_msecs_t; + + +// Memory can reside in arena's, direct OS allocated, or statically allocated. The memid keeps track of this. +typedef enum mi_memkind_e { + MI_MEM_NONE, // not allocated + MI_MEM_EXTERNAL, // not owned by mimalloc but provided externally (via `mi_manage_os_memory` for example) + MI_MEM_STATIC, // allocated in a static area and should not be freed (for arena meta data for example) + MI_MEM_OS, // allocated from the OS + MI_MEM_OS_HUGE, // allocated as huge os pages + MI_MEM_OS_REMAP, // allocated in a remapable area (i.e. using `mremap`) + MI_MEM_ARENA // allocated from an arena (the usual case) +} mi_memkind_t; + +static inline bool mi_memkind_is_os(mi_memkind_t memkind) { + return (memkind >= MI_MEM_OS && memkind <= MI_MEM_OS_REMAP); +} + +typedef struct mi_memid_os_info { + void* base; // actual base address of the block (used for offset aligned allocations) + size_t alignment; // alignment at allocation +} mi_memid_os_info_t; + +typedef struct mi_memid_arena_info { + size_t block_index; // index in the arena + mi_arena_id_t id; // arena id (>= 1) + bool is_exclusive; // the arena can only be used for specific arena allocations +} mi_memid_arena_info_t; + +typedef struct mi_memid_s { + union { + mi_memid_os_info_t os; // only used for MI_MEM_OS + mi_memid_arena_info_t arena; // only used for MI_MEM_ARENA + } mem; + bool is_pinned; // `true` if we cannot decommit/reset/protect in this memory (e.g. when allocated using large OS pages) + bool initially_committed;// `true` if the memory was originally allocated as committed + bool initially_zero; // `true` if the memory was originally zero initialized + mi_memkind_t memkind; +} mi_memid_t; + + +// Segments are large allocated memory blocks (8mb on 64 bit) from +// the OS. Inside segments we allocated fixed size _pages_ that +// contain blocks. +typedef struct mi_segment_s { + // constant fields + mi_memid_t memid; // memory id for arena allocation + bool allow_decommit; + bool allow_purge; + size_t segment_size; + + // segment fields + mi_msecs_t purge_expire; + mi_commit_mask_t purge_mask; + mi_commit_mask_t commit_mask; + + _Atomic(struct mi_segment_s*) abandoned_next; + + // from here is zero initialized + struct mi_segment_s* next; // the list of freed segments in the cache (must be first field, see `segment.c:mi_segment_init`) + + size_t abandoned; // abandoned pages (i.e. the original owning thread stopped) (`abandoned <= used`) + size_t abandoned_visits; // count how often this segment is visited in the abandoned list (to force reclaim it it is too long) + size_t used; // count of pages in use + uintptr_t cookie; // verify addresses in debug mode: `mi_ptr_cookie(segment) == segment->cookie` + + size_t segment_slices; // for huge segments this may be different from `MI_SLICES_PER_SEGMENT` + size_t segment_info_slices; // initial slices we are using segment info and possible guard pages. + + // layout like this to optimize access in `mi_free` + mi_segment_kind_t kind; + size_t slice_entries; // entries in the `slices` array, at most `MI_SLICES_PER_SEGMENT` + _Atomic(mi_threadid_t) thread_id; // unique id of the thread owning this segment + + mi_slice_t slices[MI_SLICES_PER_SEGMENT+1]; // one more for huge blocks with large alignment +} mi_segment_t; + +typedef uintptr_t mi_tagged_segment_t; + +// Segments unowned by any thread are put in a shared pool +typedef struct mi_abandoned_pool_s { + // This is a list of visited abandoned pages that were full at the time. + // this list migrates to `abandoned` when that becomes NULL. The use of + // this list reduces contention and the rate at which segments are visited. + mi_decl_cache_align _Atomic(mi_segment_t*) abandoned_visited; // = NULL + + // The abandoned page list (tagged as it supports pop) + mi_decl_cache_align _Atomic(mi_tagged_segment_t) abandoned; // = NULL + + // Maintain these for debug purposes (these counts may be a bit off) + mi_decl_cache_align _Atomic(size_t) abandoned_count; + mi_decl_cache_align _Atomic(size_t) abandoned_visited_count; + + // We also maintain a count of current readers of the abandoned list + // in order to prevent resetting/decommitting segment memory if it might + // still be read. + mi_decl_cache_align _Atomic(size_t) abandoned_readers; // = 0 +} mi_abandoned_pool_t; + + +// ------------------------------------------------------ +// Heaps +// Provide first-class heaps to allocate from. +// A heap just owns a set of pages for allocation and +// can only be allocate/reallocate from the thread that created it. +// Freeing blocks can be done from any thread though. +// Per thread, the segments are shared among its heaps. +// Per thread, there is always a default heap that is +// used for allocation; it is initialized to statically +// point to an empty heap to avoid initialization checks +// in the fast path. +// ------------------------------------------------------ + +// Thread local data +typedef struct mi_tld_s mi_tld_t; + +// Pages of a certain block size are held in a queue. +typedef struct mi_page_queue_s { + mi_page_t* first; + mi_page_t* last; + size_t block_size; +} mi_page_queue_t; + +#define MI_BIN_FULL (MI_BIN_HUGE+1) + +// Random context +typedef struct mi_random_cxt_s { + uint32_t input[16]; + uint32_t output[16]; + int output_available; + bool weak; +} mi_random_ctx_t; + + +// In debug mode there is a padding structure at the end of the blocks to check for buffer overflows +#if (MI_PADDING) +typedef struct mi_padding_s { + uint32_t canary; // encoded block value to check validity of the padding (in case of overflow) + uint32_t delta; // padding bytes before the block. (mi_usable_size(p) - delta == exact allocated bytes) +} mi_padding_t; +#define MI_PADDING_SIZE (sizeof(mi_padding_t)) +#define MI_PADDING_WSIZE ((MI_PADDING_SIZE + MI_INTPTR_SIZE - 1) / MI_INTPTR_SIZE) +#else +#define MI_PADDING_SIZE 0 +#define MI_PADDING_WSIZE 0 +#endif + +#define MI_PAGES_DIRECT (MI_SMALL_WSIZE_MAX + MI_PADDING_WSIZE + 1) + + +// A heap owns a set of pages. +struct mi_heap_s { + mi_tld_t* tld; + mi_page_t* pages_free_direct[MI_PAGES_DIRECT]; // optimize: array where every entry points a page with possibly free blocks in the corresponding queue for that size. + mi_page_queue_t pages[MI_BIN_FULL + 1]; // queue of pages for each size class (or "bin") + _Atomic(mi_block_t*) thread_delayed_free; + mi_threadid_t thread_id; // thread this heap belongs too + mi_arena_id_t arena_id; // arena id if the heap belongs to a specific arena (or 0) + uintptr_t cookie; // random cookie to verify pointers (see `_mi_ptr_cookie`) + uintptr_t keys[2]; // two random keys used to encode the `thread_delayed_free` list + mi_random_ctx_t random; // random number context used for secure allocation + size_t page_count; // total number of pages in the `pages` queues. + size_t page_retired_min; // smallest retired index (retired pages are fully free, but still in the page queues) + size_t page_retired_max; // largest retired index into the `pages` array. + mi_heap_t* next; // list of heaps per thread + bool no_reclaim; // `true` if this heap should not reclaim abandoned pages + uint8_t tag; // custom identifier for this heap + uint8_t debug_offset; // number of bytes to preserve when filling freed or uninitialized memory + bool page_use_qsbr; // should freeing pages be delayed using QSBR +}; + + + +// ------------------------------------------------------ +// Debug +// ------------------------------------------------------ + +#if !defined(MI_DEBUG_UNINIT) +#define MI_DEBUG_UNINIT (0xD0) +#endif +#if !defined(MI_DEBUG_FREED) +#define MI_DEBUG_FREED (0xDF) +#endif +#if !defined(MI_DEBUG_PADDING) +#define MI_DEBUG_PADDING (0xDE) +#endif + +#if (MI_DEBUG) +// use our own assertion to print without memory allocation +void _mi_assert_fail(const char* assertion, const char* fname, unsigned int line, const char* func ); +#define mi_assert(expr) ((expr) ? (void)0 : _mi_assert_fail(#expr,__FILE__,__LINE__,__func__)) +#else +#define mi_assert(x) +#endif + +#if (MI_DEBUG>1) +#define mi_assert_internal mi_assert +#else +#define mi_assert_internal(x) +#endif + +#if (MI_DEBUG>2) +#define mi_assert_expensive mi_assert +#else +#define mi_assert_expensive(x) +#endif + +// ------------------------------------------------------ +// Statistics +// ------------------------------------------------------ + +#ifndef MI_STAT +#if (MI_DEBUG>0) +#define MI_STAT 2 +#else +#define MI_STAT 0 +#endif +#endif + +typedef struct mi_stat_count_s { + int64_t allocated; + int64_t freed; + int64_t peak; + int64_t current; +} mi_stat_count_t; + +typedef struct mi_stat_counter_s { + int64_t total; + int64_t count; +} mi_stat_counter_t; + +typedef struct mi_stats_s { + mi_stat_count_t segments; + mi_stat_count_t pages; + mi_stat_count_t reserved; + mi_stat_count_t committed; + mi_stat_count_t reset; + mi_stat_count_t purged; + mi_stat_count_t page_committed; + mi_stat_count_t segments_abandoned; + mi_stat_count_t pages_abandoned; + mi_stat_count_t threads; + mi_stat_count_t normal; + mi_stat_count_t huge; + mi_stat_count_t large; + mi_stat_count_t malloc; + mi_stat_count_t segments_cache; + mi_stat_counter_t pages_extended; + mi_stat_counter_t mmap_calls; + mi_stat_counter_t commit_calls; + mi_stat_counter_t reset_calls; + mi_stat_counter_t purge_calls; + mi_stat_counter_t page_no_retire; + mi_stat_counter_t searches; + mi_stat_counter_t normal_count; + mi_stat_counter_t huge_count; + mi_stat_counter_t large_count; +#if MI_STAT>1 + mi_stat_count_t normal_bins[MI_BIN_HUGE+1]; +#endif +} mi_stats_t; + + +void _mi_stat_increase(mi_stat_count_t* stat, size_t amount); +void _mi_stat_decrease(mi_stat_count_t* stat, size_t amount); +void _mi_stat_counter_increase(mi_stat_counter_t* stat, size_t amount); + +#if (MI_STAT) +#define mi_stat_increase(stat,amount) _mi_stat_increase( &(stat), amount) +#define mi_stat_decrease(stat,amount) _mi_stat_decrease( &(stat), amount) +#define mi_stat_counter_increase(stat,amount) _mi_stat_counter_increase( &(stat), amount) +#else +#define mi_stat_increase(stat,amount) (void)0 +#define mi_stat_decrease(stat,amount) (void)0 +#define mi_stat_counter_increase(stat,amount) (void)0 +#endif + +#define mi_heap_stat_counter_increase(heap,stat,amount) mi_stat_counter_increase( (heap)->tld->stats.stat, amount) +#define mi_heap_stat_increase(heap,stat,amount) mi_stat_increase( (heap)->tld->stats.stat, amount) +#define mi_heap_stat_decrease(heap,stat,amount) mi_stat_decrease( (heap)->tld->stats.stat, amount) + +// ------------------------------------------------------ +// Thread Local data +// ------------------------------------------------------ + +// A "span" is is an available range of slices. The span queues keep +// track of slice spans of at most the given `slice_count` (but more than the previous size class). +typedef struct mi_span_queue_s { + mi_slice_t* first; + mi_slice_t* last; + size_t slice_count; +} mi_span_queue_t; + +#define MI_SEGMENT_BIN_MAX (35) // 35 == mi_segment_bin(MI_SLICES_PER_SEGMENT) + +// OS thread local data +typedef struct mi_os_tld_s { + size_t region_idx; // start point for next allocation + mi_stats_t* stats; // points to tld stats +} mi_os_tld_t; + + +// Segments thread local data +typedef struct mi_segments_tld_s { + mi_span_queue_t spans[MI_SEGMENT_BIN_MAX+1]; // free slice spans inside segments + size_t count; // current number of segments; + size_t peak_count; // peak number of segments + size_t current_size; // current size of all segments + size_t peak_size; // peak size of all segments + mi_stats_t* stats; // points to tld stats + mi_os_tld_t* os; // points to os stats + mi_abandoned_pool_t* abandoned; // pool of abandoned segments +} mi_segments_tld_t; + +// Thread local data +struct mi_tld_s { + unsigned long long heartbeat; // monotonic heartbeat count + bool recurse; // true if deferred was called; used to prevent infinite recursion. + mi_heap_t* heap_backing; // backing heap of this thread (cannot be deleted) + mi_heap_t* heaps; // list of heaps in this thread (so we can abandon all when the thread terminates) + mi_segments_tld_t segments; // segment tld + mi_os_tld_t os; // os tld + mi_stats_t stats; // statistics +}; + +#endif diff --git a/Include/internal/pycore_abstract.h b/Include/internal/pycore_abstract.h index b1afb2dc..3cc0afac 100644 --- a/Include/internal/pycore_abstract.h +++ b/Include/internal/pycore_abstract.h @@ -19,6 +19,42 @@ _PyIndex_Check(PyObject *obj) PyObject *_PyNumber_PowerNoMod(PyObject *lhs, PyObject *rhs); PyObject *_PyNumber_InPlacePowerNoMod(PyObject *lhs, PyObject *rhs); +extern int _PyObject_HasLen(PyObject *o); + +/* === Sequence protocol ================================================ */ + +#define PY_ITERSEARCH_COUNT 1 +#define PY_ITERSEARCH_INDEX 2 +#define PY_ITERSEARCH_CONTAINS 3 + +/* Iterate over seq. + + Result depends on the operation: + + PY_ITERSEARCH_COUNT: return # of times obj appears in seq; -1 if + error. + PY_ITERSEARCH_INDEX: return 0-based index of first occurrence of + obj in seq; set ValueError and return -1 if none found; + also return -1 on error. + PY_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on + error. */ +extern Py_ssize_t _PySequence_IterSearch(PyObject *seq, + PyObject *obj, int operation); + +/* === Mapping protocol ================================================= */ + +extern int _PyObject_RealIsInstance(PyObject *inst, PyObject *cls); + +extern int _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls); + +// Convert Python int to Py_ssize_t. Do nothing if the argument is None. +// Export for '_bisect' shared extension. +PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); + +// Same as PyNumber_Index() but can return an instance of a subclass of int. +// Export for 'math' shared extension. +PyAPI_FUNC(PyObject*) _PyNumber_Index(PyObject *o); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_ast.h b/Include/internal/pycore_ast.h index b568902b..f5bf1205 100644 --- a/Include/internal/pycore_ast.h +++ b/Include/internal/pycore_ast.h @@ -10,7 +10,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_asdl.h" +#include "pycore_asdl.h" // _ASDL_SEQ_HEAD typedef struct _mod *mod_ty; @@ -657,14 +657,17 @@ struct _type_param { struct { identifier name; expr_ty bound; + expr_ty default_value; } TypeVar; struct { identifier name; + expr_ty default_value; } ParamSpec; struct { identifier name; + expr_ty default_value; } TypeVarTuple; } v; @@ -892,14 +895,15 @@ pattern_ty _PyAST_MatchOr(asdl_pattern_seq * patterns, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); type_ignore_ty _PyAST_TypeIgnore(int lineno, string tag, PyArena *arena); -type_param_ty _PyAST_TypeVar(identifier name, expr_ty bound, int lineno, int - col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -type_param_ty _PyAST_ParamSpec(identifier name, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -type_param_ty _PyAST_TypeVarTuple(identifier name, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena - *arena); +type_param_ty _PyAST_TypeVar(identifier name, expr_ty bound, expr_ty + default_value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +type_param_ty _PyAST_ParamSpec(identifier name, expr_ty default_value, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +type_param_ty _PyAST_TypeVarTuple(identifier name, expr_ty default_value, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); diff --git a/Include/internal/pycore_ast_state.h b/Include/internal/pycore_ast_state.h index 0c0d53f3..09ae9546 100644 --- a/Include/internal/pycore_ast_state.h +++ b/Include/internal/pycore_ast_state.h @@ -2,6 +2,9 @@ #ifndef Py_INTERNAL_AST_STATE_H #define Py_INTERNAL_AST_STATE_H + +#include "pycore_lock.h" // _PyOnceFlag + #ifdef __cplusplus extern "C" { #endif @@ -11,9 +14,8 @@ extern "C" { #endif struct ast_state { - int initialized; - int recursion_depth; - int recursion_limit; + _PyOnceFlag once; + int finalized; PyObject *AST_type; PyObject *Add_singleton; PyObject *Add_type; @@ -182,6 +184,7 @@ struct ast_state { PyObject *conversion; PyObject *ctx; PyObject *decorator_list; + PyObject *default_value; PyObject *defaults; PyObject *elt; PyObject *elts; diff --git a/Include/internal/pycore_atexit.h b/Include/internal/pycore_atexit.h index 63a2cd5d..507a5c03 100644 --- a/Include/internal/pycore_atexit.h +++ b/Include/internal/pycore_atexit.h @@ -1,5 +1,8 @@ #ifndef Py_INTERNAL_ATEXIT_H #define Py_INTERNAL_ATEXIT_H + +#include "pycore_lock.h" // PyMutex + #ifdef __cplusplus extern "C" { #endif @@ -15,7 +18,7 @@ extern "C" { typedef void (*atexit_callbackfunc)(void); struct _atexit_runtime_state { - PyThread_type_lock mutex; + PyMutex mutex; #define NEXITFUNCS 32 atexit_callbackfunc callbacks[NEXITFUNCS]; int ncallbacks; @@ -25,7 +28,8 @@ struct _atexit_runtime_state { //################### // interpreter atexit -struct atexit_callback; +typedef void (*atexit_datacallbackfunc)(void *); + typedef struct atexit_callback { atexit_datacallbackfunc func; void *data; @@ -50,6 +54,11 @@ struct atexit_state { int callback_len; }; +// Export for '_interpchannels' shared extension +PyAPI_FUNC(int) _Py_AtExit( + PyInterpreterState *interp, + atexit_datacallbackfunc func, + void *data); #ifdef __cplusplus } diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h deleted file mode 100644 index 425d69f8..00000000 --- a/Include/internal/pycore_atomic.h +++ /dev/null @@ -1,557 +0,0 @@ -#ifndef Py_ATOMIC_H -#define Py_ATOMIC_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */ -#include "pyconfig.h" - -#ifdef HAVE_STD_ATOMIC -# include -#endif - - -#if defined(_MSC_VER) -#include -#if defined(_M_IX86) || defined(_M_X64) -# include -#endif -#endif - -/* This is modeled after the atomics interface from C1x, according to - * the draft at - * http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf. - * Operations and types are named the same except with a _Py_ prefix - * and have the same semantics. - * - * Beware, the implementations here are deep magic. - */ - -#if defined(HAVE_STD_ATOMIC) - -typedef enum _Py_memory_order { - _Py_memory_order_relaxed = memory_order_relaxed, - _Py_memory_order_acquire = memory_order_acquire, - _Py_memory_order_release = memory_order_release, - _Py_memory_order_acq_rel = memory_order_acq_rel, - _Py_memory_order_seq_cst = memory_order_seq_cst -} _Py_memory_order; - -typedef struct _Py_atomic_address { - atomic_uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - atomic_int _value; -} _Py_atomic_int; - -#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ - atomic_signal_fence(ORDER) - -#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ - atomic_thread_fence(ORDER) - -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - atomic_store_explicit(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER) - -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) - -// Use builtin atomic operations in GCC >= 4.7 and clang -#elif defined(HAVE_BUILTIN_ATOMIC) - -typedef enum _Py_memory_order { - _Py_memory_order_relaxed = __ATOMIC_RELAXED, - _Py_memory_order_acquire = __ATOMIC_ACQUIRE, - _Py_memory_order_release = __ATOMIC_RELEASE, - _Py_memory_order_acq_rel = __ATOMIC_ACQ_REL, - _Py_memory_order_seq_cst = __ATOMIC_SEQ_CST -} _Py_memory_order; - -typedef struct _Py_atomic_address { - uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - int _value; -} _Py_atomic_int; - -#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) \ - __atomic_signal_fence(ORDER) - -#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) \ - __atomic_thread_fence(ORDER) - -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - (assert((ORDER) == __ATOMIC_RELAXED \ - || (ORDER) == __ATOMIC_SEQ_CST \ - || (ORDER) == __ATOMIC_RELEASE), \ - __atomic_store_n(&((ATOMIC_VAL)->_value), NEW_VAL, ORDER)) - -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - (assert((ORDER) == __ATOMIC_RELAXED \ - || (ORDER) == __ATOMIC_SEQ_CST \ - || (ORDER) == __ATOMIC_ACQUIRE \ - || (ORDER) == __ATOMIC_CONSUME), \ - __atomic_load_n(&((ATOMIC_VAL)->_value), ORDER)) - -/* Only support GCC (for expression statements) and x86 (for simple - * atomic semantics) and MSVC x86/x64/ARM */ -#elif defined(__GNUC__) && (defined(__i386__) || defined(__amd64)) -typedef enum _Py_memory_order { - _Py_memory_order_relaxed, - _Py_memory_order_acquire, - _Py_memory_order_release, - _Py_memory_order_acq_rel, - _Py_memory_order_seq_cst -} _Py_memory_order; - -typedef struct _Py_atomic_address { - uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - int _value; -} _Py_atomic_int; - - -static __inline__ void -_Py_atomic_signal_fence(_Py_memory_order order) -{ - if (order != _Py_memory_order_relaxed) - __asm__ volatile("":::"memory"); -} - -static __inline__ void -_Py_atomic_thread_fence(_Py_memory_order order) -{ - if (order != _Py_memory_order_relaxed) - __asm__ volatile("mfence":::"memory"); -} - -/* Tell the race checker about this operation's effects. */ -static __inline__ void -_Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order) -{ - (void)address; /* shut up -Wunused-parameter */ - switch(order) { - case _Py_memory_order_release: - case _Py_memory_order_acq_rel: - case _Py_memory_order_seq_cst: - _Py_ANNOTATE_HAPPENS_BEFORE(address); - break; - case _Py_memory_order_relaxed: - case _Py_memory_order_acquire: - break; - } - switch(order) { - case _Py_memory_order_acquire: - case _Py_memory_order_acq_rel: - case _Py_memory_order_seq_cst: - _Py_ANNOTATE_HAPPENS_AFTER(address); - break; - case _Py_memory_order_relaxed: - case _Py_memory_order_release: - break; - } -} - -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - __extension__ ({ \ - __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ - __typeof__(atomic_val->_value) new_val = NEW_VAL;\ - volatile __typeof__(new_val) *volatile_data = &atomic_val->_value; \ - _Py_memory_order order = ORDER; \ - _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ - \ - /* Perform the operation. */ \ - _Py_ANNOTATE_IGNORE_WRITES_BEGIN(); \ - switch(order) { \ - case _Py_memory_order_release: \ - _Py_atomic_signal_fence(_Py_memory_order_release); \ - /* fallthrough */ \ - case _Py_memory_order_relaxed: \ - *volatile_data = new_val; \ - break; \ - \ - case _Py_memory_order_acquire: \ - case _Py_memory_order_acq_rel: \ - case _Py_memory_order_seq_cst: \ - __asm__ volatile("xchg %0, %1" \ - : "+r"(new_val) \ - : "m"(atomic_val->_value) \ - : "memory"); \ - break; \ - } \ - _Py_ANNOTATE_IGNORE_WRITES_END(); \ - }) - -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - __extension__ ({ \ - __typeof__(ATOMIC_VAL) atomic_val = ATOMIC_VAL; \ - __typeof__(atomic_val->_value) result; \ - volatile __typeof__(result) *volatile_data = &atomic_val->_value; \ - _Py_memory_order order = ORDER; \ - _Py_ANNOTATE_MEMORY_ORDER(atomic_val, order); \ - \ - /* Perform the operation. */ \ - _Py_ANNOTATE_IGNORE_READS_BEGIN(); \ - switch(order) { \ - case _Py_memory_order_release: \ - case _Py_memory_order_acq_rel: \ - case _Py_memory_order_seq_cst: \ - /* Loads on x86 are not releases by default, so need a */ \ - /* thread fence. */ \ - _Py_atomic_thread_fence(_Py_memory_order_release); \ - break; \ - default: \ - /* No fence */ \ - break; \ - } \ - result = *volatile_data; \ - switch(order) { \ - case _Py_memory_order_acquire: \ - case _Py_memory_order_acq_rel: \ - case _Py_memory_order_seq_cst: \ - /* Loads on x86 are automatically acquire operations so */ \ - /* can get by with just a compiler fence. */ \ - _Py_atomic_signal_fence(_Py_memory_order_acquire); \ - break; \ - default: \ - /* No fence */ \ - break; \ - } \ - _Py_ANNOTATE_IGNORE_READS_END(); \ - result; \ - }) - -#elif defined(_MSC_VER) -/* _Interlocked* functions provide a full memory barrier and are therefore - enough for acq_rel and seq_cst. If the HLE variants aren't available - in hardware they will fall back to a full memory barrier as well. - - This might affect performance but likely only in some very specific and - hard to measure scenario. -*/ -#if defined(_M_IX86) || defined(_M_X64) -typedef enum _Py_memory_order { - _Py_memory_order_relaxed, - _Py_memory_order_acquire, - _Py_memory_order_release, - _Py_memory_order_acq_rel, - _Py_memory_order_seq_cst -} _Py_memory_order; - -typedef struct _Py_atomic_address { - volatile uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - volatile int _value; -} _Py_atomic_int; - - -#if defined(_M_X64) -#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ - switch (ORDER) { \ - case _Py_memory_order_acquire: \ - _InterlockedExchange64_HLEAcquire((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)(NEW_VAL)); \ - break; \ - case _Py_memory_order_release: \ - _InterlockedExchange64_HLERelease((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)(NEW_VAL)); \ - break; \ - default: \ - _InterlockedExchange64((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)(NEW_VAL)); \ - break; \ - } -#else -#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); -#endif - -#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ - switch (ORDER) { \ - case _Py_memory_order_acquire: \ - _InterlockedExchange_HLEAcquire((volatile long*)&((ATOMIC_VAL)->_value), (int)(NEW_VAL)); \ - break; \ - case _Py_memory_order_release: \ - _InterlockedExchange_HLERelease((volatile long*)&((ATOMIC_VAL)->_value), (int)(NEW_VAL)); \ - break; \ - default: \ - _InterlockedExchange((volatile long*)&((ATOMIC_VAL)->_value), (int)(NEW_VAL)); \ - break; \ - } - -#if defined(_M_X64) -/* This has to be an intptr_t for now. - gil_created() uses -1 as a sentinel value, if this returns - a uintptr_t it will do an unsigned compare and crash -*/ -inline intptr_t _Py_atomic_load_64bit_impl(volatile uintptr_t* value, int order) { - __int64 old; - switch (order) { - case _Py_memory_order_acquire: - { - do { - old = *value; - } while(_InterlockedCompareExchange64_HLEAcquire((volatile __int64*)value, old, old) != old); - break; - } - case _Py_memory_order_release: - { - do { - old = *value; - } while(_InterlockedCompareExchange64_HLERelease((volatile __int64*)value, old, old) != old); - break; - } - case _Py_memory_order_relaxed: - old = *value; - break; - default: - { - do { - old = *value; - } while(_InterlockedCompareExchange64((volatile __int64*)value, old, old) != old); - break; - } - } - return old; -} - -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) \ - _Py_atomic_load_64bit_impl((volatile uintptr_t*)&((ATOMIC_VAL)->_value), (ORDER)) - -#else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) ((ATOMIC_VAL)->_value) -#endif - -inline int _Py_atomic_load_32bit_impl(volatile int* value, int order) { - long old; - switch (order) { - case _Py_memory_order_acquire: - { - do { - old = *value; - } while(_InterlockedCompareExchange_HLEAcquire((volatile long*)value, old, old) != old); - break; - } - case _Py_memory_order_release: - { - do { - old = *value; - } while(_InterlockedCompareExchange_HLERelease((volatile long*)value, old, old) != old); - break; - } - case _Py_memory_order_relaxed: - old = *value; - break; - default: - { - do { - old = *value; - } while(_InterlockedCompareExchange((volatile long*)value, old, old) != old); - break; - } - } - return old; -} - -#define _Py_atomic_load_32bit(ATOMIC_VAL, ORDER) \ - _Py_atomic_load_32bit_impl((volatile int*)&((ATOMIC_VAL)->_value), (ORDER)) - -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof((ATOMIC_VAL)->_value) == 8) { \ - _Py_atomic_store_64bit((ATOMIC_VAL), NEW_VAL, ORDER) } else { \ - _Py_atomic_store_32bit((ATOMIC_VAL), NEW_VAL, ORDER) } - -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - ( \ - sizeof((ATOMIC_VAL)->_value) == 8 ? \ - _Py_atomic_load_64bit((ATOMIC_VAL), ORDER) : \ - _Py_atomic_load_32bit((ATOMIC_VAL), ORDER) \ - ) -#elif defined(_M_ARM) || defined(_M_ARM64) -typedef enum _Py_memory_order { - _Py_memory_order_relaxed, - _Py_memory_order_acquire, - _Py_memory_order_release, - _Py_memory_order_acq_rel, - _Py_memory_order_seq_cst -} _Py_memory_order; - -typedef struct _Py_atomic_address { - volatile uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - volatile int _value; -} _Py_atomic_int; - - -#if defined(_M_ARM64) -#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) \ - switch (ORDER) { \ - case _Py_memory_order_acquire: \ - _InterlockedExchange64_acq((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ - break; \ - case _Py_memory_order_release: \ - _InterlockedExchange64_rel((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ - break; \ - default: \ - _InterlockedExchange64((__int64 volatile*)&((ATOMIC_VAL)->_value), (__int64)NEW_VAL); \ - break; \ - } -#else -#define _Py_atomic_store_64bit(ATOMIC_VAL, NEW_VAL, ORDER) ((void)0); -#endif - -#define _Py_atomic_store_32bit(ATOMIC_VAL, NEW_VAL, ORDER) \ - switch (ORDER) { \ - case _Py_memory_order_acquire: \ - _InterlockedExchange_acq((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ - break; \ - case _Py_memory_order_release: \ - _InterlockedExchange_rel((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ - break; \ - default: \ - _InterlockedExchange((volatile long*)&((ATOMIC_VAL)->_value), (int)NEW_VAL); \ - break; \ - } - -#if defined(_M_ARM64) -/* This has to be an intptr_t for now. - gil_created() uses -1 as a sentinel value, if this returns - a uintptr_t it will do an unsigned compare and crash -*/ -inline intptr_t _Py_atomic_load_64bit_impl(volatile uintptr_t* value, int order) { - uintptr_t old; - switch (order) { - case _Py_memory_order_acquire: - { - do { - old = *value; - } while(_InterlockedCompareExchange64_acq(value, old, old) != old); - break; - } - case _Py_memory_order_release: - { - do { - old = *value; - } while(_InterlockedCompareExchange64_rel(value, old, old) != old); - break; - } - case _Py_memory_order_relaxed: - old = *value; - break; - default: - { - do { - old = *value; - } while(_InterlockedCompareExchange64(value, old, old) != old); - break; - } - } - return old; -} - -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) \ - _Py_atomic_load_64bit_impl((volatile uintptr_t*)&((ATOMIC_VAL)->_value), (ORDER)) - -#else -#define _Py_atomic_load_64bit(ATOMIC_VAL, ORDER) ((ATOMIC_VAL)->_value) -#endif - -inline int _Py_atomic_load_32bit_impl(volatile int* value, int order) { - int old; - switch (order) { - case _Py_memory_order_acquire: - { - do { - old = *value; - } while(_InterlockedCompareExchange_acq(value, old, old) != old); - break; - } - case _Py_memory_order_release: - { - do { - old = *value; - } while(_InterlockedCompareExchange_rel(value, old, old) != old); - break; - } - case _Py_memory_order_relaxed: - old = *value; - break; - default: - { - do { - old = *value; - } while(_InterlockedCompareExchange(value, old, old) != old); - break; - } - } - return old; -} - -#define _Py_atomic_load_32bit(ATOMIC_VAL, ORDER) \ - _Py_atomic_load_32bit_impl((volatile int*)&((ATOMIC_VAL)->_value), (ORDER)) - -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - if (sizeof((ATOMIC_VAL)->_value) == 8) { \ - _Py_atomic_store_64bit((ATOMIC_VAL), (NEW_VAL), (ORDER)) } else { \ - _Py_atomic_store_32bit((ATOMIC_VAL), (NEW_VAL), (ORDER)) } - -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - ( \ - sizeof((ATOMIC_VAL)->_value) == 8 ? \ - _Py_atomic_load_64bit((ATOMIC_VAL), (ORDER)) : \ - _Py_atomic_load_32bit((ATOMIC_VAL), (ORDER)) \ - ) -#endif -#else /* !gcc x86 !_msc_ver */ -typedef enum _Py_memory_order { - _Py_memory_order_relaxed, - _Py_memory_order_acquire, - _Py_memory_order_release, - _Py_memory_order_acq_rel, - _Py_memory_order_seq_cst -} _Py_memory_order; - -typedef struct _Py_atomic_address { - uintptr_t _value; -} _Py_atomic_address; - -typedef struct _Py_atomic_int { - int _value; -} _Py_atomic_int; -/* Fall back to other compilers and processors by assuming that simple - volatile accesses are atomic. This is false, so people should port - this. */ -#define _Py_atomic_signal_fence(/*memory_order*/ ORDER) ((void)0) -#define _Py_atomic_thread_fence(/*memory_order*/ ORDER) ((void)0) -#define _Py_atomic_store_explicit(ATOMIC_VAL, NEW_VAL, ORDER) \ - ((ATOMIC_VAL)->_value = NEW_VAL) -#define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ - ((ATOMIC_VAL)->_value) -#endif - -/* Standardized shortcuts. */ -#define _Py_atomic_store(ATOMIC_VAL, NEW_VAL) \ - _Py_atomic_store_explicit((ATOMIC_VAL), (NEW_VAL), _Py_memory_order_seq_cst) -#define _Py_atomic_load(ATOMIC_VAL) \ - _Py_atomic_load_explicit((ATOMIC_VAL), _Py_memory_order_seq_cst) - -/* Python-local extensions */ - -#define _Py_atomic_store_relaxed(ATOMIC_VAL, NEW_VAL) \ - _Py_atomic_store_explicit((ATOMIC_VAL), (NEW_VAL), _Py_memory_order_relaxed) -#define _Py_atomic_load_relaxed(ATOMIC_VAL) \ - _Py_atomic_load_explicit((ATOMIC_VAL), _Py_memory_order_relaxed) - -#ifdef __cplusplus -} -#endif -#endif /* Py_ATOMIC_H */ diff --git a/Include/internal/pycore_atomic_funcs.h b/Include/internal/pycore_atomic_funcs.h deleted file mode 100644 index a708789c..00000000 --- a/Include/internal/pycore_atomic_funcs.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Atomic functions: similar to pycore_atomic.h, but don't need - to declare variables as atomic. - - Py_ssize_t type: - - * value = _Py_atomic_size_get(&var) - * _Py_atomic_size_set(&var, value) - - Use sequentially-consistent ordering (__ATOMIC_SEQ_CST memory order): - enforce total ordering with all other atomic functions. -*/ -#ifndef Py_ATOMIC_FUNC_H -#define Py_ATOMIC_FUNC_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#if defined(_MSC_VER) -# include // _InterlockedExchange() -#endif - - -// Use builtin atomic operations in GCC >= 4.7 and clang -#ifdef HAVE_BUILTIN_ATOMIC - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ - return __atomic_load_n(var, __ATOMIC_SEQ_CST); -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ - __atomic_store_n(var, value, __ATOMIC_SEQ_CST); -} - -#elif defined(_MSC_VER) - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ -#if SIZEOF_VOID_P == 8 - Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); - volatile __int64 *volatile_var = (volatile __int64 *)var; - __int64 old; - do { - old = *volatile_var; - } while(_InterlockedCompareExchange64(volatile_var, old, old) != old); -#else - Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); - volatile long *volatile_var = (volatile long *)var; - long old; - do { - old = *volatile_var; - } while(_InterlockedCompareExchange(volatile_var, old, old) != old); -#endif - return old; -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ -#if SIZEOF_VOID_P == 8 - Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); - volatile __int64 *volatile_var = (volatile __int64 *)var; - _InterlockedExchange64(volatile_var, value); -#else - Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); - volatile long *volatile_var = (volatile long *)var; - _InterlockedExchange(volatile_var, value); -#endif -} - -#else -// Fallback implementation using volatile - -static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) -{ - volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; - return *volatile_var; -} - -static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) -{ - volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; - *volatile_var = value; -} -#endif - -#ifdef __cplusplus -} -#endif -#endif /* Py_ATOMIC_FUNC_H */ diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h new file mode 100644 index 00000000..0bcca1e7 --- /dev/null +++ b/Include/internal/pycore_backoff.h @@ -0,0 +1,145 @@ + +#ifndef Py_INTERNAL_BACKOFF_H +#define Py_INTERNAL_BACKOFF_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include +#include +#include + + +typedef struct { + union { + struct { + uint16_t backoff : 4; + uint16_t value : 12; + }; + uint16_t as_counter; // For printf("%#x", ...) + }; +} _Py_BackoffCounter; + + +/* 16-bit countdown counters using exponential backoff. + + These are used by the adaptive specializer to count down until + it is time to specialize an instruction. If specialization fails + the counter is reset using exponential backoff. + + Another use is for the Tier 2 optimizer to decide when to create + a new Tier 2 trace (executor). Again, exponential backoff is used. + + The 16-bit counter is structured as a 12-bit unsigned 'value' + and a 4-bit 'backoff' field. When resetting the counter, the + backoff field is incremented (until it reaches a limit) and the + value is set to a bit mask representing the value 2**backoff - 1. + The maximum backoff is 12 (the number of value bits). + + There is an exceptional value which must not be updated, 0xFFFF. +*/ + +#define UNREACHABLE_BACKOFF 0xFFFF + +static inline bool +is_unreachable_backoff_counter(_Py_BackoffCounter counter) +{ + return counter.as_counter == UNREACHABLE_BACKOFF; +} + +static inline _Py_BackoffCounter +make_backoff_counter(uint16_t value, uint16_t backoff) +{ + assert(backoff <= 15); + assert(value <= 0xFFF); + _Py_BackoffCounter result; + result.value = value; + result.backoff = backoff; + return result; +} + +static inline _Py_BackoffCounter +forge_backoff_counter(uint16_t counter) +{ + _Py_BackoffCounter result; + result.as_counter = counter; + return result; +} + +static inline _Py_BackoffCounter +restart_backoff_counter(_Py_BackoffCounter counter) +{ + assert(!is_unreachable_backoff_counter(counter)); + if (counter.backoff < 12) { + return make_backoff_counter((1 << (counter.backoff + 1)) - 1, counter.backoff + 1); + } + else { + return make_backoff_counter((1 << 12) - 1, 12); + } +} + +static inline _Py_BackoffCounter +pause_backoff_counter(_Py_BackoffCounter counter) +{ + return make_backoff_counter(counter.value | 1, counter.backoff); +} + +static inline _Py_BackoffCounter +advance_backoff_counter(_Py_BackoffCounter counter) +{ + if (!is_unreachable_backoff_counter(counter)) { + return make_backoff_counter((counter.value - 1) & 0xFFF, counter.backoff); + } + else { + return counter; + } +} + +static inline bool +backoff_counter_triggers(_Py_BackoffCounter counter) +{ + return counter.value == 0; +} + +/* Initial JUMP_BACKWARD counter. + * This determines when we create a trace for a loop. +* Backoff sequence 16, 32, 64, 128, 256, 512, 1024, 2048, 4096. */ +#define JUMP_BACKWARD_INITIAL_VALUE 16 +#define JUMP_BACKWARD_INITIAL_BACKOFF 4 +static inline _Py_BackoffCounter +initial_jump_backoff_counter(void) +{ + return make_backoff_counter(JUMP_BACKWARD_INITIAL_VALUE, + JUMP_BACKWARD_INITIAL_BACKOFF); +} + +/* Initial exit temperature. + * Must be larger than ADAPTIVE_COOLDOWN_VALUE, + * otherwise when a side exit warms up we may construct + * a new trace before the Tier 1 code has properly re-specialized. + * Backoff sequence 64, 128, 256, 512, 1024, 2048, 4096. */ +#define COLD_EXIT_INITIAL_VALUE 64 +#define COLD_EXIT_INITIAL_BACKOFF 6 + +static inline _Py_BackoffCounter +initial_temperature_backoff_counter(void) +{ + return make_backoff_counter(COLD_EXIT_INITIAL_VALUE, + COLD_EXIT_INITIAL_BACKOFF); +} + +/* Unreachable backoff counter. */ +static inline _Py_BackoffCounter +initial_unreachable_backoff_counter(void) +{ + return forge_backoff_counter(UNREACHABLE_BACKOFF); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_BACKOFF_H */ diff --git a/Include/internal/pycore_bitutils.h b/Include/internal/pycore_bitutils.h index e6bf61ef..50f69377 100644 --- a/Include/internal/pycore_bitutils.h +++ b/Include/internal/pycore_bitutils.h @@ -26,10 +26,10 @@ extern "C" { #endif #ifdef _MSC_VER - /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ -# include +# include // _byteswap_uint64() #endif + static inline uint16_t _Py_bswap16(uint16_t word) { diff --git a/Include/internal/pycore_blocks_output_buffer.h b/Include/internal/pycore_blocks_output_buffer.h index 28cf6fba..573e1035 100644 --- a/Include/internal/pycore_blocks_output_buffer.h +++ b/Include/internal/pycore_blocks_output_buffer.h @@ -40,6 +40,10 @@ extern "C" { #include "Python.h" +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + typedef struct { // List of bytes objects PyObject *list; @@ -314,4 +318,4 @@ _BlocksOutputBuffer_OnError(_BlocksOutputBuffer *buffer) #ifdef __cplusplus } #endif -#endif /* Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H */ \ No newline at end of file +#endif /* Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H */ diff --git a/Include/internal/pycore_brc.h b/Include/internal/pycore_brc.h new file mode 100644 index 00000000..3453d83b --- /dev/null +++ b/Include/internal/pycore_brc.h @@ -0,0 +1,74 @@ +#ifndef Py_INTERNAL_BRC_H +#define Py_INTERNAL_BRC_H + +#include +#include "pycore_llist.h" // struct llist_node +#include "pycore_lock.h" // PyMutex +#include "pycore_object_stack.h" // _PyObjectStack + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef Py_GIL_DISABLED + +// Prime number to avoid correlations with memory addresses. +#define _Py_BRC_NUM_BUCKETS 257 + +// Hash table bucket +struct _brc_bucket { + // Mutex protects both the bucket and thread state queues in this bucket. + PyMutex mutex; + + // Linked list of _PyThreadStateImpl objects hashed to this bucket. + struct llist_node root; +}; + +// Per-interpreter biased reference counting state +struct _brc_state { + // Hash table of thread states by thread-id. Thread states within a bucket + // are chained using a doubly-linked list. + struct _brc_bucket table[_Py_BRC_NUM_BUCKETS]; +}; + +// Per-thread biased reference counting state +struct _brc_thread_state { + // Linked-list of thread states per hash bucket + struct llist_node bucket_node; + + // Thread-id as determined by _PyThread_Id() + uintptr_t tid; + + // Objects with refcounts to be merged (protected by bucket mutex) + _PyObjectStack objects_to_merge; + + // Local stack of objects to be merged (not accessed by other threads) + _PyObjectStack local_objects_to_merge; +}; + +// Initialize/finalize the per-thread biased reference counting state +void _Py_brc_init_thread(PyThreadState *tstate); +void _Py_brc_remove_thread(PyThreadState *tstate); + +// Initialize per-interpreter state +void _Py_brc_init_state(PyInterpreterState *interp); + +void _Py_brc_after_fork(PyInterpreterState *interp); + +// Enqueues an object to be merged by it's owning thread (tid). This +// steals a reference to the object. +void _Py_brc_queue_object(PyObject *ob); + +// Merge the refcounts of queued objects for the current thread. +void _Py_brc_merge_refcounts(PyThreadState *tstate); + +#endif /* Py_GIL_DISABLED */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_BRC_H */ diff --git a/Include/internal/pycore_bytes_methods.h b/Include/internal/pycore_bytes_methods.h index 11e8ab20..059dc259 100644 --- a/Include/internal/pycore_bytes_methods.h +++ b/Include/internal/pycore_bytes_methods.h @@ -26,14 +26,23 @@ extern void _Py_bytes_title(char *result, const char *s, Py_ssize_t len); extern void _Py_bytes_capitalize(char *result, const char *s, Py_ssize_t len); extern void _Py_bytes_swapcase(char *result, const char *s, Py_ssize_t len); -extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_find(const char *str, Py_ssize_t len, PyObject *sub, + Py_ssize_t start, Py_ssize_t end); +extern PyObject *_Py_bytes_index(const char *str, Py_ssize_t len, PyObject *sub, + Py_ssize_t start, Py_ssize_t end); +extern PyObject *_Py_bytes_rfind(const char *str, Py_ssize_t len, PyObject *sub, + Py_ssize_t start, Py_ssize_t end); +extern PyObject *_Py_bytes_rindex(const char *str, Py_ssize_t len, PyObject *sub, + Py_ssize_t start, Py_ssize_t end); +extern PyObject *_Py_bytes_count(const char *str, Py_ssize_t len, PyObject *sub, + Py_ssize_t start, Py_ssize_t end); extern int _Py_bytes_contains(const char *str, Py_ssize_t len, PyObject *arg); -extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, PyObject *args); -extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *args); +extern PyObject *_Py_bytes_startswith(const char *str, Py_ssize_t len, + PyObject *subobj, Py_ssize_t start, + Py_ssize_t end); +extern PyObject *_Py_bytes_endswith(const char *str, Py_ssize_t len, + PyObject *subobj, Py_ssize_t start, + Py_ssize_t end); /* The maketrans() static method. */ extern PyObject* _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to); diff --git a/Include/internal/pycore_bytesobject.h b/Include/internal/pycore_bytesobject.h index d36fa956..300e7f48 100644 --- a/Include/internal/pycore_bytesobject.h +++ b/Include/internal/pycore_bytesobject.h @@ -8,39 +8,140 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +extern PyObject* _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); -/* Substring Search. +extern PyObject* _PyBytes_FromHex( + PyObject *string, + int use_bytearray); - Returns the index of the first occurrence of - a substring ("needle") in a larger text ("haystack"). - If the needle is not found, return -1. - If the needle is found, add offset to the index. -*/ +// Helper for PyBytes_DecodeEscape that detects invalid escape chars. +// Export for test_peg_generator. +PyAPI_FUNC(PyObject*) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, const char **); + +// Substring Search. +// +// Returns the index of the first occurrence of +// a substring ("needle") in a larger text ("haystack"). +// If the needle is not found, return -1. +// If the needle is found, add offset to the index. +// +// Export for 'mmap' shared extension. PyAPI_FUNC(Py_ssize_t) _PyBytes_Find(const char *haystack, Py_ssize_t len_haystack, const char *needle, Py_ssize_t len_needle, Py_ssize_t offset); -/* Same as above, but search right-to-left */ +// Same as above, but search right-to-left. +// Export for 'mmap' shared extension. PyAPI_FUNC(Py_ssize_t) _PyBytes_ReverseFind(const char *haystack, Py_ssize_t len_haystack, const char *needle, Py_ssize_t len_needle, Py_ssize_t offset); -/** Helper function to implement the repeat and inplace repeat methods on a buffer - * - * len_dest is assumed to be an integer multiple of len_src. - * If src equals dest, then assume the operation is inplace. - * - * This method repeately doubles the number of bytes copied to reduce - * the number of invocations of memcpy. - */ +// Helper function to implement the repeat and inplace repeat methods on a +// buffer. +// +// len_dest is assumed to be an integer multiple of len_src. +// If src equals dest, then assume the operation is inplace. +// +// This method repeately doubles the number of bytes copied to reduce +// the number of invocations of memcpy. +// +// Export for 'array' shared extension. PyAPI_FUNC(void) _PyBytes_Repeat(char* dest, Py_ssize_t len_dest, const char* src, Py_ssize_t len_src); +/* --- _PyBytesWriter ----------------------------------------------------- */ + +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. + + Export _PyBytesWriter API for '_pickle' shared extension. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h index 5d9342b5..c92028a0 100644 --- a/Include/internal/pycore_call.h +++ b/Include/internal/pycore_call.h @@ -8,31 +8,107 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_identifier.h" // _Py_Identifier #include "pycore_pystate.h" // _PyThreadState_GET() -PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( +/* Suggested size (number of positional arguments) for arrays of PyObject* + allocated on a C stack to avoid allocating memory on the heap memory. Such + array is used to pass positional arguments to call functions of the + PyObject_Vectorcall() family. + + The size is chosen to not abuse the C stack and so limit the risk of stack + overflow. The size is also chosen to allow using the small stack for most + function calls of the Python standard library. On 64-bit CPU, it allocates + 40 bytes on the stack. */ +#define _PY_FASTCALL_SMALL_STACK 5 + + +// Export for 'math' shared extension, used via _PyObject_VectorcallTstate() +// static inline function. +PyAPI_FUNC(PyObject*) _Py_CheckFunctionResult( + PyThreadState *tstate, + PyObject *callable, + PyObject *result, + const char *where); + +extern PyObject* _PyObject_Call_Prepend( PyThreadState *tstate, PyObject *callable, PyObject *obj, PyObject *args, PyObject *kwargs); -PyAPI_FUNC(PyObject *) _PyObject_FastCallDictTstate( +extern PyObject* _PyObject_VectorcallDictTstate( PyThreadState *tstate, PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwargs); -PyAPI_FUNC(PyObject *) _PyObject_Call( +extern PyObject* _PyObject_Call( PyThreadState *tstate, PyObject *callable, PyObject *args, PyObject *kwargs); extern PyObject * _PyObject_CallMethodFormat( - PyThreadState *tstate, PyObject *callable, const char *format, ...); + PyThreadState *tstate, + PyObject *callable, + const char *format, + ...); + +// Export for 'array' shared extension +PyAPI_FUNC(PyObject*) _PyObject_CallMethod( + PyObject *obj, + PyObject *name, + const char *format, ...); + +extern PyObject* _PyObject_CallMethodIdObjArgs( + PyObject *obj, + _Py_Identifier *name, + ...); + +static inline PyObject * +_PyObject_VectorcallMethodId( + _Py_Identifier *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ + if (!oname) { + return _Py_NULL; + } + return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); +} + +static inline PyObject * +_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name) +{ + size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallMethodId(name, &self, nargsf, _Py_NULL); +} + +static inline PyObject * +_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) +{ + PyObject *args[2] = {self, arg}; + size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + assert(arg != NULL); + return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL); +} + + +/* === Vectorcall protocol (PEP 590) ============================= */ +// Call callable using tp_call. Arguments are like PyObject_Vectorcall(), +// except that nargs is plainly the number of arguments without flags. +// +// Export for 'math' shared extension, used via _PyObject_VectorcallTstate() +// static inline function. +PyAPI_FUNC(PyObject*) _PyObject_MakeTpCall( + PyThreadState *tstate, + PyObject *callable, + PyObject *const *args, Py_ssize_t nargs, + PyObject *keywords); // Static inline variant of public PyVectorcall_Function(). static inline vectorcallfunc @@ -109,23 +185,19 @@ _PyObject_CallNoArgs(PyObject *func) { } -static inline PyObject * -_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) -{ - EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); - return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); -} - -PyObject *const * +extern PyObject *const * _PyStack_UnpackDict(PyThreadState *tstate, PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, PyObject **p_kwnames); -void -_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs, +extern void _PyStack_UnpackDict_Free( + PyObject *const *stack, + Py_ssize_t nargs, PyObject *kwnames); -void _PyStack_UnpackDict_FreeNoDecRef(PyObject *const *stack, PyObject *kwnames); +extern void _PyStack_UnpackDict_FreeNoDecRef( + PyObject *const *stack, + PyObject *kwnames); #ifdef __cplusplus } diff --git a/Include/internal/pycore_capsule.h b/Include/internal/pycore_capsule.h new file mode 100644 index 00000000..aa2c67f3 --- /dev/null +++ b/Include/internal/pycore_capsule.h @@ -0,0 +1,17 @@ +#ifndef Py_INTERNAL_PYCAPSULE_H +#define Py_INTERNAL_PYCAPSULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// Export for '_socket' shared extension +PyAPI_FUNC(int) _PyCapsule_SetTraverse(PyObject *op, traverseproc traverse_func, inquiry clear_func); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PYCAPSULE_H */ diff --git a/Include/internal/pycore_cell.h b/Include/internal/pycore_cell.h new file mode 100644 index 00000000..27f67d57 --- /dev/null +++ b/Include/internal/pycore_cell.h @@ -0,0 +1,48 @@ +#ifndef Py_INTERNAL_CELL_H +#define Py_INTERNAL_CELL_H + +#include "pycore_critical_section.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// Sets the cell contents to `value` and return previous contents. Steals a +// reference to `value`. +static inline PyObject * +PyCell_SwapTakeRef(PyCellObject *cell, PyObject *value) +{ + PyObject *old_value; + Py_BEGIN_CRITICAL_SECTION(cell); + old_value = cell->ob_ref; + cell->ob_ref = value; + Py_END_CRITICAL_SECTION(); + return old_value; +} + +static inline void +PyCell_SetTakeRef(PyCellObject *cell, PyObject *value) +{ + PyObject *old_value = PyCell_SwapTakeRef(cell, value); + Py_XDECREF(old_value); +} + +// Gets the cell contents. Returns a new reference. +static inline PyObject * +PyCell_GetRef(PyCellObject *cell) +{ + PyObject *res; + Py_BEGIN_CRITICAL_SECTION(cell); + res = Py_XNewRef(cell->ob_ref); + Py_END_CRITICAL_SECTION(); + return res; +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CELL_H */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index fc0f72ef..043f5957 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -8,28 +8,57 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "dynamic_annotations.h" // _Py_ANNOTATE_RWLOCK_CREATE + +#include "pycore_interp.h" // PyInterpreterState.eval_frame +#include "pycore_pystate.h" // _PyThreadState_GET() + /* Forward declarations */ struct pyruntimestate; struct _ceval_runtime_state; +// Export for '_lsprof' shared extension +PyAPI_FUNC(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); + +extern int _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); + +extern int _PyEval_SetOpcodeTrace(PyFrameObject *f, bool enable); + +// Helper to look up a builtin object +// Export for 'array' shared extension +PyAPI_FUNC(PyObject*) _PyEval_GetBuiltin(PyObject *); + +extern PyObject* _PyEval_GetBuiltinId(_Py_Identifier *); + +extern void _PyEval_SetSwitchInterval(unsigned long microseconds); +extern unsigned long _PyEval_GetSwitchInterval(void); + +// Export for '_queue' shared extension +PyAPI_FUNC(int) _PyEval_MakePendingCalls(PyThreadState *); + #ifndef Py_DEFAULT_RECURSION_LIMIT # define Py_DEFAULT_RECURSION_LIMIT 1000 #endif -#include "pycore_interp.h" // PyInterpreterState.eval_frame -#include "pycore_pystate.h" // _PyThreadState_GET() +extern void _Py_FinishPendingCalls(PyThreadState *tstate); +extern void _PyEval_InitState(PyInterpreterState *); +extern void _PyEval_SignalReceived(void); +// bitwise flags: +#define _Py_PENDING_MAINTHREADONLY 1 +#define _Py_PENDING_RAWFREE 2 -extern void _Py_FinishPendingCalls(PyThreadState *tstate); -extern void _PyEval_InitState(PyInterpreterState *, PyThread_type_lock); -extern void _PyEval_FiniState(struct _ceval_state *ceval); -PyAPI_FUNC(void) _PyEval_SignalReceived(PyInterpreterState *interp); -PyAPI_FUNC(int) _PyEval_AddPendingCall( +typedef int _Py_add_pending_call_result; +#define _Py_ADD_PENDING_SUCCESS 0 +#define _Py_ADD_PENDING_FULL -1 + +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(_Py_add_pending_call_result) _PyEval_AddPendingCall( PyInterpreterState *interp, - int (*func)(void *), + _Py_pending_call_func func, void *arg, - int mainthreadonly); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp); + int flags); + #ifdef HAVE_FORK extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate); #endif @@ -74,10 +103,12 @@ extern int _PyPerfTrampoline_SetCallbacks(_PyPerf_Callbacks *); extern void _PyPerfTrampoline_GetCallbacks(_PyPerf_Callbacks *); extern int _PyPerfTrampoline_Init(int activate); extern int _PyPerfTrampoline_Fini(void); +extern void _PyPerfTrampoline_FreeArenas(void); extern int _PyIsPerfTrampolineActive(void); extern PyStatus _PyPerfTrampoline_AfterFork_Child(void); #ifdef PY_HAVE_PERF_TRAMPOLINE extern _PyPerf_Callbacks _Py_perfmap_callbacks; +extern _PyPerf_Callbacks _Py_perfmap_jit_callbacks; #endif static inline PyObject* @@ -97,12 +128,56 @@ _PyEval_Vector(PyThreadState *tstate, PyObject *kwnames); extern int _PyEval_ThreadsInitialized(void); -extern PyStatus _PyEval_InitGIL(PyThreadState *tstate, int own_gil); +extern void _PyEval_InitGIL(PyThreadState *tstate, int own_gil); extern void _PyEval_FiniGIL(PyInterpreterState *interp); extern void _PyEval_AcquireLock(PyThreadState *tstate); -extern void _PyEval_ReleaseLock(PyInterpreterState *, PyThreadState *); -extern PyThreadState * _PyThreadState_SwapNoGIL(PyThreadState *); + +extern void _PyEval_ReleaseLock(PyInterpreterState *, PyThreadState *, + int final_release); + +#ifdef Py_GIL_DISABLED +// Returns 0 or 1 if the GIL for the given thread's interpreter is disabled or +// enabled, respectively. +// +// The enabled state of the GIL will not change while one or more threads are +// attached. +static inline int +_PyEval_IsGILEnabled(PyThreadState *tstate) +{ + struct _gil_runtime_state *gil = tstate->interp->ceval.gil; + return _Py_atomic_load_int_relaxed(&gil->enabled) != 0; +} + +// Enable or disable the GIL used by the interpreter that owns tstate, which +// must be the current thread. This may affect other interpreters, if the GIL +// is shared. All three functions will be no-ops (and return 0) if the +// interpreter's `enable_gil' config is not _PyConfig_GIL_DEFAULT. +// +// Every call to _PyEval_EnableGILTransient() must be paired with exactly one +// call to either _PyEval_EnableGILPermanent() or +// _PyEval_DisableGIL(). _PyEval_EnableGILPermanent() and _PyEval_DisableGIL() +// must only be called while the GIL is enabled from a call to +// _PyEval_EnableGILTransient(). +// +// _PyEval_EnableGILTransient() returns 1 if it enabled the GIL, or 0 if the +// GIL was already enabled, whether transiently or permanently. The caller will +// hold the GIL upon return. +// +// _PyEval_EnableGILPermanent() returns 1 if it permanently enabled the GIL +// (which must already be enabled), or 0 if it was already permanently +// enabled. Once _PyEval_EnableGILPermanent() has been called once, all +// subsequent calls to any of the three functions will be no-ops. +// +// _PyEval_DisableGIL() returns 1 if it disabled the GIL, or 0 if the GIL was +// kept enabled because of another request, whether transient or permanent. +// +// All three functions must be called by an attached thread (this implies that +// if the GIL is enabled, the current thread must hold it). +extern int _PyEval_EnableGILTransient(PyThreadState *tstate); +extern int _PyEval_EnableGILPermanent(PyThreadState *tstate); +extern int _PyEval_DisableGIL(PyThreadState *state); +#endif extern void _PyEval_DeactivateOpCache(void); @@ -113,15 +188,17 @@ extern void _PyEval_DeactivateOpCache(void); /* With USE_STACKCHECK macro defined, trigger stack checks in _Py_CheckRecursiveCall() on every 64th call to _Py_EnterRecursiveCall. */ static inline int _Py_MakeRecCheck(PyThreadState *tstate) { - return (tstate->c_recursion_remaining-- <= 0 + return (tstate->c_recursion_remaining-- < 0 || (tstate->c_recursion_remaining & 63) == 0); } #else static inline int _Py_MakeRecCheck(PyThreadState *tstate) { - return tstate->c_recursion_remaining-- <= 0; + return tstate->c_recursion_remaining-- < 0; } #endif +// Export for '_json' shared extension, used via _Py_EnterRecursiveCall() +// static inline function. PyAPI_FUNC(int) _Py_CheckRecursiveCall( PyThreadState *tstate, const char *where); @@ -134,6 +211,11 @@ static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate, return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where)); } +static inline void _Py_EnterRecursiveCallTstateUnchecked(PyThreadState *tstate) { + assert(tstate->c_recursion_remaining > 0); + tstate->c_recursion_remaining--; +} + static inline int _Py_EnterRecursiveCall(const char *where) { PyThreadState *tstate = _PyThreadState_GET(); return _Py_EnterRecursiveCallTstate(tstate, where); @@ -150,12 +232,70 @@ static inline void _Py_LeaveRecursiveCall(void) { extern struct _PyInterpreterFrame* _PyEval_GetFrame(void); -extern PyObject* _Py_MakeCoro(PyFunctionObject *func); +PyAPI_FUNC(PyObject *)_Py_MakeCoro(PyFunctionObject *func); -extern int _Py_HandlePending(PyThreadState *tstate); +/* Handle signals, pending calls, GIL drop request + and asynchronous exception */ +PyAPI_FUNC(int) _Py_HandlePending(PyThreadState *tstate); extern PyObject * _PyEval_GetFrameLocals(void); +typedef PyObject *(*conversion_func)(PyObject *); + +PyAPI_DATA(const binaryfunc) _PyEval_BinaryOps[]; +PyAPI_DATA(const conversion_func) _PyEval_ConversionFuncs[]; + +PyAPI_FUNC(int) _PyEval_CheckExceptStarTypeValid(PyThreadState *tstate, PyObject* right); +PyAPI_FUNC(int) _PyEval_CheckExceptTypeValid(PyThreadState *tstate, PyObject* right); +PyAPI_FUNC(int) _PyEval_ExceptionGroupMatch(PyObject* exc_value, PyObject *match_type, PyObject **match, PyObject **rest); +PyAPI_FUNC(void) _PyEval_FormatAwaitableError(PyThreadState *tstate, PyTypeObject *type, int oparg); +PyAPI_FUNC(void) _PyEval_FormatExcCheckArg(PyThreadState *tstate, PyObject *exc, const char *format_str, PyObject *obj); +PyAPI_FUNC(void) _PyEval_FormatExcUnbound(PyThreadState *tstate, PyCodeObject *co, int oparg); +PyAPI_FUNC(void) _PyEval_FormatKwargsError(PyThreadState *tstate, PyObject *func, PyObject *kwargs); +PyAPI_FUNC(PyObject *)_PyEval_MatchClass(PyThreadState *tstate, PyObject *subject, PyObject *type, Py_ssize_t nargs, PyObject *kwargs); +PyAPI_FUNC(PyObject *)_PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys); +PyAPI_FUNC(int) _PyEval_UnpackIterable(PyThreadState *tstate, PyObject *v, int argcnt, int argcntafter, PyObject **sp); +PyAPI_FUNC(void) _PyEval_MonitorRaise(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); +PyAPI_FUNC(void) _PyEval_FrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame); + + +/* Bits that can be set in PyThreadState.eval_breaker */ +#define _PY_GIL_DROP_REQUEST_BIT (1U << 0) +#define _PY_SIGNALS_PENDING_BIT (1U << 1) +#define _PY_CALLS_TO_DO_BIT (1U << 2) +#define _PY_ASYNC_EXCEPTION_BIT (1U << 3) +#define _PY_GC_SCHEDULED_BIT (1U << 4) +#define _PY_EVAL_PLEASE_STOP_BIT (1U << 5) +#define _PY_EVAL_EXPLICIT_MERGE_BIT (1U << 6) + +/* Reserve a few bits for future use */ +#define _PY_EVAL_EVENTS_BITS 8 +#define _PY_EVAL_EVENTS_MASK ((1 << _PY_EVAL_EVENTS_BITS)-1) + +static inline void +_Py_set_eval_breaker_bit(PyThreadState *tstate, uintptr_t bit) +{ + _Py_atomic_or_uintptr(&tstate->eval_breaker, bit); +} + +static inline void +_Py_unset_eval_breaker_bit(PyThreadState *tstate, uintptr_t bit) +{ + _Py_atomic_and_uintptr(&tstate->eval_breaker, ~bit); +} + +static inline int +_Py_eval_breaker_bit_is_set(PyThreadState *tstate, uintptr_t bit) +{ + uintptr_t b = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + return (b & bit) != 0; +} + +// Free-threaded builds use these functions to set or unset a bit on all +// threads in the given interpreter. +void _Py_set_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit); +void _Py_unset_eval_breaker_bit_all(PyInterpreterState *interp, uintptr_t bit); + #ifdef __cplusplus } diff --git a/Include/internal/pycore_ceval_state.h b/Include/internal/pycore_ceval_state.h index e56e43c6..009a1ea4 100644 --- a/Include/internal/pycore_ceval_state.h +++ b/Include/internal/pycore_ceval_state.h @@ -8,36 +8,64 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif - -#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_lock.h" // PyMutex #include "pycore_gil.h" // struct _gil_runtime_state +typedef int (*_Py_pending_call_func)(void *); + +struct _pending_call { + _Py_pending_call_func func; + void *arg; + int flags; +}; + +#define PENDINGCALLSARRAYSIZE 300 + +#define MAXPENDINGCALLS PENDINGCALLSARRAYSIZE +/* For interpreter-level pending calls, we want to avoid spending too + much time on pending calls in any one thread, so we apply a limit. */ +#if MAXPENDINGCALLS > 100 +# define MAXPENDINGCALLSLOOP 100 +#else +# define MAXPENDINGCALLSLOOP MAXPENDINGCALLS +#endif + +/* We keep the number small to preserve as much compatibility + as possible with earlier versions. */ +#define MAXPENDINGCALLS_MAIN 32 +/* For the main thread, we want to make sure all pending calls are + run at once, for the sake of prompt signal handling. This is + unlikely to cause any problems since there should be very few + pending calls for the main thread. */ +#define MAXPENDINGCALLSLOOP_MAIN 0 + struct _pending_calls { - int busy; - PyThread_type_lock lock; + PyThreadState *handling_thread; + PyMutex mutex; /* Request for running pending calls. */ - _Py_atomic_int calls_to_do; - /* Request for looking at the `async_exc` field of the current - thread state. - Guarded by the GIL. */ - int async_exc; -#define NPENDINGCALLS 32 - struct _pending_call { - int (*func)(void *); - void *arg; - } calls[NPENDINGCALLS]; + int32_t npending; + /* The maximum allowed number of pending calls. + If the queue fills up to this point then _PyEval_AddPendingCall() + will return _Py_ADD_PENDING_FULL. */ + int32_t max; + /* We don't want a flood of pending calls to interrupt any one thread + for too long, so we keep a limit on the number handled per pass. + A value of 0 means there is no limit (other than the maximum + size of the list of pending calls). */ + int32_t maxloop; + struct _pending_call calls[PENDINGCALLSARRAYSIZE]; int first; - int last; + int next; }; + typedef enum { PERF_STATUS_FAILED = -1, // Perf trampoline is in an invalid state PERF_STATUS_NO_INIT = 0, // Perf trampoline is not initialized PERF_STATUS_OK = 1, // Perf trampoline is ready to be executed } perf_status_t; - #ifdef PY_HAVE_PERF_TRAMPOLINE struct code_arena_st; @@ -47,35 +75,41 @@ struct trampoline_api_st { unsigned int code_size, PyCodeObject* code); int (*free_state)(void* state); void *state; + Py_ssize_t code_padding; }; #endif + struct _ceval_runtime_state { struct { #ifdef PY_HAVE_PERF_TRAMPOLINE perf_status_t status; + int perf_trampoline_type; Py_ssize_t extra_code_index; struct code_arena_st *code_arena; struct trampoline_api_st trampoline_api; FILE *map_file; + Py_ssize_t persist_after_fork; #else int _not_used; #endif } perf; - /* Request for checking signals. It is shared by all interpreters (see - bpo-40513). Any thread of any interpreter can receive a signal, but only - the main thread of the main interpreter can handle signals: see - _Py_ThreadCanHandleSignals(). */ - _Py_atomic_int signals_pending; /* Pending calls to be made only on the main thread. */ + // The signal machinery falls back on this + // so it must be especially stable and efficient. + // For example, we use a preallocated array + // for the list of pending calls. struct _pending_calls pending_mainthread; + PyMutex sys_trace_profile_mutex; }; + #ifdef PY_HAVE_PERF_TRAMPOLINE # define _PyEval_RUNTIME_PERF_INIT \ { \ .status = PERF_STATUS_NO_INIT, \ .extra_code_index = -1, \ + .persist_after_fork = 0, \ } #else # define _PyEval_RUNTIME_PERF_INIT {0} @@ -83,16 +117,13 @@ struct _ceval_runtime_state { struct _ceval_state { - /* This single variable consolidates all requests to break out of - the fast path in the eval loop. */ - _Py_atomic_int eval_breaker; - /* Request for dropping the GIL */ - _Py_atomic_int gil_drop_request; + /* This variable holds the global instrumentation version. When a thread is + running, this value is overlaid onto PyThreadState.eval_breaker so that + changes in the instrumentation version will trigger the eval breaker. */ + uintptr_t instrumentation_version; int recursion_limit; struct _gil_runtime_state *gil; int own_gil; - /* The GC is ready to be executed */ - _Py_atomic_int gc_scheduled; struct _pending_calls pending; }; diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 75a23f3f..1fb8cc47 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -4,6 +4,76 @@ extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_lock.h" // PyMutex +#include "pycore_backoff.h" // _Py_BackoffCounter + + +/* Each instruction in a code object is a fixed-width value, + * currently 2 bytes: 1-byte opcode + 1-byte oparg. The EXTENDED_ARG + * opcode allows for larger values but the current limit is 3 uses + * of EXTENDED_ARG (see Python/compile.c), for a maximum + * 32-bit value. This aligns with the note in Python/compile.c + * (compiler_addop_i_line) indicating that the max oparg value is + * 2**32 - 1, rather than INT_MAX. + */ + +typedef union { + uint16_t cache; + struct { + uint8_t code; + uint8_t arg; + } op; + _Py_BackoffCounter counter; // First cache entry of specializable op +} _Py_CODEUNIT; + +#define _PyCode_CODE(CO) _Py_RVALUE((_Py_CODEUNIT *)(CO)->co_code_adaptive) +#define _PyCode_NBYTES(CO) (Py_SIZE(CO) * (Py_ssize_t)sizeof(_Py_CODEUNIT)) + + +/* These macros only remain defined for compatibility. */ +#define _Py_OPCODE(word) ((word).op.code) +#define _Py_OPARG(word) ((word).op.arg) + +static inline _Py_CODEUNIT +_py_make_codeunit(uint8_t opcode, uint8_t oparg) +{ + // No designated initialisers because of C++ compat + _Py_CODEUNIT word; + word.op.code = opcode; + word.op.arg = oparg; + return word; +} + +static inline void +_py_set_opcode(_Py_CODEUNIT *word, uint8_t opcode) +{ + word->op.code = opcode; +} + +#define _Py_MAKE_CODEUNIT(opcode, oparg) _py_make_codeunit((opcode), (oparg)) +#define _Py_SET_OPCODE(word, opcode) _py_set_opcode(&(word), (opcode)) + + +// We hide some of the newer PyCodeObject fields behind macros. +// This helps with backporting certain changes to 3.12. +#define _PyCode_HAS_EXECUTORS(CODE) \ + (CODE->co_executors != NULL) +#define _PyCode_HAS_INSTRUMENTATION(CODE) \ + (CODE->_co_instrumentation_version > 0) + +struct _py_code_state { + PyMutex mutex; + // Interned constants from code objects. Used by the free-threaded build. + struct _Py_hashtable_t *constants; +}; + +extern PyStatus _PyCode_Init(PyInterpreterState *interp); +extern void _PyCode_Fini(PyInterpreterState *interp); + #define CODE_MAX_WATCHERS 8 /* PEP 659 @@ -18,55 +88,58 @@ extern "C" { #define CACHE_ENTRIES(cache) (sizeof(cache)/sizeof(_Py_CODEUNIT)) typedef struct { - uint16_t counter; - uint16_t index; + _Py_BackoffCounter counter; uint16_t module_keys_version; uint16_t builtin_keys_version; + uint16_t index; } _PyLoadGlobalCache; #define INLINE_CACHE_ENTRIES_LOAD_GLOBAL CACHE_ENTRIES(_PyLoadGlobalCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyBinaryOpCache; #define INLINE_CACHE_ENTRIES_BINARY_OP CACHE_ENTRIES(_PyBinaryOpCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyUnpackSequenceCache; #define INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE \ CACHE_ENTRIES(_PyUnpackSequenceCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyCompareOpCache; #define INLINE_CACHE_ENTRIES_COMPARE_OP CACHE_ENTRIES(_PyCompareOpCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyBinarySubscrCache; #define INLINE_CACHE_ENTRIES_BINARY_SUBSCR CACHE_ENTRIES(_PyBinarySubscrCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PySuperAttrCache; #define INLINE_CACHE_ENTRIES_LOAD_SUPER_ATTR CACHE_ENTRIES(_PySuperAttrCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; uint16_t version[2]; uint16_t index; } _PyAttrCache; typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; uint16_t type_version[2]; - uint16_t keys_version[2]; + union { + uint16_t keys_version[2]; + uint16_t dict_offset; + }; uint16_t descr[4]; } _PyLoadMethodCache; @@ -77,30 +150,43 @@ typedef struct { #define INLINE_CACHE_ENTRIES_STORE_ATTR CACHE_ENTRIES(_PyAttrCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; uint16_t func_version[2]; } _PyCallCache; #define INLINE_CACHE_ENTRIES_CALL CACHE_ENTRIES(_PyCallCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyStoreSubscrCache; #define INLINE_CACHE_ENTRIES_STORE_SUBSCR CACHE_ENTRIES(_PyStoreSubscrCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PyForIterCache; #define INLINE_CACHE_ENTRIES_FOR_ITER CACHE_ENTRIES(_PyForIterCache) typedef struct { - uint16_t counter; + _Py_BackoffCounter counter; } _PySendCache; #define INLINE_CACHE_ENTRIES_SEND CACHE_ENTRIES(_PySendCache) +typedef struct { + _Py_BackoffCounter counter; + uint16_t version[2]; +} _PyToBoolCache; + +#define INLINE_CACHE_ENTRIES_TO_BOOL CACHE_ENTRIES(_PyToBoolCache) + +typedef struct { + _Py_BackoffCounter counter; +} _PyContainsOpCache; + +#define INLINE_CACHE_ENTRIES_CONTAINS_OP CACHE_ENTRIES(_PyContainsOpCache) + // Borrowed references to common callables: struct callable_cache { PyObject *isinstance; @@ -196,8 +282,8 @@ struct _PyCodeConstructor { // back to a regular function signature. Regardless, this approach // wouldn't be appropriate if this weren't a strictly internal API. // (See the comments in https://github.com/python/cpython/pull/26258.) -PyAPI_FUNC(int) _PyCode_Validate(struct _PyCodeConstructor *); -PyAPI_FUNC(PyCodeObject *) _PyCode_New(struct _PyCodeConstructor *); +extern int _PyCode_Validate(struct _PyCodeConstructor *); +extern PyCodeObject* _PyCode_New(struct _PyCodeConstructor *); /* Private API */ @@ -222,6 +308,16 @@ extern void _PyLineTable_InitAddressRange( extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range); extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); +/** API for executors */ +extern void _PyCode_Clear_Executors(PyCodeObject *code); + +#ifdef Py_GIL_DISABLED +// gh-115999 tracks progress on addressing this. +#define ENABLE_SPECIALIZATION 0 +#else +#define ENABLE_SPECIALIZATION 1 +#endif + /* Specialization functions */ extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *cls, @@ -237,7 +333,7 @@ extern void _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, extern void _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *instr); extern void _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, - int nargs, PyObject *kwnames); + int nargs); extern void _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, int oparg, PyObject **locals); extern void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, @@ -246,27 +342,46 @@ extern void _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr, int oparg); extern void _Py_Specialize_ForIter(PyObject *iter, _Py_CODEUNIT *instr, int oparg); extern void _Py_Specialize_Send(PyObject *receiver, _Py_CODEUNIT *instr); - -/* Finalizer function for static codeobjects used in deepfreeze.py */ -extern void _PyStaticCode_Fini(PyCodeObject *co); -/* Function to intern strings of codeobjects and quicken the bytecode */ -extern int _PyStaticCode_Init(PyCodeObject *co); +extern void _Py_Specialize_ToBool(PyObject *value, _Py_CODEUNIT *instr); +extern void _Py_Specialize_ContainsOp(PyObject *value, _Py_CODEUNIT *instr); #ifdef Py_STATS +#include "pycore_bitutils.h" // _Py_bit_length -#define STAT_INC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name++; } while (0) -#define STAT_DEC(opname, name) do { if (_py_stats) _py_stats->opcode_stats[opname].specialization.name--; } while (0) -#define OPCODE_EXE_INC(opname) do { if (_py_stats) _py_stats->opcode_stats[opname].execution_count++; } while (0) -#define CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.name++; } while (0) -#define OBJECT_STAT_INC(name) do { if (_py_stats) _py_stats->object_stats.name++; } while (0) +#define STAT_INC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name++; } while (0) +#define STAT_DEC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name--; } while (0) +#define OPCODE_EXE_INC(opname) do { if (_Py_stats) _Py_stats->opcode_stats[opname].execution_count++; } while (0) +#define CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.name++; } while (0) +#define OBJECT_STAT_INC(name) do { if (_Py_stats) _Py_stats->object_stats.name++; } while (0) #define OBJECT_STAT_INC_COND(name, cond) \ - do { if (_py_stats && cond) _py_stats->object_stats.name++; } while (0) -#define EVAL_CALL_STAT_INC(name) do { if (_py_stats) _py_stats->call_stats.eval_calls[name]++; } while (0) + do { if (_Py_stats && cond) _Py_stats->object_stats.name++; } while (0) +#define EVAL_CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.eval_calls[name]++; } while (0) #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ - do { if (_py_stats && PyFunction_Check(callable)) _py_stats->call_stats.eval_calls[name]++; } while (0) - -// Used by the _opcode extension which is built as a shared library + do { if (_Py_stats && PyFunction_Check(callable)) _Py_stats->call_stats.eval_calls[name]++; } while (0) +#define GC_STAT_ADD(gen, name, n) do { if (_Py_stats) _Py_stats->gc_stats[(gen)].name += (n); } while (0) +#define OPT_STAT_INC(name) do { if (_Py_stats) _Py_stats->optimization_stats.name++; } while (0) +#define UOP_STAT_INC(opname, name) do { if (_Py_stats) { assert(opname < 512); _Py_stats->optimization_stats.opcode[opname].name++; } } while (0) +#define UOP_PAIR_INC(uopcode, lastuop) \ + do { \ + if (lastuop && _Py_stats) { \ + _Py_stats->optimization_stats.opcode[lastuop].pair_count[uopcode]++; \ + } \ + lastuop = uopcode; \ + } while (0) +#define OPT_UNSUPPORTED_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.unsupported_opcode[opname]++; } while (0) +#define OPT_ERROR_IN_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.error_in_opcode[opname]++; } while (0) +#define OPT_HIST(length, name) \ + do { \ + if (_Py_stats) { \ + int bucket = _Py_bit_length(length >= 1 ? length - 1 : 0); \ + bucket = (bucket >= _Py_UOP_HIST_SIZE) ? _Py_UOP_HIST_SIZE - 1 : bucket; \ + _Py_stats->optimization_stats.name[bucket]++; \ + } \ + } while (0) +#define RARE_EVENT_STAT_INC(name) do { if (_Py_stats) _Py_stats->rare_event_stats.name++; } while (0) + +// Export for '_opcode' shared extension PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #else @@ -278,6 +393,14 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define OBJECT_STAT_INC_COND(name, cond) ((void)0) #define EVAL_CALL_STAT_INC(name) ((void)0) #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) ((void)0) +#define GC_STAT_ADD(gen, name, n) ((void)0) +#define OPT_STAT_INC(name) ((void)0) +#define UOP_STAT_INC(opname, name) ((void)0) +#define UOP_PAIR_INC(uopcode, lastuop) ((void)0) +#define OPT_UNSUPPORTED_OPCODE(opname) ((void)0) +#define OPT_ERROR_IN_OPCODE(opname) ((void)0) +#define OPT_HIST(length, name) ((void)0) +#define RARE_EVENT_STAT_INC(name) ((void)0) #endif // !Py_STATS // Utility functions for reading/writing 32/64-bit values in the inline caches. @@ -359,45 +482,43 @@ write_varint(uint8_t *ptr, unsigned int val) val >>= 6; written++; } - *ptr = val; + *ptr = (uint8_t)val; return written; } static inline int write_signed_varint(uint8_t *ptr, int val) { + unsigned int uval; if (val < 0) { - val = ((-val)<<1) | 1; + // (unsigned int)(-val) has an undefined behavior for INT_MIN + uval = ((0 - (unsigned int)val) << 1) | 1; } else { - val = val << 1; + uval = (unsigned int)val << 1; } - return write_varint(ptr, val); + return write_varint(ptr, uval); } static inline int write_location_entry_start(uint8_t *ptr, int code, int length) { assert((code & 15) == code); - *ptr = 128 | (code << 3) | (length - 1); + *ptr = 128 | (uint8_t)(code << 3) | (uint8_t)(length - 1); return 1; } /** Counters * The first 16-bit value in each inline cache is a counter. - * When counting misses, the counter is treated as a simple unsigned value. * * When counting executions until the next specialization attempt, * exponential backoff is used to reduce the number of specialization failures. - * The high 12 bits store the counter, the low 4 bits store the backoff exponent. - * On a specialization failure, the backoff exponent is incremented and the - * counter set to (2**backoff - 1). - * Backoff == 6 -> starting counter == 63, backoff == 10 -> starting counter == 1023. + * See pycore_backoff.h for more details. + * On a specialization failure, the backoff counter is restarted. */ -/* With a 16-bit counter, we have 12 bits for the counter value, and 4 bits for the backoff */ -#define ADAPTIVE_BACKOFF_BITS 4 +#include "pycore_backoff.h" // A value of 1 means that we attempt to specialize the *second* time each // instruction is executed. Executing twice is a much better indicator of @@ -415,54 +536,34 @@ write_location_entry_start(uint8_t *ptr, int code, int length) #define ADAPTIVE_COOLDOWN_VALUE 52 #define ADAPTIVE_COOLDOWN_BACKOFF 0 -#define MAX_BACKOFF_VALUE (16 - ADAPTIVE_BACKOFF_BITS) - +// Can't assert this in pycore_backoff.h because of header order dependencies +#if COLD_EXIT_INITIAL_VALUE <= ADAPTIVE_COOLDOWN_VALUE +# error "Cold exit value should be larger than adaptive cooldown value" +#endif -static inline uint16_t -adaptive_counter_bits(int value, int backoff) { - return (value << ADAPTIVE_BACKOFF_BITS) | - (backoff & ((1< MAX_BACKOFF_VALUE) { - backoff = MAX_BACKOFF_VALUE; - } - unsigned int value = (1 << backoff) - 1; - return adaptive_counter_bits(value, backoff); +static inline _Py_BackoffCounter +adaptive_counter_backoff(_Py_BackoffCounter counter) { + return restart_backoff_counter(counter); } -/* Line array cache for tracing */ - -typedef struct _PyShimCodeDef { - const uint8_t *code; - int codelen; - int stacksize; - const char *cname; -} _PyShimCodeDef; - -extern PyCodeObject * -_Py_MakeShimCode(const _PyShimCodeDef *code); - -extern uint32_t _Py_next_func_version; - - /* Comparison bit masks. */ /* Note this evaluates its arguments twice each */ @@ -487,6 +588,7 @@ extern int _Py_Instrument(PyCodeObject *co, PyInterpreterState *interp); extern int _Py_GetBaseOpcode(PyCodeObject *code, int offset); +extern int _PyInstruction_GetLength(PyCodeObject *code, int offset); #ifdef __cplusplus } diff --git a/Include/internal/pycore_codecs.h b/Include/internal/pycore_codecs.h new file mode 100644 index 00000000..5e2d5c5c --- /dev/null +++ b/Include/internal/pycore_codecs.h @@ -0,0 +1,86 @@ +#ifndef Py_INTERNAL_CODECS_H +#define Py_INTERNAL_CODECS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_lock.h" // PyMutex + +/* Initialize codecs-related state for the given interpreter, including + registering the first codec search function. Must be called before any other + PyCodec-related functions, and while only one thread is active. */ +extern PyStatus _PyCodec_InitRegistry(PyInterpreterState *interp); + +/* Finalize codecs-related state for the given interpreter. No PyCodec-related + functions other than PyCodec_Unregister() may be called after this. */ +extern void _PyCodec_Fini(PyInterpreterState *interp); + +extern PyObject* _PyCodec_Lookup(const char *encoding); + +/* Text codec specific encoding and decoding API. + + Checks the encoding against a list of codecs which do not + implement a str<->bytes encoding before attempting the + operation. + + Please note that these APIs are internal and should not + be used in Python C extensions. + + XXX (ncoghlan): should we make these, or something like them, public + in Python 3.5+? + + */ +extern PyObject* _PyCodec_LookupTextEncoding( + const char *encoding, + const char *alternate_command); + +extern PyObject* _PyCodec_EncodeText( + PyObject *object, + const char *encoding, + const char *errors); + +extern PyObject* _PyCodec_DecodeText( + PyObject *object, + const char *encoding, + const char *errors); + +/* These two aren't actually text encoding specific, but _io.TextIOWrapper + * is the only current API consumer. + */ +extern PyObject* _PyCodecInfo_GetIncrementalDecoder( + PyObject *codec_info, + const char *errors); + +extern PyObject* _PyCodecInfo_GetIncrementalEncoder( + PyObject *codec_info, + const char *errors); + +// Per-interpreter state used by codecs.c. +struct codecs_state { + // A list of callable objects used to search for codecs. + PyObject *search_path; + + // A dict mapping codec names to codecs returned from a callable in + // search_path. + PyObject *search_cache; + + // A dict mapping error handling strategies to functions to implement them. + PyObject *error_registry; + +#ifdef Py_GIL_DISABLED + // Used to safely delete a specific item from search_path. + PyMutex search_path_mutex; +#endif + + // Whether or not the rest of the state is initialized. + int initialized; +}; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CODECS_H */ diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 80a637e5..3c21f83a 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -8,10 +8,13 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_symtable.h" // _Py_SourceLocation +#include "pycore_instruction_sequence.h" + struct _arena; // Type defined in pycore_pyarena.h struct _mod; // Type defined in pycore_ast.h -// Export the symbol for test_peg_generator (built as a library) +// Export for 'test_peg_generator' shared extension PyAPI_FUNC(PyCodeObject*) _PyAST_Compile( struct _mod *mod, PyObject *filename, @@ -19,43 +22,22 @@ PyAPI_FUNC(PyCodeObject*) _PyAST_Compile( int optimize, struct _arena *arena); -static const _PyCompilerSrcLocation NO_LOCATION = {-1, -1, -1, -1}; - -typedef struct { - int optimize; - int ff_features; +/* AST optimizations */ +extern int _PyCompile_AstOptimize( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + struct _arena *arena); - int recursion_depth; /* current recursion depth */ - int recursion_limit; /* recursion limit */ -} _PyASTOptimizeState; +struct _Py_SourceLocation; extern int _PyAST_Optimize( struct _mod *, struct _arena *arena, - _PyASTOptimizeState *state); - -typedef struct { - int h_offset; - int h_startdepth; - int h_preserve_lasti; -} _PyCompile_ExceptHandlerInfo; - -typedef struct { - int i_opcode; - int i_oparg; - _PyCompilerSrcLocation i_loc; - _PyCompile_ExceptHandlerInfo i_except_handler_info; -} _PyCompile_Instruction; - -typedef struct { - _PyCompile_Instruction *s_instrs; - int s_allocated; - int s_used; + int optimize, + int ff_features); - int *s_labelmap; /* label id --> instr offset */ - int s_labelmap_size; - int s_next_free_label; /* next free label id */ -} _PyCompile_InstructionSequence; typedef struct { PyObject *u_name; @@ -92,10 +74,26 @@ int _PyCompile_EnsureArrayLargeEnough( int _PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj); -int _PyCompile_InstrSize(int opcode, int oparg); + +// Export for '_opcode' extension module +PyAPI_FUNC(int) _PyCompile_OpcodeIsValid(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasArg(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasConst(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasName(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasJump(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasFree(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasLocal(int opcode); +PyAPI_FUNC(int) _PyCompile_OpcodeHasExc(int opcode); + +PyAPI_FUNC(PyObject*) _PyCompile_GetUnaryIntrinsicName(int index); +PyAPI_FUNC(PyObject*) _PyCompile_GetBinaryIntrinsicName(int index); /* Access compiler internals for unit testing */ +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(PyObject*) _PyCompile_CleanDoc(PyObject *doc); + +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(PyObject*) _PyCompile_CodeGen( PyObject *ast, PyObject *filename, @@ -103,11 +101,13 @@ PyAPI_FUNC(PyObject*) _PyCompile_CodeGen( int optimize, int compile_mode); +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(PyObject*) _PyCompile_OptimizeCfg( PyObject *instructions, PyObject *consts, int nlocals); +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(PyCodeObject*) _PyCompile_Assemble(_PyCompile_CodeUnitMetadata *umd, PyObject *filename, PyObject *instructions); diff --git a/Include/internal/pycore_complexobject.h b/Include/internal/pycore_complexobject.h new file mode 100644 index 00000000..54713536 --- /dev/null +++ b/Include/internal/pycore_complexobject.h @@ -0,0 +1,25 @@ +#ifndef Py_INTERNAL_COMPLEXOBJECT_H +#define Py_INTERNAL_COMPLEXOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_unicodeobject.h" // _PyUnicodeWriter + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +extern int _PyComplex_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_COMPLEXOBJECT_H diff --git a/Include/internal/pycore_condvar.h b/Include/internal/pycore_condvar.h index 981c962b..ee953348 100644 --- a/Include/internal/pycore_condvar.h +++ b/Include/internal/pycore_condvar.h @@ -5,14 +5,8 @@ # error "this header requires Py_BUILD_CORE define" #endif -#ifndef _POSIX_THREADS -/* This means pthreads are not implemented in libc headers, hence the macro - not present in unistd.h. But they still can be implemented as an external - library (e.g. gnu pth in pthread emulation) */ -# ifdef HAVE_PTHREAD_H -# include /* _POSIX_THREADS */ -# endif -#endif +#include "pycore_pythread.h" // _POSIX_THREADS + #ifdef _POSIX_THREADS /* @@ -21,7 +15,7 @@ #define Py_HAVE_CONDVAR #ifdef HAVE_PTHREAD_H -# include +# include // pthread_mutex_t #endif #define PyMUTEX_T pthread_mutex_t @@ -38,17 +32,17 @@ /* include windows if it hasn't been done before */ #define WIN32_LEAN_AND_MEAN -#include +#include // CRITICAL_SECTION /* options */ -/* non-emulated condition variables are provided for those that want - * to target Windows Vista. Modify this macro to enable them. +/* emulated condition variables are provided for those that want + * to target Windows XP or earlier. Modify this macro to enable them. */ #ifndef _PY_EMULATED_WIN_CV -#define _PY_EMULATED_WIN_CV 1 /* use emulated condition variables */ +#define _PY_EMULATED_WIN_CV 0 /* use non-emulated condition variables */ #endif -/* fall back to emulation if not targeting Vista */ +/* fall back to emulation if targeting earlier than Vista */ #if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA #undef _PY_EMULATED_WIN_CV #define _PY_EMULATED_WIN_CV 1 @@ -83,7 +77,7 @@ typedef struct _PyCOND_T #else /* !_PY_EMULATED_WIN_CV */ -/* Use native Win7 primitives if build target is Win7 or higher */ +/* Use native Windows primitives if build target is Vista or higher */ /* SRWLOCK is faster and better than CriticalSection */ typedef SRWLOCK PyMUTEX_T; diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index 52dfe3ef..10c1f1e5 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -5,7 +5,8 @@ # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_hamt.h" /* PyHamtObject */ +#include "pycore_freelist.h" // _PyFreeListState +#include "pycore_hamt.h" // PyHamtObject extern PyTypeObject _PyContextTokenMissing_Type; @@ -13,7 +14,6 @@ extern PyTypeObject _PyContextTokenMissing_Type; /* runtime lifecycle */ PyStatus _PyContext_Init(PyInterpreterState *); -void _PyContext_Fini(PyInterpreterState *); /* other API */ @@ -22,23 +22,6 @@ typedef struct { PyObject_HEAD } _PyContextTokenMissing; -#ifndef WITH_FREELISTS -// without freelists -# define PyContext_MAXFREELIST 0 -#endif - -#ifndef PyContext_MAXFREELIST -# define PyContext_MAXFREELIST 255 -#endif - -struct _Py_context_state { -#if PyContext_MAXFREELIST > 0 - // List of free PyContext objects - PyContext *freelist; - int numfree; -#endif -}; - struct _pycontextobject { PyObject_HEAD PyContext *ctx_prev; @@ -52,9 +35,11 @@ struct _pycontextvarobject { PyObject_HEAD PyObject *var_name; PyObject *var_default; +#ifndef Py_GIL_DISABLED PyObject *var_cached; uint64_t var_cached_tsid; uint64_t var_cached_tsver; +#endif Py_hash_t var_hash; }; @@ -68,4 +53,9 @@ struct _pycontexttokenobject { }; +// _testinternalcapi.hamt() used by tests. +// Export for '_testcapi' shared extension +PyAPI_FUNC(PyObject*) _PyContext_NewHamtForTests(void); + + #endif /* !Py_INTERNAL_CONTEXT_H */ diff --git a/Include/internal/pycore_critical_section.h b/Include/internal/pycore_critical_section.h new file mode 100644 index 00000000..78cd0d54 --- /dev/null +++ b/Include/internal/pycore_critical_section.h @@ -0,0 +1,233 @@ +#ifndef Py_INTERNAL_CRITICAL_SECTION_H +#define Py_INTERNAL_CRITICAL_SECTION_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_lock.h" // PyMutex +#include "pycore_pystate.h" // _PyThreadState_GET() +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Tagged pointers to critical sections use the two least significant bits to +// mark if the pointed-to critical section is inactive and whether it is a +// PyCriticalSection2 object. +#define _Py_CRITICAL_SECTION_INACTIVE 0x1 +#define _Py_CRITICAL_SECTION_TWO_MUTEXES 0x2 +#define _Py_CRITICAL_SECTION_MASK 0x3 + +#ifdef Py_GIL_DISABLED +# define Py_BEGIN_CRITICAL_SECTION_MUT(mutex) \ + { \ + PyCriticalSection _py_cs; \ + _PyCriticalSection_BeginMutex(&_py_cs, mutex) + +# define Py_BEGIN_CRITICAL_SECTION2_MUT(m1, m2) \ + { \ + PyCriticalSection2 _py_cs2; \ + _PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2) + +// Specialized version of critical section locking to safely use +// PySequence_Fast APIs without the GIL. For performance, the argument *to* +// PySequence_Fast() is provided to the macro, not the *result* of +// PySequence_Fast(), which would require an extra test to determine if the +// lock must be acquired. +# define Py_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST(original) \ + { \ + PyObject *_orig_seq = _PyObject_CAST(original); \ + const bool _should_lock_cs = PyList_CheckExact(_orig_seq); \ + PyCriticalSection _cs; \ + if (_should_lock_cs) { \ + _PyCriticalSection_Begin(&_cs, _orig_seq); \ + } + +# define Py_END_CRITICAL_SECTION_SEQUENCE_FAST() \ + if (_should_lock_cs) { \ + PyCriticalSection_End(&_cs); \ + } \ + } + +// Asserts that the mutex is locked. The mutex must be held by the +// top-most critical section otherwise there's the possibility +// that the mutex would be swalled out in some code paths. +#define _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(mutex) \ + _PyCriticalSection_AssertHeld(mutex) + +// Asserts that the mutex for the given object is locked. The mutex must +// be held by the top-most critical section otherwise there's the +// possibility that the mutex would be swalled out in some code paths. +#ifdef Py_DEBUG + +# define _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op) \ + if (Py_REFCNT(op) != 1) { \ + _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&_PyObject_CAST(op)->ob_mutex); \ + } + +#else /* Py_DEBUG */ + +# define _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op) + +#endif /* Py_DEBUG */ + +#else /* !Py_GIL_DISABLED */ +// The critical section APIs are no-ops with the GIL. +# define Py_BEGIN_CRITICAL_SECTION_MUT(mut) { +# define Py_BEGIN_CRITICAL_SECTION2_MUT(m1, m2) { +# define Py_BEGIN_CRITICAL_SECTION_SEQUENCE_FAST(original) { +# define Py_END_CRITICAL_SECTION_SEQUENCE_FAST() } +# define _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(mutex) +# define _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op) +#endif /* !Py_GIL_DISABLED */ + +// Resumes the top-most critical section. +PyAPI_FUNC(void) +_PyCriticalSection_Resume(PyThreadState *tstate); + +// (private) slow path for locking the mutex +PyAPI_FUNC(void) +_PyCriticalSection_BeginSlow(PyCriticalSection *c, PyMutex *m); + +PyAPI_FUNC(void) +_PyCriticalSection2_BeginSlow(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2, + int is_m1_locked); + +PyAPI_FUNC(void) +_PyCriticalSection_SuspendAll(PyThreadState *tstate); + +#ifdef Py_GIL_DISABLED + +static inline int +_PyCriticalSection_IsActive(uintptr_t tag) +{ + return tag != 0 && (tag & _Py_CRITICAL_SECTION_INACTIVE) == 0; +} + +static inline void +_PyCriticalSection_BeginMutex(PyCriticalSection *c, PyMutex *m) +{ + if (PyMutex_LockFast(&m->_bits)) { + PyThreadState *tstate = _PyThreadState_GET(); + c->_cs_mutex = m; + c->_cs_prev = tstate->critical_section; + tstate->critical_section = (uintptr_t)c; + } + else { + _PyCriticalSection_BeginSlow(c, m); + } +} + +static inline void +_PyCriticalSection_Begin(PyCriticalSection *c, PyObject *op) +{ + _PyCriticalSection_BeginMutex(c, &op->ob_mutex); +} +#define PyCriticalSection_Begin _PyCriticalSection_Begin + +// Removes the top-most critical section from the thread's stack of critical +// sections. If the new top-most critical section is inactive, then it is +// resumed. +static inline void +_PyCriticalSection_Pop(PyCriticalSection *c) +{ + PyThreadState *tstate = _PyThreadState_GET(); + uintptr_t prev = c->_cs_prev; + tstate->critical_section = prev; + + if ((prev & _Py_CRITICAL_SECTION_INACTIVE) != 0) { + _PyCriticalSection_Resume(tstate); + } +} + +static inline void +_PyCriticalSection_End(PyCriticalSection *c) +{ + PyMutex_Unlock(c->_cs_mutex); + _PyCriticalSection_Pop(c); +} +#define PyCriticalSection_End _PyCriticalSection_End + +static inline void +_PyCriticalSection2_BeginMutex(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2) +{ + if (m1 == m2) { + // If the two mutex arguments are the same, treat this as a critical + // section with a single mutex. + c->_cs_mutex2 = NULL; + _PyCriticalSection_BeginMutex(&c->_cs_base, m1); + return; + } + + if ((uintptr_t)m2 < (uintptr_t)m1) { + // Sort the mutexes so that the lower address is locked first. + // The exact order does not matter, but we need to acquire the mutexes + // in a consistent order to avoid lock ordering deadlocks. + PyMutex *tmp = m1; + m1 = m2; + m2 = tmp; + } + + if (PyMutex_LockFast(&m1->_bits)) { + if (PyMutex_LockFast(&m2->_bits)) { + PyThreadState *tstate = _PyThreadState_GET(); + c->_cs_base._cs_mutex = m1; + c->_cs_mutex2 = m2; + c->_cs_base._cs_prev = tstate->critical_section; + + uintptr_t p = (uintptr_t)c | _Py_CRITICAL_SECTION_TWO_MUTEXES; + tstate->critical_section = p; + } + else { + _PyCriticalSection2_BeginSlow(c, m1, m2, 1); + } + } + else { + _PyCriticalSection2_BeginSlow(c, m1, m2, 0); + } +} + +static inline void +_PyCriticalSection2_Begin(PyCriticalSection2 *c, PyObject *a, PyObject *b) +{ + _PyCriticalSection2_BeginMutex(c, &a->ob_mutex, &b->ob_mutex); +} +#define PyCriticalSection2_Begin _PyCriticalSection2_Begin + +static inline void +_PyCriticalSection2_End(PyCriticalSection2 *c) +{ + if (c->_cs_mutex2) { + PyMutex_Unlock(c->_cs_mutex2); + } + PyMutex_Unlock(c->_cs_base._cs_mutex); + _PyCriticalSection_Pop(&c->_cs_base); +} +#define PyCriticalSection2_End _PyCriticalSection2_End + +static inline void +_PyCriticalSection_AssertHeld(PyMutex *mutex) +{ +#ifdef Py_DEBUG + PyThreadState *tstate = _PyThreadState_GET(); + uintptr_t prev = tstate->critical_section; + if (prev & _Py_CRITICAL_SECTION_TWO_MUTEXES) { + PyCriticalSection2 *cs = (PyCriticalSection2 *)(prev & ~_Py_CRITICAL_SECTION_MASK); + assert(cs != NULL && (cs->_cs_base._cs_mutex == mutex || cs->_cs_mutex2 == mutex)); + } + else { + PyCriticalSection *cs = (PyCriticalSection *)(tstate->critical_section & ~_Py_CRITICAL_SECTION_MASK); + assert(cs != NULL && cs->_cs_mutex == mutex); + } + +#endif +} + +#endif /* Py_GIL_DISABLED */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CRITICAL_SECTION_H */ diff --git a/Include/internal/pycore_crossinterp.h b/Include/internal/pycore_crossinterp.h new file mode 100644 index 00000000..2dd165ea --- /dev/null +++ b/Include/internal/pycore_crossinterp.h @@ -0,0 +1,340 @@ +#ifndef Py_INTERNAL_CROSSINTERP_H +#define Py_INTERNAL_CROSSINTERP_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_lock.h" // PyMutex +#include "pycore_pyerrors.h" + +/**************/ +/* exceptions */ +/**************/ + +PyAPI_DATA(PyObject *) PyExc_InterpreterError; +PyAPI_DATA(PyObject *) PyExc_InterpreterNotFoundError; + + +/***************************/ +/* cross-interpreter calls */ +/***************************/ + +typedef int (*_Py_simple_func)(void *); +extern int _Py_CallInInterpreter( + PyInterpreterState *interp, + _Py_simple_func func, + void *arg); +extern int _Py_CallInInterpreterAndRawFree( + PyInterpreterState *interp, + _Py_simple_func func, + void *arg); + + +/**************************/ +/* cross-interpreter data */ +/**************************/ + +typedef struct _xid _PyCrossInterpreterData; +typedef PyObject *(*xid_newobjectfunc)(_PyCrossInterpreterData *); +typedef void (*xid_freefunc)(void *); + +// _PyCrossInterpreterData is similar to Py_buffer as an effectively +// opaque struct that holds data outside the object machinery. This +// is necessary to pass safely between interpreters in the same process. +struct _xid { + // data is the cross-interpreter-safe derivation of a Python object + // (see _PyObject_GetCrossInterpreterData). It will be NULL if the + // new_object func (below) encodes the data. + void *data; + // obj is the Python object from which the data was derived. This + // is non-NULL only if the data remains bound to the object in some + // way, such that the object must be "released" (via a decref) when + // the data is released. In that case the code that sets the field, + // likely a registered "crossinterpdatafunc", is responsible for + // ensuring it owns the reference (i.e. incref). + PyObject *obj; + // interp is the ID of the owning interpreter of the original + // object. It corresponds to the active interpreter when + // _PyObject_GetCrossInterpreterData() was called. This should only + // be set by the cross-interpreter machinery. + // + // We use the ID rather than the PyInterpreterState to avoid issues + // with deleted interpreters. Note that IDs are never re-used, so + // each one will always correspond to a specific interpreter + // (whether still alive or not). + int64_t interpid; + // new_object is a function that returns a new object in the current + // interpreter given the data. The resulting object (a new + // reference) will be equivalent to the original object. This field + // is required. + xid_newobjectfunc new_object; + // free is called when the data is released. If it is NULL then + // nothing will be done to free the data. For some types this is + // okay (e.g. bytes) and for those types this field should be set + // to NULL. However, for most the data was allocated just for + // cross-interpreter use, so it must be freed when + // _PyCrossInterpreterData_Release is called or the memory will + // leak. In that case, at the very least this field should be set + // to PyMem_RawFree (the default if not explicitly set to NULL). + // The call will happen with the original interpreter activated. + xid_freefunc free; +}; + +PyAPI_FUNC(_PyCrossInterpreterData *) _PyCrossInterpreterData_New(void); +PyAPI_FUNC(void) _PyCrossInterpreterData_Free(_PyCrossInterpreterData *data); + +#define _PyCrossInterpreterData_DATA(DATA) ((DATA)->data) +#define _PyCrossInterpreterData_OBJ(DATA) ((DATA)->obj) +#define _PyCrossInterpreterData_INTERPID(DATA) ((DATA)->interpid) +// Users should not need getters for "new_object" or "free". + + +/* defining cross-interpreter data */ + +PyAPI_FUNC(void) _PyCrossInterpreterData_Init( + _PyCrossInterpreterData *data, + PyInterpreterState *interp, void *shared, PyObject *obj, + xid_newobjectfunc new_object); +PyAPI_FUNC(int) _PyCrossInterpreterData_InitWithSize( + _PyCrossInterpreterData *, + PyInterpreterState *interp, const size_t, PyObject *, + xid_newobjectfunc); +PyAPI_FUNC(void) _PyCrossInterpreterData_Clear( + PyInterpreterState *, _PyCrossInterpreterData *); + +// Normally the Init* functions are sufficient. The only time +// additional initialization might be needed is to set the "free" func, +// though that should be infrequent. +#define _PyCrossInterpreterData_SET_FREE(DATA, FUNC) \ + do { \ + (DATA)->free = (FUNC); \ + } while (0) +// Additionally, some shareable types are essentially light wrappers +// around other shareable types. The crossinterpdatafunc of the wrapper +// can often be implemented by calling the wrapped object's +// crossinterpdatafunc and then changing the "new_object" function. +// We have _PyCrossInterpreterData_SET_NEW_OBJECT() here for that, +// but might be better to have a function like +// _PyCrossInterpreterData_AdaptToWrapper() instead. +#define _PyCrossInterpreterData_SET_NEW_OBJECT(DATA, FUNC) \ + do { \ + (DATA)->new_object = (FUNC); \ + } while (0) + + +/* using cross-interpreter data */ + +PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *); +PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *); +PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *); +PyAPI_FUNC(int) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *); +PyAPI_FUNC(int) _PyCrossInterpreterData_ReleaseAndRawFree(_PyCrossInterpreterData *); + + +/* cross-interpreter data registry */ + +// For now we use a global registry of shareable classes. An +// alternative would be to add a tp_* slot for a class's +// crossinterpdatafunc. It would be simpler and more efficient. + +typedef int (*crossinterpdatafunc)(PyThreadState *tstate, PyObject *, + _PyCrossInterpreterData *); + +struct _xidregitem; + +struct _xidregitem { + struct _xidregitem *prev; + struct _xidregitem *next; + /* This can be a dangling pointer, but only if weakref is set. */ + PyTypeObject *cls; + /* This is NULL for builtin types. */ + PyObject *weakref; + size_t refcount; + crossinterpdatafunc getdata; +}; + +struct _xidregistry { + int global; /* builtin types or heap types */ + int initialized; + PyMutex mutex; + struct _xidregitem *head; +}; + +PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); +PyAPI_FUNC(int) _PyCrossInterpreterData_UnregisterClass(PyTypeObject *); +PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); + + +/*****************************/ +/* runtime state & lifecycle */ +/*****************************/ + +struct _xi_runtime_state { + // builtin types + // XXX Remove this field once we have a tp_* slot. + struct _xidregistry registry; +}; + +struct _xi_state { + // heap types + // XXX Remove this field once we have a tp_* slot. + struct _xidregistry registry; + + // heap types + PyObject *PyExc_NotShareableError; +}; + +extern PyStatus _PyXI_Init(PyInterpreterState *interp); +extern void _PyXI_Fini(PyInterpreterState *interp); + +extern PyStatus _PyXI_InitTypes(PyInterpreterState *interp); +extern void _PyXI_FiniTypes(PyInterpreterState *interp); + +#define _PyInterpreterState_GetXIState(interp) (&(interp)->xi) + + +/***************************/ +/* short-term data sharing */ +/***************************/ + +// Ultimately we'd like to preserve enough information about the +// exception and traceback that we could re-constitute (or at least +// simulate, a la traceback.TracebackException), and even chain, a copy +// of the exception in the calling interpreter. + +typedef struct _excinfo { + struct _excinfo_type { + PyTypeObject *builtin; + const char *name; + const char *qualname; + const char *module; + } type; + const char *msg; + const char *errdisplay; +} _PyXI_excinfo; + +PyAPI_FUNC(int) _PyXI_InitExcInfo(_PyXI_excinfo *info, PyObject *exc); +PyAPI_FUNC(PyObject *) _PyXI_FormatExcInfo(_PyXI_excinfo *info); +PyAPI_FUNC(PyObject *) _PyXI_ExcInfoAsObject(_PyXI_excinfo *info); +PyAPI_FUNC(void) _PyXI_ClearExcInfo(_PyXI_excinfo *info); + + +typedef enum error_code { + _PyXI_ERR_NO_ERROR = 0, + _PyXI_ERR_UNCAUGHT_EXCEPTION = -1, + _PyXI_ERR_OTHER = -2, + _PyXI_ERR_NO_MEMORY = -3, + _PyXI_ERR_ALREADY_RUNNING = -4, + _PyXI_ERR_MAIN_NS_FAILURE = -5, + _PyXI_ERR_APPLY_NS_FAILURE = -6, + _PyXI_ERR_NOT_SHAREABLE = -7, +} _PyXI_errcode; + + +typedef struct _sharedexception { + // The originating interpreter. + PyInterpreterState *interp; + // The kind of error to propagate. + _PyXI_errcode code; + // The exception information to propagate, if applicable. + // This is populated only for some error codes, + // but always for _PyXI_ERR_UNCAUGHT_EXCEPTION. + _PyXI_excinfo uncaught; +} _PyXI_error; + +PyAPI_FUNC(PyObject *) _PyXI_ApplyError(_PyXI_error *err); + + +typedef struct xi_session _PyXI_session; +typedef struct _sharedns _PyXI_namespace; + +PyAPI_FUNC(void) _PyXI_FreeNamespace(_PyXI_namespace *ns); +PyAPI_FUNC(_PyXI_namespace *) _PyXI_NamespaceFromNames(PyObject *names); +PyAPI_FUNC(int) _PyXI_FillNamespaceFromDict( + _PyXI_namespace *ns, + PyObject *nsobj, + _PyXI_session *session); +PyAPI_FUNC(int) _PyXI_ApplyNamespace( + _PyXI_namespace *ns, + PyObject *nsobj, + PyObject *dflt); + + +// A cross-interpreter session involves entering an interpreter +// (_PyXI_Enter()), doing some work with it, and finally exiting +// that interpreter (_PyXI_Exit()). +// +// At the boundaries of the session, both entering and exiting, +// data may be exchanged between the previous interpreter and the +// target one in a thread-safe way that does not violate the +// isolation between interpreters. This includes setting objects +// in the target's __main__ module on the way in, and capturing +// uncaught exceptions on the way out. +struct xi_session { + // Once a session has been entered, this is the tstate that was + // current before the session. If it is different from cur_tstate + // then we must have switched interpreters. Either way, this will + // be the current tstate once we exit the session. + PyThreadState *prev_tstate; + // Once a session has been entered, this is the current tstate. + // It must be current when the session exits. + PyThreadState *init_tstate; + // This is true if init_tstate needs cleanup during exit. + int own_init_tstate; + + // This is true if, while entering the session, init_thread took + // "ownership" of the interpreter's __main__ module. This means + // it is the only thread that is allowed to run code there. + // (Caveat: for now, users may still run exec() against the + // __main__ module's dict, though that isn't advisable.) + int running; + // This is a cached reference to the __dict__ of the entered + // interpreter's __main__ module. It is looked up when at the + // beginning of the session as a convenience. + PyObject *main_ns; + + // This is set if the interpreter is entered and raised an exception + // that needs to be handled in some special way during exit. + _PyXI_errcode *error_override; + // This is set if exit captured an exception to propagate. + _PyXI_error *error; + + // -- pre-allocated memory -- + _PyXI_error _error; + _PyXI_errcode _error_override; +}; + +PyAPI_FUNC(int) _PyXI_Enter( + _PyXI_session *session, + PyInterpreterState *interp, + PyObject *nsupdates); +PyAPI_FUNC(void) _PyXI_Exit(_PyXI_session *session); + +PyAPI_FUNC(PyObject *) _PyXI_ApplyCapturedException(_PyXI_session *session); +PyAPI_FUNC(int) _PyXI_HasCapturedException(_PyXI_session *session); + + +/*************/ +/* other API */ +/*************/ + +// Export for _testinternalcapi shared extension +PyAPI_FUNC(PyInterpreterState *) _PyXI_NewInterpreter( + PyInterpreterConfig *config, + long *maybe_whence, + PyThreadState **p_tstate, + PyThreadState **p_save_tstate); +PyAPI_FUNC(void) _PyXI_EndInterpreter( + PyInterpreterState *interp, + PyThreadState *tstate, + PyThreadState **p_save_tstate); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CROSSINTERP_H */ diff --git a/Include/internal/pycore_descrobject.h b/Include/internal/pycore_descrobject.h index 76378569..3cec59a6 100644 --- a/Include/internal/pycore_descrobject.h +++ b/Include/internal/pycore_descrobject.h @@ -20,6 +20,8 @@ typedef struct { typedef propertyobject _PyPropertyObject; +extern PyTypeObject _PyMethodWrapper_Type; + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_dict.h b/Include/internal/pycore_dict.h index 6253e084..36da498d 100644 --- a/Include/internal/pycore_dict.h +++ b/Include/internal/pycore_dict.h @@ -1,4 +1,3 @@ - #ifndef Py_INTERNAL_DICT_H #define Py_INTERNAL_DICT_H #ifdef __cplusplus @@ -9,14 +8,68 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_dict_state.h" -#include "pycore_runtime.h" // _PyRuntime +#include "pycore_freelist.h" // _PyFreeListState +#include "pycore_identifier.h" // _Py_Identifier +#include "pycore_object.h" // PyManagedDictPointer +#include "pycore_pyatomic_ft_wrappers.h" // FT_ATOMIC_LOAD_SSIZE_ACQUIRE + +// Unsafe flavor of PyDict_GetItemWithError(): no error checking +extern PyObject* _PyDict_GetItemWithError(PyObject *dp, PyObject *key); + +// Delete an item from a dict if a predicate is true +// Returns -1 on error, 1 if the item was deleted, 0 otherwise +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, + int (*predicate)(PyObject *value, void *arg), + void *arg); + +// "KnownHash" variants +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key, + PyObject *item, Py_hash_t hash); +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, + Py_hash_t hash); +extern int _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); + +// "Id" variants +extern PyObject* _PyDict_GetItemIdWithError(PyObject *dp, + _Py_Identifier *key); +extern int _PyDict_ContainsId(PyObject *, _Py_Identifier *); +extern int _PyDict_SetItemId(PyObject *dp, _Py_Identifier *key, PyObject *item); +extern int _PyDict_DelItemId(PyObject *mp, _Py_Identifier *key); + +extern int _PyDict_Next( + PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); +extern int _PyDict_HasOnlyStringKeys(PyObject *mp); -/* runtime lifecycle */ +extern void _PyDict_MaybeUntrack(PyObject *mp); -extern void _PyDict_Fini(PyInterpreterState *interp); +// Export for '_ctypes' shared extension +PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *); +#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) + +/* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, + the first occurrence of a key wins, if override is 1, the last occurrence + of a key wins, if override is 2, a KeyError with conflicting key as + argument is raised. +*/ +PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); + +extern void _PyDict_DebugMallocStats(FILE *out); + + +/* _PyDictView */ + +typedef struct { + PyObject_HEAD + PyDictObject *dv_dict; +} _PyDictViewObject; + +extern PyObject* _PyDictView_New(PyObject *, PyTypeObject *); +extern PyObject* _PyDictView_Intersect(PyObject* self, PyObject *other); /* other API */ @@ -42,20 +95,35 @@ extern uint32_t _PyDictKeys_GetVersionForCurrentState( extern size_t _PyDict_KeysSize(PyDictKeysObject *keys); +extern void _PyDictKeys_DecRef(PyDictKeysObject *keys); + /* _Py_dict_lookup() returns index of entry which can be used like DK_ENTRIES(dk)[index]. * -1 when no entry found, -3 when compare raises error. */ extern Py_ssize_t _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr); +extern Py_ssize_t _Py_dict_lookup_threadsafe(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr); extern Py_ssize_t _PyDict_LookupIndex(PyDictObject *, PyObject *); extern Py_ssize_t _PyDictKeys_StringLookup(PyDictKeysObject* dictkeys, PyObject *key); -extern PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +PyAPI_FUNC(PyObject *)_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); /* Consumes references to key and value */ -extern int _PyDict_SetItem_Take2(PyDictObject *op, PyObject *key, PyObject *value); -extern int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); - -extern PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); +PyAPI_FUNC(int) _PyDict_SetItem_Take2(PyDictObject *op, PyObject *key, PyObject *value); +extern int _PyDict_SetItem_LockHeld(PyDictObject *dict, PyObject *name, PyObject *value); +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyDict_SetItem_KnownHash_LockHeld(PyDictObject *mp, PyObject *key, + PyObject *value, Py_hash_t hash); +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash_LockHeld(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result); +extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result); +extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result); +extern int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value); + +extern int _PyDict_Pop_KnownHash( + PyDictObject *dict, + PyObject *key, + Py_hash_t hash, + PyObject **result); #define DKIX_EMPTY (-1) #define DKIX_DUMMY (-2) /* Used internally */ @@ -81,6 +149,11 @@ struct _dictkeysobject { /* Kind of keys */ uint8_t dk_kind; +#ifdef Py_GIL_DISABLED + /* Lock used to protect shared keys */ + PyMutex dk_mutex; +#endif + /* Version number -- Reset to 0 by any modification to keys */ uint32_t dk_version; @@ -90,6 +163,7 @@ struct _dictkeysobject { /* Number of used entries in dk_entries. */ Py_ssize_t dk_nentries; + /* Actual hash table of dk_size entries. It holds indices in dk_entries, or DKIX_EMPTY(-1) or DKIX_DUMMY(-2). @@ -106,7 +180,7 @@ struct _dictkeysobject { char dk_indices[]; /* char is required to avoid strict aliasing. */ /* "PyDictKeyEntry or PyDictUnicodeEntry dk_entries[USABLE_FRACTION(DK_SIZE(dk))];" array follows: - see the DK_ENTRIES() macro */ + see the DK_ENTRIES() / DK_UNICODE_ENTRIES() functions below */ }; /* This must be no more than 250, for the prefix size to fit in one byte. */ @@ -120,6 +194,10 @@ struct _dictkeysobject { * [-1] = prefix size. [-2] = used size. size[-2-n...] = insertion order. */ struct _dictvalues { + uint8_t capacity; + uint8_t size; + uint8_t embedded; + uint8_t valid; PyObject *values[1]; }; @@ -135,6 +213,7 @@ static inline void* _DK_ENTRIES(PyDictKeysObject *dk) { size_t index = (size_t)1 << dk->dk_log2_index_bytes; return (&indices[index]); } + static inline PyDictKeyEntry* DK_ENTRIES(PyDictKeysObject *dk) { assert(dk->dk_kind == DICT_KEYS_GENERAL); return (PyDictKeyEntry*)_DK_ENTRIES(dk); @@ -146,11 +225,35 @@ static inline PyDictUnicodeEntry* DK_UNICODE_ENTRIES(PyDictKeysObject *dk) { #define DK_IS_UNICODE(dk) ((dk)->dk_kind != DICT_KEYS_GENERAL) -#define DICT_VERSION_INCREMENT (1 << DICT_MAX_WATCHERS) -#define DICT_VERSION_MASK (DICT_VERSION_INCREMENT - 1) +#define DICT_VERSION_INCREMENT (1 << (DICT_MAX_WATCHERS + DICT_WATCHED_MUTATION_BITS)) +#define DICT_WATCHER_MASK ((1 << DICT_MAX_WATCHERS) - 1) +#define DICT_WATCHER_AND_MODIFICATION_MASK ((1 << (DICT_MAX_WATCHERS + DICT_WATCHED_MUTATION_BITS)) - 1) + +#ifdef Py_GIL_DISABLED + +#define THREAD_LOCAL_DICT_VERSION_COUNT 256 +#define THREAD_LOCAL_DICT_VERSION_BATCH THREAD_LOCAL_DICT_VERSION_COUNT * DICT_VERSION_INCREMENT +static inline uint64_t +dict_next_version(PyInterpreterState *interp) +{ + PyThreadState *tstate = PyThreadState_GET(); + uint64_t cur_progress = (tstate->dict_global_version & + (THREAD_LOCAL_DICT_VERSION_BATCH - 1)); + if (cur_progress == 0) { + uint64_t next = _Py_atomic_add_uint64(&interp->dict_state.global_version, + THREAD_LOCAL_DICT_VERSION_BATCH); + tstate->dict_global_version = next; + } + return tstate->dict_global_version += DICT_VERSION_INCREMENT; +} + +#define DICT_NEXT_VERSION(INTERP) dict_next_version(INTERP) + +#else #define DICT_NEXT_VERSION(INTERP) \ ((INTERP)->dict_state.global_version += DICT_VERSION_INCREMENT) +#endif void _PyDict_SendEvent(int watcher_bits, @@ -167,32 +270,70 @@ _PyDict_NotifyEvent(PyInterpreterState *interp, PyObject *value) { assert(Py_REFCNT((PyObject*)mp) > 0); - int watcher_bits = mp->ma_version_tag & DICT_VERSION_MASK; + int watcher_bits = mp->ma_version_tag & DICT_WATCHER_MASK; if (watcher_bits) { + RARE_EVENT_STAT_INC(watched_dict_modification); _PyDict_SendEvent(watcher_bits, event, mp, key, value); - return DICT_NEXT_VERSION(interp) | watcher_bits; } - return DICT_NEXT_VERSION(interp); + return DICT_NEXT_VERSION(interp) | (mp->ma_version_tag & DICT_WATCHER_AND_MODIFICATION_MASK); } -extern PyObject *_PyObject_MakeDictFromInstanceAttributes(PyObject *obj, PyDictValues *values); -extern PyObject *_PyDict_FromItems( +extern PyDictObject *_PyObject_MaterializeManagedDict(PyObject *obj); + +PyAPI_FUNC(PyObject *)_PyDict_FromItems( PyObject *const *keys, Py_ssize_t keys_offset, PyObject *const *values, Py_ssize_t values_offset, Py_ssize_t length); +static inline uint8_t * +get_insertion_order_array(PyDictValues *values) +{ + return (uint8_t *)&values->values[values->capacity]; +} + static inline void _PyDictValues_AddToInsertionOrder(PyDictValues *values, Py_ssize_t ix) { assert(ix < SHARED_KEYS_MAX_SIZE); - uint8_t *size_ptr = ((uint8_t *)values)-2; - int size = *size_ptr; - assert(size+2 < ((uint8_t *)values)[-1]); - size++; - size_ptr[-size] = (uint8_t)ix; - *size_ptr = size; + int size = values->size; + uint8_t *array = get_insertion_order_array(values); + assert(size < values->capacity); + assert(((uint8_t)ix) == ix); + array[size] = (uint8_t)ix; + values->size = size+1; +} + +static inline size_t +shared_keys_usable_size(PyDictKeysObject *keys) +{ + // dk_usable will decrease for each instance that is created and each + // value that is added. dk_nentries will increase for each value that + // is added. We want to always return the right value or larger. + // We therefore increase dk_nentries first and we decrease dk_usable + // second, and conversely here we read dk_usable first and dk_entries + // second (to avoid the case where we read entries before the increment + // and read usable after the decrement) + Py_ssize_t dk_usable = FT_ATOMIC_LOAD_SSIZE_ACQUIRE(keys->dk_usable); + Py_ssize_t dk_nentries = FT_ATOMIC_LOAD_SSIZE_ACQUIRE(keys->dk_nentries); + return dk_nentries + dk_usable; } +static inline size_t +_PyInlineValuesSize(PyTypeObject *tp) +{ + PyDictKeysObject *keys = ((PyHeapTypeObject*)tp)->ht_cached_keys; + assert(keys != NULL); + size_t size = shared_keys_usable_size(keys); + size_t prefix_size = _Py_SIZE_ROUND_UP(size, sizeof(PyObject *)); + assert(prefix_size < 256); + return prefix_size + (size + 1) * sizeof(PyObject *); +} + +int +_PyDict_DetachFromObject(PyDictObject *dict, PyObject *obj); + +PyDictObject *_PyObject_MaterializeManagedDict_LockHeld(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_dict_state.h b/Include/internal/pycore_dict_state.h index ece0f10c..1a44755c 100644 --- a/Include/internal/pycore_dict_state.h +++ b/Include/internal/pycore_dict_state.h @@ -8,17 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif - -#ifndef WITH_FREELISTS -// without freelists -# define PyDict_MAXFREELIST 0 -#endif - -#ifndef PyDict_MAXFREELIST -# define PyDict_MAXFREELIST 80 -#endif - #define DICT_MAX_WATCHERS 8 +#define DICT_WATCHED_MUTATION_BITS 4 struct _Py_dict_state { /*Global counter used to set ma_version_tag field of dictionary. @@ -26,15 +17,6 @@ struct _Py_dict_state { * time that a dictionary is modified. */ uint64_t global_version; uint32_t next_keys_version; - -#if PyDict_MAXFREELIST > 0 - /* Dictionary reuse scheme to save calls to malloc and free */ - PyDictObject *free_list[PyDict_MAXFREELIST]; - PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; - int numfree; - int keys_numfree; -#endif - PyDict_WatchCallback watchers[DICT_MAX_WATCHERS]; }; diff --git a/Include/internal/pycore_dtoa.h b/Include/internal/pycore_dtoa.h index 4d9681d5..e4222c52 100644 --- a/Include/internal/pycore_dtoa.h +++ b/Include/internal/pycore_dtoa.h @@ -11,8 +11,6 @@ extern "C" { #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR -#if _PY_SHORT_FLOAT_REPR == 1 - typedef uint32_t ULong; struct @@ -22,19 +20,22 @@ Bigint { ULong x[1]; }; -#ifdef Py_USING_MEMORY_DEBUGGER +#if defined(Py_USING_MEMORY_DEBUGGER) || _PY_SHORT_FLOAT_REPR == 0 struct _dtoa_state { int _not_used; }; -#define _dtoa_interp_state_INIT(INTERP) \ +#define _dtoa_state_INIT(INTERP) \ {0} -#else // !Py_USING_MEMORY_DEBUGGER +#else // !Py_USING_MEMORY_DEBUGGER && _PY_SHORT_FLOAT_REPR != 0 /* The size of the Bigint freelist */ #define Bigint_Kmax 7 +/* The size of the cached powers of 5 array */ +#define Bigint_Pow5size 8 + #ifndef PRIVATE_MEM #define PRIVATE_MEM 2304 #endif @@ -42,9 +43,10 @@ struct _dtoa_state { ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) struct _dtoa_state { - /* p5s is a linked list of powers of 5 of the form 5**(2**i), i >= 2 */ + // p5s is an array of powers of 5 of the form: + // 5**(2**(i+2)) for 0 <= i < Bigint_Pow5size + struct Bigint *p5s[Bigint_Pow5size]; // XXX This should be freed during runtime fini. - struct Bigint *p5s; struct Bigint *freelist[Bigint_Kmax+1]; double preallocated[Bigint_PREALLOC_SIZE]; double *preallocated_next; @@ -57,15 +59,15 @@ struct _dtoa_state { #endif // !Py_USING_MEMORY_DEBUGGER -/* These functions are used by modules compiled as C extension like math: - they must be exported. */ +extern double _Py_dg_strtod(const char *str, char **ptr); +extern char* _Py_dg_dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +extern void _Py_dg_freedtoa(char *s); + -PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); -PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, - int *decpt, int *sign, char **rve); -PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); +extern PyStatus _PyDtoa_Init(PyInterpreterState *interp); +extern void _PyDtoa_Fini(PyInterpreterState *interp); -#endif // _PY_SHORT_FLOAT_REPR == 1 #ifdef __cplusplus } diff --git a/Include/internal/pycore_emscripten_signal.h b/Include/internal/pycore_emscripten_signal.h index 8b3287d8..754193e2 100644 --- a/Include/internal/pycore_emscripten_signal.h +++ b/Include/internal/pycore_emscripten_signal.h @@ -3,6 +3,10 @@ #if defined(__EMSCRIPTEN__) +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + void _Py_CheckEmscriptenSignals(void); @@ -14,6 +18,7 @@ _Py_CheckEmscriptenSignalsPeriodically(void); #define _Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY() _Py_CheckEmscriptenSignalsPeriodically() extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; +extern int _Py_emscripten_signal_clock; #else diff --git a/Include/internal/pycore_emscripten_trampoline.h b/Include/internal/pycore_emscripten_trampoline.h new file mode 100644 index 00000000..e519c99a --- /dev/null +++ b/Include/internal/pycore_emscripten_trampoline.h @@ -0,0 +1,81 @@ +#ifndef Py_EMSCRIPTEN_TRAMPOLINE_H +#define Py_EMSCRIPTEN_TRAMPOLINE_H + +#include "pycore_runtime.h" // _PyRuntimeState + +/** + * C function call trampolines to mitigate bad function pointer casts. + * + * Section 6.3.2.3, paragraph 8 reads: + * + * A pointer to a function of one type may be converted to a pointer to a + * function of another type and back again; the result shall compare equal to + * the original pointer. If a converted pointer is used to call a function + * whose type is not compatible with the pointed-to type, the behavior is + * undefined. + * + * Typical native ABIs ignore additional arguments or fill in missing values + * with 0/NULL in function pointer cast. Compilers do not show warnings when a + * function pointer is explicitly casted to an incompatible type. + * + * Bad fpcasts are an issue in WebAssembly. WASM's indirect_call has strict + * function signature checks. Argument count, types, and return type must match. + * + * Third party code unintentionally rely on problematic fpcasts. The call + * trampoline mitigates common occurrences of bad fpcasts on Emscripten. + */ + +#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +void _Py_EmscriptenTrampoline_Init(_PyRuntimeState *runtime); + +PyObject* +_PyEM_TrampolineCall_JavaScript(PyCFunctionWithKeywords func, + PyObject* self, + PyObject* args, + PyObject* kw); + +PyObject* +_PyEM_TrampolineCall_Reflection(PyCFunctionWithKeywords func, + PyObject* self, + PyObject* args, + PyObject* kw); + +#define _PyEM_TrampolineCall(meth, self, args, kw) \ + ((_PyRuntime.wasm_type_reflection_available) ? \ + (_PyEM_TrampolineCall_Reflection((PyCFunctionWithKeywords)(meth), (self), (args), (kw))) : \ + (_PyEM_TrampolineCall_JavaScript((PyCFunctionWithKeywords)(meth), (self), (args), (kw)))) + +#define _PyCFunction_TrampolineCall(meth, self, args) \ + _PyEM_TrampolineCall( \ + (*(PyCFunctionWithKeywords)(void(*)(void))(meth)), (self), (args), NULL) + +#define _PyCFunctionWithKeywords_TrampolineCall(meth, self, args, kw) \ + _PyEM_TrampolineCall((meth), (self), (args), (kw)) + +#define descr_set_trampoline_call(set, obj, value, closure) \ + ((int)_PyEM_TrampolineCall((PyCFunctionWithKeywords)(set), (obj), (value), (PyObject*)(closure))) + +#define descr_get_trampoline_call(get, obj, closure) \ + _PyEM_TrampolineCall((PyCFunctionWithKeywords)(get), (obj), (PyObject*)(closure), NULL) + + +#else // defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +#define _Py_EmscriptenTrampoline_Init(runtime) + +#define _PyCFunction_TrampolineCall(meth, self, args) \ + (meth)((self), (args)) + +#define _PyCFunctionWithKeywords_TrampolineCall(meth, self, args, kw) \ + (meth)((self), (args), (kw)) + +#define descr_set_trampoline_call(set, obj, value, closure) \ + (set)((obj), (value), (closure)) + +#define descr_get_trampoline_call(get, obj, closure) \ + (get)((obj), (closure)) + +#endif // defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + +#endif // ndef Py_EMSCRIPTEN_SIGNAL_H diff --git a/Include/internal/pycore_faulthandler.h b/Include/internal/pycore_faulthandler.h index e6aec774..6dd7d8d7 100644 --- a/Include/internal/pycore_faulthandler.h +++ b/Include/internal/pycore_faulthandler.h @@ -9,7 +9,7 @@ extern "C" { #endif #ifdef HAVE_SIGACTION -# include +# include // sigaction #endif diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 7c2b6ec0..13f86b01 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -5,12 +5,20 @@ extern "C" { #endif #ifndef Py_BUILD_CORE -# error "Py_BUILD_CORE must be defined to include this header" +# error "this header requires Py_BUILD_CORE define" #endif -#include /* struct lconv */ +#include // struct lconv +/* A routine to check if a file descriptor can be select()-ed. */ +#ifdef _MSC_VER + /* On Windows, any socket fd can be select()-ed, no matter how high */ + #define _PyIsSelectable_fd(FD) (1) +#else + #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE) +#endif + struct _fileutils_state { int force_ascii; }; @@ -27,8 +35,10 @@ typedef enum { _Py_ERROR_OTHER } _Py_error_handler; +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(int) _Py_DecodeLocaleEx( const char *arg, wchar_t **wstr, @@ -37,6 +47,7 @@ PyAPI_FUNC(int) _Py_DecodeLocaleEx( int current_locale, _Py_error_handler errors); +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(int) _Py_EncodeLocaleEx( const wchar_t *text, char **str, @@ -45,11 +56,11 @@ PyAPI_FUNC(int) _Py_EncodeLocaleEx( int current_locale, _Py_error_handler errors); -PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( +extern char* _Py_EncodeLocaleRaw( const wchar_t *text, size_t *error_pos); -PyAPI_FUNC(PyObject *) _Py_device_encoding(int); +extern PyObject* _Py_device_encoding(int); #if defined(MS_WINDOWS) || defined(__APPLE__) /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). @@ -90,47 +101,54 @@ struct _Py_stat_struct { # define _Py_stat_struct stat #endif +// Export for 'mmap' shared extension PyAPI_FUNC(int) _Py_fstat( int fd, struct _Py_stat_struct *status); +// Export for 'mmap' shared extension PyAPI_FUNC(int) _Py_fstat_noraise( int fd, struct _Py_stat_struct *status); +// Export for '_tkinter' shared extension PyAPI_FUNC(int) _Py_stat( PyObject *path, struct stat *status); +// Export for 'select' shared extension (Solaris newDevPollObject()) PyAPI_FUNC(int) _Py_open( const char *pathname, int flags); +// Export for '_posixsubprocess' shared extension PyAPI_FUNC(int) _Py_open_noraise( const char *pathname, int flags); -PyAPI_FUNC(FILE *) _Py_wfopen( +extern FILE* _Py_wfopen( const wchar_t *path, const wchar_t *mode); -PyAPI_FUNC(Py_ssize_t) _Py_read( +extern Py_ssize_t _Py_read( int fd, void *buf, size_t count); +// Export for 'select' shared extension (Solaris devpoll_flush()) PyAPI_FUNC(Py_ssize_t) _Py_write( int fd, const void *buf, size_t count); +// Export for '_posixsubprocess' shared extension PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( int fd, const void *buf, size_t count); #ifdef HAVE_READLINK -PyAPI_FUNC(int) _Py_wreadlink( +extern int _Py_wreadlink( const wchar_t *path, wchar_t *buf, /* Number of characters of 'buf' buffer @@ -139,7 +157,7 @@ PyAPI_FUNC(int) _Py_wreadlink( #endif #ifdef HAVE_REALPATH -PyAPI_FUNC(wchar_t*) _Py_wrealpath( +extern wchar_t* _Py_wrealpath( const wchar_t *path, wchar_t *resolved_path, /* Number of characters of 'resolved_path' buffer @@ -147,34 +165,38 @@ PyAPI_FUNC(wchar_t*) _Py_wrealpath( size_t resolved_path_len); #endif -PyAPI_FUNC(wchar_t*) _Py_wgetcwd( +extern wchar_t* _Py_wgetcwd( wchar_t *buf, /* Number of characters of 'buf' buffer including the trailing NUL character */ size_t buflen); -PyAPI_FUNC(int) _Py_get_inheritable(int fd); +extern int _Py_get_inheritable(int fd); +// Export for '_socket' shared extension PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, int *atomic_flag_works); +// Export for '_posixsubprocess' shared extension PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, int *atomic_flag_works); +// Export for '_socket' shared extension PyAPI_FUNC(int) _Py_dup(int fd); -PyAPI_FUNC(int) _Py_get_blocking(int fd); +extern int _Py_get_blocking(int fd); -PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +extern int _Py_set_blocking(int fd, int blocking); #ifdef MS_WINDOWS -PyAPI_FUNC(void*) _Py_get_osfhandle_noraise(int fd); +extern void* _Py_get_osfhandle_noraise(int fd); +// Export for '_testconsole' shared extension PyAPI_FUNC(void*) _Py_get_osfhandle(int fd); -PyAPI_FUNC(int) _Py_open_osfhandle_noraise(void *handle, int flags); +extern int _Py_open_osfhandle_noraise(void *handle, int flags); -PyAPI_FUNC(int) _Py_open_osfhandle(void *handle, int flags); +extern int _Py_open_osfhandle(void *handle, int flags); #endif /* MS_WINDOWS */ // This is used after getting NULL back from Py_DecodeLocale(). @@ -183,9 +205,9 @@ PyAPI_FUNC(int) _Py_open_osfhandle(void *handle, int flags); ? _PyStatus_ERR("cannot decode " NAME) \ : _PyStatus_NO_MEMORY() -PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; +extern int _Py_HasFileSystemDefaultEncodeErrors; -PyAPI_FUNC(int) _Py_DecodeUTF8Ex( +extern int _Py_DecodeUTF8Ex( const char *arg, Py_ssize_t arglen, wchar_t **wstr, @@ -193,7 +215,7 @@ PyAPI_FUNC(int) _Py_DecodeUTF8Ex( const char **reason, _Py_error_handler errors); -PyAPI_FUNC(int) _Py_EncodeUTF8Ex( +extern int _Py_EncodeUTF8Ex( const wchar_t *text, char **str, size_t *error_pos, @@ -201,7 +223,7 @@ PyAPI_FUNC(int) _Py_EncodeUTF8Ex( int raw_malloc, _Py_error_handler errors); -PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( +extern wchar_t* _Py_DecodeUTF8_surrogateescape( const char *arg, Py_ssize_t arglen, size_t *wlen); @@ -209,25 +231,26 @@ PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( extern int _Py_wstat(const wchar_t *, struct stat *); -PyAPI_FUNC(int) _Py_GetForceASCII(void); +extern int _Py_GetForceASCII(void); /* Reset "force ASCII" mode (if it was initialized). This function should be called when Python changes the LC_CTYPE locale, so the "force ASCII" mode can be detected again on the new locale encoding. */ -PyAPI_FUNC(void) _Py_ResetForceASCII(void); +extern void _Py_ResetForceASCII(void); -PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( +extern int _Py_GetLocaleconvNumeric( struct lconv *lc, PyObject **decimal_point, PyObject **thousands_sep); +// Export for '_posixsubprocess' (on macOS) PyAPI_FUNC(void) _Py_closerange(int first, int last); -PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); -PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); +extern wchar_t* _Py_GetLocaleEncoding(void); +extern PyObject* _Py_GetLocaleEncodingObject(void); #ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION extern int _Py_LocaleUsesNonUnicodeWchar(void); @@ -246,24 +269,29 @@ extern int _Py_abspath(const wchar_t *path, wchar_t **abspath_p); #ifdef MS_WINDOWS extern int _PyOS_getfullpathname(const wchar_t *path, wchar_t **abspath_p); #endif -extern wchar_t * _Py_join_relfile(const wchar_t *dirname, - const wchar_t *relfile); +extern wchar_t* _Py_join_relfile(const wchar_t *dirname, + const wchar_t *relfile); extern int _Py_add_relfile(wchar_t *dirname, const wchar_t *relfile, size_t bufsize); extern size_t _Py_find_basename(const wchar_t *filename); + +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(wchar_t*) _Py_normpath(wchar_t *path, Py_ssize_t size); + extern wchar_t *_Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *length); // The Windows Games API family does not provide these functions // so provide our own implementations. Remove them in case they get added // to the Games API family #if defined(MS_WINDOWS_GAMES) && !defined(MS_WINDOWS_DESKTOP) -#include +#include // HRESULT extern HRESULT PathCchSkipRoot(const wchar_t *pszPath, const wchar_t **ppszRootEnd); #endif /* defined(MS_WINDOWS_GAMES) && !defined(MS_WINDOWS_DESKTOP) */ +extern void _Py_skiproot(const wchar_t *path, Py_ssize_t size, Py_ssize_t *drvsize, Py_ssize_t *rootsize); + // Macros to protect CRT calls against instant termination when passed an // invalid parameter (bpo-23524). IPH stands for Invalid Parameter Handler. // Usage: @@ -286,6 +314,21 @@ extern HRESULT PathCchSkipRoot(const wchar_t *pszPath, const wchar_t **ppszRootE # define _Py_END_SUPPRESS_IPH #endif /* _MSC_VER >= 1900 */ +// Export for 'select' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_FileDescriptor_Converter(PyObject *, void *); + +// Export for test_peg_generator +PyAPI_FUNC(char*) _Py_UniversalNewlineFgetsWithSize(char *, int, FILE*, PyObject *, size_t*); + +extern int _PyFile_Flush(PyObject *); + +#ifndef MS_WINDOWS +extern int _Py_GetTicksPerSecond(long *ticks_per_second); +#endif + +// Export for '_testcapi' shared extension +PyAPI_FUNC(int) _Py_IsValidFD(int fd); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_fileutils_windows.h b/Include/internal/pycore_fileutils_windows.h index e804d385..b79aa9fb 100644 --- a/Include/internal/pycore_fileutils_windows.h +++ b/Include/internal/pycore_fileutils_windows.h @@ -5,7 +5,7 @@ extern "C" { #endif #ifndef Py_BUILD_CORE -# error "Py_BUILD_CORE must be defined to include this header" +# error "this header requires Py_BUILD_CORE define" #endif #ifdef MS_WINDOWS diff --git a/Include/internal/pycore_floatobject.h b/Include/internal/pycore_floatobject.h index 27c63bc8..f984df69 100644 --- a/Include/internal/pycore_floatobject.h +++ b/Include/internal/pycore_floatobject.h @@ -8,12 +8,13 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_freelist.h" // _PyFreeListState +#include "pycore_unicodeobject.h" // _PyUnicodeWriter /* runtime lifecycle */ extern void _PyFloat_InitState(PyInterpreterState *); extern PyStatus _PyFloat_InitTypes(PyInterpreterState *); -extern void _PyFloat_Fini(PyInterpreterState *); extern void _PyFloat_FiniType(PyInterpreterState *); @@ -31,40 +32,30 @@ struct _Py_float_runtime_state { }; -#ifndef WITH_FREELISTS -// without freelists -# define PyFloat_MAXFREELIST 0 -#endif - -#ifndef PyFloat_MAXFREELIST -# define PyFloat_MAXFREELIST 100 -#endif -struct _Py_float_state { -#if PyFloat_MAXFREELIST > 0 - /* Special free list - free_list is a singly-linked list of available PyFloatObjects, - linked via abuse of their ob_type members. */ - int numfree; - PyFloatObject *free_list; -#endif -}; -void _PyFloat_ExactDealloc(PyObject *op); +PyAPI_FUNC(void) _PyFloat_ExactDealloc(PyObject *op); -PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); +extern void _PyFloat_DebugMallocStats(FILE* out); /* Format the object based on the format_spec, as defined in PEP 3101 (Advanced String Formatting). */ -PyAPI_FUNC(int) _PyFloat_FormatAdvancedWriter( +extern int _PyFloat_FormatAdvancedWriter( _PyUnicodeWriter *writer, PyObject *obj, PyObject *format_spec, Py_ssize_t start, Py_ssize_t end); +extern PyObject* _Py_string_to_number_with_underscores( + const char *str, Py_ssize_t len, const char *what, PyObject *obj, void *arg, + PyObject *(*innerfunc)(const char *, Py_ssize_t, void *)); + +extern double _Py_parse_inf_or_nan(const char *p, char **endptr); + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_flowgraph.h b/Include/internal/pycore_flowgraph.h index 720feb18..819117b8 100644 --- a/Include/internal/pycore_flowgraph.h +++ b/Include/internal/pycore_flowgraph.h @@ -8,110 +8,30 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_opcode_utils.h" #include "pycore_compile.h" +#include "pycore_instruction_sequence.h" +#include "pycore_opcode_utils.h" +struct _PyCfgBuilder; -typedef struct { - int i_opcode; - int i_oparg; - _PyCompilerSrcLocation i_loc; - struct _PyCfgBasicblock_ *i_target; /* target block (if jump instruction) */ - struct _PyCfgBasicblock_ *i_except; /* target block when exception is raised */ -} _PyCfgInstruction; - -typedef struct { - int id; -} _PyCfgJumpTargetLabel; - - -typedef struct { - struct _PyCfgBasicblock_ *handlers[CO_MAXBLOCKS+1]; - int depth; -} _PyCfgExceptStack; - -typedef struct _PyCfgBasicblock_ { - /* Each basicblock in a compilation unit is linked via b_list in the - reverse order that the block are allocated. b_list points to the next - block in this list, not to be confused with b_next, which is next by - control flow. */ - struct _PyCfgBasicblock_ *b_list; - /* The label of this block if it is a jump target, -1 otherwise */ - _PyCfgJumpTargetLabel b_label; - /* Exception stack at start of block, used by assembler to create the exception handling table */ - _PyCfgExceptStack *b_exceptstack; - /* pointer to an array of instructions, initially NULL */ - _PyCfgInstruction *b_instr; - /* If b_next is non-NULL, it is a pointer to the next - block reached by normal control flow. */ - struct _PyCfgBasicblock_ *b_next; - /* number of instructions used */ - int b_iused; - /* length of instruction array (b_instr) */ - int b_ialloc; - /* Used by add_checks_for_loads_of_unknown_variables */ - uint64_t b_unsafe_locals_mask; - /* Number of predecessors that a block has. */ - int b_predecessors; - /* depth of stack upon entry of block, computed by stackdepth() */ - int b_startdepth; - /* instruction offset for block, computed by assemble_jump_offsets() */ - int b_offset; - /* Basic block is an exception handler that preserves lasti */ - unsigned b_preserve_lasti : 1; - /* Used by compiler passes to mark whether they have visited a basic block. */ - unsigned b_visited : 1; - /* b_except_handler is used by the cold-detection algorithm to mark exception targets */ - unsigned b_except_handler : 1; - /* b_cold is true if this block is not perf critical (like an exception handler) */ - unsigned b_cold : 1; - /* b_warm is used by the cold-detection algorithm to mark blocks which are definitely not cold */ - unsigned b_warm : 1; -} _PyCfgBasicblock; - -int _PyBasicblock_InsertInstruction(_PyCfgBasicblock *block, int pos, _PyCfgInstruction *instr); - -typedef struct cfg_builder_ { - /* The entryblock, at which control flow begins. All blocks of the - CFG are reachable through the b_next links */ - _PyCfgBasicblock *g_entryblock; - /* Pointer to the most recently allocated block. By following - b_list links, you can reach all allocated blocks. */ - _PyCfgBasicblock *g_block_list; - /* pointer to the block currently being constructed */ - _PyCfgBasicblock *g_curblock; - /* label for the next instruction to be placed */ - _PyCfgJumpTargetLabel g_current_label; -} _PyCfgBuilder; - -int _PyCfgBuilder_UseLabel(_PyCfgBuilder *g, _PyCfgJumpTargetLabel lbl); -int _PyCfgBuilder_Addop(_PyCfgBuilder *g, int opcode, int oparg, _PyCompilerSrcLocation loc); - -int _PyCfgBuilder_Init(_PyCfgBuilder *g); -void _PyCfgBuilder_Fini(_PyCfgBuilder *g); - -_PyCfgInstruction* _PyCfg_BasicblockLastInstr(const _PyCfgBasicblock *b); -int _PyCfg_OptimizeCodeUnit(_PyCfgBuilder *g, PyObject *consts, PyObject *const_cache, - int code_flags, int nlocals, int nparams, int firstlineno); -int _PyCfg_Stackdepth(_PyCfgBasicblock *entryblock, int code_flags); -void _PyCfg_ConvertPseudoOps(_PyCfgBasicblock *entryblock); -int _PyCfg_ResolveJumps(_PyCfgBuilder *g); +int _PyCfgBuilder_UseLabel(struct _PyCfgBuilder *g, _PyJumpTargetLabel lbl); +int _PyCfgBuilder_Addop(struct _PyCfgBuilder *g, int opcode, int oparg, _Py_SourceLocation loc); +struct _PyCfgBuilder* _PyCfgBuilder_New(void); +void _PyCfgBuilder_Free(struct _PyCfgBuilder *g); +int _PyCfgBuilder_CheckSize(struct _PyCfgBuilder* g); -static inline int -basicblock_nofallthrough(const _PyCfgBasicblock *b) { - _PyCfgInstruction *last = _PyCfg_BasicblockLastInstr(b); - return (last && - (IS_SCOPE_EXIT_OPCODE(last->i_opcode) || - IS_UNCONDITIONAL_JUMP_OPCODE(last->i_opcode))); -} +int _PyCfg_OptimizeCodeUnit(struct _PyCfgBuilder *g, PyObject *consts, PyObject *const_cache, + int nlocals, int nparams, int firstlineno); -#define BB_NO_FALLTHROUGH(B) (basicblock_nofallthrough(B)) -#define BB_HAS_FALLTHROUGH(B) (!basicblock_nofallthrough(B)) +int _PyCfg_ToInstructionSequence(struct _PyCfgBuilder *g, _PyInstructionSequence *seq); +int _PyCfg_OptimizedCfgToInstructionSequence(struct _PyCfgBuilder *g, _PyCompile_CodeUnitMetadata *umd, + int code_flags, int *stackdepth, int *nlocalsplus, + _PyInstructionSequence *seq); PyCodeObject * _PyAssemble_MakeCodeObject(_PyCompile_CodeUnitMetadata *u, PyObject *const_cache, - PyObject *consts, int maxdepth, _PyCompile_InstructionSequence *instrs, + PyObject *consts, int maxdepth, _PyInstructionSequence *instrs, int nlocalsplus, int code_flags, PyObject *filename); #ifdef __cplusplus diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index 158db2cf..af181e37 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -4,9 +4,13 @@ extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + #include -#include -#include "pycore_code.h" // STATS +#include // offsetof() +#include "pycore_code.h" // STATS /* See Objects/frame_layout.md for an explanation of the frame stack * including explanation of the PyFrameObject and _PyInterpreterFrame @@ -21,7 +25,11 @@ struct _frame { int f_lineno; /* Current line number. Only valid if non-zero */ char f_trace_lines; /* Emit per-line trace events? */ char f_trace_opcodes; /* Emit per-opcode trace events? */ - char f_fast_as_locals; /* Have the fast locals of this frame been converted to a dict? */ + PyObject *f_extra_locals; /* Dict for locals set by users using f_locals, could be NULL */ + /* This is purely for backwards compatibility for PyEval_GetLocals. + PyEval_GetLocals requires a borrowed reference so the actual reference + is stored here */ + PyObject *f_locals_cache; /* The frame data, if this frame object owns the frame */ PyObject *_f_frame_data[1]; }; @@ -32,13 +40,17 @@ extern PyFrameObject* _PyFrame_New_NoTrack(PyCodeObject *code); /* other API */ typedef enum _framestate { - FRAME_CREATED = -2, - FRAME_SUSPENDED = -1, + FRAME_CREATED = -3, + FRAME_SUSPENDED = -2, + FRAME_SUSPENDED_YIELD_FROM = -1, FRAME_EXECUTING = 0, FRAME_COMPLETED = 1, FRAME_CLEARED = 4 } PyFrameState; +#define FRAME_STATE_SUSPENDED(S) ((S) == FRAME_SUSPENDED || (S) == FRAME_SUSPENDED_YIELD_FROM) +#define FRAME_STATE_FINISHED(S) ((S) >= FRAME_COMPLETED) + enum _frameowner { FRAME_OWNED_BY_THREAD = 0, FRAME_OWNED_BY_GENERATOR = 1, @@ -47,46 +59,41 @@ enum _frameowner { }; typedef struct _PyInterpreterFrame { - PyCodeObject *f_code; /* Strong reference */ + PyObject *f_executable; /* Strong reference (code object or None) */ struct _PyInterpreterFrame *previous; PyObject *f_funcobj; /* Strong reference. Only valid if not on C stack */ PyObject *f_globals; /* Borrowed reference. Only valid if not on C stack */ PyObject *f_builtins; /* Borrowed reference. Only valid if not on C stack */ PyObject *f_locals; /* Strong reference, may be NULL. Only valid if not on C stack */ PyFrameObject *frame_obj; /* Strong reference, may be NULL. Only valid if not on C stack */ - // NOTE: This is not necessarily the last instruction started in the given - // frame. Rather, it is the code unit *prior to* the *next* instruction. For - // example, it may be an inline CACHE entry, an instruction we just jumped - // over, or (in the case of a newly-created frame) a totally invalid value: - _Py_CODEUNIT *prev_instr; + _Py_CODEUNIT *instr_ptr; /* Instruction currently executing (or about to begin) */ int stacktop; /* Offset of TOS from localsplus */ - /* The return_offset determines where a `RETURN` should go in the caller, - * relative to `prev_instr`. - * It is only meaningful to the callee, - * so it needs to be set in any CALL (to a Python function) - * or SEND (to a coroutine or generator). - * If there is no callee, then it is meaningless. */ - uint16_t return_offset; + uint16_t return_offset; /* Only relevant during a function call */ char owner; /* Locals and stack */ PyObject *localsplus[1]; } _PyInterpreterFrame; #define _PyInterpreterFrame_LASTI(IF) \ - ((int)((IF)->prev_instr - _PyCode_CODE((IF)->f_code))) + ((int)((IF)->instr_ptr - _PyCode_CODE(_PyFrame_GetCode(IF)))) + +static inline PyCodeObject *_PyFrame_GetCode(_PyInterpreterFrame *f) { + assert(PyCode_Check(f->f_executable)); + return (PyCodeObject *)f->f_executable; +} static inline PyObject **_PyFrame_Stackbase(_PyInterpreterFrame *f) { - return f->localsplus + f->f_code->co_nlocalsplus; + return f->localsplus + _PyFrame_GetCode(f)->co_nlocalsplus; } static inline PyObject *_PyFrame_StackPeek(_PyInterpreterFrame *f) { - assert(f->stacktop > f->f_code->co_nlocalsplus); + assert(f->stacktop > _PyFrame_GetCode(f)->co_nlocalsplus); assert(f->localsplus[f->stacktop-1] != NULL); return f->localsplus[f->stacktop-1]; } static inline PyObject *_PyFrame_StackPop(_PyInterpreterFrame *f) { - assert(f->stacktop > f->f_code->co_nlocalsplus); + assert(f->stacktop > _PyFrame_GetCode(f)->co_nlocalsplus); f->stacktop--; return f->localsplus[f->stacktop]; } @@ -107,7 +114,17 @@ _PyFrame_NumSlotsForCodeObject(PyCodeObject *code) return code->co_framesize - FRAME_SPECIALS_SIZE; } -void _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest); +static inline void _PyFrame_Copy(_PyInterpreterFrame *src, _PyInterpreterFrame *dest) +{ + assert(src->stacktop >= _PyFrame_GetCode(src)->co_nlocalsplus); + *dest = *src; + for (int i = 1; i < src->stacktop; i++) { + dest->localsplus[i] = src->localsplus[i]; + } + // Don't leave a dangling pointer to the old frame when creating generators + // and coroutines: + dest->previous = NULL; +} /* Consumes reference to func and locals. Does not initialize frame->previous, which happens @@ -119,13 +136,13 @@ _PyFrame_Initialize( PyObject *locals, PyCodeObject *code, int null_locals_from) { frame->f_funcobj = (PyObject *)func; - frame->f_code = (PyCodeObject *)Py_NewRef(code); + frame->f_executable = Py_NewRef(code); frame->f_builtins = func->func_builtins; frame->f_globals = func->func_globals; frame->f_locals = locals; frame->stacktop = code->co_nlocalsplus; frame->frame_obj = NULL; - frame->prev_instr = _PyCode_CODE(code) - 1; + frame->instr_ptr = _PyCode_CODE(code); frame->return_offset = 0; frame->owner = FRAME_OWNED_BY_THREAD; @@ -172,8 +189,11 @@ _PyFrame_SetStackPointer(_PyInterpreterFrame *frame, PyObject **stack_pointer) static inline bool _PyFrame_IsIncomplete(_PyInterpreterFrame *frame) { + if (frame->owner == FRAME_OWNED_BY_CSTACK) { + return true; + } return frame->owner != FRAME_OWNED_BY_GENERATOR && - frame->prev_instr < _PyCode_CODE(frame->f_code) + frame->f_code->_co_firsttraceable; + frame->instr_ptr < _PyCode_CODE(_PyFrame_GetCode(frame)) + _PyFrame_GetCode(frame)->_co_firsttraceable; } static inline _PyInterpreterFrame * @@ -188,7 +208,7 @@ _PyFrame_GetFirstComplete(_PyInterpreterFrame *frame) static inline _PyInterpreterFrame * _PyThreadState_GetFrame(PyThreadState *tstate) { - return _PyFrame_GetFirstComplete(tstate->cframe->current_frame); + return _PyFrame_GetFirstComplete(tstate->current_frame); } /* For use by _PyFrame_GetFrameObject @@ -198,7 +218,7 @@ _PyFrame_MakeAndSetFrameObject(_PyInterpreterFrame *frame); /* Gets the PyFrameObject for this frame, lazily * creating it if necessary. - * Returns a borrowed referennce */ + * Returns a borrowed reference */ static inline PyFrameObject * _PyFrame_GetFrameObject(_PyInterpreterFrame *frame) { @@ -211,6 +231,9 @@ _PyFrame_GetFrameObject(_PyInterpreterFrame *frame) return _PyFrame_MakeAndSetFrameObject(frame); } +void +_PyFrame_ClearLocals(_PyInterpreterFrame *frame); + /* Clears all references in the frame. * If take is non-zero, then the _PyInterpreterFrame frame * may be transferred to the frame object it references @@ -226,14 +249,11 @@ _PyFrame_ClearExceptCode(_PyInterpreterFrame * frame); int _PyFrame_Traverse(_PyInterpreterFrame *frame, visitproc visit, void *arg); -PyObject * -_PyFrame_GetLocals(_PyInterpreterFrame *frame, int include_hidden); +bool +_PyFrame_HasHiddenLocals(_PyInterpreterFrame *frame); -int -_PyFrame_FastToLocalsWithError(_PyInterpreterFrame *frame); - -void -_PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear); +PyObject * +_PyFrame_GetLocals(_PyInterpreterFrame *frame); static inline bool _PyThreadState_HasStackSpace(PyThreadState *tstate, int size) @@ -250,7 +270,7 @@ _PyThreadState_HasStackSpace(PyThreadState *tstate, int size) extern _PyInterpreterFrame * _PyThreadState_PushFrame(PyThreadState *tstate, size_t size); -void _PyThreadState_PopFrame(PyThreadState *tstate, _PyInterpreterFrame *frame); +PyAPI_FUNC(void) _PyThreadState_PopFrame(PyThreadState *tstate, _PyInterpreterFrame *frame); /* Pushes a frame without checking for space. * Must be guarded by _PyThreadState_HasStackSpace() @@ -267,6 +287,30 @@ _PyFrame_PushUnchecked(PyThreadState *tstate, PyFunctionObject *func, int null_l return new_frame; } +/* Pushes a trampoline frame without checking for space. + * Must be guarded by _PyThreadState_HasStackSpace() */ +static inline _PyInterpreterFrame * +_PyFrame_PushTrampolineUnchecked(PyThreadState *tstate, PyCodeObject *code, int stackdepth) +{ + CALL_STAT_INC(frames_pushed); + _PyInterpreterFrame *frame = (_PyInterpreterFrame *)tstate->datastack_top; + tstate->datastack_top += code->co_framesize; + assert(tstate->datastack_top < tstate->datastack_limit); + frame->f_funcobj = Py_None; + frame->f_executable = Py_NewRef(code); +#ifdef Py_DEBUG + frame->f_builtins = NULL; + frame->f_globals = NULL; +#endif + frame->f_locals = NULL; + frame->stacktop = code->co_nlocalsplus + stackdepth; + frame->frame_obj = NULL; + frame->instr_ptr = _PyCode_CODE(code); + frame->owner = FRAME_OWNED_BY_THREAD; + frame->return_offset = 0; + return frame; +} + static inline PyGenObject *_PyFrame_GetGenerator(_PyInterpreterFrame *frame) { @@ -275,6 +319,11 @@ PyGenObject *_PyFrame_GetGenerator(_PyInterpreterFrame *frame) return (PyGenObject *)(((char *)frame) - offset_in_gen); } +PyAPI_FUNC(_PyInterpreterFrame *) +_PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func, + PyObject *locals, PyObject* const* args, + size_t argcount, PyObject *kwnames); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_freelist.h b/Include/internal/pycore_freelist.h new file mode 100644 index 00000000..e684e084 --- /dev/null +++ b/Include/internal/pycore_freelist.h @@ -0,0 +1,153 @@ +#ifndef Py_INTERNAL_FREELIST_H +#define Py_INTERNAL_FREELIST_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// PyTuple_MAXSAVESIZE - largest tuple to save on free list +// PyTuple_MAXFREELIST - maximum number of tuples of each size to save + +#ifdef WITH_FREELISTS +// with freelists +# define PyTuple_MAXSAVESIZE 20 +# define PyTuple_NFREELISTS PyTuple_MAXSAVESIZE +# define PyTuple_MAXFREELIST 2000 +# define PyList_MAXFREELIST 80 +# define PyDict_MAXFREELIST 80 +# define PyFloat_MAXFREELIST 100 +# define PyContext_MAXFREELIST 255 +# define _PyAsyncGen_MAXFREELIST 80 +# define _PyObjectStackChunk_MAXFREELIST 4 +#else +# define PyTuple_NFREELISTS 0 +# define PyTuple_MAXFREELIST 0 +# define PyList_MAXFREELIST 0 +# define PyDict_MAXFREELIST 0 +# define PyFloat_MAXFREELIST 0 +# define PyContext_MAXFREELIST 0 +# define _PyAsyncGen_MAXFREELIST 0 +# define _PyObjectStackChunk_MAXFREELIST 0 +#endif + +struct _Py_list_freelist { +#ifdef WITH_FREELISTS + PyListObject *items[PyList_MAXFREELIST]; + int numfree; +#endif +}; + +struct _Py_tuple_freelist { +#if WITH_FREELISTS + /* There is one freelist for each size from 1 to PyTuple_MAXSAVESIZE. + The empty tuple is handled separately. + + Each tuple stored in the array is the head of the linked list + (and the next available tuple) for that size. The actual tuple + object is used as the linked list node, with its first item + (ob_item[0]) pointing to the next node (i.e. the previous head). + Each linked list is initially NULL. */ + PyTupleObject *items[PyTuple_NFREELISTS]; + int numfree[PyTuple_NFREELISTS]; +#else + char _unused; // Empty structs are not allowed. +#endif +}; + +struct _Py_float_freelist { +#ifdef WITH_FREELISTS + /* Special free list + free_list is a singly-linked list of available PyFloatObjects, + linked via abuse of their ob_type members. */ + int numfree; + PyFloatObject *items; +#endif +}; + +struct _Py_dict_freelist { +#ifdef WITH_FREELISTS + /* Dictionary reuse scheme to save calls to malloc and free */ + PyDictObject *items[PyDict_MAXFREELIST]; + int numfree; +#endif +}; + +struct _Py_dictkeys_freelist { +#ifdef WITH_FREELISTS + /* Dictionary keys reuse scheme to save calls to malloc and free */ + PyDictKeysObject *items[PyDict_MAXFREELIST]; + int numfree; +#endif +}; + +struct _Py_slice_freelist { +#ifdef WITH_FREELISTS + /* Using a cache is very effective since typically only a single slice is + created and then deleted again. */ + PySliceObject *slice_cache; +#endif +}; + +struct _Py_context_freelist { +#ifdef WITH_FREELISTS + // List of free PyContext objects + PyContext *items; + int numfree; +#endif +}; + +struct _Py_async_gen_freelist { +#ifdef WITH_FREELISTS + /* Freelists boost performance 6-10%; they also reduce memory + fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend + are short-living objects that are instantiated for every + __anext__() call. */ + struct _PyAsyncGenWrappedValue* items[_PyAsyncGen_MAXFREELIST]; + int numfree; +#endif +}; + +struct _Py_async_gen_asend_freelist { +#ifdef WITH_FREELISTS + struct PyAsyncGenASend* items[_PyAsyncGen_MAXFREELIST]; + int numfree; +#endif +}; + +struct _PyObjectStackChunk; + +struct _Py_object_stack_freelist { + struct _PyObjectStackChunk *items; + Py_ssize_t numfree; +}; + +struct _Py_object_freelists { + struct _Py_float_freelist floats; + struct _Py_tuple_freelist tuples; + struct _Py_list_freelist lists; + struct _Py_dict_freelist dicts; + struct _Py_dictkeys_freelist dictkeys; + struct _Py_slice_freelist slices; + struct _Py_context_freelist contexts; + struct _Py_async_gen_freelist async_gens; + struct _Py_async_gen_asend_freelist async_gen_asends; + struct _Py_object_stack_freelist object_stacks; +}; + +extern void _PyObject_ClearFreeLists(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyTuple_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyFloat_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyList_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PySlice_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyDict_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyAsyncGen_ClearFreeLists(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyContext_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); +extern void _PyObjectStackChunk_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_FREELIST_H */ diff --git a/Include/internal/pycore_function.h b/Include/internal/pycore_function.h index ecbb7001..6d44e933 100644 --- a/Include/internal/pycore_function.h +++ b/Include/internal/pycore_function.h @@ -4,19 +4,48 @@ extern "C" { #endif +#include "pycore_lock.h" + #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif +extern PyObject* _PyFunction_Vectorcall( + PyObject *func, + PyObject *const *stack, + size_t nargsf, + PyObject *kwnames); + #define FUNC_MAX_WATCHERS 8 +#define FUNC_VERSION_CACHE_SIZE (1<<12) /* Must be a power of 2 */ + +struct _func_version_cache_item { + PyFunctionObject *func; + PyObject *code; +}; + struct _py_func_state { +#ifdef Py_GIL_DISABLED + // Protects next_version + PyMutex mutex; +#endif + uint32_t next_version; + // Borrowed references to function and code objects whose + // func_version % FUNC_VERSION_CACHE_SIZE + // once was equal to the index in the table. + // They are cleared when the function or code object is deallocated. + struct _func_version_cache_item func_version_cache[FUNC_VERSION_CACHE_SIZE]; }; extern PyFunctionObject* _PyFunction_FromConstructor(PyFrameConstructor *constr); extern uint32_t _PyFunction_GetVersionForCurrentState(PyFunctionObject *func); +PyAPI_FUNC(void) _PyFunction_SetVersion(PyFunctionObject *func, uint32_t version); +void _PyFunction_ClearCodeByVersion(uint32_t version); +PyFunctionObject *_PyFunction_LookupByVersion(uint32_t version, PyObject **p_code); + extern PyObject *_Py_set_function_type_params( PyThreadState* unused, PyObject *func, PyObject *type_params); diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index b3abe203..357177bc 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -8,6 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_freelist.h" // _PyFreeListState + /* GC information is stored BEFORE the object structure. */ typedef struct { // Pointer to next object in the list. @@ -19,15 +21,73 @@ typedef struct { uintptr_t _gc_prev; } PyGC_Head; +#define _PyGC_Head_UNUSED PyGC_Head + + +/* Get an object's GC head */ static inline PyGC_Head* _Py_AS_GC(PyObject *op) { - return (_Py_CAST(PyGC_Head*, op) - 1); + char *gc = ((char*)op) - sizeof(PyGC_Head); + return (PyGC_Head*)gc; +} + +/* Get the object given the GC head */ +static inline PyObject* _Py_FROM_GC(PyGC_Head *gc) { + char *op = ((char *)gc) + sizeof(PyGC_Head); + return (PyObject *)op; } -#define _PyGC_Head_UNUSED PyGC_Head + + +/* Bit flags for ob_gc_bits (in Py_GIL_DISABLED builds) + * + * Setting the bits requires a relaxed store. The per-object lock must also be + * held, except when the object is only visible to a single thread (e.g. during + * object initialization or destruction). + * + * Reading the bits requires using a relaxed load, but does not require holding + * the per-object lock. + */ +#ifdef Py_GIL_DISABLED +# define _PyGC_BITS_TRACKED (1) // Tracked by the GC +# define _PyGC_BITS_FINALIZED (2) // tp_finalize was called +# define _PyGC_BITS_UNREACHABLE (4) +# define _PyGC_BITS_FROZEN (8) +# define _PyGC_BITS_SHARED (16) +# define _PyGC_BITS_SHARED_INLINE (32) +# define _PyGC_BITS_DEFERRED (64) // Use deferred reference counting +#endif + +#ifdef Py_GIL_DISABLED + +static inline void +_PyObject_SET_GC_BITS(PyObject *op, uint8_t new_bits) +{ + uint8_t bits = _Py_atomic_load_uint8_relaxed(&op->ob_gc_bits); + _Py_atomic_store_uint8_relaxed(&op->ob_gc_bits, bits | new_bits); +} + +static inline int +_PyObject_HAS_GC_BITS(PyObject *op, uint8_t bits) +{ + return (_Py_atomic_load_uint8_relaxed(&op->ob_gc_bits) & bits) != 0; +} + +static inline void +_PyObject_CLEAR_GC_BITS(PyObject *op, uint8_t bits_to_clear) +{ + uint8_t bits = _Py_atomic_load_uint8_relaxed(&op->ob_gc_bits); + _Py_atomic_store_uint8_relaxed(&op->ob_gc_bits, bits & ~bits_to_clear); +} + +#endif /* True if the object is currently tracked by the GC. */ static inline int _PyObject_GC_IS_TRACKED(PyObject *op) { +#ifdef Py_GIL_DISABLED + return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_TRACKED); +#else PyGC_Head *gc = _Py_AS_GC(op); return (gc->_gc_next != 0); +#endif } #define _PyObject_GC_IS_TRACKED(op) _PyObject_GC_IS_TRACKED(_Py_CAST(PyObject*, op)) @@ -43,6 +103,42 @@ static inline int _PyObject_GC_MAY_BE_TRACKED(PyObject *obj) { return 1; } +#ifdef Py_GIL_DISABLED + +/* True if memory the object references is shared between + * multiple threads and needs special purpose when freeing + * those references due to the possibility of in-flight + * lock-free reads occurring. The object is responsible + * for calling _PyMem_FreeDelayed on the referenced + * memory. */ +static inline int _PyObject_GC_IS_SHARED(PyObject *op) { + return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_SHARED); +} +#define _PyObject_GC_IS_SHARED(op) _PyObject_GC_IS_SHARED(_Py_CAST(PyObject*, op)) + +static inline void _PyObject_GC_SET_SHARED(PyObject *op) { + _PyObject_SET_GC_BITS(op, _PyGC_BITS_SHARED); +} +#define _PyObject_GC_SET_SHARED(op) _PyObject_GC_SET_SHARED(_Py_CAST(PyObject*, op)) + +/* True if the memory of the object is shared between multiple + * threads and needs special purpose when freeing due to + * the possibility of in-flight lock-free reads occurring. + * Objects with this bit that are GC objects will automatically + * delay-freed by PyObject_GC_Del. */ +static inline int _PyObject_GC_IS_SHARED_INLINE(PyObject *op) { + return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_SHARED_INLINE); +} +#define _PyObject_GC_IS_SHARED_INLINE(op) \ + _PyObject_GC_IS_SHARED_INLINE(_Py_CAST(PyObject*, op)) + +static inline void _PyObject_GC_SET_SHARED_INLINE(PyObject *op) { + _PyObject_SET_GC_BITS(op, _PyGC_BITS_SHARED_INLINE); +} +#define _PyObject_GC_SET_SHARED_INLINE(op) \ + _PyObject_GC_SET_SHARED_INLINE(_Py_CAST(PyObject*, op)) + +#endif /* Bit flags for _gc_prev */ /* Bit 0 is set when tp_finalize is called */ @@ -53,41 +149,70 @@ static inline int _PyObject_GC_MAY_BE_TRACKED(PyObject *obj) { #define _PyGC_PREV_SHIFT (2) #define _PyGC_PREV_MASK (((uintptr_t) -1) << _PyGC_PREV_SHIFT) +/* set for debugging information */ +#define _PyGC_DEBUG_STATS (1<<0) /* print collection statistics */ +#define _PyGC_DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ +#define _PyGC_DEBUG_UNCOLLECTABLE (1<<2) /* print uncollectable objects */ +#define _PyGC_DEBUG_SAVEALL (1<<5) /* save all garbage in gc.garbage */ +#define _PyGC_DEBUG_LEAK _PyGC_DEBUG_COLLECTABLE | \ + _PyGC_DEBUG_UNCOLLECTABLE | \ + _PyGC_DEBUG_SAVEALL + +typedef enum { + // GC was triggered by heap allocation + _Py_GC_REASON_HEAP, + + // GC was called during shutdown + _Py_GC_REASON_SHUTDOWN, + + // GC was called by gc.collect() or PyGC_Collect() + _Py_GC_REASON_MANUAL +} _PyGC_Reason; + // Lowest bit of _gc_next is used for flags only in GC. // But it is always 0 for normal code. static inline PyGC_Head* _PyGCHead_NEXT(PyGC_Head *gc) { uintptr_t next = gc->_gc_next; - return _Py_CAST(PyGC_Head*, next); + return (PyGC_Head*)next; } static inline void _PyGCHead_SET_NEXT(PyGC_Head *gc, PyGC_Head *next) { - gc->_gc_next = _Py_CAST(uintptr_t, next); + gc->_gc_next = (uintptr_t)next; } // Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. static inline PyGC_Head* _PyGCHead_PREV(PyGC_Head *gc) { uintptr_t prev = (gc->_gc_prev & _PyGC_PREV_MASK); - return _Py_CAST(PyGC_Head*, prev); + return (PyGC_Head*)prev; } static inline void _PyGCHead_SET_PREV(PyGC_Head *gc, PyGC_Head *prev) { - uintptr_t uprev = _Py_CAST(uintptr_t, prev); + uintptr_t uprev = (uintptr_t)prev; assert((uprev & ~_PyGC_PREV_MASK) == 0); gc->_gc_prev = ((gc->_gc_prev & ~_PyGC_PREV_MASK) | uprev); } -static inline int _PyGCHead_FINALIZED(PyGC_Head *gc) { - return ((gc->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0); -} -static inline void _PyGCHead_SET_FINALIZED(PyGC_Head *gc) { - gc->_gc_prev |= _PyGC_PREV_MASK_FINALIZED; -} - static inline int _PyGC_FINALIZED(PyObject *op) { +#ifdef Py_GIL_DISABLED + return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_FINALIZED); +#else PyGC_Head *gc = _Py_AS_GC(op); - return _PyGCHead_FINALIZED(gc); + return ((gc->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0); +#endif } static inline void _PyGC_SET_FINALIZED(PyObject *op) { +#ifdef Py_GIL_DISABLED + _PyObject_SET_GC_BITS(op, _PyGC_BITS_FINALIZED); +#else PyGC_Head *gc = _Py_AS_GC(op); - _PyGCHead_SET_FINALIZED(gc); + gc->_gc_prev |= _PyGC_PREV_MASK_FINALIZED; +#endif +} +static inline void _PyGC_CLEAR_FINALIZED(PyObject *op) { +#ifdef Py_GIL_DISABLED + _PyObject_CLEAR_GC_BITS(op, _PyGC_BITS_FINALIZED); +#else + PyGC_Head *gc = _Py_AS_GC(op); + gc->_gc_prev &= ~_PyGC_PREV_MASK_FINALIZED; +#endif } @@ -176,6 +301,7 @@ struct _gc_runtime_state { PyObject *garbage; /* a list of callbacks to be invoked when collection is performed */ PyObject *callbacks; + /* This is the number of objects that survived the last full collection. It approximates the number of long lived objects tracked by the GC. @@ -187,24 +313,52 @@ struct _gc_runtime_state { collections, and are awaiting to undergo a full collection for the first time. */ Py_ssize_t long_lived_pending; + +#ifdef Py_GIL_DISABLED + /* gh-117783: Deferred reference counting is not fully implemented yet, so + as a temporary measure we treat objects using deferred reference + counting as immortal. The value may be zero, one, or a negative number: + 0: immortalize deferred RC objects once the first thread is created + 1: immortalize all deferred RC objects immediately + <0: suppressed; don't immortalize objects */ + int immortalize; +#endif }; +#ifdef Py_GIL_DISABLED +struct _gc_thread_state { + /* Thread-local allocation count. */ + Py_ssize_t alloc_count; +}; +#endif + extern void _PyGC_InitState(struct _gc_runtime_state *); -extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); +extern Py_ssize_t _PyGC_Collect(PyThreadState *tstate, int generation, + _PyGC_Reason reason); +extern void _PyGC_CollectNoFail(PyThreadState *tstate); +/* Freeze objects tracked by the GC and ignore them in future collections. */ +extern void _PyGC_Freeze(PyInterpreterState *interp); +/* Unfreezes objects placing them in the oldest generation */ +extern void _PyGC_Unfreeze(PyInterpreterState *interp); +/* Number of frozen objects */ +extern Py_ssize_t _PyGC_GetFreezeCount(PyInterpreterState *interp); + +extern PyObject *_PyGC_GetObjects(PyInterpreterState *interp, int generation); +extern PyObject *_PyGC_GetReferrers(PyInterpreterState *interp, PyObject *objs); // Functions to clear types free lists -extern void _PyTuple_ClearFreeList(PyInterpreterState *interp); -extern void _PyFloat_ClearFreeList(PyInterpreterState *interp); -extern void _PyList_ClearFreeList(PyInterpreterState *interp); -extern void _PyDict_ClearFreeList(PyInterpreterState *interp); -extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp); -extern void _PyContext_ClearFreeList(PyInterpreterState *interp); -extern void _Py_ScheduleGC(PyInterpreterState *interp); +extern void _PyGC_ClearAllFreeLists(PyInterpreterState *interp); +extern void _Py_ScheduleGC(PyThreadState *tstate); extern void _Py_RunGC(PyThreadState *tstate); +#ifdef Py_GIL_DISABLED +// gh-117783: Immortalize objects that use deferred reference counting +extern void _PyGC_ImmortalizeDeferredObjects(PyInterpreterState *interp); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_genobject.h b/Include/internal/pycore_genobject.h index dc60b4ca..9463c822 100644 --- a/Include/internal/pycore_genobject.h +++ b/Include/internal/pycore_genobject.h @@ -8,40 +8,23 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -extern PyObject *_PyGen_yf(PyGenObject *); -extern PyObject *_PyCoro_GetAwaitableIter(PyObject *o); -extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *); - -/* runtime lifecycle */ - -extern void _PyAsyncGen_Fini(PyInterpreterState *); - +#include "pycore_freelist.h" -/* other API */ +PyAPI_FUNC(PyObject *)_PyGen_yf(PyGenObject *); +extern void _PyGen_Finalize(PyObject *self); -#ifndef WITH_FREELISTS -// without freelists -# define _PyAsyncGen_MAXFREELIST 0 -#endif +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); -#ifndef _PyAsyncGen_MAXFREELIST -# define _PyAsyncGen_MAXFREELIST 80 -#endif +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); -struct _Py_async_gen_state { -#if _PyAsyncGen_MAXFREELIST > 0 - /* Freelists boost performance 6-10%; they also reduce memory - fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend - are short-living objects that are instantiated for every - __anext__() call. */ - struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST]; - int value_numfree; - - struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST]; - int asend_numfree; -#endif -}; +PyAPI_FUNC(PyObject *)_PyCoro_GetAwaitableIter(PyObject *o); +extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *); +extern PyTypeObject _PyCoroWrapper_Type; +extern PyTypeObject _PyAsyncGenWrappedValue_Type; +extern PyTypeObject _PyAsyncGenAThrow_Type; #ifdef __cplusplus } diff --git a/Include/internal/pycore_gil.h b/Include/internal/pycore_gil.h index 8ebad37b..a2de5077 100644 --- a/Include/internal/pycore_gil.h +++ b/Include/internal/pycore_gil.h @@ -8,8 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" /* _Py_atomic_address */ -#include "pycore_condvar.h" /* PyCOND_T */ +#include "pycore_condvar.h" // PyCOND_T #ifndef Py_HAVE_CONDVAR # error You need either a POSIX-compatible or a Windows system! @@ -21,14 +20,31 @@ extern "C" { #define FORCE_SWITCHING struct _gil_runtime_state { +#ifdef Py_GIL_DISABLED + /* If this GIL is disabled, enabled == 0. + + If this GIL is enabled transiently (most likely to initialize a module + of unknown safety), enabled indicates the number of active transient + requests. + + If this GIL is enabled permanently, enabled == INT_MAX. + + It must not be modified directly; use _PyEval_EnableGILTransiently(), + _PyEval_EnableGILPermanently(), and _PyEval_DisableGIL() + + It is always read and written atomically, but a thread can assume its + value will be stable as long as that thread is attached or knows that no + other threads are attached (e.g., during a stop-the-world.). */ + int enabled; +#endif /* microseconds (the Python API uses seconds, though) */ unsigned long interval; /* Last PyThreadState holding / having held the GIL. This helps us know whether anyone else was scheduled after we dropped the GIL. */ - _Py_atomic_address last_holder; + PyThreadState* last_holder; /* Whether the GIL is already taken (-1 if uninitialized). This is atomic because it can be read without any lock taken in ceval.c. */ - _Py_atomic_int locked; + int locked; /* Number of GIL switches since the beginning. */ unsigned long switch_number; /* This condition variable allows one or several threads to wait diff --git a/Include/internal/pycore_global_objects.h b/Include/internal/pycore_global_objects.h index 5a3fb132..9d376e7d 100644 --- a/Include/internal/pycore_global_objects.h +++ b/Include/internal/pycore_global_objects.h @@ -8,10 +8,11 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_gc.h" // PyGC_Head +#include "pycore_context.h" // _PyContextTokenMissing +#include "pycore_gc.h" // _PyGC_Head_UNUSED #include "pycore_global_strings.h" // struct _Py_global_strings #include "pycore_hamt.h" // PyHamtNode_Bitmap -#include "pycore_context.h" // _PyContextTokenMissing +#include "pycore_hashtable.h" // _Py_hashtable_t #include "pycore_typeobject.h" // pytype_slotdef @@ -28,6 +29,11 @@ extern "C" { #define _Py_SINGLETON(NAME) \ _Py_GLOBAL_OBJECT(singletons.NAME) +struct _Py_cached_objects { + // XXX We could statically allocate the hashtable. + _Py_hashtable_t *interned_strings; +}; + struct _Py_static_objects { struct { /* Small integers are preallocated in this array so that they @@ -61,7 +67,7 @@ struct _Py_interp_cached_objects { PyObject *interned_strings; /* AST */ - PyObject *str_replace_inf; + PyObject *_unused_str_replace_inf; // kept in 3.13 for ABI compatibility /* object.__reduce__ */ PyObject *objreduce; diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 439f47a2..cd56ffde 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -547,25 +547,21 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_lambda)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_listcomp)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_module)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_null)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_setcomp)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_string)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_unknown)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(close_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_close_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_open_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_percent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(defaults)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dot)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dot_locals)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(empty)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(generic_base)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(json_decoder)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(kwdefaults)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(list_err)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(newline)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(open_br)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(percent)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(shim_name)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(str_replace_inf)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(type_params)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(utf_8)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(CANCELLED)); @@ -577,7 +573,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(TextIOWrapper)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(True)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(WarningMessage)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_WindowsConsoleIO)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__IOBase_closed)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abc_tpflags__)); @@ -592,7 +587,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__anext__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__annotations__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__args__)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__asyncio_running_event_loop__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__await__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__bases__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__bool__)); @@ -624,6 +618,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__eq__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__exit__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__file__)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__firstlineno__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__float__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__floordiv__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__format__)); @@ -669,6 +664,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__lshift__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__lt__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__main__)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__match_args__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__matmul__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__missing__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__mod__)); @@ -723,6 +719,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__slotnames__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__slots__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__spec__)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__static_attributes__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__str__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__sub__)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__subclasscheck__)); @@ -741,6 +738,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_abc_impl)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_abstract_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_active)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_align_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_annotation)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_anonymous_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_argtypes_)); @@ -751,6 +749,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_check_retval_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_dealloc_warn)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_feature_version)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_field_types)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_fields_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_finalizing)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_find_and_load)); @@ -766,26 +765,29 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_lock_unlock_module)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_loop)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_needs_com_addref_)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_only_immortal)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_pack_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_restype_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_showwarnmsg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_shutdown)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_slotnames)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_strptime)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_strptime_datetime)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_swappedbytes_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_type_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_uninitialized_submodules)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_warn_unawaited_coroutine)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_xoptions)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(a)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(abs_tol)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(access)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(aclose)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(add)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(add_done_callback)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(after_in_child)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(after_in_parent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(aggregate_class)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(alias)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(allow_code)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(append)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(arg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(argdefs)); @@ -793,11 +795,12 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(arguments)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(argv)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(as_integer_ratio)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(asend)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ast)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(athrow)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(attribute)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(authorizer_callback)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(autocommit)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(b)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(backtick)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(base)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(before)); @@ -815,16 +818,17 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(byteorder)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(bytes)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(bytes_per_sep)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_call)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_exception)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_return)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cached_datetime_module)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cached_statements)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cadata)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cafile)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(call)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(call_exception_handler)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(call_soon)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(callback)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cancel)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(capath)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(category)); @@ -855,6 +859,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(co_stacksize)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(co_varnames)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(code)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(col_offset)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(command)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(comment_factory)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(compile_mode)); @@ -868,15 +873,16 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(count)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(covariant)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cwd)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(d)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(data)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(database)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(day)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(decode)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(decoder)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(default)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(defaultaction)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(delete)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(depth)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(desired_access)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(detect_types)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(deterministic)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(device)); @@ -895,14 +901,13 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dont_inherit)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dst)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dst_dir_fd)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(duration)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(e)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(eager_start)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(effective_ids)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(element_factory)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(encode)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(encoding)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(end)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(end_col_offset)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(end_lineno)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(end_offset)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(endpos)); @@ -934,15 +939,16 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fileno)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(filepath)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fillvalue)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(filter)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(filters)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(final)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(find_class)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fix_imports)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(flags)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(flush)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fold)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(follow_symlinks)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(format)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(frequency)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(from_param)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fromlist)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fromtimestamp)); @@ -964,13 +970,16 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(groupindex)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(groups)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(handle)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(handle_seq)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(has_location)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(hash_name)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(header)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(headers)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(hi)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(hook)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(id)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(hour)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ident)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(identity_hint)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ignore)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(imag)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(importlib)); @@ -979,9 +988,12 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(indexgroup)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(inf)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(infer_variance)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(inherit_handle)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(inheritable)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initial)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initial_bytes)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initial_owner)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initial_state)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initial_value)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(initval)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(inner_size)); @@ -991,6 +1003,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(instructions)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(intern)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(intersection)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(interval)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(is_running)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(isatty)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(isinstance)); @@ -1012,6 +1025,8 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(kw)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(kw1)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(kw2)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(kwdefaults)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(label)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(lambda)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(last)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(last_exc)); @@ -1035,11 +1050,13 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(locals)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(logoption)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(loop)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(manual_reset)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mapping)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(match)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(max_length)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxdigits)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxevents)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxlen)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxmem)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxsplit)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(maxvalue)); @@ -1049,15 +1066,19 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(metaclass)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(metadata)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(method)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(microsecond)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(milliseconds)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(minute)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mod)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mode)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(module)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(module_globals)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(modules)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(month)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mro)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(msg)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mutex)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mycmp)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_arg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_fields)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_sequence_fields)); @@ -1068,6 +1089,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(namespaces)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(narg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ndigits)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(nested)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(new_file_name)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(new_limit)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(newline)); @@ -1102,7 +1124,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(outgoing)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(overlapped)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(owner)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(p)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(pages)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(parent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(password)); @@ -1130,7 +1151,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ps2)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(query)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(quotetabs)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(r)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(raw)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(read)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(read1)); @@ -1154,10 +1174,11 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(return)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(reverse)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(reversed)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(s)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(salt)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sched_priority)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(scheduler)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(second)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(security_attributes)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(seek)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(seekable)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(selectors)); @@ -1183,9 +1204,9 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sleep)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sock)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sort)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sound)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(source)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(source_traceback)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(spam)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(src)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(src_dir_fd)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(stacklevel)); @@ -1235,6 +1256,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(type)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(type_params)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(tz)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(tzinfo)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(tzname)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(uid)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(unlink)); @@ -1245,6 +1267,8 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(values)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(version)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(volume)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(wait_all)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(warn_on_full_buffer)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(warnings)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(warnoptions)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(wbits)); @@ -1256,7 +1280,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(writable)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(write)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(write_through)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(x)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(year)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(zdict)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_SINGLETON(strings).ascii[0]); diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 0c84999c..cad2d1a8 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -33,25 +33,21 @@ struct _Py_global_strings { STRUCT_FOR_STR(anon_lambda, "") STRUCT_FOR_STR(anon_listcomp, "") STRUCT_FOR_STR(anon_module, "") + STRUCT_FOR_STR(anon_null, "") STRUCT_FOR_STR(anon_setcomp, "") STRUCT_FOR_STR(anon_string, "") STRUCT_FOR_STR(anon_unknown, "") - STRUCT_FOR_STR(close_br, "}") STRUCT_FOR_STR(dbl_close_br, "}}") STRUCT_FOR_STR(dbl_open_br, "{{") STRUCT_FOR_STR(dbl_percent, "%%") STRUCT_FOR_STR(defaults, ".defaults") - STRUCT_FOR_STR(dot, ".") STRUCT_FOR_STR(dot_locals, ".") STRUCT_FOR_STR(empty, "") STRUCT_FOR_STR(generic_base, ".generic_base") STRUCT_FOR_STR(json_decoder, "json.decoder") STRUCT_FOR_STR(kwdefaults, ".kwdefaults") STRUCT_FOR_STR(list_err, "list index out of range") - STRUCT_FOR_STR(newline, "\n") - STRUCT_FOR_STR(open_br, "{") - STRUCT_FOR_STR(percent, "%") - STRUCT_FOR_STR(shim_name, "") + STRUCT_FOR_STR(str_replace_inf, "1e309") STRUCT_FOR_STR(type_params, ".type_params") STRUCT_FOR_STR(utf_8, "utf-8") } literals; @@ -66,7 +62,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(TextIOWrapper) STRUCT_FOR_ID(True) STRUCT_FOR_ID(WarningMessage) - STRUCT_FOR_ID(_) STRUCT_FOR_ID(_WindowsConsoleIO) STRUCT_FOR_ID(__IOBase_closed) STRUCT_FOR_ID(__abc_tpflags__) @@ -81,7 +76,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(__anext__) STRUCT_FOR_ID(__annotations__) STRUCT_FOR_ID(__args__) - STRUCT_FOR_ID(__asyncio_running_event_loop__) STRUCT_FOR_ID(__await__) STRUCT_FOR_ID(__bases__) STRUCT_FOR_ID(__bool__) @@ -113,6 +107,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(__eq__) STRUCT_FOR_ID(__exit__) STRUCT_FOR_ID(__file__) + STRUCT_FOR_ID(__firstlineno__) STRUCT_FOR_ID(__float__) STRUCT_FOR_ID(__floordiv__) STRUCT_FOR_ID(__format__) @@ -158,6 +153,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(__lshift__) STRUCT_FOR_ID(__lt__) STRUCT_FOR_ID(__main__) + STRUCT_FOR_ID(__match_args__) STRUCT_FOR_ID(__matmul__) STRUCT_FOR_ID(__missing__) STRUCT_FOR_ID(__mod__) @@ -212,6 +208,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(__slotnames__) STRUCT_FOR_ID(__slots__) STRUCT_FOR_ID(__spec__) + STRUCT_FOR_ID(__static_attributes__) STRUCT_FOR_ID(__str__) STRUCT_FOR_ID(__sub__) STRUCT_FOR_ID(__subclasscheck__) @@ -230,6 +227,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(_abc_impl) STRUCT_FOR_ID(_abstract_) STRUCT_FOR_ID(_active) + STRUCT_FOR_ID(_align_) STRUCT_FOR_ID(_annotation) STRUCT_FOR_ID(_anonymous_) STRUCT_FOR_ID(_argtypes_) @@ -240,6 +238,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(_check_retval_) STRUCT_FOR_ID(_dealloc_warn) STRUCT_FOR_ID(_feature_version) + STRUCT_FOR_ID(_field_types) STRUCT_FOR_ID(_fields_) STRUCT_FOR_ID(_finalizing) STRUCT_FOR_ID(_find_and_load) @@ -255,26 +254,29 @@ struct _Py_global_strings { STRUCT_FOR_ID(_lock_unlock_module) STRUCT_FOR_ID(_loop) STRUCT_FOR_ID(_needs_com_addref_) + STRUCT_FOR_ID(_only_immortal) STRUCT_FOR_ID(_pack_) STRUCT_FOR_ID(_restype_) STRUCT_FOR_ID(_showwarnmsg) STRUCT_FOR_ID(_shutdown) STRUCT_FOR_ID(_slotnames) + STRUCT_FOR_ID(_strptime) STRUCT_FOR_ID(_strptime_datetime) STRUCT_FOR_ID(_swappedbytes_) STRUCT_FOR_ID(_type_) STRUCT_FOR_ID(_uninitialized_submodules) STRUCT_FOR_ID(_warn_unawaited_coroutine) STRUCT_FOR_ID(_xoptions) - STRUCT_FOR_ID(a) STRUCT_FOR_ID(abs_tol) STRUCT_FOR_ID(access) + STRUCT_FOR_ID(aclose) STRUCT_FOR_ID(add) STRUCT_FOR_ID(add_done_callback) STRUCT_FOR_ID(after_in_child) STRUCT_FOR_ID(after_in_parent) STRUCT_FOR_ID(aggregate_class) STRUCT_FOR_ID(alias) + STRUCT_FOR_ID(allow_code) STRUCT_FOR_ID(append) STRUCT_FOR_ID(arg) STRUCT_FOR_ID(argdefs) @@ -282,11 +284,12 @@ struct _Py_global_strings { STRUCT_FOR_ID(arguments) STRUCT_FOR_ID(argv) STRUCT_FOR_ID(as_integer_ratio) + STRUCT_FOR_ID(asend) STRUCT_FOR_ID(ast) + STRUCT_FOR_ID(athrow) STRUCT_FOR_ID(attribute) STRUCT_FOR_ID(authorizer_callback) STRUCT_FOR_ID(autocommit) - STRUCT_FOR_ID(b) STRUCT_FOR_ID(backtick) STRUCT_FOR_ID(base) STRUCT_FOR_ID(before) @@ -304,16 +307,17 @@ struct _Py_global_strings { STRUCT_FOR_ID(byteorder) STRUCT_FOR_ID(bytes) STRUCT_FOR_ID(bytes_per_sep) - STRUCT_FOR_ID(c) STRUCT_FOR_ID(c_call) STRUCT_FOR_ID(c_exception) STRUCT_FOR_ID(c_return) + STRUCT_FOR_ID(cached_datetime_module) STRUCT_FOR_ID(cached_statements) STRUCT_FOR_ID(cadata) STRUCT_FOR_ID(cafile) STRUCT_FOR_ID(call) STRUCT_FOR_ID(call_exception_handler) STRUCT_FOR_ID(call_soon) + STRUCT_FOR_ID(callback) STRUCT_FOR_ID(cancel) STRUCT_FOR_ID(capath) STRUCT_FOR_ID(category) @@ -344,6 +348,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(co_stacksize) STRUCT_FOR_ID(co_varnames) STRUCT_FOR_ID(code) + STRUCT_FOR_ID(col_offset) STRUCT_FOR_ID(command) STRUCT_FOR_ID(comment_factory) STRUCT_FOR_ID(compile_mode) @@ -357,15 +362,16 @@ struct _Py_global_strings { STRUCT_FOR_ID(count) STRUCT_FOR_ID(covariant) STRUCT_FOR_ID(cwd) - STRUCT_FOR_ID(d) STRUCT_FOR_ID(data) STRUCT_FOR_ID(database) + STRUCT_FOR_ID(day) STRUCT_FOR_ID(decode) STRUCT_FOR_ID(decoder) STRUCT_FOR_ID(default) STRUCT_FOR_ID(defaultaction) STRUCT_FOR_ID(delete) STRUCT_FOR_ID(depth) + STRUCT_FOR_ID(desired_access) STRUCT_FOR_ID(detect_types) STRUCT_FOR_ID(deterministic) STRUCT_FOR_ID(device) @@ -384,14 +390,13 @@ struct _Py_global_strings { STRUCT_FOR_ID(dont_inherit) STRUCT_FOR_ID(dst) STRUCT_FOR_ID(dst_dir_fd) - STRUCT_FOR_ID(duration) - STRUCT_FOR_ID(e) STRUCT_FOR_ID(eager_start) STRUCT_FOR_ID(effective_ids) STRUCT_FOR_ID(element_factory) STRUCT_FOR_ID(encode) STRUCT_FOR_ID(encoding) STRUCT_FOR_ID(end) + STRUCT_FOR_ID(end_col_offset) STRUCT_FOR_ID(end_lineno) STRUCT_FOR_ID(end_offset) STRUCT_FOR_ID(endpos) @@ -423,15 +428,16 @@ struct _Py_global_strings { STRUCT_FOR_ID(fileno) STRUCT_FOR_ID(filepath) STRUCT_FOR_ID(fillvalue) + STRUCT_FOR_ID(filter) STRUCT_FOR_ID(filters) STRUCT_FOR_ID(final) STRUCT_FOR_ID(find_class) STRUCT_FOR_ID(fix_imports) STRUCT_FOR_ID(flags) STRUCT_FOR_ID(flush) + STRUCT_FOR_ID(fold) STRUCT_FOR_ID(follow_symlinks) STRUCT_FOR_ID(format) - STRUCT_FOR_ID(frequency) STRUCT_FOR_ID(from_param) STRUCT_FOR_ID(fromlist) STRUCT_FOR_ID(fromtimestamp) @@ -453,13 +459,16 @@ struct _Py_global_strings { STRUCT_FOR_ID(groupindex) STRUCT_FOR_ID(groups) STRUCT_FOR_ID(handle) + STRUCT_FOR_ID(handle_seq) + STRUCT_FOR_ID(has_location) STRUCT_FOR_ID(hash_name) STRUCT_FOR_ID(header) STRUCT_FOR_ID(headers) STRUCT_FOR_ID(hi) STRUCT_FOR_ID(hook) - STRUCT_FOR_ID(id) + STRUCT_FOR_ID(hour) STRUCT_FOR_ID(ident) + STRUCT_FOR_ID(identity_hint) STRUCT_FOR_ID(ignore) STRUCT_FOR_ID(imag) STRUCT_FOR_ID(importlib) @@ -468,9 +477,12 @@ struct _Py_global_strings { STRUCT_FOR_ID(indexgroup) STRUCT_FOR_ID(inf) STRUCT_FOR_ID(infer_variance) + STRUCT_FOR_ID(inherit_handle) STRUCT_FOR_ID(inheritable) STRUCT_FOR_ID(initial) STRUCT_FOR_ID(initial_bytes) + STRUCT_FOR_ID(initial_owner) + STRUCT_FOR_ID(initial_state) STRUCT_FOR_ID(initial_value) STRUCT_FOR_ID(initval) STRUCT_FOR_ID(inner_size) @@ -480,6 +492,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(instructions) STRUCT_FOR_ID(intern) STRUCT_FOR_ID(intersection) + STRUCT_FOR_ID(interval) STRUCT_FOR_ID(is_running) STRUCT_FOR_ID(isatty) STRUCT_FOR_ID(isinstance) @@ -501,6 +514,8 @@ struct _Py_global_strings { STRUCT_FOR_ID(kw) STRUCT_FOR_ID(kw1) STRUCT_FOR_ID(kw2) + STRUCT_FOR_ID(kwdefaults) + STRUCT_FOR_ID(label) STRUCT_FOR_ID(lambda) STRUCT_FOR_ID(last) STRUCT_FOR_ID(last_exc) @@ -524,11 +539,13 @@ struct _Py_global_strings { STRUCT_FOR_ID(locals) STRUCT_FOR_ID(logoption) STRUCT_FOR_ID(loop) + STRUCT_FOR_ID(manual_reset) STRUCT_FOR_ID(mapping) STRUCT_FOR_ID(match) STRUCT_FOR_ID(max_length) STRUCT_FOR_ID(maxdigits) STRUCT_FOR_ID(maxevents) + STRUCT_FOR_ID(maxlen) STRUCT_FOR_ID(maxmem) STRUCT_FOR_ID(maxsplit) STRUCT_FOR_ID(maxvalue) @@ -538,15 +555,19 @@ struct _Py_global_strings { STRUCT_FOR_ID(metaclass) STRUCT_FOR_ID(metadata) STRUCT_FOR_ID(method) + STRUCT_FOR_ID(microsecond) + STRUCT_FOR_ID(milliseconds) + STRUCT_FOR_ID(minute) STRUCT_FOR_ID(mod) STRUCT_FOR_ID(mode) STRUCT_FOR_ID(module) STRUCT_FOR_ID(module_globals) STRUCT_FOR_ID(modules) + STRUCT_FOR_ID(month) STRUCT_FOR_ID(mro) STRUCT_FOR_ID(msg) + STRUCT_FOR_ID(mutex) STRUCT_FOR_ID(mycmp) - STRUCT_FOR_ID(n) STRUCT_FOR_ID(n_arg) STRUCT_FOR_ID(n_fields) STRUCT_FOR_ID(n_sequence_fields) @@ -557,6 +578,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(namespaces) STRUCT_FOR_ID(narg) STRUCT_FOR_ID(ndigits) + STRUCT_FOR_ID(nested) STRUCT_FOR_ID(new_file_name) STRUCT_FOR_ID(new_limit) STRUCT_FOR_ID(newline) @@ -591,7 +613,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(outgoing) STRUCT_FOR_ID(overlapped) STRUCT_FOR_ID(owner) - STRUCT_FOR_ID(p) STRUCT_FOR_ID(pages) STRUCT_FOR_ID(parent) STRUCT_FOR_ID(password) @@ -619,7 +640,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(ps2) STRUCT_FOR_ID(query) STRUCT_FOR_ID(quotetabs) - STRUCT_FOR_ID(r) STRUCT_FOR_ID(raw) STRUCT_FOR_ID(read) STRUCT_FOR_ID(read1) @@ -643,10 +663,11 @@ struct _Py_global_strings { STRUCT_FOR_ID(return) STRUCT_FOR_ID(reverse) STRUCT_FOR_ID(reversed) - STRUCT_FOR_ID(s) STRUCT_FOR_ID(salt) STRUCT_FOR_ID(sched_priority) STRUCT_FOR_ID(scheduler) + STRUCT_FOR_ID(second) + STRUCT_FOR_ID(security_attributes) STRUCT_FOR_ID(seek) STRUCT_FOR_ID(seekable) STRUCT_FOR_ID(selectors) @@ -672,9 +693,9 @@ struct _Py_global_strings { STRUCT_FOR_ID(sleep) STRUCT_FOR_ID(sock) STRUCT_FOR_ID(sort) - STRUCT_FOR_ID(sound) STRUCT_FOR_ID(source) STRUCT_FOR_ID(source_traceback) + STRUCT_FOR_ID(spam) STRUCT_FOR_ID(src) STRUCT_FOR_ID(src_dir_fd) STRUCT_FOR_ID(stacklevel) @@ -724,6 +745,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(type) STRUCT_FOR_ID(type_params) STRUCT_FOR_ID(tz) + STRUCT_FOR_ID(tzinfo) STRUCT_FOR_ID(tzname) STRUCT_FOR_ID(uid) STRUCT_FOR_ID(unlink) @@ -734,6 +756,8 @@ struct _Py_global_strings { STRUCT_FOR_ID(values) STRUCT_FOR_ID(version) STRUCT_FOR_ID(volume) + STRUCT_FOR_ID(wait_all) + STRUCT_FOR_ID(warn_on_full_buffer) STRUCT_FOR_ID(warnings) STRUCT_FOR_ID(warnoptions) STRUCT_FOR_ID(wbits) @@ -745,7 +769,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(writable) STRUCT_FOR_ID(write) STRUCT_FOR_ID(write_through) - STRUCT_FOR_ID(x) STRUCT_FOR_ID(year) STRUCT_FOR_ID(zdict) } identifiers; @@ -768,6 +791,10 @@ struct _Py_global_strings { (_Py_SINGLETON(strings.identifiers._py_ ## NAME._ascii.ob_base)) #define _Py_STR(NAME) \ (_Py_SINGLETON(strings.literals._py_ ## NAME._ascii.ob_base)) +#define _Py_LATIN1_CHR(CH) \ + ((CH) < 128 \ + ? (PyObject*)&_Py_SINGLETON(strings).ascii[(CH)] \ + : (PyObject*)&_Py_SINGLETON(strings).latin1[(CH) - 128]) /* _Py_DECLARE_STR() should precede all uses of _Py_STR() in a function. diff --git a/Include/internal/pycore_hashtable.h b/Include/internal/pycore_hashtable.h index 6501ab14..369d49c4 100644 --- a/Include/internal/pycore_hashtable.h +++ b/Include/internal/pycore_hashtable.h @@ -70,6 +70,11 @@ struct _Py_hashtable_t { _Py_hashtable_allocator_t alloc; }; +// Export _Py_hashtable functions for '_testinternalcapi' shared extension +PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( + _Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func); + /* Hash a pointer (void*) */ PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr(const void *key); @@ -78,10 +83,6 @@ PyAPI_FUNC(int) _Py_hashtable_compare_direct( const void *key1, const void *key2); -PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func); - PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( _Py_hashtable_hash_func hash_func, _Py_hashtable_compare_func compare_func, @@ -106,6 +107,7 @@ PyAPI_FUNC(int) _Py_hashtable_foreach( void *user_data); PyAPI_FUNC(size_t) _Py_hashtable_size(const _Py_hashtable_t *ht); +PyAPI_FUNC(size_t) _Py_hashtable_len(const _Py_hashtable_t *ht); /* Add a new entry to the hash. The key must not be present in the hash table. Return 0 on success, -1 on memory error. */ diff --git a/Include/internal/pycore_identifier.h b/Include/internal/pycore_identifier.h new file mode 100644 index 00000000..cda28810 --- /dev/null +++ b/Include/internal/pycore_identifier.h @@ -0,0 +1,20 @@ +/* String Literals: _Py_Identifier API */ + +#ifndef Py_INTERNAL_IDENTIFIER_H +#define Py_INTERNAL_IDENTIFIER_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +extern PyObject* _PyType_LookupId(PyTypeObject *, _Py_Identifier *); +extern PyObject* _PyObject_LookupSpecialId(PyObject *, _Py_Identifier *); +extern int _PyObject_SetAttrId(PyObject *, _Py_Identifier *, PyObject *); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_IDENTIFIER_H diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h index 376957bd..55029abd 100644 --- a/Include/internal/pycore_import.h +++ b/Include/internal/pycore_import.h @@ -5,8 +5,37 @@ extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_lock.h" // PyMutex #include "pycore_hashtable.h" // _Py_hashtable_t -#include "pycore_time.h" // _PyTime_t + +extern int _PyImport_IsInitialized(PyInterpreterState *); + +// Export for 'pyexpat' shared extension +PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); + +extern int _PyImport_SetModuleString(const char *name, PyObject* module); + +extern void _PyImport_AcquireLock(PyInterpreterState *interp); +extern void _PyImport_ReleaseLock(PyInterpreterState *interp); +extern void _PyImport_ReInitLock(PyInterpreterState *interp); + +// This is used exclusively for the sys and builtins modules: +extern int _PyImport_FixupBuiltin( + PyThreadState *tstate, + PyObject *mod, + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); + +// Export for many shared extensions, like '_json' +PyAPI_FUNC(PyObject*) _PyImport_GetModuleAttr(PyObject *, PyObject *); + +// Export for many shared extensions, like '_datetime' +PyAPI_FUNC(PyObject*) _PyImport_GetModuleAttrString(const char *, const char *); struct _import_runtime_state { @@ -19,12 +48,12 @@ struct _import_runtime_state { Py_ssize_t last_module_index; struct { /* A lock to guard the cache. */ - PyThread_type_lock mutex; + PyMutex mutex; /* The actual cache of (filename, name, PyModuleDef) for modules. Only legacy (single-phase init) extension modules are added and only if they support multiple initialization (m_size >- 0) or are imported in the main interpreter. - This is initialized lazily in _PyImport_FixupExtensionObject(). + This is initialized lazily in fix_up_extension() in import.c. Modules are added there and looked up in _imp.find_extension(). */ _Py_hashtable_t *hashtable; } extensions; @@ -66,21 +95,17 @@ struct _import_state { #endif PyObject *import_func; /* The global import lock. */ - struct { - PyThread_type_lock mutex; - unsigned long thread; - int level; - } lock; + _PyRecursiveMutex lock; /* diagnostic info in PyImport_ImportModuleLevelObject() */ struct { int import_level; - _PyTime_t accumulated; + PyTime_t accumulated; int header; } find_and_load; }; #ifdef HAVE_DLOPEN -# include +# include // RTLD_NOW, RTLD_LAZY # if HAVE_DECL_RTLD_NOW # define _Py_DLOPEN_FLAGS RTLD_NOW # else @@ -95,11 +120,6 @@ struct _import_state { #define IMPORTS_INIT \ { \ DLOPENFLAGS_INIT \ - .lock = { \ - .mutex = NULL, \ - .thread = PYTHREAD_INVALID_THREAD_ID, \ - .level = 0, \ - }, \ .find_and_load = { \ .header = 1, \ }, \ @@ -152,11 +172,6 @@ extern void _PyImport_FiniCore(PyInterpreterState *interp); extern void _PyImport_FiniExternal(PyInterpreterState *interp); -#ifdef HAVE_FORK -extern PyStatus _PyImport_ReInitLock(PyInterpreterState *interp); -#endif - - extern PyObject* _PyImport_GetBuiltinModuleNames(void); struct _module_alias { @@ -164,18 +179,33 @@ struct _module_alias { const char *orig; /* ASCII encoded string */ }; -PyAPI_DATA(const struct _frozen *) _PyImport_FrozenBootstrap; -PyAPI_DATA(const struct _frozen *) _PyImport_FrozenStdlib; -PyAPI_DATA(const struct _frozen *) _PyImport_FrozenTest; +// Export these 3 symbols for test_ctypes +PyAPI_DATA(const struct _frozen*) _PyImport_FrozenBootstrap; +PyAPI_DATA(const struct _frozen*) _PyImport_FrozenStdlib; +PyAPI_DATA(const struct _frozen*) _PyImport_FrozenTest; + extern const struct _module_alias * _PyImport_FrozenAliases; -PyAPI_FUNC(int) _PyImport_CheckSubinterpIncompatibleExtensionAllowed( +extern int _PyImport_CheckSubinterpIncompatibleExtensionAllowed( const char *name); -// for testing +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(int) _PyImport_ClearExtension(PyObject *name, PyObject *filename); +#ifdef Py_GIL_DISABLED +// Assuming that the GIL is enabled from a call to +// _PyEval_EnableGILTransient(), resolve the transient request depending on the +// state of the module argument: +// - If module is NULL or a PyModuleObject with md_gil == Py_MOD_GIL_NOT_USED, +// call _PyEval_DisableGIL(). +// - Otherwise, call _PyEval_EnableGILPermanent(). If the GIL was not already +// enabled permanently, issue a warning referencing the module's name. +// +// This function may raise an exception. +extern int _PyImport_CheckGILForModule(PyObject *module, PyObject *module_name); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_importdl.h b/Include/internal/pycore_importdl.h new file mode 100644 index 00000000..525a16f6 --- /dev/null +++ b/Include/internal/pycore_importdl.h @@ -0,0 +1,139 @@ +#ifndef Py_INTERNAL_IMPORTDL_H +#define Py_INTERNAL_IMPORTDL_H + +#include "patchlevel.h" // PY_MAJOR_VERSION + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +extern const char *_PyImport_DynLoadFiletab[]; + + +typedef enum ext_module_kind { + _Py_ext_module_kind_UNKNOWN = 0, + _Py_ext_module_kind_SINGLEPHASE = 1, + _Py_ext_module_kind_MULTIPHASE = 2, + _Py_ext_module_kind_INVALID = 3, +} _Py_ext_module_kind; + +typedef enum ext_module_origin { + _Py_ext_module_origin_CORE = 1, + _Py_ext_module_origin_BUILTIN = 2, + _Py_ext_module_origin_DYNAMIC = 3, +} _Py_ext_module_origin; + +/* Input for loading an extension module. */ +struct _Py_ext_module_loader_info { + PyObject *filename; +#ifndef MS_WINDOWS + PyObject *filename_encoded; +#endif + PyObject *name; + PyObject *name_encoded; + /* path is always a borrowed ref of name or filename, + * depending on if it's builtin or not. */ + PyObject *path; + _Py_ext_module_origin origin; + const char *hook_prefix; + const char *newcontext; +}; +extern void _Py_ext_module_loader_info_clear( + struct _Py_ext_module_loader_info *info); +extern int _Py_ext_module_loader_info_init( + struct _Py_ext_module_loader_info *info, + PyObject *name, + PyObject *filename, + _Py_ext_module_origin origin); +extern int _Py_ext_module_loader_info_init_for_core( + struct _Py_ext_module_loader_info *p_info, + PyObject *name); +extern int _Py_ext_module_loader_info_init_for_builtin( + struct _Py_ext_module_loader_info *p_info, + PyObject *name); +#ifdef HAVE_DYNAMIC_LOADING +extern int _Py_ext_module_loader_info_init_from_spec( + struct _Py_ext_module_loader_info *info, + PyObject *spec); +#endif + +/* The result from running an extension module's init function. */ +struct _Py_ext_module_loader_result { + PyModuleDef *def; + PyObject *module; + _Py_ext_module_kind kind; + struct _Py_ext_module_loader_result_error *err; + struct _Py_ext_module_loader_result_error { + enum _Py_ext_module_loader_result_error_kind { + _Py_ext_module_loader_result_EXCEPTION = 0, + _Py_ext_module_loader_result_ERR_MISSING = 1, + _Py_ext_module_loader_result_ERR_UNREPORTED_EXC = 2, + _Py_ext_module_loader_result_ERR_UNINITIALIZED = 3, + _Py_ext_module_loader_result_ERR_NONASCII_NOT_MULTIPHASE = 4, + _Py_ext_module_loader_result_ERR_NOT_MODULE = 5, + _Py_ext_module_loader_result_ERR_MISSING_DEF = 6, + } kind; + PyObject *exc; + } _err; +}; +extern void _Py_ext_module_loader_result_clear( + struct _Py_ext_module_loader_result *res); +extern void _Py_ext_module_loader_result_apply_error( + struct _Py_ext_module_loader_result *res, + const char *name); + +/* The module init function. */ +typedef PyObject *(*PyModInitFunction)(void); +#ifdef HAVE_DYNAMIC_LOADING +extern PyModInitFunction _PyImport_GetModInitFunc( + struct _Py_ext_module_loader_info *info, + FILE *fp); +#endif +extern int _PyImport_RunModInitFunc( + PyModInitFunction p0, + struct _Py_ext_module_loader_info *info, + struct _Py_ext_module_loader_result *p_res); + + +/* Max length of module suffix searched for -- accommodates "module.slb" */ +#define MAXSUFFIXSIZE 12 + +#ifdef MS_WINDOWS +#include +typedef FARPROC dl_funcptr; + +#ifdef _DEBUG +# define PYD_DEBUG_SUFFIX "_d" +#else +# define PYD_DEBUG_SUFFIX "" +#endif + +#ifdef Py_GIL_DISABLED +# define PYD_THREADING_TAG "t" +#else +# define PYD_THREADING_TAG "" +#endif + +#ifdef PYD_PLATFORM_TAG +# define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG "-" PYD_PLATFORM_TAG +#else +# define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG +#endif + +#define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX "." PYD_SOABI ".pyd" +#define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd" + +#else +typedef void (*dl_funcptr)(void); +#endif + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_IMPORTDL_H */ diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 4cbd14a6..1c681613 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -22,7 +22,7 @@ struct pyruntimestate; #endif #define _PyStatus_OK() \ - (PyStatus){._type = _PyStatus_TYPE_OK,} + (PyStatus){._type = _PyStatus_TYPE_OK} /* other fields are set to 0 */ #define _PyStatus_ERR(ERR_MSG) \ (PyStatus){ \ @@ -30,7 +30,8 @@ struct pyruntimestate; .func = _PyStatus_GET_FUNC(), \ .err_msg = (ERR_MSG)} /* other fields are set to 0 */ -#define _PyStatus_NO_MEMORY() _PyStatus_ERR("memory allocation failed") +#define _PyStatus_NO_MEMORY_ERRMSG "memory allocation failed" +#define _PyStatus_NO_MEMORY() _PyStatus_ERR(_PyStatus_NO_MEMORY_ERRMSG) #define _PyStatus_EXIT(EXITCODE) \ (PyStatus){ \ ._type = _PyStatus_TYPE_EXIT, \ @@ -44,19 +45,23 @@ struct pyruntimestate; #define _PyStatus_UPDATE_FUNC(err) \ do { (err).func = _PyStatus_GET_FUNC(); } while (0) +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(void) _PyErr_SetFromPyStatus(PyStatus status); + + /* --- PyWideStringList ------------------------------------------------ */ #define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL} #ifndef NDEBUG -PyAPI_FUNC(int) _PyWideStringList_CheckConsistency(const PyWideStringList *list); +extern int _PyWideStringList_CheckConsistency(const PyWideStringList *list); #endif -PyAPI_FUNC(void) _PyWideStringList_Clear(PyWideStringList *list); -PyAPI_FUNC(int) _PyWideStringList_Copy(PyWideStringList *list, +extern void _PyWideStringList_Clear(PyWideStringList *list); +extern int _PyWideStringList_Copy(PyWideStringList *list, const PyWideStringList *list2); -PyAPI_FUNC(PyStatus) _PyWideStringList_Extend(PyWideStringList *list, +extern PyStatus _PyWideStringList_Extend(PyWideStringList *list, const PyWideStringList *list2); -PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list); +extern PyObject* _PyWideStringList_AsList(const PyWideStringList *list); /* --- _PyArgv ---------------------------------------------------- */ @@ -68,28 +73,28 @@ typedef struct _PyArgv { wchar_t * const *wchar_argv; } _PyArgv; -PyAPI_FUNC(PyStatus) _PyArgv_AsWstrList(const _PyArgv *args, +extern PyStatus _PyArgv_AsWstrList(const _PyArgv *args, PyWideStringList *list); /* --- Helper functions ------------------------------------------- */ -PyAPI_FUNC(int) _Py_str_to_int( +extern int _Py_str_to_int( const char *str, int *result); -PyAPI_FUNC(const wchar_t*) _Py_get_xoption( +extern const wchar_t* _Py_get_xoption( const PyWideStringList *xoptions, const wchar_t *name); -PyAPI_FUNC(const char*) _Py_GetEnv( +extern const char* _Py_GetEnv( int use_environment, const char *name); -PyAPI_FUNC(void) _Py_get_env_flag( +extern void _Py_get_env_flag( int use_environment, int *flag, const char *name); /* Py_GetArgcArgv() helper */ -PyAPI_FUNC(void) _Py_ClearArgcArgv(void); +extern void _Py_ClearArgcArgv(void); /* --- _PyPreCmdline ------------------------------------------------- */ @@ -122,7 +127,9 @@ extern PyStatus _PyPreCmdline_Read(_PyPreCmdline *cmdline, /* --- PyPreConfig ----------------------------------------------- */ +// Export for '_testembed' program PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(PyPreConfig *preconfig); + extern void _PyPreConfig_InitFromConfig( PyPreConfig *preconfig, const PyConfig *config); @@ -146,7 +153,21 @@ typedef enum { _PyConfig_INIT_ISOLATED = 3 } _PyConfigInitEnum; +typedef enum { + /* For now, this means the GIL is enabled. + + gh-116329: This will eventually change to "the GIL is disabled but can + be reenabled by loading an incompatible extension module." */ + _PyConfig_GIL_DEFAULT = -1, + + /* The GIL has been forced off or on, and will not be affected by module loading. */ + _PyConfig_GIL_DISABLE = 0, + _PyConfig_GIL_ENABLE = 1, +} _PyConfigGILEnum; + +// Export for '_testembed' program PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); + extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); @@ -161,16 +182,16 @@ extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); -PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config); -PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict); extern void _Py_DumpPathConfig(PyThreadState *tstate); -PyAPI_FUNC(PyObject*) _Py_Get_Getpath_CodeObject(void); - /* --- Function used for testing ---------------------------------- */ +// Export these functions for '_testinternalcapi' shared extension +PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config); +PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict); +PyAPI_FUNC(PyObject*) _Py_Get_Getpath_CodeObject(void); PyAPI_FUNC(PyObject*) _Py_GetConfigsAsDict(void); #ifdef __cplusplus diff --git a/Include/internal/pycore_instruction_sequence.h b/Include/internal/pycore_instruction_sequence.h new file mode 100644 index 00000000..d6a79616 --- /dev/null +++ b/Include/internal/pycore_instruction_sequence.h @@ -0,0 +1,73 @@ +#ifndef Py_INTERNAL_INSTRUCTION_SEQUENCE_H +#define Py_INTERNAL_INSTRUCTION_SEQUENCE_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_symtable.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef struct { + int h_label; + int h_startdepth; + int h_preserve_lasti; +} _PyExceptHandlerInfo; + +typedef struct { + int i_opcode; + int i_oparg; + _Py_SourceLocation i_loc; + _PyExceptHandlerInfo i_except_handler_info; + + /* Temporary fields, used by the assembler and in instr_sequence_to_cfg */ + int i_target; + int i_offset; +} _PyInstruction; + +typedef struct instruction_sequence { + PyObject_HEAD + _PyInstruction *s_instrs; + int s_allocated; + int s_used; + + int s_next_free_label; /* next free label id */ + + /* Map of a label id to instruction offset (index into s_instrs). + * If s_labelmap is NULL, then each label id is the offset itself. + */ + int *s_labelmap; + int s_labelmap_size; + + /* PyList of instruction sequences of nested functions */ + PyObject *s_nested; +} _PyInstructionSequence; + +typedef struct { + int id; +} _PyJumpTargetLabel; + +PyAPI_FUNC(PyObject*)_PyInstructionSequence_New(void); + +int _PyInstructionSequence_UseLabel(_PyInstructionSequence *seq, int lbl); +int _PyInstructionSequence_Addop(_PyInstructionSequence *seq, + int opcode, int oparg, + _Py_SourceLocation loc); +_PyJumpTargetLabel _PyInstructionSequence_NewLabel(_PyInstructionSequence *seq); +int _PyInstructionSequence_ApplyLabelMap(_PyInstructionSequence *seq); +int _PyInstructionSequence_InsertInstruction(_PyInstructionSequence *seq, int pos, + int opcode, int oparg, _Py_SourceLocation loc); +int _PyInstructionSequence_AddNested(_PyInstructionSequence *seq, _PyInstructionSequence *nested); +void PyInstructionSequence_Fini(_PyInstructionSequence *seq); + +extern PyTypeObject _PyInstructionSequence_Type; +#define _PyInstructionSequence_Check(v) Py_IS_TYPE((v), &_PyInstructionSequence_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_INSTRUCTION_SEQUENCE_H */ diff --git a/Include/internal/pycore_instruments.h b/Include/internal/pycore_instruments.h index 87f70d2d..c98e82c8 100644 --- a/Include/internal/pycore_instruments.h +++ b/Include/internal/pycore_instruments.h @@ -1,12 +1,11 @@ - #ifndef Py_INTERNAL_INSTRUMENT_H #define Py_INTERNAL_INSTRUMENT_H +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif -#include "pycore_bitutils.h" // _Py_popcount32 -#include "pycore_frame.h" - -#include "cpython/code.h" +#include "pycore_frame.h" // _PyInterpreterFrame #ifdef __cplusplus extern "C" { @@ -14,38 +13,6 @@ extern "C" { #define PY_MONITORING_TOOL_IDS 8 -/* Local events. - * These require bytecode instrumentation */ - -#define PY_MONITORING_EVENT_PY_START 0 -#define PY_MONITORING_EVENT_PY_RESUME 1 -#define PY_MONITORING_EVENT_PY_RETURN 2 -#define PY_MONITORING_EVENT_PY_YIELD 3 -#define PY_MONITORING_EVENT_CALL 4 -#define PY_MONITORING_EVENT_LINE 5 -#define PY_MONITORING_EVENT_INSTRUCTION 6 -#define PY_MONITORING_EVENT_JUMP 7 -#define PY_MONITORING_EVENT_BRANCH 8 -#define PY_MONITORING_EVENT_STOP_ITERATION 9 - -#define PY_MONITORING_IS_INSTRUMENTED_EVENT(ev) \ - ((ev) < _PY_MONITORING_LOCAL_EVENTS) - -/* Other events, mainly exceptions */ - -#define PY_MONITORING_EVENT_RAISE 10 -#define PY_MONITORING_EVENT_EXCEPTION_HANDLED 11 -#define PY_MONITORING_EVENT_PY_UNWIND 12 -#define PY_MONITORING_EVENT_PY_THROW 13 -#define PY_MONITORING_EVENT_RERAISE 14 - - -/* Ancilliary events */ - -#define PY_MONITORING_EVENT_C_RETURN 15 -#define PY_MONITORING_EVENT_C_RAISE 16 - - typedef uint32_t _PyMonitoringEventSet; /* Tool IDs */ @@ -64,6 +31,8 @@ typedef uint32_t _PyMonitoringEventSet; PyObject *_PyMonitoring_RegisterCallback(int tool_id, int event_id, PyObject *obj); int _PyMonitoring_SetEvents(int tool_id, _PyMonitoringEventSet events); +int _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet events); +int _PyMonitoring_GetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEventSet *events); extern int _Py_call_instrumentation(PyThreadState *tstate, int event, diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 1db23145..075d35a3 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -8,29 +8,34 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include +#include // bool #include "pycore_ast_state.h" // struct ast_state #include "pycore_atexit.h" // struct atexit_state -#include "pycore_atomic.h" // _Py_atomic_address #include "pycore_ceval_state.h" // struct _ceval_state #include "pycore_code.h" // struct callable_cache +#include "pycore_codecs.h" // struct codecs_state #include "pycore_context.h" // struct _Py_context_state +#include "pycore_crossinterp.h" // struct _xidregistry #include "pycore_dict_state.h" // struct _Py_dict_state #include "pycore_dtoa.h" // struct _dtoa_state #include "pycore_exceptions.h" // struct _Py_exc_state #include "pycore_floatobject.h" // struct _Py_float_state #include "pycore_function.h" // FUNC_MAX_WATCHERS -#include "pycore_genobject.h" // struct _Py_async_gen_state #include "pycore_gc.h" // struct _gc_runtime_state -#include "pycore_global_objects.h" // struct _Py_interp_static_objects +#include "pycore_genobject.h" // struct _Py_async_gen_state +#include "pycore_global_objects.h"// struct _Py_interp_cached_objects #include "pycore_import.h" // struct _import_state #include "pycore_instruments.h" // _PY_MONITORING_EVENTS #include "pycore_list.h" // struct _Py_list_state -#include "pycore_object_state.h" // struct _py_object_state -#include "pycore_obmalloc.h" // struct obmalloc_state +#include "pycore_mimalloc.h" // struct _mimalloc_interp_state +#include "pycore_object_state.h" // struct _py_object_state +#include "pycore_optimizer.h" // _PyOptimizerObject +#include "pycore_obmalloc.h" // struct _obmalloc_state +#include "pycore_qsbr.h" // struct _qsbr_state +#include "pycore_tstate.h" // _PyThreadStateImpl #include "pycore_tuple.h" // struct _Py_tuple_state -#include "pycore_typeobject.h" // struct type_cache +#include "pycore_typeobject.h" // struct types_state #include "pycore_unicodeobject.h" // struct _Py_unicode_state #include "pycore_warnings.h" // struct _warnings_runtime_state @@ -39,6 +44,46 @@ struct _Py_long_state { int max_str_digits; }; +// Support for stop-the-world events. This exists in both the PyRuntime struct +// for global pauses and in each PyInterpreterState for per-interpreter pauses. +struct _stoptheworld_state { + PyMutex mutex; // Serializes stop-the-world attempts. + + // NOTE: The below fields are protected by HEAD_LOCK(runtime), not by the + // above mutex. + bool requested; // Set when a pause is requested. + bool world_stopped; // Set when the world is stopped. + bool is_global; // Set when contained in PyRuntime struct. + + PyEvent stop_event; // Set when thread_countdown reaches zero. + Py_ssize_t thread_countdown; // Number of threads that must pause. + + PyThreadState *requester; // Thread that requested the pause (may be NULL). +}; + +#ifdef Py_GIL_DISABLED +// This should be prime but otherwise the choice is arbitrary. A larger value +// increases concurrency at the expense of memory. +# define NUM_WEAKREF_LIST_LOCKS 127 +#endif + +/* cross-interpreter data registry */ + +/* Tracks some rare events per-interpreter, used by the optimizer to turn on/off + specific optimizations. */ +typedef struct _rare_events { + /* Setting an object's class, obj.__class__ = ... */ + uint8_t set_class; + /* Setting the bases of a class, cls.__bases__ = ... */ + uint8_t set_bases; + /* Setting the PEP 523 frame eval function, _PyInterpreterState_SetFrameEvalFunc() */ + uint8_t set_eval_frame_func; + /* Modifying the builtins, __builtins__.__dict__[var] = ... */ + uint8_t builtin_dict; + /* Modifying a function, e.g. func.__defaults__ = ..., etc. */ + uint8_t func_modification; +} _rare_events; + /* interpreter state */ /* PyInterpreterState holds the global state for one of the runtime's @@ -48,6 +93,11 @@ struct _Py_long_state { */ struct _is { + /* This struct contains the eval_breaker, + * which is by far the hottest field in this struct + * and should be placed at the beginning. */ + struct _ceval_state ceval; + PyInterpreterState *next; int64_t id; @@ -55,21 +105,34 @@ struct _is { int requires_idref; PyThread_type_lock id_mutex; +#define _PyInterpreterState_WHENCE_NOTSET -1 +#define _PyInterpreterState_WHENCE_UNKNOWN 0 +#define _PyInterpreterState_WHENCE_RUNTIME 1 +#define _PyInterpreterState_WHENCE_LEGACY_CAPI 2 +#define _PyInterpreterState_WHENCE_CAPI 3 +#define _PyInterpreterState_WHENCE_XI 4 +#define _PyInterpreterState_WHENCE_STDLIB 5 +#define _PyInterpreterState_WHENCE_MAX 5 + long _whence; + /* Has been initialized to a safe state. In order to be effective, this must be set to 0 during or right after allocation. */ int _initialized; + /* Has been fully initialized via pylifecycle.c. */ + int _ready; int finalizing; - uint64_t monitoring_version; - uint64_t last_restart_version; + uintptr_t last_restart_version; struct pythreads { uint64_t next_unique_id; /* The linked list of threads, newest first. */ PyThreadState *head; + /* The thread currently executing in the __main__ module, if any. */ + PyThreadState *main; /* Used in Modules/_threadmodule.c. */ - long count; + Py_ssize_t count; /* Support for runtime thread stack size tuning. A value of 0 means using the platform's default stack size or the size specified by the THREAD_STACK_SIZE macro. */ @@ -87,7 +150,9 @@ struct _is { Use _PyInterpreterState_GetFinalizing() and _PyInterpreterState_SetFinalizing() to access it, don't access it directly. */ - _Py_atomic_address _finalizing; + PyThreadState* _finalizing; + /* The ID of the OS thread in which we are finalizing. */ + unsigned long _finalizing_id; struct _gc_runtime_state gc; @@ -109,8 +174,6 @@ struct _is { // Dictionary of the builtins module PyObject *builtins; - struct _ceval_state ceval; - struct _import_state imports; /* The per-interpreter GIL, which might not be used. */ @@ -121,10 +184,7 @@ struct _is { possible to facilitate out-of-process observability tools. */ - PyObject *codec_search_path; - PyObject *codec_search_cache; - PyObject *codec_error_registry; - int codecs_initialized; + struct codecs_state codecs; PyConfig config; unsigned long feature_flags; @@ -143,6 +203,9 @@ struct _is { Py_ssize_t co_extra_user_count; freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + /* cross-interpreter data and utils */ + struct _xi_state xi; + #ifdef HAVE_FORK PyObject *before_forkers; PyObject *after_forkers_parent; @@ -151,8 +214,26 @@ struct _is { struct _warnings_runtime_state warnings; struct atexit_state atexit; + struct _stoptheworld_state stoptheworld; + struct _qsbr_shared qsbr; + +#if defined(Py_GIL_DISABLED) + struct _mimalloc_interp_state mimalloc; + struct _brc_state brc; // biased reference counting state + PyMutex weakref_locks[NUM_WEAKREF_LIST_LOCKS]; +#endif - struct _obmalloc_state obmalloc; + // Per-interpreter state for the obmalloc allocator. For the main + // interpreter and for all interpreters that don't have their + // own obmalloc state, this points to the static structure in + // obmalloc.c obmalloc_state_main. For other interpreters, it is + // heap allocated by _PyMem_init_obmalloc() and freed when the + // interpreter structure is freed. In the case of a heap allocated + // obmalloc state, it is not safe to hold on to or use memory after + // the interpreter is freed. The obmalloc state corresponding to + // that allocated memory is gone. See free_obmalloc_arenas() for + // more comments. + struct _obmalloc_state *obmalloc; PyObject *audit_hooks; PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS]; @@ -162,28 +243,25 @@ struct _is { struct _py_object_state object_state; struct _Py_unicode_state unicode; - struct _Py_float_state float_state; struct _Py_long_state long_state; struct _dtoa_state dtoa; struct _py_func_state func_state; - /* Using a cache is very effective since typically only a single slice is - created and then deleted again. */ - PySliceObject *slice_cache; + struct _py_code_state code_state; - struct _Py_tuple_state tuple; - struct _Py_list_state list; struct _Py_dict_state dict_state; - struct _Py_async_gen_state async_gen; - struct _Py_context_state context; struct _Py_exc_state exc_state; + struct _Py_mem_interp_free_queue mem_free_queue; struct ast_state ast; struct types_state types; struct callable_cache callable_cache; - PyCodeObject *interpreter_trampoline; + _PyOptimizerObject *optimizer; + _PyExecutorObject *executor_list_head; + + _rare_events rare_events; + PyDict_WatchCallback builtins_dict_watcher; _Py_GlobalMonitors monitors; - bool f_opcode_trace_set; bool sys_profile_initialized; bool sys_trace_initialized; Py_ssize_t sys_profiling_threads; /* Count of threads with c_profilefunc set */ @@ -194,8 +272,11 @@ struct _is { struct _Py_interp_cached_objects cached_objects; struct _Py_interp_static_objects static_objects; - /* the initial PyInterpreterState.threads.head */ - PyThreadState _initial_thread; + /* the initial PyInterpreterState.threads.head */ + _PyThreadStateImpl _initial_thread; + Py_ssize_t _interactive_src_count; + // In 3.14+ this is interp->threads.preallocated. + _PyThreadStateImpl *threads_preallocated; }; @@ -206,36 +287,136 @@ extern void _PyInterpreterState_Clear(PyThreadState *tstate); static inline PyThreadState* _PyInterpreterState_GetFinalizing(PyInterpreterState *interp) { - return (PyThreadState*)_Py_atomic_load_relaxed(&interp->_finalizing); + return (PyThreadState*)_Py_atomic_load_ptr_relaxed(&interp->_finalizing); +} + +static inline unsigned long +_PyInterpreterState_GetFinalizingID(PyInterpreterState *interp) { + return _Py_atomic_load_ulong_relaxed(&interp->_finalizing_id); } static inline void _PyInterpreterState_SetFinalizing(PyInterpreterState *interp, PyThreadState *tstate) { - _Py_atomic_store_relaxed(&interp->_finalizing, (uintptr_t)tstate); + _Py_atomic_store_ptr_relaxed(&interp->_finalizing, tstate); + if (tstate == NULL) { + _Py_atomic_store_ulong_relaxed(&interp->_finalizing_id, 0); + } + else { + // XXX Re-enable this assert once gh-109860 is fixed. + //assert(tstate->thread_id == PyThread_get_thread_ident()); + _Py_atomic_store_ulong_relaxed(&interp->_finalizing_id, + tstate->thread_id); + } } -/* cross-interpreter data registry */ - -/* For now we use a global registry of shareable classes. An - alternative would be to add a tp_* slot for a class's - crossinterpdatafunc. It would be simpler and more efficient. */ - -struct _xidregitem; - -struct _xidregitem { - struct _xidregitem *prev; - struct _xidregitem *next; - PyObject *cls; // weakref to a PyTypeObject - crossinterpdatafunc getdata; -}; - -PyAPI_FUNC(PyInterpreterState*) _PyInterpreterState_LookUpID(int64_t); +// Exports for the _testinternalcapi module. +PyAPI_FUNC(int64_t) _PyInterpreterState_ObjectToID(PyObject *); +PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(int64_t); +PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpIDObject(PyObject *); PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); PyAPI_FUNC(int) _PyInterpreterState_IDIncref(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); +PyAPI_FUNC(int) _PyInterpreterState_IsReady(PyInterpreterState *interp); + +PyAPI_FUNC(long) _PyInterpreterState_GetWhence(PyInterpreterState *interp); +extern void _PyInterpreterState_SetWhence( + PyInterpreterState *interp, + long whence); + +extern const PyConfig* _PyInterpreterState_GetConfig(PyInterpreterState *interp); + +// Get a copy of the current interpreter configuration. +// +// Return 0 on success. Raise an exception and return -1 on error. +// +// The caller must initialize 'config', using PyConfig_InitPythonConfig() +// for example. +// +// Python must be preinitialized to call this method. +// The caller must hold the GIL. +// +// Once done with the configuration, PyConfig_Clear() must be called to clear +// it. +// +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy( + struct PyConfig *config); + +// Set the configuration of the current interpreter. +// +// This function should be called during or just after the Python +// initialization. +// +// Update the sys module with the new configuration. If the sys module was +// modified directly after the Python initialization, these changes are lost. +// +// Some configuration like faulthandler or warnoptions can be updated in the +// configuration, but don't reconfigure Python (don't enable/disable +// faulthandler and don't reconfigure warnings filters). +// +// Return 0 on success. Raise an exception and return -1 on error. +// +// The configuration should come from _PyInterpreterState_GetConfigCopy(). +// +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(int) _PyInterpreterState_SetConfig( + const struct PyConfig *config); + + +/* +Runtime Feature Flags + +Each flag indicate whether or not a specific runtime feature +is available in a given context. For example, forking the process +might not be allowed in the current interpreter (i.e. os.fork() would fail). +*/ + +/* Set if the interpreter share obmalloc runtime state + with the main interpreter. */ +#define Py_RTFLAGS_USE_MAIN_OBMALLOC (1UL << 5) + +/* Set if import should check a module for subinterpreter support. */ +#define Py_RTFLAGS_MULTI_INTERP_EXTENSIONS (1UL << 8) + +/* Set if threads are allowed. */ +#define Py_RTFLAGS_THREADS (1UL << 10) + +/* Set if daemon threads are allowed. */ +#define Py_RTFLAGS_DAEMON_THREADS (1UL << 11) + +/* Set if os.fork() is allowed. */ +#define Py_RTFLAGS_FORK (1UL << 15) + +/* Set if os.exec*() is allowed. */ +#define Py_RTFLAGS_EXEC (1UL << 16) + +extern int _PyInterpreterState_HasFeature(PyInterpreterState *interp, + unsigned long feature); + +PyAPI_FUNC(PyStatus) _PyInterpreterState_New( + PyThreadState *tstate, + PyInterpreterState **pinterp); + + +#define RARE_EVENT_INTERP_INC(interp, name) \ + do { \ + /* saturating add */ \ + int val = FT_ATOMIC_LOAD_UINT8_RELAXED(interp->rare_events.name); \ + if (val < UINT8_MAX) { \ + FT_ATOMIC_STORE_UINT8(interp->rare_events.name, val + 1); \ + } \ + RARE_EVENT_STAT_INC(name); \ + } while (0); \ + +#define RARE_EVENT_INC(name) \ + do { \ + PyInterpreterState *interp = PyInterpreterState_Get(); \ + RARE_EVENT_INTERP_INC(interp, name); \ + } while (0); \ + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_intrinsics.h b/Include/internal/pycore_intrinsics.h index 39f15681..39c2a30f 100644 --- a/Include/internal/pycore_intrinsics.h +++ b/Include/internal/pycore_intrinsics.h @@ -1,4 +1,9 @@ -// Auto-generated by Tools/build/generate_opcode_h.py from Lib/opcode.py +#ifndef Py_INTERNAL_INTRINSIC_H +#define Py_INTERNAL_INTRINSIC_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif /* Unary Functions: */ #define INTRINSIC_1_INVALID 0 @@ -23,10 +28,24 @@ #define INTRINSIC_TYPEVAR_WITH_BOUND 2 #define INTRINSIC_TYPEVAR_WITH_CONSTRAINTS 3 #define INTRINSIC_SET_FUNCTION_TYPE_PARAMS 4 +#define INTRINSIC_SET_TYPEPARAM_DEFAULT 5 + +#define MAX_INTRINSIC_2 5 + +typedef PyObject *(*intrinsic_func1)(PyThreadState* tstate, PyObject *value); +typedef PyObject *(*intrinsic_func2)(PyThreadState* tstate, PyObject *value1, PyObject *value2); + +typedef struct { + intrinsic_func1 func; + const char *name; +} intrinsic_func1_info; + +typedef struct { + intrinsic_func2 func; + const char *name; +} intrinsic_func2_info; -#define MAX_INTRINSIC_2 4 +PyAPI_DATA(const intrinsic_func1_info) _PyIntrinsics_UnaryFunctions[]; +PyAPI_DATA(const intrinsic_func2_info) _PyIntrinsics_BinaryFunctions[]; -typedef PyObject *(*instrinsic_func1)(PyThreadState* tstate, PyObject *value); -typedef PyObject *(*instrinsic_func2)(PyThreadState* tstate, PyObject *value1, PyObject *value2); -extern const instrinsic_func1 _PyIntrinsics_UnaryFunctions[]; -extern const instrinsic_func2 _PyIntrinsics_BinaryFunctions[]; +#endif // !Py_INTERNAL_INTRINSIC_H diff --git a/Include/internal/pycore_jit.h b/Include/internal/pycore_jit.h new file mode 100644 index 00000000..17bd23f0 --- /dev/null +++ b/Include/internal/pycore_jit.h @@ -0,0 +1,25 @@ +#ifndef Py_INTERNAL_JIT_H +#define Py_INTERNAL_JIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef _Py_JIT + +typedef _Py_CODEUNIT *(*jit_func)(_PyInterpreterFrame *frame, PyObject **stack_pointer, PyThreadState *tstate); + +int _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction *trace, size_t length); +void _PyJIT_Free(_PyExecutorObject *executor); + +#endif // _Py_JIT + +#ifdef __cplusplus +} +#endif + +#endif // !Py_INTERNAL_JIT_H diff --git a/Include/internal/pycore_list.h b/Include/internal/pycore_list.h index 2fcbe12c..73695d10 100644 --- a/Include/internal/pycore_list.h +++ b/Include/internal/pycore_list.h @@ -8,48 +8,31 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "listobject.h" // _PyList_CAST() +#include "pycore_freelist.h" // _PyFreeListState - -/* runtime lifecycle */ - -extern void _PyList_Fini(PyInterpreterState *); - - -/* other API */ - -#ifndef WITH_FREELISTS -// without freelists -# define PyList_MAXFREELIST 0 -#endif - -/* Empty list reuse scheme to save calls to malloc and free */ -#ifndef PyList_MAXFREELIST -# define PyList_MAXFREELIST 80 -#endif - -struct _Py_list_state { -#if PyList_MAXFREELIST > 0 - PyListObject *free_list[PyList_MAXFREELIST]; - int numfree; -#endif -}; +PyAPI_FUNC(PyObject*) _PyList_Extend(PyListObject *, PyObject *); +extern void _PyList_DebugMallocStats(FILE *out); #define _PyList_ITEMS(op) _Py_RVALUE(_PyList_CAST(op)->ob_item) -extern int +PyAPI_FUNC(int) _PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem); +// In free-threaded build: self should be locked by the caller, if it should be thread-safe. static inline int _PyList_AppendTakeRef(PyListObject *self, PyObject *newitem) { assert(self != NULL && newitem != NULL); assert(PyList_Check(self)); - Py_ssize_t len = PyList_GET_SIZE(self); + Py_ssize_t len = Py_SIZE(self); Py_ssize_t allocated = self->allocated; assert((size_t)len + 1 < PY_SSIZE_T_MAX); if (allocated > len) { +#ifdef Py_GIL_DISABLED + _Py_atomic_store_ptr_release(&self->ob_item[len], newitem); +#else PyList_SET_ITEM(self, len, newitem); +#endif Py_SET_SIZE(self, len + 1); return 0; } @@ -75,7 +58,7 @@ typedef struct { PyListObject *it_seq; /* Set to NULL when iterator is exhausted */ } _PyListIterObject; -extern PyObject *_PyList_FromArraySteal(PyObject *const *src, Py_ssize_t n); +PyAPI_FUNC(PyObject *)_PyList_FromArraySteal(PyObject *const *src, Py_ssize_t n); #ifdef __cplusplus } diff --git a/Include/internal/pycore_llist.h b/Include/internal/pycore_llist.h new file mode 100644 index 00000000..f629902f --- /dev/null +++ b/Include/internal/pycore_llist.h @@ -0,0 +1,106 @@ +// A doubly-linked list that can be embedded in a struct. +// +// Usage: +// struct llist_node head = LLIST_INIT(head); +// typedef struct { +// ... +// struct llist_node node; +// ... +// } MyObj; +// +// llist_insert_tail(&head, &obj->node); +// llist_remove(&obj->node); +// +// struct llist_node *node; +// llist_for_each(node, &head) { +// MyObj *obj = llist_data(node, MyObj, node); +// ... +// } +// + +#ifndef Py_INTERNAL_LLIST_H +#define Py_INTERNAL_LLIST_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "Py_BUILD_CORE must be defined to include this header" +#endif + +struct llist_node { + struct llist_node *next; + struct llist_node *prev; +}; + +// Get the struct containing a node. +#define llist_data(node, type, member) (_Py_CONTAINER_OF(node, type, member)) + +// Iterate over a list. +#define llist_for_each(node, head) \ + for (node = (head)->next; node != (head); node = node->next) + +// Iterate over a list, but allow removal of the current node. +#define llist_for_each_safe(node, head) \ + for (struct llist_node *_next = (node = (head)->next, node->next); \ + node != (head); node = _next, _next = node->next) + +#define LLIST_INIT(head) { &head, &head } + +static inline void +llist_init(struct llist_node *head) +{ + head->next = head; + head->prev = head; +} + +// Returns 1 if the list is empty, 0 otherwise. +static inline int +llist_empty(struct llist_node *head) +{ + return head->next == head; +} + +// Appends to the tail of the list. +static inline void +llist_insert_tail(struct llist_node *head, struct llist_node *node) +{ + node->prev = head->prev; + node->next = head; + head->prev->next = node; + head->prev = node; +} + +// Remove a node from the list. +static inline void +llist_remove(struct llist_node *node) +{ + struct llist_node *prev = node->prev; + struct llist_node *next = node->next; + prev->next = next; + next->prev = prev; + node->prev = NULL; + node->next = NULL; +} + +// Append all nodes from head2 onto head1. head2 is left empty. +static inline void +llist_concat(struct llist_node *head1, struct llist_node *head2) +{ + if (!llist_empty(head2)) { + head1->prev->next = head2->next; + head2->next->prev = head1->prev; + + head1->prev = head2->prev; + head2->prev->next = head1; + llist_init(head2); + } +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LLIST_H */ diff --git a/Include/internal/pycore_lock.h b/Include/internal/pycore_lock.h new file mode 100644 index 00000000..2a18bb76 --- /dev/null +++ b/Include/internal/pycore_lock.h @@ -0,0 +1,241 @@ +// Lightweight locks and other synchronization mechanisms. +// +// These implementations are based on WebKit's WTF::Lock. See +// https://webkit.org/blog/6161/locking-in-webkit/ for a description of the +// design. +#ifndef Py_INTERNAL_LOCK_H +#define Py_INTERNAL_LOCK_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +//_Py_UNLOCKED is defined as 0 and _Py_LOCKED as 1 in Include/cpython/lock.h +#define _Py_HAS_PARKED 2 +#define _Py_ONCE_INITIALIZED 4 + +static inline int +PyMutex_LockFast(uint8_t *lock_bits) +{ + uint8_t expected = _Py_UNLOCKED; + return _Py_atomic_compare_exchange_uint8(lock_bits, &expected, _Py_LOCKED); +} + +// Checks if the mutex is currently locked. +static inline int +PyMutex_IsLocked(PyMutex *m) +{ + return (_Py_atomic_load_uint8(&m->_bits) & _Py_LOCKED) != 0; +} + +// Re-initializes the mutex after a fork to the unlocked state. +static inline void +_PyMutex_at_fork_reinit(PyMutex *m) +{ + memset(m, 0, sizeof(*m)); +} + +typedef enum _PyLockFlags { + // Do not detach/release the GIL when waiting on the lock. + _Py_LOCK_DONT_DETACH = 0, + + // Detach/release the GIL while waiting on the lock. + _PY_LOCK_DETACH = 1, + + // Handle signals if interrupted while waiting on the lock. + _PY_LOCK_HANDLE_SIGNALS = 2, +} _PyLockFlags; + +// Lock a mutex with an optional timeout and additional options. See +// _PyLockFlags for details. +extern PyLockStatus +_PyMutex_LockTimed(PyMutex *m, PyTime_t timeout_ns, _PyLockFlags flags); + +// Lock a mutex with aditional options. See _PyLockFlags for details. +static inline void +PyMutex_LockFlags(PyMutex *m, _PyLockFlags flags) +{ + uint8_t expected = _Py_UNLOCKED; + if (!_Py_atomic_compare_exchange_uint8(&m->_bits, &expected, _Py_LOCKED)) { + _PyMutex_LockTimed(m, -1, flags); + } +} + +// Unlock a mutex, returns 0 if the mutex is not locked (used for improved +// error messages). +extern int _PyMutex_TryUnlock(PyMutex *m); + + +// PyEvent is a one-time event notification +typedef struct { + uint8_t v; +} PyEvent; + +// Check if the event is set without blocking. Returns 1 if the event is set or +// 0 otherwise. +PyAPI_FUNC(int) _PyEvent_IsSet(PyEvent *evt); + +// Set the event and notify any waiting threads. +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(void) _PyEvent_Notify(PyEvent *evt); + +// Wait for the event to be set. If the event is already set, then this returns +// immediately. +PyAPI_FUNC(void) PyEvent_Wait(PyEvent *evt); + +// Wait for the event to be set, or until the timeout expires. If the event is +// already set, then this returns immediately. Returns 1 if the event was set, +// and 0 if the timeout expired or thread was interrupted. If `detach` is +// true, then the thread will detach/release the GIL while waiting. +PyAPI_FUNC(int) +PyEvent_WaitTimed(PyEvent *evt, PyTime_t timeout_ns, int detach); + +// _PyRawMutex implements a word-sized mutex that that does not depend on the +// parking lot API, and therefore can be used in the parking lot +// implementation. +// +// The mutex uses a packed representation: the least significant bit is used to +// indicate whether the mutex is locked or not. The remaining bits are either +// zero or a pointer to a `struct raw_mutex_entry` (see lock.c). +typedef struct { + uintptr_t v; +} _PyRawMutex; + +// Slow paths for lock/unlock +extern void _PyRawMutex_LockSlow(_PyRawMutex *m); +extern void _PyRawMutex_UnlockSlow(_PyRawMutex *m); + +static inline void +_PyRawMutex_Lock(_PyRawMutex *m) +{ + uintptr_t unlocked = _Py_UNLOCKED; + if (_Py_atomic_compare_exchange_uintptr(&m->v, &unlocked, _Py_LOCKED)) { + return; + } + _PyRawMutex_LockSlow(m); +} + +static inline void +_PyRawMutex_Unlock(_PyRawMutex *m) +{ + uintptr_t locked = _Py_LOCKED; + if (_Py_atomic_compare_exchange_uintptr(&m->v, &locked, _Py_UNLOCKED)) { + return; + } + _PyRawMutex_UnlockSlow(m); +} + +// Type signature for one-time initialization functions. The function should +// return 0 on success and -1 on failure. +typedef int _Py_once_fn_t(void *arg); + +// (private) slow path for one time initialization +PyAPI_FUNC(int) +_PyOnceFlag_CallOnceSlow(_PyOnceFlag *flag, _Py_once_fn_t *fn, void *arg); + +// Calls `fn` once using `flag`. The `arg` is passed to the call to `fn`. +// +// Returns 0 on success and -1 on failure. +// +// If `fn` returns 0 (success), then subsequent calls immediately return 0. +// If `fn` returns -1 (failure), then subsequent calls will retry the call. +static inline int +_PyOnceFlag_CallOnce(_PyOnceFlag *flag, _Py_once_fn_t *fn, void *arg) +{ + if (_Py_atomic_load_uint8(&flag->v) == _Py_ONCE_INITIALIZED) { + return 0; + } + return _PyOnceFlag_CallOnceSlow(flag, fn, arg); +} + +// A recursive mutex. The mutex should zero-initialized. +typedef struct { + PyMutex mutex; + unsigned long long thread; // i.e., PyThread_get_thread_ident_ex() + size_t level; +} _PyRecursiveMutex; + +PyAPI_FUNC(int) _PyRecursiveMutex_IsLockedByCurrentThread(_PyRecursiveMutex *m); +PyAPI_FUNC(void) _PyRecursiveMutex_Lock(_PyRecursiveMutex *m); +PyAPI_FUNC(void) _PyRecursiveMutex_Unlock(_PyRecursiveMutex *m); + + +// A readers-writer (RW) lock. The lock supports multiple concurrent readers or +// a single writer. The lock is write-preferring: if a writer is waiting while +// the lock is read-locked then, new readers will be blocked. This avoids +// starvation of writers. +// +// In C++, the equivalent synchronization primitive is std::shared_mutex +// with shared ("read") and exclusive ("write") locking. +// +// The two least significant bits are used to indicate if the lock is +// write-locked and if there are parked threads (either readers or writers) +// waiting to acquire the lock. The remaining bits are used to indicate the +// number of readers holding the lock. +// +// 0b000..00000: unlocked +// 0bnnn..nnn00: nnn..nnn readers holding the lock +// 0bnnn..nnn10: nnn..nnn readers holding the lock and a writer is waiting +// 0b00000..010: unlocked with awoken writer about to acquire lock +// 0b00000..001: write-locked +// 0b00000..011: write-locked and readers or other writers are waiting +// +// Note that reader_count must be zero if the lock is held by a writer, and +// vice versa. The lock can only be held by readers or a writer, but not both. +// +// The design is optimized for simplicity of the implementation. The lock is +// not fair: if fairness is desired, use an additional PyMutex to serialize +// writers. The lock is also not reentrant. +typedef struct { + uintptr_t bits; +} _PyRWMutex; + +// Read lock (i.e., shared lock) +PyAPI_FUNC(void) _PyRWMutex_RLock(_PyRWMutex *rwmutex); +PyAPI_FUNC(void) _PyRWMutex_RUnlock(_PyRWMutex *rwmutex); + +// Write lock (i.e., exclusive lock) +PyAPI_FUNC(void) _PyRWMutex_Lock(_PyRWMutex *rwmutex); +PyAPI_FUNC(void) _PyRWMutex_Unlock(_PyRWMutex *rwmutex); + +// Similar to linux seqlock: https://en.wikipedia.org/wiki/Seqlock +// We use a sequence number to lock the writer, an even sequence means we're unlocked, an odd +// sequence means we're locked. Readers will read the sequence before attempting to read the +// underlying data and then read the sequence number again after reading the data. If the +// sequence has not changed the data is valid. +// +// Differs a little bit in that we use CAS on sequence as the lock, instead of a separate spin lock. +// The writer can also detect that the undelering data has not changed and abandon the write +// and restore the previous sequence. +typedef struct { + uint32_t sequence; +} _PySeqLock; + +// Lock the sequence lock for the writer +PyAPI_FUNC(void) _PySeqLock_LockWrite(_PySeqLock *seqlock); + +// Unlock the sequence lock and move to the next sequence number. +PyAPI_FUNC(void) _PySeqLock_UnlockWrite(_PySeqLock *seqlock); + +// Abandon the current update indicating that no mutations have occurred +// and restore the previous sequence value. +PyAPI_FUNC(void) _PySeqLock_AbandonWrite(_PySeqLock *seqlock); + +// Begin a read operation and return the current sequence number. +PyAPI_FUNC(uint32_t) _PySeqLock_BeginRead(_PySeqLock *seqlock); + +// End the read operation and confirm that the sequence number has not changed. +// Returns 1 if the read was successful or 0 if the read should be retried. +PyAPI_FUNC(int) _PySeqLock_EndRead(_PySeqLock *seqlock, uint32_t previous); + +// Check if the lock was held during a fork and clear the lock. Returns 1 +// if the lock was held and any associated data should be cleared. +PyAPI_FUNC(int) _PySeqLock_AfterFork(_PySeqLock *seqlock); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LOCK_H */ diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index 64c00cb1..ff7d9afc 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_global_objects.h" // _PY_NSMALLNEGINTS +#include "pycore_bytesobject.h" // _PyBytesWriter +#include "pycore_global_objects.h"// _PY_NSMALLNEGINTS #include "pycore_runtime.h" // _PyRuntime /* @@ -46,7 +47,6 @@ extern "C" { # error "_PY_LONG_DEFAULT_MAX_STR_DIGITS smaller than threshold." #endif - /* runtime lifecycle */ extern PyStatus _PyLong_InitTypes(PyInterpreterState *); @@ -63,51 +63,99 @@ extern void _PyLong_FiniTypes(PyInterpreterState *interp); # error "_PY_NSMALLPOSINTS must be greater than or equal to 257" #endif -// Return a borrowed reference to the zero singleton. +// Return a reference to the immortal zero singleton. // The function cannot return NULL. static inline PyObject* _PyLong_GetZero(void) { return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS]; } -// Return a borrowed reference to the one singleton. +// Return a reference to the immortal one singleton. // The function cannot return NULL. static inline PyObject* _PyLong_GetOne(void) { return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+1]; } static inline PyObject* _PyLong_FromUnsignedChar(unsigned char i) { - return Py_NewRef((PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+i]); + return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+i]; } -PyObject *_PyLong_Add(PyLongObject *left, PyLongObject *right); -PyObject *_PyLong_Multiply(PyLongObject *left, PyLongObject *right); -PyObject *_PyLong_Subtract(PyLongObject *left, PyLongObject *right); - -/* Used by Python/mystrtoul.c, _PyBytes_FromHex(), - _PyBytes_DecodeEscape(), etc. */ +// _PyLong_Frexp returns a double x and an exponent e such that the +// true value is approximately equal to x * 2**e. e is >= 0. x is +// 0.0 if and only if the input is 0 (in which case, e and x are both +// zeroes); otherwise, 0.5 <= abs(x) < 1.0. On overflow, which is +// possible if the number of bits doesn't fit into a Py_ssize_t, sets +// OverflowError and returns -1.0 for x, 0 for e. +// +// Export for 'math' shared extension +PyAPI_DATA(double) _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e); + +extern PyObject* _PyLong_FromBytes(const char *, Py_ssize_t, int); + +// _PyLong_DivmodNear. Given integers a and b, compute the nearest +// integer q to the exact quotient a / b, rounding to the nearest even integer +// in the case of a tie. Return (q, r), where r = a - q*b. The remainder r +// will satisfy abs(r) <= abs(b)/2, with equality possible only if q is +// even. +// +// Export for '_datetime' shared extension. +PyAPI_DATA(PyObject*) _PyLong_DivmodNear(PyObject *, PyObject *); + +// _PyLong_Format: Convert the long to a string object with given base, +// appending a base prefix of 0[box] if base is 2, 8 or 16. +// Export for '_tkinter' shared extension. +PyAPI_DATA(PyObject*) _PyLong_Format(PyObject *obj, int base); + +// Export for 'math' shared extension +PyAPI_DATA(PyObject*) _PyLong_Rshift(PyObject *, size_t); + +// Export for 'math' shared extension +PyAPI_DATA(PyObject*) _PyLong_Lshift(PyObject *, size_t); + +PyAPI_FUNC(PyObject*) _PyLong_Add(PyLongObject *left, PyLongObject *right); +PyAPI_FUNC(PyObject*) _PyLong_Multiply(PyLongObject *left, PyLongObject *right); +PyAPI_FUNC(PyObject*) _PyLong_Subtract(PyLongObject *left, PyLongObject *right); + +// Export for 'binascii' shared extension. PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; /* Format the object based on the format_spec, as defined in PEP 3101 (Advanced String Formatting). */ -PyAPI_FUNC(int) _PyLong_FormatAdvancedWriter( +extern int _PyLong_FormatAdvancedWriter( _PyUnicodeWriter *writer, PyObject *obj, PyObject *format_spec, Py_ssize_t start, Py_ssize_t end); -PyAPI_FUNC(int) _PyLong_FormatWriter( +extern int _PyLong_FormatWriter( _PyUnicodeWriter *writer, PyObject *obj, int base, int alternate); -PyAPI_FUNC(char*) _PyLong_FormatBytesWriter( +extern char* _PyLong_FormatBytesWriter( _PyBytesWriter *writer, char *str, PyObject *obj, int base, int alternate); +// Argument converters used by Argument Clinic + +// Export for 'select' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_UnsignedShort_Converter(PyObject *, void *); + +// Export for '_testclinic' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_UnsignedInt_Converter(PyObject *, void *); + +// Export for '_blake2' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_UnsignedLong_Converter(PyObject *, void *); + +// Export for '_blake2' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_UnsignedLongLong_Converter(PyObject *, void *); + +// Export for '_testclinic' shared extension (Argument Clinic code) +PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *); + /* Long value tag bits: * 0-1: Sign bits value = (1-sign), ie. negative=2, positive=0, zero=1. * 2: Reserved for immortality bit @@ -130,8 +178,12 @@ PyAPI_FUNC(char*) _PyLong_FormatBytesWriter( * we define them to the numbers in both places and then assert that * they're the same. */ -static_assert(SIGN_MASK == _PyLong_SIGN_MASK, "SIGN_MASK does not match _PyLong_SIGN_MASK"); -static_assert(NON_SIZE_BITS == _PyLong_NON_SIZE_BITS, "NON_SIZE_BITS does not match _PyLong_NON_SIZE_BITS"); +#if SIGN_MASK != _PyLong_SIGN_MASK +# error "SIGN_MASK does not match _PyLong_SIGN_MASK" +#endif +#if NON_SIZE_BITS != _PyLong_NON_SIZE_BITS +# error "NON_SIZE_BITS does not match _PyLong_NON_SIZE_BITS" +#endif /* All *compact" values are guaranteed to fit into * a Py_ssize_t with at least one bit to spare. @@ -240,7 +292,7 @@ _PyLong_FlipSign(PyLongObject *op) { #define _PyLong_DIGIT_INIT(val) \ { \ - .ob_base = _PyObject_HEAD_INIT(&PyLong_Type) \ + .ob_base = _PyObject_HEAD_INIT(&PyLong_Type), \ .long_value = { \ .lv_tag = TAG_FROM_SIGN_AND_SIZE( \ (val) == 0 ? 0 : ((val) < 0 ? -1 : 1), \ diff --git a/Include/internal/pycore_memoryobject.h b/Include/internal/pycore_memoryobject.h index fe19e3f9..62e204fc 100644 --- a/Include/internal/pycore_memoryobject.h +++ b/Include/internal/pycore_memoryobject.h @@ -8,6 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +extern PyTypeObject _PyManagedBuffer_Type; + PyObject * _PyMemoryView_FromBufferProc(PyObject *v, int flags, getbufferproc bufferproc); diff --git a/Include/internal/pycore_mimalloc.h b/Include/internal/pycore_mimalloc.h new file mode 100644 index 00000000..d870d01b --- /dev/null +++ b/Include/internal/pycore_mimalloc.h @@ -0,0 +1,69 @@ +#ifndef Py_INTERNAL_MIMALLOC_H +#define Py_INTERNAL_MIMALLOC_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if defined(MIMALLOC_H) || defined(MIMALLOC_TYPES_H) +# error "pycore_mimalloc.h must be included before mimalloc.h" +#endif + +typedef enum { + _Py_MIMALLOC_HEAP_MEM = 0, // PyMem_Malloc() and friends + _Py_MIMALLOC_HEAP_OBJECT = 1, // non-GC objects + _Py_MIMALLOC_HEAP_GC = 2, // GC objects without pre-header + _Py_MIMALLOC_HEAP_GC_PRE = 3, // GC objects with pre-header + _Py_MIMALLOC_HEAP_COUNT +} _Py_mimalloc_heap_id; + +#include "pycore_pymem.h" + +#ifdef WITH_MIMALLOC +# ifdef Py_GIL_DISABLED +# define MI_PRIM_THREAD_ID _Py_ThreadId +# endif +# define MI_DEBUG_UNINIT PYMEM_CLEANBYTE +# define MI_DEBUG_FREED PYMEM_DEADBYTE +# define MI_DEBUG_PADDING PYMEM_FORBIDDENBYTE +#ifdef Py_DEBUG +# define MI_DEBUG 2 +#else +# define MI_DEBUG 0 +#endif + +#ifdef _Py_THREAD_SANITIZER +# define MI_TSAN 1 +#endif + +#ifdef __cplusplus +extern "C++" { +#endif + +#include "mimalloc/mimalloc.h" +#include "mimalloc/mimalloc/types.h" +#include "mimalloc/mimalloc/internal.h" + +#ifdef __cplusplus +} +#endif + +#endif + +#ifdef Py_GIL_DISABLED +struct _mimalloc_interp_state { + // When exiting, threads place any segments with live blocks in this + // shared pool for other threads to claim and reuse. + mi_abandoned_pool_t abandoned_pool; +}; + +struct _mimalloc_thread_state { + mi_heap_t *current_object_heap; + mi_heap_t heaps[_Py_MIMALLOC_HEAP_COUNT]; + mi_tld_t tld; + int initialized; + struct llist_node page_list; +}; +#endif + +#endif // Py_INTERNAL_MIMALLOC_H diff --git a/Include/internal/pycore_modsupport.h b/Include/internal/pycore_modsupport.h new file mode 100644 index 00000000..11fde814 --- /dev/null +++ b/Include/internal/pycore_modsupport.h @@ -0,0 +1,107 @@ +#ifndef Py_INTERNAL_MODSUPPORT_H +#define Py_INTERNAL_MODSUPPORT_H + +#include "pycore_lock.h" // _PyOnceFlag + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +extern int _PyArg_NoKwnames(const char *funcname, PyObject *kwnames); +#define _PyArg_NoKwnames(funcname, kwnames) \ + ((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames))) + +// Export for '_bz2' shared extension +PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); +#define _PyArg_NoPositional(funcname, args) \ + ((args) == NULL || _PyArg_NoPositional((funcname), (args))) + +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); +#define _PyArg_NoKeywords(funcname, kwargs) \ + ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) + +// Export for 'zlib' shared extension +PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t, + Py_ssize_t, Py_ssize_t); +#define _Py_ANY_VARARGS(n) ((n) == PY_SSIZE_T_MAX) +#define _PyArg_CheckPositional(funcname, nargs, min, max) \ + ((!_Py_ANY_VARARGS(max) && (min) <= (nargs) && (nargs) <= (max)) \ + || _PyArg_CheckPositional((funcname), (nargs), (min), (max))) + +extern PyObject ** _Py_VaBuildStack( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); + +extern PyObject* _PyModule_CreateInitialized(PyModuleDef*, int apiver); + +// Export for '_curses' shared extension +PyAPI_FUNC(int) _PyArg_ParseStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *format, + ...); + +extern int _PyArg_UnpackStack( + PyObject *const *args, + Py_ssize_t nargs, + const char *name, + Py_ssize_t min, + Py_ssize_t max, + ...); + +// Export for '_heapq' shared extension +PyAPI_FUNC(void) _PyArg_BadArgument( + const char *fname, + const char *displayname, + const char *expected, + PyObject *arg); + +// --- _PyArg_Parser API --------------------------------------------------- + +// Export for '_dbm' shared extension +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames, + struct _PyArg_Parser *, + ...); + +// Export for 'math' shared extension +PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwargs, + PyObject *kwnames, + struct _PyArg_Parser *parser, + int minpos, + int maxpos, + int minkw, + PyObject **buf); +#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \ + (((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \ + (minpos) <= (nargs) && (nargs) <= (maxpos) && (args) != NULL) ? (args) : \ + _PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \ + (minpos), (maxpos), (minkw), (buf))) + +// Export for '_testclinic' shared extension +PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg( + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject *kwnames, + struct _PyArg_Parser *parser, + int minpos, int maxpos, int minkw, + int vararg, PyObject **buf); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_MODSUPPORT_H + diff --git a/Include/internal/pycore_moduleobject.h b/Include/internal/pycore_moduleobject.h index 15a1bcb6..dacc00db 100644 --- a/Include/internal/pycore_moduleobject.h +++ b/Include/internal/pycore_moduleobject.h @@ -8,6 +8,14 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +extern void _PyModule_Clear(PyObject *); +extern void _PyModule_ClearDict(PyObject *); +extern int _PyModuleSpec_IsInitializing(PyObject *); +extern int _PyModuleSpec_GetFileOrigin(PyObject *, PyObject **); +extern int _PyModule_IsPossiblyShadowing(PyObject *); + +extern int _PyModule_IsExtension(PyObject *obj); + typedef struct { PyObject_HEAD PyObject *md_dict; @@ -16,6 +24,9 @@ typedef struct { PyObject *md_weaklist; // for logging purposes after md_dict is cleared PyObject *md_name; +#ifdef Py_GIL_DISABLED + void *md_gil; +#endif } PyModuleObject; static inline PyModuleDef* _PyModule_GetDef(PyObject *mod) { @@ -33,7 +44,7 @@ static inline PyObject* _PyModule_GetDict(PyObject *mod) { PyObject *dict = ((PyModuleObject *)mod) -> md_dict; // _PyModule_GetDict(mod) must not be used after calling module_clear(mod) assert(dict != NULL); - return dict; + return dict; // borrowed reference } PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress); diff --git a/Include/internal/pycore_namespace.h b/Include/internal/pycore_namespace.h index cb76f040..f165cf15 100644 --- a/Include/internal/pycore_namespace.h +++ b/Include/internal/pycore_namespace.h @@ -10,9 +10,10 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -PyAPI_DATA(PyTypeObject) _PyNamespace_Type; +extern PyTypeObject _PyNamespace_Type; -PyAPI_FUNC(PyObject *) _PyNamespace_New(PyObject *kwds); +// Export for '_testmultiphase' shared extension +PyAPI_FUNC(PyObject*) _PyNamespace_New(PyObject *kwds); #ifdef __cplusplus } diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 7a2f13a2..d50a688d 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -10,9 +10,66 @@ extern "C" { #include #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_emscripten_trampoline.h" // _PyCFunction_TrampolineCall() #include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pyatomic_ft_wrappers.h" // FT_ATOMIC_STORE_PTR_RELAXED #include "pycore_pystate.h" // _PyInterpreterState_GET() -#include "pycore_runtime.h" // _PyRuntime + + +#define _Py_IMMORTAL_REFCNT_LOOSE ((_Py_IMMORTAL_REFCNT >> 1) + 1) + +// gh-121528, gh-118997: Similar to _Py_IsImmortal() but be more loose when +// comparing the reference count to stay compatible with C extensions built +// with the stable ABI 3.11 or older. Such extensions implement INCREF/DECREF +// as refcnt++ and refcnt-- without taking in account immortal objects. For +// example, the reference count of an immortal object can change from +// _Py_IMMORTAL_REFCNT to _Py_IMMORTAL_REFCNT+1 (INCREF) or +// _Py_IMMORTAL_REFCNT-1 (DECREF). +// +// This function should only be used in assertions. Otherwise, _Py_IsImmortal() +// must be used instead. +static inline int _Py_IsImmortalLoose(PyObject *op) +{ +#if defined(Py_GIL_DISABLED) + return _Py_IsImmortal(op); +#else + return (op->ob_refcnt >= _Py_IMMORTAL_REFCNT_LOOSE); +#endif +} +#define _Py_IsImmortalLoose(op) _Py_IsImmortalLoose(_PyObject_CAST(op)) + + +/* Check if an object is consistent. For example, ensure that the reference + counter is greater than or equal to 1, and ensure that ob_type is not NULL. + + Call _PyObject_AssertFailed() if the object is inconsistent. + + If check_content is zero, only check header fields: reduce the overhead. + + The function always return 1. The return value is just here to be able to + write: + + assert(_PyObject_CheckConsistency(obj, 1)); */ +extern int _PyObject_CheckConsistency(PyObject *op, int check_content); + +extern void _PyDebugAllocatorStats(FILE *out, const char *block_name, + int num_blocks, size_t sizeof_block); + +extern void _PyObject_DebugTypeStats(FILE *out); + +#ifdef Py_TRACE_REFS +// Forget a reference registered by _Py_NewReference(). Function called by +// _Py_Dealloc(). +// +// On a free list, the function can be used before modifying an object to +// remove the object from traced objects. Then _Py_NewReference() or +// _Py_NewReferenceNoTotal() should be called again on the object to trace +// it again. +extern void _Py_ForgetReference(PyObject *); +#endif + +// Export for shared _testinternalcapi extension +PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); /* We need to maintain an internal copy of Py{Var}Object_HEAD_INIT to avoid designated initializer conflicts in C++20. If we use the deinition in @@ -22,17 +79,24 @@ extern "C" { Furthermore, we can't use designated initializers in Extensions since these are not supported pre-C++20. Thus, keeping an internal copy here is the most backwards compatible solution */ +#if defined(Py_GIL_DISABLED) +#define _PyObject_HEAD_INIT(type) \ + { \ + .ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL, \ + .ob_type = (type) \ + } +#else #define _PyObject_HEAD_INIT(type) \ { \ - _PyObject_EXTRA_INIT \ .ob_refcnt = _Py_IMMORTAL_REFCNT, \ .ob_type = (type) \ - }, + } +#endif #define _PyVarObject_HEAD_INIT(type, size) \ { \ - .ob_base = _PyObject_HEAD_INIT(type) \ + .ob_base = _PyObject_HEAD_INIT(type), \ .ob_size = size \ - }, + } PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc( const char *func, @@ -47,9 +111,9 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc( built against the pre-3.12 stable ABI. */ PyAPI_DATA(Py_ssize_t) _Py_RefTotal; -extern void _Py_AddRefTotal(PyInterpreterState *, Py_ssize_t); -extern void _Py_IncRefTotal(PyInterpreterState *); -extern void _Py_DecRefTotal(PyInterpreterState *); +extern void _Py_AddRefTotal(PyThreadState *, Py_ssize_t); +extern void _Py_IncRefTotal(PyThreadState *); +extern void _Py_DecRefTotal(PyThreadState *); # define _Py_DEC_REFTOTAL(interp) \ interp->object_state.reftotal-- @@ -62,26 +126,54 @@ static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n) return; } #ifdef Py_REF_DEBUG - _Py_AddRefTotal(_PyInterpreterState_GET(), n); + _Py_AddRefTotal(_PyThreadState_GET(), n); #endif +#if !defined(Py_GIL_DISABLED) op->ob_refcnt += n; +#else + if (_Py_IsOwnedByCurrentThread(op)) { + uint32_t local = op->ob_ref_local; + Py_ssize_t refcnt = (Py_ssize_t)local + n; +# if PY_SSIZE_T_MAX > UINT32_MAX + if (refcnt > (Py_ssize_t)UINT32_MAX) { + // Make the object immortal if the 32-bit local reference count + // would overflow. + refcnt = _Py_IMMORTAL_REFCNT_LOCAL; + } +# endif + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, (uint32_t)refcnt); + } + else { + _Py_atomic_add_ssize(&op->ob_ref_shared, (n << _Py_REF_SHARED_SHIFT)); + } +#endif } #define _Py_RefcntAdd(op, n) _Py_RefcntAdd(_PyObject_CAST(op), n) -static inline void _Py_SetImmortal(PyObject *op) +extern void _Py_SetImmortal(PyObject *op); +extern void _Py_SetImmortalUntracked(PyObject *op); + +// Makes an immortal object mortal again with the specified refcnt. Should only +// be used during runtime finalization. +static inline void _Py_SetMortal(PyObject *op, Py_ssize_t refcnt) { if (op) { - op->ob_refcnt = _Py_IMMORTAL_REFCNT; + assert(_Py_IsImmortalLoose(op)); +#ifdef Py_GIL_DISABLED + op->ob_tid = _Py_UNOWNED_TID; + op->ob_ref_local = 0; + op->ob_ref_shared = _Py_REF_SHARED(refcnt, _Py_REF_MERGED); +#else + op->ob_refcnt = refcnt; +#endif } } -#define _Py_SetImmortal(op) _Py_SetImmortal(_PyObject_CAST(op)) /* _Py_ClearImmortal() should only be used during runtime finalization. */ static inline void _Py_ClearImmortal(PyObject *op) { if (op) { - assert(op->ob_refcnt == _Py_IMMORTAL_REFCNT); - op->ob_refcnt = 1; + _Py_SetMortal(op, 1); Py_DECREF(op); } } @@ -91,6 +183,22 @@ static inline void _Py_ClearImmortal(PyObject *op) op = NULL; \ } while (0) +// Mark an object as supporting deferred reference counting. This is a no-op +// in the default (with GIL) build. Objects that use deferred reference +// counting should be tracked by the GC so that they are eventually collected. +extern void _PyObject_SetDeferredRefcount(PyObject *op); + +static inline int +_PyObject_HasDeferredRefcount(PyObject *op) +{ +#ifdef Py_GIL_DISABLED + return _PyObject_HAS_GC_BITS(op, _PyGC_BITS_DEFERRED); +#else + return 0; +#endif +} + +#if !defined(Py_GIL_DISABLED) static inline void _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) { @@ -99,7 +207,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG - _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); + _Py_DEC_REFTOTAL(PyInterpreterState_Get()); #endif if (--op->ob_refcnt != 0) { assert(op->ob_refcnt > 0); @@ -108,6 +216,11 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) #ifdef Py_TRACE_REFS _Py_ForgetReference(op); #endif + struct _reftracer_runtime_state *tracer = &_PyRuntime.ref_tracer; + if (tracer->tracer_func != NULL) { + void* data = tracer->tracer_data; + tracer->tracer_func(op, PyRefTracer_DESTROY, data); + } destruct(op); } } @@ -120,7 +233,7 @@ _Py_DECREF_NO_DEALLOC(PyObject *op) } _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG - _Py_DEC_REFTOTAL(_PyInterpreterState_GET()); + _Py_DEC_REFTOTAL(PyInterpreterState_Get()); #endif op->ob_refcnt--; #ifdef Py_DEBUG @@ -130,29 +243,62 @@ _Py_DECREF_NO_DEALLOC(PyObject *op) #endif } +#else +// TODO: implement Py_DECREF specializations for Py_GIL_DISABLED build +static inline void +_Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) +{ + Py_DECREF(op); +} + +static inline void +_Py_DECREF_NO_DEALLOC(PyObject *op) +{ + Py_DECREF(op); +} + +static inline int +_Py_REF_IS_MERGED(Py_ssize_t ob_ref_shared) +{ + return (ob_ref_shared & _Py_REF_SHARED_FLAG_MASK) == _Py_REF_MERGED; +} + +static inline int +_Py_REF_IS_QUEUED(Py_ssize_t ob_ref_shared) +{ + return (ob_ref_shared & _Py_REF_SHARED_FLAG_MASK) == _Py_REF_QUEUED; +} + +// Merge the local and shared reference count fields and add `extra` to the +// refcount when merging. +Py_ssize_t _Py_ExplicitMergeRefcount(PyObject *op, Py_ssize_t extra); +#endif // !defined(Py_GIL_DISABLED) + #ifdef Py_REF_DEBUG # undef _Py_DEC_REFTOTAL #endif -PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); -PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); +extern int _PyType_CheckConsistency(PyTypeObject *type); +extern int _PyDict_CheckConsistency(PyObject *mp, int check_content); /* Update the Python traceback of an object. This function must be called when a memory block is reused from a free list. Internal function called by _Py_NewReference(). */ -extern int _PyTraceMalloc_NewReference(PyObject *op); +extern int _PyTraceMalloc_TraceRef(PyObject *op, PyRefTracerEvent event, void*); // Fast inlined version of PyType_HasFeature() static inline int _PyType_HasFeature(PyTypeObject *type, unsigned long feature) { - return ((type->tp_flags & feature) != 0); + return ((FT_ATOMIC_LOAD_ULONG_RELAXED(type->tp_flags) & feature) != 0); } extern void _PyType_InitCache(PyInterpreterState *interp); -extern void _PyObject_InitState(PyInterpreterState *interp); +extern PyStatus _PyObject_InitState(PyInterpreterState *interp); +extern void _PyObject_FiniState(PyInterpreterState *interp); +extern bool _PyRefchain_IsTraced(PyInterpreterState *interp, PyObject *obj); /* Inline functions trading binary compatibility for speed: _PyObject_Init() is the fast version of PyObject_Init(), and @@ -164,9 +310,8 @@ _PyObject_Init(PyObject *op, PyTypeObject *typeobj) { assert(op != NULL); Py_SET_TYPE(op, typeobj); - if (_PyType_HasFeature(typeobj, Py_TPFLAGS_HEAPTYPE)) { - Py_INCREF(typeobj); - } + assert(_PyType_HasFeature(typeobj, Py_TPFLAGS_HEAPTYPE) || _Py_IsImmortalLoose(typeobj)); + Py_INCREF(typeobj); _Py_NewReference(op); } @@ -203,7 +348,9 @@ static inline void _PyObject_GC_TRACK( _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), "object already tracked by the garbage collector", filename, lineno, __func__); - +#ifdef Py_GIL_DISABLED + _PyObject_SET_GC_BITS(op, _PyGC_BITS_TRACKED); +#else PyGC_Head *gc = _Py_AS_GC(op); _PyObject_ASSERT_FROM(op, (gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0, @@ -217,6 +364,7 @@ static inline void _PyObject_GC_TRACK( _PyGCHead_SET_PREV(gc, last); _PyGCHead_SET_NEXT(gc, generation0); generation0->_gc_prev = (uintptr_t)gc; +#endif } /* Tell the GC to stop tracking this object. @@ -240,6 +388,9 @@ static inline void _PyObject_GC_UNTRACK( "object not tracked by the garbage collector", filename, lineno, __func__); +#ifdef Py_GIL_DISABLED + _PyObject_CLEAR_GC_BITS(op, _PyGC_BITS_TRACKED); +#else PyGC_Head *gc = _Py_AS_GC(op); PyGC_Head *prev = _PyGCHead_PREV(gc); PyGC_Head *next = _PyGCHead_NEXT(gc); @@ -247,6 +398,7 @@ static inline void _PyObject_GC_UNTRACK( _PyGCHead_SET_PREV(next, prev); gc->_gc_next = 0; gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; +#endif } // Macros to accept any type for the parameter, and to automatically pass @@ -264,6 +416,179 @@ static inline void _PyObject_GC_UNTRACK( _PyObject_GC_UNTRACK(__FILE__, __LINE__, _PyObject_CAST(op)) #endif +#ifdef Py_GIL_DISABLED + +/* Tries to increment an object's reference count + * + * This is a specialized version of _Py_TryIncref that only succeeds if the + * object is immortal or local to this thread. It does not handle the case + * where the reference count modification requires an atomic operation. This + * allows call sites to specialize for the immortal/local case. + */ +static inline int +_Py_TryIncrefFast(PyObject *op) { + uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); + local += 1; + if (local == 0) { + // immortal + return 1; + } + if (_Py_IsOwnedByCurrentThread(op)) { + _Py_INCREF_STAT_INC(); + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local); +#ifdef Py_REF_DEBUG + _Py_IncRefTotal(_PyThreadState_GET()); +#endif + return 1; + } + return 0; +} + +static inline int +_Py_TryIncRefShared(PyObject *op) +{ + Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared); + for (;;) { + // If the shared refcount is zero and the object is either merged + // or may not have weak references, then we cannot incref it. + if (shared == 0 || shared == _Py_REF_MERGED) { + return 0; + } + + if (_Py_atomic_compare_exchange_ssize( + &op->ob_ref_shared, + &shared, + shared + (1 << _Py_REF_SHARED_SHIFT))) { +#ifdef Py_REF_DEBUG + _Py_IncRefTotal(_PyThreadState_GET()); +#endif + _Py_INCREF_STAT_INC(); + return 1; + } + } +} + +/* Tries to incref the object op and ensures that *src still points to it. */ +static inline int +_Py_TryIncrefCompare(PyObject **src, PyObject *op) +{ + if (_Py_TryIncrefFast(op)) { + return 1; + } + if (!_Py_TryIncRefShared(op)) { + return 0; + } + if (op != _Py_atomic_load_ptr(src)) { + Py_DECREF(op); + return 0; + } + return 1; +} + +/* Loads and increfs an object from ptr, which may contain a NULL value. + Safe with concurrent (atomic) updates to ptr. + NOTE: The writer must set maybe-weakref on the stored object! */ +static inline PyObject * +_Py_XGetRef(PyObject **ptr) +{ + for (;;) { + PyObject *value = _Py_atomic_load_ptr(ptr); + if (value == NULL) { + return value; + } + if (_Py_TryIncrefCompare(ptr, value)) { + return value; + } + } +} + +/* Attempts to loads and increfs an object from ptr. Returns NULL + on failure, which may be due to a NULL value or a concurrent update. */ +static inline PyObject * +_Py_TryXGetRef(PyObject **ptr) +{ + PyObject *value = _Py_atomic_load_ptr(ptr); + if (value == NULL) { + return value; + } + if (_Py_TryIncrefCompare(ptr, value)) { + return value; + } + return NULL; +} + +/* Like Py_NewRef but also optimistically sets _Py_REF_MAYBE_WEAKREF + on objects owned by a different thread. */ +static inline PyObject * +_Py_NewRefWithLock(PyObject *op) +{ + if (_Py_TryIncrefFast(op)) { + return op; + } +#ifdef Py_REF_DEBUG + _Py_IncRefTotal(_PyThreadState_GET()); +#endif + _Py_INCREF_STAT_INC(); + for (;;) { + Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared); + Py_ssize_t new_shared = shared + (1 << _Py_REF_SHARED_SHIFT); + if ((shared & _Py_REF_SHARED_FLAG_MASK) == 0) { + new_shared |= _Py_REF_MAYBE_WEAKREF; + } + if (_Py_atomic_compare_exchange_ssize( + &op->ob_ref_shared, + &shared, + new_shared)) { + return op; + } + } +} + +static inline PyObject * +_Py_XNewRefWithLock(PyObject *obj) +{ + if (obj == NULL) { + return NULL; + } + return _Py_NewRefWithLock(obj); +} + +static inline void +_PyObject_SetMaybeWeakref(PyObject *op) +{ + if (_Py_IsImmortal(op)) { + return; + } + for (;;) { + Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared); + if ((shared & _Py_REF_SHARED_FLAG_MASK) != 0) { + // Nothing to do if it's in WEAKREFS, QUEUED, or MERGED states. + return; + } + if (_Py_atomic_compare_exchange_ssize( + &op->ob_ref_shared, &shared, shared | _Py_REF_MAYBE_WEAKREF)) { + return; + } + } +} + +#endif + +/* Tries to incref op and returns 1 if successful or 0 otherwise. */ +static inline int +_Py_TryIncref(PyObject *op) +{ +#ifdef Py_GIL_DISABLED + return _Py_TryIncrefFast(op) || _Py_TryIncRefShared(op); +#else + if (Py_REFCNT(op) > 0) { + Py_INCREF(op); + return 1; + } + return 0; +#endif +} + #ifdef Py_REF_DEBUG extern void _PyInterpreterState_FinalizeRefTotal(PyInterpreterState *); extern void _Py_FinalizeRefTotal(_PyRuntimeState *); @@ -271,7 +596,7 @@ extern void _PyDebug_PrintTotalRefs(void); #endif #ifdef Py_TRACE_REFS -extern void _Py_AddToAllObjects(PyObject *op, int force); +extern void _Py_AddToAllObjects(PyObject *op); extern void _Py_PrintReferences(PyInterpreterState *, FILE *); extern void _Py_PrintReferenceAddresses(PyInterpreterState *, FILE *); #endif @@ -292,7 +617,7 @@ _PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) if (PyType_Check(op) && ((PyTypeObject *)op)->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN) { PyInterpreterState *interp = _PyInterpreterState_GET(); - static_builtin_state *state = _PyStaticType_GetState( + managed_static_type_state *state = _PyStaticType_GetState( interp, (PyTypeObject *)op); return _PyStaticType_GET_WEAKREFS_LISTPTR(state); } @@ -322,14 +647,27 @@ _PyObject_GET_WEAKREFS_LISTPTR_FROM_OFFSET(PyObject *op) return (PyWeakReference **)((char *)op + offset); } - // Fast inlined version of PyObject_IS_GC() static inline int _PyObject_IS_GC(PyObject *obj) { - return (PyType_IS_GC(Py_TYPE(obj)) - && (Py_TYPE(obj)->tp_is_gc == NULL - || Py_TYPE(obj)->tp_is_gc(obj))); + PyTypeObject *type = Py_TYPE(obj); + return (PyType_IS_GC(type) + && (type->tp_is_gc == NULL || type->tp_is_gc(obj))); +} + +// Fast inlined version of PyObject_Hash() +static inline Py_hash_t +_PyObject_HashFast(PyObject *op) +{ + if (PyUnicode_CheckExact(op)) { + Py_hash_t hash = FT_ATOMIC_LOAD_SSIZE_RELAXED( + _PyASCIIObject_CAST(op)->hash); + if (hash != -1) { + return hash; + } + } + return PyObject_Hash(op); } // Fast inlined version of PyType_IS_GC() @@ -338,8 +676,12 @@ _PyObject_IS_GC(PyObject *obj) static inline size_t _PyType_PreHeaderSize(PyTypeObject *tp) { - return _PyType_IS_GC(tp) * sizeof(PyGC_Head) + - _PyType_HasFeature(tp, Py_TPFLAGS_PREHEADER) * 2 * sizeof(PyObject *); + return ( +#ifndef Py_GIL_DISABLED + _PyType_IS_GC(tp) * sizeof(PyGC_Head) + +#endif + _PyType_HasFeature(tp, Py_TPFLAGS_PREHEADER) * 2 * sizeof(PyObject *) + ); } void _PyObject_GC_Link(PyObject *op); @@ -356,59 +698,68 @@ static inline int _PyType_SUPPORTS_WEAKREFS(PyTypeObject *type) { } extern PyObject* _PyType_AllocNoTrack(PyTypeObject *type, Py_ssize_t nitems); - -extern int _PyObject_InitializeDict(PyObject *obj); -extern int _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values, - PyObject *name, PyObject *value); -PyObject * _PyObject_GetInstanceAttribute(PyObject *obj, PyDictValues *values, - PyObject *name); +extern PyObject *_PyType_NewManagedObject(PyTypeObject *type); + +extern PyTypeObject* _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); +extern PyObject* _PyType_GetDocFromInternalDoc(const char *, const char *); +extern PyObject* _PyType_GetTextSignatureFromInternalDoc(const char *, const char *, int); +extern int _PyObject_SetAttributeErrorContext(PyObject *v, PyObject* name); + +void _PyObject_InitInlineValues(PyObject *obj, PyTypeObject *tp); +extern int _PyObject_StoreInstanceAttribute(PyObject *obj, + PyObject *name, PyObject *value); +extern bool _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name, + PyObject **attr); + +#ifdef Py_GIL_DISABLED +# define MANAGED_DICT_OFFSET (((Py_ssize_t)sizeof(PyObject *))*-1) +# define MANAGED_WEAKREF_OFFSET (((Py_ssize_t)sizeof(PyObject *))*-2) +#else +# define MANAGED_DICT_OFFSET (((Py_ssize_t)sizeof(PyObject *))*-3) +# define MANAGED_WEAKREF_OFFSET (((Py_ssize_t)sizeof(PyObject *))*-4) +#endif typedef union { - PyObject *dict; - /* Use a char* to generate a warning if directly assigning a PyDictValues */ - char *values; -} PyDictOrValues; + PyDictObject *dict; +} PyManagedDictPointer; -static inline PyDictOrValues * -_PyObject_DictOrValuesPointer(PyObject *obj) +static inline PyManagedDictPointer * +_PyObject_ManagedDictPointer(PyObject *obj) { assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); - return ((PyDictOrValues *)obj)-3; + return (PyManagedDictPointer *)((char *)obj + MANAGED_DICT_OFFSET); } -static inline int -_PyDictOrValues_IsValues(PyDictOrValues dorv) +static inline PyDictObject * +_PyObject_GetManagedDict(PyObject *obj) { - return ((uintptr_t)dorv.values) & 1; + PyManagedDictPointer *dorv = _PyObject_ManagedDictPointer(obj); + return (PyDictObject *)FT_ATOMIC_LOAD_PTR_ACQUIRE(dorv->dict); } static inline PyDictValues * -_PyDictOrValues_GetValues(PyDictOrValues dorv) +_PyObject_InlineValues(PyObject *obj) { - assert(_PyDictOrValues_IsValues(dorv)); - return (PyDictValues *)(dorv.values + 1); + assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_INLINE_VALUES); + assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); + assert(Py_TYPE(obj)->tp_basicsize == sizeof(PyObject)); + return (PyDictValues *)((char *)obj + sizeof(PyObject)); } -static inline PyObject * -_PyDictOrValues_GetDict(PyDictOrValues dorv) -{ - assert(!_PyDictOrValues_IsValues(dorv)); - return dorv.dict; -} +extern PyObject ** _PyObject_ComputedDictPointer(PyObject *); +extern int _PyObject_IsInstanceDictEmpty(PyObject *); -static inline void -_PyDictOrValues_SetValues(PyDictOrValues *ptr, PyDictValues *values) -{ - ptr->values = ((char *)values) - 1; -} +// Export for 'math' shared extension +PyAPI_FUNC(PyObject*) _PyObject_LookupSpecial(PyObject *, PyObject *); -#define MANAGED_WEAKREF_OFFSET (((Py_ssize_t)sizeof(PyObject *))*-4) +extern int _PyObject_IsAbstract(PyObject *); -extern PyObject ** _PyObject_ComputedDictPointer(PyObject *); -extern void _PyObject_FreeInstanceAttributes(PyObject *obj); -extern int _PyObject_IsInstanceDictEmpty(PyObject *); +PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); +extern PyObject* _PyObject_NextNotImplemented(PyObject *); -PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, PyObject *); +// Pickle support. +// Export for '_datetime' shared extension +PyAPI_FUNC(PyObject*) _PyObject_GetState(PyObject *); /* C function call trampolines to mitigate bad function pointer casts. * @@ -424,19 +775,23 @@ PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, PyObject *); * Third party code unintentionally rely on problematic fpcasts. The call * trampoline mitigates common occurrences of bad fpcasts on Emscripten. */ -#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) -#define _PyCFunction_TrampolineCall(meth, self, args) \ - _PyCFunctionWithKeywords_TrampolineCall( \ - (*(PyCFunctionWithKeywords)(void(*)(void))(meth)), (self), (args), NULL) -extern PyObject* _PyCFunctionWithKeywords_TrampolineCall( - PyCFunctionWithKeywords meth, PyObject *, PyObject *, PyObject *); -#else +#if !(defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE)) #define _PyCFunction_TrampolineCall(meth, self, args) \ (meth)((self), (args)) #define _PyCFunctionWithKeywords_TrampolineCall(meth, self, args, kw) \ (meth)((self), (args), (kw)) #endif // __EMSCRIPTEN__ && PY_CALL_TRAMPOLINE +// Export these 2 symbols for '_pickle' shared extension +PyAPI_DATA(PyTypeObject) _PyNone_Type; +PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; + +// Maps Py_LT to Py_GT, ..., Py_GE to Py_LE. +// Export for the stable ABI. +PyAPI_DATA(int) _Py_SwappedOp[]; + +extern void _Py_GetConstant_Init(void); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_object_alloc.h b/Include/internal/pycore_object_alloc.h new file mode 100644 index 00000000..8cc7a444 --- /dev/null +++ b/Include/internal/pycore_object_alloc.h @@ -0,0 +1,71 @@ +#ifndef Py_INTERNAL_OBJECT_ALLOC_H +#define Py_INTERNAL_OBJECT_ALLOC_H + +#include "pycore_object.h" // _PyType_HasFeature() +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_tstate.h" // _PyThreadStateImpl + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef Py_GIL_DISABLED +static inline mi_heap_t * +_PyObject_GetAllocationHeap(_PyThreadStateImpl *tstate, PyTypeObject *tp) +{ + struct _mimalloc_thread_state *m = &tstate->mimalloc; + if (_PyType_HasFeature(tp, Py_TPFLAGS_PREHEADER)) { + return &m->heaps[_Py_MIMALLOC_HEAP_GC_PRE]; + } + else if (_PyType_IS_GC(tp)) { + return &m->heaps[_Py_MIMALLOC_HEAP_GC]; + } + else { + return &m->heaps[_Py_MIMALLOC_HEAP_OBJECT]; + } +} +#endif + +// Sets the heap used for PyObject_Malloc(), PyObject_Realloc(), etc. calls in +// Py_GIL_DISABLED builds. We use different heaps depending on if the object +// supports GC and if it has a pre-header. We smuggle the choice of heap +// through the _mimalloc_thread_state. In the default build, this simply +// calls PyObject_Malloc(). +static inline void * +_PyObject_MallocWithType(PyTypeObject *tp, size_t size) +{ +#ifdef Py_GIL_DISABLED + _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET(); + struct _mimalloc_thread_state *m = &tstate->mimalloc; + m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp); +#endif + void *mem = PyObject_Malloc(size); +#ifdef Py_GIL_DISABLED + m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT]; +#endif + return mem; +} + +static inline void * +_PyObject_ReallocWithType(PyTypeObject *tp, void *ptr, size_t size) +{ +#ifdef Py_GIL_DISABLED + _PyThreadStateImpl *tstate = (_PyThreadStateImpl *)_PyThreadState_GET(); + struct _mimalloc_thread_state *m = &tstate->mimalloc; + m->current_object_heap = _PyObject_GetAllocationHeap(tstate, tp); +#endif + void *mem = PyObject_Realloc(ptr, size); +#ifdef Py_GIL_DISABLED + m->current_object_heap = &m->heaps[_Py_MIMALLOC_HEAP_OBJECT]; +#endif + return mem; +} + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_OBJECT_ALLOC_H diff --git a/Include/internal/pycore_object_stack.h b/Include/internal/pycore_object_stack.h new file mode 100644 index 00000000..639f3c0c --- /dev/null +++ b/Include/internal/pycore_object_stack.h @@ -0,0 +1,97 @@ +#ifndef Py_INTERNAL_OBJECT_STACK_H +#define Py_INTERNAL_OBJECT_STACK_H + +#include "pycore_freelist.h" // _PyFreeListState + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// _PyObjectStack is a stack of Python objects implemented as a linked list of +// fixed size buffers. + +// Chosen so that _PyObjectStackChunk is a power-of-two size. +#define _Py_OBJECT_STACK_CHUNK_SIZE 254 + +typedef struct _PyObjectStackChunk { + struct _PyObjectStackChunk *prev; + Py_ssize_t n; + PyObject *objs[_Py_OBJECT_STACK_CHUNK_SIZE]; +} _PyObjectStackChunk; + +typedef struct _PyObjectStack { + _PyObjectStackChunk *head; +} _PyObjectStack; + + +extern _PyObjectStackChunk * +_PyObjectStackChunk_New(void); + +extern void +_PyObjectStackChunk_Free(_PyObjectStackChunk *); + +// Push an item onto the stack. Return -1 on allocation failure, 0 on success. +static inline int +_PyObjectStack_Push(_PyObjectStack *stack, PyObject *obj) +{ + _PyObjectStackChunk *buf = stack->head; + if (buf == NULL || buf->n == _Py_OBJECT_STACK_CHUNK_SIZE) { + buf = _PyObjectStackChunk_New(); + if (buf == NULL) { + return -1; + } + buf->prev = stack->head; + buf->n = 0; + stack->head = buf; + } + + assert(buf->n >= 0 && buf->n < _Py_OBJECT_STACK_CHUNK_SIZE); + buf->objs[buf->n] = obj; + buf->n++; + return 0; +} + +// Pop the top item from the stack. Return NULL if the stack is empty. +static inline PyObject * +_PyObjectStack_Pop(_PyObjectStack *stack) +{ + _PyObjectStackChunk *buf = stack->head; + if (buf == NULL) { + return NULL; + } + assert(buf->n > 0 && buf->n <= _Py_OBJECT_STACK_CHUNK_SIZE); + buf->n--; + PyObject *obj = buf->objs[buf->n]; + if (buf->n == 0) { + stack->head = buf->prev; + _PyObjectStackChunk_Free(buf); + } + return obj; +} + +static inline Py_ssize_t +_PyObjectStack_Size(_PyObjectStack *stack) +{ + Py_ssize_t size = 0; + for (_PyObjectStackChunk *buf = stack->head; buf != NULL; buf = buf->prev) { + size += buf->n; + } + return size; +} + +// Merge src into dst, leaving src empty +extern void +_PyObjectStack_Merge(_PyObjectStack *dst, _PyObjectStack *src); + +// Remove all items from the stack +extern void +_PyObjectStack_Clear(_PyObjectStack *stack); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_OBJECT_STACK_H diff --git a/Include/internal/pycore_object_state.h b/Include/internal/pycore_object_state.h index 65feb5af..cd7c9335 100644 --- a/Include/internal/pycore_object_state.h +++ b/Include/internal/pycore_object_state.h @@ -8,6 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_freelist.h" // _PyObject_freelists +#include "pycore_hashtable.h" // _Py_hashtable_t + struct _py_object_runtime_state { #ifdef Py_REF_DEBUG Py_ssize_t interpreter_leaks; @@ -16,15 +19,17 @@ struct _py_object_runtime_state { }; struct _py_object_state { +#if !defined(Py_GIL_DISABLED) + struct _Py_object_freelists freelists; +#endif #ifdef Py_REF_DEBUG Py_ssize_t reftotal; #endif #ifdef Py_TRACE_REFS - /* Head of circular doubly-linked list of all objects. These are linked - * together via the _ob_prev and _ob_next members of a PyObject, which - * exist only in a Py_TRACE_REFS build. - */ - PyObject refchain; + // Hash table storing all objects. The key is the object pointer + // (PyObject*) and the value is always the number 1 (as uintptr_t). + // See _PyRefchain_IsTraced() and _PyRefchain_Trace() functions. + _Py_hashtable_t *refchain; #endif int _not_used; }; diff --git a/Include/internal/pycore_obmalloc.h b/Include/internal/pycore_obmalloc.h index ca2a0419..9140d8f0 100644 --- a/Include/internal/pycore_obmalloc.h +++ b/Include/internal/pycore_obmalloc.h @@ -665,7 +665,9 @@ struct _obmalloc_global_state { struct _obmalloc_state { struct _obmalloc_pools pools; struct _obmalloc_mgmt mgmt; +#if WITH_PYMALLOC_RADIX_TREE struct _obmalloc_usage usage; +#endif }; @@ -684,10 +686,12 @@ extern Py_ssize_t _Py_GetGlobalAllocatedBlocks(void); _Py_GetGlobalAllocatedBlocks() extern Py_ssize_t _PyInterpreterState_GetAllocatedBlocks(PyInterpreterState *); extern void _PyInterpreterState_FinalizeAllocatedBlocks(PyInterpreterState *); +extern int _PyMem_init_obmalloc(PyInterpreterState *interp); +extern bool _PyMem_obmalloc_state_on_heap(PyInterpreterState *interp); #ifdef WITH_PYMALLOC -// Export the symbol for the 3rd party guppy3 project +// Export the symbol for the 3rd party 'guppy3' project PyAPI_FUNC(int) _PyObject_DebugMallocStats(FILE *out); #endif diff --git a/Include/internal/pycore_obmalloc_init.h b/Include/internal/pycore_obmalloc_init.h index 8ee72ff2..e6811b7a 100644 --- a/Include/internal/pycore_obmalloc_init.h +++ b/Include/internal/pycore_obmalloc_init.h @@ -59,13 +59,6 @@ extern "C" { .dump_debug_stats = -1, \ } -#define _obmalloc_state_INIT(obmalloc) \ - { \ - .pools = { \ - .used = _obmalloc_pools_INIT(obmalloc.pools), \ - }, \ - } - #ifdef __cplusplus } diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h deleted file mode 100644 index 15d96503..00000000 --- a/Include/internal/pycore_opcode.h +++ /dev/null @@ -1,587 +0,0 @@ -// Auto-generated by Tools/build/generate_opcode_h.py from Lib/opcode.py - -#ifndef Py_INTERNAL_OPCODE_H -#define Py_INTERNAL_OPCODE_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#include "opcode.h" - -extern const uint32_t _PyOpcode_Jump[9]; - -extern const uint8_t _PyOpcode_Caches[256]; - -extern const uint8_t _PyOpcode_Deopt[256]; - -#ifdef NEED_OPCODE_TABLES -const uint32_t _PyOpcode_Jump[9] = { - 0U, - 0U, - 536870912U, - 135020544U, - 4163U, - 0U, - 0U, - 0U, - 48U, -}; - -const uint8_t _PyOpcode_Caches[256] = { - [BINARY_SUBSCR] = 1, - [STORE_SUBSCR] = 1, - [UNPACK_SEQUENCE] = 1, - [FOR_ITER] = 1, - [STORE_ATTR] = 4, - [LOAD_ATTR] = 9, - [COMPARE_OP] = 1, - [LOAD_GLOBAL] = 4, - [BINARY_OP] = 1, - [SEND] = 1, - [LOAD_SUPER_ATTR] = 1, - [CALL] = 3, -}; - -const uint8_t _PyOpcode_Deopt[256] = { - [BEFORE_ASYNC_WITH] = BEFORE_ASYNC_WITH, - [BEFORE_WITH] = BEFORE_WITH, - [BINARY_OP] = BINARY_OP, - [BINARY_OP_ADD_FLOAT] = BINARY_OP, - [BINARY_OP_ADD_INT] = BINARY_OP, - [BINARY_OP_ADD_UNICODE] = BINARY_OP, - [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP, - [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP, - [BINARY_OP_MULTIPLY_INT] = BINARY_OP, - [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP, - [BINARY_OP_SUBTRACT_INT] = BINARY_OP, - [BINARY_SLICE] = BINARY_SLICE, - [BINARY_SUBSCR] = BINARY_SUBSCR, - [BINARY_SUBSCR_DICT] = BINARY_SUBSCR, - [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR, - [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR, - [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR, - [BUILD_CONST_KEY_MAP] = BUILD_CONST_KEY_MAP, - [BUILD_LIST] = BUILD_LIST, - [BUILD_MAP] = BUILD_MAP, - [BUILD_SET] = BUILD_SET, - [BUILD_SLICE] = BUILD_SLICE, - [BUILD_STRING] = BUILD_STRING, - [BUILD_TUPLE] = BUILD_TUPLE, - [CACHE] = CACHE, - [CALL] = CALL, - [CALL_BOUND_METHOD_EXACT_ARGS] = CALL, - [CALL_BUILTIN_CLASS] = CALL, - [CALL_BUILTIN_FAST_WITH_KEYWORDS] = CALL, - [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, - [CALL_INTRINSIC_1] = CALL_INTRINSIC_1, - [CALL_INTRINSIC_2] = CALL_INTRINSIC_2, - [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = CALL, - [CALL_NO_KW_BUILTIN_FAST] = CALL, - [CALL_NO_KW_BUILTIN_O] = CALL, - [CALL_NO_KW_ISINSTANCE] = CALL, - [CALL_NO_KW_LEN] = CALL, - [CALL_NO_KW_LIST_APPEND] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = CALL, - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = CALL, - [CALL_NO_KW_STR_1] = CALL, - [CALL_NO_KW_TUPLE_1] = CALL, - [CALL_NO_KW_TYPE_1] = CALL, - [CALL_PY_EXACT_ARGS] = CALL, - [CALL_PY_WITH_DEFAULTS] = CALL, - [CHECK_EG_MATCH] = CHECK_EG_MATCH, - [CHECK_EXC_MATCH] = CHECK_EXC_MATCH, - [CLEANUP_THROW] = CLEANUP_THROW, - [COMPARE_OP] = COMPARE_OP, - [COMPARE_OP_FLOAT] = COMPARE_OP, - [COMPARE_OP_INT] = COMPARE_OP, - [COMPARE_OP_STR] = COMPARE_OP, - [CONTAINS_OP] = CONTAINS_OP, - [COPY] = COPY, - [COPY_FREE_VARS] = COPY_FREE_VARS, - [DELETE_ATTR] = DELETE_ATTR, - [DELETE_DEREF] = DELETE_DEREF, - [DELETE_FAST] = DELETE_FAST, - [DELETE_GLOBAL] = DELETE_GLOBAL, - [DELETE_NAME] = DELETE_NAME, - [DELETE_SUBSCR] = DELETE_SUBSCR, - [DICT_MERGE] = DICT_MERGE, - [DICT_UPDATE] = DICT_UPDATE, - [END_ASYNC_FOR] = END_ASYNC_FOR, - [END_FOR] = END_FOR, - [END_SEND] = END_SEND, - [EXTENDED_ARG] = EXTENDED_ARG, - [FORMAT_VALUE] = FORMAT_VALUE, - [FOR_ITER] = FOR_ITER, - [FOR_ITER_GEN] = FOR_ITER, - [FOR_ITER_LIST] = FOR_ITER, - [FOR_ITER_RANGE] = FOR_ITER, - [FOR_ITER_TUPLE] = FOR_ITER, - [GET_AITER] = GET_AITER, - [GET_ANEXT] = GET_ANEXT, - [GET_AWAITABLE] = GET_AWAITABLE, - [GET_ITER] = GET_ITER, - [GET_LEN] = GET_LEN, - [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER, - [IMPORT_FROM] = IMPORT_FROM, - [IMPORT_NAME] = IMPORT_NAME, - [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, - [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, - [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, - [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, - [INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER, - [INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION, - [INSTRUMENTED_JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD, - [INSTRUMENTED_JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD, - [INSTRUMENTED_LINE] = INSTRUMENTED_LINE, - [INSTRUMENTED_LOAD_SUPER_ATTR] = INSTRUMENTED_LOAD_SUPER_ATTR, - [INSTRUMENTED_POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE, - [INSTRUMENTED_POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE, - [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE, - [INSTRUMENTED_POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE, - [INSTRUMENTED_RESUME] = INSTRUMENTED_RESUME, - [INSTRUMENTED_RETURN_CONST] = INSTRUMENTED_RETURN_CONST, - [INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, - [INSTRUMENTED_YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, - [INTERPRETER_EXIT] = INTERPRETER_EXIT, - [IS_OP] = IS_OP, - [JUMP_BACKWARD] = JUMP_BACKWARD, - [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT, - [JUMP_FORWARD] = JUMP_FORWARD, - [KW_NAMES] = KW_NAMES, - [LIST_APPEND] = LIST_APPEND, - [LIST_EXTEND] = LIST_EXTEND, - [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR, - [LOAD_ATTR] = LOAD_ATTR, - [LOAD_ATTR_CLASS] = LOAD_ATTR, - [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = LOAD_ATTR, - [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR, - [LOAD_ATTR_METHOD_LAZY_DICT] = LOAD_ATTR, - [LOAD_ATTR_METHOD_NO_DICT] = LOAD_ATTR, - [LOAD_ATTR_METHOD_WITH_VALUES] = LOAD_ATTR, - [LOAD_ATTR_MODULE] = LOAD_ATTR, - [LOAD_ATTR_PROPERTY] = LOAD_ATTR, - [LOAD_ATTR_SLOT] = LOAD_ATTR, - [LOAD_ATTR_WITH_HINT] = LOAD_ATTR, - [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS, - [LOAD_CLOSURE] = LOAD_CLOSURE, - [LOAD_CONST] = LOAD_CONST, - [LOAD_CONST__LOAD_FAST] = LOAD_CONST, - [LOAD_DEREF] = LOAD_DEREF, - [LOAD_FAST] = LOAD_FAST, - [LOAD_FAST_AND_CLEAR] = LOAD_FAST_AND_CLEAR, - [LOAD_FAST_CHECK] = LOAD_FAST_CHECK, - [LOAD_FAST__LOAD_CONST] = LOAD_FAST, - [LOAD_FAST__LOAD_FAST] = LOAD_FAST, - [LOAD_FROM_DICT_OR_DEREF] = LOAD_FROM_DICT_OR_DEREF, - [LOAD_FROM_DICT_OR_GLOBALS] = LOAD_FROM_DICT_OR_GLOBALS, - [LOAD_GLOBAL] = LOAD_GLOBAL, - [LOAD_GLOBAL_BUILTIN] = LOAD_GLOBAL, - [LOAD_GLOBAL_MODULE] = LOAD_GLOBAL, - [LOAD_LOCALS] = LOAD_LOCALS, - [LOAD_NAME] = LOAD_NAME, - [LOAD_SUPER_ATTR] = LOAD_SUPER_ATTR, - [LOAD_SUPER_ATTR_ATTR] = LOAD_SUPER_ATTR, - [LOAD_SUPER_ATTR_METHOD] = LOAD_SUPER_ATTR, - [MAKE_CELL] = MAKE_CELL, - [MAKE_FUNCTION] = MAKE_FUNCTION, - [MAP_ADD] = MAP_ADD, - [MATCH_CLASS] = MATCH_CLASS, - [MATCH_KEYS] = MATCH_KEYS, - [MATCH_MAPPING] = MATCH_MAPPING, - [MATCH_SEQUENCE] = MATCH_SEQUENCE, - [NOP] = NOP, - [POP_EXCEPT] = POP_EXCEPT, - [POP_JUMP_IF_FALSE] = POP_JUMP_IF_FALSE, - [POP_JUMP_IF_NONE] = POP_JUMP_IF_NONE, - [POP_JUMP_IF_NOT_NONE] = POP_JUMP_IF_NOT_NONE, - [POP_JUMP_IF_TRUE] = POP_JUMP_IF_TRUE, - [POP_TOP] = POP_TOP, - [PUSH_EXC_INFO] = PUSH_EXC_INFO, - [PUSH_NULL] = PUSH_NULL, - [RAISE_VARARGS] = RAISE_VARARGS, - [RERAISE] = RERAISE, - [RESERVED] = RESERVED, - [RESUME] = RESUME, - [RETURN_CONST] = RETURN_CONST, - [RETURN_GENERATOR] = RETURN_GENERATOR, - [RETURN_VALUE] = RETURN_VALUE, - [SEND] = SEND, - [SEND_GEN] = SEND, - [SETUP_ANNOTATIONS] = SETUP_ANNOTATIONS, - [SET_ADD] = SET_ADD, - [SET_UPDATE] = SET_UPDATE, - [STORE_ATTR] = STORE_ATTR, - [STORE_ATTR_INSTANCE_VALUE] = STORE_ATTR, - [STORE_ATTR_SLOT] = STORE_ATTR, - [STORE_ATTR_WITH_HINT] = STORE_ATTR, - [STORE_DEREF] = STORE_DEREF, - [STORE_FAST] = STORE_FAST, - [STORE_FAST__LOAD_FAST] = STORE_FAST, - [STORE_FAST__STORE_FAST] = STORE_FAST, - [STORE_GLOBAL] = STORE_GLOBAL, - [STORE_NAME] = STORE_NAME, - [STORE_SLICE] = STORE_SLICE, - [STORE_SUBSCR] = STORE_SUBSCR, - [STORE_SUBSCR_DICT] = STORE_SUBSCR, - [STORE_SUBSCR_LIST_INT] = STORE_SUBSCR, - [SWAP] = SWAP, - [UNARY_INVERT] = UNARY_INVERT, - [UNARY_NEGATIVE] = UNARY_NEGATIVE, - [UNARY_NOT] = UNARY_NOT, - [UNPACK_EX] = UNPACK_EX, - [UNPACK_SEQUENCE] = UNPACK_SEQUENCE, - [UNPACK_SEQUENCE_LIST] = UNPACK_SEQUENCE, - [UNPACK_SEQUENCE_TUPLE] = UNPACK_SEQUENCE, - [UNPACK_SEQUENCE_TWO_TUPLE] = UNPACK_SEQUENCE, - [WITH_EXCEPT_START] = WITH_EXCEPT_START, - [YIELD_VALUE] = YIELD_VALUE, -}; -#endif // NEED_OPCODE_TABLES - -#ifdef Py_DEBUG -static const char *const _PyOpcode_OpName[267] = { - [CACHE] = "CACHE", - [POP_TOP] = "POP_TOP", - [PUSH_NULL] = "PUSH_NULL", - [INTERPRETER_EXIT] = "INTERPRETER_EXIT", - [END_FOR] = "END_FOR", - [END_SEND] = "END_SEND", - [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", - [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", - [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", - [NOP] = "NOP", - [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", - [UNARY_NEGATIVE] = "UNARY_NEGATIVE", - [UNARY_NOT] = "UNARY_NOT", - [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", - [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", - [UNARY_INVERT] = "UNARY_INVERT", - [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", - [RESERVED] = "RESERVED", - [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", - [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT", - [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM", - [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT", - [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", - [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", - [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", - [BINARY_SUBSCR] = "BINARY_SUBSCR", - [BINARY_SLICE] = "BINARY_SLICE", - [STORE_SLICE] = "STORE_SLICE", - [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", - [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", - [GET_LEN] = "GET_LEN", - [MATCH_MAPPING] = "MATCH_MAPPING", - [MATCH_SEQUENCE] = "MATCH_SEQUENCE", - [MATCH_KEYS] = "MATCH_KEYS", - [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", - [PUSH_EXC_INFO] = "PUSH_EXC_INFO", - [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH", - [CHECK_EG_MATCH] = "CHECK_EG_MATCH", - [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", - [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", - [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", - [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", - [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", - [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", - [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", - [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", - [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", - [WITH_EXCEPT_START] = "WITH_EXCEPT_START", - [GET_AITER] = "GET_AITER", - [GET_ANEXT] = "GET_ANEXT", - [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH", - [BEFORE_WITH] = "BEFORE_WITH", - [END_ASYNC_FOR] = "END_ASYNC_FOR", - [CLEANUP_THROW] = "CLEANUP_THROW", - [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", - [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", - [COMPARE_OP_INT] = "COMPARE_OP_INT", - [COMPARE_OP_STR] = "COMPARE_OP_STR", - [STORE_SUBSCR] = "STORE_SUBSCR", - [DELETE_SUBSCR] = "DELETE_SUBSCR", - [FOR_ITER_LIST] = "FOR_ITER_LIST", - [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", - [FOR_ITER_RANGE] = "FOR_ITER_RANGE", - [FOR_ITER_GEN] = "FOR_ITER_GEN", - [LOAD_SUPER_ATTR_ATTR] = "LOAD_SUPER_ATTR_ATTR", - [LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD", - [GET_ITER] = "GET_ITER", - [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER", - [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS", - [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS", - [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", - [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", - [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR", - [RETURN_GENERATOR] = "RETURN_GENERATOR", - [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", - [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", - [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", - [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", - [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT", - [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT", - [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES", - [RETURN_VALUE] = "RETURN_VALUE", - [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST", - [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", - [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST", - [LOAD_LOCALS] = "LOAD_LOCALS", - [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST", - [POP_EXCEPT] = "POP_EXCEPT", - [STORE_NAME] = "STORE_NAME", - [DELETE_NAME] = "DELETE_NAME", - [UNPACK_SEQUENCE] = "UNPACK_SEQUENCE", - [FOR_ITER] = "FOR_ITER", - [UNPACK_EX] = "UNPACK_EX", - [STORE_ATTR] = "STORE_ATTR", - [DELETE_ATTR] = "DELETE_ATTR", - [STORE_GLOBAL] = "STORE_GLOBAL", - [DELETE_GLOBAL] = "DELETE_GLOBAL", - [SWAP] = "SWAP", - [LOAD_CONST] = "LOAD_CONST", - [LOAD_NAME] = "LOAD_NAME", - [BUILD_TUPLE] = "BUILD_TUPLE", - [BUILD_LIST] = "BUILD_LIST", - [BUILD_SET] = "BUILD_SET", - [BUILD_MAP] = "BUILD_MAP", - [LOAD_ATTR] = "LOAD_ATTR", - [COMPARE_OP] = "COMPARE_OP", - [IMPORT_NAME] = "IMPORT_NAME", - [IMPORT_FROM] = "IMPORT_FROM", - [JUMP_FORWARD] = "JUMP_FORWARD", - [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", - [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", - [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", - [POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE", - [POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE", - [LOAD_GLOBAL] = "LOAD_GLOBAL", - [IS_OP] = "IS_OP", - [CONTAINS_OP] = "CONTAINS_OP", - [RERAISE] = "RERAISE", - [COPY] = "COPY", - [RETURN_CONST] = "RETURN_CONST", - [BINARY_OP] = "BINARY_OP", - [SEND] = "SEND", - [LOAD_FAST] = "LOAD_FAST", - [STORE_FAST] = "STORE_FAST", - [DELETE_FAST] = "DELETE_FAST", - [LOAD_FAST_CHECK] = "LOAD_FAST_CHECK", - [POP_JUMP_IF_NOT_NONE] = "POP_JUMP_IF_NOT_NONE", - [POP_JUMP_IF_NONE] = "POP_JUMP_IF_NONE", - [RAISE_VARARGS] = "RAISE_VARARGS", - [GET_AWAITABLE] = "GET_AWAITABLE", - [MAKE_FUNCTION] = "MAKE_FUNCTION", - [BUILD_SLICE] = "BUILD_SLICE", - [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT", - [MAKE_CELL] = "MAKE_CELL", - [LOAD_CLOSURE] = "LOAD_CLOSURE", - [LOAD_DEREF] = "LOAD_DEREF", - [STORE_DEREF] = "STORE_DEREF", - [DELETE_DEREF] = "DELETE_DEREF", - [JUMP_BACKWARD] = "JUMP_BACKWARD", - [LOAD_SUPER_ATTR] = "LOAD_SUPER_ATTR", - [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", - [LOAD_FAST_AND_CLEAR] = "LOAD_FAST_AND_CLEAR", - [EXTENDED_ARG] = "EXTENDED_ARG", - [LIST_APPEND] = "LIST_APPEND", - [SET_ADD] = "SET_ADD", - [MAP_ADD] = "MAP_ADD", - [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", - [COPY_FREE_VARS] = "COPY_FREE_VARS", - [YIELD_VALUE] = "YIELD_VALUE", - [RESUME] = "RESUME", - [MATCH_CLASS] = "MATCH_CLASS", - [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", - [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", - [FORMAT_VALUE] = "FORMAT_VALUE", - [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", - [BUILD_STRING] = "BUILD_STRING", - [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", - [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", - [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", - [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", - [LIST_EXTEND] = "LIST_EXTEND", - [SET_UPDATE] = "SET_UPDATE", - [DICT_MERGE] = "DICT_MERGE", - [DICT_UPDATE] = "DICT_UPDATE", - [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", - [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", - [SEND_GEN] = "SEND_GEN", - [169] = "<169>", - [170] = "<170>", - [CALL] = "CALL", - [KW_NAMES] = "KW_NAMES", - [CALL_INTRINSIC_1] = "CALL_INTRINSIC_1", - [CALL_INTRINSIC_2] = "CALL_INTRINSIC_2", - [LOAD_FROM_DICT_OR_GLOBALS] = "LOAD_FROM_DICT_OR_GLOBALS", - [LOAD_FROM_DICT_OR_DEREF] = "LOAD_FROM_DICT_OR_DEREF", - [177] = "<177>", - [178] = "<178>", - [179] = "<179>", - [180] = "<180>", - [181] = "<181>", - [182] = "<182>", - [183] = "<183>", - [184] = "<184>", - [185] = "<185>", - [186] = "<186>", - [187] = "<187>", - [188] = "<188>", - [189] = "<189>", - [190] = "<190>", - [191] = "<191>", - [192] = "<192>", - [193] = "<193>", - [194] = "<194>", - [195] = "<195>", - [196] = "<196>", - [197] = "<197>", - [198] = "<198>", - [199] = "<199>", - [200] = "<200>", - [201] = "<201>", - [202] = "<202>", - [203] = "<203>", - [204] = "<204>", - [205] = "<205>", - [206] = "<206>", - [207] = "<207>", - [208] = "<208>", - [209] = "<209>", - [210] = "<210>", - [211] = "<211>", - [212] = "<212>", - [213] = "<213>", - [214] = "<214>", - [215] = "<215>", - [216] = "<216>", - [217] = "<217>", - [218] = "<218>", - [219] = "<219>", - [220] = "<220>", - [221] = "<221>", - [222] = "<222>", - [223] = "<223>", - [224] = "<224>", - [225] = "<225>", - [226] = "<226>", - [227] = "<227>", - [228] = "<228>", - [229] = "<229>", - [230] = "<230>", - [231] = "<231>", - [232] = "<232>", - [233] = "<233>", - [234] = "<234>", - [235] = "<235>", - [236] = "<236>", - [INSTRUMENTED_LOAD_SUPER_ATTR] = "INSTRUMENTED_LOAD_SUPER_ATTR", - [INSTRUMENTED_POP_JUMP_IF_NONE] = "INSTRUMENTED_POP_JUMP_IF_NONE", - [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", - [INSTRUMENTED_RESUME] = "INSTRUMENTED_RESUME", - [INSTRUMENTED_CALL] = "INSTRUMENTED_CALL", - [INSTRUMENTED_RETURN_VALUE] = "INSTRUMENTED_RETURN_VALUE", - [INSTRUMENTED_YIELD_VALUE] = "INSTRUMENTED_YIELD_VALUE", - [INSTRUMENTED_CALL_FUNCTION_EX] = "INSTRUMENTED_CALL_FUNCTION_EX", - [INSTRUMENTED_JUMP_FORWARD] = "INSTRUMENTED_JUMP_FORWARD", - [INSTRUMENTED_JUMP_BACKWARD] = "INSTRUMENTED_JUMP_BACKWARD", - [INSTRUMENTED_RETURN_CONST] = "INSTRUMENTED_RETURN_CONST", - [INSTRUMENTED_FOR_ITER] = "INSTRUMENTED_FOR_ITER", - [INSTRUMENTED_POP_JUMP_IF_FALSE] = "INSTRUMENTED_POP_JUMP_IF_FALSE", - [INSTRUMENTED_POP_JUMP_IF_TRUE] = "INSTRUMENTED_POP_JUMP_IF_TRUE", - [INSTRUMENTED_END_FOR] = "INSTRUMENTED_END_FOR", - [INSTRUMENTED_END_SEND] = "INSTRUMENTED_END_SEND", - [INSTRUMENTED_INSTRUCTION] = "INSTRUMENTED_INSTRUCTION", - [INSTRUMENTED_LINE] = "INSTRUMENTED_LINE", - [255] = "<255>", - [SETUP_FINALLY] = "SETUP_FINALLY", - [SETUP_CLEANUP] = "SETUP_CLEANUP", - [SETUP_WITH] = "SETUP_WITH", - [POP_BLOCK] = "POP_BLOCK", - [JUMP] = "JUMP", - [JUMP_NO_INTERRUPT] = "JUMP_NO_INTERRUPT", - [LOAD_METHOD] = "LOAD_METHOD", - [LOAD_SUPER_METHOD] = "LOAD_SUPER_METHOD", - [LOAD_ZERO_SUPER_METHOD] = "LOAD_ZERO_SUPER_METHOD", - [LOAD_ZERO_SUPER_ATTR] = "LOAD_ZERO_SUPER_ATTR", - [STORE_FAST_MAYBE_NULL] = "STORE_FAST_MAYBE_NULL", -}; -#endif - -#define EXTRA_CASES \ - case 169: \ - case 170: \ - case 177: \ - case 178: \ - case 179: \ - case 180: \ - case 181: \ - case 182: \ - case 183: \ - case 184: \ - case 185: \ - case 186: \ - case 187: \ - case 188: \ - case 189: \ - case 190: \ - case 191: \ - case 192: \ - case 193: \ - case 194: \ - case 195: \ - case 196: \ - case 197: \ - case 198: \ - case 199: \ - case 200: \ - case 201: \ - case 202: \ - case 203: \ - case 204: \ - case 205: \ - case 206: \ - case 207: \ - case 208: \ - case 209: \ - case 210: \ - case 211: \ - case 212: \ - case 213: \ - case 214: \ - case 215: \ - case 216: \ - case 217: \ - case 218: \ - case 219: \ - case 220: \ - case 221: \ - case 222: \ - case 223: \ - case 224: \ - case 225: \ - case 226: \ - case 227: \ - case 228: \ - case 229: \ - case 230: \ - case 231: \ - case 232: \ - case 233: \ - case 234: \ - case 235: \ - case 236: \ - case 255: \ - ; - -#ifdef __cplusplus -} -#endif -#endif // !Py_INTERNAL_OPCODE_H diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h new file mode 100644 index 00000000..bbba0bbb --- /dev/null +++ b/Include/internal/pycore_opcode_metadata.h @@ -0,0 +1,1922 @@ +// This file is generated by Tools/cases_generator/opcode_metadata_generator.py +// from: +// Python/bytecodes.c +// Do not edit! + +#ifndef Py_CORE_OPCODE_METADATA_H +#define Py_CORE_OPCODE_METADATA_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include // bool +#include "opcode_ids.h" + + +#define IS_PSEUDO_INSTR(OP) ( \ + ((OP) == LOAD_CLOSURE) || \ + ((OP) == STORE_FAST_MAYBE_NULL) || \ + ((OP) == LOAD_SUPER_METHOD) || \ + ((OP) == LOAD_ZERO_SUPER_METHOD) || \ + ((OP) == LOAD_ZERO_SUPER_ATTR) || \ + ((OP) == LOAD_METHOD) || \ + ((OP) == JUMP) || \ + ((OP) == JUMP_NO_INTERRUPT) || \ + ((OP) == SETUP_FINALLY) || \ + ((OP) == SETUP_CLEANUP) || \ + ((OP) == SETUP_WITH) || \ + ((OP) == POP_BLOCK) || \ + 0) + +#include "pycore_uop_ids.h" +extern int _PyOpcode_num_popped(int opcode, int oparg); +#ifdef NEED_OPCODE_METADATA +int _PyOpcode_num_popped(int opcode, int oparg) { + switch(opcode) { + case BEFORE_ASYNC_WITH: + return 1; + case BEFORE_WITH: + return 1; + case BINARY_OP: + return 2; + case BINARY_OP_ADD_FLOAT: + return 2; + case BINARY_OP_ADD_INT: + return 2; + case BINARY_OP_ADD_UNICODE: + return 2; + case BINARY_OP_INPLACE_ADD_UNICODE: + return 2; + case BINARY_OP_MULTIPLY_FLOAT: + return 2; + case BINARY_OP_MULTIPLY_INT: + return 2; + case BINARY_OP_SUBTRACT_FLOAT: + return 2; + case BINARY_OP_SUBTRACT_INT: + return 2; + case BINARY_SLICE: + return 3; + case BINARY_SUBSCR: + return 2; + case BINARY_SUBSCR_DICT: + return 2; + case BINARY_SUBSCR_GETITEM: + return 2; + case BINARY_SUBSCR_LIST_INT: + return 2; + case BINARY_SUBSCR_STR_INT: + return 2; + case BINARY_SUBSCR_TUPLE_INT: + return 2; + case BUILD_CONST_KEY_MAP: + return 1 + oparg; + case BUILD_LIST: + return oparg; + case BUILD_MAP: + return oparg*2; + case BUILD_SET: + return oparg; + case BUILD_SLICE: + return 2 + ((oparg == 3) ? 1 : 0); + case BUILD_STRING: + return oparg; + case BUILD_TUPLE: + return oparg; + case CACHE: + return 0; + case CALL: + return 2 + oparg; + case CALL_ALLOC_AND_ENTER_INIT: + return 2 + oparg; + case CALL_BOUND_METHOD_EXACT_ARGS: + return 2 + oparg; + case CALL_BOUND_METHOD_GENERAL: + return 2 + oparg; + case CALL_BUILTIN_CLASS: + return 2 + oparg; + case CALL_BUILTIN_FAST: + return 2 + oparg; + case CALL_BUILTIN_FAST_WITH_KEYWORDS: + return 2 + oparg; + case CALL_BUILTIN_O: + return 2 + oparg; + case CALL_FUNCTION_EX: + return 3 + (oparg & 1); + case CALL_INTRINSIC_1: + return 1; + case CALL_INTRINSIC_2: + return 2; + case CALL_ISINSTANCE: + return 2 + oparg; + case CALL_KW: + return 3 + oparg; + case CALL_LEN: + return 2 + oparg; + case CALL_LIST_APPEND: + return 3; + case CALL_METHOD_DESCRIPTOR_FAST: + return 2 + oparg; + case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: + return 2 + oparg; + case CALL_METHOD_DESCRIPTOR_NOARGS: + return 2 + oparg; + case CALL_METHOD_DESCRIPTOR_O: + return 2 + oparg; + case CALL_NON_PY_GENERAL: + return 2 + oparg; + case CALL_PY_EXACT_ARGS: + return 2 + oparg; + case CALL_PY_GENERAL: + return 2 + oparg; + case CALL_STR_1: + return 3; + case CALL_TUPLE_1: + return 3; + case CALL_TYPE_1: + return 3; + case CHECK_EG_MATCH: + return 2; + case CHECK_EXC_MATCH: + return 2; + case CLEANUP_THROW: + return 3; + case COMPARE_OP: + return 2; + case COMPARE_OP_FLOAT: + return 2; + case COMPARE_OP_INT: + return 2; + case COMPARE_OP_STR: + return 2; + case CONTAINS_OP: + return 2; + case CONTAINS_OP_DICT: + return 2; + case CONTAINS_OP_SET: + return 2; + case CONVERT_VALUE: + return 1; + case COPY: + return 1 + (oparg-1); + case COPY_FREE_VARS: + return 0; + case DELETE_ATTR: + return 1; + case DELETE_DEREF: + return 0; + case DELETE_FAST: + return 0; + case DELETE_GLOBAL: + return 0; + case DELETE_NAME: + return 0; + case DELETE_SUBSCR: + return 2; + case DICT_MERGE: + return 5 + (oparg - 1); + case DICT_UPDATE: + return 2 + (oparg - 1); + case END_ASYNC_FOR: + return 2; + case END_FOR: + return 1; + case END_SEND: + return 2; + case ENTER_EXECUTOR: + return 0; + case EXIT_INIT_CHECK: + return 1; + case EXTENDED_ARG: + return 0; + case FORMAT_SIMPLE: + return 1; + case FORMAT_WITH_SPEC: + return 2; + case FOR_ITER: + return 1; + case FOR_ITER_GEN: + return 1; + case FOR_ITER_LIST: + return 1; + case FOR_ITER_RANGE: + return 1; + case FOR_ITER_TUPLE: + return 1; + case GET_AITER: + return 1; + case GET_ANEXT: + return 1; + case GET_AWAITABLE: + return 1; + case GET_ITER: + return 1; + case GET_LEN: + return 1; + case GET_YIELD_FROM_ITER: + return 1; + case IMPORT_FROM: + return 1; + case IMPORT_NAME: + return 2; + case INSTRUMENTED_CALL: + return 0; + case INSTRUMENTED_CALL_FUNCTION_EX: + return 0; + case INSTRUMENTED_CALL_KW: + return 0; + case INSTRUMENTED_END_FOR: + return 2; + case INSTRUMENTED_END_SEND: + return 2; + case INSTRUMENTED_FOR_ITER: + return 0; + case INSTRUMENTED_INSTRUCTION: + return 0; + case INSTRUMENTED_JUMP_BACKWARD: + return 0; + case INSTRUMENTED_JUMP_FORWARD: + return 0; + case INSTRUMENTED_LOAD_SUPER_ATTR: + return 3; + case INSTRUMENTED_POP_JUMP_IF_FALSE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NOT_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_TRUE: + return 0; + case INSTRUMENTED_RESUME: + return 0; + case INSTRUMENTED_RETURN_CONST: + return 0; + case INSTRUMENTED_RETURN_VALUE: + return 1; + case INSTRUMENTED_YIELD_VALUE: + return 1; + case INTERPRETER_EXIT: + return 1; + case IS_OP: + return 2; + case JUMP_BACKWARD: + return 0; + case JUMP_BACKWARD_NO_INTERRUPT: + return 0; + case JUMP_FORWARD: + return 0; + case LIST_APPEND: + return 2 + (oparg-1); + case LIST_EXTEND: + return 2 + (oparg-1); + case LOAD_ASSERTION_ERROR: + return 0; + case LOAD_ATTR: + return 1; + case LOAD_ATTR_CLASS: + return 1; + case LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN: + return 1; + case LOAD_ATTR_INSTANCE_VALUE: + return 1; + case LOAD_ATTR_METHOD_LAZY_DICT: + return 1; + case LOAD_ATTR_METHOD_NO_DICT: + return 1; + case LOAD_ATTR_METHOD_WITH_VALUES: + return 1; + case LOAD_ATTR_MODULE: + return 1; + case LOAD_ATTR_NONDESCRIPTOR_NO_DICT: + return 1; + case LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES: + return 1; + case LOAD_ATTR_PROPERTY: + return 1; + case LOAD_ATTR_SLOT: + return 1; + case LOAD_ATTR_WITH_HINT: + return 1; + case LOAD_BUILD_CLASS: + return 0; + case LOAD_CONST: + return 0; + case LOAD_DEREF: + return 0; + case LOAD_FAST: + return 0; + case LOAD_FAST_AND_CLEAR: + return 0; + case LOAD_FAST_CHECK: + return 0; + case LOAD_FAST_LOAD_FAST: + return 0; + case LOAD_FROM_DICT_OR_DEREF: + return 1; + case LOAD_FROM_DICT_OR_GLOBALS: + return 1; + case LOAD_GLOBAL: + return 0; + case LOAD_GLOBAL_BUILTIN: + return 0; + case LOAD_GLOBAL_MODULE: + return 0; + case LOAD_LOCALS: + return 0; + case LOAD_NAME: + return 0; + case LOAD_SUPER_ATTR: + return 3; + case LOAD_SUPER_ATTR_ATTR: + return 3; + case LOAD_SUPER_ATTR_METHOD: + return 3; + case MAKE_CELL: + return 0; + case MAKE_FUNCTION: + return 1; + case MAP_ADD: + return 3 + (oparg - 1); + case MATCH_CLASS: + return 3; + case MATCH_KEYS: + return 2; + case MATCH_MAPPING: + return 1; + case MATCH_SEQUENCE: + return 1; + case NOP: + return 0; + case POP_EXCEPT: + return 1; + case POP_JUMP_IF_FALSE: + return 1; + case POP_JUMP_IF_NONE: + return 1; + case POP_JUMP_IF_NOT_NONE: + return 1; + case POP_JUMP_IF_TRUE: + return 1; + case POP_TOP: + return 1; + case PUSH_EXC_INFO: + return 1; + case PUSH_NULL: + return 0; + case RAISE_VARARGS: + return oparg; + case RERAISE: + return 1 + oparg; + case RESERVED: + return 0; + case RESUME: + return 0; + case RESUME_CHECK: + return 0; + case RETURN_CONST: + return 0; + case RETURN_GENERATOR: + return 0; + case RETURN_VALUE: + return 1; + case SEND: + return 2; + case SEND_GEN: + return 2; + case SETUP_ANNOTATIONS: + return 0; + case SET_ADD: + return 2 + (oparg-1); + case SET_FUNCTION_ATTRIBUTE: + return 2; + case SET_UPDATE: + return 2 + (oparg-1); + case STORE_ATTR: + return 2; + case STORE_ATTR_INSTANCE_VALUE: + return 2; + case STORE_ATTR_SLOT: + return 2; + case STORE_ATTR_WITH_HINT: + return 2; + case STORE_DEREF: + return 1; + case STORE_FAST: + return 1; + case STORE_FAST_LOAD_FAST: + return 1; + case STORE_FAST_STORE_FAST: + return 2; + case STORE_GLOBAL: + return 1; + case STORE_NAME: + return 1; + case STORE_SLICE: + return 4; + case STORE_SUBSCR: + return 3; + case STORE_SUBSCR_DICT: + return 3; + case STORE_SUBSCR_LIST_INT: + return 3; + case SWAP: + return 2 + (oparg-2); + case TO_BOOL: + return 1; + case TO_BOOL_ALWAYS_TRUE: + return 1; + case TO_BOOL_BOOL: + return 1; + case TO_BOOL_INT: + return 1; + case TO_BOOL_LIST: + return 1; + case TO_BOOL_NONE: + return 1; + case TO_BOOL_STR: + return 1; + case UNARY_INVERT: + return 1; + case UNARY_NEGATIVE: + return 1; + case UNARY_NOT: + return 1; + case UNPACK_EX: + return 1; + case UNPACK_SEQUENCE: + return 1; + case UNPACK_SEQUENCE_LIST: + return 1; + case UNPACK_SEQUENCE_TUPLE: + return 1; + case UNPACK_SEQUENCE_TWO_TUPLE: + return 1; + case WITH_EXCEPT_START: + return 4; + case YIELD_VALUE: + return 1; + default: + return -1; + } +} + +#endif + +extern int _PyOpcode_num_pushed(int opcode, int oparg); +#ifdef NEED_OPCODE_METADATA +int _PyOpcode_num_pushed(int opcode, int oparg) { + switch(opcode) { + case BEFORE_ASYNC_WITH: + return 2; + case BEFORE_WITH: + return 2; + case BINARY_OP: + return 1; + case BINARY_OP_ADD_FLOAT: + return 1; + case BINARY_OP_ADD_INT: + return 1; + case BINARY_OP_ADD_UNICODE: + return 1; + case BINARY_OP_INPLACE_ADD_UNICODE: + return 0; + case BINARY_OP_MULTIPLY_FLOAT: + return 1; + case BINARY_OP_MULTIPLY_INT: + return 1; + case BINARY_OP_SUBTRACT_FLOAT: + return 1; + case BINARY_OP_SUBTRACT_INT: + return 1; + case BINARY_SLICE: + return 1; + case BINARY_SUBSCR: + return 1; + case BINARY_SUBSCR_DICT: + return 1; + case BINARY_SUBSCR_GETITEM: + return 1; + case BINARY_SUBSCR_LIST_INT: + return 1; + case BINARY_SUBSCR_STR_INT: + return 1; + case BINARY_SUBSCR_TUPLE_INT: + return 1; + case BUILD_CONST_KEY_MAP: + return 1; + case BUILD_LIST: + return 1; + case BUILD_MAP: + return 1; + case BUILD_SET: + return 1; + case BUILD_SLICE: + return 1; + case BUILD_STRING: + return 1; + case BUILD_TUPLE: + return 1; + case CACHE: + return 0; + case CALL: + return 1; + case CALL_ALLOC_AND_ENTER_INIT: + return 1; + case CALL_BOUND_METHOD_EXACT_ARGS: + return 0; + case CALL_BOUND_METHOD_GENERAL: + return 0; + case CALL_BUILTIN_CLASS: + return 1; + case CALL_BUILTIN_FAST: + return 1; + case CALL_BUILTIN_FAST_WITH_KEYWORDS: + return 1; + case CALL_BUILTIN_O: + return 1; + case CALL_FUNCTION_EX: + return 1; + case CALL_INTRINSIC_1: + return 1; + case CALL_INTRINSIC_2: + return 1; + case CALL_ISINSTANCE: + return 1; + case CALL_KW: + return 1; + case CALL_LEN: + return 1; + case CALL_LIST_APPEND: + return 1; + case CALL_METHOD_DESCRIPTOR_FAST: + return 1; + case CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: + return 1; + case CALL_METHOD_DESCRIPTOR_NOARGS: + return 1; + case CALL_METHOD_DESCRIPTOR_O: + return 1; + case CALL_NON_PY_GENERAL: + return 1; + case CALL_PY_EXACT_ARGS: + return 0; + case CALL_PY_GENERAL: + return 0; + case CALL_STR_1: + return 1; + case CALL_TUPLE_1: + return 1; + case CALL_TYPE_1: + return 1; + case CHECK_EG_MATCH: + return 2; + case CHECK_EXC_MATCH: + return 2; + case CLEANUP_THROW: + return 2; + case COMPARE_OP: + return 1; + case COMPARE_OP_FLOAT: + return 1; + case COMPARE_OP_INT: + return 1; + case COMPARE_OP_STR: + return 1; + case CONTAINS_OP: + return 1; + case CONTAINS_OP_DICT: + return 1; + case CONTAINS_OP_SET: + return 1; + case CONVERT_VALUE: + return 1; + case COPY: + return 2 + (oparg-1); + case COPY_FREE_VARS: + return 0; + case DELETE_ATTR: + return 0; + case DELETE_DEREF: + return 0; + case DELETE_FAST: + return 0; + case DELETE_GLOBAL: + return 0; + case DELETE_NAME: + return 0; + case DELETE_SUBSCR: + return 0; + case DICT_MERGE: + return 4 + (oparg - 1); + case DICT_UPDATE: + return 1 + (oparg - 1); + case END_ASYNC_FOR: + return 0; + case END_FOR: + return 0; + case END_SEND: + return 1; + case ENTER_EXECUTOR: + return 0; + case EXIT_INIT_CHECK: + return 0; + case EXTENDED_ARG: + return 0; + case FORMAT_SIMPLE: + return 1; + case FORMAT_WITH_SPEC: + return 1; + case FOR_ITER: + return 2; + case FOR_ITER_GEN: + return 1; + case FOR_ITER_LIST: + return 2; + case FOR_ITER_RANGE: + return 2; + case FOR_ITER_TUPLE: + return 2; + case GET_AITER: + return 1; + case GET_ANEXT: + return 2; + case GET_AWAITABLE: + return 1; + case GET_ITER: + return 1; + case GET_LEN: + return 2; + case GET_YIELD_FROM_ITER: + return 1; + case IMPORT_FROM: + return 2; + case IMPORT_NAME: + return 1; + case INSTRUMENTED_CALL: + return 0; + case INSTRUMENTED_CALL_FUNCTION_EX: + return 0; + case INSTRUMENTED_CALL_KW: + return 0; + case INSTRUMENTED_END_FOR: + return 1; + case INSTRUMENTED_END_SEND: + return 1; + case INSTRUMENTED_FOR_ITER: + return 0; + case INSTRUMENTED_INSTRUCTION: + return 0; + case INSTRUMENTED_JUMP_BACKWARD: + return 0; + case INSTRUMENTED_JUMP_FORWARD: + return 0; + case INSTRUMENTED_LOAD_SUPER_ATTR: + return 1 + (oparg & 1); + case INSTRUMENTED_POP_JUMP_IF_FALSE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_NOT_NONE: + return 0; + case INSTRUMENTED_POP_JUMP_IF_TRUE: + return 0; + case INSTRUMENTED_RESUME: + return 0; + case INSTRUMENTED_RETURN_CONST: + return 0; + case INSTRUMENTED_RETURN_VALUE: + return 0; + case INSTRUMENTED_YIELD_VALUE: + return 1; + case INTERPRETER_EXIT: + return 0; + case IS_OP: + return 1; + case JUMP_BACKWARD: + return 0; + case JUMP_BACKWARD_NO_INTERRUPT: + return 0; + case JUMP_FORWARD: + return 0; + case LIST_APPEND: + return 1 + (oparg-1); + case LIST_EXTEND: + return 1 + (oparg-1); + case LOAD_ASSERTION_ERROR: + return 1; + case LOAD_ATTR: + return 1 + (oparg & 1); + case LOAD_ATTR_CLASS: + return 1 + (oparg & 1); + case LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN: + return 1; + case LOAD_ATTR_INSTANCE_VALUE: + return 1 + (oparg & 1); + case LOAD_ATTR_METHOD_LAZY_DICT: + return 2; + case LOAD_ATTR_METHOD_NO_DICT: + return 2; + case LOAD_ATTR_METHOD_WITH_VALUES: + return 2; + case LOAD_ATTR_MODULE: + return 1 + (oparg & 1); + case LOAD_ATTR_NONDESCRIPTOR_NO_DICT: + return 1; + case LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES: + return 1; + case LOAD_ATTR_PROPERTY: + return 1; + case LOAD_ATTR_SLOT: + return 1 + (oparg & 1); + case LOAD_ATTR_WITH_HINT: + return 1 + (oparg & 1); + case LOAD_BUILD_CLASS: + return 1; + case LOAD_CONST: + return 1; + case LOAD_DEREF: + return 1; + case LOAD_FAST: + return 1; + case LOAD_FAST_AND_CLEAR: + return 1; + case LOAD_FAST_CHECK: + return 1; + case LOAD_FAST_LOAD_FAST: + return 2; + case LOAD_FROM_DICT_OR_DEREF: + return 1; + case LOAD_FROM_DICT_OR_GLOBALS: + return 1; + case LOAD_GLOBAL: + return 1 + (oparg & 1); + case LOAD_GLOBAL_BUILTIN: + return 1 + (oparg & 1); + case LOAD_GLOBAL_MODULE: + return 1 + (oparg & 1); + case LOAD_LOCALS: + return 1; + case LOAD_NAME: + return 1; + case LOAD_SUPER_ATTR: + return 1 + (oparg & 1); + case LOAD_SUPER_ATTR_ATTR: + return 1; + case LOAD_SUPER_ATTR_METHOD: + return 2; + case MAKE_CELL: + return 0; + case MAKE_FUNCTION: + return 1; + case MAP_ADD: + return 1 + (oparg - 1); + case MATCH_CLASS: + return 1; + case MATCH_KEYS: + return 3; + case MATCH_MAPPING: + return 2; + case MATCH_SEQUENCE: + return 2; + case NOP: + return 0; + case POP_EXCEPT: + return 0; + case POP_JUMP_IF_FALSE: + return 0; + case POP_JUMP_IF_NONE: + return 0; + case POP_JUMP_IF_NOT_NONE: + return 0; + case POP_JUMP_IF_TRUE: + return 0; + case POP_TOP: + return 0; + case PUSH_EXC_INFO: + return 2; + case PUSH_NULL: + return 1; + case RAISE_VARARGS: + return 0; + case RERAISE: + return oparg; + case RESERVED: + return 0; + case RESUME: + return 0; + case RESUME_CHECK: + return 0; + case RETURN_CONST: + return 0; + case RETURN_GENERATOR: + return 1; + case RETURN_VALUE: + return 0; + case SEND: + return 2; + case SEND_GEN: + return 2; + case SETUP_ANNOTATIONS: + return 0; + case SET_ADD: + return 1 + (oparg-1); + case SET_FUNCTION_ATTRIBUTE: + return 1; + case SET_UPDATE: + return 1 + (oparg-1); + case STORE_ATTR: + return 0; + case STORE_ATTR_INSTANCE_VALUE: + return 0; + case STORE_ATTR_SLOT: + return 0; + case STORE_ATTR_WITH_HINT: + return 0; + case STORE_DEREF: + return 0; + case STORE_FAST: + return 0; + case STORE_FAST_LOAD_FAST: + return 1; + case STORE_FAST_STORE_FAST: + return 0; + case STORE_GLOBAL: + return 0; + case STORE_NAME: + return 0; + case STORE_SLICE: + return 0; + case STORE_SUBSCR: + return 0; + case STORE_SUBSCR_DICT: + return 0; + case STORE_SUBSCR_LIST_INT: + return 0; + case SWAP: + return 2 + (oparg-2); + case TO_BOOL: + return 1; + case TO_BOOL_ALWAYS_TRUE: + return 1; + case TO_BOOL_BOOL: + return 1; + case TO_BOOL_INT: + return 1; + case TO_BOOL_LIST: + return 1; + case TO_BOOL_NONE: + return 1; + case TO_BOOL_STR: + return 1; + case UNARY_INVERT: + return 1; + case UNARY_NEGATIVE: + return 1; + case UNARY_NOT: + return 1; + case UNPACK_EX: + return 1 + (oparg >> 8) + (oparg & 0xFF); + case UNPACK_SEQUENCE: + return oparg; + case UNPACK_SEQUENCE_LIST: + return oparg; + case UNPACK_SEQUENCE_TUPLE: + return oparg; + case UNPACK_SEQUENCE_TWO_TUPLE: + return 2; + case WITH_EXCEPT_START: + return 5; + case YIELD_VALUE: + return 1; + default: + return -1; + } +} + +#endif + +enum InstructionFormat { + INSTR_FMT_IB = 1, + INSTR_FMT_IBC = 2, + INSTR_FMT_IBC00 = 3, + INSTR_FMT_IBC000 = 4, + INSTR_FMT_IBC00000000 = 5, + INSTR_FMT_IX = 6, + INSTR_FMT_IXC = 7, + INSTR_FMT_IXC00 = 8, + INSTR_FMT_IXC000 = 9, +}; + +#define IS_VALID_OPCODE(OP) \ + (((OP) >= 0) && ((OP) < 268) && \ + (_PyOpcode_opcode_metadata[(OP)].valid_entry)) + +#define HAS_ARG_FLAG (1) +#define HAS_CONST_FLAG (2) +#define HAS_NAME_FLAG (4) +#define HAS_JUMP_FLAG (8) +#define HAS_FREE_FLAG (16) +#define HAS_LOCAL_FLAG (32) +#define HAS_EVAL_BREAK_FLAG (64) +#define HAS_DEOPT_FLAG (128) +#define HAS_ERROR_FLAG (256) +#define HAS_ESCAPES_FLAG (512) +#define HAS_EXIT_FLAG (1024) +#define HAS_PURE_FLAG (2048) +#define HAS_PASSTHROUGH_FLAG (4096) +#define HAS_OPARG_AND_1_FLAG (8192) +#define HAS_ERROR_NO_POP_FLAG (16384) +#define OPCODE_HAS_ARG(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ARG_FLAG)) +#define OPCODE_HAS_CONST(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_CONST_FLAG)) +#define OPCODE_HAS_NAME(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_NAME_FLAG)) +#define OPCODE_HAS_JUMP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_JUMP_FLAG)) +#define OPCODE_HAS_FREE(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_FREE_FLAG)) +#define OPCODE_HAS_LOCAL(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_LOCAL_FLAG)) +#define OPCODE_HAS_EVAL_BREAK(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_EVAL_BREAK_FLAG)) +#define OPCODE_HAS_DEOPT(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_DEOPT_FLAG)) +#define OPCODE_HAS_ERROR(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ERROR_FLAG)) +#define OPCODE_HAS_ESCAPES(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ESCAPES_FLAG)) +#define OPCODE_HAS_EXIT(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_EXIT_FLAG)) +#define OPCODE_HAS_PURE(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_PURE_FLAG)) +#define OPCODE_HAS_PASSTHROUGH(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_PASSTHROUGH_FLAG)) +#define OPCODE_HAS_OPARG_AND_1(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_OPARG_AND_1_FLAG)) +#define OPCODE_HAS_ERROR_NO_POP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_ERROR_NO_POP_FLAG)) + +#define OPARG_FULL 0 +#define OPARG_CACHE_1 1 +#define OPARG_CACHE_2 2 +#define OPARG_CACHE_4 4 +#define OPARG_TOP 5 +#define OPARG_BOTTOM 6 +#define OPARG_SAVE_RETURN_OFFSET 7 +#define OPARG_REPLACED 9 + +struct opcode_metadata { + uint8_t valid_entry; + int8_t instr_format; + int16_t flags; +}; + +extern const struct opcode_metadata _PyOpcode_opcode_metadata[268]; +#ifdef NEED_OPCODE_METADATA +const struct opcode_metadata _PyOpcode_opcode_metadata[268] = { + [BEFORE_ASYNC_WITH] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [BEFORE_WITH] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG }, + [BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, + [BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, + [BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG }, + [BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, + [BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG }, + [BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, + [BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [BINARY_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [BINARY_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [BUILD_CONST_KEY_MAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BUILD_LIST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [BUILD_MAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [BUILD_SET] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [BUILD_SLICE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [BUILD_STRING] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [BUILD_TUPLE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [CACHE] = { true, INSTR_FMT_IX, 0 }, + [CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_ALLOC_AND_ENTER_INIT] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [CALL_BOUND_METHOD_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_BUILTIN_CLASS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_BUILTIN_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_BUILTIN_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_FUNCTION_EX] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_INTRINSIC_1] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_INTRINSIC_2] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_ISINSTANCE] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_LEN] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_LIST_APPEND] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, + [CALL_METHOD_DESCRIPTOR_FAST] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_METHOD_DESCRIPTOR_NOARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_METHOD_DESCRIPTOR_O] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_NON_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_PY_EXACT_ARGS] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [CALL_PY_GENERAL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [CALL_STR_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_TUPLE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CALL_TYPE_1] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [CHECK_EG_MATCH] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CHECK_EXC_MATCH] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CLEANUP_THROW] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [COMPARE_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [COMPARE_OP_FLOAT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EXIT_FLAG }, + [COMPARE_OP_INT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [COMPARE_OP_STR] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EXIT_FLAG }, + [CONTAINS_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CONTAINS_OP_DICT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CONTAINS_OP_SET] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [CONVERT_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [COPY] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_PURE_FLAG }, + [COPY_FREE_VARS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [DELETE_ATTR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [DELETE_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [DELETE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [DELETE_GLOBAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [DELETE_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [DELETE_SUBSCR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [DICT_MERGE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [DICT_UPDATE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [END_ASYNC_FOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [END_FOR] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [END_SEND] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [ENTER_EXECUTOR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [EXIT_INIT_CHECK] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [EXTENDED_ARG] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [FORMAT_SIMPLE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [FORMAT_WITH_SPEC] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [FOR_ITER] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [FOR_ITER_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [FOR_ITER_LIST] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG }, + [FOR_ITER_RANGE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG }, + [FOR_ITER_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EXIT_FLAG }, + [GET_AITER] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [GET_ANEXT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [GET_AWAITABLE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [GET_ITER] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [GET_LEN] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [GET_YIELD_FROM_ITER] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [IMPORT_FROM] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [IMPORT_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_CALL] = { true, INSTR_FMT_IBC00, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_CALL_FUNCTION_EX] = { true, INSTR_FMT_IX, 0 }, + [INSTRUMENTED_CALL_KW] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_END_FOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, + [INSTRUMENTED_END_SEND] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, + [INSTRUMENTED_FOR_ITER] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_INSTRUCTION] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_JUMP_BACKWARD] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG }, + [INSTRUMENTED_JUMP_FORWARD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [INSTRUMENTED_LOAD_SUPER_ATTR] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, + [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_RETURN_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, + [IS_OP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG }, + [JUMP_BACKWARD] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [JUMP_BACKWARD_NO_INTERRUPT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [JUMP_FORWARD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [LIST_APPEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG }, + [LIST_EXTEND] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ASSERTION_ERROR] = { true, INSTR_FMT_IX, 0 }, + [LOAD_ATTR] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ATTR_CLASS] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_METHOD_LAZY_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_METHOD_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_METHOD_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_MODULE] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_PROPERTY] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ATTR_SLOT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG }, + [LOAD_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG }, + [LOAD_FAST_AND_CLEAR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, + [LOAD_FAST_CHECK] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_FAST_LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, + [LOAD_FROM_DICT_OR_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_FROM_DICT_OR_GLOBALS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_GLOBAL] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_GLOBAL_BUILTIN] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [LOAD_GLOBAL_MODULE] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [LOAD_LOCALS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_SUPER_ATTR] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_SUPER_ATTR_ATTR] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_SUPER_ATTR_METHOD] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [MAKE_CELL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, + [MAKE_FUNCTION] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [MAP_ADD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [MATCH_CLASS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [MATCH_KEYS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [MATCH_MAPPING] = { true, INSTR_FMT_IX, 0 }, + [MATCH_SEQUENCE] = { true, INSTR_FMT_IX, 0 }, + [NOP] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [POP_EXCEPT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, + [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [POP_TOP] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [PUSH_EXC_INFO] = { true, INSTR_FMT_IX, 0 }, + [PUSH_NULL] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [RAISE_VARARGS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [RERAISE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [RESERVED] = { true, INSTR_FMT_IX, 0 }, + [RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [RESUME_CHECK] = { true, INSTR_FMT_IX, HAS_DEOPT_FLAG }, + [RETURN_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG }, + [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [RETURN_VALUE] = { true, INSTR_FMT_IX, 0 }, + [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [SEND_GEN] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [SETUP_ANNOTATIONS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [SET_ADD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [SET_FUNCTION_ATTRIBUTE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, + [SET_UPDATE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_ATTR] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, + [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_EXIT_FLAG }, + [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, + [STORE_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ESCAPES_FLAG }, + [STORE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, + [STORE_FAST_LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, + [STORE_FAST_STORE_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, + [STORE_GLOBAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_NAME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_SUBSCR_DICT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [STORE_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [SWAP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_PURE_FLAG }, + [TO_BOOL] = { true, INSTR_FMT_IXC00, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [TO_BOOL_ALWAYS_TRUE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG }, + [TO_BOOL_BOOL] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG }, + [TO_BOOL_INT] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, + [TO_BOOL_LIST] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG }, + [TO_BOOL_NONE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG }, + [TO_BOOL_STR] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, + [UNARY_INVERT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [UNARY_NEGATIVE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [UNARY_NOT] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, + [UNPACK_EX] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [UNPACK_SEQUENCE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [UNPACK_SEQUENCE_LIST] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [UNPACK_SEQUENCE_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [UNPACK_SEQUENCE_TWO_TUPLE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [WITH_EXCEPT_START] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, + [JUMP] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [JUMP_NO_INTERRUPT] = { true, -1, HAS_ARG_FLAG | HAS_JUMP_FLAG }, + [LOAD_CLOSURE] = { true, -1, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG }, + [LOAD_METHOD] = { true, -1, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_SUPER_METHOD] = { true, -1, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ZERO_SUPER_ATTR] = { true, -1, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [LOAD_ZERO_SUPER_METHOD] = { true, -1, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, + [POP_BLOCK] = { true, -1, HAS_PURE_FLAG }, + [SETUP_CLEANUP] = { true, -1, HAS_PURE_FLAG | HAS_ARG_FLAG }, + [SETUP_FINALLY] = { true, -1, HAS_PURE_FLAG | HAS_ARG_FLAG }, + [SETUP_WITH] = { true, -1, HAS_PURE_FLAG | HAS_ARG_FLAG }, + [STORE_FAST_MAYBE_NULL] = { true, -1, HAS_ARG_FLAG | HAS_LOCAL_FLAG }, +}; +#endif + +#define MAX_UOP_PER_EXPANSION 8 +struct opcode_macro_expansion { + int nuops; + struct { int16_t uop; int8_t size; int8_t offset; } uops[MAX_UOP_PER_EXPANSION]; +}; +extern const struct opcode_macro_expansion _PyOpcode_macro_expansion[256]; + +#ifdef NEED_OPCODE_METADATA +const struct opcode_macro_expansion +_PyOpcode_macro_expansion[256] = { + [BINARY_OP] = { .nuops = 1, .uops = { { _BINARY_OP, 0, 0 } } }, + [BINARY_OP_ADD_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_ADD_FLOAT, 0, 0 } } }, + [BINARY_OP_ADD_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_ADD_INT, 0, 0 } } }, + [BINARY_OP_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_ADD_UNICODE, 0, 0 } } }, + [BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, 0, 0 } } }, + [BINARY_OP_MULTIPLY_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_MULTIPLY_INT, 0, 0 } } }, + [BINARY_OP_SUBTRACT_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_SUBTRACT_FLOAT, 0, 0 } } }, + [BINARY_OP_SUBTRACT_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_SUBTRACT_INT, 0, 0 } } }, + [BINARY_SLICE] = { .nuops = 1, .uops = { { _BINARY_SLICE, 0, 0 } } }, + [BINARY_SUBSCR] = { .nuops = 1, .uops = { { _BINARY_SUBSCR, 0, 0 } } }, + [BINARY_SUBSCR_DICT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_DICT, 0, 0 } } }, + [BINARY_SUBSCR_LIST_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_LIST_INT, 0, 0 } } }, + [BINARY_SUBSCR_STR_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_STR_INT, 0, 0 } } }, + [BINARY_SUBSCR_TUPLE_INT] = { .nuops = 1, .uops = { { _BINARY_SUBSCR_TUPLE_INT, 0, 0 } } }, + [BUILD_CONST_KEY_MAP] = { .nuops = 1, .uops = { { _BUILD_CONST_KEY_MAP, 0, 0 } } }, + [BUILD_LIST] = { .nuops = 1, .uops = { { _BUILD_LIST, 0, 0 } } }, + [BUILD_MAP] = { .nuops = 1, .uops = { { _BUILD_MAP, 0, 0 } } }, + [BUILD_SLICE] = { .nuops = 1, .uops = { { _BUILD_SLICE, 0, 0 } } }, + [BUILD_STRING] = { .nuops = 1, .uops = { { _BUILD_STRING, 0, 0 } } }, + [BUILD_TUPLE] = { .nuops = 1, .uops = { { _BUILD_TUPLE, 0, 0 } } }, + [CALL_BOUND_METHOD_EXACT_ARGS] = { .nuops = 8, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _INIT_CALL_BOUND_METHOD_EXACT_ARGS, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_BOUND_METHOD_GENERAL] = { .nuops = 6, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_METHOD_VERSION, 2, 1 }, { _EXPAND_METHOD, 0, 0 }, { _PY_FRAME_GENERAL, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_BUILTIN_CLASS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_CLASS, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_BUILTIN_FAST] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_BUILTIN_FAST_WITH_KEYWORDS, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_BUILTIN_O] = { .nuops = 2, .uops = { { _CALL_BUILTIN_O, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_INTRINSIC_1] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_1, 0, 0 } } }, + [CALL_INTRINSIC_2] = { .nuops = 1, .uops = { { _CALL_INTRINSIC_2, 0, 0 } } }, + [CALL_ISINSTANCE] = { .nuops = 1, .uops = { { _CALL_ISINSTANCE, 0, 0 } } }, + [CALL_LEN] = { .nuops = 1, .uops = { { _CALL_LEN, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_FAST] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_NOARGS] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_NOARGS, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_METHOD_DESCRIPTOR_O] = { .nuops = 2, .uops = { { _CALL_METHOD_DESCRIPTOR_O, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_NON_PY_GENERAL] = { .nuops = 3, .uops = { { _CHECK_IS_NOT_PY_CALLABLE, 0, 0 }, { _CALL_NON_PY_GENERAL, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_PY_EXACT_ARGS] = { .nuops = 6, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_EXACT_ARGS, 2, 1 }, { _CHECK_STACK_SPACE, 0, 0 }, { _INIT_CALL_PY_EXACT_ARGS, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_PY_GENERAL] = { .nuops = 5, .uops = { { _CHECK_PEP_523, 0, 0 }, { _CHECK_FUNCTION_VERSION, 2, 1 }, { _PY_FRAME_GENERAL, 0, 0 }, { _SAVE_RETURN_OFFSET, 7, 3 }, { _PUSH_FRAME, 0, 0 } } }, + [CALL_STR_1] = { .nuops = 2, .uops = { { _CALL_STR_1, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_TUPLE_1] = { .nuops = 2, .uops = { { _CALL_TUPLE_1, 0, 0 }, { _CHECK_PERIODIC, 0, 0 } } }, + [CALL_TYPE_1] = { .nuops = 1, .uops = { { _CALL_TYPE_1, 0, 0 } } }, + [CHECK_EG_MATCH] = { .nuops = 1, .uops = { { _CHECK_EG_MATCH, 0, 0 } } }, + [CHECK_EXC_MATCH] = { .nuops = 1, .uops = { { _CHECK_EXC_MATCH, 0, 0 } } }, + [COMPARE_OP] = { .nuops = 1, .uops = { { _COMPARE_OP, 0, 0 } } }, + [COMPARE_OP_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _COMPARE_OP_FLOAT, 0, 0 } } }, + [COMPARE_OP_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _COMPARE_OP_INT, 0, 0 } } }, + [COMPARE_OP_STR] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _COMPARE_OP_STR, 0, 0 } } }, + [CONTAINS_OP] = { .nuops = 1, .uops = { { _CONTAINS_OP, 0, 0 } } }, + [CONTAINS_OP_DICT] = { .nuops = 1, .uops = { { _CONTAINS_OP_DICT, 0, 0 } } }, + [CONTAINS_OP_SET] = { .nuops = 1, .uops = { { _CONTAINS_OP_SET, 0, 0 } } }, + [CONVERT_VALUE] = { .nuops = 1, .uops = { { _CONVERT_VALUE, 0, 0 } } }, + [COPY] = { .nuops = 1, .uops = { { _COPY, 0, 0 } } }, + [COPY_FREE_VARS] = { .nuops = 1, .uops = { { _COPY_FREE_VARS, 0, 0 } } }, + [DELETE_ATTR] = { .nuops = 1, .uops = { { _DELETE_ATTR, 0, 0 } } }, + [DELETE_DEREF] = { .nuops = 1, .uops = { { _DELETE_DEREF, 0, 0 } } }, + [DELETE_FAST] = { .nuops = 1, .uops = { { _DELETE_FAST, 0, 0 } } }, + [DELETE_GLOBAL] = { .nuops = 1, .uops = { { _DELETE_GLOBAL, 0, 0 } } }, + [DELETE_NAME] = { .nuops = 1, .uops = { { _DELETE_NAME, 0, 0 } } }, + [DELETE_SUBSCR] = { .nuops = 1, .uops = { { _DELETE_SUBSCR, 0, 0 } } }, + [DICT_MERGE] = { .nuops = 1, .uops = { { _DICT_MERGE, 0, 0 } } }, + [DICT_UPDATE] = { .nuops = 1, .uops = { { _DICT_UPDATE, 0, 0 } } }, + [END_FOR] = { .nuops = 1, .uops = { { _POP_TOP, 0, 0 } } }, + [END_SEND] = { .nuops = 1, .uops = { { _END_SEND, 0, 0 } } }, + [EXIT_INIT_CHECK] = { .nuops = 1, .uops = { { _EXIT_INIT_CHECK, 0, 0 } } }, + [FORMAT_SIMPLE] = { .nuops = 1, .uops = { { _FORMAT_SIMPLE, 0, 0 } } }, + [FORMAT_WITH_SPEC] = { .nuops = 1, .uops = { { _FORMAT_WITH_SPEC, 0, 0 } } }, + [FOR_ITER] = { .nuops = 1, .uops = { { _FOR_ITER, 9, 0 } } }, + [FOR_ITER_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, 0, 0 }, { _FOR_ITER_GEN_FRAME, 0, 0 }, { _PUSH_FRAME, 0, 0 } } }, + [FOR_ITER_LIST] = { .nuops = 3, .uops = { { _ITER_CHECK_LIST, 0, 0 }, { _ITER_JUMP_LIST, 9, 1 }, { _ITER_NEXT_LIST, 0, 0 } } }, + [FOR_ITER_RANGE] = { .nuops = 3, .uops = { { _ITER_CHECK_RANGE, 0, 0 }, { _ITER_JUMP_RANGE, 9, 1 }, { _ITER_NEXT_RANGE, 0, 0 } } }, + [FOR_ITER_TUPLE] = { .nuops = 3, .uops = { { _ITER_CHECK_TUPLE, 0, 0 }, { _ITER_JUMP_TUPLE, 9, 1 }, { _ITER_NEXT_TUPLE, 0, 0 } } }, + [GET_AITER] = { .nuops = 1, .uops = { { _GET_AITER, 0, 0 } } }, + [GET_ANEXT] = { .nuops = 1, .uops = { { _GET_ANEXT, 0, 0 } } }, + [GET_AWAITABLE] = { .nuops = 1, .uops = { { _GET_AWAITABLE, 0, 0 } } }, + [GET_ITER] = { .nuops = 1, .uops = { { _GET_ITER, 0, 0 } } }, + [GET_LEN] = { .nuops = 1, .uops = { { _GET_LEN, 0, 0 } } }, + [GET_YIELD_FROM_ITER] = { .nuops = 1, .uops = { { _GET_YIELD_FROM_ITER, 0, 0 } } }, + [IS_OP] = { .nuops = 1, .uops = { { _IS_OP, 0, 0 } } }, + [LIST_APPEND] = { .nuops = 1, .uops = { { _LIST_APPEND, 0, 0 } } }, + [LIST_EXTEND] = { .nuops = 1, .uops = { { _LIST_EXTEND, 0, 0 } } }, + [LOAD_ASSERTION_ERROR] = { .nuops = 1, .uops = { { _LOAD_ASSERTION_ERROR, 0, 0 } } }, + [LOAD_ATTR] = { .nuops = 1, .uops = { { _LOAD_ATTR, 0, 0 } } }, + [LOAD_ATTR_CLASS] = { .nuops = 2, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 } } }, + [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } }, + [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } }, + [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } }, + [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 0, 0 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } }, + [LOAD_ATTR_MODULE] = { .nuops = 2, .uops = { { _CHECK_ATTR_MODULE, 2, 1 }, { _LOAD_ATTR_MODULE, 1, 3 } } }, + [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } }, + [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, 0, 0 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } }, + [LOAD_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 } } }, + [LOAD_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_WITH_HINT, 0, 0 }, { _LOAD_ATTR_WITH_HINT, 1, 3 } } }, + [LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, 0, 0 } } }, + [LOAD_CONST] = { .nuops = 1, .uops = { { _LOAD_CONST, 0, 0 } } }, + [LOAD_DEREF] = { .nuops = 1, .uops = { { _LOAD_DEREF, 0, 0 } } }, + [LOAD_FAST] = { .nuops = 1, .uops = { { _LOAD_FAST, 0, 0 } } }, + [LOAD_FAST_AND_CLEAR] = { .nuops = 1, .uops = { { _LOAD_FAST_AND_CLEAR, 0, 0 } } }, + [LOAD_FAST_CHECK] = { .nuops = 1, .uops = { { _LOAD_FAST_CHECK, 0, 0 } } }, + [LOAD_FAST_LOAD_FAST] = { .nuops = 2, .uops = { { _LOAD_FAST, 5, 0 }, { _LOAD_FAST, 6, 0 } } }, + [LOAD_FROM_DICT_OR_DEREF] = { .nuops = 1, .uops = { { _LOAD_FROM_DICT_OR_DEREF, 0, 0 } } }, + [LOAD_GLOBAL] = { .nuops = 1, .uops = { { _LOAD_GLOBAL, 0, 0 } } }, + [LOAD_GLOBAL_BUILTIN] = { .nuops = 3, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION, 1, 2 }, { _LOAD_GLOBAL_BUILTINS, 1, 3 } } }, + [LOAD_GLOBAL_MODULE] = { .nuops = 2, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _LOAD_GLOBAL_MODULE, 1, 3 } } }, + [LOAD_LOCALS] = { .nuops = 1, .uops = { { _LOAD_LOCALS, 0, 0 } } }, + [LOAD_SUPER_ATTR_ATTR] = { .nuops = 1, .uops = { { _LOAD_SUPER_ATTR_ATTR, 0, 0 } } }, + [LOAD_SUPER_ATTR_METHOD] = { .nuops = 1, .uops = { { _LOAD_SUPER_ATTR_METHOD, 0, 0 } } }, + [MAKE_CELL] = { .nuops = 1, .uops = { { _MAKE_CELL, 0, 0 } } }, + [MAKE_FUNCTION] = { .nuops = 1, .uops = { { _MAKE_FUNCTION, 0, 0 } } }, + [MAP_ADD] = { .nuops = 1, .uops = { { _MAP_ADD, 0, 0 } } }, + [MATCH_CLASS] = { .nuops = 1, .uops = { { _MATCH_CLASS, 0, 0 } } }, + [MATCH_KEYS] = { .nuops = 1, .uops = { { _MATCH_KEYS, 0, 0 } } }, + [MATCH_MAPPING] = { .nuops = 1, .uops = { { _MATCH_MAPPING, 0, 0 } } }, + [MATCH_SEQUENCE] = { .nuops = 1, .uops = { { _MATCH_SEQUENCE, 0, 0 } } }, + [NOP] = { .nuops = 1, .uops = { { _NOP, 0, 0 } } }, + [POP_EXCEPT] = { .nuops = 1, .uops = { { _POP_EXCEPT, 0, 0 } } }, + [POP_JUMP_IF_FALSE] = { .nuops = 1, .uops = { { _POP_JUMP_IF_FALSE, 9, 1 } } }, + [POP_JUMP_IF_NONE] = { .nuops = 2, .uops = { { _IS_NONE, 0, 0 }, { _POP_JUMP_IF_TRUE, 9, 1 } } }, + [POP_JUMP_IF_NOT_NONE] = { .nuops = 2, .uops = { { _IS_NONE, 0, 0 }, { _POP_JUMP_IF_FALSE, 9, 1 } } }, + [POP_JUMP_IF_TRUE] = { .nuops = 1, .uops = { { _POP_JUMP_IF_TRUE, 9, 1 } } }, + [POP_TOP] = { .nuops = 1, .uops = { { _POP_TOP, 0, 0 } } }, + [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, 0, 0 } } }, + [PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, 0, 0 } } }, + [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, 0, 0 } } }, + [RETURN_CONST] = { .nuops = 2, .uops = { { _LOAD_CONST, 0, 0 }, { _POP_FRAME, 0, 0 } } }, + [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, 0, 0 } } }, + [RETURN_VALUE] = { .nuops = 1, .uops = { { _POP_FRAME, 0, 0 } } }, + [SETUP_ANNOTATIONS] = { .nuops = 1, .uops = { { _SETUP_ANNOTATIONS, 0, 0 } } }, + [SET_ADD] = { .nuops = 1, .uops = { { _SET_ADD, 0, 0 } } }, + [SET_FUNCTION_ATTRIBUTE] = { .nuops = 1, .uops = { { _SET_FUNCTION_ATTRIBUTE, 0, 0 } } }, + [SET_UPDATE] = { .nuops = 1, .uops = { { _SET_UPDATE, 0, 0 } } }, + [STORE_ATTR] = { .nuops = 1, .uops = { { _STORE_ATTR, 0, 0 } } }, + [STORE_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_NO_DICT, 0, 0 }, { _STORE_ATTR_INSTANCE_VALUE, 1, 3 } } }, + [STORE_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 } } }, + [STORE_DEREF] = { .nuops = 1, .uops = { { _STORE_DEREF, 0, 0 } } }, + [STORE_FAST] = { .nuops = 1, .uops = { { _STORE_FAST, 0, 0 } } }, + [STORE_FAST_LOAD_FAST] = { .nuops = 2, .uops = { { _STORE_FAST, 5, 0 }, { _LOAD_FAST, 6, 0 } } }, + [STORE_FAST_STORE_FAST] = { .nuops = 2, .uops = { { _STORE_FAST, 5, 0 }, { _STORE_FAST, 6, 0 } } }, + [STORE_GLOBAL] = { .nuops = 1, .uops = { { _STORE_GLOBAL, 0, 0 } } }, + [STORE_NAME] = { .nuops = 1, .uops = { { _STORE_NAME, 0, 0 } } }, + [STORE_SLICE] = { .nuops = 1, .uops = { { _STORE_SLICE, 0, 0 } } }, + [STORE_SUBSCR] = { .nuops = 1, .uops = { { _STORE_SUBSCR, 0, 0 } } }, + [STORE_SUBSCR_DICT] = { .nuops = 1, .uops = { { _STORE_SUBSCR_DICT, 0, 0 } } }, + [STORE_SUBSCR_LIST_INT] = { .nuops = 1, .uops = { { _STORE_SUBSCR_LIST_INT, 0, 0 } } }, + [SWAP] = { .nuops = 1, .uops = { { _SWAP, 0, 0 } } }, + [TO_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL, 0, 0 } } }, + [TO_BOOL_ALWAYS_TRUE] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _REPLACE_WITH_TRUE, 0, 0 } } }, + [TO_BOOL_BOOL] = { .nuops = 1, .uops = { { _TO_BOOL_BOOL, 0, 0 } } }, + [TO_BOOL_INT] = { .nuops = 1, .uops = { { _TO_BOOL_INT, 0, 0 } } }, + [TO_BOOL_LIST] = { .nuops = 1, .uops = { { _TO_BOOL_LIST, 0, 0 } } }, + [TO_BOOL_NONE] = { .nuops = 1, .uops = { { _TO_BOOL_NONE, 0, 0 } } }, + [TO_BOOL_STR] = { .nuops = 1, .uops = { { _TO_BOOL_STR, 0, 0 } } }, + [UNARY_INVERT] = { .nuops = 1, .uops = { { _UNARY_INVERT, 0, 0 } } }, + [UNARY_NEGATIVE] = { .nuops = 1, .uops = { { _UNARY_NEGATIVE, 0, 0 } } }, + [UNARY_NOT] = { .nuops = 1, .uops = { { _UNARY_NOT, 0, 0 } } }, + [UNPACK_EX] = { .nuops = 1, .uops = { { _UNPACK_EX, 0, 0 } } }, + [UNPACK_SEQUENCE] = { .nuops = 1, .uops = { { _UNPACK_SEQUENCE, 0, 0 } } }, + [UNPACK_SEQUENCE_LIST] = { .nuops = 1, .uops = { { _UNPACK_SEQUENCE_LIST, 0, 0 } } }, + [UNPACK_SEQUENCE_TUPLE] = { .nuops = 1, .uops = { { _UNPACK_SEQUENCE_TUPLE, 0, 0 } } }, + [UNPACK_SEQUENCE_TWO_TUPLE] = { .nuops = 1, .uops = { { _UNPACK_SEQUENCE_TWO_TUPLE, 0, 0 } } }, + [WITH_EXCEPT_START] = { .nuops = 1, .uops = { { _WITH_EXCEPT_START, 0, 0 } } }, + [YIELD_VALUE] = { .nuops = 1, .uops = { { _YIELD_VALUE, 0, 0 } } }, +}; +#endif // NEED_OPCODE_METADATA + +extern const char *_PyOpcode_OpName[268]; +#ifdef NEED_OPCODE_METADATA +const char *_PyOpcode_OpName[268] = { + [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH", + [BEFORE_WITH] = "BEFORE_WITH", + [BINARY_OP] = "BINARY_OP", + [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", + [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", + [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", + [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", + [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", + [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", + [BINARY_OP_SUBTRACT_FLOAT] = "BINARY_OP_SUBTRACT_FLOAT", + [BINARY_OP_SUBTRACT_INT] = "BINARY_OP_SUBTRACT_INT", + [BINARY_SLICE] = "BINARY_SLICE", + [BINARY_SUBSCR] = "BINARY_SUBSCR", + [BINARY_SUBSCR_DICT] = "BINARY_SUBSCR_DICT", + [BINARY_SUBSCR_GETITEM] = "BINARY_SUBSCR_GETITEM", + [BINARY_SUBSCR_LIST_INT] = "BINARY_SUBSCR_LIST_INT", + [BINARY_SUBSCR_STR_INT] = "BINARY_SUBSCR_STR_INT", + [BINARY_SUBSCR_TUPLE_INT] = "BINARY_SUBSCR_TUPLE_INT", + [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", + [BUILD_LIST] = "BUILD_LIST", + [BUILD_MAP] = "BUILD_MAP", + [BUILD_SET] = "BUILD_SET", + [BUILD_SLICE] = "BUILD_SLICE", + [BUILD_STRING] = "BUILD_STRING", + [BUILD_TUPLE] = "BUILD_TUPLE", + [CACHE] = "CACHE", + [CALL] = "CALL", + [CALL_ALLOC_AND_ENTER_INIT] = "CALL_ALLOC_AND_ENTER_INIT", + [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", + [CALL_BOUND_METHOD_GENERAL] = "CALL_BOUND_METHOD_GENERAL", + [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", + [CALL_BUILTIN_FAST] = "CALL_BUILTIN_FAST", + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", + [CALL_BUILTIN_O] = "CALL_BUILTIN_O", + [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", + [CALL_INTRINSIC_1] = "CALL_INTRINSIC_1", + [CALL_INTRINSIC_2] = "CALL_INTRINSIC_2", + [CALL_ISINSTANCE] = "CALL_ISINSTANCE", + [CALL_KW] = "CALL_KW", + [CALL_LEN] = "CALL_LEN", + [CALL_LIST_APPEND] = "CALL_LIST_APPEND", + [CALL_METHOD_DESCRIPTOR_FAST] = "CALL_METHOD_DESCRIPTOR_FAST", + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + [CALL_METHOD_DESCRIPTOR_NOARGS] = "CALL_METHOD_DESCRIPTOR_NOARGS", + [CALL_METHOD_DESCRIPTOR_O] = "CALL_METHOD_DESCRIPTOR_O", + [CALL_NON_PY_GENERAL] = "CALL_NON_PY_GENERAL", + [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", + [CALL_PY_GENERAL] = "CALL_PY_GENERAL", + [CALL_STR_1] = "CALL_STR_1", + [CALL_TUPLE_1] = "CALL_TUPLE_1", + [CALL_TYPE_1] = "CALL_TYPE_1", + [CHECK_EG_MATCH] = "CHECK_EG_MATCH", + [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH", + [CLEANUP_THROW] = "CLEANUP_THROW", + [COMPARE_OP] = "COMPARE_OP", + [COMPARE_OP_FLOAT] = "COMPARE_OP_FLOAT", + [COMPARE_OP_INT] = "COMPARE_OP_INT", + [COMPARE_OP_STR] = "COMPARE_OP_STR", + [CONTAINS_OP] = "CONTAINS_OP", + [CONTAINS_OP_DICT] = "CONTAINS_OP_DICT", + [CONTAINS_OP_SET] = "CONTAINS_OP_SET", + [CONVERT_VALUE] = "CONVERT_VALUE", + [COPY] = "COPY", + [COPY_FREE_VARS] = "COPY_FREE_VARS", + [DELETE_ATTR] = "DELETE_ATTR", + [DELETE_DEREF] = "DELETE_DEREF", + [DELETE_FAST] = "DELETE_FAST", + [DELETE_GLOBAL] = "DELETE_GLOBAL", + [DELETE_NAME] = "DELETE_NAME", + [DELETE_SUBSCR] = "DELETE_SUBSCR", + [DICT_MERGE] = "DICT_MERGE", + [DICT_UPDATE] = "DICT_UPDATE", + [END_ASYNC_FOR] = "END_ASYNC_FOR", + [END_FOR] = "END_FOR", + [END_SEND] = "END_SEND", + [ENTER_EXECUTOR] = "ENTER_EXECUTOR", + [EXIT_INIT_CHECK] = "EXIT_INIT_CHECK", + [EXTENDED_ARG] = "EXTENDED_ARG", + [FORMAT_SIMPLE] = "FORMAT_SIMPLE", + [FORMAT_WITH_SPEC] = "FORMAT_WITH_SPEC", + [FOR_ITER] = "FOR_ITER", + [FOR_ITER_GEN] = "FOR_ITER_GEN", + [FOR_ITER_LIST] = "FOR_ITER_LIST", + [FOR_ITER_RANGE] = "FOR_ITER_RANGE", + [FOR_ITER_TUPLE] = "FOR_ITER_TUPLE", + [GET_AITER] = "GET_AITER", + [GET_ANEXT] = "GET_ANEXT", + [GET_AWAITABLE] = "GET_AWAITABLE", + [GET_ITER] = "GET_ITER", + [GET_LEN] = "GET_LEN", + [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER", + [IMPORT_FROM] = "IMPORT_FROM", + [IMPORT_NAME] = "IMPORT_NAME", + [INSTRUMENTED_CALL] = "INSTRUMENTED_CALL", + [INSTRUMENTED_CALL_FUNCTION_EX] = "INSTRUMENTED_CALL_FUNCTION_EX", + [INSTRUMENTED_CALL_KW] = "INSTRUMENTED_CALL_KW", + [INSTRUMENTED_END_FOR] = "INSTRUMENTED_END_FOR", + [INSTRUMENTED_END_SEND] = "INSTRUMENTED_END_SEND", + [INSTRUMENTED_FOR_ITER] = "INSTRUMENTED_FOR_ITER", + [INSTRUMENTED_INSTRUCTION] = "INSTRUMENTED_INSTRUCTION", + [INSTRUMENTED_JUMP_BACKWARD] = "INSTRUMENTED_JUMP_BACKWARD", + [INSTRUMENTED_JUMP_FORWARD] = "INSTRUMENTED_JUMP_FORWARD", + [INSTRUMENTED_LINE] = "INSTRUMENTED_LINE", + [INSTRUMENTED_LOAD_SUPER_ATTR] = "INSTRUMENTED_LOAD_SUPER_ATTR", + [INSTRUMENTED_POP_JUMP_IF_FALSE] = "INSTRUMENTED_POP_JUMP_IF_FALSE", + [INSTRUMENTED_POP_JUMP_IF_NONE] = "INSTRUMENTED_POP_JUMP_IF_NONE", + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = "INSTRUMENTED_POP_JUMP_IF_NOT_NONE", + [INSTRUMENTED_POP_JUMP_IF_TRUE] = "INSTRUMENTED_POP_JUMP_IF_TRUE", + [INSTRUMENTED_RESUME] = "INSTRUMENTED_RESUME", + [INSTRUMENTED_RETURN_CONST] = "INSTRUMENTED_RETURN_CONST", + [INSTRUMENTED_RETURN_VALUE] = "INSTRUMENTED_RETURN_VALUE", + [INSTRUMENTED_YIELD_VALUE] = "INSTRUMENTED_YIELD_VALUE", + [INTERPRETER_EXIT] = "INTERPRETER_EXIT", + [IS_OP] = "IS_OP", + [JUMP] = "JUMP", + [JUMP_BACKWARD] = "JUMP_BACKWARD", + [JUMP_BACKWARD_NO_INTERRUPT] = "JUMP_BACKWARD_NO_INTERRUPT", + [JUMP_FORWARD] = "JUMP_FORWARD", + [JUMP_NO_INTERRUPT] = "JUMP_NO_INTERRUPT", + [LIST_APPEND] = "LIST_APPEND", + [LIST_EXTEND] = "LIST_EXTEND", + [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR", + [LOAD_ATTR] = "LOAD_ATTR", + [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS", + [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", + [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", + [LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT", + [LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT", + [LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES", + [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", + [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = "LOAD_ATTR_NONDESCRIPTOR_NO_DICT", + [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES", + [LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY", + [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", + [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", + [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS", + [LOAD_CLOSURE] = "LOAD_CLOSURE", + [LOAD_CONST] = "LOAD_CONST", + [LOAD_DEREF] = "LOAD_DEREF", + [LOAD_FAST] = "LOAD_FAST", + [LOAD_FAST_AND_CLEAR] = "LOAD_FAST_AND_CLEAR", + [LOAD_FAST_CHECK] = "LOAD_FAST_CHECK", + [LOAD_FAST_LOAD_FAST] = "LOAD_FAST_LOAD_FAST", + [LOAD_FROM_DICT_OR_DEREF] = "LOAD_FROM_DICT_OR_DEREF", + [LOAD_FROM_DICT_OR_GLOBALS] = "LOAD_FROM_DICT_OR_GLOBALS", + [LOAD_GLOBAL] = "LOAD_GLOBAL", + [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", + [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", + [LOAD_LOCALS] = "LOAD_LOCALS", + [LOAD_METHOD] = "LOAD_METHOD", + [LOAD_NAME] = "LOAD_NAME", + [LOAD_SUPER_ATTR] = "LOAD_SUPER_ATTR", + [LOAD_SUPER_ATTR_ATTR] = "LOAD_SUPER_ATTR_ATTR", + [LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD", + [LOAD_SUPER_METHOD] = "LOAD_SUPER_METHOD", + [LOAD_ZERO_SUPER_ATTR] = "LOAD_ZERO_SUPER_ATTR", + [LOAD_ZERO_SUPER_METHOD] = "LOAD_ZERO_SUPER_METHOD", + [MAKE_CELL] = "MAKE_CELL", + [MAKE_FUNCTION] = "MAKE_FUNCTION", + [MAP_ADD] = "MAP_ADD", + [MATCH_CLASS] = "MATCH_CLASS", + [MATCH_KEYS] = "MATCH_KEYS", + [MATCH_MAPPING] = "MATCH_MAPPING", + [MATCH_SEQUENCE] = "MATCH_SEQUENCE", + [NOP] = "NOP", + [POP_BLOCK] = "POP_BLOCK", + [POP_EXCEPT] = "POP_EXCEPT", + [POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE", + [POP_JUMP_IF_NONE] = "POP_JUMP_IF_NONE", + [POP_JUMP_IF_NOT_NONE] = "POP_JUMP_IF_NOT_NONE", + [POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE", + [POP_TOP] = "POP_TOP", + [PUSH_EXC_INFO] = "PUSH_EXC_INFO", + [PUSH_NULL] = "PUSH_NULL", + [RAISE_VARARGS] = "RAISE_VARARGS", + [RERAISE] = "RERAISE", + [RESERVED] = "RESERVED", + [RESUME] = "RESUME", + [RESUME_CHECK] = "RESUME_CHECK", + [RETURN_CONST] = "RETURN_CONST", + [RETURN_GENERATOR] = "RETURN_GENERATOR", + [RETURN_VALUE] = "RETURN_VALUE", + [SEND] = "SEND", + [SEND_GEN] = "SEND_GEN", + [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", + [SETUP_CLEANUP] = "SETUP_CLEANUP", + [SETUP_FINALLY] = "SETUP_FINALLY", + [SETUP_WITH] = "SETUP_WITH", + [SET_ADD] = "SET_ADD", + [SET_FUNCTION_ATTRIBUTE] = "SET_FUNCTION_ATTRIBUTE", + [SET_UPDATE] = "SET_UPDATE", + [STORE_ATTR] = "STORE_ATTR", + [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", + [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", + [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", + [STORE_DEREF] = "STORE_DEREF", + [STORE_FAST] = "STORE_FAST", + [STORE_FAST_LOAD_FAST] = "STORE_FAST_LOAD_FAST", + [STORE_FAST_MAYBE_NULL] = "STORE_FAST_MAYBE_NULL", + [STORE_FAST_STORE_FAST] = "STORE_FAST_STORE_FAST", + [STORE_GLOBAL] = "STORE_GLOBAL", + [STORE_NAME] = "STORE_NAME", + [STORE_SLICE] = "STORE_SLICE", + [STORE_SUBSCR] = "STORE_SUBSCR", + [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", + [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", + [SWAP] = "SWAP", + [TO_BOOL] = "TO_BOOL", + [TO_BOOL_ALWAYS_TRUE] = "TO_BOOL_ALWAYS_TRUE", + [TO_BOOL_BOOL] = "TO_BOOL_BOOL", + [TO_BOOL_INT] = "TO_BOOL_INT", + [TO_BOOL_LIST] = "TO_BOOL_LIST", + [TO_BOOL_NONE] = "TO_BOOL_NONE", + [TO_BOOL_STR] = "TO_BOOL_STR", + [UNARY_INVERT] = "UNARY_INVERT", + [UNARY_NEGATIVE] = "UNARY_NEGATIVE", + [UNARY_NOT] = "UNARY_NOT", + [UNPACK_EX] = "UNPACK_EX", + [UNPACK_SEQUENCE] = "UNPACK_SEQUENCE", + [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", + [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", + [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", + [WITH_EXCEPT_START] = "WITH_EXCEPT_START", + [YIELD_VALUE] = "YIELD_VALUE", +}; +#endif + +extern const uint8_t _PyOpcode_Caches[256]; +#ifdef NEED_OPCODE_METADATA +const uint8_t _PyOpcode_Caches[256] = { + [JUMP_BACKWARD] = 1, + [TO_BOOL] = 3, + [BINARY_SUBSCR] = 1, + [STORE_SUBSCR] = 1, + [SEND] = 1, + [UNPACK_SEQUENCE] = 1, + [STORE_ATTR] = 4, + [LOAD_GLOBAL] = 4, + [LOAD_SUPER_ATTR] = 1, + [LOAD_ATTR] = 9, + [COMPARE_OP] = 1, + [CONTAINS_OP] = 1, + [POP_JUMP_IF_TRUE] = 1, + [POP_JUMP_IF_FALSE] = 1, + [POP_JUMP_IF_NONE] = 1, + [POP_JUMP_IF_NOT_NONE] = 1, + [FOR_ITER] = 1, + [CALL] = 3, + [BINARY_OP] = 1, +}; +#endif + +extern const uint8_t _PyOpcode_Deopt[256]; +#ifdef NEED_OPCODE_METADATA +const uint8_t _PyOpcode_Deopt[256] = { + [BEFORE_ASYNC_WITH] = BEFORE_ASYNC_WITH, + [BEFORE_WITH] = BEFORE_WITH, + [BINARY_OP] = BINARY_OP, + [BINARY_OP_ADD_FLOAT] = BINARY_OP, + [BINARY_OP_ADD_INT] = BINARY_OP, + [BINARY_OP_ADD_UNICODE] = BINARY_OP, + [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP, + [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP, + [BINARY_OP_MULTIPLY_INT] = BINARY_OP, + [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP, + [BINARY_OP_SUBTRACT_INT] = BINARY_OP, + [BINARY_SLICE] = BINARY_SLICE, + [BINARY_SUBSCR] = BINARY_SUBSCR, + [BINARY_SUBSCR_DICT] = BINARY_SUBSCR, + [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR, + [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR, + [BINARY_SUBSCR_STR_INT] = BINARY_SUBSCR, + [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR, + [BUILD_CONST_KEY_MAP] = BUILD_CONST_KEY_MAP, + [BUILD_LIST] = BUILD_LIST, + [BUILD_MAP] = BUILD_MAP, + [BUILD_SET] = BUILD_SET, + [BUILD_SLICE] = BUILD_SLICE, + [BUILD_STRING] = BUILD_STRING, + [BUILD_TUPLE] = BUILD_TUPLE, + [CACHE] = CACHE, + [CALL] = CALL, + [CALL_ALLOC_AND_ENTER_INIT] = CALL, + [CALL_BOUND_METHOD_EXACT_ARGS] = CALL, + [CALL_BOUND_METHOD_GENERAL] = CALL, + [CALL_BUILTIN_CLASS] = CALL, + [CALL_BUILTIN_FAST] = CALL, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = CALL, + [CALL_BUILTIN_O] = CALL, + [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, + [CALL_INTRINSIC_1] = CALL_INTRINSIC_1, + [CALL_INTRINSIC_2] = CALL_INTRINSIC_2, + [CALL_ISINSTANCE] = CALL, + [CALL_KW] = CALL_KW, + [CALL_LEN] = CALL, + [CALL_LIST_APPEND] = CALL, + [CALL_METHOD_DESCRIPTOR_FAST] = CALL, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = CALL, + [CALL_METHOD_DESCRIPTOR_NOARGS] = CALL, + [CALL_METHOD_DESCRIPTOR_O] = CALL, + [CALL_NON_PY_GENERAL] = CALL, + [CALL_PY_EXACT_ARGS] = CALL, + [CALL_PY_GENERAL] = CALL, + [CALL_STR_1] = CALL, + [CALL_TUPLE_1] = CALL, + [CALL_TYPE_1] = CALL, + [CHECK_EG_MATCH] = CHECK_EG_MATCH, + [CHECK_EXC_MATCH] = CHECK_EXC_MATCH, + [CLEANUP_THROW] = CLEANUP_THROW, + [COMPARE_OP] = COMPARE_OP, + [COMPARE_OP_FLOAT] = COMPARE_OP, + [COMPARE_OP_INT] = COMPARE_OP, + [COMPARE_OP_STR] = COMPARE_OP, + [CONTAINS_OP] = CONTAINS_OP, + [CONTAINS_OP_DICT] = CONTAINS_OP, + [CONTAINS_OP_SET] = CONTAINS_OP, + [CONVERT_VALUE] = CONVERT_VALUE, + [COPY] = COPY, + [COPY_FREE_VARS] = COPY_FREE_VARS, + [DELETE_ATTR] = DELETE_ATTR, + [DELETE_DEREF] = DELETE_DEREF, + [DELETE_FAST] = DELETE_FAST, + [DELETE_GLOBAL] = DELETE_GLOBAL, + [DELETE_NAME] = DELETE_NAME, + [DELETE_SUBSCR] = DELETE_SUBSCR, + [DICT_MERGE] = DICT_MERGE, + [DICT_UPDATE] = DICT_UPDATE, + [END_ASYNC_FOR] = END_ASYNC_FOR, + [END_FOR] = END_FOR, + [END_SEND] = END_SEND, + [ENTER_EXECUTOR] = ENTER_EXECUTOR, + [EXIT_INIT_CHECK] = EXIT_INIT_CHECK, + [EXTENDED_ARG] = EXTENDED_ARG, + [FORMAT_SIMPLE] = FORMAT_SIMPLE, + [FORMAT_WITH_SPEC] = FORMAT_WITH_SPEC, + [FOR_ITER] = FOR_ITER, + [FOR_ITER_GEN] = FOR_ITER, + [FOR_ITER_LIST] = FOR_ITER, + [FOR_ITER_RANGE] = FOR_ITER, + [FOR_ITER_TUPLE] = FOR_ITER, + [GET_AITER] = GET_AITER, + [GET_ANEXT] = GET_ANEXT, + [GET_AWAITABLE] = GET_AWAITABLE, + [GET_ITER] = GET_ITER, + [GET_LEN] = GET_LEN, + [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER, + [IMPORT_FROM] = IMPORT_FROM, + [IMPORT_NAME] = IMPORT_NAME, + [INSTRUMENTED_CALL] = INSTRUMENTED_CALL, + [INSTRUMENTED_CALL_FUNCTION_EX] = INSTRUMENTED_CALL_FUNCTION_EX, + [INSTRUMENTED_CALL_KW] = INSTRUMENTED_CALL_KW, + [INSTRUMENTED_END_FOR] = INSTRUMENTED_END_FOR, + [INSTRUMENTED_END_SEND] = INSTRUMENTED_END_SEND, + [INSTRUMENTED_FOR_ITER] = INSTRUMENTED_FOR_ITER, + [INSTRUMENTED_INSTRUCTION] = INSTRUMENTED_INSTRUCTION, + [INSTRUMENTED_JUMP_BACKWARD] = INSTRUMENTED_JUMP_BACKWARD, + [INSTRUMENTED_JUMP_FORWARD] = INSTRUMENTED_JUMP_FORWARD, + [INSTRUMENTED_LINE] = INSTRUMENTED_LINE, + [INSTRUMENTED_LOAD_SUPER_ATTR] = INSTRUMENTED_LOAD_SUPER_ATTR, + [INSTRUMENTED_POP_JUMP_IF_FALSE] = INSTRUMENTED_POP_JUMP_IF_FALSE, + [INSTRUMENTED_POP_JUMP_IF_NONE] = INSTRUMENTED_POP_JUMP_IF_NONE, + [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = INSTRUMENTED_POP_JUMP_IF_NOT_NONE, + [INSTRUMENTED_POP_JUMP_IF_TRUE] = INSTRUMENTED_POP_JUMP_IF_TRUE, + [INSTRUMENTED_RESUME] = INSTRUMENTED_RESUME, + [INSTRUMENTED_RETURN_CONST] = INSTRUMENTED_RETURN_CONST, + [INSTRUMENTED_RETURN_VALUE] = INSTRUMENTED_RETURN_VALUE, + [INSTRUMENTED_YIELD_VALUE] = INSTRUMENTED_YIELD_VALUE, + [INTERPRETER_EXIT] = INTERPRETER_EXIT, + [IS_OP] = IS_OP, + [JUMP_BACKWARD] = JUMP_BACKWARD, + [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT, + [JUMP_FORWARD] = JUMP_FORWARD, + [LIST_APPEND] = LIST_APPEND, + [LIST_EXTEND] = LIST_EXTEND, + [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR, + [LOAD_ATTR] = LOAD_ATTR, + [LOAD_ATTR_CLASS] = LOAD_ATTR, + [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = LOAD_ATTR, + [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR, + [LOAD_ATTR_METHOD_LAZY_DICT] = LOAD_ATTR, + [LOAD_ATTR_METHOD_NO_DICT] = LOAD_ATTR, + [LOAD_ATTR_METHOD_WITH_VALUES] = LOAD_ATTR, + [LOAD_ATTR_MODULE] = LOAD_ATTR, + [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = LOAD_ATTR, + [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = LOAD_ATTR, + [LOAD_ATTR_PROPERTY] = LOAD_ATTR, + [LOAD_ATTR_SLOT] = LOAD_ATTR, + [LOAD_ATTR_WITH_HINT] = LOAD_ATTR, + [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS, + [LOAD_CONST] = LOAD_CONST, + [LOAD_DEREF] = LOAD_DEREF, + [LOAD_FAST] = LOAD_FAST, + [LOAD_FAST_AND_CLEAR] = LOAD_FAST_AND_CLEAR, + [LOAD_FAST_CHECK] = LOAD_FAST_CHECK, + [LOAD_FAST_LOAD_FAST] = LOAD_FAST_LOAD_FAST, + [LOAD_FROM_DICT_OR_DEREF] = LOAD_FROM_DICT_OR_DEREF, + [LOAD_FROM_DICT_OR_GLOBALS] = LOAD_FROM_DICT_OR_GLOBALS, + [LOAD_GLOBAL] = LOAD_GLOBAL, + [LOAD_GLOBAL_BUILTIN] = LOAD_GLOBAL, + [LOAD_GLOBAL_MODULE] = LOAD_GLOBAL, + [LOAD_LOCALS] = LOAD_LOCALS, + [LOAD_NAME] = LOAD_NAME, + [LOAD_SUPER_ATTR] = LOAD_SUPER_ATTR, + [LOAD_SUPER_ATTR_ATTR] = LOAD_SUPER_ATTR, + [LOAD_SUPER_ATTR_METHOD] = LOAD_SUPER_ATTR, + [MAKE_CELL] = MAKE_CELL, + [MAKE_FUNCTION] = MAKE_FUNCTION, + [MAP_ADD] = MAP_ADD, + [MATCH_CLASS] = MATCH_CLASS, + [MATCH_KEYS] = MATCH_KEYS, + [MATCH_MAPPING] = MATCH_MAPPING, + [MATCH_SEQUENCE] = MATCH_SEQUENCE, + [NOP] = NOP, + [POP_EXCEPT] = POP_EXCEPT, + [POP_JUMP_IF_FALSE] = POP_JUMP_IF_FALSE, + [POP_JUMP_IF_NONE] = POP_JUMP_IF_NONE, + [POP_JUMP_IF_NOT_NONE] = POP_JUMP_IF_NOT_NONE, + [POP_JUMP_IF_TRUE] = POP_JUMP_IF_TRUE, + [POP_TOP] = POP_TOP, + [PUSH_EXC_INFO] = PUSH_EXC_INFO, + [PUSH_NULL] = PUSH_NULL, + [RAISE_VARARGS] = RAISE_VARARGS, + [RERAISE] = RERAISE, + [RESERVED] = RESERVED, + [RESUME] = RESUME, + [RESUME_CHECK] = RESUME, + [RETURN_CONST] = RETURN_CONST, + [RETURN_GENERATOR] = RETURN_GENERATOR, + [RETURN_VALUE] = RETURN_VALUE, + [SEND] = SEND, + [SEND_GEN] = SEND, + [SETUP_ANNOTATIONS] = SETUP_ANNOTATIONS, + [SET_ADD] = SET_ADD, + [SET_FUNCTION_ATTRIBUTE] = SET_FUNCTION_ATTRIBUTE, + [SET_UPDATE] = SET_UPDATE, + [STORE_ATTR] = STORE_ATTR, + [STORE_ATTR_INSTANCE_VALUE] = STORE_ATTR, + [STORE_ATTR_SLOT] = STORE_ATTR, + [STORE_ATTR_WITH_HINT] = STORE_ATTR, + [STORE_DEREF] = STORE_DEREF, + [STORE_FAST] = STORE_FAST, + [STORE_FAST_LOAD_FAST] = STORE_FAST_LOAD_FAST, + [STORE_FAST_STORE_FAST] = STORE_FAST_STORE_FAST, + [STORE_GLOBAL] = STORE_GLOBAL, + [STORE_NAME] = STORE_NAME, + [STORE_SLICE] = STORE_SLICE, + [STORE_SUBSCR] = STORE_SUBSCR, + [STORE_SUBSCR_DICT] = STORE_SUBSCR, + [STORE_SUBSCR_LIST_INT] = STORE_SUBSCR, + [SWAP] = SWAP, + [TO_BOOL] = TO_BOOL, + [TO_BOOL_ALWAYS_TRUE] = TO_BOOL, + [TO_BOOL_BOOL] = TO_BOOL, + [TO_BOOL_INT] = TO_BOOL, + [TO_BOOL_LIST] = TO_BOOL, + [TO_BOOL_NONE] = TO_BOOL, + [TO_BOOL_STR] = TO_BOOL, + [UNARY_INVERT] = UNARY_INVERT, + [UNARY_NEGATIVE] = UNARY_NEGATIVE, + [UNARY_NOT] = UNARY_NOT, + [UNPACK_EX] = UNPACK_EX, + [UNPACK_SEQUENCE] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_LIST] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_TUPLE] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_TWO_TUPLE] = UNPACK_SEQUENCE, + [WITH_EXCEPT_START] = WITH_EXCEPT_START, + [YIELD_VALUE] = YIELD_VALUE, +}; + +#endif // NEED_OPCODE_METADATA + +#define EXTRA_CASES \ + case 119: \ + case 120: \ + case 121: \ + case 122: \ + case 123: \ + case 124: \ + case 125: \ + case 126: \ + case 127: \ + case 128: \ + case 129: \ + case 130: \ + case 131: \ + case 132: \ + case 133: \ + case 134: \ + case 135: \ + case 136: \ + case 137: \ + case 138: \ + case 139: \ + case 140: \ + case 141: \ + case 142: \ + case 143: \ + case 144: \ + case 145: \ + case 146: \ + case 147: \ + case 148: \ + case 223: \ + case 224: \ + case 225: \ + case 226: \ + case 227: \ + case 228: \ + case 229: \ + case 230: \ + case 231: \ + case 232: \ + case 233: \ + case 234: \ + case 235: \ + case 255: \ + ; +struct pseudo_targets { + uint8_t targets[3]; +}; +extern const struct pseudo_targets _PyOpcode_PseudoTargets[12]; +#ifdef NEED_OPCODE_METADATA +const struct pseudo_targets _PyOpcode_PseudoTargets[12] = { + [LOAD_CLOSURE-256] = { { LOAD_FAST, 0, 0 } }, + [STORE_FAST_MAYBE_NULL-256] = { { STORE_FAST, 0, 0 } }, + [LOAD_SUPER_METHOD-256] = { { LOAD_SUPER_ATTR, 0, 0 } }, + [LOAD_ZERO_SUPER_METHOD-256] = { { LOAD_SUPER_ATTR, 0, 0 } }, + [LOAD_ZERO_SUPER_ATTR-256] = { { LOAD_SUPER_ATTR, 0, 0 } }, + [LOAD_METHOD-256] = { { LOAD_ATTR, 0, 0 } }, + [JUMP-256] = { { JUMP_FORWARD, JUMP_BACKWARD, 0 } }, + [JUMP_NO_INTERRUPT-256] = { { JUMP_FORWARD, JUMP_BACKWARD_NO_INTERRUPT, 0 } }, + [SETUP_FINALLY-256] = { { NOP, 0, 0 } }, + [SETUP_CLEANUP-256] = { { NOP, 0, 0 } }, + [SETUP_WITH-256] = { { NOP, 0, 0 } }, + [POP_BLOCK-256] = { { NOP, 0, 0 } }, +}; + +#endif // NEED_OPCODE_METADATA +static inline bool +is_pseudo_target(int pseudo, int target) { + if (pseudo < 256 || pseudo >= 268) { + return false; + } + for (int i = 0; _PyOpcode_PseudoTargets[pseudo-256].targets[i]; i++) { + if (_PyOpcode_PseudoTargets[pseudo-256].targets[i] == target) return true; + } + return false; +} + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CORE_OPCODE_METADATA_H */ diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h index 1d5ff988..208bfb2f 100644 --- a/Include/internal/pycore_opcode_utils.h +++ b/Include/internal/pycore_opcode_utils.h @@ -8,17 +8,13 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_opcode.h" // _PyOpcode_Jump - +#include "opcode_ids.h" #define MAX_REAL_OPCODE 254 #define IS_WITHIN_OPCODE_RANGE(opcode) \ (((opcode) >= 0 && (opcode) <= MAX_REAL_OPCODE) || \ - IS_PSEUDO_OPCODE(opcode)) - -#define IS_JUMP_OPCODE(opcode) \ - is_bit_set_in_table(_PyOpcode_Jump, opcode) + IS_PSEUDO_INSTR(opcode)) #define IS_BLOCK_PUSH_OPCODE(opcode) \ ((opcode) == SETUP_FINALLY || \ @@ -26,11 +22,11 @@ extern "C" { (opcode) == SETUP_CLEANUP) #define HAS_TARGET(opcode) \ - (IS_JUMP_OPCODE(opcode) || IS_BLOCK_PUSH_OPCODE(opcode)) + (OPCODE_HAS_JUMP(opcode) || IS_BLOCK_PUSH_OPCODE(opcode)) /* opcodes that must be last in the basicblock */ #define IS_TERMINATOR_OPCODE(opcode) \ - (IS_JUMP_OPCODE(opcode) || IS_SCOPE_EXIT_OPCODE(opcode)) + (OPCODE_HAS_JUMP(opcode) || IS_SCOPE_EXIT_OPCODE(opcode)) /* opcodes which are not emitted in codegen stage, only by the assembler */ #define IS_ASSEMBLER_OPCODE(opcode) \ @@ -55,36 +51,21 @@ extern "C" { (opcode) == RAISE_VARARGS || \ (opcode) == RERAISE) -#define IS_SUPERINSTRUCTION_OPCODE(opcode) \ - ((opcode) == LOAD_FAST__LOAD_FAST || \ - (opcode) == LOAD_FAST__LOAD_CONST || \ - (opcode) == LOAD_CONST__LOAD_FAST || \ - (opcode) == STORE_FAST__LOAD_FAST || \ - (opcode) == STORE_FAST__STORE_FAST) - - -#define LOG_BITS_PER_INT 5 -#define MASK_LOW_LOG_BITS 31 - -static inline int -is_bit_set_in_table(const uint32_t *table, int bitindex) { - /* Is the relevant bit set in the relevant word? */ - /* 512 bits fit into 9 32-bits words. - * Word is indexed by (bitindex>>ln(size of int in bits)). - * Bit within word is the low bits of bitindex. - */ - if (bitindex >= 0 && bitindex < 512) { - uint32_t word = table[bitindex >> LOG_BITS_PER_INT]; - return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1; - } - else { - return 0; - } -} -#undef LOG_BITS_PER_INT -#undef MASK_LOW_LOG_BITS +/* Flags used in the oparg for MAKE_FUNCTION */ +#define MAKE_FUNCTION_DEFAULTS 0x01 +#define MAKE_FUNCTION_KWDEFAULTS 0x02 +#define MAKE_FUNCTION_ANNOTATIONS 0x04 +#define MAKE_FUNCTION_CLOSURE 0x08 + +/* Values used in the oparg for RESUME */ +#define RESUME_AT_FUNC_START 0 +#define RESUME_AFTER_YIELD 1 +#define RESUME_AFTER_YIELD_FROM 2 +#define RESUME_AFTER_AWAIT 3 +#define RESUME_OPARG_LOCATION_MASK 0x3 +#define RESUME_OPARG_DEPTH1_MASK 0x4 #ifdef __cplusplus } diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h new file mode 100644 index 00000000..49aa67c6 --- /dev/null +++ b/Include/internal/pycore_optimizer.h @@ -0,0 +1,272 @@ +#ifndef Py_INTERNAL_OPTIMIZER_H +#define Py_INTERNAL_OPTIMIZER_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_uop_ids.h" +#include + + +typedef struct _PyExecutorLinkListNode { + struct _PyExecutorObject *next; + struct _PyExecutorObject *previous; +} _PyExecutorLinkListNode; + + +/* Bloom filter with m = 256 + * https://en.wikipedia.org/wiki/Bloom_filter */ +#define BLOOM_FILTER_WORDS 8 + +typedef struct _bloom_filter { + uint32_t bits[BLOOM_FILTER_WORDS]; +} _PyBloomFilter; + +typedef struct { + uint8_t opcode; + uint8_t oparg; + uint8_t valid; + uint8_t linked; + int index; // Index of ENTER_EXECUTOR (if code isn't NULL, below). + _PyBloomFilter bloom; + _PyExecutorLinkListNode links; + PyCodeObject *code; // Weak (NULL if no corresponding ENTER_EXECUTOR). +} _PyVMData; + +#define UOP_FORMAT_TARGET 0 +#define UOP_FORMAT_EXIT 1 +#define UOP_FORMAT_JUMP 2 +#define UOP_FORMAT_UNUSED 3 + +/* Depending on the format, + * the 32 bits between the oparg and operand are: + * UOP_FORMAT_TARGET: + * uint32_t target; + * UOP_FORMAT_EXIT + * uint16_t exit_index; + * uint16_t error_target; + * UOP_FORMAT_JUMP + * uint16_t jump_target; + * uint16_t error_target; + */ +typedef struct { + uint16_t opcode:14; + uint16_t format:2; + uint16_t oparg; + union { + uint32_t target; + struct { + union { + uint16_t exit_index; + uint16_t jump_target; + }; + uint16_t error_target; + }; + }; + uint64_t operand; // A cache entry +} _PyUOpInstruction; + +static inline uint32_t uop_get_target(const _PyUOpInstruction *inst) +{ + assert(inst->format == UOP_FORMAT_TARGET); + return inst->target; +} + +static inline uint16_t uop_get_exit_index(const _PyUOpInstruction *inst) +{ + assert(inst->format == UOP_FORMAT_EXIT); + return inst->exit_index; +} + +static inline uint16_t uop_get_jump_target(const _PyUOpInstruction *inst) +{ + assert(inst->format == UOP_FORMAT_JUMP); + return inst->jump_target; +} + +static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst) +{ + assert(inst->format != UOP_FORMAT_TARGET); + return inst->error_target; +} + +typedef struct _exit_data { + uint32_t target; + _Py_BackoffCounter temperature; + const struct _PyExecutorObject *executor; +} _PyExitData; + +typedef struct _PyExecutorObject { + PyObject_VAR_HEAD + const _PyUOpInstruction *trace; + _PyVMData vm_data; /* Used by the VM, but opaque to the optimizer */ + uint32_t exit_count; + uint32_t code_size; + size_t jit_size; + void *jit_code; + void *jit_side_entry; + _PyExitData exits[1]; +} _PyExecutorObject; + +typedef struct _PyOptimizerObject _PyOptimizerObject; + +/* Should return > 0 if a new executor is created. O if no executor is produced and < 0 if an error occurred. */ +typedef int (*optimize_func)( + _PyOptimizerObject* self, struct _PyInterpreterFrame *frame, + _Py_CODEUNIT *instr, _PyExecutorObject **exec_ptr, + int curr_stackentries); + +struct _PyOptimizerObject { + PyObject_HEAD + optimize_func optimize; + /* Data needed by the optimizer goes here, but is opaque to the VM */ +}; + +/** Test support **/ +typedef struct { + _PyOptimizerObject base; + int64_t count; +} _PyCounterOptimizerObject; + +_PyOptimizerObject *_Py_SetOptimizer(PyInterpreterState *interp, _PyOptimizerObject* optimizer); + +PyAPI_FUNC(int) _Py_SetTier2Optimizer(_PyOptimizerObject* optimizer); + +PyAPI_FUNC(_PyOptimizerObject *) _Py_GetOptimizer(void); + +PyAPI_FUNC(_PyExecutorObject *) _Py_GetExecutor(PyCodeObject *code, int offset); + +void _Py_ExecutorInit(_PyExecutorObject *, const _PyBloomFilter *); +void _Py_ExecutorDetach(_PyExecutorObject *); +void _Py_BloomFilter_Init(_PyBloomFilter *); +void _Py_BloomFilter_Add(_PyBloomFilter *bloom, void *obj); +PyAPI_FUNC(void) _Py_Executor_DependsOn(_PyExecutorObject *executor, void *obj); +/* For testing */ +PyAPI_FUNC(PyObject *) _PyOptimizer_NewCounter(void); +PyAPI_FUNC(PyObject *) _PyOptimizer_NewUOpOptimizer(void); + +#define _Py_MAX_ALLOWED_BUILTINS_MODIFICATIONS 3 +#define _Py_MAX_ALLOWED_GLOBALS_MODIFICATIONS 6 + +#ifdef _Py_TIER2 +PyAPI_FUNC(void) _Py_Executors_InvalidateDependency(PyInterpreterState *interp, void *obj, int is_invalidation); +PyAPI_FUNC(void) _Py_Executors_InvalidateAll(PyInterpreterState *interp, int is_invalidation); +#else +# define _Py_Executors_InvalidateDependency(A, B, C) ((void)0) +# define _Py_Executors_InvalidateAll(A, B) ((void)0) +#endif + + +// This is the length of the trace we project initially. +#define UOP_MAX_TRACE_LENGTH 800 + +#define TRACE_STACK_SIZE 5 + +int _Py_uop_analyze_and_optimize(struct _PyInterpreterFrame *frame, + _PyUOpInstruction *trace, int trace_len, int curr_stackentries, + _PyBloomFilter *dependencies); + +extern PyTypeObject _PyCounterExecutor_Type; +extern PyTypeObject _PyCounterOptimizer_Type; +extern PyTypeObject _PyDefaultOptimizer_Type; +extern PyTypeObject _PyUOpExecutor_Type; +extern PyTypeObject _PyUOpOptimizer_Type; + +/* Symbols */ +/* See explanation in optimizer_symbols.c */ + +struct _Py_UopsSymbol { + int flags; // 0 bits: Top; 2 or more bits: Bottom + PyTypeObject *typ; // Borrowed reference + PyObject *const_val; // Owned reference (!) +}; + +// Holds locals, stack, locals, stack ... co_consts (in that order) +#define MAX_ABSTRACT_INTERP_SIZE 4096 + +#define TY_ARENA_SIZE (UOP_MAX_TRACE_LENGTH * 5) + +// Need extras for root frame and for overflow frame (see TRACE_STACK_PUSH()) +#define MAX_ABSTRACT_FRAME_DEPTH (TRACE_STACK_SIZE + 2) + +typedef struct _Py_UopsSymbol _Py_UopsSymbol; + +struct _Py_UOpsAbstractFrame { + // Max stacklen + int stack_len; + int locals_len; + + _Py_UopsSymbol **stack_pointer; + _Py_UopsSymbol **stack; + _Py_UopsSymbol **locals; +}; + +typedef struct _Py_UOpsAbstractFrame _Py_UOpsAbstractFrame; + +typedef struct ty_arena { + int ty_curr_number; + int ty_max_number; + _Py_UopsSymbol arena[TY_ARENA_SIZE]; +} ty_arena; + +struct _Py_UOpsContext { + PyObject_HEAD + // The current "executing" frame. + _Py_UOpsAbstractFrame *frame; + _Py_UOpsAbstractFrame frames[MAX_ABSTRACT_FRAME_DEPTH]; + int curr_frame_depth; + + // Arena for the symbolic types. + ty_arena t_arena; + + _Py_UopsSymbol **n_consumed; + _Py_UopsSymbol **limit; + _Py_UopsSymbol *locals_and_stack[MAX_ABSTRACT_INTERP_SIZE]; +}; + +typedef struct _Py_UOpsContext _Py_UOpsContext; + +extern bool _Py_uop_sym_is_null(_Py_UopsSymbol *sym); +extern bool _Py_uop_sym_is_not_null(_Py_UopsSymbol *sym); +extern bool _Py_uop_sym_is_const(_Py_UopsSymbol *sym); +extern PyObject *_Py_uop_sym_get_const(_Py_UopsSymbol *sym); +extern _Py_UopsSymbol *_Py_uop_sym_new_unknown(_Py_UOpsContext *ctx); +extern _Py_UopsSymbol *_Py_uop_sym_new_not_null(_Py_UOpsContext *ctx); +extern _Py_UopsSymbol *_Py_uop_sym_new_type( + _Py_UOpsContext *ctx, PyTypeObject *typ); +extern _Py_UopsSymbol *_Py_uop_sym_new_const(_Py_UOpsContext *ctx, PyObject *const_val); +extern _Py_UopsSymbol *_Py_uop_sym_new_null(_Py_UOpsContext *ctx); +extern bool _Py_uop_sym_has_type(_Py_UopsSymbol *sym); +extern bool _Py_uop_sym_matches_type(_Py_UopsSymbol *sym, PyTypeObject *typ); +extern bool _Py_uop_sym_set_null(_Py_UopsSymbol *sym); +extern bool _Py_uop_sym_set_non_null(_Py_UopsSymbol *sym); +extern bool _Py_uop_sym_set_type(_Py_UopsSymbol *sym, PyTypeObject *typ); +extern bool _Py_uop_sym_set_const(_Py_UopsSymbol *sym, PyObject *const_val); +extern bool _Py_uop_sym_is_bottom(_Py_UopsSymbol *sym); +extern int _Py_uop_sym_truthiness(_Py_UopsSymbol *sym); +extern PyTypeObject *_Py_uop_sym_get_type(_Py_UopsSymbol *sym); + + +extern int _Py_uop_abstractcontext_init(_Py_UOpsContext *ctx); +extern void _Py_uop_abstractcontext_fini(_Py_UOpsContext *ctx); + +extern _Py_UOpsAbstractFrame *_Py_uop_frame_new( + _Py_UOpsContext *ctx, + PyCodeObject *co, + int curr_stackentries, + _Py_UopsSymbol **args, + int arg_len); +extern int _Py_uop_frame_pop(_Py_UOpsContext *ctx); + +PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored); + +PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, PyObject **stack_pointer, _PyExecutorObject **exec_ptr); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_OPTIMIZER_H */ diff --git a/Include/internal/pycore_parking_lot.h b/Include/internal/pycore_parking_lot.h new file mode 100644 index 00000000..8c9260e2 --- /dev/null +++ b/Include/internal/pycore_parking_lot.h @@ -0,0 +1,97 @@ +// ParkingLot is an internal API for building efficient synchronization +// primitives like mutexes and events. +// +// The API and name is inspired by WebKit's WTF::ParkingLot, which in turn +// is inspired Linux's futex API. +// See https://webkit.org/blog/6161/locking-in-webkit/. +// +// The core functionality is an atomic "compare-and-sleep" operation along with +// an atomic "wake-up" operation. + +#ifndef Py_INTERNAL_PARKING_LOT_H +#define Py_INTERNAL_PARKING_LOT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +enum { + // The thread was unparked by another thread. + Py_PARK_OK = 0, + + // The value of `address` did not match `expected`. + Py_PARK_AGAIN = -1, + + // The thread was unparked due to a timeout. + Py_PARK_TIMEOUT = -2, + + // The thread was interrupted by a signal. + Py_PARK_INTR = -3, +}; + +// Checks that `*address == *expected` and puts the thread to sleep until an +// unpark operation is called on the same `address`. Otherwise, the function +// returns `Py_PARK_AGAIN`. The comparison behaves like memcmp, but is +// performed atomically with respect to unpark operations. +// +// The `address_size` argument is the size of the data pointed to by the +// `address` and `expected` pointers (i.e., sizeof(*address)). It must be +// 1, 2, 4, or 8. +// +// The `timeout_ns` argument specifies the maximum amount of time to wait, with +// -1 indicating an infinite wait. +// +// `park_arg`, which can be NULL, is passed to the unpark operation. +// +// If `detach` is true, then the thread will detach/release the GIL while +// waiting. +// +// Example usage: +// +// if (_Py_atomic_compare_exchange_uint8(address, &expected, new_value)) { +// int res = _PyParkingLot_Park(address, &new_value, sizeof(*address), +// timeout_ns, NULL, 1); +// ... +// } +PyAPI_FUNC(int) +_PyParkingLot_Park(const void *address, const void *expected, + size_t address_size, PyTime_t timeout_ns, + void *park_arg, int detach); + +// Callback for _PyParkingLot_Unpark: +// +// `arg` is the data of the same name provided to the _PyParkingLot_Unpark() +// call. +// `park_arg` is the data provided to _PyParkingLot_Park() call or NULL if +// no waiting thread was found. +// `has_more_waiters` is true if there are more threads waiting on the same +// address. May be true in cases where threads are waiting on a different +// address that map to the same internal bucket. +typedef void _Py_unpark_fn_t(void *arg, void *park_arg, int has_more_waiters); + +// Unparks a single thread waiting on `address`. +// +// Note that fn() is called regardless of whether a thread was unparked. If +// no threads are waiting on `address` then the `park_arg` argument to fn() +// will be NULL. +// +// Example usage: +// void callback(void *arg, void *park_arg, int has_more_waiters); +// _PyParkingLot_Unpark(address, &callback, arg); +PyAPI_FUNC(void) +_PyParkingLot_Unpark(const void *address, _Py_unpark_fn_t *fn, void *arg); + +// Unparks all threads waiting on `address`. +PyAPI_FUNC(void) _PyParkingLot_UnparkAll(const void *address); + +// Resets the parking lot state after a fork. Forgets all parked threads. +PyAPI_FUNC(void) _PyParkingLot_AfterFork(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PARKING_LOT_H */ diff --git a/Include/internal/pycore_parser.h b/Include/internal/pycore_parser.h index dd51b928..b16084aa 100644 --- a/Include/internal/pycore_parser.h +++ b/Include/internal/pycore_parser.h @@ -21,6 +21,9 @@ extern "C" { struct _parser_runtime_state { #ifdef Py_DEBUG long memo_statistics[_PYPEGEN_NSTATISTICS]; +#ifdef Py_GIL_DISABLED + PyMutex mutex; +#endif #else int _not_used; #endif @@ -28,8 +31,10 @@ struct _parser_runtime_state { }; _Py_DECLARE_STR(empty, "") +#if defined(Py_DEBUG) && defined(Py_GIL_DISABLED) #define _parser_runtime_state_INIT \ { \ + .mutex = {0}, \ .dummy_name = { \ .kind = Name_kind, \ .v.Name.id = &_Py_STR(empty), \ @@ -40,6 +45,20 @@ _Py_DECLARE_STR(empty, "") .end_col_offset = 0, \ }, \ } +#else +#define _parser_runtime_state_INIT \ + { \ + .dummy_name = { \ + .kind = Name_kind, \ + .v.Name.id = &_Py_STR(empty), \ + .v.Name.ctx = Load, \ + .lineno = 1, \ + .col_offset = 0, \ + .end_lineno = 1, \ + .end_col_offset = 0, \ + }, \ + } +#endif extern struct _mod* _PyParser_ASTFromString( const char *str, @@ -58,7 +77,17 @@ extern struct _mod* _PyParser_ASTFromFile( PyCompilerFlags *flags, int *errcode, PyArena *arena); - +extern struct _mod* _PyParser_InteractiveASTFromFile( + FILE *fp, + PyObject *filename_ob, + const char *enc, + int mode, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyObject **interactive_src, + PyArena *arena); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index b8deaa0c..a1ce1b19 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -8,7 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(void) _PyPathConfig_ClearGlobal(void); + extern PyStatus _PyPathConfig_ReadGlobal(PyConfig *config); extern PyStatus _PyPathConfig_UpdateGlobal(const PyConfig *config); extern const wchar_t * _PyPathConfig_GetGlobalModuleSearchPath(void); diff --git a/Include/internal/pycore_pyarena.h b/Include/internal/pycore_pyarena.h index d78972a8..1f07479f 100644 --- a/Include/internal/pycore_pyarena.h +++ b/Include/internal/pycore_pyarena.h @@ -1,5 +1,4 @@ -/* An arena-like memory interface for the compiler. - */ +// An arena-like memory interface for the compiler. #ifndef Py_INTERNAL_PYARENA_H #define Py_INTERNAL_PYARENA_H @@ -13,49 +12,54 @@ extern "C" { typedef struct _arena PyArena; -/* _PyArena_New() and _PyArena_Free() create a new arena and free it, - respectively. Once an arena has been created, it can be used - to allocate memory via _PyArena_Malloc(). Pointers to PyObject can - also be registered with the arena via _PyArena_AddPyObject(), and the - arena will ensure that the PyObjects stay alive at least until - _PyArena_Free() is called. When an arena is freed, all the memory it - allocated is freed, the arena releases internal references to registered - PyObject*, and none of its pointers are valid. - XXX (tim) What does "none of its pointers are valid" mean? Does it - XXX mean that pointers previously obtained via _PyArena_Malloc() are - XXX no longer valid? (That's clearly true, but not sure that's what - XXX the text is trying to say.) - - _PyArena_New() returns an arena pointer. On error, it - returns a negative number and sets an exception. - XXX (tim): Not true. On error, _PyArena_New() actually returns NULL, - XXX and looks like it may or may not set an exception (e.g., if the - XXX internal PyList_New(0) returns NULL, _PyArena_New() passes that on - XXX and an exception is set; OTOH, if the internal - XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but - XXX an exception is not set in that case). -*/ +// _PyArena_New() and _PyArena_Free() create a new arena and free it, +// respectively. Once an arena has been created, it can be used +// to allocate memory via _PyArena_Malloc(). Pointers to PyObject can +// also be registered with the arena via _PyArena_AddPyObject(), and the +// arena will ensure that the PyObjects stay alive at least until +// _PyArena_Free() is called. When an arena is freed, all the memory it +// allocated is freed, the arena releases internal references to registered +// PyObject*, and none of its pointers are valid. +// XXX (tim) What does "none of its pointers are valid" mean? Does it +// XXX mean that pointers previously obtained via _PyArena_Malloc() are +// XXX no longer valid? (That's clearly true, but not sure that's what +// XXX the text is trying to say.) +// +// _PyArena_New() returns an arena pointer. On error, it +// returns a negative number and sets an exception. +// XXX (tim): Not true. On error, _PyArena_New() actually returns NULL, +// XXX and looks like it may or may not set an exception (e.g., if the +// XXX internal PyList_New(0) returns NULL, _PyArena_New() passes that on +// XXX and an exception is set; OTOH, if the internal +// XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but +// XXX an exception is not set in that case). +// +// Export for test_peg_generator PyAPI_FUNC(PyArena*) _PyArena_New(void); + +// Export for test_peg_generator PyAPI_FUNC(void) _PyArena_Free(PyArena *); -/* Mostly like malloc(), return the address of a block of memory spanning - * `size` bytes, or return NULL (without setting an exception) if enough - * new memory can't be obtained. Unlike malloc(0), _PyArena_Malloc() with - * size=0 does not guarantee to return a unique pointer (the pointer - * returned may equal one or more other pointers obtained from - * _PyArena_Malloc()). - * Note that pointers obtained via _PyArena_Malloc() must never be passed to - * the system free() or realloc(), or to any of Python's similar memory- - * management functions. _PyArena_Malloc()-obtained pointers remain valid - * until _PyArena_Free(ar) is called, at which point all pointers obtained - * from the arena `ar` become invalid simultaneously. - */ +// Mostly like malloc(), return the address of a block of memory spanning +// `size` bytes, or return NULL (without setting an exception) if enough +// new memory can't be obtained. Unlike malloc(0), _PyArena_Malloc() with +// size=0 does not guarantee to return a unique pointer (the pointer +// returned may equal one or more other pointers obtained from +// _PyArena_Malloc()). +// Note that pointers obtained via _PyArena_Malloc() must never be passed to +// the system free() or realloc(), or to any of Python's similar memory- +// management functions. _PyArena_Malloc()-obtained pointers remain valid +// until _PyArena_Free(ar) is called, at which point all pointers obtained +// from the arena `ar` become invalid simultaneously. +// +// Export for test_peg_generator PyAPI_FUNC(void*) _PyArena_Malloc(PyArena *, size_t size); -/* This routine isn't a proper arena allocation routine. It takes - * a PyObject* and records it so that it can be DECREFed when the - * arena is freed. - */ +// This routine isn't a proper arena allocation routine. It takes +// a PyObject* and records it so that it can be DECREFed when the +// arena is freed. +// +// Export for test_peg_generator PyAPI_FUNC(int) _PyArena_AddPyObject(PyArena *, PyObject *); #ifdef __cplusplus diff --git a/Include/internal/pycore_pyatomic_ft_wrappers.h b/Include/internal/pycore_pyatomic_ft_wrappers.h new file mode 100644 index 00000000..a1bb383b --- /dev/null +++ b/Include/internal/pycore_pyatomic_ft_wrappers.h @@ -0,0 +1,94 @@ +// This header file provides wrappers around the atomic operations found in +// `pyatomic.h` that are only atomic in free-threaded builds. +// +// These are intended to be used in places where atomics are required in +// free-threaded builds, but not in the default build, and we don't want to +// introduce the potential performance overhead of an atomic operation in the +// default build. +// +// All usages of these macros should be replaced with unconditionally atomic or +// non-atomic versions, and this file should be removed, once the dust settles +// on free threading. +#ifndef Py_ATOMIC_FT_WRAPPERS_H +#define Py_ATOMIC_FT_WRAPPERS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +#error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef Py_GIL_DISABLED +#define FT_ATOMIC_LOAD_PTR(value) _Py_atomic_load_ptr(&value) +#define FT_ATOMIC_STORE_PTR(value, new_value) _Py_atomic_store_ptr(&value, new_value) +#define FT_ATOMIC_LOAD_SSIZE(value) _Py_atomic_load_ssize(&value) +#define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) \ + _Py_atomic_load_ssize_acquire(&value) +#define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) \ + _Py_atomic_load_ssize_relaxed(&value) +#define FT_ATOMIC_STORE_PTR(value, new_value) \ + _Py_atomic_store_ptr(&value, new_value) +#define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) \ + _Py_atomic_load_ptr_acquire(&value) +#define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) \ + _Py_atomic_load_uintptr_acquire(&value) +#define FT_ATOMIC_LOAD_PTR_RELAXED(value) \ + _Py_atomic_load_ptr_relaxed(&value) +#define FT_ATOMIC_LOAD_UINT8(value) \ + _Py_atomic_load_uint8(&value) +#define FT_ATOMIC_STORE_UINT8(value, new_value) \ + _Py_atomic_store_uint8(&value, new_value) +#define FT_ATOMIC_LOAD_UINT8_RELAXED(value) \ + _Py_atomic_load_uint8_relaxed(&value) +#define FT_ATOMIC_LOAD_UINT16_RELAXED(value) \ + _Py_atomic_load_uint16_relaxed(&value) +#define FT_ATOMIC_LOAD_UINT32_RELAXED(value) \ + _Py_atomic_load_uint32_relaxed(&value) +#define FT_ATOMIC_LOAD_ULONG_RELAXED(value) \ + _Py_atomic_load_ulong_relaxed(&value) +#define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) \ + _Py_atomic_store_ptr_relaxed(&value, new_value) +#define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) \ + _Py_atomic_store_ptr_release(&value, new_value) +#define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) \ + _Py_atomic_store_uintptr_release(&value, new_value) +#define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) \ + _Py_atomic_store_ssize_relaxed(&value, new_value) +#define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) \ + _Py_atomic_store_uint8_relaxed(&value, new_value) +#define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) \ + _Py_atomic_store_uint16_relaxed(&value, new_value) +#define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) \ + _Py_atomic_store_uint32_relaxed(&value, new_value) + +#else +#define FT_ATOMIC_LOAD_PTR(value) value +#define FT_ATOMIC_STORE_PTR(value, new_value) value = new_value +#define FT_ATOMIC_LOAD_SSIZE(value) value +#define FT_ATOMIC_LOAD_SSIZE_ACQUIRE(value) value +#define FT_ATOMIC_LOAD_SSIZE_RELAXED(value) value +#define FT_ATOMIC_STORE_PTR(value, new_value) value = new_value +#define FT_ATOMIC_LOAD_PTR_ACQUIRE(value) value +#define FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(value) value +#define FT_ATOMIC_LOAD_PTR_RELAXED(value) value +#define FT_ATOMIC_LOAD_UINT8(value) value +#define FT_ATOMIC_STORE_UINT8(value, new_value) value = new_value +#define FT_ATOMIC_LOAD_UINT8_RELAXED(value) value +#define FT_ATOMIC_LOAD_UINT16_RELAXED(value) value +#define FT_ATOMIC_LOAD_UINT32_RELAXED(value) value +#define FT_ATOMIC_LOAD_ULONG_RELAXED(value) value +#define FT_ATOMIC_STORE_PTR_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_STORE_PTR_RELEASE(value, new_value) value = new_value +#define FT_ATOMIC_STORE_UINTPTR_RELEASE(value, new_value) value = new_value +#define FT_ATOMIC_STORE_SSIZE_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_STORE_UINT8_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_STORE_UINT16_RELAXED(value, new_value) value = new_value +#define FT_ATOMIC_STORE_UINT32_RELAXED(value, new_value) value = new_value + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ATOMIC_FT_WRAPPERS_H */ diff --git a/Include/internal/pycore_pybuffer.h b/Include/internal/pycore_pybuffer.h new file mode 100644 index 00000000..9439d2bd --- /dev/null +++ b/Include/internal/pycore_pybuffer.h @@ -0,0 +1,21 @@ +#ifndef Py_INTERNAL_PYBUFFER_H +#define Py_INTERNAL_PYBUFFER_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +// Exported for the _interpchannels module. +PyAPI_FUNC(int) _PyBuffer_ReleaseInInterpreter( + PyInterpreterState *interp, Py_buffer *view); +PyAPI_FUNC(int) _PyBuffer_ReleaseInInterpreterAndRawFree( + PyInterpreterState *interp, Py_buffer *view); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PYBUFFER_H */ diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 4620a269..15071638 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -9,6 +9,59 @@ extern "C" { #endif +/* Error handling definitions */ + +extern _PyErr_StackItem* _PyErr_GetTopmostException(PyThreadState *tstate); +extern PyObject* _PyErr_GetHandledException(PyThreadState *); +extern void _PyErr_SetHandledException(PyThreadState *, PyObject *); +extern void _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); + +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); + + +// Like PyErr_Format(), but saves current exception as __context__ and +// __cause__. +// Export for '_sqlite3' shared extension. +PyAPI_FUNC(PyObject*) _PyErr_FormatFromCause( + PyObject *exception, + const char *format, /* ASCII-encoded string */ + ... + ); + +extern int _PyException_AddNote( + PyObject *exc, + PyObject *note); + +extern int _PyErr_CheckSignals(void); + +/* Support for adding program text to SyntaxErrors */ + +// Export for test_peg_generator +PyAPI_FUNC(PyObject*) _PyErr_ProgramDecodedTextObject( + PyObject *filename, + int lineno, + const char* encoding); + +extern PyObject* _PyUnicodeTranslateError_Create( + PyObject *object, + Py_ssize_t start, + Py_ssize_t end, + const char *reason /* UTF-8 encoded string */ + ); + +extern void _Py_NO_RETURN _Py_FatalErrorFormat( + const char *func, + const char *format, + ...); + +extern PyObject* _PyErr_SetImportErrorWithNameFrom( + PyObject *, + PyObject *, + PyObject *, + PyObject *); + + /* runtime lifecycle */ extern PyStatus _PyErr_InitTypes(PyInterpreterState *); @@ -31,86 +84,94 @@ static inline void _PyErr_ClearExcState(_PyErr_StackItem *exc_state) Py_CLEAR(exc_state->exc_value); } -PyAPI_FUNC(PyObject*) _PyErr_StackItemToExcInfoTuple( +extern PyObject* _PyErr_StackItemToExcInfoTuple( _PyErr_StackItem *err_info); -PyAPI_FUNC(void) _PyErr_Fetch( +extern void _PyErr_Fetch( PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **traceback); -extern PyObject * -_PyErr_GetRaisedException(PyThreadState *tstate); +extern PyObject* _PyErr_GetRaisedException(PyThreadState *tstate); PyAPI_FUNC(int) _PyErr_ExceptionMatches( PyThreadState *tstate, PyObject *exc); -void -_PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc); +extern void _PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc); -PyAPI_FUNC(void) _PyErr_Restore( +extern void _PyErr_Restore( PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *traceback); -PyAPI_FUNC(void) _PyErr_SetObject( +extern void _PyErr_SetObject( PyThreadState *tstate, PyObject *type, PyObject *value); -PyAPI_FUNC(void) _PyErr_ChainStackItem( - _PyErr_StackItem *exc_info); +extern void _PyErr_ChainStackItem(void); PyAPI_FUNC(void) _PyErr_Clear(PyThreadState *tstate); -PyAPI_FUNC(void) _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); +extern void _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); -PyAPI_FUNC(PyObject *) _PyErr_NoMemory(PyThreadState *tstate); +extern PyObject* _PyErr_NoMemory(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_SetString( PyThreadState *tstate, PyObject *exception, const char *string); -PyAPI_FUNC(PyObject *) _PyErr_Format( +PyAPI_FUNC(PyObject*) _PyErr_Format( PyThreadState *tstate, PyObject *exception, const char *format, ...); -PyAPI_FUNC(void) _PyErr_NormalizeException( +extern void _PyErr_NormalizeException( PyThreadState *tstate, PyObject **exc, PyObject **val, PyObject **tb); -PyAPI_FUNC(PyObject *) _PyErr_FormatFromCauseTstate( +extern PyObject* _PyErr_FormatFromCauseTstate( PyThreadState *tstate, PyObject *exception, const char *format, ...); -PyAPI_FUNC(PyObject *) _PyExc_CreateExceptionGroup( +extern PyObject* _PyExc_CreateExceptionGroup( const char *msg, PyObject *excs); -PyAPI_FUNC(PyObject *) _PyExc_PrepReraiseStar( +extern PyObject* _PyExc_PrepReraiseStar( PyObject *orig, PyObject *excs); -PyAPI_FUNC(int) _PyErr_CheckSignalsTstate(PyThreadState *tstate); - -PyAPI_FUNC(void) _Py_DumpExtensionModules(int fd, PyInterpreterState *interp); +extern int _PyErr_CheckSignalsTstate(PyThreadState *tstate); +extern void _Py_DumpExtensionModules(int fd, PyInterpreterState *interp); +extern PyObject* _Py_CalculateSuggestions(PyObject *dir, PyObject *name); extern PyObject* _Py_Offer_Suggestions(PyObject* exception); + +// Export for '_testinternalcapi' shared extension PyAPI_FUNC(Py_ssize_t) _Py_UTF8_Edit_Cost(PyObject *str_a, PyObject *str_b, Py_ssize_t max_cost); void _PyErr_FormatNote(const char *format, ...); +/* Context manipulation (PEP 3134) */ + +Py_DEPRECATED(3.12) extern void _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); + +// implementation detail for the codeop module. +// Exported for test.test_peg_generator.test_c_parser +PyAPI_DATA(PyTypeObject) _PyExc_IncompleteInputError; +#define PyExc_IncompleteInputError ((PyObject *)(&_PyExc_IncompleteInputError)) + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pyhash.h b/Include/internal/pycore_pyhash.h index 34dfa537..0ce08900 100644 --- a/Include/internal/pycore_pyhash.h +++ b/Include/internal/pycore_pyhash.h @@ -1,10 +1,78 @@ -#ifndef Py_INTERNAL_HASH_H -#define Py_INTERNAL_HASH_H +#ifndef Py_INTERNAL_PYHASH_H +#define Py_INTERNAL_PYHASH_H #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif +// Similar to Py_HashPointer(), but don't replace -1 with -2. +static inline Py_hash_t +_Py_HashPointerRaw(const void *ptr) +{ + uintptr_t x = (uintptr_t)ptr; + Py_BUILD_ASSERT(sizeof(x) == sizeof(ptr)); + + // Bottom 3 or 4 bits are likely to be 0; rotate x by 4 to the right + // to avoid excessive hash collisions for dicts and sets. + x = (x >> 4) | (x << (8 * sizeof(uintptr_t) - 4)); + + Py_BUILD_ASSERT(sizeof(x) == sizeof(Py_hash_t)); + return (Py_hash_t)x; +} + +// Export for '_datetime' shared extension +PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); + +/* Hash secret + * + * memory layout on 64 bit systems + * cccccccc cccccccc cccccccc uc -- unsigned char[24] + * pppppppp ssssssss ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t + * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeeeeeee pyexpat XML hash salt + * + * memory layout on 32 bit systems + * cccccccc cccccccc cccccccc uc + * ppppssss ........ ........ fnv -- two Py_hash_t + * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) + * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t + * ........ ........ eeee.... pyexpat XML hash salt + * + * (*) The siphash member may not be available on 32 bit platforms without + * an unsigned int64 data type. + */ +typedef union { + /* ensure 24 bytes */ + unsigned char uc[24]; + /* two Py_hash_t for FNV */ + struct { + Py_hash_t prefix; + Py_hash_t suffix; + } fnv; + /* two uint64 for SipHash24 */ + struct { + uint64_t k0; + uint64_t k1; + } siphash; + /* a different (!) Py_hash_t for small string optimization */ + struct { + unsigned char padding[16]; + Py_hash_t suffix; + } djbx33a; + struct { + unsigned char padding[16]; + Py_hash_t hashsalt; + } expat; +} _Py_HashSecret_t; + +// Export for '_elementtree' shared extension +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + +#ifdef Py_DEBUG +extern int _Py_HashSecret_Initialized; +#endif + struct pyhash_runtime_state { struct { @@ -34,7 +102,6 @@ struct pyhash_runtime_state { } -uint64_t _Py_KeyedHash(uint64_t, const char *, Py_ssize_t); - +extern uint64_t _Py_KeyedHash(uint64_t key, const void *src, Py_ssize_t src_sz); -#endif // Py_INTERNAL_HASH_H +#endif // !Py_INTERNAL_PYHASH_H diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 7cd998a7..f426ae0e 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -23,9 +23,7 @@ extern PyStatus _PyUnicode_InitEncodings(PyThreadState *tstate); extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void); #endif -PyAPI_FUNC(void) _Py_ClearStandardStreamEncoding(void); - -PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); +extern int _Py_IsLocaleCoercionTarget(const char *ctype_loc); /* Various one-time initializers */ @@ -42,10 +40,8 @@ extern void _PySys_FiniTypes(PyInterpreterState *interp); extern int _PyBuiltins_AddExceptions(PyObject * bltinmod); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); -extern PyStatus _PyTime_Init(void); extern PyStatus _PyGC_Init(PyInterpreterState *interp); extern PyStatus _PyAtExit_Init(PyInterpreterState *interp); -extern int _Py_Deepfreeze_Init(void); /* Various internal finalizers */ @@ -61,38 +57,79 @@ extern void _PyWarnings_Fini(PyInterpreterState *interp); extern void _PyAST_Fini(PyInterpreterState *interp); extern void _PyAtExit_Fini(PyInterpreterState *interp); extern void _PyThread_FiniType(PyInterpreterState *interp); -extern void _Py_Deepfreeze_Fini(void); extern void _PyArg_Fini(void); extern void _Py_FinalizeAllocatedBlocks(_PyRuntimeState *); extern PyStatus _PyGILState_Init(PyInterpreterState *interp); -extern PyStatus _PyGILState_SetTstate(PyThreadState *tstate); +extern void _PyGILState_SetTstate(PyThreadState *tstate); extern void _PyGILState_Fini(PyInterpreterState *interp); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp); +extern void _PyGC_DumpShutdownStats(PyInterpreterState *interp); -PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( +extern PyStatus _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, const struct _PyArgv *args); -PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig( +extern PyStatus _Py_PreInitializeFromConfig( const PyConfig *config, const struct _PyArgv *args); -PyAPI_FUNC(wchar_t *) _Py_GetStdlibDir(void); +extern wchar_t * _Py_GetStdlibDir(void); -PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); +extern int _Py_HandleSystemExit(int *exitcode_p); -PyAPI_FUNC(PyObject*) _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable); +extern PyObject* _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable); -PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); -PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, +extern void _PyErr_Print(PyThreadState *tstate); +extern void _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb); -PyAPI_FUNC(void) _PyErr_DisplayException(PyObject *file, PyObject *exc); +extern void _PyErr_DisplayException(PyObject *file, PyObject *exc); -PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); +extern void _PyThreadState_DeleteCurrent(PyThreadState *tstate); extern void _PyAtExit_Call(PyInterpreterState *interp); +extern int _Py_IsCoreInitialized(void); + +extern int _Py_FdIsInteractive(FILE *fp, PyObject *filename); + +extern const char* _Py_gitidentifier(void); +extern const char* _Py_gitversion(void); + +// Export for '_asyncio' shared extension +PyAPI_FUNC(int) _Py_IsInterpreterFinalizing(PyInterpreterState *interp); + +/* Random */ +extern int _PyOS_URandom(void *buffer, Py_ssize_t size); + +// Export for '_random' shared extension +PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size); + +/* Legacy locale support */ +extern int _Py_CoerceLegacyLocale(int warn); +extern int _Py_LegacyLocaleDetected(int warn); + +// Export for 'readline' shared extension +PyAPI_FUNC(char*) _Py_SetLocaleFromEnv(int category); + +// Export for special main.c string compiling with source tracebacks +int _PyRun_SimpleStringFlagsWithName(const char *command, const char* name, PyCompilerFlags *flags); + + +/* interpreter config */ + +// Export for _testinternalcapi shared extension +PyAPI_FUNC(int) _PyInterpreterConfig_InitFromState( + PyInterpreterConfig *, + PyInterpreterState *); +PyAPI_FUNC(PyObject *) _PyInterpreterConfig_AsDict(PyInterpreterConfig *); +PyAPI_FUNC(int) _PyInterpreterConfig_InitFromDict( + PyInterpreterConfig *, + PyObject *); +PyAPI_FUNC(int) _PyInterpreterConfig_UpdateFromDict( + PyInterpreterConfig *, + PyObject *); + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 81a707a0..dd6b0762 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -1,5 +1,9 @@ #ifndef Py_INTERNAL_PYMEM_H #define Py_INTERNAL_PYMEM_H + +#include "pycore_llist.h" // struct llist_node +#include "pycore_lock.h" // PyMutex + #ifdef __cplusplus extern "C" { #endif @@ -8,8 +12,20 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pymem.h" // PyMemAllocatorName +// Try to get the allocators name set by _PyMem_SetupAllocators(). +// Return NULL if unknown. +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); + +// strdup() using PyMem_RawMalloc() +extern char* _PyMem_RawStrdup(const char *str); +// strdup() using PyMem_Malloc(). +// Export for '_pickle ' shared extension. +PyAPI_FUNC(char*) _PyMem_Strdup(const char *str); + +// wcsdup() using PyMem_RawMalloc() +extern wchar_t* _PyMem_RawWcsdup(const wchar_t *str); typedef struct { /* We tag each block with an API ID in order to tag API violations */ @@ -18,7 +34,7 @@ typedef struct { } debug_alloc_api_t; struct _pymem_allocators { - PyThread_type_lock mutex; + PyMutex mutex; struct { PyMemAllocatorEx raw; PyMemAllocatorEx mem; @@ -29,14 +45,20 @@ struct _pymem_allocators { debug_alloc_api_t mem; debug_alloc_api_t obj; } debug; + int is_debug_enabled; PyObjectArenaAllocator obj_arena; }; +struct _Py_mem_interp_free_queue { + int has_work; // true if the queue is not empty + PyMutex mutex; // protects the queue + struct llist_node head; // queue of _mem_work_chunk items +}; /* Set the memory allocator of the specified domain to the default. Save the old allocator into *old_alloc if it's non-NULL. Return on success, or return -1 if the domain is unknown. */ -PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( +extern int _PyMem_SetDefaultAllocator( PyMemAllocatorDomain domain, PyMemAllocatorEx *old_alloc); @@ -49,7 +71,7 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( - PYMEM_FORBIDDENBYTE: untouchable bytes at each end of a block Byte patterns 0xCB, 0xDB and 0xFB have been replaced with 0xCD, 0xDD and - 0xFD to use the same values than Windows CRT debug malloc() and free(). + 0xFD to use the same values as Windows CRT debug malloc() and free(). If modified, _PyMem_IsPtrFreed() should be updated as well. */ #define PYMEM_CLEANBYTE 0xCD #define PYMEM_DEADBYTE 0xDD @@ -82,17 +104,35 @@ static inline int _PyMem_IsPtrFreed(const void *ptr) #endif } -PyAPI_FUNC(int) _PyMem_GetAllocatorName( +extern int _PyMem_GetAllocatorName( const char *name, PyMemAllocatorName *allocator); /* Configure the Python memory allocators. Pass PYMEM_ALLOCATOR_DEFAULT to use default allocators. PYMEM_ALLOCATOR_NOT_SET does nothing. */ -PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); +extern int _PyMem_SetupAllocators(PyMemAllocatorName allocator); + +/* Is the debug allocator enabled? */ +extern int _PyMem_DebugEnabled(void); + +// Enqueue a pointer to be freed possibly after some delay. +extern void _PyMem_FreeDelayed(void *ptr); + +// Enqueue an object to be freed possibly after some delay +extern void _PyObject_FreeDelayed(void *ptr); + +// Periodically process delayed free requests. +extern void _PyMem_ProcessDelayed(PyThreadState *tstate); + +// Abandon all thread-local delayed free requests and push them to the +// interpreter's queue. +extern void _PyMem_AbandonDelayed(PyThreadState *tstate); +// On interpreter shutdown, frees all delayed free requests. +extern void _PyMem_FiniDelayed(PyInterpreterState *interp); #ifdef __cplusplus } #endif -#endif /* !Py_INTERNAL_PYMEM_H */ +#endif // !Py_INTERNAL_PYMEM_H diff --git a/Include/internal/pycore_pymem_init.h b/Include/internal/pycore_pymem_init.h index 78232738..c593edc8 100644 --- a/Include/internal/pycore_pymem_init.h +++ b/Include/internal/pycore_pymem_init.h @@ -8,8 +8,6 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pymem.h" - /********************************/ /* the allocators' initializers */ @@ -20,17 +18,30 @@ extern void * _PyMem_RawRealloc(void *, void *, size_t); extern void _PyMem_RawFree(void *, void *); #define PYRAW_ALLOC {NULL, _PyMem_RawMalloc, _PyMem_RawCalloc, _PyMem_RawRealloc, _PyMem_RawFree} -#ifdef WITH_PYMALLOC +#ifdef Py_GIL_DISABLED +// Py_GIL_DISABLED requires mimalloc +extern void* _PyObject_MiMalloc(void *, size_t); +extern void* _PyObject_MiCalloc(void *, size_t, size_t); +extern void _PyObject_MiFree(void *, void *); +extern void* _PyObject_MiRealloc(void *, void *, size_t); +# define PYOBJ_ALLOC {NULL, _PyObject_MiMalloc, _PyObject_MiCalloc, _PyObject_MiRealloc, _PyObject_MiFree} +extern void* _PyMem_MiMalloc(void *, size_t); +extern void* _PyMem_MiCalloc(void *, size_t, size_t); +extern void _PyMem_MiFree(void *, void *); +extern void* _PyMem_MiRealloc(void *, void *, size_t); +# define PYMEM_ALLOC {NULL, _PyMem_MiMalloc, _PyMem_MiCalloc, _PyMem_MiRealloc, _PyMem_MiFree} +#elif defined(WITH_PYMALLOC) extern void* _PyObject_Malloc(void *, size_t); extern void* _PyObject_Calloc(void *, size_t, size_t); extern void _PyObject_Free(void *, void *); extern void* _PyObject_Realloc(void *, void *, size_t); # define PYOBJ_ALLOC {NULL, _PyObject_Malloc, _PyObject_Calloc, _PyObject_Realloc, _PyObject_Free} +# define PYMEM_ALLOC PYOBJ_ALLOC #else # define PYOBJ_ALLOC PYRAW_ALLOC +# define PYMEM_ALLOC PYOBJ_ALLOC #endif // WITH_PYMALLOC -#define PYMEM_ALLOC PYOBJ_ALLOC extern void* _PyMem_DebugRawMalloc(void *, size_t); extern void* _PyMem_DebugRawCalloc(void *, size_t, size_t); @@ -59,6 +70,7 @@ extern void _PyMem_ArenaFree(void *, void *, size_t); PYDBGMEM_ALLOC(runtime), \ PYDBGOBJ_ALLOC(runtime), \ } +# define _pymem_is_debug_enabled_INIT 1 #else # define _pymem_allocators_standard_INIT(runtime) \ { \ @@ -66,6 +78,7 @@ extern void _PyMem_ArenaFree(void *, void *, size_t); PYMEM_ALLOC, \ PYOBJ_ALLOC, \ } +# define _pymem_is_debug_enabled_INIT 0 #endif #define _pymem_allocators_debug_INIT \ @@ -79,6 +92,11 @@ extern void _PyMem_ArenaFree(void *, void *, size_t); { NULL, _PyMem_ArenaAlloc, _PyMem_ArenaFree } +#define _Py_mem_free_queue_INIT(queue) \ + { \ + .head = LLIST_INIT(queue.head), \ + } + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index ccfc2586..b0e72523 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,7 +8,40 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_runtime.h" /* PyRuntimeState */ +#include "pycore_freelist.h" // _PyFreeListState +#include "pycore_runtime.h" // _PyRuntime +#include "pycore_tstate.h" // _PyThreadStateImpl + + +// Values for PyThreadState.state. A thread must be in the "attached" state +// before calling most Python APIs. If the GIL is enabled, then "attached" +// implies that the thread holds the GIL and "detached" implies that the +// thread does not hold the GIL (or is in the process of releasing it). In +// `--disable-gil` builds, multiple threads may be "attached" to the same +// interpreter at the same time. Only the "bound" thread may perform the +// transitions between "attached" and "detached" on its own PyThreadState. +// +// The "suspended" state is used to implement stop-the-world pauses, such as +// for cyclic garbage collection. It is only used in `--disable-gil` builds. +// The "suspended" state is similar to the "detached" state in that in both +// states the thread is not allowed to call most Python APIs. However, unlike +// the "detached" state, a thread may not transition itself out from the +// "suspended" state. Only the thread performing a stop-the-world pause may +// transition a thread from the "suspended" state back to the "detached" state. +// +// State transition diagram: +// +// (bound thread) (stop-the-world thread) +// [attached] <-> [detached] <-> [suspended] +// | ^ +// +---------------------------->---------------------------+ +// (bound thread) +// +// The (bound thread) and (stop-the-world thread) labels indicate which thread +// is allowed to perform the transition. +#define _Py_THREAD_DETACHED 0 +#define _Py_THREAD_ATTACHED 1 +#define _Py_THREAD_SUSPENDED 2 /* Check if the current thread is the main thread. @@ -36,10 +69,26 @@ _Py_IsMainInterpreter(PyInterpreterState *interp) static inline int _Py_IsMainInterpreterFinalizing(PyInterpreterState *interp) { - return (_PyRuntimeState_GetFinalizing(interp->runtime) != NULL && - interp == &interp->runtime->_main_interpreter); + /* bpo-39877: Access _PyRuntime directly rather than using + tstate->interp->runtime to support calls from Python daemon threads. + After Py_Finalize() has been called, tstate can be a dangling pointer: + point to PyThreadState freed memory. */ + return (_PyRuntimeState_GetFinalizing(&_PyRuntime) != NULL && + interp == &_PyRuntime._main_interpreter); } +// Export for _interpreters module. +PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); + +// Export for _interpreters module. +PyAPI_FUNC(int) _PyInterpreterState_SetRunningMain(PyInterpreterState *); +PyAPI_FUNC(void) _PyInterpreterState_SetNotRunningMain(PyInterpreterState *); +PyAPI_FUNC(int) _PyInterpreterState_IsRunningMain(PyInterpreterState *); +PyAPI_FUNC(int) _PyInterpreterState_FailIfRunningMain(PyInterpreterState *); + +extern int _PyThreadState_IsRunningMain(PyThreadState *); +extern void _PyInterpreterState_ReinitRunningMain(PyThreadState *); + static inline const PyConfig * _Py_GetMainConfig(void) @@ -66,7 +115,16 @@ _Py_ThreadCanHandleSignals(PyInterpreterState *interp) #if defined(HAVE_THREAD_LOCAL) && !defined(Py_BUILD_CORE_MODULE) extern _Py_thread_local PyThreadState *_Py_tss_tstate; #endif -PyAPI_DATA(PyThreadState *) _PyThreadState_GetCurrent(void); + +#ifndef NDEBUG +extern int _PyThreadState_CheckConsistency(PyThreadState *tstate); +#endif + +int _PyThreadState_MustExit(PyThreadState *tstate); + +// Export for most shared extensions, used via _PyThreadState_GET() static +// inline function. +PyAPI_FUNC(PyThreadState *) _PyThreadState_GetCurrent(void); /* Get the current Python thread state. @@ -74,7 +132,7 @@ PyAPI_DATA(PyThreadState *) _PyThreadState_GetCurrent(void); The caller must hold the GIL. - See also PyThreadState_Get() and _PyThreadState_UncheckedGet(). */ + See also PyThreadState_Get() and PyThreadState_GetUnchecked(). */ static inline PyThreadState* _PyThreadState_GET(void) { @@ -85,6 +143,44 @@ _PyThreadState_GET(void) #endif } +// Attaches the current thread to the interpreter. +// +// This may block while acquiring the GIL (if the GIL is enabled) or while +// waiting for a stop-the-world pause (if the GIL is disabled). +// +// High-level code should generally call PyEval_RestoreThread() instead, which +// calls this function. +extern void _PyThreadState_Attach(PyThreadState *tstate); + +// Detaches the current thread from the interpreter. +// +// High-level code should generally call PyEval_SaveThread() instead, which +// calls this function. +extern void _PyThreadState_Detach(PyThreadState *tstate); + +// Detaches the current thread to the "suspended" state if a stop-the-world +// pause is in progress. +// +// If there is no stop-the-world pause in progress, then the thread switches +// to the "detached" state. +extern void _PyThreadState_Suspend(PyThreadState *tstate); + +// Perform a stop-the-world pause for all threads in the all interpreters. +// +// Threads in the "attached" state are paused and transitioned to the "GC" +// state. Threads in the "detached" state switch to the "GC" state, preventing +// them from reattaching until the stop-the-world pause is complete. +// +// NOTE: This is a no-op outside of Py_GIL_DISABLED builds. +extern void _PyEval_StopTheWorldAll(_PyRuntimeState *runtime); +extern void _PyEval_StartTheWorldAll(_PyRuntimeState *runtime); + +// Perform a stop-the-world pause for threads in the specified interpreter. +// +// NOTE: This is a no-op outside of Py_GIL_DISABLED builds. +extern void _PyEval_StopTheWorld(PyInterpreterState *interp); +extern void _PyEval_StartTheWorld(PyInterpreterState *interp); + static inline void _Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) @@ -108,7 +204,7 @@ _Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) The caller must hold the GIL. - See also _PyInterpreterState_Get() + See also PyInterpreterState_Get() and _PyGILState_GetInterpreterStateUnsafe(). */ static inline PyInterpreterState* _PyInterpreterState_GET(void) { PyThreadState *tstate = _PyThreadState_GET(); @@ -121,41 +217,81 @@ static inline PyInterpreterState* _PyInterpreterState_GET(void) { // PyThreadState functions -PyAPI_FUNC(PyThreadState *) _PyThreadState_New(PyInterpreterState *interp); -PyAPI_FUNC(void) _PyThreadState_Bind(PyThreadState *tstate); -// We keep this around exclusively for stable ABI compatibility. -PyAPI_FUNC(void) _PyThreadState_Init( - PyThreadState *tstate); -PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate); +// Export for _testinternalcapi +PyAPI_FUNC(PyThreadState *) _PyThreadState_New( + PyInterpreterState *interp, + int whence); +extern void _PyThreadState_Bind(PyThreadState *tstate); +PyAPI_FUNC(PyThreadState *) _PyThreadState_NewBound( + PyInterpreterState *interp, + int whence); +extern PyThreadState * _PyThreadState_RemoveExcept(PyThreadState *tstate); +extern void _PyThreadState_DeleteList(PyThreadState *list); +extern void _PyThreadState_ClearMimallocHeaps(PyThreadState *tstate); + +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(PyObject*) _PyThreadState_GetDict(PyThreadState *tstate); + +/* The implementation of sys._current_exceptions() Returns a dict mapping + thread id to that thread's current exception. +*/ +extern PyObject* _PyThread_CurrentExceptions(void); /* Other */ -PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( +extern PyThreadState * _PyThreadState_Swap( _PyRuntimeState *runtime, PyThreadState *newts); -PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime); +extern PyStatus _PyInterpreterState_Enable(_PyRuntimeState *runtime); #ifdef HAVE_FORK extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); extern void _PySignal_AfterFork(void); #endif - +// Export for the stable ABI PyAPI_FUNC(int) _PyState_AddModule( PyThreadState *tstate, PyObject* module, PyModuleDef* def); -PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate); +extern int _PyOS_InterruptOccurred(PyThreadState *tstate); #define HEAD_LOCK(runtime) \ - PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK) + PyMutex_LockFlags(&(runtime)->interpreters.mutex, _Py_LOCK_DONT_DETACH) #define HEAD_UNLOCK(runtime) \ - PyThread_release_lock((runtime)->interpreters.mutex) + PyMutex_Unlock(&(runtime)->interpreters.mutex) + +// Get the configuration of the current interpreter. +// The caller must hold the GIL. +// Export for test_peg_generator. +PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); + +// Get the single PyInterpreterState used by this process' GILState +// implementation. +// +// This function doesn't check for error. Return NULL before _PyGILState_Init() +// is called and after _PyGILState_Fini() is called. +// +// See also PyInterpreterState_Get() and _PyInterpreterState_GET(). +extern PyInterpreterState* _PyGILState_GetInterpreterStateUnsafe(void); + +static inline struct _Py_object_freelists* _Py_object_freelists_GET(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); +#ifdef Py_DEBUG + _Py_EnsureTstateNotNULL(tstate); +#endif +#ifdef Py_GIL_DISABLED + return &((_PyThreadStateImpl*)tstate)->freelists; +#else + return &tstate->interp->object_state.freelists; +#endif +} #ifdef __cplusplus } diff --git a/Include/internal/pycore_pystats.h b/Include/internal/pycore_pystats.h new file mode 100644 index 00000000..f8af398a --- /dev/null +++ b/Include/internal/pycore_pystats.h @@ -0,0 +1,21 @@ +#ifndef Py_INTERNAL_PYSTATS_H +#define Py_INTERNAL_PYSTATS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef Py_STATS +extern void _Py_StatsOn(void); +extern void _Py_StatsOff(void); +extern void _Py_StatsClear(void); +extern int _Py_PrintSpecializationStats(int to_file); +#endif + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_PYSTATS_H diff --git a/Include/internal/pycore_pythonrun.h b/Include/internal/pycore_pythonrun.h new file mode 100644 index 00000000..0bfc5704 --- /dev/null +++ b/Include/internal/pycore_pythonrun.h @@ -0,0 +1,39 @@ +#ifndef Py_INTERNAL_PYTHONRUN_H +#define Py_INTERNAL_PYTHONRUN_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +extern int _PyRun_SimpleFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); + +extern int _PyRun_AnyFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); + +extern int _PyRun_InteractiveLoopObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); + +extern const char* _Py_SourceAsString( + PyObject *cmd, + const char *funcname, + const char *what, + PyCompilerFlags *cf, + PyObject **cmd_copy); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_PYTHONRUN_H + diff --git a/Include/internal/pycore_pythread.h b/Include/internal/pycore_pythread.h index f5392149..3610c625 100644 --- a/Include/internal/pycore_pythread.h +++ b/Include/internal/pycore_pythread.h @@ -8,42 +8,47 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "dynamic_annotations.h" // _Py_ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX +#include "pycore_llist.h" // struct llist_node + +// Get _POSIX_THREADS and _POSIX_SEMAPHORES macros if available +#if (defined(HAVE_UNISTD_H) && !defined(_POSIX_THREADS) \ + && !defined(_POSIX_SEMAPHORES)) +# include // _POSIX_THREADS, _POSIX_SEMAPHORES +#endif +#if (defined(HAVE_PTHREAD_H) && !defined(_POSIX_THREADS) \ + && !defined(_POSIX_SEMAPHORES)) + // This means pthreads are not implemented in libc headers, hence the macro + // not present in . But they still can be implemented as an + // external library (e.g. gnu pth in pthread emulation) +# include // _POSIX_THREADS, _POSIX_SEMAPHORES +#endif +#if !defined(_POSIX_THREADS) && defined(__hpux) && defined(_SC_THREADS) + // Check if we're running on HP-UX and _SC_THREADS is defined. If so, then + // enough of the POSIX threads package is implemented to support Python + // threads. + // + // This is valid for HP-UX 11.23 running on an ia64 system. If needed, add + // a check of __ia64 to verify that we're running on an ia64 system instead + // of a pa-risc system. +# define _POSIX_THREADS +#endif -#ifndef _POSIX_THREADS -/* This means pthreads are not implemented in libc headers, hence the macro - not present in unistd.h. But they still can be implemented as an external - library (e.g. gnu pth in pthread emulation) */ -# ifdef HAVE_PTHREAD_H -# include /* _POSIX_THREADS */ -# endif -# ifndef _POSIX_THREADS -/* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then - enough of the Posix threads package is implemented to support python - threads. - - This is valid for HP-UX 11.23 running on an ia64 system. If needed, add - a check of __ia64 to verify that we're running on an ia64 system instead - of a pa-risc system. -*/ -# ifdef __hpux -# ifdef _SC_THREADS -# define _POSIX_THREADS -# endif -# endif -# endif /* _POSIX_THREADS */ -#endif /* _POSIX_THREADS */ #if defined(_POSIX_THREADS) || defined(HAVE_PTHREAD_STUBS) -# define _USE_PTHREADS +# define _USE_PTHREADS #endif #if defined(_USE_PTHREADS) && defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) // monotonic is supported statically. It doesn't mean it works on runtime. -# define CONDATTR_MONOTONIC +# define CONDATTR_MONOTONIC #endif #if defined(HAVE_PTHREAD_STUBS) +#include "cpython/pthread_stubs.h" // PTHREAD_KEYS_MAX +#include // bool + // pthread_key struct py_stub_tls_entry { bool in_use; @@ -72,8 +77,81 @@ struct _pythread_runtime_state { struct py_stub_tls_entry tls_entries[PTHREAD_KEYS_MAX]; } stubs; #endif + + // Linked list of ThreadHandles + struct llist_node handles; }; +#define _pythread_RUNTIME_INIT(pythread) \ + { \ + .handles = LLIST_INIT(pythread.handles), \ + } + +#ifdef HAVE_FORK +/* Private function to reinitialize a lock at fork in the child process. + Reset the lock to the unlocked state. + Return 0 on success, return -1 on error. */ +extern int _PyThread_at_fork_reinit(PyThread_type_lock *lock); +extern void _PyThread_AfterFork(struct _pythread_runtime_state *state); +#endif /* HAVE_FORK */ + + +// unset: -1 seconds, in nanoseconds +#define PyThread_UNSET_TIMEOUT ((PyTime_t)(-1 * 1000 * 1000 * 1000)) + +// Exported for the _interpchannels module. +PyAPI_FUNC(int) PyThread_ParseTimeoutArg( + PyObject *arg, + int blocking, + PY_TIMEOUT_T *timeout); + +/* Helper to acquire an interruptible lock with a timeout. If the lock acquire + * is interrupted, signal handlers are run, and if they raise an exception, + * PY_LOCK_INTR is returned. Otherwise, PY_LOCK_ACQUIRED or PY_LOCK_FAILURE + * are returned, depending on whether the lock can be acquired within the + * timeout. + */ +// Exported for the _interpchannels module. +PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed_with_retries( + PyThread_type_lock, + PY_TIMEOUT_T microseconds); + +typedef unsigned long long PyThread_ident_t; +typedef Py_uintptr_t PyThread_handle_t; + +#define PY_FORMAT_THREAD_IDENT_T "llu" +#define Py_PARSE_THREAD_IDENT_T "K" + +PyAPI_FUNC(PyThread_ident_t) PyThread_get_thread_ident_ex(void); + +/* Thread joining APIs. + * + * These APIs have a strict contract: + * - Either PyThread_join_thread or PyThread_detach_thread must be called + * exactly once with the given handle. + * - Calling neither PyThread_join_thread nor PyThread_detach_thread results + * in a resource leak until the end of the process. + * - Any other usage, such as calling both PyThread_join_thread and + * PyThread_detach_thread, or calling them more than once (including + * simultaneously), results in undefined behavior. + */ +PyAPI_FUNC(int) PyThread_start_joinable_thread(void (*func)(void *), + void *arg, + PyThread_ident_t* ident, + PyThread_handle_t* handle); +/* + * Join a thread started with `PyThread_start_joinable_thread`. + * This function cannot be interrupted. It returns 0 on success, + * a non-zero value on failure. + */ +PyAPI_FUNC(int) PyThread_join_thread(PyThread_handle_t); +/* + * Detach a thread started with `PyThread_start_joinable_thread`, such + * that its resources are relased as soon as it exits. + * This function cannot be interrupted. It returns 0 on success, + * a non-zero value on failure. + */ +PyAPI_FUNC(int) PyThread_detach_thread(PyThread_handle_t); #ifdef __cplusplus } diff --git a/Include/internal/pycore_qsbr.h b/Include/internal/pycore_qsbr.h new file mode 100644 index 00000000..20e643e1 --- /dev/null +++ b/Include/internal/pycore_qsbr.h @@ -0,0 +1,154 @@ +// The QSBR APIs (quiescent state-based reclamation) provide a mechanism for +// the free-threaded build to safely reclaim memory when there may be +// concurrent accesses. +// +// Many operations in the free-threaded build are protected by locks. However, +// in some cases, we want to allow reads to happen concurrently with updates. +// In this case, we need to delay freeing ("reclaiming") any memory that may be +// concurrently accessed by a reader. The QSBR APIs provide a way to do this. +#ifndef Py_INTERNAL_QSBR_H +#define Py_INTERNAL_QSBR_H + +#include +#include +#include "pycore_lock.h" // PyMutex + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// The shared write sequence is always odd and incremented by two. Detached +// threads are indicated by a read sequence of zero. This avoids collisions +// between the offline state and any valid sequence number even if the +// sequences numbers wrap around. +#define QSBR_OFFLINE 0 +#define QSBR_INITIAL 1 +#define QSBR_INCR 2 + +// Wrap-around safe comparison. This is a holdover from the FreeBSD +// implementation, which uses 32-bit sequence numbers. We currently use 64-bit +// sequence numbers, so wrap-around is unlikely. +#define QSBR_LT(a, b) ((int64_t)((a)-(b)) < 0) +#define QSBR_LEQ(a, b) ((int64_t)((a)-(b)) <= 0) + +struct _qsbr_shared; +struct _PyThreadStateImpl; // forward declare to avoid circular dependency + +// Per-thread state +struct _qsbr_thread_state { + // Last observed write sequence (or 0 if detached) + uint64_t seq; + + // Shared (per-interpreter) QSBR state + struct _qsbr_shared *shared; + + // Thread state (or NULL) + PyThreadState *tstate; + + // Used to defer advancing write sequence a fixed number of times + int deferrals; + + // Is this thread state allocated? + bool allocated; + struct _qsbr_thread_state *freelist_next; +}; + +// Padding to avoid false sharing +struct _qsbr_pad { + struct _qsbr_thread_state qsbr; + char __padding[64 - sizeof(struct _qsbr_thread_state)]; +}; + +// Per-interpreter state +struct _qsbr_shared { + // Write sequence: always odd, incremented by two + uint64_t wr_seq; + + // Minimum observed read sequence of all QSBR thread states + uint64_t rd_seq; + + // Array of QSBR thread states. + struct _qsbr_pad *array; + Py_ssize_t size; + + // Freelist of unused _qsbr_thread_states (protected by mutex) + PyMutex mutex; + struct _qsbr_thread_state *freelist; +}; + +static inline uint64_t +_Py_qsbr_shared_current(struct _qsbr_shared *shared) +{ + return _Py_atomic_load_uint64_acquire(&shared->wr_seq); +} + +// Reports a quiescent state: the caller no longer holds any pointer to shared +// data not protected by locks or reference counts. +static inline void +_Py_qsbr_quiescent_state(struct _qsbr_thread_state *qsbr) +{ + uint64_t seq = _Py_qsbr_shared_current(qsbr->shared); + _Py_atomic_store_uint64_release(&qsbr->seq, seq); +} + +// Have the read sequences advanced to the given goal? Like `_Py_qsbr_poll()`, +// but does not perform a scan of threads. +static inline bool +_Py_qbsr_goal_reached(struct _qsbr_thread_state *qsbr, uint64_t goal) +{ + uint64_t rd_seq = _Py_atomic_load_uint64(&qsbr->shared->rd_seq); + return QSBR_LEQ(goal, rd_seq); +} + +// Advance the write sequence and return the new goal. This should be called +// after data is removed. The returned goal is used with `_Py_qsbr_poll()` to +// determine when it is safe to reclaim (free) the memory. +extern uint64_t +_Py_qsbr_advance(struct _qsbr_shared *shared); + +// Batches requests to advance the write sequence. This advances the write +// sequence every N calls, which reduces overhead but increases time to +// reclamation. Returns the new goal. +extern uint64_t +_Py_qsbr_deferred_advance(struct _qsbr_thread_state *qsbr); + +// Have the read sequences advanced to the given goal? If this returns true, +// it safe to reclaim any memory tagged with the goal (or earlier goal). +extern bool +_Py_qsbr_poll(struct _qsbr_thread_state *qsbr, uint64_t goal); + +// Called when thread attaches to interpreter +extern void +_Py_qsbr_attach(struct _qsbr_thread_state *qsbr); + +// Called when thread detaches from interpreter +extern void +_Py_qsbr_detach(struct _qsbr_thread_state *qsbr); + +// Reserves (allocates) a QSBR state and returns its index. +extern Py_ssize_t +_Py_qsbr_reserve(PyInterpreterState *interp); + +// Associates a PyThreadState with the QSBR state at the given index +extern void +_Py_qsbr_register(struct _PyThreadStateImpl *tstate, + PyInterpreterState *interp, Py_ssize_t index); + +// Disassociates a PyThreadState from the QSBR state and frees the QSBR state. +extern void +_Py_qsbr_unregister(PyThreadState *tstate); + +extern void +_Py_qsbr_fini(PyInterpreterState *interp); + +extern void +_Py_qsbr_after_fork(struct _PyThreadStateImpl *tstate); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_QSBR_H */ diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 5ed97e97..d4291b87 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -8,27 +8,24 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atexit.h" // struct atexit_runtime_state -#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_atexit.h" // struct _atexit_runtime_state #include "pycore_ceval_state.h" // struct _ceval_runtime_state -#include "pycore_floatobject.h" // struct _Py_float_runtime_state +#include "pycore_crossinterp.h" // struct _xidregistry #include "pycore_faulthandler.h" // struct _faulthandler_runtime_state -#include "pycore_global_objects.h" // struct _Py_global_objects +#include "pycore_floatobject.h" // struct _Py_float_runtime_state #include "pycore_import.h" // struct _import_runtime_state #include "pycore_interp.h" // PyInterpreterState #include "pycore_object_state.h" // struct _py_object_runtime_state #include "pycore_parser.h" // struct _parser_runtime_state -#include "pycore_pymem.h" // struct _pymem_allocators #include "pycore_pyhash.h" // struct pyhash_runtime_state +#include "pycore_pymem.h" // struct _pymem_allocators #include "pycore_pythread.h" // struct _pythread_runtime_state #include "pycore_signal.h" // struct _signals_runtime_state -#include "pycore_time.h" // struct _time_runtime_state #include "pycore_tracemalloc.h" // struct _tracemalloc_runtime_state -#include "pycore_typeobject.h" // struct types_runtime_state -#include "pycore_unicodeobject.h" // struct _Py_unicode_runtime_ids +#include "pycore_typeobject.h" // struct _types_runtime_state +#include "pycore_unicodeobject.h" // struct _Py_unicode_runtime_state struct _getargs_runtime_state { - PyThread_type_lock mutex; struct _PyArg_Parser *static_parsers; }; @@ -47,18 +44,182 @@ struct _gilstate_runtime_state { /* Runtime audit hook state */ +#define _Py_Debug_Cookie "xdebugpy" + +#ifdef Py_GIL_DISABLED +# define _Py_Debug_gilruntimestate_enabled offsetof(struct _gil_runtime_state, enabled) +# define _Py_Debug_Free_Threaded 1 +#else +# define _Py_Debug_gilruntimestate_enabled 0 +# define _Py_Debug_Free_Threaded 0 +#endif typedef struct _Py_AuditHookEntry { struct _Py_AuditHookEntry *next; Py_AuditHookFunction hookCFunction; void *userData; } _Py_AuditHookEntry; +typedef struct _Py_DebugOffsets { + char cookie[8]; + uint64_t version; + uint64_t free_threaded; + // Runtime state offset; + struct _runtime_state { + uint64_t size; + uint64_t finalizing; + uint64_t interpreters_head; + } runtime_state; + + // Interpreter state offset; + struct _interpreter_state { + uint64_t size; + uint64_t id; + uint64_t next; + uint64_t threads_head; + uint64_t gc; + uint64_t imports_modules; + uint64_t sysdict; + uint64_t builtins; + uint64_t ceval_gil; + uint64_t gil_runtime_state; + uint64_t gil_runtime_state_enabled; + uint64_t gil_runtime_state_locked; + uint64_t gil_runtime_state_holder; + } interpreter_state; + + // Thread state offset; + struct _thread_state{ + uint64_t size; + uint64_t prev; + uint64_t next; + uint64_t interp; + uint64_t current_frame; + uint64_t thread_id; + uint64_t native_thread_id; + uint64_t datastack_chunk; + uint64_t status; + } thread_state; + + // InterpreterFrame offset; + struct _interpreter_frame { + uint64_t size; + uint64_t previous; + uint64_t executable; + uint64_t instr_ptr; + uint64_t localsplus; + uint64_t owner; + } interpreter_frame; + + // Code object offset; + struct _code_object { + uint64_t size; + uint64_t filename; + uint64_t name; + uint64_t qualname; + uint64_t linetable; + uint64_t firstlineno; + uint64_t argcount; + uint64_t localsplusnames; + uint64_t localspluskinds; + uint64_t co_code_adaptive; + } code_object; + + // PyObject offset; + struct _pyobject { + uint64_t size; + uint64_t ob_type; + } pyobject; + + // PyTypeObject object offset; + struct _type_object { + uint64_t size; + uint64_t tp_name; + uint64_t tp_repr; + uint64_t tp_flags; + } type_object; + + // PyTuple object offset; + struct _tuple_object { + uint64_t size; + uint64_t ob_item; + uint64_t ob_size; + } tuple_object; + + // PyList object offset; + struct _list_object { + uint64_t size; + uint64_t ob_item; + uint64_t ob_size; + } list_object; + + // PyDict object offset; + struct _dict_object { + uint64_t size; + uint64_t ma_keys; + uint64_t ma_values; + } dict_object; + + // PyFloat object offset; + struct _float_object { + uint64_t size; + uint64_t ob_fval; + } float_object; + + // PyLong object offset; + struct _long_object { + uint64_t size; + uint64_t lv_tag; + uint64_t ob_digit; + } long_object; + + // PyBytes object offset; + struct _bytes_object { + uint64_t size; + uint64_t ob_size; + uint64_t ob_sval; + } bytes_object; + + // Unicode object offset; + struct _unicode_object { + uint64_t size; + uint64_t state; + uint64_t length; + uint64_t asciiobject_size; + } unicode_object; + + // GC runtime state offset; + struct _gc { + uint64_t size; + uint64_t collecting; + } gc; +} _Py_DebugOffsets; + +/* Reference tracer state */ +struct _reftracer_runtime_state { + PyRefTracer tracer_func; + void* tracer_data; +}; + /* Full Python runtime state */ /* _PyRuntimeState holds the global state for the CPython runtime. That data is exposed in the internal API as a static variable (_PyRuntime). */ typedef struct pyruntimestate { + /* This field must be first to facilitate locating it by out of process + * debuggers. Out of process debuggers will use the offsets contained in this + * field to be able to locate other fields in several interpreter structures + * in a way that doesn't require them to know the exact layout of those + * structures. + * + * IMPORTANT: + * This struct is **NOT** backwards compatible between minor version of the + * interpreter and the members, order of members and size can change between + * minor versions. This struct is only guaranteed to be stable between patch + * versions for a given minor version of the interpreter. + */ + _Py_DebugOffsets debug_offsets; + /* Has been initialized to a safe state. In order to be effective, this must be set to 0 during or right @@ -82,10 +243,12 @@ typedef struct pyruntimestate { Use _PyRuntimeState_GetFinalizing() and _PyRuntimeState_SetFinalizing() to access it, don't access it directly. */ - _Py_atomic_address _finalizing; + PyThreadState *_finalizing; + /* The ID of the OS thread in which we are finalizing. */ + unsigned long _finalizing_id; struct pyinterpreters { - PyThread_type_lock mutex; + PyMutex mutex; /* The linked list of interpreters, newest first. */ PyInterpreterState *head; /* The runtime's initial interpreter, which has a special role @@ -103,23 +266,22 @@ typedef struct pyruntimestate { int64_t next_id; } interpreters; + /* Platform-specific identifier and PyThreadState, respectively, for the + main thread in the main interpreter. */ unsigned long main_thread; + PyThreadState *main_tstate; /* ---------- IMPORTANT --------------------------- The fields above this line are declared as early as possible to facilitate out-of-process observability tools. */ - // XXX Remove this field once we have a tp_* slot. - struct _xidregistry { - PyThread_type_lock mutex; - struct _xidregitem *head; - } xidregistry; + /* cross-interpreter data and utils */ + struct _xi_runtime_state xi; struct _pymem_allocators allocators; struct _obmalloc_global_state obmalloc; struct pyhash_runtime_state pyhash_state; - struct _time_runtime_state time; struct _pythread_runtime_state threads; struct _signals_runtime_state signals; @@ -142,6 +304,14 @@ typedef struct pyruntimestate { struct _fileutils_state fileutils; struct _faulthandler_runtime_state faulthandler; struct _tracemalloc_runtime_state tracemalloc; + struct _reftracer_runtime_state ref_tracer; + + // The rwmutex is used to prevent overlapping global and per-interpreter + // stop-the-world events. Global stop-the-world events lock the mutex + // exclusively (as a "writer"), while per-interpreter stop-the-world events + // lock it non-exclusively (as "readers"). + _PyRWMutex stoptheworld_mutex; + struct _stoptheworld_state stoptheworld; PyPreConfig preconfig; @@ -150,7 +320,7 @@ typedef struct pyruntimestate { Py_OpenCodeHookFunction open_code_hook; void *open_code_userdata; struct { - PyThread_type_lock mutex; + PyMutex mutex; _Py_AuditHookEntry *head; } audit_hooks; @@ -160,6 +330,7 @@ typedef struct pyruntimestate { struct _types_runtime_state types; /* All the objects that are shared by the runtime's interpreters. */ + struct _Py_cached_objects cached_objects; struct _Py_static_objects static_objects; /* The following fields are here to avoid allocation during init. @@ -176,17 +347,27 @@ typedef struct pyruntimestate { a pointer type. */ - /* PyInterpreterState.interpreters.main */ + /* _PyRuntimeState.interpreters.main */ PyInterpreterState _main_interpreter; + +#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE) + // Used in "Python/emscripten_trampoline.c" to choose between type + // reflection trampoline and EM_JS trampoline. + bool wasm_type_reflection_available; +#endif + } _PyRuntimeState; /* other API */ +// Export _PyRuntime for shared extensions which use it in static inline +// functions for best performance, like _Py_IsMainThread() or _Py_ID(). +// It's also made accessible for debuggers and profilers. PyAPI_DATA(_PyRuntimeState) _PyRuntime; -PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); +extern PyStatus _PyRuntimeState_Init(_PyRuntimeState *runtime); +extern void _PyRuntimeState_Fini(_PyRuntimeState *runtime); #ifdef HAVE_FORK extern PyStatus _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); @@ -194,19 +375,33 @@ extern PyStatus _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); /* Initialize _PyRuntimeState. Return NULL on success, or return an error message on failure. */ -PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); +extern PyStatus _PyRuntime_Initialize(void); -PyAPI_FUNC(void) _PyRuntime_Finalize(void); +extern void _PyRuntime_Finalize(void); static inline PyThreadState* _PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) { - return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing); + return (PyThreadState*)_Py_atomic_load_ptr_relaxed(&runtime->_finalizing); +} + +static inline unsigned long +_PyRuntimeState_GetFinalizingID(_PyRuntimeState *runtime) { + return _Py_atomic_load_ulong_relaxed(&runtime->_finalizing_id); } static inline void _PyRuntimeState_SetFinalizing(_PyRuntimeState *runtime, PyThreadState *tstate) { - _Py_atomic_store_relaxed(&runtime->_finalizing, (uintptr_t)tstate); + _Py_atomic_store_ptr_relaxed(&runtime->_finalizing, tstate); + if (tstate == NULL) { + _Py_atomic_store_ulong_relaxed(&runtime->_finalizing_id, 0); + } + else { + // XXX Re-enable this assert once gh-109860 is fixed. + //assert(tstate->thread_id == PyThread_get_thread_ident()); + _Py_atomic_store_ulong_relaxed(&runtime->_finalizing_id, + tstate->thread_id); + } } #ifdef __cplusplus diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 7aace9f8..7eef9edc 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -8,11 +8,19 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_long.h" -#include "pycore_object.h" -#include "pycore_parser.h" -#include "pycore_pymem_init.h" -#include "pycore_obmalloc_init.h" +#include "pycore_ceval_state.h" // _PyEval_RUNTIME_PERF_INIT +#include "pycore_faulthandler.h" // _faulthandler_runtime_state_INIT +#include "pycore_floatobject.h" // _py_float_format_unknown +#include "pycore_object.h" // _PyObject_HEAD_INIT +#include "pycore_obmalloc_init.h" // _obmalloc_global_state_INIT +#include "pycore_parser.h" // _parser_runtime_state_INIT +#include "pycore_pyhash.h" // pyhash_state_INIT +#include "pycore_pymem_init.h" // _pymem_allocators_standard_INIT +#include "pycore_pythread.h" // _pythread_RUNTIME_INIT +#include "pycore_qsbr.h" // QSBR_INITIAL +#include "pycore_runtime_init_generated.h" // _Py_bytes_characters_INIT +#include "pycore_signal.h" // _signals_RUNTIME_INIT +#include "pycore_tracemalloc.h" // _tracemalloc_runtime_state_INIT extern PyTypeObject _PyExc_MemoryError; @@ -21,27 +29,142 @@ extern PyTypeObject _PyExc_MemoryError; /* The static initializers defined here should only be used in the runtime init code (in pystate.c and pylifecycle.c). */ - -#define _PyRuntimeState_INIT(runtime) \ +#define _PyRuntimeState_INIT(runtime, debug_cookie) \ { \ + .debug_offsets = { \ + .cookie = debug_cookie, \ + .version = PY_VERSION_HEX, \ + .free_threaded = _Py_Debug_Free_Threaded, \ + .runtime_state = { \ + .size = sizeof(_PyRuntimeState), \ + .finalizing = offsetof(_PyRuntimeState, _finalizing), \ + .interpreters_head = offsetof(_PyRuntimeState, interpreters.head), \ + }, \ + .interpreter_state = { \ + .size = sizeof(PyInterpreterState), \ + .id = offsetof(PyInterpreterState, id), \ + .next = offsetof(PyInterpreterState, next), \ + .threads_head = offsetof(PyInterpreterState, threads.head), \ + .gc = offsetof(PyInterpreterState, gc), \ + .imports_modules = offsetof(PyInterpreterState, imports.modules), \ + .sysdict = offsetof(PyInterpreterState, sysdict), \ + .builtins = offsetof(PyInterpreterState, builtins), \ + .ceval_gil = offsetof(PyInterpreterState, ceval.gil), \ + .gil_runtime_state = offsetof(PyInterpreterState, _gil), \ + .gil_runtime_state_enabled = _Py_Debug_gilruntimestate_enabled, \ + .gil_runtime_state_locked = offsetof(PyInterpreterState, _gil.locked), \ + .gil_runtime_state_holder = offsetof(PyInterpreterState, _gil.last_holder), \ + }, \ + .thread_state = { \ + .size = sizeof(PyThreadState), \ + .prev = offsetof(PyThreadState, prev), \ + .next = offsetof(PyThreadState, next), \ + .interp = offsetof(PyThreadState, interp), \ + .current_frame = offsetof(PyThreadState, current_frame), \ + .thread_id = offsetof(PyThreadState, thread_id), \ + .native_thread_id = offsetof(PyThreadState, native_thread_id), \ + .datastack_chunk = offsetof(PyThreadState, datastack_chunk), \ + .status = offsetof(PyThreadState, _status), \ + }, \ + .interpreter_frame = { \ + .size = sizeof(_PyInterpreterFrame), \ + .previous = offsetof(_PyInterpreterFrame, previous), \ + .executable = offsetof(_PyInterpreterFrame, f_executable), \ + .instr_ptr = offsetof(_PyInterpreterFrame, instr_ptr), \ + .localsplus = offsetof(_PyInterpreterFrame, localsplus), \ + .owner = offsetof(_PyInterpreterFrame, owner), \ + }, \ + .code_object = { \ + .size = sizeof(PyCodeObject), \ + .filename = offsetof(PyCodeObject, co_filename), \ + .name = offsetof(PyCodeObject, co_name), \ + .qualname = offsetof(PyCodeObject, co_qualname), \ + .linetable = offsetof(PyCodeObject, co_linetable), \ + .firstlineno = offsetof(PyCodeObject, co_firstlineno), \ + .argcount = offsetof(PyCodeObject, co_argcount), \ + .localsplusnames = offsetof(PyCodeObject, co_localsplusnames), \ + .localspluskinds = offsetof(PyCodeObject, co_localspluskinds), \ + .co_code_adaptive = offsetof(PyCodeObject, co_code_adaptive), \ + }, \ + .pyobject = { \ + .size = sizeof(PyObject), \ + .ob_type = offsetof(PyObject, ob_type), \ + }, \ + .type_object = { \ + .size = sizeof(PyTypeObject), \ + .tp_name = offsetof(PyTypeObject, tp_name), \ + .tp_repr = offsetof(PyTypeObject, tp_repr), \ + .tp_flags = offsetof(PyTypeObject, tp_flags), \ + }, \ + .tuple_object = { \ + .size = sizeof(PyTupleObject), \ + .ob_item = offsetof(PyTupleObject, ob_item), \ + .ob_size = offsetof(PyTupleObject, ob_base.ob_size), \ + }, \ + .list_object = { \ + .size = sizeof(PyListObject), \ + .ob_item = offsetof(PyListObject, ob_item), \ + .ob_size = offsetof(PyListObject, ob_base.ob_size), \ + }, \ + .dict_object = { \ + .size = sizeof(PyDictObject), \ + .ma_keys = offsetof(PyDictObject, ma_keys), \ + .ma_values = offsetof(PyDictObject, ma_values), \ + }, \ + .float_object = { \ + .size = sizeof(PyFloatObject), \ + .ob_fval = offsetof(PyFloatObject, ob_fval), \ + }, \ + .long_object = { \ + .size = sizeof(PyLongObject), \ + .lv_tag = offsetof(PyLongObject, long_value.lv_tag), \ + .ob_digit = offsetof(PyLongObject, long_value.ob_digit), \ + }, \ + .bytes_object = { \ + .size = sizeof(PyBytesObject), \ + .ob_size = offsetof(PyBytesObject, ob_base.ob_size), \ + .ob_sval = offsetof(PyBytesObject, ob_sval), \ + }, \ + .unicode_object = { \ + .size = sizeof(PyUnicodeObject), \ + .state = offsetof(PyUnicodeObject, _base._base.state), \ + .length = offsetof(PyUnicodeObject, _base._base.length), \ + .asciiobject_size = sizeof(PyASCIIObject), \ + }, \ + .gc = { \ + .size = sizeof(struct _gc_runtime_state), \ + .collecting = offsetof(struct _gc_runtime_state, collecting), \ + }, \ + }, \ .allocators = { \ .standard = _pymem_allocators_standard_INIT(runtime), \ .debug = _pymem_allocators_debug_INIT, \ .obj_arena = _pymem_allocators_obj_arena_INIT, \ + .is_debug_enabled = _pymem_is_debug_enabled_INIT, \ }, \ .obmalloc = _obmalloc_global_state_INIT, \ .pyhash_state = pyhash_state_INIT, \ + .threads = _pythread_RUNTIME_INIT(runtime.threads), \ .signals = _signals_RUNTIME_INIT, \ .interpreters = { \ /* This prevents interpreters from getting created \ until _PyInterpreterState_Enable() is called. */ \ .next_id = -1, \ }, \ + .xi = { \ + .registry = { \ + .global = 1, \ + }, \ + }, \ /* A TSS key must be initialized with Py_tss_NEEDS_INIT \ in accordance with the specification. */ \ .autoTSSkey = Py_tss_NEEDS_INIT, \ .parser = _parser_runtime_state_INIT, \ .ceval = { \ + .pending_mainthread = { \ + .max = MAXPENDINGCALLS_MAIN, \ + .maxloop = MAXPENDINGCALLSLOOP_MAIN, \ + }, \ .perf = _PyEval_RUNTIME_PERF_INIT, \ }, \ .gilstate = { \ @@ -52,6 +175,13 @@ extern PyTypeObject _PyExc_MemoryError; }, \ .faulthandler = _faulthandler_runtime_state_INIT, \ .tracemalloc = _tracemalloc_runtime_state_INIT, \ + .ref_tracer = { \ + .tracer_func = NULL, \ + .tracer_data = NULL, \ + }, \ + .stoptheworld = { \ + .is_global = 1, \ + }, \ .float_state = { \ .float_format = _py_float_format_unknown, \ .double_format = _py_float_format_unknown, \ @@ -71,13 +201,13 @@ extern PyTypeObject _PyExc_MemoryError; .latin1 = _Py_str_latin1_INIT, \ }, \ .tuple_empty = { \ - .ob_base = _PyVarObject_HEAD_INIT(&PyTuple_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&PyTuple_Type, 0), \ }, \ .hamt_bitmap_node_empty = { \ - .ob_base = _PyVarObject_HEAD_INIT(&_PyHamt_BitmapNode_Type, 0) \ + .ob_base = _PyVarObject_HEAD_INIT(&_PyHamt_BitmapNode_Type, 0), \ }, \ .context_token_missing = { \ - .ob_base = _PyObject_HEAD_INIT(&_PyContextTokenMissing_Type) \ + .ob_base = _PyObject_HEAD_INIT(&_PyContextTokenMissing_Type), \ }, \ }, \ }, \ @@ -87,23 +217,31 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyInterpreterState_INIT(INTERP) \ { \ .id_refcount = -1, \ + ._whence = _PyInterpreterState_WHENCE_NOTSET, \ .imports = IMPORTS_INIT, \ - .obmalloc = _obmalloc_state_INIT(INTERP.obmalloc), \ .ceval = { \ .recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \ + .pending = { \ + .max = MAXPENDINGCALLS, \ + .maxloop = MAXPENDINGCALLSLOOP, \ + }, \ }, \ .gc = { \ .enabled = 1, \ .generations = { \ /* .head is set in _PyGC_InitState(). */ \ - { .threshold = 700, }, \ + { .threshold = 2000, }, \ { .threshold = 10, }, \ { .threshold = 10, }, \ }, \ }, \ - .object_state = _py_object_state_INIT(INTERP), \ + .qsbr = { \ + .wr_seq = QSBR_INITIAL, \ + .rd_seq = QSBR_INITIAL, \ + }, \ .dtoa = _dtoa_state_INIT(&(INTERP)), \ .dict_state = _dict_state_INIT, \ + .mem_free_queue = _Py_mem_free_queue_INIT(INTERP.mem_free_queue), \ .func_state = { \ .next_version = 1, \ }, \ @@ -114,39 +252,36 @@ extern PyTypeObject _PyExc_MemoryError; .singletons = { \ ._not_used = 1, \ .hamt_empty = { \ - .ob_base = _PyObject_HEAD_INIT(&_PyHamt_Type) \ + .ob_base = _PyObject_HEAD_INIT(&_PyHamt_Type), \ .h_root = (PyHamtNode*)&_Py_SINGLETON(hamt_bitmap_node_empty), \ }, \ .last_resort_memory_error = { \ - _PyObject_HEAD_INIT(&_PyExc_MemoryError) \ + _PyObject_HEAD_INIT(&_PyExc_MemoryError), \ + .args = (PyObject*)&_Py_SINGLETON(tuple_empty) \ }, \ }, \ }, \ - ._initial_thread = _PyThreadState_INIT, \ + ._initial_thread = _PyThreadStateImpl_INIT, \ } -#define _PyThreadState_INIT \ +#define _PyThreadStateImpl_INIT \ { \ - .py_recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \ - .context_ver = 1, \ + .base = _PyThreadState_INIT, \ } -#ifdef Py_TRACE_REFS -# define _py_object_state_INIT(INTERP) \ +#define _PyThreadState_INIT \ { \ - .refchain = {&INTERP.object_state.refchain, &INTERP.object_state.refchain}, \ + ._whence = _PyThreadState_WHENCE_NOTSET, \ + .py_recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \ + .context_ver = 1, \ } -#else -# define _py_object_state_INIT(INTERP) \ - { 0 } -#endif // global objects #define _PyBytes_SIMPLE_INIT(CH, LEN) \ { \ - _PyVarObject_HEAD_INIT(&PyBytes_Type, (LEN)) \ + _PyVarObject_HEAD_INIT(&PyBytes_Type, (LEN)), \ .ob_shash = -1, \ .ob_sval = { (CH) }, \ } @@ -157,13 +292,14 @@ extern PyTypeObject _PyExc_MemoryError; #define _PyUnicode_ASCII_BASE_INIT(LITERAL, ASCII) \ { \ - .ob_base = _PyObject_HEAD_INIT(&PyUnicode_Type) \ + .ob_base = _PyObject_HEAD_INIT(&PyUnicode_Type), \ .length = sizeof(LITERAL) - 1, \ .hash = -1, \ .state = { \ .kind = 1, \ .compact = 1, \ .ascii = (ASCII), \ + .statically_allocated = 1, \ }, \ } #define _PyASCIIObject_INIT(LITERAL) \ diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h index 07f237b2..19a6b9b1 100644 --- a/Include/internal/pycore_runtime_init_generated.h +++ b/Include/internal/pycore_runtime_init_generated.h @@ -8,6 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_long.h" // _PyLong_DIGIT_INIT() + + /* The following is auto-generated by Tools/build/generate_global_objects.py. */ #define _Py_small_ints_INIT { \ _PyLong_DIGIT_INIT(-5), \ @@ -539,25 +542,21 @@ extern "C" { INIT_STR(anon_lambda, ""), \ INIT_STR(anon_listcomp, ""), \ INIT_STR(anon_module, ""), \ + INIT_STR(anon_null, ""), \ INIT_STR(anon_setcomp, ""), \ INIT_STR(anon_string, ""), \ INIT_STR(anon_unknown, ""), \ - INIT_STR(close_br, "}"), \ INIT_STR(dbl_close_br, "}}"), \ INIT_STR(dbl_open_br, "{{"), \ INIT_STR(dbl_percent, "%%"), \ INIT_STR(defaults, ".defaults"), \ - INIT_STR(dot, "."), \ INIT_STR(dot_locals, "."), \ INIT_STR(empty, ""), \ INIT_STR(generic_base, ".generic_base"), \ INIT_STR(json_decoder, "json.decoder"), \ INIT_STR(kwdefaults, ".kwdefaults"), \ INIT_STR(list_err, "list index out of range"), \ - INIT_STR(newline, "\n"), \ - INIT_STR(open_br, "{"), \ - INIT_STR(percent, "%"), \ - INIT_STR(shim_name, ""), \ + INIT_STR(str_replace_inf, "1e309"), \ INIT_STR(type_params, ".type_params"), \ INIT_STR(utf_8, "utf-8"), \ } @@ -572,7 +571,6 @@ extern "C" { INIT_ID(TextIOWrapper), \ INIT_ID(True), \ INIT_ID(WarningMessage), \ - INIT_ID(_), \ INIT_ID(_WindowsConsoleIO), \ INIT_ID(__IOBase_closed), \ INIT_ID(__abc_tpflags__), \ @@ -587,7 +585,6 @@ extern "C" { INIT_ID(__anext__), \ INIT_ID(__annotations__), \ INIT_ID(__args__), \ - INIT_ID(__asyncio_running_event_loop__), \ INIT_ID(__await__), \ INIT_ID(__bases__), \ INIT_ID(__bool__), \ @@ -619,6 +616,7 @@ extern "C" { INIT_ID(__eq__), \ INIT_ID(__exit__), \ INIT_ID(__file__), \ + INIT_ID(__firstlineno__), \ INIT_ID(__float__), \ INIT_ID(__floordiv__), \ INIT_ID(__format__), \ @@ -664,6 +662,7 @@ extern "C" { INIT_ID(__lshift__), \ INIT_ID(__lt__), \ INIT_ID(__main__), \ + INIT_ID(__match_args__), \ INIT_ID(__matmul__), \ INIT_ID(__missing__), \ INIT_ID(__mod__), \ @@ -718,6 +717,7 @@ extern "C" { INIT_ID(__slotnames__), \ INIT_ID(__slots__), \ INIT_ID(__spec__), \ + INIT_ID(__static_attributes__), \ INIT_ID(__str__), \ INIT_ID(__sub__), \ INIT_ID(__subclasscheck__), \ @@ -736,6 +736,7 @@ extern "C" { INIT_ID(_abc_impl), \ INIT_ID(_abstract_), \ INIT_ID(_active), \ + INIT_ID(_align_), \ INIT_ID(_annotation), \ INIT_ID(_anonymous_), \ INIT_ID(_argtypes_), \ @@ -746,6 +747,7 @@ extern "C" { INIT_ID(_check_retval_), \ INIT_ID(_dealloc_warn), \ INIT_ID(_feature_version), \ + INIT_ID(_field_types), \ INIT_ID(_fields_), \ INIT_ID(_finalizing), \ INIT_ID(_find_and_load), \ @@ -761,26 +763,29 @@ extern "C" { INIT_ID(_lock_unlock_module), \ INIT_ID(_loop), \ INIT_ID(_needs_com_addref_), \ + INIT_ID(_only_immortal), \ INIT_ID(_pack_), \ INIT_ID(_restype_), \ INIT_ID(_showwarnmsg), \ INIT_ID(_shutdown), \ INIT_ID(_slotnames), \ + INIT_ID(_strptime), \ INIT_ID(_strptime_datetime), \ INIT_ID(_swappedbytes_), \ INIT_ID(_type_), \ INIT_ID(_uninitialized_submodules), \ INIT_ID(_warn_unawaited_coroutine), \ INIT_ID(_xoptions), \ - INIT_ID(a), \ INIT_ID(abs_tol), \ INIT_ID(access), \ + INIT_ID(aclose), \ INIT_ID(add), \ INIT_ID(add_done_callback), \ INIT_ID(after_in_child), \ INIT_ID(after_in_parent), \ INIT_ID(aggregate_class), \ INIT_ID(alias), \ + INIT_ID(allow_code), \ INIT_ID(append), \ INIT_ID(arg), \ INIT_ID(argdefs), \ @@ -788,11 +793,12 @@ extern "C" { INIT_ID(arguments), \ INIT_ID(argv), \ INIT_ID(as_integer_ratio), \ + INIT_ID(asend), \ INIT_ID(ast), \ + INIT_ID(athrow), \ INIT_ID(attribute), \ INIT_ID(authorizer_callback), \ INIT_ID(autocommit), \ - INIT_ID(b), \ INIT_ID(backtick), \ INIT_ID(base), \ INIT_ID(before), \ @@ -810,16 +816,17 @@ extern "C" { INIT_ID(byteorder), \ INIT_ID(bytes), \ INIT_ID(bytes_per_sep), \ - INIT_ID(c), \ INIT_ID(c_call), \ INIT_ID(c_exception), \ INIT_ID(c_return), \ + INIT_ID(cached_datetime_module), \ INIT_ID(cached_statements), \ INIT_ID(cadata), \ INIT_ID(cafile), \ INIT_ID(call), \ INIT_ID(call_exception_handler), \ INIT_ID(call_soon), \ + INIT_ID(callback), \ INIT_ID(cancel), \ INIT_ID(capath), \ INIT_ID(category), \ @@ -850,6 +857,7 @@ extern "C" { INIT_ID(co_stacksize), \ INIT_ID(co_varnames), \ INIT_ID(code), \ + INIT_ID(col_offset), \ INIT_ID(command), \ INIT_ID(comment_factory), \ INIT_ID(compile_mode), \ @@ -863,15 +871,16 @@ extern "C" { INIT_ID(count), \ INIT_ID(covariant), \ INIT_ID(cwd), \ - INIT_ID(d), \ INIT_ID(data), \ INIT_ID(database), \ + INIT_ID(day), \ INIT_ID(decode), \ INIT_ID(decoder), \ INIT_ID(default), \ INIT_ID(defaultaction), \ INIT_ID(delete), \ INIT_ID(depth), \ + INIT_ID(desired_access), \ INIT_ID(detect_types), \ INIT_ID(deterministic), \ INIT_ID(device), \ @@ -890,14 +899,13 @@ extern "C" { INIT_ID(dont_inherit), \ INIT_ID(dst), \ INIT_ID(dst_dir_fd), \ - INIT_ID(duration), \ - INIT_ID(e), \ INIT_ID(eager_start), \ INIT_ID(effective_ids), \ INIT_ID(element_factory), \ INIT_ID(encode), \ INIT_ID(encoding), \ INIT_ID(end), \ + INIT_ID(end_col_offset), \ INIT_ID(end_lineno), \ INIT_ID(end_offset), \ INIT_ID(endpos), \ @@ -929,15 +937,16 @@ extern "C" { INIT_ID(fileno), \ INIT_ID(filepath), \ INIT_ID(fillvalue), \ + INIT_ID(filter), \ INIT_ID(filters), \ INIT_ID(final), \ INIT_ID(find_class), \ INIT_ID(fix_imports), \ INIT_ID(flags), \ INIT_ID(flush), \ + INIT_ID(fold), \ INIT_ID(follow_symlinks), \ INIT_ID(format), \ - INIT_ID(frequency), \ INIT_ID(from_param), \ INIT_ID(fromlist), \ INIT_ID(fromtimestamp), \ @@ -959,13 +968,16 @@ extern "C" { INIT_ID(groupindex), \ INIT_ID(groups), \ INIT_ID(handle), \ + INIT_ID(handle_seq), \ + INIT_ID(has_location), \ INIT_ID(hash_name), \ INIT_ID(header), \ INIT_ID(headers), \ INIT_ID(hi), \ INIT_ID(hook), \ - INIT_ID(id), \ + INIT_ID(hour), \ INIT_ID(ident), \ + INIT_ID(identity_hint), \ INIT_ID(ignore), \ INIT_ID(imag), \ INIT_ID(importlib), \ @@ -974,9 +986,12 @@ extern "C" { INIT_ID(indexgroup), \ INIT_ID(inf), \ INIT_ID(infer_variance), \ + INIT_ID(inherit_handle), \ INIT_ID(inheritable), \ INIT_ID(initial), \ INIT_ID(initial_bytes), \ + INIT_ID(initial_owner), \ + INIT_ID(initial_state), \ INIT_ID(initial_value), \ INIT_ID(initval), \ INIT_ID(inner_size), \ @@ -986,6 +1001,7 @@ extern "C" { INIT_ID(instructions), \ INIT_ID(intern), \ INIT_ID(intersection), \ + INIT_ID(interval), \ INIT_ID(is_running), \ INIT_ID(isatty), \ INIT_ID(isinstance), \ @@ -1007,6 +1023,8 @@ extern "C" { INIT_ID(kw), \ INIT_ID(kw1), \ INIT_ID(kw2), \ + INIT_ID(kwdefaults), \ + INIT_ID(label), \ INIT_ID(lambda), \ INIT_ID(last), \ INIT_ID(last_exc), \ @@ -1030,11 +1048,13 @@ extern "C" { INIT_ID(locals), \ INIT_ID(logoption), \ INIT_ID(loop), \ + INIT_ID(manual_reset), \ INIT_ID(mapping), \ INIT_ID(match), \ INIT_ID(max_length), \ INIT_ID(maxdigits), \ INIT_ID(maxevents), \ + INIT_ID(maxlen), \ INIT_ID(maxmem), \ INIT_ID(maxsplit), \ INIT_ID(maxvalue), \ @@ -1044,15 +1064,19 @@ extern "C" { INIT_ID(metaclass), \ INIT_ID(metadata), \ INIT_ID(method), \ + INIT_ID(microsecond), \ + INIT_ID(milliseconds), \ + INIT_ID(minute), \ INIT_ID(mod), \ INIT_ID(mode), \ INIT_ID(module), \ INIT_ID(module_globals), \ INIT_ID(modules), \ + INIT_ID(month), \ INIT_ID(mro), \ INIT_ID(msg), \ + INIT_ID(mutex), \ INIT_ID(mycmp), \ - INIT_ID(n), \ INIT_ID(n_arg), \ INIT_ID(n_fields), \ INIT_ID(n_sequence_fields), \ @@ -1063,6 +1087,7 @@ extern "C" { INIT_ID(namespaces), \ INIT_ID(narg), \ INIT_ID(ndigits), \ + INIT_ID(nested), \ INIT_ID(new_file_name), \ INIT_ID(new_limit), \ INIT_ID(newline), \ @@ -1097,7 +1122,6 @@ extern "C" { INIT_ID(outgoing), \ INIT_ID(overlapped), \ INIT_ID(owner), \ - INIT_ID(p), \ INIT_ID(pages), \ INIT_ID(parent), \ INIT_ID(password), \ @@ -1125,7 +1149,6 @@ extern "C" { INIT_ID(ps2), \ INIT_ID(query), \ INIT_ID(quotetabs), \ - INIT_ID(r), \ INIT_ID(raw), \ INIT_ID(read), \ INIT_ID(read1), \ @@ -1149,10 +1172,11 @@ extern "C" { INIT_ID(return), \ INIT_ID(reverse), \ INIT_ID(reversed), \ - INIT_ID(s), \ INIT_ID(salt), \ INIT_ID(sched_priority), \ INIT_ID(scheduler), \ + INIT_ID(second), \ + INIT_ID(security_attributes), \ INIT_ID(seek), \ INIT_ID(seekable), \ INIT_ID(selectors), \ @@ -1178,9 +1202,9 @@ extern "C" { INIT_ID(sleep), \ INIT_ID(sock), \ INIT_ID(sort), \ - INIT_ID(sound), \ INIT_ID(source), \ INIT_ID(source_traceback), \ + INIT_ID(spam), \ INIT_ID(src), \ INIT_ID(src_dir_fd), \ INIT_ID(stacklevel), \ @@ -1230,6 +1254,7 @@ extern "C" { INIT_ID(type), \ INIT_ID(type_params), \ INIT_ID(tz), \ + INIT_ID(tzinfo), \ INIT_ID(tzname), \ INIT_ID(uid), \ INIT_ID(unlink), \ @@ -1240,6 +1265,8 @@ extern "C" { INIT_ID(values), \ INIT_ID(version), \ INIT_ID(volume), \ + INIT_ID(wait_all), \ + INIT_ID(warn_on_full_buffer), \ INIT_ID(warnings), \ INIT_ID(warnoptions), \ INIT_ID(wbits), \ @@ -1251,7 +1278,6 @@ extern "C" { INIT_ID(writable), \ INIT_ID(write), \ INIT_ID(write_through), \ - INIT_ID(x), \ INIT_ID(year), \ INIT_ID(zdict), \ } diff --git a/Include/internal/pycore_semaphore.h b/Include/internal/pycore_semaphore.h new file mode 100644 index 00000000..ffcc6d80 --- /dev/null +++ b/Include/internal/pycore_semaphore.h @@ -0,0 +1,65 @@ +// The _PySemaphore API a simplified cross-platform semaphore used to implement +// wakeup/sleep. +#ifndef Py_INTERNAL_SEMAPHORE_H +#define Py_INTERNAL_SEMAPHORE_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_pythread.h" // _POSIX_SEMAPHORES + +#ifdef MS_WINDOWS +# define WIN32_LEAN_AND_MEAN +# include +#elif defined(HAVE_PTHREAD_H) +# include +#elif defined(HAVE_PTHREAD_STUBS) +# include "cpython/pthread_stubs.h" +#else +# error "Require native threads. See https://bugs.python.org/issue31370" +#endif + +#if (defined(_POSIX_SEMAPHORES) && (_POSIX_SEMAPHORES+0) != -1 && \ + defined(HAVE_SEM_TIMEDWAIT)) +# define _Py_USE_SEMAPHORES +# include +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _PySemaphore { +#if defined(MS_WINDOWS) + HANDLE platform_sem; +#elif defined(_Py_USE_SEMAPHORES) + sem_t platform_sem; +#else + pthread_mutex_t mutex; + pthread_cond_t cond; + int counter; +#endif +} _PySemaphore; + +// Puts the current thread to sleep until _PySemaphore_Wakeup() is called. +// If `detach` is true, then the thread will detach/release the GIL while +// sleeping. +PyAPI_FUNC(int) +_PySemaphore_Wait(_PySemaphore *sema, PyTime_t timeout_ns, int detach); + +// Wakes up a single thread waiting on sema. Note that _PySemaphore_Wakeup() +// can be called before _PySemaphore_Wait(). +PyAPI_FUNC(void) +_PySemaphore_Wakeup(_PySemaphore *sema); + +// Initializes/destroys a semaphore +PyAPI_FUNC(void) _PySemaphore_Init(_PySemaphore *sema); +PyAPI_FUNC(void) _PySemaphore_Destroy(_PySemaphore *sema); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_SEMAPHORE_H */ diff --git a/Include/internal/pycore_setobject.h b/Include/internal/pycore_setobject.h new file mode 100644 index 00000000..0494c07f --- /dev/null +++ b/Include/internal/pycore_setobject.h @@ -0,0 +1,39 @@ +#ifndef Py_INTERNAL_SETOBJECT_H +#define Py_INTERNAL_SETOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// Export for '_abc' shared extension +PyAPI_FUNC(int) _PySet_NextEntry( + PyObject *set, + Py_ssize_t *pos, + PyObject **key, + Py_hash_t *hash); + +// Export for '_pickle' shared extension +PyAPI_FUNC(int) _PySet_NextEntryRef( + PyObject *set, + Py_ssize_t *pos, + PyObject **key, + Py_hash_t *hash); + +// Export for '_pickle' shared extension +PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); + +// Export for the gdb plugin's (python-gdb.py) benefit +PyAPI_DATA(PyObject *) _PySet_Dummy; + +PyAPI_FUNC(int) _PySet_Contains(PySetObject *so, PyObject *key); + +// Clears the set without acquiring locks. Used by _PyCode_Fini. +extern void _PySet_ClearInternal(PySetObject *so); + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_SETOBJECT_H diff --git a/Include/internal/pycore_signal.h b/Include/internal/pycore_signal.h index ca3f69d0..47213a34 100644 --- a/Include/internal/pycore_signal.h +++ b/Include/internal/pycore_signal.h @@ -10,10 +10,12 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" // _Py_atomic_address +#include // NSIG -#include // NSIG +// Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. +// Export for '_posixsubprocess' shared extension. +PyAPI_FUNC(void) _Py_RestoreSignals(void); #ifdef _SIG_MAXSIG // gh-91145: On FreeBSD, defines NSIG as 32: it doesn't include @@ -35,12 +37,10 @@ extern "C" { #define INVALID_FD (-1) struct _signals_runtime_state { - volatile struct { - _Py_atomic_int tripped; - /* func is atomic to ensure that PyErr_SetInterrupt is async-signal-safe - * (even though it would probably be otherwise, anyway). - */ - _Py_atomic_address func; + struct { + // tripped and func should be accessed using atomic ops. + int tripped; + PyObject* func; } handlers[Py_NSIG]; volatile struct { @@ -60,8 +60,9 @@ struct _signals_runtime_state { #endif } wakeup; - /* Speed up sigcheck() when none tripped */ - _Py_atomic_int is_tripped; + /* Speed up sigcheck() when none tripped. + is_tripped should be accessed using atomic ops. */ + int is_tripped; /* These objects necessarily belong to the main interpreter. */ PyObject *default_handler; @@ -92,6 +93,15 @@ struct _signals_runtime_state { } +// Export for '_multiprocessing' shared extension +PyAPI_FUNC(int) _PyOS_IsMainThread(void); + +#ifdef MS_WINDOWS +// is not included by Python.h so use void* instead of HANDLE. +// Export for '_multiprocessing' shared extension +PyAPI_FUNC(void*) _PyOS_SigintEvent(void); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_sliceobject.h b/Include/internal/pycore_sliceobject.h index 98665c38..ba8b1f1c 100644 --- a/Include/internal/pycore_sliceobject.h +++ b/Include/internal/pycore_sliceobject.h @@ -11,9 +11,7 @@ extern "C" { /* runtime lifecycle */ -extern void _PySlice_Fini(PyInterpreterState *); - -extern PyObject * +PyAPI_FUNC(PyObject *) _PyBuildSlice_ConsumeRefs(PyObject *start, PyObject *stop); #ifdef __cplusplus diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h new file mode 100644 index 00000000..93898174 --- /dev/null +++ b/Include/internal/pycore_stackref.h @@ -0,0 +1,195 @@ +#ifndef Py_INTERNAL_STACKREF_H +#define Py_INTERNAL_STACKREF_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include + +typedef union { + uintptr_t bits; +} _PyStackRef; + +static const _PyStackRef Py_STACKREF_NULL = { .bits = 0 }; + +#define Py_TAG_DEFERRED (1) + +// Gets a PyObject * from a _PyStackRef +#if defined(Py_GIL_DISABLED) +static inline PyObject * +PyStackRef_Get(_PyStackRef tagged) +{ + PyObject *cleared = ((PyObject *)((tagged).bits & (~Py_TAG_DEFERRED))); + return cleared; +} +#else +# define PyStackRef_Get(tagged) ((PyObject *)((tagged).bits)) +#endif + +// Converts a PyObject * to a PyStackRef, stealing the reference. +#if defined(Py_GIL_DISABLED) +static inline _PyStackRef +_PyStackRef_StealRef(PyObject *obj) +{ + // Make sure we don't take an already tagged value. + assert(((uintptr_t)obj & Py_TAG_DEFERRED) == 0); + return ((_PyStackRef){.bits = ((uintptr_t)(obj))}); +} +# define PyStackRef_StealRef(obj) _PyStackRef_StealRef(_PyObject_CAST(obj)) +#else +# define PyStackRef_StealRef(obj) ((_PyStackRef){.bits = ((uintptr_t)(obj))}) +#endif + +// Converts a PyObject * to a PyStackRef, with a new reference +#if defined(Py_GIL_DISABLED) +static inline _PyStackRef +_PyStackRef_NewRefDeferred(PyObject *obj) +{ + // Make sure we don't take an already tagged value. + assert(((uintptr_t)obj & Py_TAG_DEFERRED) == 0); + assert(obj != NULL); + if (_PyObject_HasDeferredRefcount(obj)) { + return (_PyStackRef){ .bits = (uintptr_t)obj | Py_TAG_DEFERRED }; + } + else { + return (_PyStackRef){ .bits = (uintptr_t)Py_NewRef(obj) }; + } +} +# define PyStackRef_NewRefDeferred(obj) _PyStackRef_NewRefDeferred(_PyObject_CAST(obj)) +#else +# define PyStackRef_NewRefDeferred(obj) PyStackRef_NewRef(((_PyStackRef){.bits = ((uintptr_t)(obj))})) +#endif + +#if defined(Py_GIL_DISABLED) +static inline _PyStackRef +_PyStackRef_XNewRefDeferred(PyObject *obj) +{ + // Make sure we don't take an already tagged value. + assert(((uintptr_t)obj & Py_TAG_DEFERRED) == 0); + if (obj == NULL) { + return Py_STACKREF_NULL; + } + return _PyStackRef_NewRefDeferred(obj); +} +# define PyStackRef_XNewRefDeferred(obj) _PyStackRef_XNewRefDeferred(_PyObject_CAST(obj)) +#else +# define PyStackRef_XNewRefDeferred(obj) PyStackRef_XNewRef(((_PyStackRef){.bits = ((uintptr_t)(obj))})) +#endif + +// Converts a PyStackRef back to a PyObject *. +#if defined(Py_GIL_DISABLED) +static inline PyObject * +PyStackRef_StealObject(_PyStackRef tagged) +{ + if ((tagged.bits & Py_TAG_DEFERRED) == Py_TAG_DEFERRED) { + assert(_PyObject_HasDeferredRefcount(PyStackRef_Get(tagged))); + return Py_NewRef(PyStackRef_Get(tagged)); + } + return PyStackRef_Get(tagged); +} +#else +# define PyStackRef_StealObject(tagged) PyStackRef_Get(tagged) +#endif + +static inline void +_Py_untag_stack_borrowed(PyObject **dst, const _PyStackRef *src, size_t length) +{ + for (size_t i = 0; i < length; i++) { + dst[i] = PyStackRef_Get(src[i]); + } +} + +static inline void +_Py_untag_stack_steal(PyObject **dst, const _PyStackRef *src, size_t length) +{ + for (size_t i = 0; i < length; i++) { + dst[i] = PyStackRef_StealObject(src[i]); + } +} + + +#define PyStackRef_XSETREF(dst, src) \ + do { \ + _PyStackRef *_tmp_dst_ptr = &(dst); \ + _PyStackRef _tmp_old_dst = (*_tmp_dst_ptr); \ + *_tmp_dst_ptr = (src); \ + PyStackRef_XDECREF(_tmp_old_dst); \ + } while (0) + +#define PyStackRef_SETREF(dst, src) \ + do { \ + _PyStackRef *_tmp_dst_ptr = &(dst); \ + _PyStackRef _tmp_old_dst = (*_tmp_dst_ptr); \ + *_tmp_dst_ptr = (src); \ + PyStackRef_DECREF(_tmp_old_dst); \ + } while (0) + +#define PyStackRef_CLEAR(op) \ + do { \ + _PyStackRef *_tmp_op_ptr = &(op); \ + _PyStackRef _tmp_old_op = (*_tmp_op_ptr); \ + if (_tmp_old_op.bits != Py_STACKREF_NULL.bits) { \ + *_tmp_op_ptr = Py_STACKREF_NULL; \ + PyStackRef_DECREF(_tmp_old_op); \ + } \ + } while (0) + +#if defined(Py_GIL_DISABLED) +static inline void +PyStackRef_DECREF(_PyStackRef tagged) +{ + if ((tagged.bits & Py_TAG_DEFERRED) == Py_TAG_DEFERRED) { + return; + } + Py_DECREF(PyStackRef_Get(tagged)); +} +#else +# define PyStackRef_DECREF(op) Py_DECREF(PyStackRef_Get(op)) +#endif + +#if defined(Py_GIL_DISABLED) +static inline void +PyStackRef_INCREF(_PyStackRef tagged) +{ + if ((tagged.bits & Py_TAG_DEFERRED) == Py_TAG_DEFERRED) { + assert(_PyObject_HasDeferredRefcount(PyStackRef_Get(tagged))); + return; + } + Py_INCREF(PyStackRef_Get(tagged)); +} +#else +# define PyStackRef_INCREF(op) Py_INCREF(PyStackRef_Get(op)) +#endif + +static inline void +PyStackRef_XDECREF(_PyStackRef op) +{ + if (op.bits != Py_STACKREF_NULL.bits) { + PyStackRef_DECREF(op); + } +} + +static inline _PyStackRef +PyStackRef_NewRef(_PyStackRef obj) +{ + PyStackRef_INCREF(obj); + return obj; +} + +static inline _PyStackRef +PyStackRef_XNewRef(_PyStackRef obj) +{ + if (obj.bits == Py_STACKREF_NULL.bits) { + return obj; + } + return PyStackRef_NewRef(obj); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_STACKREF_H */ diff --git a/Include/internal/pycore_strhex.h b/Include/internal/pycore_strhex.h index f427b4d6..225f4239 100644 --- a/Include/internal/pycore_strhex.h +++ b/Include/internal/pycore_strhex.h @@ -9,21 +9,24 @@ extern "C" { #endif // Returns a str() containing the hex representation of argbuf. +// Export for '_hashlib' shared extension. PyAPI_FUNC(PyObject*) _Py_strhex(const char* argbuf, const Py_ssize_t arglen); // Returns a bytes() containing the ASCII hex representation of argbuf. -PyAPI_FUNC(PyObject*) _Py_strhex_bytes( +extern PyObject* _Py_strhex_bytes( const char* argbuf, const Py_ssize_t arglen); // These variants include support for a separator between every N bytes: -PyAPI_FUNC(PyObject*) _Py_strhex_with_sep( +extern PyObject* _Py_strhex_with_sep( const char* argbuf, const Py_ssize_t arglen, PyObject* sep, const int bytes_per_group); + +// Export for 'binascii' shared extension PyAPI_FUNC(PyObject*) _Py_strhex_bytes_with_sep( const char* argbuf, const Py_ssize_t arglen, diff --git a/Include/internal/pycore_structseq.h b/Include/internal/pycore_structseq.h index 6f5dfc12..5cff1656 100644 --- a/Include/internal/pycore_structseq.h +++ b/Include/internal/pycore_structseq.h @@ -11,7 +11,8 @@ extern "C" { /* other API */ -PyAPI_FUNC(PyTypeObject *) _PyStructSequence_NewType( +// Export for '_curses' shared extension +PyAPI_FUNC(PyTypeObject*) _PyStructSequence_NewType( PyStructSequence_Desc *desc, unsigned long tp_flags); diff --git a/Include/internal/pycore_symtable.h b/Include/internal/pycore_symtable.h index c8e0578a..90252bf8 100644 --- a/Include/internal/pycore_symtable.h +++ b/Include/internal/pycore_symtable.h @@ -15,11 +15,23 @@ typedef enum _block_type { // Used for annotations if 'from __future__ import annotations' is active. // Annotation blocks cannot bind names and are not evaluated. AnnotationBlock, - // Used for generics and type aliases. These work mostly like functions - // (see PEP 695 for details). The three different blocks function identically; - // they are different enum entries only so that error messages can be more - // precise. - TypeVarBoundBlock, TypeAliasBlock, TypeParamBlock + + // The following blocks are used for generics and type aliases. These work + // mostly like functions (see PEP 695 for details). The three different + // blocks function identically; they are different enum entries only so + // that error messages can be more precise. + + // The block to enter when processing a "type" (PEP 695) construction, + // e.g., "type MyGeneric[T] = list[T]". + TypeAliasBlock, + // The block to enter when processing a "generic" (PEP 695) object, + // e.g., "def foo[T](): pass" or "class A[T]: pass". + TypeParametersBlock, + // The block to enter when processing the bound, the constraint tuple + // or the default value of a single "type variable" in the formal sense, + // i.e., a TypeVar, a TypeVarTuple or a ParamSpec object (the latter two + // do not support a bound or a constraint tuple). + TypeVariableBlock, } _Py_block_ty; typedef enum _comprehension_type { @@ -29,6 +41,29 @@ typedef enum _comprehension_type { SetComprehension = 3, GeneratorExpression = 4 } _Py_comprehension_ty; +/* source location information */ +typedef struct { + int lineno; + int end_lineno; + int col_offset; + int end_col_offset; +} _Py_SourceLocation; + +#define SRC_LOCATION_FROM_AST(n) \ + (_Py_SourceLocation){ \ + .lineno = (n)->lineno, \ + .end_lineno = (n)->end_lineno, \ + .col_offset = (n)->col_offset, \ + .end_col_offset = (n)->end_col_offset } + +static const _Py_SourceLocation NO_LOCATION = {-1, -1, -1, -1}; + +/* __future__ information */ +typedef struct { + int ff_features; /* flags set by future statements */ + _Py_SourceLocation ff_location; /* location of last future statement */ +} _PyFutureFeatures; + struct _symtable_entry; struct symtable { @@ -44,7 +79,7 @@ struct symtable { consistency with the corresponding compiler structure */ PyObject *st_private; /* name of current class or NULL */ - PyFutureFeatures *st_future; /* module's future features that affect + _PyFutureFeatures *st_future; /* module's future features that affect the symbol table */ int recursion_depth; /* current recursion depth */ int recursion_limit; /* recursion limit */ @@ -58,7 +93,17 @@ typedef struct _symtable_entry { PyObject *ste_varnames; /* list of function parameters */ PyObject *ste_children; /* list of child blocks */ PyObject *ste_directives;/* locations of global and nonlocal statements */ + PyObject *ste_mangled_names; /* set of names for which mangling should be applied */ + _Py_block_ty ste_type; + // Optional string set by symtable.c and used when reporting errors. + // The content of that string is a description of the current "context". + // + // For instance, if we are processing the default value of the type + // variable "T" in "def foo[T = int](): pass", `ste_scope_info` is + // set to "a TypeVar default". + const char *ste_scope_info; + int ste_nested; /* true if block is nested */ unsigned ste_free : 1; /* true if block has free variables */ unsigned ste_child_free : 1; /* true if a child block has free vars, @@ -100,27 +145,28 @@ extern int _PyST_IsFunctionLike(PySTEntryObject *); extern struct symtable* _PySymtable_Build( struct _mod *mod, PyObject *filename, - PyFutureFeatures *future); -PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); + _PyFutureFeatures *future); +extern PySTEntryObject* _PySymtable_Lookup(struct symtable *, void *); extern void _PySymtable_Free(struct symtable *); +extern PyObject *_Py_MaybeMangle(PyObject *privateobj, PySTEntryObject *ste, PyObject *name); extern PyObject* _Py_Mangle(PyObject *p, PyObject *name); /* Flags for def-use information */ -#define DEF_GLOBAL 1 /* global stmt */ -#define DEF_LOCAL 2 /* assignment in code block */ -#define DEF_PARAM 2<<1 /* formal parameter */ -#define DEF_NONLOCAL 2<<2 /* nonlocal stmt */ -#define USE 2<<3 /* name is used */ -#define DEF_FREE 2<<4 /* name used but not defined in nested block */ -#define DEF_FREE_CLASS 2<<5 /* free variable from class's method */ -#define DEF_IMPORT 2<<6 /* assignment occurred via import */ -#define DEF_ANNOT 2<<7 /* this name is annotated */ -#define DEF_COMP_ITER 2<<8 /* this name is a comprehension iteration variable */ -#define DEF_TYPE_PARAM 2<<9 /* this name is a type parameter */ -#define DEF_COMP_CELL 2<<10 /* this name is a cell in an inlined comprehension */ +#define DEF_GLOBAL 1 /* global stmt */ +#define DEF_LOCAL 2 /* assignment in code block */ +#define DEF_PARAM (2<<1) /* formal parameter */ +#define DEF_NONLOCAL (2<<2) /* nonlocal stmt */ +#define USE (2<<3) /* name is used */ +#define DEF_FREE (2<<4) /* name used but not defined in nested block */ +#define DEF_FREE_CLASS (2<<5) /* free variable from class's method */ +#define DEF_IMPORT (2<<6) /* assignment occurred via import */ +#define DEF_ANNOT (2<<7) /* this name is annotated */ +#define DEF_COMP_ITER (2<<8) /* this name is a comprehension iteration variable */ +#define DEF_TYPE_PARAM (2<<9) /* this name is a type parameter */ +#define DEF_COMP_CELL (2<<10) /* this name is a cell in an inlined comprehension */ #define DEF_BOUND (DEF_LOCAL | DEF_PARAM | DEF_IMPORT) @@ -150,7 +196,7 @@ extern struct symtable* _Py_SymtableStringObjectFlags( int _PyFuture_FromAST( struct _mod * mod, PyObject *filename, - PyFutureFeatures* futures); + _PyFutureFeatures* futures); #ifdef __cplusplus } diff --git a/Include/internal/pycore_sysmodule.h b/Include/internal/pycore_sysmodule.h index b4b1feba..9b8eafd3 100644 --- a/Include/internal/pycore_sysmodule.h +++ b/Include/internal/pycore_sysmodule.h @@ -8,17 +8,23 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -PyAPI_FUNC(int) _PySys_Audit( +// Export for '_pickle' shared extension +PyAPI_FUNC(PyObject*) _PySys_GetAttr(PyThreadState *tstate, PyObject *name); + +// Export for '_pickle' shared extension +PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *); + +extern int _PySys_Audit( PyThreadState *tstate, const char *event, const char *argFormat, ...); -/* We want minimal exposure of this function, so use extern rather than - PyAPI_FUNC() to not export the symbol. */ +// _PySys_ClearAuditHooks() must not be exported: use extern rather than +// PyAPI_FUNC(). We want minimal exposure of this function. extern void _PySys_ClearAuditHooks(PyThreadState *tstate); -PyAPI_FUNC(int) _PySys_SetAttr(PyObject *, PyObject *); +extern int _PySys_SetAttr(PyObject *, PyObject *); extern int _PySys_ClearAttrString(PyInterpreterState *interp, const char *name, int verbose); diff --git a/Include/internal/pycore_time.h b/Include/internal/pycore_time.h index 949170c4..205ac5d3 100644 --- a/Include/internal/pycore_time.h +++ b/Include/internal/pycore_time.h @@ -1,3 +1,52 @@ +// Internal PyTime_t C API: see Doc/c-api/time.rst for the documentation. +// +// The PyTime_t type is an integer to support directly common arithmetic +// operations such as t1 + t2. +// +// Time formats: +// +// * Seconds. +// * Seconds as a floating-point number (C double). +// * Milliseconds (10^-3 seconds). +// * Microseconds (10^-6 seconds). +// * 100 nanoseconds (10^-7 seconds), used on Windows. +// * Nanoseconds (10^-9 seconds). +// * timeval structure, 1 microsecond (10^-6 seconds). +// * timespec structure, 1 nanosecond (10^-9 seconds). +// +// Note that PyTime_t is now specified as int64_t, in nanoseconds. +// (If we need to change this, we'll need new public API with new names.) +// Previously, PyTime_t was configurable (in theory); some comments and code +// might still allude to that. +// +// Integer overflows are detected and raise OverflowError. Conversion to a +// resolution larger than 1 nanosecond is rounded correctly with the requested +// rounding mode. Available rounding modes: +// +// * Round towards minus infinity (-inf). For example, used to read a clock. +// * Round towards infinity (+inf). For example, used for timeout to wait "at +// least" N seconds. +// * Round to nearest with ties going to nearest even integer. For example, used +// to round from a Python float. +// * Round away from zero. For example, used for timeout. +// +// Some functions clamp the result in the range [PyTime_MIN; PyTime_MAX]. The +// caller doesn't have to handle errors and so doesn't need to hold the GIL to +// handle exceptions. For example, _PyTime_Add(t1, t2) computes t1+t2 and +// clamps the result on overflow. +// +// Clocks: +// +// * System clock +// * Monotonic clock +// * Performance counter +// +// Internally, operations like (t * k / q) with integers are implemented in a +// way to reduce the risk of integer overflow. Such operation is used to convert a +// clock value expressed in ticks with a frequency to PyTime_t, like +// QueryPerformanceCounter() with QueryPerformanceFrequency() on Windows. + + #ifndef Py_INTERNAL_TIME_H #define Py_INTERNAL_TIME_H #ifdef __cplusplus @@ -9,17 +58,280 @@ extern "C" { #endif -struct _time_runtime_state { -#ifdef HAVE_TIMES - int ticks_per_second_initialized; - long ticks_per_second; -#else - int _not_used; +#ifdef __clang__ +struct timeval; +#endif + +#define _SIZEOF_PYTIME_T 8 + +typedef enum { + // Round towards minus infinity (-inf). + // For example, used to read a clock. + _PyTime_ROUND_FLOOR=0, + + // Round towards infinity (+inf). + // For example, used for timeout to wait "at least" N seconds. + _PyTime_ROUND_CEILING=1, + + // Round to nearest with ties going to nearest even integer. + // For example, used to round from a Python float. + _PyTime_ROUND_HALF_EVEN=2, + + // Round away from zero + // For example, used for timeout. _PyTime_ROUND_CEILING rounds + // -1e-9 to 0 milliseconds which causes bpo-31786 issue. + // _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps + // the timeout sign as expected. select.poll(timeout) must block + // for negative values. + _PyTime_ROUND_UP=3, + + // _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be + // used for timeouts. + _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP +} _PyTime_round_t; + + +// Convert a time_t to a PyLong. +// Export for '_testinternalcapi' shared extension +PyAPI_FUNC(PyObject*) _PyLong_FromTime_t(time_t sec); + +// Convert a PyLong to a time_t. +// Export for '_datetime' shared extension +PyAPI_FUNC(time_t) _PyLong_AsTime_t(PyObject *obj); + +// Convert a number of seconds, int or float, to time_t. +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyTime_ObjectToTime_t( + PyObject *obj, + time_t *sec, + _PyTime_round_t); + +// Convert a number of seconds, int or float, to a timeval structure. +// usec is in the range [0; 999999] and rounded towards zero. +// For example, -1.2 is converted to (-2, 800000). +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyTime_ObjectToTimeval( + PyObject *obj, + time_t *sec, + long *usec, + _PyTime_round_t); + +// Convert a number of seconds, int or float, to a timespec structure. +// nsec is in the range [0; 999999999] and rounded towards zero. +// For example, -1.2 is converted to (-2, 800000000). +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(int) _PyTime_ObjectToTimespec( + PyObject *obj, + time_t *sec, + long *nsec, + _PyTime_round_t); + + +// Create a timestamp from a number of seconds. +// Export for '_socket' shared extension. +PyAPI_FUNC(PyTime_t) _PyTime_FromSeconds(int seconds); + +// Create a timestamp from a number of seconds in double. +extern int _PyTime_FromSecondsDouble( + double seconds, + _PyTime_round_t round, + PyTime_t *result); + +// Macro to create a timestamp from a number of seconds, no integer overflow. +// Only use the macro for small values, prefer _PyTime_FromSeconds(). +#define _PYTIME_FROMSECONDS(seconds) \ + ((PyTime_t)(seconds) * (1000 * 1000 * 1000)) + +// Create a timestamp from a number of microseconds. +// Clamp to [PyTime_MIN; PyTime_MAX] on overflow. +extern PyTime_t _PyTime_FromMicrosecondsClamp(PyTime_t us); + +// Create a timestamp from a Python int object (number of nanoseconds). +// Export for '_lsprof' shared extension. +PyAPI_FUNC(int) _PyTime_FromLong(PyTime_t *t, + PyObject *obj); + +// Convert a number of seconds (Python float or int) to a timestamp. +// Raise an exception and return -1 on error, return 0 on success. +// Export for '_socket' shared extension. +PyAPI_FUNC(int) _PyTime_FromSecondsObject(PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +// Convert a number of milliseconds (Python float or int, 10^-3) to a timestamp. +// Raise an exception and return -1 on error, return 0 on success. +// Export for 'select' shared extension. +PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(PyTime_t *t, + PyObject *obj, + _PyTime_round_t round); + +// Convert timestamp to a number of milliseconds (10^-3 seconds). +// Export for '_ssl' shared extension. +PyAPI_FUNC(PyTime_t) _PyTime_AsMilliseconds(PyTime_t t, + _PyTime_round_t round); + +// Convert timestamp to a number of microseconds (10^-6 seconds). +// Export for '_queue' shared extension. +PyAPI_FUNC(PyTime_t) _PyTime_AsMicroseconds(PyTime_t t, + _PyTime_round_t round); + +#ifdef MS_WINDOWS +// Convert timestamp to a number of 100 nanoseconds (10^-7 seconds). +extern PyTime_t _PyTime_As100Nanoseconds(PyTime_t t, + _PyTime_round_t round); +#endif + +// Convert a timestamp (number of nanoseconds) as a Python int object. +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(PyObject*) _PyTime_AsLong(PyTime_t t); + +#ifndef MS_WINDOWS +// Create a timestamp from a timeval structure. +// Raise an exception and return -1 on overflow, return 0 on success. +extern int _PyTime_FromTimeval(PyTime_t *tp, struct timeval *tv); +#endif + +// Convert a timestamp to a timeval structure (microsecond resolution). +// tv_usec is always positive. +// Raise an exception and return -1 if the conversion overflowed, +// return 0 on success. +// Export for 'select' shared extension. +PyAPI_FUNC(int) _PyTime_AsTimeval(PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +// Similar to _PyTime_AsTimeval() but don't raise an exception on overflow. +// On overflow, clamp tv_sec to PyTime_t min/max. +// Export for 'select' shared extension. +PyAPI_FUNC(void) _PyTime_AsTimeval_clamp(PyTime_t t, + struct timeval *tv, + _PyTime_round_t round); + +// Convert a timestamp to a number of seconds (secs) and microseconds (us). +// us is always positive. This function is similar to _PyTime_AsTimeval() +// except that secs is always a time_t type, whereas the timeval structure +// uses a C long for tv_sec on Windows. +// Raise an exception and return -1 if the conversion overflowed, +// return 0 on success. +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( + PyTime_t t, + time_t *secs, + int *us, + _PyTime_round_t round); + +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE) +// Create a timestamp from a timespec structure. +// Raise an exception and return -1 on overflow, return 0 on success. +extern int _PyTime_FromTimespec(PyTime_t *tp, const struct timespec *ts); + +// Convert a timestamp to a timespec structure (nanosecond resolution). +// tv_nsec is always positive. +// Raise an exception and return -1 on error, return 0 on success. +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(int) _PyTime_AsTimespec(PyTime_t t, struct timespec *ts); + +// Similar to _PyTime_AsTimespec() but don't raise an exception on overflow. +// On overflow, clamp tv_sec to PyTime_t min/max. +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(void) _PyTime_AsTimespec_clamp(PyTime_t t, struct timespec *ts); #endif -}; + + +// Compute t1 + t2. Clamp to [PyTime_MIN; PyTime_MAX] on overflow. +extern PyTime_t _PyTime_Add(PyTime_t t1, PyTime_t t2); + +// Structure used by time.get_clock_info() +typedef struct { + const char *implementation; + int monotonic; + int adjustable; + double resolution; +} _Py_clock_info_t; + +// Get the current time from the system clock. +// On success, set *t and *info (if not NULL), and return 0. +// On error, raise an exception and return -1. +extern int _PyTime_TimeWithInfo( + PyTime_t *t, + _Py_clock_info_t *info); + +// Get the time of a monotonic clock, i.e. a clock that cannot go backwards. +// The clock is not affected by system clock updates. The reference point of +// the returned value is undefined, so that only the difference between the +// results of consecutive calls is valid. +// +// Fill info (if set) with information of the function used to get the time. +// +// Return 0 on success, raise an exception and return -1 on error. +// Export for '_testsinglephase' shared extension. +PyAPI_FUNC(int) _PyTime_MonotonicWithInfo( + PyTime_t *t, + _Py_clock_info_t *info); + + +// Converts a timestamp to the Gregorian time, using the local time zone. +// Return 0 on success, raise an exception and return -1 on error. +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); + +// Converts a timestamp to the Gregorian time, assuming UTC. +// Return 0 on success, raise an exception and return -1 on error. +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); + + +// Get the performance counter: clock with the highest available resolution to +// measure a short duration. +// +// Fill info (if set) with information of the function used to get the time. +// +// Return 0 on success, raise an exception and return -1 on error. +extern int _PyTime_PerfCounterWithInfo( + PyTime_t *t, + _Py_clock_info_t *info); + + +// --- _PyDeadline ----------------------------------------------------------- + +// Create a deadline. +// Pseudo code: return PyTime_MonotonicRaw() + timeout +// Export for '_ssl' shared extension. +PyAPI_FUNC(PyTime_t) _PyDeadline_Init(PyTime_t timeout); + +// Get remaining time from a deadline. +// Pseudo code: return deadline - PyTime_MonotonicRaw() +// Export for '_ssl' shared extension. +PyAPI_FUNC(PyTime_t) _PyDeadline_Get(PyTime_t deadline); + + +// --- _PyTimeFraction ------------------------------------------------------- + +typedef struct { + PyTime_t numer; + PyTime_t denom; +} _PyTimeFraction; + +// Set a fraction. +// Return 0 on success. +// Return -1 if the fraction is invalid. +extern int _PyTimeFraction_Set( + _PyTimeFraction *frac, + PyTime_t numer, + PyTime_t denom); + +// Compute ticks * frac.numer / frac.denom. +// Clamp to [PyTime_MIN; PyTime_MAX] on overflow. +extern PyTime_t _PyTimeFraction_Mul( + PyTime_t ticks, + const _PyTimeFraction *frac); + +// Compute a clock resolution: frac.numer / frac.denom / 1e9. +extern double _PyTimeFraction_Resolution( + const _PyTimeFraction *frac); #ifdef __cplusplus } #endif -#endif /* !Py_INTERNAL_TIME_H */ +#endif // !Py_INTERNAL_TIME_H diff --git a/Include/internal/pycore_token.h b/Include/internal/pycore_token.h index c02e637f..571cd624 100644 --- a/Include/internal/pycore_token.h +++ b/Include/internal/pycore_token.h @@ -1,4 +1,4 @@ -/* Auto-generated by Tools/build/generate_token.py */ +// Auto-generated by Tools/build/generate_token.py /* Token types */ #ifndef Py_INTERNAL_TOKEN_H @@ -69,18 +69,16 @@ extern "C" { #define COLONEQUAL 53 #define EXCLAMATION 54 #define OP 55 -#define AWAIT 56 -#define ASYNC 57 -#define TYPE_IGNORE 58 -#define TYPE_COMMENT 59 -#define SOFT_KEYWORD 60 -#define FSTRING_START 61 -#define FSTRING_MIDDLE 62 -#define FSTRING_END 63 -#define COMMENT 64 -#define NL 65 -#define ERRORTOKEN 66 -#define N_TOKENS 68 +#define TYPE_IGNORE 56 +#define TYPE_COMMENT 57 +#define SOFT_KEYWORD 58 +#define FSTRING_START 59 +#define FSTRING_MIDDLE 60 +#define FSTRING_END 61 +#define COMMENT 62 +#define NL 63 +#define ERRORTOKEN 64 +#define N_TOKENS 66 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ @@ -96,7 +94,7 @@ extern "C" { (x) == FSTRING_MIDDLE) -// Symbols exported for test_peg_generator +// Export these 4 symbols for 'test_peg_generator' PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ PyAPI_FUNC(int) _PyToken_OneChar(int); PyAPI_FUNC(int) _PyToken_TwoChars(int, int); diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index c393b2c1..10922bff 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -8,6 +8,12 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +// Export for '_ctypes' shared extension +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int, int *, PyObject **); + +// Export for 'pyexact' shared extension +PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); + /* Write the Python traceback into the file 'fd'. For example: Traceback (most recent call first): @@ -25,7 +31,7 @@ extern "C" { This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpTraceback( +extern void _Py_DumpTraceback( int fd, PyThreadState *tstate); @@ -52,7 +58,7 @@ PyAPI_FUNC(void) _Py_DumpTraceback( This function is signal safe. */ -PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( +extern const char* _Py_DumpTracebackThreads( int fd, PyInterpreterState *interp, PyThreadState *current_tstate); @@ -64,23 +70,23 @@ PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( string which is not ready (PyUnicode_WCHAR_KIND). This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); +extern void _Py_DumpASCII(int fd, PyObject *text); /* Format an integer as decimal into the file descriptor fd. This function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpDecimal( +extern void _Py_DumpDecimal( int fd, size_t value); /* Format an integer as hexadecimal with width digits into fd file descriptor. The function is signal safe. */ -PyAPI_FUNC(void) _Py_DumpHexadecimal( +extern void _Py_DumpHexadecimal( int fd, uintptr_t value, Py_ssize_t width); -PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( +extern PyObject* _PyTraceBack_FromFrame( PyObject *tb_next, PyFrameObject *frame); @@ -89,11 +95,10 @@ PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( /* Write the traceback tb to file f. Prefix each line with indent spaces followed by the margin (if it is not NULL). */ -PyAPI_FUNC(int) _PyTraceBack_Print_Indented( - PyObject *tb, int indent, const char* margin, - const char *header_margin, const char *header, PyObject *f); -PyAPI_FUNC(int) _Py_WriteIndentedMargin(int, const char*, PyObject *); -PyAPI_FUNC(int) _Py_WriteIndent(int, PyObject *); +extern int _PyTraceBack_Print( + PyObject *tb, const char *header, PyObject *f); +extern int _Py_WriteIndentedMargin(int, const char*, PyObject *); +extern int _Py_WriteIndent(int, PyObject *); #ifdef __cplusplus } diff --git a/Include/internal/pycore_tracemalloc.h b/Include/internal/pycore_tracemalloc.h index d086adc6..7ddc5bac 100644 --- a/Include/internal/pycore_tracemalloc.h +++ b/Include/internal/pycore_tracemalloc.h @@ -117,6 +117,53 @@ struct _tracemalloc_runtime_state { } +// Get the traceback where a memory block was allocated. +// +// Return a tuple of (filename: str, lineno: int) tuples. +// +// Return None if the tracemalloc module is disabled or if the memory block +// is not tracked by tracemalloc. +// +// Raise an exception and return NULL on error. +// +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( + unsigned int domain, + uintptr_t ptr); + +/* Return non-zero if tracemalloc is tracing */ +extern int _PyTraceMalloc_IsTracing(void); + +/* Clear the tracemalloc traces */ +extern void _PyTraceMalloc_ClearTraces(void); + +/* Clear the tracemalloc traces */ +extern PyObject* _PyTraceMalloc_GetTraces(void); + +/* Clear tracemalloc traceback for an object */ +extern PyObject* _PyTraceMalloc_GetObjectTraceback(PyObject *obj); + +/* Initialize tracemalloc */ +extern int _PyTraceMalloc_Init(void); + +/* Start tracemalloc */ +extern int _PyTraceMalloc_Start(int max_nframe); + +/* Stop tracemalloc */ +extern void _PyTraceMalloc_Stop(void); + +/* Get the tracemalloc traceback limit */ +extern int _PyTraceMalloc_GetTracebackLimit(void); + +/* Get the memory usage of tracemalloc in bytes */ +extern size_t _PyTraceMalloc_GetMemory(void); + +/* Get the current size and peak size of traced memory blocks as a 2-tuple */ +extern PyObject* _PyTraceMalloc_GetTracedMemory(void); + +/* Set the peak size of traced memory blocks to the current size */ +extern void _PyTraceMalloc_ResetPeak(void); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h new file mode 100644 index 00000000..1ed5b1d8 --- /dev/null +++ b/Include/internal/pycore_tstate.h @@ -0,0 +1,46 @@ +#ifndef Py_INTERNAL_TSTATE_H +#define Py_INTERNAL_TSTATE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_brc.h" // struct _brc_thread_state +#include "pycore_freelist.h" // struct _Py_freelist_state +#include "pycore_mimalloc.h" // struct _mimalloc_thread_state +#include "pycore_qsbr.h" // struct qsbr + + +// Every PyThreadState is actually allocated as a _PyThreadStateImpl. The +// PyThreadState fields are exposed as part of the C API, although most fields +// are intended to be private. The _PyThreadStateImpl fields not exposed. +typedef struct _PyThreadStateImpl { + // semi-public fields are in PyThreadState. + PyThreadState base; + + PyObject *asyncio_running_loop; // Strong reference + + struct _qsbr_thread_state *qsbr; // only used by free-threaded build + struct llist_node mem_free_queue; // delayed free queue + +#ifdef Py_GIL_DISABLED + struct _gc_thread_state gc; + struct _mimalloc_thread_state mimalloc; + struct _Py_object_freelists freelists; + struct _brc_thread_state brc; +#endif + +#if defined(Py_REF_DEBUG) && defined(Py_GIL_DISABLED) + Py_ssize_t reftotal; // this thread's total refcount operations +#endif + +} _PyThreadStateImpl; + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_TSTATE_H */ diff --git a/Include/internal/pycore_tuple.h b/Include/internal/pycore_tuple.h index 335edad8..14a9e42c 100644 --- a/Include/internal/pycore_tuple.h +++ b/Include/internal/pycore_tuple.h @@ -8,64 +8,20 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "tupleobject.h" /* _PyTuple_CAST() */ - +extern void _PyTuple_MaybeUntrack(PyObject *); +extern void _PyTuple_DebugMallocStats(FILE *out); /* runtime lifecycle */ extern PyStatus _PyTuple_InitGlobalObjects(PyInterpreterState *); -extern void _PyTuple_Fini(PyInterpreterState *); /* other API */ -// PyTuple_MAXSAVESIZE - largest tuple to save on free list -// PyTuple_MAXFREELIST - maximum number of tuples of each size to save - -#if defined(PyTuple_MAXSAVESIZE) && PyTuple_MAXSAVESIZE <= 0 - // A build indicated that tuple freelists should not be used. -# define PyTuple_NFREELISTS 0 -# undef PyTuple_MAXSAVESIZE -# undef PyTuple_MAXFREELIST - -#elif !defined(WITH_FREELISTS) -# define PyTuple_NFREELISTS 0 -# undef PyTuple_MAXSAVESIZE -# undef PyTuple_MAXFREELIST - -#else - // We are using a freelist for tuples. -# ifndef PyTuple_MAXSAVESIZE -# define PyTuple_MAXSAVESIZE 20 -# endif -# define PyTuple_NFREELISTS PyTuple_MAXSAVESIZE -# ifndef PyTuple_MAXFREELIST -# define PyTuple_MAXFREELIST 2000 -# endif -#endif - -struct _Py_tuple_state { -#if PyTuple_NFREELISTS > 0 - /* There is one freelist for each size from 1 to PyTuple_MAXSAVESIZE. - The empty tuple is handled separately. - - Each tuple stored in the array is the head of the linked list - (and the next available tuple) for that size. The actual tuple - object is used as the linked list node, with its first item - (ob_item[0]) pointing to the next node (i.e. the previous head). - Each linked list is initially NULL. */ - PyTupleObject *free_list[PyTuple_NFREELISTS]; - int numfree[PyTuple_NFREELISTS]; -#else - char _unused; // Empty structs are not allowed. -#endif -}; - #define _PyTuple_ITEMS(op) _Py_RVALUE(_PyTuple_CAST(op)->ob_item) extern PyObject *_PyTuple_FromArray(PyObject *const *, Py_ssize_t); -extern PyObject *_PyTuple_FromArraySteal(PyObject *const *, Py_ssize_t); - +PyAPI_FUNC(PyObject *)_PyTuple_FromArraySteal(PyObject *const *, Py_ssize_t); typedef struct { PyObject_HEAD diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h index 8f3fbbcd..a6562f7f 100644 --- a/Include/internal/pycore_typeobject.h +++ b/Include/internal/pycore_typeobject.h @@ -4,23 +4,38 @@ extern "C" { #endif -#include "pycore_moduleobject.h" - #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_moduleobject.h" // PyModuleObject +#include "pycore_lock.h" // PyMutex + /* state */ #define _Py_TYPE_BASE_VERSION_TAG (2<<16) #define _Py_MAX_GLOBAL_TYPE_VERSION_TAG (_Py_TYPE_BASE_VERSION_TAG - 1) +/* For now we hard-code this to a value for which we are confident + all the static builtin types will fit (for all builds). */ +#define _Py_MAX_MANAGED_STATIC_BUILTIN_TYPES 200 +#define _Py_MAX_MANAGED_STATIC_EXT_TYPES 10 +#define _Py_MAX_MANAGED_STATIC_TYPES \ + (_Py_MAX_MANAGED_STATIC_BUILTIN_TYPES + _Py_MAX_MANAGED_STATIC_EXT_TYPES) + struct _types_runtime_state { /* Used to set PyTypeObject.tp_version_tag for core static types. */ // bpo-42745: next_version_tag remains shared by all interpreters // because of static types. unsigned int next_version_tag; + + struct { + struct { + PyTypeObject *type; + int64_t interp_count; + } types[_Py_MAX_MANAGED_STATIC_TYPES]; + } managed_static; }; @@ -28,6 +43,9 @@ struct _types_runtime_state { // see _PyType_Lookup(). struct type_cache_entry { unsigned int version; // initialized from type->tp_version_tag +#ifdef Py_GIL_DISABLED + _PySeqLock sequence; +#endif PyObject *name; // reference to exactly a str or None PyObject *value; // borrowed reference or NULL }; @@ -38,12 +56,9 @@ struct type_cache { struct type_cache_entry hashtable[1 << MCACHE_SIZE_EXP]; }; -/* For now we hard-code this to a value for which we are confident - all the static builtin types will fit (for all builds). */ -#define _Py_MAX_STATIC_BUILTIN_TYPES 200 - typedef struct { PyTypeObject *type; + int isbuiltin; int readying; int ready; // XXX tp_dict can probably be statically allocated, @@ -55,7 +70,7 @@ typedef struct { are also some diagnostic uses for the list of weakrefs, so we still keep it. */ PyObject *tp_weaklist; -} static_builtin_state; +} managed_static_type_state; struct types_state { /* Used to set PyTypeObject.tp_version_tag. @@ -64,8 +79,54 @@ struct types_state { unsigned int next_version_tag; struct type_cache type_cache; - size_t num_builtins_initialized; - static_builtin_state builtins[_Py_MAX_STATIC_BUILTIN_TYPES]; + + /* Every static builtin type is initialized for each interpreter + during its own initialization, including for the main interpreter + during global runtime initialization. This is done by calling + _PyStaticType_InitBuiltin(). + + The first time a static builtin type is initialized, all the + normal PyType_Ready() stuff happens. The only difference from + normal is that there are three PyTypeObject fields holding + objects which are stored here (on PyInterpreterState) rather + than in the corresponding PyTypeObject fields. Those are: + tp_dict (cls.__dict__), tp_subclasses (cls.__subclasses__), + and tp_weaklist. + + When a subinterpreter is initialized, each static builtin type + is still initialized, but only the interpreter-specific portion, + namely those three objects. + + Those objects are stored in the PyInterpreterState.types.builtins + array, at the index corresponding to each specific static builtin + type. That index (a size_t value) is stored in the tp_subclasses + field. For static builtin types, we re-purposed the now-unused + tp_subclasses to avoid adding another field to PyTypeObject. + In all other cases tp_subclasses holds a dict like before. + (The field was previously defined as PyObject*, but is now void* + to reflect its dual use.) + + The index for each static builtin type isn't statically assigned. + Instead it is calculated the first time a type is initialized + (by the main interpreter). The index matches the order in which + the type was initialized relative to the others. The actual + value comes from the current value of num_builtins_initialized, + as each type is initialized for the main interpreter. + + num_builtins_initialized is incremented once for each static + builtin type. Once initialization is over for a subinterpreter, + the value will be the same as for all other interpreters. */ + struct { + size_t num_initialized; + managed_static_type_state initialized[_Py_MAX_MANAGED_STATIC_BUILTIN_TYPES]; + } builtins; + /* We apply a similar strategy for managed extension modules. */ + struct { + size_t num_initialized; + size_t next_index; + managed_static_type_state initialized[_Py_MAX_MANAGED_STATIC_EXT_TYPES]; + } for_extensions; + PyMutex mutex; }; @@ -73,8 +134,9 @@ struct types_state { extern PyStatus _PyTypes_InitTypes(PyInterpreterState *); extern void _PyTypes_FiniTypes(PyInterpreterState *); +extern void _PyTypes_FiniExtTypes(PyInterpreterState *interp); extern void _PyTypes_Fini(PyInterpreterState *); - +extern void _PyTypes_AfterFork(void); /* other API */ @@ -88,12 +150,31 @@ typedef struct wrapperbase pytype_slotdef; static inline PyObject ** -_PyStaticType_GET_WEAKREFS_LISTPTR(static_builtin_state *state) +_PyStaticType_GET_WEAKREFS_LISTPTR(managed_static_type_state *state) { assert(state != NULL); return &state->tp_weaklist; } +extern int _PyStaticType_InitBuiltin( + PyInterpreterState *interp, + PyTypeObject *type); +extern void _PyStaticType_FiniBuiltin( + PyInterpreterState *interp, + PyTypeObject *type); +extern void _PyStaticType_ClearWeakRefs( + PyInterpreterState *interp, + PyTypeObject *type); +extern managed_static_type_state * _PyStaticType_GetState( + PyInterpreterState *interp, + PyTypeObject *type); + +// Export for '_datetime' shared extension. +PyAPI_FUNC(int) _PyStaticType_InitForExtension( + PyInterpreterState *interp, + PyTypeObject *self); + + /* Like PyType_GetModuleState, but skips verification * that type is a heap type with an associated module */ static inline void * @@ -109,16 +190,15 @@ _PyType_GetModuleState(PyTypeObject *type) } -extern int _PyStaticType_InitBuiltin(PyInterpreterState *, PyTypeObject *type); -extern static_builtin_state * _PyStaticType_GetState(PyInterpreterState *, PyTypeObject *); -extern void _PyStaticType_ClearWeakRefs(PyInterpreterState *, PyTypeObject *type); -extern void _PyStaticType_Dealloc(PyInterpreterState *, PyTypeObject *); - +// Export for 'math' shared extension, used via _PyType_IsReady() static inline +// function PyAPI_FUNC(PyObject *) _PyType_GetDict(PyTypeObject *); + extern PyObject * _PyType_GetBases(PyTypeObject *type); extern PyObject * _PyType_GetMRO(PyTypeObject *type); extern PyObject* _PyType_GetSubclasses(PyTypeObject *); extern int _PyType_HasSubclasses(PyTypeObject *); +PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef2(PyTypeObject *, PyTypeObject *, PyModuleDef *); // PyType_Ready() must be called if _PyType_IsReady() is false. // See also the Py_TPFLAGS_READY flag. @@ -128,18 +208,35 @@ _PyType_IsReady(PyTypeObject *type) return _PyType_GetDict(type) != NULL; } -PyObject * -_Py_type_getattro_impl(PyTypeObject *type, PyObject *name, int *suppress_missing_attribute); -PyObject * -_Py_type_getattro(PyTypeObject *type, PyObject *name); +extern PyObject* _Py_type_getattro_impl(PyTypeObject *type, PyObject *name, + int *suppress_missing_attribute); +extern PyObject* _Py_type_getattro(PyObject *type, PyObject *name); + +extern PyObject* _Py_BaseObject_RichCompare(PyObject* self, PyObject* other, int op); + +extern PyObject* _Py_slot_tp_getattro(PyObject *self, PyObject *name); +extern PyObject* _Py_slot_tp_getattr_hook(PyObject *self, PyObject *name); + +extern PyTypeObject _PyBufferWrapper_Type; + +PyAPI_FUNC(PyObject*) _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, + PyObject *name, int *meth_found); + +extern PyObject* _PyType_GetFullyQualifiedName(PyTypeObject *type, char sep); -PyObject *_Py_slot_tp_getattro(PyObject *self, PyObject *name); -PyObject *_Py_slot_tp_getattr_hook(PyObject *self, PyObject *name); +// Perform the following operation, in a thread-safe way when required by the +// build mode. +// +// self->tp_flags = (self->tp_flags & ~mask) | flags; +extern void _PyType_SetFlags(PyTypeObject *self, unsigned long mask, + unsigned long flags); +extern int _PyType_AddMethod(PyTypeObject *, PyMethodDef *); -PyAPI_DATA(PyTypeObject) _PyBufferWrapper_Type; +// Like _PyType_SetFlags(), but apply the operation to self and any of its +// subclasses without Py_TPFLAGS_IMMUTABLETYPE set. +extern void _PyType_SetFlagsRecursive(PyTypeObject *self, unsigned long mask, + unsigned long flags); -PyObject * -_PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, PyObject *name, int *meth_found); #ifdef __cplusplus } diff --git a/Include/internal/pycore_typevarobject.h b/Include/internal/pycore_typevarobject.h index c9fa97d6..a368edeb 100644 --- a/Include/internal/pycore_typevarobject.h +++ b/Include/internal/pycore_typevarobject.h @@ -13,10 +13,13 @@ extern PyObject *_Py_make_paramspec(PyThreadState *, PyObject *); extern PyObject *_Py_make_typevartuple(PyThreadState *, PyObject *); extern PyObject *_Py_make_typealias(PyThreadState *, PyObject *); extern PyObject *_Py_subscript_generic(PyThreadState *, PyObject *); +extern PyObject *_Py_set_typeparam_default(PyThreadState *, PyObject *, PyObject *); extern int _Py_initialize_generic(PyInterpreterState *); extern void _Py_clear_generic_types(PyInterpreterState *); extern PyTypeObject _PyTypeAlias_Type; +extern PyTypeObject _PyNoDefault_Type; +extern PyObject _Py_NoDefaultStruct; #ifdef __cplusplus } diff --git a/Include/internal/pycore_ucnhash.h b/Include/internal/pycore_ucnhash.h index 187dd68e..1561dfbb 100644 --- a/Include/internal/pycore_ucnhash.h +++ b/Include/internal/pycore_ucnhash.h @@ -28,6 +28,8 @@ typedef struct { } _PyUnicode_Name_CAPI; +extern _PyUnicode_Name_CAPI* _PyUnicode_GetNameCAPI(void); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index 1bb0f366..173c0868 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -8,13 +8,266 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_lock.h" // PyMutex #include "pycore_fileutils.h" // _Py_error_handler +#include "pycore_identifier.h" // _Py_Identifier #include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI +#include "pycore_global_objects.h" // _Py_SINGLETON -void _PyUnicode_ExactDealloc(PyObject *op); -Py_ssize_t _PyUnicode_InternedSize(void); +/* --- Characters Type APIs ----------------------------------------------- */ -/* runtime lifecycle */ +extern int _PyUnicode_IsXidStart(Py_UCS4 ch); +extern int _PyUnicode_IsXidContinue(Py_UCS4 ch); +extern int _PyUnicode_ToLowerFull(Py_UCS4 ch, Py_UCS4 *res); +extern int _PyUnicode_ToTitleFull(Py_UCS4 ch, Py_UCS4 *res); +extern int _PyUnicode_ToUpperFull(Py_UCS4 ch, Py_UCS4 *res); +extern int _PyUnicode_ToFoldedFull(Py_UCS4 ch, Py_UCS4 *res); +extern int _PyUnicode_IsCaseIgnorable(Py_UCS4 ch); +extern int _PyUnicode_IsCased(Py_UCS4 ch); + +/* --- Unicode API -------------------------------------------------------- */ + +// Export for '_json' shared extension +PyAPI_FUNC(int) _PyUnicode_CheckConsistency( + PyObject *op, + int check_content); + +PyAPI_FUNC(void) _PyUnicode_ExactDealloc(PyObject *op); +extern Py_ssize_t _PyUnicode_InternedSize(void); +extern Py_ssize_t _PyUnicode_InternedSize_Immortal(void); + +// Get a copy of a Unicode string. +// Export for '_datetime' shared extension. +PyAPI_FUNC(PyObject*) _PyUnicode_Copy( + PyObject *unicode); + +/* Unsafe version of PyUnicode_Fill(): don't check arguments and so may crash + if parameters are invalid (e.g. if length is longer than the string). */ +extern void _PyUnicode_FastFill( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t length, + Py_UCS4 fill_char + ); + +/* Unsafe version of PyUnicode_CopyCharacters(): don't check arguments and so + may crash if parameters are invalid (e.g. if the output string + is too short). */ +extern void _PyUnicode_FastCopyCharacters( + PyObject *to, + Py_ssize_t to_start, + PyObject *from, + Py_ssize_t from_start, + Py_ssize_t how_many + ); + +/* Create a new string from a buffer of ASCII characters. + WARNING: Don't check if the string contains any non-ASCII character. */ +extern PyObject* _PyUnicode_FromASCII( + const char *buffer, + Py_ssize_t size); + +/* Compute the maximum character of the substring unicode[start:end]. + Return 127 for an empty string. */ +extern Py_UCS4 _PyUnicode_FindMaxChar ( + PyObject *unicode, + Py_ssize_t start, + Py_ssize_t end); + +/* --- _PyUnicodeWriter API ----------------------------------------------- */ + +/* Format the object based on the format_spec, as defined in PEP 3101 + (Advanced String Formatting). */ +extern int _PyUnicode_FormatAdvancedWriter( + _PyUnicodeWriter *writer, + PyObject *obj, + PyObject *format_spec, + Py_ssize_t start, + Py_ssize_t end); + +/* --- UTF-7 Codecs ------------------------------------------------------- */ + +extern PyObject* _PyUnicode_EncodeUTF7( + PyObject *unicode, /* Unicode object */ + int base64SetO, /* Encode RFC2152 Set O characters in base64 */ + int base64WhiteSpace, /* Encode whitespace (sp, ht, nl, cr) in base64 */ + const char *errors); /* error handling */ + +/* --- UTF-8 Codecs ------------------------------------------------------- */ + +// Export for '_tkinter' shared extension. +PyAPI_FUNC(PyObject*) _PyUnicode_AsUTF8String( + PyObject *unicode, + const char *errors); + +/* --- UTF-32 Codecs ------------------------------------------------------ */ + +// Export for '_tkinter' shared extension +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF32( + PyObject *object, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder); /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + +/* --- UTF-16 Codecs ------------------------------------------------------ */ + +// Returns a Python string object holding the UTF-16 encoded value of +// the Unicode data. +// +// If byteorder is not 0, output is written according to the following +// byte order: +// +// byteorder == -1: little endian +// byteorder == 0: native byte order (writes a BOM mark) +// byteorder == 1: big endian +// +// If byteorder is 0, the output string will always start with the +// Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark is +// prepended. +// +// Export for '_tkinter' shared extension +PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( + PyObject* unicode, /* Unicode object */ + const char *errors, /* error handling */ + int byteorder); /* byteorder to use 0=BOM+native;-1=LE,1=BE */ + +/* --- Unicode-Escape Codecs ---------------------------------------------- */ + +/* Variant of PyUnicode_DecodeUnicodeEscape that supports partial decoding. */ +extern PyObject* _PyUnicode_DecodeUnicodeEscapeStateful( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed); /* bytes consumed */ + +// Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape +// chars. +// Export for test_peg_generator. +PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed, /* bytes consumed */ + const char **first_invalid_escape); /* on return, points to first + invalid escaped char in + string. */ + +/* --- Raw-Unicode-Escape Codecs ---------------------------------------------- */ + +/* Variant of PyUnicode_DecodeRawUnicodeEscape that supports partial decoding. */ +extern PyObject* _PyUnicode_DecodeRawUnicodeEscapeStateful( + const char *string, /* Unicode-Escape encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed); /* bytes consumed */ + +/* --- Latin-1 Codecs ----------------------------------------------------- */ + +extern PyObject* _PyUnicode_AsLatin1String( + PyObject* unicode, + const char* errors); + +/* --- ASCII Codecs ------------------------------------------------------- */ + +extern PyObject* _PyUnicode_AsASCIIString( + PyObject* unicode, + const char* errors); + +/* --- Character Map Codecs ----------------------------------------------- */ + +/* Translate an Unicode object by applying a character mapping table to + it and return the resulting Unicode object. + + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). + + Mapping tables may be dictionaries or sequences. Unmapped character + ordinals (ones which cause a LookupError) are left untouched and + are copied as-is. +*/ +extern PyObject* _PyUnicode_EncodeCharmap( + PyObject *unicode, /* Unicode object */ + PyObject *mapping, /* encoding mapping */ + const char *errors); /* error handling */ + +/* --- Decimal Encoder ---------------------------------------------------- */ + +// Coverts a Unicode object holding a decimal value to an ASCII string +// for using in int, float and complex parsers. +// Transforms code points that have decimal digit property to the +// corresponding ASCII digit code points. Transforms spaces to ASCII. +// Transforms code points starting from the first non-ASCII code point that +// is neither a decimal digit nor a space to the end into '?'. +// +// Export for '_testinternalcapi' shared extension. +PyAPI_FUNC(PyObject*) _PyUnicode_TransformDecimalAndSpaceToASCII( + PyObject *unicode); /* Unicode object */ + +/* --- Methods & Slots ---------------------------------------------------- */ + +PyAPI_FUNC(PyObject*) _PyUnicode_JoinArray( + PyObject *separator, + PyObject *const *items, + Py_ssize_t seqlen + ); + +/* Test whether a unicode is equal to ASCII identifier. Return 1 if true, + 0 otherwise. The right argument must be ASCII identifier. + Any error occurs inside will be cleared before return. */ +extern int _PyUnicode_EqualToASCIIId( + PyObject *left, /* Left string */ + _Py_Identifier *right /* Right identifier */ + ); + +// Test whether a unicode is equal to ASCII string. Return 1 if true, +// 0 otherwise. The right argument must be ASCII-encoded string. +// Any error occurs inside will be cleared before return. +// Export for '_ctypes' shared extension +PyAPI_FUNC(int) _PyUnicode_EqualToASCIIString( + PyObject *left, + const char *right /* ASCII-encoded string */ + ); + +/* Externally visible for str.strip(unicode) */ +extern PyObject* _PyUnicode_XStrip( + PyObject *self, + int striptype, + PyObject *sepobj + ); + + +/* Using explicit passed-in values, insert the thousands grouping + into the string pointed to by buffer. For the argument descriptions, + see Objects/stringlib/localeutil.h */ +extern Py_ssize_t _PyUnicode_InsertThousandsGrouping( + _PyUnicodeWriter *writer, + Py_ssize_t n_buffer, + PyObject *digits, + Py_ssize_t d_pos, + Py_ssize_t n_digits, + Py_ssize_t min_width, + const char *grouping, + PyObject *thousands_sep, + Py_UCS4 *maxchar); + +/* --- Misc functions ----------------------------------------------------- */ + +extern PyObject* _PyUnicode_FormatLong(PyObject *, int, int, int); + +/* Fast equality check when the inputs are known to be exact unicode types + and where the hash values are equal (i.e. a very probable match) */ +extern int _PyUnicode_EQ(PyObject *, PyObject *); + +// Equality check. +// Export for '_pickle' shared extension. +PyAPI_FUNC(int) _PyUnicode_Equal(PyObject *, PyObject *); + +extern int _PyUnicode_WideCharString_Converter(PyObject *, void *); +extern int _PyUnicode_WideCharString_Opt_Converter(PyObject *, void *); + +// Export for test_peg_generator +PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); + +/* --- Runtime lifecycle -------------------------------------------------- */ extern void _PyUnicode_InitState(PyInterpreterState *); extern PyStatus _PyUnicode_InitGlobalObjects(PyInterpreterState *); @@ -24,10 +277,22 @@ extern void _PyUnicode_FiniTypes(PyInterpreterState *); extern PyTypeObject _PyUnicodeASCIIIter_Type; -/* other API */ +/* --- Interning ---------------------------------------------------------- */ + +// All these are "ref-neutral", like the public PyUnicode_InternInPlace. + +// Explicit interning routines: +PyAPI_FUNC(void) _PyUnicode_InternMortal(PyInterpreterState *interp, PyObject **); +PyAPI_FUNC(void) _PyUnicode_InternImmortal(PyInterpreterState *interp, PyObject **); +// Left here to help backporting: +PyAPI_FUNC(void) _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p); +// Only for singletons in the _PyRuntime struct: +extern void _PyUnicode_InternStatic(PyInterpreterState *interp, PyObject **); + +/* --- Other API ---------------------------------------------------------- */ struct _Py_unicode_runtime_ids { - PyThread_type_lock lock; + PyMutex mutex; // next_index value must be preserved when Py_Initialize()/Py_Finalize() // is called multiple times: see _PyUnicode_FromId() implementation. Py_ssize_t next_index; @@ -60,9 +325,12 @@ struct _Py_unicode_state { struct _Py_unicode_ids ids; }; -extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p); extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); +// Like PyUnicode_AsUTF8(), but check for embedded null characters. +// Export for '_sqlite3' shared extension. +PyAPI_FUNC(const char *) _PyUnicode_AsUTF8NoNUL(PyObject *); + #ifdef __cplusplus } diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index 9b470094..7f6b6e07 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -13,2078 +13,2965 @@ static inline void _PyUnicode_InitStaticStrings(PyInterpreterState *interp) { PyObject *string; string = &_Py_ID(CANCELLED); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(FINISHED); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(False); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(JSONDecodeError); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(PENDING); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(Py_Repr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(TextIOWrapper); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(True); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(WarningMessage); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(_); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_WindowsConsoleIO); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__IOBase_closed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abc_tpflags__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abstractmethods__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__add__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aenter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aexit__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aiter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__all__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__and__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__anext__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__annotations__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__args__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(__asyncio_running_event_loop__); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__await__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bases__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bool__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__buffer__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__build_class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__builtins__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bytes__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__call__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__cantrace__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__class_getitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classcell__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classdict__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classdictcell__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__complex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__contains__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__copy__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ctypes_from_outparam__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__del__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delete__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dict__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dictoffset__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dir__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__divmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__doc__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__enter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__eq__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__exit__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__file__); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(__firstlineno__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__float__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__floordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__format__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__fspath__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ge__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__get__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getattribute__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getinitargs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getnewargs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getnewargs_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getstate__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__gt__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__hash__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iadd__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iand__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ifloordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ilshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imatmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__import__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__index__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__init__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__init_subclass__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__instancecheck__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__int__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__invert__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ior__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ipow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__irshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__isabstractmethod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__isub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__itruediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ixor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__le__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__len__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__length_hint__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lltrace__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__loader__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lt__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__main__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(__match_args__); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__matmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__missing__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__module__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mro_entries__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__name__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ne__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__neg__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__new__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__newobj__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__newobj_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__next__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__notes__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__or__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__orig_class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__origin__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__package__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__parameters__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__path__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__pos__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__pow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__prepare__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__qualname__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__radd__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rand__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rdivmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reduce__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reduce_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__release_buffer__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__repr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reversed__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rfloordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rlshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmatmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ror__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__round__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rpow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rrshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rsub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rtruediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rxor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__set__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__set_name__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setstate__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__sizeof__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__slotnames__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__slots__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__spec__); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(__static_attributes__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__str__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__sub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__subclasscheck__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__subclasshook__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__truediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__trunc__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__type_params__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_is_unpacked_typevartuple__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_prepare_subst__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_subst__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_unpacked_tuple_args__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__warningregistry__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__weaklistoffset__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__weakref__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__xor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_abc_impl); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_abstract_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_active); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(_align_); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_annotation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_anonymous_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_argtypes_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_as_parameter_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_asyncio_future_blocking); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_blksize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_bootstrap); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_check_retval_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_dealloc_warn); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_feature_version); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(_field_types); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_fields_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_finalizing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_find_and_load); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_fix_up_module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_flags_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_get_sourcefile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_handle_fromlist); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_initializing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_io); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_is_text_encoding); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_length_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_limbo); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_lock_unlock_module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_needs_com_addref_); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(_only_immortal); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_pack_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_restype_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_showwarnmsg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_shutdown); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_slotnames); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(_strptime); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_strptime_datetime); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_swappedbytes_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_type_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_uninitialized_submodules); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_warn_unawaited_coroutine); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_xoptions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(a); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(abs_tol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(access); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(aclose); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(add); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(add_done_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(after_in_child); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(after_in_parent); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(aggregate_class); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(alias); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(allow_code); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(append); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(arg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(argdefs); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(args); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(arguments); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(argv); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(as_integer_ratio); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(asend); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ast); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(athrow); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(attribute); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(authorizer_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(autocommit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(b); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(backtick); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(base); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(before); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(big); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(binary_form); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(block); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bound); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffering); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bufsize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(builtins); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(byteorder); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bytes); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bytes_per_sep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(c); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_call); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_exception); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_return); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(cached_datetime_module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cached_statements); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cadata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cafile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call_exception_handler); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call_soon); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cancel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(capath); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(category); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cb_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(certfile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(check_same_thread); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(clear); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(close); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closefd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closure); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_argcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_cellvars); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_code); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_consts); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_exceptiontable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_filename); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_firstlineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_flags); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_freevars); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_kwonlyargcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_linetable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_names); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_nlocals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_posonlyargcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_qualname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_stacksize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_varnames); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(code); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(col_offset); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(command); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(comment_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(compile_mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(consts); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(context); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(contravariant); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cookie); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(copy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(copyreg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(coro); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(count); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(covariant); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cwd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(d); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(data); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(database); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(day); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(decode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(decoder); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(default); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(defaultaction); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(delete); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(depth); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(desired_access); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(detect_types); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(deterministic); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(device); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dict); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dictcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(difference_update); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digest); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digest_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digestmod); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(discard); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dispatch_table); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(displayhook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dklen); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(doc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dont_inherit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dst); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dst_dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(duration); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(e); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(eager_start); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(effective_ids); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(element_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(encode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(encoding); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(end_col_offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end_lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end_offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(endpos); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(entrypoint); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(env); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(errors); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(event); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(eventmask); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exc_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exc_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(excepthook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exception); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(existing_file_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(extend); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(extra_tokens); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(facility); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(false); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(family); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fanout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fd2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fdel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fget); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(file); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(file_actions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filename); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fileno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filepath); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fillvalue); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(filter); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filters); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(final); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(find_class); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fix_imports); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(flags); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(flush); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(fold); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(follow_symlinks); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(format); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(frequency); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(from_param); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromlist); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromtimestamp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromutc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(func); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(future); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(generation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(genexpr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_debug); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_event_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_source); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(getattr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(getstate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(gid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(globals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(groupindex); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(groups); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(handle); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(handle_seq); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(has_location); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hash_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(header); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(headers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hi); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(id); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(hour); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ident); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(identity_hint); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ignore); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(imag); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(importlib); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(in_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(incoming); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(indexgroup); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inf); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(infer_variance); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(inherit_handle); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inheritable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial_bytes); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(initial_owner); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(initial_state); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initval); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inner_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(input); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(insert_comments); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(insert_pis); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(instructions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(intern); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(intersection); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(interval); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(is_running); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isatty); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isinstance); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isoformat); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isolation_level); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(istext); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(item); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(items); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iter); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iterable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iterations); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(join); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(jump); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keepends); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(key); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keyfile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keys); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kind); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(kwdefaults); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(label); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lambda); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_exc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_node); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_traceback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(latin1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(leaf_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(len); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(length); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(level); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(limit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(line); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(line_buffering); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(listcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(little); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lo); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(locale); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(locals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(logoption); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(loop); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(manual_reset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mapping); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(match); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(max_length); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxdigits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxevents); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(maxlen); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxmem); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxsplit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxvalue); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(memLevel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(memlimit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(message); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(metaclass); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(metadata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(method); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(microsecond); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(milliseconds); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(minute); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mod); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(module_globals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(modules); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(month); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mro); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(msg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(mycmp); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(mutex); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(n); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(mycmp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_arg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_sequence_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_unnamed_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(name_from); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(namespace_separator); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(namespaces); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(narg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ndigits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(nested); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(new_file_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(new_limit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(newline); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(newlines); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(next); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nlocals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(node_depth); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(node_offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ns); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nstype); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(null); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(number); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(obj); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(object); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset_dst); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset_src); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(on_type_read); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(onceregistry); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(only_keys); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(oparg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(opcode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(open); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(opener); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(operation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(optimize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(options); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(order); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(origin); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(out_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(outgoing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(overlapped); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(owner); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(p); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pages); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(parent); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(password); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(path); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pattern); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(peek); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(persistent_id); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(persistent_load); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(person); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pi_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(policy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(posix); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(print_file_and_line); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(priority); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress_handler); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress_routine); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(proto); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(protocol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ps1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ps2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(query); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(quotetabs); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(r); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(raw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(read); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(read1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readall); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readinto); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readinto1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readline); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readonly); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(real); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reducer_override); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(registry); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(rel_tol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(release); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reload); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(repl); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(replace); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reserved); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(resetids); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(return); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reverse); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reversed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(s); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(salt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sched_priority); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(scheduler); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(second); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(security_attributes); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(seek); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(seekable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(selectors); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(self); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(send); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sequence); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(server_hostname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(server_side); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(session); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setpgroup); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsigdef); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsigmask); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setstate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(shape); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(show_cmd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(signed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sizehint); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(skip_file_prefixes); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sleep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sock); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sort); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(sound); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(source); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(source_traceback); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(spam); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(src); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(src_dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stacklevel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(start); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(statement); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(status); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stderr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stdin); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stdout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(step); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(steps); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(store_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strategy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strftime); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strict); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strict_mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(string); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sub_key); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(symmetric_difference_update); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tabsize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tag); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(target); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(target_is_directory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(task); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_frame); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_lasti); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_next); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tell); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(template); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(term); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(text); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(threading); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(throw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(timeout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(times); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(timetuple); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(top); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(trace_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(traceback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(trailers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(translate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(true); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(truncate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(twice); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(txt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(type_params); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tz); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(tzinfo); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tzname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(uid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(unlink); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(unraisablehook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(uri); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(usedforsecurity); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(values); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(version); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(volume); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(wait_all); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(warn_on_full_buffer); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(warnings); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(warnoptions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(wbits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(week); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(weekday); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(which); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(who); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(withdata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(writable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(write); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(write_through); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(x); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(year); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(zdict); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(empty); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_percent); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dot_locals); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(defaults); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(generic_base); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(kwdefaults); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(type_params); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(str_replace_inf); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_null); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_dictcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_genexpr); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_lambda); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_listcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_module); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_setcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_string); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_unknown); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(json_decoder); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(list_err); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(utf_8); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_open_br); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_close_br); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); } /* End auto-generated code */ #ifdef __cplusplus diff --git a/Include/internal/pycore_unionobject.h b/Include/internal/pycore_unionobject.h index 87264635..6ece7134 100644 --- a/Include/internal/pycore_unionobject.h +++ b/Include/internal/pycore_unionobject.h @@ -8,9 +8,11 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -extern PyTypeObject _PyUnion_Type; +// For extensions created by test_peg_generator +PyAPI_DATA(PyTypeObject) _PyUnion_Type; +PyAPI_FUNC(PyObject *) _Py_union_type_or(PyObject *, PyObject *); + #define _PyUnion_Check(op) Py_IS_TYPE((op), &_PyUnion_Type) -extern PyObject *_Py_union_type_or(PyObject *, PyObject *); #define _PyGenericAlias_Check(op) PyObject_TypeCheck((op), &Py_GenericAliasType) extern PyObject *_Py_subs_parameters(PyObject *, PyObject *, PyObject *, PyObject *); diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h new file mode 100644 index 00000000..1e6ef8e5 --- /dev/null +++ b/Include/internal/pycore_uop_ids.h @@ -0,0 +1,294 @@ +// This file is generated by Tools/cases_generator/uop_id_generator.py +// from: +// Python/bytecodes.c +// Do not edit! + +#ifndef Py_CORE_UOP_IDS_H +#define Py_CORE_UOP_IDS_H +#ifdef __cplusplus +extern "C" { +#endif + +#define _EXIT_TRACE 300 +#define _SET_IP 301 +#define _BEFORE_ASYNC_WITH BEFORE_ASYNC_WITH +#define _BEFORE_WITH BEFORE_WITH +#define _BINARY_OP 302 +#define _BINARY_OP_ADD_FLOAT 303 +#define _BINARY_OP_ADD_INT 304 +#define _BINARY_OP_ADD_UNICODE 305 +#define _BINARY_OP_MULTIPLY_FLOAT 306 +#define _BINARY_OP_MULTIPLY_INT 307 +#define _BINARY_OP_SUBTRACT_FLOAT 308 +#define _BINARY_OP_SUBTRACT_INT 309 +#define _BINARY_SLICE BINARY_SLICE +#define _BINARY_SUBSCR 310 +#define _BINARY_SUBSCR_DICT BINARY_SUBSCR_DICT +#define _BINARY_SUBSCR_GETITEM BINARY_SUBSCR_GETITEM +#define _BINARY_SUBSCR_LIST_INT BINARY_SUBSCR_LIST_INT +#define _BINARY_SUBSCR_STR_INT BINARY_SUBSCR_STR_INT +#define _BINARY_SUBSCR_TUPLE_INT BINARY_SUBSCR_TUPLE_INT +#define _BUILD_CONST_KEY_MAP BUILD_CONST_KEY_MAP +#define _BUILD_LIST BUILD_LIST +#define _BUILD_MAP BUILD_MAP +#define _BUILD_SET BUILD_SET +#define _BUILD_SLICE BUILD_SLICE +#define _BUILD_STRING BUILD_STRING +#define _BUILD_TUPLE BUILD_TUPLE +#define _CALL 311 +#define _CALL_ALLOC_AND_ENTER_INIT CALL_ALLOC_AND_ENTER_INIT +#define _CALL_BUILTIN_CLASS 312 +#define _CALL_BUILTIN_FAST 313 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 314 +#define _CALL_BUILTIN_O 315 +#define _CALL_FUNCTION_EX CALL_FUNCTION_EX +#define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 +#define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 +#define _CALL_ISINSTANCE CALL_ISINSTANCE +#define _CALL_KW CALL_KW +#define _CALL_LEN CALL_LEN +#define _CALL_METHOD_DESCRIPTOR_FAST 316 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 317 +#define _CALL_METHOD_DESCRIPTOR_NOARGS 318 +#define _CALL_METHOD_DESCRIPTOR_O 319 +#define _CALL_NON_PY_GENERAL 320 +#define _CALL_STR_1 321 +#define _CALL_TUPLE_1 322 +#define _CALL_TYPE_1 CALL_TYPE_1 +#define _CHECK_ATTR_CLASS 323 +#define _CHECK_ATTR_METHOD_LAZY_DICT 324 +#define _CHECK_ATTR_MODULE 325 +#define _CHECK_ATTR_WITH_HINT 326 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 327 +#define _CHECK_EG_MATCH CHECK_EG_MATCH +#define _CHECK_EXC_MATCH CHECK_EXC_MATCH +#define _CHECK_FUNCTION 328 +#define _CHECK_FUNCTION_EXACT_ARGS 329 +#define _CHECK_FUNCTION_VERSION 330 +#define _CHECK_IS_NOT_PY_CALLABLE 331 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES 332 +#define _CHECK_METHOD_VERSION 333 +#define _CHECK_PEP_523 334 +#define _CHECK_PERIODIC 335 +#define _CHECK_STACK_SPACE 336 +#define _CHECK_STACK_SPACE_OPERAND 337 +#define _CHECK_VALIDITY 338 +#define _CHECK_VALIDITY_AND_SET_IP 339 +#define _COLD_EXIT 340 +#define _COMPARE_OP 341 +#define _COMPARE_OP_FLOAT 342 +#define _COMPARE_OP_INT 343 +#define _COMPARE_OP_STR 344 +#define _CONTAINS_OP 345 +#define _CONTAINS_OP_DICT CONTAINS_OP_DICT +#define _CONTAINS_OP_SET CONTAINS_OP_SET +#define _CONVERT_VALUE CONVERT_VALUE +#define _COPY COPY +#define _COPY_FREE_VARS COPY_FREE_VARS +#define _DELETE_ATTR DELETE_ATTR +#define _DELETE_DEREF DELETE_DEREF +#define _DELETE_FAST DELETE_FAST +#define _DELETE_GLOBAL DELETE_GLOBAL +#define _DELETE_NAME DELETE_NAME +#define _DELETE_SUBSCR DELETE_SUBSCR +#define _DEOPT 346 +#define _DICT_MERGE DICT_MERGE +#define _DICT_UPDATE DICT_UPDATE +#define _DYNAMIC_EXIT 347 +#define _END_SEND END_SEND +#define _ERROR_POP_N 348 +#define _EXIT_INIT_CHECK EXIT_INIT_CHECK +#define _EXPAND_METHOD 349 +#define _FATAL_ERROR 350 +#define _FORMAT_SIMPLE FORMAT_SIMPLE +#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC +#define _FOR_ITER 351 +#define _FOR_ITER_GEN_FRAME 352 +#define _FOR_ITER_TIER_TWO 353 +#define _GET_AITER GET_AITER +#define _GET_ANEXT GET_ANEXT +#define _GET_AWAITABLE GET_AWAITABLE +#define _GET_ITER GET_ITER +#define _GET_LEN GET_LEN +#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER +#define _GUARD_BOTH_FLOAT 354 +#define _GUARD_BOTH_INT 355 +#define _GUARD_BOTH_UNICODE 356 +#define _GUARD_BUILTINS_VERSION 357 +#define _GUARD_DORV_NO_DICT 358 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 359 +#define _GUARD_GLOBALS_VERSION 360 +#define _GUARD_IS_FALSE_POP 361 +#define _GUARD_IS_NONE_POP 362 +#define _GUARD_IS_NOT_NONE_POP 363 +#define _GUARD_IS_TRUE_POP 364 +#define _GUARD_KEYS_VERSION 365 +#define _GUARD_NOS_FLOAT 366 +#define _GUARD_NOS_INT 367 +#define _GUARD_NOT_EXHAUSTED_LIST 368 +#define _GUARD_NOT_EXHAUSTED_RANGE 369 +#define _GUARD_NOT_EXHAUSTED_TUPLE 370 +#define _GUARD_TOS_FLOAT 371 +#define _GUARD_TOS_INT 372 +#define _GUARD_TYPE_VERSION 373 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 374 +#define _INIT_CALL_PY_EXACT_ARGS 375 +#define _INIT_CALL_PY_EXACT_ARGS_0 376 +#define _INIT_CALL_PY_EXACT_ARGS_1 377 +#define _INIT_CALL_PY_EXACT_ARGS_2 378 +#define _INIT_CALL_PY_EXACT_ARGS_3 379 +#define _INIT_CALL_PY_EXACT_ARGS_4 380 +#define _INSTRUMENTED_CALL INSTRUMENTED_CALL +#define _INSTRUMENTED_CALL_FUNCTION_EX INSTRUMENTED_CALL_FUNCTION_EX +#define _INSTRUMENTED_CALL_KW INSTRUMENTED_CALL_KW +#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER +#define _INSTRUMENTED_INSTRUCTION INSTRUMENTED_INSTRUCTION +#define _INSTRUMENTED_JUMP_BACKWARD INSTRUMENTED_JUMP_BACKWARD +#define _INSTRUMENTED_JUMP_FORWARD INSTRUMENTED_JUMP_FORWARD +#define _INSTRUMENTED_LOAD_SUPER_ATTR INSTRUMENTED_LOAD_SUPER_ATTR +#define _INSTRUMENTED_POP_JUMP_IF_FALSE INSTRUMENTED_POP_JUMP_IF_FALSE +#define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE +#define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE +#define _INSTRUMENTED_RESUME INSTRUMENTED_RESUME +#define _INSTRUMENTED_RETURN_CONST INSTRUMENTED_RETURN_CONST +#define _INSTRUMENTED_RETURN_VALUE INSTRUMENTED_RETURN_VALUE +#define _INSTRUMENTED_YIELD_VALUE INSTRUMENTED_YIELD_VALUE +#define _INTERNAL_INCREMENT_OPT_COUNTER 381 +#define _IS_NONE 382 +#define _IS_OP IS_OP +#define _ITER_CHECK_LIST 383 +#define _ITER_CHECK_RANGE 384 +#define _ITER_CHECK_TUPLE 385 +#define _ITER_JUMP_LIST 386 +#define _ITER_JUMP_RANGE 387 +#define _ITER_JUMP_TUPLE 388 +#define _ITER_NEXT_LIST 389 +#define _ITER_NEXT_RANGE 390 +#define _ITER_NEXT_TUPLE 391 +#define _JUMP_TO_TOP 392 +#define _LIST_APPEND LIST_APPEND +#define _LIST_EXTEND LIST_EXTEND +#define _LOAD_ASSERTION_ERROR LOAD_ASSERTION_ERROR +#define _LOAD_ATTR 393 +#define _LOAD_ATTR_CLASS 394 +#define _LOAD_ATTR_CLASS_0 395 +#define _LOAD_ATTR_CLASS_1 396 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN +#define _LOAD_ATTR_INSTANCE_VALUE 397 +#define _LOAD_ATTR_INSTANCE_VALUE_0 398 +#define _LOAD_ATTR_INSTANCE_VALUE_1 399 +#define _LOAD_ATTR_METHOD_LAZY_DICT 400 +#define _LOAD_ATTR_METHOD_NO_DICT 401 +#define _LOAD_ATTR_METHOD_WITH_VALUES 402 +#define _LOAD_ATTR_MODULE 403 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 404 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 405 +#define _LOAD_ATTR_PROPERTY LOAD_ATTR_PROPERTY +#define _LOAD_ATTR_SLOT 406 +#define _LOAD_ATTR_SLOT_0 407 +#define _LOAD_ATTR_SLOT_1 408 +#define _LOAD_ATTR_WITH_HINT 409 +#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS +#define _LOAD_CONST LOAD_CONST +#define _LOAD_CONST_INLINE 410 +#define _LOAD_CONST_INLINE_BORROW 411 +#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 412 +#define _LOAD_CONST_INLINE_WITH_NULL 413 +#define _LOAD_DEREF LOAD_DEREF +#define _LOAD_FAST 414 +#define _LOAD_FAST_0 415 +#define _LOAD_FAST_1 416 +#define _LOAD_FAST_2 417 +#define _LOAD_FAST_3 418 +#define _LOAD_FAST_4 419 +#define _LOAD_FAST_5 420 +#define _LOAD_FAST_6 421 +#define _LOAD_FAST_7 422 +#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR +#define _LOAD_FAST_CHECK LOAD_FAST_CHECK +#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST +#define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF +#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS +#define _LOAD_GLOBAL 423 +#define _LOAD_GLOBAL_BUILTINS 424 +#define _LOAD_GLOBAL_MODULE 425 +#define _LOAD_LOCALS LOAD_LOCALS +#define _LOAD_NAME LOAD_NAME +#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR +#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD +#define _MAKE_CELL MAKE_CELL +#define _MAKE_FUNCTION MAKE_FUNCTION +#define _MAP_ADD MAP_ADD +#define _MATCH_CLASS MATCH_CLASS +#define _MATCH_KEYS MATCH_KEYS +#define _MATCH_MAPPING MATCH_MAPPING +#define _MATCH_SEQUENCE MATCH_SEQUENCE +#define _NOP NOP +#define _POP_EXCEPT POP_EXCEPT +#define _POP_FRAME 426 +#define _POP_JUMP_IF_FALSE 427 +#define _POP_JUMP_IF_TRUE 428 +#define _POP_TOP POP_TOP +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 429 +#define _PUSH_EXC_INFO PUSH_EXC_INFO +#define _PUSH_FRAME 430 +#define _PUSH_NULL PUSH_NULL +#define _PY_FRAME_GENERAL 431 +#define _REPLACE_WITH_TRUE 432 +#define _RESUME_CHECK RESUME_CHECK +#define _RETURN_GENERATOR RETURN_GENERATOR +#define _SAVE_RETURN_OFFSET 433 +#define _SEND 434 +#define _SEND_GEN SEND_GEN +#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS +#define _SET_ADD SET_ADD +#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE +#define _SET_UPDATE SET_UPDATE +#define _START_EXECUTOR 435 +#define _STORE_ATTR 436 +#define _STORE_ATTR_INSTANCE_VALUE 437 +#define _STORE_ATTR_SLOT 438 +#define _STORE_ATTR_WITH_HINT STORE_ATTR_WITH_HINT +#define _STORE_DEREF STORE_DEREF +#define _STORE_FAST 439 +#define _STORE_FAST_0 440 +#define _STORE_FAST_1 441 +#define _STORE_FAST_2 442 +#define _STORE_FAST_3 443 +#define _STORE_FAST_4 444 +#define _STORE_FAST_5 445 +#define _STORE_FAST_6 446 +#define _STORE_FAST_7 447 +#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST +#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST +#define _STORE_GLOBAL STORE_GLOBAL +#define _STORE_NAME STORE_NAME +#define _STORE_SLICE STORE_SLICE +#define _STORE_SUBSCR 448 +#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT +#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT +#define _SWAP SWAP +#define _TIER2_RESUME_CHECK 449 +#define _TO_BOOL 450 +#define _TO_BOOL_BOOL TO_BOOL_BOOL +#define _TO_BOOL_INT TO_BOOL_INT +#define _TO_BOOL_LIST TO_BOOL_LIST +#define _TO_BOOL_NONE TO_BOOL_NONE +#define _TO_BOOL_STR TO_BOOL_STR +#define _UNARY_INVERT UNARY_INVERT +#define _UNARY_NEGATIVE UNARY_NEGATIVE +#define _UNARY_NOT UNARY_NOT +#define _UNPACK_EX UNPACK_EX +#define _UNPACK_SEQUENCE 451 +#define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST +#define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE +#define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE +#define _WITH_EXCEPT_START WITH_EXCEPT_START +#define _YIELD_VALUE YIELD_VALUE +#define MAX_UOP_ID 451 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CORE_UOP_IDS_H */ diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h new file mode 100644 index 00000000..02ffc769 --- /dev/null +++ b/Include/internal/pycore_uop_metadata.h @@ -0,0 +1,1006 @@ +// This file is generated by Tools/cases_generator/uop_metadata_generator.py +// from: +// Python/bytecodes.c +// Do not edit! + +#ifndef Py_CORE_UOP_METADATA_H +#define Py_CORE_UOP_METADATA_H +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "pycore_uop_ids.h" +extern const uint16_t _PyUop_Flags[MAX_UOP_ID+1]; +extern const uint8_t _PyUop_Replication[MAX_UOP_ID+1]; +extern const char * const _PyOpcode_uop_name[MAX_UOP_ID+1]; + +extern int _PyUop_num_popped(int opcode, int oparg); + +#ifdef NEED_OPCODE_METADATA +const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { + [_NOP] = HAS_PURE_FLAG, + [_RESUME_CHECK] = HAS_DEOPT_FLAG, + [_LOAD_FAST_CHECK] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_FAST_0] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_1] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_2] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_3] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_4] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_5] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_6] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_7] = HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG, + [_LOAD_FAST_AND_CLEAR] = HAS_ARG_FLAG | HAS_LOCAL_FLAG, + [_LOAD_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG, + [_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG, + [_STORE_FAST_0] = HAS_LOCAL_FLAG, + [_STORE_FAST_1] = HAS_LOCAL_FLAG, + [_STORE_FAST_2] = HAS_LOCAL_FLAG, + [_STORE_FAST_3] = HAS_LOCAL_FLAG, + [_STORE_FAST_4] = HAS_LOCAL_FLAG, + [_STORE_FAST_5] = HAS_LOCAL_FLAG, + [_STORE_FAST_6] = HAS_LOCAL_FLAG, + [_STORE_FAST_7] = HAS_LOCAL_FLAG, + [_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG, + [_STORE_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG, + [_STORE_FAST_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG, + [_POP_TOP] = HAS_PURE_FLAG, + [_PUSH_NULL] = HAS_PURE_FLAG, + [_END_SEND] = HAS_PURE_FLAG, + [_UNARY_NEGATIVE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_UNARY_NOT] = HAS_PURE_FLAG, + [_TO_BOOL] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_TO_BOOL_BOOL] = HAS_EXIT_FLAG, + [_TO_BOOL_INT] = HAS_EXIT_FLAG | HAS_ESCAPES_FLAG, + [_TO_BOOL_LIST] = HAS_EXIT_FLAG, + [_TO_BOOL_NONE] = HAS_EXIT_FLAG, + [_TO_BOOL_STR] = HAS_EXIT_FLAG | HAS_ESCAPES_FLAG, + [_REPLACE_WITH_TRUE] = 0, + [_UNARY_INVERT] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GUARD_BOTH_INT] = HAS_EXIT_FLAG, + [_GUARD_NOS_INT] = HAS_EXIT_FLAG, + [_GUARD_TOS_INT] = HAS_EXIT_FLAG, + [_BINARY_OP_MULTIPLY_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG, + [_BINARY_OP_ADD_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG, + [_BINARY_OP_SUBTRACT_INT] = HAS_ERROR_FLAG | HAS_PURE_FLAG, + [_GUARD_BOTH_FLOAT] = HAS_EXIT_FLAG, + [_GUARD_NOS_FLOAT] = HAS_EXIT_FLAG, + [_GUARD_TOS_FLOAT] = HAS_EXIT_FLAG, + [_BINARY_OP_MULTIPLY_FLOAT] = HAS_PURE_FLAG, + [_BINARY_OP_ADD_FLOAT] = HAS_PURE_FLAG, + [_BINARY_OP_SUBTRACT_FLOAT] = HAS_PURE_FLAG, + [_GUARD_BOTH_UNICODE] = HAS_EXIT_FLAG, + [_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_PURE_FLAG, + [_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_BINARY_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG, + [_BINARY_SUBSCR_STR_INT] = HAS_DEOPT_FLAG, + [_BINARY_SUBSCR_TUPLE_INT] = HAS_DEOPT_FLAG, + [_BINARY_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LIST_APPEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_SET_ADD] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG, + [_STORE_SUBSCR_DICT] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DELETE_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_INTRINSIC_1] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_INTRINSIC_2] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_POP_FRAME] = 0, + [_GET_AITER] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GET_ANEXT] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_GET_AWAITABLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_YIELD_VALUE] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, + [_POP_EXCEPT] = HAS_ESCAPES_FLAG, + [_LOAD_ASSERTION_ERROR] = 0, + [_LOAD_BUILD_CLASS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DELETE_NAME] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_UNPACK_SEQUENCE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_UNPACK_SEQUENCE_TWO_TUPLE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_UNPACK_SEQUENCE_TUPLE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_UNPACK_SEQUENCE_LIST] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_UNPACK_EX] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DELETE_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_GLOBAL] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DELETE_GLOBAL] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_LOCALS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_GLOBAL] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GUARD_GLOBALS_VERSION] = HAS_DEOPT_FLAG, + [_GUARD_BUILTINS_VERSION] = HAS_DEOPT_FLAG, + [_LOAD_GLOBAL_MODULE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_LOAD_GLOBAL_BUILTINS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_DELETE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_MAKE_CELL] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG, + [_DELETE_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_FROM_DICT_OR_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_STORE_DEREF] = HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ESCAPES_FLAG, + [_COPY_FREE_VARS] = HAS_ARG_FLAG, + [_BUILD_STRING] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_BUILD_TUPLE] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_BUILD_LIST] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_LIST_EXTEND] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_SET_UPDATE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_BUILD_MAP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_SETUP_ANNOTATIONS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_BUILD_CONST_KEY_MAP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DICT_UPDATE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_DICT_MERGE] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_MAP_ADD] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_SUPER_ATTR_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_SUPER_ATTR_METHOD] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_LOAD_ATTR] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GUARD_TYPE_VERSION] = HAS_EXIT_FLAG, + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_INSTANCE_VALUE_0] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_INSTANCE_VALUE_1] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_INSTANCE_VALUE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_OPARG_AND_1_FLAG, + [_CHECK_ATTR_MODULE] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_MODULE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_CHECK_ATTR_WITH_HINT] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_WITH_HINT] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG, + [_LOAD_ATTR_SLOT_0] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_SLOT_1] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_SLOT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_OPARG_AND_1_FLAG, + [_CHECK_ATTR_CLASS] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_CLASS_0] = 0, + [_LOAD_ATTR_CLASS_1] = 0, + [_LOAD_ATTR_CLASS] = HAS_ARG_FLAG | HAS_OPARG_AND_1_FLAG, + [_GUARD_DORV_NO_DICT] = HAS_DEOPT_FLAG, + [_STORE_ATTR_INSTANCE_VALUE] = 0, + [_STORE_ATTR_SLOT] = 0, + [_COMPARE_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_COMPARE_OP_FLOAT] = HAS_ARG_FLAG, + [_COMPARE_OP_INT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_COMPARE_OP_STR] = HAS_ARG_FLAG, + [_IS_OP] = HAS_ARG_FLAG, + [_CONTAINS_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CONTAINS_OP_SET] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CONTAINS_OP_DICT] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CHECK_EG_MATCH] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CHECK_EXC_MATCH] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_IS_NONE] = 0, + [_GET_LEN] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_MATCH_CLASS] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_MATCH_MAPPING] = 0, + [_MATCH_SEQUENCE] = 0, + [_MATCH_KEYS] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GET_ITER] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_GET_YIELD_FROM_ITER] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_FOR_ITER_TIER_TWO] = HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_ITER_CHECK_LIST] = HAS_EXIT_FLAG, + [_GUARD_NOT_EXHAUSTED_LIST] = HAS_EXIT_FLAG, + [_ITER_NEXT_LIST] = 0, + [_ITER_CHECK_TUPLE] = HAS_EXIT_FLAG, + [_GUARD_NOT_EXHAUSTED_TUPLE] = HAS_EXIT_FLAG, + [_ITER_NEXT_TUPLE] = 0, + [_ITER_CHECK_RANGE] = HAS_EXIT_FLAG, + [_GUARD_NOT_EXHAUSTED_RANGE] = HAS_EXIT_FLAG, + [_ITER_NEXT_RANGE] = HAS_ERROR_FLAG, + [_FOR_ITER_GEN_FRAME] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_WITH_EXCEPT_START] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_PUSH_EXC_INFO] = 0, + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = HAS_DEOPT_FLAG, + [_GUARD_KEYS_VERSION] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_METHOD_WITH_VALUES] = HAS_ARG_FLAG, + [_LOAD_ATTR_METHOD_NO_DICT] = HAS_ARG_FLAG, + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = HAS_ARG_FLAG, + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = HAS_ARG_FLAG, + [_CHECK_ATTR_METHOD_LAZY_DICT] = HAS_DEOPT_FLAG, + [_LOAD_ATTR_METHOD_LAZY_DICT] = HAS_ARG_FLAG, + [_CHECK_PERIODIC] = HAS_EVAL_BREAK_FLAG, + [_PY_FRAME_GENERAL] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_CHECK_FUNCTION_VERSION] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_CHECK_METHOD_VERSION] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_EXPAND_METHOD] = HAS_ARG_FLAG, + [_CHECK_IS_NOT_PY_CALLABLE] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_CALL_NON_PY_GENERAL] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = HAS_ARG_FLAG, + [_CHECK_PEP_523] = HAS_DEOPT_FLAG, + [_CHECK_FUNCTION_EXACT_ARGS] = HAS_ARG_FLAG | HAS_EXIT_FLAG, + [_CHECK_STACK_SPACE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_INIT_CALL_PY_EXACT_ARGS_0] = HAS_PURE_FLAG, + [_INIT_CALL_PY_EXACT_ARGS_1] = HAS_PURE_FLAG, + [_INIT_CALL_PY_EXACT_ARGS_2] = HAS_PURE_FLAG, + [_INIT_CALL_PY_EXACT_ARGS_3] = HAS_PURE_FLAG, + [_INIT_CALL_PY_EXACT_ARGS_4] = HAS_PURE_FLAG, + [_INIT_CALL_PY_EXACT_ARGS] = HAS_ARG_FLAG | HAS_PURE_FLAG, + [_PUSH_FRAME] = 0, + [_CALL_TYPE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG, + [_CALL_STR_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_TUPLE_1] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_EXIT_INIT_CHECK] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_CALL_BUILTIN_CLASS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_BUILTIN_O] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_BUILTIN_FAST] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_LEN] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_CALL_ISINSTANCE] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_CALL_METHOD_DESCRIPTOR_O] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_METHOD_DESCRIPTOR_NOARGS] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_CALL_METHOD_DESCRIPTOR_FAST] = HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_MAKE_FUNCTION] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_SET_FUNCTION_ATTRIBUTE] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, + [_RETURN_GENERATOR] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, + [_BUILD_SLICE] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_CONVERT_VALUE] = HAS_ARG_FLAG | HAS_ERROR_FLAG, + [_FORMAT_SIMPLE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_FORMAT_WITH_SPEC] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_COPY] = HAS_ARG_FLAG | HAS_PURE_FLAG, + [_BINARY_OP] = HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, + [_SWAP] = HAS_ARG_FLAG | HAS_PURE_FLAG, + [_GUARD_IS_TRUE_POP] = HAS_EXIT_FLAG, + [_GUARD_IS_FALSE_POP] = HAS_EXIT_FLAG, + [_GUARD_IS_NONE_POP] = HAS_EXIT_FLAG, + [_GUARD_IS_NOT_NONE_POP] = HAS_EXIT_FLAG, + [_JUMP_TO_TOP] = 0, + [_SET_IP] = 0, + [_CHECK_STACK_SPACE_OPERAND] = HAS_DEOPT_FLAG, + [_SAVE_RETURN_OFFSET] = HAS_ARG_FLAG, + [_EXIT_TRACE] = 0, + [_CHECK_VALIDITY] = HAS_DEOPT_FLAG, + [_LOAD_CONST_INLINE] = HAS_PURE_FLAG, + [_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG, + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG, + [_LOAD_CONST_INLINE_WITH_NULL] = HAS_PURE_FLAG, + [_LOAD_CONST_INLINE_BORROW_WITH_NULL] = HAS_PURE_FLAG, + [_CHECK_FUNCTION] = HAS_DEOPT_FLAG, + [_INTERNAL_INCREMENT_OPT_COUNTER] = 0, + [_COLD_EXIT] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, + [_DYNAMIC_EXIT] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, + [_START_EXECUTOR] = HAS_DEOPT_FLAG, + [_FATAL_ERROR] = 0, + [_CHECK_VALIDITY_AND_SET_IP] = HAS_DEOPT_FLAG, + [_DEOPT] = 0, + [_ERROR_POP_N] = HAS_ARG_FLAG, + [_TIER2_RESUME_CHECK] = HAS_DEOPT_FLAG, +}; + +const uint8_t _PyUop_Replication[MAX_UOP_ID+1] = { + [_LOAD_FAST] = 8, + [_STORE_FAST] = 8, + [_INIT_CALL_PY_EXACT_ARGS] = 5, +}; + +const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { + [_BINARY_OP] = "_BINARY_OP", + [_BINARY_OP_ADD_FLOAT] = "_BINARY_OP_ADD_FLOAT", + [_BINARY_OP_ADD_INT] = "_BINARY_OP_ADD_INT", + [_BINARY_OP_ADD_UNICODE] = "_BINARY_OP_ADD_UNICODE", + [_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT", + [_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT", + [_BINARY_OP_SUBTRACT_FLOAT] = "_BINARY_OP_SUBTRACT_FLOAT", + [_BINARY_OP_SUBTRACT_INT] = "_BINARY_OP_SUBTRACT_INT", + [_BINARY_SLICE] = "_BINARY_SLICE", + [_BINARY_SUBSCR] = "_BINARY_SUBSCR", + [_BINARY_SUBSCR_DICT] = "_BINARY_SUBSCR_DICT", + [_BINARY_SUBSCR_LIST_INT] = "_BINARY_SUBSCR_LIST_INT", + [_BINARY_SUBSCR_STR_INT] = "_BINARY_SUBSCR_STR_INT", + [_BINARY_SUBSCR_TUPLE_INT] = "_BINARY_SUBSCR_TUPLE_INT", + [_BUILD_CONST_KEY_MAP] = "_BUILD_CONST_KEY_MAP", + [_BUILD_LIST] = "_BUILD_LIST", + [_BUILD_MAP] = "_BUILD_MAP", + [_BUILD_SLICE] = "_BUILD_SLICE", + [_BUILD_STRING] = "_BUILD_STRING", + [_BUILD_TUPLE] = "_BUILD_TUPLE", + [_CALL_BUILTIN_CLASS] = "_CALL_BUILTIN_CLASS", + [_CALL_BUILTIN_FAST] = "_CALL_BUILTIN_FAST", + [_CALL_BUILTIN_FAST_WITH_KEYWORDS] = "_CALL_BUILTIN_FAST_WITH_KEYWORDS", + [_CALL_BUILTIN_O] = "_CALL_BUILTIN_O", + [_CALL_INTRINSIC_1] = "_CALL_INTRINSIC_1", + [_CALL_INTRINSIC_2] = "_CALL_INTRINSIC_2", + [_CALL_ISINSTANCE] = "_CALL_ISINSTANCE", + [_CALL_LEN] = "_CALL_LEN", + [_CALL_METHOD_DESCRIPTOR_FAST] = "_CALL_METHOD_DESCRIPTOR_FAST", + [_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + [_CALL_METHOD_DESCRIPTOR_NOARGS] = "_CALL_METHOD_DESCRIPTOR_NOARGS", + [_CALL_METHOD_DESCRIPTOR_O] = "_CALL_METHOD_DESCRIPTOR_O", + [_CALL_NON_PY_GENERAL] = "_CALL_NON_PY_GENERAL", + [_CALL_STR_1] = "_CALL_STR_1", + [_CALL_TUPLE_1] = "_CALL_TUPLE_1", + [_CALL_TYPE_1] = "_CALL_TYPE_1", + [_CHECK_ATTR_CLASS] = "_CHECK_ATTR_CLASS", + [_CHECK_ATTR_METHOD_LAZY_DICT] = "_CHECK_ATTR_METHOD_LAZY_DICT", + [_CHECK_ATTR_MODULE] = "_CHECK_ATTR_MODULE", + [_CHECK_ATTR_WITH_HINT] = "_CHECK_ATTR_WITH_HINT", + [_CHECK_CALL_BOUND_METHOD_EXACT_ARGS] = "_CHECK_CALL_BOUND_METHOD_EXACT_ARGS", + [_CHECK_EG_MATCH] = "_CHECK_EG_MATCH", + [_CHECK_EXC_MATCH] = "_CHECK_EXC_MATCH", + [_CHECK_FUNCTION] = "_CHECK_FUNCTION", + [_CHECK_FUNCTION_EXACT_ARGS] = "_CHECK_FUNCTION_EXACT_ARGS", + [_CHECK_FUNCTION_VERSION] = "_CHECK_FUNCTION_VERSION", + [_CHECK_IS_NOT_PY_CALLABLE] = "_CHECK_IS_NOT_PY_CALLABLE", + [_CHECK_MANAGED_OBJECT_HAS_VALUES] = "_CHECK_MANAGED_OBJECT_HAS_VALUES", + [_CHECK_METHOD_VERSION] = "_CHECK_METHOD_VERSION", + [_CHECK_PEP_523] = "_CHECK_PEP_523", + [_CHECK_PERIODIC] = "_CHECK_PERIODIC", + [_CHECK_STACK_SPACE] = "_CHECK_STACK_SPACE", + [_CHECK_STACK_SPACE_OPERAND] = "_CHECK_STACK_SPACE_OPERAND", + [_CHECK_VALIDITY] = "_CHECK_VALIDITY", + [_CHECK_VALIDITY_AND_SET_IP] = "_CHECK_VALIDITY_AND_SET_IP", + [_COLD_EXIT] = "_COLD_EXIT", + [_COMPARE_OP] = "_COMPARE_OP", + [_COMPARE_OP_FLOAT] = "_COMPARE_OP_FLOAT", + [_COMPARE_OP_INT] = "_COMPARE_OP_INT", + [_COMPARE_OP_STR] = "_COMPARE_OP_STR", + [_CONTAINS_OP] = "_CONTAINS_OP", + [_CONTAINS_OP_DICT] = "_CONTAINS_OP_DICT", + [_CONTAINS_OP_SET] = "_CONTAINS_OP_SET", + [_CONVERT_VALUE] = "_CONVERT_VALUE", + [_COPY] = "_COPY", + [_COPY_FREE_VARS] = "_COPY_FREE_VARS", + [_DELETE_ATTR] = "_DELETE_ATTR", + [_DELETE_DEREF] = "_DELETE_DEREF", + [_DELETE_FAST] = "_DELETE_FAST", + [_DELETE_GLOBAL] = "_DELETE_GLOBAL", + [_DELETE_NAME] = "_DELETE_NAME", + [_DELETE_SUBSCR] = "_DELETE_SUBSCR", + [_DEOPT] = "_DEOPT", + [_DICT_MERGE] = "_DICT_MERGE", + [_DICT_UPDATE] = "_DICT_UPDATE", + [_DYNAMIC_EXIT] = "_DYNAMIC_EXIT", + [_END_SEND] = "_END_SEND", + [_ERROR_POP_N] = "_ERROR_POP_N", + [_EXIT_INIT_CHECK] = "_EXIT_INIT_CHECK", + [_EXIT_TRACE] = "_EXIT_TRACE", + [_EXPAND_METHOD] = "_EXPAND_METHOD", + [_FATAL_ERROR] = "_FATAL_ERROR", + [_FORMAT_SIMPLE] = "_FORMAT_SIMPLE", + [_FORMAT_WITH_SPEC] = "_FORMAT_WITH_SPEC", + [_FOR_ITER_GEN_FRAME] = "_FOR_ITER_GEN_FRAME", + [_FOR_ITER_TIER_TWO] = "_FOR_ITER_TIER_TWO", + [_GET_AITER] = "_GET_AITER", + [_GET_ANEXT] = "_GET_ANEXT", + [_GET_AWAITABLE] = "_GET_AWAITABLE", + [_GET_ITER] = "_GET_ITER", + [_GET_LEN] = "_GET_LEN", + [_GET_YIELD_FROM_ITER] = "_GET_YIELD_FROM_ITER", + [_GUARD_BOTH_FLOAT] = "_GUARD_BOTH_FLOAT", + [_GUARD_BOTH_INT] = "_GUARD_BOTH_INT", + [_GUARD_BOTH_UNICODE] = "_GUARD_BOTH_UNICODE", + [_GUARD_BUILTINS_VERSION] = "_GUARD_BUILTINS_VERSION", + [_GUARD_DORV_NO_DICT] = "_GUARD_DORV_NO_DICT", + [_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT] = "_GUARD_DORV_VALUES_INST_ATTR_FROM_DICT", + [_GUARD_GLOBALS_VERSION] = "_GUARD_GLOBALS_VERSION", + [_GUARD_IS_FALSE_POP] = "_GUARD_IS_FALSE_POP", + [_GUARD_IS_NONE_POP] = "_GUARD_IS_NONE_POP", + [_GUARD_IS_NOT_NONE_POP] = "_GUARD_IS_NOT_NONE_POP", + [_GUARD_IS_TRUE_POP] = "_GUARD_IS_TRUE_POP", + [_GUARD_KEYS_VERSION] = "_GUARD_KEYS_VERSION", + [_GUARD_NOS_FLOAT] = "_GUARD_NOS_FLOAT", + [_GUARD_NOS_INT] = "_GUARD_NOS_INT", + [_GUARD_NOT_EXHAUSTED_LIST] = "_GUARD_NOT_EXHAUSTED_LIST", + [_GUARD_NOT_EXHAUSTED_RANGE] = "_GUARD_NOT_EXHAUSTED_RANGE", + [_GUARD_NOT_EXHAUSTED_TUPLE] = "_GUARD_NOT_EXHAUSTED_TUPLE", + [_GUARD_TOS_FLOAT] = "_GUARD_TOS_FLOAT", + [_GUARD_TOS_INT] = "_GUARD_TOS_INT", + [_GUARD_TYPE_VERSION] = "_GUARD_TYPE_VERSION", + [_INIT_CALL_BOUND_METHOD_EXACT_ARGS] = "_INIT_CALL_BOUND_METHOD_EXACT_ARGS", + [_INIT_CALL_PY_EXACT_ARGS] = "_INIT_CALL_PY_EXACT_ARGS", + [_INIT_CALL_PY_EXACT_ARGS_0] = "_INIT_CALL_PY_EXACT_ARGS_0", + [_INIT_CALL_PY_EXACT_ARGS_1] = "_INIT_CALL_PY_EXACT_ARGS_1", + [_INIT_CALL_PY_EXACT_ARGS_2] = "_INIT_CALL_PY_EXACT_ARGS_2", + [_INIT_CALL_PY_EXACT_ARGS_3] = "_INIT_CALL_PY_EXACT_ARGS_3", + [_INIT_CALL_PY_EXACT_ARGS_4] = "_INIT_CALL_PY_EXACT_ARGS_4", + [_INTERNAL_INCREMENT_OPT_COUNTER] = "_INTERNAL_INCREMENT_OPT_COUNTER", + [_IS_NONE] = "_IS_NONE", + [_IS_OP] = "_IS_OP", + [_ITER_CHECK_LIST] = "_ITER_CHECK_LIST", + [_ITER_CHECK_RANGE] = "_ITER_CHECK_RANGE", + [_ITER_CHECK_TUPLE] = "_ITER_CHECK_TUPLE", + [_ITER_NEXT_LIST] = "_ITER_NEXT_LIST", + [_ITER_NEXT_RANGE] = "_ITER_NEXT_RANGE", + [_ITER_NEXT_TUPLE] = "_ITER_NEXT_TUPLE", + [_JUMP_TO_TOP] = "_JUMP_TO_TOP", + [_LIST_APPEND] = "_LIST_APPEND", + [_LIST_EXTEND] = "_LIST_EXTEND", + [_LOAD_ASSERTION_ERROR] = "_LOAD_ASSERTION_ERROR", + [_LOAD_ATTR] = "_LOAD_ATTR", + [_LOAD_ATTR_CLASS] = "_LOAD_ATTR_CLASS", + [_LOAD_ATTR_CLASS_0] = "_LOAD_ATTR_CLASS_0", + [_LOAD_ATTR_CLASS_1] = "_LOAD_ATTR_CLASS_1", + [_LOAD_ATTR_INSTANCE_VALUE] = "_LOAD_ATTR_INSTANCE_VALUE", + [_LOAD_ATTR_INSTANCE_VALUE_0] = "_LOAD_ATTR_INSTANCE_VALUE_0", + [_LOAD_ATTR_INSTANCE_VALUE_1] = "_LOAD_ATTR_INSTANCE_VALUE_1", + [_LOAD_ATTR_METHOD_LAZY_DICT] = "_LOAD_ATTR_METHOD_LAZY_DICT", + [_LOAD_ATTR_METHOD_NO_DICT] = "_LOAD_ATTR_METHOD_NO_DICT", + [_LOAD_ATTR_METHOD_WITH_VALUES] = "_LOAD_ATTR_METHOD_WITH_VALUES", + [_LOAD_ATTR_MODULE] = "_LOAD_ATTR_MODULE", + [_LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = "_LOAD_ATTR_NONDESCRIPTOR_NO_DICT", + [_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = "_LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES", + [_LOAD_ATTR_SLOT] = "_LOAD_ATTR_SLOT", + [_LOAD_ATTR_SLOT_0] = "_LOAD_ATTR_SLOT_0", + [_LOAD_ATTR_SLOT_1] = "_LOAD_ATTR_SLOT_1", + [_LOAD_ATTR_WITH_HINT] = "_LOAD_ATTR_WITH_HINT", + [_LOAD_BUILD_CLASS] = "_LOAD_BUILD_CLASS", + [_LOAD_CONST] = "_LOAD_CONST", + [_LOAD_CONST_INLINE] = "_LOAD_CONST_INLINE", + [_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW", + [_LOAD_CONST_INLINE_BORROW_WITH_NULL] = "_LOAD_CONST_INLINE_BORROW_WITH_NULL", + [_LOAD_CONST_INLINE_WITH_NULL] = "_LOAD_CONST_INLINE_WITH_NULL", + [_LOAD_DEREF] = "_LOAD_DEREF", + [_LOAD_FAST] = "_LOAD_FAST", + [_LOAD_FAST_0] = "_LOAD_FAST_0", + [_LOAD_FAST_1] = "_LOAD_FAST_1", + [_LOAD_FAST_2] = "_LOAD_FAST_2", + [_LOAD_FAST_3] = "_LOAD_FAST_3", + [_LOAD_FAST_4] = "_LOAD_FAST_4", + [_LOAD_FAST_5] = "_LOAD_FAST_5", + [_LOAD_FAST_6] = "_LOAD_FAST_6", + [_LOAD_FAST_7] = "_LOAD_FAST_7", + [_LOAD_FAST_AND_CLEAR] = "_LOAD_FAST_AND_CLEAR", + [_LOAD_FAST_CHECK] = "_LOAD_FAST_CHECK", + [_LOAD_FAST_LOAD_FAST] = "_LOAD_FAST_LOAD_FAST", + [_LOAD_FROM_DICT_OR_DEREF] = "_LOAD_FROM_DICT_OR_DEREF", + [_LOAD_GLOBAL] = "_LOAD_GLOBAL", + [_LOAD_GLOBAL_BUILTINS] = "_LOAD_GLOBAL_BUILTINS", + [_LOAD_GLOBAL_MODULE] = "_LOAD_GLOBAL_MODULE", + [_LOAD_LOCALS] = "_LOAD_LOCALS", + [_LOAD_SUPER_ATTR_ATTR] = "_LOAD_SUPER_ATTR_ATTR", + [_LOAD_SUPER_ATTR_METHOD] = "_LOAD_SUPER_ATTR_METHOD", + [_MAKE_CELL] = "_MAKE_CELL", + [_MAKE_FUNCTION] = "_MAKE_FUNCTION", + [_MAP_ADD] = "_MAP_ADD", + [_MATCH_CLASS] = "_MATCH_CLASS", + [_MATCH_KEYS] = "_MATCH_KEYS", + [_MATCH_MAPPING] = "_MATCH_MAPPING", + [_MATCH_SEQUENCE] = "_MATCH_SEQUENCE", + [_NOP] = "_NOP", + [_POP_EXCEPT] = "_POP_EXCEPT", + [_POP_FRAME] = "_POP_FRAME", + [_POP_TOP] = "_POP_TOP", + [_POP_TOP_LOAD_CONST_INLINE_BORROW] = "_POP_TOP_LOAD_CONST_INLINE_BORROW", + [_PUSH_EXC_INFO] = "_PUSH_EXC_INFO", + [_PUSH_FRAME] = "_PUSH_FRAME", + [_PUSH_NULL] = "_PUSH_NULL", + [_PY_FRAME_GENERAL] = "_PY_FRAME_GENERAL", + [_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE", + [_RESUME_CHECK] = "_RESUME_CHECK", + [_RETURN_GENERATOR] = "_RETURN_GENERATOR", + [_SAVE_RETURN_OFFSET] = "_SAVE_RETURN_OFFSET", + [_SETUP_ANNOTATIONS] = "_SETUP_ANNOTATIONS", + [_SET_ADD] = "_SET_ADD", + [_SET_FUNCTION_ATTRIBUTE] = "_SET_FUNCTION_ATTRIBUTE", + [_SET_IP] = "_SET_IP", + [_SET_UPDATE] = "_SET_UPDATE", + [_START_EXECUTOR] = "_START_EXECUTOR", + [_STORE_ATTR] = "_STORE_ATTR", + [_STORE_ATTR_INSTANCE_VALUE] = "_STORE_ATTR_INSTANCE_VALUE", + [_STORE_ATTR_SLOT] = "_STORE_ATTR_SLOT", + [_STORE_DEREF] = "_STORE_DEREF", + [_STORE_FAST] = "_STORE_FAST", + [_STORE_FAST_0] = "_STORE_FAST_0", + [_STORE_FAST_1] = "_STORE_FAST_1", + [_STORE_FAST_2] = "_STORE_FAST_2", + [_STORE_FAST_3] = "_STORE_FAST_3", + [_STORE_FAST_4] = "_STORE_FAST_4", + [_STORE_FAST_5] = "_STORE_FAST_5", + [_STORE_FAST_6] = "_STORE_FAST_6", + [_STORE_FAST_7] = "_STORE_FAST_7", + [_STORE_FAST_LOAD_FAST] = "_STORE_FAST_LOAD_FAST", + [_STORE_FAST_STORE_FAST] = "_STORE_FAST_STORE_FAST", + [_STORE_GLOBAL] = "_STORE_GLOBAL", + [_STORE_NAME] = "_STORE_NAME", + [_STORE_SLICE] = "_STORE_SLICE", + [_STORE_SUBSCR] = "_STORE_SUBSCR", + [_STORE_SUBSCR_DICT] = "_STORE_SUBSCR_DICT", + [_STORE_SUBSCR_LIST_INT] = "_STORE_SUBSCR_LIST_INT", + [_SWAP] = "_SWAP", + [_TIER2_RESUME_CHECK] = "_TIER2_RESUME_CHECK", + [_TO_BOOL] = "_TO_BOOL", + [_TO_BOOL_BOOL] = "_TO_BOOL_BOOL", + [_TO_BOOL_INT] = "_TO_BOOL_INT", + [_TO_BOOL_LIST] = "_TO_BOOL_LIST", + [_TO_BOOL_NONE] = "_TO_BOOL_NONE", + [_TO_BOOL_STR] = "_TO_BOOL_STR", + [_UNARY_INVERT] = "_UNARY_INVERT", + [_UNARY_NEGATIVE] = "_UNARY_NEGATIVE", + [_UNARY_NOT] = "_UNARY_NOT", + [_UNPACK_EX] = "_UNPACK_EX", + [_UNPACK_SEQUENCE] = "_UNPACK_SEQUENCE", + [_UNPACK_SEQUENCE_LIST] = "_UNPACK_SEQUENCE_LIST", + [_UNPACK_SEQUENCE_TUPLE] = "_UNPACK_SEQUENCE_TUPLE", + [_UNPACK_SEQUENCE_TWO_TUPLE] = "_UNPACK_SEQUENCE_TWO_TUPLE", + [_WITH_EXCEPT_START] = "_WITH_EXCEPT_START", + [_YIELD_VALUE] = "_YIELD_VALUE", +}; +int _PyUop_num_popped(int opcode, int oparg) +{ + switch(opcode) { + case _NOP: + return 0; + case _RESUME_CHECK: + return 0; + case _LOAD_FAST_CHECK: + return 0; + case _LOAD_FAST_0: + return 0; + case _LOAD_FAST_1: + return 0; + case _LOAD_FAST_2: + return 0; + case _LOAD_FAST_3: + return 0; + case _LOAD_FAST_4: + return 0; + case _LOAD_FAST_5: + return 0; + case _LOAD_FAST_6: + return 0; + case _LOAD_FAST_7: + return 0; + case _LOAD_FAST: + return 0; + case _LOAD_FAST_AND_CLEAR: + return 0; + case _LOAD_FAST_LOAD_FAST: + return 0; + case _LOAD_CONST: + return 0; + case _STORE_FAST_0: + return 1; + case _STORE_FAST_1: + return 1; + case _STORE_FAST_2: + return 1; + case _STORE_FAST_3: + return 1; + case _STORE_FAST_4: + return 1; + case _STORE_FAST_5: + return 1; + case _STORE_FAST_6: + return 1; + case _STORE_FAST_7: + return 1; + case _STORE_FAST: + return 1; + case _STORE_FAST_LOAD_FAST: + return 1; + case _STORE_FAST_STORE_FAST: + return 2; + case _POP_TOP: + return 1; + case _PUSH_NULL: + return 0; + case _END_SEND: + return 2; + case _UNARY_NEGATIVE: + return 1; + case _UNARY_NOT: + return 1; + case _TO_BOOL: + return 1; + case _TO_BOOL_BOOL: + return 1; + case _TO_BOOL_INT: + return 1; + case _TO_BOOL_LIST: + return 1; + case _TO_BOOL_NONE: + return 1; + case _TO_BOOL_STR: + return 1; + case _REPLACE_WITH_TRUE: + return 1; + case _UNARY_INVERT: + return 1; + case _GUARD_BOTH_INT: + return 2; + case _GUARD_NOS_INT: + return 2; + case _GUARD_TOS_INT: + return 1; + case _BINARY_OP_MULTIPLY_INT: + return 2; + case _BINARY_OP_ADD_INT: + return 2; + case _BINARY_OP_SUBTRACT_INT: + return 2; + case _GUARD_BOTH_FLOAT: + return 2; + case _GUARD_NOS_FLOAT: + return 2; + case _GUARD_TOS_FLOAT: + return 1; + case _BINARY_OP_MULTIPLY_FLOAT: + return 2; + case _BINARY_OP_ADD_FLOAT: + return 2; + case _BINARY_OP_SUBTRACT_FLOAT: + return 2; + case _GUARD_BOTH_UNICODE: + return 2; + case _BINARY_OP_ADD_UNICODE: + return 2; + case _BINARY_SUBSCR: + return 2; + case _BINARY_SLICE: + return 3; + case _STORE_SLICE: + return 4; + case _BINARY_SUBSCR_LIST_INT: + return 2; + case _BINARY_SUBSCR_STR_INT: + return 2; + case _BINARY_SUBSCR_TUPLE_INT: + return 2; + case _BINARY_SUBSCR_DICT: + return 2; + case _LIST_APPEND: + return 2 + (oparg-1); + case _SET_ADD: + return 2 + (oparg-1); + case _STORE_SUBSCR: + return 3; + case _STORE_SUBSCR_LIST_INT: + return 3; + case _STORE_SUBSCR_DICT: + return 3; + case _DELETE_SUBSCR: + return 2; + case _CALL_INTRINSIC_1: + return 1; + case _CALL_INTRINSIC_2: + return 2; + case _POP_FRAME: + return 1; + case _GET_AITER: + return 1; + case _GET_ANEXT: + return 1; + case _GET_AWAITABLE: + return 1; + case _YIELD_VALUE: + return 1; + case _POP_EXCEPT: + return 1; + case _LOAD_ASSERTION_ERROR: + return 0; + case _LOAD_BUILD_CLASS: + return 0; + case _STORE_NAME: + return 1; + case _DELETE_NAME: + return 0; + case _UNPACK_SEQUENCE: + return 1; + case _UNPACK_SEQUENCE_TWO_TUPLE: + return 1; + case _UNPACK_SEQUENCE_TUPLE: + return 1; + case _UNPACK_SEQUENCE_LIST: + return 1; + case _UNPACK_EX: + return 1; + case _STORE_ATTR: + return 2; + case _DELETE_ATTR: + return 1; + case _STORE_GLOBAL: + return 1; + case _DELETE_GLOBAL: + return 0; + case _LOAD_LOCALS: + return 0; + case _LOAD_GLOBAL: + return 0; + case _GUARD_GLOBALS_VERSION: + return 0; + case _GUARD_BUILTINS_VERSION: + return 0; + case _LOAD_GLOBAL_MODULE: + return 0; + case _LOAD_GLOBAL_BUILTINS: + return 0; + case _DELETE_FAST: + return 0; + case _MAKE_CELL: + return 0; + case _DELETE_DEREF: + return 0; + case _LOAD_FROM_DICT_OR_DEREF: + return 1; + case _LOAD_DEREF: + return 0; + case _STORE_DEREF: + return 1; + case _COPY_FREE_VARS: + return 0; + case _BUILD_STRING: + return oparg; + case _BUILD_TUPLE: + return oparg; + case _BUILD_LIST: + return oparg; + case _LIST_EXTEND: + return 2 + (oparg-1); + case _SET_UPDATE: + return 2 + (oparg-1); + case _BUILD_MAP: + return oparg*2; + case _SETUP_ANNOTATIONS: + return 0; + case _BUILD_CONST_KEY_MAP: + return 1 + oparg; + case _DICT_UPDATE: + return 2 + (oparg - 1); + case _DICT_MERGE: + return 5 + (oparg - 1); + case _MAP_ADD: + return 3 + (oparg - 1); + case _LOAD_SUPER_ATTR_ATTR: + return 3; + case _LOAD_SUPER_ATTR_METHOD: + return 3; + case _LOAD_ATTR: + return 1; + case _GUARD_TYPE_VERSION: + return 1; + case _CHECK_MANAGED_OBJECT_HAS_VALUES: + return 1; + case _LOAD_ATTR_INSTANCE_VALUE_0: + return 1; + case _LOAD_ATTR_INSTANCE_VALUE_1: + return 1; + case _LOAD_ATTR_INSTANCE_VALUE: + return 1; + case _CHECK_ATTR_MODULE: + return 1; + case _LOAD_ATTR_MODULE: + return 1; + case _CHECK_ATTR_WITH_HINT: + return 1; + case _LOAD_ATTR_WITH_HINT: + return 1; + case _LOAD_ATTR_SLOT_0: + return 1; + case _LOAD_ATTR_SLOT_1: + return 1; + case _LOAD_ATTR_SLOT: + return 1; + case _CHECK_ATTR_CLASS: + return 1; + case _LOAD_ATTR_CLASS_0: + return 1; + case _LOAD_ATTR_CLASS_1: + return 1; + case _LOAD_ATTR_CLASS: + return 1; + case _GUARD_DORV_NO_DICT: + return 1; + case _STORE_ATTR_INSTANCE_VALUE: + return 2; + case _STORE_ATTR_SLOT: + return 2; + case _COMPARE_OP: + return 2; + case _COMPARE_OP_FLOAT: + return 2; + case _COMPARE_OP_INT: + return 2; + case _COMPARE_OP_STR: + return 2; + case _IS_OP: + return 2; + case _CONTAINS_OP: + return 2; + case _CONTAINS_OP_SET: + return 2; + case _CONTAINS_OP_DICT: + return 2; + case _CHECK_EG_MATCH: + return 2; + case _CHECK_EXC_MATCH: + return 2; + case _IS_NONE: + return 1; + case _GET_LEN: + return 1; + case _MATCH_CLASS: + return 3; + case _MATCH_MAPPING: + return 1; + case _MATCH_SEQUENCE: + return 1; + case _MATCH_KEYS: + return 2; + case _GET_ITER: + return 1; + case _GET_YIELD_FROM_ITER: + return 1; + case _FOR_ITER_TIER_TWO: + return 1; + case _ITER_CHECK_LIST: + return 1; + case _GUARD_NOT_EXHAUSTED_LIST: + return 1; + case _ITER_NEXT_LIST: + return 1; + case _ITER_CHECK_TUPLE: + return 1; + case _GUARD_NOT_EXHAUSTED_TUPLE: + return 1; + case _ITER_NEXT_TUPLE: + return 1; + case _ITER_CHECK_RANGE: + return 1; + case _GUARD_NOT_EXHAUSTED_RANGE: + return 1; + case _ITER_NEXT_RANGE: + return 1; + case _FOR_ITER_GEN_FRAME: + return 1; + case _WITH_EXCEPT_START: + return 4; + case _PUSH_EXC_INFO: + return 1; + case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT: + return 1; + case _GUARD_KEYS_VERSION: + return 1; + case _LOAD_ATTR_METHOD_WITH_VALUES: + return 1; + case _LOAD_ATTR_METHOD_NO_DICT: + return 1; + case _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES: + return 1; + case _LOAD_ATTR_NONDESCRIPTOR_NO_DICT: + return 1; + case _CHECK_ATTR_METHOD_LAZY_DICT: + return 1; + case _LOAD_ATTR_METHOD_LAZY_DICT: + return 1; + case _CHECK_PERIODIC: + return 0; + case _PY_FRAME_GENERAL: + return 2 + oparg; + case _CHECK_FUNCTION_VERSION: + return 2 + oparg; + case _CHECK_METHOD_VERSION: + return 2 + oparg; + case _EXPAND_METHOD: + return 2 + oparg; + case _CHECK_IS_NOT_PY_CALLABLE: + return 2 + oparg; + case _CALL_NON_PY_GENERAL: + return 2 + oparg; + case _CHECK_CALL_BOUND_METHOD_EXACT_ARGS: + return 2 + oparg; + case _INIT_CALL_BOUND_METHOD_EXACT_ARGS: + return 2 + oparg; + case _CHECK_PEP_523: + return 0; + case _CHECK_FUNCTION_EXACT_ARGS: + return 2 + oparg; + case _CHECK_STACK_SPACE: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS_0: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS_1: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS_2: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS_3: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS_4: + return 2 + oparg; + case _INIT_CALL_PY_EXACT_ARGS: + return 2 + oparg; + case _PUSH_FRAME: + return 1; + case _CALL_TYPE_1: + return 3; + case _CALL_STR_1: + return 3; + case _CALL_TUPLE_1: + return 3; + case _EXIT_INIT_CHECK: + return 1; + case _CALL_BUILTIN_CLASS: + return 2 + oparg; + case _CALL_BUILTIN_O: + return 2 + oparg; + case _CALL_BUILTIN_FAST: + return 2 + oparg; + case _CALL_BUILTIN_FAST_WITH_KEYWORDS: + return 2 + oparg; + case _CALL_LEN: + return 2 + oparg; + case _CALL_ISINSTANCE: + return 2 + oparg; + case _CALL_METHOD_DESCRIPTOR_O: + return 2 + oparg; + case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: + return 2 + oparg; + case _CALL_METHOD_DESCRIPTOR_NOARGS: + return 2 + oparg; + case _CALL_METHOD_DESCRIPTOR_FAST: + return 2 + oparg; + case _MAKE_FUNCTION: + return 1; + case _SET_FUNCTION_ATTRIBUTE: + return 2; + case _RETURN_GENERATOR: + return 0; + case _BUILD_SLICE: + return 2 + ((oparg == 3) ? 1 : 0); + case _CONVERT_VALUE: + return 1; + case _FORMAT_SIMPLE: + return 1; + case _FORMAT_WITH_SPEC: + return 2; + case _COPY: + return 1 + (oparg-1); + case _BINARY_OP: + return 2; + case _SWAP: + return 2 + (oparg-2); + case _GUARD_IS_TRUE_POP: + return 1; + case _GUARD_IS_FALSE_POP: + return 1; + case _GUARD_IS_NONE_POP: + return 1; + case _GUARD_IS_NOT_NONE_POP: + return 1; + case _JUMP_TO_TOP: + return 0; + case _SET_IP: + return 0; + case _CHECK_STACK_SPACE_OPERAND: + return 0; + case _SAVE_RETURN_OFFSET: + return 0; + case _EXIT_TRACE: + return 0; + case _CHECK_VALIDITY: + return 0; + case _LOAD_CONST_INLINE: + return 0; + case _LOAD_CONST_INLINE_BORROW: + return 0; + case _POP_TOP_LOAD_CONST_INLINE_BORROW: + return 1; + case _LOAD_CONST_INLINE_WITH_NULL: + return 0; + case _LOAD_CONST_INLINE_BORROW_WITH_NULL: + return 0; + case _CHECK_FUNCTION: + return 0; + case _INTERNAL_INCREMENT_OPT_COUNTER: + return 1; + case _COLD_EXIT: + return 0; + case _DYNAMIC_EXIT: + return 0; + case _START_EXECUTOR: + return 0; + case _FATAL_ERROR: + return 0; + case _CHECK_VALIDITY_AND_SET_IP: + return 0; + case _DEOPT: + return 0; + case _ERROR_POP_N: + return oparg; + case _TIER2_RESUME_CHECK: + return 0; + default: + return -1; + } +} + +#endif // NEED_OPCODE_METADATA + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_CORE_UOP_METADATA_H */ diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index efb4f1cd..f9f65593 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -14,14 +14,16 @@ struct _warnings_runtime_state { PyObject *filters; /* List */ PyObject *once_registry; /* Dict */ PyObject *default_action; /* String */ + PyMutex mutex; long filters_version; }; extern int _PyWarnings_InitState(PyInterpreterState *interp); -PyAPI_FUNC(PyObject*) _PyWarnings_Init(void); +extern PyObject* _PyWarnings_Init(void); extern void _PyErr_WarnUnawaitedCoroutine(PyObject *coro); +extern void _PyErr_WarnUnawaitedAgenMethod(PyAsyncGenObject *agen, PyObject *method); #ifdef __cplusplus } diff --git a/Include/internal/pycore_weakref.h b/Include/internal/pycore_weakref.h new file mode 100644 index 00000000..94aadb2c --- /dev/null +++ b/Include/internal/pycore_weakref.h @@ -0,0 +1,119 @@ +#ifndef Py_INTERNAL_WEAKREF_H +#define Py_INTERNAL_WEAKREF_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION() +#include "pycore_lock.h" +#include "pycore_object.h" // _Py_REF_IS_MERGED() +#include "pycore_pyatomic_ft_wrappers.h" + +#ifdef Py_GIL_DISABLED + +#define WEAKREF_LIST_LOCK(obj) \ + _PyInterpreterState_GET() \ + ->weakref_locks[((uintptr_t)obj) % NUM_WEAKREF_LIST_LOCKS] + +// Lock using the referenced object +#define LOCK_WEAKREFS(obj) \ + PyMutex_LockFlags(&WEAKREF_LIST_LOCK(obj), _Py_LOCK_DONT_DETACH) +#define UNLOCK_WEAKREFS(obj) PyMutex_Unlock(&WEAKREF_LIST_LOCK(obj)) + +// Lock using a weakref +#define LOCK_WEAKREFS_FOR_WR(wr) \ + PyMutex_LockFlags(wr->weakrefs_lock, _Py_LOCK_DONT_DETACH) +#define UNLOCK_WEAKREFS_FOR_WR(wr) PyMutex_Unlock(wr->weakrefs_lock) + +#else + +#define LOCK_WEAKREFS(obj) +#define UNLOCK_WEAKREFS(obj) + +#define LOCK_WEAKREFS_FOR_WR(wr) +#define UNLOCK_WEAKREFS_FOR_WR(wr) + +#endif + +static inline int _is_dead(PyObject *obj) +{ + // Explanation for the Py_REFCNT() check: when a weakref's target is part + // of a long chain of deallocations which triggers the trashcan mechanism, + // clearing the weakrefs can be delayed long after the target's refcount + // has dropped to zero. In the meantime, code accessing the weakref will + // be able to "see" the target object even though it is supposed to be + // unreachable. See issue gh-60806. +#if defined(Py_GIL_DISABLED) + Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&obj->ob_ref_shared); + return shared == _Py_REF_SHARED(0, _Py_REF_MERGED); +#else + return (Py_REFCNT(obj) == 0); +#endif +} + +static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) +{ + assert(PyWeakref_Check(ref_obj)); + PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); + + PyObject *obj = FT_ATOMIC_LOAD_PTR(ref->wr_object); + if (obj == Py_None) { + // clear_weakref() was called + return NULL; + } + + LOCK_WEAKREFS(obj); +#ifdef Py_GIL_DISABLED + if (ref->wr_object == Py_None) { + // clear_weakref() was called + UNLOCK_WEAKREFS(obj); + return NULL; + } +#endif + if (_Py_TryIncref(obj)) { + UNLOCK_WEAKREFS(obj); + return obj; + } + UNLOCK_WEAKREFS(obj); + return NULL; +} + +static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) +{ + assert(PyWeakref_Check(ref_obj)); + int ret = 0; + PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); + PyObject *obj = FT_ATOMIC_LOAD_PTR(ref->wr_object); + if (obj == Py_None) { + // clear_weakref() was called + ret = 1; + } + else { + LOCK_WEAKREFS(obj); + // See _PyWeakref_GET_REF() for the rationale of this test +#ifdef Py_GIL_DISABLED + ret = (ref->wr_object == Py_None) || _is_dead(obj); +#else + ret = _is_dead(obj); +#endif + UNLOCK_WEAKREFS(obj); + } + return ret; +} + +extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyObject *obj); + +// Clear all the weak references to obj but leave their callbacks uncalled and +// intact. +extern void _PyWeakref_ClearWeakRefsNoCallbacks(PyObject *obj); + +PyAPI_FUNC(int) _PyWeakref_IsDead(PyObject *weakref); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_WEAKREF_H */ diff --git a/Include/interpreteridobject.h b/Include/interpreteridobject.h deleted file mode 100644 index 8432632f..00000000 --- a/Include/interpreteridobject.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef Py_INTERPRETERIDOBJECT_H -#define Py_INTERPRETERIDOBJECT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_LIMITED_API -# define Py_CPYTHON_INTERPRETERIDOBJECT_H -# include "cpython/interpreteridobject.h" -# undef Py_CPYTHON_INTERPRETERIDOBJECT_H -#endif - -#ifdef __cplusplus -} -#endif -#endif /* !Py_INTERPRETERIDOBJECT_H */ diff --git a/Include/intrcheck.h b/Include/intrcheck.h index b8cc6560..1d1feee8 100644 --- a/Include/intrcheck.h +++ b/Include/intrcheck.h @@ -5,6 +5,7 @@ extern "C" { #endif PyAPI_FUNC(int) PyOS_InterruptOccurred(void); + #ifdef HAVE_FORK #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(void) PyOS_BeforeFork(void); @@ -12,18 +13,10 @@ PyAPI_FUNC(void) PyOS_AfterFork_Parent(void); PyAPI_FUNC(void) PyOS_AfterFork_Child(void); #endif #endif + /* Deprecated, please use PyOS_AfterFork_Child() instead */ Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyOS_AfterFork(void); -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyOS_IsMainThread(void); - -#ifdef MS_WINDOWS -/* windows.h is not included by Python.h so use void* instead of HANDLE */ -PyAPI_FUNC(void*) _PyOS_SigintEvent(void); -#endif -#endif /* !Py_LIMITED_API */ - #ifdef __cplusplus } #endif diff --git a/Include/iterobject.h b/Include/iterobject.h index fff30f71..e69d0971 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,9 +7,6 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -#ifdef Py_BUILD_CORE -extern PyTypeObject _PyAnextAwaitable_Type; -#endif #define PySeqIter_Check(op) Py_IS_TYPE((op), &PySeqIter_Type) diff --git a/Include/listobject.h b/Include/listobject.h index 6b7041ba..e1e059b0 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -29,6 +29,9 @@ PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(PyObject *) PyList_GetItemRef(PyObject *, Py_ssize_t); +#endif PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); diff --git a/Include/lock.h b/Include/lock.h new file mode 100644 index 00000000..782b9dbc --- /dev/null +++ b/Include/lock.h @@ -0,0 +1,16 @@ +#ifndef Py_LOCK_H +#define Py_LOCK_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_LOCK_H +# include "cpython/lock.h" +# undef Py_CPYTHON_LOCK_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_LOCK_H */ diff --git a/Include/longobject.h b/Include/longobject.h index e559e238..19104cd9 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -7,7 +7,7 @@ extern "C" { /* Long (arbitrary precision) integer object interface */ -PyAPI_DATA(PyTypeObject) PyLong_Type; +// PyLong_Type is declared by object.h #define PyLong_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) @@ -18,12 +18,18 @@ PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); PyAPI_FUNC(PyObject *) PyLong_FromSize_t(size_t); PyAPI_FUNC(PyObject *) PyLong_FromSsize_t(Py_ssize_t); PyAPI_FUNC(PyObject *) PyLong_FromDouble(double); + PyAPI_FUNC(long) PyLong_AsLong(PyObject *); PyAPI_FUNC(long) PyLong_AsLongAndOverflow(PyObject *, int *); PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); PyAPI_FUNC(size_t) PyLong_AsSize_t(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PyLong_AsInt(PyObject *); +#endif + PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); /* It may be useful in the future. I've added it in the PyInt -> PyLong @@ -34,7 +40,24 @@ PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); #if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT #define _Py_PARSE_PID "i" #define PyLong_FromPid PyLong_FromLong -#define PyLong_AsPid PyLong_AsLong +# if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +# define PyLong_AsPid PyLong_AsInt +# elif SIZEOF_INT == SIZEOF_LONG +# define PyLong_AsPid PyLong_AsLong +# else +static inline int +PyLong_AsPid(PyObject *obj) +{ + int overflow; + long result = PyLong_AsLongAndOverflow(obj, &overflow); + if (overflow || result > INT_MAX || result < INT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C int"); + return -1; + } + return (int)result; +} +# endif #elif SIZEOF_PID_T == SIZEOF_LONG #define _Py_PARSE_PID "l" #define PyLong_FromPid PyLong_FromLong diff --git a/Include/methodobject.h b/Include/methodobject.h index 72af5ad9..39272815 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -17,15 +17,22 @@ PyAPI_DATA(PyTypeObject) PyCFunction_Type; #define PyCFunction_Check(op) PyObject_TypeCheck((op), &PyCFunction_Type) typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); -typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); +typedef PyObject *(*PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, PyObject *); -typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, - PyObject *const *, Py_ssize_t, - PyObject *); +typedef PyObject *(*PyCFunctionFastWithKeywords) (PyObject *, + PyObject *const *, Py_ssize_t, + PyObject *); typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); +// For backwards compatibility. `METH_FASTCALL` was added to the stable API in +// 3.10 alongside `_PyCFunctionFastWithKeywords` and `_PyCFunctionFast`. +// Note that the underscore-prefixed names were documented in public docs; +// people may be using them. +typedef PyCFunctionFast _PyCFunctionFast; +typedef PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords; + // Cast an function to the PyCFunction type to use it with PyMethodDef. // // This macro can be used to prevent compiler warnings if the first parameter @@ -49,8 +56,6 @@ PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); -Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); - struct PyMethodDef { const char *ml_name; /* The name of the built-in function/method */ PyCFunction ml_meth; /* The C function that implements it */ diff --git a/Include/modsupport.h b/Include/modsupport.h index 1592bd0d..af995f56 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -1,3 +1,4 @@ +// Module support interface #ifndef Py_MODSUPPORT_H #define Py_MODSUPPORT_H @@ -5,49 +6,34 @@ extern "C" { #endif -/* Module support interface */ - -#include // va_list - -/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier - to mean Py_ssize_t */ -#ifdef PY_SSIZE_T_CLEAN -#define PyArg_Parse _PyArg_Parse_SizeT -#define PyArg_ParseTuple _PyArg_ParseTuple_SizeT -#define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT -#define PyArg_VaParse _PyArg_VaParse_SizeT -#define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT -#define Py_BuildValue _Py_BuildValue_SizeT -#define Py_VaBuildValue _Py_VaBuildValue_SizeT -#endif - -/* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */ -#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, - const char *, char **, ...); + const char *, PY_CXX_CONST char * const *, ...); PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, - const char *, char **, va_list); -#endif + const char *, PY_CXX_CONST char * const *, va_list); + PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *); PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); -PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); - - PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030a0000 // Add an attribute with name 'name' and value 'obj' to the module 'mod. -// On success, return 0 on success. +// On success, return 0. // On error, raise an exception and return -1. PyAPI_FUNC(int) PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value); #endif /* Py_LIMITED_API */ -// Similar to PyModule_AddObjectRef() but steal a reference to 'obj' -// (Py_DECREF(obj)) on success (if it returns 0). +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +// Similar to PyModule_AddObjectRef() but steal a reference to 'value'. +PyAPI_FUNC(int) PyModule_Add(PyObject *mod, const char *name, PyObject *value); +#endif /* Py_LIMITED_API */ + +// Similar to PyModule_AddObjectRef() and PyModule_Add() but steal +// a reference to 'value' on success and only on success. +// Errorprone. Should not be used in new code. PyAPI_FUNC(int) PyModule_AddObject(PyObject *mod, const char *, PyObject *value); PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); @@ -122,14 +108,6 @@ PyAPI_FUNC(int) PyModule_ExecDef(PyObject *module, PyModuleDef *def); #define PYTHON_ABI_VERSION 3 #define PYTHON_ABI_STRING "3" -#ifdef Py_TRACE_REFS - /* When we are tracing reference counts, rename module creation functions so - modules compiled with incompatible settings will generate a - link-time error. */ - #define PyModule_Create2 PyModule_Create2TraceRefs - #define PyModule_FromDefAndSpec2 PyModule_FromDefAndSpec2TraceRefs -#endif - PyAPI_FUNC(PyObject *) PyModule_Create2(PyModuleDef*, int apiver); #ifdef Py_LIMITED_API diff --git a/Include/moduleobject.h b/Include/moduleobject.h index b8bdfe29..2a17c891 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -27,11 +27,6 @@ PyAPI_FUNC(PyObject *) PyModule_GetNameObject(PyObject *); PyAPI_FUNC(const char *) PyModule_GetName(PyObject *); Py_DEPRECATED(3.2) PyAPI_FUNC(const char *) PyModule_GetFilename(PyObject *); PyAPI_FUNC(PyObject *) PyModule_GetFilenameObject(PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyModule_Clear(PyObject *); -PyAPI_FUNC(void) _PyModule_ClearDict(PyObject *); -PyAPI_FUNC(int) _PyModuleSpec_IsInitializing(PyObject *); -#endif PyAPI_FUNC(PyModuleDef*) PyModule_GetDef(PyObject*); PyAPI_FUNC(void*) PyModule_GetState(PyObject*); @@ -58,7 +53,7 @@ typedef struct PyModuleDef_Base { /* A copy of the module's __dict__ after the first time it was loaded. This is only set/used for legacy modules that do not support multiple initializations. - It is set by _PyImport_FixupExtensionObject(). */ + It is set by fix_up_extension() in import.c. */ PyObject* m_copy; } PyModuleDef_Base; @@ -78,18 +73,36 @@ struct PyModuleDef_Slot { #define Py_mod_create 1 #define Py_mod_exec 2 -#define Py_mod_multiple_interpreters 3 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030c0000 +# define Py_mod_multiple_interpreters 3 +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +# define Py_mod_gil 4 +#endif + #ifndef Py_LIMITED_API -#define _Py_mod_LAST_SLOT 3 +#define _Py_mod_LAST_SLOT 4 #endif +#endif /* New in 3.5 */ + /* for Py_mod_multiple_interpreters: */ -#define Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED ((void *)0) -#define Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED ((void *)1) -#define Py_MOD_PER_INTERPRETER_GIL_SUPPORTED ((void *)2) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030c0000 +# define Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED ((void *)0) +# define Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED ((void *)1) +# define Py_MOD_PER_INTERPRETER_GIL_SUPPORTED ((void *)2) +#endif -#endif /* New in 3.5 */ +/* for Py_mod_gil: */ +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +# define Py_MOD_GIL_USED ((void *)0) +# define Py_MOD_GIL_NOT_USED ((void *)1) +#endif + +#if !defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED) +PyAPI_FUNC(int) PyUnstable_Module_SetGIL(PyObject *module, void *gil); +#endif struct PyModuleDef { PyModuleDef_Base m_base; @@ -103,12 +116,6 @@ struct PyModuleDef { freefunc m_free; }; - -// Internal C API -#ifdef Py_BUILD_CORE -extern int _PyModule_IsExtension(PyObject *obj); -#endif - #ifdef __cplusplus } #endif diff --git a/Include/monitoring.h b/Include/monitoring.h new file mode 100644 index 00000000..985f7f23 --- /dev/null +++ b/Include/monitoring.h @@ -0,0 +1,18 @@ +#ifndef Py_MONITORING_H +#define Py_MONITORING_H +#ifdef __cplusplus +extern "C" { +#endif + +// There is currently no limited API for monitoring + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_MONITORING_H +# include "cpython/monitoring.h" +# undef Py_CPYTHON_MONITORING_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_MONITORING_H */ diff --git a/Include/object.h b/Include/object.h index 5c30c77b..b53f9acf 100644 --- a/Include/object.h +++ b/Include/object.h @@ -51,30 +51,11 @@ A standard interface exists for objects that contain an array of items whose size is determined when the object is allocated. */ -#include "pystats.h" - /* Py_DEBUG implies Py_REF_DEBUG. */ #if defined(Py_DEBUG) && !defined(Py_REF_DEBUG) # define Py_REF_DEBUG #endif -#if defined(Py_LIMITED_API) && defined(Py_TRACE_REFS) -# error Py_LIMITED_API is incompatible with Py_TRACE_REFS -#endif - -#ifdef Py_TRACE_REFS -/* Define pointers to support a doubly-linked list of all live heap objects. */ -#define _PyObject_HEAD_EXTRA \ - PyObject *_ob_next; \ - PyObject *_ob_prev; - -#define _PyObject_EXTRA_INIT _Py_NULL, _Py_NULL, - -#else -# define _PyObject_HEAD_EXTRA -# define _PyObject_EXTRA_INIT -#endif - /* PyObject_HEAD defines the initial segment of every PyObject. */ #define PyObject_HEAD PyObject ob_base; @@ -107,7 +88,7 @@ having all the lower 32 bits set, which will avoid the reference count to go beyond the refcount limit. Immortality checks for reference count decreases will be done by checking the bit sign flag in the lower 32 bits. */ -#define _Py_IMMORTAL_REFCNT UINT_MAX +#define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX) #else /* @@ -122,26 +103,41 @@ immortality, but the execution would still be correct. Reference count increases and decreases will first go through an immortality check by comparing the reference count field to the immortality reference count. */ -#define _Py_IMMORTAL_REFCNT (UINT_MAX >> 2) +#define _Py_IMMORTAL_REFCNT _Py_CAST(Py_ssize_t, UINT_MAX >> 2) +#endif + +// Py_GIL_DISABLED builds indicate immortal objects using `ob_ref_local`, which is +// always 32-bits. +#ifdef Py_GIL_DISABLED +#define _Py_IMMORTAL_REFCNT_LOCAL UINT32_MAX #endif -// Make all internal uses of PyObject_HEAD_INIT immortal while preserving the -// C-API expectation that the refcnt will be set to 1. -#ifdef Py_BUILD_CORE +// Kept for backward compatibility. It was needed by Py_TRACE_REFS build. +#define _PyObject_EXTRA_INIT + +/* Make all uses of PyObject_HEAD_INIT immortal. + * + * Statically allocated objects might be shared between + * interpreters, so must be marked as immortal. + */ +#if defined(Py_GIL_DISABLED) #define PyObject_HEAD_INIT(type) \ { \ - _PyObject_EXTRA_INIT \ - { _Py_IMMORTAL_REFCNT }, \ - (type) \ + 0, \ + 0, \ + { 0 }, \ + 0, \ + _Py_IMMORTAL_REFCNT_LOCAL, \ + 0, \ + (type), \ }, #else -#define PyObject_HEAD_INIT(type) \ - { \ - _PyObject_EXTRA_INIT \ - { 1 }, \ - (type) \ +#define PyObject_HEAD_INIT(type) \ + { \ + { _Py_IMMORTAL_REFCNT }, \ + (type) \ }, -#endif /* Py_BUILD_CORE */ +#endif #define PyVarObject_HEAD_INIT(type, size) \ { \ @@ -163,9 +159,8 @@ check by comparing the reference count field to the immortality reference count. * by hand. Similarly every pointer to a variable-size Python object can, * in addition, be cast to PyVarObject*. */ +#ifndef Py_GIL_DISABLED struct _object { - _PyObject_HEAD_EXTRA - #if (defined(__GNUC__) || defined(__clang__)) \ && !(defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L) // On C99 and older, anonymous union is a GCC and clang extension @@ -189,6 +184,39 @@ struct _object { PyTypeObject *ob_type; }; +#else +// Objects that are not owned by any thread use a thread id (tid) of zero. +// This includes both immortal objects and objects whose reference count +// fields have been merged. +#define _Py_UNOWNED_TID 0 + +// The shared reference count uses the two least-significant bits to store +// flags. The remaining bits are used to store the reference count. +#define _Py_REF_SHARED_SHIFT 2 +#define _Py_REF_SHARED_FLAG_MASK 0x3 + +// The shared flags are initialized to zero. +#define _Py_REF_SHARED_INIT 0x0 +#define _Py_REF_MAYBE_WEAKREF 0x1 +#define _Py_REF_QUEUED 0x2 +#define _Py_REF_MERGED 0x3 + +// Create a shared field from a refcnt and desired flags +#define _Py_REF_SHARED(refcnt, flags) (((refcnt) << _Py_REF_SHARED_SHIFT) + (flags)) + +struct _object { + // ob_tid stores the thread id (or zero). It is also used by the GC and the + // trashcan mechanism as a linked list pointer and by the GC to store the + // computed "gc_refs" refcount. + uintptr_t ob_tid; + uint16_t _padding; + PyMutex ob_mutex; // per-object lock + uint8_t ob_gc_bits; // gc-related state + uint32_t ob_ref_local; // local reference count + Py_ssize_t ob_ref_shared; // shared (atomic) reference count + PyTypeObject *ob_type; +}; +#endif /* Cast argument to PyObject* type. */ #define _PyObject_CAST(op) _Py_CAST(PyObject*, (op)) @@ -206,9 +234,97 @@ typedef struct { PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y); #define Py_Is(x, y) ((x) == (y)) +#if defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API) +PyAPI_FUNC(uintptr_t) _Py_GetThreadLocal_Addr(void); + +static inline uintptr_t +_Py_ThreadId(void) +{ + uintptr_t tid; +#if defined(_MSC_VER) && defined(_M_X64) + tid = __readgsqword(48); +#elif defined(_MSC_VER) && defined(_M_IX86) + tid = __readfsdword(24); +#elif defined(_MSC_VER) && defined(_M_ARM64) + tid = __getReg(18); +#elif defined(__MINGW32__) && defined(_M_X64) + tid = __readgsqword(48); +#elif defined(__MINGW32__) && defined(_M_IX86) + tid = __readfsdword(24); +#elif defined(__MINGW32__) && defined(_M_ARM64) + tid = __getReg(18); +#elif defined(__i386__) + __asm__("movl %%gs:0, %0" : "=r" (tid)); // 32-bit always uses GS +#elif defined(__MACH__) && defined(__x86_64__) + __asm__("movq %%gs:0, %0" : "=r" (tid)); // x86_64 macOSX uses GS +#elif defined(__x86_64__) + __asm__("movq %%fs:0, %0" : "=r" (tid)); // x86_64 Linux, BSD uses FS +#elif defined(__arm__) && __ARM_ARCH >= 7 + __asm__ ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tid)); +#elif defined(__aarch64__) && defined(__APPLE__) + __asm__ ("mrs %0, tpidrro_el0" : "=r" (tid)); +#elif defined(__aarch64__) + __asm__ ("mrs %0, tpidr_el0" : "=r" (tid)); +#elif defined(__powerpc64__) + #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) + tid = (uintptr_t)__builtin_thread_pointer(); + #else + // r13 is reserved for use as system thread ID by the Power 64-bit ABI. + register uintptr_t tp __asm__ ("r13"); + __asm__("" : "=r" (tp)); + tid = tp; + #endif +#elif defined(__powerpc__) + #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) + tid = (uintptr_t)__builtin_thread_pointer(); + #else + // r2 is reserved for use as system thread ID by the Power 32-bit ABI. + register uintptr_t tp __asm__ ("r2"); + __asm__ ("" : "=r" (tp)); + tid = tp; + #endif +#elif defined(__s390__) && defined(__GNUC__) + // Both GCC and Clang have supported __builtin_thread_pointer + // for s390 from long time ago. + tid = (uintptr_t)__builtin_thread_pointer(); +#elif defined(__riscv) + #if defined(__clang__) && _Py__has_builtin(__builtin_thread_pointer) + tid = (uintptr_t)__builtin_thread_pointer(); + #else + // tp is Thread Pointer provided by the RISC-V ABI. + __asm__ ("mv %0, tp" : "=r" (tid)); + #endif +#else + // Fallback to a portable implementation if we do not have a faster + // platform-specific implementation. + tid = _Py_GetThreadLocal_Addr(); +#endif + return tid; +} + +static inline Py_ALWAYS_INLINE int +_Py_IsOwnedByCurrentThread(PyObject *ob) +{ +#ifdef _Py_THREAD_SANITIZER + return _Py_atomic_load_uintptr_relaxed(&ob->ob_tid) == _Py_ThreadId(); +#else + return ob->ob_tid == _Py_ThreadId(); +#endif +} +#endif static inline Py_ssize_t Py_REFCNT(PyObject *ob) { +#if !defined(Py_GIL_DISABLED) return ob->ob_refcnt; +#else + uint32_t local = _Py_atomic_load_uint32_relaxed(&ob->ob_ref_local); + if (local == _Py_IMMORTAL_REFCNT_LOCAL) { + return _Py_IMMORTAL_REFCNT; + } + Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&ob->ob_ref_shared); + return _Py_STATIC_CAST(Py_ssize_t, local) + + Py_ARITHMETIC_RIGHT_SHIFT(Py_ssize_t, shared, _Py_REF_SHARED_SHIFT); +#endif } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_REFCNT(ob) Py_REFCNT(_PyObject_CAST(ob)) @@ -230,8 +346,7 @@ PyAPI_DATA(PyTypeObject) PyBool_Type; static inline Py_ssize_t Py_SIZE(PyObject *ob) { assert(ob->ob_type != &PyLong_Type); assert(ob->ob_type != &PyBool_Type); - PyVarObject *var_ob = _PyVarObject_CAST(ob); - return var_ob->ob_size; + return _PyVarObject_CAST(ob)->ob_size; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) @@ -239,10 +354,13 @@ static inline Py_ssize_t Py_SIZE(PyObject *ob) { static inline Py_ALWAYS_INLINE int _Py_IsImmortal(PyObject *op) { -#if SIZEOF_VOID_P > 4 - return _Py_CAST(PY_INT32_T, op->ob_refcnt) < 0; +#if defined(Py_GIL_DISABLED) + return (_Py_atomic_load_uint32_relaxed(&op->ob_ref_local) == + _Py_IMMORTAL_REFCNT_LOCAL); +#elif SIZEOF_VOID_P > 4 + return (_Py_CAST(PY_INT32_T, op->ob_refcnt) < 0); #else - return op->ob_refcnt == _Py_IMMORTAL_REFCNT; + return (op->ob_refcnt == _Py_IMMORTAL_REFCNT); #endif } #define _Py_IsImmortal(op) _Py_IsImmortal(_PyObject_CAST(op)) @@ -255,7 +373,15 @@ static inline int Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { #endif +// Py_SET_REFCNT() implementation for stable ABI +PyAPI_FUNC(void) _Py_SetRefcnt(PyObject *ob, Py_ssize_t refcnt); + static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030d0000 + // Stable ABI implements Py_SET_REFCNT() as a function call + // on limited C API version 3.13 and newer. + _Py_SetRefcnt(ob, refcnt); +#else // This immortal check is for code that is unaware of immortal objects. // The runtime tracks these objects and we should avoid as much // as possible having extensions inadvertently change the refcnt @@ -263,7 +389,33 @@ static inline void Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { if (_Py_IsImmortal(ob)) { return; } + +#ifndef Py_GIL_DISABLED ob->ob_refcnt = refcnt; +#else + if (_Py_IsOwnedByCurrentThread(ob)) { + if ((size_t)refcnt > (size_t)UINT32_MAX) { + // On overflow, make the object immortal + ob->ob_tid = _Py_UNOWNED_TID; + ob->ob_ref_local = _Py_IMMORTAL_REFCNT_LOCAL; + ob->ob_ref_shared = 0; + } + else { + // Set local refcount to desired refcount and shared refcount + // to zero, but preserve the shared refcount flags. + ob->ob_ref_local = _Py_STATIC_CAST(uint32_t, refcnt); + ob->ob_ref_shared &= _Py_REF_SHARED_FLAG_MASK; + } + } + else { + // Set local refcount to zero and shared refcount to desired refcount. + // Mark the object as merged. + ob->ob_tid = _Py_UNOWNED_TID; + ob->ob_ref_local = 0; + ob->ob_ref_shared = _Py_REF_SHARED(refcnt, _Py_REF_MERGED); + } +#endif // Py_GIL_DISABLED +#endif // Py_LIMITED_API+0 < 0x030d0000 } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_SET_REFCNT(ob, refcnt) Py_SET_REFCNT(_PyObject_CAST(ob), (refcnt)) @@ -280,7 +432,11 @@ static inline void Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { static inline void Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { assert(ob->ob_base.ob_type != &PyLong_Type); assert(ob->ob_base.ob_type != &PyBool_Type); +#ifdef Py_GIL_DISABLED + _Py_atomic_store_ssize_relaxed(&ob->ob_size, size); +#else ob->ob_size = size; +#endif } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define Py_SET_SIZE(ob, size) Py_SET_SIZE(_PyVarObject_CAST(ob), (size)) @@ -369,6 +525,10 @@ PyAPI_FUNC(void *) PyType_GetModuleState(PyTypeObject *); PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *); PyAPI_FUNC(PyObject *) PyType_GetQualName(PyTypeObject *); #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 +PyAPI_FUNC(PyObject *) PyType_GetFullyQualifiedName(PyTypeObject *type); +PyAPI_FUNC(PyObject *) PyType_GetModuleName(PyTypeObject *type); +#endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000 PyAPI_FUNC(PyObject *) PyType_FromMetaclass(PyTypeObject*, PyObject*, PyType_Spec*, PyObject*); PyAPI_FUNC(void *) PyObject_GetTypeData(PyObject *obj, PyTypeObject *cls); @@ -407,10 +567,20 @@ PyAPI_FUNC(PyObject *) PyObject_RichCompare(PyObject *, PyObject *, int); PyAPI_FUNC(int) PyObject_RichCompareBool(PyObject *, PyObject *, int); PyAPI_FUNC(PyObject *) PyObject_GetAttrString(PyObject *, const char *); PyAPI_FUNC(int) PyObject_SetAttrString(PyObject *, const char *, PyObject *); +PyAPI_FUNC(int) PyObject_DelAttrString(PyObject *v, const char *name); PyAPI_FUNC(int) PyObject_HasAttrString(PyObject *, const char *); PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PyObject_GetOptionalAttr(PyObject *, PyObject *, PyObject **); +PyAPI_FUNC(int) PyObject_GetOptionalAttrString(PyObject *, const char *, PyObject **); +#endif PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_DelAttr(PyObject *v, PyObject *name); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PyObject_HasAttrWithError(PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_HasAttrStringWithError(PyObject *, const char *); +#endif PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); @@ -431,12 +601,6 @@ PyAPI_FUNC(void) PyObject_ClearWeakRefs(PyObject *); */ PyAPI_FUNC(PyObject *) PyObject_Dir(PyObject *); -/* Pickle support. */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyObject_GetState(PyObject *); -#endif - - /* Helpers for printing recursive container types */ PyAPI_FUNC(int) Py_ReprEnter(PyObject *); PyAPI_FUNC(void) Py_ReprLeave(PyObject *); @@ -469,13 +633,18 @@ given type object has a specified feature. /* Track types initialized using _PyStaticType_InitBuiltin(). */ #define _Py_TPFLAGS_STATIC_BUILTIN (1 << 1) +/* The values array is placed inline directly after the rest of + * the object. Implies Py_TPFLAGS_HAVE_GC. + */ +#define Py_TPFLAGS_INLINE_VALUES (1 << 2) + /* Placement of weakref pointers are managed by the VM, not by the type. * The VM will automatically set tp_weaklistoffset. */ #define Py_TPFLAGS_MANAGED_WEAKREF (1 << 3) /* Placement of dict (and values) pointers are managed by the VM, not by the type. - * The VM will automatically set tp_dictoffset. + * The VM will automatically set tp_dictoffset. Implies Py_TPFLAGS_HAVE_GC. */ #define Py_TPFLAGS_MANAGED_DICT (1 << 4) @@ -528,7 +697,7 @@ given type object has a specified feature. /* Objects behave like an unbound method */ #define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17) -/* Object has up-to-date type attribute cache */ +/* Unused. Legacy flag */ #define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) /* Type is abstract and cannot be instantiated */ @@ -637,11 +806,26 @@ static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op) #else // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. -#if SIZEOF_VOID_P > 4 +#if defined(Py_GIL_DISABLED) + uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); + uint32_t new_local = local + 1; + if (new_local == 0) { + // local is equal to _Py_IMMORTAL_REFCNT: do nothing + return; + } + if (_Py_IsOwnedByCurrentThread(op)) { + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, new_local); + } + else { + _Py_atomic_add_ssize(&op->ob_ref_shared, (1 << _Py_REF_SHARED_SHIFT)); + } +#elif SIZEOF_VOID_P > 4 // Portable saturated add, branching on the carry flag and set low bits PY_UINT32_T cur_refcnt = op->ob_refcnt_split[PY_BIG_ENDIAN]; PY_UINT32_T new_refcnt = cur_refcnt + 1; if (new_refcnt == 0) { + // cur_refcnt is equal to _Py_IMMORTAL_REFCNT: the object is immortal, + // do nothing return; } op->ob_refcnt_split[PY_BIG_ENDIAN] = new_refcnt; @@ -662,6 +846,19 @@ static inline Py_ALWAYS_INLINE void Py_INCREF(PyObject *op) # define Py_INCREF(op) Py_INCREF(_PyObject_CAST(op)) #endif + +#if !defined(Py_LIMITED_API) && defined(Py_GIL_DISABLED) +// Implements Py_DECREF on objects not owned by the current thread. +PyAPI_FUNC(void) _Py_DecRefShared(PyObject *); +PyAPI_FUNC(void) _Py_DecRefSharedDebug(PyObject *, const char *, int); + +// Called from Py_DECREF by the owning thread when the local refcount reaches +// zero. The call will deallocate the object if the shared refcount is also +// zero. Otherwise, the thread gives up ownership and merges the reference +// count fields. +PyAPI_FUNC(void) _Py_MergeZeroLocalRefcount(PyObject *); +#endif + #if defined(Py_LIMITED_API) && (Py_LIMITED_API+0 >= 0x030c0000 || defined(Py_REF_DEBUG)) // Stable ABI implements Py_DECREF() as a function call on limited C API // version 3.12 and newer, and on Python built in debug mode. _Py_DecRef() was @@ -676,6 +873,52 @@ static inline void Py_DECREF(PyObject *op) { } #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) +#elif defined(Py_GIL_DISABLED) && defined(Py_REF_DEBUG) +static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) +{ + uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); + if (local == _Py_IMMORTAL_REFCNT_LOCAL) { + return; + } + _Py_DECREF_STAT_INC(); + _Py_DECREF_DecRefTotal(); + if (_Py_IsOwnedByCurrentThread(op)) { + if (local == 0) { + _Py_NegativeRefcount(filename, lineno, op); + } + local--; + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local); + if (local == 0) { + _Py_MergeZeroLocalRefcount(op); + } + } + else { + _Py_DecRefSharedDebug(op, filename, lineno); + } +} +#define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) + +#elif defined(Py_GIL_DISABLED) +static inline void Py_DECREF(PyObject *op) +{ + uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local); + if (local == _Py_IMMORTAL_REFCNT_LOCAL) { + return; + } + _Py_DECREF_STAT_INC(); + if (_Py_IsOwnedByCurrentThread(op)) { + local--; + _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local); + if (local == 0) { + _Py_MergeZeroLocalRefcount(op); + } + } + else { + _Py_DecRefShared(op); + } +} +#define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) + #elif defined(Py_REF_DEBUG) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { @@ -834,14 +1077,34 @@ static inline PyObject* _Py_XNewRef(PyObject *obj) #endif +#define Py_CONSTANT_NONE 0 +#define Py_CONSTANT_FALSE 1 +#define Py_CONSTANT_TRUE 2 +#define Py_CONSTANT_ELLIPSIS 3 +#define Py_CONSTANT_NOT_IMPLEMENTED 4 +#define Py_CONSTANT_ZERO 5 +#define Py_CONSTANT_ONE 6 +#define Py_CONSTANT_EMPTY_STR 7 +#define Py_CONSTANT_EMPTY_BYTES 8 +#define Py_CONSTANT_EMPTY_TUPLE 9 + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(PyObject*) Py_GetConstant(unsigned int constant_id); +PyAPI_FUNC(PyObject*) Py_GetConstantBorrowed(unsigned int constant_id); +#endif + + /* _Py_NoneStruct is an object of undefined type which can be used in contexts where NULL (nil) is not suitable (since NULL often means 'error'). - -Don't forget to apply Py_INCREF() when returning this value!!! */ PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ -#define Py_None (&_Py_NoneStruct) + +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 +# define Py_None Py_GetConstantBorrowed(Py_CONSTANT_NONE) +#else +# define Py_None (&_Py_NoneStruct) +#endif // Test if an object is the None singleton, the same as "x is None" in Python. PyAPI_FUNC(int) Py_IsNone(PyObject *x); @@ -855,7 +1118,12 @@ Py_NotImplemented is a singleton used to signal that an operation is not implemented for a given type combination. */ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ -#define Py_NotImplemented (&_Py_NotImplementedStruct) + +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 +# define Py_NotImplemented Py_GetConstantBorrowed(Py_CONSTANT_NOT_IMPLEMENTED) +#else +# define Py_NotImplemented (&_Py_NotImplementedStruct) +#endif /* Macro for returning Py_NotImplemented from a function */ #define Py_RETURN_NOTIMPLEMENTED return Py_NotImplemented @@ -964,7 +1232,11 @@ PyType_HasFeature(PyTypeObject *type, unsigned long feature) // PyTypeObject is opaque in the limited C API flags = PyType_GetFlags(type); #else - flags = type->tp_flags; +# ifdef Py_GIL_DISABLED + flags = _Py_atomic_load_ulong_relaxed(&type->tp_flags); +# else + flags = type->tp_flags; +# endif #endif return ((flags & feature) != 0); } @@ -988,6 +1260,10 @@ static inline int PyType_CheckExact(PyObject *op) { # define PyType_CheckExact(op) PyType_CheckExact(_PyObject_CAST(op)) #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(PyObject *) PyType_GetModuleByDef(PyTypeObject *, PyModuleDef *); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/objimpl.h b/Include/objimpl.h index ef871c5e..56472a72 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -1,12 +1,8 @@ -/* The PyObject_ memory family: high-level object memory interfaces. - See pymem.h for the low-level PyMem_ family. -*/ +// The PyObject_ memory family: high-level object memory interfaces. +// See pymem.h for the low-level PyMem_ family. #ifndef Py_OBJIMPL_H #define Py_OBJIMPL_H - -#include "pymem.h" - #ifdef __cplusplus extern "C" { #endif @@ -39,7 +35,7 @@ Functions and macros for modules that implement new object types. fields, this also fills in the ob_size field. - PyObject_Free(op) releases the memory allocated for an object. It does not - run a destructor -- it only frees the memory. PyObject_Free is identical. + run a destructor -- it only frees the memory. - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't allocate memory. Instead of a 'type' parameter, they take a pointer to a @@ -157,25 +153,6 @@ PyAPI_FUNC(int) PyGC_Enable(void); PyAPI_FUNC(int) PyGC_Disable(void); PyAPI_FUNC(int) PyGC_IsEnabled(void); - -#if !defined(Py_LIMITED_API) -/* Visit all live GC-capable objects, similar to gc.get_objects(None). The - * supplied callback is called on every such object with the void* arg set - * to the supplied arg. Returning 0 from the callback ends iteration, returning - * 1 allows iteration to continue. Returning any other value may result in - * undefined behaviour. - * - * If new objects are (de)allocated by the callback it is undefined if they - * will be visited. - - * Garbage collection is disabled during operation. Explicitly running a - * collection in the callback may lead to undefined behaviour e.g. visiting the - * same objects multiple times or not at all. - */ -typedef int (*gcvisitobjects_t)(PyObject*, void*); -PyAPI_FUNC(void) PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void* arg); -#endif - /* Test if a type has a GC head */ #define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) @@ -231,4 +208,4 @@ PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject *); #ifdef __cplusplus } #endif -#endif /* !Py_OBJIMPL_H */ +#endif // !Py_OBJIMPL_H diff --git a/Include/opcode.h b/Include/opcode.h index 9806511b..2619b690 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -1,237 +1,11 @@ -// Auto-generated by Tools/build/generate_opcode_h.py from Lib/opcode.py - #ifndef Py_OPCODE_H #define Py_OPCODE_H #ifdef __cplusplus extern "C" { #endif +#include "opcode_ids.h" -/* Instruction opcodes for compiled code */ -#define CACHE 0 -#define POP_TOP 1 -#define PUSH_NULL 2 -#define INTERPRETER_EXIT 3 -#define END_FOR 4 -#define END_SEND 5 -#define NOP 9 -#define UNARY_NEGATIVE 11 -#define UNARY_NOT 12 -#define UNARY_INVERT 15 -#define RESERVED 17 -#define BINARY_SUBSCR 25 -#define BINARY_SLICE 26 -#define STORE_SLICE 27 -#define GET_LEN 30 -#define MATCH_MAPPING 31 -#define MATCH_SEQUENCE 32 -#define MATCH_KEYS 33 -#define PUSH_EXC_INFO 35 -#define CHECK_EXC_MATCH 36 -#define CHECK_EG_MATCH 37 -#define WITH_EXCEPT_START 49 -#define GET_AITER 50 -#define GET_ANEXT 51 -#define BEFORE_ASYNC_WITH 52 -#define BEFORE_WITH 53 -#define END_ASYNC_FOR 54 -#define CLEANUP_THROW 55 -#define STORE_SUBSCR 60 -#define DELETE_SUBSCR 61 -#define GET_ITER 68 -#define GET_YIELD_FROM_ITER 69 -#define LOAD_BUILD_CLASS 71 -#define LOAD_ASSERTION_ERROR 74 -#define RETURN_GENERATOR 75 -#define RETURN_VALUE 83 -#define SETUP_ANNOTATIONS 85 -#define LOAD_LOCALS 87 -#define POP_EXCEPT 89 -#define HAVE_ARGUMENT 90 -#define STORE_NAME 90 -#define DELETE_NAME 91 -#define UNPACK_SEQUENCE 92 -#define FOR_ITER 93 -#define UNPACK_EX 94 -#define STORE_ATTR 95 -#define DELETE_ATTR 96 -#define STORE_GLOBAL 97 -#define DELETE_GLOBAL 98 -#define SWAP 99 -#define LOAD_CONST 100 -#define LOAD_NAME 101 -#define BUILD_TUPLE 102 -#define BUILD_LIST 103 -#define BUILD_SET 104 -#define BUILD_MAP 105 -#define LOAD_ATTR 106 -#define COMPARE_OP 107 -#define IMPORT_NAME 108 -#define IMPORT_FROM 109 -#define JUMP_FORWARD 110 -#define POP_JUMP_IF_FALSE 114 -#define POP_JUMP_IF_TRUE 115 -#define LOAD_GLOBAL 116 -#define IS_OP 117 -#define CONTAINS_OP 118 -#define RERAISE 119 -#define COPY 120 -#define RETURN_CONST 121 -#define BINARY_OP 122 -#define SEND 123 -#define LOAD_FAST 124 -#define STORE_FAST 125 -#define DELETE_FAST 126 -#define LOAD_FAST_CHECK 127 -#define POP_JUMP_IF_NOT_NONE 128 -#define POP_JUMP_IF_NONE 129 -#define RAISE_VARARGS 130 -#define GET_AWAITABLE 131 -#define MAKE_FUNCTION 132 -#define BUILD_SLICE 133 -#define JUMP_BACKWARD_NO_INTERRUPT 134 -#define MAKE_CELL 135 -#define LOAD_CLOSURE 136 -#define LOAD_DEREF 137 -#define STORE_DEREF 138 -#define DELETE_DEREF 139 -#define JUMP_BACKWARD 140 -#define LOAD_SUPER_ATTR 141 -#define CALL_FUNCTION_EX 142 -#define LOAD_FAST_AND_CLEAR 143 -#define EXTENDED_ARG 144 -#define LIST_APPEND 145 -#define SET_ADD 146 -#define MAP_ADD 147 -#define COPY_FREE_VARS 149 -#define YIELD_VALUE 150 -#define RESUME 151 -#define MATCH_CLASS 152 -#define FORMAT_VALUE 155 -#define BUILD_CONST_KEY_MAP 156 -#define BUILD_STRING 157 -#define LIST_EXTEND 162 -#define SET_UPDATE 163 -#define DICT_MERGE 164 -#define DICT_UPDATE 165 -#define CALL 171 -#define KW_NAMES 172 -#define CALL_INTRINSIC_1 173 -#define CALL_INTRINSIC_2 174 -#define LOAD_FROM_DICT_OR_GLOBALS 175 -#define LOAD_FROM_DICT_OR_DEREF 176 -#define MIN_INSTRUMENTED_OPCODE 237 -#define INSTRUMENTED_LOAD_SUPER_ATTR 237 -#define INSTRUMENTED_POP_JUMP_IF_NONE 238 -#define INSTRUMENTED_POP_JUMP_IF_NOT_NONE 239 -#define INSTRUMENTED_RESUME 240 -#define INSTRUMENTED_CALL 241 -#define INSTRUMENTED_RETURN_VALUE 242 -#define INSTRUMENTED_YIELD_VALUE 243 -#define INSTRUMENTED_CALL_FUNCTION_EX 244 -#define INSTRUMENTED_JUMP_FORWARD 245 -#define INSTRUMENTED_JUMP_BACKWARD 246 -#define INSTRUMENTED_RETURN_CONST 247 -#define INSTRUMENTED_FOR_ITER 248 -#define INSTRUMENTED_POP_JUMP_IF_FALSE 249 -#define INSTRUMENTED_POP_JUMP_IF_TRUE 250 -#define INSTRUMENTED_END_FOR 251 -#define INSTRUMENTED_END_SEND 252 -#define INSTRUMENTED_INSTRUCTION 253 -#define INSTRUMENTED_LINE 254 -#define MIN_PSEUDO_OPCODE 256 -#define SETUP_FINALLY 256 -#define SETUP_CLEANUP 257 -#define SETUP_WITH 258 -#define POP_BLOCK 259 -#define JUMP 260 -#define JUMP_NO_INTERRUPT 261 -#define LOAD_METHOD 262 -#define LOAD_SUPER_METHOD 263 -#define LOAD_ZERO_SUPER_METHOD 264 -#define LOAD_ZERO_SUPER_ATTR 265 -#define STORE_FAST_MAYBE_NULL 266 -#define MAX_PSEUDO_OPCODE 266 -#define BINARY_OP_ADD_FLOAT 6 -#define BINARY_OP_ADD_INT 7 -#define BINARY_OP_ADD_UNICODE 8 -#define BINARY_OP_INPLACE_ADD_UNICODE 10 -#define BINARY_OP_MULTIPLY_FLOAT 13 -#define BINARY_OP_MULTIPLY_INT 14 -#define BINARY_OP_SUBTRACT_FLOAT 16 -#define BINARY_OP_SUBTRACT_INT 18 -#define BINARY_SUBSCR_DICT 19 -#define BINARY_SUBSCR_GETITEM 20 -#define BINARY_SUBSCR_LIST_INT 21 -#define BINARY_SUBSCR_TUPLE_INT 22 -#define CALL_PY_EXACT_ARGS 23 -#define CALL_PY_WITH_DEFAULTS 24 -#define CALL_BOUND_METHOD_EXACT_ARGS 28 -#define CALL_BUILTIN_CLASS 29 -#define CALL_BUILTIN_FAST_WITH_KEYWORDS 34 -#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 38 -#define CALL_NO_KW_BUILTIN_FAST 39 -#define CALL_NO_KW_BUILTIN_O 40 -#define CALL_NO_KW_ISINSTANCE 41 -#define CALL_NO_KW_LEN 42 -#define CALL_NO_KW_LIST_APPEND 43 -#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 44 -#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 45 -#define CALL_NO_KW_METHOD_DESCRIPTOR_O 46 -#define CALL_NO_KW_STR_1 47 -#define CALL_NO_KW_TUPLE_1 48 -#define CALL_NO_KW_TYPE_1 56 -#define COMPARE_OP_FLOAT 57 -#define COMPARE_OP_INT 58 -#define COMPARE_OP_STR 59 -#define FOR_ITER_LIST 62 -#define FOR_ITER_TUPLE 63 -#define FOR_ITER_RANGE 64 -#define FOR_ITER_GEN 65 -#define LOAD_SUPER_ATTR_ATTR 66 -#define LOAD_SUPER_ATTR_METHOD 67 -#define LOAD_ATTR_CLASS 70 -#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 72 -#define LOAD_ATTR_INSTANCE_VALUE 73 -#define LOAD_ATTR_MODULE 76 -#define LOAD_ATTR_PROPERTY 77 -#define LOAD_ATTR_SLOT 78 -#define LOAD_ATTR_WITH_HINT 79 -#define LOAD_ATTR_METHOD_LAZY_DICT 80 -#define LOAD_ATTR_METHOD_NO_DICT 81 -#define LOAD_ATTR_METHOD_WITH_VALUES 82 -#define LOAD_CONST__LOAD_FAST 84 -#define LOAD_FAST__LOAD_CONST 86 -#define LOAD_FAST__LOAD_FAST 88 -#define LOAD_GLOBAL_BUILTIN 111 -#define LOAD_GLOBAL_MODULE 112 -#define STORE_ATTR_INSTANCE_VALUE 113 -#define STORE_ATTR_SLOT 148 -#define STORE_ATTR_WITH_HINT 153 -#define STORE_FAST__LOAD_FAST 154 -#define STORE_FAST__STORE_FAST 158 -#define STORE_SUBSCR_DICT 159 -#define STORE_SUBSCR_LIST_INT 160 -#define UNPACK_SEQUENCE_LIST 161 -#define UNPACK_SEQUENCE_TUPLE 166 -#define UNPACK_SEQUENCE_TWO_TUPLE 167 -#define SEND_GEN 168 - -#define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\ - || ((op) == JUMP) \ - || ((op) == JUMP_NO_INTERRUPT) \ - || ((op) == LOAD_METHOD) \ - || ((op) == LOAD_SUPER_METHOD) \ - || ((op) == LOAD_ZERO_SUPER_METHOD) \ - || ((op) == LOAD_ZERO_SUPER_ATTR) \ - || ((op) == STORE_FAST_MAYBE_NULL) \ - ) - -#define HAS_CONST(op) (false\ - || ((op) == LOAD_CONST) \ - || ((op) == RETURN_CONST) \ - || ((op) == KW_NAMES) \ - ) #define NB_ADD 0 #define NB_AND 1 @@ -260,10 +34,7 @@ extern "C" { #define NB_INPLACE_TRUE_DIVIDE 24 #define NB_INPLACE_XOR 25 -/* Defined in Lib/opcode.py */ -#define ENABLE_SPECIALIZATION 1 - -#define IS_PSEUDO_OPCODE(op) (((op) >= MIN_PSEUDO_OPCODE) && ((op) <= MAX_PSEUDO_OPCODE)) +#define NB_OPARG_LAST 25 #ifdef __cplusplus } diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h new file mode 100644 index 00000000..647f7c0e --- /dev/null +++ b/Include/opcode_ids.h @@ -0,0 +1,244 @@ +// This file is generated by Tools/cases_generator/opcode_id_generator.py +// from: +// Python/bytecodes.c +// Do not edit! + +#ifndef Py_OPCODE_IDS_H +#define Py_OPCODE_IDS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* Instruction opcodes for compiled code */ +#define CACHE 0 +#define BEFORE_ASYNC_WITH 1 +#define BEFORE_WITH 2 +#define BINARY_OP_INPLACE_ADD_UNICODE 3 +#define BINARY_SLICE 4 +#define BINARY_SUBSCR 5 +#define CHECK_EG_MATCH 6 +#define CHECK_EXC_MATCH 7 +#define CLEANUP_THROW 8 +#define DELETE_SUBSCR 9 +#define END_ASYNC_FOR 10 +#define END_FOR 11 +#define END_SEND 12 +#define EXIT_INIT_CHECK 13 +#define FORMAT_SIMPLE 14 +#define FORMAT_WITH_SPEC 15 +#define GET_AITER 16 +#define RESERVED 17 +#define GET_ANEXT 18 +#define GET_ITER 19 +#define GET_LEN 20 +#define GET_YIELD_FROM_ITER 21 +#define INTERPRETER_EXIT 22 +#define LOAD_ASSERTION_ERROR 23 +#define LOAD_BUILD_CLASS 24 +#define LOAD_LOCALS 25 +#define MAKE_FUNCTION 26 +#define MATCH_KEYS 27 +#define MATCH_MAPPING 28 +#define MATCH_SEQUENCE 29 +#define NOP 30 +#define POP_EXCEPT 31 +#define POP_TOP 32 +#define PUSH_EXC_INFO 33 +#define PUSH_NULL 34 +#define RETURN_GENERATOR 35 +#define RETURN_VALUE 36 +#define SETUP_ANNOTATIONS 37 +#define STORE_SLICE 38 +#define STORE_SUBSCR 39 +#define TO_BOOL 40 +#define UNARY_INVERT 41 +#define UNARY_NEGATIVE 42 +#define UNARY_NOT 43 +#define WITH_EXCEPT_START 44 +#define BINARY_OP 45 +#define BUILD_CONST_KEY_MAP 46 +#define BUILD_LIST 47 +#define BUILD_MAP 48 +#define BUILD_SET 49 +#define BUILD_SLICE 50 +#define BUILD_STRING 51 +#define BUILD_TUPLE 52 +#define CALL 53 +#define CALL_FUNCTION_EX 54 +#define CALL_INTRINSIC_1 55 +#define CALL_INTRINSIC_2 56 +#define CALL_KW 57 +#define COMPARE_OP 58 +#define CONTAINS_OP 59 +#define CONVERT_VALUE 60 +#define COPY 61 +#define COPY_FREE_VARS 62 +#define DELETE_ATTR 63 +#define DELETE_DEREF 64 +#define DELETE_FAST 65 +#define DELETE_GLOBAL 66 +#define DELETE_NAME 67 +#define DICT_MERGE 68 +#define DICT_UPDATE 69 +#define ENTER_EXECUTOR 70 +#define EXTENDED_ARG 71 +#define FOR_ITER 72 +#define GET_AWAITABLE 73 +#define IMPORT_FROM 74 +#define IMPORT_NAME 75 +#define IS_OP 76 +#define JUMP_BACKWARD 77 +#define JUMP_BACKWARD_NO_INTERRUPT 78 +#define JUMP_FORWARD 79 +#define LIST_APPEND 80 +#define LIST_EXTEND 81 +#define LOAD_ATTR 82 +#define LOAD_CONST 83 +#define LOAD_DEREF 84 +#define LOAD_FAST 85 +#define LOAD_FAST_AND_CLEAR 86 +#define LOAD_FAST_CHECK 87 +#define LOAD_FAST_LOAD_FAST 88 +#define LOAD_FROM_DICT_OR_DEREF 89 +#define LOAD_FROM_DICT_OR_GLOBALS 90 +#define LOAD_GLOBAL 91 +#define LOAD_NAME 92 +#define LOAD_SUPER_ATTR 93 +#define MAKE_CELL 94 +#define MAP_ADD 95 +#define MATCH_CLASS 96 +#define POP_JUMP_IF_FALSE 97 +#define POP_JUMP_IF_NONE 98 +#define POP_JUMP_IF_NOT_NONE 99 +#define POP_JUMP_IF_TRUE 100 +#define RAISE_VARARGS 101 +#define RERAISE 102 +#define RETURN_CONST 103 +#define SEND 104 +#define SET_ADD 105 +#define SET_FUNCTION_ATTRIBUTE 106 +#define SET_UPDATE 107 +#define STORE_ATTR 108 +#define STORE_DEREF 109 +#define STORE_FAST 110 +#define STORE_FAST_LOAD_FAST 111 +#define STORE_FAST_STORE_FAST 112 +#define STORE_GLOBAL 113 +#define STORE_NAME 114 +#define SWAP 115 +#define UNPACK_EX 116 +#define UNPACK_SEQUENCE 117 +#define YIELD_VALUE 118 +#define RESUME 149 +#define BINARY_OP_ADD_FLOAT 150 +#define BINARY_OP_ADD_INT 151 +#define BINARY_OP_ADD_UNICODE 152 +#define BINARY_OP_MULTIPLY_FLOAT 153 +#define BINARY_OP_MULTIPLY_INT 154 +#define BINARY_OP_SUBTRACT_FLOAT 155 +#define BINARY_OP_SUBTRACT_INT 156 +#define BINARY_SUBSCR_DICT 157 +#define BINARY_SUBSCR_GETITEM 158 +#define BINARY_SUBSCR_LIST_INT 159 +#define BINARY_SUBSCR_STR_INT 160 +#define BINARY_SUBSCR_TUPLE_INT 161 +#define CALL_ALLOC_AND_ENTER_INIT 162 +#define CALL_BOUND_METHOD_EXACT_ARGS 163 +#define CALL_BOUND_METHOD_GENERAL 164 +#define CALL_BUILTIN_CLASS 165 +#define CALL_BUILTIN_FAST 166 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 167 +#define CALL_BUILTIN_O 168 +#define CALL_ISINSTANCE 169 +#define CALL_LEN 170 +#define CALL_LIST_APPEND 171 +#define CALL_METHOD_DESCRIPTOR_FAST 172 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 173 +#define CALL_METHOD_DESCRIPTOR_NOARGS 174 +#define CALL_METHOD_DESCRIPTOR_O 175 +#define CALL_NON_PY_GENERAL 176 +#define CALL_PY_EXACT_ARGS 177 +#define CALL_PY_GENERAL 178 +#define CALL_STR_1 179 +#define CALL_TUPLE_1 180 +#define CALL_TYPE_1 181 +#define COMPARE_OP_FLOAT 182 +#define COMPARE_OP_INT 183 +#define COMPARE_OP_STR 184 +#define CONTAINS_OP_DICT 185 +#define CONTAINS_OP_SET 186 +#define FOR_ITER_GEN 187 +#define FOR_ITER_LIST 188 +#define FOR_ITER_RANGE 189 +#define FOR_ITER_TUPLE 190 +#define LOAD_ATTR_CLASS 191 +#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 192 +#define LOAD_ATTR_INSTANCE_VALUE 193 +#define LOAD_ATTR_METHOD_LAZY_DICT 194 +#define LOAD_ATTR_METHOD_NO_DICT 195 +#define LOAD_ATTR_METHOD_WITH_VALUES 196 +#define LOAD_ATTR_MODULE 197 +#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 198 +#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 199 +#define LOAD_ATTR_PROPERTY 200 +#define LOAD_ATTR_SLOT 201 +#define LOAD_ATTR_WITH_HINT 202 +#define LOAD_GLOBAL_BUILTIN 203 +#define LOAD_GLOBAL_MODULE 204 +#define LOAD_SUPER_ATTR_ATTR 205 +#define LOAD_SUPER_ATTR_METHOD 206 +#define RESUME_CHECK 207 +#define SEND_GEN 208 +#define STORE_ATTR_INSTANCE_VALUE 209 +#define STORE_ATTR_SLOT 210 +#define STORE_ATTR_WITH_HINT 211 +#define STORE_SUBSCR_DICT 212 +#define STORE_SUBSCR_LIST_INT 213 +#define TO_BOOL_ALWAYS_TRUE 214 +#define TO_BOOL_BOOL 215 +#define TO_BOOL_INT 216 +#define TO_BOOL_LIST 217 +#define TO_BOOL_NONE 218 +#define TO_BOOL_STR 219 +#define UNPACK_SEQUENCE_LIST 220 +#define UNPACK_SEQUENCE_TUPLE 221 +#define UNPACK_SEQUENCE_TWO_TUPLE 222 +#define INSTRUMENTED_RESUME 236 +#define INSTRUMENTED_END_FOR 237 +#define INSTRUMENTED_END_SEND 238 +#define INSTRUMENTED_RETURN_VALUE 239 +#define INSTRUMENTED_RETURN_CONST 240 +#define INSTRUMENTED_YIELD_VALUE 241 +#define INSTRUMENTED_LOAD_SUPER_ATTR 242 +#define INSTRUMENTED_FOR_ITER 243 +#define INSTRUMENTED_CALL 244 +#define INSTRUMENTED_CALL_KW 245 +#define INSTRUMENTED_CALL_FUNCTION_EX 246 +#define INSTRUMENTED_INSTRUCTION 247 +#define INSTRUMENTED_JUMP_FORWARD 248 +#define INSTRUMENTED_JUMP_BACKWARD 249 +#define INSTRUMENTED_POP_JUMP_IF_TRUE 250 +#define INSTRUMENTED_POP_JUMP_IF_FALSE 251 +#define INSTRUMENTED_POP_JUMP_IF_NONE 252 +#define INSTRUMENTED_POP_JUMP_IF_NOT_NONE 253 +#define INSTRUMENTED_LINE 254 +#define JUMP 256 +#define JUMP_NO_INTERRUPT 257 +#define LOAD_CLOSURE 258 +#define LOAD_METHOD 259 +#define LOAD_SUPER_METHOD 260 +#define LOAD_ZERO_SUPER_ATTR 261 +#define LOAD_ZERO_SUPER_METHOD 262 +#define POP_BLOCK 263 +#define SETUP_CLEANUP 264 +#define SETUP_FINALLY 265 +#define SETUP_WITH 266 +#define STORE_FAST_MAYBE_NULL 267 + +#define HAVE_ARGUMENT 44 +#define MIN_INSTRUMENTED_OPCODE 236 + +#ifdef __cplusplus +} +#endif +#endif /* !Py_OPCODE_IDS_H */ diff --git a/Include/osdefs.h b/Include/osdefs.h index 3243944a..2599e87a 100644 --- a/Include/osdefs.h +++ b/Include/osdefs.h @@ -1,51 +1,57 @@ +// Operating system dependencies. +// +// Define constants: +// +// - ALTSEP +// - DELIM +// - MAXPATHLEN +// - SEP + #ifndef Py_OSDEFS_H #define Py_OSDEFS_H #ifdef __cplusplus extern "C" { #endif - -/* Operating system dependencies */ - #ifdef MS_WINDOWS -#define SEP L'\\' -#define ALTSEP L'/' -#define MAXPATHLEN 256 -#define DELIM L';' +# define SEP L'\\' +# define ALTSEP L'/' +# define MAXPATHLEN 256 +# define DELIM L';' #endif #ifdef __VXWORKS__ -#define DELIM L';' +# define DELIM L';' #endif /* Filename separator */ #ifndef SEP -#define SEP L'/' +# define SEP L'/' #endif /* Max pathname length */ #ifdef __hpux -#include -#include -#ifndef PATH_MAX -#define PATH_MAX MAXPATHLEN -#endif +# include +# include +# ifndef PATH_MAX +# define PATH_MAX MAXPATHLEN +# endif #endif #ifndef MAXPATHLEN -#if defined(PATH_MAX) && PATH_MAX > 1024 -#define MAXPATHLEN PATH_MAX -#else -#define MAXPATHLEN 1024 -#endif +# if defined(PATH_MAX) && PATH_MAX > 1024 +# define MAXPATHLEN PATH_MAX +# else +# define MAXPATHLEN 1024 +# endif #endif /* Search path entry delimiter */ #ifndef DELIM -#define DELIM L':' +# define DELIM L':' #endif #ifdef __cplusplus } #endif -#endif /* !Py_OSDEFS_H */ +#endif // !Py_OSDEFS_H diff --git a/Include/patchlevel.h b/Include/patchlevel.h index bb459864..93b0d7b7 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -17,13 +17,13 @@ /* Version parsed out into numeric values */ /*--start constants--*/ #define PY_MAJOR_VERSION 3 -#define PY_MINOR_VERSION 12 -#define PY_MICRO_VERSION 0 +#define PY_MINOR_VERSION 13 +#define PY_MICRO_VERSION 1 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.12.0" +#define PY_VERSION "3.13.1" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Include/py_curses.h b/Include/py_curses.h index e46b08e9..79b1b01f 100644 --- a/Include/py_curses.h +++ b/Include/py_curses.h @@ -23,23 +23,40 @@ # endif #endif -#if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS) -/* The following definition is necessary for ncurses 5.7; without it, - some of [n]curses.h set NCURSES_OPAQUE to 1, and then Python - can't get at the WINDOW flags field. */ +#if defined(WINDOW_HAS_FLAGS) && defined(__APPLE__) +/* gh-109617, gh-115383: we can rely on the default value for NCURSES_OPAQUE on + most platforms, but not on macOS. This is because, starting with Xcode 15, + Apple-provided ncurses.h comes from ncurses 6 (which defaults to opaque + structs) but can still be linked to older versions of ncurses dynamic + libraries which don't provide functions such as is_pad() to deal with opaque + structs. Setting NCURSES_OPAQUE to 0 is harmless in all ncurses releases to + this date (provided that a thread-safe implementation is not required), but + this might change in the future. This fix might become irrelevant once + support for macOS 13 or earlier is dropped. */ #define NCURSES_OPAQUE 0 #endif -#ifdef HAVE_NCURSES_H -#include -#else -#include +#if defined(HAVE_NCURSESW_NCURSES_H) +# include +#elif defined(HAVE_NCURSESW_CURSES_H) +# include +#elif defined(HAVE_NCURSES_NCURSES_H) +# include +#elif defined(HAVE_NCURSES_CURSES_H) +# include +#elif defined(HAVE_NCURSES_H) +# include +#elif defined(HAVE_CURSES_H) +# include #endif -#ifdef HAVE_NCURSES_H +#ifdef NCURSES_VERSION /* configure was checking , but we will use , which has some or all these features. */ -#if !defined(WINDOW_HAS_FLAGS) && !(NCURSES_OPAQUE+0) +#if !defined(WINDOW_HAS_FLAGS) && \ + (NCURSES_VERSION_PATCH+0 < 20070303 || !(NCURSES_OPAQUE+0)) +/* the WINDOW flags field was always accessible in ncurses prior to 20070303; + after that, it depends on the value of NCURSES_OPAQUE. */ #define WINDOW_HAS_FLAGS 1 #endif #if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906 diff --git a/Include/pyatomic.h b/Include/pyatomic.h new file mode 100644 index 00000000..2ce2c81c --- /dev/null +++ b/Include/pyatomic.h @@ -0,0 +1,16 @@ +#ifndef Py_ATOMIC_H +#define Py_ATOMIC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_LIMITED_API +# define Py_CPYTHON_ATOMIC_H +# include "cpython/pyatomic.h" +# undef Py_CPYTHON_ATOMIC_H +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_ATOMIC_H */ diff --git a/Include/pycapsule.h b/Include/pycapsule.h index 929a9a68..666b9f86 100644 --- a/Include/pycapsule.h +++ b/Include/pycapsule.h @@ -52,7 +52,6 @@ PyAPI_FUNC(void *) PyCapsule_Import( const char *name, /* UTF-8 encoded string */ int no_block); - #ifdef __cplusplus } #endif diff --git a/Include/pyerrors.h b/Include/pyerrors.h index d089fa71..5d0028c1 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -1,13 +1,11 @@ +// Error handling definitions + #ifndef Py_ERRORS_H #define Py_ERRORS_H #ifdef __cplusplus extern "C" { #endif -#include // va_list - -/* Error handling definitions */ - PyAPI_FUNC(void) PyErr_SetNone(PyObject *); PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); PyAPI_FUNC(void) PyErr_SetString( diff --git a/Include/pyexpat.h b/Include/pyexpat.h index 07020b5d..9824d099 100644 --- a/Include/pyexpat.h +++ b/Include/pyexpat.h @@ -48,8 +48,10 @@ struct PyExpat_CAPI enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding); int (*DefaultUnknownEncodingHandler)( void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); - /* might be none for expat < 2.1.0 */ + /* might be NULL for expat < 2.1.0 */ int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt); + /* might be NULL for expat < 2.6.0 */ + XML_Bool (*SetReparseDeferralEnabled)(XML_Parser parser, XML_Bool enabled); /* always add new stuff to the end! */ }; diff --git a/Include/pyhash.h b/Include/pyhash.h index 182d223f..3e23e275 100644 --- a/Include/pyhash.h +++ b/Include/pyhash.h @@ -1,100 +1,10 @@ #ifndef Py_HASH_H - #define Py_HASH_H #ifdef __cplusplus extern "C" { #endif -/* Helpers for hash functions */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_hash_t) _Py_HashDouble(PyObject *, double); -PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); -// Similar to _Py_HashPointer(), but don't replace -1 with -2 -PyAPI_FUNC(Py_hash_t) _Py_HashPointerRaw(const void*); -PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); -#endif - -/* Prime multiplier used in string and various other hashes. */ -#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ - -/* Parameters used for the numeric hash implementation. See notes for - _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on - reduction modulo the prime 2**_PyHASH_BITS - 1. */ - -#if SIZEOF_VOID_P >= 8 -# define _PyHASH_BITS 61 -#else -# define _PyHASH_BITS 31 -#endif - -#define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) -#define _PyHASH_INF 314159 -#define _PyHASH_IMAG _PyHASH_MULTIPLIER - - -/* hash secret - * - * memory layout on 64 bit systems - * cccccccc cccccccc cccccccc uc -- unsigned char[24] - * pppppppp ssssssss ........ fnv -- two Py_hash_t - * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t - * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t - * ........ ........ eeeeeeee pyexpat XML hash salt - * - * memory layout on 32 bit systems - * cccccccc cccccccc cccccccc uc - * ppppssss ........ ........ fnv -- two Py_hash_t - * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) - * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t - * ........ ........ eeee.... pyexpat XML hash salt - * - * (*) The siphash member may not be available on 32 bit platforms without - * an unsigned int64 data type. - */ -#ifndef Py_LIMITED_API -typedef union { - /* ensure 24 bytes */ - unsigned char uc[24]; - /* two Py_hash_t for FNV */ - struct { - Py_hash_t prefix; - Py_hash_t suffix; - } fnv; - /* two uint64 for SipHash24 */ - struct { - uint64_t k0; - uint64_t k1; - } siphash; - /* a different (!) Py_hash_t for small string optimization */ - struct { - unsigned char padding[16]; - Py_hash_t suffix; - } djbx33a; - struct { - unsigned char padding[16]; - Py_hash_t hashsalt; - } expat; -} _Py_HashSecret_t; -PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; - -#ifdef Py_DEBUG -PyAPI_DATA(int) _Py_HashSecret_Initialized; -#endif - - -/* hash function definition */ -typedef struct { - Py_hash_t (*const hash)(const void *, Py_ssize_t); - const char *name; - const int hash_bits; - const int seed_bits; -} PyHash_FuncDef; - -PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); -#endif - - -/* cutoff for small string DJBX33A optimization in range [1, cutoff). +/* Cutoff for small string DJBX33A optimization in range [1, cutoff). * * About 50% of the strings in a typical Python application are smaller than * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks. @@ -112,7 +22,7 @@ PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); #endif /* Py_HASH_CUTOFF */ -/* hash algorithm selection +/* Hash algorithm selection * * The values for Py_HASH_* are hard-coded in the * configure script. @@ -137,8 +47,13 @@ PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); # endif /* uint64_t && uint32_t && aligned */ #endif /* Py_HASH_ALGORITHM */ +#ifndef Py_LIMITED_API +# define Py_CPYTHON_HASH_H +# include "cpython/pyhash.h" +# undef Py_CPYTHON_HASH_H +#endif + #ifdef __cplusplus } #endif - -#endif /* !Py_HASH_H */ +#endif // !Py_HASH_H diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index e4c3b09c..de1bcb1d 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -35,17 +35,15 @@ PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); /* In pathconfig.c */ Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); -PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); -PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); -PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); - -PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); -PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); -PyAPI_FUNC(wchar_t *) Py_GetPath(void); -Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPath(const wchar_t *); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPath(void); #ifdef MS_WINDOWS int _Py_CheckPython3(void); #endif @@ -66,6 +64,10 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); PyAPI_DATA(const unsigned long) Py_Version; #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 +PyAPI_FUNC(int) Py_IsFinalizing(void); +#endif + #ifndef Py_LIMITED_API # define Py_CPYTHON_PYLIFECYCLE_H # include "cpython/pylifecycle.h" diff --git a/Include/pymacconfig.h b/Include/pymacconfig.h index 00459a03..615abe10 100644 --- a/Include/pymacconfig.h +++ b/Include/pymacconfig.h @@ -1,90 +1,91 @@ -#ifndef PYMACCONFIG_H -#define PYMACCONFIG_H - /* - * This file moves some of the autoconf magic to compile-time - * when building on MacOSX. This is needed for building 4-way - * universal binaries and for 64-bit universal binaries because - * the values redefined below aren't configure-time constant but - * only compile-time constant in these scenarios. - */ +// This file moves some of the autoconf magic to compile-time when building on +// macOS. This is needed for building 4-way universal binaries and for 64-bit +// universal binaries because the values redefined below aren't configure-time +// constant but only compile-time constant in these scenarios. -#if defined(__APPLE__) +#ifndef PY_MACCONFIG_H +#define PY_MACCONFIG_H +#ifdef __APPLE__ -# undef SIZEOF_LONG -# undef SIZEOF_PTHREAD_T -# undef SIZEOF_SIZE_T -# undef SIZEOF_TIME_T -# undef SIZEOF_VOID_P -# undef SIZEOF__BOOL -# undef SIZEOF_UINTPTR_T -# undef SIZEOF_PTHREAD_T -# undef WORDS_BIGENDIAN -# undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 -# undef DOUBLE_IS_BIG_ENDIAN_IEEE754 -# undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 -# undef HAVE_GCC_ASM_FOR_X87 +#undef ALIGNOF_MAX_ALIGN_T +#undef SIZEOF_LONG +#undef SIZEOF_LONG_DOUBLE +#undef SIZEOF_PTHREAD_T +#undef SIZEOF_SIZE_T +#undef SIZEOF_TIME_T +#undef SIZEOF_VOID_P +#undef SIZEOF__BOOL +#undef SIZEOF_UINTPTR_T +#undef SIZEOF_PTHREAD_T +#undef WORDS_BIGENDIAN +#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 +#undef DOUBLE_IS_BIG_ENDIAN_IEEE754 +#undef DOUBLE_IS_LITTLE_ENDIAN_IEEE754 +#undef HAVE_GCC_ASM_FOR_X87 +#undef HAVE_GCC_ASM_FOR_X64 -# undef VA_LIST_IS_ARRAY -# if defined(__LP64__) && defined(__x86_64__) -# define VA_LIST_IS_ARRAY 1 -# endif - -# undef HAVE_LARGEFILE_SUPPORT -# ifndef __LP64__ -# define HAVE_LARGEFILE_SUPPORT 1 -# endif - -# undef SIZEOF_LONG -# ifdef __LP64__ -# define SIZEOF__BOOL 1 -# define SIZEOF__BOOL 1 -# define SIZEOF_LONG 8 -# define SIZEOF_PTHREAD_T 8 -# define SIZEOF_SIZE_T 8 -# define SIZEOF_TIME_T 8 -# define SIZEOF_VOID_P 8 -# define SIZEOF_UINTPTR_T 8 -# define SIZEOF_PTHREAD_T 8 -# else -# ifdef __ppc__ -# define SIZEOF__BOOL 4 -# else -# define SIZEOF__BOOL 1 -# endif -# define SIZEOF_LONG 4 -# define SIZEOF_PTHREAD_T 4 -# define SIZEOF_SIZE_T 4 -# define SIZEOF_TIME_T 4 -# define SIZEOF_VOID_P 4 -# define SIZEOF_UINTPTR_T 4 -# define SIZEOF_PTHREAD_T 4 -# endif +#undef VA_LIST_IS_ARRAY +#if defined(__LP64__) && defined(__x86_64__) +# define VA_LIST_IS_ARRAY 1 +#endif -# if defined(__LP64__) - /* MacOSX 10.4 (the first release to support 64-bit code - * at all) only supports 64-bit in the UNIX layer. - * Therefore suppress the toolbox-glue in 64-bit mode. - */ +#undef HAVE_LARGEFILE_SUPPORT +#ifndef __LP64__ +# define HAVE_LARGEFILE_SUPPORT 1 +#endif - /* In 64-bit mode setpgrp always has no arguments, in 32-bit - * mode that depends on the compilation environment - */ -# undef SETPGRP_HAVE_ARG +#undef SIZEOF_LONG +#ifdef __LP64__ +# define SIZEOF__BOOL 1 +# define SIZEOF__BOOL 1 +# define SIZEOF_LONG 8 +# define SIZEOF_PTHREAD_T 8 +# define SIZEOF_SIZE_T 8 +# define SIZEOF_TIME_T 8 +# define SIZEOF_VOID_P 8 +# define SIZEOF_UINTPTR_T 8 +# define SIZEOF_PTHREAD_T 8 +#else +# ifdef __ppc__ +# define SIZEOF__BOOL 4 +# else +# define SIZEOF__BOOL 1 +# endif +# define SIZEOF_LONG 4 +# define SIZEOF_PTHREAD_T 4 +# define SIZEOF_SIZE_T 4 +# define SIZEOF_TIME_T 4 +# define SIZEOF_VOID_P 4 +# define SIZEOF_UINTPTR_T 4 +# define SIZEOF_PTHREAD_T 4 +#endif -# endif +// macOS 10.4 (the first release to support 64-bit code +// at all) only supports 64-bit in the UNIX layer. +// Therefore suppress the toolbox-glue in 64-bit mode. +// +// In 64-bit mode setpgrp always has no arguments, in 32-bit +// mode that depends on the compilation environment +#if defined(__LP64__) +# undef SETPGRP_HAVE_ARG +#endif #ifdef __BIG_ENDIAN__ -#define WORDS_BIGENDIAN 1 -#define DOUBLE_IS_BIG_ENDIAN_IEEE754 +# define WORDS_BIGENDIAN 1 +# define DOUBLE_IS_BIG_ENDIAN_IEEE754 #else -#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 -#endif /* __BIG_ENDIAN */ - -#ifdef __i386__ -# define HAVE_GCC_ASM_FOR_X87 +# define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 #endif +#if defined(__i386__) || defined(__x86_64__) +# define HAVE_GCC_ASM_FOR_X87 +# define ALIGNOF_MAX_ALIGN_T 16 +# define HAVE_GCC_ASM_FOR_X64 1 +# define SIZEOF_LONG_DOUBLE 16 +#else +# define ALIGNOF_MAX_ALIGN_T 8 +# define SIZEOF_LONG_DOUBLE 8 +#endif -#endif /* defined(_APPLE__) */ - -#endif /* PYMACCONFIG_H */ +#endif // __APPLE__ +#endif // !PY_MACCONFIG_H diff --git a/Include/pymacro.h b/Include/pymacro.h index 342d2a7b..e3e9cd13 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -15,11 +15,11 @@ // MSVC makes static_assert a keyword in C11-17, contrary to the standards. // // In C++11 and C2x, static_assert is a keyword, redefining is undefined -// behaviour. So only define if building as C (if __STDC_VERSION__ is defined), -// not C++, and only for C11-17. +// behaviour. So only define if building as C, not C++ (if __cplusplus is +// not defined), and only for C11-17. #if !defined(static_assert) && (defined(__GNUC__) || defined(__clang__)) \ - && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ - && __STDC_VERSION__ <= 201710L + && !defined(__cplusplus) && defined(__STDC_VERSION__) \ + && __STDC_VERSION__ >= 201112L && __STDC_VERSION__ <= 201710L # define static_assert _Static_assert #endif @@ -46,24 +46,42 @@ /* Argument must be a char or an int in [-128, 127] or [0, 255]. */ #define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) -/* Assert a build-time dependency, as an expression. - - Your compile will fail if the condition isn't true, or can't be evaluated - by the compiler. This can be used in an expression: its value is 0. - - Example: - - #define foo_to_char(foo) \ - ((char *)(foo) \ - + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) - - Written by Rusty Russell, public domain, http://ccodearchive.net/ */ -#define Py_BUILD_ASSERT_EXPR(cond) \ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ + && !defined(__cplusplus)) +# define Py_BUILD_ASSERT_EXPR(cond) \ + ((void)sizeof(struct { int dummy; _Static_assert(cond, #cond); }), \ + 0) +#else + /* Assert a build-time dependency, as an expression. + * + * Your compile will fail if the condition isn't true, or can't be evaluated + * by the compiler. This can be used in an expression: its value is 0. + * + * Example: + * + * #define foo_to_char(foo) \ + * ((char *)(foo) \ + * + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0)) + * + * Written by Rusty Russell, public domain, http://ccodearchive.net/ + */ +# define Py_BUILD_ASSERT_EXPR(cond) \ (sizeof(char [1 - 2*!(cond)]) - 1) +#endif -#define Py_BUILD_ASSERT(cond) do { \ - (void)Py_BUILD_ASSERT_EXPR(cond); \ - } while(0) +#if ((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) \ + || (defined(__cplusplus) && __cplusplus >= 201103L)) + // Use static_assert() on C11 and newer +# define Py_BUILD_ASSERT(cond) \ + do { \ + static_assert((cond), #cond); \ + } while (0) +#else +# define Py_BUILD_ASSERT(cond) \ + do { \ + (void)Py_BUILD_ASSERT_EXPR(cond); \ + } while(0) +#endif /* Get the number of elements in a visible array @@ -118,6 +136,15 @@ */ #if defined(__GNUC__) || defined(__clang__) # define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) +#elif defined(_MSC_VER) + // Disable warning C4100: unreferenced formal parameter, + // declare the parameter, + // restore old compiler warnings. +# define Py_UNUSED(name) \ + __pragma(warning(push)) \ + __pragma(warning(suppress: 4100)) \ + _unused_ ## name \ + __pragma(warning(pop)) #else # define Py_UNUSED(name) _unused_ ## name #endif @@ -151,6 +178,9 @@ Py_FatalError("Unreachable C code path reached") #endif +#define _Py_CONTAINER_OF(ptr, type, member) \ + (type*)((char*)ptr - offsetof(type, member)) + // Prevent using an expression as a l-value. // For example, "int x; _Py_RVALUE(x) = 1;" fails with a compiler error. #define _Py_RVALUE(EXPR) ((void)0, (EXPR)) diff --git a/Include/pymem.h b/Include/pymem.h index e8826457..a80da99e 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -1,12 +1,8 @@ -/* The PyMem_ family: low-level memory allocation interfaces. - See objimpl.h for the PyObject_ memory family. -*/ +// The PyMem_ family: low-level memory allocation interfaces. +// See objimpl.h for the PyObject_ memory family. #ifndef Py_PYMEM_H #define Py_PYMEM_H - -#include "pyport.h" - #ifdef __cplusplus extern "C" { #endif @@ -91,6 +87,17 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_DEL(p) PyMem_Free((p)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +// Memory allocator which doesn't require the GIL to be held. +// Usually, it's just a thin wrapper to functions of the standard C library: +// malloc(), calloc(), realloc() and free(). The difference is that +// tracemalloc can track these memory allocations. +PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); +PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); +PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_RawFree(void *ptr); +#endif + #ifndef Py_LIMITED_API # define Py_CPYTHON_PYMEM_H # include "cpython/pymem.h" @@ -100,5 +107,4 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #ifdef __cplusplus } #endif - -#endif /* !Py_PYMEM_H */ +#endif // !Py_PYMEM_H diff --git a/Include/pyport.h b/Include/pyport.h index 35eca723..2ba81a4b 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -1,13 +1,8 @@ #ifndef Py_PYPORT_H #define Py_PYPORT_H -#include "pyconfig.h" /* include for defines */ - -#include - -#include #ifndef UCHAR_MAX -# error "limits.h must define UCHAR_MAX" +# error " header must define UCHAR_MAX" #endif #if UCHAR_MAX != 255 # error "Python's source code assumes C's unsigned char is an 8-bit type" @@ -24,9 +19,10 @@ #define _Py_CAST(type, expr) ((type)(expr)) // Static inline functions should use _Py_NULL rather than using directly NULL -// to prevent C++ compiler warnings. On C++11 and newer, _Py_NULL is defined as -// nullptr. -#if defined(__cplusplus) && __cplusplus >= 201103 +// to prevent C++ compiler warnings. On C23 and newer and on C++11 and newer, +// _Py_NULL is defined as nullptr. +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ > 201710L) \ + || (defined(__cplusplus) && __cplusplus >= 201103) # define _Py_NULL nullptr #else # define _Py_NULL NULL @@ -188,68 +184,6 @@ typedef Py_ssize_t Py_ssize_clean_t; # define Py_MEMCPY memcpy #endif -#ifdef HAVE_IEEEFP_H -#include /* needed for 'finite' declaration on some platforms */ -#endif - -#include /* Moved here from the math section, before extern "C" */ - -/******************************************** - * WRAPPER FOR and/or * - ********************************************/ - -#ifdef HAVE_SYS_TIME_H -#include -#endif -#include - -/****************************** - * WRAPPER FOR * - ******************************/ - -/* NB caller must include */ - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* !HAVE_SYS_SELECT_H */ - -/******************************* - * stat() and fstat() fiddling * - *******************************/ - -#ifdef HAVE_SYS_STAT_H -#include -#elif defined(HAVE_STAT_H) -#include -#endif - -#ifndef S_IFMT -/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ -#define S_IFMT 0170000 -#endif - -#ifndef S_IFLNK -/* Windows doesn't define S_IFLNK but posixmodule.c maps - * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ -# define S_IFLNK 0120000 -#endif - -#ifndef S_ISREG -#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) -#endif - -#ifndef S_ISCHR -#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR) -#endif - -#ifndef S_ISLNK -#define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) -#endif - #ifdef __cplusplus /* Move this down here since some C++ #include's don't like to be included inside an extern "C" */ @@ -421,136 +355,15 @@ extern "C" { # define Py_NO_INLINE #endif -/************************************************************************** -Prototypes that are missing from the standard include files on some systems -(and possibly only some versions of such systems.) - -Please be conservative with adding new ones, document them and enclose them -in platform-specific #ifdefs. -**************************************************************************/ - -#ifdef HAVE__GETPTY -#include /* we need to import mode_t */ -extern char * _getpty(int *, int, mode_t, int); -#endif - -/* On QNX 6, struct termio must be declared by including sys/termio.h - if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must - be included before termios.h or it will generate an error. */ -#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) -#include -#endif - - -/* On 4.4BSD-descendants, ctype functions serves the whole range of - * wchar_t character set rather than single byte code points only. - * This characteristic can break some operations of string object - * including str.upper() and str.split() on UTF-8 locales. This - * workaround was provided by Tim Robbins of FreeBSD project. - */ - -#if defined(__APPLE__) -# define _PY_PORT_CTYPE_UTF8_ISSUE -#endif - -#ifdef _PY_PORT_CTYPE_UTF8_ISSUE -#ifndef __cplusplus - /* The workaround below is unsafe in C++ because - * the defines these symbols as real functions, - * with a slightly different signature. - * See issue #10910 - */ -#include -#include -#undef isalnum -#define isalnum(c) iswalnum(btowc(c)) -#undef isalpha -#define isalpha(c) iswalpha(btowc(c)) -#undef islower -#define islower(c) iswlower(btowc(c)) -#undef isspace -#define isspace(c) iswspace(btowc(c)) -#undef isupper -#define isupper(c) iswupper(btowc(c)) -#undef tolower -#define tolower(c) towlower(btowc(c)) -#undef toupper -#define toupper(c) towupper(btowc(c)) -#endif -#endif - - -/* Declarations for symbol visibility. - - PyAPI_FUNC(type): Declares a public Python API function and return type - PyAPI_DATA(type): Declares public Python data and its type - PyMODINIT_FUNC: A Python module init function. If these functions are - inside the Python core, they are private to the core. - If in an extension module, it may be declared with - external linkage depending on the platform. - - As a number of platforms support/require "__declspec(dllimport/dllexport)", - we support a HAVE_DECLSPEC_DLL macro to save duplication. -*/ - -/* - All windows ports, except cygwin, are handled in PC/pyconfig.h. - - Cygwin is the only other autoconf platform requiring special - linkage handling and it uses __declspec(). -*/ -#if defined(__CYGWIN__) -# define HAVE_DECLSPEC_DLL -#endif - #include "exports.h" -/* only get special linkage if built as shared or platform is Cygwin */ -#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) -# if defined(HAVE_DECLSPEC_DLL) -# if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) -# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE -# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE - /* module init functions inside the core need no external linkage */ - /* except for Cygwin to handle embedding */ -# if defined(__CYGWIN__) -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# else /* __CYGWIN__ */ -# define PyMODINIT_FUNC PyObject* -# endif /* __CYGWIN__ */ -# else /* Py_BUILD_CORE */ - /* Building an extension module, or an embedded situation */ - /* public Python functions and data are imported */ - /* Under Cygwin, auto-import functions to prevent compilation */ - /* failures similar to those described at the bottom of 4.1: */ - /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ -# if !defined(__CYGWIN__) -# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE -# endif /* !__CYGWIN__ */ -# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE - /* module init functions outside the core must be exported */ -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# endif /* __cplusplus */ -# endif /* Py_BUILD_CORE */ -# endif /* HAVE_DECLSPEC_DLL */ -#endif /* Py_ENABLE_SHARED */ - -/* If no external linkage macros defined by now, create defaults */ -#ifndef PyAPI_FUNC -# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE -#endif -#ifndef PyAPI_DATA -# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE -#endif -#ifndef PyMODINIT_FUNC -# if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* -# else /* __cplusplus */ -# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* -# endif /* __cplusplus */ +#ifdef Py_LIMITED_API + // The internal C API must not be used with the limited C API: make sure + // that Py_BUILD_CORE macro is not defined in this case. These 3 macros are + // used by exports.h, so only undefine them afterwards. +# undef Py_BUILD_CORE +# undef Py_BUILD_CORE_BUILTIN +# undef Py_BUILD_CORE_MODULE #endif /* limits.h constants that may be missing */ @@ -657,6 +470,14 @@ extern char * _getpty(int *, int, mode_t, int); # define WITH_THREAD #endif +/* Some WebAssembly platforms do not provide a working pthread implementation. + * Thread support is stubbed and any attempt to create a new thread fails. + */ +#if (!defined(HAVE_PTHREAD_STUBS) && \ + (!defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__))) +# define Py_CAN_START_THREADS 1 +#endif + #ifdef WITH_THREAD # ifdef Py_BUILD_CORE # ifdef HAVE_THREAD_LOCAL @@ -678,12 +499,6 @@ extern char * _getpty(int *, int, mode_t, int); # endif #endif -/* Check that ALT_SOABI is consistent with Py_TRACE_REFS: - ./configure --with-trace-refs should must be used to define Py_TRACE_REFS */ -#if defined(ALT_SOABI) && defined(Py_TRACE_REFS) -# error "Py_TRACE_REFS ABI is not compatible with release and debug ABI" -#endif - #if defined(__ANDROID__) || defined(__VXWORKS__) // Use UTF-8 as the locale encoding, ignore the LC_CTYPE locale. // See _Py_GetLocaleEncoding(), PyUnicode_DecodeLocale() @@ -748,10 +563,18 @@ extern char * _getpty(int *, int, mode_t, int); # define _Py_ADDRESS_SANITIZER # endif # endif +# if __has_feature(thread_sanitizer) +# if !defined(_Py_THREAD_SANITIZER) +# define _Py_THREAD_SANITIZER +# endif +# endif #elif defined(__GNUC__) # if defined(__SANITIZE_ADDRESS__) # define _Py_ADDRESS_SANITIZER # endif +# if defined(__SANITIZE_THREAD__) +# define _Py_THREAD_SANITIZER +# endif #endif @@ -771,4 +594,16 @@ extern char * _getpty(int *, int, mode_t, int); # define ALIGNOF_MAX_ALIGN_T _Alignof(long double) #endif +#ifndef PY_CXX_CONST +# ifdef __cplusplus +# define PY_CXX_CONST const +# else +# define PY_CXX_CONST +# endif +#endif + +#if defined(__sgi) && !defined(_SGI_MP_SOURCE) +# define _SGI_MP_SOURCE +#endif + #endif /* Py_PYPORT_H */ diff --git a/Include/pystate.h b/Include/pystate.h index e6b4de97..727b8fbf 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -56,7 +56,7 @@ PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); The caller must hold the GIL. - See also _PyThreadState_UncheckedGet() and _PyThreadState_GET(). */ + See also PyThreadState_GetUnchecked() and _PyThreadState_GET(). */ PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); // Alias to PyThreadState_Get() diff --git a/Include/pystats.h b/Include/pystats.h index 4b961bad..acfa3220 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -1,4 +1,9 @@ - +// Statistics on Python performance (public API). +// +// Define _Py_INCREF_STAT_INC() and _Py_DECREF_STAT_INC() used by Py_INCREF() +// and Py_DECREF(). +// +// See Include/cpython/pystats.h for the full API. #ifndef Py_PYSTATS_H #define Py_PYSTATS_H @@ -6,105 +11,16 @@ extern "C" { #endif -#ifdef Py_STATS - -#define SPECIALIZATION_FAILURE_KINDS 36 - -/* Stats for determining who is calling PyEval_EvalFrame */ -#define EVAL_CALL_TOTAL 0 -#define EVAL_CALL_VECTOR 1 -#define EVAL_CALL_GENERATOR 2 -#define EVAL_CALL_LEGACY 3 -#define EVAL_CALL_FUNCTION_VECTORCALL 4 -#define EVAL_CALL_BUILD_CLASS 5 -#define EVAL_CALL_SLOT 6 -#define EVAL_CALL_FUNCTION_EX 7 -#define EVAL_CALL_API 8 -#define EVAL_CALL_METHOD 9 - -#define EVAL_CALL_KINDS 10 - -typedef struct _specialization_stats { - uint64_t success; - uint64_t failure; - uint64_t hit; - uint64_t deferred; - uint64_t miss; - uint64_t deopt; - uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; -} SpecializationStats; - -typedef struct _opcode_stats { - SpecializationStats specialization; - uint64_t execution_count; - uint64_t pair_count[256]; -} OpcodeStats; - -typedef struct _call_stats { - uint64_t inlined_py_calls; - uint64_t pyeval_calls; - uint64_t frames_pushed; - uint64_t frame_objects_created; - uint64_t eval_calls[EVAL_CALL_KINDS]; -} CallStats; - -typedef struct _object_stats { - uint64_t increfs; - uint64_t decrefs; - uint64_t interpreter_increfs; - uint64_t interpreter_decrefs; - uint64_t allocations; - uint64_t allocations512; - uint64_t allocations4k; - uint64_t allocations_big; - uint64_t frees; - uint64_t to_freelist; - uint64_t from_freelist; - uint64_t new_values; - uint64_t dict_materialized_on_request; - uint64_t dict_materialized_new_key; - uint64_t dict_materialized_too_big; - uint64_t dict_materialized_str_subclass; - uint64_t type_cache_hits; - uint64_t type_cache_misses; - uint64_t type_cache_dunder_hits; - uint64_t type_cache_dunder_misses; - uint64_t type_cache_collisions; -} ObjectStats; - -typedef struct _stats { - OpcodeStats opcode_stats[256]; - CallStats call_stats; - ObjectStats object_stats; -} PyStats; - - -PyAPI_DATA(PyStats) _py_stats_struct; -PyAPI_DATA(PyStats *) _py_stats; - -extern void _Py_StatsClear(void); -extern void _Py_PrintSpecializationStats(int to_file); - -#ifdef _PY_INTERPRETER - -#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_increfs++; } while (0) -#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_decrefs++; } while (0) - -#else - -#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.increfs++; } while (0) -#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.decrefs++; } while (0) - -#endif - +#if defined(Py_STATS) && !defined(Py_LIMITED_API) +# define Py_CPYTHON_PYSTATS_H +# include "cpython/pystats.h" +# undef Py_CPYTHON_PYSTATS_H #else - -#define _Py_INCREF_STAT_INC() ((void)0) -#define _Py_DECREF_STAT_INC() ((void)0) - +# define _Py_INCREF_STAT_INC() ((void)0) +# define _Py_DECREF_STAT_INC() ((void)0) #endif // !Py_STATS #ifdef __cplusplus } #endif -#endif /* !Py_PYSTATs_H */ +#endif // !Py_PYSTATS_H diff --git a/Include/pystrtod.h b/Include/pystrtod.h index fa056d17..e83d245e 100644 --- a/Include/pystrtod.h +++ b/Include/pystrtod.h @@ -18,15 +18,6 @@ PyAPI_FUNC(char *) PyOS_double_to_string(double val, int flags, int *type); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _Py_string_to_number_with_underscores( - const char *str, Py_ssize_t len, const char *what, PyObject *obj, void *arg, - PyObject *(*innerfunc)(const char *, Py_ssize_t, void *)); - -PyAPI_FUNC(double) _Py_parse_inf_or_nan(const char *p, char **endptr); -#endif - - /* PyOS_double_to_string's "flags" parameter can be set to 0 or more of: */ #define Py_DTSF_SIGN 0x01 /* always add the sign */ #define Py_DTSF_ADD_DOT_0 0x02 /* if the result is an integer add ".0" */ diff --git a/Include/pythread.h b/Include/pythread.h index 63714437..a3216c51 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -21,7 +21,8 @@ PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); #if (defined(__APPLE__) || defined(__linux__) || defined(_WIN32) \ - || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ + || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ + || defined(__OpenBSD__) || defined(__NetBSD__) \ || defined(__DragonFly__) || defined(_AIX)) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); @@ -33,42 +34,18 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #define WAIT_LOCK 1 #define NOWAIT_LOCK 0 -/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting - on a lock (see PyThread_acquire_lock_timed() below). - PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that - type, and depends on the system threading API. - - NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread - module exposes a higher-level API, with timeouts expressed in seconds - and floating-point numbers allowed. -*/ +// PY_TIMEOUT_T is the integral type used to specify timeouts when waiting +// on a lock (see PyThread_acquire_lock_timed() below). #define PY_TIMEOUT_T long long -#if defined(_POSIX_THREADS) - /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), - convert microseconds to nanoseconds. */ -# define PY_TIMEOUT_MAX (LLONG_MAX / 1000) -#elif defined (NT_THREADS) - // WaitForSingleObject() accepts timeout in milliseconds in the range - // [0; 0xFFFFFFFE] (DWORD type). INFINITE value (0xFFFFFFFF) means no - // timeout. 0xFFFFFFFE milliseconds is around 49.7 days. -# if 0xFFFFFFFELL * 1000 < LLONG_MAX -# define PY_TIMEOUT_MAX (0xFFFFFFFELL * 1000) -# else -# define PY_TIMEOUT_MAX LLONG_MAX -# endif -#else -# define PY_TIMEOUT_MAX LLONG_MAX -#endif - /* If microseconds == 0, the call is non-blocking: it returns immediately even when the lock can't be acquired. If microseconds > 0, the call waits up to the specified duration. If microseconds < 0, the call waits until success (or abnormal failure) - microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is - undefined. + If *microseconds* is greater than PY_TIMEOUT_MAX, clamp the timeout to + PY_TIMEOUT_MAX microseconds. If intr_flag is true and the acquire is interrupted by a signal, then the call will return PY_LOCK_INTR. The caller may reattempt to acquire the diff --git a/Include/sliceobject.h b/Include/sliceobject.h index c13863f2..35e2ea25 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -8,7 +8,11 @@ extern "C" { PyAPI_DATA(PyObject) _Py_EllipsisObject; /* Don't use this directly */ -#define Py_Ellipsis (&_Py_EllipsisObject) +#if defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030D0000 +# define Py_Ellipsis Py_GetConstantBorrowed(Py_CONSTANT_ELLIPSIS) +#else +# define Py_Ellipsis (&_Py_EllipsisObject) +#endif /* Slice object interface */ diff --git a/Include/structseq.h b/Include/structseq.h index 96871155..29e24fee 100644 --- a/Include/structseq.h +++ b/Include/structseq.h @@ -31,18 +31,15 @@ PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc); PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type); +PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); +PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); + #ifndef Py_LIMITED_API typedef PyTupleObject PyStructSequence; - -/* Macro, *only* to be used to fill in brand new objects */ -#define PyStructSequence_SET_ITEM(op, i, v) PyTuple_SET_ITEM((op), (i), (v)) - -#define PyStructSequence_GET_ITEM(op, i) PyTuple_GET_ITEM((op), (i)) +#define PyStructSequence_SET_ITEM PyStructSequence_SetItem +#define PyStructSequence_GET_ITEM PyStructSequence_GetItem #endif -PyAPI_FUNC(void) PyStructSequence_SetItem(PyObject*, Py_ssize_t, PyObject*); -PyAPI_FUNC(PyObject*) PyStructSequence_GetItem(PyObject*, Py_ssize_t); - #ifdef __cplusplus } #endif diff --git a/Include/sysmodule.h b/Include/sysmodule.h index 96f88387..5a0af2e1 100644 --- a/Include/sysmodule.h +++ b/Include/sysmodule.h @@ -1,6 +1,3 @@ - -/* System module interface */ - #ifndef Py_SYSMODULE_H #define Py_SYSMODULE_H #ifdef __cplusplus @@ -12,7 +9,6 @@ PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); -Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 1, 2))); @@ -21,25 +17,19 @@ PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); -PyAPI_FUNC(void) PySys_ResetWarnOptions(void); -Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *); -Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *); -Py_DEPRECATED(3.11) PyAPI_FUNC(int) PySys_HasWarnOptions(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(void) PySys_ResetWarnOptions(void); -Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); -#if !defined(Py_LIMITED_API) -typedef struct { - FILE* perf_map; - PyThread_type_lock map_lock; -} PerfMapState; - -PyAPI_FUNC(int) PyUnstable_PerfMapState_Init(void); - -PyAPI_FUNC(int) PyUnstable_WritePerfMapEntry(const void *code_addr, unsigned int code_size, const char *entry_name); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +PyAPI_FUNC(int) PySys_Audit( + const char *event, + const char *argFormat, + ...); -PyAPI_FUNC(void) PyUnstable_PerfMapState_Fini(void); +PyAPI_FUNC(int) PySys_AuditTuple( + const char *event, + PyObject *args); #endif #ifndef Py_LIMITED_API diff --git a/Include/tracemalloc.h b/Include/tracemalloc.h deleted file mode 100644 index 580027a8..00000000 --- a/Include/tracemalloc.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef Py_TRACEMALLOC_H -#define Py_TRACEMALLOC_H - -#ifndef Py_LIMITED_API -/* Track an allocated memory block in the tracemalloc module. - Return 0 on success, return -1 on error (failed to allocate memory to store - the trace). - - Return -2 if tracemalloc is disabled. - - If memory block is already tracked, update the existing trace. */ -PyAPI_FUNC(int) PyTraceMalloc_Track( - unsigned int domain, - uintptr_t ptr, - size_t size); - -/* Untrack an allocated memory block in the tracemalloc module. - Do nothing if the block was not tracked. - - Return -2 if tracemalloc is disabled, otherwise return 0. */ -PyAPI_FUNC(int) PyTraceMalloc_Untrack( - unsigned int domain, - uintptr_t ptr); - -/* Get the traceback where a memory block was allocated. - - Return a tuple of (filename: str, lineno: int) tuples. - - Return None if the tracemalloc module is disabled or if the memory block - is not tracked by tracemalloc. - - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject*) _PyTraceMalloc_GetTraceback( - unsigned int domain, - uintptr_t ptr); - -/* Return non-zero if tracemalloc is tracing */ -PyAPI_FUNC(int) _PyTraceMalloc_IsTracing(void); - -/* Clear the tracemalloc traces */ -PyAPI_FUNC(void) _PyTraceMalloc_ClearTraces(void); - -/* Clear the tracemalloc traces */ -PyAPI_FUNC(PyObject *) _PyTraceMalloc_GetTraces(void); - -/* Clear tracemalloc traceback for an object */ -PyAPI_FUNC(PyObject *) _PyTraceMalloc_GetObjectTraceback(PyObject *obj); - -/* Initialize tracemalloc */ -PyAPI_FUNC(int) _PyTraceMalloc_Init(void); - -/* Start tracemalloc */ -PyAPI_FUNC(int) _PyTraceMalloc_Start(int max_nframe); - -/* Stop tracemalloc */ -PyAPI_FUNC(void) _PyTraceMalloc_Stop(void); - -/* Get the tracemalloc traceback limit */ -PyAPI_FUNC(int) _PyTraceMalloc_GetTracebackLimit(void); - -/* Get the memory usage of tracemalloc in bytes */ -PyAPI_FUNC(size_t) _PyTraceMalloc_GetMemory(void); - -/* Get the current size and peak size of traced memory blocks as a 2-tuple */ -PyAPI_FUNC(PyObject *) _PyTraceMalloc_GetTracedMemory(void); - -/* Set the peak size of traced memory blocks to the current size */ -PyAPI_FUNC(void) _PyTraceMalloc_ResetPeak(void); - -#endif - -#endif /* !Py_TRACEMALLOC_H */ diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 5839c747..dee00715 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1,8 +1,6 @@ #ifndef Py_UNICODEOBJECT_H #define Py_UNICODEOBJECT_H -#include // va_list - /* Unicode implementation based on original code by Fredrik Lundh, @@ -55,8 +53,6 @@ Copyright (c) Corporation for National Research Initiatives. * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * -------------------------------------------------------------------- */ -#include - /* === Internal API ======================================================= */ /* --- Internal Unicode Format -------------------------------------------- */ @@ -93,10 +89,6 @@ Copyright (c) Corporation for National Research Initiatives. # endif #endif -#ifdef HAVE_WCHAR_H -# include -#endif - /* Py_UCS4 and Py_UCS2 are typedefs for the respective unicode representations. */ typedef uint32_t Py_UCS4; @@ -965,6 +957,15 @@ PyAPI_FUNC(int) PyUnicode_CompareWithASCIIString( const char *right /* ASCII-encoded string */ ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 +/* Compare a Unicode object with UTF-8 encoded C string. + Return 1 if they are equal, or 0 otherwise. + This function does not raise exceptions. */ + +PyAPI_FUNC(int) PyUnicode_EqualToUTF8(PyObject *, const char *); +PyAPI_FUNC(int) PyUnicode_EqualToUTF8AndSize(PyObject *, const char *, Py_ssize_t); +#endif + /* Rich compare two strings and return one of the following: - NULL in case an exception was raised diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h index 8e1fa1b9..a6e71eb1 100644 --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -27,7 +27,11 @@ PyAPI_FUNC(PyObject *) PyWeakref_NewRef(PyObject *ob, PyObject *callback); PyAPI_FUNC(PyObject *) PyWeakref_NewProxy(PyObject *ob, PyObject *callback); -PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); +Py_DEPRECATED(3.13) PyAPI_FUNC(PyObject *) PyWeakref_GetObject(PyObject *ref); + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030D0000 +PyAPI_FUNC(int) PyWeakref_GetRef(PyObject *ref, PyObject **pobj); +#endif #ifndef Py_LIMITED_API diff --git a/InternalDocs/string_interning.md b/InternalDocs/string_interning.md new file mode 100644 index 00000000..358e2c07 --- /dev/null +++ b/InternalDocs/string_interning.md @@ -0,0 +1,118 @@ +# String interning + +*Interned* strings are conceptually part of an interpreter-global +*set* of interned strings, meaning that: +- no two interned strings have the same content (across an interpreter); +- two interned strings can be safely compared using pointer equality + (Python `is`). + +This is used to optimize dict and attribute lookups, among other things. + +Python uses two different mechanisms to intern strings: singletons and +dynamic interning. + +## Singletons + +The 256 possible one-character latin-1 strings, which can be retrieved with +`_Py_LATIN1_CHR(c)`, are stored in statically allocated arrays, +`_PyRuntime.static_objects.strings.ascii` and +`_PyRuntime.static_objects.strings.latin1`. + +Longer singleton strings are marked in C source with `_Py_ID` (if the string +is a valid C identifier fragment) or `_Py_STR` (if it needs a separate +C-compatible name.) +These are also stored in statically allocated arrays. +They are collected from CPython sources using `make regen-global-objects` +(`Tools/build/generate_global_objects.py`), which generates code +for declaration, initialization and finalization. + +The empty string is one of the singletons: `_Py_STR(empty)`. + +The three sets of singletons (`_Py_LATIN1_CHR`, `_Py_ID`, `_Py_STR`) +are disjoint. +If you have such a singleton, it (and no other copy) will be interned. + +These singletons are interned in a runtime-global lookup table, +`_PyRuntime.cached_objects.interned_strings` (`INTERNED_STRINGS`), +at runtime initialization, and immutable until it's torn down +at runtime finalization. +It is shared across threads and interpreters without any synchronization. + + +## Dynamically allocated strings + +All other strings are allocated dynamically, and have their +`_PyUnicode_STATE(s).statically_allocated` flag set to zero. +When interned, such strings are added to an interpreter-wide dict, +`PyInterpreterState.cached_objects.interned_strings`. + +The key and value of each entry in this dict reference the same object. + + +## Immortality and reference counting + +Invariant: Every immortal string is interned. + +In practice, this means that you must not use `_Py_SetImmortal` on +a string. (If you know it's already immortal, don't immortalize it; +if you know it's not interned you might be immortalizing a redundant copy; +if it's interned and mortal it needs extra processing in +`_PyUnicode_InternImmortal`.) + +The converse is not true: interned strings can be mortal. +For mortal interned strings: +- the 2 references from the interned dict (key & value) are excluded from + their refcount +- the deallocator (`unicode_dealloc`) removes the string from the interned dict +- at shutdown, when the interned dict is cleared, the references are added back + +As with any type, you should only immortalize strings that will live until +interpreter shutdown. +We currently also immortalize strings contained in code objects and similar, +specifically in the compiler and in `marshal`. +These are “close enough” to immortal: even in use cases like hot reloading +or `eval`-ing user input, the number of distinct identifiers and string +constants expected to stay low. + + +## Internal API + +We have the following *internal* API for interning: + +- `_PyUnicode_InternMortal`: just intern the string +- `_PyUnicode_InternImmortal`: intern, and immortalize the result +- `_PyUnicode_InternStatic`: intern a static singleton (`_Py_STR`, `_Py_ID` + or one-byte). Not for general use. + +All take an interpreter state, and a pointer to a `PyObject*` which they +modify in place. + +The functions take ownership of (“steal”) the reference to their argument, +and update the argument with a *new* reference. +This means: +- They're “reference neutral”. +- They must not be called with a borrowed reference. + + +## State + +The intern state (retrieved by `PyUnicode_CHECK_INTERNED(s)`; +stored in `_PyUnicode_STATE(s).interned`) can be: + +- `SSTATE_NOT_INTERNED` (defined as 0, which is useful in a boolean context) +- `SSTATE_INTERNED_MORTAL` (1) +- `SSTATE_INTERNED_IMMORTAL` (2) +- `SSTATE_INTERNED_IMMORTAL_STATIC` (3) + +The valid transitions between these states are: + +- For dynamically allocated strings: + + - 0 -> 1 (`_PyUnicode_InternMortal`) + - 1 -> 2 or 0 -> 2 (`_PyUnicode_InternImmortal`) + + Using `_PyUnicode_InternStatic` on these is an error; the other cases + don't change the state. + +- Singletons are interned (0 -> 3) at runtime init; + after that all interning functions don't change the state. diff --git a/LICENSE b/LICENSE index f26bcf4d..14603b95 100644 --- a/LICENSE +++ b/LICENSE @@ -83,10 +83,8 @@ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. +i.e., "Copyright (c) 2001-2024 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make diff --git a/Lib/_android_support.py b/Lib/_android_support.py new file mode 100644 index 00000000..7572745c --- /dev/null +++ b/Lib/_android_support.py @@ -0,0 +1,181 @@ +import io +import sys +from threading import RLock +from time import sleep, time + +# The maximum length of a log message in bytes, including the level marker and +# tag, is defined as LOGGER_ENTRY_MAX_PAYLOAD at +# https://cs.android.com/android/platform/superproject/+/android-14.0.0_r1:system/logging/liblog/include/log/log.h;l=71. +# Messages longer than this will be be truncated by logcat. This limit has already +# been reduced at least once in the history of Android (from 4076 to 4068 between +# API level 23 and 26), so leave some headroom. +MAX_BYTES_PER_WRITE = 4000 + +# UTF-8 uses a maximum of 4 bytes per character, so limiting text writes to this +# size ensures that we can always avoid exceeding MAX_BYTES_PER_WRITE. +# However, if the actual number of bytes per character is smaller than that, +# then we may still join multiple consecutive text writes into binary +# writes containing a larger number of characters. +MAX_CHARS_PER_WRITE = MAX_BYTES_PER_WRITE // 4 + + +# When embedded in an app on current versions of Android, there's no easy way to +# monitor the C-level stdout and stderr. The testbed comes with a .c file to +# redirect them to the system log using a pipe, but that wouldn't be convenient +# or appropriate for all apps. So we redirect at the Python level instead. +def init_streams(android_log_write, stdout_prio, stderr_prio): + if sys.executable: + return # Not embedded in an app. + + global logcat + logcat = Logcat(android_log_write) + + sys.stdout = TextLogStream( + stdout_prio, "python.stdout", sys.stdout.fileno()) + sys.stderr = TextLogStream( + stderr_prio, "python.stderr", sys.stderr.fileno()) + + +class TextLogStream(io.TextIOWrapper): + def __init__(self, prio, tag, fileno=None, **kwargs): + # The default is surrogateescape for stdout and backslashreplace for + # stderr, but in the context of an Android log, readability is more + # important than reversibility. + kwargs.setdefault("encoding", "UTF-8") + kwargs.setdefault("errors", "backslashreplace") + + super().__init__(BinaryLogStream(prio, tag, fileno), **kwargs) + self._lock = RLock() + self._pending_bytes = [] + self._pending_bytes_count = 0 + + def __repr__(self): + return f"" + + def write(self, s): + if not isinstance(s, str): + raise TypeError( + f"write() argument must be str, not {type(s).__name__}") + + # In case `s` is a str subclass that writes itself to stdout or stderr + # when we call its methods, convert it to an actual str. + s = str.__str__(s) + + # We want to emit one log message per line wherever possible, so split + # the string into lines first. Note that "".splitlines() == [], so + # nothing will be logged for an empty string. + with self._lock: + for line in s.splitlines(keepends=True): + while line: + chunk = line[:MAX_CHARS_PER_WRITE] + line = line[MAX_CHARS_PER_WRITE:] + self._write_chunk(chunk) + + return len(s) + + # The size and behavior of TextIOWrapper's buffer is not part of its public + # API, so we handle buffering ourselves to avoid truncation. + def _write_chunk(self, s): + b = s.encode(self.encoding, self.errors) + if self._pending_bytes_count + len(b) > MAX_BYTES_PER_WRITE: + self.flush() + + self._pending_bytes.append(b) + self._pending_bytes_count += len(b) + if ( + self.write_through + or b.endswith(b"\n") + or self._pending_bytes_count > MAX_BYTES_PER_WRITE + ): + self.flush() + + def flush(self): + with self._lock: + self.buffer.write(b"".join(self._pending_bytes)) + self._pending_bytes.clear() + self._pending_bytes_count = 0 + + # Since this is a line-based logging system, line buffering cannot be turned + # off, i.e. a newline always causes a flush. + @property + def line_buffering(self): + return True + + +class BinaryLogStream(io.RawIOBase): + def __init__(self, prio, tag, fileno=None): + self.prio = prio + self.tag = tag + self._fileno = fileno + + def __repr__(self): + return f"" + + def writable(self): + return True + + def write(self, b): + if type(b) is not bytes: + try: + b = bytes(memoryview(b)) + except TypeError: + raise TypeError( + f"write() argument must be bytes-like, not {type(b).__name__}" + ) from None + + # Writing an empty string to the stream should have no effect. + if b: + logcat.write(self.prio, self.tag, b) + return len(b) + + # This is needed by the test suite --timeout option, which uses faulthandler. + def fileno(self): + if self._fileno is None: + raise io.UnsupportedOperation("fileno") + return self._fileno + + +# When a large volume of data is written to logcat at once, e.g. when a test +# module fails in --verbose3 mode, there's a risk of overflowing logcat's own +# buffer and losing messages. We avoid this by imposing a rate limit using the +# token bucket algorithm, based on a conservative estimate of how fast `adb +# logcat` can consume data. +MAX_BYTES_PER_SECOND = 1024 * 1024 + +# The logcat buffer size of a device can be determined by running `logcat -g`. +# We set the token bucket size to half of the buffer size of our current minimum +# API level, because other things on the system will be producing messages as +# well. +BUCKET_SIZE = 128 * 1024 + +# https://cs.android.com/android/platform/superproject/+/android-14.0.0_r1:system/logging/liblog/include/log/log_read.h;l=39 +PER_MESSAGE_OVERHEAD = 28 + + +class Logcat: + def __init__(self, android_log_write): + self.android_log_write = android_log_write + self._lock = RLock() + self._bucket_level = 0 + self._prev_write_time = time() + + def write(self, prio, tag, message): + # Encode null bytes using "modified UTF-8" to avoid them truncating the + # message. + message = message.replace(b"\x00", b"\xc0\x80") + + with self._lock: + now = time() + self._bucket_level += ( + (now - self._prev_write_time) * MAX_BYTES_PER_SECOND) + + # If the bucket level is still below zero, the clock must have gone + # backwards, so reset it to zero and continue. + self._bucket_level = max(0, min(self._bucket_level, BUCKET_SIZE)) + self._prev_write_time = now + + self._bucket_level -= PER_MESSAGE_OVERHEAD + len(tag) + len(message) + if self._bucket_level < 0: + sleep(-self._bucket_level / MAX_BYTES_PER_SECOND) + + self.android_log_write(prio, tag, message) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 601107d2..aebe9c8b 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -85,6 +85,10 @@ dict_values = type({}.values()) dict_items = type({}.items()) ## misc ## mappingproxy = type(type.__dict__) +def _get_framelocalsproxy(): + return type(sys._getframe().f_locals) +framelocalsproxy = _get_framelocalsproxy() +del _get_framelocalsproxy generator = type((lambda: (yield))()) ## coroutine ## async def _coro(): pass @@ -836,6 +840,7 @@ class Mapping(Collection): __reversed__ = None Mapping.register(mappingproxy) +Mapping.register(framelocalsproxy) class MappingView(Sized): @@ -973,7 +978,7 @@ class MutableMapping(Mapping): def update(self, other=(), /, **kwds): ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. - If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and has a .keys() method, does: for k in E.keys(): D[k] = E[k] If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v In either case, this is followed by: for k, v in F.items(): D[k] = v ''' diff --git a/Lib/_colorize.py b/Lib/_colorize.py new file mode 100644 index 00000000..845fb57a --- /dev/null +++ b/Lib/_colorize.py @@ -0,0 +1,64 @@ +import io +import os +import sys + +COLORIZE = True + + +class ANSIColors: + BOLD_GREEN = "\x1b[1;32m" + BOLD_MAGENTA = "\x1b[1;35m" + BOLD_RED = "\x1b[1;31m" + GREEN = "\x1b[32m" + GREY = "\x1b[90m" + MAGENTA = "\x1b[35m" + RED = "\x1b[31m" + RESET = "\x1b[0m" + YELLOW = "\x1b[33m" + + +NoColors = ANSIColors() + +for attr in dir(NoColors): + if not attr.startswith("__"): + setattr(NoColors, attr, "") + + +def get_colors(colorize: bool = False) -> ANSIColors: + if colorize or can_colorize(): + return ANSIColors() + else: + return NoColors + + +def can_colorize() -> bool: + if sys.platform == "win32": + try: + import nt + + if not nt._supports_virtual_terminal(): + return False + except (ImportError, AttributeError): + return False + if not sys.flags.ignore_environment: + if os.environ.get("PYTHON_COLORS") == "0": + return False + if os.environ.get("PYTHON_COLORS") == "1": + return True + if "NO_COLOR" in os.environ: + return False + if not COLORIZE: + return False + if not sys.flags.ignore_environment: + if "FORCE_COLOR" in os.environ: + return True + if os.environ.get("TERM") == "dumb": + return False + + if not hasattr(sys.stderr, "fileno"): + return False + + try: + return os.isatty(sys.stderr.fileno()) + except io.UnsupportedOperation: + return sys.stderr.isatty() diff --git a/Lib/_compat_pickle.py b/Lib/_compat_pickle.py index 65a94b6b..439f8c02 100644 --- a/Lib/_compat_pickle.py +++ b/Lib/_compat_pickle.py @@ -22,7 +22,6 @@ IMPORT_MAPPING = { 'tkMessageBox': 'tkinter.messagebox', 'ScrolledText': 'tkinter.scrolledtext', 'Tkconstants': 'tkinter.constants', - 'Tix': 'tkinter.tix', 'ttk': 'tkinter.ttk', 'Tkinter': 'tkinter', 'markupbase': '_markupbase', diff --git a/Lib/_ios_support.py b/Lib/_ios_support.py new file mode 100644 index 00000000..20467a7c --- /dev/null +++ b/Lib/_ios_support.py @@ -0,0 +1,71 @@ +import sys +try: + from ctypes import cdll, c_void_p, c_char_p, util +except ImportError: + # ctypes is an optional module. If it's not present, we're limited in what + # we can tell about the system, but we don't want to prevent the module + # from working. + print("ctypes isn't available; iOS system calls will not be available", file=sys.stderr) + objc = None +else: + # ctypes is available. Load the ObjC library, and wrap the objc_getClass, + # sel_registerName methods + lib = util.find_library("objc") + if lib is None: + # Failed to load the objc library + raise ImportError("ObjC runtime library couldn't be loaded") + + objc = cdll.LoadLibrary(lib) + objc.objc_getClass.restype = c_void_p + objc.objc_getClass.argtypes = [c_char_p] + objc.sel_registerName.restype = c_void_p + objc.sel_registerName.argtypes = [c_char_p] + + +def get_platform_ios(): + # Determine if this is a simulator using the multiarch value + is_simulator = sys.implementation._multiarch.endswith("simulator") + + # We can't use ctypes; abort + if not objc: + return None + + # Most of the methods return ObjC objects + objc.objc_msgSend.restype = c_void_p + # All the methods used have no arguments. + objc.objc_msgSend.argtypes = [c_void_p, c_void_p] + + # Equivalent of: + # device = [UIDevice currentDevice] + UIDevice = objc.objc_getClass(b"UIDevice") + SEL_currentDevice = objc.sel_registerName(b"currentDevice") + device = objc.objc_msgSend(UIDevice, SEL_currentDevice) + + # Equivalent of: + # device_systemVersion = [device systemVersion] + SEL_systemVersion = objc.sel_registerName(b"systemVersion") + device_systemVersion = objc.objc_msgSend(device, SEL_systemVersion) + + # Equivalent of: + # device_systemName = [device systemName] + SEL_systemName = objc.sel_registerName(b"systemName") + device_systemName = objc.objc_msgSend(device, SEL_systemName) + + # Equivalent of: + # device_model = [device model] + SEL_model = objc.sel_registerName(b"model") + device_model = objc.objc_msgSend(device, SEL_model) + + # UTF8String returns a const char*; + SEL_UTF8String = objc.sel_registerName(b"UTF8String") + objc.objc_msgSend.restype = c_char_p + + # Equivalent of: + # system = [device_systemName UTF8String] + # release = [device_systemVersion UTF8String] + # model = [device_model UTF8String] + system = objc.objc_msgSend(device_systemName, SEL_UTF8String).decode() + release = objc.objc_msgSend(device_systemVersion, SEL_UTF8String).decode() + model = objc.objc_msgSend(device_model, SEL_UTF8String).decode() + + return system, release, model, is_simulator diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py new file mode 100644 index 00000000..b3d7b810 --- /dev/null +++ b/Lib/_opcode_metadata.py @@ -0,0 +1,343 @@ +# This file is generated by Tools/cases_generator/py_metadata_generator.py +# from: +# Python/bytecodes.c +# Do not edit! +_specializations = { + "RESUME": [ + "RESUME_CHECK", + ], + "TO_BOOL": [ + "TO_BOOL_ALWAYS_TRUE", + "TO_BOOL_BOOL", + "TO_BOOL_INT", + "TO_BOOL_LIST", + "TO_BOOL_NONE", + "TO_BOOL_STR", + ], + "BINARY_OP": [ + "BINARY_OP_MULTIPLY_INT", + "BINARY_OP_ADD_INT", + "BINARY_OP_SUBTRACT_INT", + "BINARY_OP_MULTIPLY_FLOAT", + "BINARY_OP_ADD_FLOAT", + "BINARY_OP_SUBTRACT_FLOAT", + "BINARY_OP_ADD_UNICODE", + "BINARY_OP_INPLACE_ADD_UNICODE", + ], + "BINARY_SUBSCR": [ + "BINARY_SUBSCR_DICT", + "BINARY_SUBSCR_GETITEM", + "BINARY_SUBSCR_LIST_INT", + "BINARY_SUBSCR_STR_INT", + "BINARY_SUBSCR_TUPLE_INT", + ], + "STORE_SUBSCR": [ + "STORE_SUBSCR_DICT", + "STORE_SUBSCR_LIST_INT", + ], + "SEND": [ + "SEND_GEN", + ], + "UNPACK_SEQUENCE": [ + "UNPACK_SEQUENCE_TWO_TUPLE", + "UNPACK_SEQUENCE_TUPLE", + "UNPACK_SEQUENCE_LIST", + ], + "STORE_ATTR": [ + "STORE_ATTR_INSTANCE_VALUE", + "STORE_ATTR_SLOT", + "STORE_ATTR_WITH_HINT", + ], + "LOAD_GLOBAL": [ + "LOAD_GLOBAL_MODULE", + "LOAD_GLOBAL_BUILTIN", + ], + "LOAD_SUPER_ATTR": [ + "LOAD_SUPER_ATTR_ATTR", + "LOAD_SUPER_ATTR_METHOD", + ], + "LOAD_ATTR": [ + "LOAD_ATTR_INSTANCE_VALUE", + "LOAD_ATTR_MODULE", + "LOAD_ATTR_WITH_HINT", + "LOAD_ATTR_SLOT", + "LOAD_ATTR_CLASS", + "LOAD_ATTR_PROPERTY", + "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", + "LOAD_ATTR_METHOD_WITH_VALUES", + "LOAD_ATTR_METHOD_NO_DICT", + "LOAD_ATTR_METHOD_LAZY_DICT", + "LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES", + "LOAD_ATTR_NONDESCRIPTOR_NO_DICT", + ], + "COMPARE_OP": [ + "COMPARE_OP_FLOAT", + "COMPARE_OP_INT", + "COMPARE_OP_STR", + ], + "CONTAINS_OP": [ + "CONTAINS_OP_SET", + "CONTAINS_OP_DICT", + ], + "FOR_ITER": [ + "FOR_ITER_LIST", + "FOR_ITER_TUPLE", + "FOR_ITER_RANGE", + "FOR_ITER_GEN", + ], + "CALL": [ + "CALL_BOUND_METHOD_EXACT_ARGS", + "CALL_PY_EXACT_ARGS", + "CALL_TYPE_1", + "CALL_STR_1", + "CALL_TUPLE_1", + "CALL_BUILTIN_CLASS", + "CALL_BUILTIN_O", + "CALL_BUILTIN_FAST", + "CALL_BUILTIN_FAST_WITH_KEYWORDS", + "CALL_LEN", + "CALL_ISINSTANCE", + "CALL_LIST_APPEND", + "CALL_METHOD_DESCRIPTOR_O", + "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + "CALL_METHOD_DESCRIPTOR_NOARGS", + "CALL_METHOD_DESCRIPTOR_FAST", + "CALL_ALLOC_AND_ENTER_INIT", + "CALL_PY_GENERAL", + "CALL_BOUND_METHOD_GENERAL", + "CALL_NON_PY_GENERAL", + ], +} + +_specialized_opmap = { + 'BINARY_OP_ADD_FLOAT': 150, + 'BINARY_OP_ADD_INT': 151, + 'BINARY_OP_ADD_UNICODE': 152, + 'BINARY_OP_INPLACE_ADD_UNICODE': 3, + 'BINARY_OP_MULTIPLY_FLOAT': 153, + 'BINARY_OP_MULTIPLY_INT': 154, + 'BINARY_OP_SUBTRACT_FLOAT': 155, + 'BINARY_OP_SUBTRACT_INT': 156, + 'BINARY_SUBSCR_DICT': 157, + 'BINARY_SUBSCR_GETITEM': 158, + 'BINARY_SUBSCR_LIST_INT': 159, + 'BINARY_SUBSCR_STR_INT': 160, + 'BINARY_SUBSCR_TUPLE_INT': 161, + 'CALL_ALLOC_AND_ENTER_INIT': 162, + 'CALL_BOUND_METHOD_EXACT_ARGS': 163, + 'CALL_BOUND_METHOD_GENERAL': 164, + 'CALL_BUILTIN_CLASS': 165, + 'CALL_BUILTIN_FAST': 166, + 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 167, + 'CALL_BUILTIN_O': 168, + 'CALL_ISINSTANCE': 169, + 'CALL_LEN': 170, + 'CALL_LIST_APPEND': 171, + 'CALL_METHOD_DESCRIPTOR_FAST': 172, + 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 173, + 'CALL_METHOD_DESCRIPTOR_NOARGS': 174, + 'CALL_METHOD_DESCRIPTOR_O': 175, + 'CALL_NON_PY_GENERAL': 176, + 'CALL_PY_EXACT_ARGS': 177, + 'CALL_PY_GENERAL': 178, + 'CALL_STR_1': 179, + 'CALL_TUPLE_1': 180, + 'CALL_TYPE_1': 181, + 'COMPARE_OP_FLOAT': 182, + 'COMPARE_OP_INT': 183, + 'COMPARE_OP_STR': 184, + 'CONTAINS_OP_DICT': 185, + 'CONTAINS_OP_SET': 186, + 'FOR_ITER_GEN': 187, + 'FOR_ITER_LIST': 188, + 'FOR_ITER_RANGE': 189, + 'FOR_ITER_TUPLE': 190, + 'LOAD_ATTR_CLASS': 191, + 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 192, + 'LOAD_ATTR_INSTANCE_VALUE': 193, + 'LOAD_ATTR_METHOD_LAZY_DICT': 194, + 'LOAD_ATTR_METHOD_NO_DICT': 195, + 'LOAD_ATTR_METHOD_WITH_VALUES': 196, + 'LOAD_ATTR_MODULE': 197, + 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 198, + 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 199, + 'LOAD_ATTR_PROPERTY': 200, + 'LOAD_ATTR_SLOT': 201, + 'LOAD_ATTR_WITH_HINT': 202, + 'LOAD_GLOBAL_BUILTIN': 203, + 'LOAD_GLOBAL_MODULE': 204, + 'LOAD_SUPER_ATTR_ATTR': 205, + 'LOAD_SUPER_ATTR_METHOD': 206, + 'RESUME_CHECK': 207, + 'SEND_GEN': 208, + 'STORE_ATTR_INSTANCE_VALUE': 209, + 'STORE_ATTR_SLOT': 210, + 'STORE_ATTR_WITH_HINT': 211, + 'STORE_SUBSCR_DICT': 212, + 'STORE_SUBSCR_LIST_INT': 213, + 'TO_BOOL_ALWAYS_TRUE': 214, + 'TO_BOOL_BOOL': 215, + 'TO_BOOL_INT': 216, + 'TO_BOOL_LIST': 217, + 'TO_BOOL_NONE': 218, + 'TO_BOOL_STR': 219, + 'UNPACK_SEQUENCE_LIST': 220, + 'UNPACK_SEQUENCE_TUPLE': 221, + 'UNPACK_SEQUENCE_TWO_TUPLE': 222, +} + +opmap = { + 'CACHE': 0, + 'RESERVED': 17, + 'RESUME': 149, + 'INSTRUMENTED_LINE': 254, + 'BEFORE_ASYNC_WITH': 1, + 'BEFORE_WITH': 2, + 'BINARY_SLICE': 4, + 'BINARY_SUBSCR': 5, + 'CHECK_EG_MATCH': 6, + 'CHECK_EXC_MATCH': 7, + 'CLEANUP_THROW': 8, + 'DELETE_SUBSCR': 9, + 'END_ASYNC_FOR': 10, + 'END_FOR': 11, + 'END_SEND': 12, + 'EXIT_INIT_CHECK': 13, + 'FORMAT_SIMPLE': 14, + 'FORMAT_WITH_SPEC': 15, + 'GET_AITER': 16, + 'GET_ANEXT': 18, + 'GET_ITER': 19, + 'GET_LEN': 20, + 'GET_YIELD_FROM_ITER': 21, + 'INTERPRETER_EXIT': 22, + 'LOAD_ASSERTION_ERROR': 23, + 'LOAD_BUILD_CLASS': 24, + 'LOAD_LOCALS': 25, + 'MAKE_FUNCTION': 26, + 'MATCH_KEYS': 27, + 'MATCH_MAPPING': 28, + 'MATCH_SEQUENCE': 29, + 'NOP': 30, + 'POP_EXCEPT': 31, + 'POP_TOP': 32, + 'PUSH_EXC_INFO': 33, + 'PUSH_NULL': 34, + 'RETURN_GENERATOR': 35, + 'RETURN_VALUE': 36, + 'SETUP_ANNOTATIONS': 37, + 'STORE_SLICE': 38, + 'STORE_SUBSCR': 39, + 'TO_BOOL': 40, + 'UNARY_INVERT': 41, + 'UNARY_NEGATIVE': 42, + 'UNARY_NOT': 43, + 'WITH_EXCEPT_START': 44, + 'BINARY_OP': 45, + 'BUILD_CONST_KEY_MAP': 46, + 'BUILD_LIST': 47, + 'BUILD_MAP': 48, + 'BUILD_SET': 49, + 'BUILD_SLICE': 50, + 'BUILD_STRING': 51, + 'BUILD_TUPLE': 52, + 'CALL': 53, + 'CALL_FUNCTION_EX': 54, + 'CALL_INTRINSIC_1': 55, + 'CALL_INTRINSIC_2': 56, + 'CALL_KW': 57, + 'COMPARE_OP': 58, + 'CONTAINS_OP': 59, + 'CONVERT_VALUE': 60, + 'COPY': 61, + 'COPY_FREE_VARS': 62, + 'DELETE_ATTR': 63, + 'DELETE_DEREF': 64, + 'DELETE_FAST': 65, + 'DELETE_GLOBAL': 66, + 'DELETE_NAME': 67, + 'DICT_MERGE': 68, + 'DICT_UPDATE': 69, + 'ENTER_EXECUTOR': 70, + 'EXTENDED_ARG': 71, + 'FOR_ITER': 72, + 'GET_AWAITABLE': 73, + 'IMPORT_FROM': 74, + 'IMPORT_NAME': 75, + 'IS_OP': 76, + 'JUMP_BACKWARD': 77, + 'JUMP_BACKWARD_NO_INTERRUPT': 78, + 'JUMP_FORWARD': 79, + 'LIST_APPEND': 80, + 'LIST_EXTEND': 81, + 'LOAD_ATTR': 82, + 'LOAD_CONST': 83, + 'LOAD_DEREF': 84, + 'LOAD_FAST': 85, + 'LOAD_FAST_AND_CLEAR': 86, + 'LOAD_FAST_CHECK': 87, + 'LOAD_FAST_LOAD_FAST': 88, + 'LOAD_FROM_DICT_OR_DEREF': 89, + 'LOAD_FROM_DICT_OR_GLOBALS': 90, + 'LOAD_GLOBAL': 91, + 'LOAD_NAME': 92, + 'LOAD_SUPER_ATTR': 93, + 'MAKE_CELL': 94, + 'MAP_ADD': 95, + 'MATCH_CLASS': 96, + 'POP_JUMP_IF_FALSE': 97, + 'POP_JUMP_IF_NONE': 98, + 'POP_JUMP_IF_NOT_NONE': 99, + 'POP_JUMP_IF_TRUE': 100, + 'RAISE_VARARGS': 101, + 'RERAISE': 102, + 'RETURN_CONST': 103, + 'SEND': 104, + 'SET_ADD': 105, + 'SET_FUNCTION_ATTRIBUTE': 106, + 'SET_UPDATE': 107, + 'STORE_ATTR': 108, + 'STORE_DEREF': 109, + 'STORE_FAST': 110, + 'STORE_FAST_LOAD_FAST': 111, + 'STORE_FAST_STORE_FAST': 112, + 'STORE_GLOBAL': 113, + 'STORE_NAME': 114, + 'SWAP': 115, + 'UNPACK_EX': 116, + 'UNPACK_SEQUENCE': 117, + 'YIELD_VALUE': 118, + 'INSTRUMENTED_RESUME': 236, + 'INSTRUMENTED_END_FOR': 237, + 'INSTRUMENTED_END_SEND': 238, + 'INSTRUMENTED_RETURN_VALUE': 239, + 'INSTRUMENTED_RETURN_CONST': 240, + 'INSTRUMENTED_YIELD_VALUE': 241, + 'INSTRUMENTED_LOAD_SUPER_ATTR': 242, + 'INSTRUMENTED_FOR_ITER': 243, + 'INSTRUMENTED_CALL': 244, + 'INSTRUMENTED_CALL_KW': 245, + 'INSTRUMENTED_CALL_FUNCTION_EX': 246, + 'INSTRUMENTED_INSTRUCTION': 247, + 'INSTRUMENTED_JUMP_FORWARD': 248, + 'INSTRUMENTED_JUMP_BACKWARD': 249, + 'INSTRUMENTED_POP_JUMP_IF_TRUE': 250, + 'INSTRUMENTED_POP_JUMP_IF_FALSE': 251, + 'INSTRUMENTED_POP_JUMP_IF_NONE': 252, + 'INSTRUMENTED_POP_JUMP_IF_NOT_NONE': 253, + 'JUMP': 256, + 'JUMP_NO_INTERRUPT': 257, + 'LOAD_CLOSURE': 258, + 'LOAD_METHOD': 259, + 'LOAD_SUPER_METHOD': 260, + 'LOAD_ZERO_SUPER_ATTR': 261, + 'LOAD_ZERO_SUPER_METHOD': 262, + 'POP_BLOCK': 263, + 'SETUP_CLEANUP': 264, + 'SETUP_FINALLY': 265, + 'SETUP_WITH': 266, + 'STORE_FAST_MAYBE_NULL': 267, +} + +HAVE_ARGUMENT = 44 +MIN_INSTRUMENTED_OPCODE = 236 diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index aa66c8b9..0cb064fc 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -507,6 +507,11 @@ def get_platform_osx(_config_vars, osname, release, machine): # MACOSX_DEPLOYMENT_TARGET. macver = _config_vars.get('MACOSX_DEPLOYMENT_TARGET', '') + if macver and '.' not in macver: + # Ensure that the version includes at least a major + # and minor version, even if MACOSX_DEPLOYMENT_TARGET + # is set to a single-label version like "14". + macver += '.0' macrelease = _get_system_version() or macver macver = macver or macrelease diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index a6d43399..34ccb2da 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -556,10 +556,6 @@ def _check_tzinfo_arg(tz): if tz is not None and not isinstance(tz, tzinfo): raise TypeError("tzinfo argument must be None or of a tzinfo subclass") -def _cmperror(x, y): - raise TypeError("can't compare '%s' to '%s'" % ( - type(x).__name__, type(y).__name__)) - def _divide_and_round(a, b): """divide a by b and round result to the nearest integer @@ -970,6 +966,8 @@ class date: @classmethod def fromtimestamp(cls, t): "Construct a date from a POSIX timestamp (like time.time())." + if t is None: + raise TypeError("'NoneType' object cannot be interpreted as an integer") y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t) return cls(y, m, d) @@ -1015,13 +1013,9 @@ class date: def __repr__(self): """Convert to formal string, for repr(). - >>> dt = datetime(2010, 1, 1) - >>> repr(dt) - 'datetime.datetime(2010, 1, 1, 0, 0)' - - >>> dt = datetime(2010, 1, 1, tzinfo=timezone.utc) - >>> repr(dt) - 'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)' + >>> d = date(2010, 1, 1) + >>> repr(d) + 'datetime.date(2010, 1, 1)' """ return "%s.%s(%d, %d, %d)" % (_get_class_module(self), self.__class__.__qualname__, @@ -1112,35 +1106,38 @@ class date: day = self._day return type(self)(year, month, day) + __replace__ = replace + # Comparisons of date objects with other. def __eq__(self, other): - if isinstance(other, date): + if isinstance(other, date) and not isinstance(other, datetime): return self._cmp(other) == 0 return NotImplemented def __le__(self, other): - if isinstance(other, date): + if isinstance(other, date) and not isinstance(other, datetime): return self._cmp(other) <= 0 return NotImplemented def __lt__(self, other): - if isinstance(other, date): + if isinstance(other, date) and not isinstance(other, datetime): return self._cmp(other) < 0 return NotImplemented def __ge__(self, other): - if isinstance(other, date): + if isinstance(other, date) and not isinstance(other, datetime): return self._cmp(other) >= 0 return NotImplemented def __gt__(self, other): - if isinstance(other, date): + if isinstance(other, date) and not isinstance(other, datetime): return self._cmp(other) > 0 return NotImplemented def _cmp(self, other): assert isinstance(other, date) + assert not isinstance(other, datetime) y, m, d = self._year, self._month, self._day y2, m2, d2 = other._year, other._month, other._day return _cmp((y, m, d), (y2, m2, d2)) @@ -1637,6 +1634,8 @@ class time: fold = self._fold return type(self)(hour, minute, second, microsecond, tzinfo, fold=fold) + __replace__ = replace + # Pickle support. def _getstate(self, protocol=3): @@ -1684,7 +1683,7 @@ class datetime(date): The year, month and day arguments are required. tzinfo may be None, or an instance of a tzinfo subclass. The remaining arguments may be ints. """ - __slots__ = date.__slots__ + time.__slots__ + __slots__ = time.__slots__ def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0): @@ -1809,7 +1808,7 @@ class datetime(date): def utcfromtimestamp(cls, t): """Construct a naive UTC datetime from a POSIX timestamp.""" import warnings - warnings.warn("datetime.utcfromtimestamp() is deprecated and scheduled " + warnings.warn("datetime.datetime.utcfromtimestamp() is deprecated and scheduled " "for removal in a future version. Use timezone-aware " "objects to represent datetimes in UTC: " "datetime.datetime.fromtimestamp(t, datetime.UTC).", @@ -1827,8 +1826,8 @@ class datetime(date): def utcnow(cls): "Construct a UTC datetime from time.time()." import warnings - warnings.warn("datetime.utcnow() is deprecated and scheduled for " - "removal in a future version. Instead, Use timezone-aware " + warnings.warn("datetime.datetime.utcnow() is deprecated and scheduled for " + "removal in a future version. Use timezone-aware " "objects to represent datetimes in UTC: " "datetime.datetime.now(datetime.UTC).", DeprecationWarning, @@ -1983,6 +1982,8 @@ class datetime(date): return type(self)(year, month, day, hour, minute, second, microsecond, tzinfo, fold=fold) + __replace__ = replace + def _local_timezone(self): if self.tzinfo is None: ts = self._mktime() @@ -2135,42 +2136,32 @@ class datetime(date): def __eq__(self, other): if isinstance(other, datetime): return self._cmp(other, allow_mixed=True) == 0 - elif not isinstance(other, date): - return NotImplemented else: - return False + return NotImplemented def __le__(self, other): if isinstance(other, datetime): return self._cmp(other) <= 0 - elif not isinstance(other, date): - return NotImplemented else: - _cmperror(self, other) + return NotImplemented def __lt__(self, other): if isinstance(other, datetime): return self._cmp(other) < 0 - elif not isinstance(other, date): - return NotImplemented else: - _cmperror(self, other) + return NotImplemented def __ge__(self, other): if isinstance(other, datetime): return self._cmp(other) >= 0 - elif not isinstance(other, date): - return NotImplemented else: - _cmperror(self, other) + return NotImplemented def __gt__(self, other): if isinstance(other, datetime): return self._cmp(other) > 0 - elif not isinstance(other, date): - return NotImplemented else: - _cmperror(self, other) + return NotImplemented def _cmp(self, other, allow_mixed=False): assert isinstance(other, datetime) @@ -2345,6 +2336,9 @@ class timezone(tzinfo): "timedelta(hours=24).") return cls._create(offset, name) + def __init_subclass__(cls): + raise TypeError("type 'datetime.timezone' is not an acceptable base type") + @classmethod def _create(cls, offset, name=None): self = tzinfo.__new__(cls) diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 2692f2fc..75df3db2 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -13,104 +13,7 @@ # bug) and will be backported. At this point the spec is stabilizing # and the updates are becoming fewer, smaller, and less significant. -""" -This is an implementation of decimal floating point arithmetic based on -the General Decimal Arithmetic Specification: - - http://speleotrove.com/decimal/decarith.html - -and IEEE standard 854-1987: - - http://en.wikipedia.org/wiki/IEEE_854-1987 - -Decimal floating point has finite precision with arbitrarily large bounds. - -The purpose of this module is to support arithmetic using familiar -"schoolhouse" rules and to avoid some of the tricky representation -issues associated with binary floating point. The package is especially -useful for financial applications or for contexts where users have -expectations that are at odds with binary floating point (for instance, -in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead -of 0.0; Decimal('1.00') % Decimal('0.1') returns the expected -Decimal('0.00')). - -Here are some examples of using the decimal module: - ->>> from decimal import * ->>> setcontext(ExtendedContext) ->>> Decimal(0) -Decimal('0') ->>> Decimal('1') -Decimal('1') ->>> Decimal('-.0123') -Decimal('-0.0123') ->>> Decimal(123456) -Decimal('123456') ->>> Decimal('123.45e12345678') -Decimal('1.2345E+12345680') ->>> Decimal('1.33') + Decimal('1.27') -Decimal('2.60') ->>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41') -Decimal('-2.20') ->>> dig = Decimal(1) ->>> print(dig / Decimal(3)) -0.333333333 ->>> getcontext().prec = 18 ->>> print(dig / Decimal(3)) -0.333333333333333333 ->>> print(dig.sqrt()) -1 ->>> print(Decimal(3).sqrt()) -1.73205080756887729 ->>> print(Decimal(3) ** 123) -4.85192780976896427E+58 ->>> inf = Decimal(1) / Decimal(0) ->>> print(inf) -Infinity ->>> neginf = Decimal(-1) / Decimal(0) ->>> print(neginf) --Infinity ->>> print(neginf + inf) -NaN ->>> print(neginf * inf) --Infinity ->>> print(dig / 0) -Infinity ->>> getcontext().traps[DivisionByZero] = 1 ->>> print(dig / 0) -Traceback (most recent call last): - ... - ... - ... -decimal.DivisionByZero: x / 0 ->>> c = Context() ->>> c.traps[InvalidOperation] = 0 ->>> print(c.flags[InvalidOperation]) -0 ->>> c.divide(Decimal(0), Decimal(0)) -Decimal('NaN') ->>> c.traps[InvalidOperation] = 1 ->>> print(c.flags[InvalidOperation]) -1 ->>> c.flags[InvalidOperation] = 0 ->>> print(c.flags[InvalidOperation]) -0 ->>> print(c.divide(Decimal(0), Decimal(0))) -Traceback (most recent call last): - ... - ... - ... -decimal.InvalidOperation: 0 / 0 ->>> print(c.flags[InvalidOperation]) -1 ->>> c.flags[InvalidOperation] = 0 ->>> c.traps[InvalidOperation] = 0 ->>> print(c.divide(Decimal(0), Decimal(0))) -NaN ->>> print(c.flags[InvalidOperation]) -1 ->>> -""" +"""Python decimal arithmetic module""" __all__ = [ # Two major classes @@ -521,7 +424,7 @@ def localcontext(ctx=None, **kwargs): # numbers.py for more detail. class Decimal(object): - """Floating point class for decimal arithmetic.""" + """Floating-point class for decimal arithmetic.""" __slots__ = ('_exp','_int','_sign', '_is_special') # Generally, the value of the Decimal instance is given by @@ -2228,10 +2131,16 @@ class Decimal(object): else: return None - if xc >= 10**p: + # An exact power of 10 is representable, but can convert to a + # string of any length. But an exact power of 10 shouldn't be + # possible at this point. + assert xc > 1, self + assert xc % 10 != 0, self + strxc = str(xc) + if len(strxc) > p: return None xe = -e-xe - return _dec_from_triple(0, str(xc), xe) + return _dec_from_triple(0, strxc, xe) # now y is positive; find m and n such that y = m/n if ye >= 0: @@ -2281,13 +2190,18 @@ class Decimal(object): return None xc = xc**m xe *= m - if xc > 10**p: + # An exact power of 10 is representable, but can convert to a string + # of any length. But an exact power of 10 shouldn't be possible at + # this point. + assert xc > 1, self + assert xc % 10 != 0, self + str_xc = str(xc) + if len(str_xc) > p: return None # by this point the result *is* exactly representable # adjust the exponent to get as close as possible to the ideal # exponent, if necessary - str_xc = str(xc) if other._isinteger() and other._sign == 0: ideal_exponent = self._exp*int(other) zeros = min(xe-ideal_exponent, p-len(str_xc)) diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 7f247ff4..a3fede69 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -33,11 +33,8 @@ DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes # Rebind for compatibility BlockingIOError = BlockingIOError -# Does io.IOBase finalizer log the exception if the close() method fails? -# The exception is ignored silently by default in release build. -_IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) # Does open() check its 'errors' argument? -_CHECK_ERRORS = _IOBASE_EMITS_UNRAISABLE +_CHECK_ERRORS = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) def text_encoding(encoding, stacklevel=2): @@ -416,18 +413,9 @@ class IOBase(metaclass=abc.ABCMeta): if closed: return - if _IOBASE_EMITS_UNRAISABLE: - self.close() - else: - # The try/except block is in case this is called at program - # exit time, when it's possible that globals have already been - # deleted, and then the close() call might fail. Since - # there's nothing we can do about such failures and they annoy - # the end users, we suppress the traceback. - try: - self.close() - except: - pass + # If close() fails, the caller logs the exception with + # sys.unraisablehook. close() must be called at the end at __del__(). + self.close() ### Inquiries ### @@ -1209,7 +1197,8 @@ class BufferedReader(_BufferedIOMixin): return written def tell(self): - return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos + # GH-95782: Keep return value non-negative + return max(_BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos, 0) def seek(self, pos, whence=0): if whence not in valid_seek_flags: @@ -1507,6 +1496,11 @@ class FileIO(RawIOBase): if isinstance(file, float): raise TypeError('integer argument expected, got float') if isinstance(file, int): + if isinstance(file, bool): + import warnings + warnings.warn("bool is used as a file descriptor", + RuntimeWarning, stacklevel=2) + file = int(file) fd = file if fd < 0: raise ValueError('negative file descriptor') @@ -2210,8 +2204,9 @@ class TextIOWrapper(TextIOBase): self.buffer.write(b) if self._line_buffering and (haslf or "\r" in s): self.flush() - self._set_decoded_chars('') - self._snapshot = None + if self._snapshot is not None: + self._set_decoded_chars('') + self._snapshot = None if self._decoder: self._decoder.reset() return length @@ -2525,8 +2520,9 @@ class TextIOWrapper(TextIOBase): # Read everything. result = (self._get_decoded_chars() + decoder.decode(self.buffer.read(), final=True)) - self._set_decoded_chars('') - self._snapshot = None + if self._snapshot is not None: + self._set_decoded_chars('') + self._snapshot = None return result else: # Keep reading chunks until we have size characters to return. diff --git a/Lib/_pylong.py b/Lib/_pylong.py index 936346e1..4970eb3f 100644 --- a/Lib/_pylong.py +++ b/Lib/_pylong.py @@ -14,7 +14,91 @@ maximum performance, they should use something like gmpy2.""" import re import decimal - +try: + import _decimal +except ImportError: + _decimal = None + +# A number of functions have this form, where `w` is a desired number of +# digits in base `base`: +# +# def inner(...w...): +# if w <= LIMIT: +# return something +# lo = w >> 1 +# hi = w - lo +# something involving base**lo, inner(...lo...), j, and inner(...hi...) +# figure out largest w needed +# result = inner(w) +# +# They all had some on-the-fly scheme to cache `base**lo` results for reuse. +# Power is costly. +# +# This routine aims to compute all amd only the needed powers in advance, as +# efficiently as reasonably possible. This isn't trivial, and all the +# on-the-fly methods did needless work in many cases. The driving code above +# changes to: +# +# figure out largest w needed +# mycache = compute_powers(w, base, LIMIT) +# result = inner(w) +# +# and `mycache[lo]` replaces `base**lo` in the inner function. +# +# While this does give minor speedups (a few percent at best), the primary +# intent is to simplify the functions using this, by eliminating the need for +# them to craft their own ad-hoc caching schemes. +def compute_powers(w, base, more_than, show=False): + seen = set() + need = set() + ws = {w} + while ws: + w = ws.pop() # any element is fine to use next + if w in seen or w <= more_than: + continue + seen.add(w) + lo = w >> 1 + # only _need_ lo here; some other path may, or may not, need hi + need.add(lo) + ws.add(lo) + if w & 1: + ws.add(lo + 1) + + d = {} + if not need: + return d + it = iter(sorted(need)) + first = next(it) + if show: + print("pow at", first) + d[first] = base ** first + for this in it: + if this - 1 in d: + if show: + print("* base at", this) + d[this] = d[this - 1] * base # cheap + else: + lo = this >> 1 + hi = this - lo + assert lo in d + if show: + print("square at", this) + # Multiplying a bigint by itself (same object!) is about twice + # as fast in CPython. + sq = d[lo] * d[lo] + if hi != lo: + assert hi == lo + 1 + if show: + print(" and * base") + sq *= base + d[this] = sq + return d + +_unbounded_dec_context = decimal.getcontext().copy() +_unbounded_dec_context.prec = decimal.MAX_PREC +_unbounded_dec_context.Emax = decimal.MAX_EMAX +_unbounded_dec_context.Emin = decimal.MIN_EMIN +_unbounded_dec_context.traps[decimal.Inexact] = 1 # sanity check def int_to_decimal(n): """Asymptotically fast conversion of an 'int' to Decimal.""" @@ -29,61 +113,76 @@ def int_to_decimal(n): # "clever" recursive way. If we want a string representation, we # apply str to _that_. - D = decimal.Decimal - D2 = D(2) - - BITLIM = 128 - - mem = {} - - def w2pow(w): - """Return D(2)**w and store the result. Also possibly save some - intermediate results. In context, these are likely to be reused - across various levels of the conversion to Decimal.""" - if (result := mem.get(w)) is None: - if w <= BITLIM: - result = D2**w - elif w - 1 in mem: - result = (t := mem[w - 1]) + t - else: - w2 = w >> 1 - # If w happens to be odd, w-w2 is one larger then w2 - # now. Recurse on the smaller first (w2), so that it's - # in the cache and the larger (w-w2) can be handled by - # the cheaper `w-1 in mem` branch instead. - result = w2pow(w2) * w2pow(w - w2) - mem[w] = result - return result + from decimal import Decimal as D + BITLIM = 200 + # Don't bother caching the "lo" mask in this; the time to compute it is + # tiny compared to the multiply. def inner(n, w): if w <= BITLIM: return D(n) w2 = w >> 1 hi = n >> w2 - lo = n - (hi << w2) - return inner(lo, w2) + inner(hi, w - w2) * w2pow(w2) - - with decimal.localcontext() as ctx: - ctx.prec = decimal.MAX_PREC - ctx.Emax = decimal.MAX_EMAX - ctx.Emin = decimal.MIN_EMIN - ctx.traps[decimal.Inexact] = 1 + lo = n & ((1 << w2) - 1) + return inner(lo, w2) + inner(hi, w - w2) * w2pow[w2] + with decimal.localcontext(_unbounded_dec_context): + nbits = n.bit_length() + w2pow = compute_powers(nbits, D(2), BITLIM) if n < 0: negate = True n = -n else: negate = False - result = inner(n, n.bit_length()) + result = inner(n, nbits) if negate: result = -result return result - def int_to_decimal_string(n): """Asymptotically fast conversion of an 'int' to a decimal string.""" - return str(int_to_decimal(n)) - + w = n.bit_length() + if w > 450_000 and _decimal is not None: + # It is only usable with the C decimal implementation. + # _pydecimal.py calls str() on very large integers, which in its + # turn calls int_to_decimal_string(), causing very deep recursion. + return str(int_to_decimal(n)) + + # Fallback algorithm for the case when the C decimal module isn't + # available. This algorithm is asymptotically worse than the algorithm + # using the decimal module, but better than the quadratic time + # implementation in longobject.c. + + DIGLIM = 1000 + def inner(n, w): + if w <= DIGLIM: + return str(n) + w2 = w >> 1 + hi, lo = divmod(n, pow10[w2]) + return inner(hi, w - w2) + inner(lo, w2).zfill(w2) + + # The estimation of the number of decimal digits. + # There is no harm in small error. If we guess too large, there may + # be leading 0's that need to be stripped. If we guess too small, we + # may need to call str() recursively for the remaining highest digits, + # which can still potentially be a large integer. This is manifested + # only if the number has way more than 10**15 digits, that exceeds + # the 52-bit physical address limit in both Intel64 and AMD64. + w = int(w * 0.3010299956639812 + 1) # log10(2) + pow10 = compute_powers(w, 5, DIGLIM) + for k, v in pow10.items(): + pow10[k] = v << k # 5**k << k == 5**k * 2**k == 10**k + if n < 0: + n = -n + sign = '-' + else: + sign = '' + s = inner(n, w) + if s[0] == '0' and n: + # If our guess of w is too large, there may be leading 0's that + # need to be stripped. + s = s.lstrip('0') + return sign + s def _str_to_int_inner(s): """Asymptotically fast conversion of a 'str' to an 'int'.""" @@ -100,35 +199,15 @@ def _str_to_int_inner(s): DIGLIM = 2048 - mem = {} - - def w5pow(w): - """Return 5**w and store the result. - Also possibly save some intermediate results. In context, these - are likely to be reused across various levels of the conversion - to 'int'. - """ - if (result := mem.get(w)) is None: - if w <= DIGLIM: - result = 5**w - elif w - 1 in mem: - result = mem[w - 1] * 5 - else: - w2 = w >> 1 - # If w happens to be odd, w-w2 is one larger then w2 - # now. Recurse on the smaller first (w2), so that it's - # in the cache and the larger (w-w2) can be handled by - # the cheaper `w-1 in mem` branch instead. - result = w5pow(w2) * w5pow(w - w2) - mem[w] = result - return result - def inner(a, b): if b - a <= DIGLIM: return int(s[a:b]) mid = (a + b + 1) >> 1 - return inner(mid, b) + ((inner(a, mid) * w5pow(b - mid)) << (b - mid)) + return (inner(mid, b) + + ((inner(a, mid) * w5pow[b - mid]) + << (b - mid))) + w5pow = compute_powers(len(s), 5, DIGLIM) return inner(0, len(s)) @@ -142,7 +221,6 @@ def int_from_string(s): s = s.rstrip().replace('_', '') return _str_to_int_inner(s) - def str_to_int(s): """Asymptotically fast version of decimal string to 'int' conversion.""" # FIXME: this doesn't support the full syntax that int() supports. diff --git a/Lib/_pyrepl/__init__.py b/Lib/_pyrepl/__init__.py new file mode 100644 index 00000000..1693cbd0 --- /dev/null +++ b/Lib/_pyrepl/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2000-2008 Michael Hudson-Doyle +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Lib/_pyrepl/__main__.py b/Lib/_pyrepl/__main__.py new file mode 100644 index 00000000..3fa992ee --- /dev/null +++ b/Lib/_pyrepl/__main__.py @@ -0,0 +1,6 @@ +# Important: don't add things to this module, as they will end up in the REPL's +# default globals. Use _pyrepl.main instead. + +if __name__ == "__main__": + from .main import interactive_console as __pyrepl_interactive_console + __pyrepl_interactive_console() diff --git a/Lib/_pyrepl/_minimal_curses.py b/Lib/_pyrepl/_minimal_curses.py new file mode 100644 index 00000000..d884f880 --- /dev/null +++ b/Lib/_pyrepl/_minimal_curses.py @@ -0,0 +1,68 @@ +"""Minimal '_curses' module, the low-level interface for curses module +which is not meant to be used directly. + +Based on ctypes. It's too incomplete to be really called '_curses', so +to use it, you have to import it and stick it in sys.modules['_curses'] +manually. + +Note that there is also a built-in module _minimal_curses which will +hide this one if compiled in. +""" + +import ctypes +import ctypes.util + + +class error(Exception): + pass + + +def _find_clib() -> str: + trylibs = ["ncursesw", "ncurses", "curses"] + + for lib in trylibs: + path = ctypes.util.find_library(lib) + if path: + return path + raise ModuleNotFoundError("curses library not found", name="_pyrepl._minimal_curses") + + +_clibpath = _find_clib() +clib = ctypes.cdll.LoadLibrary(_clibpath) + +clib.setupterm.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(ctypes.c_int)] +clib.setupterm.restype = ctypes.c_int + +clib.tigetstr.argtypes = [ctypes.c_char_p] +clib.tigetstr.restype = ctypes.c_ssize_t + +clib.tparm.argtypes = [ctypes.c_char_p] + 9 * [ctypes.c_int] # type: ignore[operator] +clib.tparm.restype = ctypes.c_char_p + +OK = 0 +ERR = -1 + +# ____________________________________________________________ + + +def setupterm(termstr, fd): + err = ctypes.c_int(0) + result = clib.setupterm(termstr, fd, ctypes.byref(err)) + if result == ERR: + raise error("setupterm() failed (err=%d)" % err.value) + + +def tigetstr(cap): + if not isinstance(cap, bytes): + cap = cap.encode("ascii") + result = clib.tigetstr(cap) + if result == ERR: + return None + return ctypes.cast(result, ctypes.c_char_p).value + + +def tparm(str, i1=0, i2=0, i3=0, i4=0, i5=0, i6=0, i7=0, i8=0, i9=0): + result = clib.tparm(str, i1, i2, i3, i4, i5, i6, i7, i8, i9) + if result is None: + raise error("tparm() returned NULL") + return result diff --git a/Lib/_pyrepl/_threading_handler.py b/Lib/_pyrepl/_threading_handler.py new file mode 100644 index 00000000..82f5e865 --- /dev/null +++ b/Lib/_pyrepl/_threading_handler.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +import traceback + + +TYPE_CHECKING = False +if TYPE_CHECKING: + from threading import Thread + from types import TracebackType + from typing import Protocol + + class ExceptHookArgs(Protocol): + @property + def exc_type(self) -> type[BaseException]: ... + @property + def exc_value(self) -> BaseException | None: ... + @property + def exc_traceback(self) -> TracebackType | None: ... + @property + def thread(self) -> Thread | None: ... + + class ShowExceptions(Protocol): + def __call__(self) -> int: ... + def add(self, s: str) -> None: ... + + from .reader import Reader + + +def install_threading_hook(reader: Reader) -> None: + import threading + + @dataclass + class ExceptHookHandler: + lock: threading.Lock = field(default_factory=threading.Lock) + messages: list[str] = field(default_factory=list) + + def show(self) -> int: + count = 0 + with self.lock: + if not self.messages: + return 0 + reader.restore() + for tb in self.messages: + count += 1 + if tb: + print(tb) + self.messages.clear() + reader.scheduled_commands.append("ctrl-c") + reader.prepare() + return count + + def add(self, s: str) -> None: + with self.lock: + self.messages.append(s) + + def exception(self, args: ExceptHookArgs) -> None: + lines = traceback.format_exception( + args.exc_type, + args.exc_value, + args.exc_traceback, + colorize=reader.can_colorize, + ) # type: ignore[call-overload] + pre = f"\nException in {args.thread.name}:\n" if args.thread else "\n" + tb = pre + "".join(lines) + self.add(tb) + + def __call__(self) -> int: + return self.show() + + + handler = ExceptHookHandler() + reader.threading_hook = handler + threading.excepthook = handler.exception diff --git a/Lib/_pyrepl/commands.py b/Lib/_pyrepl/commands.py new file mode 100644 index 00000000..c3fce910 --- /dev/null +++ b/Lib/_pyrepl/commands.py @@ -0,0 +1,483 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Antonio Cuni +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations +import os + +# Categories of actions: +# killing +# yanking +# motion +# editing +# history +# finishing +# [completion] + + +# types +if False: + from .historical_reader import HistoricalReader + + +class Command: + finish: bool = False + kills_digit_arg: bool = True + + def __init__( + self, reader: HistoricalReader, event_name: str, event: list[str] + ) -> None: + # Reader should really be "any reader" but there's too much usage of + # HistoricalReader methods and fields in the code below for us to + # refactor at the moment. + + self.reader = reader + self.event = event + self.event_name = event_name + + def do(self) -> None: + pass + + +class KillCommand(Command): + def kill_range(self, start: int, end: int) -> None: + if start == end: + return + r = self.reader + b = r.buffer + text = b[start:end] + del b[start:end] + if is_kill(r.last_command): + if start < r.pos: + r.kill_ring[-1] = text + r.kill_ring[-1] + else: + r.kill_ring[-1] = r.kill_ring[-1] + text + else: + r.kill_ring.append(text) + r.pos = start + r.dirty = True + + +class YankCommand(Command): + pass + + +class MotionCommand(Command): + pass + + +class EditCommand(Command): + pass + + +class FinishCommand(Command): + finish = True + pass + + +def is_kill(command: type[Command] | None) -> bool: + return command is not None and issubclass(command, KillCommand) + + +def is_yank(command: type[Command] | None) -> bool: + return command is not None and issubclass(command, YankCommand) + + +# etc + + +class digit_arg(Command): + kills_digit_arg = False + + def do(self) -> None: + r = self.reader + c = self.event[-1] + if c == "-": + if r.arg is not None: + r.arg = -r.arg + else: + r.arg = -1 + else: + d = int(c) + if r.arg is None: + r.arg = d + else: + if r.arg < 0: + r.arg = 10 * r.arg - d + else: + r.arg = 10 * r.arg + d + r.dirty = True + + +class clear_screen(Command): + def do(self) -> None: + r = self.reader + r.console.clear() + r.dirty = True + + +class refresh(Command): + def do(self) -> None: + self.reader.dirty = True + + +class repaint(Command): + def do(self) -> None: + self.reader.dirty = True + self.reader.console.repaint() + + +class kill_line(KillCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + eol = r.eol() + for c in b[r.pos : eol]: + if not c.isspace(): + self.kill_range(r.pos, eol) + return + else: + self.kill_range(r.pos, eol + 1) + + +class unix_line_discard(KillCommand): + def do(self) -> None: + r = self.reader + self.kill_range(r.bol(), r.pos) + + +class unix_word_rubout(KillCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + self.kill_range(r.bow(), r.pos) + + +class kill_word(KillCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + self.kill_range(r.pos, r.eow()) + + +class backward_kill_word(KillCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + self.kill_range(r.bow(), r.pos) + + +class yank(YankCommand): + def do(self) -> None: + r = self.reader + if not r.kill_ring: + r.error("nothing to yank") + return + r.insert(r.kill_ring[-1]) + + +class yank_pop(YankCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + if not r.kill_ring: + r.error("nothing to yank") + return + if not is_yank(r.last_command): + r.error("previous command was not a yank") + return + repl = len(r.kill_ring[-1]) + r.kill_ring.insert(0, r.kill_ring.pop()) + t = r.kill_ring[-1] + b[r.pos - repl : r.pos] = t + r.pos = r.pos - repl + len(t) + r.dirty = True + + +class interrupt(FinishCommand): + def do(self) -> None: + import signal + + self.reader.console.finish() + self.reader.finish() + os.kill(os.getpid(), signal.SIGINT) + + +class ctrl_c(Command): + def do(self) -> None: + self.reader.console.finish() + self.reader.finish() + raise KeyboardInterrupt + + +class suspend(Command): + def do(self) -> None: + import signal + + r = self.reader + p = r.pos + r.console.finish() + os.kill(os.getpid(), signal.SIGSTOP) + ## this should probably be done + ## in a handler for SIGCONT? + r.console.prepare() + r.pos = p + # r.posxy = 0, 0 # XXX this is invalid + r.dirty = True + r.console.screen = [] + + +class up(MotionCommand): + def do(self) -> None: + r = self.reader + for _ in range(r.get_arg()): + x, y = r.pos2xy() + new_y = y - 1 + + if r.bol() == 0: + if r.historyi > 0: + r.select_item(r.historyi - 1) + return + r.pos = 0 + r.error("start of buffer") + return + + if ( + x + > ( + new_x := r.max_column(new_y) + ) # we're past the end of the previous line + or x == r.max_column(y) + and any( + not i.isspace() for i in r.buffer[r.bol() :] + ) # move between eols + ): + x = new_x + + r.setpos_from_xy(x, new_y) + + +class down(MotionCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + for _ in range(r.get_arg()): + x, y = r.pos2xy() + new_y = y + 1 + + if new_y > r.max_row(): + if r.historyi < len(r.history): + r.select_item(r.historyi + 1) + r.pos = r.eol(0) + return + r.pos = len(b) + r.error("end of buffer") + return + + if ( + x + > ( + new_x := r.max_column(new_y) + ) # we're past the end of the previous line + or x == r.max_column(y) + and any( + not i.isspace() for i in r.buffer[r.bol() :] + ) # move between eols + ): + x = new_x + + r.setpos_from_xy(x, new_y) + + +class left(MotionCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + p = r.pos - 1 + if p >= 0: + r.pos = p + else: + self.reader.error("start of buffer") + + +class right(MotionCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + for i in range(r.get_arg()): + p = r.pos + 1 + if p <= len(b): + r.pos = p + else: + self.reader.error("end of buffer") + + +class beginning_of_line(MotionCommand): + def do(self) -> None: + self.reader.pos = self.reader.bol() + + +class end_of_line(MotionCommand): + def do(self) -> None: + self.reader.pos = self.reader.eol() + + +class home(MotionCommand): + def do(self) -> None: + self.reader.pos = 0 + + +class end(MotionCommand): + def do(self) -> None: + self.reader.pos = len(self.reader.buffer) + + +class forward_word(MotionCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + r.pos = r.eow() + + +class backward_word(MotionCommand): + def do(self) -> None: + r = self.reader + for i in range(r.get_arg()): + r.pos = r.bow() + + +class self_insert(EditCommand): + def do(self) -> None: + r = self.reader + text = self.event * r.get_arg() + r.insert(text) + + +class insert_nl(EditCommand): + def do(self) -> None: + r = self.reader + r.insert("\n" * r.get_arg()) + + +class transpose_characters(EditCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + s = r.pos - 1 + if s < 0: + r.error("cannot transpose at start of buffer") + else: + if s == len(b): + s -= 1 + t = min(s + r.get_arg(), len(b) - 1) + c = b[s] + del b[s] + b.insert(t, c) + r.pos = t + r.dirty = True + + +class backspace(EditCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + for i in range(r.get_arg()): + if r.pos > 0: + r.pos -= 1 + del b[r.pos] + r.dirty = True + else: + self.reader.error("can't backspace at start") + + +class delete(EditCommand): + def do(self) -> None: + r = self.reader + b = r.buffer + if ( + r.pos == 0 + and len(b) == 0 # this is something of a hack + and self.event[-1] == "\004" + ): + r.update_screen() + r.console.finish() + raise EOFError + for i in range(r.get_arg()): + if r.pos != len(b): + del b[r.pos] + r.dirty = True + else: + self.reader.error("end of buffer") + + +class accept(FinishCommand): + def do(self) -> None: + pass + + +class help(Command): + def do(self) -> None: + import _sitebuiltins + + with self.reader.suspend(): + self.reader.msg = _sitebuiltins._Helper()() # type: ignore[assignment, call-arg] + + +class invalid_key(Command): + def do(self) -> None: + pending = self.reader.console.getpending() + s = "".join(self.event) + pending.data + self.reader.error("`%r' not bound" % s) + + +class invalid_command(Command): + def do(self) -> None: + s = self.event_name + self.reader.error("command `%s' not known" % s) + + +class show_history(Command): + def do(self) -> None: + from .pager import get_pager + from site import gethistoryfile # type: ignore[attr-defined] + + history = os.linesep.join(self.reader.history[:]) + with self.reader.suspend(): + pager = get_pager() + pager(history, gethistoryfile()) + + +class paste_mode(Command): + + def do(self) -> None: + self.reader.paste_mode = not self.reader.paste_mode + self.reader.dirty = True + + +class enable_bracketed_paste(Command): + def do(self) -> None: + self.reader.paste_mode = True + self.reader.in_bracketed_paste = True + +class disable_bracketed_paste(Command): + def do(self) -> None: + self.reader.paste_mode = False + self.reader.in_bracketed_paste = False + self.reader.dirty = True diff --git a/Lib/_pyrepl/completing_reader.py b/Lib/_pyrepl/completing_reader.py new file mode 100644 index 00000000..05770aaf --- /dev/null +++ b/Lib/_pyrepl/completing_reader.py @@ -0,0 +1,290 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Antonio Cuni +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +from dataclasses import dataclass, field + +import re +from . import commands, console, reader +from .reader import Reader + + +# types +Command = commands.Command +if False: + from .types import KeySpec, CommandName + + +def prefix(wordlist: list[str], j: int = 0) -> str: + d = {} + i = j + try: + while 1: + for word in wordlist: + d[word[i]] = 1 + if len(d) > 1: + return wordlist[0][j:i] + i += 1 + d = {} + except IndexError: + return wordlist[0][j:i] + return "" + + +STRIPCOLOR_REGEX = re.compile(r"\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[m|K]") + +def stripcolor(s: str) -> str: + return STRIPCOLOR_REGEX.sub('', s) + + +def real_len(s: str) -> int: + return len(stripcolor(s)) + + +def left_align(s: str, maxlen: int) -> str: + stripped = stripcolor(s) + if len(stripped) > maxlen: + # too bad, we remove the color + return stripped[:maxlen] + padding = maxlen - len(stripped) + return s + ' '*padding + + +def build_menu( + cons: console.Console, + wordlist: list[str], + start: int, + use_brackets: bool, + sort_in_column: bool, +) -> tuple[list[str], int]: + if use_brackets: + item = "[ %s ]" + padding = 4 + else: + item = "%s " + padding = 2 + maxlen = min(max(map(real_len, wordlist)), cons.width - padding) + cols = int(cons.width / (maxlen + padding)) + rows = int((len(wordlist) - 1)/cols + 1) + + if sort_in_column: + # sort_in_column=False (default) sort_in_column=True + # A B C A D G + # D E F B E + # G C F + # + # "fill" the table with empty words, so we always have the same amout + # of rows for each column + missing = cols*rows - len(wordlist) + wordlist = wordlist + ['']*missing + indexes = [(i % cols) * rows + i // cols for i in range(len(wordlist))] + wordlist = [wordlist[i] for i in indexes] + menu = [] + i = start + for r in range(rows): + row = [] + for col in range(cols): + row.append(item % left_align(wordlist[i], maxlen)) + i += 1 + if i >= len(wordlist): + break + menu.append(''.join(row)) + if i >= len(wordlist): + i = 0 + break + if r + 5 > cons.height: + menu.append(" %d more... " % (len(wordlist) - i)) + break + return menu, i + +# this gets somewhat user interface-y, and as a result the logic gets +# very convoluted. +# +# To summarise the summary of the summary:- people are a problem. +# -- The Hitch-Hikers Guide to the Galaxy, Episode 12 + +#### Desired behaviour of the completions commands. +# the considerations are: +# (1) how many completions are possible +# (2) whether the last command was a completion +# (3) if we can assume that the completer is going to return the same set of +# completions: this is controlled by the ``assume_immutable_completions`` +# variable on the reader, which is True by default to match the historical +# behaviour of pyrepl, but e.g. False in the ReadlineAlikeReader to match +# more closely readline's semantics (this is needed e.g. by +# fancycompleter) +# +# if there's no possible completion, beep at the user and point this out. +# this is easy. +# +# if there's only one possible completion, stick it in. if the last thing +# user did was a completion, point out that he isn't getting anywhere, but +# only if the ``assume_immutable_completions`` is True. +# +# now it gets complicated. +# +# for the first press of a completion key: +# if there's a common prefix, stick it in. + +# irrespective of whether anything got stuck in, if the word is now +# complete, show the "complete but not unique" message + +# if there's no common prefix and if the word is not now complete, +# beep. + +# common prefix -> yes no +# word complete \/ +# yes "cbnu" "cbnu" +# no - beep + +# for the second bang on the completion key +# there will necessarily be no common prefix +# show a menu of the choices. + +# for subsequent bangs, rotate the menu around (if there are sufficient +# choices). + + +class complete(commands.Command): + def do(self) -> None: + r: CompletingReader + r = self.reader # type: ignore[assignment] + last_is_completer = r.last_command_is(self.__class__) + immutable_completions = r.assume_immutable_completions + completions_unchangable = last_is_completer and immutable_completions + stem = r.get_stem() + if not completions_unchangable: + r.cmpltn_menu_choices = r.get_completions(stem) + + completions = r.cmpltn_menu_choices + if not completions: + r.error("no matches") + elif len(completions) == 1: + if completions_unchangable and len(completions[0]) == len(stem): + r.msg = "[ sole completion ]" + r.dirty = True + r.insert(completions[0][len(stem):]) + else: + p = prefix(completions, len(stem)) + if p: + r.insert(p) + if last_is_completer: + r.cmpltn_menu_visible = True + r.cmpltn_message_visible = False + r.cmpltn_menu, r.cmpltn_menu_end = build_menu( + r.console, completions, r.cmpltn_menu_end, + r.use_brackets, r.sort_in_column) + r.dirty = True + elif not r.cmpltn_menu_visible: + r.cmpltn_message_visible = True + if stem + p in completions: + r.msg = "[ complete but not unique ]" + r.dirty = True + else: + r.msg = "[ not unique ]" + r.dirty = True + + +class self_insert(commands.self_insert): + def do(self) -> None: + r: CompletingReader + r = self.reader # type: ignore[assignment] + + commands.self_insert.do(self) + if r.cmpltn_menu_visible: + stem = r.get_stem() + if len(stem) < 1: + r.cmpltn_reset() + else: + completions = [w for w in r.cmpltn_menu_choices + if w.startswith(stem)] + if completions: + r.cmpltn_menu, r.cmpltn_menu_end = build_menu( + r.console, completions, 0, + r.use_brackets, r.sort_in_column) + else: + r.cmpltn_reset() + + +@dataclass +class CompletingReader(Reader): + """Adds completion support""" + + ### Class variables + # see the comment for the complete command + assume_immutable_completions = True + use_brackets = True # display completions inside [] + sort_in_column = False + + ### Instance variables + cmpltn_menu: list[str] = field(init=False) + cmpltn_menu_visible: bool = field(init=False) + cmpltn_message_visible: bool = field(init=False) + cmpltn_menu_end: int = field(init=False) + cmpltn_menu_choices: list[str] = field(init=False) + + def __post_init__(self) -> None: + super().__post_init__() + self.cmpltn_reset() + for c in (complete, self_insert): + self.commands[c.__name__] = c + self.commands[c.__name__.replace('_', '-')] = c + + def collect_keymap(self) -> tuple[tuple[KeySpec, CommandName], ...]: + return super().collect_keymap() + ( + (r'\t', 'complete'),) + + def after_command(self, cmd: Command) -> None: + super().after_command(cmd) + if not isinstance(cmd, (complete, self_insert)): + self.cmpltn_reset() + + def calc_screen(self) -> list[str]: + screen = super().calc_screen() + if self.cmpltn_menu_visible: + ly = self.lxy[1] + screen[ly:ly] = self.cmpltn_menu + self.screeninfo[ly:ly] = [(0, [])]*len(self.cmpltn_menu) + self.cxy = self.cxy[0], self.cxy[1] + len(self.cmpltn_menu) + return screen + + def finish(self) -> None: + super().finish() + self.cmpltn_reset() + + def cmpltn_reset(self) -> None: + self.cmpltn_menu = [] + self.cmpltn_menu_visible = False + self.cmpltn_message_visible = False + self.cmpltn_menu_end = 0 + self.cmpltn_menu_choices = [] + + def get_stem(self) -> str: + st = self.syntax_table + SW = reader.SYNTAX_WORD + b = self.buffer + p = self.pos - 1 + while p >= 0 and st.get(b[p], SW) == SW: + p -= 1 + return ''.join(b[p+1:self.pos]) + + def get_completions(self, stem: str) -> list[str]: + return [] diff --git a/Lib/_pyrepl/console.py b/Lib/_pyrepl/console.py new file mode 100644 index 00000000..03266c4d --- /dev/null +++ b/Lib/_pyrepl/console.py @@ -0,0 +1,212 @@ +# Copyright 2000-2004 Michael Hudson-Doyle +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +import _colorize # type: ignore[import-not-found] + +from abc import ABC, abstractmethod +import ast +import code +from dataclasses import dataclass, field +import os.path +import sys + + +TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import IO + from typing import Callable + + +@dataclass +class Event: + evt: str + data: str + raw: bytes = b"" + + +@dataclass +class Console(ABC): + screen: list[str] = field(default_factory=list) + height: int = 25 + width: int = 80 + + def __init__( + self, + f_in: IO[bytes] | int = 0, + f_out: IO[bytes] | int = 1, + term: str = "", + encoding: str = "", + ): + self.encoding = encoding or sys.getdefaultencoding() + + if isinstance(f_in, int): + self.input_fd = f_in + else: + self.input_fd = f_in.fileno() + + if isinstance(f_out, int): + self.output_fd = f_out + else: + self.output_fd = f_out.fileno() + + @abstractmethod + def refresh(self, screen: list[str], xy: tuple[int, int]) -> None: ... + + @abstractmethod + def prepare(self) -> None: ... + + @abstractmethod + def restore(self) -> None: ... + + @abstractmethod + def move_cursor(self, x: int, y: int) -> None: ... + + @abstractmethod + def set_cursor_vis(self, visible: bool) -> None: ... + + @abstractmethod + def getheightwidth(self) -> tuple[int, int]: + """Return (height, width) where height and width are the height + and width of the terminal window in characters.""" + ... + + @abstractmethod + def get_event(self, block: bool = True) -> Event | None: + """Return an Event instance. Returns None if |block| is false + and there is no event pending, otherwise waits for the + completion of an event.""" + ... + + @abstractmethod + def push_char(self, char: int | bytes) -> None: + """ + Push a character to the console event queue. + """ + ... + + @abstractmethod + def beep(self) -> None: ... + + @abstractmethod + def clear(self) -> None: + """Wipe the screen""" + ... + + @abstractmethod + def finish(self) -> None: + """Move the cursor to the end of the display and otherwise get + ready for end. XXX could be merged with restore? Hmm.""" + ... + + @abstractmethod + def flushoutput(self) -> None: + """Flush all output to the screen (assuming there's some + buffering going on somewhere).""" + ... + + @abstractmethod + def forgetinput(self) -> None: + """Forget all pending, but not yet processed input.""" + ... + + @abstractmethod + def getpending(self) -> Event: + """Return the characters that have been typed but not yet + processed.""" + ... + + @abstractmethod + def wait(self, timeout: float | None) -> bool: + """Wait for an event. The return value is True if an event is + available, False if the timeout has been reached. If timeout is + None, wait forever. The timeout is in milliseconds.""" + ... + + @property + def input_hook(self) -> Callable[[], int] | None: + """Returns the current input hook.""" + ... + + @abstractmethod + def repaint(self) -> None: ... + + +class InteractiveColoredConsole(code.InteractiveConsole): + def __init__( + self, + locals: dict[str, object] | None = None, + filename: str = "", + *, + local_exit: bool = False, + ) -> None: + super().__init__(locals=locals, filename=filename, local_exit=local_exit) # type: ignore[call-arg] + self.can_colorize = _colorize.can_colorize() + + def showsyntaxerror(self, filename=None, **kwargs): + super().showsyntaxerror(filename=filename, **kwargs) + + def _excepthook(self, typ, value, tb): + import traceback + lines = traceback.format_exception( + typ, value, tb, + colorize=self.can_colorize, + limit=traceback.BUILTIN_EXCEPTION_LIMIT) + self.write(''.join(lines)) + + def runsource(self, source, filename="", symbol="single"): + try: + tree = self.compile.compiler( + source, + filename, + "exec", + ast.PyCF_ONLY_AST, + incomplete_input=False, + ) + except (SyntaxError, OverflowError, ValueError): + self.showsyntaxerror(filename, source=source) + return False + if tree.body: + *_, last_stmt = tree.body + for stmt in tree.body: + wrapper = ast.Interactive if stmt is last_stmt else ast.Module + the_symbol = symbol if stmt is last_stmt else "exec" + item = wrapper([stmt]) + try: + code = self.compile.compiler(item, filename, the_symbol) + except SyntaxError as e: + if e.args[0] == "'await' outside function": + python = os.path.basename(sys.executable) + e.add_note( + f"Try the asyncio REPL ({python} -m asyncio) to use" + f" top-level 'await' and run background asyncio tasks." + ) + self.showsyntaxerror(filename, source=source) + return False + except (OverflowError, ValueError): + self.showsyntaxerror(filename, source=source) + return False + + if code is None: + return True + + self.runcode(code) + return False diff --git a/Lib/_pyrepl/curses.py b/Lib/_pyrepl/curses.py new file mode 100644 index 00000000..3a624d9f --- /dev/null +++ b/Lib/_pyrepl/curses.py @@ -0,0 +1,33 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +try: + import _curses +except ImportError: + try: + import curses as _curses # type: ignore[no-redef] + except ImportError: + from . import _minimal_curses as _curses # type: ignore[no-redef] + +setupterm = _curses.setupterm +tigetstr = _curses.tigetstr +tparm = _curses.tparm +error = _curses.error diff --git a/Lib/_pyrepl/fancy_termios.py b/Lib/_pyrepl/fancy_termios.py new file mode 100644 index 00000000..5b85cb0f --- /dev/null +++ b/Lib/_pyrepl/fancy_termios.py @@ -0,0 +1,74 @@ +# Copyright 2000-2004 Michael Hudson-Doyle +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import termios + + +class TermState: + def __init__(self, tuples): + ( + self.iflag, + self.oflag, + self.cflag, + self.lflag, + self.ispeed, + self.ospeed, + self.cc, + ) = tuples + + def as_list(self): + return [ + self.iflag, + self.oflag, + self.cflag, + self.lflag, + self.ispeed, + self.ospeed, + self.cc, + ] + + def copy(self): + return self.__class__(self.as_list()) + + +def tcgetattr(fd): + return TermState(termios.tcgetattr(fd)) + + +def tcsetattr(fd, when, attrs): + termios.tcsetattr(fd, when, attrs.as_list()) + + +class Term(TermState): + TS__init__ = TermState.__init__ + + def __init__(self, fd=0): + self.TS__init__(termios.tcgetattr(fd)) + self.fd = fd + self.stack = [] + + def save(self): + self.stack.append(self.as_list()) + + def set(self, when=termios.TCSANOW): + termios.tcsetattr(self.fd, when, self.as_list()) + + def restore(self): + self.TS__init__(self.stack.pop()) + self.set() diff --git a/Lib/_pyrepl/historical_reader.py b/Lib/_pyrepl/historical_reader.py new file mode 100644 index 00000000..5d416f33 --- /dev/null +++ b/Lib/_pyrepl/historical_reader.py @@ -0,0 +1,415 @@ +# Copyright 2000-2004 Michael Hudson-Doyle +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +from contextlib import contextmanager +from dataclasses import dataclass, field + +from . import commands, input +from .reader import Reader + + +if False: + from .types import SimpleContextManager, KeySpec, CommandName + + +isearch_keymap: tuple[tuple[KeySpec, CommandName], ...] = tuple( + [("\\%03o" % c, "isearch-end") for c in range(256) if chr(c) != "\\"] + + [(c, "isearch-add-character") for c in map(chr, range(32, 127)) if c != "\\"] + + [ + ("\\%03o" % c, "isearch-add-character") + for c in range(256) + if chr(c).isalpha() and chr(c) != "\\" + ] + + [ + ("\\\\", "self-insert"), + (r"\C-r", "isearch-backwards"), + (r"\C-s", "isearch-forwards"), + (r"\C-c", "isearch-cancel"), + (r"\C-g", "isearch-cancel"), + (r"\", "isearch-backspace"), + ] +) + +ISEARCH_DIRECTION_NONE = "" +ISEARCH_DIRECTION_BACKWARDS = "r" +ISEARCH_DIRECTION_FORWARDS = "f" + + +class next_history(commands.Command): + def do(self) -> None: + r = self.reader + if r.historyi == len(r.history): + r.error("end of history list") + return + r.select_item(r.historyi + 1) + + +class previous_history(commands.Command): + def do(self) -> None: + r = self.reader + if r.historyi == 0: + r.error("start of history list") + return + r.select_item(r.historyi - 1) + + +class history_search_backward(commands.Command): + def do(self) -> None: + r = self.reader + r.search_next(forwards=False) + + +class history_search_forward(commands.Command): + def do(self) -> None: + r = self.reader + r.search_next(forwards=True) + + +class restore_history(commands.Command): + def do(self) -> None: + r = self.reader + if r.historyi != len(r.history): + if r.get_unicode() != r.history[r.historyi]: + r.buffer = list(r.history[r.historyi]) + r.pos = len(r.buffer) + r.dirty = True + + +class first_history(commands.Command): + def do(self) -> None: + self.reader.select_item(0) + + +class last_history(commands.Command): + def do(self) -> None: + self.reader.select_item(len(self.reader.history)) + + +class operate_and_get_next(commands.FinishCommand): + def do(self) -> None: + self.reader.next_history = self.reader.historyi + 1 + + +class yank_arg(commands.Command): + def do(self) -> None: + r = self.reader + if r.last_command is self.__class__: + r.yank_arg_i += 1 + else: + r.yank_arg_i = 0 + if r.historyi < r.yank_arg_i: + r.error("beginning of history list") + return + a = r.get_arg(-1) + # XXX how to split? + words = r.get_item(r.historyi - r.yank_arg_i - 1).split() + if a < -len(words) or a >= len(words): + r.error("no such arg") + return + w = words[a] + b = r.buffer + if r.yank_arg_i > 0: + o = len(r.yank_arg_yanked) + else: + o = 0 + b[r.pos - o : r.pos] = list(w) + r.yank_arg_yanked = w + r.pos += len(w) - o + r.dirty = True + + +class forward_history_isearch(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_FORWARDS + r.isearch_start = r.historyi, r.pos + r.isearch_term = "" + r.dirty = True + r.push_input_trans(r.isearch_trans) + + +class reverse_history_isearch(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_BACKWARDS + r.dirty = True + r.isearch_term = "" + r.push_input_trans(r.isearch_trans) + r.isearch_start = r.historyi, r.pos + + +class isearch_cancel(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_NONE + r.pop_input_trans() + r.select_item(r.isearch_start[0]) + r.pos = r.isearch_start[1] + r.dirty = True + + +class isearch_add_character(commands.Command): + def do(self) -> None: + r = self.reader + b = r.buffer + r.isearch_term += self.event[-1] + r.dirty = True + p = r.pos + len(r.isearch_term) - 1 + if b[p : p + 1] != [r.isearch_term[-1]]: + r.isearch_next() + + +class isearch_backspace(commands.Command): + def do(self) -> None: + r = self.reader + if len(r.isearch_term) > 0: + r.isearch_term = r.isearch_term[:-1] + r.dirty = True + else: + r.error("nothing to rubout") + + +class isearch_forwards(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_FORWARDS + r.isearch_next() + + +class isearch_backwards(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_BACKWARDS + r.isearch_next() + + +class isearch_end(commands.Command): + def do(self) -> None: + r = self.reader + r.isearch_direction = ISEARCH_DIRECTION_NONE + r.console.forgetinput() + r.pop_input_trans() + r.dirty = True + + +@dataclass +class HistoricalReader(Reader): + """Adds history support (with incremental history searching) to the + Reader class. + """ + + history: list[str] = field(default_factory=list) + historyi: int = 0 + next_history: int | None = None + transient_history: dict[int, str] = field(default_factory=dict) + isearch_term: str = "" + isearch_direction: str = ISEARCH_DIRECTION_NONE + isearch_start: tuple[int, int] = field(init=False) + isearch_trans: input.KeymapTranslator = field(init=False) + yank_arg_i: int = 0 + yank_arg_yanked: str = "" + + def __post_init__(self) -> None: + super().__post_init__() + for c in [ + next_history, + previous_history, + restore_history, + first_history, + last_history, + yank_arg, + forward_history_isearch, + reverse_history_isearch, + isearch_end, + isearch_add_character, + isearch_cancel, + isearch_add_character, + isearch_backspace, + isearch_forwards, + isearch_backwards, + operate_and_get_next, + history_search_backward, + history_search_forward, + ]: + self.commands[c.__name__] = c + self.commands[c.__name__.replace("_", "-")] = c + self.isearch_start = self.historyi, self.pos + self.isearch_trans = input.KeymapTranslator( + isearch_keymap, invalid_cls=isearch_end, character_cls=isearch_add_character + ) + + def collect_keymap(self) -> tuple[tuple[KeySpec, CommandName], ...]: + return super().collect_keymap() + ( + (r"\C-n", "next-history"), + (r"\C-p", "previous-history"), + (r"\C-o", "operate-and-get-next"), + (r"\C-r", "reverse-history-isearch"), + (r"\C-s", "forward-history-isearch"), + (r"\M-r", "restore-history"), + (r"\M-.", "yank-arg"), + (r"\", "history-search-forward"), + (r"\x1b[6~", "history-search-forward"), + (r"\", "history-search-backward"), + (r"\x1b[5~", "history-search-backward"), + ) + + def select_item(self, i: int) -> None: + self.transient_history[self.historyi] = self.get_unicode() + buf = self.transient_history.get(i) + if buf is None: + buf = self.history[i].rstrip() + self.buffer = list(buf) + self.historyi = i + self.pos = len(self.buffer) + self.dirty = True + self.last_refresh_cache.invalidated = True + + def get_item(self, i: int) -> str: + if i != len(self.history): + return self.transient_history.get(i, self.history[i]) + else: + return self.transient_history.get(i, self.get_unicode()) + + @contextmanager + def suspend(self) -> SimpleContextManager: + with super().suspend(): + try: + old_history = self.history[:] + del self.history[:] + yield + finally: + self.history[:] = old_history + + def prepare(self) -> None: + super().prepare() + try: + self.transient_history = {} + if self.next_history is not None and self.next_history < len(self.history): + self.historyi = self.next_history + self.buffer[:] = list(self.history[self.next_history]) + self.pos = len(self.buffer) + self.transient_history[len(self.history)] = "" + else: + self.historyi = len(self.history) + self.next_history = None + except: + self.restore() + raise + + def get_prompt(self, lineno: int, cursor_on_line: bool) -> str: + if cursor_on_line and self.isearch_direction != ISEARCH_DIRECTION_NONE: + d = "rf"[self.isearch_direction == ISEARCH_DIRECTION_FORWARDS] + return "(%s-search `%s') " % (d, self.isearch_term) + else: + return super().get_prompt(lineno, cursor_on_line) + + def search_next(self, *, forwards: bool) -> None: + """Search history for the current line contents up to the cursor. + + Selects the first item found. If nothing is under the cursor, any next + item in history is selected. + """ + pos = self.pos + s = self.get_unicode() + history_index = self.historyi + + # In multiline contexts, we're only interested in the current line. + nl_index = s.rfind('\n', 0, pos) + prefix = s[nl_index + 1:pos] + pos = len(prefix) + + match_prefix = len(prefix) + len_item = 0 + if history_index < len(self.history): + len_item = len(self.get_item(history_index)) + if len_item and pos == len_item: + match_prefix = False + elif not pos: + match_prefix = False + + while 1: + if forwards: + out_of_bounds = history_index >= len(self.history) - 1 + else: + out_of_bounds = history_index == 0 + if out_of_bounds: + if forwards and not match_prefix: + self.pos = 0 + self.buffer = [] + self.dirty = True + else: + self.error("not found") + return + + history_index += 1 if forwards else -1 + s = self.get_item(history_index) + + if not match_prefix: + self.select_item(history_index) + return + + len_acc = 0 + for i, line in enumerate(s.splitlines(keepends=True)): + if line.startswith(prefix): + self.select_item(history_index) + self.pos = pos + len_acc + return + len_acc += len(line) + + def isearch_next(self) -> None: + st = self.isearch_term + p = self.pos + i = self.historyi + s = self.get_unicode() + forwards = self.isearch_direction == ISEARCH_DIRECTION_FORWARDS + while 1: + if forwards: + p = s.find(st, p + 1) + else: + p = s.rfind(st, 0, p + len(st) - 1) + if p != -1: + self.select_item(i) + self.pos = p + return + elif (forwards and i >= len(self.history) - 1) or (not forwards and i == 0): + self.error("not found") + return + else: + if forwards: + i += 1 + s = self.get_item(i) + p = -1 + else: + i -= 1 + s = self.get_item(i) + p = len(s) + + def finish(self) -> None: + super().finish() + ret = self.get_unicode() + for i, t in self.transient_history.items(): + if i < len(self.history) and i != self.historyi: + self.history[i] = t + if ret and should_auto_add_history: + self.history.append(ret) + + +should_auto_add_history = True diff --git a/Lib/_pyrepl/input.py b/Lib/_pyrepl/input.py new file mode 100644 index 00000000..21c24eb5 --- /dev/null +++ b/Lib/_pyrepl/input.py @@ -0,0 +1,114 @@ +# Copyright 2000-2004 Michael Hudson-Doyle +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# (naming modules after builtin functions is not such a hot idea...) + +# an KeyTrans instance translates Event objects into Command objects + +# hmm, at what level do we want [C-i] and [tab] to be equivalent? +# [meta-a] and [esc a]? obviously, these are going to be equivalent +# for the UnixConsole, but should they be for PygameConsole? + +# it would in any situation seem to be a bad idea to bind, say, [tab] +# and [C-i] to *different* things... but should binding one bind the +# other? + +# executive, temporary decision: [tab] and [C-i] are distinct, but +# [meta-key] is identified with [esc key]. We demand that any console +# class does quite a lot towards emulating a unix terminal. + +from __future__ import annotations + +from abc import ABC, abstractmethod +import unicodedata +from collections import deque + + +# types +if False: + from .types import EventTuple + + +class InputTranslator(ABC): + @abstractmethod + def push(self, evt: EventTuple) -> None: + pass + + @abstractmethod + def get(self) -> EventTuple | None: + return None + + @abstractmethod + def empty(self) -> bool: + return True + + +class KeymapTranslator(InputTranslator): + def __init__(self, keymap, verbose=False, invalid_cls=None, character_cls=None): + self.verbose = verbose + from .keymap import compile_keymap, parse_keys + + self.keymap = keymap + self.invalid_cls = invalid_cls + self.character_cls = character_cls + d = {} + for keyspec, command in keymap: + keyseq = tuple(parse_keys(keyspec)) + d[keyseq] = command + if self.verbose: + print(d) + self.k = self.ck = compile_keymap(d, ()) + self.results = deque() + self.stack = [] + + def push(self, evt): + if self.verbose: + print("pushed", evt.data, end="") + key = evt.data + d = self.k.get(key) + if isinstance(d, dict): + if self.verbose: + print("transition") + self.stack.append(key) + self.k = d + else: + if d is None: + if self.verbose: + print("invalid") + if self.stack or len(key) > 1 or unicodedata.category(key) == "C": + self.results.append((self.invalid_cls, self.stack + [key])) + else: + # small optimization: + self.k[key] = self.character_cls + self.results.append((self.character_cls, [key])) + else: + if self.verbose: + print("matched", d) + self.results.append((d, self.stack + [key])) + self.stack = [] + self.k = self.ck + + def get(self): + if self.results: + return self.results.popleft() + else: + return None + + def empty(self) -> bool: + return not self.results diff --git a/Lib/_pyrepl/keymap.py b/Lib/_pyrepl/keymap.py new file mode 100644 index 00000000..2fb03d19 --- /dev/null +++ b/Lib/_pyrepl/keymap.py @@ -0,0 +1,213 @@ +# Copyright 2000-2008 Michael Hudson-Doyle +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +""" +Keymap contains functions for parsing keyspecs and turning keyspecs into +appropriate sequences. + +A keyspec is a string representing a sequence of key presses that can +be bound to a command. All characters other than the backslash represent +themselves. In the traditional manner, a backslash introduces an escape +sequence. + +pyrepl uses its own keyspec format that is meant to be a strict superset of +readline's KEYSEQ format. This means that if a spec is found that readline +accepts that this doesn't, it should be logged as a bug. Note that this means +we're using the `\\C-o' style of readline's keyspec, not the `Control-o' sort. + +The extension to readline is that the sequence \\ denotes the +sequence of characters produced by hitting KEY. + +Examples: +`a' - what you get when you hit the `a' key +`\\EOA' - Escape - O - A (up, on my terminal) +`\\' - the up arrow key +`\\' - ditto (keynames are case-insensitive) +`\\C-o', `\\c-o' - control-o +`\\M-.' - meta-period +`\\E.' - ditto (that's how meta works for pyrepl) +`\\', `\\', `\\t', `\\011', '\\x09', '\\X09', '\\C-i', '\\C-I' + - all of these are the tab character. +""" + +_escapes = { + "\\": "\\", + "'": "'", + '"': '"', + "a": "\a", + "b": "\b", + "e": "\033", + "f": "\f", + "n": "\n", + "r": "\r", + "t": "\t", + "v": "\v", +} + +_keynames = { + "backspace": "backspace", + "delete": "delete", + "down": "down", + "end": "end", + "enter": "\r", + "escape": "\033", + "f1": "f1", + "f2": "f2", + "f3": "f3", + "f4": "f4", + "f5": "f5", + "f6": "f6", + "f7": "f7", + "f8": "f8", + "f9": "f9", + "f10": "f10", + "f11": "f11", + "f12": "f12", + "f13": "f13", + "f14": "f14", + "f15": "f15", + "f16": "f16", + "f17": "f17", + "f18": "f18", + "f19": "f19", + "f20": "f20", + "home": "home", + "insert": "insert", + "left": "left", + "page down": "page down", + "page up": "page up", + "return": "\r", + "right": "right", + "space": " ", + "tab": "\t", + "up": "up", +} + + +class KeySpecError(Exception): + pass + + +def parse_keys(keys: str) -> list[str]: + """Parse keys in keyspec format to a sequence of keys.""" + s = 0 + r: list[str] = [] + while s < len(keys): + k, s = _parse_single_key_sequence(keys, s) + r.extend(k) + return r + + +def _parse_single_key_sequence(key: str, s: int) -> tuple[list[str], int]: + ctrl = 0 + meta = 0 + ret = "" + while not ret and s < len(key): + if key[s] == "\\": + c = key[s + 1].lower() + if c in _escapes: + ret = _escapes[c] + s += 2 + elif c == "c": + if key[s + 2] != "-": + raise KeySpecError( + "\\C must be followed by `-' (char %d of %s)" + % (s + 2, repr(key)) + ) + if ctrl: + raise KeySpecError( + "doubled \\C- (char %d of %s)" % (s + 1, repr(key)) + ) + ctrl = 1 + s += 3 + elif c == "m": + if key[s + 2] != "-": + raise KeySpecError( + "\\M must be followed by `-' (char %d of %s)" + % (s + 2, repr(key)) + ) + if meta: + raise KeySpecError( + "doubled \\M- (char %d of %s)" % (s + 1, repr(key)) + ) + meta = 1 + s += 3 + elif c.isdigit(): + n = key[s + 1 : s + 4] + ret = chr(int(n, 8)) + s += 4 + elif c == "x": + n = key[s + 2 : s + 4] + ret = chr(int(n, 16)) + s += 4 + elif c == "<": + t = key.find(">", s) + if t == -1: + raise KeySpecError( + "unterminated \\< starting at char %d of %s" + % (s + 1, repr(key)) + ) + ret = key[s + 2 : t].lower() + if ret not in _keynames: + raise KeySpecError( + "unrecognised keyname `%s' at char %d of %s" + % (ret, s + 2, repr(key)) + ) + ret = _keynames[ret] + s = t + 1 + else: + raise KeySpecError( + "unknown backslash escape %s at char %d of %s" + % (repr(c), s + 2, repr(key)) + ) + else: + ret = key[s] + s += 1 + if ctrl: + if len(ret) == 1: + ret = chr(ord(ret) & 0x1F) # curses.ascii.ctrl() + elif ret in {"left", "right"}: + ret = f"ctrl {ret}" + else: + raise KeySpecError("\\C- followed by invalid key") + + result = [ret], s + if meta: + result[0].insert(0, "\033") + return result + + +def compile_keymap(keymap, empty=b""): + r = {} + for key, value in keymap.items(): + if isinstance(key, bytes): + first = key[:1] + else: + first = key[0] + r.setdefault(first, {})[key[1:]] = value + for key, value in r.items(): + if empty in value: + if len(value) != 1: + raise KeySpecError("key definitions for %s clash" % (value.values(),)) + else: + r[key] = value[empty] + else: + r[key] = compile_keymap(value, empty) + return r diff --git a/Lib/_pyrepl/main.py b/Lib/_pyrepl/main.py new file mode 100644 index 00000000..a6f824dc --- /dev/null +++ b/Lib/_pyrepl/main.py @@ -0,0 +1,59 @@ +import errno +import os +import sys + + +CAN_USE_PYREPL: bool +FAIL_REASON: str +try: + if sys.platform == "win32" and sys.getwindowsversion().build < 10586: + raise RuntimeError("Windows 10 TH2 or later required") + if not os.isatty(sys.stdin.fileno()): + raise OSError(errno.ENOTTY, "tty required", "stdin") + from .simple_interact import check + if err := check(): + raise RuntimeError(err) +except Exception as e: + CAN_USE_PYREPL = False + FAIL_REASON = f"warning: can't use pyrepl: {e}" +else: + CAN_USE_PYREPL = True + FAIL_REASON = "" + + +def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): + if not CAN_USE_PYREPL: + if not os.getenv('PYTHON_BASIC_REPL') and FAIL_REASON: + from .trace import trace + trace(FAIL_REASON) + print(FAIL_REASON, file=sys.stderr) + return sys._baserepl() + + if mainmodule: + namespace = mainmodule.__dict__ + else: + import __main__ + namespace = __main__.__dict__ + namespace.pop("__pyrepl_interactive_console", None) + + # sys._baserepl() above does this internally, we do it here + startup_path = os.getenv("PYTHONSTARTUP") + if pythonstartup and startup_path: + sys.audit("cpython.run_startup", startup_path) + + import tokenize + with tokenize.open(startup_path) as f: + startup_code = compile(f.read(), startup_path, "exec") + exec(startup_code, namespace) + + # set sys.{ps1,ps2} just before invoking the interactive interpreter. This + # mimics what CPython does in pythonrun.c + if not hasattr(sys, "ps1"): + sys.ps1 = ">>> " + if not hasattr(sys, "ps2"): + sys.ps2 = "... " + + from .console import InteractiveColoredConsole + from .simple_interact import run_multiline_interactive_console + console = InteractiveColoredConsole(namespace, filename="") + run_multiline_interactive_console(console) diff --git a/Lib/_pyrepl/mypy.ini b/Lib/_pyrepl/mypy.ini new file mode 100644 index 00000000..395f5945 --- /dev/null +++ b/Lib/_pyrepl/mypy.ini @@ -0,0 +1,24 @@ +# Config file for running mypy on _pyrepl. +# Run mypy by invoking `mypy --config-file Lib/_pyrepl/mypy.ini` +# on the command-line from the repo root + +[mypy] +files = Lib/_pyrepl +explicit_package_bases = True +python_version = 3.12 +platform = linux +pretty = True + +# Enable most stricter settings +enable_error_code = ignore-without-code,redundant-expr +strict = True + +# Various stricter settings that we can't yet enable +# Try to enable these in the following order: +disallow_untyped_calls = False +disallow_untyped_defs = False +check_untyped_defs = False + +# Various internal modules that typeshed deliberately doesn't have stubs for: +[mypy-_abc.*,_opcode.*,_overlapped.*,_testcapi.*,_testinternalcapi.*,test.*] +ignore_missing_imports = True diff --git a/Lib/_pyrepl/pager.py b/Lib/_pyrepl/pager.py new file mode 100644 index 00000000..1fddc63e --- /dev/null +++ b/Lib/_pyrepl/pager.py @@ -0,0 +1,175 @@ +from __future__ import annotations + +import io +import os +import re +import sys + + +# types +if False: + from typing import Protocol + class Pager(Protocol): + def __call__(self, text: str, title: str = "") -> None: + ... + + +def get_pager() -> Pager: + """Decide what method to use for paging through text.""" + if not hasattr(sys.stdin, "isatty"): + return plain_pager + if not hasattr(sys.stdout, "isatty"): + return plain_pager + if not sys.stdin.isatty() or not sys.stdout.isatty(): + return plain_pager + if sys.platform == "emscripten": + return plain_pager + use_pager = os.environ.get('MANPAGER') or os.environ.get('PAGER') + if use_pager: + if sys.platform == 'win32': # pipes completely broken in Windows + return lambda text, title='': tempfile_pager(plain(text), use_pager) + elif os.environ.get('TERM') in ('dumb', 'emacs'): + return lambda text, title='': pipe_pager(plain(text), use_pager, title) + else: + return lambda text, title='': pipe_pager(text, use_pager, title) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return plain_pager + if sys.platform == 'win32': + return lambda text, title='': tempfile_pager(plain(text), 'more <') + if hasattr(os, 'system') and os.system('(pager) 2>/dev/null') == 0: + return lambda text, title='': pipe_pager(text, 'pager', title) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return lambda text, title='': pipe_pager(text, 'less', title) + + import tempfile + (fd, filename) = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return lambda text, title='': pipe_pager(text, 'more', title) + else: + return tty_pager + finally: + os.unlink(filename) + + +def escape_stdout(text: str) -> str: + # Escape non-encodable characters to avoid encoding errors later + encoding = getattr(sys.stdout, 'encoding', None) or 'utf-8' + return text.encode(encoding, 'backslashreplace').decode(encoding) + + +def escape_less(s: str) -> str: + return re.sub(r'([?:.%\\])', r'\\\1', s) + + +def plain(text: str) -> str: + """Remove boldface formatting from text.""" + return re.sub('.\b', '', text) + + +def tty_pager(text: str, title: str = '') -> None: + """Page through text on a text terminal.""" + lines = plain(escape_stdout(text)).split('\n') + has_tty = False + try: + import tty + import termios + fd = sys.stdin.fileno() + old = termios.tcgetattr(fd) + tty.setcbreak(fd) + has_tty = True + + def getchar() -> str: + return sys.stdin.read(1) + + except (ImportError, AttributeError, io.UnsupportedOperation): + def getchar() -> str: + return sys.stdin.readline()[:-1][:1] + + try: + try: + h = int(os.environ.get('LINES', 0)) + except ValueError: + h = 0 + if h <= 1: + h = 25 + r = inc = h - 1 + sys.stdout.write('\n'.join(lines[:inc]) + '\n') + while lines[r:]: + sys.stdout.write('-- more --') + sys.stdout.flush() + c = getchar() + + if c in ('q', 'Q'): + sys.stdout.write('\r \r') + break + elif c in ('\r', '\n'): + sys.stdout.write('\r \r' + lines[r] + '\n') + r = r + 1 + continue + if c in ('b', 'B', '\x1b'): + r = r - inc - inc + if r < 0: r = 0 + sys.stdout.write('\n' + '\n'.join(lines[r:r+inc]) + '\n') + r = r + inc + + finally: + if has_tty: + termios.tcsetattr(fd, termios.TCSAFLUSH, old) + + +def plain_pager(text: str, title: str = '') -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + sys.stdout.write(plain(escape_stdout(text))) + + +def pipe_pager(text: str, cmd: str, title: str = '') -> None: + """Page through text by feeding it to another program.""" + import subprocess + env = os.environ.copy() + if title: + title += ' ' + esc_title = escape_less(title) + prompt_string = ( + f' {esc_title}' + + '?ltline %lt?L/%L.' + ':byte %bB?s/%s.' + '.' + '?e (END):?pB %pB\\%..' + ' (press h for help or q to quit)') + env['LESS'] = '-RmPm{0}$PM{0}$'.format(prompt_string) + proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + errors='backslashreplace', env=env) + assert proc.stdin is not None + try: + with proc.stdin as pipe: + try: + pipe.write(text) + except KeyboardInterrupt: + # We've hereby abandoned whatever text hasn't been written, + # but the pager is still in control of the terminal. + pass + except OSError: + pass # Ignore broken pipes caused by quitting the pager program. + while True: + try: + proc.wait() + break + except KeyboardInterrupt: + # Ignore ctl-c like the pager itself does. Otherwise the pager is + # left running and the terminal is in raw mode and unusable. + pass + + +def tempfile_pager(text: str, cmd: str, title: str = '') -> None: + """Page through text by invoking a program on a temporary file.""" + import tempfile + with tempfile.TemporaryDirectory() as tempdir: + filename = os.path.join(tempdir, 'pydoc.out') + with open(filename, 'w', errors='backslashreplace', + encoding=os.device_encoding(0) if + sys.platform == 'win32' else None + ) as file: + file.write(text) + os.system(cmd + ' "' + filename + '"') diff --git a/Lib/_pyrepl/reader.py b/Lib/_pyrepl/reader.py new file mode 100644 index 00000000..935c520c --- /dev/null +++ b/Lib/_pyrepl/reader.py @@ -0,0 +1,815 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Antonio Cuni +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +import sys + +from contextlib import contextmanager +from dataclasses import dataclass, field, fields +import unicodedata +from _colorize import can_colorize, ANSIColors # type: ignore[import-not-found] + + +from . import commands, console, input +from .utils import ANSI_ESCAPE_SEQUENCE, wlen, str_width +from .trace import trace + + +# types +Command = commands.Command +from .types import Callback, SimpleContextManager, KeySpec, CommandName + + +def disp_str(buffer: str) -> tuple[str, list[int]]: + """disp_str(buffer:string) -> (string, [int]) + + Return the string that should be the printed representation of + |buffer| and a list detailing where the characters of |buffer| + get used up. E.g.: + + >>> disp_str(chr(3)) + ('^C', [1, 0]) + + """ + b: list[int] = [] + s: list[str] = [] + for c in buffer: + if c == '\x1a': + s.append(c) + b.append(2) + elif ord(c) < 128: + s.append(c) + b.append(1) + elif unicodedata.category(c).startswith("C"): + c = r"\u%04x" % ord(c) + s.append(c) + b.extend([0] * (len(c) - 1)) + else: + s.append(c) + b.append(str_width(c)) + return "".join(s), b + + +# syntax classes: + +SYNTAX_WHITESPACE, SYNTAX_WORD, SYNTAX_SYMBOL = range(3) + + +def make_default_syntax_table() -> dict[str, int]: + # XXX perhaps should use some unicodedata here? + st: dict[str, int] = {} + for c in map(chr, range(256)): + st[c] = SYNTAX_SYMBOL + for c in [a for a in map(chr, range(256)) if a.isalnum()]: + st[c] = SYNTAX_WORD + st["\n"] = st[" "] = SYNTAX_WHITESPACE + return st + + +def make_default_commands() -> dict[CommandName, type[Command]]: + result: dict[CommandName, type[Command]] = {} + for v in vars(commands).values(): + if isinstance(v, type) and issubclass(v, Command) and v.__name__[0].islower(): + result[v.__name__] = v + result[v.__name__.replace("_", "-")] = v + return result + + +default_keymap: tuple[tuple[KeySpec, CommandName], ...] = tuple( + [ + (r"\C-a", "beginning-of-line"), + (r"\C-b", "left"), + (r"\C-c", "interrupt"), + (r"\C-d", "delete"), + (r"\C-e", "end-of-line"), + (r"\C-f", "right"), + (r"\C-g", "cancel"), + (r"\C-h", "backspace"), + (r"\C-j", "accept"), + (r"\", "accept"), + (r"\C-k", "kill-line"), + (r"\C-l", "clear-screen"), + (r"\C-m", "accept"), + (r"\C-t", "transpose-characters"), + (r"\C-u", "unix-line-discard"), + (r"\C-w", "unix-word-rubout"), + (r"\C-x\C-u", "upcase-region"), + (r"\C-y", "yank"), + *(() if sys.platform == "win32" else ((r"\C-z", "suspend"), )), + (r"\M-b", "backward-word"), + (r"\M-c", "capitalize-word"), + (r"\M-d", "kill-word"), + (r"\M-f", "forward-word"), + (r"\M-l", "downcase-word"), + (r"\M-t", "transpose-words"), + (r"\M-u", "upcase-word"), + (r"\M-y", "yank-pop"), + (r"\M--", "digit-arg"), + (r"\M-0", "digit-arg"), + (r"\M-1", "digit-arg"), + (r"\M-2", "digit-arg"), + (r"\M-3", "digit-arg"), + (r"\M-4", "digit-arg"), + (r"\M-5", "digit-arg"), + (r"\M-6", "digit-arg"), + (r"\M-7", "digit-arg"), + (r"\M-8", "digit-arg"), + (r"\M-9", "digit-arg"), + (r"\M-\n", "accept"), + ("\\\\", "self-insert"), + (r"\x1b[200~", "enable_bracketed_paste"), + (r"\x1b[201~", "disable_bracketed_paste"), + (r"\x03", "ctrl-c"), + ] + + [(c, "self-insert") for c in map(chr, range(32, 127)) if c != "\\"] + + [(c, "self-insert") for c in map(chr, range(128, 256)) if c.isalpha()] + + [ + (r"\", "up"), + (r"\", "down"), + (r"\", "left"), + (r"\C-\", "backward-word"), + (r"\", "right"), + (r"\C-\", "forward-word"), + (r"\", "delete"), + (r"\x1b[3~", "delete"), + (r"\", "backspace"), + (r"\M-\", "backward-kill-word"), + (r"\", "end-of-line"), # was 'end' + (r"\", "beginning-of-line"), # was 'home' + (r"\", "help"), + (r"\", "show-history"), + (r"\", "paste-mode"), + (r"\EOF", "end"), # the entries in the terminfo database for xterms + (r"\EOH", "home"), # seem to be wrong. this is a less than ideal + # workaround + ] +) + + +@dataclass(slots=True) +class Reader: + """The Reader class implements the bare bones of a command reader, + handling such details as editing and cursor motion. What it does + not support are such things as completion or history support - + these are implemented elsewhere. + + Instance variables of note include: + + * buffer: + A *list* (*not* a string at the moment :-) containing all the + characters that have been entered. + * console: + Hopefully encapsulates the OS dependent stuff. + * pos: + A 0-based index into `buffer' for where the insertion point + is. + * screeninfo: + Ahem. This list contains some info needed to move the + insertion point around reasonably efficiently. + * cxy, lxy: + the position of the insertion point in screen ... + * syntax_table: + Dictionary mapping characters to `syntax class'; read the + emacs docs to see what this means :-) + * commands: + Dictionary mapping command names to command classes. + * arg: + The emacs-style prefix argument. It will be None if no such + argument has been provided. + * dirty: + True if we need to refresh the display. + * kill_ring: + The emacs-style kill-ring; manipulated with yank & yank-pop + * ps1, ps2, ps3, ps4: + prompts. ps1 is the prompt for a one-line input; for a + multiline input it looks like: + ps2> first line of input goes here + ps3> second and further + ps3> lines get ps3 + ... + ps4> and the last one gets ps4 + As with the usual top-level, you can set these to instances if + you like; str() will be called on them (once) at the beginning + of each command. Don't put really long or newline containing + strings here, please! + This is just the default policy; you can change it freely by + overriding get_prompt() (and indeed some standard subclasses + do). + * finished: + handle1 will set this to a true value if a command signals + that we're done. + """ + + console: console.Console + + ## state + buffer: list[str] = field(default_factory=list) + pos: int = 0 + ps1: str = "->> " + ps2: str = "/>> " + ps3: str = "|.. " + ps4: str = R"\__ " + kill_ring: list[list[str]] = field(default_factory=list) + msg: str = "" + arg: int | None = None + dirty: bool = False + finished: bool = False + paste_mode: bool = False + in_bracketed_paste: bool = False + commands: dict[str, type[Command]] = field(default_factory=make_default_commands) + last_command: type[Command] | None = None + syntax_table: dict[str, int] = field(default_factory=make_default_syntax_table) + keymap: tuple[tuple[str, str], ...] = () + input_trans: input.KeymapTranslator = field(init=False) + input_trans_stack: list[input.KeymapTranslator] = field(default_factory=list) + screen: list[str] = field(default_factory=list) + screeninfo: list[tuple[int, list[int]]] = field(init=False) + cxy: tuple[int, int] = field(init=False) + lxy: tuple[int, int] = field(init=False) + scheduled_commands: list[str] = field(default_factory=list) + can_colorize: bool = False + threading_hook: Callback | None = None + + ## cached metadata to speed up screen refreshes + @dataclass + class RefreshCache: + in_bracketed_paste: bool = False + screen: list[str] = field(default_factory=list) + screeninfo: list[tuple[int, list[int]]] = field(init=False) + line_end_offsets: list[int] = field(default_factory=list) + pos: int = field(init=False) + cxy: tuple[int, int] = field(init=False) + dimensions: tuple[int, int] = field(init=False) + invalidated: bool = False + + def update_cache(self, + reader: Reader, + screen: list[str], + screeninfo: list[tuple[int, list[int]]], + ) -> None: + self.in_bracketed_paste = reader.in_bracketed_paste + self.screen = screen.copy() + self.screeninfo = screeninfo.copy() + self.pos = reader.pos + self.cxy = reader.cxy + self.dimensions = reader.console.width, reader.console.height + self.invalidated = False + + def valid(self, reader: Reader) -> bool: + if self.invalidated: + return False + dimensions = reader.console.width, reader.console.height + dimensions_changed = dimensions != self.dimensions + paste_changed = reader.in_bracketed_paste != self.in_bracketed_paste + return not (dimensions_changed or paste_changed) + + def get_cached_location(self, reader: Reader) -> tuple[int, int]: + if self.invalidated: + raise ValueError("Cache is invalidated") + offset = 0 + earliest_common_pos = min(reader.pos, self.pos) + num_common_lines = len(self.line_end_offsets) + while num_common_lines > 0: + offset = self.line_end_offsets[num_common_lines - 1] + if earliest_common_pos > offset: + break + num_common_lines -= 1 + else: + offset = 0 + return offset, num_common_lines + + last_refresh_cache: RefreshCache = field(default_factory=RefreshCache) + + def __post_init__(self) -> None: + # Enable the use of `insert` without a `prepare` call - necessary to + # facilitate the tab completion hack implemented for + # . + self.keymap = self.collect_keymap() + self.input_trans = input.KeymapTranslator( + self.keymap, invalid_cls="invalid-key", character_cls="self-insert" + ) + self.screeninfo = [(0, [])] + self.cxy = self.pos2xy() + self.lxy = (self.pos, 0) + self.can_colorize = can_colorize() + + self.last_refresh_cache.screeninfo = self.screeninfo + self.last_refresh_cache.pos = self.pos + self.last_refresh_cache.cxy = self.cxy + self.last_refresh_cache.dimensions = (0, 0) + + def collect_keymap(self) -> tuple[tuple[KeySpec, CommandName], ...]: + return default_keymap + + def calc_screen(self) -> list[str]: + """Translate changes in self.buffer into changes in self.console.screen.""" + # Since the last call to calc_screen: + # screen and screeninfo may differ due to a completion menu being shown + # pos and cxy may differ due to edits, cursor movements, or completion menus + + # Lines that are above both the old and new cursor position can't have changed, + # unless the terminal has been resized (which might cause reflowing) or we've + # entered or left paste mode (which changes prompts, causing reflowing). + num_common_lines = 0 + offset = 0 + if self.last_refresh_cache.valid(self): + offset, num_common_lines = self.last_refresh_cache.get_cached_location(self) + + screen = self.last_refresh_cache.screen + del screen[num_common_lines:] + + screeninfo = self.last_refresh_cache.screeninfo + del screeninfo[num_common_lines:] + + last_refresh_line_end_offsets = self.last_refresh_cache.line_end_offsets + del last_refresh_line_end_offsets[num_common_lines:] + + pos = self.pos + pos -= offset + + prompt_from_cache = (offset and self.buffer[offset - 1] != "\n") + + lines = "".join(self.buffer[offset:]).split("\n") + + cursor_found = False + lines_beyond_cursor = 0 + for ln, line in enumerate(lines, num_common_lines): + ll = len(line) + if 0 <= pos <= ll: + self.lxy = pos, ln + cursor_found = True + elif cursor_found: + lines_beyond_cursor += 1 + if lines_beyond_cursor > self.console.height: + # No need to keep formatting lines. + # The console can't show them. + break + if prompt_from_cache: + # Only the first line's prompt can come from the cache + prompt_from_cache = False + prompt = "" + else: + prompt = self.get_prompt(ln, ll >= pos >= 0) + while "\n" in prompt: + pre_prompt, _, prompt = prompt.partition("\n") + last_refresh_line_end_offsets.append(offset) + screen.append(pre_prompt) + screeninfo.append((0, [])) + pos -= ll + 1 + prompt, lp = self.process_prompt(prompt) + l, l2 = disp_str(line) + wrapcount = (wlen(l) + lp) // self.console.width + if wrapcount == 0: + offset += ll + 1 # Takes all of the line plus the newline + last_refresh_line_end_offsets.append(offset) + screen.append(prompt + l) + screeninfo.append((lp, l2)) + else: + i = 0 + while l: + prelen = lp if i == 0 else 0 + index_to_wrap_before = 0 + column = 0 + for character_width in l2: + if column + character_width >= self.console.width - prelen: + break + index_to_wrap_before += 1 + column += character_width + pre = prompt if i == 0 else "" + if len(l) > index_to_wrap_before: + offset += index_to_wrap_before + post = "\\" + after = [1] + else: + offset += index_to_wrap_before + 1 # Takes the newline + post = "" + after = [] + last_refresh_line_end_offsets.append(offset) + screen.append(pre + l[:index_to_wrap_before] + post) + screeninfo.append((prelen, l2[:index_to_wrap_before] + after)) + l = l[index_to_wrap_before:] + l2 = l2[index_to_wrap_before:] + i += 1 + self.screeninfo = screeninfo + self.cxy = self.pos2xy() + if self.msg: + for mline in self.msg.split("\n"): + screen.append(mline) + screeninfo.append((0, [])) + + self.last_refresh_cache.update_cache(self, screen, screeninfo) + return screen + + @staticmethod + def process_prompt(prompt: str) -> tuple[str, int]: + """Process the prompt. + + This means calculate the length of the prompt. The character \x01 + and \x02 are used to bracket ANSI control sequences and need to be + excluded from the length calculation. So also a copy of the prompt + is returned with these control characters removed.""" + + # The logic below also ignores the length of common escape + # sequences if they were not explicitly within \x01...\x02. + # They are CSI (or ANSI) sequences ( ESC [ ... LETTER ) + + # wlen from utils already excludes ANSI_ESCAPE_SEQUENCE chars, + # which breaks the logic below so we redefine it here. + def wlen(s: str) -> int: + return sum(str_width(i) for i in s) + + out_prompt = "" + l = wlen(prompt) + pos = 0 + while True: + s = prompt.find("\x01", pos) + if s == -1: + break + e = prompt.find("\x02", s) + if e == -1: + break + # Found start and end brackets, subtract from string length + l = l - (e - s + 1) + keep = prompt[pos:s] + l -= sum(map(wlen, ANSI_ESCAPE_SEQUENCE.findall(keep))) + out_prompt += keep + prompt[s + 1 : e] + pos = e + 1 + keep = prompt[pos:] + l -= sum(map(wlen, ANSI_ESCAPE_SEQUENCE.findall(keep))) + out_prompt += keep + return out_prompt, l + + def bow(self, p: int | None = None) -> int: + """Return the 0-based index of the word break preceding p most + immediately. + + p defaults to self.pos; word boundaries are determined using + self.syntax_table.""" + if p is None: + p = self.pos + st = self.syntax_table + b = self.buffer + p -= 1 + while p >= 0 and st.get(b[p], SYNTAX_WORD) != SYNTAX_WORD: + p -= 1 + while p >= 0 and st.get(b[p], SYNTAX_WORD) == SYNTAX_WORD: + p -= 1 + return p + 1 + + def eow(self, p: int | None = None) -> int: + """Return the 0-based index of the word break following p most + immediately. + + p defaults to self.pos; word boundaries are determined using + self.syntax_table.""" + if p is None: + p = self.pos + st = self.syntax_table + b = self.buffer + while p < len(b) and st.get(b[p], SYNTAX_WORD) != SYNTAX_WORD: + p += 1 + while p < len(b) and st.get(b[p], SYNTAX_WORD) == SYNTAX_WORD: + p += 1 + return p + + def bol(self, p: int | None = None) -> int: + """Return the 0-based index of the line break preceding p most + immediately. + + p defaults to self.pos.""" + if p is None: + p = self.pos + b = self.buffer + p -= 1 + while p >= 0 and b[p] != "\n": + p -= 1 + return p + 1 + + def eol(self, p: int | None = None) -> int: + """Return the 0-based index of the line break following p most + immediately. + + p defaults to self.pos.""" + if p is None: + p = self.pos + b = self.buffer + while p < len(b) and b[p] != "\n": + p += 1 + return p + + def max_column(self, y: int) -> int: + """Return the last x-offset for line y""" + return self.screeninfo[y][0] + sum(self.screeninfo[y][1]) + + def max_row(self) -> int: + return len(self.screeninfo) - 1 + + def get_arg(self, default: int = 1) -> int: + """Return any prefix argument that the user has supplied, + returning `default' if there is None. Defaults to 1. + """ + if self.arg is None: + return default + return self.arg + + def get_prompt(self, lineno: int, cursor_on_line: bool) -> str: + """Return what should be in the left-hand margin for line + `lineno'.""" + if self.arg is not None and cursor_on_line: + prompt = f"(arg: {self.arg}) " + elif self.paste_mode and not self.in_bracketed_paste: + prompt = "(paste) " + elif "\n" in self.buffer: + if lineno == 0: + prompt = self.ps2 + elif self.ps4 and lineno == self.buffer.count("\n"): + prompt = self.ps4 + else: + prompt = self.ps3 + else: + prompt = self.ps1 + + if self.can_colorize: + prompt = f"{ANSIColors.BOLD_MAGENTA}{prompt}{ANSIColors.RESET}" + return prompt + + def push_input_trans(self, itrans: input.KeymapTranslator) -> None: + self.input_trans_stack.append(self.input_trans) + self.input_trans = itrans + + def pop_input_trans(self) -> None: + self.input_trans = self.input_trans_stack.pop() + + def setpos_from_xy(self, x: int, y: int) -> None: + """Set pos according to coordinates x, y""" + pos = 0 + i = 0 + while i < y: + prompt_len, character_widths = self.screeninfo[i] + offset = len(character_widths) - character_widths.count(0) + in_wrapped_line = prompt_len + sum(character_widths) >= self.console.width + if in_wrapped_line: + pos += offset - 1 # -1 cause backslash is not in buffer + else: + pos += offset + 1 # +1 cause newline is in buffer + i += 1 + + j = 0 + cur_x = self.screeninfo[i][0] + while cur_x < x: + if self.screeninfo[i][1][j] == 0: + continue + cur_x += self.screeninfo[i][1][j] + j += 1 + pos += 1 + + self.pos = pos + + def pos2xy(self) -> tuple[int, int]: + """Return the x, y coordinates of position 'pos'.""" + # this *is* incomprehensible, yes. + y = 0 + pos = self.pos + assert 0 <= pos <= len(self.buffer) + if pos == len(self.buffer): + y = len(self.screeninfo) - 1 + p, l2 = self.screeninfo[y] + return p + sum(l2) + l2.count(0), y + + for p, l2 in self.screeninfo: + l = len(l2) - l2.count(0) + in_wrapped_line = p + sum(l2) >= self.console.width + offset = l - 1 if in_wrapped_line else l # need to remove backslash + if offset >= pos: + break + + if p + sum(l2) >= self.console.width: + pos -= l - 1 # -1 cause backslash is not in buffer + else: + pos -= l + 1 # +1 cause newline is in buffer + y += 1 + return p + sum(l2[:pos]), y + + def insert(self, text: str | list[str]) -> None: + """Insert 'text' at the insertion point.""" + self.buffer[self.pos : self.pos] = list(text) + self.pos += len(text) + self.dirty = True + + def update_cursor(self) -> None: + """Move the cursor to reflect changes in self.pos""" + self.cxy = self.pos2xy() + self.console.move_cursor(*self.cxy) + + def after_command(self, cmd: Command) -> None: + """This function is called to allow post command cleanup.""" + if getattr(cmd, "kills_digit_arg", True): + if self.arg is not None: + self.dirty = True + self.arg = None + + def prepare(self) -> None: + """Get ready to run. Call restore when finished. You must not + write to the console in between the calls to prepare and + restore.""" + try: + self.console.prepare() + self.arg = None + self.finished = False + del self.buffer[:] + self.pos = 0 + self.dirty = True + self.last_command = None + self.calc_screen() + except BaseException: + self.restore() + raise + + while self.scheduled_commands: + cmd = self.scheduled_commands.pop() + self.do_cmd((cmd, [])) + + def last_command_is(self, cls: type) -> bool: + if not self.last_command: + return False + return issubclass(cls, self.last_command) + + def restore(self) -> None: + """Clean up after a run.""" + self.console.restore() + + @contextmanager + def suspend(self) -> SimpleContextManager: + """A context manager to delegate to another reader.""" + prev_state = {f.name: getattr(self, f.name) for f in fields(self)} + try: + self.restore() + yield + finally: + for arg in ("msg", "ps1", "ps2", "ps3", "ps4", "paste_mode"): + setattr(self, arg, prev_state[arg]) + self.prepare() + + def finish(self) -> None: + """Called when a command signals that we're finished.""" + pass + + def error(self, msg: str = "none") -> None: + self.msg = "! " + msg + " " + self.dirty = True + self.console.beep() + + def update_screen(self) -> None: + if self.dirty: + self.refresh() + + def refresh(self) -> None: + """Recalculate and refresh the screen.""" + if self.in_bracketed_paste and self.buffer and not self.buffer[-1] == "\n": + return + + # this call sets up self.cxy, so call it first. + self.screen = self.calc_screen() + self.console.refresh(self.screen, self.cxy) + self.dirty = False + + def do_cmd(self, cmd: tuple[str, list[str]]) -> None: + """`cmd` is a tuple of "event_name" and "event", which in the current + implementation is always just the "buffer" which happens to be a list + of single-character strings.""" + + trace("received command {cmd}", cmd=cmd) + if isinstance(cmd[0], str): + command_type = self.commands.get(cmd[0], commands.invalid_command) + elif isinstance(cmd[0], type): + command_type = cmd[0] + else: + return # nothing to do + + command = command_type(self, *cmd) # type: ignore[arg-type] + command.do() + + self.after_command(command) + + if self.dirty: + self.refresh() + else: + self.update_cursor() + + if not isinstance(cmd, commands.digit_arg): + self.last_command = command_type + + self.finished = bool(command.finish) + if self.finished: + self.console.finish() + self.finish() + + def run_hooks(self) -> None: + threading_hook = self.threading_hook + if threading_hook is None and 'threading' in sys.modules: + from ._threading_handler import install_threading_hook + install_threading_hook(self) + if threading_hook is not None: + try: + threading_hook() + except Exception: + pass + + input_hook = self.console.input_hook + if input_hook: + try: + input_hook() + except Exception: + pass + + def handle1(self, block: bool = True) -> bool: + """Handle a single event. Wait as long as it takes if block + is true (the default), otherwise return False if no event is + pending.""" + + if self.msg: + self.msg = "" + self.dirty = True + + while True: + # We use the same timeout as in readline.c: 100ms + self.run_hooks() + self.console.wait(100) + event = self.console.get_event(block=False) + if not event: + if block: + continue + return False + + translate = True + + if event.evt == "key": + self.input_trans.push(event) + elif event.evt == "scroll": + self.refresh() + elif event.evt == "resize": + self.refresh() + else: + translate = False + + if translate: + cmd = self.input_trans.get() + else: + cmd = [event.evt, event.data] + + if cmd is None: + if block: + continue + return False + + self.do_cmd(cmd) + return True + + def push_char(self, char: int | bytes) -> None: + self.console.push_char(char) + self.handle1(block=False) + + def readline(self, startup_hook: Callback | None = None) -> str: + """Read a line. The implementation of this method also shows + how to drive Reader if you want more control over the event + loop.""" + self.prepare() + try: + if startup_hook is not None: + startup_hook() + self.refresh() + while not self.finished: + self.handle1() + return self.get_unicode() + + finally: + self.restore() + + def bind(self, spec: KeySpec, command: CommandName) -> None: + self.keymap = self.keymap + ((spec, command),) + self.input_trans = input.KeymapTranslator( + self.keymap, invalid_cls="invalid-key", character_cls="self-insert" + ) + + def get_unicode(self) -> str: + """Return the current buffer as a unicode string.""" + return "".join(self.buffer) diff --git a/Lib/_pyrepl/readline.py b/Lib/_pyrepl/readline.py new file mode 100644 index 00000000..888185eb --- /dev/null +++ b/Lib/_pyrepl/readline.py @@ -0,0 +1,598 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Alex Gaynor +# Antonio Cuni +# Armin Rigo +# Holger Krekel +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""A compatibility wrapper reimplementing the 'readline' standard module +on top of pyrepl. Not all functionalities are supported. Contains +extensions for multiline input. +""" + +from __future__ import annotations + +import warnings +from dataclasses import dataclass, field + +import os +from site import gethistoryfile # type: ignore[attr-defined] +import sys +from rlcompleter import Completer as RLCompleter + +from . import commands, historical_reader +from .completing_reader import CompletingReader +from .console import Console as ConsoleType + +Console: type[ConsoleType] +_error: tuple[type[Exception], ...] | type[Exception] +try: + from .unix_console import UnixConsole as Console, _error +except ImportError: + from .windows_console import WindowsConsole as Console, _error + +ENCODING = sys.getdefaultencoding() or "latin1" + + +# types +Command = commands.Command +from collections.abc import Callable, Collection +from .types import Callback, Completer, KeySpec, CommandName + +TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import Any, Mapping + + +MoreLinesCallable = Callable[[str], bool] + + +__all__ = [ + "add_history", + "clear_history", + "get_begidx", + "get_completer", + "get_completer_delims", + "get_current_history_length", + "get_endidx", + "get_history_item", + "get_history_length", + "get_line_buffer", + "insert_text", + "parse_and_bind", + "read_history_file", + # "read_init_file", + # "redisplay", + "remove_history_item", + "replace_history_item", + "set_auto_history", + "set_completer", + "set_completer_delims", + "set_history_length", + # "set_pre_input_hook", + "set_startup_hook", + "write_history_file", + # ---- multiline extensions ---- + "multiline_input", +] + +# ____________________________________________________________ + +@dataclass +class ReadlineConfig: + readline_completer: Completer | None = None + completer_delims: frozenset[str] = frozenset(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?") + + +@dataclass(kw_only=True) +class ReadlineAlikeReader(historical_reader.HistoricalReader, CompletingReader): + # Class fields + assume_immutable_completions = False + use_brackets = False + sort_in_column = True + + # Instance fields + config: ReadlineConfig + more_lines: MoreLinesCallable | None = None + last_used_indentation: str | None = None + + def __post_init__(self) -> None: + super().__post_init__() + self.commands["maybe_accept"] = maybe_accept + self.commands["maybe-accept"] = maybe_accept + self.commands["backspace_dedent"] = backspace_dedent + self.commands["backspace-dedent"] = backspace_dedent + + def error(self, msg: str = "none") -> None: + pass # don't show error messages by default + + def get_stem(self) -> str: + b = self.buffer + p = self.pos - 1 + completer_delims = self.config.completer_delims + while p >= 0 and b[p] not in completer_delims: + p -= 1 + return "".join(b[p + 1 : self.pos]) + + def get_completions(self, stem: str) -> list[str]: + if len(stem) == 0 and self.more_lines is not None: + b = self.buffer + p = self.pos + while p > 0 and b[p - 1] != "\n": + p -= 1 + num_spaces = 4 - ((self.pos - p) % 4) + return [" " * num_spaces] + result = [] + function = self.config.readline_completer + if function is not None: + try: + stem = str(stem) # rlcompleter.py seems to not like unicode + except UnicodeEncodeError: + pass # but feed unicode anyway if we have no choice + state = 0 + while True: + try: + next = function(stem, state) + except Exception: + break + if not isinstance(next, str): + break + result.append(next) + state += 1 + # emulate the behavior of the standard readline that sorts + # the completions before displaying them. + result.sort() + return result + + def get_trimmed_history(self, maxlength: int) -> list[str]: + if maxlength >= 0: + cut = len(self.history) - maxlength + if cut < 0: + cut = 0 + else: + cut = 0 + return self.history[cut:] + + def update_last_used_indentation(self) -> None: + indentation = _get_first_indentation(self.buffer) + if indentation is not None: + self.last_used_indentation = indentation + + # --- simplified support for reading multiline Python statements --- + + def collect_keymap(self) -> tuple[tuple[KeySpec, CommandName], ...]: + return super().collect_keymap() + ( + (r"\n", "maybe-accept"), + (r"\", "backspace-dedent"), + ) + + def after_command(self, cmd: Command) -> None: + super().after_command(cmd) + if self.more_lines is None: + # Force single-line input if we are in raw_input() mode. + # Although there is no direct way to add a \n in this mode, + # multiline buffers can still show up using various + # commands, e.g. navigating the history. + try: + index = self.buffer.index("\n") + except ValueError: + pass + else: + self.buffer = self.buffer[:index] + if self.pos > len(self.buffer): + self.pos = len(self.buffer) + + +def set_auto_history(_should_auto_add_history: bool) -> None: + """Enable or disable automatic history""" + historical_reader.should_auto_add_history = bool(_should_auto_add_history) + + +def _get_this_line_indent(buffer: list[str], pos: int) -> int: + indent = 0 + while pos > 0 and buffer[pos - 1] in " \t": + indent += 1 + pos -= 1 + if pos > 0 and buffer[pos - 1] == "\n": + return indent + return 0 + + +def _get_previous_line_indent(buffer: list[str], pos: int) -> tuple[int, int | None]: + prevlinestart = pos + while prevlinestart > 0 and buffer[prevlinestart - 1] != "\n": + prevlinestart -= 1 + prevlinetext = prevlinestart + while prevlinetext < pos and buffer[prevlinetext] in " \t": + prevlinetext += 1 + if prevlinetext == pos: + indent = None + else: + indent = prevlinetext - prevlinestart + return prevlinestart, indent + + +def _get_first_indentation(buffer: list[str]) -> str | None: + indented_line_start = None + for i in range(len(buffer)): + if (i < len(buffer) - 1 + and buffer[i] == "\n" + and buffer[i + 1] in " \t" + ): + indented_line_start = i + 1 + elif indented_line_start is not None and buffer[i] not in " \t\n": + return ''.join(buffer[indented_line_start : i]) + return None + + +def _should_auto_indent(buffer: list[str], pos: int) -> bool: + # check if last character before "pos" is a colon, ignoring + # whitespaces and comments. + last_char = None + while pos > 0: + pos -= 1 + if last_char is None: + if buffer[pos] not in " \t\n#": # ignore whitespaces and comments + last_char = buffer[pos] + else: + # even if we found a non-whitespace character before + # original pos, we keep going back until newline is reached + # to make sure we ignore comments + if buffer[pos] == "\n": + break + if buffer[pos] == "#": + last_char = None + return last_char == ":" + + +class maybe_accept(commands.Command): + def do(self) -> None: + r: ReadlineAlikeReader + r = self.reader # type: ignore[assignment] + r.dirty = True # this is needed to hide the completion menu, if visible + + if self.reader.in_bracketed_paste: + r.insert("\n") + return + + # if there are already several lines and the cursor + # is not on the last one, always insert a new \n. + text = r.get_unicode() + + if "\n" in r.buffer[r.pos :] or ( + r.more_lines is not None and r.more_lines(text) + ): + def _newline_before_pos(): + before_idx = r.pos - 1 + while before_idx > 0 and text[before_idx].isspace(): + before_idx -= 1 + return text[before_idx : r.pos].count("\n") > 0 + + # if there's already a new line before the cursor then + # even if the cursor is followed by whitespace, we assume + # the user is trying to terminate the block + if _newline_before_pos() and text[r.pos:].isspace(): + self.finish = True + return + + # auto-indent the next line like the previous line + prevlinestart, indent = _get_previous_line_indent(r.buffer, r.pos) + r.insert("\n") + if not self.reader.paste_mode: + if indent: + for i in range(prevlinestart, prevlinestart + indent): + r.insert(r.buffer[i]) + r.update_last_used_indentation() + if _should_auto_indent(r.buffer, r.pos): + if r.last_used_indentation is not None: + indentation = r.last_used_indentation + else: + # default + indentation = " " * 4 + r.insert(indentation) + elif not self.reader.paste_mode: + self.finish = True + else: + r.insert("\n") + + +class backspace_dedent(commands.Command): + def do(self) -> None: + r = self.reader + b = r.buffer + if r.pos > 0: + repeat = 1 + if b[r.pos - 1] != "\n": + indent = _get_this_line_indent(b, r.pos) + if indent > 0: + ls = r.pos - indent + while ls > 0: + ls, pi = _get_previous_line_indent(b, ls - 1) + if pi is not None and pi < indent: + repeat = indent - pi + break + r.pos -= repeat + del b[r.pos : r.pos + repeat] + r.dirty = True + else: + self.reader.error("can't backspace at start") + + +# ____________________________________________________________ + + +@dataclass(slots=True) +class _ReadlineWrapper: + f_in: int = -1 + f_out: int = -1 + reader: ReadlineAlikeReader | None = field(default=None, repr=False) + saved_history_length: int = -1 + startup_hook: Callback | None = None + config: ReadlineConfig = field(default_factory=ReadlineConfig, repr=False) + + def __post_init__(self) -> None: + if self.f_in == -1: + self.f_in = os.dup(0) + if self.f_out == -1: + self.f_out = os.dup(1) + + def get_reader(self) -> ReadlineAlikeReader: + if self.reader is None: + console = Console(self.f_in, self.f_out, encoding=ENCODING) + self.reader = ReadlineAlikeReader(console=console, config=self.config) + return self.reader + + def input(self, prompt: object = "") -> str: + try: + reader = self.get_reader() + except _error: + assert raw_input is not None + return raw_input(prompt) + prompt_str = str(prompt) + reader.ps1 = prompt_str + sys.audit("builtins.input", prompt_str) + result = reader.readline(startup_hook=self.startup_hook) + sys.audit("builtins.input/result", result) + return result + + def multiline_input(self, more_lines: MoreLinesCallable, ps1: str, ps2: str) -> str: + """Read an input on possibly multiple lines, asking for more + lines as long as 'more_lines(unicodetext)' returns an object whose + boolean value is true. + """ + reader = self.get_reader() + saved = reader.more_lines + try: + reader.more_lines = more_lines + reader.ps1 = ps1 + reader.ps2 = ps1 + reader.ps3 = ps2 + reader.ps4 = "" + with warnings.catch_warnings(action="ignore"): + return reader.readline() + finally: + reader.more_lines = saved + reader.paste_mode = False + + def parse_and_bind(self, string: str) -> None: + pass # XXX we don't support parsing GNU-readline-style init files + + def set_completer(self, function: Completer | None = None) -> None: + self.config.readline_completer = function + + def get_completer(self) -> Completer | None: + return self.config.readline_completer + + def set_completer_delims(self, delimiters: Collection[str]) -> None: + self.config.completer_delims = frozenset(delimiters) + + def get_completer_delims(self) -> str: + return "".join(sorted(self.config.completer_delims)) + + def _histline(self, line: str) -> str: + line = line.rstrip("\n") + return line + + def get_history_length(self) -> int: + return self.saved_history_length + + def set_history_length(self, length: int) -> None: + self.saved_history_length = length + + def get_current_history_length(self) -> int: + return len(self.get_reader().history) + + def read_history_file(self, filename: str = gethistoryfile()) -> None: + # multiline extension (really a hack) for the end of lines that + # are actually continuations inside a single multiline_input() + # history item: we use \r\n instead of just \n. If the history + # file is passed to GNU readline, the extra \r are just ignored. + history = self.get_reader().history + + with open(os.path.expanduser(filename), 'rb') as f: + is_editline = f.readline().startswith(b"_HiStOrY_V2_") + if is_editline: + encoding = "unicode-escape" + else: + f.seek(0) + encoding = "utf-8" + + lines = [line.decode(encoding, errors='replace') for line in f.read().split(b'\n')] + buffer = [] + for line in lines: + if line.endswith("\r"): + buffer.append(line+'\n') + else: + line = self._histline(line) + if buffer: + line = self._histline("".join(buffer).replace("\r", "") + line) + del buffer[:] + if line: + history.append(line) + + def write_history_file(self, filename: str = gethistoryfile()) -> None: + maxlength = self.saved_history_length + history = self.get_reader().get_trimmed_history(maxlength) + f = open(os.path.expanduser(filename), "w", + encoding="utf-8", newline="\n") + with f: + for entry in history: + entry = entry.replace("\n", "\r\n") # multiline history support + f.write(entry + "\n") + + def clear_history(self) -> None: + del self.get_reader().history[:] + + def get_history_item(self, index: int) -> str | None: + history = self.get_reader().history + if 1 <= index <= len(history): + return history[index - 1] + else: + return None # like readline.c + + def remove_history_item(self, index: int) -> None: + history = self.get_reader().history + if 0 <= index < len(history): + del history[index] + else: + raise ValueError("No history item at position %d" % index) + # like readline.c + + def replace_history_item(self, index: int, line: str) -> None: + history = self.get_reader().history + if 0 <= index < len(history): + history[index] = self._histline(line) + else: + raise ValueError("No history item at position %d" % index) + # like readline.c + + def add_history(self, line: str) -> None: + self.get_reader().history.append(self._histline(line)) + + def set_startup_hook(self, function: Callback | None = None) -> None: + self.startup_hook = function + + def get_line_buffer(self) -> str: + return self.get_reader().get_unicode() + + def _get_idxs(self) -> tuple[int, int]: + start = cursor = self.get_reader().pos + buf = self.get_line_buffer() + for i in range(cursor - 1, -1, -1): + if buf[i] in self.get_completer_delims(): + break + start = i + return start, cursor + + def get_begidx(self) -> int: + return self._get_idxs()[0] + + def get_endidx(self) -> int: + return self._get_idxs()[1] + + def insert_text(self, text: str) -> None: + self.get_reader().insert(text) + + +_wrapper = _ReadlineWrapper() + +# ____________________________________________________________ +# Public API + +parse_and_bind = _wrapper.parse_and_bind +set_completer = _wrapper.set_completer +get_completer = _wrapper.get_completer +set_completer_delims = _wrapper.set_completer_delims +get_completer_delims = _wrapper.get_completer_delims +get_history_length = _wrapper.get_history_length +set_history_length = _wrapper.set_history_length +get_current_history_length = _wrapper.get_current_history_length +read_history_file = _wrapper.read_history_file +write_history_file = _wrapper.write_history_file +clear_history = _wrapper.clear_history +get_history_item = _wrapper.get_history_item +remove_history_item = _wrapper.remove_history_item +replace_history_item = _wrapper.replace_history_item +add_history = _wrapper.add_history +set_startup_hook = _wrapper.set_startup_hook +get_line_buffer = _wrapper.get_line_buffer +get_begidx = _wrapper.get_begidx +get_endidx = _wrapper.get_endidx +insert_text = _wrapper.insert_text + +# Extension +multiline_input = _wrapper.multiline_input + +# Internal hook +_get_reader = _wrapper.get_reader + +# ____________________________________________________________ +# Stubs + + +def _make_stub(_name: str, _ret: object) -> None: + def stub(*args: object, **kwds: object) -> None: + import warnings + + warnings.warn("readline.%s() not implemented" % _name, stacklevel=2) + + stub.__name__ = _name + globals()[_name] = stub + + +for _name, _ret in [ + ("read_init_file", None), + ("redisplay", None), + ("set_pre_input_hook", None), +]: + assert _name not in globals(), _name + _make_stub(_name, _ret) + +# ____________________________________________________________ + + +def _setup(namespace: Mapping[str, Any]) -> None: + global raw_input + if raw_input is not None: + return # don't run _setup twice + + try: + f_in = sys.stdin.fileno() + f_out = sys.stdout.fileno() + except (AttributeError, ValueError): + return + if not os.isatty(f_in) or not os.isatty(f_out): + return + + _wrapper.f_in = f_in + _wrapper.f_out = f_out + + # set up namespace in rlcompleter, which requires it to be a bona fide dict + if not isinstance(namespace, dict): + namespace = dict(namespace) + _wrapper.config.readline_completer = RLCompleter(namespace).complete + + # this is not really what readline.c does. Better than nothing I guess + import builtins + raw_input = builtins.input + builtins.input = _wrapper.input + + +raw_input: Callable[[object], str] | None = None diff --git a/Lib/_pyrepl/simple_interact.py b/Lib/_pyrepl/simple_interact.py new file mode 100644 index 00000000..342a4b58 --- /dev/null +++ b/Lib/_pyrepl/simple_interact.py @@ -0,0 +1,175 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +"""This is an alternative to python_reader which tries to emulate +the CPython prompt as closely as possible, with the exception of +allowing multiline input and multiline history entries. +""" + +from __future__ import annotations + +import _sitebuiltins +import linecache +import functools +import os +import sys +import code + +from .readline import _get_reader, multiline_input + +TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import Any + + +_error: tuple[type[Exception], ...] | type[Exception] +try: + from .unix_console import _error +except ModuleNotFoundError: + from .windows_console import _error + +def check() -> str: + """Returns the error message if there is a problem initializing the state.""" + try: + _get_reader() + except _error as e: + if term := os.environ.get("TERM", ""): + term = f"; TERM={term}" + return str(str(e) or repr(e) or "unknown error") + term + return "" + + +def _strip_final_indent(text: str) -> str: + # kill spaces and tabs at the end, but only if they follow '\n'. + # meant to remove the auto-indentation only (although it would of + # course also remove explicitly-added indentation). + short = text.rstrip(" \t") + n = len(short) + if n > 0 and text[n - 1] == "\n": + return short + return text + + +def _clear_screen(): + reader = _get_reader() + reader.scheduled_commands.append("clear_screen") + + +REPL_COMMANDS = { + "exit": _sitebuiltins.Quitter('exit', ''), + "quit": _sitebuiltins.Quitter('quit' ,''), + "copyright": _sitebuiltins._Printer('copyright', sys.copyright), + "help": "help", + "clear": _clear_screen, + "\x1a": _sitebuiltins.Quitter('\x1a', ''), +} + + +def _more_lines(console: code.InteractiveConsole, unicodetext: str) -> bool: + # ooh, look at the hack: + src = _strip_final_indent(unicodetext) + try: + code = console.compile(src, "", "single") + except (OverflowError, SyntaxError, ValueError): + lines = src.splitlines(keepends=True) + if len(lines) == 1: + return False + + last_line = lines[-1] + was_indented = last_line.startswith((" ", "\t")) + not_empty = last_line.strip() != "" + incomplete = not last_line.endswith("\n") + return (was_indented or not_empty) and incomplete + else: + return code is None + + +def run_multiline_interactive_console( + console: code.InteractiveConsole, + *, + future_flags: int = 0, +) -> None: + from .readline import _setup + _setup(console.locals) + if future_flags: + console.compile.compiler.flags |= future_flags + + more_lines = functools.partial(_more_lines, console) + input_n = 0 + + def maybe_run_command(statement: str) -> bool: + statement = statement.strip() + if statement in console.locals or statement not in REPL_COMMANDS: + return False + + reader = _get_reader() + reader.history.pop() # skip internal commands in history + command = REPL_COMMANDS[statement] + if callable(command): + command() + return True + + if isinstance(command, str): + # Internal readline commands require a prepared reader like + # inside multiline_input. + reader.prepare() + reader.refresh() + reader.do_cmd((command, [statement])) + reader.restore() + return True + + return False + + while 1: + try: + try: + sys.stdout.flush() + except Exception: + pass + + ps1 = getattr(sys, "ps1", ">>> ") + ps2 = getattr(sys, "ps2", "... ") + try: + statement = multiline_input(more_lines, ps1, ps2) + except EOFError: + break + + if maybe_run_command(statement): + continue + + input_name = f"" + linecache._register_code(input_name, statement, "") # type: ignore[attr-defined] + more = console.push(_strip_final_indent(statement), filename=input_name, _symbol="single") # type: ignore[call-arg] + assert not more + input_n += 1 + except KeyboardInterrupt: + r = _get_reader() + if r.input_trans is r.isearch_trans: + r.do_cmd(("isearch-end", [""])) + r.pos = len(r.get_unicode()) + r.dirty = True + r.refresh() + r.in_bracketed_paste = False + console.write("\nKeyboardInterrupt\n") + console.resetbuffer() + except MemoryError: + console.write("\nMemoryError\n") + console.resetbuffer() diff --git a/Lib/_pyrepl/trace.py b/Lib/_pyrepl/trace.py new file mode 100644 index 00000000..a8eb2433 --- /dev/null +++ b/Lib/_pyrepl/trace.py @@ -0,0 +1,21 @@ +from __future__ import annotations + +import os + +# types +if False: + from typing import IO + + +trace_file: IO[str] | None = None +if trace_filename := os.environ.get("PYREPL_TRACE"): + trace_file = open(trace_filename, "a") + + +def trace(line: str, *k: object, **kw: object) -> None: + if trace_file is None: + return + if k or kw: + line = line.format(*k, **kw) + trace_file.write(line + "\n") + trace_file.flush() diff --git a/Lib/_pyrepl/types.py b/Lib/_pyrepl/types.py new file mode 100644 index 00000000..f9d48b82 --- /dev/null +++ b/Lib/_pyrepl/types.py @@ -0,0 +1,8 @@ +from collections.abc import Callable, Iterator + +Callback = Callable[[], object] +SimpleContextManager = Iterator[None] +KeySpec = str # like r"\C-c" +CommandName = str # like "interrupt" +EventTuple = tuple[CommandName, str] +Completer = Callable[[str, int], str | None] diff --git a/Lib/_pyrepl/unix_console.py b/Lib/_pyrepl/unix_console.py new file mode 100644 index 00000000..09b5094f --- /dev/null +++ b/Lib/_pyrepl/unix_console.py @@ -0,0 +1,804 @@ +# Copyright 2000-2010 Michael Hudson-Doyle +# Antonio Cuni +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +import errno +import os +import re +import select +import signal +import struct +import termios +import time +import platform +from fcntl import ioctl + +from . import curses +from .console import Console, Event +from .fancy_termios import tcgetattr, tcsetattr +from .trace import trace +from .unix_eventqueue import EventQueue +from .utils import wlen + + +TYPE_CHECKING = False + +# types +if TYPE_CHECKING: + from typing import IO, Literal, overload +else: + overload = lambda func: None + + +class InvalidTerminal(RuntimeError): + pass + + +_error = (termios.error, curses.error, InvalidTerminal) + +SIGWINCH_EVENT = "repaint" + +FIONREAD = getattr(termios, "FIONREAD", None) +TIOCGWINSZ = getattr(termios, "TIOCGWINSZ", None) + +# ------------ start of baudrate definitions ------------ + +# Add (possibly) missing baudrates (check termios man page) to termios + + +def add_baudrate_if_supported(dictionary: dict[int, int], rate: int) -> None: + baudrate_name = "B%d" % rate + if hasattr(termios, baudrate_name): + dictionary[getattr(termios, baudrate_name)] = rate + + +# Check the termios man page (Line speed) to know where these +# values come from. +potential_baudrates = [ + 0, + 110, + 115200, + 1200, + 134, + 150, + 1800, + 19200, + 200, + 230400, + 2400, + 300, + 38400, + 460800, + 4800, + 50, + 57600, + 600, + 75, + 9600, +] + +ratedict: dict[int, int] = {} +for rate in potential_baudrates: + add_baudrate_if_supported(ratedict, rate) + +# Clean up variables to avoid unintended usage +del rate, add_baudrate_if_supported + +# ------------ end of baudrate definitions ------------ + +delayprog = re.compile(b"\\$<([0-9]+)((?:/|\\*){0,2})>") + +try: + poll: type[select.poll] = select.poll +except AttributeError: + # this is exactly the minumum necessary to support what we + # do with poll objects + class MinimalPoll: + def __init__(self): + pass + + def register(self, fd, flag): + self.fd = fd + # note: The 'timeout' argument is received as *milliseconds* + def poll(self, timeout: float | None = None) -> list[int]: + if timeout is None: + r, w, e = select.select([self.fd], [], []) + else: + r, w, e = select.select([self.fd], [], [], timeout/1000) + return r + + poll = MinimalPoll # type: ignore[assignment] + + +class UnixConsole(Console): + def __init__( + self, + f_in: IO[bytes] | int = 0, + f_out: IO[bytes] | int = 1, + term: str = "", + encoding: str = "", + ): + """ + Initialize the UnixConsole. + + Parameters: + - f_in (int or file-like object): Input file descriptor or object. + - f_out (int or file-like object): Output file descriptor or object. + - term (str): Terminal name. + - encoding (str): Encoding to use for I/O operations. + """ + super().__init__(f_in, f_out, term, encoding) + + self.pollob = poll() + self.pollob.register(self.input_fd, select.POLLIN) + self.input_buffer = b"" + self.input_buffer_pos = 0 + curses.setupterm(term or None, self.output_fd) + self.term = term + + @overload + def _my_getstr(cap: str, optional: Literal[False] = False) -> bytes: ... + + @overload + def _my_getstr(cap: str, optional: bool) -> bytes | None: ... + + def _my_getstr(cap: str, optional: bool = False) -> bytes | None: + r = curses.tigetstr(cap) + if not optional and r is None: + raise InvalidTerminal( + f"terminal doesn't have the required {cap} capability" + ) + return r + + self._bel = _my_getstr("bel") + self._civis = _my_getstr("civis", optional=True) + self._clear = _my_getstr("clear") + self._cnorm = _my_getstr("cnorm", optional=True) + self._cub = _my_getstr("cub", optional=True) + self._cub1 = _my_getstr("cub1", optional=True) + self._cud = _my_getstr("cud", optional=True) + self._cud1 = _my_getstr("cud1", optional=True) + self._cuf = _my_getstr("cuf", optional=True) + self._cuf1 = _my_getstr("cuf1", optional=True) + self._cup = _my_getstr("cup") + self._cuu = _my_getstr("cuu", optional=True) + self._cuu1 = _my_getstr("cuu1", optional=True) + self._dch1 = _my_getstr("dch1", optional=True) + self._dch = _my_getstr("dch", optional=True) + self._el = _my_getstr("el") + self._hpa = _my_getstr("hpa", optional=True) + self._ich = _my_getstr("ich", optional=True) + self._ich1 = _my_getstr("ich1", optional=True) + self._ind = _my_getstr("ind", optional=True) + self._pad = _my_getstr("pad", optional=True) + self._ri = _my_getstr("ri", optional=True) + self._rmkx = _my_getstr("rmkx", optional=True) + self._smkx = _my_getstr("smkx", optional=True) + + self.__setup_movement() + + self.event_queue = EventQueue(self.input_fd, self.encoding) + self.cursor_visible = 1 + + def more_in_buffer(self) -> bool: + return bool( + self.input_buffer + and self.input_buffer_pos < len(self.input_buffer) + ) + + def __read(self, n: int) -> bytes: + if not self.more_in_buffer(): + self.input_buffer = os.read(self.input_fd, 10000) + + ret = self.input_buffer[self.input_buffer_pos : self.input_buffer_pos + n] + self.input_buffer_pos += len(ret) + if self.input_buffer_pos >= len(self.input_buffer): + self.input_buffer = b"" + self.input_buffer_pos = 0 + return ret + + + def change_encoding(self, encoding: str) -> None: + """ + Change the encoding used for I/O operations. + + Parameters: + - encoding (str): New encoding to use. + """ + self.encoding = encoding + + def refresh(self, screen, c_xy): + """ + Refresh the console screen. + + Parameters: + - screen (list): List of strings representing the screen contents. + - c_xy (tuple): Cursor position (x, y) on the screen. + """ + cx, cy = c_xy + if not self.__gone_tall: + while len(self.screen) < min(len(screen), self.height): + self.__hide_cursor() + self.__move(0, len(self.screen) - 1) + self.__write("\n") + self.__posxy = 0, len(self.screen) + self.screen.append("") + else: + while len(self.screen) < len(screen): + self.screen.append("") + + if len(screen) > self.height: + self.__gone_tall = 1 + self.__move = self.__move_tall + + px, py = self.__posxy + old_offset = offset = self.__offset + height = self.height + + # we make sure the cursor is on the screen, and that we're + # using all of the screen if we can + if cy < offset: + offset = cy + elif cy >= offset + height: + offset = cy - height + 1 + elif offset > 0 and len(screen) < offset + height: + offset = max(len(screen) - height, 0) + screen.append("") + + oldscr = self.screen[old_offset : old_offset + height] + newscr = screen[offset : offset + height] + + # use hardware scrolling if we have it. + if old_offset > offset and self._ri: + self.__hide_cursor() + self.__write_code(self._cup, 0, 0) + self.__posxy = 0, old_offset + for i in range(old_offset - offset): + self.__write_code(self._ri) + oldscr.pop(-1) + oldscr.insert(0, "") + elif old_offset < offset and self._ind: + self.__hide_cursor() + self.__write_code(self._cup, self.height - 1, 0) + self.__posxy = 0, old_offset + self.height - 1 + for i in range(offset - old_offset): + self.__write_code(self._ind) + oldscr.pop(0) + oldscr.append("") + + self.__offset = offset + + for ( + y, + oldline, + newline, + ) in zip(range(offset, offset + height), oldscr, newscr): + if oldline != newline: + self.__write_changed_line(y, oldline, newline, px) + + y = len(newscr) + while y < len(oldscr): + self.__hide_cursor() + self.__move(0, y) + self.__posxy = 0, y + self.__write_code(self._el) + y += 1 + + self.__show_cursor() + + self.screen = screen.copy() + self.move_cursor(cx, cy) + self.flushoutput() + + def move_cursor(self, x, y): + """ + Move the cursor to the specified position on the screen. + + Parameters: + - x (int): X coordinate. + - y (int): Y coordinate. + """ + if y < self.__offset or y >= self.__offset + self.height: + self.event_queue.insert(Event("scroll", None)) + else: + self.__move(x, y) + self.__posxy = x, y + self.flushoutput() + + def prepare(self): + """ + Prepare the console for input/output operations. + """ + self.__svtermstate = tcgetattr(self.input_fd) + raw = self.__svtermstate.copy() + raw.iflag &= ~(termios.INPCK | termios.ISTRIP | termios.IXON) + raw.oflag &= ~(termios.OPOST) + raw.cflag &= ~(termios.CSIZE | termios.PARENB) + raw.cflag |= termios.CS8 + raw.iflag |= termios.BRKINT + raw.lflag &= ~(termios.ICANON | termios.ECHO | termios.IEXTEN) + raw.lflag |= termios.ISIG + raw.cc[termios.VMIN] = 1 + raw.cc[termios.VTIME] = 0 + tcsetattr(self.input_fd, termios.TCSADRAIN, raw) + + # In macOS terminal we need to deactivate line wrap via ANSI escape code + if platform.system() == "Darwin" and os.getenv("TERM_PROGRAM") == "Apple_Terminal": + os.write(self.output_fd, b"\033[?7l") + + self.screen = [] + self.height, self.width = self.getheightwidth() + + self.__buffer = [] + + self.__posxy = 0, 0 + self.__gone_tall = 0 + self.__move = self.__move_short + self.__offset = 0 + + self.__maybe_write_code(self._smkx) + + try: + self.old_sigwinch = signal.signal(signal.SIGWINCH, self.__sigwinch) + except ValueError: + pass + + self.__enable_bracketed_paste() + + def restore(self): + """ + Restore the console to the default state + """ + self.__disable_bracketed_paste() + self.__maybe_write_code(self._rmkx) + self.flushoutput() + tcsetattr(self.input_fd, termios.TCSADRAIN, self.__svtermstate) + + if platform.system() == "Darwin" and os.getenv("TERM_PROGRAM") == "Apple_Terminal": + os.write(self.output_fd, b"\033[?7h") + + if hasattr(self, "old_sigwinch"): + signal.signal(signal.SIGWINCH, self.old_sigwinch) + del self.old_sigwinch + + def push_char(self, char: int | bytes) -> None: + """ + Push a character to the console event queue. + """ + trace("push char {char!r}", char=char) + self.event_queue.push(char) + + def get_event(self, block: bool = True) -> Event | None: + """ + Get an event from the console event queue. + + Parameters: + - block (bool): Whether to block until an event is available. + + Returns: + - Event: Event object from the event queue. + """ + if not block and not self.wait(timeout=0): + return None + + while self.event_queue.empty(): + while True: + try: + self.push_char(self.__read(1)) + except OSError as err: + if err.errno == errno.EINTR: + if not self.event_queue.empty(): + return self.event_queue.get() + else: + continue + else: + raise + else: + break + return self.event_queue.get() + + def wait(self, timeout: float | None = None) -> bool: + """ + Wait for events on the console. + """ + return ( + not self.event_queue.empty() + or self.more_in_buffer() + or bool(self.pollob.poll(timeout)) + ) + + def set_cursor_vis(self, visible): + """ + Set the visibility of the cursor. + + Parameters: + - visible (bool): Visibility flag. + """ + if visible: + self.__show_cursor() + else: + self.__hide_cursor() + + if TIOCGWINSZ: + + def getheightwidth(self): + """ + Get the height and width of the console. + + Returns: + - tuple: Height and width of the console. + """ + try: + return int(os.environ["LINES"]), int(os.environ["COLUMNS"]) + except KeyError: + height, width = struct.unpack( + "hhhh", ioctl(self.input_fd, TIOCGWINSZ, b"\000" * 8) + )[0:2] + if not height: + return 25, 80 + return height, width + + else: + + def getheightwidth(self): + """ + Get the height and width of the console. + + Returns: + - tuple: Height and width of the console. + """ + try: + return int(os.environ["LINES"]), int(os.environ["COLUMNS"]) + except KeyError: + return 25, 80 + + def forgetinput(self): + """ + Discard any pending input on the console. + """ + termios.tcflush(self.input_fd, termios.TCIFLUSH) + + def flushoutput(self): + """ + Flush the output buffer. + """ + for text, iscode in self.__buffer: + if iscode: + self.__tputs(text) + else: + os.write(self.output_fd, text.encode(self.encoding, "replace")) + del self.__buffer[:] + + def finish(self): + """ + Finish console operations and flush the output buffer. + """ + y = len(self.screen) - 1 + while y >= 0 and not self.screen[y]: + y -= 1 + self.__move(0, min(y, self.height + self.__offset - 1)) + self.__write("\n\r") + self.flushoutput() + + def beep(self): + """ + Emit a beep sound. + """ + self.__maybe_write_code(self._bel) + self.flushoutput() + + if FIONREAD: + + def getpending(self): + """ + Get pending events from the console event queue. + + Returns: + - Event: Pending event from the event queue. + """ + e = Event("key", "", b"") + + while not self.event_queue.empty(): + e2 = self.event_queue.get() + e.data += e2.data + e.raw += e.raw + + amount = struct.unpack("i", ioctl(self.input_fd, FIONREAD, b"\0\0\0\0"))[0] + raw = self.__read(amount) + data = str(raw, self.encoding, "replace") + e.data += data + e.raw += raw + return e + + else: + + def getpending(self): + """ + Get pending events from the console event queue. + + Returns: + - Event: Pending event from the event queue. + """ + e = Event("key", "", b"") + + while not self.event_queue.empty(): + e2 = self.event_queue.get() + e.data += e2.data + e.raw += e.raw + + amount = 10000 + raw = self.__read(amount) + data = str(raw, self.encoding, "replace") + e.data += data + e.raw += raw + return e + + def clear(self): + """ + Clear the console screen. + """ + self.__write_code(self._clear) + self.__gone_tall = 1 + self.__move = self.__move_tall + self.__posxy = 0, 0 + self.screen = [] + + @property + def input_hook(self): + try: + import posix + except ImportError: + return None + if posix._is_inputhook_installed(): + return posix._inputhook + + def __enable_bracketed_paste(self) -> None: + os.write(self.output_fd, b"\x1b[?2004h") + + def __disable_bracketed_paste(self) -> None: + os.write(self.output_fd, b"\x1b[?2004l") + + def __setup_movement(self): + """ + Set up the movement functions based on the terminal capabilities. + """ + if 0 and self._hpa: # hpa don't work in windows telnet :-( + self.__move_x = self.__move_x_hpa + elif self._cub and self._cuf: + self.__move_x = self.__move_x_cub_cuf + elif self._cub1 and self._cuf1: + self.__move_x = self.__move_x_cub1_cuf1 + else: + raise RuntimeError("insufficient terminal (horizontal)") + + if self._cuu and self._cud: + self.__move_y = self.__move_y_cuu_cud + elif self._cuu1 and self._cud1: + self.__move_y = self.__move_y_cuu1_cud1 + else: + raise RuntimeError("insufficient terminal (vertical)") + + if self._dch1: + self.dch1 = self._dch1 + elif self._dch: + self.dch1 = curses.tparm(self._dch, 1) + else: + self.dch1 = None + + if self._ich1: + self.ich1 = self._ich1 + elif self._ich: + self.ich1 = curses.tparm(self._ich, 1) + else: + self.ich1 = None + + self.__move = self.__move_short + + def __write_changed_line(self, y, oldline, newline, px_coord): + # this is frustrating; there's no reason to test (say) + # self.dch1 inside the loop -- but alternative ways of + # structuring this function are equally painful (I'm trying to + # avoid writing code generators these days...) + minlen = min(wlen(oldline), wlen(newline)) + x_pos = 0 + x_coord = 0 + + px_pos = 0 + j = 0 + for c in oldline: + if j >= px_coord: + break + j += wlen(c) + px_pos += 1 + + # reuse the oldline as much as possible, but stop as soon as we + # encounter an ESCAPE, because it might be the start of an escape + # sequene + while ( + x_coord < minlen + and oldline[x_pos] == newline[x_pos] + and newline[x_pos] != "\x1b" + ): + x_coord += wlen(newline[x_pos]) + x_pos += 1 + + # if we need to insert a single character right after the first detected change + if oldline[x_pos:] == newline[x_pos + 1 :] and self.ich1: + if ( + y == self.__posxy[1] + and x_coord > self.__posxy[0] + and oldline[px_pos:x_pos] == newline[px_pos + 1 : x_pos + 1] + ): + x_pos = px_pos + x_coord = px_coord + character_width = wlen(newline[x_pos]) + self.__move(x_coord, y) + self.__write_code(self.ich1) + self.__write(newline[x_pos]) + self.__posxy = x_coord + character_width, y + + # if it's a single character change in the middle of the line + elif ( + x_coord < minlen + and oldline[x_pos + 1 :] == newline[x_pos + 1 :] + and wlen(oldline[x_pos]) == wlen(newline[x_pos]) + ): + character_width = wlen(newline[x_pos]) + self.__move(x_coord, y) + self.__write(newline[x_pos]) + self.__posxy = x_coord + character_width, y + + # if this is the last character to fit in the line and we edit in the middle of the line + elif ( + self.dch1 + and self.ich1 + and wlen(newline) == self.width + and x_coord < wlen(newline) - 2 + and newline[x_pos + 1 : -1] == oldline[x_pos:-2] + ): + self.__hide_cursor() + self.__move(self.width - 2, y) + self.__posxy = self.width - 2, y + self.__write_code(self.dch1) + + character_width = wlen(newline[x_pos]) + self.__move(x_coord, y) + self.__write_code(self.ich1) + self.__write(newline[x_pos]) + self.__posxy = character_width + 1, y + + else: + self.__hide_cursor() + self.__move(x_coord, y) + if wlen(oldline) > wlen(newline): + self.__write_code(self._el) + self.__write(newline[x_pos:]) + self.__posxy = wlen(newline), y + + if "\x1b" in newline: + # ANSI escape characters are present, so we can't assume + # anything about the position of the cursor. Moving the cursor + # to the left margin should work to get to a known position. + self.move_cursor(0, y) + + def __write(self, text): + self.__buffer.append((text, 0)) + + def __write_code(self, fmt, *args): + self.__buffer.append((curses.tparm(fmt, *args), 1)) + + def __maybe_write_code(self, fmt, *args): + if fmt: + self.__write_code(fmt, *args) + + def __move_y_cuu1_cud1(self, y): + dy = y - self.__posxy[1] + if dy > 0: + self.__write_code(dy * self._cud1) + elif dy < 0: + self.__write_code((-dy) * self._cuu1) + + def __move_y_cuu_cud(self, y): + dy = y - self.__posxy[1] + if dy > 0: + self.__write_code(self._cud, dy) + elif dy < 0: + self.__write_code(self._cuu, -dy) + + def __move_x_hpa(self, x: int) -> None: + if x != self.__posxy[0]: + self.__write_code(self._hpa, x) + + def __move_x_cub1_cuf1(self, x: int) -> None: + dx = x - self.__posxy[0] + if dx > 0: + self.__write_code(self._cuf1 * dx) + elif dx < 0: + self.__write_code(self._cub1 * (-dx)) + + def __move_x_cub_cuf(self, x: int) -> None: + dx = x - self.__posxy[0] + if dx > 0: + self.__write_code(self._cuf, dx) + elif dx < 0: + self.__write_code(self._cub, -dx) + + def __move_short(self, x, y): + self.__move_x(x) + self.__move_y(y) + + def __move_tall(self, x, y): + assert 0 <= y - self.__offset < self.height, y - self.__offset + self.__write_code(self._cup, y - self.__offset, x) + + def __sigwinch(self, signum, frame): + self.height, self.width = self.getheightwidth() + self.event_queue.insert(Event("resize", None)) + + def __hide_cursor(self): + if self.cursor_visible: + self.__maybe_write_code(self._civis) + self.cursor_visible = 0 + + def __show_cursor(self): + if not self.cursor_visible: + self.__maybe_write_code(self._cnorm) + self.cursor_visible = 1 + + def repaint(self): + if not self.__gone_tall: + self.__posxy = 0, self.__posxy[1] + self.__write("\r") + ns = len(self.screen) * ["\000" * self.width] + self.screen = ns + else: + self.__posxy = 0, self.__offset + self.__move(0, self.__offset) + ns = self.height * ["\000" * self.width] + self.screen = ns + + def __tputs(self, fmt, prog=delayprog): + """A Python implementation of the curses tputs function; the + curses one can't really be wrapped in a sane manner. + + I have the strong suspicion that this is complexity that + will never do anyone any good.""" + # using .get() means that things will blow up + # only if the bps is actually needed (which I'm + # betting is pretty unlkely) + bps = ratedict.get(self.__svtermstate.ospeed) + while 1: + m = prog.search(fmt) + if not m: + os.write(self.output_fd, fmt) + break + x, y = m.span() + os.write(self.output_fd, fmt[:x]) + fmt = fmt[y:] + delay = int(m.group(1)) + if b"*" in m.group(2): + delay *= self.height + if self._pad and bps is not None: + nchars = (bps * delay) / 1000 + os.write(self.output_fd, self._pad * nchars) + else: + time.sleep(float(delay) / 1000.0) diff --git a/Lib/_pyrepl/unix_eventqueue.py b/Lib/_pyrepl/unix_eventqueue.py new file mode 100644 index 00000000..70cfade2 --- /dev/null +++ b/Lib/_pyrepl/unix_eventqueue.py @@ -0,0 +1,152 @@ +# Copyright 2000-2008 Michael Hudson-Doyle +# Armin Rigo +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from collections import deque + +from . import keymap +from .console import Event +from . import curses +from .trace import trace +from termios import tcgetattr, VERASE +import os + + +# Mapping of human-readable key names to their terminal-specific codes +TERMINAL_KEYNAMES = { + "delete": "kdch1", + "down": "kcud1", + "end": "kend", + "enter": "kent", + "home": "khome", + "insert": "kich1", + "left": "kcub1", + "page down": "knp", + "page up": "kpp", + "right": "kcuf1", + "up": "kcuu1", +} + + +# Function keys F1-F20 mapping +TERMINAL_KEYNAMES.update(("f%d" % i, "kf%d" % i) for i in range(1, 21)) + +# Known CTRL-arrow keycodes +CTRL_ARROW_KEYCODES= { + # for xterm, gnome-terminal, xfce terminal, etc. + b'\033[1;5D': 'ctrl left', + b'\033[1;5C': 'ctrl right', + # for rxvt + b'\033Od': 'ctrl left', + b'\033Oc': 'ctrl right', +} + +def get_terminal_keycodes() -> dict[bytes, str]: + """ + Generates a dictionary mapping terminal keycodes to human-readable names. + """ + keycodes = {} + for key, terminal_code in TERMINAL_KEYNAMES.items(): + keycode = curses.tigetstr(terminal_code) + trace('key {key} tiname {terminal_code} keycode {keycode!r}', **locals()) + if keycode: + keycodes[keycode] = key + keycodes.update(CTRL_ARROW_KEYCODES) + return keycodes + +class EventQueue: + def __init__(self, fd: int, encoding: str) -> None: + self.keycodes = get_terminal_keycodes() + if os.isatty(fd): + backspace = tcgetattr(fd)[6][VERASE] + self.keycodes[backspace] = "backspace" + self.compiled_keymap = keymap.compile_keymap(self.keycodes) + self.keymap = self.compiled_keymap + trace("keymap {k!r}", k=self.keymap) + self.encoding = encoding + self.events: deque[Event] = deque() + self.buf = bytearray() + + def get(self) -> Event | None: + """ + Retrieves the next event from the queue. + """ + if self.events: + return self.events.popleft() + else: + return None + + def empty(self) -> bool: + """ + Checks if the queue is empty. + """ + return not self.events + + def flush_buf(self) -> bytearray: + """ + Flushes the buffer and returns its contents. + """ + old = self.buf + self.buf = bytearray() + return old + + def insert(self, event: Event) -> None: + """ + Inserts an event into the queue. + """ + trace('added event {event}', event=event) + self.events.append(event) + + def push(self, char: int | bytes) -> None: + """ + Processes a character by updating the buffer and handling special key mappings. + """ + ord_char = char if isinstance(char, int) else ord(char) + char = bytes(bytearray((ord_char,))) + self.buf.append(ord_char) + if char in self.keymap: + if self.keymap is self.compiled_keymap: + #sanity check, buffer is empty when a special key comes + assert len(self.buf) == 1 + k = self.keymap[char] + trace('found map {k!r}', k=k) + if isinstance(k, dict): + self.keymap = k + else: + self.insert(Event('key', k, self.flush_buf())) + self.keymap = self.compiled_keymap + + elif self.buf and self.buf[0] == 27: # escape + # escape sequence not recognized by our keymap: propagate it + # outside so that i can be recognized as an M-... key (see also + # the docstring in keymap.py + trace('unrecognized escape sequence, propagating...') + self.keymap = self.compiled_keymap + self.insert(Event('key', '\033', bytearray(b'\033'))) + for _c in self.flush_buf()[1:]: + self.push(_c) + + else: + try: + decoded = bytes(self.buf).decode(self.encoding) + except UnicodeError: + return + else: + self.insert(Event('key', decoded, self.flush_buf())) + self.keymap = self.compiled_keymap diff --git a/Lib/_pyrepl/utils.py b/Lib/_pyrepl/utils.py new file mode 100644 index 00000000..0f36083b --- /dev/null +++ b/Lib/_pyrepl/utils.py @@ -0,0 +1,25 @@ +import re +import unicodedata +import functools + +ANSI_ESCAPE_SEQUENCE = re.compile(r"\x1b\[[ -@]*[A-~]") + + +@functools.cache +def str_width(c: str) -> int: + if ord(c) < 128: + return 1 + w = unicodedata.east_asian_width(c) + if w in ('N', 'Na', 'H', 'A'): + return 1 + return 2 + + +def wlen(s: str) -> int: + if len(s) == 1: + return str_width(s) + length = sum(str_width(i) for i in s) + # remove lengths of any escape sequences + sequence = ANSI_ESCAPE_SEQUENCE.findall(s) + ctrl_z_cnt = s.count('\x1a') + return length - sum(len(i) for i in sequence) + ctrl_z_cnt diff --git a/Lib/_pyrepl/windows_console.py b/Lib/_pyrepl/windows_console.py new file mode 100644 index 00000000..ea6a9b4e --- /dev/null +++ b/Lib/_pyrepl/windows_console.py @@ -0,0 +1,618 @@ +# Copyright 2000-2004 Michael Hudson-Doyle +# +# All Rights Reserved +# +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose is hereby granted without fee, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear in +# supporting documentation. +# +# THE AUTHOR MICHAEL HUDSON DISCLAIMS ALL WARRANTIES WITH REGARD TO +# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, +# INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import annotations + +import io +import os +import sys +import time +import msvcrt + +from collections import deque +import ctypes +from ctypes.wintypes import ( + _COORD, + WORD, + SMALL_RECT, + BOOL, + HANDLE, + CHAR, + DWORD, + WCHAR, + SHORT, +) +from ctypes import Structure, POINTER, Union +from .console import Event, Console +from .trace import trace +from .utils import wlen + +try: + from ctypes import GetLastError, WinDLL, windll, WinError # type: ignore[attr-defined] +except: + # Keep MyPy happy off Windows + from ctypes import CDLL as WinDLL, cdll as windll + + def GetLastError() -> int: + return 42 + + class WinError(OSError): # type: ignore[no-redef] + def __init__(self, err: int | None, descr: str | None = None) -> None: + self.err = err + self.descr = descr + + +TYPE_CHECKING = False + +if TYPE_CHECKING: + from typing import IO + +# Virtual-Key Codes: https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes +VK_MAP: dict[int, str] = { + 0x23: "end", # VK_END + 0x24: "home", # VK_HOME + 0x25: "left", # VK_LEFT + 0x26: "up", # VK_UP + 0x27: "right", # VK_RIGHT + 0x28: "down", # VK_DOWN + 0x2E: "delete", # VK_DELETE + 0x70: "f1", # VK_F1 + 0x71: "f2", # VK_F2 + 0x72: "f3", # VK_F3 + 0x73: "f4", # VK_F4 + 0x74: "f5", # VK_F5 + 0x75: "f6", # VK_F6 + 0x76: "f7", # VK_F7 + 0x77: "f8", # VK_F8 + 0x78: "f9", # VK_F9 + 0x79: "f10", # VK_F10 + 0x7A: "f11", # VK_F11 + 0x7B: "f12", # VK_F12 + 0x7C: "f13", # VK_F13 + 0x7D: "f14", # VK_F14 + 0x7E: "f15", # VK_F15 + 0x7F: "f16", # VK_F16 + 0x80: "f17", # VK_F17 + 0x81: "f18", # VK_F18 + 0x82: "f19", # VK_F19 + 0x83: "f20", # VK_F20 +} + +# Console escape codes: https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences +ERASE_IN_LINE = "\x1b[K" +MOVE_LEFT = "\x1b[{}D" +MOVE_RIGHT = "\x1b[{}C" +MOVE_UP = "\x1b[{}A" +MOVE_DOWN = "\x1b[{}B" +CLEAR = "\x1b[H\x1b[J" + + +class _error(Exception): + pass + + +class WindowsConsole(Console): + def __init__( + self, + f_in: IO[bytes] | int = 0, + f_out: IO[bytes] | int = 1, + term: str = "", + encoding: str = "", + ): + super().__init__(f_in, f_out, term, encoding) + + SetConsoleMode( + OutHandle, + ENABLE_WRAP_AT_EOL_OUTPUT + | ENABLE_PROCESSED_OUTPUT + | ENABLE_VIRTUAL_TERMINAL_PROCESSING, + ) + self.screen: list[str] = [] + self.width = 80 + self.height = 25 + self.__offset = 0 + self.event_queue: deque[Event] = deque() + try: + self.out = io._WindowsConsoleIO(self.output_fd, "w") # type: ignore[attr-defined] + except ValueError: + # Console I/O is redirected, fallback... + self.out = None + + def refresh(self, screen: list[str], c_xy: tuple[int, int]) -> None: + """ + Refresh the console screen. + + Parameters: + - screen (list): List of strings representing the screen contents. + - c_xy (tuple): Cursor position (x, y) on the screen. + """ + cx, cy = c_xy + + while len(self.screen) < min(len(screen), self.height): + self._hide_cursor() + self._move_relative(0, len(self.screen) - 1) + self.__write("\n") + self.__posxy = 0, len(self.screen) + self.screen.append("") + + px, py = self.__posxy + old_offset = offset = self.__offset + height = self.height + + # we make sure the cursor is on the screen, and that we're + # using all of the screen if we can + if cy < offset: + offset = cy + elif cy >= offset + height: + offset = cy - height + 1 + scroll_lines = offset - old_offset + + # Scrolling the buffer as the current input is greater than the visible + # portion of the window. We need to scroll the visible portion and the + # entire history + self._scroll(scroll_lines, self._getscrollbacksize()) + self.__posxy = self.__posxy[0], self.__posxy[1] + scroll_lines + self.__offset += scroll_lines + + for i in range(scroll_lines): + self.screen.append("") + elif offset > 0 and len(screen) < offset + height: + offset = max(len(screen) - height, 0) + screen.append("") + + oldscr = self.screen[old_offset : old_offset + height] + newscr = screen[offset : offset + height] + + self.__offset = offset + + self._hide_cursor() + for ( + y, + oldline, + newline, + ) in zip(range(offset, offset + height), oldscr, newscr): + if oldline != newline: + self.__write_changed_line(y, oldline, newline, px) + + y = len(newscr) + while y < len(oldscr): + self._move_relative(0, y) + self.__posxy = 0, y + self._erase_to_end() + y += 1 + + self._show_cursor() + + self.screen = screen + self.move_cursor(cx, cy) + + @property + def input_hook(self): + try: + import nt + except ImportError: + return None + if nt._is_inputhook_installed(): + return nt._inputhook + + def __write_changed_line( + self, y: int, oldline: str, newline: str, px_coord: int + ) -> None: + # this is frustrating; there's no reason to test (say) + # self.dch1 inside the loop -- but alternative ways of + # structuring this function are equally painful (I'm trying to + # avoid writing code generators these days...) + minlen = min(wlen(oldline), wlen(newline)) + x_pos = 0 + x_coord = 0 + + px_pos = 0 + j = 0 + for c in oldline: + if j >= px_coord: + break + j += wlen(c) + px_pos += 1 + + # reuse the oldline as much as possible, but stop as soon as we + # encounter an ESCAPE, because it might be the start of an escape + # sequene + while ( + x_coord < minlen + and oldline[x_pos] == newline[x_pos] + and newline[x_pos] != "\x1b" + ): + x_coord += wlen(newline[x_pos]) + x_pos += 1 + + self._hide_cursor() + self._move_relative(x_coord, y) + if wlen(oldline) > wlen(newline): + self._erase_to_end() + + self.__write(newline[x_pos:]) + if wlen(newline) == self.width: + # If we wrapped we want to start at the next line + self._move_relative(0, y + 1) + self.__posxy = 0, y + 1 + else: + self.__posxy = wlen(newline), y + + if "\x1b" in newline or y != self.__posxy[1] or '\x1a' in newline: + # ANSI escape characters are present, so we can't assume + # anything about the position of the cursor. Moving the cursor + # to the left margin should work to get to a known position. + self.move_cursor(0, y) + + def _scroll( + self, top: int, bottom: int, left: int | None = None, right: int | None = None + ) -> None: + scroll_rect = SMALL_RECT() + scroll_rect.Top = SHORT(top) + scroll_rect.Bottom = SHORT(bottom) + scroll_rect.Left = SHORT(0 if left is None else left) + scroll_rect.Right = SHORT( + self.getheightwidth()[1] - 1 if right is None else right + ) + destination_origin = _COORD() + fill_info = CHAR_INFO() + fill_info.UnicodeChar = " " + + if not ScrollConsoleScreenBuffer( + OutHandle, scroll_rect, None, destination_origin, fill_info + ): + raise WinError(GetLastError()) + + def _hide_cursor(self): + self.__write("\x1b[?25l") + + def _show_cursor(self): + self.__write("\x1b[?25h") + + def _enable_blinking(self): + self.__write("\x1b[?12h") + + def _disable_blinking(self): + self.__write("\x1b[?12l") + + def __write(self, text: str) -> None: + if "\x1a" in text: + text = ''.join(["^Z" if x == '\x1a' else x for x in text]) + + if self.out is not None: + self.out.write(text.encode(self.encoding, "replace")) + self.out.flush() + else: + os.write(self.output_fd, text.encode(self.encoding, "replace")) + + @property + def screen_xy(self) -> tuple[int, int]: + info = CONSOLE_SCREEN_BUFFER_INFO() + if not GetConsoleScreenBufferInfo(OutHandle, info): + raise WinError(GetLastError()) + return info.dwCursorPosition.X, info.dwCursorPosition.Y + + def _erase_to_end(self) -> None: + self.__write(ERASE_IN_LINE) + + def prepare(self) -> None: + trace("prepare") + self.screen = [] + self.height, self.width = self.getheightwidth() + + self.__posxy = 0, 0 + self.__gone_tall = 0 + self.__offset = 0 + + def restore(self) -> None: + pass + + def _move_relative(self, x: int, y: int) -> None: + """Moves relative to the current __posxy""" + dx = x - self.__posxy[0] + dy = y - self.__posxy[1] + if dx < 0: + self.__write(MOVE_LEFT.format(-dx)) + elif dx > 0: + self.__write(MOVE_RIGHT.format(dx)) + + if dy < 0: + self.__write(MOVE_UP.format(-dy)) + elif dy > 0: + self.__write(MOVE_DOWN.format(dy)) + + def move_cursor(self, x: int, y: int) -> None: + if x < 0 or y < 0: + raise ValueError(f"Bad cursor position {x}, {y}") + + if y < self.__offset or y >= self.__offset + self.height: + self.event_queue.insert(0, Event("scroll", "")) + else: + self._move_relative(x, y) + self.__posxy = x, y + + def set_cursor_vis(self, visible: bool) -> None: + if visible: + self._show_cursor() + else: + self._hide_cursor() + + def getheightwidth(self) -> tuple[int, int]: + """Return (height, width) where height and width are the height + and width of the terminal window in characters.""" + info = CONSOLE_SCREEN_BUFFER_INFO() + if not GetConsoleScreenBufferInfo(OutHandle, info): + raise WinError(GetLastError()) + return ( + info.srWindow.Bottom - info.srWindow.Top + 1, + info.srWindow.Right - info.srWindow.Left + 1, + ) + + def _getscrollbacksize(self) -> int: + info = CONSOLE_SCREEN_BUFFER_INFO() + if not GetConsoleScreenBufferInfo(OutHandle, info): + raise WinError(GetLastError()) + + return info.srWindow.Bottom # type: ignore[no-any-return] + + def _read_input(self, block: bool = True) -> INPUT_RECORD | None: + if not block: + events = DWORD() + if not GetNumberOfConsoleInputEvents(InHandle, events): + raise WinError(GetLastError()) + if not events.value: + return None + + rec = INPUT_RECORD() + read = DWORD() + if not ReadConsoleInput(InHandle, rec, 1, read): + raise WinError(GetLastError()) + + return rec + + def get_event(self, block: bool = True) -> Event | None: + """Return an Event instance. Returns None if |block| is false + and there is no event pending, otherwise waits for the + completion of an event.""" + if self.event_queue: + return self.event_queue.pop() + + while True: + rec = self._read_input(block) + if rec is None: + return None + + if rec.EventType == WINDOW_BUFFER_SIZE_EVENT: + return Event("resize", "") + + if rec.EventType != KEY_EVENT or not rec.Event.KeyEvent.bKeyDown: + # Only process keys and keydown events + if block: + continue + return None + + key = rec.Event.KeyEvent.uChar.UnicodeChar + + if rec.Event.KeyEvent.uChar.UnicodeChar == "\r": + # Make enter make unix-like + return Event(evt="key", data="\n", raw=b"\n") + elif rec.Event.KeyEvent.wVirtualKeyCode == 8: + # Turn backspace directly into the command + return Event( + evt="key", + data="backspace", + raw=rec.Event.KeyEvent.uChar.UnicodeChar, + ) + elif rec.Event.KeyEvent.uChar.UnicodeChar == "\x00": + # Handle special keys like arrow keys and translate them into the appropriate command + code = VK_MAP.get(rec.Event.KeyEvent.wVirtualKeyCode) + if code: + return Event( + evt="key", data=code, raw=rec.Event.KeyEvent.uChar.UnicodeChar + ) + if block: + continue + + return None + + return Event(evt="key", data=key, raw=rec.Event.KeyEvent.uChar.UnicodeChar) + + def push_char(self, char: int | bytes) -> None: + """ + Push a character to the console event queue. + """ + raise NotImplementedError("push_char not supported on Windows") + + def beep(self) -> None: + self.__write("\x07") + + def clear(self) -> None: + """Wipe the screen""" + self.__write(CLEAR) + self.__posxy = 0, 0 + self.screen = [""] + + def finish(self) -> None: + """Move the cursor to the end of the display and otherwise get + ready for end. XXX could be merged with restore? Hmm.""" + y = len(self.screen) - 1 + while y >= 0 and not self.screen[y]: + y -= 1 + self._move_relative(0, min(y, self.height + self.__offset - 1)) + self.__write("\r\n") + + def flushoutput(self) -> None: + """Flush all output to the screen (assuming there's some + buffering going on somewhere). + + All output on Windows is unbuffered so this is a nop""" + pass + + def forgetinput(self) -> None: + """Forget all pending, but not yet processed input.""" + if not FlushConsoleInputBuffer(InHandle): + raise WinError(GetLastError()) + + def getpending(self) -> Event: + """Return the characters that have been typed but not yet + processed.""" + return Event("key", "", b"") + + def wait(self, timeout: float | None) -> bool: + """Wait for an event.""" + # Poor man's Windows select loop + start_time = time.time() + while True: + if msvcrt.kbhit(): # type: ignore[attr-defined] + return True + if timeout and time.time() - start_time > timeout / 1000: + return False + time.sleep(0.01) + + def repaint(self) -> None: + raise NotImplementedError("No repaint support") + + +# Windows interop +class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [ + ("dwSize", _COORD), + ("dwCursorPosition", _COORD), + ("wAttributes", WORD), + ("srWindow", SMALL_RECT), + ("dwMaximumWindowSize", _COORD), + ] + + +class CONSOLE_CURSOR_INFO(Structure): + _fields_ = [ + ("dwSize", DWORD), + ("bVisible", BOOL), + ] + + +class CHAR_INFO(Structure): + _fields_ = [ + ("UnicodeChar", WCHAR), + ("Attributes", WORD), + ] + + +class Char(Union): + _fields_ = [ + ("UnicodeChar", WCHAR), + ("Char", CHAR), + ] + + +class KeyEvent(ctypes.Structure): + _fields_ = [ + ("bKeyDown", BOOL), + ("wRepeatCount", WORD), + ("wVirtualKeyCode", WORD), + ("wVirtualScanCode", WORD), + ("uChar", Char), + ("dwControlKeyState", DWORD), + ] + + +class WindowsBufferSizeEvent(ctypes.Structure): + _fields_ = [("dwSize", _COORD)] + + +class ConsoleEvent(ctypes.Union): + _fields_ = [ + ("KeyEvent", KeyEvent), + ("WindowsBufferSizeEvent", WindowsBufferSizeEvent), + ] + + +class INPUT_RECORD(Structure): + _fields_ = [("EventType", WORD), ("Event", ConsoleEvent)] + + +KEY_EVENT = 0x01 +FOCUS_EVENT = 0x10 +MENU_EVENT = 0x08 +MOUSE_EVENT = 0x02 +WINDOW_BUFFER_SIZE_EVENT = 0x04 + +ENABLE_PROCESSED_OUTPUT = 0x01 +ENABLE_WRAP_AT_EOL_OUTPUT = 0x02 +ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x04 + +STD_INPUT_HANDLE = -10 +STD_OUTPUT_HANDLE = -11 + +if sys.platform == "win32": + _KERNEL32 = WinDLL("kernel32", use_last_error=True) + + GetStdHandle = windll.kernel32.GetStdHandle + GetStdHandle.argtypes = [DWORD] + GetStdHandle.restype = HANDLE + + GetConsoleScreenBufferInfo = _KERNEL32.GetConsoleScreenBufferInfo + GetConsoleScreenBufferInfo.argtypes = [ + HANDLE, + ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + GetConsoleScreenBufferInfo.restype = BOOL + + ScrollConsoleScreenBuffer = _KERNEL32.ScrollConsoleScreenBufferW + ScrollConsoleScreenBuffer.argtypes = [ + HANDLE, + POINTER(SMALL_RECT), + POINTER(SMALL_RECT), + _COORD, + POINTER(CHAR_INFO), + ] + ScrollConsoleScreenBuffer.restype = BOOL + + SetConsoleMode = _KERNEL32.SetConsoleMode + SetConsoleMode.argtypes = [HANDLE, DWORD] + SetConsoleMode.restype = BOOL + + ReadConsoleInput = _KERNEL32.ReadConsoleInputW + ReadConsoleInput.argtypes = [HANDLE, POINTER(INPUT_RECORD), DWORD, POINTER(DWORD)] + ReadConsoleInput.restype = BOOL + + GetNumberOfConsoleInputEvents = _KERNEL32.GetNumberOfConsoleInputEvents + GetNumberOfConsoleInputEvents.argtypes = [HANDLE, POINTER(DWORD)] + GetNumberOfConsoleInputEvents.restype = BOOL + + FlushConsoleInputBuffer = _KERNEL32.FlushConsoleInputBuffer + FlushConsoleInputBuffer.argtypes = [HANDLE] + FlushConsoleInputBuffer.restype = BOOL + + OutHandle = GetStdHandle(STD_OUTPUT_HANDLE) + InHandle = GetStdHandle(STD_INPUT_HANDLE) +else: + + def _win_only(*args, **kwargs): + raise NotImplementedError("Windows only") + + GetStdHandle = _win_only + GetConsoleScreenBufferInfo = _win_only + ScrollConsoleScreenBuffer = _win_only + SetConsoleMode = _win_only + ReadConsoleInput = _win_only + GetNumberOfConsoleInputEvents = _win_only + FlushConsoleInputBuffer = _win_only + OutHandle = 0 + InHandle = 0 diff --git a/Lib/_strptime.py b/Lib/_strptime.py index 77ccdc9e..4c68a6a8 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -10,10 +10,12 @@ FUNCTIONS: strptime -- Calculates the time struct represented by the passed-in string """ +import os import time import locale import calendar from re import compile as re_compile +from re import sub as re_sub from re import IGNORECASE from re import escape as re_escape from datetime import (date as datetime_date, @@ -27,6 +29,18 @@ def _getlang(): # Figure out what the current language is set to. return locale.getlocale(locale.LC_TIME) +def _findall(haystack, needle): + # Find all positions of needle in haystack. + if not needle: + return + i = 0 + while True: + i = haystack.find(needle, i) + if i < 0: + break + yield i + i += len(needle) + class LocaleTime(object): """Stores and handles locale-specific information related to time. @@ -101,7 +115,8 @@ class LocaleTime(object): am_pm = [] for hour in (1, 22): time_tuple = time.struct_time((1999,3,17,hour,44,55,2,76,0)) - am_pm.append(time.strftime("%p", time_tuple).lower()) + # br_FR has AM/PM info (' ',' '). + am_pm.append(time.strftime("%p", time_tuple).lower().strip()) self.am_pm = am_pm def __calc_date_time(self): @@ -113,42 +128,130 @@ class LocaleTime(object): # values within the format string is very important; it eliminates # possible ambiguity for what something represents. time_tuple = time.struct_time((1999,3,17,22,44,55,2,76,0)) - date_time = [None, None, None] - date_time[0] = time.strftime("%c", time_tuple).lower() - date_time[1] = time.strftime("%x", time_tuple).lower() - date_time[2] = time.strftime("%X", time_tuple).lower() - replacement_pairs = [('%', '%%'), (self.f_weekday[2], '%A'), - (self.f_month[3], '%B'), (self.a_weekday[2], '%a'), - (self.a_month[3], '%b'), (self.am_pm[1], '%p'), - ('1999', '%Y'), ('99', '%y'), ('22', '%H'), - ('44', '%M'), ('55', '%S'), ('76', '%j'), - ('17', '%d'), ('03', '%m'), ('3', '%m'), - # '3' needed for when no leading zero. - ('2', '%w'), ('10', '%I')] - replacement_pairs.extend([(tz, "%Z") for tz_values in self.timezone - for tz in tz_values]) - for offset,directive in ((0,'%c'), (1,'%x'), (2,'%X')): - current_format = date_time[offset] - for old, new in replacement_pairs: + time_tuple2 = time.struct_time((1999,1,3,1,1,1,6,3,0)) + replacement_pairs = [ + ('1999', '%Y'), ('99', '%y'), ('22', '%H'), + ('44', '%M'), ('55', '%S'), ('76', '%j'), + ('17', '%d'), ('03', '%m'), ('3', '%m'), + # '3' needed for when no leading zero. + ('2', '%w'), ('10', '%I'), + # Non-ASCII digits + ('\u0661\u0669\u0669\u0669', '%Y'), + ('\u0669\u0669', '%Oy'), + ('\u0662\u0662', '%OH'), + ('\u0664\u0664', '%OM'), + ('\u0665\u0665', '%OS'), + ('\u0661\u0667', '%Od'), + ('\u0660\u0663', '%Om'), + ('\u0663', '%Om'), + ('\u0662', '%Ow'), + ('\u0661\u0660', '%OI'), + ] + date_time = [] + for directive in ('%c', '%x', '%X'): + current_format = time.strftime(directive, time_tuple).lower() + current_format = current_format.replace('%', '%%') + # The month and the day of the week formats are treated specially + # because of a possible ambiguity in some locales where the full + # and abbreviated names are equal or names of different types + # are equal. See doc of __find_month_format for more details. + lst, fmt = self.__find_weekday_format(directive) + if lst: + current_format = current_format.replace(lst[2], fmt, 1) + lst, fmt = self.__find_month_format(directive) + if lst: + current_format = current_format.replace(lst[3], fmt, 1) + if self.am_pm[1]: # Must deal with possible lack of locale info # manifesting itself as the empty string (e.g., Swedish's # lack of AM/PM info) or a platform returning a tuple of empty # strings (e.g., MacOS 9 having timezone as ('','')). - if old: - current_format = current_format.replace(old, new) + current_format = current_format.replace(self.am_pm[1], '%p') + for tz_values in self.timezone: + for tz in tz_values: + if tz: + current_format = current_format.replace(tz, "%Z") + # Transform all non-ASCII digits to digits in range U+0660 to U+0669. + current_format = re_sub(r'\d(?3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", - 'I': r"(?P1[0-2]|0[1-9]|[1-9])", + 'I': r"(?P1[0-2]|0[1-9]|[1-9]| [1-9])", 'G': r"(?P\d\d\d\d)", 'j': r"(?P36[0-6]|3[0-5]\d|[1-2]\d\d|0[1-9]\d|00[1-9]|[1-9]\d|0[1-9]|[1-9])", 'm': r"(?P1[0-2]|0[1-9]|[1-9])", @@ -210,11 +313,15 @@ class TimeRE(dict): 'Z': self.__seqToRE((tz for tz_names in self.locale_time.timezone for tz in tz_names), 'Z'), - '%': '%'}) - base.__setitem__('W', base.__getitem__('U').replace('U', 'W')) - base.__setitem__('c', self.pattern(self.locale_time.LC_date_time)) - base.__setitem__('x', self.pattern(self.locale_time.LC_date)) + '%': '%'} + for d in 'dmyHIMS': + mapping['O' + d] = r'(?P<%s>\d\d|\d| \d)' % d + mapping['Ow'] = r'(?P\d)' + mapping['W'] = mapping['U'].replace('U', 'W') + base.__init__(mapping) base.__setitem__('X', self.pattern(self.locale_time.LC_time)) + base.__setitem__('x', self.pattern(self.locale_time.LC_date)) + base.__setitem__('c', self.pattern(self.locale_time.LC_date_time)) def __seqToRE(self, to_convert, directive): """Convert a list to a regex string for matching a directive. @@ -242,21 +349,36 @@ class TimeRE(dict): regex syntax are escaped. """ - processed_format = '' # The sub() call escapes all characters that might be misconstrued # as regex syntax. Cannot use re.escape since we have to deal with # format directives (%m, etc.). - regex_chars = re_compile(r"([\\.^$*+?\(\){}\[\]|])") - format = regex_chars.sub(r"\\\1", format) - whitespace_replacement = re_compile(r'\s+') - format = whitespace_replacement.sub(r'\\s+', format) - while '%' in format: - directive_index = format.index('%')+1 - processed_format = "%s%s%s" % (processed_format, - format[:directive_index-1], - self[format[directive_index]]) - format = format[directive_index+1:] - return "%s%s" % (processed_format, format) + format = re_sub(r"([\\.^$*+?\(\){}\[\]|])", r"\\\1", format) + format = re_sub(r'\s+', r'\\s+', format) + format = re_sub(r"'", "['\u02bc]", format) # needed for br_FR + year_in_format = False + day_of_month_in_format = False + def repl(m): + format_char = m[1] + match format_char: + case 'Y' | 'y' | 'G': + nonlocal year_in_format + year_in_format = True + case 'd': + nonlocal day_of_month_in_format + day_of_month_in_format = True + return self[format_char] + format = re_sub(r'%(O?.)', repl, format) + if day_of_month_in_format and not year_in_format: + import warnings + warnings.warn("""\ +Parsing dates involving a day of month without a year specified is ambiguious +and fails to parse leap day. The default behavior will change in Python 3.15 +to either always raise an exception or to use a different default year (TBD). +To avoid trouble, add a specific year to the input & format. +See https://github.com/python/cpython/issues/70647.""", + DeprecationWarning, + skip_file_prefixes=(os.path.dirname(__file__),)) + return format def compile(self, format): """Return a compiled re object for the format string.""" @@ -342,8 +464,6 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): tz = -1 gmtoff = None gmtoff_fraction = 0 - # Default to -1 to signify that values not known; not critical to have, - # though iso_week = week_of_year = None week_of_year_start = None # weekday and julian defaulted to None so as to signal need to calculate @@ -470,17 +590,17 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): # Deal with the cases where ambiguities arise # don't assume default values for ISO week/year - if year is None and iso_year is not None: - if iso_week is None or weekday is None: - raise ValueError("ISO year directive '%G' must be used with " - "the ISO week directive '%V' and a weekday " - "directive ('%A', '%a', '%w', or '%u').") + if iso_year is not None: if julian is not None: raise ValueError("Day of the year directive '%j' is not " "compatible with ISO year directive '%G'. " "Use '%Y' instead.") - elif week_of_year is None and iso_week is not None: - if weekday is None: + elif iso_week is None or weekday is None: + raise ValueError("ISO year directive '%G' must be used with " + "the ISO week directive '%V' and a weekday " + "directive ('%A', '%a', '%w', or '%u').") + elif iso_week is not None: + if year is None or weekday is None: raise ValueError("ISO week directive '%V' must be used with " "the ISO year directive '%G' and a weekday " "directive ('%A', '%a', '%w', or '%u').") @@ -490,11 +610,12 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): "instead.") leap_year_fix = False - if year is None and month == 2 and day == 29: - year = 1904 # 1904 is first leap year of 20th century - leap_year_fix = True - elif year is None: - year = 1900 + if year is None: + if month == 2 and day == 29: + year = 1904 # 1904 is first leap year of 20th century + leap_year_fix = True + else: + year = 1900 # If we know the week of the year and what day of that week, we can figure # out the Julian day of the year. diff --git a/Lib/aifc.py b/Lib/aifc.py deleted file mode 100644 index 5254987e..00000000 --- a/Lib/aifc.py +++ /dev/null @@ -1,984 +0,0 @@ -"""Stuff to parse AIFF-C and AIFF files. - -Unless explicitly stated otherwise, the description below is true -both for AIFF-C files and AIFF files. - -An AIFF-C file has the following structure. - - +-----------------+ - | FORM | - +-----------------+ - | | - +----+------------+ - | | AIFC | - | +------------+ - | | | - | | . | - | | . | - | | . | - +----+------------+ - -An AIFF file has the string "AIFF" instead of "AIFC". - -A chunk consists of an identifier (4 bytes) followed by a size (4 bytes, -big endian order), followed by the data. The size field does not include -the size of the 8 byte header. - -The following chunk types are recognized. - - FVER - (AIFF-C only). - MARK - <# of markers> (2 bytes) - list of markers: - (2 bytes, must be > 0) - (4 bytes) - ("pstring") - COMM - <# of channels> (2 bytes) - <# of sound frames> (4 bytes) - (2 bytes) - (10 bytes, IEEE 80-bit extended - floating point) - in AIFF-C files only: - (4 bytes) - ("pstring") - SSND - (4 bytes, not used by this program) - (4 bytes, not used by this program) - - -A pstring consists of 1 byte length, a string of characters, and 0 or 1 -byte pad to make the total length even. - -Usage. - -Reading AIFF files: - f = aifc.open(file, 'r') -where file is either the name of a file or an open file pointer. -The open file pointer must have methods read(), seek(), and close(). -In some types of audio files, if the setpos() method is not used, -the seek() method is not necessary. - -This returns an instance of a class with the following public methods: - getnchannels() -- returns number of audio channels (1 for - mono, 2 for stereo) - getsampwidth() -- returns sample width in bytes - getframerate() -- returns sampling frequency - getnframes() -- returns number of audio frames - getcomptype() -- returns compression type ('NONE' for AIFF files) - getcompname() -- returns human-readable version of - compression type ('not compressed' for AIFF files) - getparams() -- returns a namedtuple consisting of all of the - above in the above order - getmarkers() -- get the list of marks in the audio file or None - if there are no marks - getmark(id) -- get mark with the specified id (raises an error - if the mark does not exist) - readframes(n) -- returns at most n frames of audio - rewind() -- rewind to the beginning of the audio stream - setpos(pos) -- seek to the specified position - tell() -- return the current position - close() -- close the instance (make it unusable) -The position returned by tell(), the position given to setpos() and -the position of marks are all compatible and have nothing to do with -the actual position in the file. -The close() method is called automatically when the class instance -is destroyed. - -Writing AIFF files: - f = aifc.open(file, 'w') -where file is either the name of a file or an open file pointer. -The open file pointer must have methods write(), tell(), seek(), and -close(). - -This returns an instance of a class with the following public methods: - aiff() -- create an AIFF file (AIFF-C default) - aifc() -- create an AIFF-C file - setnchannels(n) -- set the number of channels - setsampwidth(n) -- set the sample width - setframerate(n) -- set the frame rate - setnframes(n) -- set the number of frames - setcomptype(type, name) - -- set the compression type and the - human-readable compression type - setparams(tuple) - -- set all parameters at once - setmark(id, pos, name) - -- add specified mark to the list of marks - tell() -- return current position in output file (useful - in combination with setmark()) - writeframesraw(data) - -- write audio frames without pathing up the - file header - writeframes(data) - -- write audio frames and patch up the file header - close() -- patch up the file header and close the - output file -You should set the parameters before the first writeframesraw or -writeframes. The total number of frames does not need to be set, -but when it is set to the correct value, the header does not have to -be patched up. -It is best to first set all parameters, perhaps possibly the -compression type, and then write audio frames using writeframesraw. -When all frames have been written, either call writeframes(b'') or -close() to patch up the sizes in the header. -Marks can be added anytime. If there are any marks, you must call -close() after all frames have been written. -The close() method is called automatically when the class instance -is destroyed. - -When a file is opened with the extension '.aiff', an AIFF file is -written, otherwise an AIFF-C file is written. This default can be -changed by calling aiff() or aifc() before the first writeframes or -writeframesraw. -""" - -import struct -import builtins -import warnings - -__all__ = ["Error", "open"] - - -warnings._deprecated(__name__, remove=(3, 13)) - - -class Error(Exception): - pass - -_AIFC_version = 0xA2805140 # Version 1 of AIFF-C - -def _read_long(file): - try: - return struct.unpack('>l', file.read(4))[0] - except struct.error: - raise EOFError from None - -def _read_ulong(file): - try: - return struct.unpack('>L', file.read(4))[0] - except struct.error: - raise EOFError from None - -def _read_short(file): - try: - return struct.unpack('>h', file.read(2))[0] - except struct.error: - raise EOFError from None - -def _read_ushort(file): - try: - return struct.unpack('>H', file.read(2))[0] - except struct.error: - raise EOFError from None - -def _read_string(file): - length = ord(file.read(1)) - if length == 0: - data = b'' - else: - data = file.read(length) - if length & 1 == 0: - dummy = file.read(1) - return data - -_HUGE_VAL = 1.79769313486231e+308 # See - -def _read_float(f): # 10 bytes - expon = _read_short(f) # 2 bytes - sign = 1 - if expon < 0: - sign = -1 - expon = expon + 0x8000 - himant = _read_ulong(f) # 4 bytes - lomant = _read_ulong(f) # 4 bytes - if expon == himant == lomant == 0: - f = 0.0 - elif expon == 0x7FFF: - f = _HUGE_VAL - else: - expon = expon - 16383 - f = (himant * 0x100000000 + lomant) * pow(2.0, expon - 63) - return sign * f - -def _write_short(f, x): - f.write(struct.pack('>h', x)) - -def _write_ushort(f, x): - f.write(struct.pack('>H', x)) - -def _write_long(f, x): - f.write(struct.pack('>l', x)) - -def _write_ulong(f, x): - f.write(struct.pack('>L', x)) - -def _write_string(f, s): - if len(s) > 255: - raise ValueError("string exceeds maximum pstring length") - f.write(struct.pack('B', len(s))) - f.write(s) - if len(s) & 1 == 0: - f.write(b'\x00') - -def _write_float(f, x): - import math - if x < 0: - sign = 0x8000 - x = x * -1 - else: - sign = 0 - if x == 0: - expon = 0 - himant = 0 - lomant = 0 - else: - fmant, expon = math.frexp(x) - if expon > 16384 or fmant >= 1 or fmant != fmant: # Infinity or NaN - expon = sign|0x7FFF - himant = 0 - lomant = 0 - else: # Finite - expon = expon + 16382 - if expon < 0: # denormalized - fmant = math.ldexp(fmant, expon) - expon = 0 - expon = expon | sign - fmant = math.ldexp(fmant, 32) - fsmant = math.floor(fmant) - himant = int(fsmant) - fmant = math.ldexp(fmant - fsmant, 32) - fsmant = math.floor(fmant) - lomant = int(fsmant) - _write_ushort(f, expon) - _write_ulong(f, himant) - _write_ulong(f, lomant) - -with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - from chunk import Chunk -from collections import namedtuple - -_aifc_params = namedtuple('_aifc_params', - 'nchannels sampwidth framerate nframes comptype compname') - -_aifc_params.nchannels.__doc__ = 'Number of audio channels (1 for mono, 2 for stereo)' -_aifc_params.sampwidth.__doc__ = 'Sample width in bytes' -_aifc_params.framerate.__doc__ = 'Sampling frequency' -_aifc_params.nframes.__doc__ = 'Number of audio frames' -_aifc_params.comptype.__doc__ = 'Compression type ("NONE" for AIFF files)' -_aifc_params.compname.__doc__ = ("""\ -A human-readable version of the compression type -('not compressed' for AIFF files)""") - - -class Aifc_read: - # Variables used in this class: - # - # These variables are available to the user though appropriate - # methods of this class: - # _file -- the open file with methods read(), close(), and seek() - # set through the __init__() method - # _nchannels -- the number of audio channels - # available through the getnchannels() method - # _nframes -- the number of audio frames - # available through the getnframes() method - # _sampwidth -- the number of bytes per audio sample - # available through the getsampwidth() method - # _framerate -- the sampling frequency - # available through the getframerate() method - # _comptype -- the AIFF-C compression type ('NONE' if AIFF) - # available through the getcomptype() method - # _compname -- the human-readable AIFF-C compression type - # available through the getcomptype() method - # _markers -- the marks in the audio file - # available through the getmarkers() and getmark() - # methods - # _soundpos -- the position in the audio stream - # available through the tell() method, set through the - # setpos() method - # - # These variables are used internally only: - # _version -- the AIFF-C version number - # _decomp -- the decompressor from builtin module cl - # _comm_chunk_read -- 1 iff the COMM chunk has been read - # _aifc -- 1 iff reading an AIFF-C file - # _ssnd_seek_needed -- 1 iff positioned correctly in audio - # file for readframes() - # _ssnd_chunk -- instantiation of a chunk class for the SSND chunk - # _framesize -- size of one frame in the file - - _file = None # Set here since __del__ checks it - - def initfp(self, file): - self._version = 0 - self._convert = None - self._markers = [] - self._soundpos = 0 - self._file = file - chunk = Chunk(file) - if chunk.getname() != b'FORM': - raise Error('file does not start with FORM id') - formdata = chunk.read(4) - if formdata == b'AIFF': - self._aifc = 0 - elif formdata == b'AIFC': - self._aifc = 1 - else: - raise Error('not an AIFF or AIFF-C file') - self._comm_chunk_read = 0 - self._ssnd_chunk = None - while 1: - self._ssnd_seek_needed = 1 - try: - chunk = Chunk(self._file) - except EOFError: - break - chunkname = chunk.getname() - if chunkname == b'COMM': - self._read_comm_chunk(chunk) - self._comm_chunk_read = 1 - elif chunkname == b'SSND': - self._ssnd_chunk = chunk - dummy = chunk.read(8) - self._ssnd_seek_needed = 0 - elif chunkname == b'FVER': - self._version = _read_ulong(chunk) - elif chunkname == b'MARK': - self._readmark(chunk) - chunk.skip() - if not self._comm_chunk_read or not self._ssnd_chunk: - raise Error('COMM chunk and/or SSND chunk missing') - - def __init__(self, f): - if isinstance(f, str): - file_object = builtins.open(f, 'rb') - try: - self.initfp(file_object) - except: - file_object.close() - raise - else: - # assume it is an open file object already - self.initfp(f) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - # - # User visible methods. - # - def getfp(self): - return self._file - - def rewind(self): - self._ssnd_seek_needed = 1 - self._soundpos = 0 - - def close(self): - file = self._file - if file is not None: - self._file = None - file.close() - - def tell(self): - return self._soundpos - - def getnchannels(self): - return self._nchannels - - def getnframes(self): - return self._nframes - - def getsampwidth(self): - return self._sampwidth - - def getframerate(self): - return self._framerate - - def getcomptype(self): - return self._comptype - - def getcompname(self): - return self._compname - -## def getversion(self): -## return self._version - - def getparams(self): - return _aifc_params(self.getnchannels(), self.getsampwidth(), - self.getframerate(), self.getnframes(), - self.getcomptype(), self.getcompname()) - - def getmarkers(self): - if len(self._markers) == 0: - return None - return self._markers - - def getmark(self, id): - for marker in self._markers: - if id == marker[0]: - return marker - raise Error('marker {0!r} does not exist'.format(id)) - - def setpos(self, pos): - if pos < 0 or pos > self._nframes: - raise Error('position not in range') - self._soundpos = pos - self._ssnd_seek_needed = 1 - - def readframes(self, nframes): - if self._ssnd_seek_needed: - self._ssnd_chunk.seek(0) - dummy = self._ssnd_chunk.read(8) - pos = self._soundpos * self._framesize - if pos: - self._ssnd_chunk.seek(pos + 8) - self._ssnd_seek_needed = 0 - if nframes == 0: - return b'' - data = self._ssnd_chunk.read(nframes * self._framesize) - if self._convert and data: - data = self._convert(data) - self._soundpos = self._soundpos + len(data) // (self._nchannels - * self._sampwidth) - return data - - # - # Internal methods. - # - - def _alaw2lin(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.alaw2lin(data, 2) - - def _ulaw2lin(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.ulaw2lin(data, 2) - - def _adpcm2lin(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - if not hasattr(self, '_adpcmstate'): - # first time - self._adpcmstate = None - data, self._adpcmstate = audioop.adpcm2lin(data, 2, self._adpcmstate) - return data - - def _sowt2lin(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.byteswap(data, 2) - - def _read_comm_chunk(self, chunk): - self._nchannels = _read_short(chunk) - self._nframes = _read_long(chunk) - self._sampwidth = (_read_short(chunk) + 7) // 8 - self._framerate = int(_read_float(chunk)) - if self._sampwidth <= 0: - raise Error('bad sample width') - if self._nchannels <= 0: - raise Error('bad # of channels') - self._framesize = self._nchannels * self._sampwidth - if self._aifc: - #DEBUG: SGI's soundeditor produces a bad size :-( - kludge = 0 - if chunk.chunksize == 18: - kludge = 1 - warnings.warn('Warning: bad COMM chunk size') - chunk.chunksize = 23 - #DEBUG end - self._comptype = chunk.read(4) - #DEBUG start - if kludge: - length = ord(chunk.file.read(1)) - if length & 1 == 0: - length = length + 1 - chunk.chunksize = chunk.chunksize + length - chunk.file.seek(-1, 1) - #DEBUG end - self._compname = _read_string(chunk) - if self._comptype != b'NONE': - if self._comptype == b'G722': - self._convert = self._adpcm2lin - elif self._comptype in (b'ulaw', b'ULAW'): - self._convert = self._ulaw2lin - elif self._comptype in (b'alaw', b'ALAW'): - self._convert = self._alaw2lin - elif self._comptype in (b'sowt', b'SOWT'): - self._convert = self._sowt2lin - else: - raise Error('unsupported compression type') - self._sampwidth = 2 - else: - self._comptype = b'NONE' - self._compname = b'not compressed' - - def _readmark(self, chunk): - nmarkers = _read_short(chunk) - # Some files appear to contain invalid counts. - # Cope with this by testing for EOF. - try: - for i in range(nmarkers): - id = _read_short(chunk) - pos = _read_long(chunk) - name = _read_string(chunk) - if pos or name: - # some files appear to have - # dummy markers consisting of - # a position 0 and name '' - self._markers.append((id, pos, name)) - except EOFError: - w = ('Warning: MARK chunk contains only %s marker%s instead of %s' % - (len(self._markers), '' if len(self._markers) == 1 else 's', - nmarkers)) - warnings.warn(w) - -class Aifc_write: - # Variables used in this class: - # - # These variables are user settable through appropriate methods - # of this class: - # _file -- the open file with methods write(), close(), tell(), seek() - # set through the __init__() method - # _comptype -- the AIFF-C compression type ('NONE' in AIFF) - # set through the setcomptype() or setparams() method - # _compname -- the human-readable AIFF-C compression type - # set through the setcomptype() or setparams() method - # _nchannels -- the number of audio channels - # set through the setnchannels() or setparams() method - # _sampwidth -- the number of bytes per audio sample - # set through the setsampwidth() or setparams() method - # _framerate -- the sampling frequency - # set through the setframerate() or setparams() method - # _nframes -- the number of audio frames written to the header - # set through the setnframes() or setparams() method - # _aifc -- whether we're writing an AIFF-C file or an AIFF file - # set through the aifc() method, reset through the - # aiff() method - # - # These variables are used internally only: - # _version -- the AIFF-C version number - # _comp -- the compressor from builtin module cl - # _nframeswritten -- the number of audio frames actually written - # _datalength -- the size of the audio samples written to the header - # _datawritten -- the size of the audio samples actually written - - _file = None # Set here since __del__ checks it - - def __init__(self, f): - if isinstance(f, str): - file_object = builtins.open(f, 'wb') - try: - self.initfp(file_object) - except: - file_object.close() - raise - - # treat .aiff file extensions as non-compressed audio - if f.endswith('.aiff'): - self._aifc = 0 - else: - # assume it is an open file object already - self.initfp(f) - - def initfp(self, file): - self._file = file - self._version = _AIFC_version - self._comptype = b'NONE' - self._compname = b'not compressed' - self._convert = None - self._nchannels = 0 - self._sampwidth = 0 - self._framerate = 0 - self._nframes = 0 - self._nframeswritten = 0 - self._datawritten = 0 - self._datalength = 0 - self._markers = [] - self._marklength = 0 - self._aifc = 1 # AIFF-C is default - - def __del__(self): - self.close() - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - # - # User visible methods. - # - def aiff(self): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - self._aifc = 0 - - def aifc(self): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - self._aifc = 1 - - def setnchannels(self, nchannels): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if nchannels < 1: - raise Error('bad # of channels') - self._nchannels = nchannels - - def getnchannels(self): - if not self._nchannels: - raise Error('number of channels not set') - return self._nchannels - - def setsampwidth(self, sampwidth): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if sampwidth < 1 or sampwidth > 4: - raise Error('bad sample width') - self._sampwidth = sampwidth - - def getsampwidth(self): - if not self._sampwidth: - raise Error('sample width not set') - return self._sampwidth - - def setframerate(self, framerate): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if framerate <= 0: - raise Error('bad frame rate') - self._framerate = framerate - - def getframerate(self): - if not self._framerate: - raise Error('frame rate not set') - return self._framerate - - def setnframes(self, nframes): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - self._nframes = nframes - - def getnframes(self): - return self._nframeswritten - - def setcomptype(self, comptype, compname): - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if comptype not in (b'NONE', b'ulaw', b'ULAW', - b'alaw', b'ALAW', b'G722', b'sowt', b'SOWT'): - raise Error('unsupported compression type') - self._comptype = comptype - self._compname = compname - - def getcomptype(self): - return self._comptype - - def getcompname(self): - return self._compname - -## def setversion(self, version): -## if self._nframeswritten: -## raise Error, 'cannot change parameters after starting to write' -## self._version = version - - def setparams(self, params): - nchannels, sampwidth, framerate, nframes, comptype, compname = params - if self._nframeswritten: - raise Error('cannot change parameters after starting to write') - if comptype not in (b'NONE', b'ulaw', b'ULAW', - b'alaw', b'ALAW', b'G722', b'sowt', b'SOWT'): - raise Error('unsupported compression type') - self.setnchannels(nchannels) - self.setsampwidth(sampwidth) - self.setframerate(framerate) - self.setnframes(nframes) - self.setcomptype(comptype, compname) - - def getparams(self): - if not self._nchannels or not self._sampwidth or not self._framerate: - raise Error('not all parameters set') - return _aifc_params(self._nchannels, self._sampwidth, self._framerate, - self._nframes, self._comptype, self._compname) - - def setmark(self, id, pos, name): - if id <= 0: - raise Error('marker ID must be > 0') - if pos < 0: - raise Error('marker position must be >= 0') - if not isinstance(name, bytes): - raise Error('marker name must be bytes') - for i in range(len(self._markers)): - if id == self._markers[i][0]: - self._markers[i] = id, pos, name - return - self._markers.append((id, pos, name)) - - def getmark(self, id): - for marker in self._markers: - if id == marker[0]: - return marker - raise Error('marker {0!r} does not exist'.format(id)) - - def getmarkers(self): - if len(self._markers) == 0: - return None - return self._markers - - def tell(self): - return self._nframeswritten - - def writeframesraw(self, data): - if not isinstance(data, (bytes, bytearray)): - data = memoryview(data).cast('B') - self._ensure_header_written(len(data)) - nframes = len(data) // (self._sampwidth * self._nchannels) - if self._convert: - data = self._convert(data) - self._file.write(data) - self._nframeswritten = self._nframeswritten + nframes - self._datawritten = self._datawritten + len(data) - - def writeframes(self, data): - self.writeframesraw(data) - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - - def close(self): - if self._file is None: - return - try: - self._ensure_header_written(0) - if self._datawritten & 1: - # quick pad to even size - self._file.write(b'\x00') - self._datawritten = self._datawritten + 1 - self._writemarkers() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten or \ - self._marklength: - self._patchheader() - finally: - # Prevent ref cycles - self._convert = None - f = self._file - self._file = None - f.close() - - # - # Internal methods. - # - - def _lin2alaw(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.lin2alaw(data, 2) - - def _lin2ulaw(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.lin2ulaw(data, 2) - - def _lin2adpcm(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - if not hasattr(self, '_adpcmstate'): - self._adpcmstate = None - data, self._adpcmstate = audioop.lin2adpcm(data, 2, self._adpcmstate) - return data - - def _lin2sowt(self, data): - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - import audioop - return audioop.byteswap(data, 2) - - def _ensure_header_written(self, datasize): - if not self._nframeswritten: - if self._comptype in (b'ULAW', b'ulaw', - b'ALAW', b'alaw', b'G722', - b'sowt', b'SOWT'): - if not self._sampwidth: - self._sampwidth = 2 - if self._sampwidth != 2: - raise Error('sample width must be 2 when compressing ' - 'with ulaw/ULAW, alaw/ALAW, sowt/SOWT ' - 'or G7.22 (ADPCM)') - if not self._nchannels: - raise Error('# channels not specified') - if not self._sampwidth: - raise Error('sample width not specified') - if not self._framerate: - raise Error('sampling rate not specified') - self._write_header(datasize) - - def _init_compression(self): - if self._comptype == b'G722': - self._convert = self._lin2adpcm - elif self._comptype in (b'ulaw', b'ULAW'): - self._convert = self._lin2ulaw - elif self._comptype in (b'alaw', b'ALAW'): - self._convert = self._lin2alaw - elif self._comptype in (b'sowt', b'SOWT'): - self._convert = self._lin2sowt - - def _write_header(self, initlength): - if self._aifc and self._comptype != b'NONE': - self._init_compression() - self._file.write(b'FORM') - if not self._nframes: - self._nframes = initlength // (self._nchannels * self._sampwidth) - self._datalength = self._nframes * self._nchannels * self._sampwidth - if self._datalength & 1: - self._datalength = self._datalength + 1 - if self._aifc: - if self._comptype in (b'ulaw', b'ULAW', b'alaw', b'ALAW'): - self._datalength = self._datalength // 2 - if self._datalength & 1: - self._datalength = self._datalength + 1 - elif self._comptype == b'G722': - self._datalength = (self._datalength + 3) // 4 - if self._datalength & 1: - self._datalength = self._datalength + 1 - try: - self._form_length_pos = self._file.tell() - except (AttributeError, OSError): - self._form_length_pos = None - commlength = self._write_form_length(self._datalength) - if self._aifc: - self._file.write(b'AIFC') - self._file.write(b'FVER') - _write_ulong(self._file, 4) - _write_ulong(self._file, self._version) - else: - self._file.write(b'AIFF') - self._file.write(b'COMM') - _write_ulong(self._file, commlength) - _write_short(self._file, self._nchannels) - if self._form_length_pos is not None: - self._nframes_pos = self._file.tell() - _write_ulong(self._file, self._nframes) - if self._comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): - _write_short(self._file, 8) - else: - _write_short(self._file, self._sampwidth * 8) - _write_float(self._file, self._framerate) - if self._aifc: - self._file.write(self._comptype) - _write_string(self._file, self._compname) - self._file.write(b'SSND') - if self._form_length_pos is not None: - self._ssnd_length_pos = self._file.tell() - _write_ulong(self._file, self._datalength + 8) - _write_ulong(self._file, 0) - _write_ulong(self._file, 0) - - def _write_form_length(self, datalength): - if self._aifc: - commlength = 18 + 5 + len(self._compname) - if commlength & 1: - commlength = commlength + 1 - verslength = 12 - else: - commlength = 18 - verslength = 0 - _write_ulong(self._file, 4 + verslength + self._marklength + \ - 8 + commlength + 16 + datalength) - return commlength - - def _patchheader(self): - curpos = self._file.tell() - if self._datawritten & 1: - datalength = self._datawritten + 1 - self._file.write(b'\x00') - else: - datalength = self._datawritten - if datalength == self._datalength and \ - self._nframes == self._nframeswritten and \ - self._marklength == 0: - self._file.seek(curpos, 0) - return - self._file.seek(self._form_length_pos, 0) - dummy = self._write_form_length(datalength) - self._file.seek(self._nframes_pos, 0) - _write_ulong(self._file, self._nframeswritten) - self._file.seek(self._ssnd_length_pos, 0) - _write_ulong(self._file, datalength + 8) - self._file.seek(curpos, 0) - self._nframes = self._nframeswritten - self._datalength = datalength - - def _writemarkers(self): - if len(self._markers) == 0: - return - self._file.write(b'MARK') - length = 2 - for marker in self._markers: - id, pos, name = marker - length = length + len(name) + 1 + 6 - if len(name) & 1 == 0: - length = length + 1 - _write_ulong(self._file, length) - self._marklength = length + 8 - _write_short(self._file, len(self._markers)) - for marker in self._markers: - id, pos, name = marker - _write_short(self._file, id) - _write_ulong(self._file, pos) - _write_string(self._file, name) - -def open(f, mode=None): - if mode is None: - if hasattr(f, 'mode'): - mode = f.mode - else: - mode = 'rb' - if mode in ('r', 'rb'): - return Aifc_read(f) - elif mode in ('w', 'wb'): - return Aifc_write(f) - else: - raise Error("mode must be 'r', 'rb', 'w', or 'wb'") - - -if __name__ == '__main__': - import sys - if not sys.argv[1:]: - sys.argv.append('/usr/demos/data/audio/bach.aiff') - fn = sys.argv[1] - with open(fn, 'r') as f: - print("Reading", fn) - print("nchannels =", f.getnchannels()) - print("nframes =", f.getnframes()) - print("sampwidth =", f.getsampwidth()) - print("framerate =", f.getframerate()) - print("comptype =", f.getcomptype()) - print("compname =", f.getcompname()) - if sys.argv[2:]: - gn = sys.argv[2] - print("Writing", gn) - with open(gn, 'w') as g: - g.setparams(f.getparams()) - while 1: - data = f.readframes(1024) - if not data: - break - g.writeframes(data) - print("Done.") diff --git a/Lib/argparse.py b/Lib/argparse.py index 543d9944..90623a19 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -89,8 +89,6 @@ import os as _os import re as _re import sys as _sys -import warnings - from gettext import gettext as _, ngettext SUPPRESS = '==SUPPRESS==' @@ -225,7 +223,8 @@ class HelpFormatter(object): # add the heading if the section was non-empty if self.heading is not SUPPRESS and self.heading is not None: current_indent = self.formatter._current_indent - heading = '%*s%s:\n' % (current_indent, '', self.heading) + heading_text = _('%(heading)s:') % dict(heading=self.heading) + heading = '%*s%s\n' % (current_indent, '', heading_text) else: heading = '' @@ -262,13 +261,12 @@ class HelpFormatter(object): # find all invocations get_invocation = self._format_action_invocation - invocations = [get_invocation(action)] + invocation_lengths = [len(get_invocation(action)) + self._current_indent] for subaction in self._iter_indented_subactions(action): - invocations.append(get_invocation(subaction)) + invocation_lengths.append(len(get_invocation(subaction)) + self._current_indent) # update the maximum item length - invocation_length = max(map(len, invocations)) - action_length = invocation_length + self._current_indent + action_length = max(invocation_lengths) self._action_max_length = max(self._action_max_length, action_length) @@ -329,17 +327,8 @@ class HelpFormatter(object): if len(prefix) + len(usage) > text_width: # break usage into wrappable parts - part_regexp = ( - r'\(.*?\)+(?=\s|$)|' - r'\[.*?\]+(?=\s|$)|' - r'\S+' - ) - opt_usage = format(optionals, groups) - pos_usage = format(positionals, groups) - opt_parts = _re.findall(part_regexp, opt_usage) - pos_parts = _re.findall(part_regexp, pos_usage) - assert ' '.join(opt_parts) == opt_usage - assert ' '.join(pos_parts) == pos_usage + opt_parts = self._get_actions_usage_parts(optionals, groups) + pos_parts = self._get_actions_usage_parts(positionals, groups) # helper for wrapping lines def get_lines(parts, indent, prefix=None): @@ -392,6 +381,9 @@ class HelpFormatter(object): return '%s%s\n\n' % (prefix, usage) def _format_actions_usage(self, actions, groups): + return ' '.join(self._get_actions_usage_parts(actions, groups)) + + def _get_actions_usage_parts(self, actions, groups): # find group indices and identify actions in groups group_actions = set() inserts = {} @@ -399,56 +391,26 @@ class HelpFormatter(object): if not group._group_actions: raise ValueError(f'empty group {group}') + if all(action.help is SUPPRESS for action in group._group_actions): + continue + try: start = actions.index(group._group_actions[0]) except ValueError: continue else: - group_action_count = len(group._group_actions) - end = start + group_action_count + end = start + len(group._group_actions) if actions[start:end] == group._group_actions: - - suppressed_actions_count = 0 - for action in group._group_actions: - group_actions.add(action) - if action.help is SUPPRESS: - suppressed_actions_count += 1 - - exposed_actions_count = group_action_count - suppressed_actions_count - - if not group.required: - if start in inserts: - inserts[start] += ' [' - else: - inserts[start] = '[' - if end in inserts: - inserts[end] += ']' - else: - inserts[end] = ']' - elif exposed_actions_count > 1: - if start in inserts: - inserts[start] += ' (' - else: - inserts[start] = '(' - if end in inserts: - inserts[end] += ')' - else: - inserts[end] = ')' - for i in range(start + 1, end): - inserts[i] = '|' + group_actions.update(group._group_actions) + inserts[start, end] = group # collect all actions format strings parts = [] - for i, action in enumerate(actions): + for action in actions: # suppressed arguments are marked with None - # remove | separators for suppressed arguments if action.help is SUPPRESS: - parts.append(None) - if inserts.get(i) == '|': - inserts.pop(i) - elif inserts.get(i + 1) == '|': - inserts.pop(i + 1) + part = None # produce all arg strings elif not action.option_strings: @@ -460,9 +422,6 @@ class HelpFormatter(object): if part[0] == '[' and part[-1] == ']': part = part[1:-1] - # add the action string to the list - parts.append(part) - # produce the first way to invoke the option in brackets else: option_string = action.option_strings[0] @@ -483,26 +442,32 @@ class HelpFormatter(object): if not action.required and action not in group_actions: part = '[%s]' % part - # add the action string to the list - parts.append(part) - - # insert things at the necessary indices - for i in sorted(inserts, reverse=True): - parts[i:i] = [inserts[i]] - - # join all the action items with spaces - text = ' '.join([item for item in parts if item is not None]) + # add the action string to the list + parts.append(part) - # clean up separators for mutually exclusive groups - open = r'[\[(]' - close = r'[\])]' - text = _re.sub(r'(%s) ' % open, r'\1', text) - text = _re.sub(r' (%s)' % close, r'\1', text) - text = _re.sub(r'%s *%s' % (open, close), r'', text) - text = text.strip() - - # return the text - return text + # group mutually exclusive actions + inserted_separators_indices = set() + for start, end in sorted(inserts, reverse=True): + group = inserts[start, end] + group_parts = [item for item in parts[start:end] if item is not None] + group_size = len(group_parts) + if group.required: + open, close = "()" if group_size > 1 else ("", "") + else: + open, close = "[]" + group_parts[0] = open + group_parts[0] + group_parts[-1] = group_parts[-1] + close + for i, part in enumerate(group_parts[:-1], start=start): + # insert a separator if not already done in a nested group + if i not in inserted_separators_indices: + parts[i] = part + ' |' + inserted_separators_indices.add(i) + parts[start + group_size - 1] = group_parts[-1] + for i in range(start + group_size, end): + parts[i] = None + + # return the usage parts + return [item for item in parts if item is not None] def _format_text(self, text): if '%(prog)' in text: @@ -562,33 +527,27 @@ class HelpFormatter(object): def _format_action_invocation(self, action): if not action.option_strings: default = self._get_default_metavar_for_positional(action) - metavar, = self._metavar_formatter(action, default)(1) - return metavar + return ' '.join(self._metavar_formatter(action, default)(1)) else: - parts = [] # if the Optional doesn't take a value, format is: # -s, --long if action.nargs == 0: - parts.extend(action.option_strings) + return ', '.join(action.option_strings) # if the Optional takes a value, format is: - # -s ARGS, --long ARGS + # -s, --long ARGS else: default = self._get_default_metavar_for_optional(action) args_string = self._format_args(action, default) - for option_string in action.option_strings: - parts.append('%s %s' % (option_string, args_string)) - - return ', '.join(parts) + return ', '.join(action.option_strings) + ' ' + args_string def _metavar_formatter(self, action, default_metavar): if action.metavar is not None: result = action.metavar elif action.choices is not None: - choice_strs = [str(choice) for choice in action.choices] - result = '{%s}' % ','.join(choice_strs) + result = '{%s}' % ','.join(map(str, action.choices)) else: result = default_metavar @@ -636,8 +595,7 @@ class HelpFormatter(object): if hasattr(params[name], '__name__'): params[name] = params[name].__name__ if params.get('choices') is not None: - choices_str = ', '.join([str(c) for c in params['choices']]) - params['choices'] = choices_str + params['choices'] = ', '.join(map(str, params['choices'])) return self._get_help_string(action) % params def _iter_indented_subactions(self, action): @@ -704,14 +662,6 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter): """ def _get_help_string(self, action): - """ - Add the default value to the option help message. - - ArgumentDefaultsHelpFormatter and BooleanOptionalAction when it isn't - already present. This code will do that, detecting cornercases to - prevent duplicates or cases where it wouldn't make sense to the end - user. - """ help = action.help if help is None: help = '' @@ -720,7 +670,7 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter): if action.default is not SUPPRESS: defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] if action.option_strings or action.nargs in defaulting_nargs: - help += ' (default: %(default)s)' + help += _(' (default: %(default)s)') return help @@ -750,11 +700,19 @@ def _get_action_name(argument): elif argument.option_strings: return '/'.join(argument.option_strings) elif argument.metavar not in (None, SUPPRESS): - return argument.metavar + metavar = argument.metavar + if not isinstance(metavar, tuple): + return metavar + if argument.nargs == ZERO_OR_MORE and len(metavar) == 2: + return '%s[, %s]' % metavar + elif argument.nargs == ONE_OR_MORE: + return '%s[, %s]' % metavar + else: + return ', '.join(metavar) elif argument.dest not in (None, SUPPRESS): return argument.dest elif argument.choices: - return '{' + ','.join(argument.choices) + '}' + return '{%s}' % ','.join(map(str, argument.choices)) else: return None @@ -849,7 +807,8 @@ class Action(_AttributeHolder): choices=None, required=False, help=None, - metavar=None): + metavar=None, + deprecated=False): self.option_strings = option_strings self.dest = dest self.nargs = nargs @@ -860,6 +819,7 @@ class Action(_AttributeHolder): self.required = required self.help = help self.metavar = metavar + self.deprecated = deprecated def _get_kwargs(self): names = [ @@ -873,6 +833,7 @@ class Action(_AttributeHolder): 'required', 'help', 'metavar', + 'deprecated', ] return [(name, getattr(self, name)) for name in names] @@ -895,7 +856,8 @@ class BooleanOptionalAction(Action): choices=_deprecated_default, required=False, help=None, - metavar=_deprecated_default): + metavar=_deprecated_default, + deprecated=False): _option_strings = [] for option_string in option_strings: @@ -910,6 +872,7 @@ class BooleanOptionalAction(Action): # parser.add_argument('-f', action=BooleanOptionalAction, type=int) for field_name in ('type', 'choices', 'metavar'): if locals()[field_name] is not _deprecated_default: + import warnings warnings._deprecated( field_name, "{name!r} is deprecated as of Python 3.12 and will be " @@ -932,7 +895,8 @@ class BooleanOptionalAction(Action): choices=choices, required=required, help=help, - metavar=metavar) + metavar=metavar, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): @@ -955,7 +919,8 @@ class _StoreAction(Action): choices=None, required=False, help=None, - metavar=None): + metavar=None, + deprecated=False): if nargs == 0: raise ValueError('nargs for store actions must be != 0; if you ' 'have nothing to store, actions such as store ' @@ -972,7 +937,8 @@ class _StoreAction(Action): choices=choices, required=required, help=help, - metavar=metavar) + metavar=metavar, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): setattr(namespace, self.dest, values) @@ -987,7 +953,8 @@ class _StoreConstAction(Action): default=None, required=False, help=None, - metavar=None): + metavar=None, + deprecated=False): super(_StoreConstAction, self).__init__( option_strings=option_strings, dest=dest, @@ -995,7 +962,8 @@ class _StoreConstAction(Action): const=const, default=default, required=required, - help=help) + help=help, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): setattr(namespace, self.dest, self.const) @@ -1008,14 +976,16 @@ class _StoreTrueAction(_StoreConstAction): dest, default=False, required=False, - help=None): + help=None, + deprecated=False): super(_StoreTrueAction, self).__init__( option_strings=option_strings, dest=dest, const=True, - default=default, + deprecated=deprecated, required=required, - help=help) + help=help, + default=default) class _StoreFalseAction(_StoreConstAction): @@ -1025,14 +995,16 @@ class _StoreFalseAction(_StoreConstAction): dest, default=True, required=False, - help=None): + help=None, + deprecated=False): super(_StoreFalseAction, self).__init__( option_strings=option_strings, dest=dest, const=False, default=default, required=required, - help=help) + help=help, + deprecated=deprecated) class _AppendAction(Action): @@ -1047,7 +1019,8 @@ class _AppendAction(Action): choices=None, required=False, help=None, - metavar=None): + metavar=None, + deprecated=False): if nargs == 0: raise ValueError('nargs for append actions must be != 0; if arg ' 'strings are not supplying the value to append, ' @@ -1064,7 +1037,8 @@ class _AppendAction(Action): choices=choices, required=required, help=help, - metavar=metavar) + metavar=metavar, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): items = getattr(namespace, self.dest, None) @@ -1082,7 +1056,8 @@ class _AppendConstAction(Action): default=None, required=False, help=None, - metavar=None): + metavar=None, + deprecated=False): super(_AppendConstAction, self).__init__( option_strings=option_strings, dest=dest, @@ -1091,7 +1066,8 @@ class _AppendConstAction(Action): default=default, required=required, help=help, - metavar=metavar) + metavar=metavar, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): items = getattr(namespace, self.dest, None) @@ -1107,14 +1083,16 @@ class _CountAction(Action): dest, default=None, required=False, - help=None): + help=None, + deprecated=False): super(_CountAction, self).__init__( option_strings=option_strings, dest=dest, nargs=0, default=default, required=required, - help=help) + help=help, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): count = getattr(namespace, self.dest, None) @@ -1129,13 +1107,15 @@ class _HelpAction(Action): option_strings, dest=SUPPRESS, default=SUPPRESS, - help=None): + help=None, + deprecated=False): super(_HelpAction, self).__init__( option_strings=option_strings, dest=dest, default=default, nargs=0, - help=help) + help=help, + deprecated=deprecated) def __call__(self, parser, namespace, values, option_string=None): parser.print_help() @@ -1149,7 +1129,10 @@ class _VersionAction(Action): version=None, dest=SUPPRESS, default=SUPPRESS, - help="show program's version number and exit"): + help=None, + deprecated=False): + if help is None: + help = _("show program's version number and exit") super(_VersionAction, self).__init__( option_strings=option_strings, dest=dest, @@ -1193,6 +1176,7 @@ class _SubParsersAction(Action): self._parser_class = parser_class self._name_parser_map = {} self._choices_actions = [] + self._deprecated = set() super(_SubParsersAction, self).__init__( option_strings=option_strings, @@ -1203,7 +1187,7 @@ class _SubParsersAction(Action): help=help, metavar=metavar) - def add_parser(self, name, **kwargs): + def add_parser(self, name, *, deprecated=False, **kwargs): # set prog from the existing prefix if kwargs.get('prog') is None: kwargs['prog'] = '%s %s' % (self._prog_prefix, name) @@ -1231,6 +1215,10 @@ class _SubParsersAction(Action): for alias in aliases: self._name_parser_map[alias] = parser + if deprecated: + self._deprecated.add(name) + self._deprecated.update(aliases) + return parser def _get_subactions(self): @@ -1246,13 +1234,17 @@ class _SubParsersAction(Action): # select the parser try: - parser = self._name_parser_map[parser_name] + subparser = self._name_parser_map[parser_name] except KeyError: args = {'parser_name': parser_name, 'choices': ', '.join(self._name_parser_map)} msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args raise ArgumentError(self, msg) + if parser_name in self._deprecated: + parser._warning(_("command '%(parser_name)s' is deprecated") % + {'parser_name': parser_name}) + # parse all the remaining options into the namespace # store any unrecognized options on the object, so that the top # level parser can decide what to do with them @@ -1260,12 +1252,13 @@ class _SubParsersAction(Action): # In case this subparser defines new defaults, we parse them # in a new namespace object and then update the original # namespace for the relevant parts. - subnamespace, arg_strings = parser.parse_known_args(arg_strings, None) + subnamespace, arg_strings = subparser.parse_known_args(arg_strings, None) for key, value in vars(subnamespace).items(): setattr(namespace, key, value) if arg_strings: - vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) + if not hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + setattr(namespace, _UNRECOGNIZED_ARGS_ATTR, []) getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) class _ExtendAction(_AppendAction): @@ -1528,6 +1521,8 @@ class _ActionsContainer(object): title_group_map = {} for group in self._action_groups: if group.title in title_group_map: + # This branch could happen if a derived class added + # groups with duplicated titles in __init__ msg = _('cannot merge actions - two groups are named %r') raise ValueError(msg % (group.title)) title_group_map[group.title] = group @@ -1552,7 +1547,11 @@ class _ActionsContainer(object): # NOTE: if add_mutually_exclusive_group ever gains title= and # description= then this code will need to be expanded as above for group in container._mutually_exclusive_groups: - mutex_group = self.add_mutually_exclusive_group( + if group._container is container: + cont = self + else: + cont = title_group_map[group._container.title] + mutex_group = cont.add_mutually_exclusive_group( required=group.required) # map the actions to their new mutex group @@ -1571,9 +1570,8 @@ class _ActionsContainer(object): # mark positional arguments as required if at least one is # always required - if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: - kwargs['required'] = True - if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: + nargs = kwargs.get('nargs') + if nargs not in [OPTIONAL, ZERO_OR_MORE, REMAINDER, SUPPRESS, 0]: kwargs['required'] = True # return the keyword arguments with no option strings @@ -1698,6 +1696,7 @@ class _ArgumentGroup(_ActionsContainer): self._group_actions.remove(action) def add_argument_group(self, *args, **kwargs): + import warnings warnings.warn( "Nesting argument groups is deprecated.", category=DeprecationWarning, @@ -1726,6 +1725,7 @@ class _MutuallyExclusiveGroup(_ArgumentGroup): self._group_actions.remove(action) def add_mutually_exclusive_group(self, *args, **kwargs): + import warnings warnings.warn( "Nesting mutually exclusive groups is deprecated.", category=DeprecationWarning, @@ -1811,13 +1811,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # add parent arguments and defaults for parent in parents: + if not isinstance(parent, ArgumentParser): + raise TypeError('parents must be a list of ArgumentParser') self._add_container_actions(parent) - try: - defaults = parent._defaults - except AttributeError: - pass - else: - self._defaults.update(defaults) + defaults = parent._defaults + self._defaults.update(defaults) # ======================= # Pretty __repr__ methods @@ -1838,14 +1836,14 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # ================================== def add_subparsers(self, **kwargs): if self._subparsers is not None: - self.error(_('cannot have multiple subparser arguments')) + raise ArgumentError(None, _('cannot have multiple subparser arguments')) # add the parser class to the arguments if it's not present kwargs.setdefault('parser_class', type(self)) if 'title' in kwargs or 'description' in kwargs: - title = _(kwargs.pop('title', 'subcommands')) - description = _(kwargs.pop('description', None)) + title = kwargs.pop('title', _('subcommands')) + description = kwargs.pop('description', None) self._subparsers = self.add_argument_group(title, description) else: self._subparsers = self._positionals @@ -1890,11 +1888,17 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def parse_args(self, args=None, namespace=None): args, argv = self.parse_known_args(args, namespace) if argv: - msg = _('unrecognized arguments: %s') - self.error(msg % ' '.join(argv)) + msg = _('unrecognized arguments: %s') % ' '.join(argv) + if self.exit_on_error: + self.error(msg) + else: + raise ArgumentError(None, msg) return args def parse_known_args(self, args=None, namespace=None): + return self._parse_known_args2(args, namespace, intermixed=False) + + def _parse_known_args2(self, args, namespace, intermixed): if args is None: # args default to the system args args = _sys.argv[1:] @@ -1921,18 +1925,18 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # parse the arguments and exit if there are any errors if self.exit_on_error: try: - namespace, args = self._parse_known_args(args, namespace) + namespace, args = self._parse_known_args(args, namespace, intermixed) except ArgumentError as err: self.error(str(err)) else: - namespace, args = self._parse_known_args(args, namespace) + namespace, args = self._parse_known_args(args, namespace, intermixed) if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) return namespace, args - def _parse_known_args(self, arg_strings, namespace): + def _parse_known_args(self, arg_strings, namespace, intermixed): # replace arg strings that are file references if self.fromfile_prefix_chars is not None: arg_strings = self._read_args_from_files(arg_strings) @@ -1964,11 +1968,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # otherwise, add the arg to the arg strings # and note the index if it was an option else: - option_tuple = self._parse_optional(arg_string) - if option_tuple is None: + option_tuples = self._parse_optional(arg_string) + if option_tuples is None: pattern = 'A' else: - option_string_indices[i] = option_tuple + option_string_indices[i] = option_tuples pattern = 'O' arg_string_pattern_parts.append(pattern) @@ -1978,15 +1982,15 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # converts arg strings to the appropriate and then takes the action seen_actions = set() seen_non_default_actions = set() + warned = set() def take_action(action, argument_strings, option_string=None): seen_actions.add(action) argument_values = self._get_values(action, argument_strings) # error if this argument is not allowed with other previously - # seen arguments, assuming that actions that use the default - # value don't really count as "present" - if argument_values is not action.default: + # seen arguments + if action.option_strings or argument_strings: seen_non_default_actions.add(action) for conflict_action in action_conflicts.get(action, []): if conflict_action in seen_non_default_actions: @@ -2003,8 +2007,16 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def consume_optional(start_index): # get the optional identified at this index - option_tuple = option_string_indices[start_index] - action, option_string, explicit_arg = option_tuple + option_tuples = option_string_indices[start_index] + # if multiple actions match, the option string was ambiguous + if len(option_tuples) > 1: + options = ', '.join([option_string + for action, option_string, sep, explicit_arg in option_tuples]) + args = {'option': arg_strings[start_index], 'matches': options} + msg = _('ambiguous option: %(option)s could match %(matches)s') + raise ArgumentError(None, msg % args) + + action, option_string, sep, explicit_arg = option_tuples[0] # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) @@ -2015,6 +2027,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # if we found no optional action, skip it if action is None: extras.append(arg_strings[start_index]) + extras_pattern.append('O') return start_index + 1 # if there is an explicit argument, try to match the @@ -2031,18 +2044,28 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): and option_string[1] not in chars and explicit_arg != '' ): + if sep or explicit_arg[0] in chars: + msg = _('ignored explicit argument %r') + raise ArgumentError(action, msg % explicit_arg) action_tuples.append((action, [], option_string)) char = option_string[0] option_string = char + explicit_arg[0] - new_explicit_arg = explicit_arg[1:] or None optionals_map = self._option_string_actions if option_string in optionals_map: action = optionals_map[option_string] - explicit_arg = new_explicit_arg + explicit_arg = explicit_arg[1:] + if not explicit_arg: + sep = explicit_arg = None + elif explicit_arg[0] == '=': + sep = '=' + explicit_arg = explicit_arg[1:] + else: + sep = '' else: - msg = _('ignored explicit argument %r') - raise ArgumentError(action, msg % explicit_arg) - + extras.append(char + explicit_arg) + extras_pattern.append('O') + stop = start_index + 1 + break # if the action expect exactly one argument, we've # successfully matched the option; exit the loop elif arg_count == 1: @@ -2073,6 +2096,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # the Optional's string args stopped assert action_tuples for action, args, option_string in action_tuples: + if action.deprecated and option_string not in warned: + self._warning(_("option '%(option)s' is deprecated") % + {'option': option_string}) + warned.add(option_string) take_action(action, args, option_string) return stop @@ -2091,7 +2118,20 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] + # Strip out the first '--' if it is not in REMAINDER arg. + if action.nargs == PARSER: + if arg_strings_pattern[start_index] == '-': + assert args[0] == '--' + args.remove('--') + elif action.nargs != REMAINDER: + if (arg_strings_pattern.find('-', start_index, + start_index + arg_count) >= 0): + args.remove('--') start_index += arg_count + if args and action.deprecated and action.dest not in warned: + self._warning(_("argument '%(argument_name)s' is deprecated") % + {'argument_name': action.dest}) + warned.add(action.dest) take_action(action, args) # slice off the Positionals that we just parsed and return the @@ -2102,6 +2142,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # consume Positionals and Optionals alternately, until we have # passed the last option string extras = [] + extras_pattern = [] start_index = 0 if option_string_indices: max_option_string_index = max(option_string_indices) @@ -2110,11 +2151,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): while start_index <= max_option_string_index: # consume any Positionals preceding the next option - next_option_string_index = min([ - index - for index in option_string_indices - if index >= start_index]) - if start_index != next_option_string_index: + next_option_string_index = start_index + while next_option_string_index <= max_option_string_index: + if next_option_string_index in option_string_indices: + break + next_option_string_index += 1 + if not intermixed and start_index != next_option_string_index: positionals_end_index = consume_positionals(start_index) # only try to parse the next optional if we didn't consume @@ -2130,16 +2172,35 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): if start_index not in option_string_indices: strings = arg_strings[start_index:next_option_string_index] extras.extend(strings) + extras_pattern.extend(arg_strings_pattern[start_index:next_option_string_index]) start_index = next_option_string_index # consume the next optional and any arguments for it start_index = consume_optional(start_index) - # consume any positionals following the last Optional - stop_index = consume_positionals(start_index) + if not intermixed: + # consume any positionals following the last Optional + stop_index = consume_positionals(start_index) - # if we didn't consume all the argument strings, there were extras - extras.extend(arg_strings[stop_index:]) + # if we didn't consume all the argument strings, there were extras + extras.extend(arg_strings[stop_index:]) + else: + extras.extend(arg_strings[start_index:]) + extras_pattern.extend(arg_strings_pattern[start_index:]) + extras_pattern = ''.join(extras_pattern) + assert len(extras_pattern) == len(extras) + # consume all positionals + arg_strings = [s for s, c in zip(extras, extras_pattern) if c != 'O'] + arg_strings_pattern = extras_pattern.replace('O', '') + stop_index = consume_positionals(0) + # leave unknown optionals and non-consumed positionals in extras + for i, c in enumerate(extras_pattern): + if not stop_index: + break + if c != 'O': + stop_index -= 1 + extras[i] = None + extras = [s for s in extras if s is not None] # make sure all required actions were present and also convert # action defaults which were not given as arguments @@ -2161,7 +2222,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): self._get_value(action, action.default)) if required_actions: - self.error(_('the following arguments are required: %s') % + raise ArgumentError(None, _('the following arguments are required: %s') % ', '.join(required_actions)) # make sure all required groups had one option present @@ -2177,7 +2238,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): for action in group._group_actions if action.help is not SUPPRESS] msg = _('one of the arguments %s is required') - self.error(msg % ' '.join(names)) + raise ArgumentError(None, msg % ' '.join(names)) # return the updated namespace and the extra arguments return namespace, extras @@ -2204,7 +2265,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): arg_strings = self._read_args_from_files(arg_strings) new_arg_strings.extend(arg_strings) except OSError as err: - self.error(str(err)) + raise ArgumentError(None, str(err)) # return the modified argument list return new_arg_strings @@ -2237,18 +2298,19 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def _match_arguments_partial(self, actions, arg_strings_pattern): # progressively shorten the actions list by slicing off the # final actions until we find a match - result = [] for i in range(len(actions), 0, -1): actions_slice = actions[:i] pattern = ''.join([self._get_nargs_pattern(action) for action in actions_slice]) match = _re.match(pattern, arg_strings_pattern) if match is not None: - result.extend([len(string) for string in match.groups()]) - break - - # return the list of arg string counts - return result + result = [len(string) for string in match.groups()] + if (match.end() < len(arg_strings_pattern) + and arg_strings_pattern[match.end()] == 'O'): + while result and not result[-1]: + del result[-1] + return result + return [] def _parse_optional(self, arg_string): # if it's an empty string, it was meant to be a positional @@ -2262,36 +2324,24 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # if the option string is present in the parser, return the action if arg_string in self._option_string_actions: action = self._option_string_actions[arg_string] - return action, arg_string, None + return [(action, arg_string, None, None)] # if it's just a single character, it was meant to be positional if len(arg_string) == 1: return None # if the option string before the "=" is present, return the action - if '=' in arg_string: - option_string, explicit_arg = arg_string.split('=', 1) - if option_string in self._option_string_actions: - action = self._option_string_actions[option_string] - return action, option_string, explicit_arg + option_string, sep, explicit_arg = arg_string.partition('=') + if sep and option_string in self._option_string_actions: + action = self._option_string_actions[option_string] + return [(action, option_string, sep, explicit_arg)] # search through all possible prefixes of the option string # and all actions in the parser for possible interpretations option_tuples = self._get_option_tuples(arg_string) - # if multiple actions match, the option string was ambiguous - if len(option_tuples) > 1: - options = ', '.join([option_string - for action, option_string, explicit_arg in option_tuples]) - args = {'option': arg_string, 'matches': options} - msg = _('ambiguous option: %(option)s could match %(matches)s') - self.error(msg % args) - - # if exactly one action matched, this segmentation is good, - # so return the parsed action - elif len(option_tuples) == 1: - option_tuple, = option_tuples - return option_tuple + if option_tuples: + return option_tuples # if it was not found as an option, but it looks like a negative # number, it was meant to be positional @@ -2306,7 +2356,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # it was meant to be an optional but there is no such option # in this parser (though it might be a valid option in a subparser) - return None, arg_string, None + return [(None, arg_string, None, None)] def _get_option_tuples(self, option_string): result = [] @@ -2316,39 +2366,38 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): chars = self.prefix_chars if option_string[0] in chars and option_string[1] in chars: if self.allow_abbrev: - if '=' in option_string: - option_prefix, explicit_arg = option_string.split('=', 1) - else: - option_prefix = option_string - explicit_arg = None + option_prefix, sep, explicit_arg = option_string.partition('=') + if not sep: + sep = explicit_arg = None for option_string in self._option_string_actions: if option_string.startswith(option_prefix): action = self._option_string_actions[option_string] - tup = action, option_string, explicit_arg + tup = action, option_string, sep, explicit_arg result.append(tup) # single character options can be concatenated with their arguments # but multiple character options always have to have their argument # separate elif option_string[0] in chars and option_string[1] not in chars: - option_prefix = option_string - explicit_arg = None + option_prefix, sep, explicit_arg = option_string.partition('=') + if not sep: + sep = explicit_arg = None short_option_prefix = option_string[:2] short_explicit_arg = option_string[2:] for option_string in self._option_string_actions: if option_string == short_option_prefix: action = self._option_string_actions[option_string] - tup = action, option_string, short_explicit_arg + tup = action, option_string, '', short_explicit_arg result.append(tup) - elif option_string.startswith(option_prefix): + elif self.allow_abbrev and option_string.startswith(option_prefix): action = self._option_string_actions[option_string] - tup = action, option_string, explicit_arg + tup = action, option_string, sep, explicit_arg result.append(tup) # shouldn't ever get here else: - self.error(_('unexpected option string: %s') % option_string) + raise ArgumentError(None, _('unexpected option string: %s') % option_string) # return the collected option tuples return result @@ -2357,43 +2406,40 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # in all examples below, we have to allow for '--' args # which are represented as '-' in the pattern nargs = action.nargs + # if this is an optional action, -- is not allowed + option = action.option_strings # the default (None) is assumed to be a single argument if nargs is None: - nargs_pattern = '(-*A-*)' + nargs_pattern = '([A])' if option else '(-*A-*)' # allow zero or one arguments elif nargs == OPTIONAL: - nargs_pattern = '(-*A?-*)' + nargs_pattern = '(A?)' if option else '(-*A?-*)' # allow zero or more arguments elif nargs == ZERO_OR_MORE: - nargs_pattern = '(-*[A-]*)' + nargs_pattern = '(A*)' if option else '(-*[A-]*)' # allow one or more arguments elif nargs == ONE_OR_MORE: - nargs_pattern = '(-*A[A-]*)' + nargs_pattern = '(A+)' if option else '(-*A[A-]*)' # allow any number of options or arguments elif nargs == REMAINDER: - nargs_pattern = '([-AO]*)' + nargs_pattern = '([AO]*)' if option else '(.*)' # allow one argument followed by any number of options or arguments elif nargs == PARSER: - nargs_pattern = '(-*A[-AO]*)' + nargs_pattern = '(A[AO]*)' if option else '(-*A[-AO]*)' # suppress action, like nargs=0 elif nargs == SUPPRESS: - nargs_pattern = '(-*-*)' + nargs_pattern = '()' if option else '(-*)' # all others should be integers else: - nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) - - # if this is an optional action, -- is not allowed - if action.option_strings: - nargs_pattern = nargs_pattern.replace('-*', '') - nargs_pattern = nargs_pattern.replace('-', '') + nargs_pattern = '([AO]{%d})' % nargs if option else '((?:-*A){%d}-*)' % nargs # return the pattern return nargs_pattern @@ -2405,8 +2451,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def parse_intermixed_args(self, args=None, namespace=None): args, argv = self.parse_known_intermixed_args(args, namespace) if argv: - msg = _('unrecognized arguments: %s') - self.error(msg % ' '.join(argv)) + msg = _('unrecognized arguments: %s') % ' '.join(argv) + if self.exit_on_error: + self.error(msg) + else: + raise ArgumentError(None, msg) return args def parse_known_intermixed_args(self, args=None, namespace=None): @@ -2417,10 +2466,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): # are then parsed. If the parser definition is incompatible with the # intermixed assumptions (e.g. use of REMAINDER, subparsers) a # TypeError is raised. - # - # positionals are 'deactivated' by setting nargs and default to - # SUPPRESS. This blocks the addition of that positional to the - # namespace positionals = self._get_positional_actions() a = [action for action in positionals @@ -2429,78 +2474,19 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): raise TypeError('parse_intermixed_args: positional arg' ' with nargs=%s'%a[0].nargs) - if [action.dest for group in self._mutually_exclusive_groups - for action in group._group_actions if action in positionals]: - raise TypeError('parse_intermixed_args: positional in' - ' mutuallyExclusiveGroup') - - try: - save_usage = self.usage - try: - if self.usage is None: - # capture the full usage for use in error messages - self.usage = self.format_usage()[7:] - for action in positionals: - # deactivate positionals - action.save_nargs = action.nargs - # action.nargs = 0 - action.nargs = SUPPRESS - action.save_default = action.default - action.default = SUPPRESS - namespace, remaining_args = self.parse_known_args(args, - namespace) - for action in positionals: - # remove the empty positional values from namespace - if (hasattr(namespace, action.dest) - and getattr(namespace, action.dest)==[]): - from warnings import warn - warn('Do not expect %s in %s' % (action.dest, namespace)) - delattr(namespace, action.dest) - finally: - # restore nargs and usage before exiting - for action in positionals: - action.nargs = action.save_nargs - action.default = action.save_default - optionals = self._get_optional_actions() - try: - # parse positionals. optionals aren't normally required, but - # they could be, so make sure they aren't. - for action in optionals: - action.save_required = action.required - action.required = False - for group in self._mutually_exclusive_groups: - group.save_required = group.required - group.required = False - namespace, extras = self.parse_known_args(remaining_args, - namespace) - finally: - # restore parser values before exiting - for action in optionals: - action.required = action.save_required - for group in self._mutually_exclusive_groups: - group.required = group.save_required - finally: - self.usage = save_usage - return namespace, extras + return self._parse_known_args2(args, namespace, intermixed=True) # ======================== # Value conversion methods # ======================== def _get_values(self, action, arg_strings): - # for everything but PARSER, REMAINDER args, strip out first '--' - if action.nargs not in [PARSER, REMAINDER]: - try: - arg_strings.remove('--') - except ValueError: - pass - # optional argument produces a default when not present if not arg_strings and action.nargs == OPTIONAL: if action.option_strings: value = action.const else: value = action.default - if isinstance(value, str): + if isinstance(value, str) and value is not SUPPRESS: value = self._get_value(action, value) self._check_value(action, value) @@ -2571,11 +2557,15 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def _check_value(self, action, value): # converted value must be one of the choices (if specified) - if action.choices is not None and value not in action.choices: - args = {'value': value, - 'choices': ', '.join(map(repr, action.choices))} - msg = _('invalid choice: %(value)r (choose from %(choices)s)') - raise ArgumentError(action, msg % args) + choices = action.choices + if choices is not None: + if isinstance(choices, str): + choices = iter(choices) + if value not in choices: + args = {'value': str(value), + 'choices': ', '.join(map(str, action.choices))} + msg = _('invalid choice: %(value)r (choose from %(choices)s)') + raise ArgumentError(action, msg % args) # ======================= # Help-formatting methods @@ -2653,3 +2643,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): self.print_usage(_sys.stderr) args = {'prog': self.prog, 'message': message} self.exit(2, _('%(prog)s: error: %(message)s\n') % args) + + def _warning(self, message): + args = {'prog': self.prog, 'message': message} + self._print_message(_('%(prog)s: warning: %(message)s\n') % args, _sys.stderr) diff --git a/Lib/ast.py b/Lib/ast.py index 07044706..d7e51aba 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -32,13 +32,15 @@ from enum import IntEnum, auto, _simple_enum def parse(source, filename='', mode='exec', *, - type_comments=False, feature_version=None): + type_comments=False, feature_version=None, optimize=-1): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). Pass type_comments=True to get back type comments where the syntax allows. """ flags = PyCF_ONLY_AST + if optimize > 0: + flags |= PyCF_OPTIMIZED_AST if type_comments: flags |= PyCF_TYPE_COMMENTS if feature_version is None: @@ -50,7 +52,7 @@ def parse(source, filename='', mode='exec', *, feature_version = minor # Else it should be an int giving the minor version for 3.x. return compile(source, filename, mode, flags, - _feature_version=feature_version) + _feature_version=feature_version, optimize=optimize) def literal_eval(node_or_string): @@ -112,7 +114,11 @@ def literal_eval(node_or_string): return _convert(node_or_string) -def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): +def dump( + node, annotate_fields=True, include_attributes=False, + *, + indent=None, show_empty=False, +): """ Return a formatted dump of the tree in node. This is mainly useful for debugging purposes. If annotate_fields is true (by default), @@ -123,6 +129,8 @@ def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): include_attributes can be set to true. If indent is a non-negative integer or string, then the tree will be pretty-printed with that indent level. None (the default) selects the single line representation. + If show_empty is False, then empty lists and fields that are None + will be omitted from the output for better readability. """ def _format(node, level=0): if indent is not None: @@ -135,6 +143,7 @@ def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): if isinstance(node, AST): cls = type(node) args = [] + args_buffer = [] allsimple = True keywords = annotate_fields for name in node._fields: @@ -146,6 +155,18 @@ def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): if value is None and getattr(cls, name, ...) is None: keywords = True continue + if ( + not show_empty + and (value is None or value == []) + # Special cases: + # `Constant(value=None)` and `MatchSingleton(value=None)` + and not isinstance(node, (Constant, MatchSingleton)) + ): + args_buffer.append(repr(value)) + continue + elif not keywords: + args.extend(args_buffer) + args_buffer = [] value, simple = _format(value, level) allsimple = allsimple and simple if keywords: @@ -726,12 +747,11 @@ class _Unparser(NodeVisitor): output source code for the abstract syntax; original formatting is disregarded.""" - def __init__(self, *, _avoid_backslashes=False): + def __init__(self): self._source = [] self._precedences = {} self._type_ignores = {} self._indent = 0 - self._avoid_backslashes = _avoid_backslashes self._in_try_star = False def interleave(self, inter, f, seq): @@ -1104,12 +1124,21 @@ class _Unparser(NodeVisitor): if node.bound: self.write(": ") self.traverse(node.bound) + if node.default_value: + self.write(" = ") + self.traverse(node.default_value) def visit_TypeVarTuple(self, node): self.write("*" + node.name) + if node.default_value: + self.write(" = ") + self.traverse(node.default_value) def visit_ParamSpec(self, node): self.write("**" + node.name) + if node.default_value: + self.write(" = ") + self.traverse(node.default_value) def visit_TypeAlias(self, node): self.fill("type ") @@ -1268,13 +1297,19 @@ class _Unparser(NodeVisitor): quote_type = quote_types[0] self.write(f"{quote_type}{value}{quote_type}") - def _write_fstring_inner(self, node): + def _write_fstring_inner(self, node, is_format_spec=False): if isinstance(node, JoinedStr): # for both the f-string itself, and format_spec for value in node.values: - self._write_fstring_inner(value) + self._write_fstring_inner(value, is_format_spec=is_format_spec) elif isinstance(node, Constant) and isinstance(node.value, str): value = node.value.replace("{", "{{").replace("}", "}}") + + if is_format_spec: + value = value.replace("\\", "\\\\") + value = value.replace("'", "\\'") + value = value.replace('"', '\\"') + value = value.replace("\n", "\\n") self.write(value) elif isinstance(node, FormattedValue): self.visit_FormattedValue(node) @@ -1297,7 +1332,7 @@ class _Unparser(NodeVisitor): self.write(f"!{chr(node.conversion)}") if node.format_spec: self.write(":") - self._write_fstring_inner(node.format_spec) + self._write_fstring_inner(node.format_spec, is_format_spec=True) def visit_Name(self, node): self.write(node.id) @@ -1317,8 +1352,6 @@ class _Unparser(NodeVisitor): .replace("inf", _INFSTR) .replace("nan", f"({_INFSTR}-{_INFSTR})") ) - elif self._avoid_backslashes and isinstance(value, str): - self._write_str_avoiding_backslashes(value) else: self.write(repr(value)) @@ -1805,8 +1838,7 @@ def main(): import argparse parser = argparse.ArgumentParser(prog='python -m ast') - parser.add_argument('infile', type=argparse.FileType(mode='rb'), nargs='?', - default='-', + parser.add_argument('infile', nargs='?', default='-', help='the file to parse; defaults to stdin') parser.add_argument('-m', '--mode', default='exec', choices=('exec', 'single', 'eval', 'func_type'), @@ -1820,9 +1852,14 @@ def main(): help='indentation of nodes (number of spaces)') args = parser.parse_args() - with args.infile as infile: - source = infile.read() - tree = parse(source, args.infile.name, args.mode, type_comments=args.no_type_comments) + if args.infile == '-': + name = '' + source = sys.stdin.buffer.read() + else: + name = args.infile + with open(args.infile, 'rb') as infile: + source = infile.read() + tree = parse(source, name, args.mode, type_comments=args.no_type_comments) print(dump(tree, include_attributes=args.include_attributes, indent=args.indent)) if __name__ == '__main__': diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index 18bb87a5..95c636f9 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -1,41 +1,51 @@ import ast import asyncio -import code import concurrent.futures +import contextvars import inspect +import os +import site import sys import threading import types import warnings +from _colorize import can_colorize, ANSIColors # type: ignore[import-not-found] +from _pyrepl.console import InteractiveColoredConsole + from . import futures -class AsyncIOInteractiveConsole(code.InteractiveConsole): +class AsyncIOInteractiveConsole(InteractiveColoredConsole): def __init__(self, locals, loop): - super().__init__(locals) + super().__init__(locals, filename="") self.compile.compiler.flags |= ast.PyCF_ALLOW_TOP_LEVEL_AWAIT self.loop = loop + self.context = contextvars.copy_context() def runcode(self, code): + global return_code future = concurrent.futures.Future() def callback(): + global return_code global repl_future - global repl_future_interrupted + global keyboard_interrupted repl_future = None - repl_future_interrupted = False + keyboard_interrupted = False func = types.FunctionType(code, self.locals) try: coro = func() - except SystemExit: - raise + except SystemExit as se: + return_code = se.code + self.loop.stop() + return except KeyboardInterrupt as ex: - repl_future_interrupted = True + keyboard_interrupted = True future.set_exception(ex) return except BaseException as ex: @@ -47,19 +57,21 @@ class AsyncIOInteractiveConsole(code.InteractiveConsole): return try: - repl_future = self.loop.create_task(coro) + repl_future = self.loop.create_task(coro, context=self.context) futures._chain_future(repl_future, future) except BaseException as exc: future.set_exception(exc) - loop.call_soon_threadsafe(callback) + loop.call_soon_threadsafe(callback, context=self.context) try: return future.result() - except SystemExit: - raise + except SystemExit as se: + return_code = se.code + self.loop.stop() + return except BaseException: - if repl_future_interrupted: + if keyboard_interrupted: self.write("\nKeyboardInterrupt\n") else: self.showtraceback() @@ -68,18 +80,47 @@ class AsyncIOInteractiveConsole(code.InteractiveConsole): class REPLThread(threading.Thread): def run(self): + global return_code + try: banner = ( f'asyncio REPL {sys.version} on {sys.platform}\n' f'Use "await" directly instead of "asyncio.run()".\n' f'Type "help", "copyright", "credits" or "license" ' f'for more information.\n' - f'{getattr(sys, "ps1", ">>> ")}import asyncio' ) - console.interact( - banner=banner, - exitmsg='exiting asyncio REPL...') + console.write(banner) + + if startup_path := os.getenv("PYTHONSTARTUP"): + sys.audit("cpython.run_startup", startup_path) + + import tokenize + with tokenize.open(startup_path) as f: + startup_code = compile(f.read(), startup_path, "exec") + exec(startup_code, console.locals) + + ps1 = getattr(sys, "ps1", ">>> ") + if can_colorize() and CAN_USE_PYREPL: + ps1 = f"{ANSIColors.BOLD_MAGENTA}{ps1}{ANSIColors.RESET}" + console.write(f"{ps1}import asyncio\n") + + if CAN_USE_PYREPL: + from _pyrepl.simple_interact import ( + run_multiline_interactive_console, + ) + try: + run_multiline_interactive_console(console) + except SystemExit: + # expected via the `exit` and `quit` commands + pass + except BaseException: + # unexpected issue + console.showtraceback() + console.write("Internal error, ") + return_code = 1 + else: + console.interact(banner="", exitmsg="") finally: warnings.filterwarnings( 'ignore', @@ -88,8 +129,25 @@ class REPLThread(threading.Thread): loop.call_soon_threadsafe(loop.stop) + def interrupt(self) -> None: + if not CAN_USE_PYREPL: + return + + from _pyrepl.simple_interact import _get_reader + r = _get_reader() + if r.threading_hook is not None: + r.threading_hook.add("") # type: ignore + if __name__ == '__main__': + sys.audit("cpython.run_stdin") + + if os.getenv('PYTHON_BASIC_REPL'): + CAN_USE_PYREPL = False + else: + from _pyrepl.main import CAN_USE_PYREPL + + return_code = 0 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) @@ -102,14 +160,31 @@ if __name__ == '__main__': console = AsyncIOInteractiveConsole(repl_locals, loop) repl_future = None - repl_future_interrupted = False + keyboard_interrupted = False try: import readline # NoQA except ImportError: - pass + readline = None + + interactive_hook = getattr(sys, "__interactivehook__", None) - repl_thread = REPLThread() + if interactive_hook is not None: + sys.audit("cpython.run_interactivehook", interactive_hook) + interactive_hook() + + if interactive_hook is site.register_readline: + # Fix the completer function to use the interactive console locals + try: + import rlcompleter + except: + pass + else: + if readline is not None: + completer = rlcompleter.Completer(console.locals) + readline.set_completer(completer.complete) + + repl_thread = REPLThread(name="Interactive thread") repl_thread.daemon = True repl_thread.start() @@ -117,9 +192,13 @@ if __name__ == '__main__': try: loop.run_forever() except KeyboardInterrupt: + keyboard_interrupted = True if repl_future and not repl_future.done(): repl_future.cancel() - repl_future_interrupted = True + repl_thread.interrupt() continue else: break + + console.write('exiting asyncio REPL...\n') + sys.exit(return_code) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 25900465..91434042 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -16,7 +16,7 @@ to modify the meaning of the API call itself. import collections import collections.abc import concurrent.futures -import functools +import errno import heapq import itertools import os @@ -44,6 +44,7 @@ from . import protocols from . import sslproto from . import staggered from . import tasks +from . import timeouts from . import transports from . import trsock from .log import logger @@ -277,7 +278,9 @@ class Server(events.AbstractServer): ssl_handshake_timeout, ssl_shutdown_timeout=None): self._loop = loop self._sockets = sockets - self._active_count = 0 + # Weak references so we don't break Transport's ability to + # detect abandoned transports + self._clients = weakref.WeakSet() self._waiters = [] self._protocol_factory = protocol_factory self._backlog = backlog @@ -290,14 +293,13 @@ class Server(events.AbstractServer): def __repr__(self): return f'<{self.__class__.__name__} sockets={self.sockets!r}>' - def _attach(self): + def _attach(self, transport): assert self._sockets is not None - self._active_count += 1 + self._clients.add(transport) - def _detach(self): - assert self._active_count > 0 - self._active_count -= 1 - if self._active_count == 0 and self._sockets is None: + def _detach(self, transport): + self._clients.discard(transport) + if len(self._clients) == 0 and self._sockets is None: self._wakeup() def _wakeup(self): @@ -305,7 +307,7 @@ class Server(events.AbstractServer): self._waiters = None for waiter in waiters: if not waiter.done(): - waiter.set_result(waiter) + waiter.set_result(None) def _start_serving(self): if self._serving: @@ -346,9 +348,17 @@ class Server(events.AbstractServer): self._serving_forever_fut.cancel() self._serving_forever_fut = None - if self._active_count == 0: + if len(self._clients) == 0: self._wakeup() + def close_clients(self): + for transport in self._clients.copy(): + transport.close() + + def abort_clients(self): + for transport in self._clients.copy(): + transport.abort() + async def start_serving(self): self._start_serving() # Skip one loop iteration so that all 'loop.add_reader' @@ -377,7 +387,27 @@ class Server(events.AbstractServer): self._serving_forever_fut = None async def wait_closed(self): - if self._waiters is None or self._active_count == 0: + """Wait until server is closed and all connections are dropped. + + - If the server is not closed, wait. + - If it is closed, but there are still active connections, wait. + + Anyone waiting here will be unblocked once both conditions + (server is closed and all connections have been dropped) + have become true, in either order. + + Historical note: In 3.11 and before, this was broken, returning + immediately if the server was already closed, even if there + were still active connections. An attempted fix in 3.12.0 was + still broken, returning immediately if the server was still + open and there were no active connections. Hopefully in 3.12.1 + we have it right. + """ + # Waiters are unblocked by self._wakeup(), which is called + # from two places: self.close() and self._detach(), but only + # when both conditions have become true. To signal that this + # has happened, self._wakeup() sets self._waiters to None. + if self._waiters is None: return waiter = self._loop.create_future() self._waiters.append(waiter) @@ -400,6 +430,8 @@ class BaseEventLoop(events.AbstractEventLoop): self._clock_resolution = time.get_clock_info('monotonic').resolution self._exception_handler = None self.set_debug(coroutines._is_debug_mode()) + # The preserved state of async generator hooks. + self._old_agen_hooks = None # In debug mode, if the execution of a callback or a step of a task # exceed this duration in seconds, the slow callback/task is logged. self.slow_callback_duration = 0.1 @@ -443,7 +475,7 @@ class BaseEventLoop(events.AbstractEventLoop): else: task = self._task_factory(self, coro, context=context) - tasks._set_task_name(task, name) + task.set_name(name) return task @@ -575,23 +607,24 @@ class BaseEventLoop(events.AbstractEventLoop): thread = threading.Thread(target=self._do_shutdown, args=(future,)) thread.start() try: - await future - finally: - thread.join(timeout) - - if thread.is_alive(): + async with timeouts.timeout(timeout): + await future + except TimeoutError: warnings.warn("The executor did not finishing joining " - f"its threads within {timeout} seconds.", - RuntimeWarning, stacklevel=2) + f"its threads within {timeout} seconds.", + RuntimeWarning, stacklevel=2) self._default_executor.shutdown(wait=False) + else: + thread.join() def _do_shutdown(self, future): try: self._default_executor.shutdown(wait=True) if not self.is_closed(): - self.call_soon_threadsafe(future.set_result, None) + self.call_soon_threadsafe(futures._set_result_unless_cancelled, + future, None) except Exception as ex: - if not self.is_closed(): + if not self.is_closed() and not future.cancelled(): self.call_soon_threadsafe(future.set_exception, ex) def _check_running(self): @@ -601,29 +634,52 @@ class BaseEventLoop(events.AbstractEventLoop): raise RuntimeError( 'Cannot run the event loop while another loop is running') - def run_forever(self): - """Run until stop() is called.""" + def _run_forever_setup(self): + """Prepare the run loop to process events. + + This method exists so that custom custom event loop subclasses (e.g., event loops + that integrate a GUI event loop with Python's event loop) have access to all the + loop setup logic. + """ self._check_closed() self._check_running() self._set_coroutine_origin_tracking(self._debug) - old_agen_hooks = sys.get_asyncgen_hooks() - try: - self._thread_id = threading.get_ident() - sys.set_asyncgen_hooks(firstiter=self._asyncgen_firstiter_hook, - finalizer=self._asyncgen_finalizer_hook) + self._old_agen_hooks = sys.get_asyncgen_hooks() + self._thread_id = threading.get_ident() + sys.set_asyncgen_hooks( + firstiter=self._asyncgen_firstiter_hook, + finalizer=self._asyncgen_finalizer_hook + ) + + events._set_running_loop(self) + + def _run_forever_cleanup(self): + """Clean up after an event loop finishes the looping over events. + + This method exists so that custom custom event loop subclasses (e.g., event loops + that integrate a GUI event loop with Python's event loop) have access to all the + loop cleanup logic. + """ + self._stopping = False + self._thread_id = None + events._set_running_loop(None) + self._set_coroutine_origin_tracking(False) + # Restore any pre-existing async generator hooks. + if self._old_agen_hooks is not None: + sys.set_asyncgen_hooks(*self._old_agen_hooks) + self._old_agen_hooks = None - events._set_running_loop(self) + def run_forever(self): + """Run until stop() is called.""" + try: + self._run_forever_setup() while True: self._run_once() if self._stopping: break finally: - self._stopping = False - self._thread_id = None - events._set_running_loop(None) - self._set_coroutine_origin_tracking(False) - sys.set_asyncgen_hooks(*old_agen_hooks) + self._run_forever_cleanup() def run_until_complete(self, future): """Run until the Future is done. @@ -971,8 +1027,7 @@ class BaseEventLoop(events.AbstractEventLoop): except OSError as exc: msg = ( f'error while attempting to bind on ' - f'address {laddr!r}: ' - f'{exc.strerror.lower()}' + f'address {laddr!r}: {str(exc).lower()}' ) exc = OSError(exc.errno, msg) my_exceptions.append(exc) @@ -1084,11 +1139,18 @@ class BaseEventLoop(events.AbstractEventLoop): except OSError: continue else: # using happy eyeballs - sock, _, _ = await staggered.staggered_race( - (functools.partial(self._connect_sock, - exceptions, addrinfo, laddr_infos) - for addrinfo in infos), - happy_eyeballs_delay, loop=self) + sock = (await staggered.staggered_race( + ( + # can't use functools.partial as it keeps a reference + # to exceptions + lambda addrinfo=addrinfo: self._connect_sock( + exceptions, addrinfo, laddr_infos + ) + for addrinfo in infos + ), + happy_eyeballs_delay, + loop=self, + ))[0] # can't use sock, _, _ as it keeks a reference to exceptions if sock is None: exceptions = [exc for sub in exceptions for exc in sub] @@ -1294,9 +1356,9 @@ class BaseEventLoop(events.AbstractEventLoop): allow_broadcast=None, sock=None): """Create datagram connection.""" if sock is not None: - if sock.type != socket.SOCK_DGRAM: + if sock.type == socket.SOCK_STREAM: raise ValueError( - f'A UDP Socket was expected, got {sock!r}') + f'A datagram socket was expected, got {sock!r}') if (local_addr or remote_addr or family or proto or flags or reuse_port or allow_broadcast): @@ -1451,6 +1513,7 @@ class BaseEventLoop(events.AbstractEventLoop): ssl=None, reuse_address=None, reuse_port=None, + keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True): @@ -1524,6 +1587,9 @@ class BaseEventLoop(events.AbstractEventLoop): socket.SOL_SOCKET, socket.SO_REUSEADDR, True) if reuse_port: _set_reuseport(sock) + if keep_alive: + sock.setsockopt( + socket.SOL_SOCKET, socket.SO_KEEPALIVE, True) # Disable IPv4/IPv6 dual stack support (enabled by # default on Linux) which makes a single socket # listen on both address families. @@ -1536,9 +1602,22 @@ class BaseEventLoop(events.AbstractEventLoop): try: sock.bind(sa) except OSError as err: - raise OSError(err.errno, 'error while attempting ' - 'to bind on address %r: %s' - % (sa, err.strerror.lower())) from None + msg = ('error while attempting ' + 'to bind on address %r: %s' + % (sa, str(err).lower())) + if err.errno == errno.EADDRNOTAVAIL: + # Assume the family is not enabled (bpo-30945) + sockets.pop() + sock.close() + if self._debug: + logger.warning(msg) + continue + raise OSError(err.errno, msg) from None + + if not sockets: + raise OSError('could not bind on any address out of %r' + % ([info[4] for info in infos],)) + completed = True finally: if not completed: @@ -1907,8 +1986,11 @@ class BaseEventLoop(events.AbstractEventLoop): timeout = 0 elif self._scheduled: # Compute the desired timeout. - when = self._scheduled[0]._when - timeout = min(max(0, when - self.time()), MAXIMUM_SELECT_TIMEOUT) + timeout = self._scheduled[0]._when - self.time() + if timeout > MAXIMUM_SELECT_TIMEOUT: + timeout = MAXIMUM_SELECT_TIMEOUT + elif timeout < 0: + timeout = 0 event_list = self._selector.select(timeout) self._process_events(event_list) diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py index 4c9b0dd5..9c2ba679 100644 --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -1,6 +1,9 @@ import collections import subprocess import warnings +import os +import signal +import sys from . import protocols from . import transports @@ -115,7 +118,8 @@ class BaseSubprocessTransport(transports.SubprocessTransport): try: self._proc.kill() - except ProcessLookupError: + except (ProcessLookupError, PermissionError): + # the process may have already exited or may be running setuid pass # Don't clear the _proc reference yet: _post_init() may still run @@ -141,17 +145,31 @@ class BaseSubprocessTransport(transports.SubprocessTransport): if self._proc is None: raise ProcessLookupError() - def send_signal(self, signal): - self._check_proc() - self._proc.send_signal(signal) + if sys.platform == 'win32': + def send_signal(self, signal): + self._check_proc() + self._proc.send_signal(signal) + + def terminate(self): + self._check_proc() + self._proc.terminate() + + def kill(self): + self._check_proc() + self._proc.kill() + else: + def send_signal(self, signal): + self._check_proc() + try: + os.kill(self._proc.pid, signal) + except ProcessLookupError: + pass - def terminate(self): - self._check_proc() - self._proc.terminate() + def terminate(self): + self.send_signal(signal.SIGTERM) - def kill(self): - self._check_proc() - self._proc.kill() + def kill(self): + self.send_signal(signal.SIGKILL) async def _connect_pipes(self, waiter): try: diff --git a/Lib/asyncio/constants.py b/Lib/asyncio/constants.py index f0ce0433..b60c1e42 100644 --- a/Lib/asyncio/constants.py +++ b/Lib/asyncio/constants.py @@ -1,3 +1,7 @@ +# Contains code from https://github.com/MagicStack/uvloop/tree/v0.16.0 +# SPDX-License-Identifier: PSF-2.0 AND (MIT OR Apache-2.0) +# SPDX-FileCopyrightText: Copyright (c) 2015-2021 MagicStack Inc. http://magic.io + import enum # After the connection is lost, log warnings after this many write()s. diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 0ccf8510..be495469 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -1,5 +1,9 @@ """Event loop and event loop policy.""" +# Contains code from https://github.com/MagicStack/uvloop/tree/v0.16.0 +# SPDX-License-Identifier: PSF-2.0 AND (MIT OR Apache-2.0) +# SPDX-FileCopyrightText: Copyright (c) 2015-2021 MagicStack Inc. http://magic.io + __all__ = ( 'AbstractEventLoopPolicy', 'AbstractEventLoop', 'AbstractServer', @@ -50,7 +54,8 @@ class Handle: info.append('cancelled') if self._callback is not None: info.append(format_helpers._format_callback_source( - self._callback, self._args)) + self._callback, self._args, + debug=self._loop.get_debug())) if self._source_traceback: frame = self._source_traceback[-1] info.append(f'created at {frame[0]}:{frame[1]}') @@ -86,7 +91,8 @@ class Handle: raise except BaseException as exc: cb = format_helpers._format_callback_source( - self._callback, self._args) + self._callback, self._args, + debug=self._loop.get_debug()) msg = f'Exception in callback {cb}' context = { 'message': msg, @@ -169,6 +175,14 @@ class AbstractServer: """Stop serving. This leaves existing connections open.""" raise NotImplementedError + def close_clients(self): + """Close all active connections.""" + raise NotImplementedError + + def abort_clients(self): + """Close all active connections immediately.""" + raise NotImplementedError + def get_loop(self): """Get the event loop the Server object is attached to.""" raise NotImplementedError @@ -316,6 +330,7 @@ class AbstractEventLoop: *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None, + keep_alive=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, start_serving=True): @@ -354,6 +369,9 @@ class AbstractEventLoop: they all set this flag when being created. This option is not supported on Windows. + keep_alive set to True keeps connections active by enabling the + periodic transmission of messages. + ssl_handshake_timeout is the time in seconds that an SSL server will wait for completion of the SSL handshake before aborting the connection. Default is 60s. diff --git a/Lib/asyncio/format_helpers.py b/Lib/asyncio/format_helpers.py index 27d11fd4..93737b77 100644 --- a/Lib/asyncio/format_helpers.py +++ b/Lib/asyncio/format_helpers.py @@ -19,19 +19,26 @@ def _get_function_source(func): return None -def _format_callback_source(func, args): - func_repr = _format_callback(func, args, None) +def _format_callback_source(func, args, *, debug=False): + func_repr = _format_callback(func, args, None, debug=debug) source = _get_function_source(func) if source: func_repr += f' at {source[0]}:{source[1]}' return func_repr -def _format_args_and_kwargs(args, kwargs): +def _format_args_and_kwargs(args, kwargs, *, debug=False): """Format function arguments and keyword arguments. Special case for a single parameter: ('hello',) is formatted as ('hello'). + + Note that this function only returns argument details when + debug=True is specified, as arguments may contain sensitive + information. """ + if not debug: + return '()' + # use reprlib to limit the length of the output items = [] if args: @@ -41,10 +48,11 @@ def _format_args_and_kwargs(args, kwargs): return '({})'.format(', '.join(items)) -def _format_callback(func, args, kwargs, suffix=''): +def _format_callback(func, args, kwargs, *, debug=False, suffix=''): if isinstance(func, functools.partial): - suffix = _format_args_and_kwargs(args, kwargs) + suffix - return _format_callback(func.func, func.args, func.keywords, suffix) + suffix = _format_args_and_kwargs(args, kwargs, debug=debug) + suffix + return _format_callback(func.func, func.args, func.keywords, + debug=debug, suffix=suffix) if hasattr(func, '__qualname__') and func.__qualname__: func_repr = func.__qualname__ @@ -53,7 +61,7 @@ def _format_callback(func, args, kwargs, suffix=''): else: func_repr = repr(func) - func_repr += _format_args_and_kwargs(args, kwargs) + func_repr += _format_args_and_kwargs(args, kwargs, debug=debug) if suffix: func_repr += suffix return func_repr diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 97fc4e3f..51932639 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -138,9 +138,6 @@ class Future: exc = exceptions.CancelledError() else: exc = exceptions.CancelledError(self._cancel_message) - exc.__context__ = self._cancelled_exc - # Remove the reference since we don't need this anymore. - self._cancelled_exc = None return exc def cancel(self, msg=None): @@ -194,8 +191,7 @@ class Future: the future is done and has an exception set, this exception is raised. """ if self._state == _CANCELLED: - exc = self._make_cancelled_error() - raise exc + raise self._make_cancelled_error() if self._state != _FINISHED: raise exceptions.InvalidStateError('Result is not ready.') self.__log_traceback = False @@ -212,8 +208,7 @@ class Future: InvalidStateError. """ if self._state == _CANCELLED: - exc = self._make_cancelled_error() - raise exc + raise self._make_cancelled_error() if self._state != _FINISHED: raise exceptions.InvalidStateError('Exception is not set.') self.__log_traceback = False @@ -272,9 +267,13 @@ class Future: raise exceptions.InvalidStateError(f'{self._state}: {self!r}') if isinstance(exception, type): exception = exception() - if type(exception) is StopIteration: - raise TypeError("StopIteration interacts badly with generators " - "and cannot be raised into a Future") + if isinstance(exception, StopIteration): + new_exc = RuntimeError("StopIteration interacts badly with " + "generators and cannot be raised into a " + "Future") + new_exc.__cause__ = exception + new_exc.__context__ = exception + exception = new_exc self._exception = exception self._exception_tb = exception.__traceback__ self._state = _FINISHED @@ -318,11 +317,9 @@ def _set_result_unless_cancelled(fut, result): def _convert_future_exc(exc): exc_class = type(exc) if exc_class is concurrent.futures.CancelledError: - return exceptions.CancelledError(*exc.args) - elif exc_class is concurrent.futures.TimeoutError: - return exceptions.TimeoutError(*exc.args) + return exceptions.CancelledError(*exc.args).with_traceback(exc.__traceback__) elif exc_class is concurrent.futures.InvalidStateError: - return exceptions.InvalidStateError(*exc.args) + return exceptions.InvalidStateError(*exc.args).with_traceback(exc.__traceback__) else: return exc diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index ce5d8d5b..aaee8ff0 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -24,25 +24,23 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): """Primitive lock objects. A primitive lock is a synchronization primitive that is not owned - by a particular coroutine when locked. A primitive lock is in one + by a particular task when locked. A primitive lock is in one of two states, 'locked' or 'unlocked'. It is created in the unlocked state. It has two basic methods, acquire() and release(). When the state is unlocked, acquire() changes the state to locked and returns immediately. When the state is locked, acquire() blocks until a call to release() in - another coroutine changes it to unlocked, then the acquire() call + another task changes it to unlocked, then the acquire() call resets it to locked and returns. The release() method should only be called in the locked state; it changes the state to unlocked and returns immediately. If an attempt is made to release an unlocked lock, a RuntimeError will be raised. - When more than one coroutine is blocked in acquire() waiting for - the state to turn to unlocked, only one coroutine proceeds when a - release() call resets the state to unlocked; first coroutine which - is blocked in acquire() is being processed. - - acquire() is a coroutine and should be called with 'await'. + When more than one task is blocked in acquire() waiting for + the state to turn to unlocked, only one task proceeds when a + release() call resets the state to unlocked; successive release() + calls will unblock tasks in FIFO order. Locks also support the asynchronous context management protocol. 'async with lock' statement should be used. @@ -95,6 +93,8 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): This method blocks until the lock is unlocked, then sets it to locked and returns True. """ + # Implement fair scheduling, where thread always waits + # its turn. Jumping the queue if all are cancelled is an optimization. if (not self._locked and (self._waiters is None or all(w.cancelled() for w in self._waiters))): self._locked = True @@ -105,19 +105,22 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): fut = self._get_loop().create_future() self._waiters.append(fut) - # Finally block should be called before the CancelledError - # handling as we don't want CancelledError to call - # _wake_up_first() and attempt to wake up itself. try: try: await fut finally: self._waiters.remove(fut) except exceptions.CancelledError: + # Currently the only exception designed be able to occur here. + + # Ensure the lock invariant: If lock is not claimed (or about + # to be claimed by us) and there is a Task in waiters, + # ensure that the Task at the head will run. if not self._locked: self._wake_up_first() raise + # assert self._locked is False self._locked = True return True @@ -125,7 +128,7 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): """Release a lock. When the lock is locked, reset it to unlocked, and return. - If any other coroutines are blocked waiting for the lock to become + If any other tasks are blocked waiting for the lock to become unlocked, allow exactly one of them to proceed. When invoked on an unlocked lock, a RuntimeError is raised. @@ -139,7 +142,7 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): raise RuntimeError('Lock is not acquired.') def _wake_up_first(self): - """Wake up the first waiter if it isn't done.""" + """Ensure that the first waiter will wake up.""" if not self._waiters: return try: @@ -147,9 +150,7 @@ class Lock(_ContextManagerMixin, mixins._LoopBoundMixin): except StopIteration: return - # .done() necessarily means that a waiter will wake up later on and - # either take the lock, or, if it was cancelled and lock wasn't - # taken already, will hit this again and wake up a new waiter. + # .done() means that the waiter is already set to wake up. if not fut.done(): fut.set_result(True) @@ -179,8 +180,8 @@ class Event(mixins._LoopBoundMixin): return self._value def set(self): - """Set the internal flag to true. All coroutines waiting for it to - become true are awakened. Coroutine that call wait() once the flag is + """Set the internal flag to true. All tasks waiting for it to + become true are awakened. Tasks that call wait() once the flag is true will not block at all. """ if not self._value: @@ -191,7 +192,7 @@ class Event(mixins._LoopBoundMixin): fut.set_result(True) def clear(self): - """Reset the internal flag to false. Subsequently, coroutines calling + """Reset the internal flag to false. Subsequently, tasks calling wait() will block until set() is called to set the internal flag to true again.""" self._value = False @@ -200,7 +201,7 @@ class Event(mixins._LoopBoundMixin): """Block until the internal flag is true. If the internal flag is true on entry, return True - immediately. Otherwise, block until another coroutine calls + immediately. Otherwise, block until another task calls set() to set the flag to true, then return True. """ if self._value: @@ -219,8 +220,8 @@ class Condition(_ContextManagerMixin, mixins._LoopBoundMixin): """Asynchronous equivalent to threading.Condition. This class implements condition variable objects. A condition variable - allows one or more coroutines to wait until they are notified by another - coroutine. + allows one or more tasks to wait until they are notified by another + task. A new Lock object is created and used as the underlying lock. """ @@ -247,45 +248,64 @@ class Condition(_ContextManagerMixin, mixins._LoopBoundMixin): async def wait(self): """Wait until notified. - If the calling coroutine has not acquired the lock when this + If the calling task has not acquired the lock when this method is called, a RuntimeError is raised. This method releases the underlying lock, and then blocks until it is awakened by a notify() or notify_all() call for - the same condition variable in another coroutine. Once + the same condition variable in another task. Once awakened, it re-acquires the lock and returns True. + + This method may return spuriously, + which is why the caller should always + re-check the state and be prepared to wait() again. """ if not self.locked(): raise RuntimeError('cannot wait on un-acquired lock') + fut = self._get_loop().create_future() self.release() try: - fut = self._get_loop().create_future() - self._waiters.append(fut) try: - await fut - return True - finally: - self._waiters.remove(fut) - - finally: - # Must reacquire lock even if wait is cancelled - cancelled = False - while True: + self._waiters.append(fut) try: - await self.acquire() - break - except exceptions.CancelledError: - cancelled = True + await fut + return True + finally: + self._waiters.remove(fut) - if cancelled: - raise exceptions.CancelledError + finally: + # Must re-acquire lock even if wait is cancelled. + # We only catch CancelledError here, since we don't want any + # other (fatal) errors with the future to cause us to spin. + err = None + while True: + try: + await self.acquire() + break + except exceptions.CancelledError as e: + err = e + + if err is not None: + try: + raise err # Re-raise most recent exception instance. + finally: + err = None # Break reference cycles. + except BaseException: + # Any error raised out of here _may_ have occurred after this Task + # believed to have been successfully notified. + # Make sure to notify another Task instead. This may result + # in a "spurious wakeup", which is allowed as part of the + # Condition Variable protocol. + self._notify(1) + raise async def wait_for(self, predicate): """Wait until a predicate becomes true. - The predicate should be a callable which result will be - interpreted as a boolean value. The final predicate value is + The predicate should be a callable whose result will be + interpreted as a boolean value. The method will repeatedly + wait() until it evaluates to true. The final predicate value is the return value. """ result = predicate() @@ -295,20 +315,22 @@ class Condition(_ContextManagerMixin, mixins._LoopBoundMixin): return result def notify(self, n=1): - """By default, wake up one coroutine waiting on this condition, if any. - If the calling coroutine has not acquired the lock when this method + """By default, wake up one task waiting on this condition, if any. + If the calling task has not acquired the lock when this method is called, a RuntimeError is raised. - This method wakes up at most n of the coroutines waiting for the - condition variable; it is a no-op if no coroutines are waiting. + This method wakes up n of the tasks waiting for the condition + variable; if fewer than n are waiting, they are all awoken. - Note: an awakened coroutine does not actually return from its + Note: an awakened task does not actually return from its wait() call until it can reacquire the lock. Since notify() does not release the lock, its caller should. """ if not self.locked(): raise RuntimeError('cannot notify on un-acquired lock') + self._notify(n) + def _notify(self, n): idx = 0 for fut in self._waiters: if idx >= n: @@ -357,6 +379,7 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin): def locked(self): """Returns True if semaphore cannot be acquired immediately.""" + # Due to state, or FIFO rules (must allow others to run first). return self._value == 0 or ( any(not w.cancelled() for w in (self._waiters or ()))) @@ -365,11 +388,12 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin): If the internal counter is larger than zero on entry, decrement it by one and return True immediately. If it is - zero on entry, block, waiting until some other coroutine has + zero on entry, block, waiting until some other task has called release() to make it larger than 0, and then return True. """ if not self.locked(): + # Maintain FIFO, wait for others to start even if _value > 0. self._value -= 1 return True @@ -378,29 +402,34 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin): fut = self._get_loop().create_future() self._waiters.append(fut) - # Finally block should be called before the CancelledError - # handling as we don't want CancelledError to call - # _wake_up_first() and attempt to wake up itself. try: try: await fut finally: self._waiters.remove(fut) except exceptions.CancelledError: - if not fut.cancelled(): + # Currently the only exception designed be able to occur here. + if fut.done() and not fut.cancelled(): + # Our Future was successfully set to True via _wake_up_next(), + # but we are not about to successfully acquire(). Therefore we + # must undo the bookkeeping already done and attempt to wake + # up someone else. self._value += 1 - self._wake_up_next() raise - if self._value > 0: - self._wake_up_next() + finally: + # New waiters may have arrived but had to wait due to FIFO. + # Wake up as many as are allowed. + while self._value > 0: + if not self._wake_up_next(): + break # There was no-one to wake up. return True def release(self): """Release a semaphore, incrementing the internal counter by one. - When it was zero on entry and another coroutine is waiting for it to - become larger than zero again, wake up that coroutine. + When it was zero on entry and another task is waiting for it to + become larger than zero again, wake up that task. """ self._value += 1 self._wake_up_next() @@ -408,13 +437,15 @@ class Semaphore(_ContextManagerMixin, mixins._LoopBoundMixin): def _wake_up_next(self): """Wake up the first waiter that isn't done.""" if not self._waiters: - return + return False for fut in self._waiters: if not fut.done(): self._value -= 1 fut.set_result(True) - return + # `fut` is now `done()` and not `cancelled()`. + return True + return False class BoundedSemaphore(Semaphore): diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 1e2a730c..7eb55bd6 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -63,7 +63,7 @@ class _ProactorBasePipeTransport(transports._FlowControlMixin, self._called_connection_lost = False self._eof_written = False if self._server is not None: - self._server._attach() + self._server._attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: # only wake up the waiter when connection_made() has been called @@ -167,7 +167,7 @@ class _ProactorBasePipeTransport(transports._FlowControlMixin, self._sock = None server = self._server if server is not None: - server._detach() + server._detach(self) self._server = None self._called_connection_lost = True @@ -487,9 +487,6 @@ class _ProactorDatagramTransport(_ProactorBasePipeTransport, raise TypeError('data argument must be bytes-like object (%r)', type(data)) - if not data: - return - if self._address is not None and addr not in (None, self._address): raise ValueError( f'Invalid address: must be None or {self._address}') @@ -502,7 +499,7 @@ class _ProactorDatagramTransport(_ProactorBasePipeTransport, # Ensure that what we buffer is immutable. self._buffer.append((bytes(data), addr)) - self._buffer_size += len(data) + self._buffer_size += len(data) + 8 # include header bytes if self._write_fut is None: # No current write operations are active, kick one off @@ -724,6 +721,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): return await self._proactor.sendto(sock, data, 0, address) async def sock_connect(self, sock, address): + if self._debug and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return await self._proactor.connect(sock, address) async def sock_accept(self, sock): diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index a9656a6d..2f386511 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -1,4 +1,11 @@ -__all__ = ('Queue', 'PriorityQueue', 'LifoQueue', 'QueueFull', 'QueueEmpty') +__all__ = ( + 'Queue', + 'PriorityQueue', + 'LifoQueue', + 'QueueFull', + 'QueueEmpty', + 'QueueShutDown', +) import collections import heapq @@ -18,6 +25,11 @@ class QueueFull(Exception): pass +class QueueShutDown(Exception): + """Raised when putting on to or getting from a shut-down Queue.""" + pass + + class Queue(mixins._LoopBoundMixin): """A queue, useful for coordinating producer and consumer coroutines. @@ -41,6 +53,7 @@ class Queue(mixins._LoopBoundMixin): self._finished = locks.Event() self._finished.set() self._init(maxsize) + self._is_shutdown = False # These three are overridable in subclasses. @@ -81,6 +94,8 @@ class Queue(mixins._LoopBoundMixin): result += f' _putters[{len(self._putters)}]' if self._unfinished_tasks: result += f' tasks={self._unfinished_tasks}' + if self._is_shutdown: + result += ' shutdown' return result def qsize(self): @@ -112,8 +127,12 @@ class Queue(mixins._LoopBoundMixin): Put an item into the queue. If the queue is full, wait until a free slot is available before adding item. + + Raises QueueShutDown if the queue has been shut down. """ while self.full(): + if self._is_shutdown: + raise QueueShutDown putter = self._get_loop().create_future() self._putters.append(putter) try: @@ -125,7 +144,7 @@ class Queue(mixins._LoopBoundMixin): self._putters.remove(putter) except ValueError: # The putter could be removed from self._putters by a - # previous get_nowait call. + # previous get_nowait call or a shutdown call. pass if not self.full() and not putter.cancelled(): # We were woken up by get_nowait(), but can't take @@ -138,7 +157,11 @@ class Queue(mixins._LoopBoundMixin): """Put an item into the queue without blocking. If no free slot is immediately available, raise QueueFull. + + Raises QueueShutDown if the queue has been shut down. """ + if self._is_shutdown: + raise QueueShutDown if self.full(): raise QueueFull self._put(item) @@ -150,8 +173,13 @@ class Queue(mixins._LoopBoundMixin): """Remove and return an item from the queue. If queue is empty, wait until an item is available. + + Raises QueueShutDown if the queue has been shut down and is empty, or + if the queue has been shut down immediately. """ while self.empty(): + if self._is_shutdown and self.empty(): + raise QueueShutDown getter = self._get_loop().create_future() self._getters.append(getter) try: @@ -163,7 +191,7 @@ class Queue(mixins._LoopBoundMixin): self._getters.remove(getter) except ValueError: # The getter could be removed from self._getters by a - # previous put_nowait call. + # previous put_nowait call, or a shutdown call. pass if not self.empty() and not getter.cancelled(): # We were woken up by put_nowait(), but can't take @@ -176,8 +204,13 @@ class Queue(mixins._LoopBoundMixin): """Remove and return an item from the queue. Return an item if one is immediately available, else raise QueueEmpty. + + Raises QueueShutDown if the queue has been shut down and is empty, or + if the queue has been shut down immediately. """ if self.empty(): + if self._is_shutdown: + raise QueueShutDown raise QueueEmpty item = self._get() self._wakeup_next(self._putters) @@ -194,6 +227,9 @@ class Queue(mixins._LoopBoundMixin): been processed (meaning that a task_done() call was received for every item that had been put() into the queue). + shutdown(immediate=True) calls task_done() for each remaining item in + the queue. + Raises ValueError if called more times than there were items placed in the queue. """ @@ -214,6 +250,34 @@ class Queue(mixins._LoopBoundMixin): if self._unfinished_tasks > 0: await self._finished.wait() + def shutdown(self, immediate=False): + """Shut-down the queue, making queue gets and puts raise QueueShutDown. + + By default, gets will only raise once the queue is empty. Set + 'immediate' to True to make gets raise immediately instead. + + All blocked callers of put() and get() will be unblocked. If + 'immediate', a task is marked as done for each item remaining in + the queue, which may unblock callers of join(). + """ + self._is_shutdown = True + if immediate: + while not self.empty(): + self._get() + if self._unfinished_tasks > 0: + self._unfinished_tasks -= 1 + if self._unfinished_tasks == 0: + self._finished.set() + # All getters need to re-check queue-empty to raise ShutDown + while self._getters: + getter = self._getters.popleft() + if not getter.done(): + getter.set_result(None) + while self._putters: + putter = self._putters.popleft() + if not putter.done(): + putter.set_result(None) + class PriorityQueue(Queue): """A subclass of Queue; retrieves entries in priority order (lowest first). diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index f895750e..f94bf10b 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -235,6 +235,10 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): await waiter except BaseException: transport.close() + # gh-109534: When an exception is raised by the SSLProtocol object the + # exception set in this future can keep the protocol object alive and + # cause a reference cycle. + waiter = None raise # It's now up to the protocol to handle the connection. @@ -261,22 +265,17 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): except (AttributeError, TypeError, ValueError): # This code matches selectors._fileobj_to_fd function. raise ValueError(f"Invalid file object: {fd!r}") from None - try: - transport = self._transports[fileno] - except KeyError: - pass - else: - if not transport.is_closing(): - raise RuntimeError( - f'File descriptor {fd!r} is used by transport ' - f'{transport!r}') + transport = self._transports.get(fileno) + if transport and not transport.is_closing(): + raise RuntimeError( + f'File descriptor {fd!r} is used by transport ' + f'{transport!r}') def _add_reader(self, fd, callback, *args): self._check_closed() handle = events.Handle(callback, args, self, None) - try: - key = self._selector.get_key(fd) - except KeyError: + key = self._selector.get_map().get(fd) + if key is None: self._selector.register(fd, selectors.EVENT_READ, (handle, None)) else: @@ -290,30 +289,27 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): def _remove_reader(self, fd): if self.is_closed(): return False - try: - key = self._selector.get_key(fd) - except KeyError: + key = self._selector.get_map().get(fd) + if key is None: return False + mask, (reader, writer) = key.events, key.data + mask &= ~selectors.EVENT_READ + if not mask: + self._selector.unregister(fd) else: - mask, (reader, writer) = key.events, key.data - mask &= ~selectors.EVENT_READ - if not mask: - self._selector.unregister(fd) - else: - self._selector.modify(fd, mask, (None, writer)) + self._selector.modify(fd, mask, (None, writer)) - if reader is not None: - reader.cancel() - return True - else: - return False + if reader is not None: + reader.cancel() + return True + else: + return False def _add_writer(self, fd, callback, *args): self._check_closed() handle = events.Handle(callback, args, self, None) - try: - key = self._selector.get_key(fd) - except KeyError: + key = self._selector.get_map().get(fd) + if key is None: self._selector.register(fd, selectors.EVENT_WRITE, (None, handle)) else: @@ -328,24 +324,22 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): """Remove a writer callback.""" if self.is_closed(): return False - try: - key = self._selector.get_key(fd) - except KeyError: + key = self._selector.get_map().get(fd) + if key is None: return False + mask, (reader, writer) = key.events, key.data + # Remove both writer and connector. + mask &= ~selectors.EVENT_WRITE + if not mask: + self._selector.unregister(fd) else: - mask, (reader, writer) = key.events, key.data - # Remove both writer and connector. - mask &= ~selectors.EVENT_WRITE - if not mask: - self._selector.unregister(fd) - else: - self._selector.modify(fd, mask, (reader, None)) + self._selector.modify(fd, mask, (reader, None)) - if writer is not None: - writer.cancel() - return True - else: - return False + if writer is not None: + writer.cancel() + return True + else: + return False def add_reader(self, fd, callback, *args): """Add a reader callback.""" @@ -797,7 +791,7 @@ class _SelectorTransport(transports._FlowControlMixin, self._paused = False # Set when pause_reading() called if self._server is not None: - self._server._attach() + self._server._attach(self) loop._transports[self._sock_fd] = self def __repr__(self): @@ -874,6 +868,8 @@ class _SelectorTransport(transports._FlowControlMixin, if self._sock is not None: _warn(f"unclosed transport {self!r}", ResourceWarning, source=self) self._sock.close() + if self._server is not None: + self._server._detach(self) def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. @@ -912,7 +908,7 @@ class _SelectorTransport(transports._FlowControlMixin, self._loop = None server = self._server if server is not None: - server._detach() + server._detach(self) self._server = None def get_write_buffer_size(self): @@ -1247,8 +1243,6 @@ class _SelectorDatagramTransport(_SelectorTransport, transports.DatagramTranspor if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError(f'data argument must be a bytes-like object, ' f'not {type(data).__name__!r}') - if not data: - return if self._address: if addr not in (None, self._address): @@ -1284,7 +1278,7 @@ class _SelectorDatagramTransport(_SelectorTransport, transports.DatagramTranspor # Ensure that what we buffer is immutable. self._buffer.append((bytes(data), addr)) - self._buffer_size += len(data) + self._buffer_size += len(data) + 8 # include header bytes self._maybe_pause_protocol() def _sendto_ready(self): diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 488e17d8..74c5f0d5 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -1,3 +1,7 @@ +# Contains code from https://github.com/MagicStack/uvloop/tree/v0.16.0 +# SPDX-License-Identifier: PSF-2.0 AND (MIT OR Apache-2.0) +# SPDX-FileCopyrightText: Copyright (c) 2015-2021 MagicStack Inc. http://magic.io + import collections import enum import warnings @@ -97,7 +101,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin, return self._ssl_protocol._app_protocol def is_closing(self): - return self._closed + return self._closed or self._ssl_protocol._is_transport_closing() def close(self): """Close the transport. @@ -243,13 +247,12 @@ class _SSLProtocolTransport(transports._FlowControlMixin, The protocol's connection_lost() method will (eventually) be called with None as its argument. """ - self._closed = True - if self._ssl_protocol is not None: - self._ssl_protocol._abort() + self._force_close(None) def _force_close(self, exc): self._closed = True - self._ssl_protocol._abort(exc) + if self._ssl_protocol is not None: + self._ssl_protocol._abort(exc) def _test__append_write_backlog(self, data): # for test only @@ -376,6 +379,9 @@ class SSLProtocol(protocols.BufferedProtocol): self._app_transport_created = True return self._app_transport + def _is_transport_closing(self): + return self._transport is not None and self._transport.is_closing() + def connection_made(self, transport): """Called when the low-level connection is made. @@ -539,7 +545,7 @@ class SSLProtocol(protocols.BufferedProtocol): # start handshake timeout count down self._handshake_timeout_handle = \ self._loop.call_later(self._ssl_handshake_timeout, - lambda: self._check_handshake_timeout()) + self._check_handshake_timeout) self._do_handshake() @@ -576,6 +582,7 @@ class SSLProtocol(protocols.BufferedProtocol): peercert = sslobj.getpeercert() except Exception as exc: + handshake_exc = None self._set_state(SSLProtocolState.UNWRAPPED) if isinstance(exc, ssl.CertificateError): msg = 'SSL handshake failed on verifying the certificate' @@ -614,12 +621,12 @@ class SSLProtocol(protocols.BufferedProtocol): if self._app_transport is not None: self._app_transport._closed = True if self._state == SSLProtocolState.DO_HANDSHAKE: - self._abort() + self._abort(None) else: self._set_state(SSLProtocolState.FLUSHING) self._shutdown_timeout_handle = self._loop.call_later( self._ssl_shutdown_timeout, - lambda: self._check_shutdown_timeout() + self._check_shutdown_timeout ) self._do_flush() @@ -661,10 +668,10 @@ class SSLProtocol(protocols.BufferedProtocol): else: self._loop.call_soon(self._transport.close) - def _abort(self): + def _abort(self, exc): self._set_state(SSLProtocolState.UNWRAPPED) if self._transport is not None: - self._transport.abort() + self._transport._force_close(exc) # Outgoing flow @@ -758,7 +765,7 @@ class SSLProtocol(protocols.BufferedProtocol): else: break else: - self._loop.call_soon(lambda: self._do_read()) + self._loop.call_soon(self._do_read) except SSLAgainErrors: pass if offset > 0: diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py index 451a53a1..0f4df885 100644 --- a/Lib/asyncio/staggered.py +++ b/Lib/asyncio/staggered.py @@ -3,7 +3,6 @@ __all__ = 'staggered_race', import contextlib -import typing from . import events from . import exceptions as exceptions_mod @@ -11,16 +10,7 @@ from . import locks from . import tasks -async def staggered_race( - coro_fns: typing.Iterable[typing.Callable[[], typing.Awaitable]], - delay: typing.Optional[float], - *, - loop: events.AbstractEventLoop = None, -) -> typing.Tuple[ - typing.Any, - typing.Optional[int], - typing.List[typing.Optional[Exception]] -]: +async def staggered_race(coro_fns, delay, *, loop=None): """Run coroutines with staggered start times and take the first to finish. This method takes an iterable of coroutine functions. The first one is @@ -79,8 +69,11 @@ async def staggered_race( exceptions = [] running_tasks = [] - async def run_one_coro( - previous_failed: typing.Optional[locks.Event]) -> None: + async def run_one_coro(ok_to_start, previous_failed) -> None: + # in eager tasks this waits for the calling task to append this task + # to running_tasks, in regular tasks this wait is a no-op that does + # not yield a future. See gh-124309. + await ok_to_start.wait() # Wait for the previous task to finish, or for delay seconds if previous_failed is not None: with contextlib.suppress(exceptions_mod.TimeoutError): @@ -96,8 +89,12 @@ async def staggered_race( return # Start task that will run the next coroutine this_failed = locks.Event() - next_task = loop.create_task(run_one_coro(this_failed)) + next_ok_to_start = locks.Event() + next_task = loop.create_task(run_one_coro(next_ok_to_start, this_failed)) running_tasks.append(next_task) + # next_task has been appended to running_tasks so next_task is ok to + # start. + next_ok_to_start.set() assert len(running_tasks) == this_index + 2 # Prepare place to put this coroutine's exceptions if not won exceptions.append(None) @@ -127,8 +124,11 @@ async def staggered_race( if i != this_index: t.cancel() - first_task = loop.create_task(run_one_coro(None)) + ok_to_start = locks.Event() + first_task = loop.create_task(run_one_coro(ok_to_start, None)) running_tasks.append(first_task) + # first_task has been appended to running_tasks so first_task is ok to start. + ok_to_start.set() try: # Wait for a growing list of tasks to all finish: poor man's version of # curio's TaskGroup or trio's nursery @@ -144,6 +144,7 @@ async def staggered_race( raise d.exception() return winner_result, winner_index, exceptions finally: + del exceptions # Make sure no tasks are left running if we leave this function for t in running_tasks: t.cancel() diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 14861dff..64aac4cc 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -5,6 +5,7 @@ __all__ = ( import collections import socket import sys +import warnings import weakref if hasattr(socket, 'AF_UNIX'): @@ -66,9 +67,8 @@ async def start_server(client_connected_cb, host=None, port=None, *, positional host and port, with various optional keyword arguments following. The return value is the same as loop.create_server(). - Additional optional keyword arguments are loop (to set the event loop - instance to use) and limit (to set the buffer limit passed to the - StreamReader). + Additional optional keyword argument is limit (to set the buffer + limit passed to the StreamReader). The return value is the same as loop.create_server(), i.e. a Server object which can be used to stop the service. @@ -201,7 +201,6 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): # is established. self._strong_reader = stream_reader self._reject_connection = False - self._stream_writer = None self._task = None self._transport = None self._client_connected_cb = client_connected_cb @@ -214,10 +213,8 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): return None return self._stream_reader_wr() - def _replace_writer(self, writer): + def _replace_transport(self, transport): loop = self._loop - transport = writer.transport - self._stream_writer = writer self._transport = transport self._over_ssl = transport.get_extra_info('sslcontext') is not None @@ -239,13 +236,25 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): reader.set_transport(transport) self._over_ssl = transport.get_extra_info('sslcontext') is not None if self._client_connected_cb is not None: - self._stream_writer = StreamWriter(transport, self, - reader, - self._loop) - res = self._client_connected_cb(reader, - self._stream_writer) + writer = StreamWriter(transport, self, reader, self._loop) + res = self._client_connected_cb(reader, writer) if coroutines.iscoroutine(res): + def callback(task): + if task.cancelled(): + transport.close() + return + exc = task.exception() + if exc is not None: + self._loop.call_exception_handler({ + 'message': 'Unhandled exception in client_connected_cb', + 'exception': exc, + 'transport': transport, + }) + transport.close() + self._task = self._loop.create_task(res) + self._task.add_done_callback(callback) + self._strong_reader = None def connection_lost(self, exc): @@ -390,12 +399,15 @@ class StreamWriter: ssl_handshake_timeout=ssl_handshake_timeout, ssl_shutdown_timeout=ssl_shutdown_timeout) self._transport = new_transport - protocol._replace_writer(self) + protocol._replace_transport(new_transport) - def __del__(self): + def __del__(self, warnings=warnings): if not self._transport.is_closing(): - self.close() - + if self._loop.is_closed(): + warnings.warn("loop is closed", ResourceWarning) + else: + self.close() + warnings.warn(f"unclosed {self!r}", ResourceWarning) class StreamReader: @@ -578,20 +590,34 @@ class StreamReader: If the data cannot be read because of over limit, a LimitOverrunError exception will be raised, and the data will be left in the internal buffer, so it can be read again. + + The ``separator`` may also be a tuple of separators. In this + case the return value will be the shortest possible that has any + separator as the suffix. For the purposes of LimitOverrunError, + the shortest possible separator is considered to be the one that + matched. """ - seplen = len(separator) - if seplen == 0: + if isinstance(separator, tuple): + # Makes sure shortest matches wins + separator = sorted(separator, key=len) + else: + separator = [separator] + if not separator: + raise ValueError('Separator should contain at least one element') + min_seplen = len(separator[0]) + max_seplen = len(separator[-1]) + if min_seplen == 0: raise ValueError('Separator should be at least one-byte string') if self._exception is not None: raise self._exception # Consume whole buffer except last bytes, which length is - # one less than seplen. Let's check corner cases with - # separator='SEPARATOR': + # one less than max_seplen. Let's check corner cases with + # separator[-1]='SEPARATOR': # * we have received almost complete separator (without last # byte). i.e buffer='some textSEPARATO'. In this case we - # can safely consume len(separator) - 1 bytes. + # can safely consume max_seplen - 1 bytes. # * last byte of buffer is first byte of separator, i.e. # buffer='abcdefghijklmnopqrS'. We may safely consume # everything except that last byte, but this require to @@ -604,26 +630,35 @@ class StreamReader: # messages :) # `offset` is the number of bytes from the beginning of the buffer - # where there is no occurrence of `separator`. + # where there is no occurrence of any `separator`. offset = 0 - # Loop until we find `separator` in the buffer, exceed the buffer size, + # Loop until we find a `separator` in the buffer, exceed the buffer size, # or an EOF has happened. while True: buflen = len(self._buffer) - # Check if we now have enough data in the buffer for `separator` to - # fit. - if buflen - offset >= seplen: - isep = self._buffer.find(separator, offset) - - if isep != -1: - # `separator` is in the buffer. `isep` will be used later - # to retrieve the data. + # Check if we now have enough data in the buffer for shortest + # separator to fit. + if buflen - offset >= min_seplen: + match_start = None + match_end = None + for sep in separator: + isep = self._buffer.find(sep, offset) + + if isep != -1: + # `separator` is in the buffer. `match_start` and + # `match_end` will be used later to retrieve the + # data. + end = isep + len(sep) + if match_end is None or end < match_end: + match_end = end + match_start = isep + if match_end is not None: break # see upper comment for explanation. - offset = buflen + 1 - seplen + offset = max(0, buflen + 1 - max_seplen) if offset > self._limit: raise exceptions.LimitOverrunError( 'Separator is not found, and chunk exceed the limit', @@ -632,7 +667,7 @@ class StreamReader: # Complete message (with full separator) may be present in buffer # even when EOF flag is set. This may happen when the last chunk # adds data which makes separator be found. That's why we check for - # EOF *ater* inspecting the buffer. + # EOF *after* inspecting the buffer. if self._eof: chunk = bytes(self._buffer) self._buffer.clear() @@ -641,12 +676,12 @@ class StreamReader: # _wait_for_data() will resume reading if stream was paused. await self._wait_for_data('readuntil') - if isep > self._limit: + if match_start > self._limit: raise exceptions.LimitOverrunError( - 'Separator is found, but chunk is longer than limit', isep) + 'Separator is found, but chunk is longer than limit', match_start) - chunk = self._buffer[:isep + seplen] - del self._buffer[:isep + seplen] + chunk = self._buffer[:match_end] + del self._buffer[:match_end] self._maybe_resume_transport() return bytes(chunk) diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index c4e5ba20..043359bb 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -147,15 +147,17 @@ class Process: async def _feed_stdin(self, input): debug = self._loop.get_debug() - if input is not None: - self.stdin.write(input) - if debug: - logger.debug( - '%r communicate: feed stdin (%s bytes)', self, len(input)) try: + if input is not None: + self.stdin.write(input) + if debug: + logger.debug( + '%r communicate: feed stdin (%s bytes)', self, len(input)) + await self.stdin.drain() except (BrokenPipeError, ConnectionResetError) as exc: - # communicate() ignores BrokenPipeError and ConnectionResetError + # communicate() ignores BrokenPipeError and ConnectionResetError. + # write() and drain() can raise these exceptions. if debug: logger.debug('%r communicate: stdin got %r', self, exc) diff --git a/Lib/asyncio/taskgroups.py b/Lib/asyncio/taskgroups.py index 930da53d..9fa772ca 100644 --- a/Lib/asyncio/taskgroups.py +++ b/Lib/asyncio/taskgroups.py @@ -54,20 +54,32 @@ class TaskGroup: async def __aenter__(self): if self._entered: raise RuntimeError( - f"TaskGroup {self!r} has been already entered") - self._entered = True - + f"TaskGroup {self!r} has already been entered") if self._loop is None: self._loop = events.get_running_loop() - self._parent_task = tasks.current_task(self._loop) if self._parent_task is None: raise RuntimeError( f'TaskGroup {self!r} cannot determine the parent task') + self._entered = True return self async def __aexit__(self, et, exc, tb): + tb = None + try: + return await self._aexit(et, exc) + finally: + # Exceptions are heavy objects that can have object + # cycles (bad for GC); let's not keep a reference to + # a bunch of them. It would be nicer to use a try/finally + # in __aexit__ directly but that introduced some diff noise + self._parent_task = None + self._errors = None + self._base_error = None + exc = None + + async def _aexit(self, et, exc): self._exiting = True if (exc is not None and @@ -75,14 +87,10 @@ class TaskGroup: self._base_error is None): self._base_error = exc - propagate_cancellation_error = \ - exc if et is exceptions.CancelledError else None - if self._parent_cancel_requested: - # If this flag is set we *must* call uncancel(). - if self._parent_task.uncancel() == 0: - # If there are no pending cancellations left, - # don't propagate CancelledError. - propagate_cancellation_error = None + if et is not None and issubclass(et, exceptions.CancelledError): + propagate_cancellation_error = exc + else: + propagate_cancellation_error = None if et is not None: if not self._aborting: @@ -128,25 +136,47 @@ class TaskGroup: assert not self._tasks if self._base_error is not None: - raise self._base_error + try: + raise self._base_error + finally: + exc = None + + if self._parent_cancel_requested: + # If this flag is set we *must* call uncancel(). + if self._parent_task.uncancel() == 0: + # If there are no pending cancellations left, + # don't propagate CancelledError. + propagate_cancellation_error = None # Propagate CancelledError if there is one, except if there # are other errors -- those have priority. - if propagate_cancellation_error and not self._errors: - raise propagate_cancellation_error - - if et is not None and et is not exceptions.CancelledError: + try: + if propagate_cancellation_error is not None and not self._errors: + try: + raise propagate_cancellation_error + finally: + exc = None + finally: + propagate_cancellation_error = None + + if et is not None and not issubclass(et, exceptions.CancelledError): self._errors.append(exc) if self._errors: - # Exceptions are heavy objects that can have object - # cycles (bad for GC); let's not keep a reference to - # a bunch of them. + # If the parent task is being cancelled from the outside + # of the taskgroup, un-cancel and re-cancel the parent task, + # which will keep the cancel count stable. + if self._parent_task.cancelling(): + self._parent_task.uncancel() + self._parent_task.cancel() try: - me = BaseExceptionGroup('unhandled errors in a TaskGroup', self._errors) - raise me from None + raise BaseExceptionGroup( + 'unhandled errors in a TaskGroup', + self._errors, + ) from None finally: - self._errors = None + exc = None + def create_task(self, coro, *, name=None, context=None): """Create a new task in this group and return it. @@ -154,16 +184,19 @@ class TaskGroup: Similar to `asyncio.create_task`. """ if not self._entered: + coro.close() raise RuntimeError(f"TaskGroup {self!r} has not been entered") if self._exiting and not self._tasks: + coro.close() raise RuntimeError(f"TaskGroup {self!r} is finished") if self._aborting: + coro.close() raise RuntimeError(f"TaskGroup {self!r} is shutting down") if context is None: - task = self._loop.create_task(coro) + task = self._loop.create_task(coro, name=name) else: - task = self._loop.create_task(coro, context=context) - tasks._set_task_name(task, name) + task = self._loop.create_task(coro, name=name, context=context) + # optimization: Immediately call the done callback if the task is # already done (e.g. if the coro was able to complete eagerly), # and skip scheduling a done callback diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 152c9f8a..dadcb5b5 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -15,8 +15,8 @@ import contextvars import functools import inspect import itertools +import math import types -import warnings import weakref from types import GenericAlias @@ -25,6 +25,7 @@ from . import coroutines from . import events from . import exceptions from . import futures +from . import queues from . import timeouts # Helper to generate new task names @@ -67,34 +68,31 @@ def all_tasks(loop=None): if futures._get_loop(t) is loop and not t.done()} -def _set_task_name(task, name): - if name is not None: - try: - set_name = task.set_name - except AttributeError: - warnings.warn("Task.set_name() was added in Python 3.8, " - "the method support will be mandatory for third-party " - "task implementations since 3.13.", - DeprecationWarning, stacklevel=3) - else: - set_name(name) - - class Task(futures._PyFuture): # Inherit Python Task implementation # from a Python Future implementation. """A coroutine wrapped in a Future.""" # An important invariant maintained while a Task not done: + # _fut_waiter is either None or a Future. The Future + # can be either done() or not done(). + # The task can be in any of 3 states: # - # - Either _fut_waiter is None, and _step() is scheduled; - # - or _fut_waiter is some Future, and _step() is *not* scheduled. + # - 1: _fut_waiter is not None and not _fut_waiter.done(): + # __step() is *not* scheduled and the Task is waiting for _fut_waiter. + # - 2: (_fut_waiter is None or _fut_waiter.done()) and __step() is scheduled: + # the Task is waiting for __step() to be executed. + # - 3: _fut_waiter is None and __step() is *not* scheduled: + # the Task is currently executing (in __step()). # - # The only transition from the latter to the former is through - # _wakeup(). When _fut_waiter is not None, one of its callbacks - # must be _wakeup(). - - # If False, don't log a message if the task is destroyed whereas its + # * In state 1, one of the callbacks of __fut_waiter must be __wakeup(). + # * The transition from 1 to 2 happens when _fut_waiter becomes done(), + # as it schedules __wakeup() to be called (which calls __step() so + # we way that __step() is scheduled). + # * It transitions from 2 to 3 when __step() is executed, and it clears + # _fut_waiter to None. + + # If False, don't log a message if the task is destroyed while its # status is still pending _log_destroy_pending = True @@ -257,6 +255,8 @@ class Task(futures._PyFuture): # Inherit Python Task implementation """ if self._num_cancels_requested > 0: self._num_cancels_requested -= 1 + if self._num_cancels_requested == 0: + self._must_cancel = False return self._num_cancels_requested def __eager_start(self): @@ -407,11 +407,10 @@ def create_task(coro, *, name=None, context=None): loop = events.get_running_loop() if context is None: # Use legacy API if context is not needed - task = loop.create_task(coro) + task = loop.create_task(coro, name=name) else: - task = loop.create_task(coro, context=context) + task = loop.create_task(coro, name=name, context=context) - _set_task_name(task, name) return task @@ -427,8 +426,6 @@ async def wait(fs, *, timeout=None, return_when=ALL_COMPLETED): The fs iterable must not be empty. - Coroutines will be wrapped in Tasks. - Returns two sets of Future: (done, pending). Usage: @@ -470,7 +467,7 @@ async def wait_for(fut, timeout): If the wait is cancelled, the task is also cancelled. - If the task supresses the cancellation and returns a value instead, + If the task suppresses the cancellation and returns a value instead, that value is returned. This function is a coroutine. @@ -570,62 +567,125 @@ async def _cancel_and_wait(fut): fut.remove_done_callback(cb) -# This is *not* a @coroutine! It is just an iterator (yielding Futures). +class _AsCompletedIterator: + """Iterator of awaitables representing tasks of asyncio.as_completed. + + As an asynchronous iterator, iteration yields futures as they finish. As a + plain iterator, new coroutines are yielded that will return or raise the + result of the next underlying future to complete. + """ + def __init__(self, aws, timeout): + self._done = queues.Queue() + self._timeout_handle = None + + loop = events.get_event_loop() + todo = {ensure_future(aw, loop=loop) for aw in set(aws)} + for f in todo: + f.add_done_callback(self._handle_completion) + if todo and timeout is not None: + self._timeout_handle = ( + loop.call_later(timeout, self._handle_timeout) + ) + self._todo = todo + self._todo_left = len(todo) + + def __aiter__(self): + return self + + def __iter__(self): + return self + + async def __anext__(self): + if not self._todo_left: + raise StopAsyncIteration + assert self._todo_left > 0 + self._todo_left -= 1 + return await self._wait_for_one() + + def __next__(self): + if not self._todo_left: + raise StopIteration + assert self._todo_left > 0 + self._todo_left -= 1 + return self._wait_for_one(resolve=True) + + def _handle_timeout(self): + for f in self._todo: + f.remove_done_callback(self._handle_completion) + self._done.put_nowait(None) # Sentinel for _wait_for_one(). + self._todo.clear() # Can't do todo.remove(f) in the loop. + + def _handle_completion(self, f): + if not self._todo: + return # _handle_timeout() was here first. + self._todo.remove(f) + self._done.put_nowait(f) + if not self._todo and self._timeout_handle is not None: + self._timeout_handle.cancel() + + async def _wait_for_one(self, resolve=False): + # Wait for the next future to be done and return it unless resolve is + # set, in which case return either the result of the future or raise + # an exception. + f = await self._done.get() + if f is None: + # Dummy value from _handle_timeout(). + raise exceptions.TimeoutError + return f.result() if resolve else f + + def as_completed(fs, *, timeout=None): - """Return an iterator whose values are coroutines. + """Create an iterator of awaitables or their results in completion order. - When waiting for the yielded coroutines you'll get the results (or - exceptions!) of the original Futures (or coroutines), in the order - in which and as soon as they complete. + Run the supplied awaitables concurrently. The returned object can be + iterated to obtain the results of the awaitables as they finish. - This differs from PEP 3148; the proper way to use this is: + The object returned can be iterated as an asynchronous iterator or a plain + iterator. When asynchronous iteration is used, the originally-supplied + awaitables are yielded if they are tasks or futures. This makes it easy to + correlate previously-scheduled tasks with their results: - for f in as_completed(fs): - result = await f # The 'await' may raise. - # Use result. + ipv4_connect = create_task(open_connection("127.0.0.1", 80)) + ipv6_connect = create_task(open_connection("::1", 80)) + tasks = [ipv4_connect, ipv6_connect] - If a timeout is specified, the 'await' will raise - TimeoutError when the timeout occurs before all Futures are done. + async for earliest_connect in as_completed(tasks): + # earliest_connect is done. The result can be obtained by + # awaiting it or calling earliest_connect.result() + reader, writer = await earliest_connect - Note: The futures 'f' are not necessarily members of fs. - """ - if futures.isfuture(fs) or coroutines.iscoroutine(fs): - raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}") + if earliest_connect is ipv6_connect: + print("IPv6 connection established.") + else: + print("IPv4 connection established.") - from .queues import Queue # Import here to avoid circular import problem. - done = Queue() + During asynchronous iteration, implicitly-created tasks will be yielded for + supplied awaitables that aren't tasks or futures. - loop = events.get_event_loop() - todo = {ensure_future(f, loop=loop) for f in set(fs)} - timeout_handle = None + When used as a plain iterator, each iteration yields a new coroutine that + returns the result or raises the exception of the next completed awaitable. + This pattern is compatible with Python versions older than 3.13: - def _on_timeout(): - for f in todo: - f.remove_done_callback(_on_completion) - done.put_nowait(None) # Queue a dummy value for _wait_for_one(). - todo.clear() # Can't do todo.remove(f) in the loop. + ipv4_connect = create_task(open_connection("127.0.0.1", 80)) + ipv6_connect = create_task(open_connection("::1", 80)) + tasks = [ipv4_connect, ipv6_connect] - def _on_completion(f): - if not todo: - return # _on_timeout() was here first. - todo.remove(f) - done.put_nowait(f) - if not todo and timeout_handle is not None: - timeout_handle.cancel() + for next_connect in as_completed(tasks): + # next_connect is not one of the original task objects. It must be + # awaited to obtain the result value or raise the exception of the + # awaitable that finishes next. + reader, writer = await next_connect - async def _wait_for_one(): - f = await done.get() - if f is None: - # Dummy value from _on_timeout(). - raise exceptions.TimeoutError - return f.result() # May raise f.exception(). + A TimeoutError is raised if the timeout occurs before all awaitables are + done. This is raised by the async for loop during asynchronous iteration or + by the coroutines yielded during plain iteration. + """ + if inspect.isawaitable(fs): + raise TypeError( + f"expects an iterable of awaitables, not {type(fs).__name__}" + ) - for f in todo: - f.add_done_callback(_on_completion) - if todo and timeout is not None: - timeout_handle = loop.call_later(timeout, _on_timeout) - for _ in range(len(todo)): - yield _wait_for_one() + return _AsCompletedIterator(fs, timeout) @types.coroutine @@ -646,6 +706,9 @@ async def sleep(delay, result=None): await __sleep0() return result + if math.isnan(delay): + raise ValueError("Invalid delay: NaN (not a number)") + loop = events.get_running_loop() future = loop.create_future() h = loop.call_later(delay, diff --git a/Lib/asyncio/timeouts.py b/Lib/asyncio/timeouts.py index 029c4687..e6f51006 100644 --- a/Lib/asyncio/timeouts.py +++ b/Lib/asyncio/timeouts.py @@ -49,8 +49,9 @@ class Timeout: def reschedule(self, when: Optional[float]) -> None: """Reschedule the timeout.""" - assert self._state is not _State.CREATED if self._state is not _State.ENTERED: + if self._state is _State.CREATED: + raise RuntimeError("Timeout has not been entered") raise RuntimeError( f"Cannot change state of {self._state.value} Timeout", ) @@ -82,11 +83,14 @@ class Timeout: return f"" async def __aenter__(self) -> "Timeout": + if self._state is not _State.CREATED: + raise RuntimeError("Timeout has already been entered") + task = tasks.current_task() + if task is None: + raise RuntimeError("Timeout should be used inside a task") self._state = _State.ENTERED - self._task = tasks.current_task() + self._task = task self._cancelling = self._task.cancelling() - if self._task is None: - raise RuntimeError("Timeout should be used inside a task") self.reschedule(self._when) return self @@ -105,10 +109,16 @@ class Timeout: if self._state is _State.EXPIRING: self._state = _State.EXPIRED - if self._task.uncancel() <= self._cancelling and exc_type is exceptions.CancelledError: + if self._task.uncancel() <= self._cancelling and exc_type is not None: # Since there are no new cancel requests, we're # handling this. - raise TimeoutError from exc_val + if issubclass(exc_type, exceptions.CancelledError): + raise TimeoutError from exc_val + elif exc_val is not None: + self._insert_timeout_error(exc_val) + if isinstance(exc_val, ExceptionGroup): + for exc in exc_val.exceptions: + self._insert_timeout_error(exc) elif self._state is _State.ENTERED: self._state = _State.EXITED @@ -121,6 +131,16 @@ class Timeout: # drop the reference early self._timeout_handler = None + @staticmethod + def _insert_timeout_error(exc_val: BaseException) -> None: + while exc_val.__context__ is not None: + if isinstance(exc_val.__context__, exceptions.CancelledError): + te = TimeoutError() + te.__context__ = te.__cause__ = exc_val.__context__ + exc_val.__context__ = te + break + exc_val = exc_val.__context__ + def timeout(delay: Optional[float]) -> Timeout: """Timeout async context manager. diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 30fd41d4..34c7ad44 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -181,6 +181,8 @@ class DatagramTransport(BaseTransport): to be sent out asynchronously. addr is target socket address. If addr is None use target address pointed on transport creation. + If data is an empty bytes object a zero-length datagram will be + sent. """ raise NotImplementedError diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 17fb4d5f..41ccf1b7 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -32,6 +32,7 @@ __all__ = ( 'FastChildWatcher', 'PidfdChildWatcher', 'MultiLoopChildWatcher', 'ThreadedChildWatcher', 'DefaultEventLoopPolicy', + 'EventLoop', ) @@ -63,6 +64,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): def __init__(self, selector=None): super().__init__(selector) self._signal_handlers = {} + self._unix_server_sockets = {} def close(self): super().close() @@ -226,8 +228,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): return transp def _child_watcher_callback(self, pid, returncode, transp): - # Skip one iteration for callbacks to be executed - self.call_soon_threadsafe(self.call_soon, transp._process_exited, returncode) + self.call_soon_threadsafe(transp._process_exited, returncode) async def create_unix_connection( self, protocol_factory, path=None, *, @@ -284,7 +285,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): sock=None, backlog=100, ssl=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, - start_serving=True): + start_serving=True, cleanup_socket=True): if isinstance(ssl, bool): raise TypeError('ssl argument must be an SSLContext or None') @@ -340,6 +341,15 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): raise ValueError( f'A UNIX Domain Stream Socket was expected, got {sock!r}') + if cleanup_socket: + path = sock.getsockname() + # Check for abstract socket. `str` and `bytes` paths are supported. + if path[0] not in (0, '\x00'): + try: + self._unix_server_sockets[sock] = os.stat(path).st_ino + except FileNotFoundError: + pass + sock.setblocking(False) server = base_events.Server(self, [sock], protocol_factory, ssl, backlog, ssl_handshake_timeout, @@ -394,6 +404,9 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): fut.set_result(total_sent) return + # On 32-bit architectures truncate to 1GiB to avoid OverflowError + blocksize = min(blocksize, sys.maxsize//2 + 1) + try: sent = os.sendfile(fd, fileno, offset, blocksize) except (BlockingIOError, InterruptedError): @@ -457,6 +470,27 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): self.remove_writer(fd) fut.add_done_callback(cb) + def _stop_serving(self, sock): + # Is this a unix socket that needs cleanup? + if sock in self._unix_server_sockets: + path = sock.getsockname() + else: + path = None + + super()._stop_serving(sock) + + if path is not None: + prev_ino = self._unix_server_sockets[sock] + del self._unix_server_sockets[sock] + try: + if os.stat(path).st_ino == prev_ino: + os.unlink(path) + except FileNotFoundError: + pass + except OSError as err: + logger.error('Unable to clean up listening UNIX socket ' + '%r: %r', path, err) + class _UnixReadPipeTransport(transports.ReadTransport): @@ -1368,14 +1402,7 @@ class ThreadedChildWatcher(AbstractChildWatcher): return True def close(self): - self._join_threads() - - def _join_threads(self): - """Internal: Join all non-daemon threads""" - threads = [thread for thread in list(self._threads.values()) - if thread.is_alive() and not thread.daemon] - for thread in threads: - thread.join() + pass def __enter__(self): return self @@ -1394,7 +1421,7 @@ class ThreadedChildWatcher(AbstractChildWatcher): def add_child_handler(self, pid, callback, *args): loop = events.get_running_loop() thread = threading.Thread(target=self._do_waitpid, - name=f"waitpid-{next(self._pid_counter)}", + name=f"asyncio-waitpid-{next(self._pid_counter)}", args=(loop, pid, callback, args), daemon=True) self._threads[pid] = thread @@ -1462,8 +1489,6 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): self._watcher = PidfdChildWatcher() else: self._watcher = ThreadedChildWatcher() - if threading.current_thread() is threading.main_thread(): - self._watcher.attach_loop(self._local._loop) def set_event_loop(self, loop): """Set the event loop. @@ -1508,3 +1533,4 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): SelectorEventLoop = _UnixSelectorEventLoop DefaultEventLoopPolicy = _UnixDefaultEventLoopPolicy +EventLoop = SelectorEventLoop diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index c9a5fb84..bf99bc27 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -8,6 +8,7 @@ if sys.platform != 'win32': # pragma: no cover import _overlapped import _winapi import errno +from functools import partial import math import msvcrt import socket @@ -29,7 +30,7 @@ from .log import logger __all__ = ( 'SelectorEventLoop', 'ProactorEventLoop', 'IocpProactor', 'DefaultEventLoopPolicy', 'WindowsSelectorEventLoopPolicy', - 'WindowsProactorEventLoopPolicy', + 'WindowsProactorEventLoopPolicy', 'EventLoop', ) @@ -314,24 +315,25 @@ class ProactorEventLoop(proactor_events.BaseProactorEventLoop): proactor = IocpProactor() super().__init__(proactor) - def run_forever(self): - try: - assert self._self_reading_future is None - self.call_soon(self._loop_self_reading) - super().run_forever() - finally: - if self._self_reading_future is not None: - ov = self._self_reading_future._ov - self._self_reading_future.cancel() - # self_reading_future was just cancelled so if it hasn't been - # finished yet, it never will be (it's possible that it has - # already finished and its callback is waiting in the queue, - # where it could still happen if the event loop is restarted). - # Unregister it otherwise IocpProactor.close will wait for it - # forever - if ov is not None: - self._proactor._unregister(ov) - self._self_reading_future = None + def _run_forever_setup(self): + assert self._self_reading_future is None + self.call_soon(self._loop_self_reading) + super()._run_forever_setup() + + def _run_forever_cleanup(self): + super()._run_forever_cleanup() + if self._self_reading_future is not None: + ov = self._self_reading_future._ov + self._self_reading_future.cancel() + # self_reading_future always uses IOCP, so even though it's + # been cancelled, we need to make sure that the IOCP message + # is received so that the kernel is not holding on to the + # memory, possibly causing memory corruption later. Only + # unregister it if IO is complete in all respects. Otherwise + # we need another _poll() later to complete the IO. + if ov is not None and not ov.pending: + self._proactor._unregister(ov) + self._self_reading_future = None async def create_pipe_connection(self, protocol_factory, address): f = self._proactor.connect_pipe(address) @@ -466,6 +468,18 @@ class IocpProactor: else: raise + @classmethod + def _finish_recvfrom(cls, trans, key, ov, *, empty_result): + try: + return cls.finish_socket_func(trans, key, ov) + except OSError as exc: + # WSARecvFrom will report ERROR_PORT_UNREACHABLE when the same + # socket is used to send to an address that is not listening. + if exc.winerror == _overlapped.ERROR_PORT_UNREACHABLE: + return empty_result, None + else: + raise + def recv(self, conn, nbytes, flags=0): self._register_with_iocp(conn) ov = _overlapped.Overlapped(NULL) @@ -500,7 +514,8 @@ class IocpProactor: except BrokenPipeError: return self._result((b'', None)) - return self._register(ov, conn, self.finish_socket_func) + return self._register(ov, conn, partial(self._finish_recvfrom, + empty_result=b'')) def recvfrom_into(self, conn, buf, flags=0): self._register_with_iocp(conn) @@ -510,17 +525,8 @@ class IocpProactor: except BrokenPipeError: return self._result((0, None)) - def finish_recv(trans, key, ov): - try: - return ov.getresult() - except OSError as exc: - if exc.winerror in (_overlapped.ERROR_NETNAME_DELETED, - _overlapped.ERROR_OPERATION_ABORTED): - raise ConnectionResetError(*exc.args) - else: - raise - - return self._register(ov, conn, finish_recv) + return self._register(ov, conn, partial(self._finish_recvfrom, + empty_result=0)) def sendto(self, conn, buf, flags=0, addr=None): self._register_with_iocp(conn) @@ -894,3 +900,4 @@ class WindowsProactorEventLoopPolicy(events.BaseDefaultEventLoopPolicy): DefaultEventLoopPolicy = WindowsProactorEventLoopPolicy +EventLoop = ProactorEventLoop diff --git a/Lib/base64.py b/Lib/base64.py index e233647e..5a7e790a 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -18,7 +18,7 @@ __all__ = [ 'b64encode', 'b64decode', 'b32encode', 'b32decode', 'b32hexencode', 'b32hexdecode', 'b16encode', 'b16decode', # Base85 and Ascii85 encodings - 'b85encode', 'b85decode', 'a85encode', 'a85decode', + 'b85encode', 'b85decode', 'a85encode', 'a85decode', 'z85encode', 'z85decode', # Standard Base64 encoding 'standard_b64encode', 'standard_b64decode', # Some common Base64 alternatives. As referenced by RFC 3458, see thread @@ -164,7 +164,6 @@ _b32tab2 = {} _b32rev = {} def _b32encode(alphabet, s): - global _b32tab2 # Delay the initialization of the table to not waste memory # if the function is never called if alphabet not in _b32tab2: @@ -200,7 +199,6 @@ def _b32encode(alphabet, s): return bytes(encoded) def _b32decode(alphabet, s, casefold=False, map01=None): - global _b32rev # Delay the initialization of the table to not waste memory # if the function is never called if alphabet not in _b32rev: @@ -334,7 +332,7 @@ def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): wrapcol controls whether the output should have newline (b'\\n') characters added to it. If this is non-zero, each output line will be at most this - many characters long. + many characters long, excluding the trailing newline. pad controls whether the input is padded to a multiple of 4 before encoding. Note that the btoa implementation always pads. @@ -499,6 +497,33 @@ def b85decode(b): result = result[:-padding] return result +_z85alphabet = (b'0123456789abcdefghijklmnopqrstuvwxyz' + b'ABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#') +# Translating b85 valid but z85 invalid chars to b'\x00' is required +# to prevent them from being decoded as b85 valid chars. +_z85_b85_decode_diff = b';_`|~' +_z85_decode_translation = bytes.maketrans( + _z85alphabet + _z85_b85_decode_diff, + _b85alphabet + b'\x00' * len(_z85_b85_decode_diff) +) +_z85_encode_translation = bytes.maketrans(_b85alphabet, _z85alphabet) + +def z85encode(s): + """Encode bytes-like object b in z85 format and return a bytes object.""" + return b85encode(s).translate(_z85_encode_translation) + +def z85decode(s): + """Decode the z85-encoded bytes-like object or ASCII string b + + The result is returned as a bytes object. + """ + s = _bytes_from_decode_data(s) + s = s.translate(_z85_decode_translation) + try: + return b85decode(s) + except ValueError as e: + raise ValueError(e.args[0].replace('base85', 'z85')) from None + # Legacy interface. This code could be cleaned up since I don't believe # binascii has any line length limitations. It just doesn't seem worth it # though. The files should be opened in binary mode. diff --git a/Lib/bdb.py b/Lib/bdb.py index 0f3eec65..ece0a29f 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -32,7 +32,10 @@ class Bdb: self.skip = set(skip) if skip else None self.breaks = {} self.fncache = {} + self.frame_trace_lines_opcodes = {} self.frame_returning = None + self.trace_opcodes = False + self.enterframe = None self._load_breaks() @@ -84,6 +87,9 @@ class Bdb: The arg parameter depends on the previous event. """ + + self.enterframe = frame + if self.quitting: return # None if event == 'line': @@ -100,6 +106,8 @@ class Bdb: return self.trace_dispatch if event == 'c_return': return self.trace_dispatch + if event == 'opcode': + return self.dispatch_opcode(frame, arg) print('bdb.Bdb.dispatch: unknown debugging event:', repr(event)) return self.trace_dispatch @@ -157,6 +165,11 @@ class Bdb: # The user issued a 'next' or 'until' command. if self.stopframe is frame and self.stoplineno != -1: self._set_stopinfo(None, None) + # The previous frame might not have f_trace set, unless we are + # issuing a command that does not expect to stop, we should set + # f_trace + if self.stoplineno != -1: + self._set_caller_tracefunc(frame) return self.trace_dispatch def dispatch_exception(self, frame, arg): @@ -186,6 +199,17 @@ class Bdb: return self.trace_dispatch + def dispatch_opcode(self, frame, arg): + """Invoke user function and return trace function for opcode event. + If the debugger stops on the current opcode, invoke + self.user_opcode(). Raise BdbQuit if self.quitting is set. + Return self.trace_dispatch to continue tracing in this scope. + """ + if self.stop_here(frame) or self.break_here(frame): + self.user_opcode(frame) + if self.quitting: raise BdbQuit + return self.trace_dispatch + # Normally derived classes don't override the following # methods, but they may if they want to redefine the # definition of stopping and breakpoints. @@ -272,7 +296,21 @@ class Bdb: """Called when we stop on an exception.""" pass - def _set_stopinfo(self, stopframe, returnframe, stoplineno=0): + def user_opcode(self, frame): + """Called when we are about to execute an opcode.""" + pass + + def _set_trace_opcodes(self, trace_opcodes): + if trace_opcodes != self.trace_opcodes: + self.trace_opcodes = trace_opcodes + frame = self.enterframe + while frame is not None: + frame.f_trace_opcodes = trace_opcodes + if frame is self.botframe: + break + frame = frame.f_back + + def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False): """Set the attributes for stopping. If stoplineno is greater than or equal to 0, then stop at line @@ -285,6 +323,17 @@ class Bdb: # stoplineno >= 0 means: stop at line >= the stoplineno # stoplineno -1 means: don't stop at all self.stoplineno = stoplineno + self._set_trace_opcodes(opcode) + + def _set_caller_tracefunc(self, current_frame): + # Issue #13183: pdb skips frames after hitting a breakpoint and running + # step commands. + # Restore the trace function in the caller (that may not have been set + # for performance reasons) when returning from the current frame, unless + # the caller is the botframe. + caller_frame = current_frame.f_back + if caller_frame and not caller_frame.f_trace and caller_frame is not self.botframe: + caller_frame.f_trace = self.trace_dispatch # Derived classes and clients can call the following methods # to affect the stepping state. @@ -299,16 +348,12 @@ class Bdb: def set_step(self): """Stop after one line of code.""" - # Issue #13183: pdb skips frames after hitting a breakpoint and running - # step commands. - # Restore the trace function in the caller (that may not have been set - # for performance reasons) when returning from the current frame. - if self.frame_returning: - caller_frame = self.frame_returning.f_back - if caller_frame and not caller_frame.f_trace: - caller_frame.f_trace = self.trace_dispatch self._set_stopinfo(None, None) + def set_stepinstr(self): + """Stop before the next instruction.""" + self._set_stopinfo(None, None, opcode=True) + def set_next(self, frame): """Stop on the next line in or below the given frame.""" self._set_stopinfo(frame, None) @@ -328,11 +373,15 @@ class Bdb: if frame is None: frame = sys._getframe().f_back self.reset() + self.enterframe = frame while frame: frame.f_trace = self.trace_dispatch self.botframe = frame + self.frame_trace_lines_opcodes[frame] = (frame.f_trace_lines, frame.f_trace_opcodes) + # We need f_trace_lines == True for the debugger to work + frame.f_trace_lines = True frame = frame.f_back - self.set_step() + self.set_stepinstr() sys.settrace(self.trace_dispatch) def set_continue(self): @@ -349,6 +398,9 @@ class Bdb: while frame and frame is not self.botframe: del frame.f_trace frame = frame.f_back + for frame, (trace_lines, trace_opcodes) in self.frame_trace_lines_opcodes.items(): + frame.f_trace_lines, frame.f_trace_opcodes = trace_lines, trace_opcodes + self.frame_trace_lines_opcodes = {} def set_quit(self): """Set quitting attribute to True. @@ -387,6 +439,14 @@ class Bdb: return 'Line %s:%d does not exist' % (filename, lineno) self._add_to_breaks(filename, lineno) bp = Breakpoint(filename, lineno, temporary, cond, funcname) + # After we set a new breakpoint, we need to search through all frames + # and set f_trace to trace_dispatch if there could be a breakpoint in + # that frame. + frame = self.enterframe + while frame: + if self.break_anywhere(frame): + frame.f_trace = self.trace_dispatch + frame = frame.f_back return None def _load_breaks(self): diff --git a/Lib/bz2.py b/Lib/bz2.py index fabe4f73..2420cd01 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -17,7 +17,7 @@ import _compression from _bz2 import BZ2Compressor, BZ2Decompressor -_MODE_CLOSED = 0 +# Value 0 no longer used _MODE_READ = 1 # Value 2 no longer used _MODE_WRITE = 3 @@ -54,7 +54,7 @@ class BZ2File(_compression.BaseStream): """ self._fp = None self._closefp = False - self._mode = _MODE_CLOSED + self._mode = None if not (1 <= compresslevel <= 9): raise ValueError("compresslevel must be between 1 and 9") @@ -100,7 +100,7 @@ class BZ2File(_compression.BaseStream): May be called more than once without error. Once the file is closed, any other operation on it will raise a ValueError. """ - if self._mode == _MODE_CLOSED: + if self.closed: return try: if self._mode == _MODE_READ: @@ -115,13 +115,21 @@ class BZ2File(_compression.BaseStream): finally: self._fp = None self._closefp = False - self._mode = _MODE_CLOSED self._buffer = None @property def closed(self): """True if this file is closed.""" - return self._mode == _MODE_CLOSED + return self._fp is None + + @property + def name(self): + self._check_not_closed() + return self._fp.name + + @property + def mode(self): + return 'wb' if self._mode == _MODE_WRITE else 'rb' def fileno(self): """Return the file descriptor for the underlying file.""" diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 135a12c3..9c132372 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -41,7 +41,9 @@ class Profile(_lsprof.Profiler): def print_stats(self, sort=-1): import pstats - pstats.Stats(self).strip_dirs().sort_stats(sort).print_stats() + if not isinstance(sort, tuple): + sort = (sort,) + pstats.Stats(self).strip_dirs().sort_stats(*sort).print_stats() def dump_stats(self, file): import marshal diff --git a/Lib/calendar.py b/Lib/calendar.py index baab52a1..8c1c646d 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -10,7 +10,6 @@ import datetime from enum import IntEnum, global_enum import locale as _locale from itertools import repeat -import warnings __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday", "firstweekday", "isleap", "leapdays", "weekday", "monthrange", @@ -28,7 +27,9 @@ __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday", error = ValueError # Exceptions raised for bad input -class IllegalMonthError(ValueError): +# This is trick for backward compatibility. Since 3.13, we will raise IllegalMonthError instead of +# IndexError for bad month number(out of 1-12). But we can't remove IndexError for backward compatibility. +class IllegalMonthError(ValueError, IndexError): def __init__(self, month): self.month = month def __str__(self): @@ -44,6 +45,7 @@ class IllegalWeekdayError(ValueError): def __getattr__(name): if name in ('January', 'February'): + import warnings warnings.warn(f"The '{name}' attribute is deprecated, use '{name.upper()}' instead", DeprecationWarning, stacklevel=2) if name == 'January': @@ -158,11 +160,14 @@ def weekday(year, month, day): return Day(datetime.date(year, month, day).weekday()) -def monthrange(year, month): - """Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for - year, month.""" +def _validate_month(month): if not 1 <= month <= 12: raise IllegalMonthError(month) + +def monthrange(year, month): + """Return weekday of first day of month (0-6 ~ Mon-Sun) + and number of days (28-31) for year, month.""" + _validate_month(month) day1 = weekday(year, month, 1) ndays = mdays[month] + (month == FEBRUARY and isleap(year)) return day1, ndays @@ -370,6 +375,8 @@ class TextCalendar(Calendar): """ Return a formatted month name. """ + _validate_month(themonth) + s = month_name[themonth] if withyear: s = "%s %r" % (s, theyear) @@ -500,6 +507,7 @@ class HTMLCalendar(Calendar): """ Return a month name as a table row. """ + _validate_month(themonth) if withyear: s = '%s %s' % (month_name[themonth], theyear) else: @@ -585,8 +593,6 @@ class different_locale: _locale.setlocale(_locale.LC_TIME, self.locale) def __exit__(self, *args): - if self.oldlocale is None: - return _locale.setlocale(_locale.LC_TIME, self.oldlocale) @@ -690,7 +696,7 @@ def timegm(tuple): return seconds -def main(args): +def main(args=None): import argparse parser = argparse.ArgumentParser() textgroup = parser.add_argument_group('text only arguments') @@ -736,10 +742,15 @@ def main(args): choices=("text", "html"), help="output type (text or html)" ) + parser.add_argument( + "-f", "--first-weekday", + type=int, default=0, + help="weekday (0 is Monday, 6 is Sunday) to start each week (default 0)" + ) parser.add_argument( "year", nargs='?', type=int, - help="year number (1-9999)" + help="year number" ) parser.add_argument( "month", @@ -747,7 +758,7 @@ def main(args): help="month number (1-12, text only)" ) - options = parser.parse_args(args[1:]) + options = parser.parse_args(args) if options.locale and not options.encoding: parser.error("if --locale is specified --encoding is required") @@ -756,10 +767,14 @@ def main(args): locale = options.locale, options.encoding if options.type == "html": + if options.month: + parser.error("incorrect number of arguments") + sys.exit(1) if options.locale: cal = LocaleHTMLCalendar(locale=locale) else: cal = HTMLCalendar() + cal.setfirstweekday(options.first_weekday) encoding = options.encoding if encoding is None: encoding = sys.getdefaultencoding() @@ -767,20 +782,20 @@ def main(args): write = sys.stdout.buffer.write if options.year is None: write(cal.formatyearpage(datetime.date.today().year, **optdict)) - elif options.month is None: - write(cal.formatyearpage(options.year, **optdict)) else: - parser.error("incorrect number of arguments") - sys.exit(1) + write(cal.formatyearpage(options.year, **optdict)) else: if options.locale: cal = LocaleTextCalendar(locale=locale) else: cal = TextCalendar() + cal.setfirstweekday(options.first_weekday) optdict = dict(w=options.width, l=options.lines) if options.month is None: optdict["c"] = options.spacing optdict["m"] = options.months + if options.month is not None: + _validate_month(options.month) if options.year is None: result = cal.formatyear(datetime.date.today().year, **optdict) elif options.month is None: @@ -795,4 +810,4 @@ def main(args): if __name__ == "__main__": - main(sys.argv) + main() diff --git a/Lib/cgi.py b/Lib/cgi.py deleted file mode 100755 index 8787567b..00000000 --- a/Lib/cgi.py +++ /dev/null @@ -1,1012 +0,0 @@ -#! /usr/local/bin/python - -# NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is -# intentionally NOT "/usr/bin/env python". On many systems -# (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI -# scripts, and /usr/local/bin is the default directory where Python is -# installed, so /usr/bin/env would be unable to find python. Granted, -# binary installations by Linux vendors often install Python in -# /usr/bin. So let those vendors patch cgi.py to match their choice -# of installation. - -"""Support module for CGI (Common Gateway Interface) scripts. - -This module defines a number of utilities for use by CGI scripts -written in Python. - -The global variable maxlen can be set to an integer indicating the maximum size -of a POST request. POST requests larger than this size will result in a -ValueError being raised during parsing. The default value of this variable is 0, -meaning the request size is unlimited. -""" - -# History -# ------- -# -# Michael McLay started this module. Steve Majewski changed the -# interface to SvFormContentDict and FormContentDict. The multipart -# parsing was inspired by code submitted by Andreas Paepcke. Guido van -# Rossum rewrote, reformatted and documented the module and is currently -# responsible for its maintenance. -# - -__version__ = "2.6" - - -# Imports -# ======= - -from io import StringIO, BytesIO, TextIOWrapper -from collections.abc import Mapping -import sys -import os -import urllib.parse -from email.parser import FeedParser -from email.message import Message -import html -import locale -import tempfile -import warnings - -__all__ = ["MiniFieldStorage", "FieldStorage", "parse", "parse_multipart", - "parse_header", "test", "print_exception", "print_environ", - "print_form", "print_directory", "print_arguments", - "print_environ_usage"] - - -warnings._deprecated(__name__, remove=(3,13)) - -# Logging support -# =============== - -logfile = "" # Filename to log to, if not empty -logfp = None # File object to log to, if not None - -def initlog(*allargs): - """Write a log message, if there is a log file. - - Even though this function is called initlog(), you should always - use log(); log is a variable that is set either to initlog - (initially), to dolog (once the log file has been opened), or to - nolog (when logging is disabled). - - The first argument is a format string; the remaining arguments (if - any) are arguments to the % operator, so e.g. - log("%s: %s", "a", "b") - will write "a: b" to the log file, followed by a newline. - - If the global logfp is not None, it should be a file object to - which log data is written. - - If the global logfp is None, the global logfile may be a string - giving a filename to open, in append mode. This file should be - world writable!!! If the file can't be opened, logging is - silently disabled (since there is no safe place where we could - send an error message). - - """ - global log, logfile, logfp - warnings.warn("cgi.log() is deprecated as of 3.10. Use logging instead", - DeprecationWarning, stacklevel=2) - if logfile and not logfp: - try: - logfp = open(logfile, "a", encoding="locale") - except OSError: - pass - if not logfp: - log = nolog - else: - log = dolog - log(*allargs) - -def dolog(fmt, *args): - """Write a log message to the log file. See initlog() for docs.""" - logfp.write(fmt%args + "\n") - -def nolog(*allargs): - """Dummy function, assigned to log when logging is disabled.""" - pass - -def closelog(): - """Close the log file.""" - global log, logfile, logfp - logfile = '' - if logfp: - logfp.close() - logfp = None - log = initlog - -log = initlog # The current logging function - - -# Parsing functions -# ================= - -# Maximum input we will accept when REQUEST_METHOD is POST -# 0 ==> unlimited input -maxlen = 0 - -def parse(fp=None, environ=os.environ, keep_blank_values=0, - strict_parsing=0, separator='&'): - """Parse a query in the environment or from a file (default stdin) - - Arguments, all optional: - - fp : file pointer; default: sys.stdin.buffer - - environ : environment dictionary; default: os.environ - - keep_blank_values: flag indicating whether blank values in - percent-encoded forms should be treated as blank strings. - A true value indicates that blanks should be retained as - blank strings. The default false value indicates that - blank values are to be ignored and treated as if they were - not included. - - strict_parsing: flag indicating what to do with parsing errors. - If false (the default), errors are silently ignored. - If true, errors raise a ValueError exception. - - separator: str. The symbol to use for separating the query arguments. - Defaults to &. - """ - if fp is None: - fp = sys.stdin - - # field keys and values (except for files) are returned as strings - # an encoding is required to decode the bytes read from self.fp - if hasattr(fp,'encoding'): - encoding = fp.encoding - else: - encoding = 'latin-1' - - # fp.read() must return bytes - if isinstance(fp, TextIOWrapper): - fp = fp.buffer - - if not 'REQUEST_METHOD' in environ: - environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone - if environ['REQUEST_METHOD'] == 'POST': - ctype, pdict = parse_header(environ['CONTENT_TYPE']) - if ctype == 'multipart/form-data': - return parse_multipart(fp, pdict, separator=separator) - elif ctype == 'application/x-www-form-urlencoded': - clength = int(environ['CONTENT_LENGTH']) - if maxlen and clength > maxlen: - raise ValueError('Maximum content length exceeded') - qs = fp.read(clength).decode(encoding) - else: - qs = '' # Unknown content-type - if 'QUERY_STRING' in environ: - if qs: qs = qs + '&' - qs = qs + environ['QUERY_STRING'] - elif sys.argv[1:]: - if qs: qs = qs + '&' - qs = qs + sys.argv[1] - environ['QUERY_STRING'] = qs # XXX Shouldn't, really - elif 'QUERY_STRING' in environ: - qs = environ['QUERY_STRING'] - else: - if sys.argv[1:]: - qs = sys.argv[1] - else: - qs = "" - environ['QUERY_STRING'] = qs # XXX Shouldn't, really - return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing, - encoding=encoding, separator=separator) - - -def parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator='&'): - """Parse multipart input. - - Arguments: - fp : input file - pdict: dictionary containing other parameters of content-type header - encoding, errors: request encoding and error handler, passed to - FieldStorage - - Returns a dictionary just like parse_qs(): keys are the field names, each - value is a list of values for that field. For non-file fields, the value - is a list of strings. - """ - # RFC 2046, Section 5.1 : The "multipart" boundary delimiters are always - # represented as 7bit US-ASCII. - boundary = pdict['boundary'].decode('ascii') - ctype = "multipart/form-data; boundary={}".format(boundary) - headers = Message() - headers.set_type(ctype) - try: - headers['Content-Length'] = pdict['CONTENT-LENGTH'] - except KeyError: - pass - fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors, - environ={'REQUEST_METHOD': 'POST'}, separator=separator) - return {k: fs.getlist(k) for k in fs} - -def _parseparam(s): - while s[:1] == ';': - s = s[1:] - end = s.find(';') - while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: - end = s.find(';', end + 1) - if end < 0: - end = len(s) - f = s[:end] - yield f.strip() - s = s[end:] - -def parse_header(line): - """Parse a Content-type like header. - - Return the main content-type and a dictionary of options. - - """ - parts = _parseparam(';' + line) - key = parts.__next__() - pdict = {} - for p in parts: - i = p.find('=') - if i >= 0: - name = p[:i].strip().lower() - value = p[i+1:].strip() - if len(value) >= 2 and value[0] == value[-1] == '"': - value = value[1:-1] - value = value.replace('\\\\', '\\').replace('\\"', '"') - pdict[name] = value - return key, pdict - - -# Classes for field storage -# ========================= - -class MiniFieldStorage: - - """Like FieldStorage, for use when no file uploads are possible.""" - - # Dummy attributes - filename = None - list = None - type = None - file = None - type_options = {} - disposition = None - disposition_options = {} - headers = {} - - def __init__(self, name, value): - """Constructor from field name and value.""" - self.name = name - self.value = value - # self.file = StringIO(value) - - def __repr__(self): - """Return printable representation.""" - return "MiniFieldStorage(%r, %r)" % (self.name, self.value) - - -class FieldStorage: - - """Store a sequence of fields, reading multipart/form-data. - - This class provides naming, typing, files stored on disk, and - more. At the top level, it is accessible like a dictionary, whose - keys are the field names. (Note: None can occur as a field name.) - The items are either a Python list (if there's multiple values) or - another FieldStorage or MiniFieldStorage object. If it's a single - object, it has the following attributes: - - name: the field name, if specified; otherwise None - - filename: the filename, if specified; otherwise None; this is the - client side filename, *not* the file name on which it is - stored (that's a temporary file you don't deal with) - - value: the value as a *string*; for file uploads, this - transparently reads the file every time you request the value - and returns *bytes* - - file: the file(-like) object from which you can read the data *as - bytes* ; None if the data is stored a simple string - - type: the content-type, or None if not specified - - type_options: dictionary of options specified on the content-type - line - - disposition: content-disposition, or None if not specified - - disposition_options: dictionary of corresponding options - - headers: a dictionary(-like) object (sometimes email.message.Message or a - subclass thereof) containing *all* headers - - The class is subclassable, mostly for the purpose of overriding - the make_file() method, which is called internally to come up with - a file open for reading and writing. This makes it possible to - override the default choice of storing all files in a temporary - directory and unlinking them as soon as they have been opened. - - """ - def __init__(self, fp=None, headers=None, outerboundary=b'', - environ=os.environ, keep_blank_values=0, strict_parsing=0, - limit=None, encoding='utf-8', errors='replace', - max_num_fields=None, separator='&'): - """Constructor. Read multipart/* until last part. - - Arguments, all optional: - - fp : file pointer; default: sys.stdin.buffer - (not used when the request method is GET) - Can be : - 1. a TextIOWrapper object - 2. an object whose read() and readline() methods return bytes - - headers : header dictionary-like object; default: - taken from environ as per CGI spec - - outerboundary : terminating multipart boundary - (for internal use only) - - environ : environment dictionary; default: os.environ - - keep_blank_values: flag indicating whether blank values in - percent-encoded forms should be treated as blank strings. - A true value indicates that blanks should be retained as - blank strings. The default false value indicates that - blank values are to be ignored and treated as if they were - not included. - - strict_parsing: flag indicating what to do with parsing errors. - If false (the default), errors are silently ignored. - If true, errors raise a ValueError exception. - - limit : used internally to read parts of multipart/form-data forms, - to exit from the reading loop when reached. It is the difference - between the form content-length and the number of bytes already - read - - encoding, errors : the encoding and error handler used to decode the - binary stream to strings. Must be the same as the charset defined - for the page sending the form (content-type : meta http-equiv or - header) - - max_num_fields: int. If set, then __init__ throws a ValueError - if there are more than n fields read by parse_qsl(). - - """ - method = 'GET' - self.keep_blank_values = keep_blank_values - self.strict_parsing = strict_parsing - self.max_num_fields = max_num_fields - self.separator = separator - if 'REQUEST_METHOD' in environ: - method = environ['REQUEST_METHOD'].upper() - self.qs_on_post = None - if method == 'GET' or method == 'HEAD': - if 'QUERY_STRING' in environ: - qs = environ['QUERY_STRING'] - elif sys.argv[1:]: - qs = sys.argv[1] - else: - qs = "" - qs = qs.encode(locale.getpreferredencoding(), 'surrogateescape') - fp = BytesIO(qs) - if headers is None: - headers = {'content-type': - "application/x-www-form-urlencoded"} - if headers is None: - headers = {} - if method == 'POST': - # Set default content-type for POST to what's traditional - headers['content-type'] = "application/x-www-form-urlencoded" - if 'CONTENT_TYPE' in environ: - headers['content-type'] = environ['CONTENT_TYPE'] - if 'QUERY_STRING' in environ: - self.qs_on_post = environ['QUERY_STRING'] - if 'CONTENT_LENGTH' in environ: - headers['content-length'] = environ['CONTENT_LENGTH'] - else: - if not (isinstance(headers, (Mapping, Message))): - raise TypeError("headers must be mapping or an instance of " - "email.message.Message") - self.headers = headers - if fp is None: - self.fp = sys.stdin.buffer - # self.fp.read() must return bytes - elif isinstance(fp, TextIOWrapper): - self.fp = fp.buffer - else: - if not (hasattr(fp, 'read') and hasattr(fp, 'readline')): - raise TypeError("fp must be file pointer") - self.fp = fp - - self.encoding = encoding - self.errors = errors - - if not isinstance(outerboundary, bytes): - raise TypeError('outerboundary must be bytes, not %s' - % type(outerboundary).__name__) - self.outerboundary = outerboundary - - self.bytes_read = 0 - self.limit = limit - - # Process content-disposition header - cdisp, pdict = "", {} - if 'content-disposition' in self.headers: - cdisp, pdict = parse_header(self.headers['content-disposition']) - self.disposition = cdisp - self.disposition_options = pdict - self.name = None - if 'name' in pdict: - self.name = pdict['name'] - self.filename = None - if 'filename' in pdict: - self.filename = pdict['filename'] - self._binary_file = self.filename is not None - - # Process content-type header - # - # Honor any existing content-type header. But if there is no - # content-type header, use some sensible defaults. Assume - # outerboundary is "" at the outer level, but something non-false - # inside a multi-part. The default for an inner part is text/plain, - # but for an outer part it should be urlencoded. This should catch - # bogus clients which erroneously forget to include a content-type - # header. - # - # See below for what we do if there does exist a content-type header, - # but it happens to be something we don't understand. - if 'content-type' in self.headers: - ctype, pdict = parse_header(self.headers['content-type']) - elif self.outerboundary or method != 'POST': - ctype, pdict = "text/plain", {} - else: - ctype, pdict = 'application/x-www-form-urlencoded', {} - self.type = ctype - self.type_options = pdict - if 'boundary' in pdict: - self.innerboundary = pdict['boundary'].encode(self.encoding, - self.errors) - else: - self.innerboundary = b"" - - clen = -1 - if 'content-length' in self.headers: - try: - clen = int(self.headers['content-length']) - except ValueError: - pass - if maxlen and clen > maxlen: - raise ValueError('Maximum content length exceeded') - self.length = clen - if self.limit is None and clen >= 0: - self.limit = clen - - self.list = self.file = None - self.done = 0 - if ctype == 'application/x-www-form-urlencoded': - self.read_urlencoded() - elif ctype[:10] == 'multipart/': - self.read_multi(environ, keep_blank_values, strict_parsing) - else: - self.read_single() - - def __del__(self): - try: - self.file.close() - except AttributeError: - pass - - def __enter__(self): - return self - - def __exit__(self, *args): - self.file.close() - - def __repr__(self): - """Return a printable representation.""" - return "FieldStorage(%r, %r, %r)" % ( - self.name, self.filename, self.value) - - def __iter__(self): - return iter(self.keys()) - - def __getattr__(self, name): - if name != 'value': - raise AttributeError(name) - if self.file: - self.file.seek(0) - value = self.file.read() - self.file.seek(0) - elif self.list is not None: - value = self.list - else: - value = None - return value - - def __getitem__(self, key): - """Dictionary style indexing.""" - if self.list is None: - raise TypeError("not indexable") - found = [] - for item in self.list: - if item.name == key: found.append(item) - if not found: - raise KeyError(key) - if len(found) == 1: - return found[0] - else: - return found - - def getvalue(self, key, default=None): - """Dictionary style get() method, including 'value' lookup.""" - if key in self: - value = self[key] - if isinstance(value, list): - return [x.value for x in value] - else: - return value.value - else: - return default - - def getfirst(self, key, default=None): - """ Return the first value received.""" - if key in self: - value = self[key] - if isinstance(value, list): - return value[0].value - else: - return value.value - else: - return default - - def getlist(self, key): - """ Return list of received values.""" - if key in self: - value = self[key] - if isinstance(value, list): - return [x.value for x in value] - else: - return [value.value] - else: - return [] - - def keys(self): - """Dictionary style keys() method.""" - if self.list is None: - raise TypeError("not indexable") - return list(set(item.name for item in self.list)) - - def __contains__(self, key): - """Dictionary style __contains__ method.""" - if self.list is None: - raise TypeError("not indexable") - return any(item.name == key for item in self.list) - - def __len__(self): - """Dictionary style len(x) support.""" - return len(self.keys()) - - def __bool__(self): - if self.list is None: - raise TypeError("Cannot be converted to bool.") - return bool(self.list) - - def read_urlencoded(self): - """Internal: read data in query string format.""" - qs = self.fp.read(self.length) - if not isinstance(qs, bytes): - raise ValueError("%s should return bytes, got %s" \ - % (self.fp, type(qs).__name__)) - qs = qs.decode(self.encoding, self.errors) - if self.qs_on_post: - qs += '&' + self.qs_on_post - query = urllib.parse.parse_qsl( - qs, self.keep_blank_values, self.strict_parsing, - encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields, separator=self.separator) - self.list = [MiniFieldStorage(key, value) for key, value in query] - self.skip_lines() - - FieldStorageClass = None - - def read_multi(self, environ, keep_blank_values, strict_parsing): - """Internal: read a part that is itself multipart.""" - ib = self.innerboundary - if not valid_boundary(ib): - raise ValueError('Invalid boundary in multipart form: %r' % (ib,)) - self.list = [] - if self.qs_on_post: - query = urllib.parse.parse_qsl( - self.qs_on_post, self.keep_blank_values, self.strict_parsing, - encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields, separator=self.separator) - self.list.extend(MiniFieldStorage(key, value) for key, value in query) - - klass = self.FieldStorageClass or self.__class__ - first_line = self.fp.readline() # bytes - if not isinstance(first_line, bytes): - raise ValueError("%s should return bytes, got %s" \ - % (self.fp, type(first_line).__name__)) - self.bytes_read += len(first_line) - - # Ensure that we consume the file until we've hit our inner boundary - while (first_line.strip() != (b"--" + self.innerboundary) and - first_line): - first_line = self.fp.readline() - self.bytes_read += len(first_line) - - # Propagate max_num_fields into the sub class appropriately - max_num_fields = self.max_num_fields - if max_num_fields is not None: - max_num_fields -= len(self.list) - - while True: - parser = FeedParser() - hdr_text = b"" - while True: - data = self.fp.readline() - hdr_text += data - if not data.strip(): - break - if not hdr_text: - break - # parser takes strings, not bytes - self.bytes_read += len(hdr_text) - parser.feed(hdr_text.decode(self.encoding, self.errors)) - headers = parser.close() - - # Some clients add Content-Length for part headers, ignore them - if 'content-length' in headers: - del headers['content-length'] - - limit = None if self.limit is None \ - else self.limit - self.bytes_read - part = klass(self.fp, headers, ib, environ, keep_blank_values, - strict_parsing, limit, - self.encoding, self.errors, max_num_fields, self.separator) - - if max_num_fields is not None: - max_num_fields -= 1 - if part.list: - max_num_fields -= len(part.list) - if max_num_fields < 0: - raise ValueError('Max number of fields exceeded') - - self.bytes_read += part.bytes_read - self.list.append(part) - if part.done or self.bytes_read >= self.length > 0: - break - self.skip_lines() - - def read_single(self): - """Internal: read an atomic part.""" - if self.length >= 0: - self.read_binary() - self.skip_lines() - else: - self.read_lines() - self.file.seek(0) - - bufsize = 8*1024 # I/O buffering size for copy to file - - def read_binary(self): - """Internal: read binary data.""" - self.file = self.make_file() - todo = self.length - if todo >= 0: - while todo > 0: - data = self.fp.read(min(todo, self.bufsize)) # bytes - if not isinstance(data, bytes): - raise ValueError("%s should return bytes, got %s" - % (self.fp, type(data).__name__)) - self.bytes_read += len(data) - if not data: - self.done = -1 - break - self.file.write(data) - todo = todo - len(data) - - def read_lines(self): - """Internal: read lines until EOF or outerboundary.""" - if self._binary_file: - self.file = self.__file = BytesIO() # store data as bytes for files - else: - self.file = self.__file = StringIO() # as strings for other fields - if self.outerboundary: - self.read_lines_to_outerboundary() - else: - self.read_lines_to_eof() - - def __write(self, line): - """line is always bytes, not string""" - if self.__file is not None: - if self.__file.tell() + len(line) > 1000: - self.file = self.make_file() - data = self.__file.getvalue() - self.file.write(data) - self.__file = None - if self._binary_file: - # keep bytes - self.file.write(line) - else: - # decode to string - self.file.write(line.decode(self.encoding, self.errors)) - - def read_lines_to_eof(self): - """Internal: read lines until EOF.""" - while 1: - line = self.fp.readline(1<<16) # bytes - self.bytes_read += len(line) - if not line: - self.done = -1 - break - self.__write(line) - - def read_lines_to_outerboundary(self): - """Internal: read lines until outerboundary. - Data is read as bytes: boundaries and line ends must be converted - to bytes for comparisons. - """ - next_boundary = b"--" + self.outerboundary - last_boundary = next_boundary + b"--" - delim = b"" - last_line_lfend = True - _read = 0 - while 1: - - if self.limit is not None and 0 <= self.limit <= _read: - break - line = self.fp.readline(1<<16) # bytes - self.bytes_read += len(line) - _read += len(line) - if not line: - self.done = -1 - break - if delim == b"\r": - line = delim + line - delim = b"" - if line.startswith(b"--") and last_line_lfend: - strippedline = line.rstrip() - if strippedline == next_boundary: - break - if strippedline == last_boundary: - self.done = 1 - break - odelim = delim - if line.endswith(b"\r\n"): - delim = b"\r\n" - line = line[:-2] - last_line_lfend = True - elif line.endswith(b"\n"): - delim = b"\n" - line = line[:-1] - last_line_lfend = True - elif line.endswith(b"\r"): - # We may interrupt \r\n sequences if they span the 2**16 - # byte boundary - delim = b"\r" - line = line[:-1] - last_line_lfend = False - else: - delim = b"" - last_line_lfend = False - self.__write(odelim + line) - - def skip_lines(self): - """Internal: skip lines until outer boundary if defined.""" - if not self.outerboundary or self.done: - return - next_boundary = b"--" + self.outerboundary - last_boundary = next_boundary + b"--" - last_line_lfend = True - while True: - line = self.fp.readline(1<<16) - self.bytes_read += len(line) - if not line: - self.done = -1 - break - if line.endswith(b"--") and last_line_lfend: - strippedline = line.strip() - if strippedline == next_boundary: - break - if strippedline == last_boundary: - self.done = 1 - break - last_line_lfend = line.endswith(b'\n') - - def make_file(self): - """Overridable: return a readable & writable file. - - The file will be used as follows: - - data is written to it - - seek(0) - - data is read from it - - The file is opened in binary mode for files, in text mode - for other fields - - This version opens a temporary file for reading and writing, - and immediately deletes (unlinks) it. The trick (on Unix!) is - that the file can still be used, but it can't be opened by - another process, and it will automatically be deleted when it - is closed or when the current process terminates. - - If you want a more permanent file, you derive a class which - overrides this method. If you want a visible temporary file - that is nevertheless automatically deleted when the script - terminates, try defining a __del__ method in a derived class - which unlinks the temporary files you have created. - - """ - if self._binary_file: - return tempfile.TemporaryFile("wb+") - else: - return tempfile.TemporaryFile("w+", - encoding=self.encoding, newline = '\n') - - -# Test/debug code -# =============== - -def test(environ=os.environ): - """Robust test CGI script, usable as main program. - - Write minimal HTTP headers and dump all information provided to - the script in HTML form. - - """ - print("Content-type: text/html") - print() - sys.stderr = sys.stdout - try: - form = FieldStorage() # Replace with other classes to test those - print_directory() - print_arguments() - print_form(form) - print_environ(environ) - print_environ_usage() - def f(): - exec("testing print_exception() -- italics?") - def g(f=f): - f() - print("

What follows is a test, not an actual exception:

") - g() - except: - print_exception() - - print("

Second try with a small maxlen...

") - - global maxlen - maxlen = 50 - try: - form = FieldStorage() # Replace with other classes to test those - print_directory() - print_arguments() - print_form(form) - print_environ(environ) - except: - print_exception() - -def print_exception(type=None, value=None, tb=None, limit=None): - if type is None: - type, value, tb = sys.exc_info() - import traceback - print() - print("

Traceback (most recent call last):

") - list = traceback.format_tb(tb, limit) + \ - traceback.format_exception_only(type, value) - print("
%s%s
" % ( - html.escape("".join(list[:-1])), - html.escape(list[-1]), - )) - del tb - -def print_environ(environ=os.environ): - """Dump the shell environment as HTML.""" - keys = sorted(environ.keys()) - print() - print("

Shell Environment:

") - print("
") - for key in keys: - print("
", html.escape(key), "
", html.escape(environ[key])) - print("
") - print() - -def print_form(form): - """Dump the contents of a form as HTML.""" - keys = sorted(form.keys()) - print() - print("

Form Contents:

") - if not keys: - print("

No form fields.") - print("

") - for key in keys: - print("
" + html.escape(key) + ":", end=' ') - value = form[key] - print("" + html.escape(repr(type(value))) + "") - print("
" + html.escape(repr(value))) - print("
") - print() - -def print_directory(): - """Dump the current directory as HTML.""" - print() - print("

Current Working Directory:

") - try: - pwd = os.getcwd() - except OSError as msg: - print("OSError:", html.escape(str(msg))) - else: - print(html.escape(pwd)) - print() - -def print_arguments(): - print() - print("

Command Line Arguments:

") - print() - print(sys.argv) - print() - -def print_environ_usage(): - """Dump a list of environment variables used by CGI as HTML.""" - print(""" -

These environment variables could have been set:

-
    -
  • AUTH_TYPE -
  • CONTENT_LENGTH -
  • CONTENT_TYPE -
  • DATE_GMT -
  • DATE_LOCAL -
  • DOCUMENT_NAME -
  • DOCUMENT_ROOT -
  • DOCUMENT_URI -
  • GATEWAY_INTERFACE -
  • LAST_MODIFIED -
  • PATH -
  • PATH_INFO -
  • PATH_TRANSLATED -
  • QUERY_STRING -
  • REMOTE_ADDR -
  • REMOTE_HOST -
  • REMOTE_IDENT -
  • REMOTE_USER -
  • REQUEST_METHOD -
  • SCRIPT_NAME -
  • SERVER_NAME -
  • SERVER_PORT -
  • SERVER_PROTOCOL -
  • SERVER_ROOT -
  • SERVER_SOFTWARE -
-In addition, HTTP headers sent by the server may be passed in the -environment as well. Here are some common variable names: -
    -
  • HTTP_ACCEPT -
  • HTTP_CONNECTION -
  • HTTP_HOST -
  • HTTP_PRAGMA -
  • HTTP_REFERER -
  • HTTP_USER_AGENT -
-""") - - -# Utilities -# ========= - -def valid_boundary(s): - import re - if isinstance(s, bytes): - _vb_pattern = b"^[ -~]{0,200}[!-~]$" - else: - _vb_pattern = "^[ -~]{0,200}[!-~]$" - return re.match(_vb_pattern, s) - -# Invoke mainline -# =============== - -# Call test() when this file is run as a script (not imported as a module) -if __name__ == '__main__': - test() diff --git a/Lib/cgitb.py b/Lib/cgitb.py deleted file mode 100644 index f6b97f25..00000000 --- a/Lib/cgitb.py +++ /dev/null @@ -1,332 +0,0 @@ -"""More comprehensive traceback formatting for Python scripts. - -To enable this module, do: - - import cgitb; cgitb.enable() - -at the top of your script. The optional arguments to enable() are: - - display - if true, tracebacks are displayed in the web browser - logdir - if set, tracebacks are written to files in this directory - context - number of lines of source code to show for each stack frame - format - 'text' or 'html' controls the output format - -By default, tracebacks are displayed but not saved, the context is 5 lines -and the output format is 'html' (for backwards compatibility with the -original use of this module) - -Alternatively, if you have caught an exception and want cgitb to display it -for you, call cgitb.handler(). The optional argument to handler() is a -3-item tuple (etype, evalue, etb) just like the value of sys.exc_info(). -The default handler displays output as HTML. - -""" -import inspect -import keyword -import linecache -import os -import pydoc -import sys -import tempfile -import time -import tokenize -import traceback -import warnings -from html import escape as html_escape - -warnings._deprecated(__name__, remove=(3, 13)) - - -def reset(): - """Return a string that resets the CGI and browser to a known state.""" - return ''' - --> --> - - ''' - -__UNDEF__ = [] # a special sentinel object -def small(text): - if text: - return '' + text + '' - else: - return '' - -def strong(text): - if text: - return '' + text + '' - else: - return '' - -def grey(text): - if text: - return '' + text + '' - else: - return '' - -def lookup(name, frame, locals): - """Find the value for a given name in the given environment.""" - if name in locals: - return 'local', locals[name] - if name in frame.f_globals: - return 'global', frame.f_globals[name] - if '__builtins__' in frame.f_globals: - builtins = frame.f_globals['__builtins__'] - if isinstance(builtins, dict): - if name in builtins: - return 'builtin', builtins[name] - else: - if hasattr(builtins, name): - return 'builtin', getattr(builtins, name) - return None, __UNDEF__ - -def scanvars(reader, frame, locals): - """Scan one logical line of Python and look up values of variables used.""" - vars, lasttoken, parent, prefix, value = [], None, None, '', __UNDEF__ - for ttype, token, start, end, line in tokenize.generate_tokens(reader): - if ttype == tokenize.NEWLINE: break - if ttype == tokenize.NAME and token not in keyword.kwlist: - if lasttoken == '.': - if parent is not __UNDEF__: - value = getattr(parent, token, __UNDEF__) - vars.append((prefix + token, prefix, value)) - else: - where, value = lookup(token, frame, locals) - vars.append((token, where, value)) - elif token == '.': - prefix += lasttoken + '.' - parent = value - else: - parent, prefix = None, '' - lasttoken = token - return vars - -def html(einfo, context=5): - """Return a nice HTML document describing a given traceback.""" - etype, evalue, etb = einfo - if isinstance(etype, type): - etype = etype.__name__ - pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable - date = time.ctime(time.time()) - head = f''' - - - - - -
 
- 
-{html_escape(str(etype))}
-{pyver}
{date}
-

A problem occurred in a Python script. Here is the sequence of -function calls leading up to the error, in the order they occurred.

''' - - indent = '' + small(' ' * 5) + ' ' - frames = [] - records = inspect.getinnerframes(etb, context) - for frame, file, lnum, func, lines, index in records: - if file: - file = os.path.abspath(file) - link = '
%s' % (file, pydoc.html.escape(file)) - else: - file = link = '?' - args, varargs, varkw, locals = inspect.getargvalues(frame) - call = '' - if func != '?': - call = 'in ' + strong(pydoc.html.escape(func)) - if func != "": - call += inspect.formatargvalues(args, varargs, varkw, locals, - formatvalue=lambda value: '=' + pydoc.html.repr(value)) - - highlight = {} - def reader(lnum=[lnum]): - highlight[lnum[0]] = 1 - try: return linecache.getline(file, lnum[0]) - finally: lnum[0] += 1 - vars = scanvars(reader, frame, locals) - - rows = ['%s%s %s' % - (' ', link, call)] - if index is not None: - i = lnum - index - for line in lines: - num = small(' ' * (5-len(str(i))) + str(i)) + ' ' - if i in highlight: - line = '=>%s%s' % (num, pydoc.html.preformat(line)) - rows.append('%s' % line) - else: - line = '  %s%s' % (num, pydoc.html.preformat(line)) - rows.append('%s' % grey(line)) - i += 1 - - done, dump = {}, [] - for name, where, value in vars: - if name in done: continue - done[name] = 1 - if value is not __UNDEF__: - if where in ('global', 'builtin'): - name = ('%s ' % where) + strong(name) - elif where == 'local': - name = strong(name) - else: - name = where + strong(name.split('.')[-1]) - dump.append('%s = %s' % (name, pydoc.html.repr(value))) - else: - dump.append(name + ' undefined') - - rows.append('%s' % small(grey(', '.join(dump)))) - frames.append(''' - -%s
''' % '\n'.join(rows)) - - exception = ['

%s: %s' % (strong(pydoc.html.escape(str(etype))), - pydoc.html.escape(str(evalue)))] - for name in dir(evalue): - if name[:1] == '_': continue - value = pydoc.html.repr(getattr(evalue, name)) - exception.append('\n
%s%s =\n%s' % (indent, name, value)) - - return head + ''.join(frames) + ''.join(exception) + ''' - - - -''' % pydoc.html.escape( - ''.join(traceback.format_exception(etype, evalue, etb))) - -def text(einfo, context=5): - """Return a plain text document describing a given traceback.""" - etype, evalue, etb = einfo - if isinstance(etype, type): - etype = etype.__name__ - pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable - date = time.ctime(time.time()) - head = "%s\n%s\n%s\n" % (str(etype), pyver, date) + ''' -A problem occurred in a Python script. Here is the sequence of -function calls leading up to the error, in the order they occurred. -''' - - frames = [] - records = inspect.getinnerframes(etb, context) - for frame, file, lnum, func, lines, index in records: - file = file and os.path.abspath(file) or '?' - args, varargs, varkw, locals = inspect.getargvalues(frame) - call = '' - if func != '?': - call = 'in ' + func - if func != "": - call += inspect.formatargvalues(args, varargs, varkw, locals, - formatvalue=lambda value: '=' + pydoc.text.repr(value)) - - highlight = {} - def reader(lnum=[lnum]): - highlight[lnum[0]] = 1 - try: return linecache.getline(file, lnum[0]) - finally: lnum[0] += 1 - vars = scanvars(reader, frame, locals) - - rows = [' %s %s' % (file, call)] - if index is not None: - i = lnum - index - for line in lines: - num = '%5d ' % i - rows.append(num+line.rstrip()) - i += 1 - - done, dump = {}, [] - for name, where, value in vars: - if name in done: continue - done[name] = 1 - if value is not __UNDEF__: - if where == 'global': name = 'global ' + name - elif where != 'local': name = where + name.split('.')[-1] - dump.append('%s = %s' % (name, pydoc.text.repr(value))) - else: - dump.append(name + ' undefined') - - rows.append('\n'.join(dump)) - frames.append('\n%s\n' % '\n'.join(rows)) - - exception = ['%s: %s' % (str(etype), str(evalue))] - for name in dir(evalue): - value = pydoc.text.repr(getattr(evalue, name)) - exception.append('\n%s%s = %s' % (" "*4, name, value)) - - return head + ''.join(frames) + ''.join(exception) + ''' - -The above is a description of an error in a Python program. Here is -the original traceback: - -%s -''' % ''.join(traceback.format_exception(etype, evalue, etb)) - -class Hook: - """A hook to replace sys.excepthook that shows tracebacks in HTML.""" - - def __init__(self, display=1, logdir=None, context=5, file=None, - format="html"): - self.display = display # send tracebacks to browser if true - self.logdir = logdir # log tracebacks to files if not None - self.context = context # number of source code lines per frame - self.file = file or sys.stdout # place to send the output - self.format = format - - def __call__(self, etype, evalue, etb): - self.handle((etype, evalue, etb)) - - def handle(self, info=None): - info = info or sys.exc_info() - if self.format == "html": - self.file.write(reset()) - - formatter = (self.format=="html") and html or text - plain = False - try: - doc = formatter(info, self.context) - except: # just in case something goes wrong - doc = ''.join(traceback.format_exception(*info)) - plain = True - - if self.display: - if plain: - doc = pydoc.html.escape(doc) - self.file.write('

' + doc + '
\n') - else: - self.file.write(doc + '\n') - else: - self.file.write('

A problem occurred in a Python script.\n') - - if self.logdir is not None: - suffix = ['.txt', '.html'][self.format=="html"] - (fd, path) = tempfile.mkstemp(suffix=suffix, dir=self.logdir) - - try: - with os.fdopen(fd, 'w') as file: - file.write(doc) - msg = '%s contains the description of this error.' % path - except: - msg = 'Tried to save traceback to %s, but failed.' % path - - if self.format == 'html': - self.file.write('

%s

\n' % msg) - else: - self.file.write(msg + '\n') - try: - self.file.flush() - except: pass - -handler = Hook().handle -def enable(display=1, logdir=None, context=5, format="html"): - """Install an exception handler that formats tracebacks as HTML. - - The optional argument 'display' can be set to 0 to suppress sending the - traceback to the browser, and 'logdir' can be set to a directory to cause - tracebacks to be written to files there.""" - sys.excepthook = Hook(display=display, logdir=logdir, - context=context, format=format) diff --git a/Lib/chunk.py b/Lib/chunk.py deleted file mode 100644 index 618781ef..00000000 --- a/Lib/chunk.py +++ /dev/null @@ -1,173 +0,0 @@ -"""Simple class to read IFF chunks. - -An IFF chunk (used in formats such as AIFF, TIFF, RMFF (RealMedia File -Format)) has the following structure: - -+----------------+ -| ID (4 bytes) | -+----------------+ -| size (4 bytes) | -+----------------+ -| data | -| ... | -+----------------+ - -The ID is a 4-byte string which identifies the type of chunk. - -The size field (a 32-bit value, encoded using big-endian byte order) -gives the size of the whole chunk, including the 8-byte header. - -Usually an IFF-type file consists of one or more chunks. The proposed -usage of the Chunk class defined here is to instantiate an instance at -the start of each chunk and read from the instance until it reaches -the end, after which a new instance can be instantiated. At the end -of the file, creating a new instance will fail with an EOFError -exception. - -Usage: -while True: - try: - chunk = Chunk(file) - except EOFError: - break - chunktype = chunk.getname() - while True: - data = chunk.read(nbytes) - if not data: - pass - # do something with data - -The interface is file-like. The implemented methods are: -read, close, seek, tell, isatty. -Extra methods are: skip() (called by close, skips to the end of the chunk), -getname() (returns the name (ID) of the chunk) - -The __init__ method has one required argument, a file-like object -(including a chunk instance), and one optional argument, a flag which -specifies whether or not chunks are aligned on 2-byte boundaries. The -default is 1, i.e. aligned. -""" - -import warnings - -warnings._deprecated(__name__, remove=(3, 13)) - -class Chunk: - def __init__(self, file, align=True, bigendian=True, inclheader=False): - import struct - self.closed = False - self.align = align # whether to align to word (2-byte) boundaries - if bigendian: - strflag = '>' - else: - strflag = '<' - self.file = file - self.chunkname = file.read(4) - if len(self.chunkname) < 4: - raise EOFError - try: - self.chunksize = struct.unpack_from(strflag+'L', file.read(4))[0] - except struct.error: - raise EOFError from None - if inclheader: - self.chunksize = self.chunksize - 8 # subtract header - self.size_read = 0 - try: - self.offset = self.file.tell() - except (AttributeError, OSError): - self.seekable = False - else: - self.seekable = True - - def getname(self): - """Return the name (ID) of the current chunk.""" - return self.chunkname - - def getsize(self): - """Return the size of the current chunk.""" - return self.chunksize - - def close(self): - if not self.closed: - try: - self.skip() - finally: - self.closed = True - - def isatty(self): - if self.closed: - raise ValueError("I/O operation on closed file") - return False - - def seek(self, pos, whence=0): - """Seek to specified position into the chunk. - Default position is 0 (start of chunk). - If the file is not seekable, this will result in an error. - """ - - if self.closed: - raise ValueError("I/O operation on closed file") - if not self.seekable: - raise OSError("cannot seek") - if whence == 1: - pos = pos + self.size_read - elif whence == 2: - pos = pos + self.chunksize - if pos < 0 or pos > self.chunksize: - raise RuntimeError - self.file.seek(self.offset + pos, 0) - self.size_read = pos - - def tell(self): - if self.closed: - raise ValueError("I/O operation on closed file") - return self.size_read - - def read(self, size=-1): - """Read at most size bytes from the chunk. - If size is omitted or negative, read until the end - of the chunk. - """ - - if self.closed: - raise ValueError("I/O operation on closed file") - if self.size_read >= self.chunksize: - return b'' - if size < 0: - size = self.chunksize - self.size_read - if size > self.chunksize - self.size_read: - size = self.chunksize - self.size_read - data = self.file.read(size) - self.size_read = self.size_read + len(data) - if self.size_read == self.chunksize and \ - self.align and \ - (self.chunksize & 1): - dummy = self.file.read(1) - self.size_read = self.size_read + len(dummy) - return data - - def skip(self): - """Skip the rest of the chunk. - If you are not interested in the contents of the chunk, - this method should be called so that the file points to - the start of the next chunk. - """ - - if self.closed: - raise ValueError("I/O operation on closed file") - if self.seekable: - try: - n = self.chunksize - self.size_read - # maybe fix alignment - if self.align and (self.chunksize & 1): - n = n + 1 - self.file.seek(n, 1) - self.size_read = self.size_read + n - return - except OSError: - pass - while self.size_read < self.chunksize: - n = min(8192, self.chunksize - self.size_read) - dummy = self.read(n) - if not dummy: - raise EOFError diff --git a/Lib/cmd.py b/Lib/cmd.py index 88ee7d3d..a37d16cd 100644 --- a/Lib/cmd.py +++ b/Lib/cmd.py @@ -42,7 +42,7 @@ listings of documented functions, miscellaneous topics, and undocumented functions respectively. """ -import string, sys +import inspect, string, sys __all__ = ["Cmd"] @@ -108,7 +108,15 @@ class Cmd: import readline self.old_completer = readline.get_completer() readline.set_completer(self.complete) - readline.parse_and_bind(self.completekey+": complete") + if readline.backend == "editline": + if self.completekey == 'tab': + # libedit uses "^I" instead of "tab" + command_string = "bind ^I rl_complete" + else: + command_string = f"bind {self.completekey} rl_complete" + else: + command_string = f"{self.completekey}: complete" + readline.parse_and_bind(command_string) except ImportError: pass try: @@ -210,9 +218,8 @@ class Cmd: if cmd == '': return self.default(line) else: - try: - func = getattr(self, 'do_' + cmd) - except AttributeError: + func = getattr(self, 'do_' + cmd, None) + if func is None: return self.default(line) return func(arg) @@ -298,6 +305,7 @@ class Cmd: except AttributeError: try: doc=getattr(self, 'do_' + arg).__doc__ + doc = inspect.cleandoc(doc) if doc: self.stdout.write("%s\n"%str(doc)) return diff --git a/Lib/code.py b/Lib/code.py index 2bd5fa3e..2777c311 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -5,6 +5,7 @@ # Inspired by similar code by Jeff Epler and Fredrik Lundh. +import builtins import sys import traceback from codeop import CommandCompiler, compile_command @@ -12,6 +13,7 @@ from codeop import CommandCompiler, compile_command __all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", "compile_command"] + class InteractiveInterpreter: """Base class for InteractiveConsole. @@ -24,10 +26,10 @@ class InteractiveInterpreter: def __init__(self, locals=None): """Constructor. - The optional 'locals' argument specifies the dictionary in - which code will be executed; it defaults to a newly created - dictionary with key "__name__" set to "__console__" and key - "__doc__" set to None. + The optional 'locals' argument specifies a mapping to use as the + namespace in which code will be executed; it defaults to a newly + created dictionary with key "__name__" set to "__console__" and + key "__doc__" set to None. """ if locals is None: @@ -63,7 +65,7 @@ class InteractiveInterpreter: code = self.compile(source, filename, symbol) except (OverflowError, SyntaxError, ValueError): # Case 1 - self.showsyntaxerror(filename) + self.showsyntaxerror(filename, source=source) return False if code is None: @@ -93,7 +95,7 @@ class InteractiveInterpreter: except: self.showtraceback() - def showsyntaxerror(self, filename=None): + def showsyntaxerror(self, filename=None, **kwargs): """Display the syntax error that just occurred. This doesn't display a stack trace because there isn't one. @@ -105,29 +107,14 @@ class InteractiveInterpreter: The output is written by self.write(), below. """ - type, value, tb = sys.exc_info() - sys.last_exc = value - sys.last_type = type - sys.last_value = value - sys.last_traceback = tb - if filename and type is SyntaxError: - # Work hard to stuff the correct filename in the exception - try: - msg, (dummy_filename, lineno, offset, line) = value.args - except ValueError: - # Not the format we expect; leave it alone - pass - else: - # Stuff in the right filename - value = SyntaxError(msg, (filename, lineno, offset, line)) - sys.last_exc = sys.last_value = value - if sys.excepthook is sys.__excepthook__: - lines = traceback.format_exception_only(type, value) - self.write(''.join(lines)) - else: - # If someone has set sys.excepthook, we let that take precedence - # over self.write - sys.excepthook(type, value, tb) + try: + typ, value, tb = sys.exc_info() + if filename and issubclass(typ, SyntaxError): + value.filename = filename + source = kwargs.pop('source', "") + self._showtraceback(typ, value, None, source) + finally: + typ = value = tb = None def showtraceback(self): """Display the exception that just occurred. @@ -137,19 +124,46 @@ class InteractiveInterpreter: The output is written by self.write(), below. """ - sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() - sys.last_traceback = last_tb - sys.last_exc = ei[1] try: - lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) - if sys.excepthook is sys.__excepthook__: - self.write(''.join(lines)) - else: - # If someone has set sys.excepthook, we let that take precedence - # over self.write - sys.excepthook(ei[0], ei[1], last_tb) + typ, value, tb = sys.exc_info() + self._showtraceback(typ, value, tb.tb_next, '') finally: - last_tb = ei = None + typ = value = tb = None + + def _showtraceback(self, typ, value, tb, source): + sys.last_type = typ + sys.last_traceback = tb + value = value.with_traceback(tb) + # Set the line of text that the exception refers to + lines = source.splitlines() + if (source and typ is SyntaxError + and not value.text and value.lineno is not None + and len(lines) >= value.lineno): + value.text = lines[value.lineno - 1] + sys.last_exc = sys.last_value = value = value.with_traceback(tb) + if sys.excepthook is sys.__excepthook__: + self._excepthook(typ, value, tb) + else: + # If someone has set sys.excepthook, we let that take precedence + # over self.write + try: + sys.excepthook(typ, value, tb) + except SystemExit: + raise + except BaseException as e: + e.__context__ = None + e = e.with_traceback(e.__traceback__.tb_next) + print('Error in sys.excepthook:', file=sys.stderr) + sys.__excepthook__(type(e), e, e.__traceback__) + print(file=sys.stderr) + print('Original exception was:', file=sys.stderr) + sys.__excepthook__(typ, value, tb) + + def _excepthook(self, typ, value, tb): + # This method is being overwritten in + # _pyrepl.console.InteractiveColoredConsole + lines = traceback.format_exception(typ, value, tb) + self.write(''.join(lines)) def write(self, data): """Write a string. @@ -169,7 +183,7 @@ class InteractiveConsole(InteractiveInterpreter): """ - def __init__(self, locals=None, filename=""): + def __init__(self, locals=None, filename="", *, local_exit=False): """Constructor. The optional locals argument will be passed to the @@ -181,6 +195,7 @@ class InteractiveConsole(InteractiveInterpreter): """ InteractiveInterpreter.__init__(self, locals) self.filename = filename + self.local_exit = local_exit self.resetbuffer() def resetbuffer(self): @@ -219,29 +234,66 @@ class InteractiveConsole(InteractiveInterpreter): elif banner: self.write("%s\n" % str(banner)) more = 0 - while 1: - try: - if more: - prompt = sys.ps2 - else: - prompt = sys.ps1 + + # When the user uses exit() or quit() in their interactive shell + # they probably just want to exit the created shell, not the whole + # process. exit and quit in builtins closes sys.stdin which makes + # it super difficult to restore + # + # When self.local_exit is True, we overwrite the builtins so + # exit() and quit() only raises SystemExit and we can catch that + # to only exit the interactive shell + + _exit = None + _quit = None + + if self.local_exit: + if hasattr(builtins, "exit"): + _exit = builtins.exit + builtins.exit = Quitter("exit") + + if hasattr(builtins, "quit"): + _quit = builtins.quit + builtins.quit = Quitter("quit") + + try: + while True: try: - line = self.raw_input(prompt) - except EOFError: - self.write("\n") - break - else: - more = self.push(line) - except KeyboardInterrupt: - self.write("\nKeyboardInterrupt\n") - self.resetbuffer() - more = 0 - if exitmsg is None: - self.write('now exiting %s...\n' % self.__class__.__name__) - elif exitmsg != '': - self.write('%s\n' % exitmsg) - - def push(self, line): + if more: + prompt = sys.ps2 + else: + prompt = sys.ps1 + try: + line = self.raw_input(prompt) + except EOFError: + self.write("\n") + break + else: + more = self.push(line) + except KeyboardInterrupt: + self.write("\nKeyboardInterrupt\n") + self.resetbuffer() + more = 0 + except SystemExit as e: + if self.local_exit: + self.write("\n") + break + else: + raise e + finally: + # restore exit and quit in builtins if they were modified + if _exit is not None: + builtins.exit = _exit + + if _quit is not None: + builtins.quit = _quit + + if exitmsg is None: + self.write('now exiting %s...\n' % self.__class__.__name__) + elif exitmsg != '': + self.write('%s\n' % exitmsg) + + def push(self, line, filename=None, _symbol="single"): """Push a line to the interpreter. The line should not have a trailing newline; it may have @@ -257,7 +309,9 @@ class InteractiveConsole(InteractiveInterpreter): """ self.buffer.append(line) source = "\n".join(self.buffer) - more = self.runsource(source, self.filename) + if filename is None: + filename = self.filename + more = self.runsource(source, filename, symbol=_symbol) if not more: self.resetbuffer() return more @@ -276,8 +330,22 @@ class InteractiveConsole(InteractiveInterpreter): return input(prompt) +class Quitter: + def __init__(self, name): + self.name = name + if sys.platform == "win32": + self.eof = 'Ctrl-Z plus Return' + else: + self.eof = 'Ctrl-D (i.e. EOF)' + + def __repr__(self): + return f'Use {self.name} or {self.eof} to exit' + + def __call__(self, code=None): + raise SystemExit(code) + -def interact(banner=None, readfunc=None, local=None, exitmsg=None): +def interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False): """Closely emulate the interactive Python interpreter. This is a backwards compatible interface to the InteractiveConsole @@ -290,9 +358,10 @@ def interact(banner=None, readfunc=None, local=None, exitmsg=None): readfunc -- if not None, replaces InteractiveConsole.raw_input() local -- passed to InteractiveInterpreter.__init__() exitmsg -- passed to InteractiveConsole.interact() + local_exit -- passed to InteractiveConsole.__init__() """ - console = InteractiveConsole(local) + console = InteractiveConsole(local, local_exit=local_exit) if readfunc is not None: console.raw_input = readfunc else: @@ -308,7 +377,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-q', action='store_true', - help="don't print version and copyright messages") + help="don't print version and copyright messages") args = parser.parse_args() if args.q or sys.flags.quiet: banner = '' diff --git a/Lib/codecs.py b/Lib/codecs.py index c1c55d8a..9b35b612 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -111,6 +111,9 @@ class CodecInfo(tuple): (self.__class__.__module__, self.__class__.__qualname__, self.name, id(self)) + def __getnewargs__(self): + return tuple(self) + class Codec: """ Defines the interface for stateless encoders/decoders. @@ -414,6 +417,9 @@ class StreamWriter(Codec): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReader(Codec): @@ -663,6 +669,9 @@ class StreamReader(Codec): def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamReaderWriter: @@ -750,6 +759,9 @@ class StreamReaderWriter: def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### class StreamRecoder: @@ -866,6 +878,9 @@ class StreamRecoder: def __exit__(self, type, value, tb): self.stream.close() + def __reduce_ex__(self, proto): + raise TypeError("can't serialize %s" % self.__class__.__name__) + ### Shortcuts def open(filename, mode='r', encoding=None, errors='strict', buffering=-1): diff --git a/Lib/codeop.py b/Lib/codeop.py index 2213b69f..adf000ba 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -44,6 +44,7 @@ __all__ = ["compile_command", "Compile", "CommandCompiler"] # Caveat emptor: These flags are undocumented on purpose and depending # on their effect outside the standard library is **unsupported**. PyCF_DONT_IMPLY_DEDENT = 0x200 +PyCF_ONLY_AST = 0x400 PyCF_ALLOW_INCOMPLETE_INPUT = 0x4000 def _maybe_compile(compiler, source, filename, symbol): @@ -65,25 +66,20 @@ def _maybe_compile(compiler, source, filename, symbol): try: compiler(source + "\n", filename, symbol) return None + except _IncompleteInputError as e: + return None except SyntaxError as e: - if "incomplete input" in str(e): - return None + pass # fallthrough - return compiler(source, filename, symbol) - - -def _is_syntax_error(err1, err2): - rep1 = repr(err1) - rep2 = repr(err2) - if "was never closed" in rep1 and "was never closed" in rep2: - return False - if rep1 == rep2: - return True - return False + return compiler(source, filename, symbol, incomplete_input=False) -def _compile(source, filename, symbol): - return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT | PyCF_ALLOW_INCOMPLETE_INPUT) +def _compile(source, filename, symbol, incomplete_input=True): + flags = 0 + if incomplete_input: + flags |= PyCF_ALLOW_INCOMPLETE_INPUT + flags |= PyCF_DONT_IMPLY_DEDENT + return compile(source, filename, symbol, flags) def compile_command(source, filename="", symbol="single"): r"""Compile a command and determine whether it is incomplete. @@ -114,8 +110,14 @@ class Compile: def __init__(self): self.flags = PyCF_DONT_IMPLY_DEDENT | PyCF_ALLOW_INCOMPLETE_INPUT - def __call__(self, source, filename, symbol): - codeob = compile(source, filename, symbol, self.flags, True) + def __call__(self, source, filename, symbol, flags=0, **kwargs): + flags |= self.flags + if kwargs.get('incomplete_input', True) is False: + flags &= ~PyCF_DONT_IMPLY_DEDENT + flags &= ~PyCF_ALLOW_INCOMPLETE_INPUT + codeob = compile(source, filename, symbol, flags, True) + if flags & PyCF_ONLY_AST: + return codeob # this is an ast.Module in this case for feature in _features: if codeob.co_flags & feature.compiler_flag: self.flags |= feature.compiler_flag diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 8652dc8a..d29afffe 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -29,6 +29,9 @@ __all__ = [ import _collections_abc import sys as _sys +_sys.modules['collections.abc'] = _collections_abc +abc = _collections_abc + from itertools import chain as _chain from itertools import repeat as _repeat from itertools import starmap as _starmap @@ -457,7 +460,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non def _replace(self, /, **kwds): result = self._make(_map(kwds.pop, field_names, self)) if kwds: - raise ValueError(f'Got unexpected field names: {list(kwds)!r}') + raise TypeError(f'Got unexpected field names: {list(kwds)!r}') return result _replace.__doc__ = (f'Return a new {typename} object replacing specified ' @@ -495,6 +498,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non '_field_defaults': field_defaults, '__new__': __new__, '_make': _make, + '__replace__': _replace, '_replace': _replace, '__repr__': __repr__, '_asdict': _asdict, @@ -638,7 +642,8 @@ class Counter(dict): >>> sorted(c.elements()) ['A', 'A', 'B', 'B', 'C', 'C'] - # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + >>> import math >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) >>> math.prod(prime_factors.elements()) @@ -679,7 +684,7 @@ class Counter(dict): ''' # The regular dict.update() operation makes no sense here because the - # replace behavior results in the some of original untouched counts + # replace behavior results in some of the original untouched counts # being mixed-in with all of the other counts for a mismash that # doesn't have a straight-forward interpretation in most counting # contexts. Instead, we implement straight-addition. Both the inputs @@ -1036,9 +1041,9 @@ class ChainMap(_collections_abc.MutableMapping): return f'{self.__class__.__name__}({", ".join(map(repr, self.maps))})' @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) + def fromkeys(cls, iterable, value=None, /): + 'Create a new ChainMap with keys from iterable and values set to value.' + return cls(dict.fromkeys(iterable, value)) def copy(self): 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py deleted file mode 100644 index 86ca8b8a..00000000 --- a/Lib/collections/abc.py +++ /dev/null @@ -1,3 +0,0 @@ -from _collections_abc import * -from _collections_abc import __all__ -from _collections_abc import _CallableGenericAlias diff --git a/Lib/colorsys.py b/Lib/colorsys.py index bc897bd0..e97f9171 100644 --- a/Lib/colorsys.py +++ b/Lib/colorsys.py @@ -24,7 +24,7 @@ HSV: Hue, Saturation, Value __all__ = ["rgb_to_yiq","yiq_to_rgb","rgb_to_hls","hls_to_rgb", "rgb_to_hsv","hsv_to_rgb"] -# Some floating point constants +# Some floating-point constants ONE_THIRD = 1.0/3.0 ONE_SIXTH = 1.0/6.0 diff --git a/Lib/compileall.py b/Lib/compileall.py index d394156c..47e24463 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -116,7 +116,8 @@ def compile_dir(dir, maxlevels=None, ddir=None, force=False, prependdir=prependdir, limit_sl_dest=limit_sl_dest, hardlink_dupes=hardlink_dupes), - files) + files, + chunksize=4) success = min(results, default=True) else: for file in files: @@ -172,13 +173,13 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, if stripdir is not None: fullname_parts = fullname.split(os.path.sep) stripdir_parts = stripdir.split(os.path.sep) - ddir_parts = list(fullname_parts) - for spart, opart in zip(stripdir_parts, fullname_parts): - if spart == opart: - ddir_parts.remove(spart) - - dfile = os.path.join(*ddir_parts) + if stripdir_parts != fullname_parts[:len(stripdir_parts)]: + if quiet < 2: + print("The stripdir path {!r} is not a valid prefix for " + "source path {!r}; ignoring".format(stripdir, fullname)) + else: + dfile = os.path.join(*fullname_parts[len(stripdir_parts):]) if prependdir is not None: if dfile is None: diff --git a/Lib/concurrent/futures/__init__.py b/Lib/concurrent/futures/__init__.py index 292e886d..72de617a 100644 --- a/Lib/concurrent/futures/__init__.py +++ b/Lib/concurrent/futures/__init__.py @@ -23,6 +23,7 @@ __all__ = ( 'ALL_COMPLETED', 'CancelledError', 'TimeoutError', + 'InvalidStateError', 'BrokenExecutor', 'Future', 'Executor', diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 301207f5..d73ef716 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -68,22 +68,31 @@ _global_shutdown = False class _ThreadWakeup: def __init__(self): self._closed = False + self._lock = threading.Lock() self._reader, self._writer = mp.Pipe(duplex=False) def close(self): - if not self._closed: - self._closed = True - self._writer.close() - self._reader.close() + # Please note that we do not take the self._lock when + # calling clear() (to avoid deadlocking) so this method can + # only be called safely from the same thread as all calls to + # clear() even if you hold the lock. Otherwise we + # might try to read from the closed pipe. + with self._lock: + if not self._closed: + self._closed = True + self._writer.close() + self._reader.close() def wakeup(self): - if not self._closed: - self._writer.send_bytes(b"") + with self._lock: + if not self._closed: + self._writer.send_bytes(b"") def clear(self): - if not self._closed: - while self._reader.poll(): - self._reader.recv_bytes() + if self._closed: + raise RuntimeError('operation on closed _ThreadWakeup') + while self._reader.poll(): + self._reader.recv_bytes() def _python_exit(): @@ -162,10 +171,8 @@ class _CallItem(object): class _SafeQueue(Queue): """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items, shutdown_lock, - thread_wakeup): + def __init__(self, max_size=0, *, ctx, pending_work_items, thread_wakeup): self.pending_work_items = pending_work_items - self.shutdown_lock = shutdown_lock self.thread_wakeup = thread_wakeup super().__init__(max_size, ctx=ctx) @@ -174,8 +181,7 @@ class _SafeQueue(Queue): tb = format_exception(type(e), e, e.__traceback__) e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) work_item = self.pending_work_items.pop(obj.work_id, None) - with self.shutdown_lock: - self.thread_wakeup.wakeup() + self.thread_wakeup.wakeup() # work_item can be None if another process terminated. In this # case, the executor_manager_thread fails all work_items # with BrokenProcessPool @@ -185,16 +191,6 @@ class _SafeQueue(Queue): super()._on_queue_feeder_error(e, obj) -def _get_chunks(*iterables, chunksize): - """ Iterates over zip()ed iterables in chunks. """ - it = zip(*iterables) - while True: - chunk = tuple(itertools.islice(it, chunksize)) - if not chunk: - return - yield chunk - - def _process_chunk(fn, chunk): """ Processes a chunk of an iterable passed to map. @@ -301,11 +297,10 @@ class _ExecutorManagerThread(threading.Thread): # if there is no pending work item. def weakref_cb(_, thread_wakeup=self.thread_wakeup, - shutdown_lock=self.shutdown_lock): - mp.util.debug('Executor collected: triggering callback for' + mp_util_debug=mp.util.debug): + mp_util_debug('Executor collected: triggering callback for' ' QueueManager wakeup') - with shutdown_lock: - thread_wakeup.wakeup() + thread_wakeup.wakeup() self.executor_reference = weakref.ref(executor, weakref_cb) @@ -336,7 +331,14 @@ class _ExecutorManagerThread(threading.Thread): # Main loop for the executor manager thread. while True: - self.add_call_item_to_queue() + # gh-109047: During Python finalization, self.call_queue.put() + # creation of a thread can fail with RuntimeError. + try: + self.add_call_item_to_queue() + except BaseException as exc: + cause = format_exception(exc) + self.terminate_broken(cause) + return result_item, is_broken, cause = self.wait_result_broken_or_wakeup() @@ -420,14 +422,13 @@ class _ExecutorManagerThread(threading.Thread): try: result_item = result_reader.recv() is_broken = False - except BaseException as e: - cause = format_exception(type(e), e, e.__traceback__) + except BaseException as exc: + cause = format_exception(exc) elif wakeup_reader in ready: is_broken = False - with self.shutdown_lock: - self.thread_wakeup.clear() + self.thread_wakeup.clear() return result_item, is_broken, cause @@ -435,24 +436,14 @@ class _ExecutorManagerThread(threading.Thread): # Process the received a result_item. This can be either the PID of a # worker that exited gracefully or a _ResultItem - if isinstance(result_item, int): - # Clean shutdown of a worker using its PID - # (avoids marking the executor broken) - assert self.is_shutting_down() - p = self.processes.pop(result_item) - p.join() - if not self.processes: - self.join_executor_internals() - return - else: - # Received a _ResultItem so mark the future as completed. - work_item = self.pending_work_items.pop(result_item.work_id, None) - # work_item can be None if another process terminated (see above) - if work_item is not None: - if result_item.exception: - work_item.future.set_exception(result_item.exception) - else: - work_item.future.set_result(result_item.result) + # Received a _ResultItem so mark the future as completed. + work_item = self.pending_work_items.pop(result_item.work_id, None) + # work_item can be None if another process terminated (see above) + if work_item is not None: + if result_item.exception: + work_item.future.set_exception(result_item.exception) + else: + work_item.future.set_result(result_item.result) def is_shutting_down(self): # Check whether we should start shutting down the executor. @@ -464,7 +455,7 @@ class _ExecutorManagerThread(threading.Thread): return (_global_shutdown or executor is None or executor._shutdown_thread) - def terminate_broken(self, cause): + def _terminate_broken(self, cause): # Terminate the executor because it is in a broken state. The cause # argument can be used to display more information on the error that # lead the executor into becoming broken. @@ -489,7 +480,14 @@ class _ExecutorManagerThread(threading.Thread): # Mark pending tasks as failed. for work_id, work_item in self.pending_work_items.items(): - work_item.future.set_exception(bpe) + try: + work_item.future.set_exception(bpe) + except _base.InvalidStateError: + # set_exception() fails if the future is cancelled: ignore it. + # Trying to check if the future is cancelled before calling + # set_exception() would leave a race condition if the future is + # cancelled between the check and set_exception(). + pass # Delete references to object. See issue16284 del work_item self.pending_work_items.clear() @@ -499,12 +497,14 @@ class _ExecutorManagerThread(threading.Thread): for p in self.processes.values(): p.terminate() - # Prevent queue writing to a pipe which is no longer read. - # https://github.com/python/cpython/issues/94777 - self.call_queue._reader.close() + self.call_queue._terminate_broken() # clean up resources - self.join_executor_internals() + self._join_executor_internals(broken=True) + + def terminate_broken(self, cause): + with self.shutdown_lock: + self._terminate_broken(cause) def flag_executor_shutting_down(self): # Flag the executor as shutting down and cancel remaining tasks if @@ -547,15 +547,24 @@ class _ExecutorManagerThread(threading.Thread): break def join_executor_internals(self): - self.shutdown_workers() + with self.shutdown_lock: + self._join_executor_internals() + + def _join_executor_internals(self, broken=False): + # If broken, call_queue was closed and so can no longer be used. + if not broken: + self.shutdown_workers() + # Release the queue's resources as soon as possible. self.call_queue.close() self.call_queue.join_thread() - with self.shutdown_lock: - self.thread_wakeup.close() + self.thread_wakeup.close() + # If .join() is not called on the created processes then # some ctx.Queue methods may deadlock on Mac OS X. for p in self.processes.values(): + if broken: + p.terminate() p.join() def get_n_children_alive(self): @@ -642,7 +651,7 @@ class ProcessPoolExecutor(_base.Executor): _check_system_limits() if max_workers is None: - self._max_workers = os.cpu_count() or 1 + self._max_workers = os.process_cpu_count() or 1 if sys.platform == 'win32': self._max_workers = min(_MAX_WINDOWS_WORKERS, self._max_workers) @@ -706,7 +715,9 @@ class ProcessPoolExecutor(_base.Executor): # as it could result in a deadlock if a worker process dies with the # _result_queue write lock still acquired. # - # _shutdown_lock must be locked to access _ThreadWakeup. + # Care must be taken to only call clear and close from the + # executor_manager_thread, since _ThreadWakeup.clear() is not protected + # by a lock. self._executor_manager_thread_wakeup = _ThreadWakeup() # Create communication channels for the executor @@ -717,7 +728,6 @@ class ProcessPoolExecutor(_base.Executor): self._call_queue = _SafeQueue( max_size=queue_size, ctx=self._mp_context, pending_work_items=self._pending_work_items, - shutdown_lock=self._shutdown_lock, thread_wakeup=self._executor_manager_thread_wakeup) # Killed worker processes can produce spurious "broken pipe" # tracebacks in the queue's own worker thread. But we detect killed @@ -820,7 +830,7 @@ class ProcessPoolExecutor(_base.Executor): raise ValueError("chunksize must be >= 1.") results = super().map(partial(_process_chunk, fn), - _get_chunks(*iterables, chunksize=chunksize), + itertools.batched(zip(*iterables), chunksize), timeout=timeout) return _chain_from_iterable_of_lists(results) diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 3b3a36a5..9021dde4 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -41,6 +41,7 @@ if hasattr(os, 'register_at_fork'): os.register_at_fork(before=_global_shutdown_lock.acquire, after_in_child=_global_shutdown_lock._at_fork_reinit, after_in_parent=_global_shutdown_lock.release) + os.register_at_fork(after_in_child=_threads_queues.clear) class _WorkItem: @@ -139,10 +140,10 @@ class ThreadPoolExecutor(_base.Executor): # * CPU bound task which releases GIL # * I/O bound task (which releases GIL, of course) # - # We use cpu_count + 4 for both types of tasks. + # We use process_cpu_count + 4 for both types of tasks. # But we limit it to 32 to avoid consuming surprisingly large resource # on many core machine. - max_workers = min(32, (os.cpu_count() or 1) + 4) + max_workers = min(32, (os.process_cpu_count() or 1) + 4) if max_workers <= 0: raise ValueError("max_workers must be greater than 0") diff --git a/Lib/configparser.py b/Lib/configparser.py index e8aae217..ff7d712b 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -18,8 +18,8 @@ ConfigParser -- responsible for parsing a list of delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section='DEFAULT', - interpolation=, converters=): - + interpolation=, converters=, + allow_unnamed_section=False): Create the parser. When `defaults` is given, it is initialized into the dictionary or intrinsic defaults. The keys must be strings, the values must be appropriate for %()s string interpolation. @@ -68,6 +68,10 @@ ConfigParser -- responsible for parsing a list of converter gets its corresponding get*() method on the parser object and section proxies. + When `allow_unnamed_section` is True (default: False), options + without section are accepted: the section for these is + ``configparser.UNNAMED_SECTION``. + sections() Return all the configuration section names, sans DEFAULT. @@ -139,24 +143,28 @@ ConfigParser -- responsible for parsing a list of between keys and values are surrounded by spaces. """ -from collections.abc import MutableMapping +# Do not import dataclasses; overhead is unacceptable (gh-117703) + +from collections.abc import Iterable, MutableMapping from collections import ChainMap as _ChainMap +import contextlib import functools import io import itertools import os import re import sys -import warnings +import types __all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError", "NoOptionError", "InterpolationError", "InterpolationDepthError", "InterpolationMissingOptionError", "InterpolationSyntaxError", "ParsingError", "MissingSectionHeaderError", + "MultilineContinuationError", "ConfigParser", "RawConfigParser", "Interpolation", "BasicInterpolation", "ExtendedInterpolation", - "LegacyInterpolation", "SectionProxy", "ConverterMapping", - "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH") + "SectionProxy", "ConverterMapping", + "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH", "UNNAMED_SECTION") _default_dict = dict DEFAULTSECT = "DEFAULT" @@ -298,15 +306,33 @@ class InterpolationDepthError(InterpolationError): class ParsingError(Error): """Raised when a configuration file does not follow legal syntax.""" - def __init__(self, source): + def __init__(self, source, *args): super().__init__(f'Source contains parsing errors: {source!r}') self.source = source self.errors = [] self.args = (source, ) + if args: + self.append(*args) def append(self, lineno, line): self.errors.append((lineno, line)) - self.message += '\n\t[line %2d]: %s' % (lineno, line) + self.message += '\n\t[line %2d]: %s' % (lineno, repr(line)) + + def combine(self, others): + for other in others: + for error in other.errors: + self.append(*error) + return self + + @staticmethod + def _raise_all(exceptions: Iterable['ParsingError']): + """ + Combine any number of ParsingErrors into one and raise it. + """ + exceptions = iter(exceptions) + with contextlib.suppress(StopIteration): + raise next(exceptions).combine(exceptions) + class MissingSectionHeaderError(ParsingError): @@ -323,6 +349,28 @@ class MissingSectionHeaderError(ParsingError): self.args = (filename, lineno, line) +class MultilineContinuationError(ParsingError): + """Raised when a key without value is followed by continuation line""" + def __init__(self, filename, lineno, line): + Error.__init__( + self, + "Key without value continued with an indented line.\n" + "file: %r, line: %d\n%r" + %(filename, lineno, line)) + self.source = filename + self.lineno = lineno + self.line = line + self.args = (filename, lineno, line) + +class _UnnamedSection: + + def __repr__(self): + return "" + + +UNNAMED_SECTION = _UnnamedSection() + + # Used in parser getters to indicate the default behaviour when a specific # option is not found it to raise an exception. Created to enable `None` as # a valid fallback value. @@ -491,51 +539,50 @@ class ExtendedInterpolation(Interpolation): "found: %r" % (rest,)) -class LegacyInterpolation(Interpolation): - """Deprecated interpolation used in old versions of ConfigParser. - Use BasicInterpolation or ExtendedInterpolation instead.""" +class _ReadState: + elements_added : set[str] + cursect : dict[str, str] | None = None + sectname : str | None = None + optname : str | None = None + lineno : int = 0 + indent_level : int = 0 + errors : list[ParsingError] - _KEYCRE = re.compile(r"%\(([^)]*)\)s|.") + def __init__(self): + self.elements_added = set() + self.errors = list() - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - warnings.warn( - "LegacyInterpolation has been deprecated since Python 3.2 " - "and will be removed from the configparser module in Python 3.13. " - "Use BasicInterpolation or ExtendedInterpolation instead.", - DeprecationWarning, stacklevel=2 - ) - def before_get(self, parser, section, option, value, vars): - rawval = value - depth = MAX_INTERPOLATION_DEPTH - while depth: # Loop through this until it's done - depth -= 1 - if value and "%(" in value: - replace = functools.partial(self._interpolation_replace, - parser=parser) - value = self._KEYCRE.sub(replace, value) - try: - value = value % vars - except KeyError as e: - raise InterpolationMissingOptionError( - option, section, rawval, e.args[0]) from None - else: - break - if value and "%(" in value: - raise InterpolationDepthError(option, section, rawval) - return value +class _Line(str): - def before_set(self, parser, section, option, value): - return value + def __new__(cls, val, *args, **kwargs): + return super().__new__(cls, val) - @staticmethod - def _interpolation_replace(match, parser): - s = match.group(1) - if s is None: - return match.group() - else: - return "%%(%s)s" % parser.optionxform(s) + def __init__(self, val, prefixes): + self.prefixes = prefixes + + @functools.cached_property + def clean(self): + return self._strip_full() and self._strip_inline() + + @property + def has_comments(self): + return self.strip() != self.clean + + def _strip_inline(self): + """ + Search for the earliest prefix at the beginning of the line or following a space. + """ + matcher = re.compile( + '|'.join(fr'(^|\s)({re.escape(prefix)})' for prefix in self.prefixes.inline) + # match nothing if no prefixes + or '(?!)' + ) + match = matcher.search(self) + return self[:match.start() if match else None].strip() + + def _strip_full(self): + return '' if any(map(self.strip().startswith, self.prefixes.full)) else True class RawConfigParser(MutableMapping): @@ -584,7 +631,8 @@ class RawConfigParser(MutableMapping): comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=DEFAULTSECT, - interpolation=_UNSET, converters=_UNSET): + interpolation=_UNSET, converters=_UNSET, + allow_unnamed_section=False,): self._dict = dict_type self._sections = self._dict() @@ -603,8 +651,10 @@ class RawConfigParser(MutableMapping): else: self._optcre = re.compile(self._OPT_TMPL.format(delim=d), re.VERBOSE) - self._comment_prefixes = tuple(comment_prefixes or ()) - self._inline_comment_prefixes = tuple(inline_comment_prefixes or ()) + self._prefixes = types.SimpleNamespace( + full=tuple(comment_prefixes or ()), + inline=tuple(inline_comment_prefixes or ()), + ) self._strict = strict self._allow_no_value = allow_no_value self._empty_lines_in_values = empty_lines_in_values @@ -623,6 +673,7 @@ class RawConfigParser(MutableMapping): self._converters.update(converters) if defaults: self._read_defaults(defaults) + self._allow_unnamed_section = allow_unnamed_section def defaults(self): return self._defaults @@ -896,13 +947,19 @@ class RawConfigParser(MutableMapping): if self._defaults: self._write_section(fp, self.default_section, self._defaults.items(), d) + if UNNAMED_SECTION in self._sections: + self._write_section(fp, UNNAMED_SECTION, self._sections[UNNAMED_SECTION].items(), d, unnamed=True) + for section in self._sections: + if section is UNNAMED_SECTION: + continue self._write_section(fp, section, self._sections[section].items(), d) - def _write_section(self, fp, section_name, section_items, delimiter): - """Write a single section to the specified `fp`.""" - fp.write("[{}]\n".format(section_name)) + def _write_section(self, fp, section_name, section_items, delimiter, unnamed=False): + """Write a single section to the specified `fp'.""" + if not unnamed: + fp.write("[{}]\n".format(section_name)) for key, value in section_items: value = self._interpolation.before_write(self, section_name, key, value) @@ -988,110 +1045,117 @@ class RawConfigParser(MutableMapping): in an otherwise empty line or may be entered in lines holding values or section names. Please note that comments get stripped off when reading configuration files. """ - elements_added = set() - cursect = None # None, or a dictionary - sectname = None - optname = None - lineno = 0 - indent_level = 0 - e = None # None, or an exception - for lineno, line in enumerate(fp, start=1): - comment_start = sys.maxsize - # strip inline comments - inline_prefixes = {p: -1 for p in self._inline_comment_prefixes} - while comment_start == sys.maxsize and inline_prefixes: - next_prefixes = {} - for prefix, index in inline_prefixes.items(): - index = line.find(prefix, index+1) - if index == -1: - continue - next_prefixes[prefix] = index - if index == 0 or (index > 0 and line[index-1].isspace()): - comment_start = min(comment_start, index) - inline_prefixes = next_prefixes - # strip full line comments - for prefix in self._comment_prefixes: - if line.strip().startswith(prefix): - comment_start = 0 - break - if comment_start == sys.maxsize: - comment_start = None - value = line[:comment_start].strip() - if not value: + + try: + ParsingError._raise_all(self._read_inner(fp, fpname)) + finally: + self._join_multiline_values() + + def _read_inner(self, fp, fpname): + st = _ReadState() + + Line = functools.partial(_Line, prefixes=self._prefixes) + for st.lineno, line in enumerate(map(Line, fp), start=1): + if not line.clean: if self._empty_lines_in_values: # add empty line to the value, but only if there was no # comment on the line - if (comment_start is None and - cursect is not None and - optname and - cursect[optname] is not None): - cursect[optname].append('') # newlines added at join + if (not line.has_comments and + st.cursect is not None and + st.optname and + st.cursect[st.optname] is not None): + st.cursect[st.optname].append('') # newlines added at join else: # empty line marks end of value - indent_level = sys.maxsize + st.indent_level = sys.maxsize continue - # continuation line? + first_nonspace = self.NONSPACECRE.search(line) - cur_indent_level = first_nonspace.start() if first_nonspace else 0 - if (cursect is not None and optname and - cur_indent_level > indent_level): - cursect[optname].append(value) - # a section header or option header? - else: - indent_level = cur_indent_level - # is it a section header? - mo = self.SECTCRE.match(value) - if mo: - sectname = mo.group('header') - if sectname in self._sections: - if self._strict and sectname in elements_added: - raise DuplicateSectionError(sectname, fpname, - lineno) - cursect = self._sections[sectname] - elements_added.add(sectname) - elif sectname == self.default_section: - cursect = self._defaults - else: - cursect = self._dict() - self._sections[sectname] = cursect - self._proxies[sectname] = SectionProxy(self, sectname) - elements_added.add(sectname) - # So sections can't start with a continuation line - optname = None - # no section header in the file? - elif cursect is None: - raise MissingSectionHeaderError(fpname, lineno, line) - # an option line? - else: - mo = self._optcre.match(value) - if mo: - optname, vi, optval = mo.group('option', 'vi', 'value') - if not optname: - e = self._handle_error(e, fpname, lineno, line) - optname = self.optionxform(optname.rstrip()) - if (self._strict and - (sectname, optname) in elements_added): - raise DuplicateOptionError(sectname, optname, - fpname, lineno) - elements_added.add((sectname, optname)) - # This check is fine because the OPTCRE cannot - # match if it would set optval to None - if optval is not None: - optval = optval.strip() - cursect[optname] = [optval] - else: - # valueless option handling - cursect[optname] = None - else: - # a non-fatal parsing error occurred. set up the - # exception but keep going. the exception will be - # raised at the end of the file and will contain a - # list of all bogus lines - e = self._handle_error(e, fpname, lineno, line) - self._join_multiline_values() - # if any parsing errors occurred, raise an exception - if e: - raise e + st.cur_indent_level = first_nonspace.start() if first_nonspace else 0 + + if self._handle_continuation_line(st, line, fpname): + continue + + self._handle_rest(st, line, fpname) + + return st.errors + + def _handle_continuation_line(self, st, line, fpname): + # continuation line? + is_continue = (st.cursect is not None and st.optname and + st.cur_indent_level > st.indent_level) + if is_continue: + if st.cursect[st.optname] is None: + raise MultilineContinuationError(fpname, st.lineno, line) + st.cursect[st.optname].append(line.clean) + return is_continue + + def _handle_rest(self, st, line, fpname): + # a section header or option header? + if self._allow_unnamed_section and st.cursect is None: + st.sectname = UNNAMED_SECTION + st.cursect = self._dict() + self._sections[st.sectname] = st.cursect + self._proxies[st.sectname] = SectionProxy(self, st.sectname) + st.elements_added.add(st.sectname) + + st.indent_level = st.cur_indent_level + # is it a section header? + mo = self.SECTCRE.match(line.clean) + + if not mo and st.cursect is None: + raise MissingSectionHeaderError(fpname, st.lineno, line) + + self._handle_header(st, mo, fpname) if mo else self._handle_option(st, line, fpname) + + def _handle_header(self, st, mo, fpname): + st.sectname = mo.group('header') + if st.sectname in self._sections: + if self._strict and st.sectname in st.elements_added: + raise DuplicateSectionError(st.sectname, fpname, + st.lineno) + st.cursect = self._sections[st.sectname] + st.elements_added.add(st.sectname) + elif st.sectname == self.default_section: + st.cursect = self._defaults + else: + st.cursect = self._dict() + self._sections[st.sectname] = st.cursect + self._proxies[st.sectname] = SectionProxy(self, st.sectname) + st.elements_added.add(st.sectname) + # So sections can't start with a continuation line + st.optname = None + + def _handle_option(self, st, line, fpname): + # an option line? + st.indent_level = st.cur_indent_level + + mo = self._optcre.match(line.clean) + if not mo: + # a non-fatal parsing error occurred. set up the + # exception but keep going. the exception will be + # raised at the end of the file and will contain a + # list of all bogus lines + st.errors.append(ParsingError(fpname, st.lineno, line)) + return + + st.optname, vi, optval = mo.group('option', 'vi', 'value') + if not st.optname: + st.errors.append(ParsingError(fpname, st.lineno, line)) + st.optname = self.optionxform(st.optname.rstrip()) + if (self._strict and + (st.sectname, st.optname) in st.elements_added): + raise DuplicateOptionError(st.sectname, st.optname, + fpname, st.lineno) + st.elements_added.add((st.sectname, st.optname)) + # This check is fine because the OPTCRE cannot + # match if it would set optval to None + if optval is not None: + optval = optval.strip() + st.cursect[st.optname] = [optval] + else: + # valueless option handling + st.cursect[st.optname] = None def _join_multiline_values(self): defaults = self.default_section, self._defaults @@ -1111,12 +1175,6 @@ class RawConfigParser(MutableMapping): for key, value in defaults.items(): self._defaults[self.optionxform(key)] = value - def _handle_error(self, exc, fpname, lineno, line): - if not exc: - exc = ParsingError(fpname) - exc.append(lineno, repr(line)) - return exc - def _unify_values(self, section, vars): """Create a sequence of lookups with 'vars' taking priority over the 'section' which takes priority over the DEFAULTSECT. diff --git a/Lib/contextlib.py b/Lib/contextlib.py index b5acbcb9..5b646fab 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -20,6 +20,8 @@ class AbstractContextManager(abc.ABC): __class_getitem__ = classmethod(GenericAlias) + __slots__ = () + def __enter__(self): """Return `self` upon entering the runtime context.""" return self @@ -42,6 +44,8 @@ class AbstractAsyncContextManager(abc.ABC): __class_getitem__ = classmethod(GenericAlias) + __slots__ = () + async def __aenter__(self): """Return `self` upon entering the runtime context.""" return self @@ -145,7 +149,10 @@ class _GeneratorContextManager( except StopIteration: return False else: - raise RuntimeError("generator didn't stop") + try: + raise RuntimeError("generator didn't stop") + finally: + self.gen.close() else: if value is None: # Need to force instantiation so we can reliably @@ -187,7 +194,10 @@ class _GeneratorContextManager( raise exc.__traceback__ = traceback return False - raise RuntimeError("generator didn't stop after throw()") + try: + raise RuntimeError("generator didn't stop after throw()") + finally: + self.gen.close() class _AsyncGeneratorContextManager( _GeneratorContextManagerBase, @@ -212,7 +222,10 @@ class _AsyncGeneratorContextManager( except StopAsyncIteration: return False else: - raise RuntimeError("generator didn't stop") + try: + raise RuntimeError("generator didn't stop") + finally: + await self.gen.aclose() else: if value is None: # Need to force instantiation so we can reliably @@ -254,7 +267,10 @@ class _AsyncGeneratorContextManager( raise exc.__traceback__ = traceback return False - raise RuntimeError("generator didn't stop after athrow()") + try: + raise RuntimeError("generator didn't stop after athrow()") + finally: + await self.gen.aclose() def contextmanager(func): @@ -445,7 +461,7 @@ class suppress(AbstractContextManager): return if issubclass(exctype, self._exceptions): return True - if issubclass(exctype, ExceptionGroup): + if issubclass(exctype, BaseExceptionGroup): match, rest = excinst.split(self._exceptions) if rest is None: return True @@ -553,11 +569,12 @@ class ExitStack(_BaseExitStack, AbstractContextManager): return self def __exit__(self, *exc_details): - received_exc = exc_details[0] is not None + exc = exc_details[1] + received_exc = exc is not None # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements - frame_exc = sys.exc_info()[1] + frame_exc = sys.exception() def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain while 1: @@ -580,24 +597,28 @@ class ExitStack(_BaseExitStack, AbstractContextManager): is_sync, cb = self._exit_callbacks.pop() assert is_sync try: + if exc is None: + exc_details = None, None, None + else: + exc_details = type(exc), exc, exc.__traceback__ if cb(*exc_details): suppressed_exc = True pending_raise = False - exc_details = (None, None, None) - except: - new_exc_details = sys.exc_info() + exc = None + except BaseException as new_exc: # simulate the stack of exceptions by setting the context - _fix_exception_context(new_exc_details[1], exc_details[1]) + _fix_exception_context(new_exc, exc) pending_raise = True - exc_details = new_exc_details + exc = new_exc + if pending_raise: try: - # bare "raise exc_details[1]" replaces our carefully + # bare "raise exc" replaces our carefully # set-up context - fixed_ctx = exc_details[1].__context__ - raise exc_details[1] + fixed_ctx = exc.__context__ + raise exc except BaseException: - exc_details[1].__context__ = fixed_ctx + exc.__context__ = fixed_ctx raise return received_exc and suppressed_exc @@ -693,11 +714,12 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): return self async def __aexit__(self, *exc_details): - received_exc = exc_details[0] is not None + exc = exc_details[1] + received_exc = exc is not None # We manipulate the exception state so it behaves as though # we were actually nesting multiple with statements - frame_exc = sys.exc_info()[1] + frame_exc = sys.exception() def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain while 1: @@ -719,6 +741,10 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): while self._exit_callbacks: is_sync, cb = self._exit_callbacks.pop() try: + if exc is None: + exc_details = None, None, None + else: + exc_details = type(exc), exc, exc.__traceback__ if is_sync: cb_suppress = cb(*exc_details) else: @@ -727,21 +753,21 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): if cb_suppress: suppressed_exc = True pending_raise = False - exc_details = (None, None, None) - except: - new_exc_details = sys.exc_info() + exc = None + except BaseException as new_exc: # simulate the stack of exceptions by setting the context - _fix_exception_context(new_exc_details[1], exc_details[1]) + _fix_exception_context(new_exc, exc) pending_raise = True - exc_details = new_exc_details + exc = new_exc + if pending_raise: try: - # bare "raise exc_details[1]" replaces our carefully + # bare "raise exc" replaces our carefully # set-up context - fixed_ctx = exc_details[1].__context__ - raise exc_details[1] + fixed_ctx = exc.__context__ + raise exc except BaseException: - exc_details[1].__context__ = fixed_ctx + exc.__context__ = fixed_ctx raise return received_exc and suppressed_exc diff --git a/Lib/copy.py b/Lib/copy.py index da2908ef..2a460624 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -4,8 +4,9 @@ Interface summary: import copy - x = copy.copy(y) # make a shallow copy of y - x = copy.deepcopy(y) # make a deep copy of y + x = copy.copy(y) # make a shallow copy of y + x = copy.deepcopy(y) # make a deep copy of y + x = copy.replace(y, a=1, b=2) # new object with fields replaced, as defined by `__replace__` For module specific errors, copy.Error is raised. @@ -56,7 +57,7 @@ class Error(Exception): pass error = Error # backward compatibility -__all__ = ["Error", "copy", "deepcopy"] +__all__ = ["Error", "copy", "deepcopy", "replace"] def copy(x): """Shallow copy operation on arbitrary Python objects. @@ -121,13 +122,13 @@ def deepcopy(x, memo=None, _nil=[]): See the module's __doc__ string for more info. """ + d = id(x) if memo is None: memo = {} - - d = id(x) - y = memo.get(d, _nil) - if y is not _nil: - return y + else: + y = memo.get(d, _nil) + if y is not _nil: + return y cls = type(x) @@ -290,3 +291,16 @@ def _reconstruct(x, memo, func, args, return y del types, weakref + + +def replace(obj, /, **changes): + """Return a new object replacing specified fields with new values. + + This is especially useful for immutable objects, like named tuples or + frozen dataclasses. + """ + cls = obj.__class__ + func = getattr(cls, '__replace__', None) + if func is None: + raise TypeError(f"replace() does not support {cls.__name__} objects") + return func(obj, **changes) diff --git a/Lib/crypt.py b/Lib/crypt.py deleted file mode 100644 index de4a14a3..00000000 --- a/Lib/crypt.py +++ /dev/null @@ -1,124 +0,0 @@ -"""Wrapper to the POSIX crypt library call and associated functionality.""" - -import sys as _sys - -try: - import _crypt -except ModuleNotFoundError: - if _sys.platform == 'win32': - raise ImportError("The crypt module is not supported on Windows") - else: - raise ImportError("The required _crypt module was not built as part of CPython") - -import errno -import string as _string -import warnings -from random import SystemRandom as _SystemRandom -from collections import namedtuple as _namedtuple - - -warnings._deprecated(__name__, remove=(3, 13)) - - -_saltchars = _string.ascii_letters + _string.digits + './' -_sr = _SystemRandom() - - -class _Method(_namedtuple('_Method', 'name ident salt_chars total_size')): - - """Class representing a salt method per the Modular Crypt Format or the - legacy 2-character crypt method.""" - - def __repr__(self): - return ''.format(self.name) - - -def mksalt(method=None, *, rounds=None): - """Generate a salt for the specified method. - - If not specified, the strongest available method will be used. - - """ - if method is None: - method = methods[0] - if rounds is not None and not isinstance(rounds, int): - raise TypeError(f'{rounds.__class__.__name__} object cannot be ' - f'interpreted as an integer') - if not method.ident: # traditional - s = '' - else: # modular - s = f'${method.ident}$' - - if method.ident and method.ident[0] == '2': # Blowfish variants - if rounds is None: - log_rounds = 12 - else: - log_rounds = int.bit_length(rounds-1) - if rounds != 1 << log_rounds: - raise ValueError('rounds must be a power of 2') - if not 4 <= log_rounds <= 31: - raise ValueError('rounds out of the range 2**4 to 2**31') - s += f'{log_rounds:02d}$' - elif method.ident in ('5', '6'): # SHA-2 - if rounds is not None: - if not 1000 <= rounds <= 999_999_999: - raise ValueError('rounds out of the range 1000 to 999_999_999') - s += f'rounds={rounds}$' - elif rounds is not None: - raise ValueError(f"{method} doesn't support the rounds argument") - - s += ''.join(_sr.choice(_saltchars) for char in range(method.salt_chars)) - return s - - -def crypt(word, salt=None): - """Return a string representing the one-way hash of a password, with a salt - prepended. - - If ``salt`` is not specified or is ``None``, the strongest - available method will be selected and a salt generated. Otherwise, - ``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as - returned by ``crypt.mksalt()``. - - """ - if salt is None or isinstance(salt, _Method): - salt = mksalt(salt) - return _crypt.crypt(word, salt) - - -# available salting/crypto methods -methods = [] - -def _add_method(name, *args, rounds=None): - method = _Method(name, *args) - globals()['METHOD_' + name] = method - salt = mksalt(method, rounds=rounds) - result = None - try: - result = crypt('', salt) - except OSError as e: - # Not all libc libraries support all encryption methods. - if e.errno in {errno.EINVAL, errno.EPERM, errno.ENOSYS}: - return False - raise - if result and len(result) == method.total_size: - methods.append(method) - return True - return False - -_add_method('SHA512', '6', 16, 106) -_add_method('SHA256', '5', 16, 63) - -# Choose the strongest supported version of Blowfish hashing. -# Early versions have flaws. Version 'a' fixes flaws of -# the initial implementation, 'b' fixes flaws of 'a'. -# 'y' is the same as 'b', for compatibility -# with openwall crypt_blowfish. -for _v in 'b', 'y', 'a', '': - if _add_method('BLOWFISH', '2' + _v, 22, 59 + len(_v), rounds=1<<4): - break - -_add_method('MD5', '1', 8, 34) -_add_method('CRYPT', None, 2, 13) - -del _v, _add_method diff --git a/Lib/csv.py b/Lib/csv.py index 77f30c8d..cd202659 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -1,28 +1,90 @@ -""" -csv.py - read/write/investigate CSV files +r""" +CSV parsing and writing. + +This module provides classes that assist in the reading and writing +of Comma Separated Value (CSV) files, and implements the interface +described by PEP 305. Although many CSV files are simple to parse, +the format is not formally defined by a stable specification and +is subtle enough that parsing lines of a CSV file with something +like line.split(",") is bound to fail. The module supports three +basic APIs: reading, writing, and registration of dialects. + + +DIALECT REGISTRATION: + +Readers and writers support a dialect argument, which is a convenient +handle on a group of settings. When the dialect argument is a string, +it identifies one of the dialects previously registered with the module. +If it is a class or instance, the attributes of the argument are used as +the settings for the reader or writer: + + class excel: + delimiter = ',' + quotechar = '"' + escapechar = None + doublequote = True + skipinitialspace = False + lineterminator = '\r\n' + quoting = QUOTE_MINIMAL + +SETTINGS: + + * quotechar - specifies a one-character string to use as the + quoting character. It defaults to '"'. + * delimiter - specifies a one-character string to use as the + field separator. It defaults to ','. + * skipinitialspace - specifies how to interpret spaces which + immediately follow a delimiter. It defaults to False, which + means that spaces immediately following a delimiter is part + of the following field. + * lineterminator - specifies the character sequence which should + terminate rows. + * quoting - controls when quotes should be generated by the writer. + It can take on any of the following module constants: + + csv.QUOTE_MINIMAL means only when required, for example, when a + field contains either the quotechar or the delimiter + csv.QUOTE_ALL means that quotes are always placed around fields. + csv.QUOTE_NONNUMERIC means that quotes are always placed around + fields which do not parse as integers or floating-point + numbers. + csv.QUOTE_STRINGS means that quotes are always placed around + fields which are strings. Note that the Python value None + is not a string. + csv.QUOTE_NOTNULL means that quotes are only placed around fields + that are not the Python value None. + csv.QUOTE_NONE means that quotes are never placed around fields. + * escapechar - specifies a one-character string used to escape + the delimiter when quoting is set to QUOTE_NONE. + * doublequote - controls the handling of quotes inside fields. When + True, two consecutive quotes are interpreted as one during read, + and when writing, each quote character embedded in the data is + written as two quotes """ import re import types -from _csv import Error, __version__, writer, reader, register_dialect, \ +from _csv import Error, writer, reader, register_dialect, \ unregister_dialect, get_dialect, list_dialects, \ field_size_limit, \ QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \ - QUOTE_STRINGS, QUOTE_NOTNULL, \ - __doc__ + QUOTE_STRINGS, QUOTE_NOTNULL from _csv import Dialect as _Dialect from io import StringIO __all__ = ["QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE", "QUOTE_STRINGS", "QUOTE_NOTNULL", - "Error", "Dialect", "__doc__", "excel", "excel_tab", + "Error", "Dialect", "excel", "excel_tab", "field_size_limit", "reader", "writer", "register_dialect", "get_dialect", "list_dialects", "Sniffer", - "unregister_dialect", "__version__", "DictReader", "DictWriter", + "unregister_dialect", "DictReader", "DictWriter", "unix_dialect"] +__version__ = "1.0" + + class Dialect: """Describe a CSV dialect. @@ -51,8 +113,8 @@ class Dialect: try: _Dialect(self) except TypeError as e: - # We do this for compatibility with py2.3 - raise Error(str(e)) + # Re-raise to get a traceback showing more user code. + raise Error(str(e)) from None class excel(Dialect): """Describe the usual properties of Excel-generated CSV files.""" diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 95353bab..8261773c 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -302,8 +302,9 @@ def create_unicode_buffer(init, size=None): raise TypeError(init) -# XXX Deprecated def SetPointerType(pointer, cls): + import warnings + warnings._deprecated("ctypes.SetPointerType", remove=(3, 15)) if _pointer_type_cache.get(cls, None) is not None: raise RuntimeError("This type already exists in the cache") if id(pointer) not in _pointer_type_cache: @@ -312,7 +313,6 @@ def SetPointerType(pointer, cls): _pointer_type_cache[cls] = pointer del _pointer_type_cache[id(pointer)] -# XXX Deprecated def ARRAY(typ, len): return typ * len @@ -346,6 +346,17 @@ class CDLL(object): winmode=None): if name: name = _os.fspath(name) + + # If the filename that has been provided is an iOS/tvOS/watchOS + # .fwork file, dereference the location to the true origin of the + # binary. + if name.endswith(".fwork"): + with open(name) as f: + name = _os.path.join( + _os.path.dirname(_sys.executable), + f.read().strip() + ) + self._name = name flags = self._func_flags_ if use_errno: @@ -466,6 +477,8 @@ pydll = LibraryLoader(PyDLL) if _os.name == "nt": pythonapi = PyDLL("python dll", None, _sys.dllhandle) +elif _sys.platform == "android": + pythonapi = PyDLL("libpython%d.%d.so" % _sys.version_info[:2]) elif _sys.platform == "cygwin": pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2]) else: @@ -519,9 +532,9 @@ def cast(obj, typ): _string_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr) def string_at(ptr, size=-1): - """string_at(addr[, size]) -> string + """string_at(ptr[, size]) -> string - Return the string at addr.""" + Return the byte string at void *ptr.""" return _string_at(ptr, size) try: @@ -531,9 +544,9 @@ except ImportError: else: _wstring_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr) def wstring_at(ptr, size=-1): - """wstring_at(addr[, size]) -> string + """wstring_at(ptr[, size]) -> string - Return the string at addr.""" + Return the wide-character string at void *ptr.""" return _wstring_at(ptr, size) diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py index b5446c04..6382dd22 100644 --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -1,5 +1,5 @@ import sys -from ctypes import * +from ctypes import Array, Structure, Union _array_type = type(Array) @@ -15,8 +15,8 @@ def _other_endian(typ): # if typ is array if isinstance(typ, _array_type): return _other_endian(typ._type_) * typ._length_ - # if typ is structure - if issubclass(typ, Structure): + # if typ is structure or union + if issubclass(typ, (Structure, Union)): return typ raise TypeError("This type does not support other endian: %s" % typ) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 0c2510e1..117bf06c 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -67,7 +67,7 @@ if os.name == "nt": return fname return None -elif os.name == "posix" and sys.platform == "darwin": +elif os.name == "posix" and sys.platform in {"darwin", "ios", "tvos", "watchos"}: from ctypes.macholib.dyld import dyld_find as _dyld_find def find_library(name): possible = ['lib%s.dylib' % name, @@ -89,6 +89,15 @@ elif sys.platform.startswith("aix"): from ctypes._aix import find_library +elif sys.platform == "android": + def find_library(name): + directory = "/system/lib" + if "64" in os.uname().machine: + directory += "64" + + fname = f"{directory}/lib{name}.so" + return fname if os.path.isfile(fname) else None + elif os.name == "posix": # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump import re, tempfile @@ -96,8 +105,11 @@ elif os.name == "posix": def _is_elf(filename): "Return True if the given file is an ELF file" elf_header = b'\x7fELF' - with open(filename, 'br') as thefile: - return thefile.read(4) == elf_header + try: + with open(filename, 'br') as thefile: + return thefile.read(4) == elf_header + except FileNotFoundError: + return False def _findLib_gcc(name): # Run GCC's linker with the -t (aka --trace) option and examine the diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 3eacba84..7883ce78 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -4,11 +4,9 @@ import copy import types import inspect import keyword -import functools import itertools import abc -import _thread -from types import FunctionType, GenericAlias +from reprlib import recursive_repr __all__ = ['dataclass', @@ -245,25 +243,6 @@ _ATOMIC_TYPES = frozenset({ property, }) -# This function's logic is copied from "recursive_repr" function in -# reprlib module to avoid dependency. -def _recursive_repr(user_function): - # Decorator to make a repr function return "..." for a recursive - # call. - repr_running = set() - - @functools.wraps(user_function) - def wrapper(self): - key = id(self), _thread.get_ident() - if key in repr_running: - return '...' - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - return wrapper class InitVar: __slots__ = ('type', ) @@ -322,7 +301,7 @@ class Field: self.kw_only = kw_only self._field_type = None - @_recursive_repr + @recursive_repr() def __repr__(self): return ('Field(' f'name={self.name!r},' @@ -353,7 +332,7 @@ class Field: # it. func(self.default, owner, name) - __class_getitem__ = classmethod(GenericAlias) + __class_getitem__ = classmethod(types.GenericAlias) class _DataclassParams: @@ -446,32 +425,95 @@ def _tuple_str(obj_name, fields): return f'({",".join([f"{obj_name}.{f.name}" for f in fields])},)' -def _create_fn(name, args, body, *, globals=None, locals=None, - return_type=MISSING): - # Note that we may mutate locals. Callers beware! - # The only callers are internal to this module, so no - # worries about external callers. - if locals is None: - locals = {} - return_annotation = '' - if return_type is not MISSING: - locals['__dataclass_return_type__'] = return_type - return_annotation = '->__dataclass_return_type__' - args = ','.join(args) - body = '\n'.join(f' {b}' for b in body) - - # Compute the text of the entire function. - txt = f' def {name}({args}){return_annotation}:\n{body}' - - # Free variables in exec are resolved in the global namespace. - # The global namespace we have is user-provided, so we can't modify it for - # our purposes. So we put the things we need into locals and introduce a - # scope to allow the function we're creating to close over them. - local_vars = ', '.join(locals.keys()) - txt = f"def __create_fn__({local_vars}):\n{txt}\n return {name}" - ns = {} - exec(txt, globals, ns) - return ns['__create_fn__'](**locals) +class _FuncBuilder: + def __init__(self, globals): + self.names = [] + self.src = [] + self.globals = globals + self.locals = {} + self.overwrite_errors = {} + self.unconditional_adds = {} + + def add_fn(self, name, args, body, *, locals=None, return_type=MISSING, + overwrite_error=False, unconditional_add=False, decorator=None): + if locals is not None: + self.locals.update(locals) + + # Keep track if this method is allowed to be overwritten if it already + # exists in the class. The error is method-specific, so keep it with + # the name. We'll use this when we generate all of the functions in + # the add_fns_to_class call. overwrite_error is either True, in which + # case we'll raise an error, or it's a string, in which case we'll + # raise an error and append this string. + if overwrite_error: + self.overwrite_errors[name] = overwrite_error + + # Should this function always overwrite anything that's already in the + # class? The default is to not overwrite a function that already + # exists. + if unconditional_add: + self.unconditional_adds[name] = True + + self.names.append(name) + + if return_type is not MISSING: + self.locals[f'__dataclass_{name}_return_type__'] = return_type + return_annotation = f'->__dataclass_{name}_return_type__' + else: + return_annotation = '' + args = ','.join(args) + body = '\n'.join(body) + + # Compute the text of the entire function, add it to the text we're generating. + self.src.append(f'{f' {decorator}\n' if decorator else ''} def {name}({args}){return_annotation}:\n{body}') + + def add_fns_to_class(self, cls): + # The source to all of the functions we're generating. + fns_src = '\n'.join(self.src) + + # The locals they use. + local_vars = ','.join(self.locals.keys()) + + # The names of all of the functions, used for the return value of the + # outer function. Need to handle the 0-tuple specially. + if len(self.names) == 0: + return_names = '()' + else: + return_names =f'({",".join(self.names)},)' + + # txt is the entire function we're going to execute, including the + # bodies of the functions we're defining. Here's a greatly simplified + # version: + # def __create_fn__(): + # def __init__(self, x, y): + # self.x = x + # self.y = y + # @recursive_repr + # def __repr__(self): + # return f"cls(x={self.x!r},y={self.y!r})" + # return __init__,__repr__ + + txt = f"def __create_fn__({local_vars}):\n{fns_src}\n return {return_names}" + ns = {} + exec(txt, self.globals, ns) + fns = ns['__create_fn__'](**self.locals) + + # Now that we've generated the functions, assign them into cls. + for name, fn in zip(self.names, fns): + fn.__qualname__ = f"{cls.__qualname__}.{fn.__name__}" + if self.unconditional_adds.get(name, False): + setattr(cls, name, fn) + else: + already_exists = _set_new_attribute(cls, name, fn) + + # See if it's an error to overwrite this particular function. + if already_exists and (msg_extra := self.overwrite_errors.get(name)): + error_msg = (f'Cannot overwrite attribute {fn.__name__} ' + f'in class {cls.__name__}') + if not msg_extra is True: + error_msg = f'{error_msg} {msg_extra}' + + raise TypeError(error_msg) def _field_assign(frozen, name, value, self_name): @@ -482,8 +524,8 @@ def _field_assign(frozen, name, value, self_name): # self_name is what "self" is called in this function: don't # hard-code "self", since that might be a field name. if frozen: - return f'__dataclass_builtins_object__.__setattr__({self_name},{name!r},{value})' - return f'{self_name}.{name}={value}' + return f' __dataclass_builtins_object__.__setattr__({self_name},{name!r},{value})' + return f' {self_name}.{name}={value}' def _field_init(f, frozen, globals, self_name, slots): @@ -566,7 +608,7 @@ def _init_param(f): def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, - self_name, globals, slots): + self_name, func_builder, slots): # fields contains both real fields and InitVar pseudo-fields. # Make sure we don't have fields without defaults following fields @@ -575,21 +617,21 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, # message, and future-proofs us in case we build up the function # using ast. - seen_default = False + seen_default = None for f in std_fields: # Only consider the non-kw-only fields in the __init__ call. if f.init: if not (f.default is MISSING and f.default_factory is MISSING): - seen_default = True + seen_default = f elif seen_default: raise TypeError(f'non-default argument {f.name!r} ' - 'follows default argument') + f'follows default argument {seen_default.name!r}') - locals = {f'__dataclass_type_{f.name}__': f.type for f in fields} - locals.update({ - '__dataclass_HAS_DEFAULT_FACTORY__': _HAS_DEFAULT_FACTORY, - '__dataclass_builtins_object__': object, - }) + locals = {**{f'__dataclass_type_{f.name}__': f.type for f in fields}, + **{'__dataclass_HAS_DEFAULT_FACTORY__': _HAS_DEFAULT_FACTORY, + '__dataclass_builtins_object__': object, + } + } body_lines = [] for f in fields: @@ -603,11 +645,11 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, if has_post_init: params_str = ','.join(f.name for f in fields if f._field_type is _FIELD_INITVAR) - body_lines.append(f'{self_name}.{_POST_INIT_NAME}({params_str})') + body_lines.append(f' {self_name}.{_POST_INIT_NAME}({params_str})') # If no body lines, use 'pass'. if not body_lines: - body_lines = ['pass'] + body_lines = [' pass'] _init_params = [_init_param(f) for f in std_fields] if kw_only_fields: @@ -616,68 +658,34 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, # (instead of just concatenting the lists together). _init_params += ['*'] _init_params += [_init_param(f) for f in kw_only_fields] - return _create_fn('__init__', - [self_name] + _init_params, - body_lines, - locals=locals, - globals=globals, - return_type=None) - - -def _repr_fn(fields, globals): - fn = _create_fn('__repr__', - ('self',), - ['return self.__class__.__qualname__ + f"(' + - ', '.join([f"{f.name}={{self.{f.name}!r}}" - for f in fields]) + - ')"'], - globals=globals) - return _recursive_repr(fn) - - -def _frozen_get_del_attr(cls, fields, globals): + func_builder.add_fn('__init__', + [self_name] + _init_params, + body_lines, + locals=locals, + return_type=None) + + +def _frozen_get_del_attr(cls, fields, func_builder): locals = {'cls': cls, 'FrozenInstanceError': FrozenInstanceError} condition = 'type(self) is cls' if fields: condition += ' or name in {' + ', '.join(repr(f.name) for f in fields) + '}' - return (_create_fn('__setattr__', - ('self', 'name', 'value'), - (f'if {condition}:', - ' raise FrozenInstanceError(f"cannot assign to field {name!r}")', - f'super(cls, self).__setattr__(name, value)'), - locals=locals, - globals=globals), - _create_fn('__delattr__', - ('self', 'name'), - (f'if {condition}:', - ' raise FrozenInstanceError(f"cannot delete field {name!r}")', - f'super(cls, self).__delattr__(name)'), - locals=locals, - globals=globals), - ) - -def _cmp_fn(name, op, self_tuple, other_tuple, globals): - # Create a comparison function. If the fields in the object are - # named 'x' and 'y', then self_tuple is the string - # '(self.x,self.y)' and other_tuple is the string - # '(other.x,other.y)'. - - return _create_fn(name, - ('self', 'other'), - [ 'if other.__class__ is self.__class__:', - f' return {self_tuple}{op}{other_tuple}', - 'return NotImplemented'], - globals=globals) - - -def _hash_fn(fields, globals): - self_tuple = _tuple_str('self', fields) - return _create_fn('__hash__', - ('self',), - [f'return hash({self_tuple})'], - globals=globals) + func_builder.add_fn('__setattr__', + ('self', 'name', 'value'), + (f' if {condition}:', + ' raise FrozenInstanceError(f"cannot assign to field {name!r}")', + f' super(cls, self).__setattr__(name, value)'), + locals=locals, + overwrite_error=True) + func_builder.add_fn('__delattr__', + ('self', 'name'), + (f' if {condition}:', + ' raise FrozenInstanceError(f"cannot delete field {name!r}")', + f' super(cls, self).__delattr__(name)'), + locals=locals, + overwrite_error=True) def _is_classvar(a_type, typing): @@ -854,19 +862,11 @@ def _get_field(cls, a_name, a_type, default_kw_only): return f -def _set_qualname(cls, value): - # Ensure that the functions returned from _create_fn uses the proper - # __qualname__ (the class they belong to). - if isinstance(value, FunctionType): - value.__qualname__ = f"{cls.__qualname__}.{value.__name__}" - return value - def _set_new_attribute(cls, name, value): # Never overwrites an existing attribute. Returns True if the # attribute already exists. if name in cls.__dict__: return True - _set_qualname(cls, value) setattr(cls, name, value) return False @@ -876,14 +876,22 @@ def _set_new_attribute(cls, name, value): # take. The common case is to do nothing, so instead of providing a # function that is a no-op, use None to signify that. -def _hash_set_none(cls, fields, globals): - return None +def _hash_set_none(cls, fields, func_builder): + # It's sort of a hack that I'm setting this here, instead of at + # func_builder.add_fns_to_class time, but since this is an exceptional case + # (it's not setting an attribute to a function, but to a scalar value), + # just do it directly here. I might come to regret this. + cls.__hash__ = None -def _hash_add(cls, fields, globals): +def _hash_add(cls, fields, func_builder): flds = [f for f in fields if (f.compare if f.hash is None else f.hash)] - return _set_qualname(cls, _hash_fn(flds, globals)) + self_tuple = _tuple_str('self', flds) + func_builder.add_fn('__hash__', + ('self',), + [f' return hash({self_tuple})'], + unconditional_add=True) -def _hash_exception(cls, fields, globals): +def _hash_exception(cls, fields, func_builder): # Raise an exception. raise TypeError(f'Cannot overwrite attribute __hash__ ' f'in class {cls.__name__}') @@ -944,8 +952,11 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, # Find our base classes in reverse MRO order, and exclude # ourselves. In reversed order so that more derived classes # override earlier field definitions in base classes. As long as - # we're iterating over them, see if any are frozen. + # we're iterating over them, see if all or any of them are frozen. any_frozen_base = False + # By default `all_frozen_bases` is `None` to represent a case, + # where some dataclasses does not have any bases with `_FIELDS` + all_frozen_bases = None has_dataclass_bases = False for b in cls.__mro__[-1:0:-1]: # Only process classes that have been processed by our @@ -955,8 +966,11 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, has_dataclass_bases = True for f in base_fields.values(): fields[f.name] = f - if getattr(b, _PARAMS).frozen: - any_frozen_base = True + if all_frozen_bases is None: + all_frozen_bases = True + current_frozen = getattr(b, _PARAMS).frozen + all_frozen_bases = all_frozen_bases and current_frozen + any_frozen_base = any_frozen_base or current_frozen # Annotations defined specifically in this class (not in base classes). # @@ -1025,7 +1039,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, 'frozen one') # Raise an exception if we're frozen, but none of our bases are. - if not any_frozen_base and frozen: + if all_frozen_bases is False and frozen: raise TypeError('cannot inherit frozen dataclass from a ' 'non-frozen one') @@ -1036,7 +1050,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, # Was this class defined with an explicit __hash__? Note that if # __eq__ is defined in this class, then python will automatically # set __hash__ to None. This is a heuristic, as it's possible - # that such a __hash__ == None was not auto-generated, but it + # that such a __hash__ == None was not auto-generated, but it's # close enough. class_hash = cls.__dict__.get('__hash__', MISSING) has_explicit_hash = not (class_hash is MISSING or @@ -1055,24 +1069,27 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, (std_init_fields, kw_only_init_fields) = _fields_in_init_order(all_init_fields) + func_builder = _FuncBuilder(globals) + if init: # Does this class have a post-init function? has_post_init = hasattr(cls, _POST_INIT_NAME) - _set_new_attribute(cls, '__init__', - _init_fn(all_init_fields, - std_init_fields, - kw_only_init_fields, - frozen, - has_post_init, - # The name to use for the "self" - # param in __init__. Use "self" - # if possible. - '__dataclass_self__' if 'self' in fields - else 'self', - globals, - slots, - )) + _init_fn(all_init_fields, + std_init_fields, + kw_only_init_fields, + frozen, + has_post_init, + # The name to use for the "self" + # param in __init__. Use "self" + # if possible. + '__dataclass_self__' if 'self' in fields + else 'self', + func_builder, + slots, + ) + + _set_new_attribute(cls, '__replace__', _replace) # Get the fields as a list, and include only real fields. This is # used in all of the following methods. @@ -1080,18 +1097,27 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, if repr: flds = [f for f in field_list if f.repr] - _set_new_attribute(cls, '__repr__', _repr_fn(flds, globals)) + func_builder.add_fn('__repr__', + ('self',), + [' return f"{self.__class__.__qualname__}(' + + ', '.join([f"{f.name}={{self.{f.name}!r}}" + for f in flds]) + ')"'], + locals={'__dataclasses_recursive_repr': recursive_repr}, + decorator="@__dataclasses_recursive_repr()") if eq: # Create __eq__ method. There's no need for a __ne__ method, # since python will call __eq__ and negate it. - flds = [f for f in field_list if f.compare] - self_tuple = _tuple_str('self', flds) - other_tuple = _tuple_str('other', flds) - _set_new_attribute(cls, '__eq__', - _cmp_fn('__eq__', '==', - self_tuple, other_tuple, - globals=globals)) + cmp_fields = (field for field in field_list if field.compare) + terms = [f'self.{field.name}==other.{field.name}' for field in cmp_fields] + field_comparisons = ' and '.join(terms) or 'True' + func_builder.add_fn('__eq__', + ('self', 'other'), + [ ' if self is other:', + ' return True', + ' if other.__class__ is self.__class__:', + f' return {field_comparisons}', + ' return NotImplemented']) if order: # Create and set the ordering methods. @@ -1103,18 +1129,19 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, ('__gt__', '>'), ('__ge__', '>='), ]: - if _set_new_attribute(cls, name, - _cmp_fn(name, op, self_tuple, other_tuple, - globals=globals)): - raise TypeError(f'Cannot overwrite attribute {name} ' - f'in class {cls.__name__}. Consider using ' - 'functools.total_ordering') + # Create a comparison function. If the fields in the object are + # named 'x' and 'y', then self_tuple is the string + # '(self.x,self.y)' and other_tuple is the string + # '(other.x,other.y)'. + func_builder.add_fn(name, + ('self', 'other'), + [ ' if other.__class__ is self.__class__:', + f' return {self_tuple}{op}{other_tuple}', + ' return NotImplemented'], + overwrite_error='Consider using functools.total_ordering') if frozen: - for fn in _frozen_get_del_attr(cls, field_list, globals): - if _set_new_attribute(cls, fn.__name__, fn): - raise TypeError(f'Cannot overwrite attribute {fn.__name__} ' - f'in class {cls.__name__}') + _frozen_get_del_attr(cls, field_list, func_builder) # Decide if/how we're going to create a hash function. hash_action = _hash_action[bool(unsafe_hash), @@ -1122,9 +1149,12 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, bool(frozen), has_explicit_hash] if hash_action: - # No need to call _set_new_attribute here, since by the time - # we're here the overwriting is unconditional. - cls.__hash__ = hash_action(cls, field_list, globals) + cls.__hash__ = hash_action(cls, field_list, func_builder) + + # Generate the methods and add them to the class. This needs to be done + # before the __doc__ logic below, since inspect will look at the __init__ + # signature. + func_builder.add_fns_to_class(cls) if not getattr(cls, '__doc__'): # Create a class doc-string. @@ -1137,7 +1167,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, cls.__doc__ = (cls.__name__ + text_sig) if match_args: - # I could probably compute this once + # I could probably compute this once. _set_new_attribute(cls, '__match_args__', tuple(f.name for f in std_init_fields)) @@ -1168,8 +1198,17 @@ def _dataclass_setstate(self, state): def _get_slots(cls): match cls.__dict__.get('__slots__'): + # `__dictoffset__` and `__weakrefoffset__` can tell us whether + # the base type has dict/weakref slots, in a way that works correctly + # for both Python classes and C extension types. Extension types + # don't use `__slots__` for slot creation case None: - return + slots = [] + if getattr(cls, '__weakrefoffset__', -1) != 0: + slots.append('__weakref__') + if getattr(cls, '__dictoffset__', -1) != 0: + slots.append('__dict__') + yield from slots case str(slot): yield slot # Slots may be any iterable, but we cannot handle an iterator @@ -1321,58 +1360,69 @@ def asdict(obj, *, dict_factory=dict): def _asdict_inner(obj, dict_factory): - if type(obj) in _ATOMIC_TYPES: + obj_type = type(obj) + if obj_type in _ATOMIC_TYPES: return obj - elif _is_dataclass_instance(obj): - # fast path for the common case + elif hasattr(obj_type, _FIELDS): + # dataclass instance: fast path for the common case if dict_factory is dict: return { f.name: _asdict_inner(getattr(obj, f.name), dict) for f in fields(obj) } else: - result = [] - for f in fields(obj): - value = _asdict_inner(getattr(obj, f.name), dict_factory) - result.append((f.name, value)) - return dict_factory(result) - elif isinstance(obj, tuple) and hasattr(obj, '_fields'): - # obj is a namedtuple. Recurse into it, but the returned - # object is another namedtuple of the same type. This is - # similar to how other list- or tuple-derived classes are - # treated (see below), but we just need to create them - # differently because a namedtuple's __init__ needs to be - # called differently (see bpo-34363). - - # I'm not using namedtuple's _asdict() - # method, because: - # - it does not recurse in to the namedtuple fields and - # convert them to dicts (using dict_factory). - # - I don't actually want to return a dict here. The main - # use case here is json.dumps, and it handles converting - # namedtuples to lists. Admittedly we're losing some - # information here when we produce a json list instead of a - # dict. Note that if we returned dicts here instead of - # namedtuples, we could no longer call asdict() on a data - # structure where a namedtuple was used as a dict key. - - return type(obj)(*[_asdict_inner(v, dict_factory) for v in obj]) - elif isinstance(obj, (list, tuple)): - # Assume we can create an object of this type by passing in a - # generator (which is not true for namedtuples, handled - # above). - return type(obj)(_asdict_inner(v, dict_factory) for v in obj) - elif isinstance(obj, dict): - if hasattr(type(obj), 'default_factory'): + return dict_factory([ + (f.name, _asdict_inner(getattr(obj, f.name), dict_factory)) + for f in fields(obj) + ]) + # handle the builtin types first for speed; subclasses handled below + elif obj_type is list: + return [_asdict_inner(v, dict_factory) for v in obj] + elif obj_type is dict: + return { + _asdict_inner(k, dict_factory): _asdict_inner(v, dict_factory) + for k, v in obj.items() + } + elif obj_type is tuple: + return tuple([_asdict_inner(v, dict_factory) for v in obj]) + elif issubclass(obj_type, tuple): + if hasattr(obj, '_fields'): + # obj is a namedtuple. Recurse into it, but the returned + # object is another namedtuple of the same type. This is + # similar to how other list- or tuple-derived classes are + # treated (see below), but we just need to create them + # differently because a namedtuple's __init__ needs to be + # called differently (see bpo-34363). + + # I'm not using namedtuple's _asdict() + # method, because: + # - it does not recurse in to the namedtuple fields and + # convert them to dicts (using dict_factory). + # - I don't actually want to return a dict here. The main + # use case here is json.dumps, and it handles converting + # namedtuples to lists. Admittedly we're losing some + # information here when we produce a json list instead of a + # dict. Note that if we returned dicts here instead of + # namedtuples, we could no longer call asdict() on a data + # structure where a namedtuple was used as a dict key. + return obj_type(*[_asdict_inner(v, dict_factory) for v in obj]) + else: + return obj_type(_asdict_inner(v, dict_factory) for v in obj) + elif issubclass(obj_type, dict): + if hasattr(obj_type, 'default_factory'): # obj is a defaultdict, which has a different constructor from # dict as it requires the default_factory as its first arg. - result = type(obj)(getattr(obj, 'default_factory')) + result = obj_type(obj.default_factory) for k, v in obj.items(): result[_asdict_inner(k, dict_factory)] = _asdict_inner(v, dict_factory) return result - return type(obj)((_asdict_inner(k, dict_factory), - _asdict_inner(v, dict_factory)) - for k, v in obj.items()) + return obj_type((_asdict_inner(k, dict_factory), + _asdict_inner(v, dict_factory)) + for k, v in obj.items()) + elif issubclass(obj_type, list): + # Assume we can create an object of this type by passing in a + # generator + return obj_type(_asdict_inner(v, dict_factory) for v in obj) else: return copy.deepcopy(obj) @@ -1405,11 +1455,10 @@ def _astuple_inner(obj, tuple_factory): if type(obj) in _ATOMIC_TYPES: return obj elif _is_dataclass_instance(obj): - result = [] - for f in fields(obj): - value = _astuple_inner(getattr(obj, f.name), tuple_factory) - result.append(value) - return tuple_factory(result) + return tuple_factory([ + _astuple_inner(getattr(obj, f.name), tuple_factory) + for f in fields(obj) + ]) elif isinstance(obj, tuple) and hasattr(obj, '_fields'): # obj is a namedtuple. Recurse into it, but the returned # object is another namedtuple of the same type. This is @@ -1542,17 +1591,19 @@ def replace(obj, /, **changes): c1 = replace(c, x=3) assert c1.x == 3 and c1.y == 2 """ - - # We're going to mutate 'changes', but that's okay because it's a - # new dict, even if called with 'replace(obj, **my_changes)'. - if not _is_dataclass_instance(obj): raise TypeError("replace() should be called on dataclass instances") + return _replace(obj, **changes) + + +def _replace(self, /, **changes): + # We're going to mutate 'changes', but that's okay because it's a + # new dict, even if called with 'replace(self, **my_changes)'. # It's an error to have init=False fields in 'changes'. - # If a field is not in 'changes', read its value from the provided obj. + # If a field is not in 'changes', read its value from the provided 'self'. - for f in getattr(obj, _FIELDS).values(): + for f in getattr(self, _FIELDS).values(): # Only consider normal fields or InitVars. if f._field_type is _FIELD_CLASSVAR: continue @@ -1560,20 +1611,20 @@ def replace(obj, /, **changes): if not f.init: # Error if this field is specified in changes. if f.name in changes: - raise ValueError(f'field {f.name} is declared with ' - 'init=False, it cannot be specified with ' - 'replace()') + raise TypeError(f'field {f.name} is declared with ' + f'init=False, it cannot be specified with ' + f'replace()') continue if f.name not in changes: if f._field_type is _FIELD_INITVAR and f.default is MISSING: - raise ValueError(f"InitVar {f.name!r} " - 'must be specified with replace()') - changes[f.name] = getattr(obj, f.name) + raise TypeError(f"InitVar {f.name!r} " + f'must be specified with replace()') + changes[f.name] = getattr(self, f.name) # Create the new object, which calls __init__() and # __post_init__() (if defined), using all of the init fields we've # added and/or left in 'changes'. If there are values supplied in # changes that aren't fields, this will correctly raise a # TypeError. - return obj.__class__(**changes) + return self.__class__(**changes) diff --git a/Lib/dbm/__init__.py b/Lib/dbm/__init__.py index 8055d376..4fdbc54e 100644 --- a/Lib/dbm/__init__.py +++ b/Lib/dbm/__init__.py @@ -5,7 +5,7 @@ Use import dbm d = dbm.open(file, 'w', 0o666) -The returned object is a dbm.gnu, dbm.ndbm or dbm.dumb object, dependent on the +The returned object is a dbm.sqlite3, dbm.gnu, dbm.ndbm or dbm.dumb database object, dependent on the type of database being opened (determined by the whichdb function) in the case of an existing dbm. If the dbm does not exist and the create or new flag ('c' or 'n') was specified, the dbm type will be determined by the availability of @@ -38,7 +38,7 @@ import sys class error(Exception): pass -_names = ['dbm.gnu', 'dbm.ndbm', 'dbm.dumb'] +_names = ['dbm.sqlite3', 'dbm.gnu', 'dbm.ndbm', 'dbm.dumb'] _defaultmod = None _modules = {} @@ -164,6 +164,10 @@ def whichdb(filename): if len(s) != 4: return "" + # Check for SQLite3 header string. + if s16 == b"SQLite format 3\0": + return "dbm.sqlite3" + # Convert to 4-byte int in native byte order -- return "" if impossible try: (magic,) = struct.unpack("=l", s) diff --git a/Lib/dbm/dumb.py b/Lib/dbm/dumb.py index 754624cc..def120ff 100644 --- a/Lib/dbm/dumb.py +++ b/Lib/dbm/dumb.py @@ -98,7 +98,8 @@ class _Database(collections.abc.MutableMapping): except OSError: if flag not in ('c', 'n'): raise - self._modified = True + with self._io.open(self._dirfile, 'w', encoding="Latin-1") as f: + self._chmod(self._dirfile) else: with f: for line in f: @@ -134,6 +135,7 @@ class _Database(collections.abc.MutableMapping): # position; UTF-8, though, does care sometimes. entry = "%r, %r\n" % (key.decode('Latin-1'), pos_and_siz_pair) f.write(entry) + self._modified = False sync = _commit diff --git a/Lib/dbm/sqlite3.py b/Lib/dbm/sqlite3.py new file mode 100644 index 00000000..7e0ae2a2 --- /dev/null +++ b/Lib/dbm/sqlite3.py @@ -0,0 +1,140 @@ +import os +import sqlite3 +from pathlib import Path +from contextlib import suppress, closing +from collections.abc import MutableMapping + +BUILD_TABLE = """ + CREATE TABLE IF NOT EXISTS Dict ( + key BLOB UNIQUE NOT NULL, + value BLOB NOT NULL + ) +""" +GET_SIZE = "SELECT COUNT (key) FROM Dict" +LOOKUP_KEY = "SELECT value FROM Dict WHERE key = CAST(? AS BLOB)" +STORE_KV = "REPLACE INTO Dict (key, value) VALUES (CAST(? AS BLOB), CAST(? AS BLOB))" +DELETE_KEY = "DELETE FROM Dict WHERE key = CAST(? AS BLOB)" +ITER_KEYS = "SELECT key FROM Dict" + + +class error(OSError): + pass + + +_ERR_CLOSED = "DBM object has already been closed" +_ERR_REINIT = "DBM object does not support reinitialization" + + +def _normalize_uri(path): + path = Path(path) + uri = path.absolute().as_uri() + while "//" in uri: + uri = uri.replace("//", "/") + return uri + + +class _Database(MutableMapping): + + def __init__(self, path, /, *, flag, mode): + if hasattr(self, "_cx"): + raise error(_ERR_REINIT) + + path = os.fsdecode(path) + match flag: + case "r": + flag = "ro" + case "w": + flag = "rw" + case "c": + flag = "rwc" + Path(path).touch(mode=mode, exist_ok=True) + case "n": + flag = "rwc" + Path(path).unlink(missing_ok=True) + Path(path).touch(mode=mode) + case _: + raise ValueError("Flag must be one of 'r', 'w', 'c', or 'n', " + f"not {flag!r}") + + # We use the URI format when opening the database. + uri = _normalize_uri(path) + uri = f"{uri}?mode={flag}" + + try: + self._cx = sqlite3.connect(uri, autocommit=True, uri=True) + except sqlite3.Error as exc: + raise error(str(exc)) + + # This is an optimization only; it's ok if it fails. + with suppress(sqlite3.OperationalError): + self._cx.execute("PRAGMA journal_mode = wal") + + if flag == "rwc": + self._execute(BUILD_TABLE) + + def _execute(self, *args, **kwargs): + if not self._cx: + raise error(_ERR_CLOSED) + try: + return closing(self._cx.execute(*args, **kwargs)) + except sqlite3.Error as exc: + raise error(str(exc)) + + def __len__(self): + with self._execute(GET_SIZE) as cu: + row = cu.fetchone() + return row[0] + + def __getitem__(self, key): + with self._execute(LOOKUP_KEY, (key,)) as cu: + row = cu.fetchone() + if not row: + raise KeyError(key) + return row[0] + + def __setitem__(self, key, value): + self._execute(STORE_KV, (key, value)) + + def __delitem__(self, key): + with self._execute(DELETE_KEY, (key,)) as cu: + if not cu.rowcount: + raise KeyError(key) + + def __iter__(self): + try: + with self._execute(ITER_KEYS) as cu: + for row in cu: + yield row[0] + except sqlite3.Error as exc: + raise error(str(exc)) + + def close(self): + if self._cx: + self._cx.close() + self._cx = None + + def keys(self): + return list(super().keys()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +def open(filename, /, flag="r", mode=0o666): + """Open a dbm.sqlite3 database and return the dbm object. + + The 'filename' parameter is the name of the database file. + + The optional 'flag' parameter can be one of ...: + 'r' (default): open an existing database for read only access + 'w': open an existing database for read/write access + 'c': create a database if it does not exist; open for read/write access + 'n': always create a new, empty database; open for read/write access + + The optional 'mode' parameter is the Unix file access mode of the database; + only used when creating a new database. Default: 0o666. + """ + return _Database(filename, flag=flag, mode=mode) diff --git a/Lib/decimal.py b/Lib/decimal.py index 7746ea26..ee3147f5 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -1,11 +1,109 @@ +"""Decimal fixed-point and floating-point arithmetic. + +This is an implementation of decimal floating-point arithmetic based on +the General Decimal Arithmetic Specification: + + http://speleotrove.com/decimal/decarith.html + +and IEEE standard 854-1987: + + http://en.wikipedia.org/wiki/IEEE_854-1987 + +Decimal floating point has finite precision with arbitrarily large bounds. + +The purpose of this module is to support arithmetic using familiar +"schoolhouse" rules and to avoid some of the tricky representation +issues associated with binary floating point. The package is especially +useful for financial applications or for contexts where users have +expectations that are at odds with binary floating point (for instance, +in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead +of 0.0; Decimal('1.00') % Decimal('0.1') returns the expected +Decimal('0.00')). + +Here are some examples of using the decimal module: + +>>> from decimal import * +>>> setcontext(ExtendedContext) +>>> Decimal(0) +Decimal('0') +>>> Decimal('1') +Decimal('1') +>>> Decimal('-.0123') +Decimal('-0.0123') +>>> Decimal(123456) +Decimal('123456') +>>> Decimal('123.45e12345678') +Decimal('1.2345E+12345680') +>>> Decimal('1.33') + Decimal('1.27') +Decimal('2.60') +>>> Decimal('12.34') + Decimal('3.87') - Decimal('18.41') +Decimal('-2.20') +>>> dig = Decimal(1) +>>> print(dig / Decimal(3)) +0.333333333 +>>> getcontext().prec = 18 +>>> print(dig / Decimal(3)) +0.333333333333333333 +>>> print(dig.sqrt()) +1 +>>> print(Decimal(3).sqrt()) +1.73205080756887729 +>>> print(Decimal(3) ** 123) +4.85192780976896427E+58 +>>> inf = Decimal(1) / Decimal(0) +>>> print(inf) +Infinity +>>> neginf = Decimal(-1) / Decimal(0) +>>> print(neginf) +-Infinity +>>> print(neginf + inf) +NaN +>>> print(neginf * inf) +-Infinity +>>> print(dig / 0) +Infinity +>>> getcontext().traps[DivisionByZero] = 1 +>>> print(dig / 0) +Traceback (most recent call last): + ... + ... + ... +decimal.DivisionByZero: x / 0 +>>> c = Context() +>>> c.traps[InvalidOperation] = 0 +>>> print(c.flags[InvalidOperation]) +0 +>>> c.divide(Decimal(0), Decimal(0)) +Decimal('NaN') +>>> c.traps[InvalidOperation] = 1 +>>> print(c.flags[InvalidOperation]) +1 +>>> c.flags[InvalidOperation] = 0 +>>> print(c.flags[InvalidOperation]) +0 +>>> print(c.divide(Decimal(0), Decimal(0))) +Traceback (most recent call last): + ... + ... + ... +decimal.InvalidOperation: 0 / 0 +>>> print(c.flags[InvalidOperation]) +1 +>>> c.flags[InvalidOperation] = 0 +>>> c.traps[InvalidOperation] = 0 +>>> print(c.divide(Decimal(0), Decimal(0))) +NaN +>>> print(c.flags[InvalidOperation]) +1 +>>> +""" try: from _decimal import * - from _decimal import __doc__ from _decimal import __version__ from _decimal import __libmpdec_version__ except ImportError: - from _pydecimal import * - from _pydecimal import __doc__ - from _pydecimal import __version__ - from _pydecimal import __libmpdec_version__ + import _pydecimal + import sys + _pydecimal.__doc__ = __doc__ + sys.modules[__name__] = _pydecimal diff --git a/Lib/dis.py b/Lib/dis.py index 3a8e6ac3..76934eb0 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -14,9 +14,11 @@ from opcode import ( _intrinsic_1_descs, _intrinsic_2_descs, _specializations, - _specialized_instructions, + _specialized_opmap, ) +from _opcode import get_executor + __all__ = ["code_info", "dis", "disassemble", "distb", "disco", "findlinestarts", "findlabels", "show_code", "get_instructions", "Instruction", "Bytecode"] + _opcodes_all @@ -25,16 +27,12 @@ del _opcodes_all _have_code = (types.MethodType, types.FunctionType, types.CodeType, classmethod, staticmethod, type) -FORMAT_VALUE = opmap['FORMAT_VALUE'] -FORMAT_VALUE_CONVERTERS = ( - (None, ''), - (str, 'str'), - (repr, 'repr'), - (ascii, 'ascii'), -) -MAKE_FUNCTION = opmap['MAKE_FUNCTION'] -MAKE_FUNCTION_FLAGS = ('defaults', 'kwdefaults', 'annotations', 'closure') +CONVERT_VALUE = opmap['CONVERT_VALUE'] + +SET_FUNCTION_ATTRIBUTE = opmap['SET_FUNCTION_ATTRIBUTE'] +FUNCTION_ATTR_FLAGS = ('defaults', 'kwdefaults', 'annotations', 'closure') +ENTER_EXECUTOR = opmap['ENTER_EXECUTOR'] LOAD_CONST = opmap['LOAD_CONST'] RETURN_CONST = opmap['RETURN_CONST'] LOAD_GLOBAL = opmap['LOAD_GLOBAL'] @@ -46,16 +44,19 @@ LOAD_ATTR = opmap['LOAD_ATTR'] LOAD_SUPER_ATTR = opmap['LOAD_SUPER_ATTR'] CALL_INTRINSIC_1 = opmap['CALL_INTRINSIC_1'] CALL_INTRINSIC_2 = opmap['CALL_INTRINSIC_2'] +LOAD_FAST_LOAD_FAST = opmap['LOAD_FAST_LOAD_FAST'] +STORE_FAST_LOAD_FAST = opmap['STORE_FAST_LOAD_FAST'] +STORE_FAST_STORE_FAST = opmap['STORE_FAST_STORE_FAST'] CACHE = opmap["CACHE"] _all_opname = list(opname) _all_opmap = dict(opmap) -_empty_slot = [slot for slot, name in enumerate(_all_opname) if name.startswith("<")] -for spec_op, specialized in zip(_empty_slot, _specialized_instructions): +for name, op in _specialized_opmap.items(): # fill opname and opmap - _all_opname[spec_op] = specialized - _all_opmap[specialized] = spec_op + assert op < len(_all_opname) + _all_opname[op] = name + _all_opmap[name] = op deoptmap = { specialized: base for base, family in _specializations.items() for specialized in family @@ -74,7 +75,8 @@ def _try_compile(source, name): pass return compile(source, name, 'exec') -def dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False): +def dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, + show_offsets=False): """Disassemble classes, methods, functions, and other compiled objects. With no argument, disassemble the last traceback. @@ -84,7 +86,8 @@ def dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False): in a special attribute. """ if x is None: - distb(file=file, show_caches=show_caches, adaptive=adaptive) + distb(file=file, show_caches=show_caches, adaptive=adaptive, + show_offsets=show_offsets) return # Extract functions from methods. if hasattr(x, '__func__'): @@ -105,21 +108,28 @@ def dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False): if isinstance(x1, _have_code): print("Disassembly of %s:" % name, file=file) try: - dis(x1, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive) + dis(x1, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive, show_offsets=show_offsets) except TypeError as msg: print("Sorry:", msg, file=file) print(file=file) elif hasattr(x, 'co_code'): # Code object - _disassemble_recursive(x, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive) + _disassemble_recursive(x, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive, show_offsets=show_offsets) elif isinstance(x, (bytes, bytearray)): # Raw bytecode - _disassemble_bytes(x, file=file, show_caches=show_caches) + labels_map = _make_labels_map(x) + label_width = 4 + len(str(len(labels_map))) + formatter = Formatter(file=file, + offset_width=len(str(max(len(x) - 2, 9999))) if show_offsets else 0, + label_width=label_width, + show_caches=show_caches) + arg_resolver = ArgResolver(labels_map=labels_map) + _disassemble_bytes(x, arg_resolver=arg_resolver, formatter=formatter) elif isinstance(x, str): # Source code - _disassemble_str(x, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive) + _disassemble_str(x, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive, show_offsets=show_offsets) else: raise TypeError("don't know how to disassemble %s objects" % type(x).__name__) -def distb(tb=None, *, file=None, show_caches=False, adaptive=False): +def distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offsets=False): """Disassemble a traceback (default: last traceback).""" if tb is None: try: @@ -130,7 +140,7 @@ def distb(tb=None, *, file=None, show_caches=False, adaptive=False): except AttributeError: raise RuntimeError("no last traceback to disassemble") from None while tb.tb_next: tb = tb.tb_next - disassemble(tb.tb_frame.f_code, tb.tb_lasti, file=file, show_caches=show_caches, adaptive=adaptive) + disassemble(tb.tb_frame.f_code, tb.tb_lasti, file=file, show_caches=show_caches, adaptive=adaptive, show_offsets=show_offsets) # The inspect module interrogates this dictionary to build its # list of CO_* constants. It is also used by pretty_flags to @@ -197,7 +207,27 @@ def _deoptop(op): return _all_opmap[deoptmap[name]] if name in deoptmap else op def _get_code_array(co, adaptive): - return co._co_code_adaptive if adaptive else co.co_code + if adaptive: + code = co._co_code_adaptive + res = [] + found = False + for i in range(0, len(code), 2): + op, arg = code[i], code[i+1] + if op == ENTER_EXECUTOR: + try: + ex = get_executor(co, i) + except (ValueError, RuntimeError): + ex = None + + if ex: + op, arg = ex.get_opcode(), ex.get_oparg() + found = True + + res.append(op.to_bytes()) + res.append(arg.to_bytes()) + return code if not found else b''.join(res) + else: + return co.co_code def code_info(x): """Formatted details of methods, functions, or code.""" @@ -262,11 +292,14 @@ _Instruction = collections.namedtuple( 'argval', 'argrepr', 'offset', + 'start_offset', 'starts_line', - 'is_jump_target', - 'positions' + 'line_number', + 'label', + 'positions', + 'cache_info', ], - defaults=[None] + defaults=[None, None, None] ) _Instruction.opname.__doc__ = "Human readable name for operation" @@ -275,18 +308,48 @@ _Instruction.arg.__doc__ = "Numeric argument to operation (if any), otherwise No _Instruction.argval.__doc__ = "Resolved arg value (if known), otherwise same as arg" _Instruction.argrepr.__doc__ = "Human readable description of operation argument" _Instruction.offset.__doc__ = "Start index of operation within bytecode sequence" -_Instruction.starts_line.__doc__ = "Line started by this opcode (if any), otherwise None" -_Instruction.is_jump_target.__doc__ = "True if other code jumps to here, otherwise False" +_Instruction.start_offset.__doc__ = ( + "Start index of operation within bytecode sequence, including extended args if present; " + "otherwise equal to Instruction.offset" +) +_Instruction.starts_line.__doc__ = "True if this opcode starts a source line, otherwise False" +_Instruction.line_number.__doc__ = "source line number associated with this opcode (if any), otherwise None" +_Instruction.label.__doc__ = "A label (int > 0) if this instruction is a jump target, otherwise None" _Instruction.positions.__doc__ = "dis.Positions object holding the span of source code covered by this instruction" +_Instruction.cache_info.__doc__ = "list of (name, size, data), one for each cache entry of the instruction" -_ExceptionTableEntry = collections.namedtuple("_ExceptionTableEntry", +_ExceptionTableEntryBase = collections.namedtuple("_ExceptionTableEntryBase", "start end target depth lasti") +class _ExceptionTableEntry(_ExceptionTableEntryBase): + pass + _OPNAME_WIDTH = 20 _OPARG_WIDTH = 5 +def _get_cache_size(opname): + return _inline_cache_entries.get(opname, 0) + +def _get_jump_target(op, arg, offset): + """Gets the bytecode offset of the jump target if this is a jump instruction. + + Otherwise return None. + """ + deop = _deoptop(op) + caches = _get_cache_size(_all_opname[deop]) + if deop in hasjrel: + if _is_backward_jump(deop): + arg = -arg + target = offset + 2 + arg*2 + target += 2 * caches + elif deop in hasjabs: + target = arg*2 + else: + target = None + return target + class Instruction(_Instruction): - """Details for a bytecode operation + """Details for a bytecode operation. Defined fields: opname - human readable name for operation @@ -295,51 +358,252 @@ class Instruction(_Instruction): argval - resolved arg value (if known), otherwise same as arg argrepr - human readable description of operation argument offset - start index of operation within bytecode sequence - starts_line - line started by this opcode (if any), otherwise None - is_jump_target - True if other code jumps to here, otherwise False + start_offset - start index of operation within bytecode sequence including extended args if present; + otherwise equal to Instruction.offset + starts_line - True if this opcode starts a source line, otherwise False + line_number - source line number associated with this opcode (if any), otherwise None + label - A label if this instruction is a jump target, otherwise None positions - Optional dis.Positions object holding the span of source code covered by this instruction + cache_info - information about the format and content of the instruction's cache + entries (if any) """ - def _disassemble(self, lineno_width=3, mark_as_current=False, offset_width=4): - """Format instruction details for inclusion in disassembly output + @property + def oparg(self): + """Alias for Instruction.arg.""" + return self.arg + + @property + def baseopcode(self): + """Numeric code for the base operation if operation is specialized. + + Otherwise equal to Instruction.opcode. + """ + return _deoptop(self.opcode) + + @property + def baseopname(self): + """Human readable name for the base operation if operation is specialized. + Otherwise equal to Instruction.opname. + """ + return opname[self.baseopcode] + + @property + def cache_offset(self): + """Start index of the cache entries following the operation.""" + return self.offset + 2 + + @property + def end_offset(self): + """End index of the cache entries following the operation.""" + return self.cache_offset + _get_cache_size(_all_opname[self.opcode])*2 + + @property + def jump_target(self): + """Bytecode index of the jump target if this is a jump operation. + + Otherwise return None. + """ + return _get_jump_target(self.opcode, self.arg, self.offset) + + @property + def is_jump_target(self): + """True if other code jumps to here, otherwise False""" + return self.label is not None + + def __str__(self): + output = io.StringIO() + formatter = Formatter(file=output) + formatter.print_instruction(self, False) + return output.getvalue() + + +class Formatter: + + def __init__(self, file=None, lineno_width=0, offset_width=0, label_width=0, + line_offset=0, show_caches=False): + """Create a Formatter + + *file* where to write the output *lineno_width* sets the width of the line number field (0 omits it) - *mark_as_current* inserts a '-->' marker arrow as part of the line *offset_width* sets the width of the instruction offset field + *label_width* sets the width of the label field + *show_caches* is a boolean indicating whether to display cache lines + """ + self.file = file + self.lineno_width = lineno_width + self.offset_width = offset_width + self.label_width = label_width + self.show_caches = show_caches + + def print_instruction(self, instr, mark_as_current=False): + self.print_instruction_line(instr, mark_as_current) + if self.show_caches and instr.cache_info: + offset = instr.offset + for name, size, data in instr.cache_info: + for i in range(size): + offset += 2 + # Only show the fancy argrepr for a CACHE instruction when it's + # the first entry for a particular cache value: + if i == 0: + argrepr = f"{name}: {int.from_bytes(data, sys.byteorder)}" + else: + argrepr = "" + self.print_instruction_line( + Instruction("CACHE", CACHE, 0, None, argrepr, offset, offset, + False, None, None, instr.positions), + False) + + def print_instruction_line(self, instr, mark_as_current): + """Format instruction details for inclusion in disassembly output.""" + lineno_width = self.lineno_width + offset_width = self.offset_width + label_width = self.label_width + + new_source_line = (lineno_width > 0 and + instr.starts_line and + instr.offset > 0) + if new_source_line: + print(file=self.file) + fields = [] # Column: Source code line number if lineno_width: - if self.starts_line is not None: - lineno_fmt = "%%%dd" % lineno_width - fields.append(lineno_fmt % self.starts_line) + if instr.starts_line: + lineno_fmt = "%%%dd" if instr.line_number is not None else "%%%ds" + lineno_fmt = lineno_fmt % lineno_width + lineno = _NO_LINENO if instr.line_number is None else instr.line_number + fields.append(lineno_fmt % lineno) else: fields.append(' ' * lineno_width) + # Column: Label + if instr.label is not None: + lbl = f"L{instr.label}:" + fields.append(f"{lbl:>{label_width}}") + else: + fields.append(' ' * label_width) + # Column: Instruction offset from start of code sequence + if offset_width > 0: + fields.append(f"{repr(instr.offset):>{offset_width}} ") # Column: Current instruction indicator if mark_as_current: fields.append('-->') else: fields.append(' ') - # Column: Jump target marker - if self.is_jump_target: - fields.append('>>') - else: - fields.append(' ') - # Column: Instruction offset from start of code sequence - fields.append(repr(self.offset).rjust(offset_width)) # Column: Opcode name - fields.append(self.opname.ljust(_OPNAME_WIDTH)) + fields.append(instr.opname.ljust(_OPNAME_WIDTH)) # Column: Opcode argument - if self.arg is not None: - fields.append(repr(self.arg).rjust(_OPARG_WIDTH)) + if instr.arg is not None: + arg = repr(instr.arg) + # If opname is longer than _OPNAME_WIDTH, we allow it to overflow into + # the space reserved for oparg. This results in fewer misaligned opargs + # in the disassembly output. + opname_excess = max(0, len(instr.opname) - _OPNAME_WIDTH) + fields.append(repr(instr.arg).rjust(_OPARG_WIDTH - opname_excess)) # Column: Opcode argument details - if self.argrepr: - fields.append('(' + self.argrepr + ')') - return ' '.join(fields).rstrip() - + if instr.argrepr: + fields.append('(' + instr.argrepr + ')') + print(' '.join(fields).rstrip(), file=self.file) + + def print_exception_table(self, exception_entries): + file = self.file + if exception_entries: + print("ExceptionTable:", file=file) + for entry in exception_entries: + lasti = " lasti" if entry.lasti else "" + start = entry.start_label + end = entry.end_label + target = entry.target_label + print(f" L{start} to L{end} -> L{target} [{entry.depth}]{lasti}", file=file) + + +class ArgResolver: + def __init__(self, co_consts=None, names=None, varname_from_oparg=None, labels_map=None): + self.co_consts = co_consts + self.names = names + self.varname_from_oparg = varname_from_oparg + self.labels_map = labels_map or {} + + def offset_from_jump_arg(self, op, arg, offset): + deop = _deoptop(op) + if deop in hasjabs: + return arg * 2 + elif deop in hasjrel: + signed_arg = -arg if _is_backward_jump(deop) else arg + argval = offset + 2 + signed_arg*2 + caches = _get_cache_size(_all_opname[deop]) + argval += 2 * caches + return argval + return None + + def get_label_for_offset(self, offset): + return self.labels_map.get(offset, None) + + def get_argval_argrepr(self, op, arg, offset): + get_name = None if self.names is None else self.names.__getitem__ + argval = None + argrepr = '' + deop = _deoptop(op) + if arg is not None: + # Set argval to the dereferenced value of the argument when + # available, and argrepr to the string representation of argval. + # _disassemble_bytes needs the string repr of the + # raw name index for LOAD_GLOBAL, LOAD_CONST, etc. + argval = arg + if deop in hasconst: + argval, argrepr = _get_const_info(deop, arg, self.co_consts) + elif deop in hasname: + if deop == LOAD_GLOBAL: + argval, argrepr = _get_name_info(arg//2, get_name) + if (arg & 1) and argrepr: + argrepr = f"{argrepr} + NULL" + elif deop == LOAD_ATTR: + argval, argrepr = _get_name_info(arg//2, get_name) + if (arg & 1) and argrepr: + argrepr = f"{argrepr} + NULL|self" + elif deop == LOAD_SUPER_ATTR: + argval, argrepr = _get_name_info(arg//4, get_name) + if (arg & 1) and argrepr: + argrepr = f"{argrepr} + NULL|self" + else: + argval, argrepr = _get_name_info(arg, get_name) + elif deop in hasjump or deop in hasexc: + argval = self.offset_from_jump_arg(op, arg, offset) + lbl = self.get_label_for_offset(argval) + assert lbl is not None + argrepr = f"to L{lbl}" + elif deop in (LOAD_FAST_LOAD_FAST, STORE_FAST_LOAD_FAST, STORE_FAST_STORE_FAST): + arg1 = arg >> 4 + arg2 = arg & 15 + val1, argrepr1 = _get_name_info(arg1, self.varname_from_oparg) + val2, argrepr2 = _get_name_info(arg2, self.varname_from_oparg) + argrepr = argrepr1 + ", " + argrepr2 + argval = val1, val2 + elif deop in haslocal or deop in hasfree: + argval, argrepr = _get_name_info(arg, self.varname_from_oparg) + elif deop in hascompare: + argval = cmp_op[arg >> 5] + argrepr = argval + if arg & 16: + argrepr = f"bool({argrepr})" + elif deop == CONVERT_VALUE: + argval = (None, str, repr, ascii)[arg] + argrepr = ('', 'str', 'repr', 'ascii')[arg] + elif deop == SET_FUNCTION_ATTRIBUTE: + argrepr = ', '.join(s for i, s in enumerate(FUNCTION_ATTR_FLAGS) + if arg & (1<>4] - argrepr = argval - elif deop == FORMAT_VALUE: - argval, argrepr = FORMAT_VALUE_CONVERTERS[arg & 0x3] - argval = (argval, bool(arg & 0x4)) - if argval[1]: - if argrepr: - argrepr += ', ' - argrepr += 'with format' - elif deop == MAKE_FUNCTION: - argrepr = ', '.join(s for i, s in enumerate(MAKE_FUNCTION_FLAGS) - if arg & (1< 0: if depth is not None: depth = depth - 1 @@ -560,53 +786,66 @@ def _disassemble_recursive(co, *, file=None, depth=None, show_caches=False, adap print(file=file) print("Disassembly of %r:" % (x,), file=file) _disassemble_recursive( - x, file=file, depth=depth, show_caches=show_caches, adaptive=adaptive + x, file=file, depth=depth, show_caches=show_caches, + adaptive=adaptive, show_offsets=show_offsets ) -def _disassemble_bytes(code, lasti=-1, varname_from_oparg=None, - names=None, co_consts=None, linestarts=None, - *, file=None, line_offset=0, exception_entries=(), - co_positions=None, show_caches=False): - # Omit the line number column entirely if we have no line number info - show_lineno = bool(linestarts) - if show_lineno: - maxlineno = max(linestarts.values()) + line_offset - if maxlineno >= 1000: - lineno_width = len(str(maxlineno)) - else: - lineno_width = 3 - else: - lineno_width = 0 - maxoffset = len(code) - 2 - if maxoffset >= 10000: - offset_width = len(str(maxoffset)) - else: - offset_width = 4 - for instr in _get_instructions_bytes(code, varname_from_oparg, names, - co_consts, linestarts, - line_offset=line_offset, - exception_entries=exception_entries, - co_positions=co_positions, - show_caches=show_caches): - new_source_line = (show_lineno and - instr.starts_line is not None and - instr.offset > 0) - if new_source_line: - print(file=file) - if show_caches: - is_current_instr = instr.offset == lasti - else: - # Each CACHE takes 2 bytes - is_current_instr = instr.offset <= lasti \ - <= instr.offset + 2 * _inline_cache_entries[_deoptop(instr.opcode)] - print(instr._disassemble(lineno_width, is_current_instr, offset_width), - file=file) - if exception_entries: - print("ExceptionTable:", file=file) - for entry in exception_entries: - lasti = " lasti" if entry.lasti else "" - end = entry.end-2 - print(f" {entry.start} to {end} -> {entry.target} [{entry.depth}]{lasti}", file=file) + +def _make_labels_map(original_code, exception_entries=()): + jump_targets = set(findlabels(original_code)) + labels = set(jump_targets) + for start, end, target, _, _ in exception_entries: + labels.add(start) + labels.add(end) + labels.add(target) + labels = sorted(labels) + labels_map = {offset: i+1 for (i, offset) in enumerate(sorted(labels))} + for e in exception_entries: + e.start_label = labels_map[e.start] + e.end_label = labels_map[e.end] + e.target_label = labels_map[e.target] + return labels_map + +_NO_LINENO = ' --' + +def _get_lineno_width(linestarts): + if linestarts is None: + return 0 + maxlineno = max(filter(None, linestarts.values()), default=-1) + if maxlineno == -1: + # Omit the line number column entirely if we have no line number info + return 0 + lineno_width = max(3, len(str(maxlineno))) + if lineno_width < len(_NO_LINENO) and None in linestarts.values(): + lineno_width = len(_NO_LINENO) + return lineno_width + + +def _disassemble_bytes(code, lasti=-1, linestarts=None, + *, line_offset=0, exception_entries=(), + co_positions=None, original_code=None, + arg_resolver=None, formatter=None): + + assert formatter is not None + assert arg_resolver is not None + + instrs = _get_instructions_bytes(code, linestarts=linestarts, + line_offset=line_offset, + co_positions=co_positions, + original_code=original_code, + arg_resolver=arg_resolver) + + print_instructions(instrs, exception_entries, formatter, lasti=lasti) + + +def print_instructions(instrs, exception_entries, formatter, lasti=-1): + for instr in instrs: + # Each CACHE takes 2 bytes + is_current_instr = instr.offset <= lasti \ + <= instr.offset + 2 * _get_cache_size(_all_opname[_deoptop(instr.opcode)]) + formatter.print_instruction(instr, is_current_instr) + + formatter.print_exception_table(exception_entries) def _disassemble_str(source, **kwargs): """Compile the source string, then disassemble the code object.""" @@ -622,6 +861,7 @@ _INT_OVERFLOW = 2 ** (_INT_BITS - 1) def _unpack_opargs(code): extended_arg = 0 + extended_args_offset = 0 # Number of EXTENDED_ARG instructions preceding the current instruction caches = 0 for i in range(0, len(code), 2): # Skip inline CACHE entries: @@ -630,7 +870,7 @@ def _unpack_opargs(code): continue op = code[i] deop = _deoptop(op) - caches = _inline_cache_entries[deop] + caches = _get_cache_size(_all_opname[deop]) if deop in hasarg: arg = code[i+1] | extended_arg extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0 @@ -642,7 +882,13 @@ def _unpack_opargs(code): else: arg = None extended_arg = 0 - yield (i, op, arg) + if deop == EXTENDED_ARG: + extended_args_offset += 1 + yield (i, i, op, arg) + else: + start_offset = i - extended_args_offset*2 + yield (i, start_offset, op, arg) + extended_args_offset = 0 def findlabels(code): """Detect all offsets in a byte code which are jump targets. @@ -651,18 +897,10 @@ def findlabels(code): """ labels = [] - for offset, op, arg in _unpack_opargs(code): + for offset, _, op, arg in _unpack_opargs(code): if arg is not None: - deop = _deoptop(op) - caches = _inline_cache_entries[deop] - if deop in hasjrel: - if _is_backward_jump(deop): - arg = -arg - label = offset + 2 + arg*2 - label += 2 * caches - elif deop in hasjabs: - label = arg*2 - else: + label = _get_jump_target(op, arg, offset) + if label is None: continue if label not in labels: labels.append(label) @@ -672,10 +910,12 @@ def findlinestarts(code): """Find the offsets in a byte code which are start of lines in the source. Generate pairs (offset, lineno) + lineno will be an integer or None the offset does not have a source line. """ - lastline = None + + lastline = False # None is a valid line number for start, end, line in code.co_lines(): - if line is not None and line != lastline: + if line is not lastline: lastline = line yield start, line return @@ -691,7 +931,7 @@ def _find_imports(co): consts = co.co_consts names = co.co_names - opargs = [(op, arg) for _, op, arg in _unpack_opargs(co.co_code) + opargs = [(op, arg) for _, _, op, arg in _unpack_opargs(co.co_code) if op != EXTENDED_ARG] for i, (op, oparg) in enumerate(opargs): if op == IMPORT_NAME and i >= 2: @@ -713,7 +953,7 @@ def _find_store_names(co): } names = co.co_names - for _, op, arg in _unpack_opargs(co.co_code): + for _, _, op, arg in _unpack_opargs(co.co_code): if op in STORE_OPS: yield names[arg] @@ -726,7 +966,7 @@ class Bytecode: Iterating over this yields the bytecode operations as Instruction instances. """ - def __init__(self, x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False): + def __init__(self, x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False): self.codeobj = co = _get_code_object(x) if first_line is None: self.first_line = co.co_firstlineno @@ -740,17 +980,22 @@ class Bytecode: self.exception_entries = _parse_exception_table(co) self.show_caches = show_caches self.adaptive = adaptive + self.show_offsets = show_offsets def __iter__(self): co = self.codeobj + original_code = co.co_code + labels_map = _make_labels_map(original_code, self.exception_entries) + arg_resolver = ArgResolver(co_consts=co.co_consts, + names=co.co_names, + varname_from_oparg=co._varname_from_oparg, + labels_map=labels_map) return _get_instructions_bytes(_get_code_array(co, self.adaptive), - co._varname_from_oparg, - co.co_names, co.co_consts, - self._linestarts, + linestarts=self._linestarts, line_offset=self._line_offset, - exception_entries=self.exception_entries, co_positions=co.co_positions(), - show_caches=self.show_caches) + original_code=original_code, + arg_resolver=arg_resolver) def __repr__(self): return "{}({!r})".format(self.__class__.__name__, @@ -777,30 +1022,54 @@ class Bytecode: else: offset = -1 with io.StringIO() as output: - _disassemble_bytes(_get_code_array(co, self.adaptive), - varname_from_oparg=co._varname_from_oparg, - names=co.co_names, co_consts=co.co_consts, + code = _get_code_array(co, self.adaptive) + offset_width = len(str(max(len(code) - 2, 9999))) if self.show_offsets else 0 + + + labels_map = _make_labels_map(co.co_code, self.exception_entries) + label_width = 4 + len(str(len(labels_map))) + formatter = Formatter(file=output, + lineno_width=_get_lineno_width(self._linestarts), + offset_width=offset_width, + label_width=label_width, + line_offset=self._line_offset, + show_caches=self.show_caches) + + arg_resolver = ArgResolver(co_consts=co.co_consts, + names=co.co_names, + varname_from_oparg=co._varname_from_oparg, + labels_map=labels_map) + _disassemble_bytes(code, linestarts=self._linestarts, line_offset=self._line_offset, - file=output, lasti=offset, exception_entries=self.exception_entries, co_positions=co.co_positions(), - show_caches=self.show_caches) + original_code=co.co_code, + arg_resolver=arg_resolver, + formatter=formatter) return output.getvalue() -def _test(): - """Simple test program to disassemble a file.""" +def main(): import argparse parser = argparse.ArgumentParser() - parser.add_argument('infile', type=argparse.FileType('rb'), nargs='?', default='-') + parser.add_argument('-C', '--show-caches', action='store_true', + help='show inline caches') + parser.add_argument('-O', '--show-offsets', action='store_true', + help='show instruction offsets') + parser.add_argument('infile', nargs='?', default='-') args = parser.parse_args() - with args.infile as infile: - source = infile.read() - code = compile(source, args.infile.name, "exec") - dis(code) + if args.infile == '-': + name = '' + source = sys.stdin.buffer.read() + else: + name = args.infile + with open(args.infile, 'rb') as infile: + source = infile.read() + code = compile(source, name, "exec") + dis(code, show_caches=args.show_caches, show_offsets=args.show_offsets) if __name__ == "__main__": - _test() + main() diff --git a/Lib/doctest.py b/Lib/doctest.py index a63df46a..c531e3ca 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -104,8 +104,26 @@ import traceback import unittest from io import StringIO, IncrementalNewlineDecoder from collections import namedtuple +import _colorize # Used in doctests +from _colorize import ANSIColors, can_colorize + + +class TestResults(namedtuple('TestResults', 'failed attempted')): + def __new__(cls, failed, attempted, *, skipped=0): + results = super().__new__(cls, failed, attempted) + results.skipped = skipped + return results + + def __repr__(self): + if self.skipped: + return (f'TestResults(failed={self.failed}, ' + f'attempted={self.attempted}, ' + f'skipped={self.skipped})') + else: + # Leave the repr() unchanged for backward compatibility + # if skipped is zero + return super().__repr__() -TestResults = namedtuple('TestResults', 'failed attempted') # There are 4 basic classes: # - Example: a pair, plus an intra-docstring line number. @@ -575,9 +593,11 @@ class DocTest: def __lt__(self, other): if not isinstance(other, DocTest): return NotImplemented - return ((self.name, self.filename, self.lineno, id(self)) + self_lno = self.lineno if self.lineno is not None else -1 + other_lno = other.lineno if other.lineno is not None else -1 + return ((self.name, self.filename, self_lno, id(self)) < - (other.name, other.filename, other.lineno, id(other))) + (other.name, other.filename, other_lno, id(other))) ###################################################################### ## 3. DocTestParser @@ -1118,9 +1138,18 @@ class DocTestFinder: # Find the line number for functions & methods. if inspect.ismethod(obj): obj = obj.__func__ + if isinstance(obj, property): + obj = obj.fget if inspect.isfunction(obj) and getattr(obj, '__doc__', None): # We don't use `docstring` var here, because `obj` can be changed. - obj = obj.__code__ + obj = inspect.unwrap(obj) + try: + obj = obj.__code__ + except AttributeError: + # Functions implemented in C don't necessarily + # have a __code__ attribute. + # If there's no code, there's no lineno + return None if inspect.istraceback(obj): obj = obj.tb_frame if inspect.isframe(obj): obj = obj.f_code if inspect.iscode(obj): @@ -1150,8 +1179,10 @@ class DocTestRunner: """ A class used to run DocTest test cases, and accumulate statistics. The `run` method is used to process a single DocTest case. It - returns a tuple `(f, t)`, where `t` is the number of test cases - tried, and `f` is the number of test cases that failed. + returns a TestResults instance. + + >>> save_colorize = _colorize.COLORIZE + >>> _colorize.COLORIZE = False >>> tests = DocTestFinder().find(_TestClass) >>> runner = DocTestRunner(verbose=False) @@ -1164,27 +1195,29 @@ class DocTestRunner: _TestClass.square -> TestResults(failed=0, attempted=1) The `summarize` method prints a summary of all the test cases that - have been run by the runner, and returns an aggregated `(f, t)` - tuple: + have been run by the runner, and returns an aggregated TestResults + instance: >>> runner.summarize(verbose=1) 4 items passed all tests: 2 tests in _TestClass 2 tests in _TestClass.__init__ 2 tests in _TestClass.get - 1 tests in _TestClass.square + 1 test in _TestClass.square 7 tests in 4 items. - 7 passed and 0 failed. + 7 passed. Test passed. TestResults(failed=0, attempted=7) - The aggregated number of tried examples and failed examples is - also available via the `tries` and `failures` attributes: + The aggregated number of tried examples and failed examples is also + available via the `tries`, `failures` and `skips` attributes: >>> runner.tries 7 >>> runner.failures 0 + >>> runner.skips + 0 The comparison between expected outputs and actual outputs is done by an `OutputChecker`. This comparison may be customized with a @@ -1201,6 +1234,8 @@ class DocTestRunner: can be also customized by subclassing DocTestRunner, and overriding the methods `report_start`, `report_success`, `report_unexpected_exception`, and `report_failure`. + + >>> _colorize.COLORIZE = save_colorize """ # This divider string is used to separate failure messages, and to # separate sections of the summary. @@ -1233,7 +1268,8 @@ class DocTestRunner: # Keep track of the examples we've run. self.tries = 0 self.failures = 0 - self._name2ft = {} + self.skips = 0 + self._stats = {} # Create a fake output target for capturing doctest output. self._fakeout = _SpoofOut() @@ -1278,7 +1314,10 @@ class DocTestRunner: 'Exception raised:\n' + _indent(_exception_traceback(exc_info))) def _failure_header(self, test, example): - out = [self.DIVIDER] + red, reset = ( + (ANSIColors.RED, ANSIColors.RESET) if can_colorize() else ("", "") + ) + out = [f"{red}{self.DIVIDER}{reset}"] if test.filename: if test.lineno is not None and example.lineno is not None: lineno = test.lineno + example.lineno + 1 @@ -1302,13 +1341,11 @@ class DocTestRunner: Run the examples in `test`. Write the outcome of each example with one of the `DocTestRunner.report_*` methods, using the writer function `out`. `compileflags` is the set of compiler - flags that should be used to execute examples. Return a tuple - `(f, t)`, where `t` is the number of examples tried, and `f` - is the number of examples that failed. The examples are run - in the namespace `test.globs`. + flags that should be used to execute examples. Return a TestResults + instance. The examples are run in the namespace `test.globs`. """ - # Keep track of the number of failures and tries. - failures = tries = 0 + # Keep track of the number of failed, attempted, skipped examples. + failures = attempted = skips = 0 # Save the option flags (since option directives can be used # to modify them). @@ -1320,6 +1357,7 @@ class DocTestRunner: # Process each example. for examplenum, example in enumerate(test.examples): + attempted += 1 # If REPORT_ONLY_FIRST_FAILURE is set, then suppress # reporting after the first failure. @@ -1337,10 +1375,10 @@ class DocTestRunner: # If 'SKIP' is set, then skip this example. if self.optionflags & SKIP: + skips += 1 continue # Record that we started this example. - tries += 1 if not quiet: self.report_start(out, test, example) @@ -1376,7 +1414,24 @@ class DocTestRunner: # The example raised an exception: check if it was expected. else: - exc_msg = traceback.format_exception_only(*exception[:2])[-1] + formatted_ex = traceback.format_exception_only(*exception[:2]) + if issubclass(exception[0], SyntaxError): + # SyntaxError / IndentationError is special: + # we don't care about the carets / suggestions / etc + # We only care about the error message and notes. + # They start with `SyntaxError:` (or any other class name) + exception_line_prefixes = ( + f"{exception[0].__qualname__}:", + f"{exception[0].__module__}.{exception[0].__qualname__}:", + ) + exc_msg_index = next( + index + for index, line in enumerate(formatted_ex) + if line.startswith(exception_line_prefixes) + ) + formatted_ex = formatted_ex[exc_msg_index:] + + exc_msg = "".join(formatted_ex) if not quiet: got += _exception_traceback(exception) @@ -1418,19 +1473,22 @@ class DocTestRunner: # Restore the option flags (in case they were modified) self.optionflags = original_optionflags - # Record and return the number of failures and tries. - self.__record_outcome(test, failures, tries) - return TestResults(failures, tries) + # Record and return the number of failures and attempted. + self.__record_outcome(test, failures, attempted, skips) + return TestResults(failures, attempted, skipped=skips) - def __record_outcome(self, test, f, t): + def __record_outcome(self, test, failures, tries, skips): """ - Record the fact that the given DocTest (`test`) generated `f` - failures out of `t` tried examples. + Record the fact that the given DocTest (`test`) generated `failures` + failures out of `tries` tried examples. """ - f2, t2 = self._name2ft.get(test.name, (0,0)) - self._name2ft[test.name] = (f+f2, t+t2) - self.failures += f - self.tries += t + failures2, tries2, skips2 = self._stats.get(test.name, (0, 0, 0)) + self._stats[test.name] = (failures + failures2, + tries + tries2, + skips + skips2) + self.failures += failures + self.tries += tries + self.skips += skips __LINECACHE_FILENAME_RE = re.compile(r'.+)' @@ -1499,7 +1557,11 @@ class DocTestRunner: # Make sure sys.displayhook just prints the value to stdout save_displayhook = sys.displayhook sys.displayhook = sys.__displayhook__ - + saved_can_colorize = _colorize.can_colorize + _colorize.can_colorize = lambda: False + color_variables = {"PYTHON_COLORS": None, "FORCE_COLOR": None} + for key in color_variables: + color_variables[key] = os.environ.pop(key, None) try: return self.__run(test, compileflags, out) finally: @@ -1508,6 +1570,10 @@ class DocTestRunner: sys.settrace(save_trace) linecache.getlines = self.save_linecache_getlines sys.displayhook = save_displayhook + _colorize.can_colorize = saved_can_colorize + for key, value in color_variables.items(): + if value is not None: + os.environ[key] = value if clear_globs: test.globs.clear() import builtins @@ -1519,9 +1585,7 @@ class DocTestRunner: def summarize(self, verbose=None): """ Print a summary of all the test cases that have been run by - this DocTestRunner, and return a tuple `(f, t)`, where `f` is - the total number of failed examples, and `t` is the total - number of tried examples. + this DocTestRunner, and return a TestResults instance. The optional `verbose` argument controls how detailed the summary is. If the verbosity is not specified, then the @@ -1529,66 +1593,98 @@ class DocTestRunner: """ if verbose is None: verbose = self._verbose - notests = [] - passed = [] - failed = [] - totalt = totalf = 0 - for x in self._name2ft.items(): - name, (f, t) = x - assert f <= t - totalt += t - totalf += f - if t == 0: + + notests, passed, failed = [], [], [] + total_tries = total_failures = total_skips = 0 + + for name, (failures, tries, skips) in self._stats.items(): + assert failures <= tries + total_tries += tries + total_failures += failures + total_skips += skips + + if tries == 0: notests.append(name) - elif f == 0: - passed.append( (name, t) ) + elif failures == 0: + passed.append((name, tries)) else: - failed.append(x) + failed.append((name, (failures, tries, skips))) + + ansi = _colorize.get_colors() + bold_green = ansi.BOLD_GREEN + bold_red = ansi.BOLD_RED + green = ansi.GREEN + red = ansi.RED + reset = ansi.RESET + yellow = ansi.YELLOW + if verbose: if notests: - print(len(notests), "items had no tests:") + print(f"{_n_items(notests)} had no tests:") notests.sort() - for thing in notests: - print(" ", thing) + for name in notests: + print(f" {name}") + if passed: - print(len(passed), "items passed all tests:") - passed.sort() - for thing, count in passed: - print(" %3d tests in %s" % (count, thing)) + print(f"{green}{_n_items(passed)} passed all tests:{reset}") + for name, count in sorted(passed): + s = "" if count == 1 else "s" + print(f" {green}{count:3d} test{s} in {name}{reset}") + if failed: - print(self.DIVIDER) - print(len(failed), "items had failures:") - failed.sort() - for thing, (f, t) in failed: - print(" %3d of %3d in %s" % (f, t, thing)) + print(f"{red}{self.DIVIDER}{reset}") + print(f"{_n_items(failed)} had failures:") + for name, (failures, tries, skips) in sorted(failed): + print(f" {failures:3d} of {tries:3d} in {name}") + if verbose: - print(totalt, "tests in", len(self._name2ft), "items.") - print(totalt - totalf, "passed and", totalf, "failed.") - if totalf: - print("***Test Failed***", totalf, "failures.") + s = "" if total_tries == 1 else "s" + print(f"{total_tries} test{s} in {_n_items(self._stats)}.") + + and_f = ( + f" and {red}{total_failures} failed{reset}" + if total_failures else "" + ) + print(f"{green}{total_tries - total_failures} passed{reset}{and_f}.") + + if total_failures: + s = "" if total_failures == 1 else "s" + msg = f"{bold_red}***Test Failed*** {total_failures} failure{s}{reset}" + if total_skips: + s = "" if total_skips == 1 else "s" + msg = f"{msg} and {yellow}{total_skips} skipped test{s}{reset}" + print(f"{msg}.") elif verbose: - print("Test passed.") - return TestResults(totalf, totalt) + print(f"{bold_green}Test passed.{reset}") + + return TestResults(total_failures, total_tries, skipped=total_skips) #///////////////////////////////////////////////////////////////// # Backward compatibility cruft to maintain doctest.master. #///////////////////////////////////////////////////////////////// def merge(self, other): - d = self._name2ft - for name, (f, t) in other._name2ft.items(): + d = self._stats + for name, (failures, tries, skips) in other._stats.items(): if name in d: - # Don't print here by default, since doing - # so breaks some of the buildbots - #print("*** DocTestRunner.merge: '" + name + "' in both" \ - # " testers; summing outcomes.") - f2, t2 = d[name] - f = f + f2 - t = t + t2 - d[name] = f, t + failures2, tries2, skips2 = d[name] + failures = failures + failures2 + tries = tries + tries2 + skips = skips + skips2 + d[name] = (failures, tries, skips) + + +def _n_items(items: list | dict) -> str: + """ + Helper to pluralise the number of items in a list. + """ + n = len(items) + s = "" if n == 1 else "s" + return f"{n} item{s}" + class OutputChecker: """ - A class used to check the whether the actual output from a doctest + A class used to check whether the actual output from a doctest example matches the expected output. `OutputChecker` defines two methods: `check_output`, which compares a given pair of outputs, and returns true if they match; and `output_difference`, which @@ -1984,7 +2080,8 @@ def testmod(m=None, name=None, globs=None, verbose=None, else: master.merge(runner) - return TestResults(runner.failures, runner.tries) + return TestResults(runner.failures, runner.tries, skipped=runner.skips) + def testfile(filename, module_relative=True, name=None, package=None, globs=None, verbose=None, report=True, optionflags=0, @@ -2107,7 +2204,8 @@ def testfile(filename, module_relative=True, name=None, package=None, else: master.merge(runner) - return TestResults(runner.failures, runner.tries) + return TestResults(runner.failures, runner.tries, skipped=runner.skips) + def run_docstring_examples(f, globs, verbose=False, name="NoName", compileflags=None, optionflags=0): @@ -2182,13 +2280,13 @@ class DocTestCase(unittest.TestCase): unittest.TestCase.__init__(self) self._dt_optionflags = optionflags self._dt_checker = checker - self._dt_globs = test.globs.copy() self._dt_test = test self._dt_setUp = setUp self._dt_tearDown = tearDown def setUp(self): test = self._dt_test + self._dt_globs = test.globs.copy() if self._dt_setUp is not None: self._dt_setUp(test) @@ -2219,12 +2317,13 @@ class DocTestCase(unittest.TestCase): try: runner.DIVIDER = "-"*70 - failures, tries = runner.run( - test, out=new.write, clear_globs=False) + results = runner.run(test, out=new.write, clear_globs=False) + if results.skipped == results.attempted: + raise unittest.SkipTest("all examples were skipped") finally: sys.stdout = old - if failures: + if results.failed: raise self.failureException(self.format_failure(new.getvalue())) def format_failure(self, err): diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 0d6bd812..ec2215a5 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -92,6 +92,8 @@ TOKEN_ENDS = TSPECIALS | WSP ASPECIALS = TSPECIALS | set("*'%") ATTRIBUTE_ENDS = ASPECIALS | WSP EXTENDED_ATTRIBUTE_ENDS = ATTRIBUTE_ENDS - set('%') +NLSET = {'\n', '\r'} +SPECIALSNL = SPECIALS | NLSET def quote_string(value): return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"' @@ -566,12 +568,14 @@ class DisplayName(Phrase): if res[0].token_type == 'cfws': res.pop(0) else: - if res[0][0].token_type == 'cfws': + if (isinstance(res[0], TokenList) and + res[0][0].token_type == 'cfws'): res[0] = TokenList(res[0][1:]) if res[-1].token_type == 'cfws': res.pop() else: - if res[-1][-1].token_type == 'cfws': + if (isinstance(res[-1], TokenList) and + res[-1][-1].token_type == 'cfws'): res[-1] = TokenList(res[-1][:-1]) return res.value @@ -586,9 +590,13 @@ class DisplayName(Phrase): quote = True if len(self) != 0 and quote: pre = post = '' - if self[0].token_type=='cfws' or self[0][0].token_type=='cfws': + if (self[0].token_type == 'cfws' or + isinstance(self[0], TokenList) and + self[0][0].token_type == 'cfws'): pre = ' ' - if self[-1].token_type=='cfws' or self[-1][-1].token_type=='cfws': + if (self[-1].token_type == 'cfws' or + isinstance(self[-1], TokenList) and + self[-1][-1].token_type == 'cfws'): post = ' ' return pre+quote_string(self.display_name)+post else: @@ -949,6 +957,8 @@ class _InvalidEwError(errors.HeaderParseError): # up other parse trees. Maybe should have tests for that, too. DOT = ValueTerminal('.', 'dot') ListSeparator = ValueTerminal(',', 'list-separator') +ListSeparator.as_ew_allowed = False +ListSeparator.syntactic_break = False RouteComponentMarker = ValueTerminal('@', 'route-component-marker') # @@ -1206,7 +1216,7 @@ def get_bare_quoted_string(value): value is the text between the quote marks, with whitespace preserved and quoted pairs decoded. """ - if value[0] != '"': + if not value or value[0] != '"': raise errors.HeaderParseError( "expected '\"' but found '{}'".format(value)) bare_quoted_string = BareQuotedString() @@ -1447,7 +1457,7 @@ def get_local_part(value): """ local_part = LocalPart() leader = None - if value[0] in CFWS_LEADER: + if value and value[0] in CFWS_LEADER: leader, value = get_cfws(value) if not value: raise errors.HeaderParseError( @@ -1513,13 +1523,18 @@ def get_obs_local_part(value): raise token, value = get_cfws(value) obs_local_part.append(token) + if not obs_local_part: + raise errors.HeaderParseError( + "expected obs-local-part but found '{}'".format(value)) if (obs_local_part[0].token_type == 'dot' or obs_local_part[0].token_type=='cfws' and + len(obs_local_part) > 1 and obs_local_part[1].token_type=='dot'): obs_local_part.defects.append(errors.InvalidHeaderDefect( "Invalid leading '.' in local part")) if (obs_local_part[-1].token_type == 'dot' or obs_local_part[-1].token_type=='cfws' and + len(obs_local_part) > 1 and obs_local_part[-2].token_type=='dot'): obs_local_part.defects.append(errors.InvalidHeaderDefect( "Invalid trailing '.' in local part")) @@ -1601,7 +1616,7 @@ def get_domain(value): """ domain = Domain() leader = None - if value[0] in CFWS_LEADER: + if value and value[0] in CFWS_LEADER: leader, value = get_cfws(value) if not value: raise errors.HeaderParseError( @@ -1677,6 +1692,8 @@ def get_obs_route(value): if value[0] in CFWS_LEADER: token, value = get_cfws(value) obs_route.append(token) + if not value: + break if value[0] == '@': obs_route.append(RouteComponentMarker) token, value = get_domain(value[1:]) @@ -1695,7 +1712,7 @@ def get_angle_addr(value): """ angle_addr = AngleAddr() - if value[0] in CFWS_LEADER: + if value and value[0] in CFWS_LEADER: token, value = get_cfws(value) angle_addr.append(token) if not value or value[0] != '<': @@ -1705,7 +1722,7 @@ def get_angle_addr(value): value = value[1:] # Although it is not legal per RFC5322, SMTP uses '<>' in certain # circumstances. - if value[0] == '>': + if value and value[0] == '>': angle_addr.append(ValueTerminal('>', 'angle-addr-end')) angle_addr.defects.append(errors.InvalidHeaderDefect( "null addr-spec in angle-addr")) @@ -1757,6 +1774,9 @@ def get_name_addr(value): name_addr = NameAddr() # Both the optional display name and the angle-addr can start with cfws. leader = None + if not value: + raise errors.HeaderParseError( + "expected name-addr but found '{}'".format(value)) if value[0] in CFWS_LEADER: leader, value = get_cfws(value) if not value: @@ -1771,7 +1791,10 @@ def get_name_addr(value): raise errors.HeaderParseError( "expected name-addr but found '{}'".format(token)) if leader is not None: - token[0][:0] = [leader] + if isinstance(token[0], TokenList): + token[0][:0] = [leader] + else: + token[:0] = [leader] leader = None name_addr.append(token) token, value = get_angle_addr(value) @@ -2022,7 +2045,7 @@ def get_address_list(value): address_list.defects.append(errors.InvalidHeaderDefect( "invalid address in address-list")) if value: # Must be a , at this point. - address_list.append(ValueTerminal(',', 'list-separator')) + address_list.append(ListSeparator) value = value[1:] return address_list, value @@ -2764,10 +2787,15 @@ def _refold_parse_tree(parse_tree, *, policy): # max_line_length 0/None means no limit, ie: infinitely long. maxlen = policy.max_line_length or sys.maxsize encoding = 'utf-8' if policy.utf8 else 'us-ascii' - lines = [''] - last_ew = None + lines = [''] # Folded lines to be output + leading_whitespace = '' # When we have whitespace between two encoded + # words, we may need to encode the whitespace + # at the beginning of the second word. + last_ew = None # Points to the last encoded character if there's an ew on + # the line + last_charset = None wrap_as_ew_blocked = 0 - want_encoding = False + want_encoding = False # This is set to True if we need to encode this part end_ew_not_allowed = Terminal('', 'wrap_as_ew_blocked') parts = list(parse_tree) while parts: @@ -2776,9 +2804,13 @@ def _refold_parse_tree(parse_tree, *, policy): wrap_as_ew_blocked -= 1 continue tstr = str(part) - if part.token_type == 'ptext' and set(tstr) & SPECIALS: - # Encode if tstr contains special characters. - want_encoding = True + if not want_encoding: + if part.token_type == 'ptext': + # Encode if tstr contains special characters. + want_encoding = not SPECIALSNL.isdisjoint(tstr) + else: + # Encode if tstr contains newlines. + want_encoding = not NLSET.isdisjoint(tstr) try: tstr.encode(encoding) charset = encoding @@ -2791,10 +2823,12 @@ def _refold_parse_tree(parse_tree, *, policy): # 'charset' property on the policy. charset = 'utf-8' want_encoding = True + if part.token_type == 'mime-parameters': # Mime parameter folding (using RFC2231) is extra special. _fold_mime_parameters(part, lines, maxlen, encoding) continue + if want_encoding and not wrap_as_ew_blocked: if not part.as_ew_allowed: want_encoding = False @@ -2817,24 +2851,55 @@ def _refold_parse_tree(parse_tree, *, policy): if not hasattr(part, 'encode'): # It's not a Terminal, do each piece individually. parts = list(part) + parts - else: + want_encoding = False + continue + elif part.as_ew_allowed: # It's a terminal, wrap it as an encoded word, possibly # combining it with previously encoded words if allowed. + if (last_ew is not None and + charset != last_charset and + (last_charset == 'unknown-8bit' or + last_charset == 'utf-8' and charset != 'us-ascii')): + last_ew = None last_ew = _fold_as_ew(tstr, lines, maxlen, last_ew, - part.ew_combine_allowed, charset) - want_encoding = False - continue + part.ew_combine_allowed, charset, leading_whitespace) + # This whitespace has been added to the lines in _fold_as_ew() + # so clear it now. + leading_whitespace = '' + last_charset = charset + want_encoding = False + continue + else: + # It's a terminal which should be kept non-encoded + # (e.g. a ListSeparator). + last_ew = None + want_encoding = False + # fall through + if len(tstr) <= maxlen - len(lines[-1]): lines[-1] += tstr continue + # This part is too long to fit. The RFC wants us to break at # "major syntactic breaks", so unless we don't consider this # to be one, check if it will fit on the next line by itself. + leading_whitespace = '' if (part.syntactic_break and len(tstr) + 1 <= maxlen): newline = _steal_trailing_WSP_if_exists(lines) if newline or part.startswith_fws(): + # We're going to fold the data onto a new line here. Due to + # the way encoded strings handle continuation lines, we need to + # be prepared to encode any whitespace if the next line turns + # out to start with an encoded word. lines.append(newline + tstr) + + whitespace_accumulator = [] + for char in lines[-1]: + if char not in WSP: + break + whitespace_accumulator.append(char) + leading_whitespace = ''.join(whitespace_accumulator) last_ew = None continue if not hasattr(part, 'encode'): @@ -2858,9 +2923,10 @@ def _refold_parse_tree(parse_tree, *, policy): else: # We can't fold it onto the next line either... lines[-1] += tstr + return policy.linesep.join(lines) + policy.linesep -def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): +def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset, leading_whitespace): """Fold string to_encode into lines as encoded word, combining if allowed. Return the new value for last_ew, or None if ew_combine_allowed is False. @@ -2875,7 +2941,7 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): to_encode = str( get_unstructured(lines[-1][last_ew:] + to_encode)) lines[-1] = lines[-1][:last_ew] - if to_encode[0] in WSP: + elif to_encode[0] in WSP: # We're joining this to non-encoded text, so don't encode # the leading blank. leading_wsp = to_encode[0] @@ -2883,6 +2949,7 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): if (len(lines[-1]) == maxlen): lines.append(_steal_trailing_WSP_if_exists(lines)) lines[-1] += leading_wsp + trailing_wsp = '' if to_encode[-1] in WSP: # Likewise for the trailing space. @@ -2902,11 +2969,20 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): while to_encode: remaining_space = maxlen - len(lines[-1]) - text_space = remaining_space - chrome_len + text_space = remaining_space - chrome_len - len(leading_whitespace) if text_space <= 0: lines.append(' ') continue + # If we are at the start of a continuation line, prepend whitespace + # (we only want to do this when the line starts with an encoded word + # but if we're folding in this helper function, then we know that we + # are going to be writing out an encoded word.) + if len(lines) > 1 and len(lines[-1]) == 1 and leading_whitespace: + encoded_word = _ew.encode(leading_whitespace, charset=encode_as) + lines[-1] += encoded_word + leading_whitespace = '' + to_encode_word = to_encode[:text_space] encoded_word = _ew.encode(to_encode_word, charset=encode_as) excess = len(encoded_word) - remaining_space @@ -2918,6 +2994,7 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): excess = len(encoded_word) - remaining_space lines[-1] += encoded_word to_encode = to_encode[len(to_encode_word):] + leading_whitespace = '' if to_encode: lines.append(' ') diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index febe4113..0f1bf8e4 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -13,7 +13,7 @@ __all__ = [ 'quote', ] -import time, calendar +import time SPACE = ' ' EMPTYSTRING = '' @@ -194,6 +194,9 @@ def mktime_tz(data): # No zone info, so localtime is better assumption than GMT return time.mktime(data[:8] + (-1,)) else: + # Delay the import, since mktime_tz is rarely used + import calendar + t = calendar.timegm(data) return t - data[9] diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py index c9cbadd2..c9f0d743 100644 --- a/Lib/email/_policybase.py +++ b/Lib/email/_policybase.py @@ -152,11 +152,18 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta): mangle_from_ -- a flag that, when True escapes From_ lines in the body of the message by putting a `>' in front of them. This is used when the message is being - serialized by a generator. Default: True. + serialized by a generator. Default: False. message_factory -- the class to use to create new message objects. If the value is None, the default is Message. + verify_generated_headers + -- if true, the generator verifies that each header + they are properly folded, so that a parser won't + treat it as multiple headers, start-of-body, or + part of another header. + This is a check against custom Header & fold() + implementations. """ raise_on_defect = False @@ -165,6 +172,7 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta): max_line_length = 78 mangle_from_ = False message_factory = None + verify_generated_headers = True def handle_defect(self, obj, defect): """Based on policy, either raise defect or call register_defect. @@ -294,12 +302,12 @@ class Compat32(Policy): """+ The name is parsed as everything up to the ':' and returned unmodified. The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and + remainder of the first line joined with all subsequent lines, and stripping any trailing carriage return or linefeed characters. """ name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) + value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n') return (name, value.rstrip('\r\n')) def header_store_parse(self, name, value): diff --git a/Lib/email/errors.py b/Lib/email/errors.py index 3ad00565..02aa5ece 100644 --- a/Lib/email/errors.py +++ b/Lib/email/errors.py @@ -29,6 +29,10 @@ class CharsetError(MessageError): """An illegal charset was given.""" +class HeaderWriteError(MessageError): + """Error while writing headers.""" + + # These are parsing defects which the parser was able to work around. class MessageDefect(ValueError): """Base class for a message defect.""" diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py index c2881d9b..06d6b4a3 100644 --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -37,6 +37,8 @@ NLCRE_crack = re.compile(r'(\r\n|\r|\n)') headerRE = re.compile(r'^(From |[\041-\071\073-\176]*:|[\t ])') EMPTYSTRING = '' NL = '\n' +boundaryendRE = re.compile( + r'(?P--)?(?P[ \t]*)(?P\r\n|\r|\n)?$') NeedMoreData = object() @@ -327,9 +329,10 @@ class FeedParser: # this onto the input stream until we've scanned past the # preamble. separator = '--' + boundary - boundaryre = re.compile( - '(?P' + re.escape(separator) + - r')(?P--)?(?P[ \t]*)(?P\r\n|\r|\n)?$') + def boundarymatch(line): + if not line.startswith(separator): + return None + return boundaryendRE.match(line, len(separator)) capturing_preamble = True preamble = [] linesep = False @@ -341,7 +344,7 @@ class FeedParser: continue if line == '': break - mo = boundaryre.match(line) + mo = boundarymatch(line) if mo: # If we're looking at the end boundary, we're done with # this multipart. If there was a newline at the end of @@ -373,13 +376,13 @@ class FeedParser: if line is NeedMoreData: yield NeedMoreData continue - mo = boundaryre.match(line) + mo = boundarymatch(line) if not mo: self._input.unreadline(line) break # Recurse to parse this subpart; the input stream points # at the subpart's first line. - self._input.push_eof_matcher(boundaryre.match) + self._input.push_eof_matcher(boundarymatch) for retval in self._parsegen(): if retval is NeedMoreData: yield NeedMoreData diff --git a/Lib/email/generator.py b/Lib/email/generator.py index 7ccbe10e..47b9df8f 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -14,12 +14,14 @@ import random from copy import deepcopy from io import StringIO, BytesIO from email.utils import _has_surrogates +from email.errors import HeaderWriteError UNDERSCORE = '_' NL = '\n' # XXX: no longer used by the code below. NLCRE = re.compile(r'\r\n|\r|\n') fcre = re.compile(r'^From ', re.MULTILINE) +NEWLINE_WITHOUT_FWSP = re.compile(r'\r\n[^ \t]|\r[^ \n\t]|\n[^ \t]') class Generator: @@ -222,7 +224,16 @@ class Generator: def _write_headers(self, msg): for h, v in msg.raw_items(): - self.write(self.policy.fold(h, v)) + folded = self.policy.fold(h, v) + if self.policy.verify_generated_headers: + linesep = self.policy.linesep + if not folded.endswith(self.policy.linesep): + raise HeaderWriteError( + f'folded header does not end with {linesep!r}: {folded!r}') + if NEWLINE_WITHOUT_FWSP.search(folded.removesuffix(linesep)): + raise HeaderWriteError( + f'folded header contains newline: {folded!r}') + self.write(folded) # A blank line always separates headers from body self.write(self._NL) @@ -243,7 +254,7 @@ class Generator: # existing message. msg = deepcopy(msg) del msg['content-transfer-encoding'] - msg.set_payload(payload, charset) + msg.set_payload(msg._payload, charset) payload = msg.get_payload() self._munge_cte = (msg['content-transfer-encoding'], msg['content-type']) diff --git a/Lib/email/message.py b/Lib/email/message.py index 411118c7..46bb8c21 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -289,25 +289,26 @@ class Message: # cte might be a Header, so for now stringify it. cte = str(self.get('content-transfer-encoding', '')).lower() # payload may be bytes here. - if isinstance(payload, str): - if utils._has_surrogates(payload): - bpayload = payload.encode('ascii', 'surrogateescape') - if not decode: + if not decode: + if isinstance(payload, str) and utils._has_surrogates(payload): + try: + bpayload = payload.encode('ascii', 'surrogateescape') try: - payload = bpayload.decode(self.get_param('charset', 'ascii'), 'replace') + payload = bpayload.decode(self.get_content_charset('ascii'), 'replace') except LookupError: payload = bpayload.decode('ascii', 'replace') - elif decode: - try: - bpayload = payload.encode('ascii') - except UnicodeError: - # This won't happen for RFC compliant messages (messages - # containing only ASCII code points in the unicode input). - # If it does happen, turn the string into bytes in a way - # guaranteed not to fail. - bpayload = payload.encode('raw-unicode-escape') - if not decode: + except UnicodeEncodeError: + pass return payload + if isinstance(payload, str): + try: + bpayload = payload.encode('ascii', 'surrogateescape') + except UnicodeEncodeError: + # This won't happen for RFC compliant messages (messages + # containing only ASCII code points in the unicode input). + # If it does happen, turn the string into bytes in a way + # guaranteed not to fail. + bpayload = payload.encode('raw-unicode-escape') if cte == 'quoted-printable': return quopri.decodestring(bpayload) elif cte == 'base64': @@ -339,7 +340,7 @@ class Message: return if not isinstance(charset, Charset): charset = Charset(charset) - payload = payload.encode(charset.output_charset) + payload = payload.encode(charset.output_charset, 'surrogateescape') if hasattr(payload, 'decode'): self._payload = payload.decode('ascii', 'surrogateescape') else: diff --git a/Lib/email/mime/audio.py b/Lib/email/mime/audio.py index 065819b2..aa0c4905 100644 --- a/Lib/email/mime/audio.py +++ b/Lib/email/mime/audio.py @@ -6,7 +6,6 @@ __all__ = ['MIMEAudio'] -from io import BytesIO from email import encoders from email.mime.nonmultipart import MIMENonMultipart @@ -59,10 +58,8 @@ def _what(data): # sndhdr.what() had a pretty cruddy interface, unfortunately. This is why # we re-do it here. It would be easier to reverse engineer the Unix 'file' # command and use the standard 'magic' file, as shipped with a modern Unix. - hdr = data[:512] - fakefile = BytesIO(hdr) for testfn in _rules: - if res := testfn(hdr, fakefile): + if res := testfn(data): return res else: return None @@ -74,7 +71,7 @@ def rule(rulefunc): @rule -def _aiff(h, f): +def _aiff(h): if not h.startswith(b'FORM'): return None if h[8:12] in {b'AIFC', b'AIFF'}: @@ -84,7 +81,7 @@ def _aiff(h, f): @rule -def _au(h, f): +def _au(h): if h.startswith(b'.snd'): return 'basic' else: @@ -92,7 +89,7 @@ def _au(h, f): @rule -def _wav(h, f): +def _wav(h): # 'RIFF' 'WAVE' 'fmt ' if not h.startswith(b'RIFF') or h[8:12] != b'WAVE' or h[12:16] != b'fmt ': return None diff --git a/Lib/email/policy.py b/Lib/email/policy.py index 611deb50..6e109b65 100644 --- a/Lib/email/policy.py +++ b/Lib/email/policy.py @@ -21,7 +21,7 @@ __all__ = [ 'HTTP', ] -linesep_splitter = re.compile(r'\n|\r') +linesep_splitter = re.compile(r'\n|\r\n?') @_extend_docstrings class EmailPolicy(Policy): @@ -119,13 +119,13 @@ class EmailPolicy(Policy): """+ The name is parsed as everything up to the ':' and returned unmodified. The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and + remainder of the first line joined with all subsequent lines, and stripping any trailing carriage return or linefeed characters. (This is the same as Compat32). """ name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) + value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n') return (name, value.rstrip('\r\n')) def header_store_parse(self, name, value): @@ -205,13 +205,21 @@ class EmailPolicy(Policy): if hasattr(value, 'name'): return value.fold(policy=self) maxlen = self.max_line_length if self.max_line_length else sys.maxsize - lines = value.splitlines() + # We can't use splitlines here because it splits on more than \r and \n. + lines = linesep_splitter.split(value) refold = (self.refold_source == 'all' or self.refold_source == 'long' and (lines and len(lines[0])+len(name)+2 > maxlen or any(len(x) > maxlen for x in lines[1:]))) - if refold or refold_binary and _has_surrogates(value): + + if not refold: + if not self.utf8: + refold = not value.isascii() + elif refold_binary: + refold = _has_surrogates(value) + if refold: return self.header_factory(name, ''.join(lines)).fold(policy=self) + return name + ': ' + self.linesep.join(lines) + self.linesep diff --git a/Lib/email/utils.py b/Lib/email/utils.py index 81da5394..e42674fa 100644 --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -25,8 +25,6 @@ __all__ = [ import os import re import time -import random -import socket import datetime import urllib.parse @@ -36,9 +34,6 @@ from email._parseaddr import mktime_tz from email._parseaddr import parsedate, parsedate_tz, _parsedate_tz -# Intrapackage imports -from email.charset import Charset - COMMASPACE = ', ' EMPTYSTRING = '' UEMPTYSTRING = '' @@ -48,11 +43,12 @@ TICK = "'" specialsre = re.compile(r'[][\\()<>@,:;".]') escapesre = re.compile(r'[\\"]') + def _has_surrogates(s): - """Return True if s contains surrogate-escaped binary data.""" + """Return True if s may contain surrogate-escaped binary data.""" # This check is based on the fact that unless there are surrogates, utf8 # (Python's default encoding) can encode any string. This is the fastest - # way to check for surrogates, see issue 11454 for timings. + # way to check for surrogates, see bpo-11454 (moved to gh-55663) for timings. try: s.encode() return False @@ -94,6 +90,8 @@ def formataddr(pair, charset='utf-8'): name.encode('ascii') except UnicodeEncodeError: if isinstance(charset, str): + # lazy import to improve module import time + from email.charset import Charset charset = Charset(charset) encoded_name = charset.header_encode(name) return "%s <%s>" % (encoded_name, address) @@ -106,12 +104,127 @@ def formataddr(pair, charset='utf-8'): return address +def _iter_escaped_chars(addr): + pos = 0 + escape = False + for pos, ch in enumerate(addr): + if escape: + yield (pos, '\\' + ch) + escape = False + elif ch == '\\': + escape = True + else: + yield (pos, ch) + if escape: + yield (pos, '\\') + + +def _strip_quoted_realnames(addr): + """Strip real names between quotes.""" + if '"' not in addr: + # Fast path + return addr + + start = 0 + open_pos = None + result = [] + for pos, ch in _iter_escaped_chars(addr): + if ch == '"': + if open_pos is None: + open_pos = pos + else: + if start != open_pos: + result.append(addr[start:open_pos]) + start = pos + 1 + open_pos = None + + if start < len(addr): + result.append(addr[start:]) + + return ''.join(result) + + +supports_strict_parsing = True -def getaddresses(fieldvalues): - """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" - all = COMMASPACE.join(str(v) for v in fieldvalues) - a = _AddressList(all) - return a.addresslist +def getaddresses(fieldvalues, *, strict=True): + """Return a list of (REALNAME, EMAIL) or ('','') for each fieldvalue. + + When parsing fails for a fieldvalue, a 2-tuple of ('', '') is returned in + its place. + + If strict is true, use a strict parser which rejects malformed inputs. + """ + + # If strict is true, if the resulting list of parsed addresses is greater + # than the number of fieldvalues in the input list, a parsing error has + # occurred and consequently a list containing a single empty 2-tuple [('', + # '')] is returned in its place. This is done to avoid invalid output. + # + # Malformed input: getaddresses(['alice@example.com ']) + # Invalid output: [('', 'alice@example.com'), ('', 'bob@example.com')] + # Safe output: [('', '')] + + if not strict: + all = COMMASPACE.join(str(v) for v in fieldvalues) + a = _AddressList(all) + return a.addresslist + + fieldvalues = [str(v) for v in fieldvalues] + fieldvalues = _pre_parse_validation(fieldvalues) + addr = COMMASPACE.join(fieldvalues) + a = _AddressList(addr) + result = _post_parse_validation(a.addresslist) + + # Treat output as invalid if the number of addresses is not equal to the + # expected number of addresses. + n = 0 + for v in fieldvalues: + # When a comma is used in the Real Name part it is not a deliminator. + # So strip those out before counting the commas. + v = _strip_quoted_realnames(v) + # Expected number of addresses: 1 + number of commas + n += 1 + v.count(',') + if len(result) != n: + return [('', '')] + + return result + + +def _check_parenthesis(addr): + # Ignore parenthesis in quoted real names. + addr = _strip_quoted_realnames(addr) + + opens = 0 + for pos, ch in _iter_escaped_chars(addr): + if ch == '(': + opens += 1 + elif ch == ')': + opens -= 1 + if opens < 0: + return False + return (opens == 0) + + +def _pre_parse_validation(email_header_fields): + accepted_values = [] + for v in email_header_fields: + if not _check_parenthesis(v): + v = "('', '')" + accepted_values.append(v) + + return accepted_values + + +def _post_parse_validation(parsed_email_header_tuples): + accepted_values = [] + # The parser would have parsed a correctly formatted domain-literal + # The existence of an [ after parsing indicates a parsing failure + for v in parsed_email_header_tuples: + if '[' in v[1]: + v = ('', '') + accepted_values.append(v) + + return accepted_values def _format_timetuple_and_zone(timetuple, zone): @@ -128,7 +241,7 @@ def formatdate(timeval=None, localtime=False, usegmt=False): Fri, 09 Nov 2001 01:08:47 -0000 - Optional timeval if given is a floating point time value as accepted by + Optional timeval if given is a floating-point time value as accepted by gmtime() and localtime(), otherwise the current time is used. Optional localtime is a flag that when True, interprets timeval, and @@ -181,6 +294,11 @@ def make_msgid(idstring=None, domain=None): portion of the message id after the '@'. It defaults to the locally defined hostname. """ + # Lazy imports to speedup module import time + # (no other functions in email.utils need these modules) + import random + import socket + timeval = int(time.time()*100) pid = os.getpid() randint = random.getrandbits(64) @@ -205,16 +323,33 @@ def parsedate_to_datetime(data): tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) -def parseaddr(addr): +def parseaddr(addr, *, strict=True): """ Parse addr into its constituent realname and email address parts. Return a tuple of realname and email address, unless the parse fails, in which case return a 2-tuple of ('', ''). + + If strict is True, use a strict parser which rejects malformed inputs. """ - addrs = _AddressList(addr).addresslist - if not addrs: - return '', '' + if not strict: + addrs = _AddressList(addr).addresslist + if not addrs: + return ('', '') + return addrs[0] + + if isinstance(addr, list): + addr = addr[0] + + if not isinstance(addr, str): + return ('', '') + + addr = _pre_parse_validation([addr])[0] + addrs = _post_parse_validation(_AddressList(addr).addresslist) + + if not addrs or len(addrs) > 1: + return ('', '') + return addrs[0] diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index d85afd6d..6a5ca046 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -209,6 +209,7 @@ aliases = { 'ms932' : 'cp932', 'mskanji' : 'cp932', 'ms_kanji' : 'cp932', + 'windows_31j' : 'cp932', # cp949 codec '949' : 'cp949', diff --git a/Lib/encodings/idna.py b/Lib/encodings/idna.py index 5396047a..60a8d5eb 100644 --- a/Lib/encodings/idna.py +++ b/Lib/encodings/idna.py @@ -11,7 +11,7 @@ ace_prefix = b"xn--" sace_prefix = "xn--" # This assumes query strings, so AllowUnassigned is true -def nameprep(label): +def nameprep(label): # type: (str) -> str # Map newlabel = [] for c in label: @@ -25,7 +25,7 @@ def nameprep(label): label = unicodedata.normalize("NFKC", label) # Prohibit - for c in label: + for i, c in enumerate(label): if stringprep.in_table_c12(c) or \ stringprep.in_table_c22(c) or \ stringprep.in_table_c3(c) or \ @@ -35,7 +35,7 @@ def nameprep(label): stringprep.in_table_c7(c) or \ stringprep.in_table_c8(c) or \ stringprep.in_table_c9(c): - raise UnicodeError("Invalid character %r" % c) + raise UnicodeEncodeError("idna", label, i, i+1, f"Invalid character {c!r}") # Check bidi RandAL = [stringprep.in_table_d1(x) for x in label] @@ -46,29 +46,38 @@ def nameprep(label): # This is table C.8, which was already checked # 2) If a string contains any RandALCat character, the string # MUST NOT contain any LCat character. - if any(stringprep.in_table_d2(x) for x in label): - raise UnicodeError("Violation of BIDI requirement 2") + for i, x in enumerate(label): + if stringprep.in_table_d2(x): + raise UnicodeEncodeError("idna", label, i, i+1, + "Violation of BIDI requirement 2") # 3) If a string contains any RandALCat character, a # RandALCat character MUST be the first character of the # string, and a RandALCat character MUST be the last # character of the string. - if not RandAL[0] or not RandAL[-1]: - raise UnicodeError("Violation of BIDI requirement 3") + if not RandAL[0]: + raise UnicodeEncodeError("idna", label, 0, 1, + "Violation of BIDI requirement 3") + if not RandAL[-1]: + raise UnicodeEncodeError("idna", label, len(label)-1, len(label), + "Violation of BIDI requirement 3") return label -def ToASCII(label): +def ToASCII(label): # type: (str) -> bytes try: # Step 1: try ASCII - label = label.encode("ascii") - except UnicodeError: + label_ascii = label.encode("ascii") + except UnicodeEncodeError: pass else: # Skip to step 3: UseSTD3ASCIIRules is false, so # Skip to step 8. - if 0 < len(label) < 64: - return label - raise UnicodeError("label empty or too long") + if 0 < len(label_ascii) < 64: + return label_ascii + if len(label) == 0: + raise UnicodeEncodeError("idna", label, 0, 1, "label empty") + else: + raise UnicodeEncodeError("idna", label, 0, len(label), "label too long") # Step 2: nameprep label = nameprep(label) @@ -76,29 +85,34 @@ def ToASCII(label): # Step 3: UseSTD3ASCIIRules is false # Step 4: try ASCII try: - label = label.encode("ascii") - except UnicodeError: + label_ascii = label.encode("ascii") + except UnicodeEncodeError: pass else: # Skip to step 8. if 0 < len(label) < 64: - return label - raise UnicodeError("label empty or too long") + return label_ascii + if len(label) == 0: + raise UnicodeEncodeError("idna", label, 0, 1, "label empty") + else: + raise UnicodeEncodeError("idna", label, 0, len(label), "label too long") # Step 5: Check ACE prefix - if label.startswith(sace_prefix): - raise UnicodeError("Label starts with ACE prefix") + if label.lower().startswith(sace_prefix): + raise UnicodeEncodeError( + "idna", label, 0, len(sace_prefix), "Label starts with ACE prefix") # Step 6: Encode with PUNYCODE - label = label.encode("punycode") + label_ascii = label.encode("punycode") # Step 7: Prepend ACE prefix - label = ace_prefix + label + label_ascii = ace_prefix + label_ascii # Step 8: Check size - if 0 < len(label) < 64: - return label - raise UnicodeError("label empty or too long") + # do not check for empty as we prepend ace_prefix. + if len(label_ascii) < 64: + return label_ascii + raise UnicodeEncodeError("idna", label, 0, len(label), "label too long") def ToUnicode(label): if len(label) > 1024: @@ -110,7 +124,9 @@ def ToUnicode(label): # per https://www.rfc-editor.org/rfc/rfc3454#section-3.1 while still # preventing us from wasting time decoding a big thing that'll just # hit the actual <= 63 length limit in Step 6. - raise UnicodeError("label way too long") + if isinstance(label, str): + label = label.encode("utf-8", errors="backslashreplace") + raise UnicodeDecodeError("idna", label, 0, len(label), "label way too long") # Step 1: Check for ASCII if isinstance(label, bytes): pure_ascii = True @@ -118,25 +134,32 @@ def ToUnicode(label): try: label = label.encode("ascii") pure_ascii = True - except UnicodeError: + except UnicodeEncodeError: pure_ascii = False if not pure_ascii: + assert isinstance(label, str) # Step 2: Perform nameprep label = nameprep(label) # It doesn't say this, but apparently, it should be ASCII now try: label = label.encode("ascii") - except UnicodeError: - raise UnicodeError("Invalid character in IDN label") + except UnicodeEncodeError as exc: + raise UnicodeEncodeError("idna", label, exc.start, exc.end, + "Invalid character in IDN label") # Step 3: Check for ACE prefix - if not label.startswith(ace_prefix): + assert isinstance(label, bytes) + if not label.lower().startswith(ace_prefix): return str(label, "ascii") # Step 4: Remove ACE prefix label1 = label[len(ace_prefix):] # Step 5: Decode using PUNYCODE - result = label1.decode("punycode") + try: + result = label1.decode("punycode") + except UnicodeDecodeError as exc: + offset = len(ace_prefix) + raise UnicodeDecodeError("idna", label, offset+exc.start, offset+exc.end, exc.reason) # Step 6: Apply ToASCII label2 = ToASCII(result) @@ -144,7 +167,8 @@ def ToUnicode(label): # Step 7: Compare the result of step 6 with the one of step 3 # label2 will already be in lower case. if str(label, "ascii").lower() != str(label2, "ascii"): - raise UnicodeError("IDNA does not round-trip", label, label2) + raise UnicodeDecodeError("idna", label, 0, len(label), + f"IDNA does not round-trip, '{label!r}' != '{label2!r}'") # Step 8: return the result of step 5 return result @@ -156,7 +180,7 @@ class Codec(codecs.Codec): if errors != 'strict': # IDNA is quite clear that implementations must be strict - raise UnicodeError("unsupported error handling "+errors) + raise UnicodeError(f"Unsupported error handling: {errors}") if not input: return b'', 0 @@ -168,11 +192,16 @@ class Codec(codecs.Codec): else: # ASCII name: fast path labels = result.split(b'.') - for label in labels[:-1]: - if not (0 < len(label) < 64): - raise UnicodeError("label empty or too long") - if len(labels[-1]) >= 64: - raise UnicodeError("label too long") + for i, label in enumerate(labels[:-1]): + if len(label) == 0: + offset = sum(len(l) for l in labels[:i]) + i + raise UnicodeEncodeError("idna", input, offset, offset+1, + "label empty") + for i, label in enumerate(labels): + if len(label) >= 64: + offset = sum(len(l) for l in labels[:i]) + i + raise UnicodeEncodeError("idna", input, offset, offset+len(label), + "label too long") return result, len(input) result = bytearray() @@ -182,17 +211,27 @@ class Codec(codecs.Codec): del labels[-1] else: trailing_dot = b'' - for label in labels: + for i, label in enumerate(labels): if result: # Join with U+002E result.extend(b'.') - result.extend(ToASCII(label)) + try: + result.extend(ToASCII(label)) + except (UnicodeEncodeError, UnicodeDecodeError) as exc: + offset = sum(len(l) for l in labels[:i]) + i + raise UnicodeEncodeError( + "idna", + input, + offset + exc.start, + offset + exc.end, + exc.reason, + ) return bytes(result+trailing_dot), len(input) def decode(self, input, errors='strict'): if errors != 'strict': - raise UnicodeError("Unsupported error handling "+errors) + raise UnicodeError(f"Unsupported error handling: {errors}") if not input: return "", 0 @@ -202,7 +241,7 @@ class Codec(codecs.Codec): # XXX obviously wrong, see #3232 input = bytes(input) - if ace_prefix not in input: + if ace_prefix not in input.lower(): # Fast path try: return input.decode('ascii'), len(input) @@ -218,8 +257,15 @@ class Codec(codecs.Codec): trailing_dot = '' result = [] - for label in labels: - result.append(ToUnicode(label)) + for i, label in enumerate(labels): + try: + u_label = ToUnicode(label) + except (UnicodeEncodeError, UnicodeDecodeError) as exc: + offset = sum(len(x) for x in labels[:i]) + len(labels[:i]) + raise UnicodeDecodeError( + "idna", input, offset+exc.start, offset+exc.end, exc.reason) + else: + result.append(u_label) return ".".join(result)+trailing_dot, len(input) @@ -227,7 +273,7 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder): def _buffer_encode(self, input, errors, final): if errors != 'strict': # IDNA is quite clear that implementations must be strict - raise UnicodeError("unsupported error handling "+errors) + raise UnicodeError(f"Unsupported error handling: {errors}") if not input: return (b'', 0) @@ -251,7 +297,16 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder): # Join with U+002E result.extend(b'.') size += 1 - result.extend(ToASCII(label)) + try: + result.extend(ToASCII(label)) + except (UnicodeEncodeError, UnicodeDecodeError) as exc: + raise UnicodeEncodeError( + "idna", + input, + size + exc.start, + size + exc.end, + exc.reason, + ) size += len(label) result += trailing_dot @@ -261,7 +316,7 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder): class IncrementalDecoder(codecs.BufferedIncrementalDecoder): def _buffer_decode(self, input, errors, final): if errors != 'strict': - raise UnicodeError("Unsupported error handling "+errors) + raise UnicodeError("Unsupported error handling: {errors}") if not input: return ("", 0) @@ -271,7 +326,11 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder): labels = dots.split(input) else: # Must be ASCII string - input = str(input, "ascii") + try: + input = str(input, "ascii") + except (UnicodeEncodeError, UnicodeDecodeError) as exc: + raise UnicodeDecodeError("idna", input, + exc.start, exc.end, exc.reason) labels = input.split(".") trailing_dot = '' @@ -288,7 +347,18 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder): result = [] size = 0 for label in labels: - result.append(ToUnicode(label)) + try: + u_label = ToUnicode(label) + except (UnicodeEncodeError, UnicodeDecodeError) as exc: + raise UnicodeDecodeError( + "idna", + input.encode("ascii", errors="backslashreplace"), + size + exc.start, + size + exc.end, + exc.reason, + ) + else: + result.append(u_label) if size: size += 1 size += len(label) diff --git a/Lib/encodings/punycode.py b/Lib/encodings/punycode.py index 1c572644..4622fc8c 100644 --- a/Lib/encodings/punycode.py +++ b/Lib/encodings/punycode.py @@ -1,4 +1,4 @@ -""" Codec for the Punicode encoding, as specified in RFC 3492 +""" Codec for the Punycode encoding, as specified in RFC 3492 Written by Martin v. Löwis. """ @@ -131,10 +131,11 @@ def decode_generalized_number(extended, extpos, bias, errors): j = 0 while 1: try: - char = ord(extended[extpos]) + char = extended[extpos] except IndexError: if errors == "strict": - raise UnicodeError("incomplete punicode string") + raise UnicodeDecodeError("punycode", extended, extpos, extpos+1, + "incomplete punycode string") return extpos + 1, None extpos += 1 if 0x41 <= char <= 0x5A: # A-Z @@ -142,8 +143,8 @@ def decode_generalized_number(extended, extpos, bias, errors): elif 0x30 <= char <= 0x39: digit = char - 22 # 0x30-26 elif errors == "strict": - raise UnicodeError("Invalid extended code point '%s'" - % extended[extpos-1]) + raise UnicodeDecodeError("punycode", extended, extpos-1, extpos, + f"Invalid extended code point '{extended[extpos-1]}'") else: return extpos, None t = T(j, bias) @@ -155,11 +156,14 @@ def decode_generalized_number(extended, extpos, bias, errors): def insertion_sort(base, extended, errors): - """3.2 Insertion unsort coding""" + """3.2 Insertion sort coding""" + # This function raises UnicodeDecodeError with position in the extended. + # Caller should add the offset. char = 0x80 pos = -1 bias = 72 extpos = 0 + while extpos < len(extended): newpos, delta = decode_generalized_number(extended, extpos, bias, errors) @@ -171,7 +175,9 @@ def insertion_sort(base, extended, errors): char += pos // (len(base) + 1) if char > 0x10FFFF: if errors == "strict": - raise UnicodeError("Invalid character U+%x" % char) + raise UnicodeDecodeError( + "punycode", extended, pos-1, pos, + f"Invalid character U+{char:x}") char = ord('?') pos = pos % (len(base) + 1) base = base[:pos] + chr(char) + base[pos:] @@ -187,11 +193,21 @@ def punycode_decode(text, errors): pos = text.rfind(b"-") if pos == -1: base = "" - extended = str(text, "ascii").upper() + extended = text.upper() else: - base = str(text[:pos], "ascii", errors) - extended = str(text[pos+1:], "ascii").upper() - return insertion_sort(base, extended, errors) + try: + base = str(text[:pos], "ascii", errors) + except UnicodeDecodeError as exc: + raise UnicodeDecodeError("ascii", text, exc.start, exc.end, + exc.reason) from None + extended = text[pos+1:].upper() + try: + return insertion_sort(base, extended, errors) + except UnicodeDecodeError as exc: + offset = pos + 1 + raise UnicodeDecodeError("punycode", text, + offset+exc.start, offset+exc.end, + exc.reason) from None ### Codec APIs @@ -203,7 +219,7 @@ class Codec(codecs.Codec): def decode(self, input, errors='strict'): if errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError("Unsupported error handling "+errors) + raise UnicodeError(f"Unsupported error handling: {errors}") res = punycode_decode(input, errors) return res, len(input) @@ -214,7 +230,7 @@ class IncrementalEncoder(codecs.IncrementalEncoder): class IncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): if self.errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError("Unsupported error handling "+self.errors) + raise UnicodeError(f"Unsupported error handling: {self.errors}") return punycode_decode(input, self.errors) class StreamWriter(Codec,codecs.StreamWriter): diff --git a/Lib/encodings/undefined.py b/Lib/encodings/undefined.py index 46902883..082771e1 100644 --- a/Lib/encodings/undefined.py +++ b/Lib/encodings/undefined.py @@ -1,6 +1,6 @@ """ Python 'undefined' Codec - This codec will always raise a ValueError exception when being + This codec will always raise a UnicodeError exception when being used. It is intended for use by the site.py file to switch off automatic string to Unicode coercion. diff --git a/Lib/encodings/utf_16.py b/Lib/encodings/utf_16.py index c6124824..d3b99800 100644 --- a/Lib/encodings/utf_16.py +++ b/Lib/encodings/utf_16.py @@ -64,7 +64,7 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder): elif byteorder == 1: self.decoder = codecs.utf_16_be_decode elif consumed >= 2: - raise UnicodeError("UTF-16 stream does not start with BOM") + raise UnicodeDecodeError("utf-16", input, 0, 2, "Stream does not start with BOM") return (output, consumed) return self.decoder(input, self.errors, final) @@ -138,7 +138,7 @@ class StreamReader(codecs.StreamReader): elif byteorder == 1: self.decode = codecs.utf_16_be_decode elif consumed>=2: - raise UnicodeError("UTF-16 stream does not start with BOM") + raise UnicodeDecodeError("utf-16", input, 0, 2, "Stream does not start with BOM") return (object, consumed) ### encodings module API diff --git a/Lib/encodings/utf_32.py b/Lib/encodings/utf_32.py index cdf84d14..1924bedb 100644 --- a/Lib/encodings/utf_32.py +++ b/Lib/encodings/utf_32.py @@ -59,7 +59,7 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder): elif byteorder == 1: self.decoder = codecs.utf_32_be_decode elif consumed >= 4: - raise UnicodeError("UTF-32 stream does not start with BOM") + raise UnicodeDecodeError("utf-32", input, 0, 4, "Stream does not start with BOM") return (output, consumed) return self.decoder(input, self.errors, final) @@ -132,8 +132,8 @@ class StreamReader(codecs.StreamReader): self.decode = codecs.utf_32_le_decode elif byteorder == 1: self.decode = codecs.utf_32_be_decode - elif consumed>=4: - raise UnicodeError("UTF-32 stream does not start with BOM") + elif consumed >= 4: + raise UnicodeDecodeError("utf-32", input, 0, 4, "Stream does not start with BOM") return (object, consumed) ### encodings module API diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 1fb1d505..df0685b1 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -1,78 +1,64 @@ -import collections import os -import os.path import subprocess import sys import sysconfig import tempfile +from contextlib import nullcontext from importlib import resources +from pathlib import Path +from shutil import copy2 __all__ = ["version", "bootstrap"] -_PACKAGE_NAMES = ('pip',) -_PIP_VERSION = "23.2.1" -_PROJECTS = [ - ("pip", _PIP_VERSION, "py3"), -] - -# Packages bundled in ensurepip._bundled have wheel_name set. -# Packages from WHEEL_PKG_DIR have wheel_path set. -_Package = collections.namedtuple('Package', - ('version', 'wheel_name', 'wheel_path')) +_PIP_VERSION = "24.3.1" # Directory of system wheel packages. Some Linux distribution packaging # policies recommend against bundling dependencies. For example, Fedora # installs wheel packages in the /usr/share/python-wheels/ directory and don't # install the ensurepip._bundled package. -_WHEEL_PKG_DIR = sysconfig.get_config_var('WHEEL_PKG_DIR') +if (_pkg_dir := sysconfig.get_config_var('WHEEL_PKG_DIR')) is not None: + _WHEEL_PKG_DIR = Path(_pkg_dir).resolve() +else: + _WHEEL_PKG_DIR = None + +def _find_wheel_pkg_dir_pip(): + if _WHEEL_PKG_DIR is None: + # NOTE: The compile-time `WHEEL_PKG_DIR` is unset so there is no place + # NOTE: for looking up the wheels. + return None -def _find_packages(path): - packages = {} + dist_matching_wheels = _WHEEL_PKG_DIR.glob('pip-*.whl') try: - filenames = os.listdir(path) - except OSError: - # Ignore: path doesn't exist or permission error - filenames = () - # Make the code deterministic if a directory contains multiple wheel files - # of the same package, but don't attempt to implement correct version - # comparison since this case should not happen. - filenames = sorted(filenames) - for filename in filenames: - # filename is like 'pip-21.2.4-py3-none-any.whl' - if not filename.endswith(".whl"): - continue - for name in _PACKAGE_NAMES: - prefix = name + '-' - if filename.startswith(prefix): - break - else: - continue - - # Extract '21.2.4' from 'pip-21.2.4-py3-none-any.whl' - version = filename.removeprefix(prefix).partition('-')[0] - wheel_path = os.path.join(path, filename) - packages[name] = _Package(version, None, wheel_path) - return packages - - -def _get_packages(): - global _PACKAGES, _WHEEL_PKG_DIR - if _PACKAGES is not None: - return _PACKAGES - - packages = {} - for name, version, py_tag in _PROJECTS: - wheel_name = f"{name}-{version}-{py_tag}-none-any.whl" - packages[name] = _Package(version, wheel_name, None) - if _WHEEL_PKG_DIR: - dir_packages = _find_packages(_WHEEL_PKG_DIR) - # only used the wheel package directory if all packages are found there - if all(name in dir_packages for name in _PACKAGE_NAMES): - packages = dir_packages - _PACKAGES = packages - return packages -_PACKAGES = None + last_matching_dist_wheel = sorted(dist_matching_wheels)[-1] + except IndexError: + # NOTE: `WHEEL_PKG_DIR` does not contain any wheel files for `pip`. + return None + + return nullcontext(last_matching_dist_wheel) + + +def _get_pip_whl_path_ctx(): + # Prefer pip from the wheel package directory, if present. + if (alternative_pip_wheel_path := _find_wheel_pkg_dir_pip()) is not None: + return alternative_pip_wheel_path + + return resources.as_file( + resources.files('ensurepip') + / '_bundled' + / f'pip-{_PIP_VERSION}-py3-none-any.whl' + ) + + +def _get_pip_version(): + with _get_pip_whl_path_ctx() as bundled_wheel_path: + wheel_name = bundled_wheel_path.name + return ( + # Extract '21.2.4' from 'pip-21.2.4-py3-none-any.whl' + wheel_name. + removeprefix('pip-'). + partition('-')[0] + ) def _run_pip(args, additional_paths=None): @@ -105,7 +91,7 @@ def version(): """ Returns a string specifying the bundled version of pip. """ - return _get_packages()['pip'].version + return _get_pip_version() def _disable_pip_configuration_settings(): @@ -167,24 +153,10 @@ def _bootstrap(*, root=None, upgrade=False, user=False, with tempfile.TemporaryDirectory() as tmpdir: # Put our bundled wheels into a temporary directory and construct the # additional paths that need added to sys.path - additional_paths = [] - for name, package in _get_packages().items(): - if package.wheel_name: - # Use bundled wheel package - wheel_name = package.wheel_name - wheel_path = resources.files("ensurepip") / "_bundled" / wheel_name - whl = wheel_path.read_bytes() - else: - # Use the wheel package directory - with open(package.wheel_path, "rb") as fp: - whl = fp.read() - wheel_name = os.path.basename(package.wheel_path) - - filename = os.path.join(tmpdir, wheel_name) - with open(filename, "wb") as fp: - fp.write(whl) - - additional_paths.append(filename) + tmpdir_path = Path(tmpdir) + with _get_pip_whl_path_ctx() as bundled_wheel_path: + tmp_wheel_path = tmpdir_path / bundled_wheel_path.name + copy2(bundled_wheel_path, tmp_wheel_path) # Construct the arguments to be passed to the pip command args = ["install", "--no-cache-dir", "--no-index", "--find-links", tmpdir] @@ -197,7 +169,8 @@ def _bootstrap(*, root=None, upgrade=False, user=False, if verbosity: args += ["-" + "v" * verbosity] - return _run_pip([*args, *_PACKAGE_NAMES], additional_paths) + return _run_pip([*args, "pip"], [os.fsdecode(tmp_wheel_path)]) + def _uninstall_helper(*, verbosity=0): """Helper to support a clean default uninstall process on Windows @@ -227,7 +200,7 @@ def _uninstall_helper(*, verbosity=0): if verbosity: args += ["-" + "v" * verbosity] - return _run_pip([*args, *reversed(_PACKAGE_NAMES)]) + return _run_pip([*args, "pip"]) def _main(argv=None): diff --git a/Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-23.2.1-py3-none-any.whl deleted file mode 100644 index ba28ef02e265f032560e28e40b2be0bd6e2e964f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2086091 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

Gf3-?)qH+Ud?ox^KwDqMMkXD_2i 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%0Dqs6AboN5T-Z;E@If|~MZp?e=Z# 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

  • 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μ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 yY4)7^r-548 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%0DU93 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� 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 @@ -208,7 +229,6 @@

    IDLE is Python’s Integrated Development and Learning Environment.

    IDLE has the following features:

      -
    • coded in 100% pure Python, using the tkinter GUI toolkit

    • cross-platform: works mostly the same on Windows, Unix, and macOS

    • Python shell window (interactive interpreter) with colorizing of code input, output, and error messages

    • @@ -529,32 +549,26 @@ and that other files do not. Run Python code with the Run menu.

      Key bindings¶

      -

      In this section, ‘C’ refers to the Control key on Windows and Unix and -the Command key on macOS.

      -
        -
      • Backspace deletes to the left; Del deletes to the right

      • -
      • C-Backspace delete word left; C-Del delete word to the right

      • -
      • Arrow keys and Page Up/Page Down to move around

      • -
      • C-LeftArrow and C-RightArrow moves by words

      • -
      • Home/End go to begin/end of line

      • -
      • C-Home/C-End go to begin/end of file

      • -
      • Some useful Emacs bindings are inherited from Tcl/Tk:

        -
        -
          -
        • C-a beginning of line

        • -
        • C-e end of line

        • -
        • C-k kill line (but doesn’t put it in clipboard)

        • -
        • C-l center window around the insertion point

        • -
        • C-b go backward one character without deleting (usually you can -also use the cursor key for this)

        • -
        • C-f go forward one character without deleting (usually you can -also use the cursor key for this)

        • -
        • C-p go up one line (usually you can also use the cursor key for -this)

        • -
        • C-d delete next character

        • -
        -
        -
      • +

        The IDLE insertion cursor is a thin vertical bar between character +positions. When characters are entered, the insertion cursor and +everything to its right moves right one character and +the new character is entered in the new space.

        +

        Several non-character keys move the cursor and possibly +delete characters. Deletion does not puts text on the clipboard, +but IDLE has an undo list. Wherever this doc discusses keys, +‘C’ refers to the Control key on Windows and +Unix and the Command key on macOS. (And all such discussions +assume that the keys have not been re-bound to something else.)

        +
          +
        • Arrow keys move the cursor one character or line.

        • +
        • C-LeftArrow and C-RightArrow moves left or right one word.

        • +
        • Home and End go to the beginning or end of the line.

        • +
        • Page Up and Page Down go up or down one screen.

        • +
        • C-Home and C-End go to beginning or end of the file.

        • +
        • Backspace and Del (or C-d) delete the previous +or next character.

        • +
        • C-Backspace and C-Del delete one word left or right.

        • +
        • C-k deletes (‘kills’) everything to the right.

        Standard keybindings (like C-c to copy and C-v to paste) may work. Keybindings are selected in the Configure IDLE dialog.

        @@ -574,7 +588,7 @@ are restricted to four spaces due to Tcl/Tk limitations.

        Search and Replace¶

        Any selection becomes a search target. However, only selections within a line work because searches are only performed within lines with the -terminal newline removed. If [x] Regular expresion is checked, the +terminal newline removed. If [x] Regular expression is checked, the target is interpreted according to the Python re module.

      @@ -681,20 +695,15 @@ re-started. This occurs when the user execution process has crashed, when one requests a restart on the Shell menu, or when one runs code in an editor window.

      The editing features described in previous subsections work when entering -code interactively. IDLE’s Shell window also responds to the following keys.

      -
        -
      • C-c interrupts executing command

      • -
      • C-d sends end-of-file; closes window if typed at a >>> prompt

      • -
      • Alt-/ (Expand word) is also useful to reduce typing

        -

        Command history

        +code interactively. IDLE’s Shell window also responds to the following:

          -
        • Alt-p retrieves previous command matching what you have typed. On -macOS use C-p.

        • -
        • Alt-n retrieves next. On macOS use C-n.

        • -
        • Return while the cursor is on any previous command -retrieves that command

        • -
        -
      • +
      • C-c attempts to interrupt statement execution (but may fail).

      • +
      • C-d closes Shell if typed at a >>> prompt.

      • +
      • Alt-p and Alt-n (C-p and C-n on macOS) +retrieve to the current prompt the previous or next previously +entered statement that matches anything already typed.

      • +
      • Return while the cursor is on any previous statement +appends the latter to anything already typed at the prompt.

      @@ -1077,8 +1086,8 @@ sense that feature changes can be backported (see tkinter.tix — Extension widgets for Tk

      +

      tkinter.ttk — Tk themed widgets

      Next topic

      @@ -1117,7 +1126,7 @@ sense that feature changes can be backported (see next |
    • - previous |
    • python logo
    • @@ -1130,7 +1139,7 @@ sense that feature changes can be backported (see - 3.12.0a0 Documentation » + 3.14.0a0 Documentation » @@ -1141,19 +1150,26 @@ sense that feature changes can be backported (see
      | +
    • + |
    diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index cc027b9c..d8613b2e 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -33,6 +33,7 @@ from tkinter.ttk import Frame, Menubutton, Scrollbar, Style from tkinter import font as tkfont from idlelib.config import idleConf +from idlelib.colorizer import color_config ## About IDLE ## @@ -102,7 +103,7 @@ class HelpParser(HTMLParser): if self.level > 0: self.nested_dl = True elif tag == 'li': - s = '\n* ' if self.simplelist else '\n\n* ' + s = '\n* ' elif tag == 'dt': s = '\n\n' if not self.nested_dl else '\n' # Avoid extra line. self.nested_dl = False @@ -177,14 +178,16 @@ class HelpText(Text): normalfont = self.findfont(['TkDefaultFont', 'arial', 'helvetica']) fixedfont = self.findfont(['TkFixedFont', 'monaco', 'courier']) + color_config(self) self['font'] = (normalfont, 12) self.tag_configure('em', font=(normalfont, 12, 'italic')) self.tag_configure('h1', font=(normalfont, 20, 'bold')) self.tag_configure('h2', font=(normalfont, 18, 'bold')) self.tag_configure('h3', font=(normalfont, 15, 'bold')) - self.tag_configure('pre', font=(fixedfont, 12), background='#f6f6ff') + self.tag_configure('pre', font=(fixedfont, 12)) + preback = self['selectbackground'] self.tag_configure('preblock', font=(fixedfont, 10), lmargin1=25, - borderwidth=1, relief='solid', background='#eeffcc') + background=preback) self.tag_configure('l1', lmargin1=25, lmargin2=25) self.tag_configure('l2', lmargin1=50, lmargin2=50) self.tag_configure('l3', lmargin1=75, lmargin2=75) @@ -241,12 +244,13 @@ class HelpWindow(Toplevel): Toplevel.__init__(self, parent) self.wm_title(title) self.protocol("WM_DELETE_WINDOW", self.destroy) - HelpFrame(self, filename).grid(column=0, row=0, sticky='nsew') + self.frame = HelpFrame(self, filename) + self.frame.grid(column=0, row=0, sticky='nsew') self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) -def copy_strip(): +def copy_strip(): # pragma: no cover """Copy idle.html to idlelib/help.html, stripping trailing whitespace. Files with trailing whitespace cannot be pushed to the git cpython @@ -278,13 +282,15 @@ def copy_strip(): out.write(line.rstrip() + b'\n') print(f'{src} copied to {dst}') + def show_idlehelp(parent): "Create HelpWindow; called from Idle Help event handler." filename = join(abspath(dirname(__file__)), 'help.html') - if not isfile(filename): + if not isfile(filename): # pragma: no cover # Try copy_strip, present message. return - HelpWindow(parent, filename, 'IDLE Help (%s)' % python_version()) + return HelpWindow(parent, filename, 'IDLE Doc (%s)' % python_version()) + if __name__ == '__main__': from unittest import main diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index cfa4ca78..81c65f62 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -85,15 +85,18 @@ class AboutDialog(Toplevel): byline = Label(frame_background, text=byline_text, justify=LEFT, fg=self.fg, bg=self.bg) byline.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5) - email = Label(frame_background, text='email: idle-dev@python.org', - justify=LEFT, fg=self.fg, bg=self.bg) - email.grid(row=6, column=0, columnspan=2, sticky=W, padx=10, pady=0) + + forums_url = "https://discuss.python.org" + forums = Label(frame_background, text="Python forums: "+forums_url, + justify=LEFT, fg=self.fg, bg=self.bg) + forums.grid(row=6, column=0, sticky=W, padx=10, pady=0) + forums.bind("", lambda event: webbrowser.open(forums_url)) docs_url = ("https://docs.python.org/%d.%d/library/idle.html" % sys.version_info[:2]) docs = Label(frame_background, text=docs_url, justify=LEFT, fg=self.fg, bg=self.bg) docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) - docs.bind("", lambda event: webbrowser.open(docs['text'])) + docs.bind("", lambda event: webbrowser.open(docs_url)) Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, @@ -123,17 +126,15 @@ class AboutDialog(Toplevel): height=2, bg=self.bg).grid(row=11, column=0, sticky=EW, columnspan=3, padx=5, pady=5) - idle = Label(frame_background, - text='IDLE', - fg=self.fg, bg=self.bg) + idle = Label(frame_background, text='IDLE', fg=self.fg, bg=self.bg) idle.grid(row=12, column=0, sticky=W, padx=10, pady=0) idle_buttons = Frame(frame_background, bg=self.bg) idle_buttons.grid(row=13, column=0, columnspan=3, sticky=NSEW) - self.readme = Button(idle_buttons, text='README', width=8, + self.readme = Button(idle_buttons, text='Readme', width=8, highlightbackground=self.bg, command=self.show_readme) self.readme.pack(side=LEFT, padx=10, pady=10) - self.idle_news = Button(idle_buttons, text='NEWS', width=8, + self.idle_news = Button(idle_buttons, text='News', width=8, highlightbackground=self.bg, command=self.show_idle_news) self.idle_news.pack(side=LEFT, padx=10, pady=10) @@ -167,7 +168,7 @@ class AboutDialog(Toplevel): def show_idle_news(self): "Handle News button event." - self.display_file_text('About - NEWS', 'NEWS.txt', 'utf-8') + self.display_file_text('About - News', 'News3.txt', 'utf-8') def display_printer_text(self, title, printer): """Create textview for built-in constants. diff --git a/Lib/idlelib/idle_test/example_stub.pyi b/Lib/idlelib/idle_test/example_stub.pyi index a9811a78..abcdbc17 100644 --- a/Lib/idlelib/idle_test/example_stub.pyi +++ b/Lib/idlelib/idle_test/example_stub.pyi @@ -1,2 +1,4 @@ +# An example file to test recognition of a .pyi file as Python source code. + class Example: def method(self, argument1: str, argument2: list[int]) -> None: ... diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index d297f8aa..a7293774 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -1,38 +1,36 @@ -'''Run human tests of Idle's window, dialog, and popup widgets. - -run(*tests) -Create a master Tk window. Within that, run each callable in tests -after finding the matching test spec in this file. If tests is empty, -run an htest for each spec dict in this file after finding the matching -callable in the module named in the spec. Close the window to skip or -end the test. - -In a tested module, let X be a global name bound to a callable (class -or function) whose .__name__ attribute is also X (the usual situation). -The first parameter of X must be 'parent'. When called, the parent -argument will be the root window. X must create a child Toplevel -window (or subclass thereof). The Toplevel may be a test widget or -dialog, in which case the callable is the corresponding class. Or the -Toplevel may contain the widget to be tested or set up a context in -which a test widget is invoked. In this latter case, the callable is a -wrapper function that sets up the Toplevel and other objects. Wrapper -function names, such as _editor_window', should start with '_'. +"""Run human tests of Idle's window, dialog, and popup widgets. + +run(*tests) Create a master Tk() htest window. Within that, run each +callable in tests after finding the matching test spec in this file. If +tests is empty, run an htest for each spec dict in this file after +finding the matching callable in the module named in the spec. Close +the master window to end testing. + +In a tested module, let X be a global name bound to a callable (class or +function) whose .__name__ attribute is also X (the usual situation). The +first parameter of X must be 'parent' or 'master'. When called, the +first argument will be the root window. X must create a child +Toplevel(parent/master) (or subclass thereof). The Toplevel may be a +test widget or dialog, in which case the callable is the corresponding +class. Or the Toplevel may contain the widget to be tested or set up a +context in which a test widget is invoked. In this latter case, the +callable is a wrapper function that sets up the Toplevel and other +objects. Wrapper function names, such as _editor_window', should start +with '_' and be lowercase. End the module with if __name__ == '__main__': - + from idlelib.idle_test.htest import run - run(X) + run(callable) # There could be multiple comma-separated callables. -To have wrapper functions and test invocation code ignored by coveragepy -reports, put '# htest #' on the def statement header line. - -def _wrapper(parent): # htest # - -Also make sure that the 'if __name__' line matches the above. Then have -make sure that .coveragerc includes the following. +To have wrapper functions ignored by coverage reports, tag the def +header like so: "def _wrapper(parent): # htest #". Use the same tag +for htest lines in widget code. Make sure that the 'if __name__' line +matches the above. Then have make sure that .coveragerc includes the +following: [report] exclude_lines = @@ -46,7 +44,7 @@ To run any X, this file must contain a matching instance of the following template, with X.__name__ prepended to '_spec'. When all tests are run, the prefix is use to get X. -_spec = { +callable_spec = { 'file': '', 'kwds': {'title': ''}, 'msg': "" @@ -54,16 +52,16 @@ _spec = { file (no .py): run() imports file.py. kwds: augmented with {'parent':root} and passed to X as **kwds. -title: an example kwd; some widgets need this, delete if not. +title: an example kwd; some widgets need this, delete line if not. msg: master window hints about testing the widget. -Modules and classes not being tested at the moment: -pyshell.PyShellEditorWindow -debugger.Debugger -autocomplete_w.AutoCompleteWindow -outwin.OutputWindow (indirectly being tested with grep test) -''' +TODO test these modules and classes: + autocomplete_w.AutoCompleteWindow + debugger.Debugger + outwin.OutputWindow (indirectly being tested with grep test) + pyshell.PyShellEditorWindow +""" import idlelib.pyshell # Set Windows DPI awareness before Tk(). from importlib import import_module @@ -91,15 +89,6 @@ _calltip_window_spec = { "Force-open-calltip does not work here.\n" } -_module_browser_spec = { - 'file': 'browser', - 'kwds': {}, - 'msg': "Inspect names of module, class(with superclass if " - "applicable), methods and functions.\nToggle nested items.\n" - "Double clicking on items prints a traceback for an exception " - "that is ignored." - } - _color_delegator_spec = { 'file': 'colorizer', 'kwds': {}, @@ -109,16 +98,6 @@ _color_delegator_spec = { "The default color scheme is in idlelib/config-highlight.def" } -CustomRun_spec = { - 'file': 'query', - 'kwds': {'title': 'Customize query.py Run', - '_htest': True}, - 'msg': "Enter with or [Run]. Print valid entry to Shell\n" - "Arguments are parsed into a list\n" - "Mode is currently restart True or False\n" - "Close dialog with valid entry, , [Cancel], [X]" - } - ConfigDialog_spec = { 'file': 'configdialog', 'kwds': {'title': 'ConfigDialogTest', @@ -135,6 +114,24 @@ ConfigDialog_spec = { "changes made have persisted." } +CustomRun_spec = { + 'file': 'query', + 'kwds': {'title': 'Customize query.py Run', + '_htest': True}, + 'msg': "Enter with or [OK]. Print valid entry to Shell\n" + "Arguments are parsed into a list\n" + "Mode is currently restart True or False\n" + "Close dialog with valid entry, , [Cancel], [X]" + } + +_debug_object_browser_spec = { + 'file': 'debugobj', + 'kwds': {}, + 'msg': "Double click on items up to the lowest level.\n" + "Attributes of the objects and related information " + "will be displayed side-by-side at each level." + } + # TODO Improve message _dyn_option_menu_spec = { 'file': 'dynoption', @@ -152,7 +149,7 @@ _editor_window_spec = { "Best to close editor first." } -GetKeysDialog_spec = { +GetKeysWindow_spec = { 'file': 'config_key', 'kwds': {'title': 'Test keybindings', 'action': 'find-again', @@ -173,8 +170,8 @@ _grep_dialog_spec = { 'msg': "Click the 'Show GrepDialog' button.\n" "Test the various 'Find-in-files' functions.\n" "The results should be displayed in a new '*Output*' window.\n" - "'Right-click'->'Go to file/line' anywhere in the search results " - "should open that file \nin a new EditorWindow." + "'Right-click'->'Go to file/line' in the search results\n " + "should open that file in a new EditorWindow." } HelpSource_spec = { @@ -190,7 +187,7 @@ HelpSource_spec = { "Any url ('www...', 'http...') is accepted.\n" "Test Browse with and without path, as cannot unittest.\n" "[Ok] or prints valid entry to shell\n" - "[Cancel] or prints None to shell" + ", [Cancel], or [X] prints None to shell" } _io_binding_spec = { @@ -206,56 +203,36 @@ _io_binding_spec = { "Check that changes were saved by opening the file elsewhere." } -_linenumbers_drag_scrolling_spec = { - 'file': 'sidebar', +_multi_call_spec = { + 'file': 'multicall', 'kwds': {}, - 'msg': textwrap.dedent("""\ - 1. Click on the line numbers and drag down below the edge of the - window, moving the mouse a bit and then leaving it there for a while. - The text and line numbers should gradually scroll down, with the - selection updated continuously. - - 2. With the lines still selected, click on a line number above the - selected lines. Only the line whose number was clicked should be - selected. - - 3. Repeat step #1, dragging to above the window. The text and line - numbers should gradually scroll up, with the selection updated - continuously. - - 4. Repeat step #2, clicking a line number below the selection."""), + 'msg': "The following should trigger a print to console or IDLE Shell.\n" + "Entering and leaving the text area, key entry, ,\n" + ", , , \n" + ", and focusing elsewhere." } -_multi_call_spec = { - 'file': 'multicall', +_module_browser_spec = { + 'file': 'browser', 'kwds': {}, - 'msg': "The following actions should trigger a print to console or IDLE" - " Shell.\nEntering and leaving the text area, key entry, " - ",\n, , " - ", \n, and " - "focusing out of the window\nare sequences to be tested." + 'msg': textwrap.dedent(""" + "Inspect names of module, class(with superclass if applicable), + "methods and functions. Toggle nested items. Double clicking + "on items prints a traceback for an exception that is ignored.""") } _multistatus_bar_spec = { 'file': 'statusbar', 'kwds': {}, 'msg': "Ensure presence of multi-status bar below text area.\n" - "Click 'Update Status' to change the multi-status text" + "Click 'Update Status' to change the status text" } -_object_browser_spec = { - 'file': 'debugobj', - 'kwds': {}, - 'msg': "Double click on items up to the lowest level.\n" - "Attributes of the objects and related information " - "will be displayed side-by-side at each level." - } - -_path_browser_spec = { +PathBrowser_spec = { 'file': 'pathbrowser', - 'kwds': {}, + 'kwds': {'_htest': True}, 'msg': "Test for correct display of all paths in sys.path.\n" - "Toggle nested items up to the lowest level.\n" + "Toggle nested items out to the lowest level.\n" "Double clicking on an item prints a traceback\n" "for an exception that is ignored." } @@ -291,6 +268,15 @@ _replace_dialog_spec = { "Click [Close] or [X] to close the 'Replace Dialog'." } +_scrolled_list_spec = { + 'file': 'scrolledlist', + 'kwds': {}, + 'msg': "You should see a scrollable list of items\n" + "Selecting (clicking) or double clicking an item " + "prints the name to the console or Idle shell.\n" + "Right clicking an item will display a popup." + } + _search_dialog_spec = { 'file': 'search', 'kwds': {}, @@ -306,15 +292,6 @@ _searchbase_spec = { "Its only action is to close." } -_scrolled_list_spec = { - 'file': 'scrolledlist', - 'kwds': {}, - 'msg': "You should see a scrollable list of items\n" - "Selecting (clicking) or double clicking an item " - "prints the name to the console or Idle shell.\n" - "Right clicking an item will display a popup." - } - show_idlehelp_spec = { 'file': 'help', 'kwds': {}, @@ -322,12 +299,31 @@ show_idlehelp_spec = { "Text is selectable. Window is scrollable." } -_stack_viewer_spec = { +_sidebar_number_scrolling_spec = { + 'file': 'sidebar', + 'kwds': {}, + 'msg': textwrap.dedent("""\ + 1. Click on the line numbers and drag down below the edge of the + window, moving the mouse a bit and then leaving it there for a + while. The text and line numbers should gradually scroll down, + with the selection updated continuously. + + 2. With the lines still selected, click on a line number above + or below the selected lines. Only the line whose number was + clicked should be selected. + + 3. Repeat step #1, dragging to above the window. The text and + line numbers should gradually scroll up, with the selection + updated continuously. + + 4. Repeat step #2, clicking a line number below the selection."""), + } + +_stackbrowser_spec = { 'file': 'stackviewer', 'kwds': {}, 'msg': "A stacktrace for a NameError exception.\n" - "Expand 'idlelib ...' and ''.\n" - "Check that exc_value, exc_tb, and exc_type are correct.\n" + "Should have NameError and 1 traceback line." } _tooltip_spec = { @@ -370,11 +366,12 @@ _widget_redirector_spec = { } def run(*tests): + "Run callables in tests." root = tk.Tk() root.title('IDLE htest') root.resizable(0, 0) - # a scrollable Label like constant width text widget. + # A scrollable Label-like constant width text widget. frameLabel = tk.Frame(root, padx=10) frameLabel.pack() text = tk.Text(frameLabel, wrap='word') @@ -384,45 +381,44 @@ def run(*tests): scrollbar.pack(side='right', fill='y', expand=False) text.pack(side='left', fill='both', expand=True) - test_list = [] # List of tuples of the form (spec, callable widget) + test_list = [] # Make list of (spec, callable) tuples. if tests: for test in tests: test_spec = globals()[test.__name__ + '_spec'] test_spec['name'] = test.__name__ test_list.append((test_spec, test)) else: - for k, d in globals().items(): - if k.endswith('_spec'): - test_name = k[:-5] - test_spec = d + for key, dic in globals().items(): + if key.endswith('_spec'): + test_name = key[:-5] + test_spec = dic test_spec['name'] = test_name mod = import_module('idlelib.' + test_spec['file']) test = getattr(mod, test_name) test_list.append((test_spec, test)) + test_list.reverse() # So can pop in proper order in next_test. test_name = tk.StringVar(root) callable_object = None test_kwds = None def next_test(): - nonlocal test_name, callable_object, test_kwds if len(test_list) == 1: next_button.pack_forget() test_spec, callable_object = test_list.pop() test_kwds = test_spec['kwds'] - test_kwds['parent'] = root test_name.set('Test ' + test_spec['name']) - text.configure(state='normal') # enable text editing - text.delete('1.0','end') - text.insert("1.0",test_spec['msg']) - text.configure(state='disabled') # preserve read-only property + text['state'] = 'normal' # Enable text replacement. + text.delete('1.0', 'end') + text.insert("1.0", test_spec['msg']) + text['state'] = 'disabled' # Restore read-only property. def run_test(_=None): - widget = callable_object(**test_kwds) + widget = callable_object(root, **test_kwds) try: - print(widget.result) + print(widget.result) # Only true for query classes(?). except AttributeError: pass @@ -441,5 +437,6 @@ def run(*tests): next_test() root.mainloop() + if __name__ == '__main__': run() diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index 1ccb63b9..28c196a4 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -7,6 +7,7 @@ import textwrap import types import re from idlelib.idle_test.mock_tk import Text +from test.support import MISSING_C_DOCSTRINGS # Test Class TC is used in multiple get_argspec test methods @@ -50,6 +51,8 @@ class Get_argspecTest(unittest.TestCase): # but a red buildbot is better than a user crash (as has happened). # For a simple mismatch, change the expected output to the actual. + @unittest.skipIf(MISSING_C_DOCSTRINGS, + "Signature information for builtins requires docstrings") def test_builtins(self): def tiptest(obj, out): @@ -76,6 +79,7 @@ class Get_argspecTest(unittest.TestCase): tiptest(list.append, '(self, object, /)' + append_doc) tiptest(List.append, '(self, object, /)' + append_doc) tiptest([].append, '(object, /)' + append_doc) + # The use of 'object' above matches the signature text. tiptest(types.MethodType, '(function, instance, /)\n' @@ -143,6 +147,8 @@ you\'ll probably have to override _wrap_chunks().''') f.__doc__ = 'a'*300 self.assertEqual(get_spec(f), f"()\n{'a'*(calltip._MAX_COLS-3) + '...'}") + @unittest.skipIf(MISSING_C_DOCSTRINGS, + "Signature information for builtins requires docstrings") def test_multiline_docstring(self): # Test fewer lines than max. self.assertEqual(get_spec(range), @@ -157,6 +163,7 @@ bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer bytes(int) -> bytes object of size given by the parameter initialized with null bytes bytes() -> empty bytes object''') + def test_multiline_docstring_2(self): # Test more than max lines def f(): pass f.__doc__ = 'a\n' * 15 diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py index 08ed76fe..6d75cf7a 100644 --- a/Lib/idlelib/idle_test/test_config.py +++ b/Lib/idlelib/idle_test/test_config.py @@ -85,8 +85,8 @@ class IdleConfParserTest(unittest.TestCase): self.assertEqual(parser.sections(), []) def test_load_file(self): - # Borrow test/cfgparser.1 from test_configparser. - config_path = findfile('cfgparser.1') + # Borrow test/configdata/cfgparser.1 from test_configparser. + config_path = findfile('cfgparser.1', subdir='configdata') parser = config.IdleConfParser(config_path) parser.Load() @@ -274,8 +274,8 @@ class IdleConfTest(unittest.TestCase): conf.CreateConfigHandlers() # Check keys are equal - self.assertCountEqual(conf.defaultCfg.keys(), conf.config_types) - self.assertCountEqual(conf.userCfg.keys(), conf.config_types) + self.assertCountEqual(conf.defaultCfg, conf.config_types) + self.assertCountEqual(conf.userCfg, conf.config_types) # Check conf parser are correct type for default_parser in conf.defaultCfg.values(): @@ -294,8 +294,8 @@ class IdleConfTest(unittest.TestCase): def test_load_cfg_files(self): conf = self.new_config(_utest=True) - # Borrow test/cfgparser.1 from test_configparser. - config_path = findfile('cfgparser.1') + # Borrow test/configdata/cfgparser.1 from test_configparser. + config_path = findfile('cfgparser.1', subdir='configdata') conf.defaultCfg['foo'] = config.IdleConfParser(config_path) conf.userCfg['foo'] = config.IdleUserConfParser(config_path) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index e5d5b401..5099d093 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -420,20 +420,14 @@ class HighPageTest(unittest.TestCase): # Set highlight_target through clicking highlight_sample. eq = self.assertEqual d = self.page - - elem = {} - count = 0 hs = d.highlight_sample hs.focus_force() - hs.see(1.0) - hs.update_idletasks() - def tag_to_element(elem): - for element, tag in d.theme_elements.items(): - elem[tag[0]] = element - - def click_it(start): - x, y, dx, dy = hs.bbox(start) + def click_char(index): + "Simulate click on character at *index*." + hs.see(index) + hs.update_idletasks() + x, y, dx, dy = hs.bbox(index) x += dx // 2 y += dy // 2 hs.event_generate('', x=0, y=0) @@ -441,17 +435,20 @@ class HighPageTest(unittest.TestCase): hs.event_generate('', x=x, y=y) hs.event_generate('', x=x, y=y) - # Flip theme_elements to make the tag the key. - tag_to_element(elem) + # Reverse theme_elements to make the tag the key. + elem = {tag: element for element, tag in d.theme_elements.items()} # If highlight_sample has a tag that isn't in theme_elements, there # will be a KeyError in the test run. + count = 0 for tag in hs.tag_names(): - for start_index in hs.tag_ranges(tag)[0::2]: - count += 1 - click_it(start_index) + try: + click_char(hs.tag_nextrange(tag, "1.0")[0]) eq(d.highlight_target.get(), elem[tag]) + count += 1 eq(d.set_highlight_target.called, count) + except IndexError: + pass # Skip unused theme_elements tag, like 'sel'. def test_highlight_sample_double_click(self): # Test double click on highlight_sample. diff --git a/Lib/idlelib/idle_test/test_debugger.py b/Lib/idlelib/idle_test/test_debugger.py index 35efb341..d1c9638d 100644 --- a/Lib/idlelib/idle_test/test_debugger.py +++ b/Lib/idlelib/idle_test/test_debugger.py @@ -1,16 +1,286 @@ -"Test debugger, coverage 19%" +"""Test debugger, coverage 66% + +Try to make tests pass with draft bdbx, which may replace bdb in 3.13+. +""" from idlelib import debugger -import unittest -from test.support import requires -requires('gui') +from collections import namedtuple +from textwrap import dedent from tkinter import Tk +from test.support import requires +import unittest +from unittest import mock +from unittest.mock import Mock, patch + +"""A test python script for the debug tests.""" +TEST_CODE = dedent(""" + i = 1 + i += 2 + if i == 3: + print(i) + """) + + +class MockFrame: + "Minimal mock frame." + + def __init__(self, code, lineno): + self.f_code = code + self.f_lineno = lineno + + +class IdbTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.gui = Mock() + cls.idb = debugger.Idb(cls.gui) + + # Create test and code objects to simulate a debug session. + code_obj = compile(TEST_CODE, 'idlelib/file.py', mode='exec') + frame1 = MockFrame(code_obj, 1) + frame1.f_back = None + frame2 = MockFrame(code_obj, 2) + frame2.f_back = frame1 + cls.frame = frame2 + cls.msg = 'file.py:2: ()' + + def test_init(self): + self.assertIs(self.idb.gui, self.gui) + # Won't test super call since two Bdbs are very different. + + def test_user_line(self): + # Test that .user_line() creates a string message for a frame. + self.gui.interaction = Mock() + self.idb.user_line(self.frame) + self.gui.interaction.assert_called_once_with(self.msg, self.frame) + + def test_user_exception(self): + # Test that .user_exception() creates a string message for a frame. + exc_info = (type(ValueError), ValueError(), None) + self.gui.interaction = Mock() + self.idb.user_exception(self.frame, exc_info) + self.gui.interaction.assert_called_once_with( + self.msg, self.frame, exc_info) + + +class FunctionTest(unittest.TestCase): + # Test module functions together. + + def test_functions(self): + rpc_obj = compile(TEST_CODE,'rpc.py', mode='exec') + rpc_frame = MockFrame(rpc_obj, 2) + rpc_frame.f_back = rpc_frame + self.assertTrue(debugger._in_rpc_code(rpc_frame)) + self.assertEqual(debugger._frame2message(rpc_frame), + 'rpc.py:2: ()') + + code_obj = compile(TEST_CODE, 'idlelib/debugger.py', mode='exec') + code_frame = MockFrame(code_obj, 1) + code_frame.f_back = None + self.assertFalse(debugger._in_rpc_code(code_frame)) + self.assertEqual(debugger._frame2message(code_frame), + 'debugger.py:1: ()') + + code_frame.f_back = code_frame + self.assertFalse(debugger._in_rpc_code(code_frame)) + code_frame.f_back = rpc_frame + self.assertTrue(debugger._in_rpc_code(code_frame)) + + +class DebuggerTest(unittest.TestCase): + "Tests for Debugger that do not need a real root." + + @classmethod + def setUpClass(cls): + cls.pyshell = Mock() + cls.pyshell.root = Mock() + cls.idb = Mock() + with patch.object(debugger.Debugger, 'make_gui'): + cls.debugger = debugger.Debugger(cls.pyshell, cls.idb) + cls.debugger.root = Mock() + + def test_cont(self): + self.debugger.cont() + self.idb.set_continue.assert_called_once() + + def test_step(self): + self.debugger.step() + self.idb.set_step.assert_called_once() + + def test_quit(self): + self.debugger.quit() + self.idb.set_quit.assert_called_once() + + def test_next(self): + with patch.object(self.debugger, 'frame') as frame: + self.debugger.next() + self.idb.set_next.assert_called_once_with(frame) + + def test_ret(self): + with patch.object(self.debugger, 'frame') as frame: + self.debugger.ret() + self.idb.set_return.assert_called_once_with(frame) + + def test_clear_breakpoint(self): + self.debugger.clear_breakpoint('test.py', 4) + self.idb.clear_break.assert_called_once_with('test.py', 4) + + def test_clear_file_breaks(self): + self.debugger.clear_file_breaks('test.py') + self.idb.clear_all_file_breaks.assert_called_once_with('test.py') + + def test_set_load_breakpoints(self): + # Test the .load_breakpoints() method calls idb. + FileIO = namedtuple('FileIO', 'filename') + + class MockEditWindow(object): + def __init__(self, fn, breakpoints): + self.io = FileIO(fn) + self.breakpoints = breakpoints + + self.pyshell.flist = Mock() + self.pyshell.flist.inversedict = ( + MockEditWindow('test1.py', [4, 4]), + MockEditWindow('test2.py', [13, 44, 45]), + ) + self.debugger.set_breakpoint('test0.py', 1) + self.idb.set_break.assert_called_once_with('test0.py', 1) + self.debugger.load_breakpoints() # Call set_breakpoint 5 times. + self.idb.set_break.assert_has_calls( + [mock.call('test0.py', 1), + mock.call('test1.py', 4), + mock.call('test1.py', 4), + mock.call('test2.py', 13), + mock.call('test2.py', 44), + mock.call('test2.py', 45)]) + + def test_sync_source_line(self): + # Test that .sync_source_line() will set the flist.gotofileline with fixed frame. + test_code = compile(TEST_CODE, 'test_sync.py', 'exec') + test_frame = MockFrame(test_code, 1) + self.debugger.frame = test_frame + + self.debugger.flist = Mock() + with patch('idlelib.debugger.os.path.exists', return_value=True): + self.debugger.sync_source_line() + self.debugger.flist.gotofileline.assert_called_once_with('test_sync.py', 1) + + +class DebuggerGuiTest(unittest.TestCase): + """Tests for debugger.Debugger that need tk root. + + close needs debugger.top set in make_gui. + """ + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = root = Tk() + root.withdraw() + cls.pyshell = Mock() + cls.pyshell.root = root + cls.idb = Mock() +# stack tests fail with debugger here. +## cls.debugger = debugger.Debugger(cls.pyshell, cls.idb) +## cls.debugger.root = root +## # real root needed for real make_gui +## # run, interacting, abort_loop + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def setUp(self): + self.debugger = debugger.Debugger(self.pyshell, self.idb) + self.debugger.root = self.root + # real root needed for real make_gui + # run, interacting, abort_loop + + def test_run_debugger(self): + self.debugger.run(1, 'two') + self.idb.run.assert_called_once_with(1, 'two') + self.assertEqual(self.debugger.interacting, 0) + + def test_close(self): + # Test closing the window in an idle state. + self.debugger.close() + self.pyshell.close_debugger.assert_called_once() + + def test_show_stack(self): + self.debugger.show_stack() + self.assertEqual(self.debugger.stackviewer.gui, self.debugger) + + def test_show_stack_with_frame(self): + test_frame = MockFrame(None, None) + self.debugger.frame = test_frame + + # Reset the stackviewer to force it to be recreated. + self.debugger.stackviewer = None + self.idb.get_stack.return_value = ([], 0) + self.debugger.show_stack() + + # Check that the newly created stackviewer has the test gui as a field. + self.assertEqual(self.debugger.stackviewer.gui, self.debugger) + self.idb.get_stack.assert_called_once_with(test_frame, None) + + +class StackViewerTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def setUp(self): + self.code = compile(TEST_CODE, 'test_stackviewer.py', 'exec') + self.stack = [ + (MockFrame(self.code, 1), 1), + (MockFrame(self.code, 2), 2) + ] + # Create a stackviewer and load the test stack. + self.sv = debugger.StackViewer(self.root, None, None) + self.sv.load_stack(self.stack) + + def test_init(self): + # Test creation of StackViewer. + gui = None + flist = None + master_window = self.root + sv = debugger.StackViewer(master_window, flist, gui) + self.assertTrue(hasattr(sv, 'stack')) + + def test_load_stack(self): + # Test the .load_stack() method against a fixed test stack. + # Check the test stack is assigned and the list contains the repr of them. + self.assertEqual(self.sv.stack, self.stack) + self.assertTrue('?.(), line 1:' in self.sv.get(0)) + self.assertEqual(self.sv.get(1), '?.(), line 2: ') + + def test_show_source(self): + # Test the .show_source() method against a fixed test stack. + # Patch out the file list to monitor it + self.sv.flist = Mock() + # Patch out isfile to pretend file exists. + with patch('idlelib.debugger.os.path.isfile', return_value=True) as isfile: + self.sv.show_source(1) + isfile.assert_called_once_with('test_stackviewer.py') + self.sv.flist.open.assert_called_once_with('test_stackviewer.py') + class NameSpaceTest(unittest.TestCase): @classmethod def setUpClass(cls): + requires('gui') cls.root = Tk() cls.root.withdraw() @@ -23,7 +293,5 @@ class NameSpaceTest(unittest.TestCase): debugger.NamespaceViewer(self.root, 'Test') -# Other classes are Idb, Debugger, and StackViewer. - if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_debugobj.py b/Lib/idlelib/idle_test/test_debugobj.py index 131ce22b..90ace4e1 100644 --- a/Lib/idlelib/idle_test/test_debugobj.py +++ b/Lib/idlelib/idle_test/test_debugobj.py @@ -37,7 +37,7 @@ class SequenceTreeItemTest(unittest.TestCase): def test_keys(self): ti = debugobj.SequenceTreeItem('label', 'abc') - self.assertEqual(list(ti.keys()), [0, 1, 2]) + self.assertEqual(list(ti.keys()), [0, 1, 2]) # keys() is a range. class DictTreeItemTest(unittest.TestCase): @@ -50,7 +50,7 @@ class DictTreeItemTest(unittest.TestCase): def test_keys(self): ti = debugobj.DictTreeItem('label', {1:1, 0:0, 2:2}) - self.assertEqual(ti.keys(), [0, 1, 2]) + self.assertEqual(ti.keys(), [0, 1, 2]) # keys() is a sorted list. if __name__ == '__main__': diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index 9296a6d2..0dfe2f3c 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -95,7 +95,7 @@ class GetLineIndentTest(unittest.TestCase): def insert(text, string): text.delete('1.0', 'end') text.insert('end', string) - text.update() # Force update for colorizer to finish. + text.update_idletasks() # Force update for colorizer to finish. class IndentAndNewlineTest(unittest.TestCase): diff --git a/Lib/idlelib/idle_test/test_help.py b/Lib/idlelib/idle_test/test_help.py index b5426599..c528d4e7 100644 --- a/Lib/idlelib/idle_test/test_help.py +++ b/Lib/idlelib/idle_test/test_help.py @@ -1,4 +1,4 @@ -"Test help, coverage 87%." +"Test help, coverage 94%." from idlelib import help import unittest @@ -8,25 +8,27 @@ from os.path import abspath, dirname, join from tkinter import Tk -class HelpFrameTest(unittest.TestCase): +class IdleDocTest(unittest.TestCase): @classmethod def setUpClass(cls): "By itself, this tests that file parsed without exception." cls.root = root = Tk() root.withdraw() - helpfile = join(dirname(dirname(abspath(__file__))), 'help.html') - cls.frame = help.HelpFrame(root, helpfile) + cls.window = help.show_idlehelp(root) @classmethod def tearDownClass(cls): - del cls.frame + del cls.window cls.root.update_idletasks() cls.root.destroy() del cls.root - def test_line1(self): - text = self.frame.text + def test_1window(self): + self.assertIn('IDLE Doc', self.window.wm_title()) + + def test_4text(self): + text = self.window.frame.text self.assertEqual(text.get('1.0', '1.end'), ' IDLE ') diff --git a/Lib/idlelib/idle_test/test_help_about.py b/Lib/idlelib/idle_test/test_help_about.py index 8b79487b..7e16abdb 100644 --- a/Lib/idlelib/idle_test/test_help_about.py +++ b/Lib/idlelib/idle_test/test_help_about.py @@ -71,7 +71,7 @@ class LiveDialogTest(unittest.TestCase): """Test buttons that display files.""" dialog = self.dialog button_sources = [(self.dialog.readme, 'README.txt', 'readme'), - (self.dialog.idle_news, 'NEWS.txt', 'news'), + (self.dialog.idle_news, 'News3.txt', 'news'), (self.dialog.idle_credits, 'CREDITS.txt', 'credits')] for button, filename, name in button_sources: diff --git a/Lib/idlelib/idle_test/test_outwin.py b/Lib/idlelib/idle_test/test_outwin.py index d6e85ad6..81f4aad7 100644 --- a/Lib/idlelib/idle_test/test_outwin.py +++ b/Lib/idlelib/idle_test/test_outwin.py @@ -1,6 +1,7 @@ "Test outwin, coverage 76%." from idlelib import outwin +import sys import unittest from test.support import requires from tkinter import Tk, Text @@ -18,6 +19,10 @@ class OutputWindowTest(unittest.TestCase): root.withdraw() w = cls.window = outwin.OutputWindow(None, None, None, root) cls.text = w.text = Text(root) + if sys.platform == 'darwin': # Issue 112938 + cls.text.update = cls.text.update_idletasks + # Without this, test write, writelines, and goto... fail. + # The reasons and why macOS-specific are unclear. @classmethod def tearDownClass(cls): diff --git a/Lib/idlelib/idle_test/test_run.py b/Lib/idlelib/idle_test/test_run.py index a38e43dc..83ecbffa 100644 --- a/Lib/idlelib/idle_test/test_run.py +++ b/Lib/idlelib/idle_test/test_run.py @@ -8,6 +8,7 @@ import unittest from unittest import mock import idlelib from idlelib.idle_test.mock_idle import Func +from test.support import force_not_colorized idlelib.testing = True # Use {} for executing test user code. @@ -46,6 +47,7 @@ class ExceptionTest(unittest.TestCase): "Did you mean: 'real'?\n"), ) + @force_not_colorized def test_get_message(self): for code, exc, msg in self.data: with self.subTest(code=code): @@ -57,6 +59,7 @@ class ExceptionTest(unittest.TestCase): expect = f'{exc.__name__}: {msg}' self.assertEqual(actual, expect) + @force_not_colorized @mock.patch.object(run, 'cleanup_traceback', new_callable=lambda: (lambda t, e: None)) def test_get_multiple_message(self, mock): diff --git a/Lib/idlelib/idle_test/test_sidebar.py b/Lib/idlelib/idle_test/test_sidebar.py index fb52b3a0..605e7a89 100644 --- a/Lib/idlelib/idle_test/test_sidebar.py +++ b/Lib/idlelib/idle_test/test_sidebar.py @@ -690,16 +690,22 @@ class ShellSidebarTest(unittest.TestCase): last_lineno = get_end_linenumber(text) self.assertIsNotNone(text.dlineinfo(text.index(f'{last_lineno}.0'))) - # Scroll up using the event. - # The meaning of delta is platform-dependent. - delta = -1 if sys.platform == 'darwin' else 120 - sidebar.canvas.event_generate('', x=0, y=0, delta=delta) + # Delta for , whose meaning is platform-dependent. + delta = 1 if sidebar.canvas._windowingsystem == 'aqua' else 120 + + # Scroll up. + if sidebar.canvas._windowingsystem == 'x11': + sidebar.canvas.event_generate('', x=0, y=0) + else: + sidebar.canvas.event_generate('', x=0, y=0, delta=delta) yield - if sys.platform != 'darwin': # .update_idletasks() does not work. - self.assertIsNone(text.dlineinfo(text.index(f'{last_lineno}.0'))) + self.assertIsNone(text.dlineinfo(text.index(f'{last_lineno}.0'))) - # Scroll back down using the event. - sidebar.canvas.event_generate('', x=0, y=0) + # Scroll back down. + if sidebar.canvas._windowingsystem == 'x11': + sidebar.canvas.event_generate('', x=0, y=0) + else: + sidebar.canvas.event_generate('', x=0, y=0, delta=-delta) yield self.assertIsNotNone(text.dlineinfo(text.index(f'{last_lineno}.0'))) diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index af8159c2..464126e2 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -7,7 +7,7 @@ import tokenize from tkinter import filedialog from tkinter import messagebox -from tkinter.simpledialog import askstring +from tkinter.simpledialog import askstring # loadfile encoding. from idlelib.config import idleConf from idlelib.util import py_extensions @@ -180,24 +180,25 @@ class IOBinding: return True def maybesave(self): + """Return 'yes', 'no', 'cancel' as appropriate. + + Tkinter messagebox.askyesnocancel converts these tk responses + to True, False, None. Convert back, as now expected elsewhere. + """ if self.get_saved(): return "yes" - message = "Do you want to save %s before closing?" % ( - self.filename or "this untitled document") + message = ("Do you want to save " + f"{self.filename or 'this untitled document'}" + " before closing?") confirm = messagebox.askyesnocancel( title="Save On Close", message=message, default=messagebox.YES, parent=self.text) if confirm: - reply = "yes" self.save(None) - if not self.get_saved(): - reply = "cancel" - elif confirm is None: - reply = "cancel" - else: - reply = "no" + reply = "yes" if self.get_saved() else "cancel" + else: reply = "cancel" if confirm is None else "no" self.text.focus_set() return reply @@ -393,13 +394,15 @@ class IOBinding: if self.editwin.flist: self.editwin.update_recent_files_list(filename) + def _io_binding(parent): # htest # from tkinter import Toplevel, Text - root = Toplevel(parent) - root.title("Test IOBinding") + top = Toplevel(parent) + top.title("Test IOBinding") x, y = map(int, parent.geometry().split('+')[1:]) - root.geometry("+%d+%d" % (x, y + 175)) + top.geometry("+%d+%d" % (x, y + 175)) + class MyEditWin: def __init__(self, text): self.text = text @@ -423,12 +426,13 @@ def _io_binding(parent): # htest # def savecopy(self, event): self.text.event_generate("<>") - text = Text(root) + text = Text(top) text.pack() text.focus_set() editwin = MyEditWin(text) IOBinding(editwin) + if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_iomenu', verbosity=2, exit=False) diff --git a/Lib/idlelib/macosx.py b/Lib/idlelib/macosx.py index 2ea02ec0..332952f4 100644 --- a/Lib/idlelib/macosx.py +++ b/Lib/idlelib/macosx.py @@ -221,7 +221,7 @@ def overrideRootMenu(root, flist): # The binding above doesn't reliably work on all versions of Tk # on macOS. Adding command definition below does seem to do the # right thing for now. - root.createcommand('exit', flist.close_all_callback) + root.createcommand('::tk::mac::Quit', flist.close_all_callback) if isCarbonTk(): # for Carbon AquaTk, replace the default Tk apple menu diff --git a/Lib/idlelib/multicall.py b/Lib/idlelib/multicall.py index 0200f445..41f81813 100644 --- a/Lib/idlelib/multicall.py +++ b/Lib/idlelib/multicall.py @@ -421,6 +421,8 @@ def _multi_call(parent): # htest # top.geometry("+%d+%d" % (x, y + 175)) text = MultiCallCreator(tkinter.Text)(top) text.pack() + text.focus_set() + def bindseq(seq, n=[0]): def handler(event): print(seq) @@ -440,6 +442,7 @@ def _multi_call(parent): # htest # bindseq("") bindseq("") + if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_mainmenu', verbosity=2, exit=False) diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py index 610031e2..8baa6575 100644 --- a/Lib/idlelib/outwin.py +++ b/Lib/idlelib/outwin.py @@ -112,7 +112,7 @@ class OutputWindow(EditorWindow): assert isinstance(s, str) self.text.insert(mark, s, tags) self.text.see(mark) - self.text.update_idletasks() + self.text.update() return len(s) def writelines(self, lines): @@ -182,6 +182,7 @@ class OnDemandOutputWindow: text.tag_raise('sel') self.write = self.owin.write + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_outwin', verbosity=2, exit=False) diff --git a/Lib/idlelib/pathbrowser.py b/Lib/idlelib/pathbrowser.py index 6de242d0..48a77875 100644 --- a/Lib/idlelib/pathbrowser.py +++ b/Lib/idlelib/pathbrowser.py @@ -99,13 +99,9 @@ class DirBrowserTreeItem(TreeItem): return sorted -def _path_browser(parent): # htest # - PathBrowser(parent, _htest=True) - parent.mainloop() - if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False) from idlelib.idle_test.htest import run - run(_path_browser) + run(PathBrowser) diff --git a/Lib/idlelib/percolator.py b/Lib/idlelib/percolator.py index 1fe34d29..aa73427c 100644 --- a/Lib/idlelib/percolator.py +++ b/Lib/idlelib/percolator.py @@ -86,11 +86,11 @@ def _percolator(parent): # htest # print(self.name, ": delete", args) self.delegate.delete(*args) - box = tk.Toplevel(parent) - box.title("Test Percolator") + top = tk.Toplevel(parent) + top.title("Test Percolator") x, y = map(int, parent.geometry().split('+')[1:]) - box.geometry("+%d+%d" % (x, y + 175)) - text = tk.Text(box) + top.geometry("+%d+%d" % (x, y + 175)) + text = tk.Text(top) p = Percolator(text) pin = p.insertfilter pout = p.removefilter @@ -103,13 +103,15 @@ def _percolator(parent): # htest # (pin if var2.get() else pout)(t2) text.pack() + text.focus_set() var1 = tk.IntVar(parent) - cb1 = tk.Checkbutton(box, text="Tracer1", command=toggle1, variable=var1) + cb1 = tk.Checkbutton(top, text="Tracer1", command=toggle1, variable=var1) cb1.pack() var2 = tk.IntVar(parent) - cb2 = tk.Checkbutton(box, text="Tracer2", command=toggle2, variable=var2) + cb2 = tk.Checkbutton(top, text="Tracer2", command=toggle2, variable=var2) cb2.pack() + if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_percolator', verbosity=2, exit=False) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 60287003..e882c6cb 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -11,15 +11,9 @@ except ImportError: "Your Python may not be configured for Tk. **", file=sys.__stderr__) raise SystemExit(1) -# Valid arguments for the ...Awareness call below are defined in the following. -# https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx if sys.platform == 'win32': - try: - import ctypes - PROCESS_SYSTEM_DPI_AWARE = 1 # Int required. - ctypes.OleDLL('shcore').SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) - except (ImportError, AttributeError, OSError): - pass + from idlelib.util import fix_win_hidpi + fix_win_hidpi() from tkinter import messagebox @@ -133,8 +127,8 @@ class PyShellEditorWindow(EditorWindow): def __init__(self, *args): self.breakpoints = [] EditorWindow.__init__(self, *args) - self.text.bind("<>", self.set_breakpoint_here) - self.text.bind("<>", self.clear_breakpoint_here) + self.text.bind("<>", self.set_breakpoint_event) + self.text.bind("<>", self.clear_breakpoint_event) self.text.bind("<>", self.flist.open_shell) #TODO: don't read/write this from/to .idlerc when testing @@ -155,8 +149,8 @@ class PyShellEditorWindow(EditorWindow): ("Copy", "<>", "rmenu_check_copy"), ("Paste", "<>", "rmenu_check_paste"), (None, None, None), - ("Set Breakpoint", "<>", None), - ("Clear Breakpoint", "<>", None) + ("Set Breakpoint", "<>", None), + ("Clear Breakpoint", "<>", None) ] def color_breakpoint_text(self, color=True): @@ -181,11 +175,11 @@ class PyShellEditorWindow(EditorWindow): self.breakpoints.append(lineno) try: # update the subprocess debugger debug = self.flist.pyshell.interp.debugger - debug.set_breakpoint_here(filename, lineno) + debug.set_breakpoint(filename, lineno) except: # but debugger may not be active right now.... pass - def set_breakpoint_here(self, event=None): + def set_breakpoint_event(self, event=None): text = self.text filename = self.io.filename if not filename: @@ -194,7 +188,7 @@ class PyShellEditorWindow(EditorWindow): lineno = int(float(text.index("insert"))) self.set_breakpoint(lineno) - def clear_breakpoint_here(self, event=None): + def clear_breakpoint_event(self, event=None): text = self.text filename = self.io.filename if not filename: @@ -209,7 +203,7 @@ class PyShellEditorWindow(EditorWindow): "insert lineend +1char") try: debug = self.flist.pyshell.interp.debugger - debug.clear_breakpoint_here(filename, lineno) + debug.clear_breakpoint(filename, lineno) except: pass @@ -712,7 +706,7 @@ class ModifiedInterpreter(InteractiveInterpreter): del _filename, _sys, _dirname, _dir \n""".format(filename)) - def showsyntaxerror(self, filename=None): + def showsyntaxerror(self, filename=None, **kwargs): """Override Interactive Interpreter method: Use Colorizing Color the offending position instead of printing it and pointing at it @@ -747,10 +741,11 @@ class ModifiedInterpreter(InteractiveInterpreter): self.tkconsole.open_stack_viewer() def checklinecache(self): - c = linecache.cache - for key in list(c.keys()): + "Remove keys other than ''." + cache = linecache.cache + for key in list(cache): # Iterate list because mutate cache. if key[:1] + key[-1:] != "<>": - del c[key] + del cache[key] def runcommand(self, code): "Run the code without invoking the debugger" @@ -1693,6 +1688,7 @@ def main(): root.destroy() capture_warnings(False) + if __name__ == "__main__": main() diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index df02f212..57230e2a 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -368,7 +368,7 @@ class CustomRun(Query): sticky='we') def cli_args_ok(self): - "Validity check and parsing for command line arguments." + "Return command line arg list or None if error." cli_string = self.entry.get().strip() try: cli_args = shlex.split(cli_string, posix=True) diff --git a/Lib/idlelib/redirector.py b/Lib/idlelib/redirector.py index 4928340e..8e2ba68d 100644 --- a/Lib/idlelib/redirector.py +++ b/Lib/idlelib/redirector.py @@ -106,6 +106,7 @@ class WidgetRedirector: to *args to accomplish that. For an example, see colorizer.py. ''' + operation = str(operation) # can be a Tcl_Obj m = self._operations.get(operation) try: if m: @@ -164,6 +165,7 @@ def _widget_redirector(parent): # htest # original_insert(*args) original_insert = redir.register("insert", my_insert) + if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_redirector', verbosity=2, exit=False) diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index ca831738..3716d841 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -25,7 +25,8 @@ def replace(text, insert_tags=None): if not hasattr(engine, "_replacedialog"): engine._replacedialog = ReplaceDialog(root, engine) dialog = engine._replacedialog - dialog.open(text, insert_tags=insert_tags) + searchphrase = text.get("sel.first", "sel.last") + dialog.open(text, searchphrase, insert_tags=insert_tags) class ReplaceDialog(SearchDialogBase): @@ -51,27 +52,17 @@ class ReplaceDialog(SearchDialogBase): self.replvar = StringVar(root) self.insert_tags = None - def open(self, text, insert_tags=None): + def open(self, text, searchphrase=None, *, insert_tags=None): """Make dialog visible on top of others and ready to use. - Also, highlight the currently selected text and set the - search to include the current selection (self.ok). + Also, set the search to include the current selection + (self.ok). Args: text: Text widget being searched. + searchphrase: String phrase to search. """ - SearchDialogBase.open(self, text) - try: - first = text.index("sel.first") - except TclError: - first = None - try: - last = text.index("sel.last") - except TclError: - last = None - first = first or text.index("insert") - last = last or first - self.show_hit(first, last) + SearchDialogBase.open(self, text, searchphrase) self.ok = True self.insert_tags = insert_tags @@ -120,7 +111,7 @@ class ReplaceDialog(SearchDialogBase): if self.engine.isre(): try: new = m.expand(repl) - except re.error: + except re.PatternError: self.engine.report_error(repl, 'Invalid Replace Expression') new = None else: @@ -299,6 +290,7 @@ def _replace_dialog(parent): # htest # button = Button(frame, text="Replace", command=show_replace) button.pack() + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_replace', verbosity=2, exit=False) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index b08b80c9..3f0b2230 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -158,8 +158,8 @@ class SocketIO: s = s + " " + str(a) print(s, file=sys.__stderr__) - def register(self, oid, object): - self.objtable[oid] = object + def register(self, oid, object_): + self.objtable[oid] = object_ def unregister(self, oid): try: diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 53e80a9b..a30db99a 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -91,21 +91,28 @@ def capture_warnings(capture): _warnings_showwarning = None capture_warnings(True) -tcl = tkinter.Tcl() -def handle_tk_events(tcl=tcl): - """Process any tk events that are ready to be dispatched if tkinter - has been imported, a tcl interpreter has been created and tk has been - loaded.""" - tcl.eval("update") +if idlelib.testing: + # gh-121008: When testing IDLE, don't create a Tk object to avoid side + # effects such as installing a PyOS_InputHook hook. + def handle_tk_events(): + pass +else: + tcl = tkinter.Tcl() + + def handle_tk_events(tcl=tcl): + """Process any tk events that are ready to be dispatched if tkinter + has been imported, a tcl interpreter has been created and tk has been + loaded.""" + tcl.eval("update") # Thread shared globals: Establish a queue between a subthread (which handles # the socket) and the main thread (which runs user code), plus global -# completion, exit and interruptable (the main thread) flags: +# completion, exit and interruptible (the main thread) flags: exit_now = False quitting = False -interruptable = False +interruptible = False def main(del_exitfunc=False): """Start the Python execution server in a subprocess @@ -436,6 +443,9 @@ class StdioFile(io.TextIOBase): def __init__(self, shell, tags, encoding='utf-8', errors='strict'): self.shell = shell + # GH-78889: accessing unpickleable attributes freezes Shell. + # IDLE only needs methods; allow 'width' for possible use. + self.shell._RPCProxy__attributes = {'width': 1} self.tags = tags self._encoding = encoding self._errors = errors @@ -572,14 +582,14 @@ class Executive: self.locals = {} def runcode(self, code): - global interruptable + global interruptible try: self.user_exc_info = None - interruptable = True + interruptible = True try: exec(code, self.locals) finally: - interruptable = False + interruptible = False except SystemExit as e: if e.args: # SystemExit called with an argument. ob = e.args[0] @@ -605,7 +615,7 @@ class Executive: flush_stdout() def interrupt_the_server(self): - if interruptable: + if interruptible: thread.interrupt_main() def start_the_debugger(self, gui_adap_oid): diff --git a/Lib/idlelib/scrolledlist.py b/Lib/idlelib/scrolledlist.py index 71fd18ab..4fb418db 100644 --- a/Lib/idlelib/scrolledlist.py +++ b/Lib/idlelib/scrolledlist.py @@ -132,6 +132,7 @@ def _scrolled_list(parent): # htest # top = Toplevel(parent) x, y = map(int, parent.geometry().split('+')[1:]) top.geometry("+%d+%d" % (x+200, y + 175)) + class MyScrolledList(ScrolledList): def fill_menu(self): self.menu.add_command(label="right click") def on_select(self, index): print("select", self.get(index)) @@ -141,9 +142,10 @@ def _scrolled_list(parent): # htest # for i in range(30): scrolled_list.append("Item %02d" % i) + if __name__ == '__main__': from unittest import main - main('idlelib.idle_test.test_scrolledlist', verbosity=2,) + main('idlelib.idle_test.test_scrolledlist', verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_scrolled_list) diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index b35f3b59..935a4832 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -156,6 +156,7 @@ def _search_dialog(parent): # htest # button = Button(frame, text="Search (selection ignored)", command=show_find) button.pack() + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_search', verbosity=2, exit=False) diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 64ed50c7..c68a6ca3 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -86,7 +86,7 @@ class SearchDialogBase: top.wm_iconname(self.icon) _setup_dialog(top) self.top = top - self.frame = Frame(top, padding="5px") + self.frame = Frame(top, padding=5) self.frame.grid(sticky="nwes") top.grid_columnconfigure(0, weight=100) top.grid_rowconfigure(0, weight=100) diff --git a/Lib/idlelib/searchengine.py b/Lib/idlelib/searchengine.py index 0684142f..ceb38cfa 100644 --- a/Lib/idlelib/searchengine.py +++ b/Lib/idlelib/searchengine.py @@ -84,7 +84,7 @@ class SearchEngine: flags = flags | re.IGNORECASE try: prog = re.compile(pat, flags) - except re.error as e: + except re.PatternError as e: self.report_error(pat, e.msg, e.pos) return None return prog diff --git a/Lib/idlelib/sidebar.py b/Lib/idlelib/sidebar.py index fb1084db..aa19a24e 100644 --- a/Lib/idlelib/sidebar.py +++ b/Lib/idlelib/sidebar.py @@ -25,10 +25,9 @@ def get_end_linenumber(text): def get_displaylines(text, index): """Display height, in lines, of a logical line in a Tk text widget.""" - res = text.count(f"{index} linestart", - f"{index} lineend", - "displaylines") - return res[0] if res else 0 + return text.count(f"{index} linestart", + f"{index} lineend", + "displaylines", return_ints=True) def get_widget_padding(widget): """Get the total padding of a Tk widget, including its border.""" @@ -514,16 +513,16 @@ class ShellSidebar(BaseSideBar): self.change_callback() -def _linenumbers_drag_scrolling(parent): # htest # +def _sidebar_number_scrolling(parent): # htest # from idlelib.idle_test.test_sidebar import Dummy_editwin - toplevel = tk.Toplevel(parent) - text_frame = tk.Frame(toplevel) + top = tk.Toplevel(parent) + text_frame = tk.Frame(top) text_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) text_frame.rowconfigure(1, weight=1) text_frame.columnconfigure(1, weight=1) - font = idleConf.GetFont(toplevel, 'main', 'EditorWindow') + font = idleConf.GetFont(top, 'main', 'EditorWindow') text = tk.Text(text_frame, width=80, height=24, wrap=tk.NONE, font=font) text.grid(row=1, column=1, sticky=tk.NSEW) @@ -541,4 +540,4 @@ if __name__ == '__main__': main('idlelib.idle_test.test_sidebar', verbosity=2, exit=False) from idlelib.idle_test.htest import run - run(_linenumbers_drag_scrolling) + run(_sidebar_number_scrolling) diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py index 7b00c4cd..95042d4d 100644 --- a/Lib/idlelib/stackviewer.py +++ b/Lib/idlelib/stackviewer.py @@ -1,3 +1,5 @@ +# Rename to stackbrowser or possibly consolidate with browser. + import linecache import os @@ -99,19 +101,19 @@ class VariablesTreeItem(ObjectTreeItem): def GetSubList(self): sublist = [] - for key in self.object.keys(): + for key in self.object.keys(): # self.object not necessarily dict. try: value = self.object[key] except KeyError: continue - def setfunction(value, key=key, object=self.object): - object[key] = value + def setfunction(value, key=key, object_=self.object): + object_[key] = value item = make_objecttreeitem(key + " =", value, setfunction) sublist.append(item) return sublist -def _stack_viewer(parent): # htest # +def _stackbrowser(parent): # htest # from idlelib.pyshell import PyShellFileList top = tk.Toplevel(parent) top.title("Test StackViewer") @@ -129,4 +131,4 @@ if __name__ == '__main__': main('idlelib.idle_test.test_stackviewer', verbosity=2, exit=False) from idlelib.idle_test.htest import run - run(_stack_viewer) + run(_stackbrowser) diff --git a/Lib/idlelib/statusbar.py b/Lib/idlelib/statusbar.py index 755fafb0..8445d4cc 100644 --- a/Lib/idlelib/statusbar.py +++ b/Lib/idlelib/statusbar.py @@ -26,6 +26,7 @@ def _multistatus_bar(parent): # htest # x, y = map(int, parent.geometry().split('+')[1:]) top.geometry("+%d+%d" %(x, y + 175)) top.title("Test multistatus bar") + frame = Frame(top) text = Text(frame, height=5, width=40) text.pack() @@ -42,6 +43,7 @@ def _multistatus_bar(parent): # htest # button.pack(side='bottom') frame.pack() + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_statusbar', verbosity=2, exit=False) diff --git a/Lib/idlelib/tooltip.py b/Lib/idlelib/tooltip.py index 3983690d..df5b1fe1 100644 --- a/Lib/idlelib/tooltip.py +++ b/Lib/idlelib/tooltip.py @@ -144,7 +144,8 @@ class OnHoverTooltipBase(TooltipBase): class Hovertip(OnHoverTooltipBase): "A tooltip that pops up when a mouse hovers over an anchor widget." - def __init__(self, anchor_widget, text, hover_delay=1000): + def __init__(self, anchor_widget, text, hover_delay=1000, + foreground="#000000", background="#ffffe0"): """Create a text tooltip with a mouse hover delay. anchor_widget: the widget next to which the tooltip will be shown @@ -156,10 +157,13 @@ class Hovertip(OnHoverTooltipBase): """ super().__init__(anchor_widget, hover_delay=hover_delay) self.text = text + self.foreground = foreground + self.background = background def showcontents(self): label = Label(self.tipwindow, text=self.text, justify=LEFT, - background="#ffffe0", relief=SOLID, borderwidth=1) + relief=SOLID, borderwidth=1, + foreground=self.foreground, background=self.background) label.pack() diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py index 5f30f0f6..182ce718 100644 --- a/Lib/idlelib/tree.py +++ b/Lib/idlelib/tree.py @@ -83,6 +83,8 @@ def wheel_event(event, widget=None): class TreeNode: + dy = 0 + def __init__(self, canvas, parent, item): self.canvas = canvas self.parent = parent @@ -199,23 +201,22 @@ class TreeNode: def draw(self, x, y): # XXX This hard-codes too many geometry constants! - dy = 20 self.x, self.y = x, y self.drawicon() self.drawtext() if self.state != 'expanded': - return y + dy + return y + TreeNode.dy # draw children if not self.children: sublist = self.item._GetSubList() if not sublist: # _IsExpandable() was mistaken; that's allowed - return y+17 + return y + TreeNode.dy for item in sublist: child = self.__class__(self.canvas, self, item) self.children.append(child) cx = x+20 - cy = y + dy + cy = y + TreeNode.dy cylast = 0 for child in self.children: cylast = cy @@ -285,9 +286,15 @@ class TreeNode: self.label.bind("<1>", self.select_or_edit) self.label.bind("", self.flip) self.label.bind("", lambda e: wheel_event(e, self.canvas)) - self.label.bind("", lambda e: wheel_event(e, self.canvas)) - self.label.bind("", lambda e: wheel_event(e, self.canvas)) + if self.label._windowingsystem == 'x11': + self.label.bind("", lambda e: wheel_event(e, self.canvas)) + self.label.bind("", lambda e: wheel_event(e, self.canvas)) self.text_id = id + if TreeNode.dy == 0: + # The first row doesn't matter what the dy is, just measure its + # size to get the value of the subsequent dy + coords = self.canvas.bbox(id) + TreeNode.dy = max(20, coords[3] - coords[1] - 3) def select_or_edit(self, event=None): if self.selected and self.item.IsEditable(): @@ -460,8 +467,9 @@ class ScrolledCanvas: self.canvas.bind("", self.unit_up) self.canvas.bind("", self.unit_down) self.canvas.bind("", wheel_event) - self.canvas.bind("", wheel_event) - self.canvas.bind("", wheel_event) + if self.canvas._windowingsystem == 'x11': + self.canvas.bind("", wheel_event) + self.canvas.bind("", wheel_event) #if isinstance(master, Toplevel) or isinstance(master, Tk): self.canvas.bind("", self.zoom_height) self.canvas.focus_set() @@ -492,6 +500,7 @@ def _tree_widget(parent): # htest # node = TreeNode(sc.canvas, None, item) node.expand() + if __name__ == '__main__': from unittest import main main('idlelib.idle_test.test_tree', verbosity=2, exit=False) diff --git a/Lib/idlelib/undo.py b/Lib/idlelib/undo.py index 5f10c0f0..f52446d5 100644 --- a/Lib/idlelib/undo.py +++ b/Lib/idlelib/undo.py @@ -339,25 +339,26 @@ class CommandSequence(Command): def _undo_delegator(parent): # htest # from tkinter import Toplevel, Text, Button from idlelib.percolator import Percolator - undowin = Toplevel(parent) - undowin.title("Test UndoDelegator") + top = Toplevel(parent) + top.title("Test UndoDelegator") x, y = map(int, parent.geometry().split('+')[1:]) - undowin.geometry("+%d+%d" % (x, y + 175)) + top.geometry("+%d+%d" % (x, y + 175)) - text = Text(undowin, height=10) + text = Text(top, height=10) text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) - undo = Button(undowin, text="Undo", command=lambda:d.undo_event(None)) + undo = Button(top, text="Undo", command=lambda:d.undo_event(None)) undo.pack(side='left') - redo = Button(undowin, text="Redo", command=lambda:d.redo_event(None)) + redo = Button(top, text="Redo", command=lambda:d.redo_event(None)) redo.pack(side='left') - dump = Button(undowin, text="Dump", command=lambda:d.dump_event(None)) + dump = Button(top, text="Dump", command=lambda:d.dump_event(None)) dump.pack(side='left') + if __name__ == "__main__": from unittest import main main('idlelib.idle_test.test_undo', verbosity=2, exit=False) diff --git a/Lib/idlelib/util.py b/Lib/idlelib/util.py index ede670a4..e05604ab 100644 --- a/Lib/idlelib/util.py +++ b/Lib/idlelib/util.py @@ -12,9 +12,25 @@ TODO: * std streams (pyshell, run), * warning stuff (pyshell, run). """ +import sys + +# .pyw is for Windows; .pyi is for typing stub files. +# The extension order is needed for iomenu open/save dialogs. +py_extensions = ('.py', '.pyw', '.pyi') + + +# Fix for HiDPI screens on Windows. CALL BEFORE ANY TK OPERATIONS! +# URL for arguments for the ...Awareness call below. +# https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx +if sys.platform == 'win32': # pragma: no cover + def fix_win_hidpi(): # Called in pyshell and turtledemo. + try: + import ctypes + PROCESS_SYSTEM_DPI_AWARE = 1 # Int required. + ctypes.OleDLL('shcore').SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) + except (ImportError, AttributeError, OSError): + pass -# .pyw is for Windows; .pyi is for stub files. -py_extensions = ('.py', '.pyw', '.pyi') # Order needed for open/save dialogs. if __name__ == '__main__': from unittest import main diff --git a/Lib/imghdr.py b/Lib/imghdr.py deleted file mode 100644 index 33868883..00000000 --- a/Lib/imghdr.py +++ /dev/null @@ -1,180 +0,0 @@ -"""Recognize image file formats based on their first few bytes.""" - -from os import PathLike -import warnings - -__all__ = ["what"] - - -warnings._deprecated(__name__, remove=(3, 13)) - - -#-------------------------# -# Recognize image headers # -#-------------------------# - -def what(file, h=None): - """Return the type of image contained in a file or byte stream.""" - f = None - try: - if h is None: - if isinstance(file, (str, PathLike)): - f = open(file, 'rb') - h = f.read(32) - else: - location = file.tell() - h = file.read(32) - file.seek(location) - for tf in tests: - res = tf(h, f) - if res: - return res - finally: - if f: f.close() - return None - - -#---------------------------------# -# Subroutines per image file type # -#---------------------------------# - -tests = [] - -def test_jpeg(h, f): - """Test for JPEG data with JFIF or Exif markers; and raw JPEG.""" - if h[6:10] in (b'JFIF', b'Exif'): - return 'jpeg' - elif h[:4] == b'\xff\xd8\xff\xdb': - return 'jpeg' - -tests.append(test_jpeg) - -def test_png(h, f): - """Verify if the image is a PNG.""" - if h.startswith(b'\211PNG\r\n\032\n'): - return 'png' - -tests.append(test_png) - -def test_gif(h, f): - """Verify if the image is a GIF ('87 or '89 variants).""" - if h[:6] in (b'GIF87a', b'GIF89a'): - return 'gif' - -tests.append(test_gif) - -def test_tiff(h, f): - """Verify if the image is a TIFF (can be in Motorola or Intel byte order).""" - if h[:2] in (b'MM', b'II'): - return 'tiff' - -tests.append(test_tiff) - -def test_rgb(h, f): - """test for the SGI image library.""" - if h.startswith(b'\001\332'): - return 'rgb' - -tests.append(test_rgb) - -def test_pbm(h, f): - """Verify if the image is a PBM (portable bitmap).""" - if len(h) >= 3 and \ - h[0] == ord(b'P') and h[1] in b'14' and h[2] in b' \t\n\r': - return 'pbm' - -tests.append(test_pbm) - -def test_pgm(h, f): - """Verify if the image is a PGM (portable graymap).""" - if len(h) >= 3 and \ - h[0] == ord(b'P') and h[1] in b'25' and h[2] in b' \t\n\r': - return 'pgm' - -tests.append(test_pgm) - -def test_ppm(h, f): - """Verify if the image is a PPM (portable pixmap).""" - if len(h) >= 3 and \ - h[0] == ord(b'P') and h[1] in b'36' and h[2] in b' \t\n\r': - return 'ppm' - -tests.append(test_ppm) - -def test_rast(h, f): - """test for the Sun raster file.""" - if h.startswith(b'\x59\xA6\x6A\x95'): - return 'rast' - -tests.append(test_rast) - -def test_xbm(h, f): - """Verify if the image is a X bitmap (X10 or X11).""" - if h.startswith(b'#define '): - return 'xbm' - -tests.append(test_xbm) - -def test_bmp(h, f): - """Verify if the image is a BMP file.""" - if h.startswith(b'BM'): - return 'bmp' - -tests.append(test_bmp) - -def test_webp(h, f): - """Verify if the image is a WebP.""" - if h.startswith(b'RIFF') and h[8:12] == b'WEBP': - return 'webp' - -tests.append(test_webp) - -def test_exr(h, f): - """verify is the image ia a OpenEXR fileOpenEXR.""" - if h.startswith(b'\x76\x2f\x31\x01'): - return 'exr' - -tests.append(test_exr) - -#--------------------# -# Small test program # -#--------------------# - -def test(): - import sys - recursive = 0 - if sys.argv[1:] and sys.argv[1] == '-r': - del sys.argv[1:2] - recursive = 1 - try: - if sys.argv[1:]: - testall(sys.argv[1:], recursive, 1) - else: - testall(['.'], recursive, 1) - except KeyboardInterrupt: - sys.stderr.write('\n[Interrupted]\n') - sys.exit(1) - -def testall(list, recursive, toplevel): - import sys - import os - for filename in list: - if os.path.isdir(filename): - print(filename + '/:', end=' ') - if recursive or toplevel: - print('recursing down:') - import glob - names = glob.glob(os.path.join(glob.escape(filename), '*')) - testall(names, recursive, 0) - else: - print('*** directory (use -r) ***') - else: - print(filename + ':', end=' ') - sys.stdout.flush() - try: - print(what(filename)) - except OSError: - print('*** not found ***') - -if __name__ == '__main__': - test() diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index 707c081c..a7d57561 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -54,8 +54,6 @@ _unpack_uint32 = _bootstrap_external._unpack_uint32 # Fully bootstrapped at this point, import whatever you like, circular # dependencies and startup overhead minimisation permitting :) -import warnings - # Public API ######################################################### @@ -105,7 +103,7 @@ def reload(module): try: name = module.__name__ except AttributeError: - raise TypeError("reload() argument must be a module") + raise TypeError("reload() argument must be a module") from None if sys.modules.get(name) is not module: raise ImportError(f"module {name} not in sys.modules", name=name) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index ec2e56f6..de5651f0 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -53,7 +53,7 @@ def _new_module(name): # For a list that can have a weakref to it. class _List(list): - pass + __slots__ = ("__weakref__",) # Copied from weakref.py with some simplifications and modifications unique to @@ -824,10 +824,16 @@ def _module_repr_from_spec(spec): """Return the repr to use for the module.""" name = '?' if spec.name is None else spec.name if spec.origin is None: - if spec.loader is None: + loader = spec.loader + if loader is None: return f'' + elif ( + _bootstrap_external is not None + and isinstance(loader, _bootstrap_external.NamespaceLoader) + ): + return f'' else: - return f'' + return f'' else: if spec.has_location: return f'' @@ -1128,7 +1134,7 @@ class FrozenImporter: # part of the importer), instead of here (the finder part). # The loader is the usual place to get the data that will # be loaded into the module. (For example, see _LoaderBasics - # in _bootstra_external.py.) Most importantly, this importer + # in _bootstrap_external.py.) Most importantly, this importer # is simpler if we wait to get the data. # However, getting as much data in the finder as possible # to later load the module is okay, and sometimes important. diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 73ac4405..eb8fea1a 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -52,7 +52,7 @@ _pathseps_with_colon = {f':{s}' for s in path_separators} # Bootstrap-related code ###################################################### _CASE_INSENSITIVE_PLATFORMS_STR_KEY = 'win', -_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin' +_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY = 'cygwin', 'darwin', 'ios', 'tvos', 'watchos' _CASE_INSENSITIVE_PLATFORMS = (_CASE_INSENSITIVE_PLATFORMS_BYTES_KEY + _CASE_INSENSITIVE_PLATFORMS_STR_KEY) @@ -81,6 +81,11 @@ def _pack_uint32(x): return (int(x) & 0xFFFFFFFF).to_bytes(4, 'little') +def _unpack_uint64(data): + """Convert 8 bytes in little-endian to an integer.""" + assert len(data) == 8 + return int.from_bytes(data, 'little') + def _unpack_uint32(data): """Convert 4 bytes in little-endian to an integer.""" assert len(data) == 4 @@ -204,7 +209,11 @@ def _write_atomic(path, data, mode=0o666): # We first write data to a temporary file, and then use os.replace() to # perform an atomic rename. with _io.FileIO(fd, 'wb') as file: - file.write(data) + bytes_written = file.write(data) + if bytes_written != len(data): + # Raise an OSError so the 'except' below cleans up the partially + # written file. + raise OSError("os.write() didn't write the full pyc file") _os.replace(path_tmp, path) except OSError: try: @@ -413,6 +422,7 @@ _code_type = type(_write_atomic.__code__) # Python 3.11a7 3492 (make POP_JUMP_IF_NONE/NOT_NONE/TRUE/FALSE relative) # Python 3.11a7 3493 (Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative) # Python 3.11a7 3494 (New location info table) +# Python 3.11b4 3495 (Set line number of module's RESUME instr to 0 per PEP 626) # Python 3.12a1 3500 (Remove PRECALL opcode) # Python 3.12a1 3501 (YIELD_VALUE oparg == stack_depth) # Python 3.12a1 3502 (LOAD_FAST_CHECK, no NULL-check in LOAD_FAST) @@ -445,8 +455,30 @@ _code_type = type(_write_atomic.__code__) # Python 3.12b1 3529 (Inline list/dict/set comprehensions) # Python 3.12b1 3530 (Shrink the LOAD_SUPER_ATTR caches) # Python 3.12b1 3531 (Add PEP 695 changes) - -# Python 3.13 will start with 3550 +# Python 3.13a1 3550 (Plugin optimizer support) +# Python 3.13a1 3551 (Compact superinstructions) +# Python 3.13a1 3552 (Remove LOAD_FAST__LOAD_CONST and LOAD_CONST__LOAD_FAST) +# Python 3.13a1 3553 (Add SET_FUNCTION_ATTRIBUTE) +# Python 3.13a1 3554 (more efficient bytecodes for f-strings) +# Python 3.13a1 3555 (generate specialized opcodes metadata from bytecodes.c) +# Python 3.13a1 3556 (Convert LOAD_CLOSURE to a pseudo-op) +# Python 3.13a1 3557 (Make the conversion to boolean in jumps explicit) +# Python 3.13a1 3558 (Reorder the stack items for CALL) +# Python 3.13a1 3559 (Generate opcode IDs from bytecodes.c) +# Python 3.13a1 3560 (Add RESUME_CHECK instruction) +# Python 3.13a1 3561 (Add cache entry to branch instructions) +# Python 3.13a1 3562 (Assign opcode IDs for internal ops in separate range) +# Python 3.13a1 3563 (Add CALL_KW and remove KW_NAMES) +# Python 3.13a1 3564 (Removed oparg from YIELD_VALUE, changed oparg values of RESUME) +# Python 3.13a1 3565 (Oparg of YIELD_VALUE indicates whether it is in a yield-from) +# Python 3.13a1 3566 (Emit JUMP_NO_INTERRUPT instead of JUMP for non-loop no-lineno cases) +# Python 3.13a1 3567 (Reimplement line number propagation by the compiler) +# Python 3.13a1 3568 (Change semantics of END_FOR) +# Python 3.13a5 3569 (Specialize CONTAINS_OP) +# Python 3.13a6 3570 (Add __firstlineno__ class attribute) +# Python 3.13b1 3571 (Fix miscompilation of private names in generic classes) + +# Python 3.14 will start with 3600 # Please don't copy-paste the same pre-release tag for new entries above!!! # You should always use the *upcoming* tag. For example, if 3.12a6 came out @@ -461,7 +493,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3531).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3571).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c @@ -1437,7 +1469,7 @@ class PathFinder: @staticmethod def invalidate_caches(): """Call the invalidate_caches() method on all path entry finders - stored in sys.path_importer_caches (where implemented).""" + stored in sys.path_importer_cache (where implemented).""" for name, finder in list(sys.path_importer_cache.items()): # Drop entry if finder name is a relative path. The current # working directory may have changed. @@ -1449,6 +1481,9 @@ class PathFinder: # https://bugs.python.org/issue45703 _NamespacePath._epoch += 1 + from importlib.metadata import MetadataPathFinder + MetadataPathFinder.invalidate_caches() + @staticmethod def _path_hooks(path): """Search sys.path_hooks for a finder for 'path'.""" @@ -1690,6 +1725,46 @@ class FileFinder: return f'FileFinder({self.path!r})' +class AppleFrameworkLoader(ExtensionFileLoader): + """A loader for modules that have been packaged as frameworks for + compatibility with Apple's iOS App Store policies. + """ + def create_module(self, spec): + # If the ModuleSpec has been created by the FileFinder, it will have + # been created with an origin pointing to the .fwork file. We need to + # redirect this to the location in the Frameworks folder, using the + # content of the .fwork file. + if spec.origin.endswith(".fwork"): + with _io.FileIO(spec.origin, 'r') as file: + framework_binary = file.read().decode().strip() + bundle_path = _path_split(sys.executable)[0] + spec.origin = _path_join(bundle_path, framework_binary) + + # If the loader is created based on the spec for a loaded module, the + # path will be pointing at the Framework location. If this occurs, + # get the original .fwork location to use as the module's __file__. + if self.path.endswith(".fwork"): + path = self.path + else: + with _io.FileIO(self.path + ".origin", 'r') as file: + origin = file.read().decode().strip() + bundle_path = _path_split(sys.executable)[0] + path = _path_join(bundle_path, origin) + + module = _bootstrap._call_with_frames_removed(_imp.create_dynamic, spec) + + _bootstrap._verbose_message( + "Apple framework extension module {!r} loaded from {!r} (path {!r})", + spec.name, + spec.origin, + path, + ) + + # Ensure that the __file__ points at the .fwork location + module.__file__ = path + + return module + # Import setup ############################################################### def _fix_up_module(ns, name, pathname, cpathname=None): @@ -1722,10 +1797,17 @@ def _get_supported_file_loaders(): Each item is a tuple (loader, suffixes). """ - extensions = ExtensionFileLoader, _imp.extension_suffixes() + extension_loaders = [] + if hasattr(_imp, 'create_dynamic'): + if sys.platform in {"ios", "tvos", "watchos"}: + extension_loaders = [(AppleFrameworkLoader, [ + suffix.replace(".so", ".fwork") + for suffix in _imp.extension_suffixes() + ])] + extension_loaders.append((ExtensionFileLoader, _imp.extension_suffixes())) source = SourceFileLoader, SOURCE_SUFFIXES bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES - return [extensions, source, bytecode] + return extension_loaders + [source, bytecode] def _set_bootstrap_module(_bootstrap_module): diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index b56fa94e..37fef357 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -180,7 +180,11 @@ class ExecutionLoader(InspectLoader): else: return self.source_to_code(source, path) -_register(ExecutionLoader, machinery.ExtensionFileLoader) +_register( + ExecutionLoader, + machinery.ExtensionFileLoader, + machinery.AppleFrameworkLoader, +) class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader): diff --git a/Lib/importlib/machinery.py b/Lib/importlib/machinery.py index d9a19a13..fbd30b15 100644 --- a/Lib/importlib/machinery.py +++ b/Lib/importlib/machinery.py @@ -12,6 +12,7 @@ from ._bootstrap_external import FileFinder from ._bootstrap_external import SourceFileLoader from ._bootstrap_external import SourcelessFileLoader from ._bootstrap_external import ExtensionFileLoader +from ._bootstrap_external import AppleFrameworkLoader from ._bootstrap_external import NamespaceLoader diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 82e0ce1b..8ce62dd8 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -1,9 +1,13 @@ +from __future__ import annotations + import os import re import abc -import csv import sys +import json import email +import types +import inspect import pathlib import zipfile import operator @@ -12,11 +16,9 @@ import warnings import functools import itertools import posixpath -import contextlib import collections -import inspect -from . import _adapters, _meta +from . import _meta from ._collections import FreezableDefaultDict, Pair from ._functools import method_cache, pass_none from ._itertools import always_iterable, unique_everseen @@ -26,8 +28,7 @@ from contextlib import suppress from importlib import import_module from importlib.abc import MetaPathFinder from itertools import starmap -from typing import List, Mapping, Optional, cast - +from typing import Any, Iterable, List, Mapping, Match, Optional, Set, cast __all__ = [ 'Distribution', @@ -48,11 +49,11 @@ __all__ = [ class PackageNotFoundError(ModuleNotFoundError): """The package was not found.""" - def __str__(self): + def __str__(self) -> str: return f"No package metadata was found for {self.name}" @property - def name(self): + def name(self) -> str: # type: ignore[override] (name,) = self.args return name @@ -118,38 +119,11 @@ class Sectioned: yield Pair(name, value) @staticmethod - def valid(line): + def valid(line: str): return line and not line.startswith('#') -class DeprecatedTuple: - """ - Provide subscript item access for backward compatibility. - - >>> recwarn = getfixture('recwarn') - >>> ep = EntryPoint(name='name', value='value', group='group') - >>> ep[:] - ('name', 'value', 'group') - >>> ep[0] - 'name' - >>> len(recwarn) - 1 - """ - - # Do not remove prior to 2023-05-01 or Python 3.13 - _warn = functools.partial( - warnings.warn, - "EntryPoint tuple interface is deprecated. Access members by name.", - DeprecationWarning, - stacklevel=2, - ) - - def __getitem__(self, item): - self._warn() - return self._key()[item] - - -class EntryPoint(DeprecatedTuple): +class EntryPoint: """An entry point as defined by Python packaging conventions. See `the packaging docs on entry points @@ -191,34 +165,37 @@ class EntryPoint(DeprecatedTuple): value: str group: str - dist: Optional['Distribution'] = None + dist: Optional[Distribution] = None - def __init__(self, name, value, group): + def __init__(self, name: str, value: str, group: str) -> None: vars(self).update(name=name, value=value, group=group) - def load(self): + def load(self) -> Any: """Load the entry point from its definition. If only a module is indicated by the value, return that module. Otherwise, return the named object. """ - match = self.pattern.match(self.value) + match = cast(Match, self.pattern.match(self.value)) module = import_module(match.group('module')) attrs = filter(None, (match.group('attr') or '').split('.')) return functools.reduce(getattr, attrs, module) @property - def module(self): + def module(self) -> str: match = self.pattern.match(self.value) + assert match is not None return match.group('module') @property - def attr(self): + def attr(self) -> str: match = self.pattern.match(self.value) + assert match is not None return match.group('attr') @property - def extras(self): + def extras(self) -> List[str]: match = self.pattern.match(self.value) + assert match is not None return re.findall(r'\w+', match.group('extras') or '') def _for(self, dist): @@ -266,7 +243,7 @@ class EntryPoint(DeprecatedTuple): f'group={self.group!r})' ) - def __hash__(self): + def __hash__(self) -> int: return hash(self._key()) @@ -277,7 +254,7 @@ class EntryPoints(tuple): __slots__ = () - def __getitem__(self, name): # -> EntryPoint: + def __getitem__(self, name: str) -> EntryPoint: # type: ignore[override] """ Get the EntryPoint in self matching name. """ @@ -286,7 +263,14 @@ class EntryPoints(tuple): except StopIteration: raise KeyError(name) - def select(self, **params): + def __repr__(self): + """ + Repr with classname and tuple constructor to + signal that we deviate from regular tuple behavior. + """ + return '%s(%r)' % (self.__class__.__name__, tuple(self)) + + def select(self, **params) -> EntryPoints: """ Select entry points from self that match the given parameters (typically group and/or name). @@ -294,14 +278,14 @@ class EntryPoints(tuple): return EntryPoints(ep for ep in self if ep.matches(**params)) @property - def names(self): + def names(self) -> Set[str]: """ Return the set of all names of all entry points. """ return {ep.name for ep in self} @property - def groups(self): + def groups(self) -> Set[str]: """ Return the set of all groups of all entry points. """ @@ -322,28 +306,31 @@ class EntryPoints(tuple): class PackagePath(pathlib.PurePosixPath): """A reference to a path in a package""" - def read_text(self, encoding='utf-8'): - with self.locate().open(encoding=encoding) as stream: - return stream.read() + hash: Optional[FileHash] + size: int + dist: Distribution - def read_binary(self): - with self.locate().open('rb') as stream: - return stream.read() + def read_text(self, encoding: str = 'utf-8') -> str: # type: ignore[override] + return self.locate().read_text(encoding=encoding) - def locate(self): + def read_binary(self) -> bytes: + return self.locate().read_bytes() + + def locate(self) -> SimplePath: """Return a path-like object for this path""" return self.dist.locate_file(self) class FileHash: - def __init__(self, spec): + def __init__(self, spec: str) -> None: self.mode, _, self.value = spec.partition('=') - def __repr__(self): + def __repr__(self) -> str: return f'' class DeprecatedNonAbstract: + # Required until Python 3.14 def __new__(cls, *args, **kwargs): all_names = { name for subclass in inspect.getmro(cls) for name in vars(subclass) @@ -363,25 +350,48 @@ class DeprecatedNonAbstract: class Distribution(DeprecatedNonAbstract): - """A Python distribution package.""" + """ + An abstract Python distribution package. + + Custom providers may derive from this class and define + the abstract methods to provide a concrete implementation + for their environment. Some providers may opt to override + the default implementation of some properties to bypass + the file-reading mechanism. + """ @abc.abstractmethod def read_text(self, filename) -> Optional[str]: """Attempt to load metadata file given by the name. + Python distribution metadata is organized by blobs of text + typically represented as "files" in the metadata directory + (e.g. package-1.0.dist-info). These files include things + like: + + - METADATA: The distribution metadata including fields + like Name and Version and Description. + - entry_points.txt: A series of entry points as defined in + `the entry points spec `_. + - RECORD: A record of files according to + `this recording spec `_. + + A package may provide any set of files, including those + not listed here or none at all. + :param filename: The name of the file in the distribution info. :return: The text if found, otherwise None. """ @abc.abstractmethod - def locate_file(self, path): + def locate_file(self, path: str | os.PathLike[str]) -> SimplePath: """ - Given a path to a file in this distribution, return a path + Given a path to a file in this distribution, return a SimplePath to it. """ @classmethod - def from_name(cls, name: str): + def from_name(cls, name: str) -> Distribution: """Return the Distribution for the given package name. :param name: The name of the distribution package to search for. @@ -394,21 +404,23 @@ class Distribution(DeprecatedNonAbstract): if not name: raise ValueError("A distribution name is required.") try: - return next(cls.discover(name=name)) + return next(iter(cls.discover(name=name))) except StopIteration: raise PackageNotFoundError(name) @classmethod - def discover(cls, **kwargs): + def discover( + cls, *, context: Optional[DistributionFinder.Context] = None, **kwargs + ) -> Iterable[Distribution]: """Return an iterable of Distribution objects for all packages. Pass a ``context`` or pass keyword arguments for constructing a context. :context: A ``DistributionFinder.Context`` object. - :return: Iterable of Distribution objects for all packages. + :return: Iterable of Distribution objects for packages matching + the context. """ - context = kwargs.pop('context', None) if context and kwargs: raise ValueError("cannot accept context and kwargs") context = context or DistributionFinder.Context(**kwargs) @@ -417,8 +429,8 @@ class Distribution(DeprecatedNonAbstract): ) @staticmethod - def at(path): - """Return a Distribution for the indicated metadata path + def at(path: str | os.PathLike[str]) -> Distribution: + """Return a Distribution for the indicated metadata path. :param path: a string or path-like object :return: a concrete Distribution instance for the path @@ -427,7 +439,7 @@ class Distribution(DeprecatedNonAbstract): @staticmethod def _discover_resolvers(): - """Search the meta_path for resolvers.""" + """Search the meta_path for resolvers (MetadataPathFinders).""" declared = ( getattr(finder, 'find_distributions', None) for finder in sys.meta_path ) @@ -438,8 +450,15 @@ class Distribution(DeprecatedNonAbstract): """Return the parsed metadata for this Distribution. The returned object will have keys that name the various bits of - metadata. See PEP 566 for details. + metadata per the + `Core metadata specifications `_. + + Custom providers may provide the METADATA file or override this + property. """ + # deferred for performance (python/cpython#109829) + from . import _adapters + opt_text = ( self.read_text('METADATA') or self.read_text('PKG-INFO') @@ -452,7 +471,7 @@ class Distribution(DeprecatedNonAbstract): return _adapters.Message(email.message_from_string(text)) @property - def name(self): + def name(self) -> str: """Return the 'Name' metadata for the distribution package.""" return self.metadata['Name'] @@ -462,16 +481,22 @@ class Distribution(DeprecatedNonAbstract): return Prepared.normalize(self.name) @property - def version(self): + def version(self) -> str: """Return the 'Version' metadata for the distribution package.""" return self.metadata['Version'] @property - def entry_points(self): + def entry_points(self) -> EntryPoints: + """ + Return EntryPoints for this distribution. + + Custom providers may provide the ``entry_points.txt`` file + or override this property. + """ return EntryPoints._from_text_for(self.read_text('entry_points.txt'), self) @property - def files(self): + def files(self) -> Optional[List[PackagePath]]: """Files in this distribution. :return: List of PackagePath for this distribution or None @@ -480,6 +505,10 @@ class Distribution(DeprecatedNonAbstract): (i.e. RECORD for dist-info, or installed-files.txt or SOURCES.txt for egg-info) is missing. Result may be empty if the metadata exists but is empty. + + Custom providers are recommended to provide a "RECORD" file (in + ``read_text``) or override this property to allow for callers to be + able to resolve filenames provided by the package. """ def make_file(name, hash=None, size_str=None): @@ -491,6 +520,10 @@ class Distribution(DeprecatedNonAbstract): @pass_none def make_files(lines): + # Delay csv import, since Distribution.files is not as widely used + # as other parts of importlib.metadata + import csv + return starmap(make_file, csv.reader(lines)) @pass_none @@ -507,7 +540,7 @@ class Distribution(DeprecatedNonAbstract): def _read_files_distinfo(self): """ - Read the lines of RECORD + Read the lines of RECORD. """ text = self.read_text('RECORD') return text and text.splitlines() @@ -534,7 +567,7 @@ class Distribution(DeprecatedNonAbstract): paths = ( (subdir / name) .resolve() - .relative_to(self.locate_file('').resolve()) + .relative_to(self.locate_file('').resolve(), walk_up=True) .as_posix() for name in text.splitlines() ) @@ -556,7 +589,7 @@ class Distribution(DeprecatedNonAbstract): return text and map('"{}"'.format, text.splitlines()) @property - def requires(self): + def requires(self) -> Optional[List[str]]: """Generated requirements specified for this Distribution""" reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs() return reqs and list(reqs) @@ -607,10 +640,23 @@ class Distribution(DeprecatedNonAbstract): space = url_req_space(section.value) yield section.value + space + quoted_marker(section.name) + @property + def origin(self): + return self._load_json('direct_url.json') + + def _load_json(self, filename): + return pass_none(json.loads)( + self.read_text(filename), + object_hook=lambda data: types.SimpleNamespace(**data), + ) + class DistributionFinder(MetaPathFinder): """ A MetaPathFinder capable of discovering installed distributions. + + Custom providers should implement this interface in order to + supply metadata. """ class Context: @@ -623,6 +669,17 @@ class DistributionFinder(MetaPathFinder): Each DistributionFinder may expect any parameters and should attempt to honor the canonical parameters defined below when appropriate. + + This mechanism gives a custom provider a means to + solicit additional details from the caller beyond + "name" and "path" when searching distributions. + For example, imagine a provider that exposes suites + of packages in either a "public" or "private" ``realm``. + A caller may wish to query only for distributions in + a particular realm and could call + ``distributions(realm="private")`` to signal to the + custom provider to only include distributions from that + realm. """ name = None @@ -635,7 +692,7 @@ class DistributionFinder(MetaPathFinder): vars(self).update(kwargs) @property - def path(self): + def path(self) -> List[str]: """ The sequence of directory path that a distribution finder should search. @@ -646,7 +703,7 @@ class DistributionFinder(MetaPathFinder): return vars(self).get('path', sys.path) @abc.abstractmethod - def find_distributions(self, context=Context()): + def find_distributions(self, context=Context()) -> Iterable[Distribution]: """ Find distributions. @@ -658,11 +715,18 @@ class DistributionFinder(MetaPathFinder): class FastPath: """ - Micro-optimized class for searching a path for - children. + Micro-optimized class for searching a root for children. + + Root is a path on the file system that may contain metadata + directories either as natural directories or within a zip file. >>> FastPath('').children() ['...'] + + FastPath objects are cached and recycled for any given root. + + >>> FastPath('foobar') is FastPath('foobar') + True """ @functools.lru_cache() # type: ignore @@ -704,7 +768,19 @@ class FastPath: class Lookup: + """ + A micro-optimized class for searching a (fast) path for metadata. + """ + def __init__(self, path: FastPath): + """ + Calculate all of the children representing metadata. + + From the children in the path, calculate early all of the + children that appear to represent metadata (infos) or legacy + metadata (eggs). + """ + base = os.path.basename(path.root).lower() base_is_egg = base.endswith(".egg") self.infos = FreezableDefaultDict(list) @@ -725,7 +801,10 @@ class Lookup: self.infos.freeze() self.eggs.freeze() - def search(self, prepared): + def search(self, prepared: Prepared): + """ + Yield all infos and eggs matching the Prepared query. + """ infos = ( self.infos[prepared.normalized] if prepared @@ -741,13 +820,28 @@ class Lookup: class Prepared: """ - A prepared search for metadata on a possibly-named package. + A prepared search query for metadata on a possibly-named package. + + Pre-calculates the normalization to prevent repeated operations. + + >>> none = Prepared(None) + >>> none.normalized + >>> none.legacy_normalized + >>> bool(none) + False + >>> sample = Prepared('Sample__Pkg-name.foo') + >>> sample.normalized + 'sample_pkg_name_foo' + >>> sample.legacy_normalized + 'sample__pkg_name.foo' + >>> bool(sample) + True """ normalized = None legacy_normalized = None - def __init__(self, name): + def __init__(self, name: Optional[str]): self.name = name if name is None: return @@ -775,7 +869,9 @@ class Prepared: class MetadataPathFinder(DistributionFinder): @classmethod - def find_distributions(cls, context=DistributionFinder.Context()): + def find_distributions( + cls, context=DistributionFinder.Context() + ) -> Iterable[PathDistribution]: """ Find distributions. @@ -795,19 +891,20 @@ class MetadataPathFinder(DistributionFinder): path.search(prepared) for path in map(FastPath, paths) ) - def invalidate_caches(cls): + @classmethod + def invalidate_caches(cls) -> None: FastPath.__new__.cache_clear() class PathDistribution(Distribution): - def __init__(self, path: SimplePath): + def __init__(self, path: SimplePath) -> None: """Construct a distribution. :param path: SimplePath indicating the metadata directory. """ self._path = path - def read_text(self, filename): + def read_text(self, filename: str | os.PathLike[str]) -> Optional[str]: with suppress( FileNotFoundError, IsADirectoryError, @@ -817,9 +914,11 @@ class PathDistribution(Distribution): ): return self._path.joinpath(filename).read_text(encoding='utf-8') + return None + read_text.__doc__ = Distribution.read_text.__doc__ - def locate_file(self, path): + def locate_file(self, path: str | os.PathLike[str]) -> SimplePath: return self._path.parent / path @property @@ -852,7 +951,7 @@ class PathDistribution(Distribution): return name -def distribution(distribution_name): +def distribution(distribution_name: str) -> Distribution: """Get the ``Distribution`` instance for the named package. :param distribution_name: The name of the distribution package as a string. @@ -861,7 +960,7 @@ def distribution(distribution_name): return Distribution.from_name(distribution_name) -def distributions(**kwargs): +def distributions(**kwargs) -> Iterable[Distribution]: """Get all ``Distribution`` instances in the current environment. :return: An iterable of ``Distribution`` instances. @@ -869,7 +968,7 @@ def distributions(**kwargs): return Distribution.discover(**kwargs) -def metadata(distribution_name) -> _meta.PackageMetadata: +def metadata(distribution_name: str) -> _meta.PackageMetadata: """Get the metadata for the named package. :param distribution_name: The name of the distribution package to query. @@ -878,7 +977,7 @@ def metadata(distribution_name) -> _meta.PackageMetadata: return Distribution.from_name(distribution_name).metadata -def version(distribution_name): +def version(distribution_name: str) -> str: """Get the version string for the named package. :param distribution_name: The name of the distribution package to query. @@ -912,7 +1011,7 @@ def entry_points(**params) -> EntryPoints: return EntryPoints(eps).select(**params) -def files(distribution_name): +def files(distribution_name: str) -> Optional[List[PackagePath]]: """Return a list of files for the named package. :param distribution_name: The name of the distribution package to query. @@ -921,11 +1020,11 @@ def files(distribution_name): return distribution(distribution_name).files -def requires(distribution_name): +def requires(distribution_name: str) -> Optional[List[str]]: """ Return a list of requirements for the named package. - :return: An iterator of requirements, suitable for + :return: An iterable of requirements, suitable for packaging.requirement.Requirement. """ return distribution(distribution_name).requires @@ -952,13 +1051,42 @@ def _top_level_declared(dist): return (dist.read_text('top_level.txt') or '').split() +def _topmost(name: PackagePath) -> Optional[str]: + """ + Return the top-most parent as long as there is a parent. + """ + top, *rest = name.parts + return top if rest else None + + +def _get_toplevel_name(name: PackagePath) -> str: + """ + Infer a possibly importable module name from a name presumed on + sys.path. + + >>> _get_toplevel_name(PackagePath('foo.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pyc')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo/__init__.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pth')) + 'foo.pth' + >>> _get_toplevel_name(PackagePath('foo.dist-info')) + 'foo.dist-info' + """ + return _topmost(name) or ( + # python/typeshed#10328 + inspect.getmodulename(name) # type: ignore + or str(name) + ) + + def _top_level_inferred(dist): - opt_names = { - f.parts[0] if len(f.parts) > 1 else inspect.getmodulename(f) - for f in always_iterable(dist.files) - } + opt_names = set(map(_get_toplevel_name, always_iterable(dist.files))) - @pass_none def importable_name(name): return '.' not in name diff --git a/Lib/importlib/metadata/_adapters.py b/Lib/importlib/metadata/_adapters.py index 6aed69a3..59116880 100644 --- a/Lib/importlib/metadata/_adapters.py +++ b/Lib/importlib/metadata/_adapters.py @@ -53,7 +53,7 @@ class Message(email.message.Message): def __getitem__(self, item): """ Warn users that a ``KeyError`` can be expected when a - mising key is supplied. Ref python/importlib_metadata#371. + missing key is supplied. Ref python/importlib_metadata#371. """ res = super().__getitem__(item) if res is None: diff --git a/Lib/importlib/metadata/_meta.py b/Lib/importlib/metadata/_meta.py index c9a7ef90..1927d0f6 100644 --- a/Lib/importlib/metadata/_meta.py +++ b/Lib/importlib/metadata/_meta.py @@ -1,3 +1,6 @@ +from __future__ import annotations + +import os from typing import Protocol from typing import Any, Dict, Iterator, List, Optional, TypeVar, Union, overload @@ -6,30 +9,27 @@ _T = TypeVar("_T") class PackageMetadata(Protocol): - def __len__(self) -> int: - ... # pragma: no cover + def __len__(self) -> int: ... # pragma: no cover - def __contains__(self, item: str) -> bool: - ... # pragma: no cover + def __contains__(self, item: str) -> bool: ... # pragma: no cover - def __getitem__(self, key: str) -> str: - ... # pragma: no cover + def __getitem__(self, key: str) -> str: ... # pragma: no cover - def __iter__(self) -> Iterator[str]: - ... # pragma: no cover + def __iter__(self) -> Iterator[str]: ... # pragma: no cover @overload - def get(self, name: str, failobj: None = None) -> Optional[str]: - ... # pragma: no cover + def get( + self, name: str, failobj: None = None + ) -> Optional[str]: ... # pragma: no cover @overload - def get(self, name: str, failobj: _T) -> Union[str, _T]: - ... # pragma: no cover + def get(self, name: str, failobj: _T) -> Union[str, _T]: ... # pragma: no cover # overload per python/importlib_metadata#435 @overload - def get_all(self, name: str, failobj: None = None) -> Optional[List[Any]]: - ... # pragma: no cover + def get_all( + self, name: str, failobj: None = None + ) -> Optional[List[Any]]: ... # pragma: no cover @overload def get_all(self, name: str, failobj: _T) -> Union[List[Any], _T]: @@ -44,20 +44,24 @@ class PackageMetadata(Protocol): """ -class SimplePath(Protocol[_T]): +class SimplePath(Protocol): """ - A minimal subset of pathlib.Path required by PathDistribution. + A minimal subset of pathlib.Path required by Distribution. """ - def joinpath(self) -> _T: - ... # pragma: no cover + def joinpath( + self, other: Union[str, os.PathLike[str]] + ) -> SimplePath: ... # pragma: no cover - def __truediv__(self, other: Union[str, _T]) -> _T: - ... # pragma: no cover + def __truediv__( + self, other: Union[str, os.PathLike[str]] + ) -> SimplePath: ... # pragma: no cover @property - def parent(self) -> _T: - ... # pragma: no cover + def parent(self) -> SimplePath: ... # pragma: no cover + + def read_text(self, encoding=None) -> str: ... # pragma: no cover + + def read_bytes(self) -> bytes: ... # pragma: no cover - def read_text(self) -> str: - ... # pragma: no cover + def exists(self) -> bool: ... # pragma: no cover diff --git a/Lib/importlib/metadata/diagnose.py b/Lib/importlib/metadata/diagnose.py new file mode 100644 index 00000000..e405471a --- /dev/null +++ b/Lib/importlib/metadata/diagnose.py @@ -0,0 +1,21 @@ +import sys + +from . import Distribution + + +def inspect(path): + print("Inspecting", path) + dists = list(Distribution.discover(path=[path])) + if not dists: + return + print("Found", len(dists), "packages:", end=' ') + print(', '.join(dist.name for dist in dists)) + + +def run(): + for path in sys.path: + inspect(path) + + +if __name__ == '__main__': + run() diff --git a/Lib/importlib/resources/__init__.py b/Lib/importlib/resources/__init__.py index 34e3a995..ec4441c9 100644 --- a/Lib/importlib/resources/__init__.py +++ b/Lib/importlib/resources/__init__.py @@ -4,17 +4,17 @@ from ._common import ( as_file, files, Package, + Anchor, ) -from ._legacy import ( +from ._functional import ( contents, + is_resource, open_binary, - read_binary, open_text, - read_text, - is_resource, path, - Resource, + read_binary, + read_text, ) from .abc import ResourceReader @@ -22,11 +22,11 @@ from .abc import ResourceReader __all__ = [ 'Package', - 'Resource', + 'Anchor', 'ResourceReader', 'as_file', - 'contents', 'files', + 'contents', 'is_resource', 'open_binary', 'open_text', diff --git a/Lib/importlib/resources/_common.py b/Lib/importlib/resources/_common.py index a3902535..ca5b0674 100644 --- a/Lib/importlib/resources/_common.py +++ b/Lib/importlib/resources/_common.py @@ -12,8 +12,6 @@ import itertools from typing import Union, Optional, cast from .abc import ResourceReader, Traversable -from ._adapters import wrap_spec - Package = Union[types.ModuleType, str] Anchor = Package @@ -27,6 +25,8 @@ def package_to_anchor(func): >>> files('a', 'b') Traceback (most recent call last): TypeError: files() takes from 0 to 1 positional arguments but 2 were given + + Remove this compatibility in Python 3.14. """ undefined = object() @@ -109,6 +109,9 @@ def from_package(package: types.ModuleType): Return a Traversable object for the given package. """ + # deferred for performance (python/cpython#109829) + from ._adapters import wrap_spec + spec = wrap_spec(package) reader = spec.loader.get_resource_reader(spec.name) return reader.files() diff --git a/Lib/importlib/resources/_functional.py b/Lib/importlib/resources/_functional.py new file mode 100644 index 00000000..f59416f2 --- /dev/null +++ b/Lib/importlib/resources/_functional.py @@ -0,0 +1,81 @@ +"""Simplified function-based API for importlib.resources""" + +import warnings + +from ._common import files, as_file + + +_MISSING = object() + + +def open_binary(anchor, *path_names): + """Open for binary reading the *resource* within *package*.""" + return _get_resource(anchor, path_names).open('rb') + + +def open_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Open for text reading the *resource* within *package*.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.open('r', encoding=encoding, errors=errors) + + +def read_binary(anchor, *path_names): + """Read and return contents of *resource* within *package* as bytes.""" + return _get_resource(anchor, path_names).read_bytes() + + +def read_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Read and return contents of *resource* within *package* as str.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.read_text(encoding=encoding, errors=errors) + + +def path(anchor, *path_names): + """Return the path to the *resource* as an actual file system path.""" + return as_file(_get_resource(anchor, path_names)) + + +def is_resource(anchor, *path_names): + """Return ``True`` if there is a resource named *name* in the package, + + Otherwise returns ``False``. + """ + return _get_resource(anchor, path_names).is_file() + + +def contents(anchor, *path_names): + """Return an iterable over the named resources within the package. + + The iterable returns :class:`str` resources (e.g. files). + The iterable does not recurse into subdirectories. + """ + warnings.warn( + "importlib.resources.contents is deprecated. " + "Use files(anchor).iterdir() instead.", + DeprecationWarning, + stacklevel=1, + ) + return (resource.name for resource in _get_resource(anchor, path_names).iterdir()) + + +def _get_encoding_arg(path_names, encoding): + # For compatibility with versions where *encoding* was a positional + # argument, it needs to be given explicitly when there are multiple + # *path_names*. + # This limitation can be removed in Python 3.15. + if encoding is _MISSING: + if len(path_names) > 1: + raise TypeError( + "'encoding' argument required with multiple path names", + ) + else: + return 'utf-8' + return encoding + + +def _get_resource(anchor, path_names): + if anchor is None: + raise TypeError("anchor must be module or string, got None") + return files(anchor).joinpath(*path_names) diff --git a/Lib/importlib/resources/_legacy.py b/Lib/importlib/resources/_legacy.py deleted file mode 100644 index b1ea8105..00000000 --- a/Lib/importlib/resources/_legacy.py +++ /dev/null @@ -1,120 +0,0 @@ -import functools -import os -import pathlib -import types -import warnings - -from typing import Union, Iterable, ContextManager, BinaryIO, TextIO, Any - -from . import _common - -Package = Union[types.ModuleType, str] -Resource = str - - -def deprecated(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - warnings.warn( - f"{func.__name__} is deprecated. Use files() instead. " - "Refer to https://importlib-resources.readthedocs.io" - "/en/latest/using.html#migrating-from-legacy for migration advice.", - DeprecationWarning, - stacklevel=2, - ) - return func(*args, **kwargs) - - return wrapper - - -def normalize_path(path: Any) -> str: - """Normalize a path by ensuring it is a string. - - If the resulting string contains path separators, an exception is raised. - """ - str_path = str(path) - parent, file_name = os.path.split(str_path) - if parent: - raise ValueError(f'{path!r} must be only a file name') - return file_name - - -@deprecated -def open_binary(package: Package, resource: Resource) -> BinaryIO: - """Return a file-like object opened for binary reading of the resource.""" - return (_common.files(package) / normalize_path(resource)).open('rb') - - -@deprecated -def read_binary(package: Package, resource: Resource) -> bytes: - """Return the binary contents of the resource.""" - return (_common.files(package) / normalize_path(resource)).read_bytes() - - -@deprecated -def open_text( - package: Package, - resource: Resource, - encoding: str = 'utf-8', - errors: str = 'strict', -) -> TextIO: - """Return a file-like object opened for text reading of the resource.""" - return (_common.files(package) / normalize_path(resource)).open( - 'r', encoding=encoding, errors=errors - ) - - -@deprecated -def read_text( - package: Package, - resource: Resource, - encoding: str = 'utf-8', - errors: str = 'strict', -) -> str: - """Return the decoded string of the resource. - - The decoding-related arguments have the same semantics as those of - bytes.decode(). - """ - with open_text(package, resource, encoding, errors) as fp: - return fp.read() - - -@deprecated -def contents(package: Package) -> Iterable[str]: - """Return an iterable of entries in `package`. - - Note that not all entries are resources. Specifically, directories are - not considered resources. Use `is_resource()` on each entry returned here - to check if it is a resource or not. - """ - return [path.name for path in _common.files(package).iterdir()] - - -@deprecated -def is_resource(package: Package, name: str) -> bool: - """True if `name` is a resource inside `package`. - - Directories are *not* resources. - """ - resource = normalize_path(name) - return any( - traversable.name == resource and traversable.is_file() - for traversable in _common.files(package).iterdir() - ) - - -@deprecated -def path( - package: Package, - resource: Resource, -) -> ContextManager[pathlib.Path]: - """A context manager providing a file path object to the resource. - - If the resource does not already exist on its own on the file system, - a temporary file will be created. If the file was created, the file - will be deleted upon exiting the context manager (no exception is - raised if the file was deleted prior to the context manager - exiting). - """ - return _common.as_file(_common.files(package) / normalize_path(resource)) diff --git a/Lib/importlib/resources/readers.py b/Lib/importlib/resources/readers.py index c3cdf769..ccc5abbe 100644 --- a/Lib/importlib/resources/readers.py +++ b/Lib/importlib/resources/readers.py @@ -1,7 +1,10 @@ import collections +import contextlib import itertools import pathlib import operator +import re +import warnings import zipfile from . import abc @@ -31,8 +34,10 @@ class FileReader(abc.TraversableResources): class ZipReader(abc.TraversableResources): def __init__(self, loader, module): - _, _, name = module.rpartition('.') - self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.prefix = loader.prefix.replace('\\', '/') + if loader.is_package(module): + _, _, name = module.rpartition('.') + self.prefix += name + '/' self.archive = loader.archive def open_resource(self, resource): @@ -62,7 +67,7 @@ class MultiplexedPath(abc.Traversable): """ def __init__(self, *paths): - self._paths = list(map(pathlib.Path, remove_duplicates(paths))) + self._paths = list(map(_ensure_traversable, remove_duplicates(paths))) if not self._paths: message = 'MultiplexedPath must contain at least one path' raise FileNotFoundError(message) @@ -130,7 +135,36 @@ class NamespaceReader(abc.TraversableResources): def __init__(self, namespace_path): if 'NamespacePath' not in str(namespace_path): raise ValueError('Invalid path') - self.path = MultiplexedPath(*list(namespace_path)) + self.path = MultiplexedPath(*map(self._resolve, namespace_path)) + + @classmethod + def _resolve(cls, path_str) -> abc.Traversable: + r""" + Given an item from a namespace path, resolve it to a Traversable. + + path_str might be a directory on the filesystem or a path to a + zipfile plus the path within the zipfile, e.g. ``/foo/bar`` or + ``/foo/baz.zip/inner_dir`` or ``foo\baz.zip\inner_dir\sub``. + """ + (dir,) = (cand for cand in cls._candidate_paths(path_str) if cand.is_dir()) + return dir + + @classmethod + def _candidate_paths(cls, path_str): + yield pathlib.Path(path_str) + yield from cls._resolve_zip_path(path_str) + + @staticmethod + def _resolve_zip_path(path_str): + for match in reversed(list(re.finditer(r'[\\/]', path_str))): + with contextlib.suppress( + FileNotFoundError, + IsADirectoryError, + NotADirectoryError, + PermissionError, + ): + inner = path_str[match.end() :].replace('\\', '/') + '/' + yield zipfile.Path(path_str[: match.start()], inner.lstrip('/')) def resource_path(self, resource): """ @@ -142,3 +176,21 @@ class NamespaceReader(abc.TraversableResources): def files(self): return self.path + + +def _ensure_traversable(path): + """ + Convert deprecated string arguments to traversables (pathlib.Path). + + Remove with Python 3.15. + """ + if not isinstance(path, str): + return path + + warnings.warn( + "String arguments are deprecated. Pass a Traversable instead.", + DeprecationWarning, + stacklevel=3, + ) + + return pathlib.Path(path) diff --git a/Lib/importlib/resources/simple.py b/Lib/importlib/resources/simple.py index 7770c922..96f117fe 100644 --- a/Lib/importlib/resources/simple.py +++ b/Lib/importlib/resources/simple.py @@ -88,7 +88,7 @@ class ResourceHandle(Traversable): def open(self, mode='r', *args, **kwargs): stream = self.parent.reader.open_binary(self.name) if 'b' not in mode: - stream = io.TextIOWrapper(*args, **kwargs) + stream = io.TextIOWrapper(stream, *args, **kwargs) return stream def joinpath(self, name): diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index f4d6e823..284206b6 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -135,7 +135,7 @@ class _incompatible_extension_module_restrictions: may not be imported in a subinterpreter. That implies modules that do not implement multi-phase init or that explicitly of out. - Likewise for modules import in a subinterpeter with its own GIL + Likewise for modules import in a subinterpreter with its own GIL when the extension does not support a per-interpreter GIL. This implies the module does not have a Py_mod_multiple_interpreters slot set to Py_MOD_PER_INTERPRETER_GIL_SUPPORTED. @@ -145,7 +145,7 @@ class _incompatible_extension_module_restrictions: You can get the same effect as this function by implementing the basic interface of multi-phase init (PEP 489) and lying about - support for mulitple interpreters (or per-interpreter GIL). + support for multiple interpreters (or per-interpreter GIL). """ def __init__(self, *, disable_check): @@ -171,36 +171,57 @@ class _LazyModule(types.ModuleType): def __getattribute__(self, attr): """Trigger the load of the module and return the attribute.""" - # All module metadata must be garnered from __spec__ in order to avoid - # using mutated values. - # Stop triggering this method. - self.__class__ = types.ModuleType - # Get the original name to make sure no object substitution occurred - # in sys.modules. - original_name = self.__spec__.name - # Figure out exactly what attributes were mutated between the creation - # of the module and now. - attrs_then = self.__spec__.loader_state['__dict__'] - attrs_now = self.__dict__ - attrs_updated = {} - for key, value in attrs_now.items(): - # Code that set the attribute may have kept a reference to the - # assigned object, making identity more important than equality. - if key not in attrs_then: - attrs_updated[key] = value - elif id(attrs_now[key]) != id(attrs_then[key]): - attrs_updated[key] = value - self.__spec__.loader.exec_module(self) - # If exec_module() was used directly there is no guarantee the module - # object was put into sys.modules. - if original_name in sys.modules: - if id(self) != id(sys.modules[original_name]): - raise ValueError(f"module object for {original_name!r} " - "substituted in sys.modules during a lazy " - "load") - # Update after loading since that's what would happen in an eager - # loading situation. - self.__dict__.update(attrs_updated) + __spec__ = object.__getattribute__(self, '__spec__') + loader_state = __spec__.loader_state + with loader_state['lock']: + # Only the first thread to get the lock should trigger the load + # and reset the module's class. The rest can now getattr(). + if object.__getattribute__(self, '__class__') is _LazyModule: + __class__ = loader_state['__class__'] + + # Reentrant calls from the same thread must be allowed to proceed without + # triggering the load again. + # exec_module() and self-referential imports are the primary ways this can + # happen, but in any case we must return something to avoid deadlock. + if loader_state['is_loading']: + return __class__.__getattribute__(self, attr) + loader_state['is_loading'] = True + + __dict__ = __class__.__getattribute__(self, '__dict__') + + # All module metadata must be gathered from __spec__ in order to avoid + # using mutated values. + # Get the original name to make sure no object substitution occurred + # in sys.modules. + original_name = __spec__.name + # Figure out exactly what attributes were mutated between the creation + # of the module and now. + attrs_then = loader_state['__dict__'] + attrs_now = __dict__ + attrs_updated = {} + for key, value in attrs_now.items(): + # Code that set an attribute may have kept a reference to the + # assigned object, making identity more important than equality. + if key not in attrs_then: + attrs_updated[key] = value + elif id(attrs_now[key]) != id(attrs_then[key]): + attrs_updated[key] = value + __spec__.loader.exec_module(self) + # If exec_module() was used directly there is no guarantee the module + # object was put into sys.modules. + if original_name in sys.modules: + if id(self) != id(sys.modules[original_name]): + raise ValueError(f"module object for {original_name!r} " + "substituted in sys.modules during a lazy " + "load") + # Update after loading since that's what would happen in an eager + # loading situation. + __dict__.update(attrs_updated) + # Finally, stop triggering this method, if the module did not + # already update its own __class__. + if isinstance(self, _LazyModule): + object.__setattr__(self, '__class__', __class__) + return getattr(self, attr) def __delattr__(self, attr): @@ -235,6 +256,9 @@ class LazyLoader(Loader): def exec_module(self, module): """Make the module load lazily.""" + # Threading is only needed for lazy loading, and importlib.util can + # be pulled in at interpreter startup, so defer until needed. + import threading module.__spec__.loader = self.loader module.__loader__ = self.loader # Don't need to worry about deep-copying as trying to set an attribute @@ -244,5 +268,7 @@ class LazyLoader(Loader): loader_state = {} loader_state['__dict__'] = module.__dict__.copy() loader_state['__class__'] = module.__class__ + loader_state['lock'] = threading.RLock() + loader_state['is_loading'] = False module.__spec__.loader_state = loader_state module.__class__ = _LazyModule diff --git a/Lib/inspect.py b/Lib/inspect.py index a550202b..161928df 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -160,6 +160,7 @@ import builtins from keyword import iskeyword from operator import attrgetter from collections import namedtuple, OrderedDict +from weakref import ref as make_weakref # Create constants for the compiler flags in Include/code.h # We try to get them from dis to avoid duplication @@ -279,7 +280,13 @@ def get_annotations(obj, *, globals=None, locals=None, eval_str=False): if globals is None: globals = obj_globals if locals is None: - locals = obj_locals + locals = obj_locals or {} + + # "Inject" type parameters into the local namespace + # (unless they are shadowed by assignments *in* the local namespace), + # as a way of emulating annotation scopes when calling `eval()` + if type_params := getattr(obj, "__type_params__", ()): + locals = {param.__name__: param for param in type_params} | locals return_value = {key: value if not isinstance(value, str) else eval(value, globals, locals) @@ -306,9 +313,10 @@ def ismethoddescriptor(object): But not if ismethod() or isclass() or isfunction() are true. This is new in Python 2.2, and, for example, is true of int.__add__. - An object passing this test has a __get__ attribute but not a __set__ - attribute, but beyond that the set of attributes varies. __name__ is - usually sensible, and __doc__ often is. + An object passing this test has a __get__ attribute, but not a + __set__ attribute or a __delete__ attribute. Beyond that, the set + of attributes varies; __name__ is usually sensible, and __doc__ + often is. Methods implemented via descriptors that also pass one of the other tests return false from the ismethoddescriptor() test, simply because @@ -317,8 +325,15 @@ def ismethoddescriptor(object): if isclass(object) or ismethod(object) or isfunction(object): # mutual exclusion return False + if isinstance(object, functools.partial): + # Lie for children. The addition of partial.__get__ + # doesn't currently change the partial objects behaviour, + # not counting a warning about future changes. + return False tp = type(object) - return hasattr(tp, "__get__") and not hasattr(tp, "__set__") + return (hasattr(tp, "__get__") + and not hasattr(tp, "__set__") + and not hasattr(tp, "__delete__")) def isdatadescriptor(object): """Return true if the object is a data descriptor. @@ -383,8 +398,10 @@ def isfunction(object): def _has_code_flag(f, flag): """Return true if ``f`` is a function (or a method or functools.partial - wrapper wrapping a function) whose code object has the given ``flag`` + wrapper wrapping a function or a functools.partialmethod wrapping a + function) whose code object has the given ``flag`` set in its flags.""" + f = functools._unwrap_partialmethod(f) while ismethod(f): f = f.__func__ f = functools._unwrap_partial(f) @@ -400,13 +417,13 @@ def isgeneratorfunction(obj): return _has_code_flag(obj, CO_GENERATOR) # A marker for markcoroutinefunction and iscoroutinefunction. -_is_coroutine_marker = object() +_is_coroutine_mark = object() def _has_coroutine_mark(f): while ismethod(f): f = f.__func__ f = functools._unwrap_partial(f) - return getattr(f, "_is_coroutine_marker", None) is _is_coroutine_marker + return getattr(f, "_is_coroutine_marker", None) is _is_coroutine_mark def markcoroutinefunction(func): """ @@ -414,7 +431,7 @@ def markcoroutinefunction(func): """ if hasattr(func, '__func__'): func = func.__func__ - func._is_coroutine_marker = _is_coroutine_marker + func._is_coroutine_marker = _is_coroutine_mark return func def iscoroutinefunction(obj): @@ -760,18 +777,14 @@ def unwrap(func, *, stop=None): :exc:`ValueError` is raised if a cycle is encountered. """ - if stop is None: - def _is_wrapper(f): - return hasattr(f, '__wrapped__') - else: - def _is_wrapper(f): - return hasattr(f, '__wrapped__') and not stop(f) f = func # remember the original func for error reporting # Memoise by id to tolerate non-hashable objects, but store objects to # ensure they aren't destroyed, which would allow their IDs to be reused. memo = {id(f): f} recursion_limit = sys.getrecursionlimit() - while _is_wrapper(func): + while not isinstance(func, type) and hasattr(func, '__wrapped__'): + if stop is not None and stop(func): + break func = func.__wrapped__ id_func = id(func) if (id_func in memo) or (len(memo) >= recursion_limit): @@ -832,9 +845,8 @@ def _finddoc(obj): cls = self.__class__ # Should be tested before isdatadescriptor(). elif isinstance(obj, property): - func = obj.fget - name = func.__name__ - cls = _findclass(func) + name = obj.__name__ + cls = _findclass(obj.fget) if cls is None or getattr(cls, name) is not obj: return None elif ismethoddescriptor(obj) or isdatadescriptor(obj): @@ -881,29 +893,28 @@ def cleandoc(doc): Any whitespace that can be uniformly removed from the second line onwards is removed.""" - try: - lines = doc.expandtabs().split('\n') - except UnicodeError: - return None - else: - # Find minimum indentation of any non-blank lines after first line. - margin = sys.maxsize - for line in lines[1:]: - content = len(line.lstrip()) - if content: - indent = len(line) - content - margin = min(margin, indent) - # Remove indentation. - if lines: - lines[0] = lines[0].lstrip() - if margin < sys.maxsize: - for i in range(1, len(lines)): lines[i] = lines[i][margin:] - # Remove any trailing or leading blank lines. - while lines and not lines[-1]: - lines.pop() - while lines and not lines[0]: - lines.pop(0) - return '\n'.join(lines) + lines = doc.expandtabs().split('\n') + + # Find minimum indentation of any non-blank lines after first line. + margin = sys.maxsize + for line in lines[1:]: + content = len(line.lstrip(' ')) + if content: + indent = len(line) - content + margin = min(margin, indent) + # Remove indentation. + if lines: + lines[0] = lines[0].lstrip(' ') + if margin < sys.maxsize: + for i in range(1, len(lines)): + lines[i] = lines[i][margin:] + # Remove any trailing or leading blank lines. + while lines and not lines[-1]: + lines.pop() + while lines and not lines[0]: + lines.pop(0) + return '\n'.join(lines) + def getfile(object): """Work out which source or compiled file an object was defined in.""" @@ -958,6 +969,10 @@ def getsourcefile(object): elif any(filename.endswith(s) for s in importlib.machinery.EXTENSION_SUFFIXES): return None + elif filename.endswith(".fwork"): + # Apple mobile framework markers are another type of non-source file + return None + # return a filename found in the linecache even if it doesn't exist on disk if filename in linecache.cache: return filename @@ -988,6 +1003,7 @@ def getmodule(object, _filename=None): return object if hasattr(object, '__module__'): return sys.modules.get(object.__module__) + # Try the filename to modulename cache if _filename is not None and _filename in modulesbyfile: return sys.modules.get(modulesbyfile[_filename]) @@ -1033,37 +1049,6 @@ class ClassFoundException(Exception): pass -class _ClassFinder(ast.NodeVisitor): - - def __init__(self, qualname): - self.stack = [] - self.qualname = qualname - - def visit_FunctionDef(self, node): - self.stack.append(node.name) - self.stack.append('') - self.generic_visit(node) - self.stack.pop() - self.stack.pop() - - visit_AsyncFunctionDef = visit_FunctionDef - - def visit_ClassDef(self, node): - self.stack.append(node.name) - if self.qualname == '.'.join(self.stack): - # Return the decorator for the class if present - if node.decorator_list: - line_number = node.decorator_list[0].lineno - else: - line_number = node.lineno - - # decrement by one since lines starts with indexing by zero - line_number -= 1 - raise ClassFoundException(line_number) - self.generic_visit(node) - self.stack.pop() - - def findsource(object): """Return the entire source file and starting line number for an object. @@ -1081,7 +1066,7 @@ def findsource(object): # Allow filenames in form of "" to pass through. # `doctest` monkeypatches `linecache` module to enable # inspection, so let `linecache.getlines` to be called. - if not (file.startswith('<') and file.endswith('>')): + if (not (file.startswith('<') and file.endswith('>'))) or file.endswith('.fwork'): raise OSError('source code not available') module = getmodule(object, file) @@ -1096,17 +1081,13 @@ def findsource(object): return lines, 0 if isclass(object): - qualname = object.__qualname__ - source = ''.join(lines) - tree = ast.parse(source) - class_finder = _ClassFinder(qualname) try: - class_finder.visit(tree) - except ClassFoundException as e: - line_number = e.args[0] - return lines, line_number - else: - raise OSError('could not find class definition') + lnum = vars(object)['__firstlineno__'] - 1 + except (TypeError, KeyError): + raise OSError('source code not available') + if lnum >= len(lines): + raise OSError('lineno is out of bounds') + return lines, lnum if ismethod(object): object = object.__func__ @@ -1120,15 +1101,8 @@ def findsource(object): if not hasattr(object, 'co_firstlineno'): raise OSError('could not find function definition') lnum = object.co_firstlineno - 1 - pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(? 0: - try: - line = lines[lnum] - except IndexError: - raise OSError('lineno is out of bounds') - if pat.match(line): - break - lnum = lnum - 1 + if lnum >= len(lines): + raise OSError('lineno is out of bounds') return lines, lnum raise OSError('could not find code object') @@ -1635,11 +1609,15 @@ def getclosurevars(func): global_vars = {} builtin_vars = {} unbound_names = set() - for name in code.co_names: - if name in ("None", "True", "False"): - # Because these used to be builtins instead of keywords, they - # may still show up as name references. We ignore them. - continue + global_names = set() + for instruction in dis.get_instructions(code): + opname = instruction.opname + name = instruction.argval + if opname == "LOAD_ATTR": + unbound_names.add(name) + elif opname == "LOAD_GLOBAL": + global_names.add(name) + for name in global_names: try: global_vars[name] = global_ns[name] except KeyError: @@ -1802,9 +1780,16 @@ def _check_class(klass, attr): return entry.__dict__[attr] return _sentinel + @functools.lru_cache() -def _shadowed_dict_from_mro_tuple(mro): - for entry in mro: +def _shadowed_dict_from_weakref_mro_tuple(*weakref_mro): + for weakref_entry in weakref_mro: + # Normally we'd have to check whether the result of weakref_entry() + # is None here, in case the object the weakref is pointing to has died. + # In this specific case, however, we know that the only caller of this + # function is `_shadowed_dict()`, and that therefore this weakref is + # guaranteed to point to an object that is still alive. + entry = weakref_entry() dunder_dict = _get_dunder_dict_of_class(entry) if '__dict__' in dunder_dict: class_dict = dunder_dict['__dict__'] @@ -1814,8 +1799,19 @@ def _shadowed_dict_from_mro_tuple(mro): return class_dict return _sentinel + def _shadowed_dict(klass): - return _shadowed_dict_from_mro_tuple(_static_getmro(klass)) + # gh-118013: the inner function here is decorated with lru_cache for + # performance reasons, *but* make sure not to pass strong references + # to the items in the mro. Doing so can lead to unexpected memory + # consumption in cases where classes are dynamically created and + # destroyed, and the dynamically created classes happen to be the only + # objects that hold strong references to other objects that take up a + # significant amount of memory. + return _shadowed_dict_from_weakref_mro_tuple( + *[make_weakref(entry) for entry in _static_getmro(klass)] + ) + def getattr_static(obj, attr, default=_sentinel): """Retrieve attributes without triggering dynamic lookup via the @@ -2007,15 +2003,17 @@ def _signature_get_user_defined_method(cls, method_name): named ``method_name`` and returns it only if it is a pure python function. """ - try: - meth = getattr(cls, method_name) - except AttributeError: - return + if method_name == '__new__': + meth = getattr(cls, method_name, None) else: - if not isinstance(meth, _NonUserDefinedCallables): - # Once '__signature__' will be added to 'C'-level - # callables, this check won't be necessary - return meth + meth = getattr_static(cls, method_name, None) + if meth is None or isinstance(meth, _NonUserDefinedCallables): + # Once '__signature__' will be added to 'C'-level + # callables, this check won't be necessary + return None + if method_name != '__new__': + meth = _descriptor_get(meth, cls) + return meth def _signature_get_partial(wrapped_sig, partial, extra_args=()): @@ -2128,8 +2126,10 @@ def _signature_is_builtin(obj): ismethoddescriptor(obj) or isinstance(obj, _NonUserDefinedCallables) or # Can't test 'isinstance(type)' here, as it would - # also be True for regular python classes - obj in (type, object)) + # also be True for regular python classes. + # Can't use the `in` operator here, as it would + # invoke the custom __eq__ method. + obj is type or obj is object) def _signature_is_functionlike(obj): @@ -2232,7 +2232,12 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True): module = None module_dict = {} + module_name = getattr(obj, '__module__', None) + if not module_name: + objclass = getattr(obj, '__objclass__', None) + module_name = getattr(objclass, '__module__', None) + if module_name: module = sys.modules.get(module_name, None) if module: @@ -2460,6 +2465,15 @@ def _signature_from_function(cls, func, skip_bound_arg=True, __validate_parameters__=is_duck_function) +def _descriptor_get(descriptor, obj): + if isclass(descriptor): + return descriptor + get = getattr(type(descriptor), '__get__', _sentinel) + if get is _sentinel: + return descriptor + return get(descriptor, obj, type(obj)) + + def _signature_from_callable(obj, *, follow_wrapper_chains=True, skip_bound_arg=True, @@ -2526,7 +2540,7 @@ def _signature_from_callable(obj, *, return sig try: - partialmethod = obj._partialmethod + partialmethod = obj.__partialmethod__ except AttributeError: pass else: @@ -2553,6 +2567,10 @@ def _signature_from_callable(obj, *, new_params = (first_wrapped_param,) + sig_params return sig.replace(parameters=new_params) + if isinstance(obj, functools.partial): + wrapped_sig = _get_signature_of(obj.func) + return _signature_get_partial(wrapped_sig, obj) + if isfunction(obj) or _signature_is_functionlike(obj): # If it's a pure Python function, or an object that is duck type # of a Python function (Cython functions, for instance), then: @@ -2564,11 +2582,6 @@ def _signature_from_callable(obj, *, return _signature_from_builtin(sigcls, obj, skip_bound_arg=skip_bound_arg) - if isinstance(obj, functools.partial): - wrapped_sig = _get_signature_of(obj.func) - return _signature_get_partial(wrapped_sig, obj) - - sig = None if isinstance(obj, type): # obj is a class or a metaclass @@ -2576,88 +2589,72 @@ def _signature_from_callable(obj, *, # in its metaclass call = _signature_get_user_defined_method(type(obj), '__call__') if call is not None: - sig = _get_signature_of(call) - else: - factory_method = None - new = _signature_get_user_defined_method(obj, '__new__') - init = _signature_get_user_defined_method(obj, '__init__') - - # Go through the MRO and see if any class has user-defined - # pure Python __new__ or __init__ method - for base in obj.__mro__: - # Now we check if the 'obj' class has an own '__new__' method - if new is not None and '__new__' in base.__dict__: - factory_method = new - break - # or an own '__init__' method - elif init is not None and '__init__' in base.__dict__: - factory_method = init - break + return _get_signature_of(call) - if factory_method is not None: - sig = _get_signature_of(factory_method) - - if sig is None: - # At this point we know, that `obj` is a class, with no user- - # defined '__init__', '__new__', or class-level '__call__' - - for base in obj.__mro__[:-1]: - # Since '__text_signature__' is implemented as a - # descriptor that extracts text signature from the - # class docstring, if 'obj' is derived from a builtin - # class, its own '__text_signature__' may be 'None'. - # Therefore, we go through the MRO (except the last - # class in there, which is 'object') to find the first - # class with non-empty text signature. - try: - text_sig = base.__text_signature__ - except AttributeError: - pass - else: - if text_sig: - # If 'base' class has a __text_signature__ attribute: - # return a signature based on it - return _signature_fromstr(sigcls, base, text_sig) - - # No '__text_signature__' was found for the 'obj' class. - # Last option is to check if its '__init__' is - # object.__init__ or type.__init__. - if type not in obj.__mro__: - # We have a class (not metaclass), but no user-defined - # __init__ or __new__ for it - if (obj.__init__ is object.__init__ and - obj.__new__ is object.__new__): - # Return a signature of 'object' builtin. - return sigcls.from_callable(object) - else: - raise ValueError( - 'no signature found for builtin type {!r}'.format(obj)) + new = _signature_get_user_defined_method(obj, '__new__') + init = _signature_get_user_defined_method(obj, '__init__') + + # Go through the MRO and see if any class has user-defined + # pure Python __new__ or __init__ method + for base in obj.__mro__: + # Now we check if the 'obj' class has an own '__new__' method + if new is not None and '__new__' in base.__dict__: + sig = _get_signature_of(new) + if skip_bound_arg: + sig = _signature_bound_method(sig) + return sig + # or an own '__init__' method + elif init is not None and '__init__' in base.__dict__: + return _get_signature_of(init) + + # At this point we know, that `obj` is a class, with no user- + # defined '__init__', '__new__', or class-level '__call__' + + for base in obj.__mro__[:-1]: + # Since '__text_signature__' is implemented as a + # descriptor that extracts text signature from the + # class docstring, if 'obj' is derived from a builtin + # class, its own '__text_signature__' may be 'None'. + # Therefore, we go through the MRO (except the last + # class in there, which is 'object') to find the first + # class with non-empty text signature. + try: + text_sig = base.__text_signature__ + except AttributeError: + pass + else: + if text_sig: + # If 'base' class has a __text_signature__ attribute: + # return a signature based on it + return _signature_fromstr(sigcls, base, text_sig) + + # No '__text_signature__' was found for the 'obj' class. + # Last option is to check if its '__init__' is + # object.__init__ or type.__init__. + if type not in obj.__mro__: + # We have a class (not metaclass), but no user-defined + # __init__ or __new__ for it + if (obj.__init__ is object.__init__ and + obj.__new__ is object.__new__): + # Return a signature of 'object' builtin. + return sigcls.from_callable(object) + else: + raise ValueError( + 'no signature found for builtin type {!r}'.format(obj)) - elif not isinstance(obj, _NonUserDefinedCallables): + else: # An object with __call__ - # We also check that the 'obj' is not an instance of - # types.WrapperDescriptorType or types.MethodWrapperType to avoid - # infinite recursion (and even potential segfault) - call = _signature_get_user_defined_method(type(obj), '__call__') + call = getattr_static(type(obj), '__call__', None) if call is not None: try: - sig = _get_signature_of(call) - except ValueError as ex: - msg = 'no signature found for {!r}'.format(obj) - raise ValueError(msg) from ex - - if sig is not None: - # For classes and objects we skip the first parameter of their - # __call__, __new__, or __init__ methods - if skip_bound_arg: - return _signature_bound_method(sig) - else: - return sig - - if isinstance(obj, types.BuiltinFunctionType): - # Raise a nicer error message for builtins - msg = 'no signature found for builtin function {!r}'.format(obj) - raise ValueError(msg) + text_sig = obj.__text_signature__ + except AttributeError: + pass + else: + if text_sig: + return _signature_fromstr(sigcls, obj, text_sig) + call = _descriptor_get(call, obj) + return _get_signature_of(call) raise ValueError('callable {!r} is not supported by signature'.format(obj)) @@ -2835,6 +2832,8 @@ class Parameter: return formatted + __replace__ = replace + def __repr__(self): return '<{} "{}">'.format(self.__class__.__name__, self) @@ -3095,6 +3094,8 @@ class Signature: return type(self)(parameters, return_annotation=return_annotation) + __replace__ = replace + def _hash_basis(self): params = tuple(param for param in self.parameters.values() if param.kind != _KEYWORD_ONLY) @@ -3125,6 +3126,8 @@ class Signature: parameters_ex = () arg_vals = iter(args) + pos_only_param_in_kwargs = [] + while True: # Let's iterate through the positional arguments and corresponding # parameters @@ -3145,10 +3148,10 @@ class Signature: break elif param.name in kwargs: if param.kind == _POSITIONAL_ONLY: - msg = '{arg!r} parameter is positional only, ' \ - 'but was passed as a keyword' - msg = msg.format(arg=param.name) - raise TypeError(msg) from None + # Raise a TypeError once we are sure there is no + # **kwargs param later. + pos_only_param_in_kwargs.append(param) + continue parameters_ex = (param,) break elif (param.kind == _VAR_KEYWORD or @@ -3230,20 +3233,22 @@ class Signature: format(arg=param_name)) from None else: - if param.kind == _POSITIONAL_ONLY: - # This should never happen in case of a properly built - # Signature object (but let's have this check here - # to ensure correct behaviour just in case) - raise TypeError('{arg!r} parameter is positional only, ' - 'but was passed as a keyword'. \ - format(arg=param.name)) - arguments[param_name] = arg_val if kwargs: if kwargs_param is not None: # Process our '**kwargs'-like parameter arguments[kwargs_param.name] = kwargs + elif pos_only_param_in_kwargs: + raise TypeError( + 'got some positional-only arguments passed as ' + 'keyword arguments: {arg!r}'.format( + arg=', '.join( + param.name + for param in pos_only_param_in_kwargs + ), + ), + ) else: raise TypeError( 'got an unexpected keyword argument {arg!r}'.format( @@ -3277,6 +3282,16 @@ class Signature: return '<{} {}>'.format(self.__class__.__name__, self) def __str__(self): + return self.format() + + def format(self, *, max_width=None): + """Create a string representation of the Signature object. + + If *max_width* integer is passed, + signature will try to fit into the *max_width*. + If signature is longer than *max_width*, + all parameters will be on separate lines. + """ result = [] render_pos_only_separator = False render_kw_only_separator = True @@ -3314,6 +3329,8 @@ class Signature: result.append('/') rendered = '({})'.format(', '.join(result)) + if max_width is not None and len(rendered) > max_width: + rendered = '(\n {}\n)'.format(',\n '.join(result)) if self.return_annotation is not _empty: anno = formatannotation(self.return_annotation) diff --git a/Lib/io.py b/Lib/io.py index 50ce9743..f0e2fa15 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -45,7 +45,8 @@ __all__ = ["BlockingIOError", "open", "open_code", "IOBase", "RawIOBase", "FileIO", "BytesIO", "StringIO", "BufferedIOBase", "BufferedReader", "BufferedWriter", "BufferedRWPair", "BufferedRandom", "TextIOBase", "TextIOWrapper", - "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] + "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END", + "DEFAULT_BUFFER_SIZE", "text_encoding", "IncrementalNewlineDecoder"] import _io diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index af1d5c48..83e390c8 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -310,7 +310,7 @@ def collapse_addresses(addresses): [IPv4Network('192.0.2.0/24')] Args: - addresses: An iterator of IPv4Network or IPv6Network objects. + addresses: An iterable of IPv4Network or IPv6Network objects. Returns: An iterator of the collapsed IPv(4|6)Network objects. @@ -1086,7 +1086,11 @@ class _BaseNetwork(_IPAddressBase): """ return any(self.network_address in priv_network and self.broadcast_address in priv_network - for priv_network in self._constants._private_networks) + for priv_network in self._constants._private_networks) and all( + self.network_address not in network and + self.broadcast_address not in network + for network in self._constants._private_networks_exceptions + ) @property def is_global(self): @@ -1333,18 +1337,41 @@ class IPv4Address(_BaseV4, _BaseAddress): @property @functools.lru_cache() def is_private(self): - """Test if this address is allocated for private networks. + """``True`` if the address is defined as not globally reachable by + iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ + (for IPv6) with the following exceptions: - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry. + * ``is_private`` is ``False`` for ``100.64.0.0/10`` + * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + address.is_private == address.ipv4_mapped.is_private + + ``is_private`` has value opposite to :attr:`is_global`, except for the ``100.64.0.0/10`` + IPv4 range where they are both ``False``. """ - return any(self in net for net in self._constants._private_networks) + return ( + any(self in net for net in self._constants._private_networks) + and all(self not in net for net in self._constants._private_networks_exceptions) + ) @property @functools.lru_cache() def is_global(self): + """``True`` if the address is defined as globally reachable by + iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ + (for IPv6) with the following exception: + + For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + + address.is_global == address.ipv4_mapped.is_global + + ``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10`` + IPv4 range where they are both ``False``. + """ return self not in self._constants._public_network and not self.is_private @property @@ -1389,6 +1416,16 @@ class IPv4Address(_BaseV4, _BaseAddress): """ return self in self._constants._linklocal_network + @property + def ipv6_mapped(self): + """Return the IPv4-mapped IPv6 address. + + Returns: + The IPv4-mapped IPv6 address per RFC 4291. + + """ + return IPv6Address(f'::ffff:{self}') + class IPv4Interface(IPv4Address): @@ -1548,13 +1585,15 @@ class _IPv4Constants: _public_network = IPv4Network('100.64.0.0/10') + # Not globally reachable address blocks listed on + # https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml _private_networks = [ IPv4Network('0.0.0.0/8'), IPv4Network('10.0.0.0/8'), IPv4Network('127.0.0.0/8'), IPv4Network('169.254.0.0/16'), IPv4Network('172.16.0.0/12'), - IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.0/24'), IPv4Network('192.0.0.170/31'), IPv4Network('192.0.2.0/24'), IPv4Network('192.168.0.0/16'), @@ -1565,6 +1604,11 @@ class _IPv4Constants: IPv4Network('255.255.255.255/32'), ] + _private_networks_exceptions = [ + IPv4Network('192.0.0.9/32'), + IPv4Network('192.0.0.10/32'), + ] + _reserved_network = IPv4Network('240.0.0.0/4') _unspecified_address = IPv4Address('0.0.0.0') @@ -1923,8 +1967,49 @@ class IPv6Address(_BaseV6, _BaseAddress): self._ip = self._ip_int_from_string(addr_str) + def _explode_shorthand_ip_string(self): + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is None: + return super()._explode_shorthand_ip_string() + prefix_len = 30 + raw_exploded_str = super()._explode_shorthand_ip_string() + return f"{raw_exploded_str[:prefix_len]}{ipv4_mapped!s}" + + def _reverse_pointer(self): + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is None: + return super()._reverse_pointer() + prefix_len = 30 + raw_exploded_str = super()._explode_shorthand_ip_string()[:prefix_len] + # ipv4 encoded using hexadecimal nibbles instead of decimals + ipv4_int = ipv4_mapped._ip + reverse_chars = f"{raw_exploded_str}{ipv4_int:008x}"[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + def _ipv4_mapped_ipv6_to_str(self): + """Return convenient text representation of IPv4-mapped IPv6 address + + See RFC 4291 2.5.5.2, 2.2 p.3 for details. + + Returns: + A string, 'x:x:x:x:x:x:d.d.d.d', where the 'x's are the hexadecimal values of + the six high-order 16-bit pieces of the address, and the 'd's are + the decimal values of the four low-order 8-bit pieces of the + address (standard IPv4 representation) as defined in RFC 4291 2.2 p.3. + + """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is None: + raise AddressValueError("Can not apply to non-IPv4-mapped IPv6 address %s" % str(self)) + high_order_bits = self._ip >> 32 + return "%s:%s" % (self._string_from_ip_int(high_order_bits), str(ipv4_mapped)) + def __str__(self): - ip_str = super().__str__() + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is None: + ip_str = super().__str__() + else: + ip_str = self._ipv4_mapped_ipv6_to_str() return ip_str + '%' + self._scope_id if self._scope_id else ip_str def __hash__(self): @@ -1938,6 +2023,9 @@ class IPv6Address(_BaseV6, _BaseAddress): return False return self._scope_id == getattr(other, '_scope_id', None) + def __reduce__(self): + return (self.__class__, (str(self),)) + @property def scope_id(self): """Identifier of a particular zone of the address's scope. @@ -1964,6 +2052,9 @@ class IPv6Address(_BaseV6, _BaseAddress): See RFC 2373 2.7 for details. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_multicast return self in self._constants._multicast_network @property @@ -1975,6 +2066,9 @@ class IPv6Address(_BaseV6, _BaseAddress): reserved IPv6 Network ranges. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_reserved return any(self in x for x in self._constants._reserved_networks) @property @@ -1985,6 +2079,9 @@ class IPv6Address(_BaseV6, _BaseAddress): A boolean, True if the address is reserved per RFC 4291. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_link_local return self in self._constants._linklocal_network @property @@ -2004,28 +2101,46 @@ class IPv6Address(_BaseV6, _BaseAddress): @property @functools.lru_cache() def is_private(self): - """Test if this address is allocated for private networks. + """``True`` if the address is defined as not globally reachable by + iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ + (for IPv6) with the following exceptions: - Returns: - A boolean, True if the address is reserved per - iana-ipv6-special-registry, or is ipv4_mapped and is - reserved in the iana-ipv4-special-registry. + * ``is_private`` is ``False`` for ``100.64.0.0/10`` + * For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + + address.is_private == address.ipv4_mapped.is_private + ``is_private`` has value opposite to :attr:`is_global`, except for the ``100.64.0.0/10`` + IPv4 range where they are both ``False``. """ ipv4_mapped = self.ipv4_mapped if ipv4_mapped is not None: return ipv4_mapped.is_private - return any(self in net for net in self._constants._private_networks) + return ( + any(self in net for net in self._constants._private_networks) + and all(self not in net for net in self._constants._private_networks_exceptions) + ) @property def is_global(self): - """Test if this address is allocated for public networks. + """``True`` if the address is defined as globally reachable by + iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_ + (for IPv6) with the following exception: - Returns: - A boolean, true if the address is not reserved per - iana-ipv6-special-registry. + For IPv4-mapped IPv6-addresses the ``is_private`` value is determined by the + semantics of the underlying IPv4 addresses and the following condition holds + (see :attr:`IPv6Address.ipv4_mapped`):: + address.is_global == address.ipv4_mapped.is_global + + ``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10`` + IPv4 range where they are both ``False``. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_global return not self.is_private @property @@ -2037,6 +2152,9 @@ class IPv6Address(_BaseV6, _BaseAddress): RFC 2373 2.5.2. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_unspecified return self._ip == 0 @property @@ -2048,6 +2166,9 @@ class IPv6Address(_BaseV6, _BaseAddress): RFC 2373 2.5.3. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_loopback return self._ip == 1 @property @@ -2164,7 +2285,7 @@ class IPv6Interface(IPv6Address): @property def is_loopback(self): - return self._ip == 1 and self.network.is_loopback + return super().is_loopback and self.network.is_loopback class IPv6Network(_BaseV6, _BaseNetwork): @@ -2265,19 +2386,33 @@ class _IPv6Constants: _multicast_network = IPv6Network('ff00::/8') + # Not globally reachable address blocks listed on + # https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml _private_networks = [ IPv6Network('::1/128'), IPv6Network('::/128'), IPv6Network('::ffff:0:0/96'), + IPv6Network('64:ff9b:1::/48'), IPv6Network('100::/64'), IPv6Network('2001::/23'), - IPv6Network('2001:2::/48'), IPv6Network('2001:db8::/32'), - IPv6Network('2001:10::/28'), + # IANA says N/A, let's consider it not globally reachable to be safe + IPv6Network('2002::/16'), + # RFC 9637: https://www.rfc-editor.org/rfc/rfc9637.html#section-6-2.2 + IPv6Network('3fff::/20'), IPv6Network('fc00::/7'), IPv6Network('fe80::/10'), ] + _private_networks_exceptions = [ + IPv6Network('2001:1::1/128'), + IPv6Network('2001:1::2/128'), + IPv6Network('2001:3::/32'), + IPv6Network('2001:4:112::/48'), + IPv6Network('2001:20::/28'), + IPv6Network('2001:30::/28'), + ] + _reserved_networks = [ IPv6Network('::/8'), IPv6Network('100::/8'), IPv6Network('200::/7'), IPv6Network('400::/6'), diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py index c5d9ae2d..ff4bfcdc 100644 --- a/Lib/json/decoder.py +++ b/Lib/json/decoder.py @@ -50,17 +50,18 @@ _CONSTANTS = { } +HEXDIGITS = re.compile(r'[0-9A-Fa-f]{4}', FLAGS) STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) BACKSLASH = { '"': '"', '\\': '\\', '/': '/', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', } -def _decode_uXXXX(s, pos): - esc = s[pos + 1:pos + 5] - if len(esc) == 4 and esc[1] not in 'xX': +def _decode_uXXXX(s, pos, _m=HEXDIGITS.match): + esc = _m(s, pos + 1) + if esc is not None: try: - return int(esc, 16) + return int(esc.group(), 16) except ValueError: pass msg = "Invalid \\uXXXX escape" @@ -200,10 +201,13 @@ def JSONObject(s_and_end, strict, scan_once, object_hook, object_pairs_hook, break elif nextchar != ',': raise JSONDecodeError("Expecting ',' delimiter", s, end - 1) + comma_idx = end - 1 end = _w(s, end).end() nextchar = s[end:end + 1] end += 1 if nextchar != '"': + if nextchar == '}': + raise JSONDecodeError("Illegal trailing comma before end of object", s, comma_idx) raise JSONDecodeError( "Expecting property name enclosed in double quotes", s, end - 1) if object_pairs_hook is not None: @@ -240,13 +244,17 @@ def JSONArray(s_and_end, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): break elif nextchar != ',': raise JSONDecodeError("Expecting ',' delimiter", s, end - 1) + comma_idx = end - 1 try: if s[end] in _ws: end += 1 if s[end] in _ws: end = _w(s, end + 1).end() + nextchar = s[end:end + 1] except IndexError: pass + if nextchar == ']': + raise JSONDecodeError("Illegal trailing comma before end of array", s, comma_idx) return values, end diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 45f54774..323332f0 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -174,7 +174,7 @@ class JSONEncoder(object): else: return list(iterable) # Let the base class default method raise the TypeError - return JSONEncoder.default(self, o) + return super().default(o) """ raise TypeError(f'Object of type {o.__class__.__name__} ' @@ -244,15 +244,18 @@ class JSONEncoder(object): return text - if (_one_shot and c_make_encoder is not None - and self.indent is None): + if self.indent is None or isinstance(self.indent, str): + indent = self.indent + else: + indent = ' ' * self.indent + if _one_shot and c_make_encoder is not None: _iterencode = c_make_encoder( - markers, self.default, _encoder, self.indent, + markers, self.default, _encoder, indent, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, self.allow_nan) else: _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, + markers, self.default, _encoder, indent, floatstr, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, _one_shot) return _iterencode(o, 0) @@ -272,9 +275,6 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _intstr=int.__repr__, ): - if _indent is not None and not isinstance(_indent, str): - _indent = ' ' * _indent - def _iterencode_list(lst, _current_indent_level): if not lst: yield '[]' diff --git a/Lib/json/scanner.py b/Lib/json/scanner.py index 7a61cfc2..09089751 100644 --- a/Lib/json/scanner.py +++ b/Lib/json/scanner.py @@ -9,7 +9,7 @@ except ImportError: __all__ = ['make_scanner'] NUMBER_RE = re.compile( - r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', + r'(-?(?:0|[1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?', (re.VERBOSE | re.MULTILINE | re.DOTALL)) def py_make_scanner(context): diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 0490b8c0..fdfc3372 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -13,7 +13,6 @@ Usage:: import argparse import json import sys -from pathlib import Path def main(): @@ -22,11 +21,9 @@ def main(): 'to validate and pretty-print JSON objects.') parser = argparse.ArgumentParser(prog=prog, description=description) parser.add_argument('infile', nargs='?', - type=argparse.FileType(encoding="utf-8"), help='a JSON file to be validated or pretty-printed', - default=sys.stdin) + default='-') parser.add_argument('outfile', nargs='?', - type=Path, help='write the output of infile to outfile', default=None) parser.add_argument('--sort-keys', action='store_true', default=False, @@ -59,23 +56,30 @@ def main(): dump_args['indent'] = None dump_args['separators'] = ',', ':' - with options.infile as infile: + try: + if options.infile == '-': + infile = sys.stdin + else: + infile = open(options.infile, encoding='utf-8') try: if options.json_lines: objs = (json.loads(line) for line in infile) else: objs = (json.load(infile),) + finally: + if infile is not sys.stdin: + infile.close() - if options.outfile is None: - out = sys.stdout - else: - out = options.outfile.open('w', encoding='utf-8') - with out as outfile: - for obj in objs: - json.dump(obj, outfile, **dump_args) - outfile.write('\n') - except ValueError as e: - raise SystemExit(e) + if options.outfile is None: + outfile = sys.stdout + else: + outfile = open(options.outfile, 'w', encoding='utf-8') + with outfile: + for obj in objs: + json.dump(obj, outfile, **dump_args) + outfile.write('\n') + except ValueError as e: + raise SystemExit(e) if __name__ == '__main__': diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt deleted file mode 100644 index fa7b1506..00000000 --- a/Lib/lib2to3/Grammar.txt +++ /dev/null @@ -1,196 +0,0 @@ -# Grammar for 2to3. This grammar supports Python 2.x and 3.x. - -# NOTE WELL: You should also follow all the steps listed at -# https://devguide.python.org/grammar/ - -# Start symbols for the grammar: -# file_input is a module or sequence of commands read from an input file; -# single_input is a single interactive statement; -# eval_input is the input for the eval() and input() functions. -# NB: compound_stmt in single_input is followed by extra NEWLINE! -file_input: (NEWLINE | stmt)* ENDMARKER -single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE -eval_input: testlist NEWLINE* ENDMARKER - -decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE -decorators: decorator+ -decorated: decorators (classdef | funcdef | async_funcdef) -async_funcdef: ASYNC funcdef -funcdef: 'def' NAME parameters ['->' test] ':' suite -parameters: '(' [typedargslist] ')' - -# The following definition for typedarglist is equivalent to this set of rules: -# -# arguments = argument (',' argument)* -# argument = tfpdef ['=' test] -# kwargs = '**' tname [','] -# args = '*' [tname] -# kwonly_kwargs = (',' argument)* [',' [kwargs]] -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] -# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# typedarglist = arguments ',' '/' [',' [typedargslist_no_posonly]])|(typedargslist_no_posonly)" -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [ - ',' [((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* - [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])] - ] | ((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* - [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) - -tname: NAME [':' test] -tfpdef: tname | '(' tfplist ')' -tfplist: tfpdef (',' tfpdef)* [','] - -# The following definition for varargslist is equivalent to this set of rules: -# -# arguments = argument (',' argument )* -# argument = vfpdef ['=' test] -# kwargs = '**' vname [','] -# args = '*' [vname] -# kwonly_kwargs = (',' argument )* [',' [kwargs]] -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] -# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly) -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ - ((vfpdef ['=' test] ',')* ('*' [vname] (',' vname ['=' test])* - [',' ['**' vname [',']]] | '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) - ]] | ((vfpdef ['=' test] ',')* - ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]]| '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) - -vname: NAME -vfpdef: vname | '(' vfplist ')' -vfplist: vfpdef (',' vfpdef)* [','] - -stmt: simple_stmt | compound_stmt -simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | - import_stmt | global_stmt | exec_stmt | assert_stmt) -expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))*) -annassign: ':' test ['=' test] -testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] -augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | - '<<=' | '>>=' | '**=' | '//=') -# For normal and annotated assignments, additional restrictions enforced by the interpreter -print_stmt: 'print' ( [ test (',' test)* [','] ] | - '>>' test [ (',' test)+ [','] ] ) -del_stmt: 'del' exprlist -pass_stmt: 'pass' -flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt -break_stmt: 'break' -continue_stmt: 'continue' -return_stmt: 'return' [testlist_star_expr] -yield_stmt: yield_expr -raise_stmt: 'raise' [test ['from' test | ',' test [',' test]]] -import_stmt: import_name | import_from -import_name: 'import' dotted_as_names -import_from: ('from' ('.'* dotted_name | '.'+) - 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_as_name: NAME ['as' NAME] -dotted_as_name: dotted_name ['as' NAME] -import_as_names: import_as_name (',' import_as_name)* [','] -dotted_as_names: dotted_as_name (',' dotted_as_name)* -dotted_name: NAME ('.' NAME)* -global_stmt: ('global' | 'nonlocal') NAME (',' NAME)* -exec_stmt: 'exec' expr ['in' test [',' test]] -assert_stmt: 'assert' test [',' test] - -compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt -async_stmt: ASYNC (funcdef | with_stmt | for_stmt) -if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] -while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] -for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] -try_stmt: ('try' ':' suite - ((except_clause ':' suite)+ - ['else' ':' suite] - ['finally' ':' suite] | - 'finally' ':' suite)) -with_stmt: 'with' with_item (',' with_item)* ':' suite -with_item: test ['as' expr] -with_var: 'as' expr -# NB compile.c makes sure that the default except clause is last -except_clause: 'except' [test [(',' | 'as') test]] -suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT - -# Backward compatibility cruft to support: -# [ x for x in lambda: True, lambda: False if x() ] -# even while also allowing: -# lambda x: 5 if x else 2 -# (But not a mix of the two) -testlist_safe: old_test [(',' old_test)+ [',']] -old_test: or_test | old_lambdef -old_lambdef: 'lambda' [varargslist] ':' old_test - -namedexpr_test: test [':=' test] -test: or_test ['if' or_test 'else' test] | lambdef -or_test: and_test ('or' and_test)* -and_test: not_test ('and' not_test)* -not_test: 'not' not_test | comparison -comparison: expr (comp_op expr)* -comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' -star_expr: '*' expr -expr: xor_expr ('|' xor_expr)* -xor_expr: and_expr ('^' and_expr)* -and_expr: shift_expr ('&' shift_expr)* -shift_expr: arith_expr (('<<'|'>>') arith_expr)* -arith_expr: term (('+'|'-') term)* -term: factor (('*'|'@'|'/'|'%'|'//') factor)* -factor: ('+'|'-'|'~') factor | power -power: [AWAIT] atom trailer* ['**' factor] -atom: ('(' [yield_expr|testlist_gexp] ')' | - '[' [listmaker] ']' | - '{' [dictsetmaker] '}' | - '`' testlist1 '`' | - NAME | NUMBER | STRING+ | '.' '.' '.') -listmaker: (namedexpr_test|star_expr) ( comp_for | (',' (namedexpr_test|star_expr))* [','] ) -testlist_gexp: (namedexpr_test|star_expr) ( comp_for | (',' (namedexpr_test|star_expr))* [','] ) -lambdef: 'lambda' [varargslist] ':' test -trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -subscriptlist: subscript (',' subscript)* [','] -subscript: test | [test] ':' [test] [sliceop] -sliceop: ':' [test] -exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] -testlist: test (',' test)* [','] -dictsetmaker: ( ((test ':' test | '**' expr) - (comp_for | (',' (test ':' test | '**' expr))* [','])) | - ((test | star_expr) - (comp_for | (',' (test | star_expr))* [','])) ) - -classdef: 'class' NAME ['(' [arglist] ')'] ':' suite - -arglist: argument (',' argument)* [','] - -# "test '=' test" is really "keyword '=' test", but we have no such token. -# These need to be in a single rule to avoid grammar that is ambiguous -# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr, -# we explicitly match '*' here, too, to give it proper precedence. -# Illegal combinations and orderings are blocked in ast.c: -# multiple (test comp_for) arguments are blocked; keyword unpackings -# that precede iterable unpackings are blocked; etc. -argument: ( test [comp_for] | - test ':=' test | - test '=' test | - '**' test | - '*' test ) - -comp_iter: comp_for | comp_if -comp_for: [ASYNC] 'for' exprlist 'in' testlist_safe [comp_iter] -comp_if: 'if' old_test [comp_iter] - -testlist1: test (',' test)* - -# not used in grammar, but may appear in "node" passed from Parser to Compiler -encoding_decl: NAME - -yield_expr: 'yield' [yield_arg] -yield_arg: 'from' test | testlist_star_expr diff --git a/Lib/lib2to3/PatternGrammar.txt b/Lib/lib2to3/PatternGrammar.txt deleted file mode 100644 index 36bf8148..00000000 --- a/Lib/lib2to3/PatternGrammar.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -# A grammar to describe tree matching patterns. -# Not shown here: -# - 'TOKEN' stands for any token (leaf node) -# - 'any' stands for any node (leaf or interior) -# With 'any' we can still specify the sub-structure. - -# The start symbol is 'Matcher'. - -Matcher: Alternatives ENDMARKER - -Alternatives: Alternative ('|' Alternative)* - -Alternative: (Unit | NegatedUnit)+ - -Unit: [NAME '='] ( STRING [Repeater] - | NAME [Details] [Repeater] - | '(' Alternatives ')' [Repeater] - | '[' Alternatives ']' - ) - -NegatedUnit: 'not' (STRING | NAME [Details] | '(' Alternatives ')') - -Repeater: '*' | '+' | '{' NUMBER [',' NUMBER] '}' - -Details: '<' Alternatives '>' diff --git a/Lib/lib2to3/__init__.py b/Lib/lib2to3/__init__.py deleted file mode 100644 index 177405c8..00000000 --- a/Lib/lib2to3/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import warnings - - -warnings.warn( - "lib2to3 package is deprecated and may not be able to parse Python 3.10+", - DeprecationWarning, - stacklevel=2, -) diff --git a/Lib/lib2to3/__main__.py b/Lib/lib2to3/__main__.py deleted file mode 100644 index 80688baf..00000000 --- a/Lib/lib2to3/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -import sys -from .main import main - -sys.exit(main("lib2to3.fixes")) diff --git a/Lib/lib2to3/btm_matcher.py b/Lib/lib2to3/btm_matcher.py deleted file mode 100644 index 3b788680..00000000 --- a/Lib/lib2to3/btm_matcher.py +++ /dev/null @@ -1,163 +0,0 @@ -"""A bottom-up tree matching algorithm implementation meant to speed -up 2to3's matching process. After the tree patterns are reduced to -their rarest linear path, a linear Aho-Corasick automaton is -created. The linear automaton traverses the linear paths from the -leaves to the root of the AST and returns a set of nodes for further -matching. This reduces significantly the number of candidate nodes.""" - -__author__ = "George Boutsioukis " - -import logging -import itertools -from collections import defaultdict - -from . import pytree -from .btm_utils import reduce_tree - -class BMNode(object): - """Class for a node of the Aho-Corasick automaton used in matching""" - count = itertools.count() - def __init__(self): - self.transition_table = {} - self.fixers = [] - self.id = next(BMNode.count) - self.content = '' - -class BottomMatcher(object): - """The main matcher class. After instantiating the patterns should - be added using the add_fixer method""" - - def __init__(self): - self.match = set() - self.root = BMNode() - self.nodes = [self.root] - self.fixers = [] - self.logger = logging.getLogger("RefactoringTool") - - def add_fixer(self, fixer): - """Reduces a fixer's pattern tree to a linear path and adds it - to the matcher(a common Aho-Corasick automaton). The fixer is - appended on the matching states and called when they are - reached""" - self.fixers.append(fixer) - tree = reduce_tree(fixer.pattern_tree) - linear = tree.get_linear_subpattern() - match_nodes = self.add(linear, start=self.root) - for match_node in match_nodes: - match_node.fixers.append(fixer) - - def add(self, pattern, start): - "Recursively adds a linear pattern to the AC automaton" - #print("adding pattern", pattern, "to", start) - if not pattern: - #print("empty pattern") - return [start] - if isinstance(pattern[0], tuple): - #alternatives - #print("alternatives") - match_nodes = [] - for alternative in pattern[0]: - #add all alternatives, and add the rest of the pattern - #to each end node - end_nodes = self.add(alternative, start=start) - for end in end_nodes: - match_nodes.extend(self.add(pattern[1:], end)) - return match_nodes - else: - #single token - #not last - if pattern[0] not in start.transition_table: - #transition did not exist, create new - next_node = BMNode() - start.transition_table[pattern[0]] = next_node - else: - #transition exists already, follow - next_node = start.transition_table[pattern[0]] - - if pattern[1:]: - end_nodes = self.add(pattern[1:], start=next_node) - else: - end_nodes = [next_node] - return end_nodes - - def run(self, leaves): - """The main interface with the bottom matcher. The tree is - traversed from the bottom using the constructed - automaton. Nodes are only checked once as the tree is - retraversed. When the automaton fails, we give it one more - shot(in case the above tree matches as a whole with the - rejected leaf), then we break for the next leaf. There is the - special case of multiple arguments(see code comments) where we - recheck the nodes - - Args: - The leaves of the AST tree to be matched - - Returns: - A dictionary of node matches with fixers as the keys - """ - current_ac_node = self.root - results = defaultdict(list) - for leaf in leaves: - current_ast_node = leaf - while current_ast_node: - current_ast_node.was_checked = True - for child in current_ast_node.children: - # multiple statements, recheck - if isinstance(child, pytree.Leaf) and child.value == ";": - current_ast_node.was_checked = False - break - if current_ast_node.type == 1: - #name - node_token = current_ast_node.value - else: - node_token = current_ast_node.type - - if node_token in current_ac_node.transition_table: - #token matches - current_ac_node = current_ac_node.transition_table[node_token] - for fixer in current_ac_node.fixers: - results[fixer].append(current_ast_node) - else: - #matching failed, reset automaton - current_ac_node = self.root - if (current_ast_node.parent is not None - and current_ast_node.parent.was_checked): - #the rest of the tree upwards has been checked, next leaf - break - - #recheck the rejected node once from the root - if node_token in current_ac_node.transition_table: - #token matches - current_ac_node = current_ac_node.transition_table[node_token] - for fixer in current_ac_node.fixers: - results[fixer].append(current_ast_node) - - current_ast_node = current_ast_node.parent - return results - - def print_ac(self): - "Prints a graphviz diagram of the BM automaton(for debugging)" - print("digraph g{") - def print_node(node): - for subnode_key in node.transition_table.keys(): - subnode = node.transition_table[subnode_key] - print("%d -> %d [label=%s] //%s" % - (node.id, subnode.id, type_repr(subnode_key), str(subnode.fixers))) - if subnode_key == 1: - print(subnode.content) - print_node(subnode) - print_node(self.root) - print("}") - -# taken from pytree.py for debugging; only used by print_ac -_type_reprs = {} -def type_repr(type_num): - global _type_reprs - if not _type_reprs: - from .pygram import python_symbols - # printing tokens is possible but not as useful - # from .pgen2 import token // token.__dict__.items(): - for name, val in python_symbols.__dict__.items(): - if type(val) == int: _type_reprs[val] = name - return _type_reprs.setdefault(type_num, type_num) diff --git a/Lib/lib2to3/btm_utils.py b/Lib/lib2to3/btm_utils.py deleted file mode 100644 index b61afdba..00000000 --- a/Lib/lib2to3/btm_utils.py +++ /dev/null @@ -1,280 +0,0 @@ -"Utility functions used by the btm_matcher module" - -from . import pytree -from .pgen2 import grammar, token -from .pygram import pattern_symbols, python_symbols - -syms = pattern_symbols -pysyms = python_symbols -tokens = grammar.opmap -token_labels = token - -TYPE_ANY = -1 -TYPE_ALTERNATIVES = -2 -TYPE_GROUP = -3 - -class MinNode(object): - """This class serves as an intermediate representation of the - pattern tree during the conversion to sets of leaf-to-root - subpatterns""" - - def __init__(self, type=None, name=None): - self.type = type - self.name = name - self.children = [] - self.leaf = False - self.parent = None - self.alternatives = [] - self.group = [] - - def __repr__(self): - return str(self.type) + ' ' + str(self.name) - - def leaf_to_root(self): - """Internal method. Returns a characteristic path of the - pattern tree. This method must be run for all leaves until the - linear subpatterns are merged into a single""" - node = self - subp = [] - while node: - if node.type == TYPE_ALTERNATIVES: - node.alternatives.append(subp) - if len(node.alternatives) == len(node.children): - #last alternative - subp = [tuple(node.alternatives)] - node.alternatives = [] - node = node.parent - continue - else: - node = node.parent - subp = None - break - - if node.type == TYPE_GROUP: - node.group.append(subp) - #probably should check the number of leaves - if len(node.group) == len(node.children): - subp = get_characteristic_subpattern(node.group) - node.group = [] - node = node.parent - continue - else: - node = node.parent - subp = None - break - - if node.type == token_labels.NAME and node.name: - #in case of type=name, use the name instead - subp.append(node.name) - else: - subp.append(node.type) - - node = node.parent - return subp - - def get_linear_subpattern(self): - """Drives the leaf_to_root method. The reason that - leaf_to_root must be run multiple times is because we need to - reject 'group' matches; for example the alternative form - (a | b c) creates a group [b c] that needs to be matched. Since - matching multiple linear patterns overcomes the automaton's - capabilities, leaf_to_root merges each group into a single - choice based on 'characteristic'ity, - - i.e. (a|b c) -> (a|b) if b more characteristic than c - - Returns: The most 'characteristic'(as defined by - get_characteristic_subpattern) path for the compiled pattern - tree. - """ - - for l in self.leaves(): - subp = l.leaf_to_root() - if subp: - return subp - - def leaves(self): - "Generator that returns the leaves of the tree" - for child in self.children: - yield from child.leaves() - if not self.children: - yield self - -def reduce_tree(node, parent=None): - """ - Internal function. Reduces a compiled pattern tree to an - intermediate representation suitable for feeding the - automaton. This also trims off any optional pattern elements(like - [a], a*). - """ - - new_node = None - #switch on the node type - if node.type == syms.Matcher: - #skip - node = node.children[0] - - if node.type == syms.Alternatives : - #2 cases - if len(node.children) <= 2: - #just a single 'Alternative', skip this node - new_node = reduce_tree(node.children[0], parent) - else: - #real alternatives - new_node = MinNode(type=TYPE_ALTERNATIVES) - #skip odd children('|' tokens) - for child in node.children: - if node.children.index(child)%2: - continue - reduced = reduce_tree(child, new_node) - if reduced is not None: - new_node.children.append(reduced) - elif node.type == syms.Alternative: - if len(node.children) > 1: - - new_node = MinNode(type=TYPE_GROUP) - for child in node.children: - reduced = reduce_tree(child, new_node) - if reduced: - new_node.children.append(reduced) - if not new_node.children: - # delete the group if all of the children were reduced to None - new_node = None - - else: - new_node = reduce_tree(node.children[0], parent) - - elif node.type == syms.Unit: - if (isinstance(node.children[0], pytree.Leaf) and - node.children[0].value == '('): - #skip parentheses - return reduce_tree(node.children[1], parent) - if ((isinstance(node.children[0], pytree.Leaf) and - node.children[0].value == '[') - or - (len(node.children)>1 and - hasattr(node.children[1], "value") and - node.children[1].value == '[')): - #skip whole unit if its optional - return None - - leaf = True - details_node = None - alternatives_node = None - has_repeater = False - repeater_node = None - has_variable_name = False - - for child in node.children: - if child.type == syms.Details: - leaf = False - details_node = child - elif child.type == syms.Repeater: - has_repeater = True - repeater_node = child - elif child.type == syms.Alternatives: - alternatives_node = child - if hasattr(child, 'value') and child.value == '=': # variable name - has_variable_name = True - - #skip variable name - if has_variable_name: - #skip variable name, '=' - name_leaf = node.children[2] - if hasattr(name_leaf, 'value') and name_leaf.value == '(': - # skip parenthesis - name_leaf = node.children[3] - else: - name_leaf = node.children[0] - - #set node type - if name_leaf.type == token_labels.NAME: - #(python) non-name or wildcard - if name_leaf.value == 'any': - new_node = MinNode(type=TYPE_ANY) - else: - if hasattr(token_labels, name_leaf.value): - new_node = MinNode(type=getattr(token_labels, name_leaf.value)) - else: - new_node = MinNode(type=getattr(pysyms, name_leaf.value)) - - elif name_leaf.type == token_labels.STRING: - #(python) name or character; remove the apostrophes from - #the string value - name = name_leaf.value.strip("'") - if name in tokens: - new_node = MinNode(type=tokens[name]) - else: - new_node = MinNode(type=token_labels.NAME, name=name) - elif name_leaf.type == syms.Alternatives: - new_node = reduce_tree(alternatives_node, parent) - - #handle repeaters - if has_repeater: - if repeater_node.children[0].value == '*': - #reduce to None - new_node = None - elif repeater_node.children[0].value == '+': - #reduce to a single occurrence i.e. do nothing - pass - else: - #TODO: handle {min, max} repeaters - raise NotImplementedError - - #add children - if details_node and new_node is not None: - for child in details_node.children[1:-1]: - #skip '<', '>' markers - reduced = reduce_tree(child, new_node) - if reduced is not None: - new_node.children.append(reduced) - if new_node: - new_node.parent = parent - return new_node - - -def get_characteristic_subpattern(subpatterns): - """Picks the most characteristic from a list of linear patterns - Current order used is: - names > common_names > common_chars - """ - if not isinstance(subpatterns, list): - return subpatterns - if len(subpatterns)==1: - return subpatterns[0] - - # first pick out the ones containing variable names - subpatterns_with_names = [] - subpatterns_with_common_names = [] - common_names = ['in', 'for', 'if' , 'not', 'None'] - subpatterns_with_common_chars = [] - common_chars = "[]().,:" - for subpattern in subpatterns: - if any(rec_test(subpattern, lambda x: type(x) is str)): - if any(rec_test(subpattern, - lambda x: isinstance(x, str) and x in common_chars)): - subpatterns_with_common_chars.append(subpattern) - elif any(rec_test(subpattern, - lambda x: isinstance(x, str) and x in common_names)): - subpatterns_with_common_names.append(subpattern) - - else: - subpatterns_with_names.append(subpattern) - - if subpatterns_with_names: - subpatterns = subpatterns_with_names - elif subpatterns_with_common_names: - subpatterns = subpatterns_with_common_names - elif subpatterns_with_common_chars: - subpatterns = subpatterns_with_common_chars - # of the remaining subpatterns pick out the longest one - return max(subpatterns, key=len) - -def rec_test(sequence, test_func): - """Tests test_func on all items of sequence and items of included - sub-iterables""" - for x in sequence: - if isinstance(x, (list, tuple)): - yield from rec_test(x, test_func) - else: - yield test_func(x) diff --git a/Lib/lib2to3/fixer_base.py b/Lib/lib2to3/fixer_base.py deleted file mode 100644 index df581a4d..00000000 --- a/Lib/lib2to3/fixer_base.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Base class for fixers (optional, but recommended).""" - -# Python imports -import itertools - -# Local imports -from .patcomp import PatternCompiler -from . import pygram -from .fixer_util import does_tree_import - -class BaseFix(object): - - """Optional base class for fixers. - - The subclass name must be FixFooBar where FooBar is the result of - removing underscores and capitalizing the words of the fix name. - For example, the class name for a fixer named 'has_key' should be - FixHasKey. - """ - - PATTERN = None # Most subclasses should override with a string literal - pattern = None # Compiled pattern, set by compile_pattern() - pattern_tree = None # Tree representation of the pattern - options = None # Options object passed to initializer - filename = None # The filename (set by set_filename) - numbers = itertools.count(1) # For new_name() - used_names = set() # A set of all used NAMEs - order = "post" # Does the fixer prefer pre- or post-order traversal - explicit = False # Is this ignored by refactor.py -f all? - run_order = 5 # Fixers will be sorted by run order before execution - # Lower numbers will be run first. - _accept_type = None # [Advanced and not public] This tells RefactoringTool - # which node type to accept when there's not a pattern. - - keep_line_order = False # For the bottom matcher: match with the - # original line order - BM_compatible = False # Compatibility with the bottom matching - # module; every fixer should set this - # manually - - # Shortcut for access to Python grammar symbols - syms = pygram.python_symbols - - def __init__(self, options, log): - """Initializer. Subclass may override. - - Args: - options: a dict containing the options passed to RefactoringTool - that could be used to customize the fixer through the command line. - log: a list to append warnings and other messages to. - """ - self.options = options - self.log = log - self.compile_pattern() - - def compile_pattern(self): - """Compiles self.PATTERN into self.pattern. - - Subclass may override if it doesn't want to use - self.{pattern,PATTERN} in .match(). - """ - if self.PATTERN is not None: - PC = PatternCompiler() - self.pattern, self.pattern_tree = PC.compile_pattern(self.PATTERN, - with_tree=True) - - def set_filename(self, filename): - """Set the filename. - - The main refactoring tool should call this. - """ - self.filename = filename - - def match(self, node): - """Returns match for a given parse tree node. - - Should return a true or false object (not necessarily a bool). - It may return a non-empty dict of matching sub-nodes as - returned by a matching pattern. - - Subclass may override. - """ - results = {"node": node} - return self.pattern.match(node, results) and results - - def transform(self, node, results): - """Returns the transformation for a given parse tree node. - - Args: - node: the root of the parse tree that matched the fixer. - results: a dict mapping symbolic names to part of the match. - - Returns: - None, or a node that is a modified copy of the - argument node. The node argument may also be modified in-place to - effect the same change. - - Subclass *must* override. - """ - raise NotImplementedError() - - def new_name(self, template="xxx_todo_changeme"): - """Return a string suitable for use as an identifier - - The new name is guaranteed not to conflict with other identifiers. - """ - name = template - while name in self.used_names: - name = template + str(next(self.numbers)) - self.used_names.add(name) - return name - - def log_message(self, message): - if self.first_log: - self.first_log = False - self.log.append("### In file %s ###" % self.filename) - self.log.append(message) - - def cannot_convert(self, node, reason=None): - """Warn the user that a given chunk of code is not valid Python 3, - but that it cannot be converted automatically. - - First argument is the top-level node for the code in question. - Optional second argument is why it can't be converted. - """ - lineno = node.get_lineno() - for_output = node.clone() - for_output.prefix = "" - msg = "Line %d: could not convert: %s" - self.log_message(msg % (lineno, for_output)) - if reason: - self.log_message(reason) - - def warning(self, node, reason): - """Used for warning the user about possible uncertainty in the - translation. - - First argument is the top-level node for the code in question. - Optional second argument is why it can't be converted. - """ - lineno = node.get_lineno() - self.log_message("Line %d: %s" % (lineno, reason)) - - def start_tree(self, tree, filename): - """Some fixers need to maintain tree-wide state. - This method is called once, at the start of tree fix-up. - - tree - the root node of the tree to be processed. - filename - the name of the file the tree came from. - """ - self.used_names = tree.used_names - self.set_filename(filename) - self.numbers = itertools.count(1) - self.first_log = True - - def finish_tree(self, tree, filename): - """Some fixers need to maintain tree-wide state. - This method is called once, at the conclusion of tree fix-up. - - tree - the root node of the tree to be processed. - filename - the name of the file the tree came from. - """ - pass - - -class ConditionalFix(BaseFix): - """ Base class for fixers which not execute if an import is found. """ - - # This is the name of the import which, if found, will cause the test to be skipped - skip_on = None - - def start_tree(self, *args): - super(ConditionalFix, self).start_tree(*args) - self._should_skip = None - - def should_skip(self, node): - if self._should_skip is not None: - return self._should_skip - pkg = self.skip_on.split(".") - name = pkg[-1] - pkg = ".".join(pkg[:-1]) - self._should_skip = does_tree_import(pkg, name, node) - return self._should_skip diff --git a/Lib/lib2to3/fixer_util.py b/Lib/lib2to3/fixer_util.py deleted file mode 100644 index c2a3a47f..00000000 --- a/Lib/lib2to3/fixer_util.py +++ /dev/null @@ -1,453 +0,0 @@ -"""Utility functions, node construction macros, etc.""" -# Author: Collin Winter - -# Local imports -from .pgen2 import token -from .pytree import Leaf, Node -from .pygram import python_symbols as syms -from . import patcomp - - -########################################################### -### Common node-construction "macros" -########################################################### - -def KeywordArg(keyword, value): - return Node(syms.argument, - [keyword, Leaf(token.EQUAL, "="), value]) - -def LParen(): - return Leaf(token.LPAR, "(") - -def RParen(): - return Leaf(token.RPAR, ")") - -def Assign(target, source): - """Build an assignment statement""" - if not isinstance(target, list): - target = [target] - if not isinstance(source, list): - source.prefix = " " - source = [source] - - return Node(syms.atom, - target + [Leaf(token.EQUAL, "=", prefix=" ")] + source) - -def Name(name, prefix=None): - """Return a NAME leaf""" - return Leaf(token.NAME, name, prefix=prefix) - -def Attr(obj, attr): - """A node tuple for obj.attr""" - return [obj, Node(syms.trailer, [Dot(), attr])] - -def Comma(): - """A comma leaf""" - return Leaf(token.COMMA, ",") - -def Dot(): - """A period (.) leaf""" - return Leaf(token.DOT, ".") - -def ArgList(args, lparen=LParen(), rparen=RParen()): - """A parenthesised argument list, used by Call()""" - node = Node(syms.trailer, [lparen.clone(), rparen.clone()]) - if args: - node.insert_child(1, Node(syms.arglist, args)) - return node - -def Call(func_name, args=None, prefix=None): - """A function call""" - node = Node(syms.power, [func_name, ArgList(args)]) - if prefix is not None: - node.prefix = prefix - return node - -def Newline(): - """A newline literal""" - return Leaf(token.NEWLINE, "\n") - -def BlankLine(): - """A blank line""" - return Leaf(token.NEWLINE, "") - -def Number(n, prefix=None): - return Leaf(token.NUMBER, n, prefix=prefix) - -def Subscript(index_node): - """A numeric or string subscript""" - return Node(syms.trailer, [Leaf(token.LBRACE, "["), - index_node, - Leaf(token.RBRACE, "]")]) - -def String(string, prefix=None): - """A string leaf""" - return Leaf(token.STRING, string, prefix=prefix) - -def ListComp(xp, fp, it, test=None): - """A list comprehension of the form [xp for fp in it if test]. - - If test is None, the "if test" part is omitted. - """ - xp.prefix = "" - fp.prefix = " " - it.prefix = " " - for_leaf = Leaf(token.NAME, "for") - for_leaf.prefix = " " - in_leaf = Leaf(token.NAME, "in") - in_leaf.prefix = " " - inner_args = [for_leaf, fp, in_leaf, it] - if test: - test.prefix = " " - if_leaf = Leaf(token.NAME, "if") - if_leaf.prefix = " " - inner_args.append(Node(syms.comp_if, [if_leaf, test])) - inner = Node(syms.listmaker, [xp, Node(syms.comp_for, inner_args)]) - return Node(syms.atom, - [Leaf(token.LBRACE, "["), - inner, - Leaf(token.RBRACE, "]")]) - -def FromImport(package_name, name_leafs): - """ Return an import statement in the form: - from package import name_leafs""" - # XXX: May not handle dotted imports properly (eg, package_name='foo.bar') - #assert package_name == '.' or '.' not in package_name, "FromImport has "\ - # "not been tested with dotted package names -- use at your own "\ - # "peril!" - - for leaf in name_leafs: - # Pull the leaves out of their old tree - leaf.remove() - - children = [Leaf(token.NAME, "from"), - Leaf(token.NAME, package_name, prefix=" "), - Leaf(token.NAME, "import", prefix=" "), - Node(syms.import_as_names, name_leafs)] - imp = Node(syms.import_from, children) - return imp - -def ImportAndCall(node, results, names): - """Returns an import statement and calls a method - of the module: - - import module - module.name()""" - obj = results["obj"].clone() - if obj.type == syms.arglist: - newarglist = obj.clone() - else: - newarglist = Node(syms.arglist, [obj.clone()]) - after = results["after"] - if after: - after = [n.clone() for n in after] - new = Node(syms.power, - Attr(Name(names[0]), Name(names[1])) + - [Node(syms.trailer, - [results["lpar"].clone(), - newarglist, - results["rpar"].clone()])] + after) - new.prefix = node.prefix - return new - - -########################################################### -### Determine whether a node represents a given literal -########################################################### - -def is_tuple(node): - """Does the node represent a tuple literal?""" - if isinstance(node, Node) and node.children == [LParen(), RParen()]: - return True - return (isinstance(node, Node) - and len(node.children) == 3 - and isinstance(node.children[0], Leaf) - and isinstance(node.children[1], Node) - and isinstance(node.children[2], Leaf) - and node.children[0].value == "(" - and node.children[2].value == ")") - -def is_list(node): - """Does the node represent a list literal?""" - return (isinstance(node, Node) - and len(node.children) > 1 - and isinstance(node.children[0], Leaf) - and isinstance(node.children[-1], Leaf) - and node.children[0].value == "[" - and node.children[-1].value == "]") - - -########################################################### -### Misc -########################################################### - -def parenthesize(node): - return Node(syms.atom, [LParen(), node, RParen()]) - - -consuming_calls = {"sorted", "list", "set", "any", "all", "tuple", "sum", - "min", "max", "enumerate"} - -def attr_chain(obj, attr): - """Follow an attribute chain. - - If you have a chain of objects where a.foo -> b, b.foo-> c, etc, - use this to iterate over all objects in the chain. Iteration is - terminated by getattr(x, attr) is None. - - Args: - obj: the starting object - attr: the name of the chaining attribute - - Yields: - Each successive object in the chain. - """ - next = getattr(obj, attr) - while next: - yield next - next = getattr(next, attr) - -p0 = """for_stmt< 'for' any 'in' node=any ':' any* > - | comp_for< 'for' any 'in' node=any any* > - """ -p1 = """ -power< - ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' | - 'any' | 'all' | 'enumerate' | (any* trailer< '.' 'join' >) ) - trailer< '(' node=any ')' > - any* -> -""" -p2 = """ -power< - ( 'sorted' | 'enumerate' ) - trailer< '(' arglist ')' > - any* -> -""" -pats_built = False -def in_special_context(node): - """ Returns true if node is in an environment where all that is required - of it is being iterable (ie, it doesn't matter if it returns a list - or an iterator). - See test_map_nochange in test_fixers.py for some examples and tests. - """ - global p0, p1, p2, pats_built - if not pats_built: - p0 = patcomp.compile_pattern(p0) - p1 = patcomp.compile_pattern(p1) - p2 = patcomp.compile_pattern(p2) - pats_built = True - patterns = [p0, p1, p2] - for pattern, parent in zip(patterns, attr_chain(node, "parent")): - results = {} - if pattern.match(parent, results) and results["node"] is node: - return True - return False - -def is_probably_builtin(node): - """ - Check that something isn't an attribute or function name etc. - """ - prev = node.prev_sibling - if prev is not None and prev.type == token.DOT: - # Attribute lookup. - return False - parent = node.parent - if parent.type in (syms.funcdef, syms.classdef): - return False - if parent.type == syms.expr_stmt and parent.children[0] is node: - # Assignment. - return False - if parent.type == syms.parameters or \ - (parent.type == syms.typedargslist and ( - (prev is not None and prev.type == token.COMMA) or - parent.children[0] is node - )): - # The name of an argument. - return False - return True - -def find_indentation(node): - """Find the indentation of *node*.""" - while node is not None: - if node.type == syms.suite and len(node.children) > 2: - indent = node.children[1] - if indent.type == token.INDENT: - return indent.value - node = node.parent - return "" - -########################################################### -### The following functions are to find bindings in a suite -########################################################### - -def make_suite(node): - if node.type == syms.suite: - return node - node = node.clone() - parent, node.parent = node.parent, None - suite = Node(syms.suite, [node]) - suite.parent = parent - return suite - -def find_root(node): - """Find the top level namespace.""" - # Scamper up to the top level namespace - while node.type != syms.file_input: - node = node.parent - if not node: - raise ValueError("root found before file_input node was found.") - return node - -def does_tree_import(package, name, node): - """ Returns true if name is imported from package at the - top level of the tree which node belongs to. - To cover the case of an import like 'import foo', use - None for the package and 'foo' for the name. """ - binding = find_binding(name, find_root(node), package) - return bool(binding) - -def is_import(node): - """Returns true if the node is an import statement.""" - return node.type in (syms.import_name, syms.import_from) - -def touch_import(package, name, node): - """ Works like `does_tree_import` but adds an import statement - if it was not imported. """ - def is_import_stmt(node): - return (node.type == syms.simple_stmt and node.children and - is_import(node.children[0])) - - root = find_root(node) - - if does_tree_import(package, name, root): - return - - # figure out where to insert the new import. First try to find - # the first import and then skip to the last one. - insert_pos = offset = 0 - for idx, node in enumerate(root.children): - if not is_import_stmt(node): - continue - for offset, node2 in enumerate(root.children[idx:]): - if not is_import_stmt(node2): - break - insert_pos = idx + offset - break - - # if there are no imports where we can insert, find the docstring. - # if that also fails, we stick to the beginning of the file - if insert_pos == 0: - for idx, node in enumerate(root.children): - if (node.type == syms.simple_stmt and node.children and - node.children[0].type == token.STRING): - insert_pos = idx + 1 - break - - if package is None: - import_ = Node(syms.import_name, [ - Leaf(token.NAME, "import"), - Leaf(token.NAME, name, prefix=" ") - ]) - else: - import_ = FromImport(package, [Leaf(token.NAME, name, prefix=" ")]) - - children = [import_, Newline()] - root.insert_child(insert_pos, Node(syms.simple_stmt, children)) - - -_def_syms = {syms.classdef, syms.funcdef} -def find_binding(name, node, package=None): - """ Returns the node which binds variable name, otherwise None. - If optional argument package is supplied, only imports will - be returned. - See test cases for examples.""" - for child in node.children: - ret = None - if child.type == syms.for_stmt: - if _find(name, child.children[1]): - return child - n = find_binding(name, make_suite(child.children[-1]), package) - if n: ret = n - elif child.type in (syms.if_stmt, syms.while_stmt): - n = find_binding(name, make_suite(child.children[-1]), package) - if n: ret = n - elif child.type == syms.try_stmt: - n = find_binding(name, make_suite(child.children[2]), package) - if n: - ret = n - else: - for i, kid in enumerate(child.children[3:]): - if kid.type == token.COLON and kid.value == ":": - # i+3 is the colon, i+4 is the suite - n = find_binding(name, make_suite(child.children[i+4]), package) - if n: ret = n - elif child.type in _def_syms and child.children[1].value == name: - ret = child - elif _is_import_binding(child, name, package): - ret = child - elif child.type == syms.simple_stmt: - ret = find_binding(name, child, package) - elif child.type == syms.expr_stmt: - if _find(name, child.children[0]): - ret = child - - if ret: - if not package: - return ret - if is_import(ret): - return ret - return None - -_block_syms = {syms.funcdef, syms.classdef, syms.trailer} -def _find(name, node): - nodes = [node] - while nodes: - node = nodes.pop() - if node.type > 256 and node.type not in _block_syms: - nodes.extend(node.children) - elif node.type == token.NAME and node.value == name: - return node - return None - -def _is_import_binding(node, name, package=None): - """ Will return node if node will import name, or node - will import * from package. None is returned otherwise. - See test cases for examples. """ - - if node.type == syms.import_name and not package: - imp = node.children[1] - if imp.type == syms.dotted_as_names: - for child in imp.children: - if child.type == syms.dotted_as_name: - if child.children[2].value == name: - return node - elif child.type == token.NAME and child.value == name: - return node - elif imp.type == syms.dotted_as_name: - last = imp.children[-1] - if last.type == token.NAME and last.value == name: - return node - elif imp.type == token.NAME and imp.value == name: - return node - elif node.type == syms.import_from: - # str(...) is used to make life easier here, because - # from a.b import parses to ['import', ['a', '.', 'b'], ...] - if package and str(node.children[1]).strip() != package: - return None - n = node.children[3] - if package and _find("as", n): - # See test_from_import_as for explanation - return None - elif n.type == syms.import_as_names and _find(name, n): - return node - elif n.type == syms.import_as_name: - child = n.children[2] - if child.type == token.NAME and child.value == name: - return node - elif n.type == token.NAME and n.value == name: - return node - elif package and n.type == token.STAR: - return node - return None diff --git a/Lib/lib2to3/fixes/__init__.py b/Lib/lib2to3/fixes/__init__.py deleted file mode 100644 index b93054b3..00000000 --- a/Lib/lib2to3/fixes/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Dummy file to make this directory a package. diff --git a/Lib/lib2to3/fixes/fix_apply.py b/Lib/lib2to3/fixes/fix_apply.py deleted file mode 100644 index 6408582c..00000000 --- a/Lib/lib2to3/fixes/fix_apply.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for apply(). - -This converts apply(func, v, k) into (func)(*v, **k).""" - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Call, Comma, parenthesize - -class FixApply(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - power< 'apply' - trailer< - '(' - arglist< - (not argument - ')' - > - > - """ - - def transform(self, node, results): - syms = self.syms - assert results - func = results["func"] - args = results["args"] - kwds = results.get("kwds") - # I feel like we should be able to express this logic in the - # PATTERN above but I don't know how to do it so... - if args: - if (args.type == self.syms.argument and - args.children[0].value in {'**', '*'}): - return # Make no change. - if kwds and (kwds.type == self.syms.argument and - kwds.children[0].value == '**'): - return # Make no change. - prefix = node.prefix - func = func.clone() - if (func.type not in (token.NAME, syms.atom) and - (func.type != syms.power or - func.children[-2].type == token.DOUBLESTAR)): - # Need to parenthesize - func = parenthesize(func) - func.prefix = "" - args = args.clone() - args.prefix = "" - if kwds is not None: - kwds = kwds.clone() - kwds.prefix = "" - l_newargs = [pytree.Leaf(token.STAR, "*"), args] - if kwds is not None: - l_newargs.extend([Comma(), - pytree.Leaf(token.DOUBLESTAR, "**"), - kwds]) - l_newargs[-2].prefix = " " # that's the ** token - # XXX Sometimes we could be cleverer, e.g. apply(f, (x, y) + t) - # can be translated into f(x, y, *t) instead of f(*(x, y) + t) - #new = pytree.Node(syms.power, (func, ArgList(l_newargs))) - return Call(func, l_newargs, prefix=prefix) diff --git a/Lib/lib2to3/fixes/fix_asserts.py b/Lib/lib2to3/fixes/fix_asserts.py deleted file mode 100644 index 5bcec885..00000000 --- a/Lib/lib2to3/fixes/fix_asserts.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Fixer that replaces deprecated unittest method names.""" - -# Author: Ezio Melotti - -from ..fixer_base import BaseFix -from ..fixer_util import Name - -NAMES = dict( - assert_="assertTrue", - assertEquals="assertEqual", - assertNotEquals="assertNotEqual", - assertAlmostEquals="assertAlmostEqual", - assertNotAlmostEquals="assertNotAlmostEqual", - assertRegexpMatches="assertRegex", - assertRaisesRegexp="assertRaisesRegex", - failUnlessEqual="assertEqual", - failIfEqual="assertNotEqual", - failUnlessAlmostEqual="assertAlmostEqual", - failIfAlmostEqual="assertNotAlmostEqual", - failUnless="assertTrue", - failUnlessRaises="assertRaises", - failIf="assertFalse", -) - - -class FixAsserts(BaseFix): - - PATTERN = """ - power< any+ trailer< '.' meth=(%s)> any* > - """ % '|'.join(map(repr, NAMES)) - - def transform(self, node, results): - name = results["meth"][0] - name.replace(Name(NAMES[str(name)], prefix=name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_basestring.py b/Lib/lib2to3/fixes/fix_basestring.py deleted file mode 100644 index 5fe69a0f..00000000 --- a/Lib/lib2to3/fixes/fix_basestring.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Fixer for basestring -> str.""" -# Author: Christian Heimes - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -class FixBasestring(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = "'basestring'" - - def transform(self, node, results): - return Name("str", prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_buffer.py b/Lib/lib2to3/fixes/fix_buffer.py deleted file mode 100644 index f9a1958a..00000000 --- a/Lib/lib2to3/fixes/fix_buffer.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that changes buffer(...) into memoryview(...).""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - - -class FixBuffer(fixer_base.BaseFix): - BM_compatible = True - - explicit = True # The user must ask for this fixer - - PATTERN = """ - power< name='buffer' trailer< '(' [any] ')' > any* > - """ - - def transform(self, node, results): - name = results["name"] - name.replace(Name("memoryview", prefix=name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_dict.py b/Lib/lib2to3/fixes/fix_dict.py deleted file mode 100644 index d3655c9f..00000000 --- a/Lib/lib2to3/fixes/fix_dict.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for dict methods. - -d.keys() -> list(d.keys()) -d.items() -> list(d.items()) -d.values() -> list(d.values()) - -d.iterkeys() -> iter(d.keys()) -d.iteritems() -> iter(d.items()) -d.itervalues() -> iter(d.values()) - -d.viewkeys() -> d.keys() -d.viewitems() -> d.items() -d.viewvalues() -> d.values() - -Except in certain very specific contexts: the iter() can be dropped -when the context is list(), sorted(), iter() or for...in; the list() -can be dropped when the context is list() or sorted() (but not iter() -or for...in!). Special contexts that apply to both: list(), sorted(), tuple() -set(), any(), all(), sum(). - -Note: iter(d.keys()) could be written as iter(d) but since the -original d.iterkeys() was also redundant we don't fix this. And there -are (rare) contexts where it makes a difference (e.g. when passing it -as an argument to a function that introspects the argument). -""" - -# Local imports -from .. import pytree -from .. import patcomp -from .. import fixer_base -from ..fixer_util import Name, Call, Dot -from .. import fixer_util - - -iter_exempt = fixer_util.consuming_calls | {"iter"} - - -class FixDict(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - power< head=any+ - trailer< '.' method=('keys'|'items'|'values'| - 'iterkeys'|'iteritems'|'itervalues'| - 'viewkeys'|'viewitems'|'viewvalues') > - parens=trailer< '(' ')' > - tail=any* - > - """ - - def transform(self, node, results): - head = results["head"] - method = results["method"][0] # Extract node for method name - tail = results["tail"] - syms = self.syms - method_name = method.value - isiter = method_name.startswith("iter") - isview = method_name.startswith("view") - if isiter or isview: - method_name = method_name[4:] - assert method_name in ("keys", "items", "values"), repr(method) - head = [n.clone() for n in head] - tail = [n.clone() for n in tail] - special = not tail and self.in_special_context(node, isiter) - args = head + [pytree.Node(syms.trailer, - [Dot(), - Name(method_name, - prefix=method.prefix)]), - results["parens"].clone()] - new = pytree.Node(syms.power, args) - if not (special or isview): - new.prefix = "" - new = Call(Name("iter" if isiter else "list"), [new]) - if tail: - new = pytree.Node(syms.power, [new] + tail) - new.prefix = node.prefix - return new - - P1 = "power< func=NAME trailer< '(' node=any ')' > any* >" - p1 = patcomp.compile_pattern(P1) - - P2 = """for_stmt< 'for' any 'in' node=any ':' any* > - | comp_for< 'for' any 'in' node=any any* > - """ - p2 = patcomp.compile_pattern(P2) - - def in_special_context(self, node, isiter): - if node.parent is None: - return False - results = {} - if (node.parent.parent is not None and - self.p1.match(node.parent.parent, results) and - results["node"] is node): - if isiter: - # iter(d.iterkeys()) -> iter(d.keys()), etc. - return results["func"].value in iter_exempt - else: - # list(d.keys()) -> list(d.keys()), etc. - return results["func"].value in fixer_util.consuming_calls - if not isiter: - return False - # for ... in d.iterkeys() -> for ... in d.keys(), etc. - return self.p2.match(node.parent, results) and results["node"] is node diff --git a/Lib/lib2to3/fixes/fix_except.py b/Lib/lib2to3/fixes/fix_except.py deleted file mode 100644 index 49bd3d5a..00000000 --- a/Lib/lib2to3/fixes/fix_except.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Fixer for except statements with named exceptions. - -The following cases will be converted: - -- "except E, T:" where T is a name: - - except E as T: - -- "except E, T:" where T is not a name, tuple or list: - - except E as t: - T = t - - This is done because the target of an "except" clause must be a - name. - -- "except E, T:" where T is a tuple or list literal: - - except E as t: - T = t.args -""" -# Author: Collin Winter - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Assign, Attr, Name, is_tuple, is_list, syms - -def find_excepts(nodes): - for i, n in enumerate(nodes): - if n.type == syms.except_clause: - if n.children[0].value == 'except': - yield (n, nodes[i+2]) - -class FixExcept(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - try_stmt< 'try' ':' (simple_stmt | suite) - cleanup=(except_clause ':' (simple_stmt | suite))+ - tail=(['except' ':' (simple_stmt | suite)] - ['else' ':' (simple_stmt | suite)] - ['finally' ':' (simple_stmt | suite)]) > - """ - - def transform(self, node, results): - syms = self.syms - - tail = [n.clone() for n in results["tail"]] - - try_cleanup = [ch.clone() for ch in results["cleanup"]] - for except_clause, e_suite in find_excepts(try_cleanup): - if len(except_clause.children) == 4: - (E, comma, N) = except_clause.children[1:4] - comma.replace(Name("as", prefix=" ")) - - if N.type != token.NAME: - # Generate a new N for the except clause - new_N = Name(self.new_name(), prefix=" ") - target = N.clone() - target.prefix = "" - N.replace(new_N) - new_N = new_N.clone() - - # Insert "old_N = new_N" as the first statement in - # the except body. This loop skips leading whitespace - # and indents - #TODO(cwinter) suite-cleanup - suite_stmts = e_suite.children - for i, stmt in enumerate(suite_stmts): - if isinstance(stmt, pytree.Node): - break - - # The assignment is different if old_N is a tuple or list - # In that case, the assignment is old_N = new_N.args - if is_tuple(N) or is_list(N): - assign = Assign(target, Attr(new_N, Name('args'))) - else: - assign = Assign(target, new_N) - - #TODO(cwinter) stopgap until children becomes a smart list - for child in reversed(suite_stmts[:i]): - e_suite.insert_child(0, child) - e_suite.insert_child(i, assign) - elif N.prefix == "": - # No space after a comma is legal; no space after "as", - # not so much. - N.prefix = " " - - #TODO(cwinter) fix this when children becomes a smart list - children = [c.clone() for c in node.children[:3]] + try_cleanup + tail - return pytree.Node(node.type, children) diff --git a/Lib/lib2to3/fixes/fix_exec.py b/Lib/lib2to3/fixes/fix_exec.py deleted file mode 100644 index ab921ee8..00000000 --- a/Lib/lib2to3/fixes/fix_exec.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for exec. - -This converts usages of the exec statement into calls to a built-in -exec() function. - -exec code in ns1, ns2 -> exec(code, ns1, ns2) -""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Comma, Name, Call - - -class FixExec(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - exec_stmt< 'exec' a=any 'in' b=any [',' c=any] > - | - exec_stmt< 'exec' (not atom<'(' [any] ')'>) a=any > - """ - - def transform(self, node, results): - assert results - syms = self.syms - a = results["a"] - b = results.get("b") - c = results.get("c") - args = [a.clone()] - args[0].prefix = "" - if b is not None: - args.extend([Comma(), b.clone()]) - if c is not None: - args.extend([Comma(), c.clone()]) - - return Call(Name("exec"), args, prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_execfile.py b/Lib/lib2to3/fixes/fix_execfile.py deleted file mode 100644 index b6c786fd..00000000 --- a/Lib/lib2to3/fixes/fix_execfile.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for execfile. - -This converts usages of the execfile function into calls to the built-in -exec() function. -""" - -from .. import fixer_base -from ..fixer_util import (Comma, Name, Call, LParen, RParen, Dot, Node, - ArgList, String, syms) - - -class FixExecfile(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - power< 'execfile' trailer< '(' arglist< filename=any [',' globals=any [',' locals=any ] ] > ')' > > - | - power< 'execfile' trailer< '(' filename=any ')' > > - """ - - def transform(self, node, results): - assert results - filename = results["filename"] - globals = results.get("globals") - locals = results.get("locals") - - # Copy over the prefix from the right parentheses end of the execfile - # call. - execfile_paren = node.children[-1].children[-1].clone() - # Construct open().read(). - open_args = ArgList([filename.clone(), Comma(), String('"rb"', ' ')], - rparen=execfile_paren) - open_call = Node(syms.power, [Name("open"), open_args]) - read = [Node(syms.trailer, [Dot(), Name('read')]), - Node(syms.trailer, [LParen(), RParen()])] - open_expr = [open_call] + read - # Wrap the open call in a compile call. This is so the filename will be - # preserved in the execed code. - filename_arg = filename.clone() - filename_arg.prefix = " " - exec_str = String("'exec'", " ") - compile_args = open_expr + [Comma(), filename_arg, Comma(), exec_str] - compile_call = Call(Name("compile"), compile_args, "") - # Finally, replace the execfile call with an exec call. - args = [compile_call] - if globals is not None: - args.extend([Comma(), globals.clone()]) - if locals is not None: - args.extend([Comma(), locals.clone()]) - return Call(Name("exec"), args, prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_exitfunc.py b/Lib/lib2to3/fixes/fix_exitfunc.py deleted file mode 100644 index 2e47887a..00000000 --- a/Lib/lib2to3/fixes/fix_exitfunc.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -Convert use of sys.exitfunc to use the atexit module. -""" - -# Author: Benjamin Peterson - -from lib2to3 import pytree, fixer_base -from lib2to3.fixer_util import Name, Attr, Call, Comma, Newline, syms - - -class FixExitfunc(fixer_base.BaseFix): - keep_line_order = True - BM_compatible = True - - PATTERN = """ - ( - sys_import=import_name<'import' - ('sys' - | - dotted_as_names< (any ',')* 'sys' (',' any)* > - ) - > - | - expr_stmt< - power< 'sys' trailer< '.' 'exitfunc' > > - '=' func=any > - ) - """ - - def __init__(self, *args): - super(FixExitfunc, self).__init__(*args) - - def start_tree(self, tree, filename): - super(FixExitfunc, self).start_tree(tree, filename) - self.sys_import = None - - def transform(self, node, results): - # First, find the sys import. We'll just hope it's global scope. - if "sys_import" in results: - if self.sys_import is None: - self.sys_import = results["sys_import"] - return - - func = results["func"].clone() - func.prefix = "" - register = pytree.Node(syms.power, - Attr(Name("atexit"), Name("register")) - ) - call = Call(register, [func], node.prefix) - node.replace(call) - - if self.sys_import is None: - # That's interesting. - self.warning(node, "Can't find sys import; Please add an atexit " - "import at the top of your file.") - return - - # Now add an atexit import after the sys import. - names = self.sys_import.children[1] - if names.type == syms.dotted_as_names: - names.append_child(Comma()) - names.append_child(Name("atexit", " ")) - else: - containing_stmt = self.sys_import.parent - position = containing_stmt.children.index(self.sys_import) - stmt_container = containing_stmt.parent - new_import = pytree.Node(syms.import_name, - [Name("import"), Name("atexit", " ")] - ) - new = pytree.Node(syms.simple_stmt, [new_import]) - containing_stmt.insert_child(position + 1, Newline()) - containing_stmt.insert_child(position + 2, new) diff --git a/Lib/lib2to3/fixes/fix_filter.py b/Lib/lib2to3/fixes/fix_filter.py deleted file mode 100644 index 38e9078f..00000000 --- a/Lib/lib2to3/fixes/fix_filter.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that changes filter(F, X) into list(filter(F, X)). - -We avoid the transformation if the filter() call is directly contained -in iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or -for V in <>:. - -NOTE: This is still not correct if the original code was depending on -filter(F, X) to return a string if X is a string and a tuple if X is a -tuple. That would require type inference, which we don't do. Let -Python 2.6 figure it out. -""" - -# Local imports -from .. import fixer_base -from ..pytree import Node -from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, ListComp, in_special_context, parenthesize - - -class FixFilter(fixer_base.ConditionalFix): - BM_compatible = True - - PATTERN = """ - filter_lambda=power< - 'filter' - trailer< - '(' - arglist< - lambdef< 'lambda' - (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any - > - ',' - it=any - > - ')' - > - [extra_trailers=trailer*] - > - | - power< - 'filter' - trailer< '(' arglist< none='None' ',' seq=any > ')' > - [extra_trailers=trailer*] - > - | - power< - 'filter' - args=trailer< '(' [any] ')' > - [extra_trailers=trailer*] - > - """ - - skip_on = "future_builtins.filter" - - def transform(self, node, results): - if self.should_skip(node): - return - - trailers = [] - if 'extra_trailers' in results: - for t in results['extra_trailers']: - trailers.append(t.clone()) - - if "filter_lambda" in results: - xp = results.get("xp").clone() - if xp.type == syms.test: - xp.prefix = "" - xp = parenthesize(xp) - - new = ListComp(results.get("fp").clone(), - results.get("fp").clone(), - results.get("it").clone(), xp) - new = Node(syms.power, [new] + trailers, prefix="") - - elif "none" in results: - new = ListComp(Name("_f"), - Name("_f"), - results["seq"].clone(), - Name("_f")) - new = Node(syms.power, [new] + trailers, prefix="") - - else: - if in_special_context(node): - return None - - args = results['args'].clone() - new = Node(syms.power, [Name("filter"), args], prefix="") - new = Node(syms.power, [Name("list"), ArgList([new])] + trailers) - new.prefix = "" - new.prefix = node.prefix - return new diff --git a/Lib/lib2to3/fixes/fix_funcattrs.py b/Lib/lib2to3/fixes/fix_funcattrs.py deleted file mode 100644 index 67f3e18e..00000000 --- a/Lib/lib2to3/fixes/fix_funcattrs.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Fix function attribute names (f.func_x -> f.__x__).""" -# Author: Collin Winter - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - - -class FixFuncattrs(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - power< any+ trailer< '.' attr=('func_closure' | 'func_doc' | 'func_globals' - | 'func_name' | 'func_defaults' | 'func_code' - | 'func_dict') > any* > - """ - - def transform(self, node, results): - attr = results["attr"][0] - attr.replace(Name(("__%s__" % attr.value[5:]), - prefix=attr.prefix)) diff --git a/Lib/lib2to3/fixes/fix_future.py b/Lib/lib2to3/fixes/fix_future.py deleted file mode 100644 index fbcb86af..00000000 --- a/Lib/lib2to3/fixes/fix_future.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Remove __future__ imports - -from __future__ import foo is replaced with an empty line. -""" -# Author: Christian Heimes - -# Local imports -from .. import fixer_base -from ..fixer_util import BlankLine - -class FixFuture(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """import_from< 'from' module_name="__future__" 'import' any >""" - - # This should be run last -- some things check for the import - run_order = 10 - - def transform(self, node, results): - new = BlankLine() - new.prefix = node.prefix - return new diff --git a/Lib/lib2to3/fixes/fix_getcwdu.py b/Lib/lib2to3/fixes/fix_getcwdu.py deleted file mode 100644 index 087eaedc..00000000 --- a/Lib/lib2to3/fixes/fix_getcwdu.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Fixer that changes os.getcwdu() to os.getcwd(). -""" -# Author: Victor Stinner - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -class FixGetcwdu(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - power< 'os' trailer< dot='.' name='getcwdu' > any* > - """ - - def transform(self, node, results): - name = results["name"] - name.replace(Name("getcwd", prefix=name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_has_key.py b/Lib/lib2to3/fixes/fix_has_key.py deleted file mode 100644 index 439708c9..00000000 --- a/Lib/lib2to3/fixes/fix_has_key.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for has_key(). - -Calls to .has_key() methods are expressed in terms of the 'in' -operator: - - d.has_key(k) -> k in d - -CAVEATS: -1) While the primary target of this fixer is dict.has_key(), the - fixer will change any has_key() method call, regardless of its - class. - -2) Cases like this will not be converted: - - m = d.has_key - if m(k): - ... - - Only *calls* to has_key() are converted. While it is possible to - convert the above to something like - - m = d.__contains__ - if m(k): - ... - - this is currently not done. -""" - -# Local imports -from .. import pytree -from .. import fixer_base -from ..fixer_util import Name, parenthesize - - -class FixHasKey(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - anchor=power< - before=any+ - trailer< '.' 'has_key' > - trailer< - '(' - ( not(arglist | argument) arg=any ','> - ) - ')' - > - after=any* - > - | - negation=not_test< - 'not' - anchor=power< - before=any+ - trailer< '.' 'has_key' > - trailer< - '(' - ( not(arglist | argument) arg=any ','> - ) - ')' - > - > - > - """ - - def transform(self, node, results): - assert results - syms = self.syms - if (node.parent.type == syms.not_test and - self.pattern.match(node.parent)): - # Don't transform a node matching the first alternative of the - # pattern when its parent matches the second alternative - return None - negation = results.get("negation") - anchor = results["anchor"] - prefix = node.prefix - before = [n.clone() for n in results["before"]] - arg = results["arg"].clone() - after = results.get("after") - if after: - after = [n.clone() for n in after] - if arg.type in (syms.comparison, syms.not_test, syms.and_test, - syms.or_test, syms.test, syms.lambdef, syms.argument): - arg = parenthesize(arg) - if len(before) == 1: - before = before[0] - else: - before = pytree.Node(syms.power, before) - before.prefix = " " - n_op = Name("in", prefix=" ") - if negation: - n_not = Name("not", prefix=" ") - n_op = pytree.Node(syms.comp_op, (n_not, n_op)) - new = pytree.Node(syms.comparison, (arg, n_op, before)) - if after: - new = parenthesize(new) - new = pytree.Node(syms.power, (new,) + tuple(after)) - if node.parent.type in (syms.comparison, syms.expr, syms.xor_expr, - syms.and_expr, syms.shift_expr, - syms.arith_expr, syms.term, - syms.factor, syms.power): - new = parenthesize(new) - new.prefix = prefix - return new diff --git a/Lib/lib2to3/fixes/fix_idioms.py b/Lib/lib2to3/fixes/fix_idioms.py deleted file mode 100644 index 6905913d..00000000 --- a/Lib/lib2to3/fixes/fix_idioms.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from .. import fixer_base -from ..fixer_util import Call, Comma, Name, Node, BlankLine, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - explicit = True # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = node.prefix - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - - btwn = sort_stmt.prefix - # Keep any prefix lines between the sort_stmt and the list_call and - # shove them right after the sorted() call. - if "\n" in btwn: - if next_stmt: - # The new prefix should be everything from the sort_stmt's - # prefix up to the last newline, then the old prefix after a new - # line. - prefix_lines = (btwn.rpartition("\n")[0], next_stmt[0].prefix) - next_stmt[0].prefix = "\n".join(prefix_lines) - else: - assert list_call.parent - assert list_call.next_sibling is None - # Put a blank line after list_call and set its prefix. - end_line = BlankLine() - list_call.parent.append_child(end_line) - assert list_call.next_sibling is end_line - # The new prefix should be everything up to the first new line - # of sort_stmt's prefix. - end_line.prefix = btwn.rpartition("\n")[0] diff --git a/Lib/lib2to3/fixes/fix_import.py b/Lib/lib2to3/fixes/fix_import.py deleted file mode 100644 index 734ca294..00000000 --- a/Lib/lib2to3/fixes/fix_import.py +++ /dev/null @@ -1,99 +0,0 @@ -"""Fixer for import statements. -If spam is being imported from the local directory, this import: - from spam import eggs -Becomes: - from .spam import eggs - -And this import: - import spam -Becomes: - from . import spam -""" - -# Local imports -from .. import fixer_base -from os.path import dirname, join, exists, sep -from ..fixer_util import FromImport, syms, token - - -def traverse_imports(names): - """ - Walks over all the names imported in a dotted_as_names node. - """ - pending = [names] - while pending: - node = pending.pop() - if node.type == token.NAME: - yield node.value - elif node.type == syms.dotted_name: - yield "".join([ch.value for ch in node.children]) - elif node.type == syms.dotted_as_name: - pending.append(node.children[0]) - elif node.type == syms.dotted_as_names: - pending.extend(node.children[::-2]) - else: - raise AssertionError("unknown node type") - - -class FixImport(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - import_from< 'from' imp=any 'import' ['('] any [')'] > - | - import_name< 'import' imp=any > - """ - - def start_tree(self, tree, name): - super(FixImport, self).start_tree(tree, name) - self.skip = "absolute_import" in tree.future_features - - def transform(self, node, results): - if self.skip: - return - imp = results['imp'] - - if node.type == syms.import_from: - # Some imps are top-level (eg: 'import ham') - # some are first level (eg: 'import ham.eggs') - # some are third level (eg: 'import ham.eggs as spam') - # Hence, the loop - while not hasattr(imp, 'value'): - imp = imp.children[0] - if self.probably_a_local_import(imp.value): - imp.value = "." + imp.value - imp.changed() - else: - have_local = False - have_absolute = False - for mod_name in traverse_imports(imp): - if self.probably_a_local_import(mod_name): - have_local = True - else: - have_absolute = True - if have_absolute: - if have_local: - # We won't handle both sibling and absolute imports in the - # same statement at the moment. - self.warning(node, "absolute and local imports together") - return - - new = FromImport(".", [imp]) - new.prefix = node.prefix - return new - - def probably_a_local_import(self, imp_name): - if imp_name.startswith("."): - # Relative imports are certainly not local imports. - return False - imp_name = imp_name.split(".", 1)[0] - base_path = dirname(self.filename) - base_path = join(base_path, imp_name) - # If there is no __init__.py next to the file its not in a package - # so can't be a relative import. - if not exists(join(dirname(base_path), "__init__.py")): - return False - for ext in [".py", sep, ".pyc", ".so", ".sl", ".pyd"]: - if exists(base_path + ext): - return True - return False diff --git a/Lib/lib2to3/fixes/fix_imports.py b/Lib/lib2to3/fixes/fix_imports.py deleted file mode 100644 index aaf4f2f6..00000000 --- a/Lib/lib2to3/fixes/fix_imports.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Fix incompatible imports and module references.""" -# Authors: Collin Winter, Nick Edds - -# Local imports -from .. import fixer_base -from ..fixer_util import Name, attr_chain - -MAPPING = {'StringIO': 'io', - 'cStringIO': 'io', - 'cPickle': 'pickle', - '__builtin__' : 'builtins', - 'copy_reg': 'copyreg', - 'Queue': 'queue', - 'SocketServer': 'socketserver', - 'ConfigParser': 'configparser', - 'repr': 'reprlib', - 'FileDialog': 'tkinter.filedialog', - 'tkFileDialog': 'tkinter.filedialog', - 'SimpleDialog': 'tkinter.simpledialog', - 'tkSimpleDialog': 'tkinter.simpledialog', - 'tkColorChooser': 'tkinter.colorchooser', - 'tkCommonDialog': 'tkinter.commondialog', - 'Dialog': 'tkinter.dialog', - 'Tkdnd': 'tkinter.dnd', - 'tkFont': 'tkinter.font', - 'tkMessageBox': 'tkinter.messagebox', - 'ScrolledText': 'tkinter.scrolledtext', - 'Tkconstants': 'tkinter.constants', - 'Tix': 'tkinter.tix', - 'ttk': 'tkinter.ttk', - 'Tkinter': 'tkinter', - 'markupbase': '_markupbase', - '_winreg': 'winreg', - 'thread': '_thread', - 'dummy_thread': '_dummy_thread', - # anydbm and whichdb are handled by fix_imports2 - 'dbhash': 'dbm.bsd', - 'dumbdbm': 'dbm.dumb', - 'dbm': 'dbm.ndbm', - 'gdbm': 'dbm.gnu', - 'xmlrpclib': 'xmlrpc.client', - 'DocXMLRPCServer': 'xmlrpc.server', - 'SimpleXMLRPCServer': 'xmlrpc.server', - 'httplib': 'http.client', - 'htmlentitydefs' : 'html.entities', - 'HTMLParser' : 'html.parser', - 'Cookie': 'http.cookies', - 'cookielib': 'http.cookiejar', - 'BaseHTTPServer': 'http.server', - 'SimpleHTTPServer': 'http.server', - 'CGIHTTPServer': 'http.server', - #'test.test_support': 'test.support', - 'commands': 'subprocess', - 'UserString' : 'collections', - 'UserList' : 'collections', - 'urlparse' : 'urllib.parse', - 'robotparser' : 'urllib.robotparser', -} - - -def alternates(members): - return "(" + "|".join(map(repr, members)) + ")" - - -def build_pattern(mapping=MAPPING): - mod_list = ' | '.join(["module_name='%s'" % key for key in mapping]) - bare_names = alternates(mapping.keys()) - - yield """name_import=import_name< 'import' ((%s) | - multiple_imports=dotted_as_names< any* (%s) any* >) > - """ % (mod_list, mod_list) - yield """import_from< 'from' (%s) 'import' ['('] - ( any | import_as_name< any 'as' any > | - import_as_names< any* >) [')'] > - """ % mod_list - yield """import_name< 'import' (dotted_as_name< (%s) 'as' any > | - multiple_imports=dotted_as_names< - any* dotted_as_name< (%s) 'as' any > any* >) > - """ % (mod_list, mod_list) - - # Find usages of module members in code e.g. thread.foo(bar) - yield "power< bare_with_attr=(%s) trailer<'.' any > any* >" % bare_names - - -class FixImports(fixer_base.BaseFix): - - BM_compatible = True - keep_line_order = True - # This is overridden in fix_imports2. - mapping = MAPPING - - # We want to run this fixer late, so fix_import doesn't try to make stdlib - # renames into relative imports. - run_order = 6 - - def build_pattern(self): - return "|".join(build_pattern(self.mapping)) - - def compile_pattern(self): - # We override this, so MAPPING can be pragmatically altered and the - # changes will be reflected in PATTERN. - self.PATTERN = self.build_pattern() - super(FixImports, self).compile_pattern() - - # Don't match the node if it's within another match. - def match(self, node): - match = super(FixImports, self).match - results = match(node) - if results: - # Module usage could be in the trailer of an attribute lookup, so we - # might have nested matches when "bare_with_attr" is present. - if "bare_with_attr" not in results and \ - any(match(obj) for obj in attr_chain(node, "parent")): - return False - return results - return False - - def start_tree(self, tree, filename): - super(FixImports, self).start_tree(tree, filename) - self.replace = {} - - def transform(self, node, results): - import_mod = results.get("module_name") - if import_mod: - mod_name = import_mod.value - new_name = self.mapping[mod_name] - import_mod.replace(Name(new_name, prefix=import_mod.prefix)) - if "name_import" in results: - # If it's not a "from x import x, y" or "import x as y" import, - # marked its usage to be replaced. - self.replace[mod_name] = new_name - if "multiple_imports" in results: - # This is a nasty hack to fix multiple imports on a line (e.g., - # "import StringIO, urlparse"). The problem is that I can't - # figure out an easy way to make a pattern recognize the keys of - # MAPPING randomly sprinkled in an import statement. - results = self.match(node) - if results: - self.transform(node, results) - else: - # Replace usage of the module. - bare_name = results["bare_with_attr"][0] - new_name = self.replace.get(bare_name.value) - if new_name: - bare_name.replace(Name(new_name, prefix=bare_name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_imports2.py b/Lib/lib2to3/fixes/fix_imports2.py deleted file mode 100644 index 9a33c67b..00000000 --- a/Lib/lib2to3/fixes/fix_imports2.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Fix incompatible imports and module references that must be fixed after -fix_imports.""" -from . import fix_imports - - -MAPPING = { - 'whichdb': 'dbm', - 'anydbm': 'dbm', - } - - -class FixImports2(fix_imports.FixImports): - - run_order = 7 - - mapping = MAPPING diff --git a/Lib/lib2to3/fixes/fix_input.py b/Lib/lib2to3/fixes/fix_input.py deleted file mode 100644 index 9cf9a48c..00000000 --- a/Lib/lib2to3/fixes/fix_input.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Fixer that changes input(...) into eval(input(...)).""" -# Author: Andre Roberge - -# Local imports -from .. import fixer_base -from ..fixer_util import Call, Name -from .. import patcomp - - -context = patcomp.compile_pattern("power< 'eval' trailer< '(' any ')' > >") - - -class FixInput(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< 'input' args=trailer< '(' [any] ')' > > - """ - - def transform(self, node, results): - # If we're already wrapped in an eval() call, we're done. - if context.match(node.parent.parent): - return - - new = node.clone() - new.prefix = "" - return Call(Name("eval"), [new], prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_intern.py b/Lib/lib2to3/fixes/fix_intern.py deleted file mode 100644 index d7528430..00000000 --- a/Lib/lib2to3/fixes/fix_intern.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2006 Georg Brandl. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for intern(). - -intern(s) -> sys.intern(s)""" - -# Local imports -from .. import fixer_base -from ..fixer_util import ImportAndCall, touch_import - - -class FixIntern(fixer_base.BaseFix): - BM_compatible = True - order = "pre" - - PATTERN = """ - power< 'intern' - trailer< lpar='(' - ( not(arglist | argument) any ','> ) - rpar=')' > - after=any* - > - """ - - def transform(self, node, results): - if results: - # I feel like we should be able to express this logic in the - # PATTERN above but I don't know how to do it so... - obj = results['obj'] - if obj: - if (obj.type == self.syms.argument and - obj.children[0].value in {'**', '*'}): - return # Make no change. - names = ('sys', 'intern') - new = ImportAndCall(node, results, names) - touch_import(None, 'sys', node) - return new diff --git a/Lib/lib2to3/fixes/fix_isinstance.py b/Lib/lib2to3/fixes/fix_isinstance.py deleted file mode 100644 index bebb1de1..00000000 --- a/Lib/lib2to3/fixes/fix_isinstance.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2008 Armin Ronacher. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that cleans up a tuple argument to isinstance after the tokens -in it were fixed. This is mainly used to remove double occurrences of -tokens as a leftover of the long -> int / unicode -> str conversion. - -eg. isinstance(x, (int, long)) -> isinstance(x, (int, int)) - -> isinstance(x, int) -""" - -from .. import fixer_base -from ..fixer_util import token - - -class FixIsinstance(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< - 'isinstance' - trailer< '(' arglist< any ',' atom< '(' - args=testlist_gexp< any+ > - ')' > > ')' > - > - """ - - run_order = 6 - - def transform(self, node, results): - names_inserted = set() - testlist = results["args"] - args = testlist.children - new_args = [] - iterator = enumerate(args) - for idx, arg in iterator: - if arg.type == token.NAME and arg.value in names_inserted: - if idx < len(args) - 1 and args[idx + 1].type == token.COMMA: - next(iterator) - continue - else: - new_args.append(arg) - if arg.type == token.NAME: - names_inserted.add(arg.value) - if new_args and new_args[-1].type == token.COMMA: - del new_args[-1] - if len(new_args) == 1: - atom = testlist.parent - new_args[0].prefix = atom.prefix - atom.replace(new_args[0]) - else: - args[:] = new_args - node.changed() diff --git a/Lib/lib2to3/fixes/fix_itertools.py b/Lib/lib2to3/fixes/fix_itertools.py deleted file mode 100644 index 8e78d6c6..00000000 --- a/Lib/lib2to3/fixes/fix_itertools.py +++ /dev/null @@ -1,43 +0,0 @@ -""" Fixer for itertools.(imap|ifilter|izip) --> (map|filter|zip) and - itertools.ifilterfalse --> itertools.filterfalse (bugs 2360-2363) - - imports from itertools are fixed in fix_itertools_import.py - - If itertools is imported as something else (ie: import itertools as it; - it.izip(spam, eggs)) method calls will not get fixed. - """ - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -class FixItertools(fixer_base.BaseFix): - BM_compatible = True - it_funcs = "('imap'|'ifilter'|'izip'|'izip_longest'|'ifilterfalse')" - PATTERN = """ - power< it='itertools' - trailer< - dot='.' func=%(it_funcs)s > trailer< '(' [any] ')' > > - | - power< func=%(it_funcs)s trailer< '(' [any] ')' > > - """ %(locals()) - - # Needs to be run after fix_(map|zip|filter) - run_order = 6 - - def transform(self, node, results): - prefix = None - func = results['func'][0] - if ('it' in results and - func.value not in ('ifilterfalse', 'izip_longest')): - dot, it = (results['dot'], results['it']) - # Remove the 'itertools' - prefix = it.prefix - it.remove() - # Replace the node which contains ('.', 'function') with the - # function (to be consistent with the second part of the pattern) - dot.remove() - func.parent.replace(func) - - prefix = prefix or func.prefix - func.replace(Name(func.value[1:], prefix=prefix)) diff --git a/Lib/lib2to3/fixes/fix_itertools_imports.py b/Lib/lib2to3/fixes/fix_itertools_imports.py deleted file mode 100644 index 0ddbc7b8..00000000 --- a/Lib/lib2to3/fixes/fix_itertools_imports.py +++ /dev/null @@ -1,57 +0,0 @@ -""" Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """ - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import BlankLine, syms, token - - -class FixItertoolsImports(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - import_from< 'from' 'itertools' 'import' imports=any > - """ %(locals()) - - def transform(self, node, results): - imports = results['imports'] - if imports.type == syms.import_as_name or not imports.children: - children = [imports] - else: - children = imports.children - for child in children[::2]: - if child.type == token.NAME: - member = child.value - name_node = child - elif child.type == token.STAR: - # Just leave the import as is. - return - else: - assert child.type == syms.import_as_name - name_node = child.children[0] - member_name = name_node.value - if member_name in ('imap', 'izip', 'ifilter'): - child.value = None - child.remove() - elif member_name in ('ifilterfalse', 'izip_longest'): - node.changed() - name_node.value = ('filterfalse' if member_name[1] == 'f' - else 'zip_longest') - - # Make sure the import statement is still sane - children = imports.children[:] or [imports] - remove_comma = True - for child in children: - if remove_comma and child.type == token.COMMA: - child.remove() - else: - remove_comma ^= True - - while children and children[-1].type == token.COMMA: - children.pop().remove() - - # If there are no imports left, just get rid of the entire statement - if (not (imports.children or getattr(imports, 'value', None)) or - imports.parent is None): - p = node.prefix - node = BlankLine() - node.prefix = p - return node diff --git a/Lib/lib2to3/fixes/fix_long.py b/Lib/lib2to3/fixes/fix_long.py deleted file mode 100644 index f227c9f4..00000000 --- a/Lib/lib2to3/fixes/fix_long.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that turns 'long' into 'int' everywhere. -""" - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import is_probably_builtin - - -class FixLong(fixer_base.BaseFix): - BM_compatible = True - PATTERN = "'long'" - - def transform(self, node, results): - if is_probably_builtin(node): - node.value = "int" - node.changed() diff --git a/Lib/lib2to3/fixes/fix_map.py b/Lib/lib2to3/fixes/fix_map.py deleted file mode 100644 index 78cf81c6..00000000 --- a/Lib/lib2to3/fixes/fix_map.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that changes map(F, ...) into list(map(F, ...)) unless there -exists a 'from future_builtins import map' statement in the top-level -namespace. - -As a special case, map(None, X) is changed into list(X). (This is -necessary because the semantics are changed in this case -- the new -map(None, X) is equivalent to [(x,) for x in X].) - -We avoid the transformation (except for the special case mentioned -above) if the map() call is directly contained in iter(<>), list(<>), -tuple(<>), sorted(<>), ...join(<>), or for V in <>:. - -NOTE: This is still not correct if the original code was depending on -map(F, X, Y, ...) to go on until the longest argument is exhausted, -substituting None for missing values -- like zip(), it now stops as -soon as the shortest argument is exhausted. -""" - -# Local imports -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Name, ArgList, Call, ListComp, in_special_context -from ..pygram import python_symbols as syms -from ..pytree import Node - - -class FixMap(fixer_base.ConditionalFix): - BM_compatible = True - - PATTERN = """ - map_none=power< - 'map' - trailer< '(' arglist< 'None' ',' arg=any [','] > ')' > - [extra_trailers=trailer*] - > - | - map_lambda=power< - 'map' - trailer< - '(' - arglist< - lambdef< 'lambda' - (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any - > - ',' - it=any - > - ')' - > - [extra_trailers=trailer*] - > - | - power< - 'map' args=trailer< '(' [any] ')' > - [extra_trailers=trailer*] - > - """ - - skip_on = 'future_builtins.map' - - def transform(self, node, results): - if self.should_skip(node): - return - - trailers = [] - if 'extra_trailers' in results: - for t in results['extra_trailers']: - trailers.append(t.clone()) - - if node.parent.type == syms.simple_stmt: - self.warning(node, "You should use a for loop here") - new = node.clone() - new.prefix = "" - new = Call(Name("list"), [new]) - elif "map_lambda" in results: - new = ListComp(results["xp"].clone(), - results["fp"].clone(), - results["it"].clone()) - new = Node(syms.power, [new] + trailers, prefix="") - - else: - if "map_none" in results: - new = results["arg"].clone() - new.prefix = "" - else: - if "args" in results: - args = results["args"] - if args.type == syms.trailer and \ - args.children[1].type == syms.arglist and \ - args.children[1].children[0].type == token.NAME and \ - args.children[1].children[0].value == "None": - self.warning(node, "cannot convert map(None, ...) " - "with multiple arguments because map() " - "now truncates to the shortest sequence") - return - - new = Node(syms.power, [Name("map"), args.clone()]) - new.prefix = "" - - if in_special_context(node): - return None - - new = Node(syms.power, [Name("list"), ArgList([new])] + trailers) - new.prefix = "" - - new.prefix = node.prefix - return new diff --git a/Lib/lib2to3/fixes/fix_metaclass.py b/Lib/lib2to3/fixes/fix_metaclass.py deleted file mode 100644 index fe547b22..00000000 --- a/Lib/lib2to3/fixes/fix_metaclass.py +++ /dev/null @@ -1,228 +0,0 @@ -"""Fixer for __metaclass__ = X -> (metaclass=X) methods. - - The various forms of classef (inherits nothing, inherits once, inherits - many) don't parse the same in the CST so we look at ALL classes for - a __metaclass__ and if we find one normalize the inherits to all be - an arglist. - - For one-liner classes ('class X: pass') there is no indent/dedent so - we normalize those into having a suite. - - Moving the __metaclass__ into the classdef can also cause the class - body to be empty so there is some special casing for that as well. - - This fixer also tries very hard to keep original indenting and spacing - in all those corner cases. - -""" -# Author: Jack Diederich - -# Local imports -from .. import fixer_base -from ..pygram import token -from ..fixer_util import syms, Node, Leaf - - -def has_metaclass(parent): - """ we have to check the cls_node without changing it. - There are two possibilities: - 1) clsdef => suite => simple_stmt => expr_stmt => Leaf('__meta') - 2) clsdef => simple_stmt => expr_stmt => Leaf('__meta') - """ - for node in parent.children: - if node.type == syms.suite: - return has_metaclass(node) - elif node.type == syms.simple_stmt and node.children: - expr_node = node.children[0] - if expr_node.type == syms.expr_stmt and expr_node.children: - left_side = expr_node.children[0] - if isinstance(left_side, Leaf) and \ - left_side.value == '__metaclass__': - return True - return False - - -def fixup_parse_tree(cls_node): - """ one-line classes don't get a suite in the parse tree so we add - one to normalize the tree - """ - for node in cls_node.children: - if node.type == syms.suite: - # already in the preferred format, do nothing - return - - # !%@#! one-liners have no suite node, we have to fake one up - for i, node in enumerate(cls_node.children): - if node.type == token.COLON: - break - else: - raise ValueError("No class suite and no ':'!") - - # move everything into a suite node - suite = Node(syms.suite, []) - while cls_node.children[i+1:]: - move_node = cls_node.children[i+1] - suite.append_child(move_node.clone()) - move_node.remove() - cls_node.append_child(suite) - node = suite - - -def fixup_simple_stmt(parent, i, stmt_node): - """ if there is a semi-colon all the parts count as part of the same - simple_stmt. We just want the __metaclass__ part so we move - everything after the semi-colon into its own simple_stmt node - """ - for semi_ind, node in enumerate(stmt_node.children): - if node.type == token.SEMI: # *sigh* - break - else: - return - - node.remove() # kill the semicolon - new_expr = Node(syms.expr_stmt, []) - new_stmt = Node(syms.simple_stmt, [new_expr]) - while stmt_node.children[semi_ind:]: - move_node = stmt_node.children[semi_ind] - new_expr.append_child(move_node.clone()) - move_node.remove() - parent.insert_child(i, new_stmt) - new_leaf1 = new_stmt.children[0].children[0] - old_leaf1 = stmt_node.children[0].children[0] - new_leaf1.prefix = old_leaf1.prefix - - -def remove_trailing_newline(node): - if node.children and node.children[-1].type == token.NEWLINE: - node.children[-1].remove() - - -def find_metas(cls_node): - # find the suite node (Mmm, sweet nodes) - for node in cls_node.children: - if node.type == syms.suite: - break - else: - raise ValueError("No class suite!") - - # look for simple_stmt[ expr_stmt[ Leaf('__metaclass__') ] ] - for i, simple_node in list(enumerate(node.children)): - if simple_node.type == syms.simple_stmt and simple_node.children: - expr_node = simple_node.children[0] - if expr_node.type == syms.expr_stmt and expr_node.children: - # Check if the expr_node is a simple assignment. - left_node = expr_node.children[0] - if isinstance(left_node, Leaf) and \ - left_node.value == '__metaclass__': - # We found an assignment to __metaclass__. - fixup_simple_stmt(node, i, simple_node) - remove_trailing_newline(simple_node) - yield (node, i, simple_node) - - -def fixup_indent(suite): - """ If an INDENT is followed by a thing with a prefix then nuke the prefix - Otherwise we get in trouble when removing __metaclass__ at suite start - """ - kids = suite.children[::-1] - # find the first indent - while kids: - node = kids.pop() - if node.type == token.INDENT: - break - - # find the first Leaf - while kids: - node = kids.pop() - if isinstance(node, Leaf) and node.type != token.DEDENT: - if node.prefix: - node.prefix = '' - return - else: - kids.extend(node.children[::-1]) - - -class FixMetaclass(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - classdef - """ - - def transform(self, node, results): - if not has_metaclass(node): - return - - fixup_parse_tree(node) - - # find metaclasses, keep the last one - last_metaclass = None - for suite, i, stmt in find_metas(node): - last_metaclass = stmt - stmt.remove() - - text_type = node.children[0].type # always Leaf(nnn, 'class') - - # figure out what kind of classdef we have - if len(node.children) == 7: - # Node(classdef, ['class', 'name', '(', arglist, ')', ':', suite]) - # 0 1 2 3 4 5 6 - if node.children[3].type == syms.arglist: - arglist = node.children[3] - # Node(classdef, ['class', 'name', '(', 'Parent', ')', ':', suite]) - else: - parent = node.children[3].clone() - arglist = Node(syms.arglist, [parent]) - node.set_child(3, arglist) - elif len(node.children) == 6: - # Node(classdef, ['class', 'name', '(', ')', ':', suite]) - # 0 1 2 3 4 5 - arglist = Node(syms.arglist, []) - node.insert_child(3, arglist) - elif len(node.children) == 4: - # Node(classdef, ['class', 'name', ':', suite]) - # 0 1 2 3 - arglist = Node(syms.arglist, []) - node.insert_child(2, Leaf(token.RPAR, ')')) - node.insert_child(2, arglist) - node.insert_child(2, Leaf(token.LPAR, '(')) - else: - raise ValueError("Unexpected class definition") - - # now stick the metaclass in the arglist - meta_txt = last_metaclass.children[0].children[0] - meta_txt.value = 'metaclass' - orig_meta_prefix = meta_txt.prefix - - if arglist.children: - arglist.append_child(Leaf(token.COMMA, ',')) - meta_txt.prefix = ' ' - else: - meta_txt.prefix = '' - - # compact the expression "metaclass = Meta" -> "metaclass=Meta" - expr_stmt = last_metaclass.children[0] - assert expr_stmt.type == syms.expr_stmt - expr_stmt.children[1].prefix = '' - expr_stmt.children[2].prefix = '' - - arglist.append_child(last_metaclass) - - fixup_indent(suite) - - # check for empty suite - if not suite.children: - # one-liner that was just __metaclass_ - suite.remove() - pass_leaf = Leaf(text_type, 'pass') - pass_leaf.prefix = orig_meta_prefix - node.append_child(pass_leaf) - node.append_child(Leaf(token.NEWLINE, '\n')) - - elif len(suite.children) > 1 and \ - (suite.children[-2].type == token.INDENT and - suite.children[-1].type == token.DEDENT): - # there was only one line in the class body and it was __metaclass__ - pass_leaf = Leaf(text_type, 'pass') - suite.insert_child(-1, pass_leaf) - suite.insert_child(-1, Leaf(token.NEWLINE, '\n')) diff --git a/Lib/lib2to3/fixes/fix_methodattrs.py b/Lib/lib2to3/fixes/fix_methodattrs.py deleted file mode 100644 index 7f9004f0..00000000 --- a/Lib/lib2to3/fixes/fix_methodattrs.py +++ /dev/null @@ -1,24 +0,0 @@ -"""Fix bound method attributes (method.im_? -> method.__?__). -""" -# Author: Christian Heimes - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -MAP = { - "im_func" : "__func__", - "im_self" : "__self__", - "im_class" : "__self__.__class__" - } - -class FixMethodattrs(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< any+ trailer< '.' attr=('im_func' | 'im_self' | 'im_class') > any* > - """ - - def transform(self, node, results): - attr = results["attr"][0] - new = MAP[attr.value] - attr.replace(Name(new, prefix=attr.prefix)) diff --git a/Lib/lib2to3/fixes/fix_ne.py b/Lib/lib2to3/fixes/fix_ne.py deleted file mode 100644 index e3ee10f4..00000000 --- a/Lib/lib2to3/fixes/fix_ne.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that turns <> into !=.""" - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base - - -class FixNe(fixer_base.BaseFix): - # This is so simple that we don't need the pattern compiler. - - _accept_type = token.NOTEQUAL - - def match(self, node): - # Override - return node.value == "<>" - - def transform(self, node, results): - new = pytree.Leaf(token.NOTEQUAL, "!=", prefix=node.prefix) - return new diff --git a/Lib/lib2to3/fixes/fix_next.py b/Lib/lib2to3/fixes/fix_next.py deleted file mode 100644 index 9f6305e1..00000000 --- a/Lib/lib2to3/fixes/fix_next.py +++ /dev/null @@ -1,103 +0,0 @@ -"""Fixer for it.next() -> next(it), per PEP 3114.""" -# Author: Collin Winter - -# Things that currently aren't covered: -# - listcomp "next" names aren't warned -# - "with" statement targets aren't checked - -# Local imports -from ..pgen2 import token -from ..pygram import python_symbols as syms -from .. import fixer_base -from ..fixer_util import Name, Call, find_binding - -bind_warning = "Calls to builtin next() possibly shadowed by global binding" - - -class FixNext(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< base=any+ trailer< '.' attr='next' > trailer< '(' ')' > > - | - power< head=any+ trailer< '.' attr='next' > not trailer< '(' ')' > > - | - classdef< 'class' any+ ':' - suite< any* - funcdef< 'def' - name='next' - parameters< '(' NAME ')' > any+ > - any* > > - | - global=global_stmt< 'global' any* 'next' any* > - """ - - order = "pre" # Pre-order tree traversal - - def start_tree(self, tree, filename): - super(FixNext, self).start_tree(tree, filename) - - n = find_binding('next', tree) - if n: - self.warning(n, bind_warning) - self.shadowed_next = True - else: - self.shadowed_next = False - - def transform(self, node, results): - assert results - - base = results.get("base") - attr = results.get("attr") - name = results.get("name") - - if base: - if self.shadowed_next: - attr.replace(Name("__next__", prefix=attr.prefix)) - else: - base = [n.clone() for n in base] - base[0].prefix = "" - node.replace(Call(Name("next", prefix=node.prefix), base)) - elif name: - n = Name("__next__", prefix=name.prefix) - name.replace(n) - elif attr: - # We don't do this transformation if we're assigning to "x.next". - # Unfortunately, it doesn't seem possible to do this in PATTERN, - # so it's being done here. - if is_assign_target(node): - head = results["head"] - if "".join([str(n) for n in head]).strip() == '__builtin__': - self.warning(node, bind_warning) - return - attr.replace(Name("__next__")) - elif "global" in results: - self.warning(node, bind_warning) - self.shadowed_next = True - - -### The following functions help test if node is part of an assignment -### target. - -def is_assign_target(node): - assign = find_assign(node) - if assign is None: - return False - - for child in assign.children: - if child.type == token.EQUAL: - return False - elif is_subtree(child, node): - return True - return False - -def find_assign(node): - if node.type == syms.expr_stmt: - return node - if node.type == syms.simple_stmt or node.parent is None: - return None - return find_assign(node.parent) - -def is_subtree(root, node): - if root == node: - return True - return any(is_subtree(c, node) for c in root.children) diff --git a/Lib/lib2to3/fixes/fix_nonzero.py b/Lib/lib2to3/fixes/fix_nonzero.py deleted file mode 100644 index c2295969..00000000 --- a/Lib/lib2to3/fixes/fix_nonzero.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Fixer for __nonzero__ -> __bool__ methods.""" -# Author: Collin Winter - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -class FixNonzero(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - classdef< 'class' any+ ':' - suite< any* - funcdef< 'def' name='__nonzero__' - parameters< '(' NAME ')' > any+ > - any* > > - """ - - def transform(self, node, results): - name = results["name"] - new = Name("__bool__", prefix=name.prefix) - name.replace(new) diff --git a/Lib/lib2to3/fixes/fix_numliterals.py b/Lib/lib2to3/fixes/fix_numliterals.py deleted file mode 100644 index 79207d4a..00000000 --- a/Lib/lib2to3/fixes/fix_numliterals.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Fixer that turns 1L into 1, 0755 into 0o755. -""" -# Copyright 2007 Georg Brandl. -# Licensed to PSF under a Contributor Agreement. - -# Local imports -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Number - - -class FixNumliterals(fixer_base.BaseFix): - # This is so simple that we don't need the pattern compiler. - - _accept_type = token.NUMBER - - def match(self, node): - # Override - return (node.value.startswith("0") or node.value[-1] in "Ll") - - def transform(self, node, results): - val = node.value - if val[-1] in 'Ll': - val = val[:-1] - elif val.startswith('0') and val.isdigit() and len(set(val)) > 1: - val = "0o" + val[1:] - - return Number(val, prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_operator.py b/Lib/lib2to3/fixes/fix_operator.py deleted file mode 100644 index d303cd20..00000000 --- a/Lib/lib2to3/fixes/fix_operator.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Fixer for operator functions. - -operator.isCallable(obj) -> callable(obj) -operator.sequenceIncludes(obj) -> operator.contains(obj) -operator.isSequenceType(obj) -> isinstance(obj, collections.abc.Sequence) -operator.isMappingType(obj) -> isinstance(obj, collections.abc.Mapping) -operator.isNumberType(obj) -> isinstance(obj, numbers.Number) -operator.repeat(obj, n) -> operator.mul(obj, n) -operator.irepeat(obj, n) -> operator.imul(obj, n) -""" - -import collections.abc - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Name, String, touch_import - - -def invocation(s): - def dec(f): - f.invocation = s - return f - return dec - - -class FixOperator(fixer_base.BaseFix): - BM_compatible = True - order = "pre" - - methods = """ - method=('isCallable'|'sequenceIncludes' - |'isSequenceType'|'isMappingType'|'isNumberType' - |'repeat'|'irepeat') - """ - obj = "'(' obj=any ')'" - PATTERN = """ - power< module='operator' - trailer< '.' %(methods)s > trailer< %(obj)s > > - | - power< %(methods)s trailer< %(obj)s > > - """ % dict(methods=methods, obj=obj) - - def transform(self, node, results): - method = self._check_method(node, results) - if method is not None: - return method(node, results) - - @invocation("operator.contains(%s)") - def _sequenceIncludes(self, node, results): - return self._handle_rename(node, results, "contains") - - @invocation("callable(%s)") - def _isCallable(self, node, results): - obj = results["obj"] - return Call(Name("callable"), [obj.clone()], prefix=node.prefix) - - @invocation("operator.mul(%s)") - def _repeat(self, node, results): - return self._handle_rename(node, results, "mul") - - @invocation("operator.imul(%s)") - def _irepeat(self, node, results): - return self._handle_rename(node, results, "imul") - - @invocation("isinstance(%s, collections.abc.Sequence)") - def _isSequenceType(self, node, results): - return self._handle_type2abc(node, results, "collections.abc", "Sequence") - - @invocation("isinstance(%s, collections.abc.Mapping)") - def _isMappingType(self, node, results): - return self._handle_type2abc(node, results, "collections.abc", "Mapping") - - @invocation("isinstance(%s, numbers.Number)") - def _isNumberType(self, node, results): - return self._handle_type2abc(node, results, "numbers", "Number") - - def _handle_rename(self, node, results, name): - method = results["method"][0] - method.value = name - method.changed() - - def _handle_type2abc(self, node, results, module, abc): - touch_import(None, module, node) - obj = results["obj"] - args = [obj.clone(), String(", " + ".".join([module, abc]))] - return Call(Name("isinstance"), args, prefix=node.prefix) - - def _check_method(self, node, results): - method = getattr(self, "_" + results["method"][0].value) - if isinstance(method, collections.abc.Callable): - if "module" in results: - return method - else: - sub = (str(results["obj"]),) - invocation_str = method.invocation % sub - self.warning(node, "You should use '%s' here." % invocation_str) - return None diff --git a/Lib/lib2to3/fixes/fix_paren.py b/Lib/lib2to3/fixes/fix_paren.py deleted file mode 100644 index df3da5f5..00000000 --- a/Lib/lib2to3/fixes/fix_paren.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Fixer that adds parentheses where they are required - -This converts ``[x for x in 1, 2]`` to ``[x for x in (1, 2)]``.""" - -# By Taek Joo Kim and Benjamin Peterson - -# Local imports -from .. import fixer_base -from ..fixer_util import LParen, RParen - -# XXX This doesn't support nested for loops like [x for x in 1, 2 for x in 1, 2] -class FixParen(fixer_base.BaseFix): - BM_compatible = True - - PATTERN = """ - atom< ('[' | '(') - (listmaker< any - comp_for< - 'for' NAME 'in' - target=testlist_safe< any (',' any)+ [','] - > - [any] - > - > - | - testlist_gexp< any - comp_for< - 'for' NAME 'in' - target=testlist_safe< any (',' any)+ [','] - > - [any] - > - >) - (']' | ')') > - """ - - def transform(self, node, results): - target = results["target"] - - lparen = LParen() - lparen.prefix = target.prefix - target.prefix = "" # Make it hug the parentheses - target.insert_child(0, lparen) - target.append_child(RParen()) diff --git a/Lib/lib2to3/fixes/fix_print.py b/Lib/lib2to3/fixes/fix_print.py deleted file mode 100644 index 87803222..00000000 --- a/Lib/lib2to3/fixes/fix_print.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for print. - -Change: - 'print' into 'print()' - 'print ...' into 'print(...)' - 'print ... ,' into 'print(..., end=" ")' - 'print >>x, ...' into 'print(..., file=x)' - -No changes are applied if print_function is imported from __future__ - -""" - -# Local imports -from .. import patcomp -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Name, Call, Comma, String - - -parend_expr = patcomp.compile_pattern( - """atom< '(' [atom|STRING|NAME] ')' >""" - ) - - -class FixPrint(fixer_base.BaseFix): - - BM_compatible = True - - PATTERN = """ - simple_stmt< any* bare='print' any* > | print_stmt - """ - - def transform(self, node, results): - assert results - - bare_print = results.get("bare") - - if bare_print: - # Special-case print all by itself - bare_print.replace(Call(Name("print"), [], - prefix=bare_print.prefix)) - return - assert node.children[0] == Name("print") - args = node.children[1:] - if len(args) == 1 and parend_expr.match(args[0]): - # We don't want to keep sticking parens around an - # already-parenthesised expression. - return - - sep = end = file = None - if args and args[-1] == Comma(): - args = args[:-1] - end = " " - if args and args[0] == pytree.Leaf(token.RIGHTSHIFT, ">>"): - assert len(args) >= 2 - file = args[1].clone() - args = args[3:] # Strip a possible comma after the file expression - # Now synthesize a print(args, sep=..., end=..., file=...) node. - l_args = [arg.clone() for arg in args] - if l_args: - l_args[0].prefix = "" - if sep is not None or end is not None or file is not None: - if sep is not None: - self.add_kwarg(l_args, "sep", String(repr(sep))) - if end is not None: - self.add_kwarg(l_args, "end", String(repr(end))) - if file is not None: - self.add_kwarg(l_args, "file", file) - n_stmt = Call(Name("print"), l_args) - n_stmt.prefix = node.prefix - return n_stmt - - def add_kwarg(self, l_nodes, s_kwd, n_expr): - # XXX All this prefix-setting may lose comments (though rarely) - n_expr.prefix = "" - n_argument = pytree.Node(self.syms.argument, - (Name(s_kwd), - pytree.Leaf(token.EQUAL, "="), - n_expr)) - if l_nodes: - l_nodes.append(Comma()) - n_argument.prefix = " " - l_nodes.append(n_argument) diff --git a/Lib/lib2to3/fixes/fix_raise.py b/Lib/lib2to3/fixes/fix_raise.py deleted file mode 100644 index 05aa21e7..00000000 --- a/Lib/lib2to3/fixes/fix_raise.py +++ /dev/null @@ -1,90 +0,0 @@ -"""Fixer for 'raise E, V, T' - -raise -> raise -raise E -> raise E -raise E, V -> raise E(V) -raise E, V, T -> raise E(V).with_traceback(T) -raise E, None, T -> raise E.with_traceback(T) - -raise (((E, E'), E''), E'''), V -> raise E(V) -raise "foo", V, T -> warns about string exceptions - - -CAVEATS: -1) "raise E, V" will be incorrectly translated if V is an exception - instance. The correct Python 3 idiom is - - raise E from V - - but since we can't detect instance-hood by syntax alone and since - any client code would have to be changed as well, we don't automate - this. -""" -# Author: Collin Winter - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Name, Call, Attr, ArgList, is_tuple - -class FixRaise(fixer_base.BaseFix): - - BM_compatible = True - PATTERN = """ - raise_stmt< 'raise' exc=any [',' val=any [',' tb=any]] > - """ - - def transform(self, node, results): - syms = self.syms - - exc = results["exc"].clone() - if exc.type == token.STRING: - msg = "Python 3 does not support string exceptions" - self.cannot_convert(node, msg) - return - - # Python 2 supports - # raise ((((E1, E2), E3), E4), E5), V - # as a synonym for - # raise E1, V - # Since Python 3 will not support this, we recurse down any tuple - # literals, always taking the first element. - if is_tuple(exc): - while is_tuple(exc): - # exc.children[1:-1] is the unparenthesized tuple - # exc.children[1].children[0] is the first element of the tuple - exc = exc.children[1].children[0].clone() - exc.prefix = " " - - if "val" not in results: - # One-argument raise - new = pytree.Node(syms.raise_stmt, [Name("raise"), exc]) - new.prefix = node.prefix - return new - - val = results["val"].clone() - if is_tuple(val): - args = [c.clone() for c in val.children[1:-1]] - else: - val.prefix = "" - args = [val] - - if "tb" in results: - tb = results["tb"].clone() - tb.prefix = "" - - e = exc - # If there's a traceback and None is passed as the value, then don't - # add a call, since the user probably just wants to add a - # traceback. See issue #9661. - if val.type != token.NAME or val.value != "None": - e = Call(exc, args) - with_tb = Attr(e, Name('with_traceback')) + [ArgList([tb])] - new = pytree.Node(syms.simple_stmt, [Name("raise")] + with_tb) - new.prefix = node.prefix - return new - else: - return pytree.Node(syms.raise_stmt, - [Name("raise"), Call(exc, args)], - prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_raw_input.py b/Lib/lib2to3/fixes/fix_raw_input.py deleted file mode 100644 index a51bb694..00000000 --- a/Lib/lib2to3/fixes/fix_raw_input.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Fixer that changes raw_input(...) into input(...).""" -# Author: Andre Roberge - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -class FixRawInput(fixer_base.BaseFix): - - BM_compatible = True - PATTERN = """ - power< name='raw_input' trailer< '(' [any] ')' > any* > - """ - - def transform(self, node, results): - name = results["name"] - name.replace(Name("input", prefix=name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_reduce.py b/Lib/lib2to3/fixes/fix_reduce.py deleted file mode 100644 index 00e5aa1c..00000000 --- a/Lib/lib2to3/fixes/fix_reduce.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2008 Armin Ronacher. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for reduce(). - -Makes sure reduce() is imported from the functools module if reduce is -used in that module. -""" - -from lib2to3 import fixer_base -from lib2to3.fixer_util import touch_import - - - -class FixReduce(fixer_base.BaseFix): - - BM_compatible = True - order = "pre" - - PATTERN = """ - power< 'reduce' - trailer< '(' - arglist< ( - (not(argument) any ',' - not(argument - > - """ - - def transform(self, node, results): - touch_import('functools', 'reduce', node) diff --git a/Lib/lib2to3/fixes/fix_reload.py b/Lib/lib2to3/fixes/fix_reload.py deleted file mode 100644 index b3084113..00000000 --- a/Lib/lib2to3/fixes/fix_reload.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Fixer for reload(). - -reload(s) -> importlib.reload(s)""" - -# Local imports -from .. import fixer_base -from ..fixer_util import ImportAndCall, touch_import - - -class FixReload(fixer_base.BaseFix): - BM_compatible = True - order = "pre" - - PATTERN = """ - power< 'reload' - trailer< lpar='(' - ( not(arglist | argument) any ','> ) - rpar=')' > - after=any* - > - """ - - def transform(self, node, results): - if results: - # I feel like we should be able to express this logic in the - # PATTERN above but I don't know how to do it so... - obj = results['obj'] - if obj: - if (obj.type == self.syms.argument and - obj.children[0].value in {'**', '*'}): - return # Make no change. - names = ('importlib', 'reload') - new = ImportAndCall(node, results, names) - touch_import(None, 'importlib', node) - return new diff --git a/Lib/lib2to3/fixes/fix_renames.py b/Lib/lib2to3/fixes/fix_renames.py deleted file mode 100644 index c0e3705a..00000000 --- a/Lib/lib2to3/fixes/fix_renames.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Fix incompatible renames - -Fixes: - * sys.maxint -> sys.maxsize -""" -# Author: Christian Heimes -# based on Collin Winter's fix_import - -# Local imports -from .. import fixer_base -from ..fixer_util import Name, attr_chain - -MAPPING = {"sys": {"maxint" : "maxsize"}, - } -LOOKUP = {} - -def alternates(members): - return "(" + "|".join(map(repr, members)) + ")" - - -def build_pattern(): - #bare = set() - for module, replace in list(MAPPING.items()): - for old_attr, new_attr in list(replace.items()): - LOOKUP[(module, old_attr)] = new_attr - #bare.add(module) - #bare.add(old_attr) - #yield """ - # import_name< 'import' (module=%r - # | dotted_as_names< any* module=%r any* >) > - # """ % (module, module) - yield """ - import_from< 'from' module_name=%r 'import' - ( attr_name=%r | import_as_name< attr_name=%r 'as' any >) > - """ % (module, old_attr, old_attr) - yield """ - power< module_name=%r trailer< '.' attr_name=%r > any* > - """ % (module, old_attr) - #yield """bare_name=%s""" % alternates(bare) - - -class FixRenames(fixer_base.BaseFix): - BM_compatible = True - PATTERN = "|".join(build_pattern()) - - order = "pre" # Pre-order tree traversal - - # Don't match the node if it's within another match - def match(self, node): - match = super(FixRenames, self).match - results = match(node) - if results: - if any(match(obj) for obj in attr_chain(node, "parent")): - return False - return results - return False - - #def start_tree(self, tree, filename): - # super(FixRenames, self).start_tree(tree, filename) - # self.replace = {} - - def transform(self, node, results): - mod_name = results.get("module_name") - attr_name = results.get("attr_name") - #bare_name = results.get("bare_name") - #import_mod = results.get("module") - - if mod_name and attr_name: - new_attr = LOOKUP[(mod_name.value, attr_name.value)] - attr_name.replace(Name(new_attr, prefix=attr_name.prefix)) diff --git a/Lib/lib2to3/fixes/fix_repr.py b/Lib/lib2to3/fixes/fix_repr.py deleted file mode 100644 index 1150bb8b..00000000 --- a/Lib/lib2to3/fixes/fix_repr.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that transforms `xyzzy` into repr(xyzzy).""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Call, Name, parenthesize - - -class FixRepr(fixer_base.BaseFix): - - BM_compatible = True - PATTERN = """ - atom < '`' expr=any '`' > - """ - - def transform(self, node, results): - expr = results["expr"].clone() - - if expr.type == self.syms.testlist1: - expr = parenthesize(expr) - return Call(Name("repr"), [expr], prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_set_literal.py b/Lib/lib2to3/fixes/fix_set_literal.py deleted file mode 100644 index 762550cf..00000000 --- a/Lib/lib2to3/fixes/fix_set_literal.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Optional fixer to transform set() calls to set literals. -""" - -# Author: Benjamin Peterson - -from lib2to3 import fixer_base, pytree -from lib2to3.fixer_util import token, syms - - - -class FixSetLiteral(fixer_base.BaseFix): - - BM_compatible = True - explicit = True - - PATTERN = """power< 'set' trailer< '(' - (atom=atom< '[' (items=listmaker< any ((',' any)* [',']) > - | - single=any) ']' > - | - atom< '(' items=testlist_gexp< any ((',' any)* [',']) > ')' > - ) - ')' > > - """ - - def transform(self, node, results): - single = results.get("single") - if single: - # Make a fake listmaker - fake = pytree.Node(syms.listmaker, [single.clone()]) - single.replace(fake) - items = fake - else: - items = results["items"] - - # Build the contents of the literal - literal = [pytree.Leaf(token.LBRACE, "{")] - literal.extend(n.clone() for n in items.children) - literal.append(pytree.Leaf(token.RBRACE, "}")) - # Set the prefix of the right brace to that of the ')' or ']' - literal[-1].prefix = items.next_sibling.prefix - maker = pytree.Node(syms.dictsetmaker, literal) - maker.prefix = node.prefix - - # If the original was a one tuple, we need to remove the extra comma. - if len(maker.children) == 4: - n = maker.children[2] - n.remove() - maker.children[-1].prefix = n.prefix - - # Finally, replace the set call with our shiny new literal. - return maker diff --git a/Lib/lib2to3/fixes/fix_standarderror.py b/Lib/lib2to3/fixes/fix_standarderror.py deleted file mode 100644 index dc742167..00000000 --- a/Lib/lib2to3/fixes/fix_standarderror.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for StandardError -> Exception.""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - - -class FixStandarderror(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - 'StandardError' - """ - - def transform(self, node, results): - return Name("Exception", prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_sys_exc.py b/Lib/lib2to3/fixes/fix_sys_exc.py deleted file mode 100644 index f6039690..00000000 --- a/Lib/lib2to3/fixes/fix_sys_exc.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Fixer for sys.exc_{type, value, traceback} - -sys.exc_type -> sys.exc_info()[0] -sys.exc_value -> sys.exc_info()[1] -sys.exc_traceback -> sys.exc_info()[2] -""" - -# By Jeff Balogh and Benjamin Peterson - -# Local imports -from .. import fixer_base -from ..fixer_util import Attr, Call, Name, Number, Subscript, Node, syms - -class FixSysExc(fixer_base.BaseFix): - # This order matches the ordering of sys.exc_info(). - exc_info = ["exc_type", "exc_value", "exc_traceback"] - BM_compatible = True - PATTERN = """ - power< 'sys' trailer< dot='.' attribute=(%s) > > - """ % '|'.join("'%s'" % e for e in exc_info) - - def transform(self, node, results): - sys_attr = results["attribute"][0] - index = Number(self.exc_info.index(sys_attr.value)) - - call = Call(Name("exc_info"), prefix=sys_attr.prefix) - attr = Attr(Name("sys"), call) - attr[1].children[0].prefix = results["dot"].prefix - attr.append(Subscript(index)) - return Node(syms.power, attr, prefix=node.prefix) diff --git a/Lib/lib2to3/fixes/fix_throw.py b/Lib/lib2to3/fixes/fix_throw.py deleted file mode 100644 index aac29169..00000000 --- a/Lib/lib2to3/fixes/fix_throw.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Fixer for generator.throw(E, V, T). - -g.throw(E) -> g.throw(E) -g.throw(E, V) -> g.throw(E(V)) -g.throw(E, V, T) -> g.throw(E(V).with_traceback(T)) - -g.throw("foo"[, V[, T]]) will warn about string exceptions.""" -# Author: Collin Winter - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Name, Call, ArgList, Attr, is_tuple - -class FixThrow(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< any trailer< '.' 'throw' > - trailer< '(' args=arglist< exc=any ',' val=any [',' tb=any] > ')' > - > - | - power< any trailer< '.' 'throw' > trailer< '(' exc=any ')' > > - """ - - def transform(self, node, results): - syms = self.syms - - exc = results["exc"].clone() - if exc.type is token.STRING: - self.cannot_convert(node, "Python 3 does not support string exceptions") - return - - # Leave "g.throw(E)" alone - val = results.get("val") - if val is None: - return - - val = val.clone() - if is_tuple(val): - args = [c.clone() for c in val.children[1:-1]] - else: - val.prefix = "" - args = [val] - - throw_args = results["args"] - - if "tb" in results: - tb = results["tb"].clone() - tb.prefix = "" - - e = Call(exc, args) - with_tb = Attr(e, Name('with_traceback')) + [ArgList([tb])] - throw_args.replace(pytree.Node(syms.power, with_tb)) - else: - throw_args.replace(Call(exc, args)) diff --git a/Lib/lib2to3/fixes/fix_tuple_params.py b/Lib/lib2to3/fixes/fix_tuple_params.py deleted file mode 100644 index cad755ff..00000000 --- a/Lib/lib2to3/fixes/fix_tuple_params.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Fixer for function definitions with tuple parameters. - -def func(((a, b), c), d): - ... - - -> - -def func(x, d): - ((a, b), c) = x - ... - -It will also support lambdas: - - lambda (x, y): x + y -> lambda t: t[0] + t[1] - - # The parens are a syntax error in Python 3 - lambda (x): x + y -> lambda x: x + y -""" -# Author: Collin Winter - -# Local imports -from .. import pytree -from ..pgen2 import token -from .. import fixer_base -from ..fixer_util import Assign, Name, Newline, Number, Subscript, syms - -def is_docstring(stmt): - return isinstance(stmt, pytree.Node) and \ - stmt.children[0].type == token.STRING - -class FixTupleParams(fixer_base.BaseFix): - run_order = 4 #use a lower order since lambda is part of other - #patterns - BM_compatible = True - - PATTERN = """ - funcdef< 'def' any parameters< '(' args=any ')' > - ['->' any] ':' suite=any+ > - | - lambda= - lambdef< 'lambda' args=vfpdef< '(' inner=any ')' > - ':' body=any - > - """ - - def transform(self, node, results): - if "lambda" in results: - return self.transform_lambda(node, results) - - new_lines = [] - suite = results["suite"] - args = results["args"] - # This crap is so "def foo(...): x = 5; y = 7" is handled correctly. - # TODO(cwinter): suite-cleanup - if suite[0].children[1].type == token.INDENT: - start = 2 - indent = suite[0].children[1].value - end = Newline() - else: - start = 0 - indent = "; " - end = pytree.Leaf(token.INDENT, "") - - # We need access to self for new_name(), and making this a method - # doesn't feel right. Closing over self and new_lines makes the - # code below cleaner. - def handle_tuple(tuple_arg, add_prefix=False): - n = Name(self.new_name()) - arg = tuple_arg.clone() - arg.prefix = "" - stmt = Assign(arg, n.clone()) - if add_prefix: - n.prefix = " " - tuple_arg.replace(n) - new_lines.append(pytree.Node(syms.simple_stmt, - [stmt, end.clone()])) - - if args.type == syms.tfpdef: - handle_tuple(args) - elif args.type == syms.typedargslist: - for i, arg in enumerate(args.children): - if arg.type == syms.tfpdef: - # Without add_prefix, the emitted code is correct, - # just ugly. - handle_tuple(arg, add_prefix=(i > 0)) - - if not new_lines: - return - - # This isn't strictly necessary, but it plays nicely with other fixers. - # TODO(cwinter) get rid of this when children becomes a smart list - for line in new_lines: - line.parent = suite[0] - - # TODO(cwinter) suite-cleanup - after = start - if start == 0: - new_lines[0].prefix = " " - elif is_docstring(suite[0].children[start]): - new_lines[0].prefix = indent - after = start + 1 - - for line in new_lines: - line.parent = suite[0] - suite[0].children[after:after] = new_lines - for i in range(after+1, after+len(new_lines)+1): - suite[0].children[i].prefix = indent - suite[0].changed() - - def transform_lambda(self, node, results): - args = results["args"] - body = results["body"] - inner = simplify_args(results["inner"]) - - # Replace lambda ((((x)))): x with lambda x: x - if inner.type == token.NAME: - inner = inner.clone() - inner.prefix = " " - args.replace(inner) - return - - params = find_params(args) - to_index = map_to_index(params) - tup_name = self.new_name(tuple_name(params)) - - new_param = Name(tup_name, prefix=" ") - args.replace(new_param.clone()) - for n in body.post_order(): - if n.type == token.NAME and n.value in to_index: - subscripts = [c.clone() for c in to_index[n.value]] - new = pytree.Node(syms.power, - [new_param.clone()] + subscripts) - new.prefix = n.prefix - n.replace(new) - - -### Helper functions for transform_lambda() - -def simplify_args(node): - if node.type in (syms.vfplist, token.NAME): - return node - elif node.type == syms.vfpdef: - # These look like vfpdef< '(' x ')' > where x is NAME - # or another vfpdef instance (leading to recursion). - while node.type == syms.vfpdef: - node = node.children[1] - return node - raise RuntimeError("Received unexpected node %s" % node) - -def find_params(node): - if node.type == syms.vfpdef: - return find_params(node.children[1]) - elif node.type == token.NAME: - return node.value - return [find_params(c) for c in node.children if c.type != token.COMMA] - -def map_to_index(param_list, prefix=[], d=None): - if d is None: - d = {} - for i, obj in enumerate(param_list): - trailer = [Subscript(Number(str(i)))] - if isinstance(obj, list): - map_to_index(obj, trailer, d=d) - else: - d[obj] = prefix + trailer - return d - -def tuple_name(param_list): - l = [] - for obj in param_list: - if isinstance(obj, list): - l.append(tuple_name(obj)) - else: - l.append(obj) - return "_".join(l) diff --git a/Lib/lib2to3/fixes/fix_types.py b/Lib/lib2to3/fixes/fix_types.py deleted file mode 100644 index 67bf51f2..00000000 --- a/Lib/lib2to3/fixes/fix_types.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer for removing uses of the types module. - -These work for only the known names in the types module. The forms above -can include types. or not. ie, It is assumed the module is imported either as: - - import types - from types import ... # either * or specific types - -The import statements are not modified. - -There should be another fixer that handles at least the following constants: - - type([]) -> list - type(()) -> tuple - type('') -> str - -""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - -_TYPE_MAPPING = { - 'BooleanType' : 'bool', - 'BufferType' : 'memoryview', - 'ClassType' : 'type', - 'ComplexType' : 'complex', - 'DictType': 'dict', - 'DictionaryType' : 'dict', - 'EllipsisType' : 'type(Ellipsis)', - #'FileType' : 'io.IOBase', - 'FloatType': 'float', - 'IntType': 'int', - 'ListType': 'list', - 'LongType': 'int', - 'ObjectType' : 'object', - 'NoneType': 'type(None)', - 'NotImplementedType' : 'type(NotImplemented)', - 'SliceType' : 'slice', - 'StringType': 'bytes', # XXX ? - 'StringTypes' : '(str,)', # XXX ? - 'TupleType': 'tuple', - 'TypeType' : 'type', - 'UnicodeType': 'str', - 'XRangeType' : 'range', - } - -_pats = ["power< 'types' trailer< '.' name='%s' > >" % t for t in _TYPE_MAPPING] - -class FixTypes(fixer_base.BaseFix): - BM_compatible = True - PATTERN = '|'.join(_pats) - - def transform(self, node, results): - new_value = _TYPE_MAPPING.get(results["name"].value) - if new_value: - return Name(new_value, prefix=node.prefix) - return None diff --git a/Lib/lib2to3/fixes/fix_unicode.py b/Lib/lib2to3/fixes/fix_unicode.py deleted file mode 100644 index c7982c2b..00000000 --- a/Lib/lib2to3/fixes/fix_unicode.py +++ /dev/null @@ -1,42 +0,0 @@ -r"""Fixer for unicode. - -* Changes unicode to str and unichr to chr. - -* If "...\u..." is not unicode literal change it into "...\\u...". - -* Change u"..." into "...". - -""" - -from ..pgen2 import token -from .. import fixer_base - -_mapping = {"unichr" : "chr", "unicode" : "str"} - -class FixUnicode(fixer_base.BaseFix): - BM_compatible = True - PATTERN = "STRING | 'unicode' | 'unichr'" - - def start_tree(self, tree, filename): - super(FixUnicode, self).start_tree(tree, filename) - self.unicode_literals = 'unicode_literals' in tree.future_features - - def transform(self, node, results): - if node.type == token.NAME: - new = node.clone() - new.value = _mapping[node.value] - return new - elif node.type == token.STRING: - val = node.value - if not self.unicode_literals and val[0] in '\'"' and '\\' in val: - val = r'\\'.join([ - v.replace('\\u', r'\\u').replace('\\U', r'\\U') - for v in val.split(r'\\') - ]) - if val[0] in 'uU': - val = val[1:] - if val == node.value: - return node - new = node.clone() - new.value = val - return new diff --git a/Lib/lib2to3/fixes/fix_urllib.py b/Lib/lib2to3/fixes/fix_urllib.py deleted file mode 100644 index ab892bc5..00000000 --- a/Lib/lib2to3/fixes/fix_urllib.py +++ /dev/null @@ -1,196 +0,0 @@ -"""Fix changes imports of urllib which are now incompatible. - This is rather similar to fix_imports, but because of the more - complex nature of the fixing for urllib, it has its own fixer. -""" -# Author: Nick Edds - -# Local imports -from lib2to3.fixes.fix_imports import alternates, FixImports -from lib2to3.fixer_util import (Name, Comma, FromImport, Newline, - find_indentation, Node, syms) - -MAPPING = {"urllib": [ - ("urllib.request", - ["URLopener", "FancyURLopener", "urlretrieve", - "_urlopener", "urlopen", "urlcleanup", - "pathname2url", "url2pathname", "getproxies"]), - ("urllib.parse", - ["quote", "quote_plus", "unquote", "unquote_plus", - "urlencode", "splitattr", "splithost", "splitnport", - "splitpasswd", "splitport", "splitquery", "splittag", - "splittype", "splituser", "splitvalue", ]), - ("urllib.error", - ["ContentTooShortError"])], - "urllib2" : [ - ("urllib.request", - ["urlopen", "install_opener", "build_opener", - "Request", "OpenerDirector", "BaseHandler", - "HTTPDefaultErrorHandler", "HTTPRedirectHandler", - "HTTPCookieProcessor", "ProxyHandler", - "HTTPPasswordMgr", - "HTTPPasswordMgrWithDefaultRealm", - "AbstractBasicAuthHandler", - "HTTPBasicAuthHandler", "ProxyBasicAuthHandler", - "AbstractDigestAuthHandler", - "HTTPDigestAuthHandler", "ProxyDigestAuthHandler", - "HTTPHandler", "HTTPSHandler", "FileHandler", - "FTPHandler", "CacheFTPHandler", - "UnknownHandler"]), - ("urllib.error", - ["URLError", "HTTPError"]), - ] -} - -# Duplicate the url parsing functions for urllib2. -MAPPING["urllib2"].append(MAPPING["urllib"][1]) - - -def build_pattern(): - bare = set() - for old_module, changes in MAPPING.items(): - for change in changes: - new_module, members = change - members = alternates(members) - yield """import_name< 'import' (module=%r - | dotted_as_names< any* module=%r any* >) > - """ % (old_module, old_module) - yield """import_from< 'from' mod_member=%r 'import' - ( member=%s | import_as_name< member=%s 'as' any > | - import_as_names< members=any* >) > - """ % (old_module, members, members) - yield """import_from< 'from' module_star=%r 'import' star='*' > - """ % old_module - yield """import_name< 'import' - dotted_as_name< module_as=%r 'as' any > > - """ % old_module - # bare_with_attr has a special significance for FixImports.match(). - yield """power< bare_with_attr=%r trailer< '.' member=%s > any* > - """ % (old_module, members) - - -class FixUrllib(FixImports): - - def build_pattern(self): - return "|".join(build_pattern()) - - def transform_import(self, node, results): - """Transform for the basic import case. Replaces the old - import name with a comma separated list of its - replacements. - """ - import_mod = results.get("module") - pref = import_mod.prefix - - names = [] - - # create a Node list of the replacement modules - for name in MAPPING[import_mod.value][:-1]: - names.extend([Name(name[0], prefix=pref), Comma()]) - names.append(Name(MAPPING[import_mod.value][-1][0], prefix=pref)) - import_mod.replace(names) - - def transform_member(self, node, results): - """Transform for imports of specific module elements. Replaces - the module to be imported from with the appropriate new - module. - """ - mod_member = results.get("mod_member") - pref = mod_member.prefix - member = results.get("member") - - # Simple case with only a single member being imported - if member: - # this may be a list of length one, or just a node - if isinstance(member, list): - member = member[0] - new_name = None - for change in MAPPING[mod_member.value]: - if member.value in change[1]: - new_name = change[0] - break - if new_name: - mod_member.replace(Name(new_name, prefix=pref)) - else: - self.cannot_convert(node, "This is an invalid module element") - - # Multiple members being imported - else: - # a dictionary for replacements, order matters - modules = [] - mod_dict = {} - members = results["members"] - for member in members: - # we only care about the actual members - if member.type == syms.import_as_name: - as_name = member.children[2].value - member_name = member.children[0].value - else: - member_name = member.value - as_name = None - if member_name != ",": - for change in MAPPING[mod_member.value]: - if member_name in change[1]: - if change[0] not in mod_dict: - modules.append(change[0]) - mod_dict.setdefault(change[0], []).append(member) - - new_nodes = [] - indentation = find_indentation(node) - first = True - def handle_name(name, prefix): - if name.type == syms.import_as_name: - kids = [Name(name.children[0].value, prefix=prefix), - name.children[1].clone(), - name.children[2].clone()] - return [Node(syms.import_as_name, kids)] - return [Name(name.value, prefix=prefix)] - for module in modules: - elts = mod_dict[module] - names = [] - for elt in elts[:-1]: - names.extend(handle_name(elt, pref)) - names.append(Comma()) - names.extend(handle_name(elts[-1], pref)) - new = FromImport(module, names) - if not first or node.parent.prefix.endswith(indentation): - new.prefix = indentation - new_nodes.append(new) - first = False - if new_nodes: - nodes = [] - for new_node in new_nodes[:-1]: - nodes.extend([new_node, Newline()]) - nodes.append(new_nodes[-1]) - node.replace(nodes) - else: - self.cannot_convert(node, "All module elements are invalid") - - def transform_dot(self, node, results): - """Transform for calls to module members in code.""" - module_dot = results.get("bare_with_attr") - member = results.get("member") - new_name = None - if isinstance(member, list): - member = member[0] - for change in MAPPING[module_dot.value]: - if member.value in change[1]: - new_name = change[0] - break - if new_name: - module_dot.replace(Name(new_name, - prefix=module_dot.prefix)) - else: - self.cannot_convert(node, "This is an invalid module element") - - def transform(self, node, results): - if results.get("module"): - self.transform_import(node, results) - elif results.get("mod_member"): - self.transform_member(node, results) - elif results.get("bare_with_attr"): - self.transform_dot(node, results) - # Renaming and star imports are not supported for these modules. - elif results.get("module_star"): - self.cannot_convert(node, "Cannot handle star imports.") - elif results.get("module_as"): - self.cannot_convert(node, "This module is now multiple modules") diff --git a/Lib/lib2to3/fixes/fix_ws_comma.py b/Lib/lib2to3/fixes/fix_ws_comma.py deleted file mode 100644 index a54a376c..00000000 --- a/Lib/lib2to3/fixes/fix_ws_comma.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Fixer that changes 'a ,b' into 'a, b'. - -This also changes '{a :b}' into '{a: b}', but does not touch other -uses of colons. It does not touch other uses of whitespace. - -""" - -from .. import pytree -from ..pgen2 import token -from .. import fixer_base - -class FixWsComma(fixer_base.BaseFix): - - explicit = True # The user must ask for this fixers - - PATTERN = """ - any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]> - """ - - COMMA = pytree.Leaf(token.COMMA, ",") - COLON = pytree.Leaf(token.COLON, ":") - SEPS = (COMMA, COLON) - - def transform(self, node, results): - new = node.clone() - comma = False - for child in new.children: - if child in self.SEPS: - prefix = child.prefix - if prefix.isspace() and "\n" not in prefix: - child.prefix = "" - comma = True - else: - if comma: - prefix = child.prefix - if not prefix: - child.prefix = " " - comma = False - return new diff --git a/Lib/lib2to3/fixes/fix_xrange.py b/Lib/lib2to3/fixes/fix_xrange.py deleted file mode 100644 index 1e491e16..00000000 --- a/Lib/lib2to3/fixes/fix_xrange.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2007 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Fixer that changes xrange(...) into range(...).""" - -# Local imports -from .. import fixer_base -from ..fixer_util import Name, Call, consuming_calls -from .. import patcomp - - -class FixXrange(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< - (name='range'|name='xrange') trailer< '(' args=any ')' > - rest=any* > - """ - - def start_tree(self, tree, filename): - super(FixXrange, self).start_tree(tree, filename) - self.transformed_xranges = set() - - def finish_tree(self, tree, filename): - self.transformed_xranges = None - - def transform(self, node, results): - name = results["name"] - if name.value == "xrange": - return self.transform_xrange(node, results) - elif name.value == "range": - return self.transform_range(node, results) - else: - raise ValueError(repr(name)) - - def transform_xrange(self, node, results): - name = results["name"] - name.replace(Name("range", prefix=name.prefix)) - # This prevents the new range call from being wrapped in a list later. - self.transformed_xranges.add(id(node)) - - def transform_range(self, node, results): - if (id(node) not in self.transformed_xranges and - not self.in_special_context(node)): - range_call = Call(Name("range"), [results["args"].clone()]) - # Encase the range call in list(). - list_call = Call(Name("list"), [range_call], - prefix=node.prefix) - # Put things that were after the range() call after the list call. - for n in results["rest"]: - list_call.append_child(n) - return list_call - - P1 = "power< func=NAME trailer< '(' node=any ')' > any* >" - p1 = patcomp.compile_pattern(P1) - - P2 = """for_stmt< 'for' any 'in' node=any ':' any* > - | comp_for< 'for' any 'in' node=any any* > - | comparison< any 'in' node=any any*> - """ - p2 = patcomp.compile_pattern(P2) - - def in_special_context(self, node): - if node.parent is None: - return False - results = {} - if (node.parent.parent is not None and - self.p1.match(node.parent.parent, results) and - results["node"] is node): - # list(d.keys()) -> list(d.keys()), etc. - return results["func"].value in consuming_calls - # for ... in d.iterkeys() -> for ... in d.keys(), etc. - return self.p2.match(node.parent, results) and results["node"] is node diff --git a/Lib/lib2to3/fixes/fix_xreadlines.py b/Lib/lib2to3/fixes/fix_xreadlines.py deleted file mode 100644 index 3e3f71ab..00000000 --- a/Lib/lib2to3/fixes/fix_xreadlines.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Fix "for x in f.xreadlines()" -> "for x in f". - -This fixer will also convert g(f.xreadlines) into g(f.__iter__).""" -# Author: Collin Winter - -# Local imports -from .. import fixer_base -from ..fixer_util import Name - - -class FixXreadlines(fixer_base.BaseFix): - BM_compatible = True - PATTERN = """ - power< call=any+ trailer< '.' 'xreadlines' > trailer< '(' ')' > > - | - power< any+ trailer< '.' no_call='xreadlines' > > - """ - - def transform(self, node, results): - no_call = results.get("no_call") - - if no_call: - no_call.replace(Name("__iter__", prefix=no_call.prefix)) - else: - node.replace([x.clone() for x in results["call"]]) diff --git a/Lib/lib2to3/fixes/fix_zip.py b/Lib/lib2to3/fixes/fix_zip.py deleted file mode 100644 index 52c28df6..00000000 --- a/Lib/lib2to3/fixes/fix_zip.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Fixer that changes zip(seq0, seq1, ...) into list(zip(seq0, seq1, ...) -unless there exists a 'from future_builtins import zip' statement in the -top-level namespace. - -We avoid the transformation if the zip() call is directly contained in -iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or for V in <>:. -""" - -# Local imports -from .. import fixer_base -from ..pytree import Node -from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, in_special_context - - -class FixZip(fixer_base.ConditionalFix): - - BM_compatible = True - PATTERN = """ - power< 'zip' args=trailer< '(' [any] ')' > [trailers=trailer*] - > - """ - - skip_on = "future_builtins.zip" - - def transform(self, node, results): - if self.should_skip(node): - return - - if in_special_context(node): - return None - - args = results['args'].clone() - args.prefix = "" - - trailers = [] - if 'trailers' in results: - trailers = [n.clone() for n in results['trailers']] - for n in trailers: - n.prefix = "" - - new = Node(syms.power, [Name("zip"), args], prefix="") - new = Node(syms.power, [Name("list"), ArgList([new])] + trailers) - new.prefix = node.prefix - return new diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py deleted file mode 100644 index f2849fd6..00000000 --- a/Lib/lib2to3/main.py +++ /dev/null @@ -1,273 +0,0 @@ -""" -Main program for 2to3. -""" - -from __future__ import with_statement, print_function - -import sys -import os -import difflib -import logging -import shutil -import optparse - -from . import refactor - - -def diff_texts(a, b, filename): - """Return a unified diff of two strings.""" - a = a.splitlines() - b = b.splitlines() - return difflib.unified_diff(a, b, filename, filename, - "(original)", "(refactored)", - lineterm="") - - -class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): - """ - A refactoring tool that can avoid overwriting its input files. - Prints output to stdout. - - Output files can optionally be written to a different directory and or - have an extra file suffix appended to their name for use in situations - where you do not want to replace the input files. - """ - - def __init__(self, fixers, options, explicit, nobackups, show_diffs, - input_base_dir='', output_dir='', append_suffix=''): - """ - Args: - fixers: A list of fixers to import. - options: A dict with RefactoringTool configuration. - explicit: A list of fixers to run even if they are explicit. - nobackups: If true no backup '.bak' files will be created for those - files that are being refactored. - show_diffs: Should diffs of the refactoring be printed to stdout? - input_base_dir: The base directory for all input files. This class - will strip this path prefix off of filenames before substituting - it with output_dir. Only meaningful if output_dir is supplied. - All files processed by refactor() must start with this path. - output_dir: If supplied, all converted files will be written into - this directory tree instead of input_base_dir. - append_suffix: If supplied, all files output by this tool will have - this appended to their filename. Useful for changing .py to - .py3 for example by passing append_suffix='3'. - """ - self.nobackups = nobackups - self.show_diffs = show_diffs - if input_base_dir and not input_base_dir.endswith(os.sep): - input_base_dir += os.sep - self._input_base_dir = input_base_dir - self._output_dir = output_dir - self._append_suffix = append_suffix - super(StdoutRefactoringTool, self).__init__(fixers, options, explicit) - - def log_error(self, msg, *args, **kwargs): - self.errors.append((msg, args, kwargs)) - self.logger.error(msg, *args, **kwargs) - - def write_file(self, new_text, filename, old_text, encoding): - orig_filename = filename - if self._output_dir: - if filename.startswith(self._input_base_dir): - filename = os.path.join(self._output_dir, - filename[len(self._input_base_dir):]) - else: - raise ValueError('filename %s does not start with the ' - 'input_base_dir %s' % ( - filename, self._input_base_dir)) - if self._append_suffix: - filename += self._append_suffix - if orig_filename != filename: - output_dir = os.path.dirname(filename) - if not os.path.isdir(output_dir) and output_dir: - os.makedirs(output_dir) - self.log_message('Writing converted %s to %s.', orig_filename, - filename) - if not self.nobackups: - # Make backup - backup = filename + ".bak" - if os.path.lexists(backup): - try: - os.remove(backup) - except OSError: - self.log_message("Can't remove backup %s", backup) - try: - os.rename(filename, backup) - except OSError: - self.log_message("Can't rename %s to %s", filename, backup) - # Actually write the new file - write = super(StdoutRefactoringTool, self).write_file - write(new_text, filename, old_text, encoding) - if not self.nobackups: - shutil.copymode(backup, filename) - if orig_filename != filename: - # Preserve the file mode in the new output directory. - shutil.copymode(orig_filename, filename) - - def print_output(self, old, new, filename, equal): - if equal: - self.log_message("No changes to %s", filename) - else: - self.log_message("Refactored %s", filename) - if self.show_diffs: - diff_lines = diff_texts(old, new, filename) - try: - if self.output_lock is not None: - with self.output_lock: - for line in diff_lines: - print(line) - sys.stdout.flush() - else: - for line in diff_lines: - print(line) - except UnicodeEncodeError: - warn("couldn't encode %s's diff for your terminal" % - (filename,)) - return - -def warn(msg): - print("WARNING: %s" % (msg,), file=sys.stderr) - - -def main(fixer_pkg, args=None): - """Main program. - - Args: - fixer_pkg: the name of a package where the fixers are located. - args: optional; a list of command line arguments. If omitted, - sys.argv[1:] is used. - - Returns a suggested exit status (0, 1, 2). - """ - # Set up option parser - parser = optparse.OptionParser(usage="2to3 [options] file|dir ...") - parser.add_option("-d", "--doctests_only", action="store_true", - help="Fix up doctests only") - parser.add_option("-f", "--fix", action="append", default=[], - help="Each FIX specifies a transformation; default: all") - parser.add_option("-j", "--processes", action="store", default=1, - type="int", help="Run 2to3 concurrently") - parser.add_option("-x", "--nofix", action="append", default=[], - help="Prevent a transformation from being run") - parser.add_option("-l", "--list-fixes", action="store_true", - help="List available transformations") - parser.add_option("-p", "--print-function", action="store_true", - help="Modify the grammar so that print() is a function") - parser.add_option("-e", "--exec-function", action="store_true", - help="Modify the grammar so that exec() is a function") - parser.add_option("-v", "--verbose", action="store_true", - help="More verbose logging") - parser.add_option("--no-diffs", action="store_true", - help="Don't show diffs of the refactoring") - parser.add_option("-w", "--write", action="store_true", - help="Write back modified files") - parser.add_option("-n", "--nobackups", action="store_true", default=False, - help="Don't write backups for modified files") - parser.add_option("-o", "--output-dir", action="store", type="str", - default="", help="Put output files in this directory " - "instead of overwriting the input files. Requires -n.") - parser.add_option("-W", "--write-unchanged-files", action="store_true", - help="Also write files even if no changes were required" - " (useful with --output-dir); implies -w.") - parser.add_option("--add-suffix", action="store", type="str", default="", - help="Append this string to all output filenames." - " Requires -n if non-empty. " - "ex: --add-suffix='3' will generate .py3 files.") - - # Parse command line arguments - refactor_stdin = False - flags = {} - options, args = parser.parse_args(args) - if options.write_unchanged_files: - flags["write_unchanged_files"] = True - if not options.write: - warn("--write-unchanged-files/-W implies -w.") - options.write = True - # If we allowed these, the original files would be renamed to backup names - # but not replaced. - if options.output_dir and not options.nobackups: - parser.error("Can't use --output-dir/-o without -n.") - if options.add_suffix and not options.nobackups: - parser.error("Can't use --add-suffix without -n.") - - if not options.write and options.no_diffs: - warn("not writing files and not printing diffs; that's not very useful") - if not options.write and options.nobackups: - parser.error("Can't use -n without -w") - if options.list_fixes: - print("Available transformations for the -f/--fix option:") - for fixname in refactor.get_all_fix_names(fixer_pkg): - print(fixname) - if not args: - return 0 - if not args: - print("At least one file or directory argument required.", file=sys.stderr) - print("Use --help to show usage.", file=sys.stderr) - return 2 - if "-" in args: - refactor_stdin = True - if options.write: - print("Can't write to stdin.", file=sys.stderr) - return 2 - if options.print_function: - flags["print_function"] = True - - if options.exec_function: - flags["exec_function"] = True - - # Set up logging handler - level = logging.DEBUG if options.verbose else logging.INFO - logging.basicConfig(format='%(name)s: %(message)s', level=level) - logger = logging.getLogger('lib2to3.main') - - # Initialize the refactoring tool - avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg)) - unwanted_fixes = set(fixer_pkg + ".fix_" + fix for fix in options.nofix) - explicit = set() - if options.fix: - all_present = False - for fix in options.fix: - if fix == "all": - all_present = True - else: - explicit.add(fixer_pkg + ".fix_" + fix) - requested = avail_fixes.union(explicit) if all_present else explicit - else: - requested = avail_fixes.union(explicit) - fixer_names = requested.difference(unwanted_fixes) - input_base_dir = os.path.commonprefix(args) - if (input_base_dir and not input_base_dir.endswith(os.sep) - and not os.path.isdir(input_base_dir)): - # One or more similar names were passed, their directory is the base. - # os.path.commonprefix() is ignorant of path elements, this corrects - # for that weird API. - input_base_dir = os.path.dirname(input_base_dir) - if options.output_dir: - input_base_dir = input_base_dir.rstrip(os.sep) - logger.info('Output in %r will mirror the input directory %r layout.', - options.output_dir, input_base_dir) - rt = StdoutRefactoringTool( - sorted(fixer_names), flags, sorted(explicit), - options.nobackups, not options.no_diffs, - input_base_dir=input_base_dir, - output_dir=options.output_dir, - append_suffix=options.add_suffix) - - # Refactor all files and directories passed as arguments - if not rt.errors: - if refactor_stdin: - rt.refactor_stdin() - else: - try: - rt.refactor(args, options.write, options.doctests_only, - options.processes) - except refactor.MultiprocessingUnsupported: - assert options.processes > 1 - print("Sorry, -j isn't supported on this platform.", - file=sys.stderr) - return 1 - rt.summarize() - - # Return error status (0 if rt.errors is zero) - return int(bool(rt.errors)) diff --git a/Lib/lib2to3/patcomp.py b/Lib/lib2to3/patcomp.py deleted file mode 100644 index f57f4954..00000000 --- a/Lib/lib2to3/patcomp.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Pattern compiler. - -The grammar is taken from PatternGrammar.txt. - -The compiler compiles a pattern to a pytree.*Pattern instance. -""" - -__author__ = "Guido van Rossum " - -# Python imports -import io - -# Fairly local imports -from .pgen2 import driver, literals, token, tokenize, parse, grammar - -# Really local imports -from . import pytree -from . import pygram - - -class PatternSyntaxError(Exception): - pass - - -def tokenize_wrapper(input): - """Tokenizes a string suppressing significant whitespace.""" - skip = {token.NEWLINE, token.INDENT, token.DEDENT} - tokens = tokenize.generate_tokens(io.StringIO(input).readline) - for quintuple in tokens: - type, value, start, end, line_text = quintuple - if type not in skip: - yield quintuple - - -class PatternCompiler(object): - - def __init__(self, grammar_file=None): - """Initializer. - - Takes an optional alternative filename for the pattern grammar. - """ - if grammar_file is None: - self.grammar = pygram.pattern_grammar - self.syms = pygram.pattern_symbols - else: - self.grammar = driver.load_grammar(grammar_file) - self.syms = pygram.Symbols(self.grammar) - self.pygrammar = pygram.python_grammar - self.pysyms = pygram.python_symbols - self.driver = driver.Driver(self.grammar, convert=pattern_convert) - - def compile_pattern(self, input, debug=False, with_tree=False): - """Compiles a pattern string to a nested pytree.*Pattern object.""" - tokens = tokenize_wrapper(input) - try: - root = self.driver.parse_tokens(tokens, debug=debug) - except parse.ParseError as e: - raise PatternSyntaxError(str(e)) from None - if with_tree: - return self.compile_node(root), root - else: - return self.compile_node(root) - - def compile_node(self, node): - """Compiles a node, recursively. - - This is one big switch on the node type. - """ - # XXX Optimize certain Wildcard-containing-Wildcard patterns - # that can be merged - if node.type == self.syms.Matcher: - node = node.children[0] # Avoid unneeded recursion - - if node.type == self.syms.Alternatives: - # Skip the odd children since they are just '|' tokens - alts = [self.compile_node(ch) for ch in node.children[::2]] - if len(alts) == 1: - return alts[0] - p = pytree.WildcardPattern([[a] for a in alts], min=1, max=1) - return p.optimize() - - if node.type == self.syms.Alternative: - units = [self.compile_node(ch) for ch in node.children] - if len(units) == 1: - return units[0] - p = pytree.WildcardPattern([units], min=1, max=1) - return p.optimize() - - if node.type == self.syms.NegatedUnit: - pattern = self.compile_basic(node.children[1:]) - p = pytree.NegatedPattern(pattern) - return p.optimize() - - assert node.type == self.syms.Unit - - name = None - nodes = node.children - if len(nodes) >= 3 and nodes[1].type == token.EQUAL: - name = nodes[0].value - nodes = nodes[2:] - repeat = None - if len(nodes) >= 2 and nodes[-1].type == self.syms.Repeater: - repeat = nodes[-1] - nodes = nodes[:-1] - - # Now we've reduced it to: STRING | NAME [Details] | (...) | [...] - pattern = self.compile_basic(nodes, repeat) - - if repeat is not None: - assert repeat.type == self.syms.Repeater - children = repeat.children - child = children[0] - if child.type == token.STAR: - min = 0 - max = pytree.HUGE - elif child.type == token.PLUS: - min = 1 - max = pytree.HUGE - elif child.type == token.LBRACE: - assert children[-1].type == token.RBRACE - assert len(children) in (3, 5) - min = max = self.get_int(children[1]) - if len(children) == 5: - max = self.get_int(children[3]) - else: - assert False - if min != 1 or max != 1: - pattern = pattern.optimize() - pattern = pytree.WildcardPattern([[pattern]], min=min, max=max) - - if name is not None: - pattern.name = name - return pattern.optimize() - - def compile_basic(self, nodes, repeat=None): - # Compile STRING | NAME [Details] | (...) | [...] - assert len(nodes) >= 1 - node = nodes[0] - if node.type == token.STRING: - value = str(literals.evalString(node.value)) - return pytree.LeafPattern(_type_of_literal(value), value) - elif node.type == token.NAME: - value = node.value - if value.isupper(): - if value not in TOKEN_MAP: - raise PatternSyntaxError("Invalid token: %r" % value) - if nodes[1:]: - raise PatternSyntaxError("Can't have details for token") - return pytree.LeafPattern(TOKEN_MAP[value]) - else: - if value == "any": - type = None - elif not value.startswith("_"): - type = getattr(self.pysyms, value, None) - if type is None: - raise PatternSyntaxError("Invalid symbol: %r" % value) - if nodes[1:]: # Details present - content = [self.compile_node(nodes[1].children[1])] - else: - content = None - return pytree.NodePattern(type, content) - elif node.value == "(": - return self.compile_node(nodes[1]) - elif node.value == "[": - assert repeat is None - subpattern = self.compile_node(nodes[1]) - return pytree.WildcardPattern([[subpattern]], min=0, max=1) - assert False, node - - def get_int(self, node): - assert node.type == token.NUMBER - return int(node.value) - - -# Map named tokens to the type value for a LeafPattern -TOKEN_MAP = {"NAME": token.NAME, - "STRING": token.STRING, - "NUMBER": token.NUMBER, - "TOKEN": None} - - -def _type_of_literal(value): - if value[0].isalpha(): - return token.NAME - elif value in grammar.opmap: - return grammar.opmap[value] - else: - return None - - -def pattern_convert(grammar, raw_node_info): - """Converts raw node information to a Node or Leaf instance.""" - type, value, context, children = raw_node_info - if children or type in grammar.number2symbol: - return pytree.Node(type, children, context=context) - else: - return pytree.Leaf(type, value, context=context) - - -def compile_pattern(pattern): - return PatternCompiler().compile_pattern(pattern) diff --git a/Lib/lib2to3/pgen2/__init__.py b/Lib/lib2to3/pgen2/__init__.py deleted file mode 100644 index af390484..00000000 --- a/Lib/lib2to3/pgen2/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""The pgen2 package.""" diff --git a/Lib/lib2to3/pgen2/conv.py b/Lib/lib2to3/pgen2/conv.py deleted file mode 100644 index ed0cac53..00000000 --- a/Lib/lib2to3/pgen2/conv.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Convert graminit.[ch] spit out by pgen to Python code. - -Pgen is the Python parser generator. It is useful to quickly create a -parser from a grammar file in Python's grammar notation. But I don't -want my parsers to be written in C (yet), so I'm translating the -parsing tables to Python data structures and writing a Python parse -engine. - -Note that the token numbers are constants determined by the standard -Python tokenizer. The standard token module defines these numbers and -their names (the names are not used much). The token numbers are -hardcoded into the Python tokenizer and into pgen. A Python -implementation of the Python tokenizer is also available, in the -standard tokenize module. - -On the other hand, symbol numbers (representing the grammar's -non-terminals) are assigned by pgen based on the actual grammar -input. - -Note: this module is pretty much obsolete; the pgen module generates -equivalent grammar tables directly from the Grammar.txt input file -without having to invoke the Python pgen C program. - -""" - -# Python imports -import re - -# Local imports -from pgen2 import grammar, token - - -class Converter(grammar.Grammar): - """Grammar subclass that reads classic pgen output files. - - The run() method reads the tables as produced by the pgen parser - generator, typically contained in two C files, graminit.h and - graminit.c. The other methods are for internal use only. - - See the base class for more documentation. - - """ - - def run(self, graminit_h, graminit_c): - """Load the grammar tables from the text files written by pgen.""" - self.parse_graminit_h(graminit_h) - self.parse_graminit_c(graminit_c) - self.finish_off() - - def parse_graminit_h(self, filename): - """Parse the .h file written by pgen. (Internal) - - This file is a sequence of #define statements defining the - nonterminals of the grammar as numbers. We build two tables - mapping the numbers to names and back. - - """ - try: - f = open(filename) - except OSError as err: - print("Can't open %s: %s" % (filename, err)) - return False - self.symbol2number = {} - self.number2symbol = {} - lineno = 0 - for line in f: - lineno += 1 - mo = re.match(r"^#define\s+(\w+)\s+(\d+)$", line) - if not mo and line.strip(): - print("%s(%s): can't parse %s" % (filename, lineno, - line.strip())) - else: - symbol, number = mo.groups() - number = int(number) - assert symbol not in self.symbol2number - assert number not in self.number2symbol - self.symbol2number[symbol] = number - self.number2symbol[number] = symbol - return True - - def parse_graminit_c(self, filename): - """Parse the .c file written by pgen. (Internal) - - The file looks as follows. The first two lines are always this: - - #include "pgenheaders.h" - #include "grammar.h" - - After that come four blocks: - - 1) one or more state definitions - 2) a table defining dfas - 3) a table defining labels - 4) a struct defining the grammar - - A state definition has the following form: - - one or more arc arrays, each of the form: - static arc arcs__[] = { - {, }, - ... - }; - - followed by a state array, of the form: - static state states_[] = { - {, arcs__}, - ... - }; - - """ - try: - f = open(filename) - except OSError as err: - print("Can't open %s: %s" % (filename, err)) - return False - # The code below essentially uses f's iterator-ness! - lineno = 0 - - # Expect the two #include lines - lineno, line = lineno+1, next(f) - assert line == '#include "pgenheaders.h"\n', (lineno, line) - lineno, line = lineno+1, next(f) - assert line == '#include "grammar.h"\n', (lineno, line) - - # Parse the state definitions - lineno, line = lineno+1, next(f) - allarcs = {} - states = [] - while line.startswith("static arc "): - while line.startswith("static arc "): - mo = re.match(r"static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$", - line) - assert mo, (lineno, line) - n, m, k = list(map(int, mo.groups())) - arcs = [] - for _ in range(k): - lineno, line = lineno+1, next(f) - mo = re.match(r"\s+{(\d+), (\d+)},$", line) - assert mo, (lineno, line) - i, j = list(map(int, mo.groups())) - arcs.append((i, j)) - lineno, line = lineno+1, next(f) - assert line == "};\n", (lineno, line) - allarcs[(n, m)] = arcs - lineno, line = lineno+1, next(f) - mo = re.match(r"static state states_(\d+)\[(\d+)\] = {$", line) - assert mo, (lineno, line) - s, t = list(map(int, mo.groups())) - assert s == len(states), (lineno, line) - state = [] - for _ in range(t): - lineno, line = lineno+1, next(f) - mo = re.match(r"\s+{(\d+), arcs_(\d+)_(\d+)},$", line) - assert mo, (lineno, line) - k, n, m = list(map(int, mo.groups())) - arcs = allarcs[n, m] - assert k == len(arcs), (lineno, line) - state.append(arcs) - states.append(state) - lineno, line = lineno+1, next(f) - assert line == "};\n", (lineno, line) - lineno, line = lineno+1, next(f) - self.states = states - - # Parse the dfas - dfas = {} - mo = re.match(r"static dfa dfas\[(\d+)\] = {$", line) - assert mo, (lineno, line) - ndfas = int(mo.group(1)) - for i in range(ndfas): - lineno, line = lineno+1, next(f) - mo = re.match(r'\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$', - line) - assert mo, (lineno, line) - symbol = mo.group(2) - number, x, y, z = list(map(int, mo.group(1, 3, 4, 5))) - assert self.symbol2number[symbol] == number, (lineno, line) - assert self.number2symbol[number] == symbol, (lineno, line) - assert x == 0, (lineno, line) - state = states[z] - assert y == len(state), (lineno, line) - lineno, line = lineno+1, next(f) - mo = re.match(r'\s+("(?:\\\d\d\d)*")},$', line) - assert mo, (lineno, line) - first = {} - rawbitset = eval(mo.group(1)) - for i, c in enumerate(rawbitset): - byte = ord(c) - for j in range(8): - if byte & (1<= os.path.getmtime(b) - - -def load_packaged_grammar(package, grammar_source): - """Normally, loads a pickled grammar by doing - pkgutil.get_data(package, pickled_grammar) - where *pickled_grammar* is computed from *grammar_source* by adding the - Python version and using a ``.pickle`` extension. - - However, if *grammar_source* is an extant file, load_grammar(grammar_source) - is called instead. This facilitates using a packaged grammar file when needed - but preserves load_grammar's automatic regeneration behavior when possible. - - """ - if os.path.isfile(grammar_source): - return load_grammar(grammar_source) - pickled_name = _generate_pickle_name(os.path.basename(grammar_source)) - data = pkgutil.get_data(package, pickled_name) - g = grammar.Grammar() - g.loads(data) - return g - - -def main(*args): - """Main program, when run as a script: produce grammar pickle files. - - Calls load_grammar for each argument, a path to a grammar text file. - """ - if not args: - args = sys.argv[1:] - logging.basicConfig(level=logging.INFO, stream=sys.stdout, - format='%(message)s') - for gt in args: - load_grammar(gt, save=True, force=True) - return True - -if __name__ == "__main__": - sys.exit(int(not main())) diff --git a/Lib/lib2to3/pgen2/grammar.py b/Lib/lib2to3/pgen2/grammar.py deleted file mode 100644 index 5d550aeb..00000000 --- a/Lib/lib2to3/pgen2/grammar.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""This module defines the data structures used to represent a grammar. - -These are a bit arcane because they are derived from the data -structures used by Python's 'pgen' parser generator. - -There's also a table here mapping operators to their names in the -token module; the Python tokenize module reports all operators as the -fallback token code OP, but the parser needs the actual token code. - -""" - -# Python imports -import pickle - -# Local imports -from . import token - - -class Grammar(object): - """Pgen parsing tables conversion class. - - Once initialized, this class supplies the grammar tables for the - parsing engine implemented by parse.py. The parsing engine - accesses the instance variables directly. The class here does not - provide initialization of the tables; several subclasses exist to - do this (see the conv and pgen modules). - - The load() method reads the tables from a pickle file, which is - much faster than the other ways offered by subclasses. The pickle - file is written by calling dump() (after loading the grammar - tables using a subclass). The report() method prints a readable - representation of the tables to stdout, for debugging. - - The instance variables are as follows: - - symbol2number -- a dict mapping symbol names to numbers. Symbol - numbers are always 256 or higher, to distinguish - them from token numbers, which are between 0 and - 255 (inclusive). - - number2symbol -- a dict mapping numbers to symbol names; - these two are each other's inverse. - - states -- a list of DFAs, where each DFA is a list of - states, each state is a list of arcs, and each - arc is a (i, j) pair where i is a label and j is - a state number. The DFA number is the index into - this list. (This name is slightly confusing.) - Final states are represented by a special arc of - the form (0, j) where j is its own state number. - - dfas -- a dict mapping symbol numbers to (DFA, first) - pairs, where DFA is an item from the states list - above, and first is a set of tokens that can - begin this grammar rule (represented by a dict - whose values are always 1). - - labels -- a list of (x, y) pairs where x is either a token - number or a symbol number, and y is either None - or a string; the strings are keywords. The label - number is the index in this list; label numbers - are used to mark state transitions (arcs) in the - DFAs. - - start -- the number of the grammar's start symbol. - - keywords -- a dict mapping keyword strings to arc labels. - - tokens -- a dict mapping token numbers to arc labels. - - """ - - def __init__(self): - self.symbol2number = {} - self.number2symbol = {} - self.states = [] - self.dfas = {} - self.labels = [(0, "EMPTY")] - self.keywords = {} - self.tokens = {} - self.symbol2label = {} - self.start = 256 - - def dump(self, filename): - """Dump the grammar tables to a pickle file.""" - with open(filename, "wb") as f: - pickle.dump(self.__dict__, f, pickle.HIGHEST_PROTOCOL) - - def load(self, filename): - """Load the grammar tables from a pickle file.""" - with open(filename, "rb") as f: - d = pickle.load(f) - self.__dict__.update(d) - - def loads(self, pkl): - """Load the grammar tables from a pickle bytes object.""" - self.__dict__.update(pickle.loads(pkl)) - - def copy(self): - """ - Copy the grammar. - """ - new = self.__class__() - for dict_attr in ("symbol2number", "number2symbol", "dfas", "keywords", - "tokens", "symbol2label"): - setattr(new, dict_attr, getattr(self, dict_attr).copy()) - new.labels = self.labels[:] - new.states = self.states[:] - new.start = self.start - return new - - def report(self): - """Dump the grammar tables to standard output, for debugging.""" - from pprint import pprint - print("s2n") - pprint(self.symbol2number) - print("n2s") - pprint(self.number2symbol) - print("states") - pprint(self.states) - print("dfas") - pprint(self.dfas) - print("labels") - pprint(self.labels) - print("start", self.start) - - -# Map from operator to number (since tokenize doesn't do this) - -opmap_raw = """ -( LPAR -) RPAR -[ LSQB -] RSQB -: COLON -, COMMA -; SEMI -+ PLUS -- MINUS -* STAR -/ SLASH -| VBAR -& AMPER -< LESS -> GREATER -= EQUAL -. DOT -% PERCENT -` BACKQUOTE -{ LBRACE -} RBRACE -@ AT -@= ATEQUAL -== EQEQUAL -!= NOTEQUAL -<> NOTEQUAL -<= LESSEQUAL ->= GREATEREQUAL -~ TILDE -^ CIRCUMFLEX -<< LEFTSHIFT ->> RIGHTSHIFT -** DOUBLESTAR -+= PLUSEQUAL --= MINEQUAL -*= STAREQUAL -/= SLASHEQUAL -%= PERCENTEQUAL -&= AMPEREQUAL -|= VBAREQUAL -^= CIRCUMFLEXEQUAL -<<= LEFTSHIFTEQUAL ->>= RIGHTSHIFTEQUAL -**= DOUBLESTAREQUAL -// DOUBLESLASH -//= DOUBLESLASHEQUAL --> RARROW -:= COLONEQUAL -""" - -opmap = {} -for line in opmap_raw.splitlines(): - if line: - op, name = line.split() - opmap[op] = getattr(token, name) -del line, op, name diff --git a/Lib/lib2to3/pgen2/literals.py b/Lib/lib2to3/pgen2/literals.py deleted file mode 100644 index b9b63e6e..00000000 --- a/Lib/lib2to3/pgen2/literals.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Safely evaluate Python string literals without using eval().""" - -import re - -simple_escapes = {"a": "\a", - "b": "\b", - "f": "\f", - "n": "\n", - "r": "\r", - "t": "\t", - "v": "\v", - "'": "'", - '"': '"', - "\\": "\\"} - -def escape(m): - all, tail = m.group(0, 1) - assert all.startswith("\\") - esc = simple_escapes.get(tail) - if esc is not None: - return esc - if tail.startswith("x"): - hexes = tail[1:] - if len(hexes) < 2: - raise ValueError("invalid hex string escape ('\\%s')" % tail) - try: - i = int(hexes, 16) - except ValueError: - raise ValueError("invalid hex string escape ('\\%s')" % tail) from None - else: - try: - i = int(tail, 8) - except ValueError: - raise ValueError("invalid octal string escape ('\\%s')" % tail) from None - return chr(i) - -def evalString(s): - assert s.startswith("'") or s.startswith('"'), repr(s[:1]) - q = s[0] - if s[:3] == q*3: - q = q*3 - assert s.endswith(q), repr(s[-len(q):]) - assert len(s) >= 2*len(q) - s = s[len(q):-len(q)] - return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s) - -def test(): - for i in range(256): - c = chr(i) - s = repr(c) - e = evalString(s) - if e != c: - print(i, c, s, e) - - -if __name__ == "__main__": - test() diff --git a/Lib/lib2to3/pgen2/parse.py b/Lib/lib2to3/pgen2/parse.py deleted file mode 100644 index cf3fcf7e..00000000 --- a/Lib/lib2to3/pgen2/parse.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Parser engine for the grammar tables generated by pgen. - -The grammar table must be loaded first. - -See Parser/parser.c in the Python distribution for additional info on -how this parsing engine works. - -""" - -# Local imports -from . import token - -class ParseError(Exception): - """Exception to signal the parser is stuck.""" - - def __init__(self, msg, type, value, context): - Exception.__init__(self, "%s: type=%r, value=%r, context=%r" % - (msg, type, value, context)) - self.msg = msg - self.type = type - self.value = value - self.context = context - - def __reduce__(self): - return type(self), (self.msg, self.type, self.value, self.context) - -class Parser(object): - """Parser engine. - - The proper usage sequence is: - - p = Parser(grammar, [converter]) # create instance - p.setup([start]) # prepare for parsing - : - if p.addtoken(...): # parse a token; may raise ParseError - break - root = p.rootnode # root of abstract syntax tree - - A Parser instance may be reused by calling setup() repeatedly. - - A Parser instance contains state pertaining to the current token - sequence, and should not be used concurrently by different threads - to parse separate token sequences. - - See driver.py for how to get input tokens by tokenizing a file or - string. - - Parsing is complete when addtoken() returns True; the root of the - abstract syntax tree can then be retrieved from the rootnode - instance variable. When a syntax error occurs, addtoken() raises - the ParseError exception. There is no error recovery; the parser - cannot be used after a syntax error was reported (but it can be - reinitialized by calling setup()). - - """ - - def __init__(self, grammar, convert=None): - """Constructor. - - The grammar argument is a grammar.Grammar instance; see the - grammar module for more information. - - The parser is not ready yet for parsing; you must call the - setup() method to get it started. - - The optional convert argument is a function mapping concrete - syntax tree nodes to abstract syntax tree nodes. If not - given, no conversion is done and the syntax tree produced is - the concrete syntax tree. If given, it must be a function of - two arguments, the first being the grammar (a grammar.Grammar - instance), and the second being the concrete syntax tree node - to be converted. The syntax tree is converted from the bottom - up. - - A concrete syntax tree node is a (type, value, context, nodes) - tuple, where type is the node type (a token or symbol number), - value is None for symbols and a string for tokens, context is - None or an opaque value used for error reporting (typically a - (lineno, offset) pair), and nodes is a list of children for - symbols, and None for tokens. - - An abstract syntax tree node may be anything; this is entirely - up to the converter function. - - """ - self.grammar = grammar - self.convert = convert or (lambda grammar, node: node) - - def setup(self, start=None): - """Prepare for parsing. - - This *must* be called before starting to parse. - - The optional argument is an alternative start symbol; it - defaults to the grammar's start symbol. - - You can use a Parser instance to parse any number of programs; - each time you call setup() the parser is reset to an initial - state determined by the (implicit or explicit) start symbol. - - """ - if start is None: - start = self.grammar.start - # Each stack entry is a tuple: (dfa, state, node). - # A node is a tuple: (type, value, context, children), - # where children is a list of nodes or None, and context may be None. - newnode = (start, None, None, []) - stackentry = (self.grammar.dfas[start], 0, newnode) - self.stack = [stackentry] - self.rootnode = None - self.used_names = set() # Aliased to self.rootnode.used_names in pop() - - def addtoken(self, type, value, context): - """Add a token; return True iff this is the end of the program.""" - # Map from token to label - ilabel = self.classify(type, value, context) - # Loop until the token is shifted; may raise exceptions - while True: - dfa, state, node = self.stack[-1] - states, first = dfa - arcs = states[state] - # Look for a state with this label - for i, newstate in arcs: - t, v = self.grammar.labels[i] - if ilabel == i: - # Look it up in the list of labels - assert t < 256 - # Shift a token; we're done with it - self.shift(type, value, newstate, context) - # Pop while we are in an accept-only state - state = newstate - while states[state] == [(0, state)]: - self.pop() - if not self.stack: - # Done parsing! - return True - dfa, state, node = self.stack[-1] - states, first = dfa - # Done with this token - return False - elif t >= 256: - # See if it's a symbol and if we're in its first set - itsdfa = self.grammar.dfas[t] - itsstates, itsfirst = itsdfa - if ilabel in itsfirst: - # Push a symbol - self.push(t, self.grammar.dfas[t], newstate, context) - break # To continue the outer while loop - else: - if (0, state) in arcs: - # An accepting state, pop it and try something else - self.pop() - if not self.stack: - # Done parsing, but another token is input - raise ParseError("too much input", - type, value, context) - else: - # No success finding a transition - raise ParseError("bad input", type, value, context) - - def classify(self, type, value, context): - """Turn a token into a label. (Internal)""" - if type == token.NAME: - # Keep a listing of all used names - self.used_names.add(value) - # Check for reserved words - ilabel = self.grammar.keywords.get(value) - if ilabel is not None: - return ilabel - ilabel = self.grammar.tokens.get(type) - if ilabel is None: - raise ParseError("bad token", type, value, context) - return ilabel - - def shift(self, type, value, newstate, context): - """Shift a token. (Internal)""" - dfa, state, node = self.stack[-1] - newnode = (type, value, context, None) - newnode = self.convert(self.grammar, newnode) - if newnode is not None: - node[-1].append(newnode) - self.stack[-1] = (dfa, newstate, node) - - def push(self, type, newdfa, newstate, context): - """Push a nonterminal. (Internal)""" - dfa, state, node = self.stack[-1] - newnode = (type, None, context, []) - self.stack[-1] = (dfa, newstate, node) - self.stack.append((newdfa, 0, newnode)) - - def pop(self): - """Pop a nonterminal. (Internal)""" - popdfa, popstate, popnode = self.stack.pop() - newnode = self.convert(self.grammar, popnode) - if newnode is not None: - if self.stack: - dfa, state, node = self.stack[-1] - node[-1].append(newnode) - else: - self.rootnode = newnode - self.rootnode.used_names = self.used_names diff --git a/Lib/lib2to3/pgen2/pgen.py b/Lib/lib2to3/pgen2/pgen.py deleted file mode 100644 index 7abd5cef..00000000 --- a/Lib/lib2to3/pgen2/pgen.py +++ /dev/null @@ -1,386 +0,0 @@ -# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -# Pgen imports -from . import grammar, token, tokenize - -class PgenGrammar(grammar.Grammar): - pass - -class ParserGenerator(object): - - def __init__(self, filename, stream=None): - close_stream = None - if stream is None: - stream = open(filename, encoding="utf-8") - close_stream = stream.close - self.filename = filename - self.stream = stream - self.generator = tokenize.generate_tokens(stream.readline) - self.gettoken() # Initialize lookahead - self.dfas, self.startsymbol = self.parse() - if close_stream is not None: - close_stream() - self.first = {} # map from symbol name to set of tokens - self.addfirstsets() - - def make_grammar(self): - c = PgenGrammar() - names = list(self.dfas.keys()) - names.sort() - names.remove(self.startsymbol) - names.insert(0, self.startsymbol) - for name in names: - i = 256 + len(c.symbol2number) - c.symbol2number[name] = i - c.number2symbol[i] = name - for name in names: - dfa = self.dfas[name] - states = [] - for state in dfa: - arcs = [] - for label, next in sorted(state.arcs.items()): - arcs.append((self.make_label(c, label), dfa.index(next))) - if state.isfinal: - arcs.append((0, dfa.index(state))) - states.append(arcs) - c.states.append(states) - c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) - c.start = c.symbol2number[self.startsymbol] - return c - - def make_first(self, c, name): - rawfirst = self.first[name] - first = {} - for label in sorted(rawfirst): - ilabel = self.make_label(c, label) - ##assert ilabel not in first # XXX failed on <> ... != - first[ilabel] = 1 - return first - - def make_label(self, c, label): - # XXX Maybe this should be a method on a subclass of converter? - ilabel = len(c.labels) - if label[0].isalpha(): - # Either a symbol name or a named token - if label in c.symbol2number: - # A symbol name (a non-terminal) - if label in c.symbol2label: - return c.symbol2label[label] - else: - c.labels.append((c.symbol2number[label], None)) - c.symbol2label[label] = ilabel - return ilabel - else: - # A named token (NAME, NUMBER, STRING) - itoken = getattr(token, label, None) - assert isinstance(itoken, int), label - assert itoken in token.tok_name, label - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - else: - # Either a keyword or an operator - assert label[0] in ('"', "'"), label - value = eval(label) - if value[0].isalpha(): - # A keyword - if value in c.keywords: - return c.keywords[value] - else: - c.labels.append((token.NAME, value)) - c.keywords[value] = ilabel - return ilabel - else: - # An operator (any non-numeric token) - itoken = grammar.opmap[value] # Fails if unknown token - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - - def addfirstsets(self): - names = list(self.dfas.keys()) - names.sort() - for name in names: - if name not in self.first: - self.calcfirst(name) - #print name, self.first[name].keys() - - def calcfirst(self, name): - dfa = self.dfas[name] - self.first[name] = None # dummy to detect left recursion - state = dfa[0] - totalset = {} - overlapcheck = {} - for label, next in state.arcs.items(): - if label in self.dfas: - if label in self.first: - fset = self.first[label] - if fset is None: - raise ValueError("recursion for rule %r" % name) - else: - self.calcfirst(label) - fset = self.first[label] - totalset.update(fset) - overlapcheck[label] = fset - else: - totalset[label] = 1 - overlapcheck[label] = {label: 1} - inverse = {} - for label, itsfirst in overlapcheck.items(): - for symbol in itsfirst: - if symbol in inverse: - raise ValueError("rule %s is ambiguous; %s is in the" - " first sets of %s as well as %s" % - (name, symbol, label, inverse[symbol])) - inverse[symbol] = label - self.first[name] = totalset - - def parse(self): - dfas = {} - startsymbol = None - # MSTART: (NEWLINE | RULE)* ENDMARKER - while self.type != token.ENDMARKER: - while self.type == token.NEWLINE: - self.gettoken() - # RULE: NAME ':' RHS NEWLINE - name = self.expect(token.NAME) - self.expect(token.OP, ":") - a, z = self.parse_rhs() - self.expect(token.NEWLINE) - #self.dump_nfa(name, a, z) - dfa = self.make_dfa(a, z) - #self.dump_dfa(name, dfa) - oldlen = len(dfa) - self.simplify_dfa(dfa) - newlen = len(dfa) - dfas[name] = dfa - #print name, oldlen, newlen - if startsymbol is None: - startsymbol = name - return dfas, startsymbol - - def make_dfa(self, start, finish): - # To turn an NFA into a DFA, we define the states of the DFA - # to correspond to *sets* of states of the NFA. Then do some - # state reduction. Let's represent sets as dicts with 1 for - # values. - assert isinstance(start, NFAState) - assert isinstance(finish, NFAState) - def closure(state): - base = {} - addclosure(state, base) - return base - def addclosure(state, base): - assert isinstance(state, NFAState) - if state in base: - return - base[state] = 1 - for label, next in state.arcs: - if label is None: - addclosure(next, base) - states = [DFAState(closure(start), finish)] - for state in states: # NB states grows while we're iterating - arcs = {} - for nfastate in state.nfaset: - for label, next in nfastate.arcs: - if label is not None: - addclosure(next, arcs.setdefault(label, {})) - for label, nfaset in sorted(arcs.items()): - for st in states: - if st.nfaset == nfaset: - break - else: - st = DFAState(nfaset, finish) - states.append(st) - state.addarc(st, label) - return states # List of DFAState instances; first one is start - - def dump_nfa(self, name, start, finish): - print("Dump of NFA for", name) - todo = [start] - for i, state in enumerate(todo): - print(" State", i, state is finish and "(final)" or "") - for label, next in state.arcs: - if next in todo: - j = todo.index(next) - else: - j = len(todo) - todo.append(next) - if label is None: - print(" -> %d" % j) - else: - print(" %s -> %d" % (label, j)) - - def dump_dfa(self, name, dfa): - print("Dump of DFA for", name) - for i, state in enumerate(dfa): - print(" State", i, state.isfinal and "(final)" or "") - for label, next in sorted(state.arcs.items()): - print(" %s -> %d" % (label, dfa.index(next))) - - def simplify_dfa(self, dfa): - # This is not theoretically optimal, but works well enough. - # Algorithm: repeatedly look for two states that have the same - # set of arcs (same labels pointing to the same nodes) and - # unify them, until things stop changing. - - # dfa is a list of DFAState instances - changes = True - while changes: - changes = False - for i, state_i in enumerate(dfa): - for j in range(i+1, len(dfa)): - state_j = dfa[j] - if state_i == state_j: - #print " unify", i, j - del dfa[j] - for state in dfa: - state.unifystate(state_j, state_i) - changes = True - break - - def parse_rhs(self): - # RHS: ALT ('|' ALT)* - a, z = self.parse_alt() - if self.value != "|": - return a, z - else: - aa = NFAState() - zz = NFAState() - aa.addarc(a) - z.addarc(zz) - while self.value == "|": - self.gettoken() - a, z = self.parse_alt() - aa.addarc(a) - z.addarc(zz) - return aa, zz - - def parse_alt(self): - # ALT: ITEM+ - a, b = self.parse_item() - while (self.value in ("(", "[") or - self.type in (token.NAME, token.STRING)): - c, d = self.parse_item() - b.addarc(c) - b = d - return a, b - - def parse_item(self): - # ITEM: '[' RHS ']' | ATOM ['+' | '*'] - if self.value == "[": - self.gettoken() - a, z = self.parse_rhs() - self.expect(token.OP, "]") - a.addarc(z) - return a, z - else: - a, z = self.parse_atom() - value = self.value - if value not in ("+", "*"): - return a, z - self.gettoken() - z.addarc(a) - if value == "+": - return a, z - else: - return a, a - - def parse_atom(self): - # ATOM: '(' RHS ')' | NAME | STRING - if self.value == "(": - self.gettoken() - a, z = self.parse_rhs() - self.expect(token.OP, ")") - return a, z - elif self.type in (token.NAME, token.STRING): - a = NFAState() - z = NFAState() - a.addarc(z, self.value) - self.gettoken() - return a, z - else: - self.raise_error("expected (...) or NAME or STRING, got %s/%s", - self.type, self.value) - - def expect(self, type, value=None): - if self.type != type or (value is not None and self.value != value): - self.raise_error("expected %s/%s, got %s/%s", - type, value, self.type, self.value) - value = self.value - self.gettoken() - return value - - def gettoken(self): - tup = next(self.generator) - while tup[0] in (tokenize.COMMENT, tokenize.NL): - tup = next(self.generator) - self.type, self.value, self.begin, self.end, self.line = tup - #print token.tok_name[self.type], repr(self.value) - - def raise_error(self, msg, *args): - if args: - try: - msg = msg % args - except: - msg = " ".join([msg] + list(map(str, args))) - raise SyntaxError(msg, (self.filename, self.end[0], - self.end[1], self.line)) - -class NFAState(object): - - def __init__(self): - self.arcs = [] # list of (label, NFAState) pairs - - def addarc(self, next, label=None): - assert label is None or isinstance(label, str) - assert isinstance(next, NFAState) - self.arcs.append((label, next)) - -class DFAState(object): - - def __init__(self, nfaset, final): - assert isinstance(nfaset, dict) - assert isinstance(next(iter(nfaset)), NFAState) - assert isinstance(final, NFAState) - self.nfaset = nfaset - self.isfinal = final in nfaset - self.arcs = {} # map from label to DFAState - - def addarc(self, next, label): - assert isinstance(label, str) - assert label not in self.arcs - assert isinstance(next, DFAState) - self.arcs[label] = next - - def unifystate(self, old, new): - for label, next in self.arcs.items(): - if next is old: - self.arcs[label] = new - - def __eq__(self, other): - # Equality test -- ignore the nfaset instance variable - assert isinstance(other, DFAState) - if self.isfinal != other.isfinal: - return False - # Can't just return self.arcs == other.arcs, because that - # would invoke this method recursively, with cycles... - if len(self.arcs) != len(other.arcs): - return False - for label, next in self.arcs.items(): - if next is not other.arcs.get(label): - return False - return True - - __hash__ = None # For Py3 compatibility. - -def generate_grammar(filename="Grammar.txt"): - p = ParserGenerator(filename) - return p.make_grammar() diff --git a/Lib/lib2to3/pgen2/token.py b/Lib/lib2to3/pgen2/token.py deleted file mode 100755 index 2a55138e..00000000 --- a/Lib/lib2to3/pgen2/token.py +++ /dev/null @@ -1,86 +0,0 @@ -#! /usr/bin/env python3 - -"""Token constants (from "token.h").""" - -# Taken from Python (r53757) and modified to include some tokens -# originally monkeypatched in by pgen2.tokenize - -#--start constants-- -ENDMARKER = 0 -NAME = 1 -NUMBER = 2 -STRING = 3 -NEWLINE = 4 -INDENT = 5 -DEDENT = 6 -LPAR = 7 -RPAR = 8 -LSQB = 9 -RSQB = 10 -COLON = 11 -COMMA = 12 -SEMI = 13 -PLUS = 14 -MINUS = 15 -STAR = 16 -SLASH = 17 -VBAR = 18 -AMPER = 19 -LESS = 20 -GREATER = 21 -EQUAL = 22 -DOT = 23 -PERCENT = 24 -BACKQUOTE = 25 -LBRACE = 26 -RBRACE = 27 -EQEQUAL = 28 -NOTEQUAL = 29 -LESSEQUAL = 30 -GREATEREQUAL = 31 -TILDE = 32 -CIRCUMFLEX = 33 -LEFTSHIFT = 34 -RIGHTSHIFT = 35 -DOUBLESTAR = 36 -PLUSEQUAL = 37 -MINEQUAL = 38 -STAREQUAL = 39 -SLASHEQUAL = 40 -PERCENTEQUAL = 41 -AMPEREQUAL = 42 -VBAREQUAL = 43 -CIRCUMFLEXEQUAL = 44 -LEFTSHIFTEQUAL = 45 -RIGHTSHIFTEQUAL = 46 -DOUBLESTAREQUAL = 47 -DOUBLESLASH = 48 -DOUBLESLASHEQUAL = 49 -AT = 50 -ATEQUAL = 51 -OP = 52 -COMMENT = 53 -NL = 54 -RARROW = 55 -AWAIT = 56 -ASYNC = 57 -ERRORTOKEN = 58 -COLONEQUAL = 59 -N_TOKENS = 60 -NT_OFFSET = 256 -#--end constants-- - -tok_name = {} -for _name, _value in list(globals().items()): - if isinstance(_value, int): - tok_name[_value] = _name - - -def ISTERMINAL(x): - return x < NT_OFFSET - -def ISNONTERMINAL(x): - return x >= NT_OFFSET - -def ISEOF(x): - return x == ENDMARKER diff --git a/Lib/lib2to3/pgen2/tokenize.py b/Lib/lib2to3/pgen2/tokenize.py deleted file mode 100644 index 099dfa77..00000000 --- a/Lib/lib2to3/pgen2/tokenize.py +++ /dev/null @@ -1,564 +0,0 @@ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation. -# All rights reserved. - -"""Tokenization help for Python programs. - -generate_tokens(readline) is a generator that breaks a stream of -text into Python tokens. It accepts a readline-like method which is called -repeatedly to get the next line of input (or "" for EOF). It generates -5-tuples with these members: - - the token type (see token.py) - the token (a string) - the starting (row, column) indices of the token (a 2-tuple of ints) - the ending (row, column) indices of the token (a 2-tuple of ints) - the original line (string) - -It is designed to match the working of the Python tokenizer exactly, except -that it produces COMMENT tokens for comments and gives type OP for all -operators - -Older entry points - tokenize_loop(readline, tokeneater) - tokenize(readline, tokeneater=printtoken) -are the same, except instead of generating tokens, tokeneater is a callback -function to which the 5 fields described above are passed as 5 arguments, -each time a new token is found.""" - -__author__ = 'Ka-Ping Yee ' -__credits__ = \ - 'GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro' - -import string, re -from codecs import BOM_UTF8, lookup -from lib2to3.pgen2.token import * - -from . import token -__all__ = [x for x in dir(token) if x[0] != '_'] + ["tokenize", - "generate_tokens", "untokenize"] -del token - -try: - bytes -except NameError: - # Support bytes type in Python <= 2.5, so 2to3 turns itself into - # valid Python 3 code. - bytes = str - -def group(*choices): return '(' + '|'.join(choices) + ')' -def any(*choices): return group(*choices) + '*' -def maybe(*choices): return group(*choices) + '?' -def _combinations(*l): - return set( - x + y for x in l for y in l + ("",) if x.casefold() != y.casefold() - ) - -Whitespace = r'[ \f\t]*' -Comment = r'#[^\r\n]*' -Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) -Name = r'\w+' - -Binnumber = r'0[bB]_?[01]+(?:_[01]+)*' -Hexnumber = r'0[xX]_?[\da-fA-F]+(?:_[\da-fA-F]+)*[lL]?' -Octnumber = r'0[oO]?_?[0-7]+(?:_[0-7]+)*[lL]?' -Decnumber = group(r'[1-9]\d*(?:_\d+)*[lL]?', '0[lL]?') -Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber) -Exponent = r'[eE][-+]?\d+(?:_\d+)*' -Pointfloat = group(r'\d+(?:_\d+)*\.(?:\d+(?:_\d+)*)?', r'\.\d+(?:_\d+)*') + maybe(Exponent) -Expfloat = r'\d+(?:_\d+)*' + Exponent -Floatnumber = group(Pointfloat, Expfloat) -Imagnumber = group(r'\d+(?:_\d+)*[jJ]', Floatnumber + r'[jJ]') -Number = group(Imagnumber, Floatnumber, Intnumber) - -# Tail end of ' string. -Single = r"[^'\\]*(?:\\.[^'\\]*)*'" -# Tail end of " string. -Double = r'[^"\\]*(?:\\.[^"\\]*)*"' -# Tail end of ''' string. -Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" -# Tail end of """ string. -Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' -_litprefix = r"(?:[uUrRbBfF]|[rR][fFbB]|[fFbBuU][rR])?" -Triple = group(_litprefix + "'''", _litprefix + '"""') -# Single-line ' or " string. -String = group(_litprefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", - _litprefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*"') - -# Because of leftmost-then-longest match semantics, be sure to put the -# longest operators first (e.g., if = came before ==, == would get -# recognized as two instances of =). -Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"<>", r"!=", - r"//=?", r"->", - r"[+\-*/%&@|^=<>]=?", - r"~") - -Bracket = '[][(){}]' -Special = group(r'\r?\n', r':=', r'[:;.,`@]') -Funny = group(Operator, Bracket, Special) - -PlainToken = group(Number, Funny, String, Name) -Token = Ignore + PlainToken - -# First (or only) line of ' or " string. -ContStr = group(_litprefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*" + - group("'", r'\\\r?\n'), - _litprefix + r'"[^\n"\\]*(?:\\.[^\n"\\]*)*' + - group('"', r'\\\r?\n')) -PseudoExtras = group(r'\\\r?\n', Comment, Triple) -PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) - -tokenprog, pseudoprog, single3prog, double3prog = map( - re.compile, (Token, PseudoToken, Single3, Double3)) - -_strprefixes = ( - _combinations('r', 'R', 'f', 'F') | - _combinations('r', 'R', 'b', 'B') | - {'u', 'U', 'ur', 'uR', 'Ur', 'UR'} -) - -endprogs = {"'": re.compile(Single), '"': re.compile(Double), - "'''": single3prog, '"""': double3prog, - **{f"{prefix}'''": single3prog for prefix in _strprefixes}, - **{f'{prefix}"""': double3prog for prefix in _strprefixes}, - **{prefix: None for prefix in _strprefixes}} - -triple_quoted = ( - {"'''", '"""'} | - {f"{prefix}'''" for prefix in _strprefixes} | - {f'{prefix}"""' for prefix in _strprefixes} -) -single_quoted = ( - {"'", '"'} | - {f"{prefix}'" for prefix in _strprefixes} | - {f'{prefix}"' for prefix in _strprefixes} -) - -tabsize = 8 - -class TokenError(Exception): pass - -class StopTokenizing(Exception): pass - -def printtoken(type, token, xxx_todo_changeme, xxx_todo_changeme1, line): # for testing - (srow, scol) = xxx_todo_changeme - (erow, ecol) = xxx_todo_changeme1 - print("%d,%d-%d,%d:\t%s\t%s" % \ - (srow, scol, erow, ecol, tok_name[type], repr(token))) - -def tokenize(readline, tokeneater=printtoken): - """ - The tokenize() function accepts two parameters: one representing the - input stream, and one providing an output mechanism for tokenize(). - - The first parameter, readline, must be a callable object which provides - the same interface as the readline() method of built-in file objects. - Each call to the function should return one line of input as a string. - - The second parameter, tokeneater, must also be a callable object. It is - called once for each token, with five arguments, corresponding to the - tuples generated by generate_tokens(). - """ - try: - tokenize_loop(readline, tokeneater) - except StopTokenizing: - pass - -# backwards compatible interface -def tokenize_loop(readline, tokeneater): - for token_info in generate_tokens(readline): - tokeneater(*token_info) - -class Untokenizer: - - def __init__(self): - self.tokens = [] - self.prev_row = 1 - self.prev_col = 0 - - def add_whitespace(self, start): - row, col = start - assert row <= self.prev_row - col_offset = col - self.prev_col - if col_offset: - self.tokens.append(" " * col_offset) - - def untokenize(self, iterable): - for t in iterable: - if len(t) == 2: - self.compat(t, iterable) - break - tok_type, token, start, end, line = t - self.add_whitespace(start) - self.tokens.append(token) - self.prev_row, self.prev_col = end - if tok_type in (NEWLINE, NL): - self.prev_row += 1 - self.prev_col = 0 - return "".join(self.tokens) - - def compat(self, token, iterable): - startline = False - indents = [] - toks_append = self.tokens.append - toknum, tokval = token - if toknum in (NAME, NUMBER): - tokval += ' ' - if toknum in (NEWLINE, NL): - startline = True - for tok in iterable: - toknum, tokval = tok[:2] - - if toknum in (NAME, NUMBER, ASYNC, AWAIT): - tokval += ' ' - - if toknum == INDENT: - indents.append(tokval) - continue - elif toknum == DEDENT: - indents.pop() - continue - elif toknum in (NEWLINE, NL): - startline = True - elif startline and indents: - toks_append(indents[-1]) - startline = False - toks_append(tokval) - -cookie_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) -blank_re = re.compile(br'^[ \t\f]*(?:[#\r\n]|$)', re.ASCII) - -def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - -def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read - in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, but - disagree, a SyntaxError will be raised. If the encoding cookie is an invalid - charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - bom_found = False - encoding = None - default = 'utf-8' - def read_or_stop(): - try: - return readline() - except StopIteration: - return bytes() - - def find_cookie(line): - try: - line_string = line.decode('ascii') - except UnicodeDecodeError: - return None - match = cookie_re.match(line_string) - if not match: - return None - encoding = _get_normal_name(match.group(1)) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - raise SyntaxError("unknown encoding: " + encoding) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - raise SyntaxError('encoding problem: utf-8') - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - if not blank_re.match(first): - return default, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - -def untokenize(iterable): - """Transform tokens back into Python source code. - - Each element returned by the iterable must be a token sequence - with at least two elements, a token number and token value. If - only two tokens are passed, the resulting output is poor. - - Round-trip invariant for full input: - Untokenized source will match input source exactly - - Round-trip invariant for limited input: - # Output text will tokenize the back to the input - t1 = [tok[:2] for tok in generate_tokens(f.readline)] - newcode = untokenize(t1) - readline = iter(newcode.splitlines(1)).next - t2 = [tok[:2] for tokin generate_tokens(readline)] - assert t1 == t2 - """ - ut = Untokenizer() - return ut.untokenize(iterable) - -def generate_tokens(readline): - """ - The generate_tokens() generator requires one argument, readline, which - must be a callable object which provides the same interface as the - readline() method of built-in file objects. Each call to the function - should return one line of input as a string. Alternately, readline - can be a callable function terminating with StopIteration: - readline = open(myfile).next # Example of alternate readline - - The generator produces 5-tuples with these members: the token type; the - token string; a 2-tuple (srow, scol) of ints specifying the row and - column where the token begins in the source; a 2-tuple (erow, ecol) of - ints specifying the row and column where the token ends in the source; - and the line on which the token was found. The line passed is the - physical line. - """ - lnum = parenlev = continued = 0 - contstr, needcont = '', 0 - contline = None - indents = [0] - - # 'stashed' and 'async_*' are used for async/await parsing - stashed = None - async_def = False - async_def_indent = 0 - async_def_nl = False - - while 1: # loop over lines in stream - try: - line = readline() - except StopIteration: - line = '' - lnum = lnum + 1 - pos, max = 0, len(line) - - if contstr: # continued string - if not line: - raise TokenError("EOF in multi-line string", strstart) - endmatch = endprog.match(line) - if endmatch: - pos = end = endmatch.end(0) - yield (STRING, contstr + line[:end], - strstart, (lnum, end), contline + line) - contstr, needcont = '', 0 - contline = None - elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': - yield (ERRORTOKEN, contstr + line, - strstart, (lnum, len(line)), contline) - contstr = '' - contline = None - continue - else: - contstr = contstr + line - contline = contline + line - continue - - elif parenlev == 0 and not continued: # new statement - if not line: break - column = 0 - while pos < max: # measure leading whitespace - if line[pos] == ' ': column = column + 1 - elif line[pos] == '\t': column = (column//tabsize + 1)*tabsize - elif line[pos] == '\f': column = 0 - else: break - pos = pos + 1 - if pos == max: break - - if stashed: - yield stashed - stashed = None - - if line[pos] in '#\r\n': # skip comments or blank lines - if line[pos] == '#': - comment_token = line[pos:].rstrip('\r\n') - nl_pos = pos + len(comment_token) - yield (COMMENT, comment_token, - (lnum, pos), (lnum, pos + len(comment_token)), line) - yield (NL, line[nl_pos:], - (lnum, nl_pos), (lnum, len(line)), line) - else: - yield ((NL, COMMENT)[line[pos] == '#'], line[pos:], - (lnum, pos), (lnum, len(line)), line) - continue - - if column > indents[-1]: # count indents or dedents - indents.append(column) - yield (INDENT, line[:pos], (lnum, 0), (lnum, pos), line) - while column < indents[-1]: - if column not in indents: - raise IndentationError( - "unindent does not match any outer indentation level", - ("", lnum, pos, line)) - indents = indents[:-1] - - if async_def and async_def_indent >= indents[-1]: - async_def = False - async_def_nl = False - async_def_indent = 0 - - yield (DEDENT, '', (lnum, pos), (lnum, pos), line) - - if async_def and async_def_nl and async_def_indent >= indents[-1]: - async_def = False - async_def_nl = False - async_def_indent = 0 - - else: # continued statement - if not line: - raise TokenError("EOF in multi-line statement", (lnum, 0)) - continued = 0 - - while pos < max: - pseudomatch = pseudoprog.match(line, pos) - if pseudomatch: # scan for tokens - start, end = pseudomatch.span(1) - spos, epos, pos = (lnum, start), (lnum, end), end - token, initial = line[start:end], line[start] - - if initial in string.digits or \ - (initial == '.' and token != '.'): # ordinary number - yield (NUMBER, token, spos, epos, line) - elif initial in '\r\n': - newline = NEWLINE - if parenlev > 0: - newline = NL - elif async_def: - async_def_nl = True - if stashed: - yield stashed - stashed = None - yield (newline, token, spos, epos, line) - - elif initial == '#': - assert not token.endswith("\n") - if stashed: - yield stashed - stashed = None - yield (COMMENT, token, spos, epos, line) - elif token in triple_quoted: - endprog = endprogs[token] - endmatch = endprog.match(line, pos) - if endmatch: # all on one line - pos = endmatch.end(0) - token = line[start:pos] - if stashed: - yield stashed - stashed = None - yield (STRING, token, spos, (lnum, pos), line) - else: - strstart = (lnum, start) # multiple lines - contstr = line[start:] - contline = line - break - elif initial in single_quoted or \ - token[:2] in single_quoted or \ - token[:3] in single_quoted: - if token[-1] == '\n': # continued string - strstart = (lnum, start) - endprog = (endprogs[initial] or endprogs[token[1]] or - endprogs[token[2]]) - contstr, needcont = line[start:], 1 - contline = line - break - else: # ordinary string - if stashed: - yield stashed - stashed = None - yield (STRING, token, spos, epos, line) - elif initial.isidentifier(): # ordinary name - if token in ('async', 'await'): - if async_def: - yield (ASYNC if token == 'async' else AWAIT, - token, spos, epos, line) - continue - - tok = (NAME, token, spos, epos, line) - if token == 'async' and not stashed: - stashed = tok - continue - - if token in ('def', 'for'): - if (stashed - and stashed[0] == NAME - and stashed[1] == 'async'): - - if token == 'def': - async_def = True - async_def_indent = indents[-1] - - yield (ASYNC, stashed[1], - stashed[2], stashed[3], - stashed[4]) - stashed = None - - if stashed: - yield stashed - stashed = None - - yield tok - elif initial == '\\': # continued stmt - # This yield is new; needed for better idempotency: - if stashed: - yield stashed - stashed = None - yield (NL, token, spos, (lnum, pos), line) - continued = 1 - else: - if initial in '([{': parenlev = parenlev + 1 - elif initial in ')]}': parenlev = parenlev - 1 - if stashed: - yield stashed - stashed = None - yield (OP, token, spos, epos, line) - else: - yield (ERRORTOKEN, line[pos], - (lnum, pos), (lnum, pos+1), line) - pos = pos + 1 - - if stashed: - yield stashed - stashed = None - - for indent in indents[1:]: # pop remaining indent levels - yield (DEDENT, '', (lnum, 0), (lnum, 0), '') - yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') - -if __name__ == '__main__': # testing - import sys - if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline) - else: tokenize(sys.stdin.readline) diff --git a/Lib/lib2to3/pygram.py b/Lib/lib2to3/pygram.py deleted file mode 100644 index 24d9db92..00000000 --- a/Lib/lib2to3/pygram.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Export the Python grammar and symbols.""" - -# Python imports -import os - -# Local imports -from .pgen2 import token -from .pgen2 import driver -from . import pytree - -# The grammar file -_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt") -_PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), - "PatternGrammar.txt") - - -class Symbols(object): - - def __init__(self, grammar): - """Initializer. - - Creates an attribute for each grammar symbol (nonterminal), - whose value is the symbol's type (an int >= 256). - """ - for name, symbol in grammar.symbol2number.items(): - setattr(self, name, symbol) - - -python_grammar = driver.load_packaged_grammar("lib2to3", _GRAMMAR_FILE) - -python_symbols = Symbols(python_grammar) - -python_grammar_no_print_statement = python_grammar.copy() -del python_grammar_no_print_statement.keywords["print"] - -python_grammar_no_print_and_exec_statement = python_grammar_no_print_statement.copy() -del python_grammar_no_print_and_exec_statement.keywords["exec"] - -pattern_grammar = driver.load_packaged_grammar("lib2to3", _PATTERN_GRAMMAR_FILE) -pattern_symbols = Symbols(pattern_grammar) diff --git a/Lib/lib2to3/pytree.py b/Lib/lib2to3/pytree.py deleted file mode 100644 index 729023df..00000000 --- a/Lib/lib2to3/pytree.py +++ /dev/null @@ -1,853 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -""" -Python parse tree definitions. - -This is a very concrete parse tree; we need to keep every token and -even the comments and whitespace between tokens. - -There's also a pattern matching implementation here. -""" - -__author__ = "Guido van Rossum " - -import sys -from io import StringIO - -HUGE = 0x7FFFFFFF # maximum repeat count, default max - -_type_reprs = {} -def type_repr(type_num): - global _type_reprs - if not _type_reprs: - from .pygram import python_symbols - # printing tokens is possible but not as useful - # from .pgen2 import token // token.__dict__.items(): - for name, val in python_symbols.__dict__.items(): - if type(val) == int: _type_reprs[val] = name - return _type_reprs.setdefault(type_num, type_num) - -class Base(object): - - """ - Abstract base class for Node and Leaf. - - This provides some default functionality and boilerplate using the - template pattern. - - A node may be a subnode of at most one parent. - """ - - # Default values for instance variables - type = None # int: token number (< 256) or symbol number (>= 256) - parent = None # Parent node pointer, or None - children = () # Tuple of subnodes - was_changed = False - was_checked = False - - def __new__(cls, *args, **kwds): - """Constructor that prevents Base from being instantiated.""" - assert cls is not Base, "Cannot instantiate Base" - return object.__new__(cls) - - def __eq__(self, other): - """ - Compare two nodes for equality. - - This calls the method _eq(). - """ - if self.__class__ is not other.__class__: - return NotImplemented - return self._eq(other) - - __hash__ = None # For Py3 compatibility. - - def _eq(self, other): - """ - Compare two nodes for equality. - - This is called by __eq__ and __ne__. It is only called if the two nodes - have the same type. This must be implemented by the concrete subclass. - Nodes should be considered equal if they have the same structure, - ignoring the prefix string and other context information. - """ - raise NotImplementedError - - def clone(self): - """ - Return a cloned (deep) copy of self. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def post_order(self): - """ - Return a post-order iterator for the tree. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def pre_order(self): - """ - Return a pre-order iterator for the tree. - - This must be implemented by the concrete subclass. - """ - raise NotImplementedError - - def replace(self, new): - """Replace this node with a new one in the parent.""" - assert self.parent is not None, str(self) - assert new is not None - if not isinstance(new, list): - new = [new] - l_children = [] - found = False - for ch in self.parent.children: - if ch is self: - assert not found, (self.parent.children, self, new) - if new is not None: - l_children.extend(new) - found = True - else: - l_children.append(ch) - assert found, (self.children, self, new) - self.parent.changed() - self.parent.children = l_children - for x in new: - x.parent = self.parent - self.parent = None - - def get_lineno(self): - """Return the line number which generated the invocant node.""" - node = self - while not isinstance(node, Leaf): - if not node.children: - return - node = node.children[0] - return node.lineno - - def changed(self): - if self.parent: - self.parent.changed() - self.was_changed = True - - def remove(self): - """ - Remove the node from the tree. Returns the position of the node in its - parent's children before it was removed. - """ - if self.parent: - for i, node in enumerate(self.parent.children): - if node is self: - self.parent.changed() - del self.parent.children[i] - self.parent = None - return i - - @property - def next_sibling(self): - """ - The node immediately following the invocant in their parent's children - list. If the invocant does not have a next sibling, it is None - """ - if self.parent is None: - return None - - # Can't use index(); we need to test by identity - for i, child in enumerate(self.parent.children): - if child is self: - try: - return self.parent.children[i+1] - except IndexError: - return None - - @property - def prev_sibling(self): - """ - The node immediately preceding the invocant in their parent's children - list. If the invocant does not have a previous sibling, it is None. - """ - if self.parent is None: - return None - - # Can't use index(); we need to test by identity - for i, child in enumerate(self.parent.children): - if child is self: - if i == 0: - return None - return self.parent.children[i-1] - - def leaves(self): - for child in self.children: - yield from child.leaves() - - def depth(self): - if self.parent is None: - return 0 - return 1 + self.parent.depth() - - def get_suffix(self): - """ - Return the string immediately following the invocant node. This is - effectively equivalent to node.next_sibling.prefix - """ - next_sib = self.next_sibling - if next_sib is None: - return "" - return next_sib.prefix - - if sys.version_info < (3, 0): - def __str__(self): - return str(self).encode("ascii") - -class Node(Base): - - """Concrete implementation for interior nodes.""" - - def __init__(self,type, children, - context=None, - prefix=None, - fixers_applied=None): - """ - Initializer. - - Takes a type constant (a symbol number >= 256), a sequence of - child nodes, and an optional context keyword argument. - - As a side effect, the parent pointers of the children are updated. - """ - assert type >= 256, type - self.type = type - self.children = list(children) - for ch in self.children: - assert ch.parent is None, repr(ch) - ch.parent = self - if prefix is not None: - self.prefix = prefix - if fixers_applied: - self.fixers_applied = fixers_applied[:] - else: - self.fixers_applied = None - - def __repr__(self): - """Return a canonical string representation.""" - return "%s(%s, %r)" % (self.__class__.__name__, - type_repr(self.type), - self.children) - - def __unicode__(self): - """ - Return a pretty string representation. - - This reproduces the input source exactly. - """ - return "".join(map(str, self.children)) - - if sys.version_info > (3, 0): - __str__ = __unicode__ - - def _eq(self, other): - """Compare two nodes for equality.""" - return (self.type, self.children) == (other.type, other.children) - - def clone(self): - """Return a cloned (deep) copy of self.""" - return Node(self.type, [ch.clone() for ch in self.children], - fixers_applied=self.fixers_applied) - - def post_order(self): - """Return a post-order iterator for the tree.""" - for child in self.children: - yield from child.post_order() - yield self - - def pre_order(self): - """Return a pre-order iterator for the tree.""" - yield self - for child in self.children: - yield from child.pre_order() - - @property - def prefix(self): - """ - The whitespace and comments preceding this node in the input. - """ - if not self.children: - return "" - return self.children[0].prefix - - @prefix.setter - def prefix(self, prefix): - if self.children: - self.children[0].prefix = prefix - - def set_child(self, i, child): - """ - Equivalent to 'node.children[i] = child'. This method also sets the - child's parent attribute appropriately. - """ - child.parent = self - self.children[i].parent = None - self.children[i] = child - self.changed() - - def insert_child(self, i, child): - """ - Equivalent to 'node.children.insert(i, child)'. This method also sets - the child's parent attribute appropriately. - """ - child.parent = self - self.children.insert(i, child) - self.changed() - - def append_child(self, child): - """ - Equivalent to 'node.children.append(child)'. This method also sets the - child's parent attribute appropriately. - """ - child.parent = self - self.children.append(child) - self.changed() - - -class Leaf(Base): - - """Concrete implementation for leaf nodes.""" - - # Default values for instance variables - _prefix = "" # Whitespace and comments preceding this token in the input - lineno = 0 # Line where this token starts in the input - column = 0 # Column where this token tarts in the input - - def __init__(self, type, value, - context=None, - prefix=None, - fixers_applied=[]): - """ - Initializer. - - Takes a type constant (a token number < 256), a string value, and an - optional context keyword argument. - """ - assert 0 <= type < 256, type - if context is not None: - self._prefix, (self.lineno, self.column) = context - self.type = type - self.value = value - if prefix is not None: - self._prefix = prefix - self.fixers_applied = fixers_applied[:] - - def __repr__(self): - """Return a canonical string representation.""" - return "%s(%r, %r)" % (self.__class__.__name__, - self.type, - self.value) - - def __unicode__(self): - """ - Return a pretty string representation. - - This reproduces the input source exactly. - """ - return self.prefix + str(self.value) - - if sys.version_info > (3, 0): - __str__ = __unicode__ - - def _eq(self, other): - """Compare two nodes for equality.""" - return (self.type, self.value) == (other.type, other.value) - - def clone(self): - """Return a cloned (deep) copy of self.""" - return Leaf(self.type, self.value, - (self.prefix, (self.lineno, self.column)), - fixers_applied=self.fixers_applied) - - def leaves(self): - yield self - - def post_order(self): - """Return a post-order iterator for the tree.""" - yield self - - def pre_order(self): - """Return a pre-order iterator for the tree.""" - yield self - - @property - def prefix(self): - """ - The whitespace and comments preceding this token in the input. - """ - return self._prefix - - @prefix.setter - def prefix(self, prefix): - self.changed() - self._prefix = prefix - -def convert(gr, raw_node): - """ - Convert raw node information to a Node or Leaf instance. - - This is passed to the parser driver which calls it whenever a reduction of a - grammar rule produces a new complete node, so that the tree is build - strictly bottom-up. - """ - type, value, context, children = raw_node - if children or type in gr.number2symbol: - # If there's exactly one child, return that child instead of - # creating a new node. - if len(children) == 1: - return children[0] - return Node(type, children, context=context) - else: - return Leaf(type, value, context=context) - - -class BasePattern(object): - - """ - A pattern is a tree matching pattern. - - It looks for a specific node type (token or symbol), and - optionally for a specific content. - - This is an abstract base class. There are three concrete - subclasses: - - - LeafPattern matches a single leaf node; - - NodePattern matches a single node (usually non-leaf); - - WildcardPattern matches a sequence of nodes of variable length. - """ - - # Defaults for instance variables - type = None # Node type (token if < 256, symbol if >= 256) - content = None # Optional content matching pattern - name = None # Optional name used to store match in results dict - - def __new__(cls, *args, **kwds): - """Constructor that prevents BasePattern from being instantiated.""" - assert cls is not BasePattern, "Cannot instantiate BasePattern" - return object.__new__(cls) - - def __repr__(self): - args = [type_repr(self.type), self.content, self.name] - while args and args[-1] is None: - del args[-1] - return "%s(%s)" % (self.__class__.__name__, ", ".join(map(repr, args))) - - def optimize(self): - """ - A subclass can define this as a hook for optimizations. - - Returns either self or another node with the same effect. - """ - return self - - def match(self, node, results=None): - """ - Does this pattern exactly match a node? - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - Default implementation for non-wildcard patterns. - """ - if self.type is not None and node.type != self.type: - return False - if self.content is not None: - r = None - if results is not None: - r = {} - if not self._submatch(node, r): - return False - if r: - results.update(r) - if results is not None and self.name: - results[self.name] = node - return True - - def match_seq(self, nodes, results=None): - """ - Does this pattern exactly match a sequence of nodes? - - Default implementation for non-wildcard patterns. - """ - if len(nodes) != 1: - return False - return self.match(nodes[0], results) - - def generate_matches(self, nodes): - """ - Generator yielding all matches for this pattern. - - Default implementation for non-wildcard patterns. - """ - r = {} - if nodes and self.match(nodes[0], r): - yield 1, r - - -class LeafPattern(BasePattern): - - def __init__(self, type=None, content=None, name=None): - """ - Initializer. Takes optional type, content, and name. - - The type, if given must be a token type (< 256). If not given, - this matches any *leaf* node; the content may still be required. - - The content, if given, must be a string. - - If a name is given, the matching node is stored in the results - dict under that key. - """ - if type is not None: - assert 0 <= type < 256, type - if content is not None: - assert isinstance(content, str), repr(content) - self.type = type - self.content = content - self.name = name - - def match(self, node, results=None): - """Override match() to insist on a leaf node.""" - if not isinstance(node, Leaf): - return False - return BasePattern.match(self, node, results) - - def _submatch(self, node, results=None): - """ - Match the pattern's content to the node's children. - - This assumes the node type matches and self.content is not None. - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - When returning False, the results dict may still be updated. - """ - return self.content == node.value - - -class NodePattern(BasePattern): - - wildcards = False - - def __init__(self, type=None, content=None, name=None): - """ - Initializer. Takes optional type, content, and name. - - The type, if given, must be a symbol type (>= 256). If the - type is None this matches *any* single node (leaf or not), - except if content is not None, in which it only matches - non-leaf nodes that also match the content pattern. - - The content, if not None, must be a sequence of Patterns that - must match the node's children exactly. If the content is - given, the type must not be None. - - If a name is given, the matching node is stored in the results - dict under that key. - """ - if type is not None: - assert type >= 256, type - if content is not None: - assert not isinstance(content, str), repr(content) - content = list(content) - for i, item in enumerate(content): - assert isinstance(item, BasePattern), (i, item) - if isinstance(item, WildcardPattern): - self.wildcards = True - self.type = type - self.content = content - self.name = name - - def _submatch(self, node, results=None): - """ - Match the pattern's content to the node's children. - - This assumes the node type matches and self.content is not None. - - Returns True if it matches, False if not. - - If results is not None, it must be a dict which will be - updated with the nodes matching named subpatterns. - - When returning False, the results dict may still be updated. - """ - if self.wildcards: - for c, r in generate_matches(self.content, node.children): - if c == len(node.children): - if results is not None: - results.update(r) - return True - return False - if len(self.content) != len(node.children): - return False - for subpattern, child in zip(self.content, node.children): - if not subpattern.match(child, results): - return False - return True - - -class WildcardPattern(BasePattern): - - """ - A wildcard pattern can match zero or more nodes. - - This has all the flexibility needed to implement patterns like: - - .* .+ .? .{m,n} - (a b c | d e | f) - (...)* (...)+ (...)? (...){m,n} - - except it always uses non-greedy matching. - """ - - def __init__(self, content=None, min=0, max=HUGE, name=None): - """ - Initializer. - - Args: - content: optional sequence of subsequences of patterns; - if absent, matches one node; - if present, each subsequence is an alternative [*] - min: optional minimum number of times to match, default 0 - max: optional maximum number of times to match, default HUGE - name: optional name assigned to this match - - [*] Thus, if content is [[a, b, c], [d, e], [f, g, h]] this is - equivalent to (a b c | d e | f g h); if content is None, - this is equivalent to '.' in regular expression terms. - The min and max parameters work as follows: - min=0, max=maxint: .* - min=1, max=maxint: .+ - min=0, max=1: .? - min=1, max=1: . - If content is not None, replace the dot with the parenthesized - list of alternatives, e.g. (a b c | d e | f g h)* - """ - assert 0 <= min <= max <= HUGE, (min, max) - if content is not None: - content = tuple(map(tuple, content)) # Protect against alterations - # Check sanity of alternatives - assert len(content), repr(content) # Can't have zero alternatives - for alt in content: - assert len(alt), repr(alt) # Can have empty alternatives - self.content = content - self.min = min - self.max = max - self.name = name - - def optimize(self): - """Optimize certain stacked wildcard patterns.""" - subpattern = None - if (self.content is not None and - len(self.content) == 1 and len(self.content[0]) == 1): - subpattern = self.content[0][0] - if self.min == 1 and self.max == 1: - if self.content is None: - return NodePattern(name=self.name) - if subpattern is not None and self.name == subpattern.name: - return subpattern.optimize() - if (self.min <= 1 and isinstance(subpattern, WildcardPattern) and - subpattern.min <= 1 and self.name == subpattern.name): - return WildcardPattern(subpattern.content, - self.min*subpattern.min, - self.max*subpattern.max, - subpattern.name) - return self - - def match(self, node, results=None): - """Does this pattern exactly match a node?""" - return self.match_seq([node], results) - - def match_seq(self, nodes, results=None): - """Does this pattern exactly match a sequence of nodes?""" - for c, r in self.generate_matches(nodes): - if c == len(nodes): - if results is not None: - results.update(r) - if self.name: - results[self.name] = list(nodes) - return True - return False - - def generate_matches(self, nodes): - """ - Generator yielding matches for a sequence of nodes. - - Args: - nodes: sequence of nodes - - Yields: - (count, results) tuples where: - count: the match comprises nodes[:count]; - results: dict containing named submatches. - """ - if self.content is None: - # Shortcut for special case (see __init__.__doc__) - for count in range(self.min, 1 + min(len(nodes), self.max)): - r = {} - if self.name: - r[self.name] = nodes[:count] - yield count, r - elif self.name == "bare_name": - yield self._bare_name_matches(nodes) - else: - # The reason for this is that hitting the recursion limit usually - # results in some ugly messages about how RuntimeErrors are being - # ignored. We only have to do this on CPython, though, because other - # implementations don't have this nasty bug in the first place. - if hasattr(sys, "getrefcount"): - save_stderr = sys.stderr - sys.stderr = StringIO() - try: - for count, r in self._recursive_matches(nodes, 0): - if self.name: - r[self.name] = nodes[:count] - yield count, r - except RuntimeError: - # Fall back to the iterative pattern matching scheme if the - # recursive scheme hits the recursion limit (RecursionError). - for count, r in self._iterative_matches(nodes): - if self.name: - r[self.name] = nodes[:count] - yield count, r - finally: - if hasattr(sys, "getrefcount"): - sys.stderr = save_stderr - - def _iterative_matches(self, nodes): - """Helper to iteratively yield the matches.""" - nodelen = len(nodes) - if 0 >= self.min: - yield 0, {} - - results = [] - # generate matches that use just one alt from self.content - for alt in self.content: - for c, r in generate_matches(alt, nodes): - yield c, r - results.append((c, r)) - - # for each match, iterate down the nodes - while results: - new_results = [] - for c0, r0 in results: - # stop if the entire set of nodes has been matched - if c0 < nodelen and c0 <= self.max: - for alt in self.content: - for c1, r1 in generate_matches(alt, nodes[c0:]): - if c1 > 0: - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r - new_results.append((c0 + c1, r)) - results = new_results - - def _bare_name_matches(self, nodes): - """Special optimized matcher for bare_name.""" - count = 0 - r = {} - done = False - max = len(nodes) - while not done and count < max: - done = True - for leaf in self.content: - if leaf[0].match(nodes[count], r): - count += 1 - done = False - break - r[self.name] = nodes[:count] - return count, r - - def _recursive_matches(self, nodes, count): - """Helper to recursively yield the matches.""" - assert self.content is not None - if count >= self.min: - yield 0, {} - if count < self.max: - for alt in self.content: - for c0, r0 in generate_matches(alt, nodes): - for c1, r1 in self._recursive_matches(nodes[c0:], count+1): - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r - - -class NegatedPattern(BasePattern): - - def __init__(self, content=None): - """ - Initializer. - - The argument is either a pattern or None. If it is None, this - only matches an empty sequence (effectively '$' in regex - lingo). If it is not None, this matches whenever the argument - pattern doesn't have any matches. - """ - if content is not None: - assert isinstance(content, BasePattern), repr(content) - self.content = content - - def match(self, node): - # We never match a node in its entirety - return False - - def match_seq(self, nodes): - # We only match an empty sequence of nodes in its entirety - return len(nodes) == 0 - - def generate_matches(self, nodes): - if self.content is None: - # Return a match if there is an empty sequence - if len(nodes) == 0: - yield 0, {} - else: - # Return a match if the argument pattern has no matches - for c, r in self.content.generate_matches(nodes): - return - yield 0, {} - - -def generate_matches(patterns, nodes): - """ - Generator yielding matches for a sequence of patterns and nodes. - - Args: - patterns: a sequence of patterns - nodes: a sequence of nodes - - Yields: - (count, results) tuples where: - count: the entire sequence of patterns matches nodes[:count]; - results: dict containing named submatches. - """ - if not patterns: - yield 0, {} - else: - p, rest = patterns[0], patterns[1:] - for c0, r0 in p.generate_matches(nodes): - if not rest: - yield c0, r0 - else: - for c1, r1 in generate_matches(rest, nodes[c0:]): - r = {} - r.update(r0) - r.update(r1) - yield c0 + c1, r diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py deleted file mode 100644 index 3a5aafff..00000000 --- a/Lib/lib2to3/refactor.py +++ /dev/null @@ -1,732 +0,0 @@ -# Copyright 2006 Google, Inc. All Rights Reserved. -# Licensed to PSF under a Contributor Agreement. - -"""Refactoring framework. - -Used as a main program, this can refactor any number of files and/or -recursively descend down directories. Imported as a module, this -provides infrastructure to write your own refactoring tool. -""" - -__author__ = "Guido van Rossum " - - -# Python imports -import io -import os -import pkgutil -import sys -import logging -import operator -import collections -from itertools import chain - -# Local imports -from .pgen2 import driver, tokenize, token -from .fixer_util import find_root -from . import pytree, pygram -from . import btm_matcher as bm - - -def get_all_fix_names(fixer_pkg, remove_prefix=True): - """Return a sorted list of all available fix names in the given package.""" - pkg = __import__(fixer_pkg, [], [], ["*"]) - fix_names = [] - for finder, name, ispkg in pkgutil.iter_modules(pkg.__path__): - if name.startswith("fix_"): - if remove_prefix: - name = name[4:] - fix_names.append(name) - return fix_names - - -class _EveryNode(Exception): - pass - - -def _get_head_types(pat): - """ Accepts a pytree Pattern Node and returns a set - of the pattern types which will match first. """ - - if isinstance(pat, (pytree.NodePattern, pytree.LeafPattern)): - # NodePatters must either have no type and no content - # or a type and content -- so they don't get any farther - # Always return leafs - if pat.type is None: - raise _EveryNode - return {pat.type} - - if isinstance(pat, pytree.NegatedPattern): - if pat.content: - return _get_head_types(pat.content) - raise _EveryNode # Negated Patterns don't have a type - - if isinstance(pat, pytree.WildcardPattern): - # Recurse on each node in content - r = set() - for p in pat.content: - for x in p: - r.update(_get_head_types(x)) - return r - - raise Exception("Oh no! I don't understand pattern %s" %(pat)) - - -def _get_headnode_dict(fixer_list): - """ Accepts a list of fixers and returns a dictionary - of head node type --> fixer list. """ - head_nodes = collections.defaultdict(list) - every = [] - for fixer in fixer_list: - if fixer.pattern: - try: - heads = _get_head_types(fixer.pattern) - except _EveryNode: - every.append(fixer) - else: - for node_type in heads: - head_nodes[node_type].append(fixer) - else: - if fixer._accept_type is not None: - head_nodes[fixer._accept_type].append(fixer) - else: - every.append(fixer) - for node_type in chain(pygram.python_grammar.symbol2number.values(), - pygram.python_grammar.tokens): - head_nodes[node_type].extend(every) - return dict(head_nodes) - - -def get_fixers_from_package(pkg_name): - """ - Return the fully qualified names for fixers in the package pkg_name. - """ - return [pkg_name + "." + fix_name - for fix_name in get_all_fix_names(pkg_name, False)] - -def _identity(obj): - return obj - - -def _detect_future_features(source): - have_docstring = False - gen = tokenize.generate_tokens(io.StringIO(source).readline) - def advance(): - tok = next(gen) - return tok[0], tok[1] - ignore = frozenset({token.NEWLINE, tokenize.NL, token.COMMENT}) - features = set() - try: - while True: - tp, value = advance() - if tp in ignore: - continue - elif tp == token.STRING: - if have_docstring: - break - have_docstring = True - elif tp == token.NAME and value == "from": - tp, value = advance() - if tp != token.NAME or value != "__future__": - break - tp, value = advance() - if tp != token.NAME or value != "import": - break - tp, value = advance() - if tp == token.OP and value == "(": - tp, value = advance() - while tp == token.NAME: - features.add(value) - tp, value = advance() - if tp != token.OP or value != ",": - break - tp, value = advance() - else: - break - except StopIteration: - pass - return frozenset(features) - - -class FixerError(Exception): - """A fixer could not be loaded.""" - - -class RefactoringTool(object): - - _default_options = {"print_function" : False, - "exec_function": False, - "write_unchanged_files" : False} - - CLASS_PREFIX = "Fix" # The prefix for fixer classes - FILE_PREFIX = "fix_" # The prefix for modules with a fixer within - - def __init__(self, fixer_names, options=None, explicit=None): - """Initializer. - - Args: - fixer_names: a list of fixers to import - options: a dict with configuration. - explicit: a list of fixers to run even if they are explicit. - """ - self.fixers = fixer_names - self.explicit = explicit or [] - self.options = self._default_options.copy() - if options is not None: - self.options.update(options) - self.grammar = pygram.python_grammar.copy() - - if self.options['print_function']: - del self.grammar.keywords["print"] - elif self.options['exec_function']: - del self.grammar.keywords["exec"] - - # When this is True, the refactor*() methods will call write_file() for - # files processed even if they were not changed during refactoring. If - # and only if the refactor method's write parameter was True. - self.write_unchanged_files = self.options.get("write_unchanged_files") - self.errors = [] - self.logger = logging.getLogger("RefactoringTool") - self.fixer_log = [] - self.wrote = False - self.driver = driver.Driver(self.grammar, - convert=pytree.convert, - logger=self.logger) - self.pre_order, self.post_order = self.get_fixers() - - - self.files = [] # List of files that were or should be modified - - self.BM = bm.BottomMatcher() - self.bmi_pre_order = [] # Bottom Matcher incompatible fixers - self.bmi_post_order = [] - - for fixer in chain(self.post_order, self.pre_order): - if fixer.BM_compatible: - self.BM.add_fixer(fixer) - # remove fixers that will be handled by the bottom-up - # matcher - elif fixer in self.pre_order: - self.bmi_pre_order.append(fixer) - elif fixer in self.post_order: - self.bmi_post_order.append(fixer) - - self.bmi_pre_order_heads = _get_headnode_dict(self.bmi_pre_order) - self.bmi_post_order_heads = _get_headnode_dict(self.bmi_post_order) - - - - def get_fixers(self): - """Inspects the options to load the requested patterns and handlers. - - Returns: - (pre_order, post_order), where pre_order is the list of fixers that - want a pre-order AST traversal, and post_order is the list that want - post-order traversal. - """ - pre_order_fixers = [] - post_order_fixers = [] - for fix_mod_path in self.fixers: - mod = __import__(fix_mod_path, {}, {}, ["*"]) - fix_name = fix_mod_path.rsplit(".", 1)[-1] - if fix_name.startswith(self.FILE_PREFIX): - fix_name = fix_name[len(self.FILE_PREFIX):] - parts = fix_name.split("_") - class_name = self.CLASS_PREFIX + "".join([p.title() for p in parts]) - try: - fix_class = getattr(mod, class_name) - except AttributeError: - raise FixerError("Can't find %s.%s" % (fix_name, class_name)) from None - fixer = fix_class(self.options, self.fixer_log) - if fixer.explicit and self.explicit is not True and \ - fix_mod_path not in self.explicit: - self.log_message("Skipping optional fixer: %s", fix_name) - continue - - self.log_debug("Adding transformation: %s", fix_name) - if fixer.order == "pre": - pre_order_fixers.append(fixer) - elif fixer.order == "post": - post_order_fixers.append(fixer) - else: - raise FixerError("Illegal fixer order: %r" % fixer.order) - - key_func = operator.attrgetter("run_order") - pre_order_fixers.sort(key=key_func) - post_order_fixers.sort(key=key_func) - return (pre_order_fixers, post_order_fixers) - - def log_error(self, msg, *args, **kwds): - """Called when an error occurs.""" - raise - - def log_message(self, msg, *args): - """Hook to log a message.""" - if args: - msg = msg % args - self.logger.info(msg) - - def log_debug(self, msg, *args): - if args: - msg = msg % args - self.logger.debug(msg) - - def print_output(self, old_text, new_text, filename, equal): - """Called with the old version, new version, and filename of a - refactored file.""" - pass - - def refactor(self, items, write=False, doctests_only=False): - """Refactor a list of files and directories.""" - - for dir_or_file in items: - if os.path.isdir(dir_or_file): - self.refactor_dir(dir_or_file, write, doctests_only) - else: - self.refactor_file(dir_or_file, write, doctests_only) - - def refactor_dir(self, dir_name, write=False, doctests_only=False): - """Descends down a directory and refactor every Python file found. - - Python files are assumed to have a .py extension. - - Files and subdirectories starting with '.' are skipped. - """ - py_ext = os.extsep + "py" - for dirpath, dirnames, filenames in os.walk(dir_name): - self.log_debug("Descending into %s", dirpath) - dirnames.sort() - filenames.sort() - for name in filenames: - if (not name.startswith(".") and - os.path.splitext(name)[1] == py_ext): - fullname = os.path.join(dirpath, name) - self.refactor_file(fullname, write, doctests_only) - # Modify dirnames in-place to remove subdirs with leading dots - dirnames[:] = [dn for dn in dirnames if not dn.startswith(".")] - - def _read_python_source(self, filename): - """ - Do our best to decode a Python source file correctly. - """ - try: - f = open(filename, "rb") - except OSError as err: - self.log_error("Can't open %s: %s", filename, err) - return None, None - try: - encoding = tokenize.detect_encoding(f.readline)[0] - finally: - f.close() - with io.open(filename, "r", encoding=encoding, newline='') as f: - return f.read(), encoding - - def refactor_file(self, filename, write=False, doctests_only=False): - """Refactors a file.""" - input, encoding = self._read_python_source(filename) - if input is None: - # Reading the file failed. - return - input += "\n" # Silence certain parse errors - if doctests_only: - self.log_debug("Refactoring doctests in %s", filename) - output = self.refactor_docstring(input, filename) - if self.write_unchanged_files or output != input: - self.processed_file(output, filename, input, write, encoding) - else: - self.log_debug("No doctest changes in %s", filename) - else: - tree = self.refactor_string(input, filename) - if self.write_unchanged_files or (tree and tree.was_changed): - # The [:-1] is to take off the \n we added earlier - self.processed_file(str(tree)[:-1], filename, - write=write, encoding=encoding) - else: - self.log_debug("No changes in %s", filename) - - def refactor_string(self, data, name): - """Refactor a given input string. - - Args: - data: a string holding the code to be refactored. - name: a human-readable name for use in error/log messages. - - Returns: - An AST corresponding to the refactored input stream; None if - there were errors during the parse. - """ - features = _detect_future_features(data) - if "print_function" in features: - self.driver.grammar = pygram.python_grammar_no_print_statement - try: - tree = self.driver.parse_string(data) - except Exception as err: - self.log_error("Can't parse %s: %s: %s", - name, err.__class__.__name__, err) - return - finally: - self.driver.grammar = self.grammar - tree.future_features = features - self.log_debug("Refactoring %s", name) - self.refactor_tree(tree, name) - return tree - - def refactor_stdin(self, doctests_only=False): - input = sys.stdin.read() - if doctests_only: - self.log_debug("Refactoring doctests in stdin") - output = self.refactor_docstring(input, "") - if self.write_unchanged_files or output != input: - self.processed_file(output, "", input) - else: - self.log_debug("No doctest changes in stdin") - else: - tree = self.refactor_string(input, "") - if self.write_unchanged_files or (tree and tree.was_changed): - self.processed_file(str(tree), "", input) - else: - self.log_debug("No changes in stdin") - - def refactor_tree(self, tree, name): - """Refactors a parse tree (modifying the tree in place). - - For compatible patterns the bottom matcher module is - used. Otherwise the tree is traversed node-to-node for - matches. - - Args: - tree: a pytree.Node instance representing the root of the tree - to be refactored. - name: a human-readable name for this tree. - - Returns: - True if the tree was modified, False otherwise. - """ - - for fixer in chain(self.pre_order, self.post_order): - fixer.start_tree(tree, name) - - #use traditional matching for the incompatible fixers - self.traverse_by(self.bmi_pre_order_heads, tree.pre_order()) - self.traverse_by(self.bmi_post_order_heads, tree.post_order()) - - # obtain a set of candidate nodes - match_set = self.BM.run(tree.leaves()) - - while any(match_set.values()): - for fixer in self.BM.fixers: - if fixer in match_set and match_set[fixer]: - #sort by depth; apply fixers from bottom(of the AST) to top - match_set[fixer].sort(key=pytree.Base.depth, reverse=True) - - if fixer.keep_line_order: - #some fixers(eg fix_imports) must be applied - #with the original file's line order - match_set[fixer].sort(key=pytree.Base.get_lineno) - - for node in list(match_set[fixer]): - if node in match_set[fixer]: - match_set[fixer].remove(node) - - try: - find_root(node) - except ValueError: - # this node has been cut off from a - # previous transformation ; skip - continue - - if node.fixers_applied and fixer in node.fixers_applied: - # do not apply the same fixer again - continue - - results = fixer.match(node) - - if results: - new = fixer.transform(node, results) - if new is not None: - node.replace(new) - #new.fixers_applied.append(fixer) - for node in new.post_order(): - # do not apply the fixer again to - # this or any subnode - if not node.fixers_applied: - node.fixers_applied = [] - node.fixers_applied.append(fixer) - - # update the original match set for - # the added code - new_matches = self.BM.run(new.leaves()) - for fxr in new_matches: - if not fxr in match_set: - match_set[fxr]=[] - - match_set[fxr].extend(new_matches[fxr]) - - for fixer in chain(self.pre_order, self.post_order): - fixer.finish_tree(tree, name) - return tree.was_changed - - def traverse_by(self, fixers, traversal): - """Traverse an AST, applying a set of fixers to each node. - - This is a helper method for refactor_tree(). - - Args: - fixers: a list of fixer instances. - traversal: a generator that yields AST nodes. - - Returns: - None - """ - if not fixers: - return - for node in traversal: - for fixer in fixers[node.type]: - results = fixer.match(node) - if results: - new = fixer.transform(node, results) - if new is not None: - node.replace(new) - node = new - - def processed_file(self, new_text, filename, old_text=None, write=False, - encoding=None): - """ - Called when a file has been refactored and there may be changes. - """ - self.files.append(filename) - if old_text is None: - old_text = self._read_python_source(filename)[0] - if old_text is None: - return - equal = old_text == new_text - self.print_output(old_text, new_text, filename, equal) - if equal: - self.log_debug("No changes to %s", filename) - if not self.write_unchanged_files: - return - if write: - self.write_file(new_text, filename, old_text, encoding) - else: - self.log_debug("Not writing changes to %s", filename) - - def write_file(self, new_text, filename, old_text, encoding=None): - """Writes a string to a file. - - It first shows a unified diff between the old text and the new text, and - then rewrites the file; the latter is only done if the write option is - set. - """ - try: - fp = io.open(filename, "w", encoding=encoding, newline='') - except OSError as err: - self.log_error("Can't create %s: %s", filename, err) - return - - with fp: - try: - fp.write(new_text) - except OSError as err: - self.log_error("Can't write %s: %s", filename, err) - self.log_debug("Wrote changes to %s", filename) - self.wrote = True - - PS1 = ">>> " - PS2 = "... " - - def refactor_docstring(self, input, filename): - """Refactors a docstring, looking for doctests. - - This returns a modified version of the input string. It looks - for doctests, which start with a ">>>" prompt, and may be - continued with "..." prompts, as long as the "..." is indented - the same as the ">>>". - - (Unfortunately we can't use the doctest module's parser, - since, like most parsers, it is not geared towards preserving - the original source.) - """ - result = [] - block = None - block_lineno = None - indent = None - lineno = 0 - for line in input.splitlines(keepends=True): - lineno += 1 - if line.lstrip().startswith(self.PS1): - if block is not None: - result.extend(self.refactor_doctest(block, block_lineno, - indent, filename)) - block_lineno = lineno - block = [line] - i = line.find(self.PS1) - indent = line[:i] - elif (indent is not None and - (line.startswith(indent + self.PS2) or - line == indent + self.PS2.rstrip() + "\n")): - block.append(line) - else: - if block is not None: - result.extend(self.refactor_doctest(block, block_lineno, - indent, filename)) - block = None - indent = None - result.append(line) - if block is not None: - result.extend(self.refactor_doctest(block, block_lineno, - indent, filename)) - return "".join(result) - - def refactor_doctest(self, block, lineno, indent, filename): - """Refactors one doctest. - - A doctest is given as a block of lines, the first of which starts - with ">>>" (possibly indented), while the remaining lines start - with "..." (identically indented). - - """ - try: - tree = self.parse_block(block, lineno, indent) - except Exception as err: - if self.logger.isEnabledFor(logging.DEBUG): - for line in block: - self.log_debug("Source: %s", line.rstrip("\n")) - self.log_error("Can't parse docstring in %s line %s: %s: %s", - filename, lineno, err.__class__.__name__, err) - return block - if self.refactor_tree(tree, filename): - new = str(tree).splitlines(keepends=True) - # Undo the adjustment of the line numbers in wrap_toks() below. - clipped, new = new[:lineno-1], new[lineno-1:] - assert clipped == ["\n"] * (lineno-1), clipped - if not new[-1].endswith("\n"): - new[-1] += "\n" - block = [indent + self.PS1 + new.pop(0)] - if new: - block += [indent + self.PS2 + line for line in new] - return block - - def summarize(self): - if self.wrote: - were = "were" - else: - were = "need to be" - if not self.files: - self.log_message("No files %s modified.", were) - else: - self.log_message("Files that %s modified:", were) - for file in self.files: - self.log_message(file) - if self.fixer_log: - self.log_message("Warnings/messages while refactoring:") - for message in self.fixer_log: - self.log_message(message) - if self.errors: - if len(self.errors) == 1: - self.log_message("There was 1 error:") - else: - self.log_message("There were %d errors:", len(self.errors)) - for msg, args, kwds in self.errors: - self.log_message(msg, *args, **kwds) - - def parse_block(self, block, lineno, indent): - """Parses a block into a tree. - - This is necessary to get correct line number / offset information - in the parser diagnostics and embedded into the parse tree. - """ - tree = self.driver.parse_tokens(self.wrap_toks(block, lineno, indent)) - tree.future_features = frozenset() - return tree - - def wrap_toks(self, block, lineno, indent): - """Wraps a tokenize stream to systematically modify start/end.""" - tokens = tokenize.generate_tokens(self.gen_lines(block, indent).__next__) - for type, value, (line0, col0), (line1, col1), line_text in tokens: - line0 += lineno - 1 - line1 += lineno - 1 - # Don't bother updating the columns; this is too complicated - # since line_text would also have to be updated and it would - # still break for tokens spanning lines. Let the user guess - # that the column numbers for doctests are relative to the - # end of the prompt string (PS1 or PS2). - yield type, value, (line0, col0), (line1, col1), line_text - - - def gen_lines(self, block, indent): - """Generates lines as expected by tokenize from a list of lines. - - This strips the first len(indent + self.PS1) characters off each line. - """ - prefix1 = indent + self.PS1 - prefix2 = indent + self.PS2 - prefix = prefix1 - for line in block: - if line.startswith(prefix): - yield line[len(prefix):] - elif line == prefix.rstrip() + "\n": - yield "\n" - else: - raise AssertionError("line=%r, prefix=%r" % (line, prefix)) - prefix = prefix2 - while True: - yield "" - - -class MultiprocessingUnsupported(Exception): - pass - - -class MultiprocessRefactoringTool(RefactoringTool): - - def __init__(self, *args, **kwargs): - super(MultiprocessRefactoringTool, self).__init__(*args, **kwargs) - self.queue = None - self.output_lock = None - - def refactor(self, items, write=False, doctests_only=False, - num_processes=1): - if num_processes == 1: - return super(MultiprocessRefactoringTool, self).refactor( - items, write, doctests_only) - try: - import multiprocessing - except ImportError: - raise MultiprocessingUnsupported - if self.queue is not None: - raise RuntimeError("already doing multiple processes") - self.queue = multiprocessing.JoinableQueue() - self.output_lock = multiprocessing.Lock() - processes = [multiprocessing.Process(target=self._child) - for i in range(num_processes)] - try: - for p in processes: - p.start() - super(MultiprocessRefactoringTool, self).refactor(items, write, - doctests_only) - finally: - self.queue.join() - for i in range(num_processes): - self.queue.put(None) - for p in processes: - if p.is_alive(): - p.join() - self.queue = None - - def _child(self): - task = self.queue.get() - while task is not None: - args, kwargs = task - try: - super(MultiprocessRefactoringTool, self).refactor_file( - *args, **kwargs) - finally: - self.queue.task_done() - task = self.queue.get() - - def refactor_file(self, *args, **kwargs): - if self.queue is not None: - self.queue.put((args, kwargs)) - else: - return super(MultiprocessRefactoringTool, self).refactor_file( - *args, **kwargs) diff --git a/Lib/linecache.py b/Lib/linecache.py index 97644a8e..4b38a046 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -5,11 +5,6 @@ is not found, it will look down the module search path for a file by that name. """ -import functools -import sys -import os -import tokenize - __all__ = ["getline", "clearcache", "checkcache", "lazycache"] @@ -68,9 +63,14 @@ def checkcache(filename=None): size, mtime, lines, fullname = entry if mtime is None: continue # no-op for files loaded via a __loader__ + try: + # This import can fail if the interpreter is shutting down + import os + except ImportError: + return try: stat = os.stat(fullname) - except OSError: + except (OSError, ValueError): cache.pop(filename, None) continue if size != stat.st_size or mtime != stat.st_mtime: @@ -82,6 +82,13 @@ def updatecache(filename, module_globals=None): If something's wrong, print a message, discard the cache entry, and return an empty list.""" + # These imports are not at top level because linecache is in the critical + # path of the interpreter startup and importing os and sys take a lot of time + # and slows down the startup sequence. + import os + import sys + import tokenize + if filename in cache: if len(cache[filename]) != 1: cache.pop(filename, None) @@ -128,16 +135,20 @@ def updatecache(filename, module_globals=None): try: stat = os.stat(fullname) break - except OSError: + except (OSError, ValueError): pass else: return [] + except ValueError: # may be raised by os.stat() + return [] try: with tokenize.open(fullname) as fp: lines = fp.readlines() except (OSError, UnicodeDecodeError, SyntaxError): return [] - if lines and not lines[-1].endswith('\n'): + if not lines: + lines = ['\n'] + elif not lines[-1].endswith('\n'): lines[-1] += '\n' size, mtime = stat.st_size, stat.st_mtime cache[filename] = size, mtime, lines, fullname @@ -166,17 +177,24 @@ def lazycache(filename, module_globals): return False # Try for a __loader__, if available if module_globals and '__name__' in module_globals: - name = module_globals['__name__'] - if (loader := module_globals.get('__loader__')) is None: - if spec := module_globals.get('__spec__'): - try: - loader = spec.loader - except AttributeError: - pass + spec = module_globals.get('__spec__') + name = getattr(spec, 'name', None) or module_globals['__name__'] + loader = getattr(spec, 'loader', None) + if loader is None: + loader = module_globals.get('__loader__') get_source = getattr(loader, 'get_source', None) if name and get_source: - get_lines = functools.partial(get_source, name) + def get_lines(name=name, *args, **kwargs): + return get_source(name, *args, **kwargs) cache[filename] = (get_lines,) return True return False + + +def _register_code(code, string, name): + cache[code] = ( + len(string), + None, + [line + '\n' for line in string.splitlines()], + name) diff --git a/Lib/locale.py b/Lib/locale.py index e94f0d1a..d8c09f11 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -25,7 +25,7 @@ import functools # Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before # trying the import. So __all__ is also fiddled at the end of the file. __all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", - "setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm", + "setlocale", "localeconv", "strcoll", "strxfrm", "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding"] @@ -541,12 +541,14 @@ def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): """ import warnings - warnings.warn( - "Use setlocale(), getencoding() and getlocale() instead", - DeprecationWarning, stacklevel=2 - ) + warnings._deprecated( + "locale.getdefaultlocale", + "{name!r} is deprecated and slated for removal in Python {remove}. " + "Use setlocale(), getencoding() and getlocale() instead.", + remove=(3, 15)) return _getdefaultlocale(envvars) + def _getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): try: # check if it's supported by the _locale module @@ -612,40 +614,15 @@ def setlocale(category, locale=None): locale = normalize(_build_localename(locale)) return _setlocale(category, locale) -def resetlocale(category=LC_ALL): - - """ Sets the locale for category to the default setting. - - The default setting is determined by calling - getdefaultlocale(). category defaults to LC_ALL. - - """ - import warnings - warnings.warn( - 'Use locale.setlocale(locale.LC_ALL, "") instead', - DeprecationWarning, stacklevel=2 - ) - - with warnings.catch_warnings(): - warnings.simplefilter('ignore', category=DeprecationWarning) - loc = getdefaultlocale() - - _setlocale(category, _build_localename(loc)) - try: from _locale import getencoding except ImportError: + # When _locale.getencoding() is missing, locale.getencoding() uses the + # Python filesystem encoding. def getencoding(): - if hasattr(sys, 'getandroidapilevel'): - # On Android langinfo.h and CODESET are missing, and UTF-8 is - # always used in mbstowcs() and wcstombs(). - return 'utf-8' - encoding = _getdefaultlocale()[1] - if encoding is None: - # LANG not set, default to UTF-8 - encoding = 'utf-8' - return encoding + return sys.getfilesystemencoding() + try: CODESET @@ -1483,7 +1460,8 @@ locale_alias = { # to include every locale up to Windows Vista. # # NOTE: this mapping is incomplete. If your language is missing, please -# submit a bug report to the Python bug tracker at http://bugs.python.org/ +# submit a bug report as detailed in the Python devguide at: +# https://devguide.python.org/triage/issue-tracker/ # Make sure you include the missing language identifier and the suggested # locale code. # @@ -1729,17 +1707,6 @@ def _print_locale(): print(' Encoding: ', enc or '(undefined)') print() - print() - print('Locale settings after calling resetlocale():') - print('-'*72) - resetlocale() - for name,category in categories.items(): - print(name, '...') - lang, enc = getlocale(category) - print(' Language: ', lang or '(undefined)') - print(' Encoding: ', enc or '(undefined)') - print() - try: setlocale(LC_ALL, "") except: diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 056380fb..aa9b79d8 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -56,7 +56,7 @@ __date__ = "07 February 2010" # #_startTime is used as the base when calculating the relative time of events # -_startTime = time.time() +_startTime = time.time_ns() # #raiseExceptions is used to see if exceptions during handling should be @@ -159,12 +159,9 @@ def addLevelName(level, levelName): This is used when converting levels to text during message formatting. """ - _acquireLock() - try: #unlikely to cause an exception, but you never know... + with _lock: _levelToName[level] = levelName _nameToLevel[levelName] = level - finally: - _releaseLock() if hasattr(sys, "_getframe"): currentframe = lambda: sys._getframe(1) @@ -231,21 +228,27 @@ def _checkLevel(level): # _lock = threading.RLock() -def _acquireLock(): +def _prepareFork(): """ - Acquire the module-level lock for serializing access to shared data. + Prepare to fork a new child process by acquiring the module-level lock. - This should be released with _releaseLock(). + This should be used in conjunction with _afterFork(). """ - if _lock: + # Wrap the lock acquisition in a try-except to prevent the lock from being + # abandoned in the event of an asynchronous exception. See gh-106238. + try: _lock.acquire() + except BaseException: + _lock.release() + raise -def _releaseLock(): +def _afterFork(): """ - Release the module-level lock acquired by calling _acquireLock(). + After a new child process has been forked, release the module-level lock. + + This should be used in conjunction with _prepareFork(). """ - if _lock: - _lock.release() + _lock.release() # Prevent a held logging lock from blocking a child from logging. @@ -260,23 +263,20 @@ else: _at_fork_reinit_lock_weakset = weakref.WeakSet() def _register_at_fork_reinit_lock(instance): - _acquireLock() - try: + with _lock: _at_fork_reinit_lock_weakset.add(instance) - finally: - _releaseLock() def _after_at_fork_child_reinit_locks(): for handler in _at_fork_reinit_lock_weakset: handler._at_fork_reinit() - # _acquireLock() was called in the parent before forking. + # _prepareFork() was called in the parent before forking. # The lock is reinitialized to unlocked state. _lock._at_fork_reinit() - os.register_at_fork(before=_acquireLock, + os.register_at_fork(before=_prepareFork, after_in_child=_after_at_fork_child_reinit_locks, - after_in_parent=_releaseLock) + after_in_parent=_afterFork) #--------------------------------------------------------------------------- @@ -300,7 +300,7 @@ class LogRecord(object): """ Initialize a logging record with interesting information. """ - ct = time.time() + ct = time.time_ns() self.name = name self.msg = msg # @@ -339,9 +339,17 @@ class LogRecord(object): self.stack_info = sinfo self.lineno = lineno self.funcName = func - self.created = ct - self.msecs = int((ct - int(ct)) * 1000) + 0.0 # see gh-89047 - self.relativeCreated = (self.created - _startTime) * 1000 + self.created = ct / 1e9 # ns to float seconds + # Get the number of whole milliseconds (0-999) in the fractional part of seconds. + # Eg: 1_677_903_920_999_998_503 ns --> 999_998_503 ns--> 999 ms + # Convert to float by adding 0.0 for historical reasons. See gh-89047 + self.msecs = (ct % 1_000_000_000) // 1_000_000 + 0.0 + if self.msecs == 999.0 and int(self.created) != ct // 1_000_000_000: + # ns -> sec conversion can round up, e.g: + # 1_677_903_920_999_999_900 ns --> 1_677_903_921.0 sec + self.msecs = 0.0 + + self.relativeCreated = (ct - _startTime) / 1e6 if logThreads: self.thread = threading.get_ident() self.threadName = threading.current_thread().name @@ -572,7 +580,7 @@ class Formatter(object): %(lineno)d Source line number where the logging call was issued (if available) %(funcName)s Function name - %(created)f Time when the LogRecord was created (time.time() + %(created)f Time when the LogRecord was created (time.time_ns() / 1e9 return value) %(asctime)s Textual time when the LogRecord was created %(msecs)d Millisecond portion of the creation time @@ -658,7 +666,7 @@ class Formatter(object): # See issues #9427, #1553375. Commented out for now. #if getattr(self, 'fullstack', False): # traceback.print_stack(tb.tb_frame.f_back, file=sio) - traceback.print_exception(ei[0], ei[1], tb, None, sio) + traceback.print_exception(ei[0], ei[1], tb, limit=None, file=sio) s = sio.getvalue() sio.close() if s[-1:] == "\n": @@ -879,25 +887,20 @@ def _removeHandlerRef(wr): # set to None. It can also be called from another thread. So we need to # pre-emptively grab the necessary globals and check if they're None, # to prevent race conditions and failures during interpreter shutdown. - acquire, release, handlers = _acquireLock, _releaseLock, _handlerList - if acquire and release and handlers: - acquire() - try: - handlers.remove(wr) - except ValueError: - pass - finally: - release() + handlers, lock = _handlerList, _lock + if lock and handlers: + with lock: + try: + handlers.remove(wr) + except ValueError: + pass def _addHandlerRef(handler): """ Add a handler to the internal cleanup list using a weak reference. """ - _acquireLock() - try: + with _lock: _handlerList.append(weakref.ref(handler, _removeHandlerRef)) - finally: - _releaseLock() def getHandlerByName(name): @@ -912,8 +915,7 @@ def getHandlerNames(): """ Return all known handler names as an immutable set. """ - result = set(_handlers.keys()) - return frozenset(result) + return frozenset(_handlers) class Handler(Filterer): @@ -943,15 +945,12 @@ class Handler(Filterer): return self._name def set_name(self, name): - _acquireLock() - try: + with _lock: if self._name in _handlers: del _handlers[self._name] self._name = name if name: _handlers[name] = self - finally: - _releaseLock() name = property(get_name, set_name) @@ -1023,11 +1022,8 @@ class Handler(Filterer): if isinstance(rv, LogRecord): record = rv if rv: - self.acquire() - try: + with self.lock: self.emit(record) - finally: - self.release() return rv def setFormatter(self, fmt): @@ -1055,13 +1051,10 @@ class Handler(Filterer): methods. """ #get the module data lock, as we're updating a shared structure. - _acquireLock() - try: #unlikely to raise an exception, but you never know... + with _lock: self._closed = True if self._name and self._name in _handlers: del _handlers[self._name] - finally: - _releaseLock() def handleError(self, record): """ @@ -1076,14 +1069,14 @@ class Handler(Filterer): The record which was being processed is passed in to this method. """ if raiseExceptions and sys.stderr: # see issue 13807 - t, v, tb = sys.exc_info() + exc = sys.exception() try: sys.stderr.write('--- Logging error ---\n') - traceback.print_exception(t, v, tb, None, sys.stderr) + traceback.print_exception(exc, limit=None, file=sys.stderr) sys.stderr.write('Call stack:\n') # Walk the stack frame up until we're out of logging, # so as to print the calling context. - frame = tb.tb_frame + frame = exc.__traceback__.tb_frame while (frame and os.path.dirname(frame.f_code.co_filename) == __path__[0]): frame = frame.f_back @@ -1108,7 +1101,7 @@ class Handler(Filterer): except OSError: #pragma: no cover pass # see issue 5971 finally: - del t, v, tb + del exc def __repr__(self): level = getLevelName(self.level) @@ -1138,12 +1131,9 @@ class StreamHandler(Handler): """ Flushes the stream. """ - self.acquire() - try: + with self.lock: if self.stream and hasattr(self.stream, "flush"): self.stream.flush() - finally: - self.release() def emit(self, record): """ @@ -1179,12 +1169,9 @@ class StreamHandler(Handler): result = None else: result = self.stream - self.acquire() - try: + with self.lock: self.flush() self.stream = stream - finally: - self.release() return result def __repr__(self): @@ -1234,8 +1221,7 @@ class FileHandler(StreamHandler): """ Closes the stream. """ - self.acquire() - try: + with self.lock: try: if self.stream: try: @@ -1251,8 +1237,6 @@ class FileHandler(StreamHandler): # Also see Issue #42378: we also rely on # self._closed being set to True there StreamHandler.close(self) - finally: - self.release() def _open(self): """ @@ -1388,8 +1372,7 @@ class Manager(object): rv = None if not isinstance(name, str): raise TypeError('A logger name must be a string') - _acquireLock() - try: + with _lock: if name in self.loggerDict: rv = self.loggerDict[name] if isinstance(rv, PlaceHolder): @@ -1404,8 +1387,6 @@ class Manager(object): rv.manager = self self.loggerDict[name] = rv self._fixupParents(rv) - finally: - _releaseLock() return rv def setLoggerClass(self, klass): @@ -1468,12 +1449,11 @@ class Manager(object): Called when level changes are made """ - _acquireLock() - for logger in self.loggerDict.values(): - if isinstance(logger, Logger): - logger._cache.clear() - self.root._cache.clear() - _releaseLock() + with _lock: + for logger in self.loggerDict.values(): + if isinstance(logger, Logger): + logger._cache.clear() + self.root._cache.clear() #--------------------------------------------------------------------------- # Logger classes and functions @@ -1521,7 +1501,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.debug("Houston, we have a %s", "thorny problem", exc_info=1) + logger.debug("Houston, we have a %s", "thorny problem", exc_info=True) """ if self.isEnabledFor(DEBUG): self._log(DEBUG, msg, args, **kwargs) @@ -1533,7 +1513,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.info("Houston, we have a %s", "notable problem", exc_info=1) + logger.info("Houston, we have a %s", "notable problem", exc_info=True) """ if self.isEnabledFor(INFO): self._log(INFO, msg, args, **kwargs) @@ -1545,7 +1525,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1) + logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True) """ if self.isEnabledFor(WARNING): self._log(WARNING, msg, args, **kwargs) @@ -1562,7 +1542,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.error("Houston, we have a %s", "major problem", exc_info=1) + logger.error("Houston, we have a %s", "major problem", exc_info=True) """ if self.isEnabledFor(ERROR): self._log(ERROR, msg, args, **kwargs) @@ -1580,7 +1560,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.critical("Houston, we have a %s", "major disaster", exc_info=1) + logger.critical("Houston, we have a %s", "major disaster", exc_info=True) """ if self.isEnabledFor(CRITICAL): self._log(CRITICAL, msg, args, **kwargs) @@ -1598,7 +1578,7 @@ class Logger(Filterer): To pass exception information, use the keyword argument exc_info with a true value, e.g. - logger.log(level, "We have a %s", "mysterious problem", exc_info=1) + logger.log(level, "We have a %s", "mysterious problem", exc_info=True) """ if not isinstance(level, int): if raiseExceptions: @@ -1703,23 +1683,17 @@ class Logger(Filterer): """ Add the specified handler to this logger. """ - _acquireLock() - try: + with _lock: if not (hdlr in self.handlers): self.handlers.append(hdlr) - finally: - _releaseLock() def removeHandler(self, hdlr): """ Remove the specified handler from this logger. """ - _acquireLock() - try: + with _lock: if hdlr in self.handlers: self.handlers.remove(hdlr) - finally: - _releaseLock() def hasHandlers(self): """ @@ -1797,16 +1771,13 @@ class Logger(Filterer): try: return self._cache[level] except KeyError: - _acquireLock() - try: + with _lock: if self.manager.disable >= level: is_enabled = self._cache[level] = False else: is_enabled = self._cache[level] = ( level >= self.getEffectiveLevel() ) - finally: - _releaseLock() return is_enabled def getChild(self, suffix): @@ -1836,16 +1807,13 @@ class Logger(Filterer): return 1 + logger.name.count('.') d = self.manager.loggerDict - _acquireLock() - try: + with _lock: # exclude PlaceHolders - the last check is to ensure that lower-level # descendants aren't returned - if there are placeholders, a logger's # parent field might point to a grandparent or ancestor thereof. return set(item for item in d.values() if isinstance(item, Logger) and item.parent is self and _hierlevel(item) == 1 + _hierlevel(item.parent)) - finally: - _releaseLock() def __repr__(self): level = getLevelName(self.getEffectiveLevel()) @@ -1881,7 +1849,7 @@ class LoggerAdapter(object): information in logging output. """ - def __init__(self, logger, extra=None): + def __init__(self, logger, extra=None, merge_extra=False): """ Initialize the adapter with a logger and a dict-like object which provides contextual information. This constructor signature allows @@ -1891,9 +1859,20 @@ class LoggerAdapter(object): following example: adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2")) + + By default, LoggerAdapter objects will drop the "extra" argument + passed on the individual log calls to use its own instead. + + Initializing it with merge_extra=True will instead merge both + maps when logging, the individual call extra taking precedence + over the LoggerAdapter instance extra + + .. versionchanged:: 3.13 + The *merge_extra* argument was added. """ self.logger = logger self.extra = extra + self.merge_extra = merge_extra def process(self, msg, kwargs): """ @@ -1905,7 +1884,10 @@ class LoggerAdapter(object): Normally, you'll only need to override this one method in a LoggerAdapter subclass for your specific needs. """ - kwargs["extra"] = self.extra + if self.merge_extra and "extra" in kwargs: + kwargs["extra"] = {**self.extra, **kwargs["extra"]} + else: + kwargs["extra"] = self.extra return msg, kwargs # @@ -1985,18 +1967,11 @@ class LoggerAdapter(object): """ return self.logger.hasHandlers() - def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False): + def _log(self, level, msg, args, **kwargs): """ Low-level log implementation, proxied to allow nested logger adapters. """ - return self.logger._log( - level, - msg, - args, - exc_info=exc_info, - extra=extra, - stack_info=stack_info, - ) + return self.logger._log(level, msg, args, **kwargs) @property def manager(self): @@ -2056,7 +2031,7 @@ def basicConfig(**kwargs): that this argument is incompatible with 'filename' - if both are present, 'stream' is ignored. handlers If specified, this should be an iterable of already created - handlers, which will be added to the root handler. Any handler + handlers, which will be added to the root logger. Any handler in the list which does not have a formatter assigned will be assigned the formatter created in this function. force If this keyword is specified as true, any existing handlers @@ -2095,8 +2070,7 @@ def basicConfig(**kwargs): """ # Add thread safety in case someone mistakenly calls # basicConfig() from multiple threads - _acquireLock() - try: + with _lock: force = kwargs.pop('force', False) encoding = kwargs.pop('encoding', None) errors = kwargs.pop('errors', 'backslashreplace') @@ -2145,8 +2119,6 @@ def basicConfig(**kwargs): if kwargs: keys = ', '.join(kwargs.keys()) raise ValueError('Unrecognised argument(s): %s' % keys) - finally: - _releaseLock() #--------------------------------------------------------------------------- # Utility functions at module level. diff --git a/Lib/logging/config.py b/Lib/logging/config.py index a68281d3..190b4f92 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -1,4 +1,4 @@ -# Copyright 2001-2022 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2023 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -83,15 +83,12 @@ def fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=Non formatters = _create_formatters(cp) # critical section - logging._acquireLock() - try: + with logging._lock: _clearExistingHandlers() # Handlers add themselves to logging._handlers handlers = _install_handlers(cp, formatters) _install_loggers(cp, handlers, disable_existing_loggers) - finally: - logging._releaseLock() def _resolve(name): @@ -378,7 +375,7 @@ class BaseConfigurator(object): WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + INDEX_PATTERN = re.compile(r'^\[([^\[\]]*)\]\s*') DIGIT_PATTERN = re.compile(r'^\d+$') value_converters = { @@ -485,10 +482,10 @@ class BaseConfigurator(object): c = config.pop('()') if not callable(c): c = self.resolve(c) - props = config.pop('.', None) # Check for valid identifiers - kwargs = {k: config[k] for k in config if valid_ident(k)} + kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))} result = c(**kwargs) + props = config.pop('.', None) if props: for name, value in props.items(): setattr(result, name, value) @@ -500,6 +497,33 @@ class BaseConfigurator(object): value = tuple(value) return value +def _is_queue_like_object(obj): + """Check that *obj* implements the Queue API.""" + if isinstance(obj, (queue.Queue, queue.SimpleQueue)): + return True + # defer importing multiprocessing as much as possible + from multiprocessing.queues import Queue as MPQueue + if isinstance(obj, MPQueue): + return True + # Depending on the multiprocessing start context, we cannot create + # a multiprocessing.managers.BaseManager instance 'mm' to get the + # runtime type of mm.Queue() or mm.JoinableQueue() (see gh-119819). + # + # Since we only need an object implementing the Queue API, we only + # do a protocol check, but we do not use typing.runtime_checkable() + # and typing.Protocol to reduce import time (see gh-121723). + # + # Ideally, we would have wanted to simply use strict type checking + # instead of a protocol-based type checking since the latter does + # not check the method signatures. + # + # Note that only 'put_nowait' and 'get' are required by the logging + # queue handler and queue listener (see gh-124653) and that other + # methods are either optional or unused. + minimal_queue_interface = ['put_nowait', 'get'] + return all(callable(getattr(obj, method, None)) + for method in minimal_queue_interface) + class DictConfigurator(BaseConfigurator): """ Configure logging using a dictionary-like object to describe the @@ -516,8 +540,7 @@ class DictConfigurator(BaseConfigurator): raise ValueError("Unsupported version: %s" % config['version']) incremental = config.pop('incremental', False) EMPTY_DICT = {} - logging._acquireLock() - try: + with logging._lock: if incremental: handlers = config.get('handlers', EMPTY_DICT) for name in handlers: @@ -661,8 +684,6 @@ class DictConfigurator(BaseConfigurator): except Exception as e: raise ValueError('Unable to configure root ' 'logger') from e - finally: - logging._releaseLock() def configure_formatter(self, config): """Configure a formatter from a dictionary.""" @@ -673,10 +694,9 @@ class DictConfigurator(BaseConfigurator): except TypeError as te: if "'format'" not in str(te): raise - #Name of parameter changed from fmt to format. - #Retry with old name. - #This is so that code can be used with older Python versions - #(e.g. by Django) + # logging.Formatter and its subclasses expect the `fmt` + # parameter instead of `format`. Retry passing configuration + # with `fmt`. config['fmt'] = config.pop('format') config['()'] = factory result = self.configure_custom(config) @@ -732,16 +752,16 @@ class DictConfigurator(BaseConfigurator): def _configure_queue_handler(self, klass, **kwargs): if 'queue' in kwargs: - q = kwargs['queue'] + q = kwargs.pop('queue') else: q = queue.Queue() # unbounded - rhl = kwargs.get('respect_handler_level', False) - if 'listener' in kwargs: - lklass = kwargs['listener'] - else: - lklass = logging.handlers.QueueListener - listener = lklass(q, *kwargs['handlers'], respect_handler_level=rhl) - handler = klass(q) + + rhl = kwargs.pop('respect_handler_level', False) + lklass = kwargs.pop('listener', logging.handlers.QueueListener) + handlers = kwargs.pop('handlers', []) + + listener = lklass(q, *handlers, respect_handler_level=rhl) + handler = klass(q, **kwargs) handler.listener = listener return handler @@ -768,37 +788,39 @@ class DictConfigurator(BaseConfigurator): klass = cname else: klass = self.resolve(cname) - if issubclass(klass, logging.handlers.MemoryHandler) and\ - 'target' in config: - # Special case for handler which refers to another handler - try: - tn = config['target'] - th = self.config['handlers'][tn] - if not isinstance(th, logging.Handler): - config.update(config_copy) # restore for deferred cfg - raise TypeError('target not configured yet') - config['target'] = th - except Exception as e: - raise ValueError('Unable to set target handler %r' % tn) from e + if issubclass(klass, logging.handlers.MemoryHandler): + if 'flushLevel' in config: + config['flushLevel'] = logging._checkLevel(config['flushLevel']) + if 'target' in config: + # Special case for handler which refers to another handler + try: + tn = config['target'] + th = self.config['handlers'][tn] + if not isinstance(th, logging.Handler): + config.update(config_copy) # restore for deferred cfg + raise TypeError('target not configured yet') + config['target'] = th + except Exception as e: + raise ValueError('Unable to set target handler %r' % tn) from e elif issubclass(klass, logging.handlers.QueueHandler): # Another special case for handler which refers to other handlers - if 'handlers' not in config: - raise ValueError('No handlers specified for a QueueHandler') + # if 'handlers' not in config: + # raise ValueError('No handlers specified for a QueueHandler') if 'queue' in config: qspec = config['queue'] - if not isinstance(qspec, queue.Queue): - if isinstance(qspec, str): - q = self.resolve(qspec) - if not callable(q): - raise TypeError('Invalid queue specifier %r' % qspec) - q = q() - elif isinstance(qspec, dict): - if '()' not in qspec: - raise TypeError('Invalid queue specifier %r' % qspec) - q = self.configure_custom(dict(qspec)) - else: + + if isinstance(qspec, str): + q = self.resolve(qspec) + if not callable(q): + raise TypeError('Invalid queue specifier %r' % qspec) + config['queue'] = q() + elif isinstance(qspec, dict): + if '()' not in qspec: raise TypeError('Invalid queue specifier %r' % qspec) - config['queue'] = q + config['queue'] = self.configure_custom(dict(qspec)) + elif not _is_queue_like_object(qspec): + raise TypeError('Invalid queue specifier %r' % qspec) + if 'listener' in config: lspec = config['listener'] if isinstance(lspec, type): @@ -819,18 +841,19 @@ class DictConfigurator(BaseConfigurator): if not callable(listener): raise TypeError('Invalid listener specifier %r' % lspec) config['listener'] = listener - hlist = [] - try: - for hn in config['handlers']: - h = self.config['handlers'][hn] - if not isinstance(h, logging.Handler): - config.update(config_copy) # restore for deferred cfg - raise TypeError('Required handler %r ' - 'is not configured yet' % hn) - hlist.append(h) - except Exception as e: - raise ValueError('Unable to set required handler %r' % hn) from e - config['handlers'] = hlist + if 'handlers' in config: + hlist = [] + try: + for hn in config['handlers']: + h = self.config['handlers'][hn] + if not isinstance(h, logging.Handler): + config.update(config_copy) # restore for deferred cfg + raise TypeError('Required handler %r ' + 'is not configured yet' % hn) + hlist.append(h) + except Exception as e: + raise ValueError('Unable to set required handler %r' % hn) from e + config['handlers'] = hlist elif issubclass(klass, logging.handlers.SMTPHandler) and\ 'mailhost' in config: config['mailhost'] = self.as_tuple(config['mailhost']) @@ -841,8 +864,7 @@ class DictConfigurator(BaseConfigurator): factory = functools.partial(self._configure_queue_handler, klass) else: factory = klass - props = config.pop('.', None) - kwargs = {k: config[k] for k in config if valid_ident(k)} + kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))} try: result = factory(**kwargs) except TypeError as te: @@ -860,6 +882,7 @@ class DictConfigurator(BaseConfigurator): result.setLevel(logging._checkLevel(level)) if filters: self.add_filters(result, filters) + props = config.pop('.', None) if props: for name, value in props.items(): setattr(result, name, value) @@ -988,9 +1011,8 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None): def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT, handler=None, ready=None, verify=None): ThreadingTCPServer.__init__(self, (host, port), handler) - logging._acquireLock() - self.abort = 0 - logging._releaseLock() + with logging._lock: + self.abort = 0 self.timeout = 1 self.ready = ready self.verify = verify @@ -1004,9 +1026,8 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None): self.timeout) if rd: self.handle_request() - logging._acquireLock() - abort = self.abort - logging._releaseLock() + with logging._lock: + abort = self.abort self.server_close() class Server(threading.Thread): @@ -1027,9 +1048,8 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None): self.port = server.server_address[1] self.ready.set() global _listener - logging._acquireLock() - _listener = server - logging._releaseLock() + with logging._lock: + _listener = server server.serve_until_stopped() return Server(ConfigSocketReceiver, ConfigStreamHandler, port, verify) @@ -1039,10 +1059,7 @@ def stopListening(): Stop the listening server which was created with a call to listen(). """ global _listener - logging._acquireLock() - try: + with logging._lock: if _listener: _listener.abort = 1 _listener = None - finally: - logging._releaseLock() diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 671cc959..1cba64fd 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -23,11 +23,17 @@ Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ -import io, logging, socket, os, pickle, struct, time, re -from stat import ST_DEV, ST_INO, ST_MTIME +import copy +import io +import logging +import os +import pickle import queue +import re +import socket +import struct import threading -import copy +import time # # Some constants... @@ -187,15 +193,18 @@ class RotatingFileHandler(BaseRotatingHandler): Basically, see if the supplied record would cause the file to exceed the size limit we have. """ - # See bpo-45401: Never rollover anything other than regular files - if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename): - return False if self.stream is None: # delay was set... self.stream = self._open() if self.maxBytes > 0: # are we rolling over? + pos = self.stream.tell() + if not pos: + # gh-116263: Never rollover an empty file + return False msg = "%s\n" % self.format(record) - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature - if self.stream.tell() + len(msg) >= self.maxBytes: + if pos + len(msg) >= self.maxBytes: + # See bpo-45401: Never rollover anything other than regular files + if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename): + return False return True return False @@ -232,19 +241,19 @@ class TimedRotatingFileHandler(BaseRotatingHandler): if self.when == 'S': self.interval = 1 # one second self.suffix = "%Y-%m-%d_%H-%M-%S" - self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$" + extMatch = r"(? (plen + 1) and not fileName[plen+1].isdigit()): - continue - - if fileName[:plen] == prefix: - suffix = fileName[plen:] - # See bpo-45628: The date/time suffix could be anywhere in the - # filename - parts = suffix.split('.') - for part in parts: - if self.extMatch.match(part): + if self.namer is None: + prefix = baseName + '.' + plen = len(prefix) + for fileName in fileNames: + if fileName[:plen] == prefix: + suffix = fileName[plen:] + if self.extMatch.fullmatch(suffix): + result.append(os.path.join(dirName, fileName)) + else: + for fileName in fileNames: + # Our files could be just about anything after custom naming, + # but they should contain the datetime suffix. + # Try to find the datetime suffix in the file name and verify + # that the file name can be generated by this handler. + m = self.extMatch.search(fileName) + while m: + dfn = self.namer(self.baseFilename + "." + m[0]) + if os.path.basename(dfn) == fileName: result.append(os.path.join(dirName, fileName)) break + m = self.extMatch.search(fileName, m.start() + 1) + if len(result) < self.backupCount: result = [] else: @@ -410,17 +425,14 @@ class TimedRotatingFileHandler(BaseRotatingHandler): then we have to get a list of matching filenames, sort them and remove the one with the oldest suffix. """ - if self.stream: - self.stream.close() - self.stream = None # get the time that this sequence started at and make it a TimeTuple currentTime = int(time.time()) - dstNow = time.localtime(currentTime)[-1] t = self.rolloverAt - self.interval if self.utc: timeTuple = time.gmtime(t) else: timeTuple = time.localtime(t) + dstNow = time.localtime(currentTime)[-1] dstThen = timeTuple[-1] if dstNow != dstThen: if dstNow: @@ -431,26 +443,19 @@ class TimedRotatingFileHandler(BaseRotatingHandler): dfn = self.rotation_filename(self.baseFilename + "." + time.strftime(self.suffix, timeTuple)) if os.path.exists(dfn): - os.remove(dfn) + # Already rolled over. + return + + if self.stream: + self.stream.close() + self.stream = None self.rotate(self.baseFilename, dfn) if self.backupCount > 0: for s in self.getFilesToDelete(): os.remove(s) if not self.delay: self.stream = self._open() - newRolloverAt = self.computeRollover(currentTime) - while newRolloverAt <= currentTime: - newRolloverAt = newRolloverAt + self.interval - #If DST changes and midnight or weekly rollover, adjust for this. - if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc: - dstAtRollover = time.localtime(newRolloverAt)[-1] - if dstNow != dstAtRollover: - if not dstNow: # DST kicks in before next rollover, so we need to deduct an hour - addend = -3600 - else: # DST bows out before next rollover, so we need to add an hour - addend = 3600 - newRolloverAt += addend - self.rolloverAt = newRolloverAt + self.rolloverAt = self.computeRollover(currentTime) class WatchedFileHandler(logging.FileHandler): """ @@ -466,8 +471,7 @@ class WatchedFileHandler(logging.FileHandler): This handler is not appropriate for use under Windows, because under Windows open files cannot be moved or renamed - logging opens the files with exclusive locks - and so there is no need - for such a handler. Furthermore, ST_INO is not supported under - Windows; stat always returns zero for this value. + for such a handler. This handler is based on a suggestion and patch by Chad J. Schroeder. @@ -483,9 +487,11 @@ class WatchedFileHandler(logging.FileHandler): self._statstream() def _statstream(self): - if self.stream: - sres = os.fstat(self.stream.fileno()) - self.dev, self.ino = sres[ST_DEV], sres[ST_INO] + if self.stream is None: + return + sres = os.fstat(self.stream.fileno()) + self.dev = sres.st_dev + self.ino = sres.st_ino def reopenIfNeeded(self): """ @@ -495,6 +501,9 @@ class WatchedFileHandler(logging.FileHandler): has, close the old stream and reopen the file to get the current stream. """ + if self.stream is None: + return + # Reduce the chance of race conditions by stat'ing by path only # once and then fstat'ing our new fd if we opened a new log stream. # See issue #14632: Thanks to John Mulligan for the problem report @@ -502,18 +511,23 @@ class WatchedFileHandler(logging.FileHandler): try: # stat the file by path, checking for existence sres = os.stat(self.baseFilename) + + # compare file system stat with that of our stream file handle + reopen = (sres.st_dev != self.dev or sres.st_ino != self.ino) except FileNotFoundError: - sres = None - # compare file system stat with that of our stream file handle - if not sres or sres[ST_DEV] != self.dev or sres[ST_INO] != self.ino: - if self.stream is not None: - # we have an open file handle, clean it up - self.stream.flush() - self.stream.close() - self.stream = None # See Issue #21742: _open () might fail. - # open a new file handle and get new stat info from that fd - self.stream = self._open() - self._statstream() + reopen = True + + if not reopen: + return + + # we have an open file handle, clean it up + self.stream.flush() + self.stream.close() + self.stream = None # See Issue #21742: _open () might fail. + + # open a new file handle and get new stat info from that fd + self.stream = self._open() + self._statstream() def emit(self, record): """ @@ -683,15 +697,12 @@ class SocketHandler(logging.Handler): """ Closes the socket. """ - self.acquire() - try: + with self.lock: sock = self.sock if sock: self.sock = None sock.close() logging.Handler.close(self) - finally: - self.release() class DatagramHandler(SocketHandler): """ @@ -833,10 +844,8 @@ class SysLogHandler(logging.Handler): "local7": LOG_LOCAL7, } - #The map below appears to be trivially lowercasing the key. However, - #there's more to it than meets the eye - in some locales, lowercasing - #gives unexpected results. See SF #1524081: in the Turkish locale, - #"INFO".lower() != "info" + # Originally added to work around GH-43683. Unnecessary since GH-50043 but kept + # for backwards compatibility. priority_map = { "DEBUG" : "debug", "INFO" : "info", @@ -953,15 +962,12 @@ class SysLogHandler(logging.Handler): """ Closes the socket. """ - self.acquire() - try: + with self.lock: sock = self.socket if sock: self.socket = None sock.close() logging.Handler.close(self) - finally: - self.release() def mapPriority(self, levelName): """ @@ -1333,11 +1339,8 @@ class BufferingHandler(logging.Handler): This version just zaps the buffer to empty. """ - self.acquire() - try: + with self.lock: self.buffer.clear() - finally: - self.release() def close(self): """ @@ -1387,11 +1390,8 @@ class MemoryHandler(BufferingHandler): """ Set the target handler for this handler. """ - self.acquire() - try: + with self.lock: self.target = target - finally: - self.release() def flush(self): """ @@ -1401,14 +1401,11 @@ class MemoryHandler(BufferingHandler): The record buffer is only cleared if a target has been set. """ - self.acquire() - try: + with self.lock: if self.target: for record in self.buffer: self.target.handle(record) self.buffer.clear() - finally: - self.release() def close(self): """ @@ -1419,12 +1416,9 @@ class MemoryHandler(BufferingHandler): if self.flushOnClose: self.flush() finally: - self.acquire() - try: + with self.lock: self.target = None BufferingHandler.close(self) - finally: - self.release() class QueueHandler(logging.Handler): @@ -1606,6 +1600,7 @@ class QueueListener(object): Note that if you don't call this before your application exits, there may be some records still left on the queue, which won't be processed. """ - self.enqueue_sentinel() - self._thread.join() - self._thread = None + if self._thread: # see gh-114706 - allow calling this more than once + self.enqueue_sentinel() + self._thread.join() + self._thread = None diff --git a/Lib/lzma.py b/Lib/lzma.py index 800f5219..c1e3d33d 100644 --- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -29,7 +29,7 @@ from _lzma import _encode_filter_properties, _decode_filter_properties import _compression -_MODE_CLOSED = 0 +# Value 0 no longer used _MODE_READ = 1 # Value 2 no longer used _MODE_WRITE = 3 @@ -92,7 +92,7 @@ class LZMAFile(_compression.BaseStream): """ self._fp = None self._closefp = False - self._mode = _MODE_CLOSED + self._mode = None if mode in ("r", "rb"): if check != -1: @@ -137,7 +137,7 @@ class LZMAFile(_compression.BaseStream): May be called more than once without error. Once the file is closed, any other operation on it will raise a ValueError. """ - if self._mode == _MODE_CLOSED: + if self.closed: return try: if self._mode == _MODE_READ: @@ -153,12 +153,20 @@ class LZMAFile(_compression.BaseStream): finally: self._fp = None self._closefp = False - self._mode = _MODE_CLOSED @property def closed(self): """True if this file is closed.""" - return self._mode == _MODE_CLOSED + return self._fp is None + + @property + def name(self): + self._check_not_closed() + return self._fp.name + + @property + def mode(self): + return 'wb' if self._mode == _MODE_WRITE else 'rb' def fileno(self): """Return the file descriptor for the underlying file.""" diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 59834a2b..b00d9e86 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -395,6 +395,56 @@ class Maildir(Mailbox): f = open(os.path.join(self._path, self._lookup(key)), 'rb') return _ProxyFile(f) + def get_info(self, key): + """Get the keyed message's "info" as a string.""" + subpath = self._lookup(key) + if self.colon in subpath: + return subpath.split(self.colon)[-1] + return '' + + def set_info(self, key, info: str): + """Set the keyed message's "info" string.""" + if not isinstance(info, str): + raise TypeError(f'info must be a string: {type(info)}') + old_subpath = self._lookup(key) + new_subpath = old_subpath.split(self.colon)[0] + if info: + new_subpath += self.colon + info + if new_subpath == old_subpath: + return + old_path = os.path.join(self._path, old_subpath) + new_path = os.path.join(self._path, new_subpath) + os.rename(old_path, new_path) + self._toc[key] = new_subpath + + def get_flags(self, key): + """Return as a string the standard flags that are set on the keyed message.""" + info = self.get_info(key) + if info.startswith('2,'): + return info[2:] + return '' + + def set_flags(self, key, flags: str): + """Set the given flags and unset all others on the keyed message.""" + if not isinstance(flags, str): + raise TypeError(f'flags must be a string: {type(flags)}') + # TODO: check if flags are valid standard flag characters? + self.set_info(key, '2,' + ''.join(sorted(set(flags)))) + + def add_flag(self, key, flag: str): + """Set the given flag(s) without changing others on the keyed message.""" + if not isinstance(flag, str): + raise TypeError(f'flag must be a string: {type(flag)}') + # TODO: check that flag is a valid standard flag character? + self.set_flags(key, ''.join(set(self.get_flags(key)) | set(flag))) + + def remove_flag(self, key, flag: str): + """Unset the given string flag(s) without changing others on the keyed message.""" + if not isinstance(flag, str): + raise TypeError(f'flag must be a string: {type(flag)}') + if self.get_flags(key): + self.set_flags(key, ''.join(set(self.get_flags(key)) - set(flag))) + def iterkeys(self): """Return an iterator over keys.""" self._refresh() @@ -540,6 +590,8 @@ class Maildir(Mailbox): for subdir in self._toc_mtimes: path = self._paths[subdir] for entry in os.listdir(path): + if entry.startswith('.'): + continue p = os.path.join(path, entry) if os.path.isdir(p): continue @@ -698,9 +750,13 @@ class _singlefileMailbox(Mailbox): _sync_close(new_file) # self._file is about to get replaced, so no need to sync. self._file.close() - # Make sure the new file's mode is the same as the old file's - mode = os.stat(self._path).st_mode - os.chmod(new_file.name, mode) + # Make sure the new file's mode and owner are the same as the old file's + info = os.stat(self._path) + os.chmod(new_file.name, info.st_mode) + try: + os.chown(new_file.name, info.st_uid, info.st_gid) + except (AttributeError, OSError): + pass try: os.rename(new_file.name, self._path) except FileExistsError: @@ -778,10 +834,11 @@ class _mboxMMDF(_singlefileMailbox): """Return a Message representation or raise a KeyError.""" start, stop = self._lookup(key) self._file.seek(start) - from_line = self._file.readline().replace(linesep, b'') + from_line = self._file.readline().replace(linesep, b'').decode('ascii') string = self._file.read(stop - self._file.tell()) msg = self._message_factory(string.replace(linesep, b'\n')) - msg.set_from(from_line[5:].decode('ascii')) + msg.set_unixfrom(from_line) + msg.set_from(from_line[5:]) return msg def get_string(self, key, from_=False): @@ -1089,10 +1146,24 @@ class MH(Mailbox): """Return a count of messages in the mailbox.""" return len(list(self.iterkeys())) + def _open_mh_sequences_file(self, text): + mode = '' if text else 'b' + kwargs = {'encoding': 'ASCII'} if text else {} + path = os.path.join(self._path, '.mh_sequences') + while True: + try: + return open(path, 'r+' + mode, **kwargs) + except FileNotFoundError: + pass + try: + return open(path, 'x+' + mode, **kwargs) + except FileExistsError: + pass + def lock(self): """Lock the mailbox.""" if not self._locked: - self._file = open(os.path.join(self._path, '.mh_sequences'), 'rb+') + self._file = self._open_mh_sequences_file(text=False) _lock_file(self._file) self._locked = True @@ -1146,7 +1217,11 @@ class MH(Mailbox): def get_sequences(self): """Return a name-to-key-list dictionary to define each sequence.""" results = {} - with open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') as f: + try: + f = open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') + except FileNotFoundError: + return results + with f: all_keys = set(self.keys()) for line in f: try: @@ -1169,7 +1244,7 @@ class MH(Mailbox): def set_sequences(self, sequences): """Set sequences using the given name-to-key-list dictionary.""" - f = open(os.path.join(self._path, '.mh_sequences'), 'r+', encoding='ASCII') + f = self._open_mh_sequences_file(text=True) try: os.close(os.open(f.name, os.O_WRONLY | os.O_TRUNC)) for name, keys in sequences.items(): diff --git a/Lib/mailcap.py b/Lib/mailcap.py deleted file mode 100644 index 2f4656e8..00000000 --- a/Lib/mailcap.py +++ /dev/null @@ -1,302 +0,0 @@ -"""Mailcap file handling. See RFC 1524.""" - -import os -import warnings -import re - -__all__ = ["getcaps","findmatch"] - - -_DEPRECATION_MSG = ('The {name} module is deprecated and will be removed in ' - 'Python {remove}. See the mimetypes module for an ' - 'alternative.') -warnings._deprecated(__name__, _DEPRECATION_MSG, remove=(3, 13)) - - -def lineno_sort_key(entry): - # Sort in ascending order, with unspecified entries at the end - if 'lineno' in entry: - return 0, entry['lineno'] - else: - return 1, 0 - -_find_unsafe = re.compile(r'[^\xa1-\U0010FFFF\w@+=:,./-]').search - -class UnsafeMailcapInput(Warning): - """Warning raised when refusing unsafe input""" - - -# Part 1: top-level interface. - -def getcaps(): - """Return a dictionary containing the mailcap database. - - The dictionary maps a MIME type (in all lowercase, e.g. 'text/plain') - to a list of dictionaries corresponding to mailcap entries. The list - collects all the entries for that MIME type from all available mailcap - files. Each dictionary contains key-value pairs for that MIME type, - where the viewing command is stored with the key "view". - - """ - caps = {} - lineno = 0 - for mailcap in listmailcapfiles(): - try: - fp = open(mailcap, 'r') - except OSError: - continue - with fp: - morecaps, lineno = _readmailcapfile(fp, lineno) - for key, value in morecaps.items(): - if not key in caps: - caps[key] = value - else: - caps[key] = caps[key] + value - return caps - -def listmailcapfiles(): - """Return a list of all mailcap files found on the system.""" - # This is mostly a Unix thing, but we use the OS path separator anyway - if 'MAILCAPS' in os.environ: - pathstr = os.environ['MAILCAPS'] - mailcaps = pathstr.split(os.pathsep) - else: - if 'HOME' in os.environ: - home = os.environ['HOME'] - else: - # Don't bother with getpwuid() - home = '.' # Last resort - mailcaps = [home + '/.mailcap', '/etc/mailcap', - '/usr/etc/mailcap', '/usr/local/etc/mailcap'] - return mailcaps - - -# Part 2: the parser. -def readmailcapfile(fp): - """Read a mailcap file and return a dictionary keyed by MIME type.""" - warnings.warn('readmailcapfile is deprecated, use getcaps instead', - DeprecationWarning, 2) - caps, _ = _readmailcapfile(fp, None) - return caps - - -def _readmailcapfile(fp, lineno): - """Read a mailcap file and return a dictionary keyed by MIME type. - - Each MIME type is mapped to an entry consisting of a list of - dictionaries; the list will contain more than one such dictionary - if a given MIME type appears more than once in the mailcap file. - Each dictionary contains key-value pairs for that MIME type, where - the viewing command is stored with the key "view". - """ - caps = {} - while line := fp.readline(): - # Ignore comments and blank lines - if line[0] == '#' or line.strip() == '': - continue - nextline = line - # Join continuation lines - while nextline[-2:] == '\\\n': - nextline = fp.readline() - if not nextline: nextline = '\n' - line = line[:-2] + nextline - # Parse the line - key, fields = parseline(line) - if not (key and fields): - continue - if lineno is not None: - fields['lineno'] = lineno - lineno += 1 - # Normalize the key - types = key.split('/') - for j in range(len(types)): - types[j] = types[j].strip() - key = '/'.join(types).lower() - # Update the database - if key in caps: - caps[key].append(fields) - else: - caps[key] = [fields] - return caps, lineno - -def parseline(line): - """Parse one entry in a mailcap file and return a dictionary. - - The viewing command is stored as the value with the key "view", - and the rest of the fields produce key-value pairs in the dict. - """ - fields = [] - i, n = 0, len(line) - while i < n: - field, i = parsefield(line, i, n) - fields.append(field) - i = i+1 # Skip semicolon - if len(fields) < 2: - return None, None - key, view, rest = fields[0], fields[1], fields[2:] - fields = {'view': view} - for field in rest: - i = field.find('=') - if i < 0: - fkey = field - fvalue = "" - else: - fkey = field[:i].strip() - fvalue = field[i+1:].strip() - if fkey in fields: - # Ignore it - pass - else: - fields[fkey] = fvalue - return key, fields - -def parsefield(line, i, n): - """Separate one key-value pair in a mailcap entry.""" - start = i - while i < n: - c = line[i] - if c == ';': - break - elif c == '\\': - i = i+2 - else: - i = i+1 - return line[start:i].strip(), i - - -# Part 3: using the database. - -def findmatch(caps, MIMEtype, key='view', filename="/dev/null", plist=[]): - """Find a match for a mailcap entry. - - Return a tuple containing the command line, and the mailcap entry - used; (None, None) if no match is found. This may invoke the - 'test' command of several matching entries before deciding which - entry to use. - - """ - if _find_unsafe(filename): - msg = "Refusing to use mailcap with filename %r. Use a safe temporary filename." % (filename,) - warnings.warn(msg, UnsafeMailcapInput) - return None, None - entries = lookup(caps, MIMEtype, key) - # XXX This code should somehow check for the needsterminal flag. - for e in entries: - if 'test' in e: - test = subst(e['test'], filename, plist) - if test is None: - continue - if test and os.system(test) != 0: - continue - command = subst(e[key], MIMEtype, filename, plist) - if command is not None: - return command, e - return None, None - -def lookup(caps, MIMEtype, key=None): - entries = [] - if MIMEtype in caps: - entries = entries + caps[MIMEtype] - MIMEtypes = MIMEtype.split('/') - MIMEtype = MIMEtypes[0] + '/*' - if MIMEtype in caps: - entries = entries + caps[MIMEtype] - if key is not None: - entries = [e for e in entries if key in e] - entries = sorted(entries, key=lineno_sort_key) - return entries - -def subst(field, MIMEtype, filename, plist=[]): - # XXX Actually, this is Unix-specific - res = '' - i, n = 0, len(field) - while i < n: - c = field[i]; i = i+1 - if c != '%': - if c == '\\': - c = field[i:i+1]; i = i+1 - res = res + c - else: - c = field[i]; i = i+1 - if c == '%': - res = res + c - elif c == 's': - res = res + filename - elif c == 't': - if _find_unsafe(MIMEtype): - msg = "Refusing to substitute MIME type %r into a shell command." % (MIMEtype,) - warnings.warn(msg, UnsafeMailcapInput) - return None - res = res + MIMEtype - elif c == '{': - start = i - while i < n and field[i] != '}': - i = i+1 - name = field[start:i] - i = i+1 - param = findparam(name, plist) - if _find_unsafe(param): - msg = "Refusing to substitute parameter %r (%s) into a shell command" % (param, name) - warnings.warn(msg, UnsafeMailcapInput) - return None - res = res + param - # XXX To do: - # %n == number of parts if type is multipart/* - # %F == list of alternating type and filename for parts - else: - res = res + '%' + c - return res - -def findparam(name, plist): - name = name.lower() + '=' - n = len(name) - for p in plist: - if p[:n].lower() == name: - return p[n:] - return '' - - -# Part 4: test program. - -def test(): - import sys - caps = getcaps() - if not sys.argv[1:]: - show(caps) - return - for i in range(1, len(sys.argv), 2): - args = sys.argv[i:i+2] - if len(args) < 2: - print("usage: mailcap [MIMEtype file] ...") - return - MIMEtype = args[0] - file = args[1] - command, e = findmatch(caps, MIMEtype, 'view', file) - if not command: - print("No viewer found for", type) - else: - print("Executing:", command) - sts = os.system(command) - sts = os.waitstatus_to_exitcode(sts) - if sts: - print("Exit status:", sts) - -def show(caps): - print("Mailcap files:") - for fn in listmailcapfiles(): print("\t" + fn) - print() - if not caps: caps = getcaps() - print("Mailcap entries:") - print() - ckeys = sorted(caps) - for type in ckeys: - print(type) - entries = caps[type] - for e in entries: - keys = sorted(e) - for k in keys: - print(" %-15s" % k, e[k]) - print() - -if __name__ == '__main__': - test() diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 37228de4..8604000e 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -40,7 +40,7 @@ except ImportError: __all__ = [ "knownfiles", "inited", "MimeTypes", - "guess_type", "guess_all_extensions", "guess_extension", + "guess_type", "guess_file_type", "guess_all_extensions", "guess_extension", "add_type", "init", "read_mime_types", "suffix_map", "encodings_map", "types_map", "common_types" ] @@ -119,8 +119,14 @@ class MimeTypes: Optional `strict' argument when False adds a bunch of commonly found, but non-standard types. """ + # TODO: Deprecate accepting file paths (in particular path-like objects). url = os.fspath(url) - scheme, url = urllib.parse._splittype(url) + p = urllib.parse.urlparse(url) + if p.scheme and len(p.scheme) > 1: + scheme = p.scheme + url = p.path + else: + return self.guess_file_type(url, strict=strict) if scheme == 'data': # syntax of data URLs: # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data @@ -140,13 +146,25 @@ class MimeTypes: if '=' in type or '/' not in type: type = 'text/plain' return type, None # never compressed, so encoding is None - base, ext = posixpath.splitext(url) + return self._guess_file_type(url, strict, posixpath.splitext) + + def guess_file_type(self, path, *, strict=True): + """Guess the type of a file based on its path. + + Similar to guess_type(), but takes file path istead of URL. + """ + path = os.fsdecode(path) + path = os.path.splitdrive(path)[1] + return self._guess_file_type(path, strict, os.path.splitext) + + def _guess_file_type(self, path, strict, splitext): + base, ext = splitext(path) while (ext_lower := ext.lower()) in self.suffix_map: - base, ext = posixpath.splitext(base + self.suffix_map[ext_lower]) + base, ext = splitext(base + self.suffix_map[ext_lower]) # encodings_map is case sensitive if ext in self.encodings_map: encoding = self.encodings_map[ext] - base, ext = posixpath.splitext(base) + base, ext = splitext(base) else: encoding = None ext = ext.lower() @@ -304,6 +322,16 @@ def guess_type(url, strict=True): return _db.guess_type(url, strict) +def guess_file_type(path, *, strict=True): + """Guess the type of a file based on its path. + + Similar to guess_type(), but takes file path istead of URL. + """ + if _db is None: + init() + return _db.guess_file_type(path, strict=strict) + + def guess_all_extensions(type, strict=True): """Guess the extensions for a file based on its MIME type. @@ -528,6 +556,7 @@ def _default_mime_types(): '.tiff' : 'image/tiff', '.tif' : 'image/tiff', '.ico' : 'image/vnd.microsoft.icon', + '.webp' : 'image/webp', '.ras' : 'image/x-cmu-raster', '.pnm' : 'image/x-portable-anymap', '.pbm' : 'image/x-portable-bitmap', @@ -545,6 +574,8 @@ def _default_mime_types(): '.csv' : 'text/csv', '.html' : 'text/html', '.htm' : 'text/html', + '.md' : 'text/markdown', + '.markdown': 'text/markdown', '.n3' : 'text/n3', '.txt' : 'text/plain', '.bat' : 'text/plain', @@ -554,9 +585,11 @@ def _default_mime_types(): '.pl' : 'text/plain', '.srt' : 'text/plain', '.rtx' : 'text/richtext', + '.rtf' : 'text/rtf', '.tsv' : 'text/tab-separated-values', '.vtt' : 'text/vtt', '.py' : 'text/x-python', + '.rst' : 'text/x-rst', '.etx' : 'text/x-setext', '.sgm' : 'text/x-sgml', '.sgml' : 'text/x-sgml', @@ -587,7 +620,6 @@ def _default_mime_types(): '.pict': 'image/pict', '.pct' : 'image/pict', '.pic' : 'image/pict', - '.webp': 'image/webp', '.xul' : 'text/xul', } diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index a0a020f9..ac478ee7 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -72,7 +72,12 @@ def _find_module(name, path=None): if isinstance(spec.loader, importlib.machinery.SourceFileLoader): kind = _PY_SOURCE - elif isinstance(spec.loader, importlib.machinery.ExtensionFileLoader): + elif isinstance( + spec.loader, ( + importlib.machinery.ExtensionFileLoader, + importlib.machinery.AppleFrameworkLoader, + ) + ): kind = _C_EXTENSION elif isinstance(spec.loader, importlib.machinery.SourcelessFileLoader): diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py deleted file mode 100644 index 565bf631..00000000 --- a/Lib/msilib/__init__.py +++ /dev/null @@ -1,484 +0,0 @@ -# Copyright (C) 2005 Martin v. Löwis -# Licensed to PSF under a Contributor Agreement. -from _msi import * -import fnmatch -import os -import re -import string -import sys -import warnings - -warnings._deprecated(__name__, remove=(3, 13)) - -AMD64 = "AMD64" in sys.version -# Keep msilib.Win64 around to preserve backwards compatibility. -Win64 = AMD64 - -# Partially taken from Wine -datasizemask= 0x00ff -type_valid= 0x0100 -type_localizable= 0x0200 - -typemask= 0x0c00 -type_long= 0x0000 -type_short= 0x0400 -type_string= 0x0c00 -type_binary= 0x0800 - -type_nullable= 0x1000 -type_key= 0x2000 -# XXX temporary, localizable? -knownbits = datasizemask | type_valid | type_localizable | \ - typemask | type_nullable | type_key - -class Table: - def __init__(self, name): - self.name = name - self.fields = [] - - def add_field(self, index, name, type): - self.fields.append((index,name,type)) - - def sql(self): - fields = [] - keys = [] - self.fields.sort() - fields = [None]*len(self.fields) - for index, name, type in self.fields: - index -= 1 - unk = type & ~knownbits - if unk: - print("%s.%s unknown bits %x" % (self.name, name, unk)) - size = type & datasizemask - dtype = type & typemask - if dtype == type_string: - if size: - tname="CHAR(%d)" % size - else: - tname="CHAR" - elif dtype == type_short: - assert size==2 - tname = "SHORT" - elif dtype == type_long: - assert size==4 - tname="LONG" - elif dtype == type_binary: - assert size==0 - tname="OBJECT" - else: - tname="unknown" - print("%s.%sunknown integer type %d" % (self.name, name, size)) - if type & type_nullable: - flags = "" - else: - flags = " NOT NULL" - if type & type_localizable: - flags += " LOCALIZABLE" - fields[index] = "`%s` %s%s" % (name, tname, flags) - if type & type_key: - keys.append("`%s`" % name) - fields = ", ".join(fields) - keys = ", ".join(keys) - return "CREATE TABLE %s (%s PRIMARY KEY %s)" % (self.name, fields, keys) - - def create(self, db): - v = db.OpenView(self.sql()) - v.Execute(None) - v.Close() - -class _Unspecified:pass -def change_sequence(seq, action, seqno=_Unspecified, cond = _Unspecified): - "Change the sequence number of an action in a sequence list" - for i in range(len(seq)): - if seq[i][0] == action: - if cond is _Unspecified: - cond = seq[i][1] - if seqno is _Unspecified: - seqno = seq[i][2] - seq[i] = (action, cond, seqno) - return - raise ValueError("Action not found in sequence") - -def add_data(db, table, values): - v = db.OpenView("SELECT * FROM `%s`" % table) - count = v.GetColumnInfo(MSICOLINFO_NAMES).GetFieldCount() - r = CreateRecord(count) - for value in values: - assert len(value) == count, value - for i in range(count): - field = value[i] - if isinstance(field, int): - r.SetInteger(i+1,field) - elif isinstance(field, str): - r.SetString(i+1,field) - elif field is None: - pass - elif isinstance(field, Binary): - r.SetStream(i+1, field.name) - else: - raise TypeError("Unsupported type %s" % field.__class__.__name__) - try: - v.Modify(MSIMODIFY_INSERT, r) - except Exception: - raise MSIError("Could not insert "+repr(values)+" into "+table) - - r.ClearData() - v.Close() - - -def add_stream(db, name, path): - v = db.OpenView("INSERT INTO _Streams (Name, Data) VALUES ('%s', ?)" % name) - r = CreateRecord(1) - r.SetStream(1, path) - v.Execute(r) - v.Close() - -def init_database(name, schema, - ProductName, ProductCode, ProductVersion, - Manufacturer): - try: - os.unlink(name) - except OSError: - pass - ProductCode = ProductCode.upper() - # Create the database - db = OpenDatabase(name, MSIDBOPEN_CREATE) - # Create the tables - for t in schema.tables: - t.create(db) - # Fill the validation table - add_data(db, "_Validation", schema._Validation_records) - # Initialize the summary information, allowing atmost 20 properties - si = db.GetSummaryInformation(20) - si.SetProperty(PID_TITLE, "Installation Database") - si.SetProperty(PID_SUBJECT, ProductName) - si.SetProperty(PID_AUTHOR, Manufacturer) - if AMD64: - si.SetProperty(PID_TEMPLATE, "x64;1033") - else: - si.SetProperty(PID_TEMPLATE, "Intel;1033") - si.SetProperty(PID_REVNUMBER, gen_uuid()) - si.SetProperty(PID_WORDCOUNT, 2) # long file names, compressed, original media - si.SetProperty(PID_PAGECOUNT, 200) - si.SetProperty(PID_APPNAME, "Python MSI Library") - # XXX more properties - si.Persist() - add_data(db, "Property", [ - ("ProductName", ProductName), - ("ProductCode", ProductCode), - ("ProductVersion", ProductVersion), - ("Manufacturer", Manufacturer), - ("ProductLanguage", "1033")]) - db.Commit() - return db - -def add_tables(db, module): - for table in module.tables: - add_data(db, table, getattr(module, table)) - -def make_id(str): - identifier_chars = string.ascii_letters + string.digits + "._" - str = "".join([c if c in identifier_chars else "_" for c in str]) - if str[0] in (string.digits + "."): - str = "_" + str - assert re.match("^[A-Za-z_][A-Za-z0-9_.]*$", str), "FILE"+str - return str - -def gen_uuid(): - return "{"+UuidCreate().upper()+"}" - -class CAB: - def __init__(self, name): - self.name = name - self.files = [] - self.filenames = set() - self.index = 0 - - def gen_id(self, file): - logical = _logical = make_id(file) - pos = 1 - while logical in self.filenames: - logical = "%s.%d" % (_logical, pos) - pos += 1 - self.filenames.add(logical) - return logical - - def append(self, full, file, logical): - if os.path.isdir(full): - return - if not logical: - logical = self.gen_id(file) - self.index += 1 - self.files.append((full, logical)) - return self.index, logical - - def commit(self, db): - from tempfile import mktemp - filename = mktemp() - FCICreate(filename, self.files) - add_data(db, "Media", - [(1, self.index, None, "#"+self.name, None, None)]) - add_stream(db, self.name, filename) - os.unlink(filename) - db.Commit() - -_directories = set() -class Directory: - def __init__(self, db, cab, basedir, physical, _logical, default, componentflags=None): - """Create a new directory in the Directory table. There is a current component - at each point in time for the directory, which is either explicitly created - through start_component, or implicitly when files are added for the first - time. Files are added into the current component, and into the cab file. - To create a directory, a base directory object needs to be specified (can be - None), the path to the physical directory, and a logical directory name. - Default specifies the DefaultDir slot in the directory table. componentflags - specifies the default flags that new components get.""" - index = 1 - _logical = make_id(_logical) - logical = _logical - while logical in _directories: - logical = "%s%d" % (_logical, index) - index += 1 - _directories.add(logical) - self.db = db - self.cab = cab - self.basedir = basedir - self.physical = physical - self.logical = logical - self.component = None - self.short_names = set() - self.ids = set() - self.keyfiles = {} - self.componentflags = componentflags - if basedir: - self.absolute = os.path.join(basedir.absolute, physical) - blogical = basedir.logical - else: - self.absolute = physical - blogical = None - add_data(db, "Directory", [(logical, blogical, default)]) - - def start_component(self, component = None, feature = None, flags = None, keyfile = None, uuid=None): - """Add an entry to the Component table, and make this component the current for this - directory. If no component name is given, the directory name is used. If no feature - is given, the current feature is used. If no flags are given, the directory's default - flags are used. If no keyfile is given, the KeyPath is left null in the Component - table.""" - if flags is None: - flags = self.componentflags - if uuid is None: - uuid = gen_uuid() - else: - uuid = uuid.upper() - if component is None: - component = self.logical - self.component = component - if AMD64: - flags |= 256 - if keyfile: - keyid = self.cab.gen_id(keyfile) - self.keyfiles[keyfile] = keyid - else: - keyid = None - add_data(self.db, "Component", - [(component, uuid, self.logical, flags, None, keyid)]) - if feature is None: - feature = current_feature - add_data(self.db, "FeatureComponents", - [(feature.id, component)]) - - def make_short(self, file): - oldfile = file - file = file.replace('+', '_') - file = ''.join(c for c in file if not c in r' "/\[]:;=,') - parts = file.split(".") - if len(parts) > 1: - prefix = "".join(parts[:-1]).upper() - suffix = parts[-1].upper() - if not prefix: - prefix = suffix - suffix = None - else: - prefix = file.upper() - suffix = None - if len(parts) < 3 and len(prefix) <= 8 and file == oldfile and ( - not suffix or len(suffix) <= 3): - if suffix: - file = prefix+"."+suffix - else: - file = prefix - else: - file = None - if file is None or file in self.short_names: - prefix = prefix[:6] - if suffix: - suffix = suffix[:3] - pos = 1 - while 1: - if suffix: - file = "%s~%d.%s" % (prefix, pos, suffix) - else: - file = "%s~%d" % (prefix, pos) - if file not in self.short_names: break - pos += 1 - assert pos < 10000 - if pos in (10, 100, 1000): - prefix = prefix[:-1] - self.short_names.add(file) - assert not re.search(r'[\?|><:/*"+,;=\[\]]', file) # restrictions on short names - return file - - def add_file(self, file, src=None, version=None, language=None): - """Add a file to the current component of the directory, starting a new one - if there is no current component. By default, the file name in the source - and the file table will be identical. If the src file is specified, it is - interpreted relative to the current directory. Optionally, a version and a - language can be specified for the entry in the File table.""" - if not self.component: - self.start_component(self.logical, current_feature, 0) - if not src: - # Allow relative paths for file if src is not specified - src = file - file = os.path.basename(file) - absolute = os.path.join(self.absolute, src) - assert not re.search(r'[\?|><:/*]"', file) # restrictions on long names - if file in self.keyfiles: - logical = self.keyfiles[file] - else: - logical = None - sequence, logical = self.cab.append(absolute, file, logical) - assert logical not in self.ids - self.ids.add(logical) - short = self.make_short(file) - full = "%s|%s" % (short, file) - filesize = os.stat(absolute).st_size - # constants.msidbFileAttributesVital - # Compressed omitted, since it is the database default - # could add r/o, system, hidden - attributes = 512 - add_data(self.db, "File", - [(logical, self.component, full, filesize, version, - language, attributes, sequence)]) - #if not version: - # # Add hash if the file is not versioned - # filehash = FileHash(absolute, 0) - # add_data(self.db, "MsiFileHash", - # [(logical, 0, filehash.IntegerData(1), - # filehash.IntegerData(2), filehash.IntegerData(3), - # filehash.IntegerData(4))]) - # Automatically remove .pyc files on uninstall (2) - # XXX: adding so many RemoveFile entries makes installer unbelievably - # slow. So instead, we have to use wildcard remove entries - if file.endswith(".py"): - add_data(self.db, "RemoveFile", - [(logical+"c", self.component, "%sC|%sc" % (short, file), - self.logical, 2), - (logical+"o", self.component, "%sO|%so" % (short, file), - self.logical, 2)]) - return logical - - def glob(self, pattern, exclude = None): - """Add a list of files to the current component as specified in the - glob pattern. Individual files can be excluded in the exclude list.""" - try: - files = os.listdir(self.absolute) - except OSError: - return [] - if pattern[:1] != '.': - files = (f for f in files if f[0] != '.') - files = fnmatch.filter(files, pattern) - for f in files: - if exclude and f in exclude: continue - self.add_file(f) - return files - - def remove_pyc(self): - "Remove .pyc files on uninstall" - add_data(self.db, "RemoveFile", - [(self.component+"c", self.component, "*.pyc", self.logical, 2)]) - -class Binary: - def __init__(self, fname): - self.name = fname - def __repr__(self): - return 'msilib.Binary(os.path.join(dirname,"%s"))' % self.name - -class Feature: - def __init__(self, db, id, title, desc, display, level = 1, - parent=None, directory = None, attributes=0): - self.id = id - if parent: - parent = parent.id - add_data(db, "Feature", - [(id, parent, title, desc, display, - level, directory, attributes)]) - def set_current(self): - global current_feature - current_feature = self - -class Control: - def __init__(self, dlg, name): - self.dlg = dlg - self.name = name - - def event(self, event, argument, condition = "1", ordering = None): - add_data(self.dlg.db, "ControlEvent", - [(self.dlg.name, self.name, event, argument, - condition, ordering)]) - - def mapping(self, event, attribute): - add_data(self.dlg.db, "EventMapping", - [(self.dlg.name, self.name, event, attribute)]) - - def condition(self, action, condition): - add_data(self.dlg.db, "ControlCondition", - [(self.dlg.name, self.name, action, condition)]) - -class RadioButtonGroup(Control): - def __init__(self, dlg, name, property): - self.dlg = dlg - self.name = name - self.property = property - self.index = 1 - - def add(self, name, x, y, w, h, text, value = None): - if value is None: - value = name - add_data(self.dlg.db, "RadioButton", - [(self.property, self.index, value, - x, y, w, h, text, None)]) - self.index += 1 - -class Dialog: - def __init__(self, db, name, x, y, w, h, attr, title, first, default, cancel): - self.db = db - self.name = name - self.x, self.y, self.w, self.h = x,y,w,h - add_data(db, "Dialog", [(name, x,y,w,h,attr,title,first,default,cancel)]) - - def control(self, name, type, x, y, w, h, attr, prop, text, next, help): - add_data(self.db, "Control", - [(self.name, name, type, x, y, w, h, attr, prop, text, next, help)]) - return Control(self, name) - - def text(self, name, x, y, w, h, attr, text): - return self.control(name, "Text", x, y, w, h, attr, None, - text, None, None) - - def bitmap(self, name, x, y, w, h, text): - return self.control(name, "Bitmap", x, y, w, h, 1, None, text, None, None) - - def line(self, name, x, y, w, h): - return self.control(name, "Line", x, y, w, h, 1, None, None, None, None) - - def pushbutton(self, name, x, y, w, h, attr, text, next): - return self.control(name, "PushButton", x, y, w, h, attr, None, text, next, None) - - def radiogroup(self, name, x, y, w, h, attr, prop, text, next): - add_data(self.db, "Control", - [(self.name, name, "RadioButtonGroup", - x, y, w, h, attr, prop, text, next, None)]) - return RadioButtonGroup(self, name, prop) - - def checkbox(self, name, x, y, w, h, attr, prop, text, next): - return self.control(name, "CheckBox", x, y, w, h, attr, prop, text, next, None) diff --git a/Lib/msilib/schema.py b/Lib/msilib/schema.py deleted file mode 100644 index 9f5745cf..00000000 --- a/Lib/msilib/schema.py +++ /dev/null @@ -1,1007 +0,0 @@ -from . import Table - -_Validation = Table('_Validation') -_Validation.add_field(1,'Table',11552) -_Validation.add_field(2,'Column',11552) -_Validation.add_field(3,'Nullable',3332) -_Validation.add_field(4,'MinValue',4356) -_Validation.add_field(5,'MaxValue',4356) -_Validation.add_field(6,'KeyTable',7679) -_Validation.add_field(7,'KeyColumn',5378) -_Validation.add_field(8,'Category',7456) -_Validation.add_field(9,'Set',7679) -_Validation.add_field(10,'Description',7679) - -ActionText = Table('ActionText') -ActionText.add_field(1,'Action',11592) -ActionText.add_field(2,'Description',7936) -ActionText.add_field(3,'Template',7936) - -AdminExecuteSequence = Table('AdminExecuteSequence') -AdminExecuteSequence.add_field(1,'Action',11592) -AdminExecuteSequence.add_field(2,'Condition',7679) -AdminExecuteSequence.add_field(3,'Sequence',5378) - -Condition = Table('Condition') -Condition.add_field(1,'Feature_',11558) -Condition.add_field(2,'Level',9474) -Condition.add_field(3,'Condition',7679) - -AdminUISequence = Table('AdminUISequence') -AdminUISequence.add_field(1,'Action',11592) -AdminUISequence.add_field(2,'Condition',7679) -AdminUISequence.add_field(3,'Sequence',5378) - -AdvtExecuteSequence = Table('AdvtExecuteSequence') -AdvtExecuteSequence.add_field(1,'Action',11592) -AdvtExecuteSequence.add_field(2,'Condition',7679) -AdvtExecuteSequence.add_field(3,'Sequence',5378) - -AdvtUISequence = Table('AdvtUISequence') -AdvtUISequence.add_field(1,'Action',11592) -AdvtUISequence.add_field(2,'Condition',7679) -AdvtUISequence.add_field(3,'Sequence',5378) - -AppId = Table('AppId') -AppId.add_field(1,'AppId',11558) -AppId.add_field(2,'RemoteServerName',7679) -AppId.add_field(3,'LocalService',7679) -AppId.add_field(4,'ServiceParameters',7679) -AppId.add_field(5,'DllSurrogate',7679) -AppId.add_field(6,'ActivateAtStorage',5378) -AppId.add_field(7,'RunAsInteractiveUser',5378) - -AppSearch = Table('AppSearch') -AppSearch.add_field(1,'Property',11592) -AppSearch.add_field(2,'Signature_',11592) - -Property = Table('Property') -Property.add_field(1,'Property',11592) -Property.add_field(2,'Value',3840) - -BBControl = Table('BBControl') -BBControl.add_field(1,'Billboard_',11570) -BBControl.add_field(2,'BBControl',11570) -BBControl.add_field(3,'Type',3378) -BBControl.add_field(4,'X',1282) -BBControl.add_field(5,'Y',1282) -BBControl.add_field(6,'Width',1282) -BBControl.add_field(7,'Height',1282) -BBControl.add_field(8,'Attributes',4356) -BBControl.add_field(9,'Text',7986) - -Billboard = Table('Billboard') -Billboard.add_field(1,'Billboard',11570) -Billboard.add_field(2,'Feature_',3366) -Billboard.add_field(3,'Action',7474) -Billboard.add_field(4,'Ordering',5378) - -Feature = Table('Feature') -Feature.add_field(1,'Feature',11558) -Feature.add_field(2,'Feature_Parent',7462) -Feature.add_field(3,'Title',8000) -Feature.add_field(4,'Description',8191) -Feature.add_field(5,'Display',5378) -Feature.add_field(6,'Level',1282) -Feature.add_field(7,'Directory_',7496) -Feature.add_field(8,'Attributes',1282) - -Binary = Table('Binary') -Binary.add_field(1,'Name',11592) -Binary.add_field(2,'Data',2304) - -BindImage = Table('BindImage') -BindImage.add_field(1,'File_',11592) -BindImage.add_field(2,'Path',7679) - -File = Table('File') -File.add_field(1,'File',11592) -File.add_field(2,'Component_',3400) -File.add_field(3,'FileName',4095) -File.add_field(4,'FileSize',260) -File.add_field(5,'Version',7496) -File.add_field(6,'Language',7444) -File.add_field(7,'Attributes',5378) -File.add_field(8,'Sequence',1282) - -CCPSearch = Table('CCPSearch') -CCPSearch.add_field(1,'Signature_',11592) - -CheckBox = Table('CheckBox') -CheckBox.add_field(1,'Property',11592) -CheckBox.add_field(2,'Value',7488) - -Class = Table('Class') -Class.add_field(1,'CLSID',11558) -Class.add_field(2,'Context',11552) -Class.add_field(3,'Component_',11592) -Class.add_field(4,'ProgId_Default',7679) -Class.add_field(5,'Description',8191) -Class.add_field(6,'AppId_',7462) -Class.add_field(7,'FileTypeMask',7679) -Class.add_field(8,'Icon_',7496) -Class.add_field(9,'IconIndex',5378) -Class.add_field(10,'DefInprocHandler',7456) -Class.add_field(11,'Argument',7679) -Class.add_field(12,'Feature_',3366) -Class.add_field(13,'Attributes',5378) - -Component = Table('Component') -Component.add_field(1,'Component',11592) -Component.add_field(2,'ComponentId',7462) -Component.add_field(3,'Directory_',3400) -Component.add_field(4,'Attributes',1282) -Component.add_field(5,'Condition',7679) -Component.add_field(6,'KeyPath',7496) - -Icon = Table('Icon') -Icon.add_field(1,'Name',11592) -Icon.add_field(2,'Data',2304) - -ProgId = Table('ProgId') -ProgId.add_field(1,'ProgId',11775) -ProgId.add_field(2,'ProgId_Parent',7679) -ProgId.add_field(3,'Class_',7462) -ProgId.add_field(4,'Description',8191) -ProgId.add_field(5,'Icon_',7496) -ProgId.add_field(6,'IconIndex',5378) - -ComboBox = Table('ComboBox') -ComboBox.add_field(1,'Property',11592) -ComboBox.add_field(2,'Order',9474) -ComboBox.add_field(3,'Value',3392) -ComboBox.add_field(4,'Text',8000) - -CompLocator = Table('CompLocator') -CompLocator.add_field(1,'Signature_',11592) -CompLocator.add_field(2,'ComponentId',3366) -CompLocator.add_field(3,'Type',5378) - -Complus = Table('Complus') -Complus.add_field(1,'Component_',11592) -Complus.add_field(2,'ExpType',13570) - -Directory = Table('Directory') -Directory.add_field(1,'Directory',11592) -Directory.add_field(2,'Directory_Parent',7496) -Directory.add_field(3,'DefaultDir',4095) - -Control = Table('Control') -Control.add_field(1,'Dialog_',11592) -Control.add_field(2,'Control',11570) -Control.add_field(3,'Type',3348) -Control.add_field(4,'X',1282) -Control.add_field(5,'Y',1282) -Control.add_field(6,'Width',1282) -Control.add_field(7,'Height',1282) -Control.add_field(8,'Attributes',4356) -Control.add_field(9,'Property',7474) -Control.add_field(10,'Text',7936) -Control.add_field(11,'Control_Next',7474) -Control.add_field(12,'Help',7986) - -Dialog = Table('Dialog') -Dialog.add_field(1,'Dialog',11592) -Dialog.add_field(2,'HCentering',1282) -Dialog.add_field(3,'VCentering',1282) -Dialog.add_field(4,'Width',1282) -Dialog.add_field(5,'Height',1282) -Dialog.add_field(6,'Attributes',4356) -Dialog.add_field(7,'Title',8064) -Dialog.add_field(8,'Control_First',3378) -Dialog.add_field(9,'Control_Default',7474) -Dialog.add_field(10,'Control_Cancel',7474) - -ControlCondition = Table('ControlCondition') -ControlCondition.add_field(1,'Dialog_',11592) -ControlCondition.add_field(2,'Control_',11570) -ControlCondition.add_field(3,'Action',11570) -ControlCondition.add_field(4,'Condition',11775) - -ControlEvent = Table('ControlEvent') -ControlEvent.add_field(1,'Dialog_',11592) -ControlEvent.add_field(2,'Control_',11570) -ControlEvent.add_field(3,'Event',11570) -ControlEvent.add_field(4,'Argument',11775) -ControlEvent.add_field(5,'Condition',15871) -ControlEvent.add_field(6,'Ordering',5378) - -CreateFolder = Table('CreateFolder') -CreateFolder.add_field(1,'Directory_',11592) -CreateFolder.add_field(2,'Component_',11592) - -CustomAction = Table('CustomAction') -CustomAction.add_field(1,'Action',11592) -CustomAction.add_field(2,'Type',1282) -CustomAction.add_field(3,'Source',7496) -CustomAction.add_field(4,'Target',7679) - -DrLocator = Table('DrLocator') -DrLocator.add_field(1,'Signature_',11592) -DrLocator.add_field(2,'Parent',15688) -DrLocator.add_field(3,'Path',15871) -DrLocator.add_field(4,'Depth',5378) - -DuplicateFile = Table('DuplicateFile') -DuplicateFile.add_field(1,'FileKey',11592) -DuplicateFile.add_field(2,'Component_',3400) -DuplicateFile.add_field(3,'File_',3400) -DuplicateFile.add_field(4,'DestName',8191) -DuplicateFile.add_field(5,'DestFolder',7496) - -Environment = Table('Environment') -Environment.add_field(1,'Environment',11592) -Environment.add_field(2,'Name',4095) -Environment.add_field(3,'Value',8191) -Environment.add_field(4,'Component_',3400) - -Error = Table('Error') -Error.add_field(1,'Error',9474) -Error.add_field(2,'Message',7936) - -EventMapping = Table('EventMapping') -EventMapping.add_field(1,'Dialog_',11592) -EventMapping.add_field(2,'Control_',11570) -EventMapping.add_field(3,'Event',11570) -EventMapping.add_field(4,'Attribute',3378) - -Extension = Table('Extension') -Extension.add_field(1,'Extension',11775) -Extension.add_field(2,'Component_',11592) -Extension.add_field(3,'ProgId_',7679) -Extension.add_field(4,'MIME_',7488) -Extension.add_field(5,'Feature_',3366) - -MIME = Table('MIME') -MIME.add_field(1,'ContentType',11584) -MIME.add_field(2,'Extension_',3583) -MIME.add_field(3,'CLSID',7462) - -FeatureComponents = Table('FeatureComponents') -FeatureComponents.add_field(1,'Feature_',11558) -FeatureComponents.add_field(2,'Component_',11592) - -FileSFPCatalog = Table('FileSFPCatalog') -FileSFPCatalog.add_field(1,'File_',11592) -FileSFPCatalog.add_field(2,'SFPCatalog_',11775) - -SFPCatalog = Table('SFPCatalog') -SFPCatalog.add_field(1,'SFPCatalog',11775) -SFPCatalog.add_field(2,'Catalog',2304) -SFPCatalog.add_field(3,'Dependency',7424) - -Font = Table('Font') -Font.add_field(1,'File_',11592) -Font.add_field(2,'FontTitle',7552) - -IniFile = Table('IniFile') -IniFile.add_field(1,'IniFile',11592) -IniFile.add_field(2,'FileName',4095) -IniFile.add_field(3,'DirProperty',7496) -IniFile.add_field(4,'Section',3936) -IniFile.add_field(5,'Key',3968) -IniFile.add_field(6,'Value',4095) -IniFile.add_field(7,'Action',1282) -IniFile.add_field(8,'Component_',3400) - -IniLocator = Table('IniLocator') -IniLocator.add_field(1,'Signature_',11592) -IniLocator.add_field(2,'FileName',3583) -IniLocator.add_field(3,'Section',3424) -IniLocator.add_field(4,'Key',3456) -IniLocator.add_field(5,'Field',5378) -IniLocator.add_field(6,'Type',5378) - -InstallExecuteSequence = Table('InstallExecuteSequence') -InstallExecuteSequence.add_field(1,'Action',11592) -InstallExecuteSequence.add_field(2,'Condition',7679) -InstallExecuteSequence.add_field(3,'Sequence',5378) - -InstallUISequence = Table('InstallUISequence') -InstallUISequence.add_field(1,'Action',11592) -InstallUISequence.add_field(2,'Condition',7679) -InstallUISequence.add_field(3,'Sequence',5378) - -IsolatedComponent = Table('IsolatedComponent') -IsolatedComponent.add_field(1,'Component_Shared',11592) -IsolatedComponent.add_field(2,'Component_Application',11592) - -LaunchCondition = Table('LaunchCondition') -LaunchCondition.add_field(1,'Condition',11775) -LaunchCondition.add_field(2,'Description',4095) - -ListBox = Table('ListBox') -ListBox.add_field(1,'Property',11592) -ListBox.add_field(2,'Order',9474) -ListBox.add_field(3,'Value',3392) -ListBox.add_field(4,'Text',8000) - -ListView = Table('ListView') -ListView.add_field(1,'Property',11592) -ListView.add_field(2,'Order',9474) -ListView.add_field(3,'Value',3392) -ListView.add_field(4,'Text',8000) -ListView.add_field(5,'Binary_',7496) - -LockPermissions = Table('LockPermissions') -LockPermissions.add_field(1,'LockObject',11592) -LockPermissions.add_field(2,'Table',11552) -LockPermissions.add_field(3,'Domain',15871) -LockPermissions.add_field(4,'User',11775) -LockPermissions.add_field(5,'Permission',4356) - -Media = Table('Media') -Media.add_field(1,'DiskId',9474) -Media.add_field(2,'LastSequence',1282) -Media.add_field(3,'DiskPrompt',8000) -Media.add_field(4,'Cabinet',7679) -Media.add_field(5,'VolumeLabel',7456) -Media.add_field(6,'Source',7496) - -MoveFile = Table('MoveFile') -MoveFile.add_field(1,'FileKey',11592) -MoveFile.add_field(2,'Component_',3400) -MoveFile.add_field(3,'SourceName',8191) -MoveFile.add_field(4,'DestName',8191) -MoveFile.add_field(5,'SourceFolder',7496) -MoveFile.add_field(6,'DestFolder',3400) -MoveFile.add_field(7,'Options',1282) - -MsiAssembly = Table('MsiAssembly') -MsiAssembly.add_field(1,'Component_',11592) -MsiAssembly.add_field(2,'Feature_',3366) -MsiAssembly.add_field(3,'File_Manifest',7496) -MsiAssembly.add_field(4,'File_Application',7496) -MsiAssembly.add_field(5,'Attributes',5378) - -MsiAssemblyName = Table('MsiAssemblyName') -MsiAssemblyName.add_field(1,'Component_',11592) -MsiAssemblyName.add_field(2,'Name',11775) -MsiAssemblyName.add_field(3,'Value',3583) - -MsiDigitalCertificate = Table('MsiDigitalCertificate') -MsiDigitalCertificate.add_field(1,'DigitalCertificate',11592) -MsiDigitalCertificate.add_field(2,'CertData',2304) - -MsiDigitalSignature = Table('MsiDigitalSignature') -MsiDigitalSignature.add_field(1,'Table',11552) -MsiDigitalSignature.add_field(2,'SignObject',11592) -MsiDigitalSignature.add_field(3,'DigitalCertificate_',3400) -MsiDigitalSignature.add_field(4,'Hash',6400) - -MsiFileHash = Table('MsiFileHash') -MsiFileHash.add_field(1,'File_',11592) -MsiFileHash.add_field(2,'Options',1282) -MsiFileHash.add_field(3,'HashPart1',260) -MsiFileHash.add_field(4,'HashPart2',260) -MsiFileHash.add_field(5,'HashPart3',260) -MsiFileHash.add_field(6,'HashPart4',260) - -MsiPatchHeaders = Table('MsiPatchHeaders') -MsiPatchHeaders.add_field(1,'StreamRef',11558) -MsiPatchHeaders.add_field(2,'Header',2304) - -ODBCAttribute = Table('ODBCAttribute') -ODBCAttribute.add_field(1,'Driver_',11592) -ODBCAttribute.add_field(2,'Attribute',11560) -ODBCAttribute.add_field(3,'Value',8191) - -ODBCDriver = Table('ODBCDriver') -ODBCDriver.add_field(1,'Driver',11592) -ODBCDriver.add_field(2,'Component_',3400) -ODBCDriver.add_field(3,'Description',3583) -ODBCDriver.add_field(4,'File_',3400) -ODBCDriver.add_field(5,'File_Setup',7496) - -ODBCDataSource = Table('ODBCDataSource') -ODBCDataSource.add_field(1,'DataSource',11592) -ODBCDataSource.add_field(2,'Component_',3400) -ODBCDataSource.add_field(3,'Description',3583) -ODBCDataSource.add_field(4,'DriverDescription',3583) -ODBCDataSource.add_field(5,'Registration',1282) - -ODBCSourceAttribute = Table('ODBCSourceAttribute') -ODBCSourceAttribute.add_field(1,'DataSource_',11592) -ODBCSourceAttribute.add_field(2,'Attribute',11552) -ODBCSourceAttribute.add_field(3,'Value',8191) - -ODBCTranslator = Table('ODBCTranslator') -ODBCTranslator.add_field(1,'Translator',11592) -ODBCTranslator.add_field(2,'Component_',3400) -ODBCTranslator.add_field(3,'Description',3583) -ODBCTranslator.add_field(4,'File_',3400) -ODBCTranslator.add_field(5,'File_Setup',7496) - -Patch = Table('Patch') -Patch.add_field(1,'File_',11592) -Patch.add_field(2,'Sequence',9474) -Patch.add_field(3,'PatchSize',260) -Patch.add_field(4,'Attributes',1282) -Patch.add_field(5,'Header',6400) -Patch.add_field(6,'StreamRef_',7462) - -PatchPackage = Table('PatchPackage') -PatchPackage.add_field(1,'PatchId',11558) -PatchPackage.add_field(2,'Media_',1282) - -PublishComponent = Table('PublishComponent') -PublishComponent.add_field(1,'ComponentId',11558) -PublishComponent.add_field(2,'Qualifier',11775) -PublishComponent.add_field(3,'Component_',11592) -PublishComponent.add_field(4,'AppData',8191) -PublishComponent.add_field(5,'Feature_',3366) - -RadioButton = Table('RadioButton') -RadioButton.add_field(1,'Property',11592) -RadioButton.add_field(2,'Order',9474) -RadioButton.add_field(3,'Value',3392) -RadioButton.add_field(4,'X',1282) -RadioButton.add_field(5,'Y',1282) -RadioButton.add_field(6,'Width',1282) -RadioButton.add_field(7,'Height',1282) -RadioButton.add_field(8,'Text',8000) -RadioButton.add_field(9,'Help',7986) - -Registry = Table('Registry') -Registry.add_field(1,'Registry',11592) -Registry.add_field(2,'Root',1282) -Registry.add_field(3,'Key',4095) -Registry.add_field(4,'Name',8191) -Registry.add_field(5,'Value',7936) -Registry.add_field(6,'Component_',3400) - -RegLocator = Table('RegLocator') -RegLocator.add_field(1,'Signature_',11592) -RegLocator.add_field(2,'Root',1282) -RegLocator.add_field(3,'Key',3583) -RegLocator.add_field(4,'Name',7679) -RegLocator.add_field(5,'Type',5378) - -RemoveFile = Table('RemoveFile') -RemoveFile.add_field(1,'FileKey',11592) -RemoveFile.add_field(2,'Component_',3400) -RemoveFile.add_field(3,'FileName',8191) -RemoveFile.add_field(4,'DirProperty',3400) -RemoveFile.add_field(5,'InstallMode',1282) - -RemoveIniFile = Table('RemoveIniFile') -RemoveIniFile.add_field(1,'RemoveIniFile',11592) -RemoveIniFile.add_field(2,'FileName',4095) -RemoveIniFile.add_field(3,'DirProperty',7496) -RemoveIniFile.add_field(4,'Section',3936) -RemoveIniFile.add_field(5,'Key',3968) -RemoveIniFile.add_field(6,'Value',8191) -RemoveIniFile.add_field(7,'Action',1282) -RemoveIniFile.add_field(8,'Component_',3400) - -RemoveRegistry = Table('RemoveRegistry') -RemoveRegistry.add_field(1,'RemoveRegistry',11592) -RemoveRegistry.add_field(2,'Root',1282) -RemoveRegistry.add_field(3,'Key',4095) -RemoveRegistry.add_field(4,'Name',8191) -RemoveRegistry.add_field(5,'Component_',3400) - -ReserveCost = Table('ReserveCost') -ReserveCost.add_field(1,'ReserveKey',11592) -ReserveCost.add_field(2,'Component_',3400) -ReserveCost.add_field(3,'ReserveFolder',7496) -ReserveCost.add_field(4,'ReserveLocal',260) -ReserveCost.add_field(5,'ReserveSource',260) - -SelfReg = Table('SelfReg') -SelfReg.add_field(1,'File_',11592) -SelfReg.add_field(2,'Cost',5378) - -ServiceControl = Table('ServiceControl') -ServiceControl.add_field(1,'ServiceControl',11592) -ServiceControl.add_field(2,'Name',4095) -ServiceControl.add_field(3,'Event',1282) -ServiceControl.add_field(4,'Arguments',8191) -ServiceControl.add_field(5,'Wait',5378) -ServiceControl.add_field(6,'Component_',3400) - -ServiceInstall = Table('ServiceInstall') -ServiceInstall.add_field(1,'ServiceInstall',11592) -ServiceInstall.add_field(2,'Name',3583) -ServiceInstall.add_field(3,'DisplayName',8191) -ServiceInstall.add_field(4,'ServiceType',260) -ServiceInstall.add_field(5,'StartType',260) -ServiceInstall.add_field(6,'ErrorControl',260) -ServiceInstall.add_field(7,'LoadOrderGroup',7679) -ServiceInstall.add_field(8,'Dependencies',7679) -ServiceInstall.add_field(9,'StartName',7679) -ServiceInstall.add_field(10,'Password',7679) -ServiceInstall.add_field(11,'Arguments',7679) -ServiceInstall.add_field(12,'Component_',3400) -ServiceInstall.add_field(13,'Description',8191) - -Shortcut = Table('Shortcut') -Shortcut.add_field(1,'Shortcut',11592) -Shortcut.add_field(2,'Directory_',3400) -Shortcut.add_field(3,'Name',3968) -Shortcut.add_field(4,'Component_',3400) -Shortcut.add_field(5,'Target',3400) -Shortcut.add_field(6,'Arguments',7679) -Shortcut.add_field(7,'Description',8191) -Shortcut.add_field(8,'Hotkey',5378) -Shortcut.add_field(9,'Icon_',7496) -Shortcut.add_field(10,'IconIndex',5378) -Shortcut.add_field(11,'ShowCmd',5378) -Shortcut.add_field(12,'WkDir',7496) - -Signature = Table('Signature') -Signature.add_field(1,'Signature',11592) -Signature.add_field(2,'FileName',3583) -Signature.add_field(3,'MinVersion',7444) -Signature.add_field(4,'MaxVersion',7444) -Signature.add_field(5,'MinSize',4356) -Signature.add_field(6,'MaxSize',4356) -Signature.add_field(7,'MinDate',4356) -Signature.add_field(8,'MaxDate',4356) -Signature.add_field(9,'Languages',7679) - -TextStyle = Table('TextStyle') -TextStyle.add_field(1,'TextStyle',11592) -TextStyle.add_field(2,'FaceName',3360) -TextStyle.add_field(3,'Size',1282) -TextStyle.add_field(4,'Color',4356) -TextStyle.add_field(5,'StyleBits',5378) - -TypeLib = Table('TypeLib') -TypeLib.add_field(1,'LibID',11558) -TypeLib.add_field(2,'Language',9474) -TypeLib.add_field(3,'Component_',11592) -TypeLib.add_field(4,'Version',4356) -TypeLib.add_field(5,'Description',8064) -TypeLib.add_field(6,'Directory_',7496) -TypeLib.add_field(7,'Feature_',3366) -TypeLib.add_field(8,'Cost',4356) - -UIText = Table('UIText') -UIText.add_field(1,'Key',11592) -UIText.add_field(2,'Text',8191) - -Upgrade = Table('Upgrade') -Upgrade.add_field(1,'UpgradeCode',11558) -Upgrade.add_field(2,'VersionMin',15636) -Upgrade.add_field(3,'VersionMax',15636) -Upgrade.add_field(4,'Language',15871) -Upgrade.add_field(5,'Attributes',8452) -Upgrade.add_field(6,'Remove',7679) -Upgrade.add_field(7,'ActionProperty',3400) - -Verb = Table('Verb') -Verb.add_field(1,'Extension_',11775) -Verb.add_field(2,'Verb',11552) -Verb.add_field(3,'Sequence',5378) -Verb.add_field(4,'Command',8191) -Verb.add_field(5,'Argument',8191) - -tables=[_Validation, ActionText, AdminExecuteSequence, Condition, AdminUISequence, AdvtExecuteSequence, AdvtUISequence, AppId, AppSearch, Property, BBControl, Billboard, Feature, Binary, BindImage, File, CCPSearch, CheckBox, Class, Component, Icon, ProgId, ComboBox, CompLocator, Complus, Directory, Control, Dialog, ControlCondition, ControlEvent, CreateFolder, CustomAction, DrLocator, DuplicateFile, Environment, Error, EventMapping, Extension, MIME, FeatureComponents, FileSFPCatalog, SFPCatalog, Font, IniFile, IniLocator, InstallExecuteSequence, InstallUISequence, IsolatedComponent, LaunchCondition, ListBox, ListView, LockPermissions, Media, MoveFile, MsiAssembly, MsiAssemblyName, MsiDigitalCertificate, MsiDigitalSignature, MsiFileHash, MsiPatchHeaders, ODBCAttribute, ODBCDriver, ODBCDataSource, ODBCSourceAttribute, ODBCTranslator, Patch, PatchPackage, PublishComponent, RadioButton, Registry, RegLocator, RemoveFile, RemoveIniFile, RemoveRegistry, ReserveCost, SelfReg, ServiceControl, ServiceInstall, Shortcut, Signature, TextStyle, TypeLib, UIText, Upgrade, Verb] - -_Validation_records = [ -('_Validation','Table','N',None, None, None, None, 'Identifier',None, 'Name of table',), -('_Validation','Column','N',None, None, None, None, 'Identifier',None, 'Name of column',), -('_Validation','Description','Y',None, None, None, None, 'Text',None, 'Description of column',), -('_Validation','Set','Y',None, None, None, None, 'Text',None, 'Set of values that are permitted',), -('_Validation','Category','Y',None, None, None, None, None, 'Text;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;KeyFormatted;CustomSource;Property;Cabinet;Shortcut;URL','String category',), -('_Validation','KeyColumn','Y',1,32,None, None, None, None, 'Column to which foreign key connects',), -('_Validation','KeyTable','Y',None, None, None, None, 'Identifier',None, 'For foreign key, Name of table to which data must link',), -('_Validation','MaxValue','Y',-2147483647,2147483647,None, None, None, None, 'Maximum value allowed',), -('_Validation','MinValue','Y',-2147483647,2147483647,None, None, None, None, 'Minimum value allowed',), -('_Validation','Nullable','N',None, None, None, None, None, 'Y;N;@','Whether the column is nullable',), -('ActionText','Description','Y',None, None, None, None, 'Text',None, 'Localized description displayed in progress dialog and log when action is executing.',), -('ActionText','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to be described.',), -('ActionText','Template','Y',None, None, None, None, 'Template',None, 'Optional localized format template used to format action data records for display during action execution.',), -('AdminExecuteSequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('AdminExecuteSequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('AdminExecuteSequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('Condition','Condition','Y',None, None, None, None, 'Condition',None, 'Expression evaluated to determine if Level in the Feature table is to change.',), -('Condition','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Reference to a Feature entry in Feature table.',), -('Condition','Level','N',0,32767,None, None, None, None, 'New selection Level to set in Feature table if Condition evaluates to TRUE.',), -('AdminUISequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('AdminUISequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('AdminUISequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('AdvtExecuteSequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('AdvtExecuteSequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('AdvtExecuteSequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('AdvtUISequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('AdvtUISequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('AdvtUISequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('AppId','AppId','N',None, None, None, None, 'Guid',None, None, ), -('AppId','ActivateAtStorage','Y',0,1,None, None, None, None, None, ), -('AppId','DllSurrogate','Y',None, None, None, None, 'Text',None, None, ), -('AppId','LocalService','Y',None, None, None, None, 'Text',None, None, ), -('AppId','RemoteServerName','Y',None, None, None, None, 'Formatted',None, None, ), -('AppId','RunAsInteractiveUser','Y',0,1,None, None, None, None, None, ), -('AppId','ServiceParameters','Y',None, None, None, None, 'Text',None, None, ), -('AppSearch','Property','N',None, None, None, None, 'Identifier',None, 'The property associated with a Signature',), -('AppSearch','Signature_','N',None, None, 'Signature;RegLocator;IniLocator;DrLocator;CompLocator',1,'Identifier',None, 'The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.',), -('Property','Property','N',None, None, None, None, 'Identifier',None, 'Name of property, uppercase if settable by launcher or loader.',), -('Property','Value','N',None, None, None, None, 'Text',None, 'String value for property. Never null or empty.',), -('BBControl','Type','N',None, None, None, None, 'Identifier',None, 'The type of the control.',), -('BBControl','Y','N',0,32767,None, None, None, None, 'Vertical coordinate of the upper left corner of the bounding rectangle of the control.',), -('BBControl','Text','Y',None, None, None, None, 'Text',None, 'A string used to set the initial text contained within a control (if appropriate).',), -('BBControl','BBControl','N',None, None, None, None, 'Identifier',None, 'Name of the control. This name must be unique within a billboard, but can repeat on different billboard.',), -('BBControl','Attributes','Y',0,2147483647,None, None, None, None, 'A 32-bit word that specifies the attribute flags to be applied to this control.',), -('BBControl','Billboard_','N',None, None, 'Billboard',1,'Identifier',None, 'External key to the Billboard table, name of the billboard.',), -('BBControl','Height','N',0,32767,None, None, None, None, 'Height of the bounding rectangle of the control.',), -('BBControl','Width','N',0,32767,None, None, None, None, 'Width of the bounding rectangle of the control.',), -('BBControl','X','N',0,32767,None, None, None, None, 'Horizontal coordinate of the upper left corner of the bounding rectangle of the control.',), -('Billboard','Action','Y',None, None, None, None, 'Identifier',None, 'The name of an action. The billboard is displayed during the progress messages received from this action.',), -('Billboard','Billboard','N',None, None, None, None, 'Identifier',None, 'Name of the billboard.',), -('Billboard','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'An external key to the Feature Table. The billboard is shown only if this feature is being installed.',), -('Billboard','Ordering','Y',0,32767,None, None, None, None, 'A positive integer. If there is more than one billboard corresponding to an action they will be shown in the order defined by this column.',), -('Feature','Description','Y',None, None, None, None, 'Text',None, 'Longer descriptive text describing a visible feature item.',), -('Feature','Attributes','N',None, None, None, None, None, '0;1;2;4;5;6;8;9;10;16;17;18;20;21;22;24;25;26;32;33;34;36;37;38;48;49;50;52;53;54','Feature attributes',), -('Feature','Feature','N',None, None, None, None, 'Identifier',None, 'Primary key used to identify a particular feature record.',), -('Feature','Directory_','Y',None, None, 'Directory',1,'UpperCase',None, 'The name of the Directory that can be configured by the UI. A non-null value will enable the browse button.',), -('Feature','Level','N',0,32767,None, None, None, None, 'The install level at which record will be initially selected. An install level of 0 will disable an item and prevent its display.',), -('Feature','Title','Y',None, None, None, None, 'Text',None, 'Short text identifying a visible feature item.',), -('Feature','Display','Y',0,32767,None, None, None, None, 'Numeric sort order, used to force a specific display ordering.',), -('Feature','Feature_Parent','Y',None, None, 'Feature',1,'Identifier',None, 'Optional key of a parent record in the same table. If the parent is not selected, then the record will not be installed. Null indicates a root item.',), -('Binary','Name','N',None, None, None, None, 'Identifier',None, 'Unique key identifying the binary data.',), -('Binary','Data','N',None, None, None, None, 'Binary',None, 'The unformatted binary data.',), -('BindImage','File_','N',None, None, 'File',1,'Identifier',None, 'The index into the File table. This must be an executable file.',), -('BindImage','Path','Y',None, None, None, None, 'Paths',None, 'A list of ; delimited paths that represent the paths to be searched for the import DLLS. The list is usually a list of properties each enclosed within square brackets [] .',), -('File','Sequence','N',1,32767,None, None, None, None, 'Sequence with respect to the media images; order must track cabinet order.',), -('File','Attributes','Y',0,32767,None, None, None, None, 'Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)',), -('File','File','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.',), -('File','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key referencing Component that controls the file.',), -('File','FileName','N',None, None, None, None, 'Filename',None, 'File name used for installation, may be localized. This may contain a "short name|long name" pair.',), -('File','FileSize','N',0,2147483647,None, None, None, None, 'Size of file in bytes (integer).',), -('File','Language','Y',None, None, None, None, 'Language',None, 'List of decimal language Ids, comma-separated if more than one.',), -('File','Version','Y',None, None, 'File',1,'Version',None, 'Version string for versioned files; Blank for unversioned files.',), -('CCPSearch','Signature_','N',None, None, 'Signature;RegLocator;IniLocator;DrLocator;CompLocator',1,'Identifier',None, 'The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.',), -('CheckBox','Property','N',None, None, None, None, 'Identifier',None, 'A named property to be tied to the item.',), -('CheckBox','Value','Y',None, None, None, None, 'Formatted',None, 'The value string associated with the item.',), -('Class','Description','Y',None, None, None, None, 'Text',None, 'Localized description for the Class.',), -('Class','Attributes','Y',None, 32767,None, None, None, None, 'Class registration attributes.',), -('Class','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.',), -('Class','AppId_','Y',None, None, 'AppId',1,'Guid',None, 'Optional AppID containing DCOM information for associated application (string GUID).',), -('Class','Argument','Y',None, None, None, None, 'Formatted',None, 'optional argument for LocalServers.',), -('Class','CLSID','N',None, None, None, None, 'Guid',None, 'The CLSID of an OLE factory.',), -('Class','Component_','N',None, None, 'Component',1,'Identifier',None, 'Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.',), -('Class','Context','N',None, None, None, None, 'Identifier',None, 'The numeric server context for this server. CLSCTX_xxxx',), -('Class','DefInprocHandler','Y',None, None, None, None, 'Filename','1;2;3','Optional default inproc handler. Only optionally provided if Context=CLSCTX_LOCAL_SERVER. Typically "ole32.dll" or "mapi32.dll"',), -('Class','FileTypeMask','Y',None, None, None, None, 'Text',None, 'Optional string containing information for the HKCRthis CLSID key. If multiple patterns exist, they must be delimited by a semicolon, and numeric subkeys will be generated: 0,1,2...',), -('Class','Icon_','Y',None, None, 'Icon',1,'Identifier',None, 'Optional foreign key into the Icon Table, specifying the icon file associated with this CLSID. Will be written under the DefaultIcon key.',), -('Class','IconIndex','Y',-32767,32767,None, None, None, None, 'Optional icon index.',), -('Class','ProgId_Default','Y',None, None, 'ProgId',1,'Text',None, 'Optional ProgId associated with this CLSID.',), -('Component','Condition','Y',None, None, None, None, 'Condition',None, "A conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.",), -('Component','Attributes','N',None, None, None, None, None, None, 'Remote execution option, one of irsEnum',), -('Component','Component','N',None, None, None, None, 'Identifier',None, 'Primary key used to identify a particular component record.',), -('Component','ComponentId','Y',None, None, None, None, 'Guid',None, 'A string GUID unique to this component, version, and language.',), -('Component','Directory_','N',None, None, 'Directory',1,'Identifier',None, 'Required key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.',), -('Component','KeyPath','Y',None, None, 'File;Registry;ODBCDataSource',1,'Identifier',None, 'Either the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.',), -('Icon','Name','N',None, None, None, None, 'Identifier',None, 'Primary key. Name of the icon file.',), -('Icon','Data','N',None, None, None, None, 'Binary',None, 'Binary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.',), -('ProgId','Description','Y',None, None, None, None, 'Text',None, 'Localized description for the Program identifier.',), -('ProgId','Icon_','Y',None, None, 'Icon',1,'Identifier',None, 'Optional foreign key into the Icon Table, specifying the icon file associated with this ProgId. Will be written under the DefaultIcon key.',), -('ProgId','IconIndex','Y',-32767,32767,None, None, None, None, 'Optional icon index.',), -('ProgId','ProgId','N',None, None, None, None, 'Text',None, 'The Program Identifier. Primary key.',), -('ProgId','Class_','Y',None, None, 'Class',1,'Guid',None, 'The CLSID of an OLE factory corresponding to the ProgId.',), -('ProgId','ProgId_Parent','Y',None, None, 'ProgId',1,'Text',None, 'The Parent Program Identifier. If specified, the ProgId column becomes a version independent prog id.',), -('ComboBox','Text','Y',None, None, None, None, 'Formatted',None, 'The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.',), -('ComboBox','Property','N',None, None, None, None, 'Identifier',None, 'A named property to be tied to this item. All the items tied to the same property become part of the same combobox.',), -('ComboBox','Value','N',None, None, None, None, 'Formatted',None, 'The value string associated with this item. Selecting the line will set the associated property to this value.',), -('ComboBox','Order','N',1,32767,None, None, None, None, 'A positive integer used to determine the ordering of the items within one list.\tThe integers do not have to be consecutive.',), -('CompLocator','Type','Y',0,1,None, None, None, None, 'A boolean value that determines if the registry value is a filename or a directory location.',), -('CompLocator','Signature_','N',None, None, None, None, 'Identifier',None, 'The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.',), -('CompLocator','ComponentId','N',None, None, None, None, 'Guid',None, 'A string GUID unique to this component, version, and language.',), -('Complus','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key referencing Component that controls the ComPlus component.',), -('Complus','ExpType','Y',0,32767,None, None, None, None, 'ComPlus component attributes.',), -('Directory','Directory','N',None, None, None, None, 'Identifier',None, 'Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.',), -('Directory','DefaultDir','N',None, None, None, None, 'DefaultDir',None, "The default sub-path under parent's path.",), -('Directory','Directory_Parent','Y',None, None, 'Directory',1,'Identifier',None, 'Reference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.',), -('Control','Type','N',None, None, None, None, 'Identifier',None, 'The type of the control.',), -('Control','Y','N',0,32767,None, None, None, None, 'Vertical coordinate of the upper left corner of the bounding rectangle of the control.',), -('Control','Text','Y',None, None, None, None, 'Formatted',None, 'A string used to set the initial text contained within a control (if appropriate).',), -('Control','Property','Y',None, None, None, None, 'Identifier',None, 'The name of a defined property to be linked to this control. ',), -('Control','Attributes','Y',0,2147483647,None, None, None, None, 'A 32-bit word that specifies the attribute flags to be applied to this control.',), -('Control','Height','N',0,32767,None, None, None, None, 'Height of the bounding rectangle of the control.',), -('Control','Width','N',0,32767,None, None, None, None, 'Width of the bounding rectangle of the control.',), -('Control','X','N',0,32767,None, None, None, None, 'Horizontal coordinate of the upper left corner of the bounding rectangle of the control.',), -('Control','Control','N',None, None, None, None, 'Identifier',None, 'Name of the control. This name must be unique within a dialog, but can repeat on different dialogs. ',), -('Control','Control_Next','Y',None, None, 'Control',2,'Identifier',None, 'The name of an other control on the same dialog. This link defines the tab order of the controls. The links have to form one or more cycles!',), -('Control','Dialog_','N',None, None, 'Dialog',1,'Identifier',None, 'External key to the Dialog table, name of the dialog.',), -('Control','Help','Y',None, None, None, None, 'Text',None, 'The help strings used with the button. The text is optional. ',), -('Dialog','Attributes','Y',0,2147483647,None, None, None, None, 'A 32-bit word that specifies the attribute flags to be applied to this dialog.',), -('Dialog','Height','N',0,32767,None, None, None, None, 'Height of the bounding rectangle of the dialog.',), -('Dialog','Width','N',0,32767,None, None, None, None, 'Width of the bounding rectangle of the dialog.',), -('Dialog','Dialog','N',None, None, None, None, 'Identifier',None, 'Name of the dialog.',), -('Dialog','Control_Cancel','Y',None, None, 'Control',2,'Identifier',None, 'Defines the cancel control. Hitting escape or clicking on the close icon on the dialog is equivalent to pushing this button.',), -('Dialog','Control_Default','Y',None, None, 'Control',2,'Identifier',None, 'Defines the default control. Hitting return is equivalent to pushing this button.',), -('Dialog','Control_First','N',None, None, 'Control',2,'Identifier',None, 'Defines the control that has the focus when the dialog is created.',), -('Dialog','HCentering','N',0,100,None, None, None, None, 'Horizontal position of the dialog on a 0-100 scale. 0 means left end, 100 means right end of the screen, 50 center.',), -('Dialog','Title','Y',None, None, None, None, 'Formatted',None, "A text string specifying the title to be displayed in the title bar of the dialog's window.",), -('Dialog','VCentering','N',0,100,None, None, None, None, 'Vertical position of the dialog on a 0-100 scale. 0 means top end, 100 means bottom end of the screen, 50 center.',), -('ControlCondition','Action','N',None, None, None, None, None, 'Default;Disable;Enable;Hide;Show','The desired action to be taken on the specified control.',), -('ControlCondition','Condition','N',None, None, None, None, 'Condition',None, 'A standard conditional statement that specifies under which conditions the action should be triggered.',), -('ControlCondition','Dialog_','N',None, None, 'Dialog',1,'Identifier',None, 'A foreign key to the Dialog table, name of the dialog.',), -('ControlCondition','Control_','N',None, None, 'Control',2,'Identifier',None, 'A foreign key to the Control table, name of the control.',), -('ControlEvent','Condition','Y',None, None, None, None, 'Condition',None, 'A standard conditional statement that specifies under which conditions an event should be triggered.',), -('ControlEvent','Ordering','Y',0,2147483647,None, None, None, None, 'An integer used to order several events tied to the same control. Can be left blank.',), -('ControlEvent','Argument','N',None, None, None, None, 'Formatted',None, 'A value to be used as a modifier when triggering a particular event.',), -('ControlEvent','Dialog_','N',None, None, 'Dialog',1,'Identifier',None, 'A foreign key to the Dialog table, name of the dialog.',), -('ControlEvent','Control_','N',None, None, 'Control',2,'Identifier',None, 'A foreign key to the Control table, name of the control',), -('ControlEvent','Event','N',None, None, None, None, 'Formatted',None, 'An identifier that specifies the type of the event that should take place when the user interacts with control specified by the first two entries.',), -('CreateFolder','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table.',), -('CreateFolder','Directory_','N',None, None, 'Directory',1,'Identifier',None, 'Primary key, could be foreign key into the Directory table.',), -('CustomAction','Type','N',1,16383,None, None, None, None, 'The numeric custom action type, consisting of source location, code type, entry, option flags.',), -('CustomAction','Action','N',None, None, None, None, 'Identifier',None, 'Primary key, name of action, normally appears in sequence table unless private use.',), -('CustomAction','Source','Y',None, None, None, None, 'CustomSource',None, 'The table reference of the source of the code.',), -('CustomAction','Target','Y',None, None, None, None, 'Formatted',None, 'Execution parameter, depends on the type of custom action',), -('DrLocator','Signature_','N',None, None, None, None, 'Identifier',None, 'The Signature_ represents a unique file signature and is also the foreign key in the Signature table.',), -('DrLocator','Path','Y',None, None, None, None, 'AnyPath',None, 'The path on the user system. This is either a subpath below the value of the Parent or a full path. The path may contain properties enclosed within [ ] that will be expanded.',), -('DrLocator','Depth','Y',0,32767,None, None, None, None, 'The depth below the path to which the Signature_ is recursively searched. If absent, the depth is assumed to be 0.',), -('DrLocator','Parent','Y',None, None, None, None, 'Identifier',None, 'The parent file signature. It is also a foreign key in the Signature table. If null and the Path column does not expand to a full path, then all the fixed drives of the user system are searched using the Path.',), -('DuplicateFile','File_','N',None, None, 'File',1,'Identifier',None, 'Foreign key referencing the source file to be duplicated.',), -('DuplicateFile','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key referencing Component that controls the duplicate file.',), -('DuplicateFile','DestFolder','Y',None, None, None, None, 'Identifier',None, 'Name of a property whose value is assumed to resolve to the full pathname to a destination folder.',), -('DuplicateFile','DestName','Y',None, None, None, None, 'Filename',None, 'Filename to be given to the duplicate file.',), -('DuplicateFile','FileKey','N',None, None, None, None, 'Identifier',None, 'Primary key used to identify a particular file entry',), -('Environment','Name','N',None, None, None, None, 'Text',None, 'The name of the environmental value.',), -('Environment','Value','Y',None, None, None, None, 'Formatted',None, 'The value to set in the environmental settings.',), -('Environment','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table referencing component that controls the installing of the environmental value.',), -('Environment','Environment','N',None, None, None, None, 'Identifier',None, 'Unique identifier for the environmental variable setting',), -('Error','Error','N',0,32767,None, None, None, None, 'Integer error number, obtained from header file IError(...) macros.',), -('Error','Message','Y',None, None, None, None, 'Template',None, 'Error formatting template, obtained from user ed. or localizers.',), -('EventMapping','Dialog_','N',None, None, 'Dialog',1,'Identifier',None, 'A foreign key to the Dialog table, name of the Dialog.',), -('EventMapping','Control_','N',None, None, 'Control',2,'Identifier',None, 'A foreign key to the Control table, name of the control.',), -('EventMapping','Event','N',None, None, None, None, 'Identifier',None, 'An identifier that specifies the type of the event that the control subscribes to.',), -('EventMapping','Attribute','N',None, None, None, None, 'Identifier',None, 'The name of the control attribute, that is set when this event is received.',), -('Extension','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.',), -('Extension','Component_','N',None, None, 'Component',1,'Identifier',None, 'Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.',), -('Extension','Extension','N',None, None, None, None, 'Text',None, 'The extension associated with the table row.',), -('Extension','MIME_','Y',None, None, 'MIME',1,'Text',None, 'Optional Context identifier, typically "type/format" associated with the extension',), -('Extension','ProgId_','Y',None, None, 'ProgId',1,'Text',None, 'Optional ProgId associated with this extension.',), -('MIME','CLSID','Y',None, None, None, None, 'Guid',None, 'Optional associated CLSID.',), -('MIME','ContentType','N',None, None, None, None, 'Text',None, 'Primary key. Context identifier, typically "type/format".',), -('MIME','Extension_','N',None, None, 'Extension',1,'Text',None, 'Optional associated extension (without dot)',), -('FeatureComponents','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Foreign key into Feature table.',), -('FeatureComponents','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into Component table.',), -('FileSFPCatalog','File_','N',None, None, 'File',1,'Identifier',None, 'File associated with the catalog',), -('FileSFPCatalog','SFPCatalog_','N',None, None, 'SFPCatalog',1,'Filename',None, 'Catalog associated with the file',), -('SFPCatalog','SFPCatalog','N',None, None, None, None, 'Filename',None, 'File name for the catalog.',), -('SFPCatalog','Catalog','N',None, None, None, None, 'Binary',None, 'SFP Catalog',), -('SFPCatalog','Dependency','Y',None, None, None, None, 'Formatted',None, 'Parent catalog - only used by SFP',), -('Font','File_','N',None, None, 'File',1,'Identifier',None, 'Primary key, foreign key into File table referencing font file.',), -('Font','FontTitle','Y',None, None, None, None, 'Text',None, 'Font name.',), -('IniFile','Action','N',None, None, None, None, None, '0;1;3','The type of modification to be made, one of iifEnum',), -('IniFile','Value','N',None, None, None, None, 'Formatted',None, 'The value to be written.',), -('IniFile','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table referencing component that controls the installing of the .INI value.',), -('IniFile','FileName','N',None, None, None, None, 'Filename',None, 'The .INI file name in which to write the information',), -('IniFile','IniFile','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('IniFile','DirProperty','Y',None, None, None, None, 'Identifier',None, 'Foreign key into the Directory table denoting the directory where the .INI file is.',), -('IniFile','Key','N',None, None, None, None, 'Formatted',None, 'The .INI file key below Section.',), -('IniFile','Section','N',None, None, None, None, 'Formatted',None, 'The .INI file Section.',), -('IniLocator','Type','Y',0,2,None, None, None, None, 'An integer value that determines if the .INI value read is a filename or a directory location or to be used as is w/o interpretation.',), -('IniLocator','Signature_','N',None, None, None, None, 'Identifier',None, 'The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.',), -('IniLocator','FileName','N',None, None, None, None, 'Filename',None, 'The .INI file name.',), -('IniLocator','Key','N',None, None, None, None, 'Text',None, 'Key value (followed by an equals sign in INI file).',), -('IniLocator','Section','N',None, None, None, None, 'Text',None, 'Section name within in file (within square brackets in INI file).',), -('IniLocator','Field','Y',0,32767,None, None, None, None, 'The field in the .INI line. If Field is null or 0 the entire line is read.',), -('InstallExecuteSequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('InstallExecuteSequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('InstallExecuteSequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('InstallUISequence','Action','N',None, None, None, None, 'Identifier',None, 'Name of action to invoke, either in the engine or the handler DLL.',), -('InstallUISequence','Condition','Y',None, None, None, None, 'Condition',None, 'Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.',), -('InstallUISequence','Sequence','Y',-4,32767,None, None, None, None, 'Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.',), -('IsolatedComponent','Component_Application','N',None, None, 'Component',1,'Identifier',None, 'Key to Component table item for application',), -('IsolatedComponent','Component_Shared','N',None, None, 'Component',1,'Identifier',None, 'Key to Component table item to be isolated',), -('LaunchCondition','Description','N',None, None, None, None, 'Formatted',None, 'Localizable text to display when condition fails and install must abort.',), -('LaunchCondition','Condition','N',None, None, None, None, 'Condition',None, 'Expression which must evaluate to TRUE in order for install to commence.',), -('ListBox','Text','Y',None, None, None, None, 'Text',None, 'The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.',), -('ListBox','Property','N',None, None, None, None, 'Identifier',None, 'A named property to be tied to this item. All the items tied to the same property become part of the same listbox.',), -('ListBox','Value','N',None, None, None, None, 'Formatted',None, 'The value string associated with this item. Selecting the line will set the associated property to this value.',), -('ListBox','Order','N',1,32767,None, None, None, None, 'A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.',), -('ListView','Text','Y',None, None, None, None, 'Text',None, 'The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.',), -('ListView','Property','N',None, None, None, None, 'Identifier',None, 'A named property to be tied to this item. All the items tied to the same property become part of the same listview.',), -('ListView','Value','N',None, None, None, None, 'Identifier',None, 'The value string associated with this item. Selecting the line will set the associated property to this value.',), -('ListView','Order','N',1,32767,None, None, None, None, 'A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.',), -('ListView','Binary_','Y',None, None, 'Binary',1,'Identifier',None, 'The name of the icon to be displayed with the icon. The binary information is looked up from the Binary Table.',), -('LockPermissions','Table','N',None, None, None, None, 'Identifier','Directory;File;Registry','Reference to another table name',), -('LockPermissions','Domain','Y',None, None, None, None, 'Formatted',None, 'Domain name for user whose permissions are being set. (usually a property)',), -('LockPermissions','LockObject','N',None, None, None, None, 'Identifier',None, 'Foreign key into Registry or File table',), -('LockPermissions','Permission','Y',-2147483647,2147483647,None, None, None, None, 'Permission Access mask. Full Control = 268435456 (GENERIC_ALL = 0x10000000)',), -('LockPermissions','User','N',None, None, None, None, 'Formatted',None, 'User for permissions to be set. (usually a property)',), -('Media','Source','Y',None, None, None, None, 'Property',None, 'The property defining the location of the cabinet file.',), -('Media','Cabinet','Y',None, None, None, None, 'Cabinet',None, 'If some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.',), -('Media','DiskId','N',1,32767,None, None, None, None, 'Primary key, integer to determine sort order for table.',), -('Media','DiskPrompt','Y',None, None, None, None, 'Text',None, 'Disk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.',), -('Media','LastSequence','N',0,32767,None, None, None, None, 'File sequence number for the last file for this media.',), -('Media','VolumeLabel','Y',None, None, None, None, 'Text',None, 'The label attributed to the volume.',), -('ModuleComponents','Component','N',None, None, 'Component',1,'Identifier',None, 'Component contained in the module.',), -('ModuleComponents','Language','N',None, None, 'ModuleSignature',2,None, None, 'Default language ID for module (may be changed by transform).',), -('ModuleComponents','ModuleID','N',None, None, 'ModuleSignature',1,'Identifier',None, 'Module containing the component.',), -('ModuleSignature','Language','N',None, None, None, None, None, None, 'Default decimal language of module.',), -('ModuleSignature','Version','N',None, None, None, None, 'Version',None, 'Version of the module.',), -('ModuleSignature','ModuleID','N',None, None, None, None, 'Identifier',None, 'Module identifier (String.GUID).',), -('ModuleDependency','ModuleID','N',None, None, 'ModuleSignature',1,'Identifier',None, 'Module requiring the dependency.',), -('ModuleDependency','ModuleLanguage','N',None, None, 'ModuleSignature',2,None, None, 'Language of module requiring the dependency.',), -('ModuleDependency','RequiredID','N',None, None, None, None, None, None, 'String.GUID of required module.',), -('ModuleDependency','RequiredLanguage','N',None, None, None, None, None, None, 'LanguageID of the required module.',), -('ModuleDependency','RequiredVersion','Y',None, None, None, None, 'Version',None, 'Version of the required version.',), -('ModuleExclusion','ModuleID','N',None, None, 'ModuleSignature',1,'Identifier',None, 'String.GUID of module with exclusion requirement.',), -('ModuleExclusion','ModuleLanguage','N',None, None, 'ModuleSignature',2,None, None, 'LanguageID of module with exclusion requirement.',), -('ModuleExclusion','ExcludedID','N',None, None, None, None, None, None, 'String.GUID of excluded module.',), -('ModuleExclusion','ExcludedLanguage','N',None, None, None, None, None, None, 'Language of excluded module.',), -('ModuleExclusion','ExcludedMaxVersion','Y',None, None, None, None, 'Version',None, 'Maximum version of excluded module.',), -('ModuleExclusion','ExcludedMinVersion','Y',None, None, None, None, 'Version',None, 'Minimum version of excluded module.',), -('MoveFile','Component_','N',None, None, 'Component',1,'Identifier',None, 'If this component is not "selected" for installation or removal, no action will be taken on the associated MoveFile entry',), -('MoveFile','DestFolder','N',None, None, None, None, 'Identifier',None, 'Name of a property whose value is assumed to resolve to the full path to the destination directory',), -('MoveFile','DestName','Y',None, None, None, None, 'Filename',None, 'Name to be given to the original file after it is moved or copied. If blank, the destination file will be given the same name as the source file',), -('MoveFile','FileKey','N',None, None, None, None, 'Identifier',None, 'Primary key that uniquely identifies a particular MoveFile record',), -('MoveFile','Options','N',0,1,None, None, None, None, 'Integer value specifying the MoveFile operating mode, one of imfoEnum',), -('MoveFile','SourceFolder','Y',None, None, None, None, 'Identifier',None, 'Name of a property whose value is assumed to resolve to the full path to the source directory',), -('MoveFile','SourceName','Y',None, None, None, None, 'Text',None, "Name of the source file(s) to be moved or copied. Can contain the '*' or '?' wildcards.",), -('MsiAssembly','Attributes','Y',None, None, None, None, None, None, 'Assembly attributes',), -('MsiAssembly','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Foreign key into Feature table.',), -('MsiAssembly','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into Component table.',), -('MsiAssembly','File_Application','Y',None, None, 'File',1,'Identifier',None, 'Foreign key into File table, denoting the application context for private assemblies. Null for global assemblies.',), -('MsiAssembly','File_Manifest','Y',None, None, 'File',1,'Identifier',None, 'Foreign key into the File table denoting the manifest file for the assembly.',), -('MsiAssemblyName','Name','N',None, None, None, None, 'Text',None, 'The name part of the name-value pairs for the assembly name.',), -('MsiAssemblyName','Value','N',None, None, None, None, 'Text',None, 'The value part of the name-value pairs for the assembly name.',), -('MsiAssemblyName','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into Component table.',), -('MsiDigitalCertificate','CertData','N',None, None, None, None, 'Binary',None, 'A certificate context blob for a signer certificate',), -('MsiDigitalCertificate','DigitalCertificate','N',None, None, None, None, 'Identifier',None, 'A unique identifier for the row',), -('MsiDigitalSignature','Table','N',None, None, None, None, None, 'Media','Reference to another table name (only Media table is supported)',), -('MsiDigitalSignature','DigitalCertificate_','N',None, None, 'MsiDigitalCertificate',1,'Identifier',None, 'Foreign key to MsiDigitalCertificate table identifying the signer certificate',), -('MsiDigitalSignature','Hash','Y',None, None, None, None, 'Binary',None, 'The encoded hash blob from the digital signature',), -('MsiDigitalSignature','SignObject','N',None, None, None, None, 'Text',None, 'Foreign key to Media table',), -('MsiFileHash','File_','N',None, None, 'File',1,'Identifier',None, 'Primary key, foreign key into File table referencing file with this hash',), -('MsiFileHash','Options','N',0,32767,None, None, None, None, 'Various options and attributes for this hash.',), -('MsiFileHash','HashPart1','N',None, None, None, None, None, None, 'Size of file in bytes (integer).',), -('MsiFileHash','HashPart2','N',None, None, None, None, None, None, 'Size of file in bytes (integer).',), -('MsiFileHash','HashPart3','N',None, None, None, None, None, None, 'Size of file in bytes (integer).',), -('MsiFileHash','HashPart4','N',None, None, None, None, None, None, 'Size of file in bytes (integer).',), -('MsiPatchHeaders','StreamRef','N',None, None, None, None, 'Identifier',None, 'Primary key. A unique identifier for the row.',), -('MsiPatchHeaders','Header','N',None, None, None, None, 'Binary',None, 'Binary stream. The patch header, used for patch validation.',), -('ODBCAttribute','Value','Y',None, None, None, None, 'Text',None, 'Value for ODBC driver attribute',), -('ODBCAttribute','Attribute','N',None, None, None, None, 'Text',None, 'Name of ODBC driver attribute',), -('ODBCAttribute','Driver_','N',None, None, 'ODBCDriver',1,'Identifier',None, 'Reference to ODBC driver in ODBCDriver table',), -('ODBCDriver','Description','N',None, None, None, None, 'Text',None, 'Text used as registered name for driver, non-localized',), -('ODBCDriver','File_','N',None, None, 'File',1,'Identifier',None, 'Reference to key driver file',), -('ODBCDriver','Component_','N',None, None, 'Component',1,'Identifier',None, 'Reference to associated component',), -('ODBCDriver','Driver','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized.internal token for driver',), -('ODBCDriver','File_Setup','Y',None, None, 'File',1,'Identifier',None, 'Optional reference to key driver setup DLL',), -('ODBCDataSource','Description','N',None, None, None, None, 'Text',None, 'Text used as registered name for data source',), -('ODBCDataSource','Component_','N',None, None, 'Component',1,'Identifier',None, 'Reference to associated component',), -('ODBCDataSource','DataSource','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized.internal token for data source',), -('ODBCDataSource','DriverDescription','N',None, None, None, None, 'Text',None, 'Reference to driver description, may be existing driver',), -('ODBCDataSource','Registration','N',0,1,None, None, None, None, 'Registration option: 0=machine, 1=user, others t.b.d.',), -('ODBCSourceAttribute','Value','Y',None, None, None, None, 'Text',None, 'Value for ODBC data source attribute',), -('ODBCSourceAttribute','Attribute','N',None, None, None, None, 'Text',None, 'Name of ODBC data source attribute',), -('ODBCSourceAttribute','DataSource_','N',None, None, 'ODBCDataSource',1,'Identifier',None, 'Reference to ODBC data source in ODBCDataSource table',), -('ODBCTranslator','Description','N',None, None, None, None, 'Text',None, 'Text used as registered name for translator',), -('ODBCTranslator','File_','N',None, None, 'File',1,'Identifier',None, 'Reference to key translator file',), -('ODBCTranslator','Component_','N',None, None, 'Component',1,'Identifier',None, 'Reference to associated component',), -('ODBCTranslator','File_Setup','Y',None, None, 'File',1,'Identifier',None, 'Optional reference to key translator setup DLL',), -('ODBCTranslator','Translator','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized.internal token for translator',), -('Patch','Sequence','N',0,32767,None, None, None, None, 'Primary key, sequence with respect to the media images; order must track cabinet order.',), -('Patch','Attributes','N',0,32767,None, None, None, None, 'Integer containing bit flags representing patch attributes',), -('Patch','File_','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token, foreign key to File table, must match identifier in cabinet.',), -('Patch','Header','Y',None, None, None, None, 'Binary',None, 'Binary stream. The patch header, used for patch validation.',), -('Patch','PatchSize','N',0,2147483647,None, None, None, None, 'Size of patch in bytes (integer).',), -('Patch','StreamRef_','Y',None, None, None, None, 'Identifier',None, 'Identifier. Foreign key to the StreamRef column of the MsiPatchHeaders table.',), -('PatchPackage','Media_','N',0,32767,None, None, None, None, 'Foreign key to DiskId column of Media table. Indicates the disk containing the patch package.',), -('PatchPackage','PatchId','N',None, None, None, None, 'Guid',None, 'A unique string GUID representing this patch.',), -('PublishComponent','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Foreign key into the Feature table.',), -('PublishComponent','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table.',), -('PublishComponent','ComponentId','N',None, None, None, None, 'Guid',None, 'A string GUID that represents the component id that will be requested by the alien product.',), -('PublishComponent','AppData','Y',None, None, None, None, 'Text',None, 'This is localisable Application specific data that can be associated with a Qualified Component.',), -('PublishComponent','Qualifier','N',None, None, None, None, 'Text',None, 'This is defined only when the ComponentId column is an Qualified Component Id. This is the Qualifier for ProvideComponentIndirect.',), -('RadioButton','Y','N',0,32767,None, None, None, None, 'The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.',), -('RadioButton','Text','Y',None, None, None, None, 'Text',None, 'The visible title to be assigned to the radio button.',), -('RadioButton','Property','N',None, None, None, None, 'Identifier',None, 'A named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.',), -('RadioButton','Height','N',0,32767,None, None, None, None, 'The height of the button.',), -('RadioButton','Width','N',0,32767,None, None, None, None, 'The width of the button.',), -('RadioButton','X','N',0,32767,None, None, None, None, 'The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.',), -('RadioButton','Value','N',None, None, None, None, 'Formatted',None, 'The value string associated with this button. Selecting the button will set the associated property to this value.',), -('RadioButton','Order','N',1,32767,None, None, None, None, 'A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.',), -('RadioButton','Help','Y',None, None, None, None, 'Text',None, 'The help strings used with the button. The text is optional.',), -('Registry','Name','Y',None, None, None, None, 'Formatted',None, 'The registry value name.',), -('Registry','Value','Y',None, None, None, None, 'Formatted',None, 'The registry value.',), -('Registry','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table referencing component that controls the installing of the registry value.',), -('Registry','Key','N',None, None, None, None, 'RegPath',None, 'The key for the registry value.',), -('Registry','Registry','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('Registry','Root','N',-1,3,None, None, None, None, 'The predefined root key for the registry value, one of rrkEnum.',), -('RegLocator','Name','Y',None, None, None, None, 'Formatted',None, 'The registry value name.',), -('RegLocator','Type','Y',0,18,None, None, None, None, 'An integer value that determines if the registry value is a filename or a directory location or to be used as is w/o interpretation.',), -('RegLocator','Signature_','N',None, None, None, None, 'Identifier',None, 'The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table. If the type is 0, the registry values refers a directory, and _Signature is not a foreign key.',), -('RegLocator','Key','N',None, None, None, None, 'RegPath',None, 'The key for the registry value.',), -('RegLocator','Root','N',0,3,None, None, None, None, 'The predefined root key for the registry value, one of rrkEnum.',), -('RemoveFile','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key referencing Component that controls the file to be removed.',), -('RemoveFile','FileKey','N',None, None, None, None, 'Identifier',None, 'Primary key used to identify a particular file entry',), -('RemoveFile','FileName','Y',None, None, None, None, 'WildCardFilename',None, 'Name of the file to be removed.',), -('RemoveFile','DirProperty','N',None, None, None, None, 'Identifier',None, 'Name of a property whose value is assumed to resolve to the full pathname to the folder of the file to be removed.',), -('RemoveFile','InstallMode','N',None, None, None, None, None, '1;2;3','Installation option, one of iimEnum.',), -('RemoveIniFile','Action','N',None, None, None, None, None, '2;4','The type of modification to be made, one of iifEnum.',), -('RemoveIniFile','Value','Y',None, None, None, None, 'Formatted',None, 'The value to be deleted. The value is required when Action is iifIniRemoveTag',), -('RemoveIniFile','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table referencing component that controls the deletion of the .INI value.',), -('RemoveIniFile','FileName','N',None, None, None, None, 'Filename',None, 'The .INI file name in which to delete the information',), -('RemoveIniFile','DirProperty','Y',None, None, None, None, 'Identifier',None, 'Foreign key into the Directory table denoting the directory where the .INI file is.',), -('RemoveIniFile','Key','N',None, None, None, None, 'Formatted',None, 'The .INI file key below Section.',), -('RemoveIniFile','Section','N',None, None, None, None, 'Formatted',None, 'The .INI file Section.',), -('RemoveIniFile','RemoveIniFile','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('RemoveRegistry','Name','Y',None, None, None, None, 'Formatted',None, 'The registry value name.',), -('RemoveRegistry','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table referencing component that controls the deletion of the registry value.',), -('RemoveRegistry','Key','N',None, None, None, None, 'RegPath',None, 'The key for the registry value.',), -('RemoveRegistry','Root','N',-1,3,None, None, None, None, 'The predefined root key for the registry value, one of rrkEnum',), -('RemoveRegistry','RemoveRegistry','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('ReserveCost','Component_','N',None, None, 'Component',1,'Identifier',None, 'Reserve a specified amount of space if this component is to be installed.',), -('ReserveCost','ReserveFolder','Y',None, None, None, None, 'Identifier',None, 'Name of a property whose value is assumed to resolve to the full path to the destination directory',), -('ReserveCost','ReserveKey','N',None, None, None, None, 'Identifier',None, 'Primary key that uniquely identifies a particular ReserveCost record',), -('ReserveCost','ReserveLocal','N',0,2147483647,None, None, None, None, 'Disk space to reserve if linked component is installed locally.',), -('ReserveCost','ReserveSource','N',0,2147483647,None, None, None, None, 'Disk space to reserve if linked component is installed to run from the source location.',), -('SelfReg','File_','N',None, None, 'File',1,'Identifier',None, 'Foreign key into the File table denoting the module that needs to be registered.',), -('SelfReg','Cost','Y',0,32767,None, None, None, None, 'The cost of registering the module.',), -('ServiceControl','Name','N',None, None, None, None, 'Formatted',None, 'Name of a service. /, \\, comma and space are invalid',), -('ServiceControl','Component_','N',None, None, 'Component',1,'Identifier',None, 'Required foreign key into the Component Table that controls the startup of the service',), -('ServiceControl','Event','N',0,187,None, None, None, None, 'Bit field: Install: 0x1 = Start, 0x2 = Stop, 0x8 = Delete, Uninstall: 0x10 = Start, 0x20 = Stop, 0x80 = Delete',), -('ServiceControl','ServiceControl','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('ServiceControl','Arguments','Y',None, None, None, None, 'Formatted',None, 'Arguments for the service. Separate by [~].',), -('ServiceControl','Wait','Y',0,1,None, None, None, None, 'Boolean for whether to wait for the service to fully start',), -('ServiceInstall','Name','N',None, None, None, None, 'Formatted',None, 'Internal Name of the Service',), -('ServiceInstall','Description','Y',None, None, None, None, 'Text',None, 'Description of service.',), -('ServiceInstall','Component_','N',None, None, 'Component',1,'Identifier',None, 'Required foreign key into the Component Table that controls the startup of the service',), -('ServiceInstall','Arguments','Y',None, None, None, None, 'Formatted',None, 'Arguments to include in every start of the service, passed to WinMain',), -('ServiceInstall','ServiceInstall','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('ServiceInstall','Dependencies','Y',None, None, None, None, 'Formatted',None, 'Other services this depends on to start. Separate by [~], and end with [~][~]',), -('ServiceInstall','DisplayName','Y',None, None, None, None, 'Formatted',None, 'External Name of the Service',), -('ServiceInstall','ErrorControl','N',-2147483647,2147483647,None, None, None, None, 'Severity of error if service fails to start',), -('ServiceInstall','LoadOrderGroup','Y',None, None, None, None, 'Formatted',None, 'LoadOrderGroup',), -('ServiceInstall','Password','Y',None, None, None, None, 'Formatted',None, 'password to run service with. (with StartName)',), -('ServiceInstall','ServiceType','N',-2147483647,2147483647,None, None, None, None, 'Type of the service',), -('ServiceInstall','StartName','Y',None, None, None, None, 'Formatted',None, 'User or object name to run service as',), -('ServiceInstall','StartType','N',0,4,None, None, None, None, 'Type of the service',), -('Shortcut','Name','N',None, None, None, None, 'Filename',None, 'The name of the shortcut to be created.',), -('Shortcut','Description','Y',None, None, None, None, 'Text',None, 'The description for the shortcut.',), -('Shortcut','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table denoting the component whose selection gates the shortcut creation/deletion.',), -('Shortcut','Icon_','Y',None, None, 'Icon',1,'Identifier',None, 'Foreign key into the File table denoting the external icon file for the shortcut.',), -('Shortcut','IconIndex','Y',-32767,32767,None, None, None, None, 'The icon index for the shortcut.',), -('Shortcut','Directory_','N',None, None, 'Directory',1,'Identifier',None, 'Foreign key into the Directory table denoting the directory where the shortcut file is created.',), -('Shortcut','Target','N',None, None, None, None, 'Shortcut',None, 'The shortcut target. This is usually a property that is expanded to a file or a folder that the shortcut points to.',), -('Shortcut','Arguments','Y',None, None, None, None, 'Formatted',None, 'The command-line arguments for the shortcut.',), -('Shortcut','Shortcut','N',None, None, None, None, 'Identifier',None, 'Primary key, non-localized token.',), -('Shortcut','Hotkey','Y',0,32767,None, None, None, None, 'The hotkey for the shortcut. It has the virtual-key code for the key in the low-order byte, and the modifier flags in the high-order byte. ',), -('Shortcut','ShowCmd','Y',None, None, None, None, None, '1;3;7','The show command for the application window.The following values may be used.',), -('Shortcut','WkDir','Y',None, None, None, None, 'Identifier',None, 'Name of property defining location of working directory.',), -('Signature','FileName','N',None, None, None, None, 'Filename',None, 'The name of the file. This may contain a "short name|long name" pair.',), -('Signature','Signature','N',None, None, None, None, 'Identifier',None, 'The table key. The Signature represents a unique file signature.',), -('Signature','Languages','Y',None, None, None, None, 'Language',None, 'The languages supported by the file.',), -('Signature','MaxDate','Y',0,2147483647,None, None, None, None, 'The maximum creation date of the file.',), -('Signature','MaxSize','Y',0,2147483647,None, None, None, None, 'The maximum size of the file. ',), -('Signature','MaxVersion','Y',None, None, None, None, 'Text',None, 'The maximum version of the file.',), -('Signature','MinDate','Y',0,2147483647,None, None, None, None, 'The minimum creation date of the file.',), -('Signature','MinSize','Y',0,2147483647,None, None, None, None, 'The minimum size of the file.',), -('Signature','MinVersion','Y',None, None, None, None, 'Text',None, 'The minimum version of the file.',), -('TextStyle','TextStyle','N',None, None, None, None, 'Identifier',None, 'Name of the style. The primary key of this table. This name is embedded in the texts to indicate a style change.',), -('TextStyle','Color','Y',0,16777215,None, None, None, None, 'An integer indicating the color of the string in the RGB format (Red, Green, Blue each 0-255, RGB = R + 256*G + 256^2*B).',), -('TextStyle','FaceName','N',None, None, None, None, 'Text',None, 'A string indicating the name of the font used. Required. The string must be at most 31 characters long.',), -('TextStyle','Size','N',0,32767,None, None, None, None, 'The size of the font used. This size is given in our units (1/12 of the system font height). Assuming that the system font is set to 12 point size, this is equivalent to the point size.',), -('TextStyle','StyleBits','Y',0,15,None, None, None, None, 'A combination of style bits.',), -('TypeLib','Description','Y',None, None, None, None, 'Text',None, None, ), -('TypeLib','Feature_','N',None, None, 'Feature',1,'Identifier',None, 'Required foreign key into the Feature Table, specifying the feature to validate or install in order for the type library to be operational.',), -('TypeLib','Component_','N',None, None, 'Component',1,'Identifier',None, 'Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.',), -('TypeLib','Directory_','Y',None, None, 'Directory',1,'Identifier',None, 'Optional. The foreign key into the Directory table denoting the path to the help file for the type library.',), -('TypeLib','Language','N',0,32767,None, None, None, None, 'The language of the library.',), -('TypeLib','Version','Y',0,16777215,None, None, None, None, 'The version of the library. The minor version is in the lower 8 bits of the integer. The major version is in the next 16 bits. ',), -('TypeLib','Cost','Y',0,2147483647,None, None, None, None, 'The cost associated with the registration of the typelib. This column is currently optional.',), -('TypeLib','LibID','N',None, None, None, None, 'Guid',None, 'The GUID that represents the library.',), -('UIText','Text','Y',None, None, None, None, 'Text',None, 'The localized version of the string.',), -('UIText','Key','N',None, None, None, None, 'Identifier',None, 'A unique key that identifies the particular string.',), -('Upgrade','Attributes','N',0,2147483647,None, None, None, None, 'The attributes of this product set.',), -('Upgrade','Language','Y',None, None, None, None, 'Language',None, 'A comma-separated list of languages for either products in this set or products not in this set.',), -('Upgrade','ActionProperty','N',None, None, None, None, 'UpperCase',None, 'The property to set when a product in this set is found.',), -('Upgrade','Remove','Y',None, None, None, None, 'Formatted',None, 'The list of features to remove when uninstalling a product from this set. The default is "ALL".',), -('Upgrade','UpgradeCode','N',None, None, None, None, 'Guid',None, 'The UpgradeCode GUID belonging to the products in this set.',), -('Upgrade','VersionMax','Y',None, None, None, None, 'Text',None, 'The maximum ProductVersion of the products in this set. The set may or may not include products with this particular version.',), -('Upgrade','VersionMin','Y',None, None, None, None, 'Text',None, 'The minimum ProductVersion of the products in this set. The set may or may not include products with this particular version.',), -('Verb','Sequence','Y',0,32767,None, None, None, None, 'Order within the verbs for a particular extension. Also used simply to specify the default verb.',), -('Verb','Argument','Y',None, None, None, None, 'Formatted',None, 'Optional value for the command arguments.',), -('Verb','Extension_','N',None, None, 'Extension',1,'Text',None, 'The extension associated with the table row.',), -('Verb','Verb','N',None, None, None, None, 'Text',None, 'The verb for the command.',), -('Verb','Command','Y',None, None, None, None, 'Formatted',None, 'The command text.',), -] diff --git a/Lib/msilib/sequence.py b/Lib/msilib/sequence.py deleted file mode 100644 index 7012a21f..00000000 --- a/Lib/msilib/sequence.py +++ /dev/null @@ -1,126 +0,0 @@ -AdminExecuteSequence = [ -('InstallInitialize', None, 1500), -('InstallFinalize', None, 6600), -('InstallFiles', None, 4000), -('InstallAdminPackage', None, 3900), -('FileCost', None, 900), -('CostInitialize', None, 800), -('CostFinalize', None, 1000), -('InstallValidate', None, 1400), -] - -AdminUISequence = [ -('FileCost', None, 900), -('CostInitialize', None, 800), -('CostFinalize', None, 1000), -('ExecuteAction', None, 1300), -('ExitDialog', None, -1), -('FatalError', None, -3), -('UserExit', None, -2), -] - -AdvtExecuteSequence = [ -('InstallInitialize', None, 1500), -('InstallFinalize', None, 6600), -('CostInitialize', None, 800), -('CostFinalize', None, 1000), -('InstallValidate', None, 1400), -('CreateShortcuts', None, 4500), -('MsiPublishAssemblies', None, 6250), -('PublishComponents', None, 6200), -('PublishFeatures', None, 6300), -('PublishProduct', None, 6400), -('RegisterClassInfo', None, 4600), -('RegisterExtensionInfo', None, 4700), -('RegisterMIMEInfo', None, 4900), -('RegisterProgIdInfo', None, 4800), -] - -InstallExecuteSequence = [ -('InstallInitialize', None, 1500), -('InstallFinalize', None, 6600), -('InstallFiles', None, 4000), -('FileCost', None, 900), -('CostInitialize', None, 800), -('CostFinalize', None, 1000), -('InstallValidate', None, 1400), -('CreateShortcuts', None, 4500), -('MsiPublishAssemblies', None, 6250), -('PublishComponents', None, 6200), -('PublishFeatures', None, 6300), -('PublishProduct', None, 6400), -('RegisterClassInfo', None, 4600), -('RegisterExtensionInfo', None, 4700), -('RegisterMIMEInfo', None, 4900), -('RegisterProgIdInfo', None, 4800), -('AllocateRegistrySpace', 'NOT Installed', 1550), -('AppSearch', None, 400), -('BindImage', None, 4300), -('CCPSearch', 'NOT Installed', 500), -('CreateFolders', None, 3700), -('DeleteServices', 'VersionNT', 2000), -('DuplicateFiles', None, 4210), -('FindRelatedProducts', None, 200), -('InstallODBC', None, 5400), -('InstallServices', 'VersionNT', 5800), -('IsolateComponents', None, 950), -('LaunchConditions', None, 100), -('MigrateFeatureStates', None, 1200), -('MoveFiles', None, 3800), -('PatchFiles', None, 4090), -('ProcessComponents', None, 1600), -('RegisterComPlus', None, 5700), -('RegisterFonts', None, 5300), -('RegisterProduct', None, 6100), -('RegisterTypeLibraries', None, 5500), -('RegisterUser', None, 6000), -('RemoveDuplicateFiles', None, 3400), -('RemoveEnvironmentStrings', None, 3300), -('RemoveExistingProducts', None, 6700), -('RemoveFiles', None, 3500), -('RemoveFolders', None, 3600), -('RemoveIniValues', None, 3100), -('RemoveODBC', None, 2400), -('RemoveRegistryValues', None, 2600), -('RemoveShortcuts', None, 3200), -('RMCCPSearch', 'NOT Installed', 600), -('SelfRegModules', None, 5600), -('SelfUnregModules', None, 2200), -('SetODBCFolders', None, 1100), -('StartServices', 'VersionNT', 5900), -('StopServices', 'VersionNT', 1900), -('MsiUnpublishAssemblies', None, 1750), -('UnpublishComponents', None, 1700), -('UnpublishFeatures', None, 1800), -('UnregisterClassInfo', None, 2700), -('UnregisterComPlus', None, 2100), -('UnregisterExtensionInfo', None, 2800), -('UnregisterFonts', None, 2500), -('UnregisterMIMEInfo', None, 3000), -('UnregisterProgIdInfo', None, 2900), -('UnregisterTypeLibraries', None, 2300), -('ValidateProductID', None, 700), -('WriteEnvironmentStrings', None, 5200), -('WriteIniValues', None, 5100), -('WriteRegistryValues', None, 5000), -] - -InstallUISequence = [ -('FileCost', None, 900), -('CostInitialize', None, 800), -('CostFinalize', None, 1000), -('ExecuteAction', None, 1300), -('ExitDialog', None, -1), -('FatalError', None, -3), -('UserExit', None, -2), -('AppSearch', None, 400), -('CCPSearch', 'NOT Installed', 500), -('FindRelatedProducts', None, 200), -('IsolateComponents', None, 950), -('LaunchConditions', None, 100), -('MigrateFeatureStates', None, 1200), -('RMCCPSearch', 'NOT Installed', 600), -('ValidateProductID', None, 700), -] - -tables=['AdminExecuteSequence', 'AdminUISequence', 'AdvtExecuteSequence', 'InstallExecuteSequence', 'InstallUISequence'] diff --git a/Lib/msilib/text.py b/Lib/msilib/text.py deleted file mode 100644 index c4b9e869..00000000 --- a/Lib/msilib/text.py +++ /dev/null @@ -1,129 +0,0 @@ -import msilib,os;dirname=os.path.dirname(__file__) - -ActionText = [ -('InstallValidate', 'Validating install', None), -('InstallFiles', 'Copying new files', 'File: [1], Directory: [9], Size: [6]'), -('InstallAdminPackage', 'Copying network install files', 'File: [1], Directory: [9], Size: [6]'), -('FileCost', 'Computing space requirements', None), -('CostInitialize', 'Computing space requirements', None), -('CostFinalize', 'Computing space requirements', None), -('CreateShortcuts', 'Creating shortcuts', 'Shortcut: [1]'), -('PublishComponents', 'Publishing Qualified Components', 'Component ID: [1], Qualifier: [2]'), -('PublishFeatures', 'Publishing Product Features', 'Feature: [1]'), -('PublishProduct', 'Publishing product information', None), -('RegisterClassInfo', 'Registering Class servers', 'Class Id: [1]'), -('RegisterExtensionInfo', 'Registering extension servers', 'Extension: [1]'), -('RegisterMIMEInfo', 'Registering MIME info', 'MIME Content Type: [1], Extension: [2]'), -('RegisterProgIdInfo', 'Registering program identifiers', 'ProgId: [1]'), -('AllocateRegistrySpace', 'Allocating registry space', 'Free space: [1]'), -('AppSearch', 'Searching for installed applications', 'Property: [1], Signature: [2]'), -('BindImage', 'Binding executables', 'File: [1]'), -('CCPSearch', 'Searching for qualifying products', None), -('CreateFolders', 'Creating folders', 'Folder: [1]'), -('DeleteServices', 'Deleting services', 'Service: [1]'), -('DuplicateFiles', 'Creating duplicate files', 'File: [1], Directory: [9], Size: [6]'), -('FindRelatedProducts', 'Searching for related applications', 'Found application: [1]'), -('InstallODBC', 'Installing ODBC components', None), -('InstallServices', 'Installing new services', 'Service: [2]'), -('LaunchConditions', 'Evaluating launch conditions', None), -('MigrateFeatureStates', 'Migrating feature states from related applications', 'Application: [1]'), -('MoveFiles', 'Moving files', 'File: [1], Directory: [9], Size: [6]'), -('PatchFiles', 'Patching files', 'File: [1], Directory: [2], Size: [3]'), -('ProcessComponents', 'Updating component registration', None), -('RegisterComPlus', 'Registering COM+ Applications and Components', 'AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}'), -('RegisterFonts', 'Registering fonts', 'Font: [1]'), -('RegisterProduct', 'Registering product', '[1]'), -('RegisterTypeLibraries', 'Registering type libraries', 'LibID: [1]'), -('RegisterUser', 'Registering user', '[1]'), -('RemoveDuplicateFiles', 'Removing duplicated files', 'File: [1], Directory: [9]'), -('RemoveEnvironmentStrings', 'Updating environment strings', 'Name: [1], Value: [2], Action [3]'), -('RemoveExistingProducts', 'Removing applications', 'Application: [1], Command line: [2]'), -('RemoveFiles', 'Removing files', 'File: [1], Directory: [9]'), -('RemoveFolders', 'Removing folders', 'Folder: [1]'), -('RemoveIniValues', 'Removing INI files entries', 'File: [1], Section: [2], Key: [3], Value: [4]'), -('RemoveODBC', 'Removing ODBC components', None), -('RemoveRegistryValues', 'Removing system registry values', 'Key: [1], Name: [2]'), -('RemoveShortcuts', 'Removing shortcuts', 'Shortcut: [1]'), -('RMCCPSearch', 'Searching for qualifying products', None), -('SelfRegModules', 'Registering modules', 'File: [1], Folder: [2]'), -('SelfUnregModules', 'Unregistering modules', 'File: [1], Folder: [2]'), -('SetODBCFolders', 'Initializing ODBC directories', None), -('StartServices', 'Starting services', 'Service: [1]'), -('StopServices', 'Stopping services', 'Service: [1]'), -('UnpublishComponents', 'Unpublishing Qualified Components', 'Component ID: [1], Qualifier: [2]'), -('UnpublishFeatures', 'Unpublishing Product Features', 'Feature: [1]'), -('UnregisterClassInfo', 'Unregister Class servers', 'Class Id: [1]'), -('UnregisterComPlus', 'Unregistering COM+ Applications and Components', 'AppId: [1]{{, AppType: [2]}}'), -('UnregisterExtensionInfo', 'Unregistering extension servers', 'Extension: [1]'), -('UnregisterFonts', 'Unregistering fonts', 'Font: [1]'), -('UnregisterMIMEInfo', 'Unregistering MIME info', 'MIME Content Type: [1], Extension: [2]'), -('UnregisterProgIdInfo', 'Unregistering program identifiers', 'ProgId: [1]'), -('UnregisterTypeLibraries', 'Unregistering type libraries', 'LibID: [1]'), -('WriteEnvironmentStrings', 'Updating environment strings', 'Name: [1], Value: [2], Action [3]'), -('WriteIniValues', 'Writing INI files values', 'File: [1], Section: [2], Key: [3], Value: [4]'), -('WriteRegistryValues', 'Writing system registry values', 'Key: [1], Name: [2], Value: [3]'), -('Advertise', 'Advertising application', None), -('GenerateScript', 'Generating script operations for action:', '[1]'), -('InstallSFPCatalogFile', 'Installing system catalog', 'File: [1], Dependencies: [2]'), -('MsiPublishAssemblies', 'Publishing assembly information', 'Application Context:[1], Assembly Name:[2]'), -('MsiUnpublishAssemblies', 'Unpublishing assembly information', 'Application Context:[1], Assembly Name:[2]'), -('Rollback', 'Rolling back action:', '[1]'), -('RollbackCleanup', 'Removing backup files', 'File: [1]'), -('UnmoveFiles', 'Removing moved files', 'File: [1], Directory: [9]'), -('UnpublishProduct', 'Unpublishing product information', None), -] - -UIText = [ -('AbsentPath', None), -('bytes', 'bytes'), -('GB', 'GB'), -('KB', 'KB'), -('MB', 'MB'), -('MenuAbsent', 'Entire feature will be unavailable'), -('MenuAdvertise', 'Feature will be installed when required'), -('MenuAllCD', 'Entire feature will be installed to run from CD'), -('MenuAllLocal', 'Entire feature will be installed on local hard drive'), -('MenuAllNetwork', 'Entire feature will be installed to run from network'), -('MenuCD', 'Will be installed to run from CD'), -('MenuLocal', 'Will be installed on local hard drive'), -('MenuNetwork', 'Will be installed to run from network'), -('ScriptInProgress', 'Gathering required information...'), -('SelAbsentAbsent', 'This feature will remain uninstalled'), -('SelAbsentAdvertise', 'This feature will be set to be installed when required'), -('SelAbsentCD', 'This feature will be installed to run from CD'), -('SelAbsentLocal', 'This feature will be installed on the local hard drive'), -('SelAbsentNetwork', 'This feature will be installed to run from the network'), -('SelAdvertiseAbsent', 'This feature will become unavailable'), -('SelAdvertiseAdvertise', 'Will be installed when required'), -('SelAdvertiseCD', 'This feature will be available to run from CD'), -('SelAdvertiseLocal', 'This feature will be installed on your local hard drive'), -('SelAdvertiseNetwork', 'This feature will be available to run from the network'), -('SelCDAbsent', "This feature will be uninstalled completely, you won't be able to run it from CD"), -('SelCDAdvertise', 'This feature will change from run from CD state to set to be installed when required'), -('SelCDCD', 'This feature will remain to be run from CD'), -('SelCDLocal', 'This feature will change from run from CD state to be installed on the local hard drive'), -('SelChildCostNeg', 'This feature frees up [1] on your hard drive.'), -('SelChildCostPos', 'This feature requires [1] on your hard drive.'), -('SelCostPending', 'Compiling cost for this feature...'), -('SelLocalAbsent', 'This feature will be completely removed'), -('SelLocalAdvertise', 'This feature will be removed from your local hard drive, but will be set to be installed when required'), -('SelLocalCD', 'This feature will be removed from your local hard drive, but will be still available to run from CD'), -('SelLocalLocal', 'This feature will remain on you local hard drive'), -('SelLocalNetwork', 'This feature will be removed from your local hard drive, but will be still available to run from the network'), -('SelNetworkAbsent', "This feature will be uninstalled completely, you won't be able to run it from the network"), -('SelNetworkAdvertise', 'This feature will change from run from network state to set to be installed when required'), -('SelNetworkLocal', 'This feature will change from run from network state to be installed on the local hard drive'), -('SelNetworkNetwork', 'This feature will remain to be run from the network'), -('SelParentCostNegNeg', 'This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.'), -('SelParentCostNegPos', 'This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.'), -('SelParentCostPosNeg', 'This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.'), -('SelParentCostPosPos', 'This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.'), -('TimeRemaining', 'Time remaining: {[1] minutes }{[2] seconds}'), -('VolumeCostAvailable', 'Available'), -('VolumeCostDifference', 'Difference'), -('VolumeCostRequired', 'Required'), -('VolumeCostSize', 'Disk Size'), -('VolumeCostVolume', 'Volume'), -] - -tables=['ActionText', 'UIText'] diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 04eaea81..c48e5562 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -9,6 +9,7 @@ __all__ = [ 'Client', 'Listener', 'Pipe', 'wait' ] +import errno import io import os import sys @@ -18,7 +19,6 @@ import time import tempfile import itertools -import _multiprocessing from . import util @@ -27,6 +27,7 @@ from .context import reduction _ForkingPickler = reduction.ForkingPickler try: + import _multiprocessing import _winapi from _winapi import WAIT_OBJECT_0, WAIT_ABANDONED_0, WAIT_TIMEOUT, INFINITE except ImportError: @@ -271,12 +272,22 @@ if _winapi: with FILE_FLAG_OVERLAPPED. """ _got_empty_message = False + _send_ov = None def _close(self, _CloseHandle=_winapi.CloseHandle): + ov = self._send_ov + if ov is not None: + # Interrupt WaitForMultipleObjects() in _send_bytes() + ov.cancel() _CloseHandle(self._handle) def _send_bytes(self, buf): + if self._send_ov is not None: + # A connection should only be used by a single thread + raise ValueError("concurrent send_bytes() calls " + "are not supported") ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) + self._send_ov = ov try: if err == _winapi.ERROR_IO_PENDING: waitres = _winapi.WaitForMultipleObjects( @@ -286,7 +297,13 @@ if _winapi: ov.cancel() raise finally: + self._send_ov = None nwritten, err = ov.GetOverlappedResult(True) + if err == _winapi.ERROR_OPERATION_ABORTED: + # close() was called by another thread while + # WaitForMultipleObjects() was waiting for the overlapped + # operation. + raise OSError(errno.EPIPE, "handle is closed") assert err == 0 assert nwritten == len(buf) @@ -459,8 +476,9 @@ class Listener(object): ''' if self._listener is None: raise OSError('listener is closed') + c = self._listener.accept() - if self._authkey: + if self._authkey is not None: deliver_challenge(c, self._authkey) answer_challenge(c, self._authkey) return c @@ -938,7 +956,7 @@ def answer_challenge(connection, authkey: bytes): f'Protocol error, expected challenge: {message=}') message = message[len(_CHALLENGE):] if len(message) < _MD5ONLY_MESSAGE_LENGTH: - raise AuthenticationError('challenge too short: {len(message)} bytes') + raise AuthenticationError(f'challenge too short: {len(message)} bytes') digest = _create_response(authkey, message) connection.send_bytes(digest) response = connection.recv_bytes(256) # reject large message @@ -994,8 +1012,20 @@ if sys.platform == 'win32': # returning the first signalled might create starvation issues.) L = list(handles) ready = [] + # Windows limits WaitForMultipleObjects at 64 handles, and we use a + # few for synchronisation, so we switch to batched waits at 60. + if len(L) > 60: + try: + res = _winapi.BatchedWaitForMultipleObjects(L, False, timeout) + except TimeoutError: + return [] + ready.extend(L[i] for i in res) + if res: + L = [h for i, h in enumerate(L) if i > res[0] & i not in res] + timeout = 0 while L: - res = _winapi.WaitForMultipleObjects(L, False, timeout) + short_L = L[:60] if len(L) > 60 else L + res = _winapi.WaitForMultipleObjects(short_L, False, timeout) if res == WAIT_TIMEOUT: break elif WAIT_OBJECT_0 <= res < WAIT_OBJECT_0 + len(L): diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 4642707d..bff7fb91 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -1,3 +1,4 @@ +import atexit import errno import os import selectors @@ -167,6 +168,8 @@ class ForkServer(object): def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): '''Run forkserver.''' if preload: + if sys_path is not None: + sys.path[:] = sys_path if '__main__' in preload and main_path is not None: process.current_process()._inheriting = True try: @@ -271,6 +274,8 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): selector.close() unused_fds = [alive_r, child_w, sig_r, sig_w] unused_fds.extend(pid_to_fd.values()) + atexit._clear() + atexit.register(util._exit_function) code = _serve_one(child_r, fds, unused_fds, old_handlers) @@ -278,6 +283,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): sys.excepthook(*sys.exc_info()) sys.stderr.flush() finally: + atexit._run_exitfuncs() os._exit(code) else: # Send pid to client process diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index b6534939..ef791c27 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -90,7 +90,10 @@ def dispatch(c, id, methodname, args=(), kwds={}): kind, result = c.recv() if kind == '#RETURN': return result - raise convert_to_error(kind, result) + try: + raise convert_to_error(kind, result) + finally: + del result # break reference cycle def convert_to_error(kind, result): if kind == '#ERROR': @@ -153,7 +156,7 @@ class Server(object): Listener, Client = listener_client[serializer] # do authentication later - self.listener = Listener(address=address, backlog=16) + self.listener = Listener(address=address, backlog=128) self.address = self.listener.address self.id_to_obj = {'0': (None, ())} @@ -755,22 +758,29 @@ class BaseProxy(object): _address_to_local = {} _mutex = util.ForkAwareThreadLock() + # Each instance gets a `_serial` number. Unlike `id(...)`, this number + # is never reused. + _next_serial = 1 + def __init__(self, token, serializer, manager=None, authkey=None, exposed=None, incref=True, manager_owned=False): with BaseProxy._mutex: - tls_idset = BaseProxy._address_to_local.get(token.address, None) - if tls_idset is None: - tls_idset = util.ForkAwareLocal(), ProcessLocalSet() - BaseProxy._address_to_local[token.address] = tls_idset + tls_serials = BaseProxy._address_to_local.get(token.address, None) + if tls_serials is None: + tls_serials = util.ForkAwareLocal(), ProcessLocalSet() + BaseProxy._address_to_local[token.address] = tls_serials + + self._serial = BaseProxy._next_serial + BaseProxy._next_serial += 1 # self._tls is used to record the connection used by this # thread to communicate with the manager at token.address - self._tls = tls_idset[0] + self._tls = tls_serials[0] - # self._idset is used to record the identities of all shared - # objects for which the current process owns references and + # self._all_serials is a set used to record the identities of all + # shared objects for which the current process owns references and # which are in the manager at token.address - self._idset = tls_idset[1] + self._all_serials = tls_serials[1] self._token = token self._id = self._token.id @@ -833,7 +843,10 @@ class BaseProxy(object): conn = self._Client(token.address, authkey=self._authkey) dispatch(conn, None, 'decref', (token.id,)) return proxy - raise convert_to_error(kind, result) + try: + raise convert_to_error(kind, result) + finally: + del result # break reference cycle def _getvalue(self): ''' @@ -850,20 +863,20 @@ class BaseProxy(object): dispatch(conn, None, 'incref', (self._id,)) util.debug('INCREF %r', self._token.id) - self._idset.add(self._id) + self._all_serials.add(self._serial) state = self._manager and self._manager._state self._close = util.Finalize( self, BaseProxy._decref, - args=(self._token, self._authkey, state, - self._tls, self._idset, self._Client), + args=(self._token, self._serial, self._authkey, state, + self._tls, self._all_serials, self._Client), exitpriority=10 ) @staticmethod - def _decref(token, authkey, state, tls, idset, _Client): - idset.discard(token.id) + def _decref(token, serial, authkey, state, tls, idset, _Client): + idset.discard(serial) # check whether manager is still alive if state is None or state.value == State.STARTED: @@ -1159,15 +1172,19 @@ class ListProxy(BaseListProxy): self._callmethod('__imul__', (value,)) return self + __class_getitem__ = classmethod(types.GenericAlias) -DictProxy = MakeProxyType('DictProxy', ( + +_BaseDictProxy = MakeProxyType('DictProxy', ( '__contains__', '__delitem__', '__getitem__', '__iter__', '__len__', '__setitem__', 'clear', 'copy', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values' )) -DictProxy._method_to_typeid_ = { +_BaseDictProxy._method_to_typeid_ = { '__iter__': 'Iterator', } +class DictProxy(_BaseDictProxy): + __class_getitem__ = classmethod(types.GenericAlias) ArrayProxy = MakeProxyType('ArrayProxy', ( diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 4f5d88cb..f9798901 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -200,7 +200,7 @@ class Pool(object): self._initargs = initargs if processes is None: - processes = os.cpu_count() or 1 + processes = os.process_cpu_count() or 1 if processes < 1: raise ValueError("Number of processes must be at least 1") if maxtasksperchild is not None: diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py index 625981cf..a57ef6bd 100644 --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -1,3 +1,4 @@ +import atexit import os import signal @@ -66,10 +67,13 @@ class Popen(object): self.pid = os.fork() if self.pid == 0: try: + atexit._clear() + atexit.register(util._exit_function) os.close(parent_r) os.close(parent_w) code = process_obj._bootstrap(parent_sentinel=child_r) finally: + atexit._run_exitfuncs() os._exit(code) else: os.close(child_w) diff --git a/Lib/multiprocessing/popen_spawn_win32.py b/Lib/multiprocessing/popen_spawn_win32.py index 4d60ffc0..62fb0ddb 100644 --- a/Lib/multiprocessing/popen_spawn_win32.py +++ b/Lib/multiprocessing/popen_spawn_win32.py @@ -3,6 +3,7 @@ import msvcrt import signal import sys import _winapi +from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK from .context import reduction, get_spawning_popen, set_spawning_popen from . import spawn @@ -14,6 +15,7 @@ __all__ = ['Popen'] # # +# Exit code used by Popen.terminate() TERMINATE = 0x10000 WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") @@ -73,7 +75,8 @@ class Popen(object): try: hp, ht, pid, tid = _winapi.CreateProcess( python_exe, cmd, - None, None, False, 0, env, None, None) + None, None, False, 0, env, None, + STARTUPINFO(dwFlags=STARTF_FORCEOFFFEEDBACK)) _winapi.CloseHandle(ht) except: _winapi.CloseHandle(rhandle) @@ -100,18 +103,20 @@ class Popen(object): return reduction.duplicate(handle, self.sentinel) def wait(self, timeout=None): - if self.returncode is None: - if timeout is None: - msecs = _winapi.INFINITE - else: - msecs = max(0, int(timeout * 1000 + 0.5)) - - res = _winapi.WaitForSingleObject(int(self._handle), msecs) - if res == _winapi.WAIT_OBJECT_0: - code = _winapi.GetExitCodeProcess(self._handle) - if code == TERMINATE: - code = -signal.SIGTERM - self.returncode = code + if self.returncode is not None: + return self.returncode + + if timeout is None: + msecs = _winapi.INFINITE + else: + msecs = max(0, int(timeout * 1000 + 0.5)) + + res = _winapi.WaitForSingleObject(int(self._handle), msecs) + if res == _winapi.WAIT_OBJECT_0: + code = _winapi.GetExitCodeProcess(self._handle) + if code == TERMINATE: + code = -signal.SIGTERM + self.returncode = code return self.returncode @@ -119,12 +124,22 @@ class Popen(object): return self.wait(timeout=0) def terminate(self): - if self.returncode is None: - try: - _winapi.TerminateProcess(int(self._handle), TERMINATE) - except OSError: - if self.wait(timeout=1.0) is None: - raise + if self.returncode is not None: + return + + try: + _winapi.TerminateProcess(int(self._handle), TERMINATE) + except PermissionError: + # ERROR_ACCESS_DENIED (winerror 5) is received when the + # process already died. + code = _winapi.GetExitCodeProcess(int(self._handle)) + if code == _winapi.STILL_ACTIVE: + raise + + # gh-113009: Don't set self.returncode. Even if GetExitCodeProcess() + # returns an exit code different than STILL_ACTIVE, the process can + # still be running. Only set self.returncode once WaitForSingleObject() + # returns WAIT_OBJECT_0 in wait(). kill = terminate diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index 271ba3fd..b45f7df4 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -310,11 +310,8 @@ class BaseProcess(object): # _run_after_forkers() is executed del old_process util.info('child process calling self.run()') - try: - self.run() - exitcode = 0 - finally: - util._exit_function() + self.run() + exitcode = 0 except SystemExit as e: if e.code is None: exitcode = 0 diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index daf9ee94..925f0439 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -20,8 +20,6 @@ import errno from queue import Empty, Full -import _multiprocessing - from . import connection from . import context _ForkingPickler = context.reduction.ForkingPickler @@ -158,6 +156,20 @@ class Queue(object): except AttributeError: pass + def _terminate_broken(self): + # Close a Queue on error. + + # gh-94777: Prevent queue writing to a pipe which is no longer read. + self._reader.close() + + # gh-107219: Close the connection writer which can unblock + # Queue._feed() if it was stuck in send_bytes(). + if sys.platform == 'win32': + self._writer.close() + + self.close() + self.join_thread() + def _start_thread(self): debug('Queue._start_thread()') @@ -169,13 +181,19 @@ class Queue(object): self._wlock, self._reader.close, self._writer.close, self._ignore_epipe, self._on_queue_feeder_error, self._sem), - name='QueueFeederThread' + name='QueueFeederThread', + daemon=True, ) - self._thread.daemon = True - debug('doing self._thread.start()') - self._thread.start() - debug('... done self._thread.start()') + try: + debug('doing self._thread.start()') + self._thread.start() + debug('... done self._thread.start()') + except: + # gh-109047: During Python finalization, creating a thread + # can fail with RuntimeError. + self._thread = None + raise if not self._joincancelled: self._jointhread = Finalize( diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py index 66076509..b8afb0fb 100644 --- a/Lib/multiprocessing/resource_sharer.py +++ b/Lib/multiprocessing/resource_sharer.py @@ -123,7 +123,7 @@ class _ResourceSharer(object): from .connection import Listener assert self._listener is None, "Already have Listener" util.debug('starting listener and thread for sending handles') - self._listener = Listener(authkey=process.current_process().authkey) + self._listener = Listener(authkey=process.current_process().authkey, backlog=128) self._address = self._listener.address t = threading.Thread(target=self._serve) t.daemon = True diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py index ea369507..20ddd9c5 100644 --- a/Lib/multiprocessing/resource_tracker.py +++ b/Lib/multiprocessing/resource_tracker.py @@ -29,8 +29,12 @@ __all__ = ['ensure_running', 'register', 'unregister'] _HAVE_SIGMASK = hasattr(signal, 'pthread_sigmask') _IGNORED_SIGNALS = (signal.SIGINT, signal.SIGTERM) +def cleanup_noop(name): + raise RuntimeError('noop should never be registered or cleaned up') + _CLEANUP_FUNCS = { - 'noop': lambda: None, + 'noop': cleanup_noop, + 'dummy': lambda name: None, # Dummy resource used in tests } if os.name == 'posix': @@ -51,15 +55,32 @@ if os.name == 'posix': }) +class ReentrantCallError(RuntimeError): + pass + + class ResourceTracker(object): def __init__(self): - self._lock = threading.Lock() + self._lock = threading.RLock() self._fd = None self._pid = None + self._exitcode = None + + def _reentrant_call_error(self): + # gh-109629: this happens if an explicit call to the ResourceTracker + # gets interrupted by a garbage collection, invoking a finalizer (*) + # that itself calls back into ResourceTracker. + # (*) for example the SemLock finalizer + raise ReentrantCallError( + "Reentrant call into the multiprocessing resource tracker") def _stop(self): with self._lock: + # This should not happen (_stop() isn't called by a finalizer) + # but we check for it anyway. + if self._lock._recursion_count() > 1: + return self._reentrant_call_error() if self._fd is None: # not running return @@ -68,9 +89,16 @@ class ResourceTracker(object): os.close(self._fd) self._fd = None - os.waitpid(self._pid, 0) + _, status = os.waitpid(self._pid, 0) + self._pid = None + try: + self._exitcode = os.waitstatus_to_exitcode(status) + except ValueError: + # os.waitstatus_to_exitcode may raise an exception for invalid values + self._exitcode = None + def getfd(self): self.ensure_running() return self._fd @@ -81,6 +109,9 @@ class ResourceTracker(object): This can be run from any process. Usually a child process will use the resource created by its parent.''' with self._lock: + if self._lock._recursion_count() > 1: + # The code below is certainly not reentrant-safe, so bail out + return self._reentrant_call_error() if self._fd is not None: # resource tracker was launched before, is it still running? if self._check_alive(): @@ -100,6 +131,7 @@ class ResourceTracker(object): pass self._fd = None self._pid = None + self._exitcode = None warnings.warn('resource_tracker: process died unexpectedly, ' 'relaunching. Some resources might leak.') @@ -159,7 +191,17 @@ class ResourceTracker(object): self._send('UNREGISTER', name, rtype) def _send(self, cmd, name, rtype): - self.ensure_running() + try: + self.ensure_running() + except ReentrantCallError: + # The code below might or might not work, depending on whether + # the resource tracker was already running and still alive. + # Better warn the user. + # (XXX is warnings.warn itself reentrant-safe? :-) + warnings.warn( + f"ResourceTracker called reentrantly for resource cleanup, " + f"which is unsupported. " + f"The {rtype} object {name!r} might leak.") msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii') if len(msg) > 512: # posix guarantees that writes to a pipe of less than PIPE_BUF @@ -176,6 +218,7 @@ register = _resource_tracker.register unregister = _resource_tracker.unregister getfd = _resource_tracker.getfd + def main(fd): '''Run resource tracker.''' # protect the process from ^C and "killall python" etc @@ -191,6 +234,8 @@ def main(fd): pass cache = {rtype: set() for rtype in _CLEANUP_FUNCS.keys()} + exit_code = 0 + try: # keep track of registered/unregistered resources with open(fd, 'rb') as f: @@ -212,6 +257,7 @@ def main(fd): else: raise RuntimeError('unrecognized command %r' % cmd) except Exception: + exit_code = 3 try: sys.excepthook(*sys.exc_info()) except: @@ -221,9 +267,17 @@ def main(fd): for rtype, rtype_cache in cache.items(): if rtype_cache: try: - warnings.warn('resource_tracker: There appear to be %d ' - 'leaked %s objects to clean up at shutdown' % - (len(rtype_cache), rtype)) + exit_code = 1 + if rtype == 'dummy': + # The test 'dummy' resource is expected to leak. + # We skip the warning (and *only* the warning) for it. + pass + else: + warnings.warn( + f'resource_tracker: There appear to be ' + f'{len(rtype_cache)} leaked {rtype} objects to ' + f'clean up at shutdown: {rtype_cache}' + ) except Exception: pass for name in rtype_cache: @@ -234,6 +288,9 @@ def main(fd): try: _CLEANUP_FUNCS[rtype](name) except Exception as e: + exit_code = 2 warnings.warn('resource_tracker: %r: %s' % (name, e)) finally: pass + + sys.exit(exit_code) diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index 9a1e5aa1..67e70fdc 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -71,8 +71,9 @@ class SharedMemory: _flags = os.O_RDWR _mode = 0o600 _prepend_leading_slash = True if _USE_POSIX else False + _track = True - def __init__(self, name=None, create=False, size=0): + def __init__(self, name=None, create=False, size=0, *, track=True): if not size >= 0: raise ValueError("'size' must be a positive integer") if create: @@ -82,6 +83,7 @@ class SharedMemory: if name is None and not self._flags & os.O_EXCL: raise ValueError("'name' can only be None if create=True") + self._track = track if _USE_POSIX: # POSIX Shared Memory @@ -116,8 +118,8 @@ class SharedMemory: except OSError: self.unlink() raise - - resource_tracker.register(self._name, "shared_memory") + if self._track: + resource_tracker.register(self._name, "shared_memory") else: @@ -236,12 +238,20 @@ class SharedMemory: def unlink(self): """Requests that the underlying shared memory block be destroyed. - In order to ensure proper cleanup of resources, unlink should be - called once (and only once) across all processes which have access - to the shared memory block.""" + Unlink should be called once (and only once) across all handles + which have access to the shared memory block, even if these + handles belong to different processes. Closing and unlinking may + happen in any order, but trying to access data inside a shared + memory block after unlinking may result in memory errors, + depending on platform. + + This method has no effect on Windows, where the only way to + delete a shared memory block is to close all handles.""" + if _USE_POSIX and self._name: _posixshmem.shm_unlink(self._name) - resource_tracker.unregister(self._name, "shared_memory") + if self._track: + resource_tracker.unregister(self._name, "shared_memory") _encoding = "utf8" diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 3ccbfe31..0f682b9a 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -174,7 +174,7 @@ class Lock(SemLock): name = process.current_process().name if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name - elif self._semlock._get_value() == 1: + elif not self._semlock._is_zero(): name = 'None' elif self._semlock._count() > 0: name = 'SomeOtherThread' @@ -200,7 +200,7 @@ class RLock(SemLock): if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name count = self._semlock._count() - elif self._semlock._get_value() == 1: + elif not self._semlock._is_zero(): name, count = 'None', 0 elif self._semlock._count() > 0: name, count = 'SomeOtherThread', 'nonzero' diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 6ee0d33e..75dde02d 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -43,19 +43,19 @@ _log_to_stderr = False def sub_debug(msg, *args): if _logger: - _logger.log(SUBDEBUG, msg, *args) + _logger.log(SUBDEBUG, msg, *args, stacklevel=2) def debug(msg, *args): if _logger: - _logger.log(DEBUG, msg, *args) + _logger.log(DEBUG, msg, *args, stacklevel=2) def info(msg, *args): if _logger: - _logger.log(INFO, msg, *args) + _logger.log(INFO, msg, *args, stacklevel=2) def sub_warning(msg, *args): if _logger: - _logger.log(SUBWARNING, msg, *args) + _logger.log(SUBWARNING, msg, *args, stacklevel=2) def get_logger(): ''' @@ -64,8 +64,7 @@ def get_logger(): global _logger import logging - logging._acquireLock() - try: + with logging._lock: if not _logger: _logger = logging.getLogger(LOGGER_NAME) @@ -79,9 +78,6 @@ def get_logger(): atexit._exithandlers.remove((_exit_function, (), {})) atexit._exithandlers.append((_exit_function, (), {})) - finally: - logging._releaseLock() - return _logger def log_to_stderr(level=None): @@ -106,11 +102,7 @@ def log_to_stderr(level=None): # Abstract socket support def _platform_supports_abstract_sockets(): - if sys.platform == "linux": - return True - if hasattr(sys, 'getandroidapilevel'): - return True - return False + return sys.platform in ("linux", "android") def is_abstract_socket_namespace(address): diff --git a/Lib/nntplib.py b/Lib/nntplib.py deleted file mode 100644 index dddea059..00000000 --- a/Lib/nntplib.py +++ /dev/null @@ -1,1093 +0,0 @@ -"""An NNTP client class based on: -- RFC 977: Network News Transfer Protocol -- RFC 2980: Common NNTP Extensions -- RFC 3977: Network News Transfer Protocol (version 2) - -Example: - ->>> from nntplib import NNTP ->>> s = NNTP('news') ->>> resp, count, first, last, name = s.group('comp.lang.python') ->>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) -Group comp.lang.python has 51 articles, range 5770 to 5821 ->>> resp, subs = s.xhdr('subject', '{0}-{1}'.format(first, last)) ->>> resp = s.quit() ->>> - -Here 'resp' is the server response line. -Error responses are turned into exceptions. - -To post an article from a file: ->>> f = open(filename, 'rb') # file containing article, including header ->>> resp = s.post(f) ->>> - -For descriptions of all methods, read the comments in the code below. -Note that all arguments and return values representing article numbers -are strings, not numbers, since they are rarely used for calculations. -""" - -# RFC 977 by Brian Kantor and Phil Lapsley. -# xover, xgtitle, xpath, date methods by Kevan Heydon - -# Incompatible changes from the 2.x nntplib: -# - all commands are encoded as UTF-8 data (using the "surrogateescape" -# error handler), except for raw message data (POST, IHAVE) -# - all responses are decoded as UTF-8 data (using the "surrogateescape" -# error handler), except for raw message data (ARTICLE, HEAD, BODY) -# - the `file` argument to various methods is keyword-only -# -# - NNTP.date() returns a datetime object -# - NNTP.newgroups() and NNTP.newnews() take a datetime (or date) object, -# rather than a pair of (date, time) strings. -# - NNTP.newgroups() and NNTP.list() return a list of GroupInfo named tuples -# - NNTP.descriptions() returns a dict mapping group names to descriptions -# - NNTP.xover() returns a list of dicts mapping field names (header or metadata) -# to field values; each dict representing a message overview. -# - NNTP.article(), NNTP.head() and NNTP.body() return a (response, ArticleInfo) -# tuple. -# - the "internal" methods have been marked private (they now start with -# an underscore) - -# Other changes from the 2.x/3.1 nntplib: -# - automatic querying of capabilities at connect -# - New method NNTP.getcapabilities() -# - New method NNTP.over() -# - New helper function decode_header() -# - NNTP.post() and NNTP.ihave() accept file objects, bytes-like objects and -# arbitrary iterables yielding lines. -# - An extensive test suite :-) - -# TODO: -# - return structured data (GroupInfo etc.) everywhere -# - support HDR - -# Imports -import re -import socket -import collections -import datetime -import sys -import warnings - -try: - import ssl -except ImportError: - _have_ssl = False -else: - _have_ssl = True - -from email.header import decode_header as _email_decode_header -from socket import _GLOBAL_DEFAULT_TIMEOUT - -__all__ = ["NNTP", - "NNTPError", "NNTPReplyError", "NNTPTemporaryError", - "NNTPPermanentError", "NNTPProtocolError", "NNTPDataError", - "decode_header", - ] - -warnings._deprecated(__name__, remove=(3, 13)) - -# maximal line length when calling readline(). This is to prevent -# reading arbitrary length lines. RFC 3977 limits NNTP line length to -# 512 characters, including CRLF. We have selected 2048 just to be on -# the safe side. -_MAXLINE = 2048 - - -# Exceptions raised when an error or invalid response is received -class NNTPError(Exception): - """Base class for all nntplib exceptions""" - def __init__(self, *args): - Exception.__init__(self, *args) - try: - self.response = args[0] - except IndexError: - self.response = 'No response given' - -class NNTPReplyError(NNTPError): - """Unexpected [123]xx reply""" - pass - -class NNTPTemporaryError(NNTPError): - """4xx errors""" - pass - -class NNTPPermanentError(NNTPError): - """5xx errors""" - pass - -class NNTPProtocolError(NNTPError): - """Response does not begin with [1-5]""" - pass - -class NNTPDataError(NNTPError): - """Error in response data""" - pass - - -# Standard port used by NNTP servers -NNTP_PORT = 119 -NNTP_SSL_PORT = 563 - -# Response numbers that are followed by additional text (e.g. article) -_LONGRESP = { - '100', # HELP - '101', # CAPABILITIES - '211', # LISTGROUP (also not multi-line with GROUP) - '215', # LIST - '220', # ARTICLE - '221', # HEAD, XHDR - '222', # BODY - '224', # OVER, XOVER - '225', # HDR - '230', # NEWNEWS - '231', # NEWGROUPS - '282', # XGTITLE -} - -# Default decoded value for LIST OVERVIEW.FMT if not supported -_DEFAULT_OVERVIEW_FMT = [ - "subject", "from", "date", "message-id", "references", ":bytes", ":lines"] - -# Alternative names allowed in LIST OVERVIEW.FMT response -_OVERVIEW_FMT_ALTERNATIVES = { - 'bytes': ':bytes', - 'lines': ':lines', -} - -# Line terminators (we always output CRLF, but accept any of CRLF, CR, LF) -_CRLF = b'\r\n' - -GroupInfo = collections.namedtuple('GroupInfo', - ['group', 'last', 'first', 'flag']) - -ArticleInfo = collections.namedtuple('ArticleInfo', - ['number', 'message_id', 'lines']) - - -# Helper function(s) -def decode_header(header_str): - """Takes a unicode string representing a munged header value - and decodes it as a (possibly non-ASCII) readable value.""" - parts = [] - for v, enc in _email_decode_header(header_str): - if isinstance(v, bytes): - parts.append(v.decode(enc or 'ascii')) - else: - parts.append(v) - return ''.join(parts) - -def _parse_overview_fmt(lines): - """Parse a list of string representing the response to LIST OVERVIEW.FMT - and return a list of header/metadata names. - Raises NNTPDataError if the response is not compliant - (cf. RFC 3977, section 8.4).""" - fmt = [] - for line in lines: - if line[0] == ':': - # Metadata name (e.g. ":bytes") - name, _, suffix = line[1:].partition(':') - name = ':' + name - else: - # Header name (e.g. "Subject:" or "Xref:full") - name, _, suffix = line.partition(':') - name = name.lower() - name = _OVERVIEW_FMT_ALTERNATIVES.get(name, name) - # Should we do something with the suffix? - fmt.append(name) - defaults = _DEFAULT_OVERVIEW_FMT - if len(fmt) < len(defaults): - raise NNTPDataError("LIST OVERVIEW.FMT response too short") - if fmt[:len(defaults)] != defaults: - raise NNTPDataError("LIST OVERVIEW.FMT redefines default fields") - return fmt - -def _parse_overview(lines, fmt, data_process_func=None): - """Parse the response to an OVER or XOVER command according to the - overview format `fmt`.""" - n_defaults = len(_DEFAULT_OVERVIEW_FMT) - overview = [] - for line in lines: - fields = {} - article_number, *tokens = line.split('\t') - article_number = int(article_number) - for i, token in enumerate(tokens): - if i >= len(fmt): - # XXX should we raise an error? Some servers might not - # support LIST OVERVIEW.FMT and still return additional - # headers. - continue - field_name = fmt[i] - is_metadata = field_name.startswith(':') - if i >= n_defaults and not is_metadata: - # Non-default header names are included in full in the response - # (unless the field is totally empty) - h = field_name + ": " - if token and token[:len(h)].lower() != h: - raise NNTPDataError("OVER/XOVER response doesn't include " - "names of additional headers") - token = token[len(h):] if token else None - fields[fmt[i]] = token - overview.append((article_number, fields)) - return overview - -def _parse_datetime(date_str, time_str=None): - """Parse a pair of (date, time) strings, and return a datetime object. - If only the date is given, it is assumed to be date and time - concatenated together (e.g. response to the DATE command). - """ - if time_str is None: - time_str = date_str[-6:] - date_str = date_str[:-6] - hours = int(time_str[:2]) - minutes = int(time_str[2:4]) - seconds = int(time_str[4:]) - year = int(date_str[:-4]) - month = int(date_str[-4:-2]) - day = int(date_str[-2:]) - # RFC 3977 doesn't say how to interpret 2-char years. Assume that - # there are no dates before 1970 on Usenet. - if year < 70: - year += 2000 - elif year < 100: - year += 1900 - return datetime.datetime(year, month, day, hours, minutes, seconds) - -def _unparse_datetime(dt, legacy=False): - """Format a date or datetime object as a pair of (date, time) strings - in the format required by the NEWNEWS and NEWGROUPS commands. If a - date object is passed, the time is assumed to be midnight (00h00). - - The returned representation depends on the legacy flag: - * if legacy is False (the default): - date has the YYYYMMDD format and time the HHMMSS format - * if legacy is True: - date has the YYMMDD format and time the HHMMSS format. - RFC 3977 compliant servers should understand both formats; therefore, - legacy is only needed when talking to old servers. - """ - if not isinstance(dt, datetime.datetime): - time_str = "000000" - else: - time_str = "{0.hour:02d}{0.minute:02d}{0.second:02d}".format(dt) - y = dt.year - if legacy: - y = y % 100 - date_str = "{0:02d}{1.month:02d}{1.day:02d}".format(y, dt) - else: - date_str = "{0:04d}{1.month:02d}{1.day:02d}".format(y, dt) - return date_str, time_str - - -if _have_ssl: - - def _encrypt_on(sock, context, hostname): - """Wrap a socket in SSL/TLS. Arguments: - - sock: Socket to wrap - - context: SSL context to use for the encrypted connection - Returns: - - sock: New, encrypted socket. - """ - # Generate a default SSL context if none was passed. - if context is None: - context = ssl._create_stdlib_context() - return context.wrap_socket(sock, server_hostname=hostname) - - -# The classes themselves -class NNTP: - # UTF-8 is the character set for all NNTP commands and responses: they - # are automatically encoded (when sending) and decoded (and receiving) - # by this class. - # However, some multi-line data blocks can contain arbitrary bytes (for - # example, latin-1 or utf-16 data in the body of a message). Commands - # taking (POST, IHAVE) or returning (HEAD, BODY, ARTICLE) raw message - # data will therefore only accept and produce bytes objects. - # Furthermore, since there could be non-compliant servers out there, - # we use 'surrogateescape' as the error handler for fault tolerance - # and easy round-tripping. This could be useful for some applications - # (e.g. NNTP gateways). - - encoding = 'utf-8' - errors = 'surrogateescape' - - def __init__(self, host, port=NNTP_PORT, user=None, password=None, - readermode=None, usenetrc=False, - timeout=_GLOBAL_DEFAULT_TIMEOUT): - """Initialize an instance. Arguments: - - host: hostname to connect to - - port: port to connect to (default the standard NNTP port) - - user: username to authenticate with - - password: password to use with username - - readermode: if true, send 'mode reader' command after - connecting. - - usenetrc: allow loading username and password from ~/.netrc file - if not specified explicitly - - timeout: timeout (in seconds) used for socket connections - - readermode is sometimes necessary if you are connecting to an - NNTP server on the local machine and intend to call - reader-specific commands, such as `group'. If you get - unexpected NNTPPermanentErrors, you might need to set - readermode. - """ - self.host = host - self.port = port - self.sock = self._create_socket(timeout) - self.file = None - try: - self.file = self.sock.makefile("rwb") - self._base_init(readermode) - if user or usenetrc: - self.login(user, password, usenetrc) - except: - if self.file: - self.file.close() - self.sock.close() - raise - - def _base_init(self, readermode): - """Partial initialization for the NNTP protocol. - This instance method is extracted for supporting the test code. - """ - self.debugging = 0 - self.welcome = self._getresp() - - # Inquire about capabilities (RFC 3977). - self._caps = None - self.getcapabilities() - - # 'MODE READER' is sometimes necessary to enable 'reader' mode. - # However, the order in which 'MODE READER' and 'AUTHINFO' need to - # arrive differs between some NNTP servers. If _setreadermode() fails - # with an authorization failed error, it will set this to True; - # the login() routine will interpret that as a request to try again - # after performing its normal function. - # Enable only if we're not already in READER mode anyway. - self.readermode_afterauth = False - if readermode and 'READER' not in self._caps: - self._setreadermode() - if not self.readermode_afterauth: - # Capabilities might have changed after MODE READER - self._caps = None - self.getcapabilities() - - # RFC 4642 2.2.2: Both the client and the server MUST know if there is - # a TLS session active. A client MUST NOT attempt to start a TLS - # session if a TLS session is already active. - self.tls_on = False - - # Log in and encryption setup order is left to subclasses. - self.authenticated = False - - def __enter__(self): - return self - - def __exit__(self, *args): - is_connected = lambda: hasattr(self, "file") - if is_connected(): - try: - self.quit() - except (OSError, EOFError): - pass - finally: - if is_connected(): - self._close() - - def _create_socket(self, timeout): - if timeout is not None and not timeout: - raise ValueError('Non-blocking socket (timeout=0) is not supported') - sys.audit("nntplib.connect", self, self.host, self.port) - return socket.create_connection((self.host, self.port), timeout) - - def getwelcome(self): - """Get the welcome message from the server - (this is read and squirreled away by __init__()). - If the response code is 200, posting is allowed; - if it 201, posting is not allowed.""" - - if self.debugging: print('*welcome*', repr(self.welcome)) - return self.welcome - - def getcapabilities(self): - """Get the server capabilities, as read by __init__(). - If the CAPABILITIES command is not supported, an empty dict is - returned.""" - if self._caps is None: - self.nntp_version = 1 - self.nntp_implementation = None - try: - resp, caps = self.capabilities() - except (NNTPPermanentError, NNTPTemporaryError): - # Server doesn't support capabilities - self._caps = {} - else: - self._caps = caps - if 'VERSION' in caps: - # The server can advertise several supported versions, - # choose the highest. - self.nntp_version = max(map(int, caps['VERSION'])) - if 'IMPLEMENTATION' in caps: - self.nntp_implementation = ' '.join(caps['IMPLEMENTATION']) - return self._caps - - def set_debuglevel(self, level): - """Set the debugging level. Argument 'level' means: - 0: no debugging output (default) - 1: print commands and responses but not body text etc. - 2: also print raw lines read and sent before stripping CR/LF""" - - self.debugging = level - debug = set_debuglevel - - def _putline(self, line): - """Internal: send one line to the server, appending CRLF. - The `line` must be a bytes-like object.""" - sys.audit("nntplib.putline", self, line) - line = line + _CRLF - if self.debugging > 1: print('*put*', repr(line)) - self.file.write(line) - self.file.flush() - - def _putcmd(self, line): - """Internal: send one command to the server (through _putline()). - The `line` must be a unicode string.""" - if self.debugging: print('*cmd*', repr(line)) - line = line.encode(self.encoding, self.errors) - self._putline(line) - - def _getline(self, strip_crlf=True): - """Internal: return one line from the server, stripping _CRLF. - Raise EOFError if the connection is closed. - Returns a bytes object.""" - line = self.file.readline(_MAXLINE +1) - if len(line) > _MAXLINE: - raise NNTPDataError('line too long') - if self.debugging > 1: - print('*get*', repr(line)) - if not line: raise EOFError - if strip_crlf: - if line[-2:] == _CRLF: - line = line[:-2] - elif line[-1:] in _CRLF: - line = line[:-1] - return line - - def _getresp(self): - """Internal: get a response from the server. - Raise various errors if the response indicates an error. - Returns a unicode string.""" - resp = self._getline() - if self.debugging: print('*resp*', repr(resp)) - resp = resp.decode(self.encoding, self.errors) - c = resp[:1] - if c == '4': - raise NNTPTemporaryError(resp) - if c == '5': - raise NNTPPermanentError(resp) - if c not in '123': - raise NNTPProtocolError(resp) - return resp - - def _getlongresp(self, file=None): - """Internal: get a response plus following text from the server. - Raise various errors if the response indicates an error. - - Returns a (response, lines) tuple where `response` is a unicode - string and `lines` is a list of bytes objects. - If `file` is a file-like object, it must be open in binary mode. - """ - - openedFile = None - try: - # If a string was passed then open a file with that name - if isinstance(file, (str, bytes)): - openedFile = file = open(file, "wb") - - resp = self._getresp() - if resp[:3] not in _LONGRESP: - raise NNTPReplyError(resp) - - lines = [] - if file is not None: - # XXX lines = None instead? - terminators = (b'.' + _CRLF, b'.\n') - while 1: - line = self._getline(False) - if line in terminators: - break - if line.startswith(b'..'): - line = line[1:] - file.write(line) - else: - terminator = b'.' - while 1: - line = self._getline() - if line == terminator: - break - if line.startswith(b'..'): - line = line[1:] - lines.append(line) - finally: - # If this method created the file, then it must close it - if openedFile: - openedFile.close() - - return resp, lines - - def _shortcmd(self, line): - """Internal: send a command and get the response. - Same return value as _getresp().""" - self._putcmd(line) - return self._getresp() - - def _longcmd(self, line, file=None): - """Internal: send a command and get the response plus following text. - Same return value as _getlongresp().""" - self._putcmd(line) - return self._getlongresp(file) - - def _longcmdstring(self, line, file=None): - """Internal: send a command and get the response plus following text. - Same as _longcmd() and _getlongresp(), except that the returned `lines` - are unicode strings rather than bytes objects. - """ - self._putcmd(line) - resp, list = self._getlongresp(file) - return resp, [line.decode(self.encoding, self.errors) - for line in list] - - def _getoverviewfmt(self): - """Internal: get the overview format. Queries the server if not - already done, else returns the cached value.""" - try: - return self._cachedoverviewfmt - except AttributeError: - pass - try: - resp, lines = self._longcmdstring("LIST OVERVIEW.FMT") - except NNTPPermanentError: - # Not supported by server? - fmt = _DEFAULT_OVERVIEW_FMT[:] - else: - fmt = _parse_overview_fmt(lines) - self._cachedoverviewfmt = fmt - return fmt - - def _grouplist(self, lines): - # Parse lines into "group last first flag" - return [GroupInfo(*line.split()) for line in lines] - - def capabilities(self): - """Process a CAPABILITIES command. Not supported by all servers. - Return: - - resp: server response if successful - - caps: a dictionary mapping capability names to lists of tokens - (for example {'VERSION': ['2'], 'OVER': [], LIST: ['ACTIVE', 'HEADERS'] }) - """ - caps = {} - resp, lines = self._longcmdstring("CAPABILITIES") - for line in lines: - name, *tokens = line.split() - caps[name] = tokens - return resp, caps - - def newgroups(self, date, *, file=None): - """Process a NEWGROUPS command. Arguments: - - date: a date or datetime object - Return: - - resp: server response if successful - - list: list of newsgroup names - """ - if not isinstance(date, (datetime.date, datetime.date)): - raise TypeError( - "the date parameter must be a date or datetime object, " - "not '{:40}'".format(date.__class__.__name__)) - date_str, time_str = _unparse_datetime(date, self.nntp_version < 2) - cmd = 'NEWGROUPS {0} {1}'.format(date_str, time_str) - resp, lines = self._longcmdstring(cmd, file) - return resp, self._grouplist(lines) - - def newnews(self, group, date, *, file=None): - """Process a NEWNEWS command. Arguments: - - group: group name or '*' - - date: a date or datetime object - Return: - - resp: server response if successful - - list: list of message ids - """ - if not isinstance(date, (datetime.date, datetime.date)): - raise TypeError( - "the date parameter must be a date or datetime object, " - "not '{:40}'".format(date.__class__.__name__)) - date_str, time_str = _unparse_datetime(date, self.nntp_version < 2) - cmd = 'NEWNEWS {0} {1} {2}'.format(group, date_str, time_str) - return self._longcmdstring(cmd, file) - - def list(self, group_pattern=None, *, file=None): - """Process a LIST or LIST ACTIVE command. Arguments: - - group_pattern: a pattern indicating which groups to query - - file: Filename string or file object to store the result in - Returns: - - resp: server response if successful - - list: list of (group, last, first, flag) (strings) - """ - if group_pattern is not None: - command = 'LIST ACTIVE ' + group_pattern - else: - command = 'LIST' - resp, lines = self._longcmdstring(command, file) - return resp, self._grouplist(lines) - - def _getdescriptions(self, group_pattern, return_all): - line_pat = re.compile('^(?P[^ \t]+)[ \t]+(.*)$') - # Try the more std (acc. to RFC2980) LIST NEWSGROUPS first - resp, lines = self._longcmdstring('LIST NEWSGROUPS ' + group_pattern) - if not resp.startswith('215'): - # Now the deprecated XGTITLE. This either raises an error - # or succeeds with the same output structure as LIST - # NEWSGROUPS. - resp, lines = self._longcmdstring('XGTITLE ' + group_pattern) - groups = {} - for raw_line in lines: - match = line_pat.search(raw_line.strip()) - if match: - name, desc = match.group(1, 2) - if not return_all: - return desc - groups[name] = desc - if return_all: - return resp, groups - else: - # Nothing found - return '' - - def description(self, group): - """Get a description for a single group. If more than one - group matches ('group' is a pattern), return the first. If no - group matches, return an empty string. - - This elides the response code from the server, since it can - only be '215' or '285' (for xgtitle) anyway. If the response - code is needed, use the 'descriptions' method. - - NOTE: This neither checks for a wildcard in 'group' nor does - it check whether the group actually exists.""" - return self._getdescriptions(group, False) - - def descriptions(self, group_pattern): - """Get descriptions for a range of groups.""" - return self._getdescriptions(group_pattern, True) - - def group(self, name): - """Process a GROUP command. Argument: - - group: the group name - Returns: - - resp: server response if successful - - count: number of articles - - first: first article number - - last: last article number - - name: the group name - """ - resp = self._shortcmd('GROUP ' + name) - if not resp.startswith('211'): - raise NNTPReplyError(resp) - words = resp.split() - count = first = last = 0 - n = len(words) - if n > 1: - count = words[1] - if n > 2: - first = words[2] - if n > 3: - last = words[3] - if n > 4: - name = words[4].lower() - return resp, int(count), int(first), int(last), name - - def help(self, *, file=None): - """Process a HELP command. Argument: - - file: Filename string or file object to store the result in - Returns: - - resp: server response if successful - - list: list of strings returned by the server in response to the - HELP command - """ - return self._longcmdstring('HELP', file) - - def _statparse(self, resp): - """Internal: parse the response line of a STAT, NEXT, LAST, - ARTICLE, HEAD or BODY command.""" - if not resp.startswith('22'): - raise NNTPReplyError(resp) - words = resp.split() - art_num = int(words[1]) - message_id = words[2] - return resp, art_num, message_id - - def _statcmd(self, line): - """Internal: process a STAT, NEXT or LAST command.""" - resp = self._shortcmd(line) - return self._statparse(resp) - - def stat(self, message_spec=None): - """Process a STAT command. Argument: - - message_spec: article number or message id (if not specified, - the current article is selected) - Returns: - - resp: server response if successful - - art_num: the article number - - message_id: the message id - """ - if message_spec: - return self._statcmd('STAT {0}'.format(message_spec)) - else: - return self._statcmd('STAT') - - def next(self): - """Process a NEXT command. No arguments. Return as for STAT.""" - return self._statcmd('NEXT') - - def last(self): - """Process a LAST command. No arguments. Return as for STAT.""" - return self._statcmd('LAST') - - def _artcmd(self, line, file=None): - """Internal: process a HEAD, BODY or ARTICLE command.""" - resp, lines = self._longcmd(line, file) - resp, art_num, message_id = self._statparse(resp) - return resp, ArticleInfo(art_num, message_id, lines) - - def head(self, message_spec=None, *, file=None): - """Process a HEAD command. Argument: - - message_spec: article number or message id - - file: filename string or file object to store the headers in - Returns: - - resp: server response if successful - - ArticleInfo: (article number, message id, list of header lines) - """ - if message_spec is not None: - cmd = 'HEAD {0}'.format(message_spec) - else: - cmd = 'HEAD' - return self._artcmd(cmd, file) - - def body(self, message_spec=None, *, file=None): - """Process a BODY command. Argument: - - message_spec: article number or message id - - file: filename string or file object to store the body in - Returns: - - resp: server response if successful - - ArticleInfo: (article number, message id, list of body lines) - """ - if message_spec is not None: - cmd = 'BODY {0}'.format(message_spec) - else: - cmd = 'BODY' - return self._artcmd(cmd, file) - - def article(self, message_spec=None, *, file=None): - """Process an ARTICLE command. Argument: - - message_spec: article number or message id - - file: filename string or file object to store the article in - Returns: - - resp: server response if successful - - ArticleInfo: (article number, message id, list of article lines) - """ - if message_spec is not None: - cmd = 'ARTICLE {0}'.format(message_spec) - else: - cmd = 'ARTICLE' - return self._artcmd(cmd, file) - - def slave(self): - """Process a SLAVE command. Returns: - - resp: server response if successful - """ - return self._shortcmd('SLAVE') - - def xhdr(self, hdr, str, *, file=None): - """Process an XHDR command (optional server extension). Arguments: - - hdr: the header type (e.g. 'subject') - - str: an article nr, a message id, or a range nr1-nr2 - - file: Filename string or file object to store the result in - Returns: - - resp: server response if successful - - list: list of (nr, value) strings - """ - pat = re.compile('^([0-9]+) ?(.*)\n?') - resp, lines = self._longcmdstring('XHDR {0} {1}'.format(hdr, str), file) - def remove_number(line): - m = pat.match(line) - return m.group(1, 2) if m else line - return resp, [remove_number(line) for line in lines] - - def xover(self, start, end, *, file=None): - """Process an XOVER command (optional server extension) Arguments: - - start: start of range - - end: end of range - - file: Filename string or file object to store the result in - Returns: - - resp: server response if successful - - list: list of dicts containing the response fields - """ - resp, lines = self._longcmdstring('XOVER {0}-{1}'.format(start, end), - file) - fmt = self._getoverviewfmt() - return resp, _parse_overview(lines, fmt) - - def over(self, message_spec, *, file=None): - """Process an OVER command. If the command isn't supported, fall - back to XOVER. Arguments: - - message_spec: - - either a message id, indicating the article to fetch - information about - - or a (start, end) tuple, indicating a range of article numbers; - if end is None, information up to the newest message will be - retrieved - - or None, indicating the current article number must be used - - file: Filename string or file object to store the result in - Returns: - - resp: server response if successful - - list: list of dicts containing the response fields - - NOTE: the "message id" form isn't supported by XOVER - """ - cmd = 'OVER' if 'OVER' in self._caps else 'XOVER' - if isinstance(message_spec, (tuple, list)): - start, end = message_spec - cmd += ' {0}-{1}'.format(start, end or '') - elif message_spec is not None: - cmd = cmd + ' ' + message_spec - resp, lines = self._longcmdstring(cmd, file) - fmt = self._getoverviewfmt() - return resp, _parse_overview(lines, fmt) - - def date(self): - """Process the DATE command. - Returns: - - resp: server response if successful - - date: datetime object - """ - resp = self._shortcmd("DATE") - if not resp.startswith('111'): - raise NNTPReplyError(resp) - elem = resp.split() - if len(elem) != 2: - raise NNTPDataError(resp) - date = elem[1] - if len(date) != 14: - raise NNTPDataError(resp) - return resp, _parse_datetime(date, None) - - def _post(self, command, f): - resp = self._shortcmd(command) - # Raises a specific exception if posting is not allowed - if not resp.startswith('3'): - raise NNTPReplyError(resp) - if isinstance(f, (bytes, bytearray)): - f = f.splitlines() - # We don't use _putline() because: - # - we don't want additional CRLF if the file or iterable is already - # in the right format - # - we don't want a spurious flush() after each line is written - for line in f: - if not line.endswith(_CRLF): - line = line.rstrip(b"\r\n") + _CRLF - if line.startswith(b'.'): - line = b'.' + line - self.file.write(line) - self.file.write(b".\r\n") - self.file.flush() - return self._getresp() - - def post(self, data): - """Process a POST command. Arguments: - - data: bytes object, iterable or file containing the article - Returns: - - resp: server response if successful""" - return self._post('POST', data) - - def ihave(self, message_id, data): - """Process an IHAVE command. Arguments: - - message_id: message-id of the article - - data: file containing the article - Returns: - - resp: server response if successful - Note that if the server refuses the article an exception is raised.""" - return self._post('IHAVE {0}'.format(message_id), data) - - def _close(self): - try: - if self.file: - self.file.close() - del self.file - finally: - self.sock.close() - - def quit(self): - """Process a QUIT command and close the socket. Returns: - - resp: server response if successful""" - try: - resp = self._shortcmd('QUIT') - finally: - self._close() - return resp - - def login(self, user=None, password=None, usenetrc=True): - if self.authenticated: - raise ValueError("Already logged in.") - if not user and not usenetrc: - raise ValueError( - "At least one of `user` and `usenetrc` must be specified") - # If no login/password was specified but netrc was requested, - # try to get them from ~/.netrc - # Presume that if .netrc has an entry, NNRP authentication is required. - try: - if usenetrc and not user: - import netrc - credentials = netrc.netrc() - auth = credentials.authenticators(self.host) - if auth: - user = auth[0] - password = auth[2] - except OSError: - pass - # Perform NNTP authentication if needed. - if not user: - return - resp = self._shortcmd('authinfo user ' + user) - if resp.startswith('381'): - if not password: - raise NNTPReplyError(resp) - else: - resp = self._shortcmd('authinfo pass ' + password) - if not resp.startswith('281'): - raise NNTPPermanentError(resp) - # Capabilities might have changed after login - self._caps = None - self.getcapabilities() - # Attempt to send mode reader if it was requested after login. - # Only do so if we're not in reader mode already. - if self.readermode_afterauth and 'READER' not in self._caps: - self._setreadermode() - # Capabilities might have changed after MODE READER - self._caps = None - self.getcapabilities() - - def _setreadermode(self): - try: - self.welcome = self._shortcmd('mode reader') - except NNTPPermanentError: - # Error 5xx, probably 'not implemented' - pass - except NNTPTemporaryError as e: - if e.response.startswith('480'): - # Need authorization before 'mode reader' - self.readermode_afterauth = True - else: - raise - - if _have_ssl: - def starttls(self, context=None): - """Process a STARTTLS command. Arguments: - - context: SSL context to use for the encrypted connection - """ - # Per RFC 4642, STARTTLS MUST NOT be sent after authentication or if - # a TLS session already exists. - if self.tls_on: - raise ValueError("TLS is already enabled.") - if self.authenticated: - raise ValueError("TLS cannot be started after authentication.") - resp = self._shortcmd('STARTTLS') - if resp.startswith('382'): - self.file.close() - self.sock = _encrypt_on(self.sock, context, self.host) - self.file = self.sock.makefile("rwb") - self.tls_on = True - # Capabilities may change after TLS starts up, so ask for them - # again. - self._caps = None - self.getcapabilities() - else: - raise NNTPError("TLS failed to start.") - - -if _have_ssl: - class NNTP_SSL(NNTP): - - def __init__(self, host, port=NNTP_SSL_PORT, - user=None, password=None, ssl_context=None, - readermode=None, usenetrc=False, - timeout=_GLOBAL_DEFAULT_TIMEOUT): - """This works identically to NNTP.__init__, except for the change - in default port and the `ssl_context` argument for SSL connections. - """ - self.ssl_context = ssl_context - super().__init__(host, port, user, password, readermode, - usenetrc, timeout) - - def _create_socket(self, timeout): - sock = super()._create_socket(timeout) - try: - sock = _encrypt_on(sock, self.ssl_context, self.host) - except: - sock.close() - raise - else: - return sock - - __all__.append("NNTP_SSL") - - -# Test retrieval when run as a script. -if __name__ == '__main__': - import argparse - - parser = argparse.ArgumentParser(description="""\ - nntplib built-in demo - display the latest articles in a newsgroup""") - parser.add_argument('-g', '--group', default='gmane.comp.python.general', - help='group to fetch messages from (default: %(default)s)') - parser.add_argument('-s', '--server', default='news.gmane.io', - help='NNTP server hostname (default: %(default)s)') - parser.add_argument('-p', '--port', default=-1, type=int, - help='NNTP port number (default: %s / %s)' % (NNTP_PORT, NNTP_SSL_PORT)) - parser.add_argument('-n', '--nb-articles', default=10, type=int, - help='number of articles to fetch (default: %(default)s)') - parser.add_argument('-S', '--ssl', action='store_true', default=False, - help='use NNTP over SSL') - args = parser.parse_args() - - port = args.port - if not args.ssl: - if port == -1: - port = NNTP_PORT - s = NNTP(host=args.server, port=port) - else: - if port == -1: - port = NNTP_SSL_PORT - s = NNTP_SSL(host=args.server, port=port) - - caps = s.getcapabilities() - if 'STARTTLS' in caps: - s.starttls() - resp, count, first, last, name = s.group(args.group) - print('Group', name, 'has', count, 'articles, range', first, 'to', last) - - def cut(s, lim): - if len(s) > lim: - s = s[:lim - 4] + "..." - return s - - first = str(int(last) - args.nb_articles + 1) - resp, overviews = s.xover(first, last) - for artnum, over in overviews: - author = decode_header(over['from']).split('<', 1)[0] - subject = decode_header(over['subject']) - lines = int(over[':lines']) - print("{:7} {:20} {:42} ({})".format( - artnum, cut(author, 20), cut(subject, 42), lines) - ) - - s.quit() diff --git a/Lib/ntpath.py b/Lib/ntpath.py index df3402d4..5481bb88 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -19,18 +19,17 @@ devnull = 'nul' import os import sys -import stat import genericpath from genericpath import * - __all__ = ["normcase","isabs","join","splitdrive","splitroot","split","splitext", "basename","dirname","commonprefix","getsize","getmtime", "getatime","getctime", "islink","exists","lexists","isdir","isfile", - "ismount", "expanduser","expandvars","normpath","abspath", - "curdir","pardir","sep","pathsep","defpath","altsep", + "ismount","isreserved","expanduser","expandvars","normpath", + "abspath","curdir","pardir","sep","pathsep","defpath","altsep", "extsep","devnull","realpath","supports_unicode_filenames","relpath", - "samefile", "sameopenfile", "samestat", "commonpath", "isjunction"] + "samefile", "sameopenfile", "samestat", "commonpath", "isjunction", + "isdevdrive"] def _get_bothseps(path): if isinstance(path, bytes): @@ -78,12 +77,6 @@ except ImportError: return s.replace('/', '\\').lower() -# Return whether a path is absolute. -# Trivial in Posix, harder on Windows. -# For Windows it is absolute if it starts with a slash or backslash (current -# volume), or if a pathname after the volume-letter-and-colon or UNC-resource -# starts with a slash or backslash. - def isabs(s): """Test whether a path is absolute""" s = os.fspath(s) @@ -91,16 +84,15 @@ def isabs(s): sep = b'\\' altsep = b'/' colon_sep = b':\\' + double_sep = b'\\\\' else: sep = '\\' altsep = '/' colon_sep = ':\\' + double_sep = '\\\\' s = s[:3].replace(altsep, sep) # Absolute: UNC, device, and paths with a drive and root. - # LEGACY BUG: isabs("/x") should be false since the path has no drive. - if s.startswith(sep) or s.startswith(colon_sep, 1): - return True - return False + return s.startswith(colon_sep, 1) or s.startswith(double_sep) # Join two (or more) paths. @@ -109,16 +101,14 @@ def join(path, *paths): if isinstance(path, bytes): sep = b'\\' seps = b'\\/' - colon = b':' + colon_seps = b':\\/' else: sep = '\\' seps = '\\/' - colon = ':' + colon_seps = ':\\/' try: - if not paths: - path[:0] + sep #23780: Ensure compatible data type even if p is null. result_drive, result_root, result_path = splitroot(path) - for p in map(os.fspath, paths): + for p in paths: p_drive, p_root, p_path = splitroot(p) if p_root: # Second path is absolute @@ -142,7 +132,7 @@ def join(path, *paths): result_path = result_path + p_path ## add separator between UNC and non-absolute path if (result_path and not result_root and - result_drive and result_drive[-1:] not in colon + seps): + result_drive and result_drive[-1] not in colon_seps): return result_drive + sep + result_path return result_drive + result_root + result_path except (TypeError, AttributeError, BytesWarning): @@ -176,56 +166,52 @@ def splitdrive(p): return drive, root + tail -def splitroot(p): - """Split a pathname into drive, root and tail. The drive is defined - exactly as in splitdrive(). On Windows, the root may be a single path - separator or an empty string. The tail contains anything after the root. - For example: +try: + from nt import _path_splitroot_ex as splitroot +except ImportError: + def splitroot(p): + """Split a pathname into drive, root and tail. - splitroot('//server/share/') == ('//server/share', '/', '') - splitroot('C:/Users/Barney') == ('C:', '/', 'Users/Barney') - splitroot('C:///spam///ham') == ('C:', '/', '//spam///ham') - splitroot('Windows/notepad') == ('', '', 'Windows/notepad') - """ - p = os.fspath(p) - if isinstance(p, bytes): - sep = b'\\' - altsep = b'/' - colon = b':' - unc_prefix = b'\\\\?\\UNC\\' - empty = b'' - else: - sep = '\\' - altsep = '/' - colon = ':' - unc_prefix = '\\\\?\\UNC\\' - empty = '' - normp = p.replace(altsep, sep) - if normp[:1] == sep: - if normp[1:2] == sep: - # UNC drives, e.g. \\server\share or \\?\UNC\server\share - # Device drives, e.g. \\.\device or \\?\device - start = 8 if normp[:8].upper() == unc_prefix else 2 - index = normp.find(sep, start) - if index == -1: - return p, empty, empty - index2 = normp.find(sep, index + 1) - if index2 == -1: - return p, empty, empty - return p[:index2], p[index2:index2 + 1], p[index2 + 1:] + The tail contains anything after the root.""" + p = os.fspath(p) + if isinstance(p, bytes): + sep = b'\\' + altsep = b'/' + colon = b':' + unc_prefix = b'\\\\?\\UNC\\' + empty = b'' else: - # Relative path with root, e.g. \Windows - return empty, p[:1], p[1:] - elif normp[1:2] == colon: - if normp[2:3] == sep: - # Absolute drive-letter path, e.g. X:\Windows - return p[:2], p[2:3], p[3:] + sep = '\\' + altsep = '/' + colon = ':' + unc_prefix = '\\\\?\\UNC\\' + empty = '' + normp = p.replace(altsep, sep) + if normp[:1] == sep: + if normp[1:2] == sep: + # UNC drives, e.g. \\server\share or \\?\UNC\server\share + # Device drives, e.g. \\.\device or \\?\device + start = 8 if normp[:8].upper() == unc_prefix else 2 + index = normp.find(sep, start) + if index == -1: + return p, empty, empty + index2 = normp.find(sep, index + 1) + if index2 == -1: + return p, empty, empty + return p[:index2], p[index2:index2 + 1], p[index2 + 1:] + else: + # Relative path with root, e.g. \Windows + return empty, p[:1], p[1:] + elif normp[1:2] == colon: + if normp[2:3] == sep: + # Absolute drive-letter path, e.g. X:\Windows + return p[:2], p[2:3], p[3:] + else: + # Relative path with drive, e.g. X:Windows + return p[:2], empty, p[2:] else: - # Relative path with drive, e.g. X:Windows - return p[:2], empty, p[2:] - else: - # Relative path, e.g. Windows - return empty, empty, p + # Relative path, e.g. Windows + return empty, empty, p # Split a path in head (everything up to the last '/') and tail (the @@ -277,33 +263,6 @@ def dirname(p): return split(p)[0] -# Is a path a junction? - -if hasattr(os.stat_result, 'st_reparse_tag'): - def isjunction(path): - """Test whether a path is a junction""" - try: - st = os.lstat(path) - except (OSError, ValueError, AttributeError): - return False - return bool(st.st_reparse_tag == stat.IO_REPARSE_TAG_MOUNT_POINT) -else: - def isjunction(path): - """Test whether a path is a junction""" - os.fspath(path) - return False - - -# Being true for dangling symbolic links is also useful. - -def lexists(path): - """Test whether a path exists. Returns True for broken symbolic links""" - try: - st = os.lstat(path) - except (OSError, ValueError): - return False - return True - # Is a path a mount point? # Any drive letter root (eg c:\) # Any share UNC (eg \\server\share) @@ -338,6 +297,40 @@ def ismount(path): return False +_reserved_chars = frozenset( + {chr(i) for i in range(32)} | + {'"', '*', ':', '<', '>', '?', '|', '/', '\\'} +) + +_reserved_names = frozenset( + {'CON', 'PRN', 'AUX', 'NUL', 'CONIN$', 'CONOUT$'} | + {f'COM{c}' for c in '123456789\xb9\xb2\xb3'} | + {f'LPT{c}' for c in '123456789\xb9\xb2\xb3'} +) + +def isreserved(path): + """Return true if the pathname is reserved by the system.""" + # Refer to "Naming Files, Paths, and Namespaces": + # https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file + path = os.fsdecode(splitroot(path)[2]).replace(altsep, sep) + return any(_isreservedname(name) for name in reversed(path.split(sep))) + +def _isreservedname(name): + """Return true if the filename is reserved by the system.""" + # Trailing dots and spaces are reserved. + if name[-1:] in ('.', ' '): + return name not in ('.', '..') + # Wildcards, separators, colon, and pipe (*?"<>/\:|) are reserved. + # ASCII control characters (0-31) are reserved. + # Colon is reserved for file streams (e.g. "name:stream[:type]"). + if _reserved_chars.intersection(name): + return True + # DOS device names are reserved (e.g. "nul" or "nul .txt"). The rules + # are complex and vary across Windows versions. On the side of + # caution, return True for names that may not be reserved. + return name.partition('.')[0].rstrip(' ').upper() in _reserved_names + + # Expand paths beginning with '~' or '~user'. # '~' means $HOME; '~user' means that user's home directory. # If the path doesn't begin with '~', or if the user or $HOME is unknown, @@ -353,24 +346,23 @@ def expanduser(path): If user or $HOME is unknown, do nothing.""" path = os.fspath(path) if isinstance(path, bytes): + seps = b'\\/' tilde = b'~' else: + seps = '\\/' tilde = '~' if not path.startswith(tilde): return path i, n = 1, len(path) - while i < n and path[i] not in _get_bothseps(path): + while i < n and path[i] not in seps: i += 1 if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] - elif not 'HOMEPATH' in os.environ: + elif 'HOMEPATH' not in os.environ: return path else: - try: - drive = os.environ['HOMEDRIVE'] - except KeyError: - drive = '' + drive = os.environ.get('HOMEDRIVE', '') userhome = join(drive, os.environ['HOMEPATH']) if i != 1: #~user @@ -521,7 +513,7 @@ def expandvars(path): # Previously, this function also truncated pathnames to 8+3 format, # but as this module is called "ntpath", that's obviously wrong! try: - from nt import _path_normpath + from nt import _path_normpath as normpath except ImportError: def normpath(path): @@ -560,37 +552,22 @@ except ImportError: comps.append(curdir) return prefix + sep.join(comps) -else: - def normpath(path): - """Normalize path, eliminating double slashes, etc.""" - path = os.fspath(path) - if isinstance(path, bytes): - return os.fsencode(_path_normpath(os.fsdecode(path))) or b"." - return _path_normpath(path) or "." - - -def _abspath_fallback(path): - """Return the absolute version of a path as a fallback function in case - `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for - more. - - """ - - path = os.fspath(path) - if not isabs(path): - if isinstance(path, bytes): - cwd = os.getcwdb() - else: - cwd = os.getcwd() - path = join(cwd, path) - return normpath(path) # Return an absolute path. try: from nt import _getfullpathname except ImportError: # not running on Windows - mock up something sensible - abspath = _abspath_fallback + def abspath(path): + """Return the absolute version of a path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) else: # use native Windows method on Windows def abspath(path): @@ -598,10 +575,30 @@ else: # use native Windows method on Windows try: return _getfullpathname(normpath(path)) except (OSError, ValueError): - return _abspath_fallback(path) + # See gh-75230, handle outside for cleaner traceback + pass + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + sep = b'\\' + getcwd = os.getcwdb + else: + sep = '\\' + getcwd = os.getcwd + drive, root, path = splitroot(path) + # Either drive or root can be nonempty, but not both. + if drive or root: + try: + path = join(_getfullpathname(drive + root), path) + except (OSError, ValueError): + # Drive "\0:" cannot exist; use the root directory. + path = drive + sep + path + else: + path = join(getcwd(), path) + return normpath(path) try: - from nt import _getfinalpathname, readlink as _nt_readlink + from nt import _findfirstfile, _getfinalpathname, readlink as _nt_readlink except ImportError: # realpath is a no-op on systems without _getfinalpathname support. realpath = abspath @@ -688,10 +685,15 @@ else: except OSError: # If we fail to readlink(), let's keep traversing pass - path, name = split(path) - # TODO (bpo-38186): Request the real file name from the directory - # entry using FindFirstFileW. For now, we will return the path - # as best we have it + # If we get these errors, try to get the real name of the file without accessing it. + if ex.winerror in (1, 5, 32, 50, 87, 1920, 1921): + try: + name = _findfirstfile(path) + path, _ = split(path) + except OSError: + path, name = split(path) + else: + path, name = split(path) if path and not name: return path + tail tail = join(name, tail) if tail else name @@ -705,7 +707,8 @@ else: new_unc_prefix = b'\\\\' cwd = os.getcwdb() # bpo-38081: Special case for realpath(b'nul') - if normcase(path) == normcase(os.fsencode(devnull)): + devnull = b'nul' + if normcase(path) == devnull: return b'\\\\.\\NUL' else: prefix = '\\\\?\\' @@ -713,7 +716,8 @@ else: new_unc_prefix = '\\\\' cwd = os.getcwd() # bpo-38081: Special case for realpath('nul') - if normcase(path) == normcase(devnull): + devnull = 'nul' + if normcase(path) == devnull: return '\\\\.\\NUL' had_prefix = path.startswith(prefix) if not had_prefix and not isabs(path): @@ -766,6 +770,9 @@ supports_unicode_filenames = True def relpath(path, start=None): """Return a relative version of a path""" path = os.fspath(path) + if not path: + raise ValueError("no path specified") + if isinstance(path, bytes): sep = b'\\' curdir = b'.' @@ -777,22 +784,20 @@ def relpath(path, start=None): if start is None: start = curdir + else: + start = os.fspath(start) - if not path: - raise ValueError("no path specified") - - start = os.fspath(start) try: - start_abs = abspath(normpath(start)) - path_abs = abspath(normpath(path)) + start_abs = abspath(start) + path_abs = abspath(path) start_drive, _, start_rest = splitroot(start_abs) path_drive, _, path_rest = splitroot(path_abs) if normcase(start_drive) != normcase(path_drive): raise ValueError("path is on mount %r, start on mount %r" % ( path_drive, start_drive)) - start_list = [x for x in start_rest.split(sep) if x] - path_list = [x for x in path_rest.split(sep) if x] + start_list = start_rest.split(sep) if start_rest else [] + path_list = path_rest.split(sep) if path_rest else [] # Work out how much of the filepath is shared by start and path. i = 0 for e1, e2 in zip(start_list, path_list): @@ -803,29 +808,28 @@ def relpath(path, start=None): rel_list = [pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: return curdir - return join(*rel_list) + return sep.join(rel_list) except (TypeError, ValueError, AttributeError, BytesWarning, DeprecationWarning): genericpath._check_arg_types('relpath', path, start) raise -# Return the longest common sub-path of the sequence of paths given as input. +# Return the longest common sub-path of the iterable of paths given as input. # The function is case-insensitive and 'separator-insensitive', i.e. if the # only difference between two paths is the use of '\' versus '/' as separator, # they are deemed to be equal. # # However, the returned path will have the standard '\' separator (even if the # given paths had the alternative '/' separator) and will have the case of the -# first path given in the sequence. Additionally, any trailing separator is +# first path given in the iterable. Additionally, any trailing separator is # stripped from the returned path. def commonpath(paths): - """Given a sequence of path names, returns the longest common sub-path.""" - + """Given an iterable of path names, returns the longest common sub-path.""" + paths = tuple(map(os.fspath, paths)) if not paths: - raise ValueError('commonpath() arg is an empty sequence') + raise ValueError('commonpath() arg is an empty iterable') - paths = tuple(map(os.fspath, paths)) if isinstance(paths[0], bytes): sep = b'\\' altsep = b'/' @@ -839,9 +843,6 @@ def commonpath(paths): drivesplits = [splitroot(p.replace(altsep, sep).lower()) for p in paths] split_paths = [p.split(sep) for d, r, p in drivesplits] - if len({r for d, r, p in drivesplits}) != 1: - raise ValueError("Can't mix absolute and relative paths") - # Check that all drive letters or UNC paths match. The check is made only # now otherwise type errors for mixing strings and bytes would not be # caught. @@ -849,6 +850,12 @@ def commonpath(paths): raise ValueError("Paths don't have the same drive") drive, root, path = splitroot(paths[0].replace(altsep, sep)) + if len({r for d, r, p in drivesplits}) != 1: + if drive: + raise ValueError("Can't mix absolute and relative paths") + else: + raise ValueError("Can't mix rooted and not-rooted paths") + common = path.split(sep) common = [c for c in common if c and c != curdir] @@ -869,13 +876,15 @@ def commonpath(paths): try: - # The isdir(), isfile(), islink() and exists() implementations in - # genericpath use os.stat(). This is overkill on Windows. Use simpler + # The isdir(), isfile(), islink(), exists() and lexists() implementations + # in genericpath use os.stat(). This is overkill on Windows. Use simpler # builtin functions if they are available. from nt import _path_isdir as isdir from nt import _path_isfile as isfile from nt import _path_islink as islink + from nt import _path_isjunction as isjunction from nt import _path_exists as exists + from nt import _path_lexists as lexists except ImportError: # Use genericpath.* as imported above pass @@ -883,15 +892,12 @@ except ImportError: try: from nt import _path_isdevdrive -except ImportError: - def isdevdrive(path): - """Determines whether the specified path is on a Windows Dev Drive.""" - # Never a Dev Drive - return False -else: def isdevdrive(path): """Determines whether the specified path is on a Windows Dev Drive.""" try: return _path_isdevdrive(abspath(path)) except OSError: return False +except ImportError: + # Use genericpath.isdevdrive as imported above + pass diff --git a/Lib/nturl2path.py b/Lib/nturl2path.py index 61852aff..757fd01b 100644 --- a/Lib/nturl2path.py +++ b/Lib/nturl2path.py @@ -15,32 +15,29 @@ def url2pathname(url): # become # C:\foo\bar\spam.foo import string, urllib.parse + if url[:3] == '///': + # URL has an empty authority section, so the path begins on the third + # character. + url = url[2:] + elif url[:12] == '//localhost/': + # Skip past 'localhost' authority. + url = url[11:] + if url[:3] == '///': + # Skip past extra slash before UNC drive in URL path. + url = url[1:] # Windows itself uses ":" even in URLs. url = url.replace(':', '|') if not '|' in url: # No drive specifier, just convert slashes - if url[:4] == '////': - # path is something like ////host/path/on/remote/host - # convert this to \\host\path\on\remote\host - # (notice halving of slashes at the start of the path) - url = url[2:] - components = url.split('/') # make sure not to convert quoted slashes :-) - return urllib.parse.unquote('\\'.join(components)) + return urllib.parse.unquote(url.replace('/', '\\')) comp = url.split('|') if len(comp) != 2 or comp[0][-1] not in string.ascii_letters: error = 'Bad URL: ' + url raise OSError(error) drive = comp[0][-1].upper() - components = comp[1].split('/') - path = drive + ':' - for comp in components: - if comp: - path = path + '\\' + urllib.parse.unquote(comp) - # Issue #11474 - handing url such as |c/| - if path.endswith(':') and url.endswith('/'): - path += '\\' - return path + tail = urllib.parse.unquote(comp[1].replace('/', '\\')) + return drive + ':' + tail def pathname2url(p): """OS-specific conversion from a file system path to a relative URL @@ -52,30 +49,21 @@ def pathname2url(p): import urllib.parse # First, clean up some special forms. We are going to sacrifice # the additional information anyway - if p[:4] == '\\\\?\\': + p = p.replace('\\', '/') + if p[:4] == '//?/': p = p[4:] - if p[:4].upper() == 'UNC\\': - p = '\\' + p[4:] + if p[:4].upper() == 'UNC/': + p = '//' + p[4:] elif p[1:2] != ':': raise OSError('Bad path: ' + p) if not ':' in p: - # No drive specifier, just convert slashes and quote the name - if p[:2] == '\\\\': - # path is something like \\host\path\on\remote\host - # convert this to ////host/path/on/remote/host - # (notice doubling of slashes at the start of the path) - p = '\\\\' + p - components = p.split('\\') - return urllib.parse.quote('/'.join(components)) + # No DOS drive specified, just quote the pathname + return urllib.parse.quote(p) comp = p.split(':', maxsplit=2) if len(comp) != 2 or len(comp[0]) > 1: error = 'Bad path: ' + p raise OSError(error) drive = urllib.parse.quote(comp[0].upper()) - components = comp[1].split('\\') - path = '///' + drive + ':' - for comp in components: - if comp: - path = path + '/' + urllib.parse.quote(comp) - return path + tail = urllib.parse.quote(comp[1]) + return '///' + drive + ':' + tail diff --git a/Lib/opcode.py b/Lib/opcode.py index 6bb2f1c1..5735686f 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -4,441 +4,41 @@ opcode module - potentially shared between dis and other modules which operate on bytecodes (e.g. peephole optimizers). """ -__all__ = ["cmp_op", "hasarg", "hasconst", "hasname", "hasjrel", "hasjabs", - "haslocal", "hascompare", "hasfree", "hasexc", "opname", "opmap", - "HAVE_ARGUMENT", "EXTENDED_ARG"] -# It's a chicken-and-egg I'm afraid: -# We're imported before _opcode's made. -# With exception unheeded -# (stack_effect is not needed) -# Both our chickens and eggs are allayed. -# --Larry Hastings, 2013/11/23 +__all__ = ["cmp_op", "stack_effect", "hascompare", "opname", "opmap", + "HAVE_ARGUMENT", "EXTENDED_ARG", "hasarg", "hasconst", "hasname", + "hasjump", "hasjrel", "hasjabs", "hasfree", "haslocal", "hasexc"] -try: - from _opcode import stack_effect - __all__.append('stack_effect') -except ImportError: - pass +import _opcode +from _opcode import stack_effect -cmp_op = ('<', '<=', '==', '!=', '>', '>=') - -hasarg = [] -hasconst = [] -hasname = [] -hasjrel = [] -hasjabs = [] -haslocal = [] -hascompare = [] -hasfree = [] -hasexc = [] - - -ENABLE_SPECIALIZATION = True - -def is_pseudo(op): - return op >= MIN_PSEUDO_OPCODE and op <= MAX_PSEUDO_OPCODE - -oplists = [hasarg, hasconst, hasname, hasjrel, hasjabs, - haslocal, hascompare, hasfree, hasexc] - -opmap = {} - -## pseudo opcodes (used in the compiler) mapped to the values -## they can become in the actual code. -_pseudo_ops = {} - -def def_op(name, op): - opmap[name] = op - -def name_op(name, op): - def_op(name, op) - hasname.append(op) - -def jrel_op(name, op): - def_op(name, op) - hasjrel.append(op) - -def jabs_op(name, op): - def_op(name, op) - hasjabs.append(op) - -def pseudo_op(name, op, real_ops): - def_op(name, op) - _pseudo_ops[name] = real_ops - # add the pseudo opcode to the lists its targets are in - for oplist in oplists: - res = [opmap[rop] in oplist for rop in real_ops] - if any(res): - assert all(res) - oplist.append(op) - - -# Instruction opcodes for compiled code -# Blank lines correspond to available opcodes - -def_op('CACHE', 0) -def_op('POP_TOP', 1) -def_op('PUSH_NULL', 2) -def_op('INTERPRETER_EXIT', 3) - -def_op('END_FOR', 4) -def_op('END_SEND', 5) - -def_op('NOP', 9) - -def_op('UNARY_NEGATIVE', 11) -def_op('UNARY_NOT', 12) - -def_op('UNARY_INVERT', 15) - -# We reserve 17 as it is the initial value for the specializing counter -# This helps us catch cases where we attempt to execute a cache. -def_op('RESERVED', 17) - -def_op('BINARY_SUBSCR', 25) -def_op('BINARY_SLICE', 26) -def_op('STORE_SLICE', 27) - -def_op('GET_LEN', 30) -def_op('MATCH_MAPPING', 31) -def_op('MATCH_SEQUENCE', 32) -def_op('MATCH_KEYS', 33) - -def_op('PUSH_EXC_INFO', 35) -def_op('CHECK_EXC_MATCH', 36) -def_op('CHECK_EG_MATCH', 37) - -def_op('WITH_EXCEPT_START', 49) -def_op('GET_AITER', 50) -def_op('GET_ANEXT', 51) -def_op('BEFORE_ASYNC_WITH', 52) -def_op('BEFORE_WITH', 53) -def_op('END_ASYNC_FOR', 54) -def_op('CLEANUP_THROW', 55) - -def_op('STORE_SUBSCR', 60) -def_op('DELETE_SUBSCR', 61) - -def_op('GET_ITER', 68) -def_op('GET_YIELD_FROM_ITER', 69) - -def_op('LOAD_BUILD_CLASS', 71) - -def_op('LOAD_ASSERTION_ERROR', 74) -def_op('RETURN_GENERATOR', 75) - -def_op('RETURN_VALUE', 83) - -def_op('SETUP_ANNOTATIONS', 85) -def_op('LOAD_LOCALS', 87) - -def_op('POP_EXCEPT', 89) - -HAVE_ARGUMENT = 90 # real opcodes from here have an argument: - -name_op('STORE_NAME', 90) # Index in name list -name_op('DELETE_NAME', 91) # "" -def_op('UNPACK_SEQUENCE', 92) # Number of tuple items -jrel_op('FOR_ITER', 93) -def_op('UNPACK_EX', 94) -name_op('STORE_ATTR', 95) # Index in name list -name_op('DELETE_ATTR', 96) # "" -name_op('STORE_GLOBAL', 97) # "" -name_op('DELETE_GLOBAL', 98) # "" -def_op('SWAP', 99) -def_op('LOAD_CONST', 100) # Index in const list -hasconst.append(100) -name_op('LOAD_NAME', 101) # Index in name list -def_op('BUILD_TUPLE', 102) # Number of tuple items -def_op('BUILD_LIST', 103) # Number of list items -def_op('BUILD_SET', 104) # Number of set items -def_op('BUILD_MAP', 105) # Number of dict entries -name_op('LOAD_ATTR', 106) # Index in name list -def_op('COMPARE_OP', 107) # Comparison operator -hascompare.append(107) -name_op('IMPORT_NAME', 108) # Index in name list -name_op('IMPORT_FROM', 109) # Index in name list -jrel_op('JUMP_FORWARD', 110) # Number of words to skip -jrel_op('POP_JUMP_IF_FALSE', 114) -jrel_op('POP_JUMP_IF_TRUE', 115) -name_op('LOAD_GLOBAL', 116) # Index in name list -def_op('IS_OP', 117) -def_op('CONTAINS_OP', 118) -def_op('RERAISE', 119) -def_op('COPY', 120) -def_op('RETURN_CONST', 121) -hasconst.append(121) -def_op('BINARY_OP', 122) -jrel_op('SEND', 123) # Number of words to skip -def_op('LOAD_FAST', 124) # Local variable number, no null check -haslocal.append(124) -def_op('STORE_FAST', 125) # Local variable number -haslocal.append(125) -def_op('DELETE_FAST', 126) # Local variable number -haslocal.append(126) -def_op('LOAD_FAST_CHECK', 127) # Local variable number -haslocal.append(127) -jrel_op('POP_JUMP_IF_NOT_NONE', 128) -jrel_op('POP_JUMP_IF_NONE', 129) -def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) -def_op('GET_AWAITABLE', 131) -def_op('MAKE_FUNCTION', 132) # Flags -def_op('BUILD_SLICE', 133) # Number of items -jrel_op('JUMP_BACKWARD_NO_INTERRUPT', 134) # Number of words to skip (backwards) -def_op('MAKE_CELL', 135) -hasfree.append(135) -def_op('LOAD_CLOSURE', 136) -hasfree.append(136) -def_op('LOAD_DEREF', 137) -hasfree.append(137) -def_op('STORE_DEREF', 138) -hasfree.append(138) -def_op('DELETE_DEREF', 139) -hasfree.append(139) -jrel_op('JUMP_BACKWARD', 140) # Number of words to skip (backwards) -name_op('LOAD_SUPER_ATTR', 141) -def_op('CALL_FUNCTION_EX', 142) # Flags -def_op('LOAD_FAST_AND_CLEAR', 143) # Local variable number -haslocal.append(143) +from _opcode_metadata import (_specializations, _specialized_opmap, opmap, + HAVE_ARGUMENT, MIN_INSTRUMENTED_OPCODE) +EXTENDED_ARG = opmap['EXTENDED_ARG'] -def_op('EXTENDED_ARG', 144) -EXTENDED_ARG = 144 -def_op('LIST_APPEND', 145) -def_op('SET_ADD', 146) -def_op('MAP_ADD', 147) -hasfree.append(148) -def_op('COPY_FREE_VARS', 149) -def_op('YIELD_VALUE', 150) -def_op('RESUME', 151) # This must be kept in sync with deepfreeze.py -def_op('MATCH_CLASS', 152) - -def_op('FORMAT_VALUE', 155) -def_op('BUILD_CONST_KEY_MAP', 156) -def_op('BUILD_STRING', 157) - -def_op('LIST_EXTEND', 162) -def_op('SET_UPDATE', 163) -def_op('DICT_MERGE', 164) -def_op('DICT_UPDATE', 165) - -def_op('CALL', 171) -def_op('KW_NAMES', 172) -hasconst.append(172) -def_op('CALL_INTRINSIC_1', 173) -def_op('CALL_INTRINSIC_2', 174) - -name_op('LOAD_FROM_DICT_OR_GLOBALS', 175) -def_op('LOAD_FROM_DICT_OR_DEREF', 176) -hasfree.append(176) - -# Instrumented instructions -MIN_INSTRUMENTED_OPCODE = 237 - -def_op('INSTRUMENTED_LOAD_SUPER_ATTR', 237) -def_op('INSTRUMENTED_POP_JUMP_IF_NONE', 238) -def_op('INSTRUMENTED_POP_JUMP_IF_NOT_NONE', 239) -def_op('INSTRUMENTED_RESUME', 240) -def_op('INSTRUMENTED_CALL', 241) -def_op('INSTRUMENTED_RETURN_VALUE', 242) -def_op('INSTRUMENTED_YIELD_VALUE', 243) -def_op('INSTRUMENTED_CALL_FUNCTION_EX', 244) -def_op('INSTRUMENTED_JUMP_FORWARD', 245) -def_op('INSTRUMENTED_JUMP_BACKWARD', 246) -def_op('INSTRUMENTED_RETURN_CONST', 247) -def_op('INSTRUMENTED_FOR_ITER', 248) -def_op('INSTRUMENTED_POP_JUMP_IF_FALSE', 249) -def_op('INSTRUMENTED_POP_JUMP_IF_TRUE', 250) -def_op('INSTRUMENTED_END_FOR', 251) -def_op('INSTRUMENTED_END_SEND', 252) -def_op('INSTRUMENTED_INSTRUCTION', 253) -def_op('INSTRUMENTED_LINE', 254) -# 255 is reserved - -hasarg.extend([op for op in opmap.values() if op >= HAVE_ARGUMENT]) - -MIN_PSEUDO_OPCODE = 256 - -pseudo_op('SETUP_FINALLY', 256, ['NOP']) -hasexc.append(256) -pseudo_op('SETUP_CLEANUP', 257, ['NOP']) -hasexc.append(257) -pseudo_op('SETUP_WITH', 258, ['NOP']) -hasexc.append(258) -pseudo_op('POP_BLOCK', 259, ['NOP']) - -pseudo_op('JUMP', 260, ['JUMP_FORWARD', 'JUMP_BACKWARD']) -pseudo_op('JUMP_NO_INTERRUPT', 261, ['JUMP_FORWARD', 'JUMP_BACKWARD_NO_INTERRUPT']) - -pseudo_op('LOAD_METHOD', 262, ['LOAD_ATTR']) -pseudo_op('LOAD_SUPER_METHOD', 263, ['LOAD_SUPER_ATTR']) -pseudo_op('LOAD_ZERO_SUPER_METHOD', 264, ['LOAD_SUPER_ATTR']) -pseudo_op('LOAD_ZERO_SUPER_ATTR', 265, ['LOAD_SUPER_ATTR']) - -pseudo_op('STORE_FAST_MAYBE_NULL', 266, ['STORE_FAST']) - -MAX_PSEUDO_OPCODE = MIN_PSEUDO_OPCODE + len(_pseudo_ops) - 1 - -del def_op, name_op, jrel_op, jabs_op, pseudo_op - -opname = ['<%r>' % (op,) for op in range(MAX_PSEUDO_OPCODE + 1)] +opname = ['<%r>' % (op,) for op in range(max(opmap.values()) + 1)] for op, i in opmap.items(): opname[i] = op +cmp_op = ('<', '<=', '==', '!=', '>', '>=') -_nb_ops = [ - ("NB_ADD", "+"), - ("NB_AND", "&"), - ("NB_FLOOR_DIVIDE", "//"), - ("NB_LSHIFT", "<<"), - ("NB_MATRIX_MULTIPLY", "@"), - ("NB_MULTIPLY", "*"), - ("NB_REMAINDER", "%"), - ("NB_OR", "|"), - ("NB_POWER", "**"), - ("NB_RSHIFT", ">>"), - ("NB_SUBTRACT", "-"), - ("NB_TRUE_DIVIDE", "/"), - ("NB_XOR", "^"), - ("NB_INPLACE_ADD", "+="), - ("NB_INPLACE_AND", "&="), - ("NB_INPLACE_FLOOR_DIVIDE", "//="), - ("NB_INPLACE_LSHIFT", "<<="), - ("NB_INPLACE_MATRIX_MULTIPLY", "@="), - ("NB_INPLACE_MULTIPLY", "*="), - ("NB_INPLACE_REMAINDER", "%="), - ("NB_INPLACE_OR", "|="), - ("NB_INPLACE_POWER", "**="), - ("NB_INPLACE_RSHIFT", ">>="), - ("NB_INPLACE_SUBTRACT", "-="), - ("NB_INPLACE_TRUE_DIVIDE", "/="), - ("NB_INPLACE_XOR", "^="), -] +# These lists are documented as part of the dis module's API +hasarg = [op for op in opmap.values() if _opcode.has_arg(op)] +hasconst = [op for op in opmap.values() if _opcode.has_const(op)] +hasname = [op for op in opmap.values() if _opcode.has_name(op)] +hasjump = [op for op in opmap.values() if _opcode.has_jump(op)] +hasjrel = hasjump # for backward compatibility +hasjabs = [] +hasfree = [op for op in opmap.values() if _opcode.has_free(op)] +haslocal = [op for op in opmap.values() if _opcode.has_local(op)] +hasexc = [op for op in opmap.values() if _opcode.has_exc(op)] -_intrinsic_1_descs = [ - "INTRINSIC_1_INVALID", - "INTRINSIC_PRINT", - "INTRINSIC_IMPORT_STAR", - "INTRINSIC_STOPITERATION_ERROR", - "INTRINSIC_ASYNC_GEN_WRAP", - "INTRINSIC_UNARY_POSITIVE", - "INTRINSIC_LIST_TO_TUPLE", - "INTRINSIC_TYPEVAR", - "INTRINSIC_PARAMSPEC", - "INTRINSIC_TYPEVARTUPLE", - "INTRINSIC_SUBSCRIPT_GENERIC", - "INTRINSIC_TYPEALIAS", -] -_intrinsic_2_descs = [ - "INTRINSIC_2_INVALID", - "INTRINSIC_PREP_RERAISE_STAR", - "INTRINSIC_TYPEVAR_WITH_BOUND", - "INTRINSIC_TYPEVAR_WITH_CONSTRAINTS", - "INTRINSIC_SET_FUNCTION_TYPE_PARAMS", -] +_intrinsic_1_descs = _opcode.get_intrinsic1_descs() +_intrinsic_2_descs = _opcode.get_intrinsic2_descs() +_nb_ops = _opcode.get_nb_ops() -_specializations = { - "BINARY_OP": [ - "BINARY_OP_ADD_FLOAT", - "BINARY_OP_ADD_INT", - "BINARY_OP_ADD_UNICODE", - "BINARY_OP_INPLACE_ADD_UNICODE", - "BINARY_OP_MULTIPLY_FLOAT", - "BINARY_OP_MULTIPLY_INT", - "BINARY_OP_SUBTRACT_FLOAT", - "BINARY_OP_SUBTRACT_INT", - ], - "BINARY_SUBSCR": [ - "BINARY_SUBSCR_DICT", - "BINARY_SUBSCR_GETITEM", - "BINARY_SUBSCR_LIST_INT", - "BINARY_SUBSCR_TUPLE_INT", - ], - "CALL": [ - "CALL_PY_EXACT_ARGS", - "CALL_PY_WITH_DEFAULTS", - "CALL_BOUND_METHOD_EXACT_ARGS", - "CALL_BUILTIN_CLASS", - "CALL_BUILTIN_FAST_WITH_KEYWORDS", - "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - "CALL_NO_KW_BUILTIN_FAST", - "CALL_NO_KW_BUILTIN_O", - "CALL_NO_KW_ISINSTANCE", - "CALL_NO_KW_LEN", - "CALL_NO_KW_LIST_APPEND", - "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", - "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - "CALL_NO_KW_METHOD_DESCRIPTOR_O", - "CALL_NO_KW_STR_1", - "CALL_NO_KW_TUPLE_1", - "CALL_NO_KW_TYPE_1", - ], - "COMPARE_OP": [ - "COMPARE_OP_FLOAT", - "COMPARE_OP_INT", - "COMPARE_OP_STR", - ], - "FOR_ITER": [ - "FOR_ITER_LIST", - "FOR_ITER_TUPLE", - "FOR_ITER_RANGE", - "FOR_ITER_GEN", - ], - "LOAD_SUPER_ATTR": [ - "LOAD_SUPER_ATTR_ATTR", - "LOAD_SUPER_ATTR_METHOD", - ], - "LOAD_ATTR": [ - # These potentially push [NULL, bound method] onto the stack. - "LOAD_ATTR_CLASS", - "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN", - "LOAD_ATTR_INSTANCE_VALUE", - "LOAD_ATTR_MODULE", - "LOAD_ATTR_PROPERTY", - "LOAD_ATTR_SLOT", - "LOAD_ATTR_WITH_HINT", - # These will always push [unbound method, self] onto the stack. - "LOAD_ATTR_METHOD_LAZY_DICT", - "LOAD_ATTR_METHOD_NO_DICT", - "LOAD_ATTR_METHOD_WITH_VALUES", - ], - "LOAD_CONST": [ - "LOAD_CONST__LOAD_FAST", - ], - "LOAD_FAST": [ - "LOAD_FAST__LOAD_CONST", - "LOAD_FAST__LOAD_FAST", - ], - "LOAD_GLOBAL": [ - "LOAD_GLOBAL_BUILTIN", - "LOAD_GLOBAL_MODULE", - ], - "STORE_ATTR": [ - "STORE_ATTR_INSTANCE_VALUE", - "STORE_ATTR_SLOT", - "STORE_ATTR_WITH_HINT", - ], - "STORE_FAST": [ - "STORE_FAST__LOAD_FAST", - "STORE_FAST__STORE_FAST", - ], - "STORE_SUBSCR": [ - "STORE_SUBSCR_DICT", - "STORE_SUBSCR_LIST_INT", - ], - "UNPACK_SEQUENCE": [ - "UNPACK_SEQUENCE_LIST", - "UNPACK_SEQUENCE_TUPLE", - "UNPACK_SEQUENCE_TWO_TUPLE", - ], - "SEND": [ - "SEND_GEN", - ], -} -_specialized_instructions = [ - opcode for family in _specializations.values() for opcode in family -] +hascompare = [opmap["COMPARE_OP"]] _cache_format = { "LOAD_GLOBAL": { @@ -456,6 +56,9 @@ _cache_format = { "COMPARE_OP": { "counter": 1, }, + "CONTAINS_OP": { + "counter": 1, + }, "BINARY_SUBSCR": { "counter": 1, }, @@ -486,8 +89,27 @@ _cache_format = { "SEND": { "counter": 1, }, + "JUMP_BACKWARD": { + "counter": 1, + }, + "TO_BOOL": { + "counter": 1, + "version": 2, + }, + "POP_JUMP_IF_TRUE": { + "counter": 1, + }, + "POP_JUMP_IF_FALSE": { + "counter": 1, + }, + "POP_JUMP_IF_NONE": { + "counter": 1, + }, + "POP_JUMP_IF_NOT_NONE": { + "counter": 1, + }, } -_inline_cache_entries = [ - sum(_cache_format.get(opname[opcode], {}).values()) for opcode in range(256) -] +_inline_cache_entries = { + name : sum(value.values()) for (name, value) in _cache_format.items() +} diff --git a/Lib/operator.py b/Lib/operator.py index 30116c11..02ccdaa1 100644 --- a/Lib/operator.py +++ b/Lib/operator.py @@ -239,7 +239,7 @@ class attrgetter: """ __slots__ = ('_attrs', '_call') - def __init__(self, attr, *attrs): + def __init__(self, attr, /, *attrs): if not attrs: if not isinstance(attr, str): raise TypeError('attribute name must be a string') @@ -257,7 +257,7 @@ class attrgetter: return tuple(getter(obj) for getter in getters) self._call = func - def __call__(self, obj): + def __call__(self, obj, /): return self._call(obj) def __repr__(self): @@ -276,7 +276,7 @@ class itemgetter: """ __slots__ = ('_items', '_call') - def __init__(self, item, *items): + def __init__(self, item, /, *items): if not items: self._items = (item,) def func(obj): @@ -288,7 +288,7 @@ class itemgetter: return tuple(obj[i] for i in items) self._call = func - def __call__(self, obj): + def __call__(self, obj, /): return self._call(obj) def __repr__(self): @@ -315,7 +315,7 @@ class methodcaller: self._args = args self._kwargs = kwargs - def __call__(self, obj): + def __call__(self, obj, /): return getattr(obj, self._name)(*self._args, **self._kwargs) def __repr__(self): diff --git a/Lib/os.py b/Lib/os.py index 598c9e50..0408e2db 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -131,6 +131,7 @@ if _exists("_have_functions"): _set = set() _add("HAVE_FCHDIR", "chdir") _add("HAVE_FCHMOD", "chmod") + _add("MS_WINDOWS", "chmod") _add("HAVE_FCHOWN", "chown") _add("HAVE_FDOPENDIR", "listdir") _add("HAVE_FDOPENDIR", "scandir") @@ -171,6 +172,7 @@ if _exists("_have_functions"): _add("HAVE_FSTATAT", "stat") _add("HAVE_LCHFLAGS", "chflags") _add("HAVE_LCHMOD", "chmod") + _add("MS_WINDOWS", "chmod") if _exists("lchown"): # mac os x10.3 _add("HAVE_LCHOWN", "chown") _add("HAVE_LINKAT", "link") @@ -279,6 +281,10 @@ def renames(old, new): __all__.extend(["makedirs", "removedirs", "renames"]) +# Private sentinel that makes walk() classify all symlinks and junctions as +# regular files. +_walk_symlinks_as_files = object() + def walk(top, topdown=True, onerror=None, followlinks=False): """Directory tree generator. @@ -380,7 +386,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False): break try: - is_dir = entry.is_dir() + if followlinks is _walk_symlinks_as_files: + is_dir = entry.is_dir(follow_symlinks=False) and not entry.is_junction() + else: + is_dir = entry.is_dir() except OSError: # If is_dir() raises an OSError, consider the entry not to # be a directory, same behaviour as os.path.isdir(). @@ -469,24 +478,59 @@ if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: """ sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd) top = fspath(top) - # Note: To guard against symlink races, we use the standard - # lstat()/open()/fstat() trick. - if not follow_symlinks: - orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd) - topfd = open(top, O_RDONLY, dir_fd=dir_fd) + stack = [(_fwalk_walk, (True, dir_fd, top, top, None))] + isbytes = isinstance(top, bytes) try: - if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and - path.samestat(orig_st, stat(topfd)))): - yield from _fwalk(topfd, top, isinstance(top, bytes), - topdown, onerror, follow_symlinks) + while stack: + yield from _fwalk(stack, isbytes, topdown, onerror, follow_symlinks) finally: - close(topfd) - - def _fwalk(topfd, toppath, isbytes, topdown, onerror, follow_symlinks): + # Close any file descriptors still on the stack. + while stack: + action, value = stack.pop() + if action == _fwalk_close: + close(value) + + # Each item in the _fwalk() stack is a pair (action, args). + _fwalk_walk = 0 # args: (isroot, dirfd, toppath, topname, entry) + _fwalk_yield = 1 # args: (toppath, dirnames, filenames, topfd) + _fwalk_close = 2 # args: dirfd + + def _fwalk(stack, isbytes, topdown, onerror, follow_symlinks): # Note: This uses O(depth of the directory tree) file descriptors: if # necessary, it can be adapted to only require O(1) FDs, see issue # #13734. + action, value = stack.pop() + if action == _fwalk_close: + close(value) + return + elif action == _fwalk_yield: + yield value + return + assert action == _fwalk_walk + isroot, dirfd, toppath, topname, entry = value + try: + if not follow_symlinks: + # Note: To guard against symlink races, we use the standard + # lstat()/open()/fstat() trick. + if entry is None: + orig_st = stat(topname, follow_symlinks=False, dir_fd=dirfd) + else: + orig_st = entry.stat(follow_symlinks=False) + topfd = open(topname, O_RDONLY | O_NONBLOCK, dir_fd=dirfd) + except OSError as err: + if isroot: + raise + if onerror is not None: + onerror(err) + return + stack.append((_fwalk_close, topfd)) + if not follow_symlinks: + if isroot and not st.S_ISDIR(orig_st.st_mode): + return + if not path.samestat(orig_st, stat(topfd)): + return + scandir_it = scandir(topfd) dirs = [] nondirs = [] @@ -512,31 +556,18 @@ if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: if topdown: yield toppath, dirs, nondirs, topfd + else: + stack.append((_fwalk_yield, (toppath, dirs, nondirs, topfd))) - for name in dirs if entries is None else zip(dirs, entries): - try: - if not follow_symlinks: - if topdown: - orig_st = stat(name, dir_fd=topfd, follow_symlinks=False) - else: - assert entries is not None - name, entry = name - orig_st = entry.stat(follow_symlinks=False) - dirfd = open(name, O_RDONLY, dir_fd=topfd) - except OSError as err: - if onerror is not None: - onerror(err) - continue - try: - if follow_symlinks or path.samestat(orig_st, stat(dirfd)): - dirpath = path.join(toppath, name) - yield from _fwalk(dirfd, dirpath, isbytes, - topdown, onerror, follow_symlinks) - finally: - close(dirfd) - - if not topdown: - yield toppath, dirs, nondirs, topfd + toppath = path.join(toppath, toppath[:0]) # Add trailing slash. + if entries is None: + stack.extend( + (_fwalk_walk, (False, topfd, toppath + name, name, None)) + for name in dirs[::-1]) + else: + stack.extend( + (_fwalk_walk, (False, topfd, toppath + name, name, entry)) + for name, entry in zip(dirs[::-1], entries[::-1])) __all__.append("fwalk") @@ -1061,6 +1092,12 @@ def _fspath(path): else: raise TypeError("expected str, bytes or os.PathLike object, " "not " + path_type.__name__) + except TypeError: + if path_type.__fspath__ is None: + raise TypeError("expected str, bytes or os.PathLike object, " + "not " + path_type.__name__) from None + else: + raise if isinstance(path_repr, (str, bytes)): return path_repr else: @@ -1079,6 +1116,8 @@ class PathLike(abc.ABC): """Abstract base class for implementing the file system path protocol.""" + __slots__ = () + @abc.abstractmethod def __fspath__(self): """Return the file system path representation of the object.""" @@ -1128,3 +1167,17 @@ if name == 'nt': cookie, nt._remove_dll_directory ) + + +if _exists('sched_getaffinity') and sys._get_cpu_count_config() < 0: + def process_cpu_count(): + """ + Get the number of CPUs of the current process. + + Return the number of logical CPUs usable by the calling thread of the + current process. Return None if indeterminable. + """ + return len(sched_getaffinity(0)) +else: + # Just an alias to cpu_count() (same docstring) + process_cpu_count = cpu_count diff --git a/Lib/pathlib.py b/Lib/pathlib.py deleted file mode 100644 index 65631b70..00000000 --- a/Lib/pathlib.py +++ /dev/null @@ -1,1436 +0,0 @@ -"""Object-oriented filesystem paths. - -This module provides classes to represent abstract paths and concrete -paths with operations that have semantics appropriate for different -operating systems. -""" - -import fnmatch -import functools -import io -import ntpath -import os -import posixpath -import re -import sys -import warnings -from _collections_abc import Sequence -from errno import ENOENT, ENOTDIR, EBADF, ELOOP -from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO -from urllib.parse import quote_from_bytes as urlquote_from_bytes - - -__all__ = [ - "PurePath", "PurePosixPath", "PureWindowsPath", - "Path", "PosixPath", "WindowsPath", - ] - -# -# Internals -# - -# Reference for Windows paths can be found at -# https://learn.microsoft.com/en-gb/windows/win32/fileio/naming-a-file . -_WIN_RESERVED_NAMES = frozenset( - {'CON', 'PRN', 'AUX', 'NUL', 'CONIN$', 'CONOUT$'} | - {f'COM{c}' for c in '123456789\xb9\xb2\xb3'} | - {f'LPT{c}' for c in '123456789\xb9\xb2\xb3'} -) - -_WINERROR_NOT_READY = 21 # drive exists but is not accessible -_WINERROR_INVALID_NAME = 123 # fix for bpo-35306 -_WINERROR_CANT_RESOLVE_FILENAME = 1921 # broken symlink pointing to itself - -# EBADF - guard against macOS `stat` throwing EBADF -_IGNORED_ERRNOS = (ENOENT, ENOTDIR, EBADF, ELOOP) - -_IGNORED_WINERRORS = ( - _WINERROR_NOT_READY, - _WINERROR_INVALID_NAME, - _WINERROR_CANT_RESOLVE_FILENAME) - -def _ignore_error(exception): - return (getattr(exception, 'errno', None) in _IGNORED_ERRNOS or - getattr(exception, 'winerror', None) in _IGNORED_WINERRORS) - - -@functools.cache -def _is_case_sensitive(flavour): - return flavour.normcase('Aa') == 'Aa' - -# -# Globbing helpers -# - - -# fnmatch.translate() returns a regular expression that includes a prefix and -# a suffix, which enable matching newlines and ensure the end of the string is -# matched, respectively. These features are undesirable for our implementation -# of PurePatch.match(), which represents path separators as newlines and joins -# pattern segments together. As a workaround, we define a slice object that -# can remove the prefix and suffix from any translate() result. See the -# _compile_pattern_lines() function for more details. -_FNMATCH_PREFIX, _FNMATCH_SUFFIX = fnmatch.translate('_').split('_') -_FNMATCH_SLICE = slice(len(_FNMATCH_PREFIX), -len(_FNMATCH_SUFFIX)) -_SWAP_SEP_AND_NEWLINE = { - '/': str.maketrans({'/': '\n', '\n': '/'}), - '\\': str.maketrans({'\\': '\n', '\n': '\\'}), -} - - -@functools.lru_cache() -def _make_selector(pattern_parts, flavour, case_sensitive): - pat = pattern_parts[0] - if not pat: - return _TerminatingSelector() - if pat == '**': - child_parts_idx = 1 - while child_parts_idx < len(pattern_parts) and pattern_parts[child_parts_idx] == '**': - child_parts_idx += 1 - child_parts = pattern_parts[child_parts_idx:] - if '**' in child_parts: - cls = _DoubleRecursiveWildcardSelector - else: - cls = _RecursiveWildcardSelector - else: - child_parts = pattern_parts[1:] - if pat == '..': - cls = _ParentSelector - elif '**' in pat: - raise ValueError("Invalid pattern: '**' can only be an entire path component") - else: - cls = _WildcardSelector - return cls(pat, child_parts, flavour, case_sensitive) - - -@functools.lru_cache(maxsize=256) -def _compile_pattern(pat, case_sensitive): - flags = re.NOFLAG if case_sensitive else re.IGNORECASE - return re.compile(fnmatch.translate(pat), flags).match - - -@functools.lru_cache() -def _compile_pattern_lines(pattern_lines, case_sensitive): - """Compile the given pattern lines to an `re.Pattern` object. - - The *pattern_lines* argument is a glob-style pattern (e.g. '*/*.py') with - its path separators and newlines swapped (e.g. '*\n*.py`). By using - newlines to separate path components, and not setting `re.DOTALL`, we - ensure that the `*` wildcard cannot match path separators. - - The returned `re.Pattern` object may have its `match()` method called to - match a complete pattern, or `search()` to match from the right. The - argument supplied to these methods must also have its path separators and - newlines swapped. - """ - - # Match the start of the path, or just after a path separator - parts = ['^'] - for part in pattern_lines.splitlines(keepends=True): - if part == '*\n': - part = r'.+\n' - elif part == '*': - part = r'.+' - else: - # Any other component: pass to fnmatch.translate(). We slice off - # the common prefix and suffix added by translate() to ensure that - # re.DOTALL is not set, and the end of the string not matched, - # respectively. With DOTALL not set, '*' wildcards will not match - # path separators, because the '.' characters in the pattern will - # not match newlines. - part = fnmatch.translate(part)[_FNMATCH_SLICE] - parts.append(part) - # Match the end of the path, always. - parts.append(r'\Z') - flags = re.MULTILINE - if not case_sensitive: - flags |= re.IGNORECASE - return re.compile(''.join(parts), flags=flags) - - -class _Selector: - """A selector matches a specific glob pattern part against the children - of a given path.""" - - def __init__(self, child_parts, flavour, case_sensitive): - self.child_parts = child_parts - if child_parts: - self.successor = _make_selector(child_parts, flavour, case_sensitive) - self.dironly = True - else: - self.successor = _TerminatingSelector() - self.dironly = False - - def select_from(self, parent_path): - """Iterate over all child paths of `parent_path` matched by this - selector. This can contain parent_path itself.""" - path_cls = type(parent_path) - scandir = path_cls._scandir - if not parent_path.is_dir(): - return iter([]) - return self._select_from(parent_path, scandir) - - -class _TerminatingSelector: - - def _select_from(self, parent_path, scandir): - yield parent_path - - -class _ParentSelector(_Selector): - - def __init__(self, name, child_parts, flavour, case_sensitive): - _Selector.__init__(self, child_parts, flavour, case_sensitive) - - def _select_from(self, parent_path, scandir): - path = parent_path._make_child_relpath('..') - for p in self.successor._select_from(path, scandir): - yield p - - -class _WildcardSelector(_Selector): - - def __init__(self, pat, child_parts, flavour, case_sensitive): - _Selector.__init__(self, child_parts, flavour, case_sensitive) - if case_sensitive is None: - # TODO: evaluate case-sensitivity of each directory in _select_from() - case_sensitive = _is_case_sensitive(flavour) - self.match = _compile_pattern(pat, case_sensitive) - - def _select_from(self, parent_path, scandir): - try: - # We must close the scandir() object before proceeding to - # avoid exhausting file descriptors when globbing deep trees. - with scandir(parent_path) as scandir_it: - entries = list(scandir_it) - except OSError: - pass - else: - for entry in entries: - if self.dironly: - try: - if not entry.is_dir(): - continue - except OSError: - continue - name = entry.name - if self.match(name): - path = parent_path._make_child_relpath(name) - for p in self.successor._select_from(path, scandir): - yield p - - -class _RecursiveWildcardSelector(_Selector): - - def __init__(self, pat, child_parts, flavour, case_sensitive): - _Selector.__init__(self, child_parts, flavour, case_sensitive) - - def _iterate_directories(self, parent_path): - yield parent_path - for dirpath, dirnames, _ in parent_path.walk(): - for dirname in dirnames: - yield dirpath._make_child_relpath(dirname) - - def _select_from(self, parent_path, scandir): - successor_select = self.successor._select_from - for starting_point in self._iterate_directories(parent_path): - for p in successor_select(starting_point, scandir): - yield p - - -class _DoubleRecursiveWildcardSelector(_RecursiveWildcardSelector): - """ - Like _RecursiveWildcardSelector, but also de-duplicates results from - successive selectors. This is necessary if the pattern contains - multiple non-adjacent '**' segments. - """ - - def _select_from(self, parent_path, scandir): - yielded = set() - try: - for p in super()._select_from(parent_path, scandir): - if p not in yielded: - yield p - yielded.add(p) - finally: - yielded.clear() - - -# -# Public API -# - -class _PathParents(Sequence): - """This object provides sequence-like access to the logical ancestors - of a path. Don't try to construct it yourself.""" - __slots__ = ('_path', '_drv', '_root', '_tail') - - def __init__(self, path): - self._path = path - self._drv = path.drive - self._root = path.root - self._tail = path._tail - - def __len__(self): - return len(self._tail) - - def __getitem__(self, idx): - if isinstance(idx, slice): - return tuple(self[i] for i in range(*idx.indices(len(self)))) - - if idx >= len(self) or idx < -len(self): - raise IndexError(idx) - if idx < 0: - idx += len(self) - return self._path._from_parsed_parts(self._drv, self._root, - self._tail[:-idx - 1]) - - def __repr__(self): - return "<{}.parents>".format(type(self._path).__name__) - - -class PurePath(object): - """Base class for manipulating paths without I/O. - - PurePath represents a filesystem path and offers operations which - don't imply any actual filesystem I/O. Depending on your system, - instantiating a PurePath will return either a PurePosixPath or a - PureWindowsPath object. You can also instantiate either of these classes - directly, regardless of your system. - """ - - __slots__ = ( - # The `_raw_paths` slot stores unnormalized string paths. This is set - # in the `__init__()` method. - '_raw_paths', - - # The `_drv`, `_root` and `_tail_cached` slots store parsed and - # normalized parts of the path. They are set when any of the `drive`, - # `root` or `_tail` properties are accessed for the first time. The - # three-part division corresponds to the result of - # `os.path.splitroot()`, except that the tail is further split on path - # separators (i.e. it is a list of strings), and that the root and - # tail are normalized. - '_drv', '_root', '_tail_cached', - - # The `_str` slot stores the string representation of the path, - # computed from the drive, root and tail when `__str__()` is called - # for the first time. It's used to implement `_str_normcase` - '_str', - - # The `_str_normcase_cached` slot stores the string path with - # normalized case. It is set when the `_str_normcase` property is - # accessed for the first time. It's used to implement `__eq__()` - # `__hash__()`, and `_parts_normcase` - '_str_normcase_cached', - - # The `_parts_normcase_cached` slot stores the case-normalized - # string path after splitting on path separators. It's set when the - # `_parts_normcase` property is accessed for the first time. It's used - # to implement comparison methods like `__lt__()`. - '_parts_normcase_cached', - - # The `_lines_cached` slot stores the string path with path separators - # and newlines swapped. This is used to implement `match()`. - '_lines_cached', - - # The `_hash` slot stores the hash of the case-normalized string - # path. It's set when `__hash__()` is called for the first time. - '_hash', - ) - _flavour = os.path - - def __new__(cls, *args, **kwargs): - """Construct a PurePath from one or several strings and or existing - PurePath objects. The strings and path objects are combined so as - to yield a canonicalized path, which is incorporated into the - new PurePath object. - """ - if cls is PurePath: - cls = PureWindowsPath if os.name == 'nt' else PurePosixPath - return object.__new__(cls) - - def __reduce__(self): - # Using the parts tuple helps share interned path parts - # when pickling related paths. - return (self.__class__, self.parts) - - def __init__(self, *args): - paths = [] - for arg in args: - if isinstance(arg, PurePath): - if arg._flavour is ntpath and self._flavour is posixpath: - # GH-103631: Convert separators for backwards compatibility. - paths.extend(path.replace('\\', '/') for path in arg._raw_paths) - else: - paths.extend(arg._raw_paths) - else: - try: - path = os.fspath(arg) - except TypeError: - path = arg - if not isinstance(path, str): - raise TypeError( - "argument should be a str or an os.PathLike " - "object where __fspath__ returns a str, " - f"not {type(path).__name__!r}") - paths.append(path) - self._raw_paths = paths - - def with_segments(self, *pathsegments): - """Construct a new path object from any number of path-like objects. - Subclasses may override this method to customize how new path objects - are created from methods like `iterdir()`. - """ - return type(self)(*pathsegments) - - @classmethod - def _parse_path(cls, path): - if not path: - return '', '', [] - sep = cls._flavour.sep - altsep = cls._flavour.altsep - if altsep: - path = path.replace(altsep, sep) - drv, root, rel = cls._flavour.splitroot(path) - if not root and drv.startswith(sep) and not drv.endswith(sep): - drv_parts = drv.split(sep) - if len(drv_parts) == 4 and drv_parts[2] not in '?.': - # e.g. //server/share - root = sep - elif len(drv_parts) == 6: - # e.g. //?/unc/server/share - root = sep - parsed = [sys.intern(str(x)) for x in rel.split(sep) if x and x != '.'] - return drv, root, parsed - - def _load_parts(self): - paths = self._raw_paths - if len(paths) == 0: - path = '' - elif len(paths) == 1: - path = paths[0] - else: - path = self._flavour.join(*paths) - drv, root, tail = self._parse_path(path) - self._drv = drv - self._root = root - self._tail_cached = tail - - def _from_parsed_parts(self, drv, root, tail): - path_str = self._format_parsed_parts(drv, root, tail) - path = self.with_segments(path_str) - path._str = path_str or '.' - path._drv = drv - path._root = root - path._tail_cached = tail - return path - - @classmethod - def _format_parsed_parts(cls, drv, root, tail): - if drv or root: - return drv + root + cls._flavour.sep.join(tail) - elif tail and cls._flavour.splitdrive(tail[0])[0]: - tail = ['.'] + tail - return cls._flavour.sep.join(tail) - - def __str__(self): - """Return the string representation of the path, suitable for - passing to system calls.""" - try: - return self._str - except AttributeError: - self._str = self._format_parsed_parts(self.drive, self.root, - self._tail) or '.' - return self._str - - def __fspath__(self): - return str(self) - - def as_posix(self): - """Return the string representation of the path with forward (/) - slashes.""" - f = self._flavour - return str(self).replace(f.sep, '/') - - def __bytes__(self): - """Return the bytes representation of the path. This is only - recommended to use under Unix.""" - return os.fsencode(self) - - def __repr__(self): - return "{}({!r})".format(self.__class__.__name__, self.as_posix()) - - def as_uri(self): - """Return the path as a 'file' URI.""" - if not self.is_absolute(): - raise ValueError("relative path can't be expressed as a file URI") - - drive = self.drive - if len(drive) == 2 and drive[1] == ':': - # It's a path on a local drive => 'file:///c:/a/b' - prefix = 'file:///' + drive - path = self.as_posix()[2:] - elif drive: - # It's a path on a network drive => 'file://host/share/a/b' - prefix = 'file:' - path = self.as_posix() - else: - # It's a posix path => 'file:///etc/hosts' - prefix = 'file://' - path = str(self) - return prefix + urlquote_from_bytes(os.fsencode(path)) - - @property - def _str_normcase(self): - # String with normalized case, for hashing and equality checks - try: - return self._str_normcase_cached - except AttributeError: - if _is_case_sensitive(self._flavour): - self._str_normcase_cached = str(self) - else: - self._str_normcase_cached = str(self).lower() - return self._str_normcase_cached - - @property - def _parts_normcase(self): - # Cached parts with normalized case, for comparisons. - try: - return self._parts_normcase_cached - except AttributeError: - self._parts_normcase_cached = self._str_normcase.split(self._flavour.sep) - return self._parts_normcase_cached - - @property - def _lines(self): - # Path with separators and newlines swapped, for pattern matching. - try: - return self._lines_cached - except AttributeError: - path_str = str(self) - if path_str == '.': - self._lines_cached = '' - else: - trans = _SWAP_SEP_AND_NEWLINE[self._flavour.sep] - self._lines_cached = path_str.translate(trans) - return self._lines_cached - - def __eq__(self, other): - if not isinstance(other, PurePath): - return NotImplemented - return self._str_normcase == other._str_normcase and self._flavour is other._flavour - - def __hash__(self): - try: - return self._hash - except AttributeError: - self._hash = hash(self._str_normcase) - return self._hash - - def __lt__(self, other): - if not isinstance(other, PurePath) or self._flavour is not other._flavour: - return NotImplemented - return self._parts_normcase < other._parts_normcase - - def __le__(self, other): - if not isinstance(other, PurePath) or self._flavour is not other._flavour: - return NotImplemented - return self._parts_normcase <= other._parts_normcase - - def __gt__(self, other): - if not isinstance(other, PurePath) or self._flavour is not other._flavour: - return NotImplemented - return self._parts_normcase > other._parts_normcase - - def __ge__(self, other): - if not isinstance(other, PurePath) or self._flavour is not other._flavour: - return NotImplemented - return self._parts_normcase >= other._parts_normcase - - @property - def drive(self): - """The drive prefix (letter or UNC path), if any.""" - try: - return self._drv - except AttributeError: - self._load_parts() - return self._drv - - @property - def root(self): - """The root of the path, if any.""" - try: - return self._root - except AttributeError: - self._load_parts() - return self._root - - @property - def _tail(self): - try: - return self._tail_cached - except AttributeError: - self._load_parts() - return self._tail_cached - - @property - def anchor(self): - """The concatenation of the drive and root, or ''.""" - anchor = self.drive + self.root - return anchor - - @property - def name(self): - """The final path component, if any.""" - tail = self._tail - if not tail: - return '' - return tail[-1] - - @property - def suffix(self): - """ - The final component's last suffix, if any. - - This includes the leading period. For example: '.txt' - """ - name = self.name - i = name.rfind('.') - if 0 < i < len(name) - 1: - return name[i:] - else: - return '' - - @property - def suffixes(self): - """ - A list of the final component's suffixes, if any. - - These include the leading periods. For example: ['.tar', '.gz'] - """ - name = self.name - if name.endswith('.'): - return [] - name = name.lstrip('.') - return ['.' + suffix for suffix in name.split('.')[1:]] - - @property - def stem(self): - """The final path component, minus its last suffix.""" - name = self.name - i = name.rfind('.') - if 0 < i < len(name) - 1: - return name[:i] - else: - return name - - def with_name(self, name): - """Return a new path with the file name changed.""" - if not self.name: - raise ValueError("%r has an empty name" % (self,)) - f = self._flavour - drv, root, tail = f.splitroot(name) - if drv or root or not tail or f.sep in tail or (f.altsep and f.altsep in tail): - raise ValueError("Invalid name %r" % (name)) - return self._from_parsed_parts(self.drive, self.root, - self._tail[:-1] + [name]) - - def with_stem(self, stem): - """Return a new path with the stem changed.""" - return self.with_name(stem + self.suffix) - - def with_suffix(self, suffix): - """Return a new path with the file suffix changed. If the path - has no suffix, add given suffix. If the given suffix is an empty - string, remove the suffix from the path. - """ - f = self._flavour - if f.sep in suffix or f.altsep and f.altsep in suffix: - raise ValueError("Invalid suffix %r" % (suffix,)) - if suffix and not suffix.startswith('.') or suffix == '.': - raise ValueError("Invalid suffix %r" % (suffix)) - name = self.name - if not name: - raise ValueError("%r has an empty name" % (self,)) - old_suffix = self.suffix - if not old_suffix: - name = name + suffix - else: - name = name[:-len(old_suffix)] + suffix - return self._from_parsed_parts(self.drive, self.root, - self._tail[:-1] + [name]) - - def relative_to(self, other, /, *_deprecated, walk_up=False): - """Return the relative path to another path identified by the passed - arguments. If the operation is not possible (because this is not - related to the other path), raise ValueError. - - The *walk_up* parameter controls whether `..` may be used to resolve - the path. - """ - if _deprecated: - msg = ("support for supplying more than one positional argument " - "to pathlib.PurePath.relative_to() is deprecated and " - "scheduled for removal in Python {remove}") - warnings._deprecated("pathlib.PurePath.relative_to(*args)", msg, - remove=(3, 14)) - other = self.with_segments(other, *_deprecated) - for step, path in enumerate([other] + list(other.parents)): - if self.is_relative_to(path): - break - elif not walk_up: - raise ValueError(f"{str(self)!r} is not in the subpath of {str(other)!r}") - elif path.name == '..': - raise ValueError(f"'..' segment in {str(other)!r} cannot be walked") - else: - raise ValueError(f"{str(self)!r} and {str(other)!r} have different anchors") - parts = ['..'] * step + self._tail[len(path._tail):] - return self.with_segments(*parts) - - def is_relative_to(self, other, /, *_deprecated): - """Return True if the path is relative to another path or False. - """ - if _deprecated: - msg = ("support for supplying more than one argument to " - "pathlib.PurePath.is_relative_to() is deprecated and " - "scheduled for removal in Python {remove}") - warnings._deprecated("pathlib.PurePath.is_relative_to(*args)", - msg, remove=(3, 14)) - other = self.with_segments(other, *_deprecated) - return other == self or other in self.parents - - @property - def parts(self): - """An object providing sequence-like access to the - components in the filesystem path.""" - if self.drive or self.root: - return (self.drive + self.root,) + tuple(self._tail) - else: - return tuple(self._tail) - - def joinpath(self, *pathsegments): - """Combine this path with one or several arguments, and return a - new path representing either a subpath (if all arguments are relative - paths) or a totally different path (if one of the arguments is - anchored). - """ - return self.with_segments(self, *pathsegments) - - def __truediv__(self, key): - try: - return self.joinpath(key) - except TypeError: - return NotImplemented - - def __rtruediv__(self, key): - try: - return self.with_segments(key, self) - except TypeError: - return NotImplemented - - @property - def parent(self): - """The logical parent of the path.""" - drv = self.drive - root = self.root - tail = self._tail - if not tail: - return self - return self._from_parsed_parts(drv, root, tail[:-1]) - - @property - def parents(self): - """A sequence of this path's logical parents.""" - # The value of this property should not be cached on the path object, - # as doing so would introduce a reference cycle. - return _PathParents(self) - - def is_absolute(self): - """True if the path is absolute (has both a root and, if applicable, - a drive).""" - if self._flavour is ntpath: - # ntpath.isabs() is defective - see GH-44626. - return bool(self.drive and self.root) - elif self._flavour is posixpath: - # Optimization: work with raw paths on POSIX. - for path in self._raw_paths: - if path.startswith('/'): - return True - return False - else: - return self._flavour.isabs(str(self)) - - def is_reserved(self): - """Return True if the path contains one of the special names reserved - by the system, if any.""" - if self._flavour is posixpath or not self._tail: - return False - - # NOTE: the rules for reserved names seem somewhat complicated - # (e.g. r"..\NUL" is reserved but not r"foo\NUL" if "foo" does not - # exist). We err on the side of caution and return True for paths - # which are not considered reserved by Windows. - if self.drive.startswith('\\\\'): - # UNC paths are never reserved. - return False - name = self._tail[-1].partition('.')[0].partition(':')[0].rstrip(' ') - return name.upper() in _WIN_RESERVED_NAMES - - def match(self, path_pattern, *, case_sensitive=None): - """ - Return True if this path matches the given pattern. - """ - if not isinstance(path_pattern, PurePath): - path_pattern = self.with_segments(path_pattern) - if case_sensitive is None: - case_sensitive = _is_case_sensitive(self._flavour) - pattern = _compile_pattern_lines(path_pattern._lines, case_sensitive) - if path_pattern.drive or path_pattern.root: - return pattern.match(self._lines) is not None - elif path_pattern._tail: - return pattern.search(self._lines) is not None - else: - raise ValueError("empty pattern") - - -# Can't subclass os.PathLike from PurePath and keep the constructor -# optimizations in PurePath.__slots__. -os.PathLike.register(PurePath) - - -class PurePosixPath(PurePath): - """PurePath subclass for non-Windows systems. - - On a POSIX system, instantiating a PurePath should return this object. - However, you can also instantiate it directly on any system. - """ - _flavour = posixpath - __slots__ = () - - -class PureWindowsPath(PurePath): - """PurePath subclass for Windows systems. - - On a Windows system, instantiating a PurePath should return this object. - However, you can also instantiate it directly on any system. - """ - _flavour = ntpath - __slots__ = () - - -# Filesystem-accessing classes - - -class Path(PurePath): - """PurePath subclass that can make system calls. - - Path represents a filesystem path but unlike PurePath, also offers - methods to do system calls on path objects. Depending on your system, - instantiating a Path will return either a PosixPath or a WindowsPath - object. You can also instantiate a PosixPath or WindowsPath directly, - but cannot instantiate a WindowsPath on a POSIX system or vice versa. - """ - __slots__ = () - - def stat(self, *, follow_symlinks=True): - """ - Return the result of the stat() system call on this path, like - os.stat() does. - """ - return os.stat(self, follow_symlinks=follow_symlinks) - - def lstat(self): - """ - Like stat(), except if the path points to a symlink, the symlink's - status information is returned, rather than its target's. - """ - return self.stat(follow_symlinks=False) - - - # Convenience functions for querying the stat results - - def exists(self, *, follow_symlinks=True): - """ - Whether this path exists. - - This method normally follows symlinks; to check whether a symlink exists, - add the argument follow_symlinks=False. - """ - try: - self.stat(follow_symlinks=follow_symlinks) - except OSError as e: - if not _ignore_error(e): - raise - return False - except ValueError: - # Non-encodable path - return False - return True - - def is_dir(self): - """ - Whether this path is a directory. - """ - try: - return S_ISDIR(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def is_file(self): - """ - Whether this path is a regular file (also True for symlinks pointing - to regular files). - """ - try: - return S_ISREG(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def is_mount(self): - """ - Check if this path is a mount point - """ - return self._flavour.ismount(self) - - def is_symlink(self): - """ - Whether this path is a symbolic link. - """ - try: - return S_ISLNK(self.lstat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist - return False - except ValueError: - # Non-encodable path - return False - - def is_junction(self): - """ - Whether this path is a junction. - """ - return self._flavour.isjunction(self) - - def is_block_device(self): - """ - Whether this path is a block device. - """ - try: - return S_ISBLK(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def is_char_device(self): - """ - Whether this path is a character device. - """ - try: - return S_ISCHR(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def is_fifo(self): - """ - Whether this path is a FIFO. - """ - try: - return S_ISFIFO(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def is_socket(self): - """ - Whether this path is a socket. - """ - try: - return S_ISSOCK(self.stat().st_mode) - except OSError as e: - if not _ignore_error(e): - raise - # Path doesn't exist or is a broken symlink - # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) - return False - except ValueError: - # Non-encodable path - return False - - def samefile(self, other_path): - """Return whether other_path is the same or not as this file - (as returned by os.path.samefile()). - """ - st = self.stat() - try: - other_st = other_path.stat() - except AttributeError: - other_st = self.with_segments(other_path).stat() - return self._flavour.samestat(st, other_st) - - def open(self, mode='r', buffering=-1, encoding=None, - errors=None, newline=None): - """ - Open the file pointed by this path and return a file object, as - the built-in open() function does. - """ - if "b" not in mode: - encoding = io.text_encoding(encoding) - return io.open(self, mode, buffering, encoding, errors, newline) - - def read_bytes(self): - """ - Open the file in bytes mode, read it, and close the file. - """ - with self.open(mode='rb') as f: - return f.read() - - def read_text(self, encoding=None, errors=None): - """ - Open the file in text mode, read it, and close the file. - """ - encoding = io.text_encoding(encoding) - with self.open(mode='r', encoding=encoding, errors=errors) as f: - return f.read() - - def write_bytes(self, data): - """ - Open the file in bytes mode, write to it, and close the file. - """ - # type-check for the buffer interface before truncating the file - view = memoryview(data) - with self.open(mode='wb') as f: - return f.write(view) - - def write_text(self, data, encoding=None, errors=None, newline=None): - """ - Open the file in text mode, write to it, and close the file. - """ - if not isinstance(data, str): - raise TypeError('data must be str, not %s' % - data.__class__.__name__) - encoding = io.text_encoding(encoding) - with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f: - return f.write(data) - - def iterdir(self): - """Yield path objects of the directory contents. - - The children are yielded in arbitrary order, and the - special entries '.' and '..' are not included. - """ - for name in os.listdir(self): - yield self._make_child_relpath(name) - - def _scandir(self): - # bpo-24132: a future version of pathlib will support subclassing of - # pathlib.Path to customize how the filesystem is accessed. This - # includes scandir(), which is used to implement glob(). - return os.scandir(self) - - def _make_child_relpath(self, name): - path_str = str(self) - tail = self._tail - if tail: - path_str = f'{path_str}{self._flavour.sep}{name}' - elif path_str != '.': - path_str = f'{path_str}{name}' - else: - path_str = name - path = self.with_segments(path_str) - path._str = path_str - path._drv = self.drive - path._root = self.root - path._tail_cached = tail + [name] - return path - - def glob(self, pattern, *, case_sensitive=None): - """Iterate over this subtree and yield all existing files (of any - kind, including directories) matching the given relative pattern. - """ - sys.audit("pathlib.Path.glob", self, pattern) - if not pattern: - raise ValueError("Unacceptable pattern: {!r}".format(pattern)) - drv, root, pattern_parts = self._parse_path(pattern) - if drv or root: - raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') - selector = _make_selector(tuple(pattern_parts), self._flavour, case_sensitive) - for p in selector.select_from(self): - yield p - - def rglob(self, pattern, *, case_sensitive=None): - """Recursively yield all existing files (of any kind, including - directories) matching the given relative pattern, anywhere in - this subtree. - """ - sys.audit("pathlib.Path.rglob", self, pattern) - drv, root, pattern_parts = self._parse_path(pattern) - if drv or root: - raise NotImplementedError("Non-relative patterns are unsupported") - if pattern and pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') - selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour, case_sensitive) - for p in selector.select_from(self): - yield p - - def walk(self, top_down=True, on_error=None, follow_symlinks=False): - """Walk the directory tree from this directory, similar to os.walk().""" - sys.audit("pathlib.Path.walk", self, on_error, follow_symlinks) - paths = [self] - - while paths: - path = paths.pop() - if isinstance(path, tuple): - yield path - continue - - # We may not have read permission for self, in which case we can't - # get a list of the files the directory contains. os.walk() - # always suppressed the exception in that instance, rather than - # blow up for a minor reason when (say) a thousand readable - # directories are still left to visit. That logic is copied here. - try: - scandir_it = path._scandir() - except OSError as error: - if on_error is not None: - on_error(error) - continue - - with scandir_it: - dirnames = [] - filenames = [] - for entry in scandir_it: - try: - is_dir = entry.is_dir(follow_symlinks=follow_symlinks) - except OSError: - # Carried over from os.path.isdir(). - is_dir = False - - if is_dir: - dirnames.append(entry.name) - else: - filenames.append(entry.name) - - if top_down: - yield path, dirnames, filenames - else: - paths.append((path, dirnames, filenames)) - - paths += [path._make_child_relpath(d) for d in reversed(dirnames)] - - def __init__(self, *args, **kwargs): - if kwargs: - msg = ("support for supplying keyword arguments to pathlib.PurePath " - "is deprecated and scheduled for removal in Python {remove}") - warnings._deprecated("pathlib.PurePath(**kwargs)", msg, remove=(3, 14)) - super().__init__(*args) - - def __new__(cls, *args, **kwargs): - if cls is Path: - cls = WindowsPath if os.name == 'nt' else PosixPath - return object.__new__(cls) - - def __enter__(self): - # In previous versions of pathlib, __exit__() marked this path as - # closed; subsequent attempts to perform I/O would raise an IOError. - # This functionality was never documented, and had the effect of - # making Path objects mutable, contrary to PEP 428. - # In Python 3.9 __exit__() was made a no-op. - # In Python 3.11 __enter__() began emitting DeprecationWarning. - # In Python 3.13 __enter__() and __exit__() should be removed. - warnings.warn("pathlib.Path.__enter__() is deprecated and scheduled " - "for removal in Python 3.13; Path objects as a context " - "manager is a no-op", - DeprecationWarning, stacklevel=2) - return self - - def __exit__(self, t, v, tb): - pass - - # Public API - - @classmethod - def cwd(cls): - """Return a new path pointing to the current working directory.""" - # We call 'absolute()' rather than using 'os.getcwd()' directly to - # enable users to replace the implementation of 'absolute()' in a - # subclass and benefit from the new behaviour here. This works because - # os.path.abspath('.') == os.getcwd(). - return cls().absolute() - - @classmethod - def home(cls): - """Return a new path pointing to the user's home directory (as - returned by os.path.expanduser('~')). - """ - return cls("~").expanduser() - - def absolute(self): - """Return an absolute version of this path by prepending the current - working directory. No normalization or symlink resolution is performed. - - Use resolve() to get the canonical path to a file. - """ - if self.is_absolute(): - return self - elif self.drive: - # There is a CWD on each drive-letter drive. - cwd = self._flavour.abspath(self.drive) - else: - cwd = os.getcwd() - # Fast path for "empty" paths, e.g. Path("."), Path("") or Path(). - # We pass only one argument to with_segments() to avoid the cost - # of joining, and we exploit the fact that getcwd() returns a - # fully-normalized string by storing it in _str. This is used to - # implement Path.cwd(). - if not self.root and not self._tail: - result = self.with_segments(cwd) - result._str = cwd - return result - return self.with_segments(cwd, self) - - def resolve(self, strict=False): - """ - Make the path absolute, resolving all symlinks on the way and also - normalizing it. - """ - - def check_eloop(e): - winerror = getattr(e, 'winerror', 0) - if e.errno == ELOOP or winerror == _WINERROR_CANT_RESOLVE_FILENAME: - raise RuntimeError("Symlink loop from %r" % e.filename) - - try: - s = self._flavour.realpath(self, strict=strict) - except OSError as e: - check_eloop(e) - raise - p = self.with_segments(s) - - # In non-strict mode, realpath() doesn't raise on symlink loops. - # Ensure we get an exception by calling stat() - if not strict: - try: - p.stat() - except OSError as e: - check_eloop(e) - return p - - def owner(self): - """ - Return the login name of the file owner. - """ - try: - import pwd - return pwd.getpwuid(self.stat().st_uid).pw_name - except ImportError: - raise NotImplementedError("Path.owner() is unsupported on this system") - - def group(self): - """ - Return the group name of the file gid. - """ - - try: - import grp - return grp.getgrgid(self.stat().st_gid).gr_name - except ImportError: - raise NotImplementedError("Path.group() is unsupported on this system") - - def readlink(self): - """ - Return the path to which the symbolic link points. - """ - if not hasattr(os, "readlink"): - raise NotImplementedError("os.readlink() not available on this system") - return self.with_segments(os.readlink(self)) - - def touch(self, mode=0o666, exist_ok=True): - """ - Create this file with the given access mode, if it doesn't exist. - """ - - if exist_ok: - # First try to bump modification time - # Implementation note: GNU touch uses the UTIME_NOW option of - # the utimensat() / futimens() functions. - try: - os.utime(self, None) - except OSError: - # Avoid exception chaining - pass - else: - return - flags = os.O_CREAT | os.O_WRONLY - if not exist_ok: - flags |= os.O_EXCL - fd = os.open(self, flags, mode) - os.close(fd) - - def mkdir(self, mode=0o777, parents=False, exist_ok=False): - """ - Create a new directory at this given path. - """ - try: - os.mkdir(self, mode) - except FileNotFoundError: - if not parents or self.parent == self: - raise - self.parent.mkdir(parents=True, exist_ok=True) - self.mkdir(mode, parents=False, exist_ok=exist_ok) - except OSError: - # Cannot rely on checking for EEXIST, since the operating system - # could give priority to other errors like EACCES or EROFS - if not exist_ok or not self.is_dir(): - raise - - def chmod(self, mode, *, follow_symlinks=True): - """ - Change the permissions of the path, like os.chmod(). - """ - os.chmod(self, mode, follow_symlinks=follow_symlinks) - - def lchmod(self, mode): - """ - Like chmod(), except if the path points to a symlink, the symlink's - permissions are changed, rather than its target's. - """ - self.chmod(mode, follow_symlinks=False) - - def unlink(self, missing_ok=False): - """ - Remove this file or link. - If the path is a directory, use rmdir() instead. - """ - try: - os.unlink(self) - except FileNotFoundError: - if not missing_ok: - raise - - def rmdir(self): - """ - Remove this directory. The directory must be empty. - """ - os.rmdir(self) - - def rename(self, target): - """ - Rename this path to the target path. - - The target path may be absolute or relative. Relative paths are - interpreted relative to the current working directory, *not* the - directory of the Path object. - - Returns the new Path instance pointing to the target path. - """ - os.rename(self, target) - return self.with_segments(target) - - def replace(self, target): - """ - Rename this path to the target path, overwriting if that path exists. - - The target path may be absolute or relative. Relative paths are - interpreted relative to the current working directory, *not* the - directory of the Path object. - - Returns the new Path instance pointing to the target path. - """ - os.replace(self, target) - return self.with_segments(target) - - def symlink_to(self, target, target_is_directory=False): - """ - Make this path a symlink pointing to the target path. - Note the order of arguments (link, target) is the reverse of os.symlink. - """ - if not hasattr(os, "symlink"): - raise NotImplementedError("os.symlink() not available on this system") - os.symlink(target, self, target_is_directory) - - def hardlink_to(self, target): - """ - Make this path a hard link pointing to the same file as *target*. - - Note the order of arguments (self, target) is the reverse of os.link's. - """ - if not hasattr(os, "link"): - raise NotImplementedError("os.link() not available on this system") - os.link(target, self) - - def expanduser(self): - """ Return a new path with expanded ~ and ~user constructs - (as returned by os.path.expanduser) - """ - if (not (self.drive or self.root) and - self._tail and self._tail[0][:1] == '~'): - homedir = self._flavour.expanduser(self._tail[0]) - if homedir[:1] == "~": - raise RuntimeError("Could not determine home directory.") - drv, root, tail = self._parse_path(homedir) - return self._from_parsed_parts(drv, root, tail + self._tail[1:]) - - return self - - -class PosixPath(Path, PurePosixPath): - """Path subclass for non-Windows systems. - - On a POSIX system, instantiating a Path should return this object. - """ - __slots__ = () - - if os.name == 'nt': - def __new__(cls, *args, **kwargs): - raise NotImplementedError( - f"cannot instantiate {cls.__name__!r} on your system") - -class WindowsPath(Path, PureWindowsPath): - """Path subclass for Windows systems. - - On a Windows system, instantiating a Path should return this object. - """ - __slots__ = () - - if os.name != 'nt': - def __new__(cls, *args, **kwargs): - raise NotImplementedError( - f"cannot instantiate {cls.__name__!r} on your system") diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py new file mode 100644 index 00000000..4b3edf53 --- /dev/null +++ b/Lib/pathlib/__init__.py @@ -0,0 +1,12 @@ +"""Object-oriented filesystem paths. + +This module provides classes to represent abstract paths and concrete +paths with operations that have semantics appropriate for different +operating systems. +""" + +from ._abc import * +from ._local import * + +__all__ = (_abc.__all__ + + _local.__all__) diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py new file mode 100644 index 00000000..4d24146a --- /dev/null +++ b/Lib/pathlib/_abc.py @@ -0,0 +1,930 @@ +""" +Abstract base classes for rich path objects. + +This module is published as a PyPI package called "pathlib-abc". + +This module is also a *PRIVATE* part of the Python standard library, where +it's developed alongside pathlib. If it finds success and maturity as a PyPI +package, it could become a public part of the standard library. + +Two base classes are defined here -- PurePathBase and PathBase -- that +resemble pathlib's PurePath and Path respectively. +""" + +import functools +from glob import _Globber, _no_recurse_symlinks +from errno import ENOENT, ENOTDIR, EBADF, ELOOP, EINVAL +from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO + + +__all__ = ["UnsupportedOperation"] + +# +# Internals +# + +_WINERROR_NOT_READY = 21 # drive exists but is not accessible +_WINERROR_INVALID_NAME = 123 # fix for bpo-35306 +_WINERROR_CANT_RESOLVE_FILENAME = 1921 # broken symlink pointing to itself + +# EBADF - guard against macOS `stat` throwing EBADF +_IGNORED_ERRNOS = (ENOENT, ENOTDIR, EBADF, ELOOP) + +_IGNORED_WINERRORS = ( + _WINERROR_NOT_READY, + _WINERROR_INVALID_NAME, + _WINERROR_CANT_RESOLVE_FILENAME) + +def _ignore_error(exception): + return (getattr(exception, 'errno', None) in _IGNORED_ERRNOS or + getattr(exception, 'winerror', None) in _IGNORED_WINERRORS) + + +@functools.cache +def _is_case_sensitive(parser): + return parser.normcase('Aa') == 'Aa' + + +class UnsupportedOperation(NotImplementedError): + """An exception that is raised when an unsupported operation is called on + a path object. + """ + pass + + +class ParserBase: + """Base class for path parsers, which do low-level path manipulation. + + Path parsers provide a subset of the os.path API, specifically those + functions needed to provide PurePathBase functionality. Each PurePathBase + subclass references its path parser via a 'parser' class attribute. + + Every method in this base class raises an UnsupportedOperation exception. + """ + + @classmethod + def _unsupported_msg(cls, attribute): + return f"{cls.__name__}.{attribute} is unsupported" + + @property + def sep(self): + """The character used to separate path components.""" + raise UnsupportedOperation(self._unsupported_msg('sep')) + + def join(self, path, *paths): + """Join path segments.""" + raise UnsupportedOperation(self._unsupported_msg('join()')) + + def split(self, path): + """Split the path into a pair (head, tail), where *head* is everything + before the final path separator, and *tail* is everything after. + Either part may be empty. + """ + raise UnsupportedOperation(self._unsupported_msg('split()')) + + def splitdrive(self, path): + """Split the path into a 2-item tuple (drive, tail), where *drive* is + a device name or mount point, and *tail* is everything after the + drive. Either part may be empty.""" + raise UnsupportedOperation(self._unsupported_msg('splitdrive()')) + + def normcase(self, path): + """Normalize the case of the path.""" + raise UnsupportedOperation(self._unsupported_msg('normcase()')) + + def isabs(self, path): + """Returns whether the path is absolute, i.e. unaffected by the + current directory or drive.""" + raise UnsupportedOperation(self._unsupported_msg('isabs()')) + + +class PurePathBase: + """Base class for pure path objects. + + This class *does not* provide several magic methods that are defined in + its subclass PurePath. They are: __fspath__, __bytes__, __reduce__, + __hash__, __eq__, __lt__, __le__, __gt__, __ge__. Its initializer and path + joining methods accept only strings, not os.PathLike objects more broadly. + """ + + __slots__ = ( + # The `_raw_path` slot store a joined string path. This is set in the + # `__init__()` method. + '_raw_path', + + # The '_resolving' slot stores a boolean indicating whether the path + # is being processed by `PathBase.resolve()`. This prevents duplicate + # work from occurring when `resolve()` calls `stat()` or `readlink()`. + '_resolving', + ) + parser = ParserBase() + _globber = _Globber + + def __init__(self, path, *paths): + self._raw_path = self.parser.join(path, *paths) if paths else path + if not isinstance(self._raw_path, str): + raise TypeError( + f"path should be a str, not {type(self._raw_path).__name__!r}") + self._resolving = False + + def with_segments(self, *pathsegments): + """Construct a new path object from any number of path-like objects. + Subclasses may override this method to customize how new path objects + are created from methods like `iterdir()`. + """ + return type(self)(*pathsegments) + + def __str__(self): + """Return the string representation of the path, suitable for + passing to system calls.""" + return self._raw_path + + def as_posix(self): + """Return the string representation of the path with forward (/) + slashes.""" + return str(self).replace(self.parser.sep, '/') + + @property + def drive(self): + """The drive prefix (letter or UNC path), if any.""" + return self.parser.splitdrive(self.anchor)[0] + + @property + def root(self): + """The root of the path, if any.""" + return self.parser.splitdrive(self.anchor)[1] + + @property + def anchor(self): + """The concatenation of the drive and root, or ''.""" + return self._stack[0] + + @property + def name(self): + """The final path component, if any.""" + return self.parser.split(self._raw_path)[1] + + @property + def suffix(self): + """ + The final component's last suffix, if any. + + This includes the leading period. For example: '.txt' + """ + name = self.name + i = name.rfind('.') + if 0 < i < len(name) - 1: + return name[i:] + else: + return '' + + @property + def suffixes(self): + """ + A list of the final component's suffixes, if any. + + These include the leading periods. For example: ['.tar', '.gz'] + """ + name = self.name + if name.endswith('.'): + return [] + name = name.lstrip('.') + return ['.' + suffix for suffix in name.split('.')[1:]] + + @property + def stem(self): + """The final path component, minus its last suffix.""" + name = self.name + i = name.rfind('.') + if 0 < i < len(name) - 1: + return name[:i] + else: + return name + + def with_name(self, name): + """Return a new path with the file name changed.""" + split = self.parser.split + if split(name)[0]: + raise ValueError(f"Invalid name {name!r}") + return self.with_segments(split(self._raw_path)[0], name) + + def with_stem(self, stem): + """Return a new path with the stem changed.""" + suffix = self.suffix + if not suffix: + return self.with_name(stem) + elif not stem: + # If the suffix is non-empty, we can't make the stem empty. + raise ValueError(f"{self!r} has a non-empty suffix") + else: + return self.with_name(stem + suffix) + + def with_suffix(self, suffix): + """Return a new path with the file suffix changed. If the path + has no suffix, add given suffix. If the given suffix is an empty + string, remove the suffix from the path. + """ + stem = self.stem + if not stem: + # If the stem is empty, we can't make the suffix non-empty. + raise ValueError(f"{self!r} has an empty name") + elif suffix and not (suffix.startswith('.') and len(suffix) > 1): + raise ValueError(f"Invalid suffix {suffix!r}") + else: + return self.with_name(stem + suffix) + + def relative_to(self, other, *, walk_up=False): + """Return the relative path to another path identified by the passed + arguments. If the operation is not possible (because this is not + related to the other path), raise ValueError. + + The *walk_up* parameter controls whether `..` may be used to resolve + the path. + """ + if not isinstance(other, PurePathBase): + other = self.with_segments(other) + anchor0, parts0 = self._stack + anchor1, parts1 = other._stack + if anchor0 != anchor1: + raise ValueError(f"{self._raw_path!r} and {other._raw_path!r} have different anchors") + while parts0 and parts1 and parts0[-1] == parts1[-1]: + parts0.pop() + parts1.pop() + for part in parts1: + if not part or part == '.': + pass + elif not walk_up: + raise ValueError(f"{self._raw_path!r} is not in the subpath of {other._raw_path!r}") + elif part == '..': + raise ValueError(f"'..' segment in {other._raw_path!r} cannot be walked") + else: + parts0.append('..') + return self.with_segments('', *reversed(parts0)) + + def is_relative_to(self, other): + """Return True if the path is relative to another path or False. + """ + if not isinstance(other, PurePathBase): + other = self.with_segments(other) + anchor0, parts0 = self._stack + anchor1, parts1 = other._stack + if anchor0 != anchor1: + return False + while parts0 and parts1 and parts0[-1] == parts1[-1]: + parts0.pop() + parts1.pop() + for part in parts1: + if part and part != '.': + return False + return True + + @property + def parts(self): + """An object providing sequence-like access to the + components in the filesystem path.""" + anchor, parts = self._stack + if anchor: + parts.append(anchor) + return tuple(reversed(parts)) + + def joinpath(self, *pathsegments): + """Combine this path with one or several arguments, and return a + new path representing either a subpath (if all arguments are relative + paths) or a totally different path (if one of the arguments is + anchored). + """ + return self.with_segments(self._raw_path, *pathsegments) + + def __truediv__(self, key): + try: + return self.with_segments(self._raw_path, key) + except TypeError: + return NotImplemented + + def __rtruediv__(self, key): + try: + return self.with_segments(key, self._raw_path) + except TypeError: + return NotImplemented + + @property + def _stack(self): + """ + Split the path into a 2-tuple (anchor, parts), where *anchor* is the + uppermost parent of the path (equivalent to path.parents[-1]), and + *parts* is a reversed list of parts following the anchor. + """ + split = self.parser.split + path = self._raw_path + parent, name = split(path) + names = [] + while path != parent: + names.append(name) + path = parent + parent, name = split(path) + return path, names + + @property + def parent(self): + """The logical parent of the path.""" + path = self._raw_path + parent = self.parser.split(path)[0] + if path != parent: + parent = self.with_segments(parent) + parent._resolving = self._resolving + return parent + return self + + @property + def parents(self): + """A sequence of this path's logical parents.""" + split = self.parser.split + path = self._raw_path + parent = split(path)[0] + parents = [] + while path != parent: + parents.append(self.with_segments(parent)) + path = parent + parent = split(path)[0] + return tuple(parents) + + def is_absolute(self): + """True if the path is absolute (has both a root and, if applicable, + a drive).""" + return self.parser.isabs(self._raw_path) + + @property + def _pattern_str(self): + """The path expressed as a string, for use in pattern-matching.""" + return str(self) + + def match(self, path_pattern, *, case_sensitive=None): + """ + Return True if this path matches the given pattern. If the pattern is + relative, matching is done from the right; otherwise, the entire path + is matched. The recursive wildcard '**' is *not* supported by this + method. + """ + if not isinstance(path_pattern, PurePathBase): + path_pattern = self.with_segments(path_pattern) + if case_sensitive is None: + case_sensitive = _is_case_sensitive(self.parser) + sep = path_pattern.parser.sep + path_parts = self.parts[::-1] + pattern_parts = path_pattern.parts[::-1] + if not pattern_parts: + raise ValueError("empty pattern") + if len(path_parts) < len(pattern_parts): + return False + if len(path_parts) > len(pattern_parts) and path_pattern.anchor: + return False + globber = self._globber(sep, case_sensitive) + for path_part, pattern_part in zip(path_parts, pattern_parts): + match = globber.compile(pattern_part) + if match(path_part) is None: + return False + return True + + def full_match(self, pattern, *, case_sensitive=None): + """ + Return True if this path matches the given glob-style pattern. The + pattern is matched against the entire path. + """ + if not isinstance(pattern, PurePathBase): + pattern = self.with_segments(pattern) + if case_sensitive is None: + case_sensitive = _is_case_sensitive(self.parser) + globber = self._globber(pattern.parser.sep, case_sensitive, recursive=True) + match = globber.compile(pattern._pattern_str) + return match(self._pattern_str) is not None + + + +class PathBase(PurePathBase): + """Base class for concrete path objects. + + This class provides dummy implementations for many methods that derived + classes can override selectively; the default implementations raise + UnsupportedOperation. The most basic methods, such as stat() and open(), + directly raise UnsupportedOperation; these basic methods are called by + other methods such as is_dir() and read_text(). + + The Path class derives this class to implement local filesystem paths. + Users may derive their own classes to implement virtual filesystem paths, + such as paths in archive files or on remote storage systems. + """ + __slots__ = () + + # Maximum number of symlinks to follow in resolve() + _max_symlinks = 40 + + @classmethod + def _unsupported_msg(cls, attribute): + return f"{cls.__name__}.{attribute} is unsupported" + + def stat(self, *, follow_symlinks=True): + """ + Return the result of the stat() system call on this path, like + os.stat() does. + """ + raise UnsupportedOperation(self._unsupported_msg('stat()')) + + def lstat(self): + """ + Like stat(), except if the path points to a symlink, the symlink's + status information is returned, rather than its target's. + """ + return self.stat(follow_symlinks=False) + + + # Convenience functions for querying the stat results + + def exists(self, *, follow_symlinks=True): + """ + Whether this path exists. + + This method normally follows symlinks; to check whether a symlink exists, + add the argument follow_symlinks=False. + """ + try: + self.stat(follow_symlinks=follow_symlinks) + except OSError as e: + if not _ignore_error(e): + raise + return False + except ValueError: + # Non-encodable path + return False + return True + + def is_dir(self, *, follow_symlinks=True): + """ + Whether this path is a directory. + """ + try: + return S_ISDIR(self.stat(follow_symlinks=follow_symlinks).st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def is_file(self, *, follow_symlinks=True): + """ + Whether this path is a regular file (also True for symlinks pointing + to regular files). + """ + try: + return S_ISREG(self.stat(follow_symlinks=follow_symlinks).st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def is_mount(self): + """ + Check if this path is a mount point + """ + # Need to exist and be a dir + if not self.exists() or not self.is_dir(): + return False + + try: + parent_dev = self.parent.stat().st_dev + except OSError: + return False + + dev = self.stat().st_dev + if dev != parent_dev: + return True + ino = self.stat().st_ino + parent_ino = self.parent.stat().st_ino + return ino == parent_ino + + def is_symlink(self): + """ + Whether this path is a symbolic link. + """ + try: + return S_ISLNK(self.lstat().st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist + return False + except ValueError: + # Non-encodable path + return False + + def is_junction(self): + """ + Whether this path is a junction. + """ + # Junctions are a Windows-only feature, not present in POSIX nor the + # majority of virtual filesystems. There is no cross-platform idiom + # to check for junctions (using stat().st_mode). + return False + + def is_block_device(self): + """ + Whether this path is a block device. + """ + try: + return S_ISBLK(self.stat().st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def is_char_device(self): + """ + Whether this path is a character device. + """ + try: + return S_ISCHR(self.stat().st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def is_fifo(self): + """ + Whether this path is a FIFO. + """ + try: + return S_ISFIFO(self.stat().st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def is_socket(self): + """ + Whether this path is a socket. + """ + try: + return S_ISSOCK(self.stat().st_mode) + except OSError as e: + if not _ignore_error(e): + raise + # Path doesn't exist or is a broken symlink + # (see http://web.archive.org/web/20200623061726/https://bitbucket.org/pitrou/pathlib/issues/12/ ) + return False + except ValueError: + # Non-encodable path + return False + + def samefile(self, other_path): + """Return whether other_path is the same or not as this file + (as returned by os.path.samefile()). + """ + st = self.stat() + try: + other_st = other_path.stat() + except AttributeError: + other_st = self.with_segments(other_path).stat() + return (st.st_ino == other_st.st_ino and + st.st_dev == other_st.st_dev) + + def open(self, mode='r', buffering=-1, encoding=None, + errors=None, newline=None): + """ + Open the file pointed to by this path and return a file object, as + the built-in open() function does. + """ + raise UnsupportedOperation(self._unsupported_msg('open()')) + + def read_bytes(self): + """ + Open the file in bytes mode, read it, and close the file. + """ + with self.open(mode='rb') as f: + return f.read() + + def read_text(self, encoding=None, errors=None, newline=None): + """ + Open the file in text mode, read it, and close the file. + """ + with self.open(mode='r', encoding=encoding, errors=errors, newline=newline) as f: + return f.read() + + def write_bytes(self, data): + """ + Open the file in bytes mode, write to it, and close the file. + """ + # type-check for the buffer interface before truncating the file + view = memoryview(data) + with self.open(mode='wb') as f: + return f.write(view) + + def write_text(self, data, encoding=None, errors=None, newline=None): + """ + Open the file in text mode, write to it, and close the file. + """ + if not isinstance(data, str): + raise TypeError('data must be str, not %s' % + data.__class__.__name__) + with self.open(mode='w', encoding=encoding, errors=errors, newline=newline) as f: + return f.write(data) + + def iterdir(self): + """Yield path objects of the directory contents. + + The children are yielded in arbitrary order, and the + special entries '.' and '..' are not included. + """ + raise UnsupportedOperation(self._unsupported_msg('iterdir()')) + + def _glob_selector(self, parts, case_sensitive, recurse_symlinks): + if case_sensitive is None: + case_sensitive = _is_case_sensitive(self.parser) + case_pedantic = False + else: + # The user has expressed a case sensitivity choice, but we don't + # know the case sensitivity of the underlying filesystem, so we + # must use scandir() for everything, including non-wildcard parts. + case_pedantic = True + recursive = True if recurse_symlinks else _no_recurse_symlinks + globber = self._globber(self.parser.sep, case_sensitive, case_pedantic, recursive) + return globber.selector(parts) + + def glob(self, pattern, *, case_sensitive=None, recurse_symlinks=True): + """Iterate over this subtree and yield all existing files (of any + kind, including directories) matching the given relative pattern. + """ + if not isinstance(pattern, PurePathBase): + pattern = self.with_segments(pattern) + anchor, parts = pattern._stack + if anchor: + raise NotImplementedError("Non-relative patterns are unsupported") + select = self._glob_selector(parts, case_sensitive, recurse_symlinks) + return select(self) + + def rglob(self, pattern, *, case_sensitive=None, recurse_symlinks=True): + """Recursively yield all existing files (of any kind, including + directories) matching the given relative pattern, anywhere in + this subtree. + """ + if not isinstance(pattern, PurePathBase): + pattern = self.with_segments(pattern) + pattern = '**' / pattern + return self.glob(pattern, case_sensitive=case_sensitive, recurse_symlinks=recurse_symlinks) + + def walk(self, top_down=True, on_error=None, follow_symlinks=False): + """Walk the directory tree from this directory, similar to os.walk().""" + paths = [self] + while paths: + path = paths.pop() + if isinstance(path, tuple): + yield path + continue + dirnames = [] + filenames = [] + if not top_down: + paths.append((path, dirnames, filenames)) + try: + for child in path.iterdir(): + try: + if child.is_dir(follow_symlinks=follow_symlinks): + if not top_down: + paths.append(child) + dirnames.append(child.name) + else: + filenames.append(child.name) + except OSError: + filenames.append(child.name) + except OSError as error: + if on_error is not None: + on_error(error) + if not top_down: + while not isinstance(paths.pop(), tuple): + pass + continue + if top_down: + yield path, dirnames, filenames + paths += [path.joinpath(d) for d in reversed(dirnames)] + + def absolute(self): + """Return an absolute version of this path + No normalization or symlink resolution is performed. + + Use resolve() to resolve symlinks and remove '..' segments. + """ + raise UnsupportedOperation(self._unsupported_msg('absolute()')) + + @classmethod + def cwd(cls): + """Return a new path pointing to the current working directory.""" + # We call 'absolute()' rather than using 'os.getcwd()' directly to + # enable users to replace the implementation of 'absolute()' in a + # subclass and benefit from the new behaviour here. This works because + # os.path.abspath('.') == os.getcwd(). + return cls('').absolute() + + def expanduser(self): + """ Return a new path with expanded ~ and ~user constructs + (as returned by os.path.expanduser) + """ + raise UnsupportedOperation(self._unsupported_msg('expanduser()')) + + @classmethod + def home(cls): + """Return a new path pointing to expanduser('~'). + """ + return cls("~").expanduser() + + def readlink(self): + """ + Return the path to which the symbolic link points. + """ + raise UnsupportedOperation(self._unsupported_msg('readlink()')) + readlink._supported = False + + def resolve(self, strict=False): + """ + Make the path absolute, resolving all symlinks on the way and also + normalizing it. + """ + if self._resolving: + return self + path_root, parts = self._stack + path = self.with_segments(path_root) + try: + path = path.absolute() + except UnsupportedOperation: + path_tail = [] + else: + path_root, path_tail = path._stack + path_tail.reverse() + + # If the user has *not* overridden the `readlink()` method, then symlinks are unsupported + # and (in non-strict mode) we can improve performance by not calling `stat()`. + querying = strict or getattr(self.readlink, '_supported', True) + link_count = 0 + while parts: + part = parts.pop() + if not part or part == '.': + continue + if part == '..': + if not path_tail: + if path_root: + # Delete '..' segment immediately following root + continue + elif path_tail[-1] != '..': + # Delete '..' segment and its predecessor + path_tail.pop() + continue + path_tail.append(part) + if querying and part != '..': + path = self.with_segments(path_root + self.parser.sep.join(path_tail)) + path._resolving = True + try: + st = path.stat(follow_symlinks=False) + if S_ISLNK(st.st_mode): + # Like Linux and macOS, raise OSError(errno.ELOOP) if too many symlinks are + # encountered during resolution. + link_count += 1 + if link_count >= self._max_symlinks: + raise OSError(ELOOP, "Too many symbolic links in path", self._raw_path) + target_root, target_parts = path.readlink()._stack + # If the symlink target is absolute (like '/etc/hosts'), set the current + # path to its uppermost parent (like '/'). + if target_root: + path_root = target_root + path_tail.clear() + else: + path_tail.pop() + # Add the symlink target's reversed tail parts (like ['hosts', 'etc']) to + # the stack of unresolved path parts. + parts.extend(target_parts) + continue + elif parts and not S_ISDIR(st.st_mode): + raise NotADirectoryError(ENOTDIR, "Not a directory", self._raw_path) + except OSError: + if strict: + raise + else: + querying = False + return self.with_segments(path_root + self.parser.sep.join(path_tail)) + + def symlink_to(self, target, target_is_directory=False): + """ + Make this path a symlink pointing to the target path. + Note the order of arguments (link, target) is the reverse of os.symlink. + """ + raise UnsupportedOperation(self._unsupported_msg('symlink_to()')) + + def hardlink_to(self, target): + """ + Make this path a hard link pointing to the same file as *target*. + + Note the order of arguments (self, target) is the reverse of os.link's. + """ + raise UnsupportedOperation(self._unsupported_msg('hardlink_to()')) + + def touch(self, mode=0o666, exist_ok=True): + """ + Create this file with the given access mode, if it doesn't exist. + """ + raise UnsupportedOperation(self._unsupported_msg('touch()')) + + def mkdir(self, mode=0o777, parents=False, exist_ok=False): + """ + Create a new directory at this given path. + """ + raise UnsupportedOperation(self._unsupported_msg('mkdir()')) + + def rename(self, target): + """ + Rename this path to the target path. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. + """ + raise UnsupportedOperation(self._unsupported_msg('rename()')) + + def replace(self, target): + """ + Rename this path to the target path, overwriting if that path exists. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. + """ + raise UnsupportedOperation(self._unsupported_msg('replace()')) + + def chmod(self, mode, *, follow_symlinks=True): + """ + Change the permissions of the path, like os.chmod(). + """ + raise UnsupportedOperation(self._unsupported_msg('chmod()')) + + def lchmod(self, mode): + """ + Like chmod(), except if the path points to a symlink, the symlink's + permissions are changed, rather than its target's. + """ + self.chmod(mode, follow_symlinks=False) + + def unlink(self, missing_ok=False): + """ + Remove this file or link. + If the path is a directory, use rmdir() instead. + """ + raise UnsupportedOperation(self._unsupported_msg('unlink()')) + + def rmdir(self): + """ + Remove this directory. The directory must be empty. + """ + raise UnsupportedOperation(self._unsupported_msg('rmdir()')) + + def owner(self, *, follow_symlinks=True): + """ + Return the login name of the file owner. + """ + raise UnsupportedOperation(self._unsupported_msg('owner()')) + + def group(self, *, follow_symlinks=True): + """ + Return the group name of the file gid. + """ + raise UnsupportedOperation(self._unsupported_msg('group()')) + + @classmethod + def from_uri(cls, uri): + """Return a new path from the given 'file' URI.""" + raise UnsupportedOperation(cls._unsupported_msg('from_uri()')) + + def as_uri(self): + """Return the path as a URI.""" + raise UnsupportedOperation(self._unsupported_msg('as_uri()')) diff --git a/Lib/pathlib/_local.py b/Lib/pathlib/_local.py new file mode 100644 index 00000000..0188e7c7 --- /dev/null +++ b/Lib/pathlib/_local.py @@ -0,0 +1,861 @@ +import io +import ntpath +import operator +import os +import posixpath +import sys +import warnings +from glob import _StringGlobber +from itertools import chain +from _collections_abc import Sequence + +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None + +from ._abc import UnsupportedOperation, PurePathBase, PathBase + + +__all__ = [ + "PurePath", "PurePosixPath", "PureWindowsPath", + "Path", "PosixPath", "WindowsPath", + ] + + +class _PathParents(Sequence): + """This object provides sequence-like access to the logical ancestors + of a path. Don't try to construct it yourself.""" + __slots__ = ('_path', '_drv', '_root', '_tail') + + def __init__(self, path): + self._path = path + self._drv = path.drive + self._root = path.root + self._tail = path._tail + + def __len__(self): + return len(self._tail) + + def __getitem__(self, idx): + if isinstance(idx, slice): + return tuple(self[i] for i in range(*idx.indices(len(self)))) + + if idx >= len(self) or idx < -len(self): + raise IndexError(idx) + if idx < 0: + idx += len(self) + return self._path._from_parsed_parts(self._drv, self._root, + self._tail[:-idx - 1]) + + def __repr__(self): + return "<{}.parents>".format(type(self._path).__name__) + + +class PurePath(PurePathBase): + """Base class for manipulating paths without I/O. + + PurePath represents a filesystem path and offers operations which + don't imply any actual filesystem I/O. Depending on your system, + instantiating a PurePath will return either a PurePosixPath or a + PureWindowsPath object. You can also instantiate either of these classes + directly, regardless of your system. + """ + + __slots__ = ( + # The `_raw_paths` slot stores unnormalized string paths. This is set + # in the `__init__()` method. + '_raw_paths', + + # The `_drv`, `_root` and `_tail_cached` slots store parsed and + # normalized parts of the path. They are set when any of the `drive`, + # `root` or `_tail` properties are accessed for the first time. The + # three-part division corresponds to the result of + # `os.path.splitroot()`, except that the tail is further split on path + # separators (i.e. it is a list of strings), and that the root and + # tail are normalized. + '_drv', '_root', '_tail_cached', + + # The `_str` slot stores the string representation of the path, + # computed from the drive, root and tail when `__str__()` is called + # for the first time. It's used to implement `_str_normcase` + '_str', + + # The `_str_normcase_cached` slot stores the string path with + # normalized case. It is set when the `_str_normcase` property is + # accessed for the first time. It's used to implement `__eq__()` + # `__hash__()`, and `_parts_normcase` + '_str_normcase_cached', + + # The `_parts_normcase_cached` slot stores the case-normalized + # string path after splitting on path separators. It's set when the + # `_parts_normcase` property is accessed for the first time. It's used + # to implement comparison methods like `__lt__()`. + '_parts_normcase_cached', + + # The `_hash` slot stores the hash of the case-normalized string + # path. It's set when `__hash__()` is called for the first time. + '_hash', + ) + parser = os.path + _globber = _StringGlobber + + def __new__(cls, *args, **kwargs): + """Construct a PurePath from one or several strings and or existing + PurePath objects. The strings and path objects are combined so as + to yield a canonicalized path, which is incorporated into the + new PurePath object. + """ + if cls is PurePath: + cls = PureWindowsPath if os.name == 'nt' else PurePosixPath + return object.__new__(cls) + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg.parser is not self.parser: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): + raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") + paths.append(path) + # Avoid calling super().__init__, as an optimisation + self._raw_paths = paths + + def joinpath(self, *pathsegments): + """Combine this path with one or several arguments, and return a + new path representing either a subpath (if all arguments are relative + paths) or a totally different path (if one of the arguments is + anchored). + """ + return self.with_segments(self, *pathsegments) + + def __truediv__(self, key): + try: + return self.with_segments(self, key) + except TypeError: + return NotImplemented + + def __rtruediv__(self, key): + try: + return self.with_segments(key, self) + except TypeError: + return NotImplemented + + def __reduce__(self): + return self.__class__, tuple(self._raw_paths) + + def __repr__(self): + return "{}({!r})".format(self.__class__.__name__, self.as_posix()) + + def __fspath__(self): + return str(self) + + def __bytes__(self): + """Return the bytes representation of the path. This is only + recommended to use under Unix.""" + return os.fsencode(self) + + @property + def _str_normcase(self): + # String with normalized case, for hashing and equality checks + try: + return self._str_normcase_cached + except AttributeError: + if self.parser is posixpath: + self._str_normcase_cached = str(self) + else: + self._str_normcase_cached = str(self).lower() + return self._str_normcase_cached + + def __hash__(self): + try: + return self._hash + except AttributeError: + self._hash = hash(self._str_normcase) + return self._hash + + def __eq__(self, other): + if not isinstance(other, PurePath): + return NotImplemented + return self._str_normcase == other._str_normcase and self.parser is other.parser + + @property + def _parts_normcase(self): + # Cached parts with normalized case, for comparisons. + try: + return self._parts_normcase_cached + except AttributeError: + self._parts_normcase_cached = self._str_normcase.split(self.parser.sep) + return self._parts_normcase_cached + + def __lt__(self, other): + if not isinstance(other, PurePath) or self.parser is not other.parser: + return NotImplemented + return self._parts_normcase < other._parts_normcase + + def __le__(self, other): + if not isinstance(other, PurePath) or self.parser is not other.parser: + return NotImplemented + return self._parts_normcase <= other._parts_normcase + + def __gt__(self, other): + if not isinstance(other, PurePath) or self.parser is not other.parser: + return NotImplemented + return self._parts_normcase > other._parts_normcase + + def __ge__(self, other): + if not isinstance(other, PurePath) or self.parser is not other.parser: + return NotImplemented + return self._parts_normcase >= other._parts_normcase + + def __str__(self): + """Return the string representation of the path, suitable for + passing to system calls.""" + try: + return self._str + except AttributeError: + self._str = self._format_parsed_parts(self.drive, self.root, + self._tail) or '.' + return self._str + + @classmethod + def _format_parsed_parts(cls, drv, root, tail): + if drv or root: + return drv + root + cls.parser.sep.join(tail) + elif tail and cls.parser.splitdrive(tail[0])[0]: + tail = ['.'] + tail + return cls.parser.sep.join(tail) + + def _from_parsed_parts(self, drv, root, tail): + path = self._from_parsed_string(self._format_parsed_parts(drv, root, tail)) + path._drv = drv + path._root = root + path._tail_cached = tail + return path + + def _from_parsed_string(self, path_str): + path = self.with_segments(path_str) + path._str = path_str or '.' + return path + + @classmethod + def _parse_path(cls, path): + if not path: + return '', '', [] + sep = cls.parser.sep + altsep = cls.parser.altsep + if altsep: + path = path.replace(altsep, sep) + drv, root, rel = cls.parser.splitroot(path) + if not root and drv.startswith(sep) and not drv.endswith(sep): + drv_parts = drv.split(sep) + if len(drv_parts) == 4 and drv_parts[2] not in '?.': + # e.g. //server/share + root = sep + elif len(drv_parts) == 6: + # e.g. //?/unc/server/share + root = sep + parsed = [sys.intern(str(x)) for x in rel.split(sep) if x and x != '.'] + return drv, root, parsed + + @property + def _raw_path(self): + """The joined but unnormalized path.""" + paths = self._raw_paths + if len(paths) == 0: + path = '' + elif len(paths) == 1: + path = paths[0] + else: + path = self.parser.join(*paths) + return path + + @property + def drive(self): + """The drive prefix (letter or UNC path), if any.""" + try: + return self._drv + except AttributeError: + self._drv, self._root, self._tail_cached = self._parse_path(self._raw_path) + return self._drv + + @property + def root(self): + """The root of the path, if any.""" + try: + return self._root + except AttributeError: + self._drv, self._root, self._tail_cached = self._parse_path(self._raw_path) + return self._root + + @property + def _tail(self): + try: + return self._tail_cached + except AttributeError: + self._drv, self._root, self._tail_cached = self._parse_path(self._raw_path) + return self._tail_cached + + @property + def anchor(self): + """The concatenation of the drive and root, or ''.""" + return self.drive + self.root + + @property + def parts(self): + """An object providing sequence-like access to the + components in the filesystem path.""" + if self.drive or self.root: + return (self.drive + self.root,) + tuple(self._tail) + else: + return tuple(self._tail) + + @property + def parent(self): + """The logical parent of the path.""" + drv = self.drive + root = self.root + tail = self._tail + if not tail: + return self + return self._from_parsed_parts(drv, root, tail[:-1]) + + @property + def parents(self): + """A sequence of this path's logical parents.""" + # The value of this property should not be cached on the path object, + # as doing so would introduce a reference cycle. + return _PathParents(self) + + @property + def name(self): + """The final path component, if any.""" + tail = self._tail + if not tail: + return '' + return tail[-1] + + def with_name(self, name): + """Return a new path with the file name changed.""" + p = self.parser + if not name or p.sep in name or (p.altsep and p.altsep in name) or name == '.': + raise ValueError(f"Invalid name {name!r}") + tail = self._tail.copy() + if not tail: + raise ValueError(f"{self!r} has an empty name") + tail[-1] = name + return self._from_parsed_parts(self.drive, self.root, tail) + + def relative_to(self, other, /, *_deprecated, walk_up=False): + """Return the relative path to another path identified by the passed + arguments. If the operation is not possible (because this is not + related to the other path), raise ValueError. + + The *walk_up* parameter controls whether `..` may be used to resolve + the path. + """ + if _deprecated: + msg = ("support for supplying more than one positional argument " + "to pathlib.PurePath.relative_to() is deprecated and " + "scheduled for removal in Python 3.14") + warnings.warn(msg, DeprecationWarning, stacklevel=2) + other = self.with_segments(other, *_deprecated) + elif not isinstance(other, PurePath): + other = self.with_segments(other) + for step, path in enumerate(chain([other], other.parents)): + if path == self or path in self.parents: + break + elif not walk_up: + raise ValueError(f"{str(self)!r} is not in the subpath of {str(other)!r}") + elif path.name == '..': + raise ValueError(f"'..' segment in {str(other)!r} cannot be walked") + else: + raise ValueError(f"{str(self)!r} and {str(other)!r} have different anchors") + parts = ['..'] * step + self._tail[len(path._tail):] + return self._from_parsed_parts('', '', parts) + + def is_relative_to(self, other, /, *_deprecated): + """Return True if the path is relative to another path or False. + """ + if _deprecated: + msg = ("support for supplying more than one argument to " + "pathlib.PurePath.is_relative_to() is deprecated and " + "scheduled for removal in Python 3.14") + warnings.warn(msg, DeprecationWarning, stacklevel=2) + other = self.with_segments(other, *_deprecated) + elif not isinstance(other, PurePath): + other = self.with_segments(other) + return other == self or other in self.parents + + def is_absolute(self): + """True if the path is absolute (has both a root and, if applicable, + a drive).""" + if self.parser is posixpath: + # Optimization: work with raw paths on POSIX. + for path in self._raw_paths: + if path.startswith('/'): + return True + return False + return self.parser.isabs(self) + + def is_reserved(self): + """Return True if the path contains one of the special names reserved + by the system, if any.""" + msg = ("pathlib.PurePath.is_reserved() is deprecated and scheduled " + "for removal in Python 3.15. Use os.path.isreserved() to " + "detect reserved paths on Windows.") + warnings.warn(msg, DeprecationWarning, stacklevel=2) + if self.parser is ntpath: + return self.parser.isreserved(self) + return False + + def as_uri(self): + """Return the path as a URI.""" + if not self.is_absolute(): + raise ValueError("relative path can't be expressed as a file URI") + + drive = self.drive + if len(drive) == 2 and drive[1] == ':': + # It's a path on a local drive => 'file:///c:/a/b' + prefix = 'file:///' + drive + path = self.as_posix()[2:] + elif drive: + # It's a path on a network drive => 'file://host/share/a/b' + prefix = 'file:' + path = self.as_posix() + else: + # It's a posix path => 'file:///etc/hosts' + prefix = 'file://' + path = str(self) + from urllib.parse import quote_from_bytes + return prefix + quote_from_bytes(os.fsencode(path)) + + @property + def _pattern_str(self): + """The path expressed as a string, for use in pattern-matching.""" + # The string representation of an empty path is a single dot ('.'). Empty + # paths shouldn't match wildcards, so we change it to the empty string. + path_str = str(self) + return '' if path_str == '.' else path_str + +# Subclassing os.PathLike makes isinstance() checks slower, +# which in turn makes Path construction slower. Register instead! +os.PathLike.register(PurePath) + + +class PurePosixPath(PurePath): + """PurePath subclass for non-Windows systems. + + On a POSIX system, instantiating a PurePath should return this object. + However, you can also instantiate it directly on any system. + """ + parser = posixpath + __slots__ = () + + +class PureWindowsPath(PurePath): + """PurePath subclass for Windows systems. + + On a Windows system, instantiating a PurePath should return this object. + However, you can also instantiate it directly on any system. + """ + parser = ntpath + __slots__ = () + + +class Path(PathBase, PurePath): + """PurePath subclass that can make system calls. + + Path represents a filesystem path but unlike PurePath, also offers + methods to do system calls on path objects. Depending on your system, + instantiating a Path will return either a PosixPath or a WindowsPath + object. You can also instantiate a PosixPath or WindowsPath directly, + but cannot instantiate a WindowsPath on a POSIX system or vice versa. + """ + __slots__ = () + as_uri = PurePath.as_uri + + @classmethod + def _unsupported_msg(cls, attribute): + return f"{cls.__name__}.{attribute} is unsupported on this system" + + def __init__(self, *args, **kwargs): + if kwargs: + msg = ("support for supplying keyword arguments to pathlib.PurePath " + "is deprecated and scheduled for removal in Python {remove}") + warnings._deprecated("pathlib.PurePath(**kwargs)", msg, remove=(3, 14)) + super().__init__(*args) + + def __new__(cls, *args, **kwargs): + if cls is Path: + cls = WindowsPath if os.name == 'nt' else PosixPath + return object.__new__(cls) + + def stat(self, *, follow_symlinks=True): + """ + Return the result of the stat() system call on this path, like + os.stat() does. + """ + return os.stat(self, follow_symlinks=follow_symlinks) + + def is_mount(self): + """ + Check if this path is a mount point + """ + return os.path.ismount(self) + + def is_junction(self): + """ + Whether this path is a junction. + """ + return os.path.isjunction(self) + + def open(self, mode='r', buffering=-1, encoding=None, + errors=None, newline=None): + """ + Open the file pointed to by this path and return a file object, as + the built-in open() function does. + """ + if "b" not in mode: + encoding = io.text_encoding(encoding) + return io.open(self, mode, buffering, encoding, errors, newline) + + def read_text(self, encoding=None, errors=None, newline=None): + """ + Open the file in text mode, read it, and close the file. + """ + # Call io.text_encoding() here to ensure any warning is raised at an + # appropriate stack level. + encoding = io.text_encoding(encoding) + return PathBase.read_text(self, encoding, errors, newline) + + def write_text(self, data, encoding=None, errors=None, newline=None): + """ + Open the file in text mode, write to it, and close the file. + """ + # Call io.text_encoding() here to ensure any warning is raised at an + # appropriate stack level. + encoding = io.text_encoding(encoding) + return PathBase.write_text(self, data, encoding, errors, newline) + + _remove_leading_dot = operator.itemgetter(slice(2, None)) + _remove_trailing_slash = operator.itemgetter(slice(-1)) + + def _filter_trailing_slash(self, paths): + sep = self.parser.sep + anchor_len = len(self.anchor) + for path_str in paths: + if len(path_str) > anchor_len and path_str[-1] == sep: + path_str = path_str[:-1] + yield path_str + + def iterdir(self): + """Yield path objects of the directory contents. + + The children are yielded in arbitrary order, and the + special entries '.' and '..' are not included. + """ + root_dir = str(self) + with os.scandir(root_dir) as scandir_it: + paths = [entry.path for entry in scandir_it] + if root_dir == '.': + paths = map(self._remove_leading_dot, paths) + return map(self._from_parsed_string, paths) + + def glob(self, pattern, *, case_sensitive=None, recurse_symlinks=False): + """Iterate over this subtree and yield all existing files (of any + kind, including directories) matching the given relative pattern. + """ + sys.audit("pathlib.Path.glob", self, pattern) + if not isinstance(pattern, PurePath): + pattern = self.with_segments(pattern) + if pattern.anchor: + raise NotImplementedError("Non-relative patterns are unsupported") + parts = pattern._tail.copy() + if not parts: + raise ValueError("Unacceptable pattern: {!r}".format(pattern)) + raw = pattern._raw_path + if raw[-1] in (self.parser.sep, self.parser.altsep): + # GH-65238: pathlib doesn't preserve trailing slash. Add it back. + parts.append('') + select = self._glob_selector(parts[::-1], case_sensitive, recurse_symlinks) + root = str(self) + paths = select(root) + + # Normalize results + if root == '.': + paths = map(self._remove_leading_dot, paths) + if parts[-1] == '': + paths = map(self._remove_trailing_slash, paths) + elif parts[-1] == '**': + paths = self._filter_trailing_slash(paths) + paths = map(self._from_parsed_string, paths) + return paths + + def rglob(self, pattern, *, case_sensitive=None, recurse_symlinks=False): + """Recursively yield all existing files (of any kind, including + directories) matching the given relative pattern, anywhere in + this subtree. + """ + sys.audit("pathlib.Path.rglob", self, pattern) + if not isinstance(pattern, PurePath): + pattern = self.with_segments(pattern) + pattern = '**' / pattern + return self.glob(pattern, case_sensitive=case_sensitive, recurse_symlinks=recurse_symlinks) + + def walk(self, top_down=True, on_error=None, follow_symlinks=False): + """Walk the directory tree from this directory, similar to os.walk().""" + sys.audit("pathlib.Path.walk", self, on_error, follow_symlinks) + root_dir = str(self) + if not follow_symlinks: + follow_symlinks = os._walk_symlinks_as_files + results = os.walk(root_dir, top_down, on_error, follow_symlinks) + for path_str, dirnames, filenames in results: + if root_dir == '.': + path_str = path_str[2:] + yield self._from_parsed_string(path_str), dirnames, filenames + + def absolute(self): + """Return an absolute version of this path + No normalization or symlink resolution is performed. + + Use resolve() to resolve symlinks and remove '..' segments. + """ + if self.is_absolute(): + return self + if self.root: + drive = os.path.splitroot(os.getcwd())[0] + return self._from_parsed_parts(drive, self.root, self._tail) + if self.drive: + # There is a CWD on each drive-letter drive. + cwd = os.path.abspath(self.drive) + else: + cwd = os.getcwd() + if not self._tail: + # Fast path for "empty" paths, e.g. Path("."), Path("") or Path(). + # We pass only one argument to with_segments() to avoid the cost + # of joining, and we exploit the fact that getcwd() returns a + # fully-normalized string by storing it in _str. This is used to + # implement Path.cwd(). + return self._from_parsed_string(cwd) + drive, root, rel = os.path.splitroot(cwd) + if not rel: + return self._from_parsed_parts(drive, root, self._tail) + tail = rel.split(self.parser.sep) + tail.extend(self._tail) + return self._from_parsed_parts(drive, root, tail) + + def resolve(self, strict=False): + """ + Make the path absolute, resolving all symlinks on the way and also + normalizing it. + """ + + return self.with_segments(os.path.realpath(self, strict=strict)) + + if pwd: + def owner(self, *, follow_symlinks=True): + """ + Return the login name of the file owner. + """ + uid = self.stat(follow_symlinks=follow_symlinks).st_uid + return pwd.getpwuid(uid).pw_name + + if grp: + def group(self, *, follow_symlinks=True): + """ + Return the group name of the file gid. + """ + gid = self.stat(follow_symlinks=follow_symlinks).st_gid + return grp.getgrgid(gid).gr_name + + if hasattr(os, "readlink"): + def readlink(self): + """ + Return the path to which the symbolic link points. + """ + return self.with_segments(os.readlink(self)) + + def touch(self, mode=0o666, exist_ok=True): + """ + Create this file with the given access mode, if it doesn't exist. + """ + + if exist_ok: + # First try to bump modification time + # Implementation note: GNU touch uses the UTIME_NOW option of + # the utimensat() / futimens() functions. + try: + os.utime(self, None) + except OSError: + # Avoid exception chaining + pass + else: + return + flags = os.O_CREAT | os.O_WRONLY + if not exist_ok: + flags |= os.O_EXCL + fd = os.open(self, flags, mode) + os.close(fd) + + def mkdir(self, mode=0o777, parents=False, exist_ok=False): + """ + Create a new directory at this given path. + """ + try: + os.mkdir(self, mode) + except FileNotFoundError: + if not parents or self.parent == self: + raise + self.parent.mkdir(parents=True, exist_ok=True) + self.mkdir(mode, parents=False, exist_ok=exist_ok) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not self.is_dir(): + raise + + def chmod(self, mode, *, follow_symlinks=True): + """ + Change the permissions of the path, like os.chmod(). + """ + os.chmod(self, mode, follow_symlinks=follow_symlinks) + + def unlink(self, missing_ok=False): + """ + Remove this file or link. + If the path is a directory, use rmdir() instead. + """ + try: + os.unlink(self) + except FileNotFoundError: + if not missing_ok: + raise + + def rmdir(self): + """ + Remove this directory. The directory must be empty. + """ + os.rmdir(self) + + def rename(self, target): + """ + Rename this path to the target path. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. + """ + os.rename(self, target) + return self.with_segments(target) + + def replace(self, target): + """ + Rename this path to the target path, overwriting if that path exists. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. + """ + os.replace(self, target) + return self.with_segments(target) + + if hasattr(os, "symlink"): + def symlink_to(self, target, target_is_directory=False): + """ + Make this path a symlink pointing to the target path. + Note the order of arguments (link, target) is the reverse of os.symlink. + """ + os.symlink(target, self, target_is_directory) + + if hasattr(os, "link"): + def hardlink_to(self, target): + """ + Make this path a hard link pointing to the same file as *target*. + + Note the order of arguments (self, target) is the reverse of os.link's. + """ + os.link(target, self) + + def expanduser(self): + """ Return a new path with expanded ~ and ~user constructs + (as returned by os.path.expanduser) + """ + if (not (self.drive or self.root) and + self._tail and self._tail[0][:1] == '~'): + homedir = os.path.expanduser(self._tail[0]) + if homedir[:1] == "~": + raise RuntimeError("Could not determine home directory.") + drv, root, tail = self._parse_path(homedir) + return self._from_parsed_parts(drv, root, tail + self._tail[1:]) + + return self + + @classmethod + def from_uri(cls, uri): + """Return a new path from the given 'file' URI.""" + if not uri.startswith('file:'): + raise ValueError(f"URI does not start with 'file:': {uri!r}") + path = uri[5:] + if path[:3] == '///': + # Remove empty authority + path = path[2:] + elif path[:12] == '//localhost/': + # Remove 'localhost' authority + path = path[11:] + if path[:3] == '///' or (path[:1] == '/' and path[2:3] in ':|'): + # Remove slash before DOS device/UNC path + path = path[1:] + if path[1:2] == '|': + # Replace bar with colon in DOS drive + path = path[:1] + ':' + path[2:] + from urllib.parse import unquote_to_bytes + path = cls(os.fsdecode(unquote_to_bytes(path))) + if not path.is_absolute(): + raise ValueError(f"URI is not absolute: {uri!r}") + return path + + +class PosixPath(Path, PurePosixPath): + """Path subclass for non-Windows systems. + + On a POSIX system, instantiating a Path should return this object. + """ + __slots__ = () + + if os.name == 'nt': + def __new__(cls, *args, **kwargs): + raise UnsupportedOperation( + f"cannot instantiate {cls.__name__!r} on your system") + +class WindowsPath(Path, PureWindowsPath): + """Path subclass for Windows systems. + + On a Windows system, instantiating a Path should return this object. + """ + __slots__ = () + + if os.name != 'nt': + def __new__(cls, *args, **kwargs): + raise UnsupportedOperation( + f"cannot instantiate {cls.__name__!r} on your system") diff --git a/Lib/pdb.py b/Lib/pdb.py index 6b6feac1..9b6dffda 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -76,15 +76,22 @@ import bdb import dis import code import glob +import token +import types +import codeop import pprint import signal import inspect +import textwrap import tokenize -import functools +import itertools import traceback import linecache +import _colorize -from typing import Union +from contextlib import contextmanager +from rlcompleter import Completer +from types import CodeType class Restart(Exception): @@ -94,17 +101,53 @@ class Restart(Exception): __all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace", "post_mortem", "help"] + +def find_first_executable_line(code): + """ Try to find the first executable line of the code object. + + Equivalently, find the line number of the instruction that's + after RESUME + + Return code.co_firstlineno if no executable line is found. + """ + prev = None + for instr in dis.get_instructions(code): + if prev is not None and prev.opname == 'RESUME': + if instr.positions.lineno is not None: + return instr.positions.lineno + return code.co_firstlineno + prev = instr + return code.co_firstlineno + def find_function(funcname, filename): - cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname)) + cre = re.compile(r'def\s+%s(\s*\[.+\])?\s*[(]' % re.escape(funcname)) try: fp = tokenize.open(filename) except OSError: - return None + lines = linecache.getlines(filename) + if not lines: + return None + fp = io.StringIO(''.join(lines)) + funcdef = "" + funcstart = None # consumer of this info expects the first line to be 1 with fp: for lineno, line in enumerate(fp, start=1): if cre.match(line): - return funcname, filename, lineno + funcstart, funcdef = lineno, line + elif funcdef: + funcdef += line + + if funcdef: + try: + code = compile(funcdef, filename, 'exec') + except SyntaxError: + continue + # We should always be able to find the code object here + funccode = next(c for c in code.co_consts if + isinstance(c, CodeType) and c.co_name == funcname) + lineno_offset = find_first_executable_line(funccode) + return funcname, filename, funcstart + lineno_offset - 1 return None def lasti2lineno(code, lasti): @@ -122,68 +165,113 @@ class _rstr(str): return self -class _ScriptTarget(str): - def __new__(cls, val): - # Mutate self to be the "real path". - res = super().__new__(cls, os.path.realpath(val)) +class _ExecutableTarget: + filename: str + code: CodeType | str + namespace: dict - # Store the original path for error reporting. - res.orig = val - return res +class _ScriptTarget(_ExecutableTarget): + def __init__(self, target): + self._target = os.path.realpath(target) - def check(self): - if not os.path.exists(self): - print('Error:', self.orig, 'does not exist') + if not os.path.exists(self._target): + print(f'Error: {target} does not exist') + sys.exit(1) + if os.path.isdir(self._target): + print(f'Error: {target} is a directory') sys.exit(1) - # Replace pdb's dir with script's dir in front of module search path. - sys.path[0] = os.path.dirname(self) + # If safe_path(-P) is not set, sys.path[0] is the directory + # of pdb, and we should replace it with the directory of the script + if not sys.flags.safe_path: + sys.path[0] = os.path.dirname(self._target) + + def __repr__(self): + return self._target @property def filename(self): - return self + return self._target + + @property + def code(self): + # Open the file each time because the file may be modified + with io.open_code(self._target) as fp: + return f"exec(compile({fp.read()!r}, {self._target!r}, 'exec'))" @property def namespace(self): return dict( __name__='__main__', - __file__=self, + __file__=self._target, __builtins__=__builtins__, + __spec__=None, ) - @property - def code(self): - with io.open_code(self) as fp: - return f"exec(compile({fp.read()!r}, {self!r}, 'exec'))" +class _ModuleTarget(_ExecutableTarget): + def __init__(self, target): + self._target = target -class _ModuleTarget(str): - def check(self): + import runpy try: - self._details + _, self._spec, self._code = runpy._get_module_details(self._target) + except ImportError as e: + print(f"ImportError: {e}") + sys.exit(1) except Exception: traceback.print_exc() sys.exit(1) - @functools.cached_property - def _details(self): - import runpy - return runpy._get_module_details(self) + def __repr__(self): + return self._target @property def filename(self): - return self.code.co_filename + return self._code.co_filename @property def code(self): - name, spec, code = self._details - return code + return self._code @property - def _spec(self): - name, spec, code = self._details - return spec + def namespace(self): + return dict( + __name__='__main__', + __file__=os.path.normcase(os.path.abspath(self.filename)), + __package__=self._spec.parent, + __loader__=self._spec.loader, + __spec__=self._spec, + __builtins__=__builtins__, + ) + + +class _ZipTarget(_ExecutableTarget): + def __init__(self, target): + import runpy + + self._target = os.path.realpath(target) + sys.path.insert(0, self._target) + try: + _, self._spec, self._code = runpy._get_main_module_details() + except ImportError as e: + print(f"ImportError: {e}") + sys.exit(1) + except Exception: + traceback.print_exc() + sys.exit(1) + + def __repr__(self): + return self._target + + @property + def filename(self): + return self._code.co_filename + + @property + def code(self): + return self._code @property def namespace(self): @@ -197,6 +285,15 @@ class _ModuleTarget(str): ) +class _PdbInteractiveConsole(code.InteractiveConsole): + def __init__(self, ns, message): + self._message = message + super().__init__(locals=ns, local_exit=True) + + def write(self, data): + self._message(data, end='') + + # Interaction prompt line will separate file and call info from code # text using value of line_prefix string. A newline and arrow may # be to your liking. You can set it once pdb is imported using the @@ -204,10 +301,17 @@ class _ModuleTarget(str): # line_prefix = ': ' # Use this to get the old situation back line_prefix = '\n-> ' # Probably a better default -class Pdb(bdb.Bdb, cmd.Cmd): + +class Pdb(bdb.Bdb, cmd.Cmd): _previous_sigint_handler = None + # Limit the maximum depth of chained exceptions, we should be handling cycles, + # but in case there are recursions, we stop at 999. + MAX_CHAINED_EXCEPTION_DEPTH = 999 + + _file_mtime_table = {} + def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True): bdb.Bdb.__init__(self, skip=skip) @@ -225,11 +329,14 @@ class Pdb(bdb.Bdb, cmd.Cmd): try: import readline # remove some common file name delimiters - readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?') + readline.set_completer_delims(' \t\n`@#%^&*()=+[{]}\\|;:\'",<>?') except ImportError: pass self.allow_kbdint = False self.nosigint = nosigint + # Consider these characters as part of the command so when the users type + # c.a or c['a'], it won't be recognized as a c(ontinue) command + self.identchars = cmd.Cmd.identchars + '=.[](),"\'+-*/%@&|<>~^' # Read ~/.pdbrc and ./.pdbrc self.rcLines = [] @@ -255,6 +362,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.commands_bnum = None # The breakpoint number for which we are # defining a list + self._chained_exceptions = tuple() + self._chained_exception_index = 0 + def sigint_handler(self, signum, frame): if self.allow_kbdint: raise KeyboardInterrupt @@ -286,31 +396,28 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.tb_lineno[tb.tb_frame] = lineno tb = tb.tb_next self.curframe = self.stack[self.curindex][0] - # The f_locals dictionary is updated from the actual frame - # locals whenever the .f_locals accessor is called, so we - # cache it here to ensure that modifications are not overwritten. + # The f_locals dictionary used to be updated from the actual frame + # locals whenever the .f_locals accessor was called, so it was + # cached here to ensure that modifications were not overwritten. While + # the caching is no longer required now that f_locals is a direct proxy + # on optimized frames, it's also harmless, so the code structure has + # been left unchanged. self.curframe_locals = self.curframe.f_locals self.set_convenience_variable(self.curframe, '_frame', self.curframe) - return self.execRcLines() - # Can be executed earlier than 'setup' if desired - def execRcLines(self): - if not self.rcLines: - return - # local copy because of recursion - rcLines = self.rcLines - rcLines.reverse() - # execute every line only once - self.rcLines = [] - while rcLines: - line = rcLines.pop().strip() - if line and line[0] != '#': - if self.onecmd(line): - # if onecmd returns True, the command wants to exit - # from the interaction, save leftover rc lines - # to execute before next interaction - self.rcLines += reversed(rcLines) - return True + if self._chained_exceptions: + self.set_convenience_variable( + self.curframe, + '_exception', + self._chained_exceptions[self._chained_exception_index], + ) + + if self.rcLines: + self.cmdqueue = [ + line for line in self.rcLines + if line.strip() and not line.strip().startswith("#") + ] + self.rcLines = [] # Override Bdb methods @@ -326,13 +433,21 @@ class Pdb(bdb.Bdb, cmd.Cmd): def user_line(self, frame): """This function is called when we stop or break at this line.""" if self._wait_for_mainpyfile: - if (self.mainpyfile != self.canonic(frame.f_code.co_filename) - or frame.f_lineno <= 0): + if (self.mainpyfile != self.canonic(frame.f_code.co_filename)): return self._wait_for_mainpyfile = False + if self.trace_opcodes: + # GH-127321 + # We want to avoid stopping at an opcode that does not have + # an associated line number because pdb does not like it + if frame.f_lineno is None: + self.set_stepinstr() + return if self.bp_commands(frame): self.interaction(frame, None) + user_opcode = user_line + def bp_commands(self, frame): """Call every command that was set for the current active breakpoint (if there is one). @@ -398,9 +513,23 @@ class Pdb(bdb.Bdb, cmd.Cmd): except KeyboardInterrupt: self.message('--KeyboardInterrupt--') + def _validate_file_mtime(self): + """Check if the source file of the current frame has been modified since + the last time we saw it. If so, give a warning.""" + try: + filename = self.curframe.f_code.co_filename + mtime = os.path.getmtime(filename) + except Exception: + return + if (filename in self._file_mtime_table and + mtime != self._file_mtime_table[filename]): + self.message(f"*** WARNING: file '{filename}' was edited, " + "running stale code until the program is rerun") + self._file_mtime_table[filename] = mtime + # Called before loop, handles display expressions # Set up convenience variable containers - def preloop(self): + def _show_display(self): displaying = self.displaying.get(self.curframe) if displaying: for expr, oldvalue in displaying.items(): @@ -410,10 +539,68 @@ class Pdb(bdb.Bdb, cmd.Cmd): # fields are changed to be displayed if newvalue is not oldvalue and newvalue != oldvalue: displaying[expr] = newvalue - self.message('display %s: %r [old: %r]' % - (expr, newvalue, oldvalue)) + self.message('display %s: %s [old: %s]' % + (expr, self._safe_repr(newvalue, expr), + self._safe_repr(oldvalue, expr))) + + def _get_tb_and_exceptions(self, tb_or_exc): + """ + Given a tracecack or an exception, return a tuple of chained exceptions + and current traceback to inspect. + + This will deal with selecting the right ``__cause__`` or ``__context__`` + as well as handling cycles, and return a flattened list of exceptions we + can jump to with do_exceptions. + + """ + _exceptions = [] + if isinstance(tb_or_exc, BaseException): + traceback, current = tb_or_exc.__traceback__, tb_or_exc + + while current is not None: + if current in _exceptions: + break + _exceptions.append(current) + if current.__cause__ is not None: + current = current.__cause__ + elif ( + current.__context__ is not None and not current.__suppress_context__ + ): + current = current.__context__ + + if len(_exceptions) >= self.MAX_CHAINED_EXCEPTION_DEPTH: + self.message( + f"More than {self.MAX_CHAINED_EXCEPTION_DEPTH}" + " chained exceptions found, not all exceptions" + "will be browsable with `exceptions`." + ) + break + else: + traceback = tb_or_exc + return tuple(reversed(_exceptions)), traceback + + @contextmanager + def _hold_exceptions(self, exceptions): + """ + Context manager to ensure proper cleaning of exceptions references + + When given a chained exception instead of a traceback, + pdb may hold references to many objects which may leak memory. + + We use this context manager to make sure everything is properly cleaned + + """ + try: + self._chained_exceptions = exceptions + self._chained_exception_index = len(exceptions) - 1 + yield + finally: + # we can't put those in forget as otherwise they would + # be cleared on exception change + self._chained_exceptions = tuple() + self._chained_exception_index = 0 - def interaction(self, frame, traceback): + def interaction(self, frame, tb_or_exc): # Restore the previous signal handler at the Pdb prompt. if Pdb._previous_sigint_handler: try: @@ -422,14 +609,23 @@ class Pdb(bdb.Bdb, cmd.Cmd): pass else: Pdb._previous_sigint_handler = None - if self.setup(frame, traceback): - # no interaction desired at this time (happens if .pdbrc contains - # a command like "continue") + + _chained_exceptions, tb = self._get_tb_and_exceptions(tb_or_exc) + if isinstance(tb_or_exc, BaseException): + assert tb is not None, "main exception must have a traceback" + with self._hold_exceptions(_chained_exceptions): + self.setup(frame, tb) + # We should print the stack entry if and only if the user input + # is expected, and we should print it right before the user input. + # We achieve this by appending _pdbcmd_print_frame_status to the + # command queue. If cmdqueue is not exausted, the user input is + # not expected and we will not print the stack entry. + self.cmdqueue.append('_pdbcmd_print_frame_status') + self._cmdloop() + # If _pdbcmd_print_frame_status is not used, pop it out + if self.cmdqueue and self.cmdqueue[-1] == '_pdbcmd_print_frame_status': + self.cmdqueue.pop() self.forget() - return - self.print_stack_entry(self.stack[self.curindex]) - self._cmdloop() - self.forget() def displayhook(self, obj): """Custom displayhook for the exec in default(), which prevents @@ -439,12 +635,132 @@ class Pdb(bdb.Bdb, cmd.Cmd): if obj is not None: self.message(repr(obj)) + @contextmanager + def _disable_command_completion(self): + completenames = self.completenames + try: + self.completenames = self.completedefault + yield + finally: + self.completenames = completenames + return + + def _exec_in_closure(self, source, globals, locals): + """ Run source code in closure so code object created within source + can find variables in locals correctly + + returns True if the source is executed, False otherwise + """ + + # Determine if the source should be executed in closure. Only when the + # source compiled to multiple code objects, we should use this feature. + # Otherwise, we can just raise an exception and normal exec will be used. + + code = compile(source, "", "exec") + if not any(isinstance(const, CodeType) for const in code.co_consts): + return False + + # locals could be a proxy which does not support pop + # copy it first to avoid modifying the original locals + locals_copy = dict(locals) + + locals_copy["__pdb_eval__"] = { + "result": None, + "write_back": {} + } + + # If the source is an expression, we need to print its value + try: + compile(source, "", "eval") + except SyntaxError: + pass + else: + source = "__pdb_eval__['result'] = " + source + + # Add write-back to update the locals + source = ("try:\n" + + textwrap.indent(source, " ") + "\n" + + "finally:\n" + + " __pdb_eval__['write_back'] = locals()") + + # Build a closure source code with freevars from locals like: + # def __pdb_outer(): + # var = None + # def __pdb_scope(): # This is the code object we want to execute + # nonlocal var + # + # return __pdb_scope.__code__ + source_with_closure = ("def __pdb_outer():\n" + + "\n".join(f" {var} = None" for var in locals_copy) + "\n" + + " def __pdb_scope():\n" + + "\n".join(f" nonlocal {var}" for var in locals_copy) + "\n" + + textwrap.indent(source, " ") + "\n" + + " return __pdb_scope.__code__" + ) + + # Get the code object of __pdb_scope() + # The exec fills locals_copy with the __pdb_outer() function and we can call + # that to get the code object of __pdb_scope() + ns = {} + try: + exec(source_with_closure, {}, ns) + except Exception: + return False + code = ns["__pdb_outer"]() + + cells = tuple(types.CellType(locals_copy.get(var)) for var in code.co_freevars) + + try: + exec(code, globals, locals_copy, closure=cells) + except Exception: + return False + + # get the data we need from the statement + pdb_eval = locals_copy["__pdb_eval__"] + + # __pdb_eval__ should not be updated back to locals + pdb_eval["write_back"].pop("__pdb_eval__") + + # Write all local variables back to locals + locals.update(pdb_eval["write_back"]) + eval_result = pdb_eval["result"] + if eval_result is not None: + print(repr(eval_result)) + + return True + def default(self, line): if line[:1] == '!': line = line[1:].strip() locals = self.curframe_locals globals = self.curframe.f_globals try: - code = compile(line + '\n', '', 'single') + buffer = line + if (code := codeop.compile_command(line + '\n', '', 'single')) is None: + # Multi-line mode + with self._disable_command_completion(): + buffer = line + continue_prompt = "... " + while (code := codeop.compile_command(buffer, '', 'single')) is None: + if self.use_rawinput: + try: + line = input(continue_prompt) + except (EOFError, KeyboardInterrupt): + self.lastcmd = "" + print('\n') + return + else: + self.stdout.write(continue_prompt) + self.stdout.flush() + line = self.stdin.readline() + if not len(line): + self.lastcmd = "" + self.stdout.write('\n') + self.stdout.flush() + return + else: + line = line.rstrip('\r\n') + buffer += '\n' + line + self.lastcmd = buffer save_stdout = sys.stdout save_stdin = sys.stdin save_displayhook = sys.displayhook @@ -452,7 +768,8 @@ class Pdb(bdb.Bdb, cmd.Cmd): sys.stdin = self.stdin sys.stdout = self.stdout sys.displayhook = self.displayhook - exec(code, globals, locals) + if not self._exec_in_closure(buffer, globals, locals): + exec(code, globals, locals) finally: sys.stdout = save_stdout sys.stdin = save_stdin @@ -460,6 +777,39 @@ class Pdb(bdb.Bdb, cmd.Cmd): except: self._error_exc() + def _replace_convenience_variables(self, line): + """Replace the convenience variables in 'line' with their values. + e.g. $foo is replaced by __pdb_convenience_variables["foo"]. + Note: such pattern in string literals will be skipped""" + + if "$" not in line: + return line + + dollar_start = dollar_end = -1 + replace_variables = [] + try: + for t in tokenize.generate_tokens(io.StringIO(line).readline): + token_type, token_string, start, end, _ = t + if token_type == token.OP and token_string == '$': + dollar_start, dollar_end = start, end + elif start == dollar_end and token_type == token.NAME: + # line is a one-line command so we only care about column + replace_variables.append((dollar_start[1], end[1], token_string)) + except tokenize.TokenError: + return line + + if not replace_variables: + return line + + last_end = 0 + line_pieces = [] + for start, end, name in replace_variables: + line_pieces.append(line[last_end:start] + f'__pdb_convenience_variables["{name}"]') + last_end = end + line_pieces.append(line[last_end:]) + + return ''.join(line_pieces) + def precmd(self, line): """Handle alias expansion and ';;' separator.""" if not line.strip(): @@ -467,11 +817,20 @@ class Pdb(bdb.Bdb, cmd.Cmd): args = line.split() while args[0] in self.aliases: line = self.aliases[args[0]] - ii = 1 - for tmpArg in args[1:]: - line = line.replace("%" + str(ii), - tmpArg) - ii += 1 + for idx in range(1, 10): + if f'%{idx}' in line: + if idx >= len(args): + self.error(f"Not enough arguments for alias '{args[0]}'") + # This is a no-op + return "!" + line = line.replace(f'%{idx}', args[idx]) + elif '%*' not in line: + if idx < len(args): + self.error(f"Too many arguments for alias '{args[0]}'") + # This is a no-op + return "!" + break + line = line.replace("%*", ' '.join(args[1:])) args = line.split() # split into ';;' separated commands @@ -481,11 +840,12 @@ class Pdb(bdb.Bdb, cmd.Cmd): if marker >= 0: # queue up everything after marker next = line[marker+2:].lstrip() - self.cmdqueue.append(next) + self.cmdqueue.insert(0, next) line = line[:marker].rstrip() # Replace all the convenience variables - line = re.sub(r'\$([a-zA-Z_][a-zA-Z0-9_]*)', r'__pdb_convenience_variables["\1"]', line) + line = self._replace_convenience_variables(line) + return line def onecmd(self, line): @@ -496,6 +856,11 @@ class Pdb(bdb.Bdb, cmd.Cmd): a breakpoint command list definition. """ if not self.commands_defining: + self._validate_file_mtime() + if line.startswith('_pdbcmd'): + command, arg, line = self.parseline(line) + if hasattr(self, command): + return getattr(self, command)(arg) return cmd.Cmd.onecmd(self, line) else: return self.handle_command_def(line) @@ -504,13 +869,12 @@ class Pdb(bdb.Bdb, cmd.Cmd): """Handles one command line during command list definition.""" cmd, arg, line = self.parseline(line) if not cmd: - return + return False if cmd == 'silent': self.commands_silent[self.commands_bnum] = True - return # continue to handle other cmd def in the cmd list + return False # continue to handle other cmd def in the cmd list elif cmd == 'end': - self.cmdqueue = [] - return 1 # end of cmd list + return True # end of cmd list cmdlist = self.commands[self.commands_bnum] if arg: cmdlist.append(cmd+' '+arg) @@ -524,14 +888,13 @@ class Pdb(bdb.Bdb, cmd.Cmd): # one of the resuming commands if func.__name__ in self.commands_resuming: self.commands_doprompt[self.commands_bnum] = False - self.cmdqueue = [] - return 1 - return + return True + return False # interface abstraction functions - def message(self, msg): - print(msg, file=self.stdout) + def message(self, msg, end='\n'): + print(msg, end=end, file=self.stdout) def error(self, msg): print('***', msg, file=self.stdout) @@ -546,6 +909,21 @@ class Pdb(bdb.Bdb, cmd.Cmd): # Generic completion functions. Individual complete_foo methods can be # assigned below to one of these functions. + def completenames(self, text, line, begidx, endidx): + # Overwrite completenames() of cmd so for the command completion, + # if no current command matches, check for expressions as well + commands = super().completenames(text, line, begidx, endidx) + for alias in self.aliases: + if alias.startswith(text): + commands.append(alias) + if commands: + return commands + else: + expressions = self._complete_expression(text, line, begidx, endidx) + if expressions: + return expressions + return self.completedefault(text, line, begidx, endidx) + def _complete_location(self, text, line, begidx, endidx): # Complete a file/module/function location for break/tbreak/clear. if line.strip().endswith((':', ',')): @@ -580,6 +958,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): # complete builtins, and they clutter the namespace quite heavily, so we # leave them out. ns = {**self.curframe.f_globals, **self.curframe_locals} + if text.startswith("$"): + # Complete convenience variables + conv_vars = self.curframe.f_globals.get('__pdb_convenience_variables', {}) + return [f"${name}" for name in conv_vars if name.startswith(text[1:])] if '.' in text: # Walk an attribute chain up to the last part, similar to what # rlcompleter does. This will bail if any of the parts are not @@ -597,6 +979,27 @@ class Pdb(bdb.Bdb, cmd.Cmd): # Complete a simple name. return [n for n in ns.keys() if n.startswith(text)] + def completedefault(self, text, line, begidx, endidx): + if text.startswith("$"): + # Complete convenience variables + conv_vars = self.curframe.f_globals.get('__pdb_convenience_variables', {}) + return [f"${name}" for name in conv_vars if name.startswith(text[1:])] + + # Use rlcompleter to do the completion + state = 0 + matches = [] + completer = Completer(self.curframe.f_globals | self.curframe_locals) + while (match := completer.complete(text, state)) is not None: + matches.append(match) + state += 1 + return matches + + # Pdb meta commands, only intended to be used internally by pdb + + def _pdbcmd_print_frame_status(self, arg): + self.print_stack_entry(self.stack[self.curindex]) + self._show_display() + # Command definitions, called by cmdloop() # The argument is the remaining string on the command line # Return true to exit from the command loop @@ -644,7 +1047,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): try: bnum = int(arg) except: - self.error("Usage: commands [bnum]\n ...\n end") + self._print_invalid_arg(arg) return try: self.get_bpbynumber(bnum) @@ -757,7 +1160,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): #use co_name to identify the bkpt (function names #could be aliased, but co_name is invariant) funcname = code.co_name - lineno = code.co_firstlineno + lineno = find_first_executable_line(code) filename = code.co_filename except: # last thing to try @@ -835,7 +1238,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): if f: fname = f item = parts[1] - answer = find_function(item, fname) + answer = find_function(item, self.canonic(fname)) return answer or failed def checkline(self, filename, lineno): @@ -941,14 +1344,22 @@ class Pdb(bdb.Bdb, cmd.Cmd): condition evaluates to true. """ args = arg.split() - try: - count = int(args[1].strip()) - except: + if not args: + self.error('Breakpoint number expected') + return + if len(args) == 1: count = 0 + elif len(args) == 2: + try: + count = int(args[1]) + except ValueError: + self._print_invalid_arg(arg) + return + else: + self._print_invalid_arg(arg) + return try: bp = self.get_bpbynumber(args[0].strip()) - except IndexError: - self.error('Breakpoint number expected') except ValueError as err: self.error(err) else: @@ -1025,6 +1436,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): An arrow indicates the "current frame", which determines the context of most commands. 'bt' is an alias for this command. """ + if arg: + self._print_invalid_arg(arg) + return self.print_stack_trace() do_w = do_where do_bt = do_where @@ -1038,6 +1452,53 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.print_stack_entry(self.stack[self.curindex]) self.lineno = None + def do_exceptions(self, arg): + """exceptions [number] + + List or change current exception in an exception chain. + + Without arguments, list all the current exception in the exception + chain. Exceptions will be numbered, with the current exception indicated + with an arrow. + + If given an integer as argument, switch to the exception at that index. + """ + if not self._chained_exceptions: + self.message( + "Did not find chained exceptions. To move between" + " exceptions, pdb/post_mortem must be given an exception" + " object rather than a traceback." + ) + return + if not arg: + for ix, exc in enumerate(self._chained_exceptions): + prompt = ">" if ix == self._chained_exception_index else " " + rep = repr(exc) + if len(rep) > 80: + rep = rep[:77] + "..." + indicator = ( + " -" + if self._chained_exceptions[ix].__traceback__ is None + else f"{ix:>3}" + ) + self.message(f"{prompt} {indicator} {rep}") + else: + try: + number = int(arg) + except ValueError: + self.error("Argument must be an integer") + return + if 0 <= number < len(self._chained_exceptions): + if self._chained_exceptions[number].__traceback__ is None: + self.error("This exception does not have a traceback, cannot jump to it") + return + + self._chained_exception_index = number + self.setup(None, self._chained_exceptions[number].__traceback__) + self.print_stack_entry(self.stack[self.curindex]) + else: + self.error("No exception with that number") + def do_up(self, arg): """u(p) [count] @@ -1112,6 +1573,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): (either in a function that is called or in the current function). """ + if arg: + self._print_invalid_arg(arg) + return self.set_step() return 1 do_s = do_step @@ -1122,6 +1586,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): Continue execution until the next line in the current function is reached or it returns. """ + if arg: + self._print_invalid_arg(arg) + return self.set_next(self.curframe) return 1 do_n = do_next @@ -1153,6 +1620,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): Continue execution until the current function returns. """ + if arg: + self._print_invalid_arg(arg) + return self.set_return(self.curframe) return 1 do_r = do_return @@ -1162,6 +1632,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): Continue execution, only stop when a breakpoint is encountered. """ + if arg: + self._print_invalid_arg(arg) + return if not self.nosigint: try: Pdb._previous_sigint_handler = \ @@ -1256,6 +1729,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): Print the argument list of the current function. """ + if arg: + self._print_invalid_arg(arg) + return co = self.curframe.f_code dict = self.curframe_locals n = co.co_argcount + co.co_kwonlyargcount @@ -1264,7 +1740,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): for i in range(n): name = co.co_varnames[i] if name in dict: - self.message('%s = %r' % (name, dict[name])) + self.message('%s = %s' % (name, self._safe_repr(dict[name], name))) else: self.message('%s = *** undefined ***' % (name,)) do_a = do_args @@ -1274,8 +1750,11 @@ class Pdb(bdb.Bdb, cmd.Cmd): Print the return value for the last return of a function. """ + if arg: + self._print_invalid_arg(arg) + return if '__return__' in self.curframe_locals: - self.message(repr(self.curframe_locals['__return__'])) + self.message(self._safe_repr(self.curframe_locals['__return__'], "retval")) else: self.error('Not yet returned!') do_rv = do_retval @@ -1310,6 +1789,12 @@ class Pdb(bdb.Bdb, cmd.Cmd): except: self._error_exc() + def _safe_repr(self, obj, expr): + try: + return repr(obj) + except Exception as e: + return _rstr(f"*** repr({expr}) failed: {self._format_exc(e)} ***") + def do_p(self, arg): """p expression @@ -1390,6 +1875,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): List the whole source code for the current function or frame. """ + if arg: + self._print_invalid_arg(arg) + return filename = self.curframe.f_code.co_filename breaklist = self.get_file_breaks(filename) try: @@ -1486,8 +1974,8 @@ class Pdb(bdb.Bdb, cmd.Cmd): if not arg: if self.displaying: self.message('Currently displaying:') - for item in self.displaying.get(self.curframe, {}).items(): - self.message('%s: %r' % item) + for key, val in self.displaying.get(self.curframe, {}).items(): + self.message('%s: %s' % (key, self._safe_repr(val, key))) else: self.message('No expression is being displayed') else: @@ -1496,7 +1984,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): else: val = self._getval_except(arg) self.displaying.setdefault(self.curframe, {})[arg] = val - self.message('display %s: %r' % (arg, val)) + self.message('display %s: %s' % (arg, self._safe_repr(val, arg))) complete_display = _complete_expression @@ -1526,7 +2014,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): contains all the (global and local) names found in the current scope. """ ns = {**self.curframe.f_globals, **self.curframe_locals} - code.interact("*interactive*", local=ns) + console = _PdbInteractiveConsole(ns, message=self.message) + console.interact(banner="*pdb interact start*", + exitmsg="*exit from pdb interact command*") def do_alias(self, arg): """alias [name [command]] @@ -1559,10 +2049,24 @@ class Pdb(bdb.Bdb, cmd.Cmd): for alias in keys: self.message("%s = %s" % (alias, self.aliases[alias])) return - if args[0] in self.aliases and len(args) == 1: - self.message("%s = %s" % (args[0], self.aliases[args[0]])) + if len(args) == 1: + if args[0] in self.aliases: + self.message("%s = %s" % (args[0], self.aliases[args[0]])) + else: + self.error(f"Unknown alias '{args[0]}'") else: - self.aliases[args[0]] = ' '.join(args[1:]) + # Do a validation check to make sure no replaceable parameters + # are skipped if %* is not used. + alias = ' '.join(args[1:]) + if '%*' not in alias: + consecutive = True + for idx in range(1, 10): + if f'%{idx}' not in alias: + consecutive = False + if f'%{idx}' in alias and not consecutive: + self.error("Replaceable parameters must be consecutive") + return + self.aliases[args[0]] = alias def do_unalias(self, arg): """unalias name @@ -1570,7 +2074,9 @@ class Pdb(bdb.Bdb, cmd.Cmd): Delete the specified alias. """ args = arg.split() - if len(args) == 0: return + if len(args) == 0: + self._print_invalid_arg(arg) + return if args[0] in self.aliases: del self.aliases[args[0]] @@ -1663,17 +2169,23 @@ class Pdb(bdb.Bdb, cmd.Cmd): lookupmodule() translates (possibly incomplete) file or module name into an absolute file name. + + filename could be in format of: + * an absolute path like '/path/to/file.py' + * a relative path like 'file.py' or 'dir/file.py' + * a module name like 'module' or 'package.module' + + files and modules will be searched in sys.path. """ - if os.path.isabs(filename) and os.path.exists(filename): - return filename - f = os.path.join(sys.path[0], filename) - if os.path.exists(f) and self.canonic(f) == self.mainpyfile: - return f - root, ext = os.path.splitext(filename) - if ext == '': - filename = filename + '.py' + if not filename.endswith('.py'): + # A module is passed in so convert it to equivalent file + filename = filename.replace('.', os.sep) + '.py' + if os.path.isabs(filename): - return filename + if os.path.exists(filename): + return filename + return None + for dirname in sys.path: while os.path.islink(dirname): dirname = os.readlink(dirname) @@ -1682,7 +2194,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): return fullname return None - def _run(self, target: Union[_ModuleTarget, _ScriptTarget]): + def _run(self, target: _ExecutableTarget): # When bdb sets tracing, a number of call and line events happen # BEFORE debugger even reaches user's code (and the exact sequence of # events depends on python version). Take special measures to @@ -1700,6 +2212,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): __main__.__dict__.clear() __main__.__dict__.update(target.namespace) + # Clear the mtime table for program reruns, assume all the files + # are up to date. + self._file_mtime_table.clear() + self.run(target.code) def _format_exc(self, exc: BaseException): @@ -1723,7 +2239,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): lineno = max(1, lineno) return lines, lineno - def _help_message_from_doc(self, doc): + def _help_message_from_doc(self, doc, usage_only=False): lines = [line.strip() for line in doc.rstrip().splitlines()] if not lines: return "No help message found." @@ -1739,10 +2255,24 @@ class Pdb(bdb.Bdb, cmd.Cmd): elif i < usage_end: prefix = " " else: + if usage_only: + break prefix = "" formatted.append(indent + prefix + line) return "\n".join(formatted) + def _print_invalid_arg(self, arg): + """Return the usage string for a function.""" + + self.error(f"Invalid argument: {arg}") + + # Yes it's a bit hacky. Get the caller name, get the method based on + # that name, and get the docstring from that method. + # This should NOT fail if the caller is a method of this class. + doc = inspect.getdoc(getattr(self, sys._getframe(1).f_code.co_name)) + if doc is not None: + self.message(self._help_message_from_doc(doc, usage_only=True)) + # Collect all command help into docstring, if not run with -OO if __doc__ is not None: @@ -1818,11 +2348,23 @@ def set_trace(*, header=None): # Post-Mortem interface def post_mortem(t=None): - """Enter post-mortem debugging of the given *traceback* object. + """Enter post-mortem debugging of the given *traceback*, or *exception* + object. If no traceback is given, it uses the one of the exception that is currently being handled (an exception must be being handled if the default is to be used). + + If `t` is an exception object, the `exceptions` command makes it possible to + list and inspect its chained exceptions (if any). + """ + return _post_mortem(t, Pdb()) + + +def _post_mortem(t, pdb_instance): + """ + Private version of post_mortem, which allow to pass a pdb instance + for testing purposes. """ # handling the default if t is None: @@ -1830,21 +2372,17 @@ def post_mortem(t=None): if exc is not None: t = exc.__traceback__ - if t is None: + if t is None or (isinstance(t, BaseException) and t.__traceback__ is None): raise ValueError("A valid traceback must be passed if no " "exception is being handled") - p = Pdb() - p.reset() - p.interaction(None, t) + pdb_instance.reset() + pdb_instance.interaction(None, t) + def pm(): - """Enter post-mortem debugging of the traceback found in sys.last_traceback.""" - if hasattr(sys, 'last_exc'): - tb = sys.last_exc.__traceback__ - else: - tb = sys.last_traceback - post_mortem(tb) + """Enter post-mortem debugging of the traceback found in sys.last_exc.""" + post_mortem(sys.last_exc) # Main program for testing @@ -1860,8 +2398,6 @@ def help(): pydoc.pager(__doc__) _usage = """\ -usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ... - Debug the Python program given by pyfile. Alternatively, an executable module or package to debug can be specified using the -m switch. @@ -1876,40 +2412,71 @@ To let the script run up to a given line X in the debugged file, use def main(): - import getopt - - opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command=']) - - if not args: - print(_usage) + import argparse + + parser = argparse.ArgumentParser(prog="pdb", + usage="%(prog)s [-h] [-c command] (-m module | pyfile) [args ...]", + description=_usage, + formatter_class=argparse.RawDescriptionHelpFormatter, + allow_abbrev=False) + + # We need to maunally get the script from args, because the first positional + # arguments could be either the script we need to debug, or the argument + # to the -m module + parser.add_argument('-c', '--command', action='append', default=[], metavar='command', dest='commands', + help='pdb commands to execute as if given in a .pdbrc file') + parser.add_argument('-m', metavar='module', dest='module') + + if len(sys.argv) == 1: + # If no arguments were given (python -m pdb), print the whole help message. + # Without this check, argparse would only complain about missing required arguments. + parser.print_help() sys.exit(2) - if any(opt in ['-h', '--help'] for opt, optarg in opts): - print(_usage) - sys.exit() - - commands = [optarg for opt, optarg in opts if opt in ['-c', '--command']] - - module_indicated = any(opt in ['-m'] for opt, optarg in opts) - cls = _ModuleTarget if module_indicated else _ScriptTarget - target = cls(args[0]) - - target.check() + opts, args = parser.parse_known_args() + + if opts.module: + # If a module is being debugged, we consider the arguments after "-m module" to + # be potential arguments to the module itself. We need to parse the arguments + # before "-m" to check if there is any invalid argument. + # e.g. "python -m pdb -m foo --spam" means passing "--spam" to "foo" + # "python -m pdb --spam -m foo" means passing "--spam" to "pdb" and is invalid + idx = sys.argv.index('-m') + args_to_pdb = sys.argv[1:idx] + # This will raise an error if there are invalid arguments + parser.parse_args(args_to_pdb) + else: + # If a script is being debugged, then pdb expects the script name as the first argument. + # Anything before the script is considered an argument to pdb itself, which would + # be invalid because it's not parsed by argparse. + invalid_args = list(itertools.takewhile(lambda a: a.startswith('-'), args)) + if invalid_args: + parser.error(f"unrecognized arguments: {' '.join(invalid_args)}") + sys.exit(2) + + if opts.module: + file = opts.module + target = _ModuleTarget(file) + else: + if not args: + parser.error("no module or script to run") + file = args.pop(0) + if file.endswith('.pyz'): + target = _ZipTarget(file) + else: + target = _ScriptTarget(file) - sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list + sys.argv[:] = [file] + args # Hide "pdb.py" and pdb options from argument list # Note on saving/restoring sys.argv: it's a good idea when sys.argv was # modified by the script being debugged. It's a bad idea when it was # changed by the user from the command line. There is a "restart" command # which allows explicit specification of command line arguments. pdb = Pdb() - pdb.rcLines.extend(commands) + pdb.rcLines.extend(opts.commands) while True: try: pdb._run(target) - if pdb._user_requested_quit: - break - print("The program finished and will be restarted") except Restart: print("Restarting", target, "with arguments:") print("\t" + " ".join(sys.argv[1:])) @@ -1917,17 +2484,19 @@ def main(): # In most cases SystemExit does not warrant a post-mortem session. print("The program exited via sys.exit(). Exit status:", end=' ') print(e) - except SyntaxError: - traceback.print_exc() - sys.exit(1) except BaseException as e: - traceback.print_exc() + traceback.print_exception(e, colorize=_colorize.can_colorize()) print("Uncaught exception. Entering post mortem debugging") print("Running 'cont' or 'step' will restart the program") - t = e.__traceback__ - pdb.interaction(None, t) - print("Post mortem debugger finished. The " + target + - " will be restarted") + try: + pdb.interaction(None, e) + except Restart: + print("Restarting", target, "with arguments:") + print("\t" + " ".join(sys.argv[1:])) + continue + if pdb._user_requested_quit: + break + print("The program finished and will be restarted") # When invoked as main program, invoke the debugger on a script diff --git a/Lib/pickle.py b/Lib/pickle.py index fe86f80f..550f8675 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -314,16 +314,17 @@ class _Unframer: # Tools used for pickling. def _getattribute(obj, name): + top = obj for subpath in name.split('.'): if subpath == '': raise AttributeError("Can't get local attribute {!r} on {!r}" - .format(name, obj)) + .format(name, top)) try: parent = obj obj = getattr(obj, subpath) except AttributeError: raise AttributeError("Can't get attribute {!r} on {!r}" - .format(name, obj)) from None + .format(name, top)) from None return obj, parent def whichmodule(obj, name): @@ -396,6 +397,8 @@ def decode_long(data): return int.from_bytes(data, byteorder='little', signed=True) +_NoValue = object() + # Pickling machinery class _Pickler: @@ -530,10 +533,11 @@ class _Pickler: self.framer.commit_frame() # Check for persistent id (defined by a subclass) - pid = self.persistent_id(obj) - if pid is not None and save_persistent_id: - self.save_pers(pid) - return + if save_persistent_id: + pid = self.persistent_id(obj) + if pid is not None: + self.save_pers(pid) + return # Check the memo x = self.memo.get(id(obj)) @@ -542,8 +546,8 @@ class _Pickler: return rv = NotImplemented - reduce = getattr(self, "reducer_override", None) - if reduce is not None: + reduce = getattr(self, "reducer_override", _NoValue) + if reduce is not _NoValue: rv = reduce(obj) if rv is NotImplemented: @@ -556,8 +560,8 @@ class _Pickler: # Check private dispatch table if any, or else # copyreg.dispatch_table - reduce = getattr(self, 'dispatch_table', dispatch_table).get(t) - if reduce is not None: + reduce = getattr(self, 'dispatch_table', dispatch_table).get(t, _NoValue) + if reduce is not _NoValue: rv = reduce(obj) else: # Check for a class with a custom metaclass; treat as regular @@ -567,12 +571,12 @@ class _Pickler: return # Check for a __reduce_ex__ method, fall back to __reduce__ - reduce = getattr(obj, "__reduce_ex__", None) - if reduce is not None: + reduce = getattr(obj, "__reduce_ex__", _NoValue) + if reduce is not _NoValue: rv = reduce(self.proto) else: - reduce = getattr(obj, "__reduce__", None) - if reduce is not None: + reduce = getattr(obj, "__reduce__", _NoValue) + if reduce is not _NoValue: rv = reduce() else: raise PicklingError("Can't pickle %r object: %r" % @@ -780,14 +784,10 @@ class _Pickler: self.write(FLOAT + repr(obj).encode("ascii") + b'\n') dispatch[float] = save_float - def save_bytes(self, obj): - if self.proto < 3: - if not obj: # bytes object is empty - self.save_reduce(bytes, (), obj=obj) - else: - self.save_reduce(codecs.encode, - (str(obj, 'latin1'), 'latin1'), obj=obj) - return + def _save_bytes_no_memo(self, obj): + # helper for writing bytes objects for protocol >= 3 + # without memoizing them + assert self.proto >= 3 n = len(obj) if n <= 0xff: self.write(SHORT_BINBYTES + pack("= 5 + # without memoizing them + assert self.proto >= 5 + n = len(obj) + if n >= self.framer._FRAME_SIZE_TARGET: + self._write_large_bytes(BYTEARRAY8 + pack("= self.framer._FRAME_SIZE_TARGET: - self._write_large_bytes(BYTEARRAY8 + pack("= 5") with obj.raw() as m: if not m.contiguous: @@ -830,10 +846,18 @@ class _Pickler: if in_band: # Write data in-band # XXX The C implementation avoids a copy here + buf = m.tobytes() + in_memo = id(buf) in self.memo if m.readonly: - self.save_bytes(m.tobytes()) + if in_memo: + self._save_bytes_no_memo(buf) + else: + self.save_bytes(buf) else: - self.save_bytearray(m.tobytes()) + if in_memo: + self._save_bytearray_no_memo(buf) + else: + self.save_bytearray(buf) else: # Write data out-of-band self.write(NEXT_BUFFER) @@ -855,13 +879,13 @@ class _Pickler: else: self.write(BINUNICODE + pack("= 2: - code = _extension_registry.get((module_name, name)) - if code: - assert code > 0 + code = _extension_registry.get((module_name, name), _NoValue) + if code is not _NoValue: if code <= 0xff: - write(EXT1 + pack("= 3: - write(GLOBAL + bytes(module_name, "utf-8") + b'\n' + - bytes(name, "utf-8") + b'\n') + elif '.' in name: + # In protocol < 4, objects with multi-part __qualname__ + # are represented as + # getattr(getattr(..., attrname1), attrname2). + dotted_path = name.split('.') + name = dotted_path.pop(0) + save = self.save + for attrname in dotted_path: + save(getattr) + if self.proto < 2: + write(MARK) + self._save_toplevel_by_name(module_name, name) + for attrname in dotted_path: + save(attrname) + if self.proto < 2: + write(TUPLE) + else: + write(TUPLE2) + write(REDUCE) + else: + self._save_toplevel_by_name(module_name, name) + + self.memoize(obj) + + def _save_toplevel_by_name(self, module_name, name): + if self.proto >= 3: + # Non-ASCII identifiers are supported only with protocols >= 3. + self.write(GLOBAL + bytes(module_name, "utf-8") + b'\n' + + bytes(name, "utf-8") + b'\n') else: if self.fix_imports: r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING @@ -1102,14 +1155,12 @@ class _Pickler: elif module_name in r_import_mapping: module_name = r_import_mapping[module_name] try: - write(GLOBAL + bytes(module_name, "ascii") + b'\n' + - bytes(name, "ascii") + b'\n') + self.write(GLOBAL + bytes(module_name, "ascii") + b'\n' + + bytes(name, "ascii") + b'\n') except UnicodeEncodeError: raise PicklingError( "can't pickle global identifier '%s.%s' using " - "pickle protocol %i" % (module, name, self.proto)) from None - - self.memoize(obj) + "pickle protocol %i" % (module_name, name, self.proto)) from None def save_type(self, obj): if obj is type(None): @@ -1546,9 +1597,8 @@ class _Unpickler: dispatch[EXT4[0]] = load_ext4 def get_extension(self, code): - nil = [] - obj = _extension_cache.get(code, nil) - if obj is not nil: + obj = _extension_cache.get(code, _NoValue) + if obj is not _NoValue: self.append(obj) return key = _inverted_registry.get(code) @@ -1705,8 +1755,8 @@ class _Unpickler: stack = self.stack state = stack.pop() inst = stack[-1] - setstate = getattr(inst, "__setstate__", None) - if setstate is not None: + setstate = getattr(inst, "__setstate__", _NoValue) + if setstate is not _NoValue: setstate(state) return slotstate = None @@ -1791,7 +1841,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser( description='display contents of the pickle files') parser.add_argument( - 'pickle_file', type=argparse.FileType('br'), + 'pickle_file', nargs='*', help='the pickle file') parser.add_argument( '-t', '--test', action='store_true', @@ -1807,6 +1857,10 @@ if __name__ == "__main__": parser.print_help() else: import pprint - for f in args.pickle_file: - obj = load(f) + for fn in args.pickle_file: + if fn == '-': + obj = load(sys.stdin.buffer) + else: + with open(fn, 'rb') as f: + obj = load(f) pprint.pprint(obj) diff --git a/Lib/pickletools.py b/Lib/pickletools.py index 95706e74..33a51492 100644 --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -312,7 +312,7 @@ uint8 = ArgumentDescriptor( doc="Eight-byte unsigned integer, little-endian.") -def read_stringnl(f, decode=True, stripquotes=True): +def read_stringnl(f, decode=True, stripquotes=True, *, encoding='latin-1'): r""" >>> import io >>> read_stringnl(io.BytesIO(b"'abcd'\nefg\n")) @@ -356,7 +356,7 @@ def read_stringnl(f, decode=True, stripquotes=True): raise ValueError("no string quotes around %r" % data) if decode: - data = codecs.escape_decode(data)[0].decode("ascii") + data = codecs.escape_decode(data)[0].decode(encoding) return data stringnl = ArgumentDescriptor( @@ -370,7 +370,7 @@ stringnl = ArgumentDescriptor( """) def read_stringnl_noescape(f): - return read_stringnl(f, stripquotes=False) + return read_stringnl(f, stripquotes=False, encoding='utf-8') stringnl_noescape = ArgumentDescriptor( name='stringnl_noescape', @@ -1253,7 +1253,7 @@ opcodes = [ stack_before=[], stack_after=[pyint], proto=2, - doc="""Long integer using found-byte length. + doc="""Long integer using four-byte length. A more efficient encoding of a Python long; the long4 encoding says it all."""), @@ -2513,7 +2513,10 @@ def dis(pickle, out=None, memo=None, indentlevel=4, annotate=0): # make a mild effort to align arguments line += ' ' * (10 - len(opcode.name)) if arg is not None: - line += ' ' + repr(arg) + if opcode.name in ("STRING", "BINSTRING", "SHORT_BINSTRING"): + line += ' ' + ascii(arg) + else: + line += ' ' + repr(arg) if markmsg: line += ' ' + markmsg if annotate: @@ -2848,10 +2851,10 @@ if __name__ == "__main__": parser = argparse.ArgumentParser( description='disassemble one or more pickle files') parser.add_argument( - 'pickle_file', type=argparse.FileType('br'), + 'pickle_file', nargs='*', help='the pickle file') parser.add_argument( - '-o', '--output', default=sys.stdout, type=argparse.FileType('w'), + '-o', '--output', help='the file where the output should be written') parser.add_argument( '-m', '--memo', action='store_true', @@ -2876,15 +2879,26 @@ if __name__ == "__main__": if args.test: _test() else: - annotate = 30 if args.annotate else 0 if not args.pickle_file: parser.print_help() - elif len(args.pickle_file) == 1: - dis(args.pickle_file[0], args.output, None, - args.indentlevel, annotate) else: + annotate = 30 if args.annotate else 0 memo = {} if args.memo else None - for f in args.pickle_file: - preamble = args.preamble.format(name=f.name) - args.output.write(preamble + '\n') - dis(f, args.output, memo, args.indentlevel, annotate) + if args.output is None: + output = sys.stdout + else: + output = open(args.output, 'w') + try: + for arg in args.pickle_file: + if len(args.pickle_file) > 1: + name = '' if arg == '-' else arg + preamble = args.preamble.format(name=name) + output.write(preamble + '\n') + if arg == '-': + dis(sys.stdin.buffer, output, memo, args.indentlevel, annotate) + else: + with open(arg, 'rb') as f: + dis(f, output, memo, args.indentlevel, annotate) + finally: + if output is not sys.stdout: + output.close() diff --git a/Lib/pipes.py b/Lib/pipes.py deleted file mode 100644 index 61d63b48..00000000 --- a/Lib/pipes.py +++ /dev/null @@ -1,250 +0,0 @@ -"""Conversion pipeline templates. - -The problem: ------------- - -Suppose you have some data that you want to convert to another format, -such as from GIF image format to PPM image format. Maybe the -conversion involves several steps (e.g. piping it through compress or -uuencode). Some of the conversion steps may require that their input -is a disk file, others may be able to read standard input; similar for -their output. The input to the entire conversion may also be read -from a disk file or from an open file, and similar for its output. - -The module lets you construct a pipeline template by sticking one or -more conversion steps together. It will take care of creating and -removing temporary files if they are necessary to hold intermediate -data. You can then use the template to do conversions from many -different sources to many different destinations. The temporary -file names used are different each time the template is used. - -The templates are objects so you can create templates for many -different conversion steps and store them in a dictionary, for -instance. - - -Directions: ------------ - -To create a template: - t = Template() - -To add a conversion step to a template: - t.append(command, kind) -where kind is a string of two characters: the first is '-' if the -command reads its standard input or 'f' if it requires a file; the -second likewise for the output. The command must be valid /bin/sh -syntax. If input or output files are required, they are passed as -$IN and $OUT; otherwise, it must be possible to use the command in -a pipeline. - -To add a conversion step at the beginning: - t.prepend(command, kind) - -To convert a file to another file using a template: - sts = t.copy(infile, outfile) -If infile or outfile are the empty string, standard input is read or -standard output is written, respectively. The return value is the -exit status of the conversion pipeline. - -To open a file for reading or writing through a conversion pipeline: - fp = t.open(file, mode) -where mode is 'r' to read the file, or 'w' to write it -- just like -for the built-in function open() or for os.popen(). - -To create a new template object initialized to a given one: - t2 = t.clone() -""" # ' - - -import re -import os -import tempfile -import warnings -# we import the quote function rather than the module for backward compat -# (quote used to be an undocumented but used function in pipes) -from shlex import quote - -warnings._deprecated(__name__, remove=(3, 13)) - -__all__ = ["Template"] - -# Conversion step kinds - -FILEIN_FILEOUT = 'ff' # Must read & write real files -STDIN_FILEOUT = '-f' # Must write a real file -FILEIN_STDOUT = 'f-' # Must read a real file -STDIN_STDOUT = '--' # Normal pipeline element -SOURCE = '.-' # Must be first, writes stdout -SINK = '-.' # Must be last, reads stdin - -stepkinds = [FILEIN_FILEOUT, STDIN_FILEOUT, FILEIN_STDOUT, STDIN_STDOUT, \ - SOURCE, SINK] - - -class Template: - """Class representing a pipeline template.""" - - def __init__(self): - """Template() returns a fresh pipeline template.""" - self.debugging = 0 - self.reset() - - def __repr__(self): - """t.__repr__() implements repr(t).""" - return '